Commit a01246f079 for ffmpeg

commit a01246f079e06910bb06034c8eb6001a44e84fca
Author: James Almer <jamrial@gmail.com>
Date:   Tue Oct 6 13:24:15 2026 -0300

    avfilter/vf_gainmap: don't use sizeof(AVGainMapParams)

    It's not part of the ABI.

    Signed-off-by: James Almer <jamrial@gmail.com>

diff --git a/libavfilter/vf_gainmap.c b/libavfilter/vf_gainmap.c
index 98ea8b9177..7b8b81614b 100644
--- a/libavfilter/vf_gainmap.c
+++ b/libavfilter/vf_gainmap.c
@@ -110,7 +110,8 @@ typedef struct GainMapContext {
     enum GainMapMeasure measure;

     /* Generated gain map parameters (recomputed per frame) */
-    AVGainMapParams params;
+    AVGainMapParams *params;
+    size_t params_size;
 } GainMapContext;

 typedef struct ThreadData {
@@ -171,8 +172,8 @@ static void setup_range(AVFilterContext *ctx, int ch, AVRational min, AVRational
         s->quant_offset[ch] = -minf * s->quant_scale[ch];
     }

-    s->params.channels[ch].gain_map_min = min;
-    s->params.channels[ch].gain_map_max = max;
+    s->params->channels[ch].gain_map_min = min;
+    s->params->channels[ch].gain_map_max = max;
     av_log(ctx, AV_LOG_TRACE, "channel %d: measured min=%g max=%g\n",
            ch, av_q2d(min), av_q2d(max));
 }
@@ -181,7 +182,7 @@ static void setup_gamma(AVFilterContext *ctx, int ch, AVRational gamma)
 {
     GainMapContext *s = ctx->priv;
     s->quant_gamma[ch] = av_q2d(gamma);
-    s->params.channels[ch].gamma = gamma;
+    s->params->channels[ch].gamma = gamma;
     av_log(ctx, AV_LOG_TRACE, "channel %d: measured gamma=%g\n",
            ch, s->quant_gamma[ch]);
 }
@@ -208,15 +209,17 @@ static av_cold int init(AVFilterContext *ctx)
                "parameters from the input frame.\n");
     }

-    s->params = (AVGainMapParams) {
-        .version              = 0,
-        .nb_channels          = s->nb_channels,
-        .use_base_color_space = s->colorspace == GAINMAP_CSP_BASE,
-        /* payload metadata recomputed per frame */
-    };
+    s->params = av_gain_map_params_alloc(&s->params_size);
+    if (!s->params)
+        return AVERROR(ENOMEM);
+
+    /* payload metadata recomputed per frame */
+    s->params->version              = 0;
+    s->params->nb_channels          = s->nb_channels;
+    s->params->use_base_color_space = s->colorspace == GAINMAP_CSP_BASE;

     for (int c = 0; c < s->nb_channels; c++) {
-        struct AVGainMapChannel *ch = &s->params.channels[c];
+        struct AVGainMapChannel *ch = &s->params->channels[c];
         ch->base_offset      = s->base_offset;
         ch->alternate_offset = s->alt_offset;
         if (!(s->measure & MEASURE_RANGE))
@@ -338,8 +341,8 @@ static int setup_colorspace(AVFilterContext *ctx, const AVFrame *base, const AVF
     double  alt_lw = s->alt_nits.den  ? av_q2d(s->alt_nits)  : frame_luminance(alt);
     double base_headroom = fmax(log2(base_lw / SDR_DIFFUSE_WHITE), 0.0);
     double  alt_headroom = fmax(log2(alt_lw  / SDR_DIFFUSE_WHITE), 0.0);
-    s->params.base_hdr_headroom      = quantq(base_headroom, AV_ROUND_NEAR_INF);
-    s->params.alternate_hdr_headroom = quantq(alt_headroom,  AV_ROUND_NEAR_INF);
+    s->params->base_hdr_headroom      = quantq(base_headroom, AV_ROUND_NEAR_INF);
+    s->params->alternate_hdr_headroom = quantq(alt_headroom,  AV_ROUND_NEAR_INF);
     s->sign = FFDIFFSIGN(alt_headroom, base_headroom);
     if (!s->sign) {
         /* No-op, set up empty gain map */
@@ -680,7 +683,7 @@ skip:;
         goto fail;
     }

-    *params = s->params;
+    memcpy(params, s->params, s->params_size);
     if (av_gain_map_params_validate(params) < 0)
         return AVERROR_BUG; /* should never happen */