Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-09-24 04:52:56 +0300
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2021-09-26 14:29:15 +0300
commit497c490a4e1689242e7385f04e2bef7408d3a5e2 (patch)
tree092b8d11fa57004c0c1c0777f02c6db7f4b72eb8 /libavcodec/tests
parentd77798309fa9527cce3e5811e9cdd85214335846 (diff)
avcodec/tests/avcodec: Check consistency of function pointers
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Diffstat (limited to 'libavcodec/tests')
-rw-r--r--libavcodec/tests/avcodec.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/libavcodec/tests/avcodec.c b/libavcodec/tests/avcodec.c
index 24372cfa1f..df7e7129a5 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 video-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");