This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit fd02c2956244381693b2f09b6346d5164f86d624
Author:     Kacper Michajłow <[email protected]>
AuthorDate: Wed Sep 30 03:05:35 2026 +0200
Commit:     Kacper Michajłow <[email protected]>
CommitDate: Thu Oct 1 14:31:15 2026 +0000

    avfilter/vf_zscale: negotiate the chroma location
    
    The output link takes the chromal value, or any location when it is not
    set, in which case the frames are converted to the negotiated one, the
    same way as for the color space and range. The input accepts any location,
    and input without one is assumed to be sited like the output, so it is
    tagged but not converted.
    
    Signed-off-by: Kacper Michajłow <[email protected]>
---
 libavfilter/vf_zscale.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c
index b14d704663..dc14d61e87 100644
--- a/libavfilter/vf_zscale.c
+++ b/libavfilter/vf_zscale.c
@@ -231,6 +231,15 @@ static int query_formats(const AVFilterContext *ctx,
     if ((ret = ff_formats_ref(formats, &cfg_out[0]->color_ranges)) < 0)
         return ret;
 
+    if ((ret = ff_formats_ref(ff_all_chroma_locations(), 
&cfg_in[0]->chroma_locations)) < 0)
+        return ret;
+
+    formats = s->chromal != -1
+        ? ff_make_formats_list_singleton(s->chromal + 1)
+        : ff_all_chroma_locations();
+    if ((ret = ff_formats_ref(formats, &cfg_out[0]->chroma_locations)) < 0)
+        return ret;
+
     if ((ret = ff_formats_ref(ff_all_alpha_modes(), &cfg_in[0]->alpha_modes))  
< 0 ||
         (ret = ff_formats_ref(ff_all_alpha_modes(), &cfg_out[0]->alpha_modes)) 
< 0)
         return ret;
@@ -784,6 +793,8 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
         av_frame_copy_props(out, in);
         out->colorspace = outlink->colorspace;
         out->color_range = outlink->color_range;
+        if (outlink->chroma_location != AVCHROMA_LOC_UNSPECIFIED)
+            out->chroma_location = outlink->chroma_location;
 
         if ((ret = realign_frame(link, desc, &in)) < 0)
             goto fail;
@@ -806,10 +817,13 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
         zimg_image_format_default(&s->dst_format, ZIMG_API_VERSION);
         zimg_graph_builder_params_default(&s->params, ZIMG_API_VERSION);
 
-        format_init(&s->src_format, in, desc, s->colorspace_in,
-            s->primaries_in, s->trc_in, s->range_in, s->chromal_in);
         format_init(&s->dst_format, out, odesc, s->colorspace,
             s->primaries, s->trc, s->range, s->chromal);
+        /* Input without a chroma location is assumed to be sited like the 
output. */
+        format_init(&s->src_format, in, desc, s->colorspace_in,
+            s->primaries_in, s->trc_in, s->range_in,
+            s->chromal_in == -1 && in->chroma_location == 
AVCHROMA_LOC_UNSPECIFIED ?
+            s->dst_format.chroma_location : s->chromal_in);
         s->first_time = 0;
 
         s->params.dither_type = s->dither;
@@ -883,6 +897,8 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
         }
     } else {
         /*no need for any filtering */
+        if (outlink->chroma_location != AVCHROMA_LOC_UNSPECIFIED)
+            in->chroma_location = outlink->chroma_location;
         return ff_filter_frame(outlink, in);
     }
 fail:

-- 
To stop receiving notification emails like this one, please contact
[email protected].
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to