diff mbox series

[FFmpeg-devel,04/11] avcodec/tests/avcodec: Check consistency of function pointers

Message ID PR3PR03MB66652EFF0CB78AABF8FA07008FA49@PR3PR03MB6665.eurprd03.prod.outlook.com
State Accepted
Headers show
Series [FFmpeg-devel,01/11] avcodec/tests/utils: Rename to avcodec
Related show

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_ppc success Make finished
andriy/make_fate_ppc success Make fate finished

Commit Message

Andreas Rheinhardt Sept. 24, 2021, 4:37 p.m. UTC
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/tests/avcodec.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/libavcodec/tests/avcodec.c b/libavcodec/tests/avcodec.c
index 64940cfdb1..3eb4372019 100644
--- a/libavcodec/tests/avcodec.c
+++ b/libavcodec/tests/avcodec.c
@@ -41,6 +41,7 @@  int main(void){
 
     while (codec = av_codec_iterate(&iter)) {
         const AVCodecDescriptor *desc;
+        int is_decoder, is_encoder;
 
         if (!codec->name) {
             AV_LOG("Codec for format %s has no name\n",
@@ -63,13 +64,33 @@  int main(void){
                 ERR("Non-video codec %s has audio-only fields set\n");
         }
 
-        if (av_codec_is_encoder(codec)) {
+        is_decoder = av_codec_is_decoder(codec);
+        is_encoder = av_codec_is_encoder(codec);
+        if (!!is_decoder + !!is_encoder != 1) {
+            ERR("Codec %s is decoder and encoder or neither.\n");
+            continue;
+        }
+        if (is_encoder) {
+            if (codec->type == AVMEDIA_TYPE_SUBTITLE ^ !!codec->encode_sub)
+                ERR("Encoder %s is both subtitle encoder and not subtitle encoder.");
+            if (!!codec->encode_sub + !!codec->encode2 + !!codec->receive_packet != 1)
+                ERR("Encoder %s does not implement exactly one encode API.\n");
+            if (codec->update_thread_context || codec->update_thread_context_for_user || codec->bsfs)
+                ERR("Encoder %s has decoder-only thread functions or bsf.\n");
             if (codec->type == AVMEDIA_TYPE_AUDIO) {
                 if (!codec->sample_fmts) {
                     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_SUBTITLE && !codec->decode)
+                ERR("Subtitle decoder %s does not implement decode callback\n");
+            if (codec->type == AVMEDIA_TYPE_SUBTITLE && codec->bsfs)
+                ERR("Automatic bitstream filtering unsupported for subtitles; "
+                    "yet decoder %s has it set\n");
+            if (!!codec->decode + !!codec->receive_frame != 1)
+                ERR("Decoder %s does not implement exactly one decode API.\n");
         }
         if (!(desc = avcodec_descriptor_get(codec->id))) {
             ERR("Codec %s lacks a corresponding descriptor\n");