xref: /aosp_15_r20/frameworks/av/media/libstagefright/tests/fuzzers/FuzzerMediaUtility.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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