From a9b5b6a97f4f4c0a9e06ea1485c02e3de58cc0b1 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michael@niedermayer.cc>
Date: Sun, 30 Apr 2017 11:44:51 +0200
Subject: [PATCH] tools: Eliminate codec_type complexity from fuzzer

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 tools/Makefile            | 11 ++---------
 tools/target_dec_fuzzer.c | 19 +++++++++----------
 2 files changed, 11 insertions(+), 19 deletions(-)

diff --git a/tools/Makefile b/tools/Makefile
index 2b9432bcc21..c4d9e90deaf 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -1,15 +1,8 @@
 TOOLS = qt-faststart trasher uncoded_frame
 TOOLS-$(CONFIG_ZLIB) += cws2fws
 
-tools/target_dec_video_%_fuzzer.o: tools/target_dec_fuzzer.c
-	$(COMPILE_C) -DFFMPEG_CODEC=AV_CODEC_ID_$* -DFUZZ_FFMPEG_VIDEO
-
-tools/target_dec_audio_%_fuzzer.o: tools/target_dec_fuzzer.c
-	$(COMPILE_C) -DFFMPEG_CODEC=AV_CODEC_ID_$* -DFUZZ_FFMPEG_AUDIO
-
-tools/target_dec_subtitle_%_fuzzer.o: tools/target_dec_fuzzer.c
-	$(COMPILE_C) -DFFMPEG_CODEC=AV_CODEC_ID_$* -DFUZZ_FFMPEG_SUBTITLE
-
+tools/target_dec_%_fuzzer.o: tools/target_dec_fuzzer.c
+	$(COMPILE_C) -DFFMPEG_CODEC=AV_CODEC_ID_$*
 
 OBJDIRS += tools
 
diff --git a/tools/target_dec_fuzzer.c b/tools/target_dec_fuzzer.c
index e6a942cb30b..ce58fe5eaf5 100644
--- a/tools/target_dec_fuzzer.c
+++ b/tools/target_dec_fuzzer.c
@@ -74,11 +74,6 @@ static AVCodec *AVCodecInitialize(enum AVCodecID codec_id)
     return res;
 }
 
-#if defined(FUZZ_FFMPEG_VIDEO)
-#define decode_handler avcodec_decode_video2
-#elif defined(FUZZ_FFMPEG_AUDIO)
-#define decode_handler avcodec_decode_audio4
-#elif defined(FUZZ_FFMPEG_SUBTITLE)
 static int subtitle_handler(AVCodecContext *avctx, void *frame,
                             int *got_sub_ptr, AVPacket *avpkt)
 {
@@ -89,11 +84,6 @@ static int subtitle_handler(AVCodecContext *avctx, void *frame,
     return ret;
 }
 
-#define decode_handler subtitle_handler
-#else
-#error "Specify encoder type"  // To catch mistakes
-#endif
-
 // Class to handle buffer allocation and resize for each frame
 typedef struct FuzzDataBuffer {
     size_t size_;
@@ -146,10 +136,19 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
     const uint8_t *last = data;
     const uint8_t *end = data + size;
     uint32_t it = 0;
+    int (*decode_handler)(AVCodecContext *avctx, AVFrame *picture,
+                          int *got_picture_ptr,
+                          const AVPacket *avpkt) = NULL;
 
     if (!c)
         c = AVCodecInitialize(FFMPEG_CODEC);  // Done once.
 
+    switch (c->type) {
+    case AVMEDIA_TYPE_AUDIO   : decode_handler = avcodec_decode_audio4; break;
+    case AVMEDIA_TYPE_VIDEO   : decode_handler = avcodec_decode_video2; break;
+    case AVMEDIA_TYPE_SUBTITLE: decode_handler = subtitle_handler     ; break;
+    }
+
     AVCodecContext* ctx = avcodec_alloc_context3(NULL);
     if (!ctx)
         error("Failed memory allocation");
-- 
GitLab