ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinha...@outlook.com> | 
Mon Mar 10 17:00:36 2025 +0100| [c8be309719dff6d291872f5b4b36db6241402901] | 
committer: Andreas Rheinhardt

avcodec/codec_internal: Add inlined version of av_codec_is_(de|en)coder

These functions check whether the AVCodec* is NULL, but this
has already been checked at a lot of places in our codebase,
so that it boils down to checking the is_decoder flag.

Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c8be309719dff6d291872f5b4b36db6241402901
---

 libavcodec/allcodecs.c      |  8 ++++----
 libavcodec/avcodec.c        | 16 ++++++++--------
 libavcodec/codec_internal.h | 30 +++++++++++++++++++++++++-----
 libavcodec/decode.c         |  2 +-
 libavcodec/options.c        |  2 +-
 libavcodec/pthread_slice.c  |  2 +-
 6 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 3be33f5cc4..34a94ae93d 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -1013,12 +1013,12 @@ static const AVCodec *find_codec(enum AVCodecID id, int 
(*x)(const AVCodec *))
 
 const AVCodec *avcodec_find_encoder(enum AVCodecID id)
 {
-    return find_codec(id, av_codec_is_encoder);
+    return find_codec(id, ff_codec_is_encoder);
 }
 
 const AVCodec *avcodec_find_decoder(enum AVCodecID id)
 {
-    return find_codec(id, av_codec_is_decoder);
+    return find_codec(id, ff_codec_is_decoder);
 }
 
 static const AVCodec *find_codec_by_name(const char *name, int (*x)(const 
AVCodec *))
@@ -1041,10 +1041,10 @@ static const AVCodec *find_codec_by_name(const char 
*name, int (*x)(const AVCode
 
 const AVCodec *avcodec_find_encoder_by_name(const char *name)
 {
-    return find_codec_by_name(name, av_codec_is_encoder);
+    return find_codec_by_name(name, ff_codec_is_encoder);
 }
 
 const AVCodec *avcodec_find_decoder_by_name(const char *name)
 {
-    return find_codec_by_name(name, av_codec_is_decoder);
+    return find_codec_by_name(name, ff_codec_is_decoder);
 }
diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 64c1788c57..8263f7904e 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -190,7 +190,7 @@ int attribute_align_arg avcodec_open2(AVCodecContext 
*avctx, const AVCodec *code
         return AVERROR(EINVAL);
     }
 
-    avci = av_codec_is_decoder(codec) ?
+    avci = ff_codec_is_decoder(codec) ?
         ff_decode_internal_alloc()    :
         ff_encode_internal_alloc();
     if (!avci) {
@@ -270,7 +270,7 @@ int attribute_align_arg avcodec_open2(AVCodecContext 
*avctx, const AVCodec *code
     if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && 
!avctx->ch_layout.nb_channels
         && !(codec->capabilities & AV_CODEC_CAP_CHANNEL_CONF)) {
         av_log(avctx, AV_LOG_ERROR, "%s requires channel layout to be set\n",
-               av_codec_is_decoder(codec) ? "Decoder" : "Encoder");
+               ff_codec_is_decoder(codec) ? "Decoder" : "Encoder");
         ret = AVERROR(EINVAL);
         goto free_and_end;
     }
@@ -290,13 +290,13 @@ int attribute_align_arg avcodec_open2(AVCodecContext 
*avctx, const AVCodec *code
 
     if ((avctx->codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL) &&
         avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
-        const char *codec_string = av_codec_is_encoder(codec) ? "encoder" : 
"decoder";
+        const char *codec_string = ff_codec_is_encoder(codec) ? "encoder" : 
"decoder";
         const AVCodec *codec2;
         av_log(avctx, AV_LOG_ERROR,
                "The %s '%s' is experimental but experimental codecs are not 
enabled, "
                "add '-strict %d' if you want to use it.\n",
                codec_string, codec->name, FF_COMPLIANCE_EXPERIMENTAL);
-        codec2 = av_codec_is_encoder(codec) ? avcodec_find_encoder(codec->id) 
: avcodec_find_decoder(codec->id);
+        codec2 = ff_codec_is_encoder(codec) ? avcodec_find_encoder(codec->id) 
: avcodec_find_decoder(codec->id);
         if (!(codec2->capabilities & AV_CODEC_CAP_EXPERIMENTAL))
             av_log(avctx, AV_LOG_ERROR, "Alternatively use the non 
experimental %s '%s'.\n",
                 codec_string, codec2->name);
@@ -310,7 +310,7 @@ int attribute_align_arg avcodec_open2(AVCodecContext 
*avctx, const AVCodec *code
         avctx->time_base.den = avctx->sample_rate;
     }
 
-    if (av_codec_is_encoder(avctx->codec))
+    if (ff_codec_is_encoder(avctx->codec))
         ret = ff_encode_preinit(avctx);
     else
         ret = ff_decode_preinit(avctx);
@@ -345,7 +345,7 @@ int attribute_align_arg avcodec_open2(AVCodecContext 
*avctx, const AVCodec *code
 
     ret=0;
 
-    if (av_codec_is_decoder(avctx->codec)) {
+    if (ff_codec_is_decoder(avctx->codec)) {
         if (!avctx->bit_rate)
             avctx->bit_rate = get_bit_rate(avctx);
 
@@ -718,10 +718,10 @@ int attribute_align_arg 
avcodec_receive_frame(AVCodecContext *avctx, AVFrame *fr
 {
     av_frame_unref(frame);
 
-    if (!avcodec_is_open(avctx))
+    if (!avcodec_is_open(avctx) || !avctx->codec)
         return AVERROR(EINVAL);
 
-    if (av_codec_is_decoder(avctx->codec))
+    if (ff_codec_is_decoder(avctx->codec))
         return ff_decode_receive_frame(avctx, frame);
     return ff_encode_receive_frame(avctx, frame);
 }
diff --git a/libavcodec/codec_internal.h b/libavcodec/codec_internal.h
index 2b9c7354a0..7fa3097aa9 100644
--- a/libavcodec/codec_internal.h
+++ b/libavcodec/codec_internal.h
@@ -281,6 +281,31 @@ typedef struct FFCodec {
                                 int *out_num_configs);
 } FFCodec;
 
+static av_always_inline const FFCodec *ffcodec(const AVCodec *codec)
+{
+    return (const FFCodec*)codec;
+}
+
+/**
+ * Internal version of av_codec_is_encoder(). Must not be called with
+ * a NULL AVCodec*.
+ */
+static inline int ff_codec_is_encoder(const AVCodec *avcodec)
+{
+    const FFCodec *const codec = ffcodec(avcodec);
+    return !codec->is_decoder;
+}
+
+/**
+ * Internal version of av_codec_is_decoder(). Must not be called with
+ * a NULL AVCodec*.
+ */
+static inline int ff_codec_is_decoder(const AVCodec *avcodec)
+{
+    const FFCodec *const codec = ffcodec(avcodec);
+    return codec->is_decoder;
+}
+
 /**
  * Default implementation for avcodec_get_supported_config(). Will return the
  * relevant fields from AVCodec if present, or NULL otherwise.
@@ -366,9 +391,4 @@ int ff_default_get_supported_config(const struct 
AVCodecContext *avctx,
     .p.field = (array)            \
     ENABLE_DEPRECATION_WARNINGS
 
-static av_always_inline const FFCodec *ffcodec(const AVCodec *codec)
-{
-    return (const FFCodec*)codec;
-}
-
 #endif /* AVCODEC_CODEC_INTERNAL_H */
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 3a1c35a55f..2a0d8152a6 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1706,7 +1706,7 @@ int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, 
int flags)
     int override_dimensions = 1;
     int ret;
 
-    av_assert0(av_codec_is_decoder(avctx->codec));
+    av_assert0(ff_codec_is_decoder(avctx->codec));
 
     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
         if ((unsigned)avctx->width > INT_MAX - STRIDE_ALIGN ||
diff --git a/libavcodec/options.c b/libavcodec/options.c
index f60c41bdc3..834beb5757 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -69,7 +69,7 @@ static const AVClass *codec_child_class_iterate(void **iter)
 static AVClassCategory get_category(void *ptr)
 {
     AVCodecContext* avctx = ptr;
-    if (avctx->codec && av_codec_is_decoder(avctx->codec))
+    if (avctx->codec && ff_codec_is_decoder(avctx->codec))
         return AV_CLASS_CATEGORY_DECODER;
     else
         return AV_CLASS_CATEGORY_ENCODER;
diff --git a/libavcodec/pthread_slice.c b/libavcodec/pthread_slice.c
index 83d5c1b16a..8fd3fdafd3 100644
--- a/libavcodec/pthread_slice.c
+++ b/libavcodec/pthread_slice.c
@@ -116,7 +116,7 @@ av_cold int ff_slice_thread_init(AVCodecContext *avctx)
     void (*mainfunc)(void *);
 
     // We cannot do this in the encoder init as the threads are created before
-    if (av_codec_is_encoder(avctx->codec) &&
+    if (ff_codec_is_encoder(avctx->codec) &&
         avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO &&
         avctx->height > 2800)
         thread_count = avctx->thread_count = 1;

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to