mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avfilter/scale_eval: Reduce rounding error.
When force_original_aspect_ratio and force_divisible_by are both used, dimensions are now rounded to the nearest allowed multiple of force_divisible_by rather than first rounding to the nearest integer and then rounding in a static direction. This results in less distortion of the aspect ratio. Reviewed-by: Thierry Foucu <tfoucu@google.com> Signed-off-by: Tristan Schmelcher <tschmelcher@google.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
543a46b4b2
commit
179830108d
@ -148,14 +148,17 @@ int ff_scale_adjust_dimensions(AVFilterLink *inlink,
|
||||
* dimensions so that it is not divisible by the set factors anymore
|
||||
* unless force_divisible_by is defined as well */
|
||||
if (force_original_aspect_ratio) {
|
||||
int tmp_w = av_rescale(h, inlink->w, inlink->h);
|
||||
int tmp_h = av_rescale(w, inlink->h, inlink->w);
|
||||
// Including force_divisible_by here rounds to the nearest multiple of it.
|
||||
int tmp_w = av_rescale(h, inlink->w, inlink->h * (int64_t)force_divisible_by)
|
||||
* force_divisible_by;
|
||||
int tmp_h = av_rescale(w, inlink->h, inlink->w * (int64_t)force_divisible_by)
|
||||
* force_divisible_by;
|
||||
|
||||
if (force_original_aspect_ratio == 1) {
|
||||
w = FFMIN(tmp_w, w);
|
||||
h = FFMIN(tmp_h, h);
|
||||
if (force_divisible_by > 1) {
|
||||
// round down
|
||||
// round down in case provided w or h is not divisible.
|
||||
w = w / force_divisible_by * force_divisible_by;
|
||||
h = h / force_divisible_by * force_divisible_by;
|
||||
}
|
||||
@ -163,7 +166,7 @@ int ff_scale_adjust_dimensions(AVFilterLink *inlink,
|
||||
w = FFMAX(tmp_w, w);
|
||||
h = FFMAX(tmp_h, h);
|
||||
if (force_divisible_by > 1) {
|
||||
// round up
|
||||
// round up in case provided w or h is not divisible.
|
||||
w = (w + force_divisible_by - 1) / force_divisible_by * force_divisible_by;
|
||||
h = (h + force_divisible_by - 1) / force_divisible_by * force_divisible_by;
|
||||
}
|
||||
|
@ -38,7 +38,8 @@ int ff_scale_eval_dimensions(void *ctx,
|
||||
* Transform evaluated width and height obtained from ff_scale_eval_dimensions
|
||||
* into actual target width and height for scaling. Adjustment can occur if one
|
||||
* or both of the evaluated values are of the form '-n' or if
|
||||
* force_original_aspect_ratio is set.
|
||||
* force_original_aspect_ratio is set. force_divisible_by is used only when
|
||||
* force_original_aspect_ratio is set and must be at least 1.
|
||||
*
|
||||
* Returns 0.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user