1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-10 06:10:52 +02:00

avfilter/vf_libplacebo: add reset_sar option

This was requested by users of `vf_libplacebo`, to mirror the existing
option on the other `vf_scale_*` family of filters. While we have
`vf_normalize`, it was not as useful in the event that the content
stretching was actually desired.

Bridges an important usability gap between `vf_scale` and `vf_libplacebo`
that made mixing and matching the filters needlessly difficult.
This commit is contained in:
Niklas Haas
2025-06-16 20:01:48 +02:00
parent c0698840c4
commit 7039a37e35
2 changed files with 11 additions and 6 deletions

View File

@@ -16291,11 +16291,15 @@ will be performed.
@item force_divisible_by @item force_divisible_by
Work the same as the identical @ref{scale} filter options. Work the same as the identical @ref{scale} filter options.
@item reset_sar
If enabled, output frames will always have a pixel aspect ratio of 1:1. If
disabled (the default), any aspect ratio mismatches, including those from
e.g. anamorphic video sources, are forwarded to the output pixel aspect ratio.
@item normalize_sar @item normalize_sar
If enabled, output frames will always have a pixel aspect ratio of 1:1. This Like @option{reset_sar}, but instead of stretching the video content to fill
will introduce additional padding/cropping as necessary. If disabled (the the new output aspect ratio, the content is instead padded or cropped as
default), any aspect ratio mismatches, including those from e.g. anamorphic necessary.
video sources, are forwarded to the output pixel aspect ratio.
@item pad_crop_ratio @item pad_crop_ratio
Specifies a ratio (between @code{0.0} and @code{1.0}) between padding and Specifies a ratio (between @code{0.0} and @code{1.0}) between padding and

View File

@@ -1298,7 +1298,7 @@ static int libplacebo_config_output(AVFilterLink *outlink)
RET(ff_scale_eval_dimensions(s, s->w_expr, s->h_expr, inlink, outlink, RET(ff_scale_eval_dimensions(s, s->w_expr, s->h_expr, inlink, outlink,
&outlink->w, &outlink->h)); &outlink->w, &outlink->h));
s->reset_sar = s->normalize_sar || s->nb_inputs > 1; s->reset_sar |= s->normalize_sar || s->nb_inputs > 1;
double sar_in = inlink->sample_aspect_ratio.num ? double sar_in = inlink->sample_aspect_ratio.num ?
av_q2d(inlink->sample_aspect_ratio) : 1.0; av_q2d(inlink->sample_aspect_ratio) : 1.0;
@@ -1401,7 +1401,8 @@ static const AVOption libplacebo_options[] = {
{ "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, STATIC, .unit = "force_oar" }, { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, STATIC, .unit = "force_oar" },
{ "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, STATIC, .unit = "force_oar" }, { "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, STATIC, .unit = "force_oar" },
{ "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 256, STATIC }, { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, 256, STATIC },
{ "normalize_sar", "force SAR normalization to 1:1 by adjusting pos_x/y/w/h", OFFSET(normalize_sar), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, STATIC }, { "reset_sar", "force SAR normalization to 1:1 by adjusting pos_x/y/w/h", OFFSET(reset_sar), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, STATIC },
{ "normalize_sar", "like reset_sar, but pad/crop instead of stretching the video", OFFSET(normalize_sar), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, STATIC },
{ "pad_crop_ratio", "ratio between padding and cropping when normalizing SAR (0=pad, 1=crop)", OFFSET(pad_crop_ratio), AV_OPT_TYPE_FLOAT, {.dbl=0.0}, 0.0, 1.0, DYNAMIC }, { "pad_crop_ratio", "ratio between padding and cropping when normalizing SAR (0=pad, 1=crop)", OFFSET(pad_crop_ratio), AV_OPT_TYPE_FLOAT, {.dbl=0.0}, 0.0, 1.0, DYNAMIC },
{ "fillcolor", "Background fill color", OFFSET(fillcolor), AV_OPT_TYPE_COLOR, {.str = "black@0"}, .flags = DYNAMIC }, { "fillcolor", "Background fill color", OFFSET(fillcolor), AV_OPT_TYPE_COLOR, {.str = "black@0"}, .flags = DYNAMIC },
{ "corner_rounding", "Corner rounding radius", OFFSET(corner_rounding), AV_OPT_TYPE_FLOAT, {.dbl = 0.0}, 0.0, 1.0, .flags = DYNAMIC }, { "corner_rounding", "Corner rounding radius", OFFSET(corner_rounding), AV_OPT_TYPE_FLOAT, {.dbl = 0.0}, 0.0, 1.0, .flags = DYNAMIC },