Commit e1ce262438 for ffmpeg

commit e1ce2624383b741c1ac24a4d529d43fe52b48a96
Author: Romain Beauxis <romain.beauxis@gmail.com>
Date:   Thu Oct 15 15:30:11 2026 +0200

    avcodec/packet_internal: add a handle for each side data type

    Add a list that gives each side data type a short handle made of lower case
    letters, digits and underscores, so that a filter can let its user name a
    type in an option.

    The side_data_prefer_packet option of decoders now takes its constants from
    this list, which gives the list the names that option has already released.
    The option thus accepts every type, with the flags of the option itself
    rather than audio only. A decoder warns about a type that has no frame side
    data counterpart, as it ignores it.

    Each handle is written out rather than derived from the name that
    av_packet_side_data_name() returns, as that one is meant for people and may
    be reworded.

diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 6584c5b5ca..b378715932 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -2118,6 +2118,7 @@ av_cold int ff_decode_preinit(AVCodecContext *avctx)
     else {
         for (unsigned i = 0; i < avctx->nb_side_data_prefer_packet; i++) {
             int val = avctx->side_data_prefer_packet[i];
+            int mapped = 0;

             if (val < 0 || val >= AV_PKT_DATA_NB) {
                 av_log(avctx, AV_LOG_ERROR, "Invalid side data type: %d\n", val);
@@ -2126,6 +2127,7 @@ av_cold int ff_decode_preinit(AVCodecContext *avctx)

             for (unsigned j = 0; ff_sd_global_map[j].packet < AV_PKT_DATA_NB; j++) {
                 if (ff_sd_global_map[j].packet == val) {
+                    mapped = 1;
                     val = ff_sd_global_map[j].frame;

                     // this code will need to be changed when we have more than
@@ -2138,6 +2140,12 @@ av_cold int ff_decode_preinit(AVCodecContext *avctx)
                     dc->side_data_pref_mask |= 1ULL << val;
                 }
             }
+
+            if (!mapped)
+                av_log(avctx, AV_LOG_WARNING,
+                       "Side data type %s has no frame side data counterpart, "
+                       "ignoring it in side_data_prefer_packet\n",
+                       av_packet_side_data_name(val));
         }
     }

diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index 83f362a556..862b4505f4 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -31,6 +31,7 @@
 #include "libavutil/opt.h"
 #include "avcodec.h"
 #include "avcodec_internal.h"
+#include "packet_internal.h"
 #include "version_major.h"

 #define FFOFFSET(x) offsetof(FFCodecContext,x)
@@ -46,6 +47,9 @@

 #define AR AV_OPT_TYPE_FLAG_ARRAY

+#define SIDE_DATA_PKT_CONST(pkt_type, handle) \
+    { handle, .default_val.i64 = AV_PKT_DATA_ ## pkt_type, .type = AV_OPT_TYPE_CONST, .flags = V|A|S|D, .unit = "side_data_pkt" },
+
 #define AV_CODEC_DEFAULT_BITRATE 200*1000

 static const AVOption avcodec_options[] = {
@@ -413,15 +417,7 @@ static const AVOption avcodec_options[] = {
 {"discard_damaged_percentage", "Percentage of damaged samples to discard a frame", OFFSET(discard_damaged_percentage), AV_OPT_TYPE_INT, {.i64 = 95 }, 0, 100, V|D },
 {"side_data_prefer_packet", "Comma-separated list of side data types for which user-supplied (container) data is preferred over coded bytestream",
     OFFSET(side_data_prefer_packet), AV_OPT_TYPE_INT | AR, .min = -1, .max = INT_MAX, .flags = V|A|S|D, .unit = "side_data_pkt" },
-    {"replaygain",                  .default_val.i64 = AV_PKT_DATA_REPLAYGAIN,                  .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-    {"displaymatrix",               .default_val.i64 = AV_PKT_DATA_DISPLAYMATRIX,               .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-    {"spherical",                   .default_val.i64 = AV_PKT_DATA_SPHERICAL,                   .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-    {"stereo3d",                    .default_val.i64 = AV_PKT_DATA_STEREO3D,                    .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-    {"audio_service_type",          .default_val.i64 = AV_PKT_DATA_AUDIO_SERVICE_TYPE,          .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-    {"mastering_display_metadata",  .default_val.i64 = AV_PKT_DATA_MASTERING_DISPLAY_METADATA,  .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-    {"content_light_level",         .default_val.i64 = AV_PKT_DATA_CONTENT_LIGHT_LEVEL,         .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-    {"icc_profile",                 .default_val.i64 = AV_PKT_DATA_ICC_PROFILE,                 .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
-    {"exif",                        .default_val.i64 = AV_PKT_DATA_EXIF,                        .type = AV_OPT_TYPE_CONST, .flags = A|D, .unit = "side_data_pkt" },
+    FF_PACKET_SIDE_DATA_HANDLES(SIDE_DATA_PKT_CONST)

 // FFCodecContext options
 {"lcevc-dec-params", "Configure liblcevc-dec using a :-separated list of key=value parameters", FFOFFSET(lcevc_params), AV_OPT_TYPE_DICT, { 0 }, 0, 0, V|D },
@@ -433,6 +429,7 @@ static const AVOption avcodec_options[] = {
 #undef S
 #undef E
 #undef D
+#undef SIDE_DATA_PKT_CONST
 #undef CC
 #undef DEFAULT
 #undef OFFSET
diff --git a/libavcodec/packet_internal.h b/libavcodec/packet_internal.h
index dbaf744ee9..ba4efbb14d 100644
--- a/libavcodec/packet_internal.h
+++ b/libavcodec/packet_internal.h
@@ -27,4 +27,59 @@

 int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp);

+/**
+ * The handle of each side data type: a short, stable name made of lower case
+ * letters, digits and underscores, for use where a name has to be typed, such
+ * as in the options of a filter. HANDLE(type, handle) is called with the type
+ * without its AV_PKT_DATA_ prefix.
+ *
+ * Every type below AV_PKT_DATA_NB has one, which the packet_side_data_handle
+ * test checks. A handle that has been released must not change.
+ */
+#define FF_PACKET_SIDE_DATA_HANDLES(HANDLE)                                  \
+    HANDLE(PALETTE,                     "palette")                           \
+    HANDLE(NEW_EXTRADATA,               "new_extradata")                     \
+    HANDLE(PARAM_CHANGE,                "param_change")                      \
+    HANDLE(H263_MB_INFO,                "h263_mb_info")                      \
+    HANDLE(REPLAYGAIN,                  "replaygain")                        \
+    HANDLE(DISPLAYMATRIX,               "displaymatrix")                     \
+    HANDLE(STEREO3D,                    "stereo3d")                          \
+    HANDLE(AUDIO_SERVICE_TYPE,          "audio_service_type")                \
+    HANDLE(QUALITY_STATS,               "quality_stats")                     \
+    HANDLE(FALLBACK_TRACK,              "fallback_track")                    \
+    HANDLE(CPB_PROPERTIES,              "cpb_properties")                    \
+    HANDLE(SKIP_SAMPLES,                "skip_samples")                      \
+    HANDLE(JP_DUALMONO,                 "jp_dualmono")                       \
+    HANDLE(STRINGS_METADATA,            "strings_metadata")                  \
+    HANDLE(SUBTITLE_POSITION,           "subtitle_position")                 \
+    HANDLE(MATROSKA_BLOCKADDITIONAL,    "matroska_blockadditional")          \
+    HANDLE(WEBVTT_IDENTIFIER,           "webvtt_identifier")                 \
+    HANDLE(WEBVTT_SETTINGS,             "webvtt_settings")                   \
+    HANDLE(METADATA_UPDATE,             "metadata_update")                   \
+    HANDLE(MPEGTS_STREAM_ID,            "mpegts_stream_id")                  \
+    HANDLE(MASTERING_DISPLAY_METADATA,  "mastering_display_metadata")        \
+    HANDLE(CONTENT_LIGHT_LEVEL,         "content_light_level")               \
+    HANDLE(SPHERICAL,                   "spherical")                         \
+    HANDLE(A53_CC,                      "a53_cc")                            \
+    HANDLE(ENCRYPTION_INIT_INFO,        "encryption_init_info")              \
+    HANDLE(ENCRYPTION_INFO,             "encryption_info")                   \
+    HANDLE(AFD,                         "afd")                               \
+    HANDLE(PRFT,                        "prft")                              \
+    HANDLE(ICC_PROFILE,                 "icc_profile")                       \
+    HANDLE(DOVI_CONF,                   "dovi_conf")                         \
+    HANDLE(S12M_TIMECODE,               "s12m_timecode")                     \
+    HANDLE(DYNAMIC_HDR10_PLUS,          "hdr10_plus")                        \
+    HANDLE(DYNAMIC_HDR_SMPTE_2094_APP5, "hdr_smpte_2094_app5")               \
+    HANDLE(AMBIENT_VIEWING_ENVIRONMENT, "ambient_viewing_environment")       \
+    HANDLE(IAMF_MIX_GAIN_PARAM,         "iamf_mix_gain_param")               \
+    HANDLE(IAMF_DEMIXING_INFO_PARAM,    "iamf_demixing_info_param")          \
+    HANDLE(IAMF_RECON_GAIN_INFO_PARAM,  "iamf_recon_gain_info_param")        \
+    HANDLE(FRAME_CROPPING,              "frame_cropping")                    \
+    HANDLE(LCEVC,                       "lcevc")                             \
+    HANDLE(3D_REFERENCE_DISPLAYS,       "3d_reference_displays")             \
+    HANDLE(RTCP_SR,                     "rtcp_sr")                           \
+    HANDLE(EXIF,                        "exif")                              \
+    HANDLE(HEVC_CONF,                   "hevc_conf")                         \
+    HANDLE(GAIN_MAP_PARAMS,             "gain_map_params")
+
 #endif // AVCODEC_PACKET_INTERNAL_H