diff options
author | Lars Kiesow <lkiesow@uos.de> | 2014-01-25 17:40:48 +0400 |
---|---|---|
committer | Lars Kiesow <lkiesow@uos.de> | 2014-01-25 17:40:48 +0400 |
commit | 7fc4c184630043587ace5b44ef70ccf70c7409fe (patch) | |
tree | 2ffc28f5b27a32778a55f1ad6fa8241a669ad65c | |
parent | 78a9f185eb175e6164b1c0f40d20ff1933ac8fb7 (diff) |
Factors for scale filter
-rw-r--r-- | libavfilter/vf_scale.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 2e692cff5b..bda536df91 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -270,11 +270,20 @@ 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. */ + int factor_w = 1; + int factor_h = 1; + if (w < -1) { + factor_w = -w; + w = -1; } + if (h < -1) { + factor_h = -h; + h = -1; + } + if (w == -1 && h == -1) scale->w = scale->h = 0; @@ -287,6 +296,15 @@ 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); |