[ffmpeg] branch master updated. 04eeaeed11 avfilter/vf_libplacebo: also rotate SAR when fitting
The branch, master has been updated via 04eeaeed11d721ccbcd0104c2e79e3ceb819585d (commit) via f83fdad550f6dddd09c99b6e00b81c327bfb7a5e (commit) via 6e0034ab7e46429731fec6d2c390fa536a9157ad (commit) from 372dab2a4d2cbfee365b3e654681f38547916145 (commit) - Log ----------------------------------------------------------------- commit 04eeaeed11d721ccbcd0104c2e79e3ceb819585d Author: Niklas Haas <git@haasn.dev> AuthorDate: Mon Nov 10 12:38:11 2025 +0100 Commit: Niklas Haas <ffmpeg@haasn.dev> CommitDate: Sat Nov 29 08:45:24 2025 +0000 avfilter/vf_libplacebo: also rotate SAR when fitting diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 8b5f789280..b1788565bf 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -928,10 +928,13 @@ static void update_crops(AVFilterContext *ctx, LibplaceboInput *in, /* Effective visual crop */ double sar_in = q2d_fallback(inlink->sample_aspect_ratio, 1.0); double sar_out = q2d_fallback(outlink->sample_aspect_ratio, 1.0); - const float w_adj = sar_in / sar_out; + + pl_rotation rot_total = PL_ROTATION_360 + image->rotation - target->rotation; + if (rot_total % PL_ROTATION_180 == PL_ROTATION_90) + sar_in = 1.0 / sar_in; pl_rect2df fixed = image->crop; - pl_rect2df_stretch(&fixed, w_adj, 1.0); + pl_rect2df_stretch(&fixed, sar_in / sar_out, 1.0); switch (s->fit_mode) { case FIT_FILL: @@ -954,8 +957,7 @@ static void update_crops(AVFilterContext *ctx, LibplaceboInput *in, pl_rect2df_aspect_fit(&target->crop, &fixed, 0.0); } - const pl_rotation rot_total = image->rotation - target->rotation; - if ((rot_total + PL_ROTATION_360) % PL_ROTATION_180 == PL_ROTATION_90) { + if (rot_total % PL_ROTATION_180 == PL_ROTATION_90) { /* Libplacebo expects the input crop relative to the actual frame * dimensions, so un-transpose them here */ FFSWAP(float, image->crop.x0, image->crop.y0); commit f83fdad550f6dddd09c99b6e00b81c327bfb7a5e Author: Niklas Haas <git@haasn.dev> AuthorDate: Mon Nov 10 12:36:33 2025 +0100 Commit: Niklas Haas <ffmpeg@haasn.dev> CommitDate: Sat Nov 29 08:45:24 2025 +0000 avfilter/vf_libplacebo: fix math when AVRationals are undefined diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 5a615aceed..8b5f789280 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -861,6 +861,11 @@ static const AVFrame *ref_frame(const struct pl_frame_mix *mix) return NULL; } +static inline double q2d_fallback(AVRational q, const double def) +{ + return (q.num && q.den) ? av_q2d(q) : def; +} + static void update_crops(AVFilterContext *ctx, LibplaceboInput *in, struct pl_frame *target, double target_pts) { @@ -882,8 +887,7 @@ static void update_crops(AVFilterContext *ctx, LibplaceboInput *in, s->var_values[VAR_IN_W] = s->var_values[VAR_IW] = inlink->w; s->var_values[VAR_IN_H] = s->var_values[VAR_IH] = inlink->h; s->var_values[VAR_A] = (double) inlink->w / inlink->h; - s->var_values[VAR_SAR] = inlink->sample_aspect_ratio.num ? - av_q2d(inlink->sample_aspect_ratio) : 1.0; + s->var_values[VAR_SAR] = q2d_fallback(inlink->sample_aspect_ratio, 1.0); s->var_values[VAR_IN_T] = s->var_values[VAR_T] = image_pts; s->var_values[VAR_OUT_T] = s->var_values[VAR_OT] = target_pts; s->var_values[VAR_N] = outl->frame_count_out; @@ -920,9 +924,11 @@ static void update_crops(AVFilterContext *ctx, LibplaceboInput *in, target->crop.x1 = target->crop.x0 + s->var_values[VAR_POS_W]; target->crop.y1 = target->crop.y0 + s->var_values[VAR_POS_H]; + /* Effective visual crop */ - const float w_adj = av_q2d(inlink->sample_aspect_ratio) / - av_q2d(outlink->sample_aspect_ratio); + double sar_in = q2d_fallback(inlink->sample_aspect_ratio, 1.0); + double sar_out = q2d_fallback(outlink->sample_aspect_ratio, 1.0); + const float w_adj = sar_in / sar_out; pl_rect2df fixed = image->crop; pl_rect2df_stretch(&fixed, w_adj, 1.0); @@ -1278,7 +1284,7 @@ static int libplacebo_activate(AVFilterContext *ctx) in->qstatus = pl_queue_update(in->queue, &in->mix, pl_queue_params( .pts = TS2T(out_pts, outlink->time_base), .radius = pl_frame_mix_radius(&s->opts->params), - .vsync_duration = l->frame_rate.num ? av_q2d(av_inv_q(l->frame_rate)) : 0, + .vsync_duration = q2d_fallback(av_inv_q(l->frame_rate), 0.0), )); switch (in->qstatus) { @@ -1461,8 +1467,7 @@ static int libplacebo_config_output(AVFilterLink *outlink) &outlink->w, &outlink->h)); s->reset_sar |= s->normalize_sar || s->nb_inputs > 1; - double sar_in = inlink->sample_aspect_ratio.num ? - av_q2d(inlink->sample_aspect_ratio) : 1.0; + double sar_in = q2d_fallback(inlink->sample_aspect_ratio, 1.0); int force_oar = s->force_original_aspect_ratio; if (!force_oar && s->fit_sense == FIT_CONSTRAINT) { @@ -1549,8 +1554,7 @@ static int libplacebo_config_output(AVFilterLink *outlink) /* Static variables */ s->var_values[VAR_OUT_W] = s->var_values[VAR_OW] = outlink->w; s->var_values[VAR_OUT_H] = s->var_values[VAR_OH] = outlink->h; - s->var_values[VAR_DAR] = outlink->sample_aspect_ratio.num ? - av_q2d(outlink->sample_aspect_ratio) : 1.0; + s->var_values[VAR_DAR] = q2d_fallback(outlink->sample_aspect_ratio, 1.0); s->var_values[VAR_HSUB] = 1 << desc->log2_chroma_w; s->var_values[VAR_VSUB] = 1 << desc->log2_chroma_h; s->var_values[VAR_OHSUB] = 1 << out_desc->log2_chroma_w; commit 6e0034ab7e46429731fec6d2c390fa536a9157ad Author: Niklas Haas <git@haasn.dev> AuthorDate: Mon Nov 10 12:32:32 2025 +0100 Commit: Niklas Haas <ffmpeg@haasn.dev> CommitDate: Sat Nov 29 08:45:24 2025 +0000 avfilter/vf_libplacebo: un-rotate image crop after fitting When combining rotation with a FIT_ mode other than FIT_FILL, the fitting logic was operating on the un-rotated rects, when it should have been operating on the rotated (output) rects. diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 42501c51f2..5a615aceed 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -913,14 +913,6 @@ static void update_crops(AVFilterContext *ctx, LibplaceboInput *in, image->crop.x1 = image->crop.x0 + s->var_values[VAR_CROP_W]; image->crop.y1 = image->crop.y0 + s->var_values[VAR_CROP_H]; - const pl_rotation rot_total = image->rotation - target->rotation; - if ((rot_total + PL_ROTATION_360) % PL_ROTATION_180 == PL_ROTATION_90) { - /* Libplacebo expects the input crop relative to the actual frame - * dimensions, so un-transpose them here */ - FFSWAP(float, image->crop.x0, image->crop.y0); - FFSWAP(float, image->crop.x1, image->crop.y1); - } - if (src == ref) { /* Only update the target crop once, for the 'reference' frame */ target->crop.x0 = av_expr_eval(s->pos_x_pexpr, s->var_values, NULL); @@ -955,6 +947,14 @@ static void update_crops(AVFilterContext *ctx, LibplaceboInput *in, case FIT_SCALE_DOWN: pl_rect2df_aspect_fit(&target->crop, &fixed, 0.0); } + + const pl_rotation rot_total = image->rotation - target->rotation; + if ((rot_total + PL_ROTATION_360) % PL_ROTATION_180 == PL_ROTATION_90) { + /* Libplacebo expects the input crop relative to the actual frame + * dimensions, so un-transpose them here */ + FFSWAP(float, image->crop.x0, image->crop.y0); + FFSWAP(float, image->crop.x1, image->crop.y1); + } } } } ----------------------------------------------------------------------- Summary of changes: libavfilter/vf_libplacebo.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) hooks/post-receive --
participants (1)
-
ffmpeg-git@ffmpeg.org