Factors for scale filter

This commit is contained in:
Lars Kiesow 2014-01-25 14:40:48 +01:00
parent 78a9f185eb
commit 7fc4c18463

View File

@ -270,11 +270,20 @@ static int config_props(AVFilterLink *outlink)
w = scale->w; w = scale->w;
h = scale->h; h = scale->h;
/* sanity check params */ /* Check if it is requested that the result has to be divisible by a some
if (w < -1 || h < -1) { * factor (w or h = -n with n being the factor). After we got the factor,
av_log(ctx, AV_LOG_ERROR, "Size values less than -1 are not acceptable.\n"); * we set w/h back to -1 so that the automatic scaling is done. */
return AVERROR(EINVAL); 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) if (w == -1 && h == -1)
scale->w = scale->h = 0; scale->w = scale->h = 0;
@ -287,6 +296,15 @@ static int config_props(AVFilterLink *outlink)
if (h == -1) if (h == -1)
h = av_rescale(w, inlink->h, inlink->w); 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) { if (scale->force_original_aspect_ratio) {
int tmp_w = av_rescale(h, inlink->w, inlink->h); int tmp_w = av_rescale(h, inlink->w, inlink->h);
int tmp_h = av_rescale(w, inlink->h, inlink->w); int tmp_h = av_rescale(w, inlink->h, inlink->w);