1 /*
2 * Copyright 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "FuzzerMediaUtility.h"
18
19 #include <media/stagefright/AACWriter.h>
20 #include <media/stagefright/AMRWriter.h>
21 #include <media/stagefright/MPEG2TSWriter.h>
22 #include <media/stagefright/MPEG4Writer.h>
23 #include <media/stagefright/OggWriter.h>
24 #include <webm/WebmWriter.h>
25
26 namespace android {
27
createWriter(int fd,StandardWriters writerType,sp<MetaData> writerMeta,FuzzedDataProvider * fdp)28 sp<MediaWriter> createWriter(int fd, StandardWriters writerType, sp<MetaData> writerMeta,
29 FuzzedDataProvider* fdp) {
30 sp<MediaWriter> writer;
31
32 if (fdp->ConsumeBool()) {
33 writerMeta->setInt32(kKeyRealTimeRecording, fdp->ConsumeBool());
34 }
35
36 switch (writerType) {
37 case AAC:
38 writer = sp<AACWriter>::make(fd);
39
40 if (fdp->ConsumeBool()) {
41 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_AAC_ADIF);
42 }
43 break;
44 case AAC_ADTS:
45 writer = sp<AACWriter>::make(fd);
46
47 if (fdp->ConsumeBool()) {
48 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_AAC_ADTS);
49 }
50 break;
51 case AMR_NB:
52 writer = sp<AMRWriter>::make(fd);
53
54 if (fdp->ConsumeBool()) {
55 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_AMR_NB);
56 }
57 break;
58 case AMR_WB:
59 writer = sp<AMRWriter>::make(fd);
60
61 if (fdp->ConsumeBool()) {
62 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_AMR_WB);
63 }
64 break;
65 case MPEG2TS:
66 writer = sp<MPEG2TSWriter>::make(fd);
67
68 if (fdp->ConsumeBool()) {
69 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_MPEG2TS);
70 }
71 break;
72 case MPEG4:
73 writer = sp<MPEG4Writer>::make(fd);
74
75 if (fdp->ConsumeBool()) {
76 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_MPEG_4);
77 } else if (fdp->ConsumeBool()) {
78 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_HEIF);
79 } else if (fdp->ConsumeBool()) {
80 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_THREE_GPP);
81 }
82
83 if (fdp->ConsumeBool()) {
84 writerMeta->setInt32(kKey2ByteNalLength, fdp->ConsumeBool());
85 }
86
87 if (fdp->ConsumeBool()) {
88 writerMeta->setInt32(kKeyTimeScale,
89 fdp->ConsumeIntegralInRange<int32_t>(600, 96000));
90 }
91
92 if (fdp->ConsumeBool()) {
93 writerMeta->setInt32(kKey4BitTrackIds, fdp->ConsumeBool());
94 }
95
96 if (fdp->ConsumeBool()) {
97 writerMeta->setInt64(kKeyTrackTimeStatus, fdp->ConsumeIntegral<int64_t>());
98 }
99
100 if (fdp->ConsumeBool()) {
101 writerMeta->setInt32(kKeyRotation, fdp->ConsumeIntegralInRange<uint8_t>(0, 3) * 90);
102 }
103
104 if (fdp->ConsumeBool()) {
105 writerMeta->setInt64(kKeyTime, fdp->ConsumeIntegral<int64_t>());
106 }
107 break;
108 case OGG:
109 writer = sp<OggWriter>::make(fd);
110
111 if (fdp->ConsumeBool()) {
112 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_OGG);
113 }
114 break;
115 case WEBM:
116 writer = sp<WebmWriter>::make(fd);
117
118 if (fdp->ConsumeBool()) {
119 writerMeta->setInt32(kKeyFileType, output_format::OUTPUT_FORMAT_WEBM);
120 }
121
122 if (fdp->ConsumeBool()) {
123 writerMeta->setInt32(kKeyTimeScale,
124 fdp->ConsumeIntegralInRange<int32_t>(600, 96000));
125 }
126 break;
127 }
128
129 return writer;
130 }
131
createSource(StandardWriters writerType,FuzzedDataProvider * fdp)132 sp<FuzzSource> createSource(StandardWriters writerType, FuzzedDataProvider* fdp) {
133 sp<MetaData> meta = sp<MetaData>::make();
134
135 switch (writerType) {
136 case AAC:
137 case AAC_ADTS:
138 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
139 meta->setInt32(kKeyChannelCount, fdp->ConsumeIntegralInRange<uint8_t>(1, 7));
140 meta->setInt32(kKeySampleRate, fdp->PickValueInArray<uint32_t>(kSampleRateTable));
141
142 if (fdp->ConsumeBool()) {
143 meta->setInt32(kKeyAACProfile, fdp->ConsumeIntegral<int32_t>());
144 }
145 break;
146 case AMR_NB:
147 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_NB);
148 meta->setInt32(kKeyChannelCount, 1);
149 meta->setInt32(kKeySampleRate, 8000);
150 break;
151 case AMR_WB:
152 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AMR_WB);
153 meta->setInt32(kKeyChannelCount, 1);
154 meta->setInt32(kKeySampleRate, 16000);
155 break;
156 case MPEG2TS:
157 if (fdp->ConsumeBool()) {
158 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
159 meta->setInt32(kKeyChannelCount, fdp->ConsumeIntegral<int32_t>());
160 meta->setInt32(kKeySampleRate, fdp->PickValueInArray<uint32_t>(kSampleRateTable));
161 } else {
162 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
163 // The +1s ensure a minimum height and width of 1.
164 meta->setInt32(kKeyWidth, fdp->ConsumeIntegral<uint16_t>() + 1);
165 meta->setInt32(kKeyHeight, fdp->ConsumeIntegral<uint16_t>() + 1);
166 }
167 break;
168 case MPEG4: {
169 auto mime = fdp->PickValueInArray<std::string>(kMpeg4MimeTypes);
170 meta->setCString(kKeyMIMEType, mime.c_str());
171
172 if (fdp->ConsumeBool()) {
173 meta->setInt32(kKeyBackgroundMode, fdp->ConsumeBool());
174 }
175
176 if (!strncasecmp(mime.c_str(), "audio/", 6)) {
177 meta->setInt32(kKeyChannelCount, fdp->ConsumeIntegral<int32_t>());
178 meta->setInt32(kKeySampleRate, fdp->PickValueInArray<uint32_t>(kSampleRateTable));
179
180 } else {
181 // The +1s ensure a minimum height and width of 1.
182 meta->setInt32(kKeyWidth, fdp->ConsumeIntegral<uint16_t>() + 1);
183 meta->setInt32(kKeyHeight, fdp->ConsumeIntegral<uint16_t>() + 1);
184
185 if (fdp->ConsumeBool()) {
186 meta->setInt32(kKeyDisplayWidth, fdp->ConsumeIntegral<uint16_t>());
187 }
188
189 if (fdp->ConsumeBool()) {
190 meta->setInt32(kKeyDisplayHeight, fdp->ConsumeIntegral<uint16_t>());
191 }
192
193 if (fdp->ConsumeBool()) {
194 meta->setInt32(kKeyTileWidth, fdp->ConsumeIntegral<uint16_t>());
195 }
196
197 if (fdp->ConsumeBool()) {
198 meta->setInt32(kKeyTileHeight, fdp->ConsumeIntegral<uint16_t>());
199 }
200 if (fdp->ConsumeBool()) {
201 meta->setInt32(kKeyGridRows, fdp->ConsumeIntegral<uint8_t>());
202 }
203
204 if (fdp->ConsumeBool()) {
205 meta->setInt32(kKeyGridCols, fdp->ConsumeIntegral<uint8_t>());
206 }
207
208 if (fdp->ConsumeBool()) {
209 meta->setInt32(kKeyTemporalLayerCount, fdp->ConsumeIntegral<int32_t>());
210 }
211
212 if (fdp->ConsumeBool()) {
213 meta->setInt32(kKeySARWidth, fdp->ConsumeIntegral<uint16_t>());
214 }
215
216 if (fdp->ConsumeBool()) {
217 meta->setInt32(kKeySARHeight, fdp->ConsumeIntegral<uint16_t>());
218 }
219 }
220
221 if (fdp->ConsumeBool()) {
222 meta->setInt32(kKeyBitRate, fdp->ConsumeIntegral<int32_t>());
223 }
224
225 if (fdp->ConsumeBool()) {
226 meta->setInt32(kKeyMaxBitRate, fdp->ConsumeIntegral<int32_t>());
227 }
228
229 if (fdp->ConsumeBool()) {
230 meta->setInt32(kKeyTrackIsDefault, fdp->ConsumeBool());
231 }
232 break;
233 }
234 case OGG:
235 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_OPUS);
236
237 if (fdp->ConsumeBool()) {
238 meta->setInt32(kKeyChannelCount, fdp->ConsumeIntegral<int32_t>());
239 }
240
241 if (fdp->ConsumeBool()) {
242 meta->setInt32(kKeySampleRate, fdp->PickValueInArray<uint32_t>(kSampleRateTable));
243 }
244 break;
245 case WEBM:
246 if (fdp->ConsumeBool()) {
247 if (fdp->ConsumeBool()) {
248 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VP8);
249 } else {
250 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_VP9);
251 }
252
253 if (fdp->ConsumeBool()) {
254 // The +1s ensure a minimum height and width of 1.
255 meta->setInt32(kKeyWidth, fdp->ConsumeIntegral<uint16_t>() + 1);
256 meta->setInt32(kKeyHeight, fdp->ConsumeIntegral<uint16_t>() + 1);
257 }
258 } else {
259 if (fdp->ConsumeBool()) {
260 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS);
261 } else {
262 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_OPUS);
263 }
264
265 if (fdp->ConsumeBool()) {
266 meta->setInt32(kKeyChannelCount, fdp->ConsumeIntegral<int32_t>());
267 }
268 meta->setInt32(kKeySampleRate, fdp->PickValueInArray<uint32_t>(kSampleRateTable));
269 }
270
271 break;
272 }
273
274 return sp<FuzzSource>::make(meta, fdp);
275 }
276 } // namespace android
277