[FFmpeg-devel] [PATCH] avcodec/avcodec: remove usage of __typeof__()

Martin Storsjö martin at martin.st
Sun Sep 8 22:43:37 EEST 2024


On Sun, 8 Sep 2024, James Almer wrote:

> It's non-standard C.
>
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
> libavcodec/avcodec.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
> index cb89236549..78153d12f1 100644
> --- a/libavcodec/avcodec.c
> +++ b/libavcodec/avcodec.c
> @@ -708,9 +708,9 @@ int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *fr
>     return ff_encode_receive_frame(avctx, frame);
> }
>
> -#define WRAP_CONFIG(allowed_type, field, terminator)                        \
> +#define WRAP_CONFIG(allowed_type, field, field_type, terminator)            \
>     do {                                                                    \
> -        static const __typeof__(*(field)) end = terminator;                 \
> +        static const field_type end = terminator;                           \
>         if (codec->type != (allowed_type))                                  \
>             return AVERROR(EINVAL);                                         \
>         *out_configs = (field);                                             \
> @@ -753,15 +753,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, AV_PIX_FMT_NONE);
> +        WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec->pix_fmts, enum AVPixelFormat, 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, codec->supported_framerates, AVRational, (AVRational){0});
>     case AV_CODEC_CONFIG_SAMPLE_RATE:
> -        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->supported_samplerates, 0);
> +        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->supported_samplerates, int, 0);
>     case AV_CODEC_CONFIG_SAMPLE_FORMAT:
> -        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->sample_fmts, AV_SAMPLE_FMT_NONE);
> +        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->sample_fmts, enum AVSampleFormat, 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, codec->ch_layouts, AVChannelLayout, (AVChannelLayout){0});
> FF_ENABLE_DEPRECATION_WARNINGS
>
>     case AV_CODEC_CONFIG_COLOR_RANGE:
> -- 
> 2.46.0

Actually, this isn't quite enough to fix compilation with all compilers:

src/libavcodec/avcodec.c: In function 'ff_default_get_supported_config':
src/libavcodec/avcodec.c:758:9: error: initializer element is not constant
          WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec->supported_framerates, 
AVRational, (AVRational){0});
          ^
src/libavcodec/avcodec.c:764:9: error: initializer element is not constant
          WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->ch_layouts, 
AVChannelLayout, (AVChannelLayout){0});
          ^

Since we're not using typeof here, we can drop the casts here and just use 
plain {0}:

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 78153d12f1..8d1a280323 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -755,13 +755,13 @@ FF_DISABLE_DEPRECATION_WARNINGS
      case AV_CODEC_CONFIG_PIX_FORMAT:
          WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec->pix_fmts, enum AVPixelFormat, AV_PIX_FMT_NONE);
      case AV_CODEC_CONFIG_FRAME_RATE:
-        WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec->supported_framerates, AVRational, (AVRational){0});
+        WRAP_CONFIG(AVMEDIA_TYPE_VIDEO, codec->supported_framerates, AVRational, {0});
      case AV_CODEC_CONFIG_SAMPLE_RATE:
          WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->supported_samplerates, int, 0);
      case AV_CODEC_CONFIG_SAMPLE_FORMAT:
          WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->sample_fmts, enum AVSampleFormat, AV_SAMPLE_FMT_NONE);
      case AV_CODEC_CONFIG_CHANNEL_LAYOUT:
-        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->ch_layouts, AVChannelLayout, (AVChannelLayout){0});
+        WRAP_CONFIG(AVMEDIA_TYPE_AUDIO, codec->ch_layouts, AVChannelLayout, {0});
  FF_ENABLE_DEPRECATION_WARNINGS

// Martin



More information about the ffmpeg-devel mailing list