PR #24905 opened by James Almer (jamrial) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24905 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/24905.patch
It's not part of the ABI. >From a01246f079e06910bb06034c8eb6001a44e84fca Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Tue, 6 Oct 2026 13:24:15 -0300 Subject: [PATCH] avfilter/vf_gainmap: don't use sizeof(AVGainMapParams) It's not part of the ABI. Signed-off-by: James Almer <[email protected]> --- libavfilter/vf_gainmap.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) 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 */ -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
