Index: media/filters/vpx_video_decoder_fuzzertest.cc |
diff --git a/media/filters/vpx_video_decoder_fuzzertest.cc b/media/filters/vpx_video_decoder_fuzzertest.cc |
index f22040bcb8b55c84c7b6a83cd39102e9190d5e5d..1007a74626b2829fc101ea470eda5a3aae560391 100644 |
--- a/media/filters/vpx_video_decoder_fuzzertest.cc |
+++ b/media/filters/vpx_video_decoder_fuzzertest.cc |
@@ -44,10 +44,36 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
} |
// Compute randomized constants. Put all rng() usages here. |
- auto codec = static_cast<VideoCodec>(rng() % kVideoCodecMax); |
+ // Use only values that pass DCHECK in VpxVideoDecoder::ConfigureDecoder(). |
+ VideoCodec codec; |
+ VideoPixelFormat pixel_format; |
+ if (rng() & 1) { |
+ codec = kCodecVP8; |
+ if (rng() & 1) { |
+ // PIXEL_FORMAT_YV12 disabled if !defined(DISABLE_FFMPEG_VIDEO_DECODERS). |
jrummell
2016/09/09 17:33:00
I wouldn't worry about this case. DISABLE_FFMPEG_V
mmoroz
2016/09/15 17:56:02
Hmmm, it quickly crashes on Linux if I use PIXEL_F
|
+ pixel_format = PIXEL_FORMAT_YV12A; |
+ } else { |
+ pixel_format = PIXEL_FORMAT_YV12A; |
jrummell
2016/09/09 17:33:00
This is the same format. Did you mean YV12 for one
mmoroz
2016/09/15 17:56:01
I left it here to discuss the point we've discusse
|
+ } |
+ } else { |
+ codec = kCodecVP9; |
+ switch (rng() % 3) { |
+ case 0: |
+ pixel_format = PIXEL_FORMAT_YV12; |
jrummell
2016/09/09 17:33:00
Since this is a common format, I would make this c
mmoroz
2016/09/15 17:56:02
It doesn't work with kCodecVP8, crashes pretty qui
|
+ break; |
+ case 1: |
+ pixel_format = PIXEL_FORMAT_YV12A; |
+ break; |
+ case 2: |
+ pixel_format = PIXEL_FORMAT_YV24; |
+ break; |
+ default: |
+ return 0; |
+ } |
+ } |
+ |
auto profile = |
static_cast<VideoCodecProfile>(rng() % VIDEO_CODEC_PROFILE_MAX); |
- auto pixel_format = static_cast<VideoPixelFormat>(rng() % PIXEL_FORMAT_MAX); |
auto color_space = static_cast<ColorSpace>(rng() % COLOR_SPACE_MAX); |
auto coded_size = gfx::Size(rng() % 128, rng() % 128); |
jrummell
2016/09/09 17:33:00
width and height must be > 0, so use (rng() % 127)
mmoroz
2016/09/15 17:56:01
Done.
|
auto visible_rect = gfx::Rect(rng() % 128, rng() % 128); |
jrummell
2016/09/09 17:33:00
Since visible_rect <= coded_size, I would just mak
mmoroz
2016/09/15 17:56:01
Done.
|
@@ -57,6 +83,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
coded_size, visible_rect, natural_size, |
EmptyExtraData(), Unencrypted()); |
+ if (!config.IsValidConfig()) |
+ return 0; |
+ |
VpxVideoDecoder decoder; |
base::RunLoop run_loop; |
@@ -66,7 +95,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
auto buffer = DecoderBuffer::CopyFrom(data, size); |
decoder.Decode(buffer, base::Bind(&OnDecodeComplete)); |
jrummell
2016/09/09 17:33:00
Decode() has a DCHECK to make sure Initialize pass
mmoroz
2016/09/15 17:56:02
Actually, the restrictions implemented above provi
|
- run_loop.RunUntilIdle(); |
+ // Otherwise crashes on DCHECK in RunLoop::BeforeRun(). |
+ run_loop.QuitWhenIdle(); |
return 0; |
} |