diff mbox series

[FFmpeg-devel,2/2] avfilter/buffersrc: allow promoting color range to MPEG

Message ID 20240205142926.12050-2-ffmpeg@haasn.xyz
State New
Headers show
Series [FFmpeg-devel,1/2] avfilter/buffersrc: promote unspecified color metadata | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Niklas Haas Feb. 5, 2024, 2:29 p.m. UTC
From: Niklas Haas <git@haasn.dev>

Otherwise, passing an UNSPECIFIED frame to am MPEG-only filter graph
would trigger insertion of an unnecessary vf_scale filter, which would
perform a memcpy to convert between the two.

This is safe to do because unspecified YUV frames are already
universally assumed to be MPEG range, in particular by swscale.
---
 libavfilter/buffersrc.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
index 93fadab65f..a6a000df1e 100644
--- a/libavfilter/buffersrc.c
+++ b/libavfilter/buffersrc.c
@@ -506,8 +506,14 @@  static int query_formats(AVFilterContext *ctx)
             if ((ret = ff_add_format(&color_spaces, c->color_space)) < 0 ||
                 (ret = ff_set_common_color_spaces(ctx, color_spaces)) < 0)
                 return ret;
-            if ((ret = ff_add_format(&color_ranges, c->color_range)) < 0 ||
-                (ret = ff_set_common_color_ranges(ctx, color_ranges)) < 0)
+            if ((ret = ff_add_format(&color_ranges, c->color_range)) < 0)
+                return ret;
+            if (c->color_range == AVCOL_RANGE_UNSPECIFIED) {
+                /* allow implicitly promoting unspecified to mpeg */
+                if ((ret = ff_add_format(&color_ranges, AVCOL_RANGE_MPEG)) < 0)
+                    return ret;
+            }
+            if ((ret = ff_set_common_color_ranges(ctx, color_ranges)) < 0)
                 return ret;
         }
         break;