The branch, master has been updated
       via  dd092f7fd966c62598c05555667144ca91642340 (commit)
       via  946a1dbd94f5e896f3dce57addcf95d1d15b9c4a (commit)
       via  e9be8b831d0439fbde7f7a7a017ab6dea79988e4 (commit)
       via  2523235a3161c4ed7c33c54cf6d458710d1e6923 (commit)
       via  ef3e337079e4da4bc3c73f59fab61a631f87e12b (commit)
       via  ab70751c8aad9e3fb7a29b0b5871ec3e57664979 (commit)
       via  df1b6f9cfd7b33f85b3536c79d271b7f7ac3d5b6 (commit)
       via  1d68ae7389fd2b2f59b1eb795de12151875abd45 (commit)
      from  a2210902ffd18e22cf8824c390bbcd87833d0211 (commit)


- Log -----------------------------------------------------------------
commit dd092f7fd966c62598c05555667144ca91642340
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Nov 3 11:02:46 2025 +0100
Commit:     James Almer <[email protected]>
CommitDate: Fri Nov 7 17:55:43 2025 +0000

    avcodec/avcodec: Simplify sentinel checks
    
    There is no need to check the whole AVChannelLayout; checking
    its nb_channels is enough.
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 9df6f7efd4..14aca0f164 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -716,18 +716,22 @@ int attribute_align_arg 
avcodec_receive_frame(AVCodecContext *avctx, AVFrame *fr
     return ff_encode_receive_frame(avctx, frame);
 }
 
-#define WRAP_CONFIG(allowed_type, field, field_type, terminator)            \
+#define WRAP_CONFIG(allowed_type, field, var, field_type, sentinel_check)   \
     do {                                                                    \
-        static const field_type end = terminator;                           \
         if (codec->type != (allowed_type))                                  \
             return AVERROR(EINVAL);                                         \
-        *out_configs = (field);                                             \
+        const field_type *ptr = codec->field;                               \
+        *out_configs = ptr;                                                 \
+        if (ptr) {                                                          \
             for (int i = 0;; i++) {                                         \
-                if (!(field) || !memcmp(&(field)[i], &end, sizeof(end))) {  \
+                const field_type var = ptr[i];                              \
+                if (sentinel_check) {                                       \
                     *out_num_configs = i;                                   \
                     break;                                                  \
                 }                                                           \
             }                                                               \
+        } else                                                              \
+            *out_num_configs = 0;                                           \
         return 0;                                                           \
     } while (0)
 
@@ -764,15 +768,15 @@ int ff_default_get_supported_config(const AVCodecContext 
*avctx,
     switch (config) {
 FF_DISABLE_DEPRECATION_WARNINGS
     case AV_CODEC_CONFIG_PIX_FORMAT:
-        WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec->pix_fmts, enum AVPixelFormat, 
AV_PIX_FMT_NONE);
+        WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, pix_fmts, pix_fmt, enum AVPixelFormat, 
pix_fmt == AV_PIX_FMT_NONE);
     case AV_CODEC_CONFIG_FRAME_RATE:
-        WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec->supported_framerates, 
AVRational, {0});
+        WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, supported_framerates, framerate, 
AVRational, framerate.num == 0);
     case AV_CODEC_CONFIG_SAMPLE_RATE:
-        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->supported_samplerates, int, 0);
+        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, supported_samplerates, samplerate, 
int, samplerate == 0);
     case AV_CODEC_CONFIG_SAMPLE_FORMAT:
-        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->sample_fmts, enum 
AVSampleFormat, AV_SAMPLE_FMT_NONE);
+        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, sample_fmts, sample_fmt, enum 
AVSampleFormat, sample_fmt == AV_SAMPLE_FMT_NONE);
     case AV_CODEC_CONFIG_CHANNEL_LAYOUT:
-        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->ch_layouts, AVChannelLayout, 
{0});
+        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, ch_layouts, ch_layout, 
AVChannelLayout, ch_layout.nb_channels == 0);
 FF_ENABLE_DEPRECATION_WARNINGS
 
     case AV_CODEC_CONFIG_COLOR_RANGE:

commit 946a1dbd94f5e896f3dce57addcf95d1d15b9c4a
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Nov 3 10:32:20 2025 +0100
Commit:     James Almer <[email protected]>
CommitDate: Fri Nov 7 17:55:43 2025 +0000

    avcodec/tests/avcodec: Check codec {pix,sample}_fmt etc. arrays
    
    E.g. check that the ordinary entries are valid (e.g. no negative sample
    rates, must have pix fmt descriptor) and also that the sentinels
    are valid where they contain redundant information.
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>

diff --git a/libavcodec/tests/avcodec.c b/libavcodec/tests/avcodec.c
index b45bd9d08c..893175c285 100644
--- a/libavcodec/tests/avcodec.c
+++ b/libavcodec/tests/avcodec.c
@@ -17,6 +17,7 @@
  */
 
 #include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
 #include "libavcodec/codec.h"
 #include "libavcodec/codec_desc.h"
 #include "libavcodec/codec_internal.h"
@@ -55,6 +56,30 @@ static int priv_data_size_wrong(const FFCodec *codec)
     return 0;
 }
 
+#define ARRAY_CHECK(field, var, type, is_sentinel, check, sentinel_check) \
+do {                                                                      \
+    const type *ptr = codec->field;                                       \
+    if (!ptr)                                                             \
+        break;                                                            \
+    type var = *ptr;                                                      \
+    if (is_sentinel) {                                                    \
+        ERR("Codec %s sets " #field ", but without valid elements.\n");   \
+        break;                                                            \
+    }                                                                     \
+    do {                                                                  \
+        if (!(check)) {                                                   \
+            ERR("Codec's %s " #field " array contains invalid element\n");\
+            break;                                                        \
+        }                                                                 \
+        ++ptr;                                                            \
+        var = *ptr;                                                       \
+    } while (!(is_sentinel));                                             \
+    if (!(sentinel_check)) {                                              \
+        ERR("Codec's %s " #field " array has malformed sentinel\n");      \
+        break;                                                            \
+    }                                                                     \
+} while (0)
+
 int main(void){
     void *iter = NULL;
     const AVCodec *codec = NULL;
@@ -86,6 +111,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
                                        AV_CODEC_CAP_CHANNEL_CONF     |
                                        AV_CODEC_CAP_VARIABLE_FRAME_SIZE))
                 ERR("Non-audio codec %s has audio-only capabilities set\n");
+        } else {
+FF_DISABLE_DEPRECATION_WARNINGS
+            ARRAY_CHECK(supported_samplerates, sample_rate, int, sample_rate 
== 0,
+                        sample_rate > 0, 1);
+            ARRAY_CHECK(sample_fmts, sample_fmt, enum AVSampleFormat, 
sample_fmt == AV_SAMPLE_FMT_NONE,
+                        (unsigned)sample_fmt < AV_SAMPLE_FMT_NB, 1);
+            static const AVChannelLayout zero_channel_layout = { 0 };
+            ARRAY_CHECK(ch_layouts, ch_layout, AVChannelLayout, 
ch_layout.nb_channels == 0,
+                        av_channel_layout_check(&ch_layout), !memcmp(ptr, 
&zero_channel_layout, sizeof(ch_layout)));
+FF_ENABLE_DEPRECATION_WARNINGS
         }
         if (codec->type != AVMEDIA_TYPE_VIDEO) {
 FF_DISABLE_DEPRECATION_WARNINGS
@@ -146,6 +181,11 @@ FF_DISABLE_DEPRECATION_WARNINGS
                     av_log(NULL, AV_LOG_FATAL, "Encoder %s is missing the 
sample_fmts field\n", codec->name);
                     ret = 1;
                 }
+            } else if (codec->type == AVMEDIA_TYPE_VIDEO) {
+                ARRAY_CHECK(pix_fmts, pix_fmt, enum AVPixelFormat, pix_fmt == 
AV_PIX_FMT_NONE,
+                            av_pix_fmt_desc_get(pix_fmt), 1);
+                ARRAY_CHECK(supported_framerates, framerate, AVRational, 
framerate.num == 0,
+                            framerate.num > 0 && framerate.den > 0, 
framerate.den == 0);
 FF_ENABLE_DEPRECATION_WARNINGS
             }
             if (codec2->caps_internal & (FF_CODEC_CAP_USES_PROGRESSFRAMES |

commit e9be8b831d0439fbde7f7a7a017ab6dea79988e4
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Nov 3 09:10:22 2025 +0100
Commit:     James Almer <[email protected]>
CommitDate: Fri Nov 7 17:55:43 2025 +0000

    avcodec/tests/avcodec: Test that decoders don't set encoder-only fields
    
    For decoders, the pixel format is negotiated via the get_format callback
    (if there is a choice at all), so decoders should not set pix_fmts.
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>

diff --git a/libavcodec/tests/avcodec.c b/libavcodec/tests/avcodec.c
index d1a28c1935..b45bd9d08c 100644
--- a/libavcodec/tests/avcodec.c
+++ b/libavcodec/tests/avcodec.c
@@ -185,6 +185,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
                 codec2->caps_internal & FF_CODEC_CAP_SETS_PKT_DTS)
                 ERR("Decoder %s is marked as setting pkt_dts when it doesn't 
have"
                     "any effect\n");
+FF_DISABLE_DEPRECATION_WARNINGS
+            if (codec->type == AVMEDIA_TYPE_VIDEO && (codec->pix_fmts || 
codec->supported_framerates))
+                ERR("Decoder %s sets pix_fmts or supported_framerates.\n");
+FF_ENABLE_DEPRECATION_WARNINGS
         }
         if (priv_data_size_wrong(codec2))
             ERR_EXT("Private context of codec %s is impossibly-sized (size 
%d).",

commit 2523235a3161c4ed7c33c54cf6d458710d1e6923
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Nov 3 10:47:06 2025 +0100
Commit:     James Almer <[email protected]>
CommitDate: Fri Nov 7 17:55:43 2025 +0000

    avcodec/amfdec: Don't set AVCodec.pix_fmts
    
    It is not supposed to be set by decoders (where format negotiation
    happens via the get_format callback).
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>

diff --git a/libavcodec/amfdec.c b/libavcodec/amfdec.c
index 7b038c6181..1a2eb9392c 100644
--- a/libavcodec/amfdec.c
+++ b/libavcodec/amfdec.c
@@ -44,14 +44,6 @@
 //will be in public headers soon
 #define AMF_VIDEO_DECODER_OUTPUT_FORMAT                L"OutputDecodeFormat"
 
-const enum AVPixelFormat amf_dec_pix_fmts[] = {
-    AV_PIX_FMT_NV12,
-    AV_PIX_FMT_P010,
-    AV_PIX_FMT_P012,
-    AV_PIX_FMT_AMF_SURFACE,
-    AV_PIX_FMT_NONE
-};
-
 static const AVCodecHWConfigInternal *const amf_hw_configs[] = {
     &(const AVCodecHWConfigInternal) {
         .public = {
@@ -716,7 +708,6 @@ const FFCodec ff_##x##_amf_decoder = { \
     .bsfs           = bsf_name, \
     .p.capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | 
AV_CODEC_CAP_AVOID_PROBING, \
     .p.priv_class   = &amf_decode_class, \
-    CODEC_PIXFMTS_ARRAY(amf_dec_pix_fmts), \
     .hw_configs     = amf_hw_configs, \
     .p.wrapper_name = "amf", \
     .caps_internal  = FF_CODEC_CAP_NOT_INIT_THREADSAFE, \

commit ef3e337079e4da4bc3c73f59fab61a631f87e12b
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Nov 3 08:51:09 2025 +0100
Commit:     James Almer <[email protected]>
CommitDate: Fri Nov 7 17:55:43 2025 +0000

    avcodec/tests/avcodec: Test color_ranges and alpha_modes
    
    Test that they are only set by video codecs.
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>

diff --git a/libavcodec/tests/avcodec.c b/libavcodec/tests/avcodec.c
index dde8226384..d1a28c1935 100644
--- a/libavcodec/tests/avcodec.c
+++ b/libavcodec/tests/avcodec.c
@@ -89,7 +89,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
         }
         if (codec->type != AVMEDIA_TYPE_VIDEO) {
 FF_DISABLE_DEPRECATION_WARNINGS
-            if (codec->pix_fmts || codec->supported_framerates)
+            if (codec->pix_fmts || codec->supported_framerates ||
+                codec2->color_ranges || codec2->alpha_modes)
                 ERR("Non-video codec %s has video-only fields set\n");
 FF_ENABLE_DEPRECATION_WARNINGS
             if (codec2->caps_internal & FF_CODEC_CAP_EXPORTS_CROPPING)

commit ab70751c8aad9e3fb7a29b0b5871ec3e57664979
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Nov 3 08:22:59 2025 +0100
Commit:     James Almer <[email protected]>
CommitDate: Fri Nov 7 17:55:43 2025 +0000

    avcodec/codec_internal: Use bitfield for alpha_modes
    
    Right now, FFCodec contains a dedicated pointer for
    alpha_mode; this is wasteful, as there is only a very limited
    range of options for this value, namely four.
    So store it as a two-bit bitfield like color_ranges.
    This reduces sizeof(FFCodec) by 16 here (the placement
    of alpha_mode entailed unnecessary padding) and
    saves 11328B of .data.rel.ro here (on a standard build with
    no external libraries).
    
    (If it were not for effective-type violations, one could
    share the code and the table with AV_CODEC_CONFIG_COLOR_RANGE.)
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 00f5447b52..9df6f7efd4 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -23,6 +23,8 @@
  * AVCodecContext functions for libavcodec
  */
 
+#include <assert.h>
+
 #include "config.h"
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
@@ -30,7 +32,6 @@
 #include "libavutil/channel_layout.h"
 #include "libavutil/common.h"
 #include "libavutil/emms.h"
-#include "libavutil/fifo.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/mem.h"
 #include "libavutil/opt.h"
@@ -41,12 +42,10 @@
 #include "codec_desc.h"
 #include "codec_internal.h"
 #include "decode.h"
-#include "encode.h"
 #include "frame_thread_encoder.h"
 #include "hwconfig.h"
 #include "internal.h"
 #include "libavutil/refstruct.h"
-#include "thread.h"
 
 /**
  * Maximum size in bytes of extradata.
@@ -737,7 +736,17 @@ static const enum AVColorRange color_range_tab[] = {
     AVCOL_RANGE_MPEG, AVCOL_RANGE_UNSPECIFIED,
 };
 
-static const uint8_t color_range_offsets[] = {
+static const enum AVAlphaMode alpha_mode_tab[] = {
+    AVALPHA_MODE_PREMULTIPLIED, AVALPHA_MODE_STRAIGHT, 
AVALPHA_MODE_UNSPECIFIED,
+    AVALPHA_MODE_PREMULTIPLIED, AVALPHA_MODE_UNSPECIFIED
+};
+
+static_assert((int)AVCOL_RANGE_MPEG == (int)AVALPHA_MODE_PREMULTIPLIED, 
"unexpected enum values");
+static_assert((int)AVCOL_RANGE_JPEG == (int)AVALPHA_MODE_STRAIGHT, "unexpected 
enum values");
+static_assert(AVCOL_RANGE_UNSPECIFIED == 0 && AVALPHA_MODE_UNSPECIFIED == 0, 
"unexpected enum values");
+static_assert(AVCOL_RANGE_NB == 3 && AVALPHA_MODE_NB == 3, "unexpected enum 
values");
+
+static const uint8_t offset_tab[] = {
     [AVCOL_RANGE_MPEG] = 3,
     [AVCOL_RANGE_JPEG] = 1,
     [AVCOL_RANGE_MPEG | AVCOL_RANGE_JPEG] = 0,
@@ -771,7 +780,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
             return AVERROR(EINVAL);
         unsigned color_ranges = codec2->color_ranges;
         if (color_ranges)
-            *out_configs = color_range_tab + color_range_offsets[color_ranges];
+            *out_configs = color_range_tab + offset_tab[color_ranges];
         else
             *out_configs = NULL;
         *out_num_configs = av_popcount(color_ranges);
@@ -783,7 +792,15 @@ FF_ENABLE_DEPRECATION_WARNINGS
         return 0;
 
     case AV_CODEC_CONFIG_ALPHA_MODE:
-        WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec2->alpha_modes, enum AVAlphaMode, 
AVALPHA_MODE_UNSPECIFIED);
+        if (codec->type != AVMEDIA_TYPE_VIDEO)
+            return AVERROR(EINVAL);
+        unsigned alpha_modes = codec2->alpha_modes;
+        if (alpha_modes)
+            *out_configs = alpha_mode_tab + offset_tab[alpha_modes];
+        else
+            *out_configs = NULL;
+        *out_num_configs = av_popcount(alpha_modes);
+        return 0;
 
     default:
         return AVERROR(EINVAL);
diff --git a/libavcodec/codec_internal.h b/libavcodec/codec_internal.h
index 0d13a50fed..eea982e56c 100644
--- a/libavcodec/codec_internal.h
+++ b/libavcodec/codec_internal.h
@@ -133,7 +133,7 @@ typedef struct FFCodec {
     /**
      * Internal codec capabilities FF_CODEC_CAP_*.
      */
-    unsigned caps_internal:26;
+    unsigned caps_internal:24;
 
     /**
      * Is this a decoder?
@@ -146,6 +146,12 @@ typedef struct FFCodec {
      */
     unsigned color_ranges:2;
 
+    /**
+     * This field determines the alpha modes supported by an encoder.
+     * Should be set to a bitmask of AVALPHA_MODE_PREMULTIPLIED and 
AVALPHA_MODE_STRAIGHT.
+     */
+    unsigned alpha_modes:2;
+
     /**
      * This field determines the type of the codec (decoder/encoder)
      * and also the exact callback cb implemented by the codec.
@@ -153,11 +159,6 @@ typedef struct FFCodec {
      */
     unsigned cb_type:3;
 
-    /**
-     * This field determines the alpha modes supported by an encoder.
-     */
-    const enum AVAlphaMode *alpha_modes;
-
     int priv_data_size;
     /**
      * @name Frame-level threading support functions
diff --git a/libavcodec/exrenc.c b/libavcodec/exrenc.c
index 54f63d9eb6..68eb683aa5 100644
--- a/libavcodec/exrenc.c
+++ b/libavcodec/exrenc.c
@@ -553,7 +553,5 @@ const FFCodec ff_exr_encoder = {
     FF_CODEC_ENCODE_CB(encode_frame),
     .close          = encode_close,
     CODEC_PIXFMTS(AV_PIX_FMT_GRAYF32, AV_PIX_FMT_GBRPF32, AV_PIX_FMT_GBRAPF32),
-    .alpha_modes    = (const enum AVAlphaMode[]) {
-        AVALPHA_MODE_PREMULTIPLIED, AVALPHA_MODE_UNSPECIFIED
-    },
+    .alpha_modes    = AVALPHA_MODE_PREMULTIPLIED,
 };
diff --git a/libavcodec/libjxlenc.c b/libavcodec/libjxlenc.c
index da538518a5..a2fec89560 100644
--- a/libavcodec/libjxlenc.c
+++ b/libavcodec/libjxlenc.c
@@ -793,9 +793,7 @@ const FFCodec ff_libjxl_encoder = {
                         FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP |
                         FF_CODEC_CAP_ICC_PROFILES,
     CODEC_PIXFMTS_ARRAY(libjxl_supported_pixfmts),
-    .alpha_modes    = (const enum AVAlphaMode[]) {
-        AVALPHA_MODE_STRAIGHT, AVALPHA_MODE_PREMULTIPLIED, 
AVALPHA_MODE_UNSPECIFIED
-    },
+    .alpha_modes      = AVALPHA_MODE_STRAIGHT | AVALPHA_MODE_PREMULTIPLIED,
     .p.priv_class     = &libjxl_encode_class,
     .p.wrapper_name   = "libjxl",
 };
@@ -816,9 +814,7 @@ const FFCodec ff_libjxl_anim_encoder = {
                         FF_CODEC_CAP_AUTO_THREADS | FF_CODEC_CAP_INIT_CLEANUP |
                         FF_CODEC_CAP_ICC_PROFILES,
     CODEC_PIXFMTS_ARRAY(libjxl_supported_pixfmts),
-    .alpha_modes    = (const enum AVAlphaMode[]) {
-        AVALPHA_MODE_STRAIGHT, AVALPHA_MODE_PREMULTIPLIED, 
AVALPHA_MODE_UNSPECIFIED
-    },
+    .alpha_modes      = AVALPHA_MODE_STRAIGHT | AVALPHA_MODE_PREMULTIPLIED,
     .p.priv_class     = &libjxl_encode_class,
     .p.wrapper_name   = "libjxl",
 };
diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c
index 96894bf7fd..e627bf83fc 100644
--- a/libavcodec/pngenc.c
+++ b/libavcodec/pngenc.c
@@ -1299,9 +1299,7 @@ const FFCodec ff_png_encoder = {
                   AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY8A,
                   AV_PIX_FMT_GRAY16BE, AV_PIX_FMT_YA16BE,
                   AV_PIX_FMT_MONOBLACK),
-    .alpha_modes    = (const enum AVAlphaMode[]) {
-        AVALPHA_MODE_STRAIGHT, AVALPHA_MODE_UNSPECIFIED
-    },
+    .alpha_modes    = AVALPHA_MODE_STRAIGHT,
     .p.priv_class   = &pngenc_class,
     .caps_internal  = FF_CODEC_CAP_ICC_PROFILES,
 };
@@ -1322,9 +1320,7 @@ const FFCodec ff_apng_encoder = {
                   AV_PIX_FMT_PAL8,
                   AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY8A,
                   AV_PIX_FMT_GRAY16BE, AV_PIX_FMT_YA16BE),
-    .alpha_modes    = (const enum AVAlphaMode[]) {
-        AVALPHA_MODE_STRAIGHT, AVALPHA_MODE_UNSPECIFIED
-    },
+    .alpha_modes    = AVALPHA_MODE_STRAIGHT,
     .p.priv_class   = &pngenc_class,
     .caps_internal  = FF_CODEC_CAP_ICC_PROFILES,
 };

commit df1b6f9cfd7b33f85b3536c79d271b7f7ac3d5b6
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Nov 3 07:41:40 2025 +0100
Commit:     James Almer <[email protected]>
CommitDate: Fri Nov 7 17:55:43 2025 +0000

    avcodec/avcodec: Avoid relocations for color ranges
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 78453e2467..00f5447b52 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -732,22 +732,15 @@ int attribute_align_arg 
avcodec_receive_frame(AVCodecContext *avctx, AVFrame *fr
         return 0;                                                           \
     } while (0)
 
-static const enum AVColorRange color_range_jpeg[] = {
-    AVCOL_RANGE_JPEG, AVCOL_RANGE_UNSPECIFIED
+static const enum AVColorRange color_range_tab[] = {
+    AVCOL_RANGE_MPEG, AVCOL_RANGE_JPEG, AVCOL_RANGE_UNSPECIFIED,
+    AVCOL_RANGE_MPEG, AVCOL_RANGE_UNSPECIFIED,
 };
 
-static const enum AVColorRange color_range_mpeg[] = {
-    AVCOL_RANGE_MPEG, AVCOL_RANGE_UNSPECIFIED
-};
-
-static const enum AVColorRange color_range_all[] = {
-    AVCOL_RANGE_MPEG, AVCOL_RANGE_JPEG, AVCOL_RANGE_UNSPECIFIED
-};
-
-static const enum AVColorRange *color_range_table[] = {
-    [AVCOL_RANGE_MPEG] = color_range_mpeg,
-    [AVCOL_RANGE_JPEG] = color_range_jpeg,
-    [AVCOL_RANGE_MPEG | AVCOL_RANGE_JPEG] = color_range_all,
+static const uint8_t color_range_offsets[] = {
+    [AVCOL_RANGE_MPEG] = 3,
+    [AVCOL_RANGE_JPEG] = 1,
+    [AVCOL_RANGE_MPEG | AVCOL_RANGE_JPEG] = 0,
 };
 
 int ff_default_get_supported_config(const AVCodecContext *avctx,
@@ -776,8 +769,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
     case AV_CODEC_CONFIG_COLOR_RANGE:
         if (codec->type != AVMEDIA_TYPE_VIDEO)
             return AVERROR(EINVAL);
-        *out_configs = color_range_table[ffcodec(codec)->color_ranges];
-        *out_num_configs = av_popcount(ffcodec(codec)->color_ranges);
+        unsigned color_ranges = codec2->color_ranges;
+        if (color_ranges)
+            *out_configs = color_range_tab + color_range_offsets[color_ranges];
+        else
+            *out_configs = NULL;
+        *out_num_configs = av_popcount(color_ranges);
         return 0;
 
     case AV_CODEC_CONFIG_COLOR_SPACE:

commit 1d68ae7389fd2b2f59b1eb795de12151875abd45
Author:     Andreas Rheinhardt <[email protected]>
AuthorDate: Mon Nov 3 00:17:18 2025 +0100
Commit:     James Almer <[email protected]>
CommitDate: Fri Nov 7 17:55:43 2025 +0000

    avcodec/avcodec: Remove always-true branches
    
    avcodec_get_supported_config() always sets a dummy for
    the pointer to the number of entries in case it is not set.
    
    Signed-off-by: Andreas Rheinhardt <[email protected]>

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index db24b4ed52..78453e2467 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -723,14 +723,12 @@ int attribute_align_arg 
avcodec_receive_frame(AVCodecContext *avctx, AVFrame *fr
         if (codec->type != (allowed_type))                                  \
             return AVERROR(EINVAL);                                         \
         *out_configs = (field);                                             \
-        if (out_num_configs) {                                              \
             for (int i = 0;; i++) {                                         \
                 if (!(field) || !memcmp(&(field)[i], &end, sizeof(end))) {  \
                     *out_num_configs = i;                                   \
                     break;                                                  \
                 }                                                           \
             }                                                               \
-        }                                                                   \
         return 0;                                                           \
     } while (0)
 
@@ -779,14 +777,12 @@ FF_ENABLE_DEPRECATION_WARNINGS
         if (codec->type != AVMEDIA_TYPE_VIDEO)
             return AVERROR(EINVAL);
         *out_configs = color_range_table[ffcodec(codec)->color_ranges];
-        if (out_num_configs)
-            *out_num_configs = av_popcount(ffcodec(codec)->color_ranges);
+        *out_num_configs = av_popcount(ffcodec(codec)->color_ranges);
         return 0;
 
     case AV_CODEC_CONFIG_COLOR_SPACE:
         *out_configs = NULL;
-        if (out_num_configs)
-            *out_num_configs = 0;
+        *out_num_configs = 0;
         return 0;
 
     case AV_CODEC_CONFIG_ALPHA_MODE:

-----------------------------------------------------------------------

Summary of changes:
 libavcodec/amfdec.c         |  9 ------
 libavcodec/avcodec.c        | 76 +++++++++++++++++++++++++++------------------
 libavcodec/codec_internal.h | 13 ++++----
 libavcodec/exrenc.c         |  4 +--
 libavcodec/libjxlenc.c      |  8 ++---
 libavcodec/pngenc.c         |  8 ++---
 libavcodec/tests/avcodec.c  | 47 +++++++++++++++++++++++++++-
 7 files changed, 103 insertions(+), 62 deletions(-)


hooks/post-receive
-- 

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to