Commit f14e7eaf7c for ffmpeg
commit f14e7eaf7cd2d54615f2ddc5714376bfd2cea23c
Author: Niklas Haas <git@haasn.dev>
Date: Tue Aug 18 15:04:30 2026 +0200
avfilter: add AV_FRAME_DATA_GAIN_MAP_PARAMS support
To both f_sidedata and vf_showinfo. Useful for debugging.
Signed-off-by: Niklas Haas <git@haasn.dev>
diff --git a/doc/filters.texi b/doc/filters.texi
index 1a9bbeff7e..24d52a3a01 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -34366,6 +34366,7 @@ Possible values are:
@item DYNAMIC_HDR_VIVID
@item AMBIENT_VIEWING_ENVIRONMENT
@item VIDEO_HINT
+@item GAIN_MAP_PARAMS
@end table
@end table
diff --git a/libavfilter/f_sidedata.c b/libavfilter/f_sidedata.c
index 6c81c6b6a5..eb0301c5ce 100644
--- a/libavfilter/f_sidedata.c
+++ b/libavfilter/f_sidedata.c
@@ -80,6 +80,7 @@ static const AVOption filt_name##_options[] = { \
{ "DYNAMIC_HDR_VIVID", "", 0, AV_OPT_TYPE_CONST, {.i64 = AV_FRAME_DATA_DYNAMIC_HDR_VIVID }, 0, 0, FLAGS, .unit = "type" }, \
{ "AMBIENT_VIEWING_ENVIRONMENT","", 0, AV_OPT_TYPE_CONST, {.i64 = AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT}, 0, 0, FLAGS, .unit = "type" }, \
{ "VIDEO_HINT", "", 0, AV_OPT_TYPE_CONST, {.i64 = AV_FRAME_DATA_VIDEO_HINT }, 0, 0, FLAGS, .unit = "type" }, \
+ { "GAIN_MAP_PARAMS", "", 0, AV_OPT_TYPE_CONST, {.i64 = AV_FRAME_DATA_GAIN_MAP_PARAMS }, 0, 0, FLAGS, .unit = "type" }, \
{ NULL } \
}
diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
index 4ac3d45dc0..21cde369f5 100644
--- a/libavfilter/vf_showinfo.c
+++ b/libavfilter/vf_showinfo.c
@@ -32,6 +32,7 @@
#include "libavutil/imgutils.h"
#include "libavutil/internal.h"
#include "libavutil/film_grain_params.h"
+#include "libavutil/gain_map.h"
#include "libavutil/hdr_dynamic_metadata.h"
#include "libavutil/hdr_dynamic_vivid_metadata.h"
#include "libavutil/opt.h"
@@ -655,6 +656,32 @@ static void dump_dovi_metadata(AVFilterContext *ctx, const AVFrameSideData *sd)
av_log(ctx, AV_LOG_INFO, "source_diagonal=%"PRIu16"; ", color->source_diagonal);
}
+static void dump_gain_map_params(AVFilterContext *ctx, const AVFrameSideData *sd)
+{
+ const AVGainMapParams *p = (const AVGainMapParams *) sd->data;
+ av_log(ctx, AV_LOG_INFO, "version=%d, nb_channels=%d, use_base_color_space=%d, "
+ "base_hdr_headroom=%f, alternate_hdr_headroom=%f, channels={ ",
+ p->version, p->nb_channels, p->use_base_color_space,
+ av_q2d(p->base_hdr_headroom), av_q2d(p->alternate_hdr_headroom));
+
+ if (!(p->nb_channels == 1 || p->nb_channels == 3)) {
+ av_log(ctx, AV_LOG_ERROR, "invalid data }");
+ return;
+ }
+
+ for (int c = 0; c < p->nb_channels; c++) {
+ const struct AVGainMapChannel *ch = &p->channels[c];
+ av_log(ctx, AV_LOG_INFO,
+ "{ gain_map_min=%f, gain_map_max=%f, gamma=%f, "
+ "base_offset=%f, alternate_offset=%f } ",
+ av_q2d(ch->gain_map_min), av_q2d(ch->gain_map_max),
+ av_q2d(ch->gamma), av_q2d(ch->base_offset),
+ av_q2d(ch->alternate_offset));
+ }
+
+ av_log(ctx, AV_LOG_INFO, "}");
+}
+
static void dump_ambient_viewing_environment(AVFilterContext *ctx, const AVFrameSideData *sd)
{
const AVAmbientViewingEnvironment *ambient_viewing_environment =
@@ -865,6 +892,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
case AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT:
dump_ambient_viewing_environment(ctx, sd);
break;
+ case AV_FRAME_DATA_GAIN_MAP_PARAMS:
+ dump_gain_map_params(ctx, sd);
+ break;
case AV_FRAME_DATA_VIEW_ID:
av_log(ctx, AV_LOG_INFO, "view id: %d\n", *(int*)sd->data);
break;