On 2025-02-07 08:24 pm, Leo Izen wrote:
On 1/31/25 8:00 AM, Gyan Doshi wrote:


diff --git a/doc/filters.texi b/doc/filters.texi
index a14c7e7e77..71de1ab2dc 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -21285,6 +21285,13 @@ This option can be handy if you need to have a video fit within or exceed   a defined resolution using @option{force_original_aspect_ratio} but also have
  encoder restrictions on width or height divisibility.
  +@item reset_sar
+For anamorphic videos, enabling this option leads to adjustment of output dimensions +to obtain square pixels when the user requests proportional scaling through either of
+the width or height expressions or through force_original_aspect_ratio.
+Output SAR is always reset to 1.
+Default is false.
+
  @end table

Documentation should probably state that if force_original_aspect_ratio is set, but width and height expressions are unset, that the width of the input is modified, but not the height. This way a user with, say, a 16:9 rip of a DVD will know that the height will be preserved.

Dimensions are adjusted only if "user requests proportional scaling through either of the width or height expressions or through force_original_aspect_ratio"

so  'scale=reset_sar=1'  or ' scale=500:500:reset_sar=1'  will lead to output of 'inlink->w x inlink->h' and '500 x 500' respectively. Only the sample_aspect_ratio is normalized.

I will change the doc to emphasize this better.


+    double w_adj = 1;

Nit: you've initialized it as 1.0 everywhere else.

Will change.


+    if (scale->reset_sar)
+        outlink->sample_aspect_ratio = (AVRational){1, 1};\

This doesn't compile on MSVC (for some reason). use av_make_q(1, 1);

That's surprising. This form is used in many places, including AVFrame init and video decode checks. See below.

+        w_adj = inlink->sample_aspect_ratio.num ?
+        (double)inlink->sample_aspect_ratio.num / inlink->sample_aspect_ratio.den : 1;

I believe you want to check if the denominator is nonzero here, not the numerator. Otherwise this gives infinity.

This is the standard check in filters, including in this filter. See assignment of scale->var_values[VAR_SAR] in scale_eval_dimensions(). The rationale being that the SAR is initialized to 0/1 in lavu/frame.c: get_frame_defaults() and that when decoding, lavc/decode.c: ff_decode_frame_props() ensures that den > 0. Same is the case for other internal assignments or public interfaces. So, if numerator is non-zero, denominator is guaranteed to be as well.
See these two functions for examples of AVRational cast assignment.


  -    ff_scale_adjust_dimensions(inlink, &vkctx->output_width, &vkctx->output_height, 0, 1); +    ff_scale_adjust_dimensions(inlink, &vkctx->output_width, &vkctx->output_height, 0, 1, 1.f);
        outlink->w = vkctx->output_width;
      outlink->h = vkctx->output_height;


Overall looks fine. However, here's one possible issue I forsee happening:

A user has an NTSC DVD which is 720x480 and 16:9 DAR, or 32:27 SAR. That user does something simple like:

ffmpeg -i dvdrip.mpg -vf scale=reset_sar=1 -c:v libx264 ...

Then, it will scale the video to 853x480, which will then fail to encode in libx264 because it requires an even width with yuv420p. Then, the user will change it to scale=reset_sar=1:force_divisible_by=2 and it still won't work because force_original_aspect_ratio is unset.

I don't know if this is possibly a user issue cause the solution here is to use reset_sar=1:force_original_aspect_ratio=1:force_divisible_by=2

In either case, it may be a good idea to automatically enable force_original_aspect_ratio if the width and height expressions are unset, but reset_sar is set.

At present, lack of any dimension specifiers is a no-op in terms of dimension change. Not sure it's a good idea to change that. I can document both in the description as well as an example how a simple flattening the picture could be done.

Regards,
Gyan

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to