tools/target_dec_fuzzer: Use decoder and not codec_id as argument
authorMichael Niedermayer <michael@niedermayer.cc>
Wed, 3 May 2017 14:36:39 +0000 (16:36 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Wed, 3 May 2017 15:22:13 +0000 (17:22 +0200)
This allows fuzzing decoders with the same codec_id
We also avoid register all to allow the linker to prune unused sections and symbols

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
tools/Makefile
tools/target_dec_fuzzer.c

index c4d9e90..3ebd361 100644 (file)
@@ -2,7 +2,7 @@ TOOLS = qt-faststart trasher uncoded_frame
 TOOLS-$(CONFIG_ZLIB) += cws2fws
 
 tools/target_dec_%_fuzzer.o: tools/target_dec_fuzzer.c
-       $(COMPILE_C) -DFFMPEG_CODEC=AV_CODEC_ID_$*
+       $(COMPILE_C) -DFFMPEG_DECODER=$*
 
 OBJDIRS += tools
 
index 65e79eb..19423e2 100644 (file)
@@ -66,7 +66,7 @@ static AVCodec *c = NULL;
 static AVCodec *AVCodecInitialize(enum AVCodecID codec_id)
 {
     AVCodec *res;
-    avcodec_register_all();
+
     av_log_set_level(AV_LOG_PANIC);
     res = avcodec_find_decoder(codec_id);
     if (!res)
@@ -140,8 +140,20 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
                           int *got_picture_ptr,
                           const AVPacket *avpkt) = NULL;
 
-    if (!c)
+    if (!c) {
+#ifdef FFMPEG_DECODER
+#define DECODER_SYMBOL0(CODEC) ff_##CODEC##_decoder
+#define DECODER_SYMBOL(CODEC) DECODER_SYMBOL0(CODEC)
+        extern AVCodec DECODER_SYMBOL(FFMPEG_DECODER);
+        avcodec_register(&DECODER_SYMBOL(FFMPEG_DECODER));
+        int codec_id = DECODER_SYMBOL(FFMPEG_DECODER).id;
+
+        c = AVCodecInitialize(codec_id);  // Done once.
+#else
+        avcodec_register_all();
         c = AVCodecInitialize(FFMPEG_CODEC);  // Done once.
+#endif
+    }
 
     switch (c->type) {
     case AVMEDIA_TYPE_AUDIO   : decode_handler = avcodec_decode_audio4; break;