OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <random> | 8 #include <random> |
9 | 9 |
10 #include "base/at_exit.h" | 10 #include "base/at_exit.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | 48 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
49 std::mt19937_64 rng; | 49 std::mt19937_64 rng; |
50 | 50 |
51 { // Seed rng from data. | 51 { // Seed rng from data. |
52 std::string str = std::string(reinterpret_cast<const char*>(data), size); | 52 std::string str = std::string(reinterpret_cast<const char*>(data), size); |
53 std::size_t data_hash = std::hash<std::string>()(str); | 53 std::size_t data_hash = std::hash<std::string>()(str); |
54 rng.seed(data_hash); | 54 rng.seed(data_hash); |
55 } | 55 } |
56 | 56 |
57 // Compute randomized constants. Put all rng() usages here. | 57 // Compute randomized constants. Put all rng() usages here. |
58 auto codec = static_cast<VideoCodec>(rng() % kVideoCodecMax); | 58 // Use only values that pass DCHECK in VpxVideoDecoder::ConfigureDecoder(). |
| 59 VideoCodec codec; |
| 60 VideoPixelFormat pixel_format; |
| 61 if (rng() & 1) { |
| 62 codec = kCodecVP8; |
| 63 // PIXEL_FORMAT_YV12 disabled for kCodecVP8 on Linux. |
| 64 pixel_format = PIXEL_FORMAT_YV12A; |
| 65 } else { |
| 66 codec = kCodecVP9; |
| 67 switch (rng() % 3) { |
| 68 case 0: |
| 69 pixel_format = PIXEL_FORMAT_YV12; |
| 70 break; |
| 71 case 1: |
| 72 pixel_format = PIXEL_FORMAT_YV12A; |
| 73 break; |
| 74 case 2: |
| 75 pixel_format = PIXEL_FORMAT_YV24; |
| 76 break; |
| 77 default: |
| 78 return 0; |
| 79 } |
| 80 } |
| 81 |
59 auto profile = | 82 auto profile = |
60 static_cast<VideoCodecProfile>(rng() % VIDEO_CODEC_PROFILE_MAX); | 83 static_cast<VideoCodecProfile>(rng() % VIDEO_CODEC_PROFILE_MAX); |
61 auto pixel_format = static_cast<VideoPixelFormat>(rng() % PIXEL_FORMAT_MAX); | |
62 auto color_space = static_cast<ColorSpace>(rng() % COLOR_SPACE_MAX); | 84 auto color_space = static_cast<ColorSpace>(rng() % COLOR_SPACE_MAX); |
63 auto coded_size = gfx::Size(rng() % 128, rng() % 128); | 85 auto coded_size = gfx::Size(1 + (rng() % 127), 1 + (rng() % 127)); |
64 auto visible_rect = gfx::Rect(rng() % 128, rng() % 128); | 86 auto visible_rect = gfx::Rect(coded_size); |
65 auto natural_size = gfx::Size(rng() % 128, rng() % 128); | 87 auto natural_size = gfx::Size(1 + (rng() % 127), 1 + (rng() % 127)); |
66 | 88 |
67 VideoDecoderConfig config(codec, profile, pixel_format, color_space, | 89 VideoDecoderConfig config(codec, profile, pixel_format, color_space, |
68 coded_size, visible_rect, natural_size, | 90 coded_size, visible_rect, natural_size, |
69 EmptyExtraData(), Unencrypted()); | 91 EmptyExtraData(), Unencrypted()); |
70 | 92 |
| 93 if (!config.IsValidConfig()) |
| 94 return 0; |
| 95 |
71 VpxVideoDecoder decoder; | 96 VpxVideoDecoder decoder; |
72 | 97 |
73 { | 98 { |
74 base::RunLoop run_loop; | 99 base::RunLoop run_loop; |
75 bool success = false; | 100 bool success = false; |
76 decoder.Initialize( | 101 decoder.Initialize( |
77 config, true /* low_delay */, nullptr /* cdm_context */, | 102 config, true /* low_delay */, nullptr /* cdm_context */, |
78 base::Bind(&OnInitDone, run_loop.QuitClosure(), &success), | 103 base::Bind(&OnInitDone, run_loop.QuitClosure(), &success), |
79 base::Bind(&OnOutputComplete)); | 104 base::Bind(&OnOutputComplete)); |
80 run_loop.Run(); | 105 run_loop.Run(); |
81 if (!success) | 106 if (!success) |
82 return 0; | 107 return 0; |
83 } | 108 } |
84 | 109 |
85 { | 110 { |
86 base::RunLoop run_loop; | 111 base::RunLoop run_loop; |
87 auto buffer = DecoderBuffer::CopyFrom(data, size); | 112 auto buffer = DecoderBuffer::CopyFrom(data, size); |
88 decoder.Decode(buffer, | 113 decoder.Decode(buffer, |
89 base::Bind(&OnDecodeComplete, run_loop.QuitClosure())); | 114 base::Bind(&OnDecodeComplete, run_loop.QuitClosure())); |
90 run_loop.Run(); | 115 run_loop.Run(); |
91 } | 116 } |
92 | 117 |
93 return 0; | 118 return 0; |
94 } | 119 } |
OLD | NEW |