aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-01-25 16:35:03 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-01-25 16:35:07 +0100
commit682ddb89cf15a7d5cc1a1a37156703c8abdcc872 (patch)
tree109df69309924916b586cd34630e991aa8e4d946
parent018e2b57ca8318ae2eaa72e22520d53ffb3404c7 (diff)
parentc49b0360966da9cdbdbafd0ce926269e777bc774 (diff)
downloadffmpeg-682ddb89cf15a7d5cc1a1a37156703c8abdcc872.tar.gz
Merge branch 'scale-filter-factor' of https://github.com/lkiesow/FFmpeg
* 'scale-filter-factor' of https://github.com/lkiesow/FFmpeg: Documentation for scale filter factor Documentation for scale filter factor Fixed factor for scale filter Factors for scale filter Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--doc/filters.texi5
-rw-r--r--libavfilter/vf_scale.c29
2 files changed, 30 insertions, 4 deletions
diff --git a/doc/filters.texi b/doc/filters.texi
index 9e67db4888..28e7a24af9 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -6911,6 +6911,11 @@ maintains the aspect ratio of the input image, calculated from the
other specified dimension. If both of them are -1, the input size is
used
+If one of the values is -n with n > 1, the scale filter will also use a value
+that maintains the aspect ratio of the input image, calculated from the other
+specified dimension. After that it will, however, make sure that the calculated
+dimension is divisible by n and adjust the value if necessary.
+
See below for the list of accepted constants for use in the dimension
expression.
diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
index 2e692cff5b..945ed121dd 100644
--- a/libavfilter/vf_scale.c
+++ b/libavfilter/vf_scale.c
@@ -81,6 +81,7 @@ typedef struct {
* New dimensions. Special values are:
* 0 = original width/height
* -1 = keep original aspect
+ * -N = try to keep aspect but make sure it is divisible by N
*/
int w, h;
char *size_str;
@@ -236,6 +237,7 @@ static int config_props(AVFilterLink *outlink)
double var_values[VARS_NB], res;
char *expr;
int ret;
+ int factor_w, factor_h;
var_values[VAR_IN_W] = var_values[VAR_IW] = inlink->w;
var_values[VAR_IN_H] = var_values[VAR_IH] = inlink->h;
@@ -270,11 +272,22 @@ static int config_props(AVFilterLink *outlink)
w = scale->w;
h = scale->h;
- /* sanity check params */
- if (w < -1 || h < -1) {
- av_log(ctx, AV_LOG_ERROR, "Size values less than -1 are not acceptable.\n");
- return AVERROR(EINVAL);
+ /* Check if it is requested that the result has to be divisible by a some
+ * factor (w or h = -n with n being the factor). After we got the factor,
+ * we set w/h back to -1 so that the automatic scaling is done. */
+ factor_w = 1;
+ factor_h = 1;
+ if (w < -1) {
+ factor_w = -w;
+ w = -1;
+ scale->w = -1;
}
+ if (h < -1) {
+ factor_h = -h;
+ h = -1;
+ scale->h = -1;
+ }
+
if (w == -1 && h == -1)
scale->w = scale->h = 0;
@@ -287,6 +300,14 @@ static int config_props(AVFilterLink *outlink)
if (h == -1)
h = av_rescale(w, inlink->h, inlink->w);
+ /* Make sure that the result is divisible by the factor we determined
+ * earlier. If no factor was set, it is nothing will happen as the default
+ * factor is 1 */
+ w = (w / factor_w) * factor_w;
+ h = (h / factor_h) * factor_h;
+
+ /* Note that force_original_aspect_ratio may overwrite the previous set
+ * dimensions so that it is not divisible by the set factors anymore. */
if (scale->force_original_aspect_ratio) {
int tmp_w = av_rescale(h, inlink->w, inlink->h);
int tmp_h = av_rescale(w, inlink->h, inlink->w);