xref: /aosp_15_r20/frameworks/av/media/ndk/fuzzer/NdkMediaCodecFuzzerBase.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker #include <NdkMediaCodecFuzzerBase.h>
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker static const std::string kMimeTypes[] = {
19*ec779b8eSAndroid Build Coastguard Worker         MIMETYPE_AUDIO_AMR_NB, MIMETYPE_AUDIO_AMR_WB,    MIMETYPE_AUDIO_MPEG,
20*ec779b8eSAndroid Build Coastguard Worker         MIMETYPE_AUDIO_AAC,    MIMETYPE_AUDIO_FLAC,      MIMETYPE_AUDIO_VORBIS,
21*ec779b8eSAndroid Build Coastguard Worker         MIMETYPE_AUDIO_OPUS,   MIMETYPE_AUDIO_RAW,       MIMETYPE_AUDIO_MSGSM,
22*ec779b8eSAndroid Build Coastguard Worker         MIMETYPE_AUDIO_EAC3,   MIMETYPE_AUDIO_SCRAMBLED, MIMETYPE_VIDEO_VP8,
23*ec779b8eSAndroid Build Coastguard Worker         MIMETYPE_VIDEO_VP9,    MIMETYPE_VIDEO_AV1,       MIMETYPE_VIDEO_AVC,
24*ec779b8eSAndroid Build Coastguard Worker         MIMETYPE_VIDEO_HEVC,   MIMETYPE_VIDEO_MPEG4,     MIMETYPE_VIDEO_H263,
25*ec779b8eSAndroid Build Coastguard Worker         MIMETYPE_VIDEO_MPEG2,  MIMETYPE_VIDEO_RAW,       MIMETYPE_VIDEO_SCRAMBLED};
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker static const std::string kEncoderNames[] = {
28*ec779b8eSAndroid Build Coastguard Worker         "c2.android.avc.encoder",    "c2.android.vp8.encoder",   "c2.android.vp9.encoder",
29*ec779b8eSAndroid Build Coastguard Worker         "c2.android.hevc.encoder",   "c2.android.mpeg2.encoder", "c2.android.mpeg4.encoder",
30*ec779b8eSAndroid Build Coastguard Worker         "c2.android.opus.encoder",   "c2.android.amrnb.encoder", "c2.android.flac.encoder",
31*ec779b8eSAndroid Build Coastguard Worker         "c2.android.av1-aom.encoder"};
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker static const std::string kDecoderNames[] = {"c2.android.avc.decoder",
34*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.vp8.decoder",
35*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.vp9.decoder"
36*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.hevc.decoder",
37*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.mpeg2.decoder",
38*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.mpeg4.decoder",
39*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.opus.decoder",
40*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.amrnb.decoder",
41*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.flac.decoder",
42*ec779b8eSAndroid Build Coastguard Worker                                             "c2.android.av1-aom.decoder"};
43*ec779b8eSAndroid Build Coastguard Worker 
44*ec779b8eSAndroid Build Coastguard Worker static const std::string kFormatIntKeys[] = {AMEDIAFORMAT_KEY_BIT_RATE,
45*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_SAMPLE_RATE,
46*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL,
47*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_CHANNEL_COUNT,
48*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_WIDTH,
49*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_HEIGHT,
50*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_FRAME_RATE,
51*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_COLOR_FORMAT,
52*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_VIDEO_QP_P_MIN,
53*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_VIDEO_QP_P_MAX,
54*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_VIDEO_QP_MIN,
55*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_VIDEO_QP_MAX,
56*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_VIDEO_QP_I_MIN,
57*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_VIDEO_QP_I_MAX,
58*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_VIDEO_QP_B_MIN,
59*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_VIDEO_QP_B_MAX,
60*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_VIDEO_QP_AVERAGE,
61*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_VIDEO_ENCODING_STATISTICS_LEVEL,
62*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_VALID_SAMPLES,
63*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_TRACK_INDEX,
64*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_TRACK_ID,
65*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_TILE_WIDTH,
66*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_TILE_HEIGHT,
67*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH,
68*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT,
69*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID,
70*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_TEMPORAL_LAYER_COUNT,
71*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_STRIDE,
72*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_SLICE_HEIGHT,
73*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_SAR_WIDTH,
74*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_SAR_HEIGHT,
75*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_ROTATION,
76*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_PCM_BIG_ENDIAN,
77*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_PROFILE,
78*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_PRIORITY,
79*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_PICTURE_TYPE,
80*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_PCM_ENCODING,
81*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_OPERATING_RATE,
82*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT,
83*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_MPEGH_PROFILE_LEVEL_INDICATION,
84*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_MAX_PTS_GAP_TO_ENCODER,
85*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_MAX_INPUT_SIZE,
86*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_MAX_FPS_TO_ENCODER,
87*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_LOW_LATENCY,
88*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_LOOP,
89*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_LEVEL,
90*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_LATENCY,
91*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_IS_SYNC_FRAME,
92*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_IS_DEFAULT,
93*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_INTRA_REFRESH_PERIOD,
94*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_HAPTIC_CHANNEL_COUNT,
95*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_GRID_ROWS,
96*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_GRID_COLUMNS,
97*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_FRAME_COUNT,
98*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_ENCODER_PADDING,
99*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_ENCODER_DELAY,
100*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_DISPLAY_WIDTH,
101*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_DISPLAY_HEIGHT,
102*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_DISPLAY_CROP,
103*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_CRYPTO_SKIP_BYTE_BLOCK,
104*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_CRYPTO_MODE,
105*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_BYTE_BLOCK,
106*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE,
107*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_COLOR_TRANSFER,
108*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_COLOR_STANDARD,
109*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_COLOR_RANGE,
110*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_CHANNEL_MASK,
111*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_BITS_PER_SAMPLE,
112*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_BITRATE_MODE,
113*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AUDIO_SESSION_ID,
114*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_PROGRAM_ID,
115*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_PRESENTATION_ID,
116*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AAC_SBR_MODE,
117*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AAC_PROFILE,
118*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT,
119*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AAC_ENCODED_TARGET_LEVEL,
120*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AAC_DRC_TARGET_REFERENCE_LEVEL,
121*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AAC_DRC_HEAVY_COMPRESSION,
122*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AAC_DRC_BOOST_FACTOR,
123*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_AAC_DRC_ATTENUATION_FACTOR,
124*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_XMP_SIZE,
125*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_XMP_OFFSET,
126*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_TIME_US,
127*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_THUMBNAIL_TIME,
128*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_TARGET_TIME,
129*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_SAMPLE_TIME_BEFORE_APPEND,
130*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_SAMPLE_FILE_OFFSET,
131*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_LAST_SAMPLE_INDEX_IN_CHUNK,
132*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_EXIF_SIZE,
133*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_EXIF_OFFSET,
134*ec779b8eSAndroid Build Coastguard Worker                                              AMEDIAFORMAT_KEY_DURATION};
135*ec779b8eSAndroid Build Coastguard Worker 
136*ec779b8eSAndroid Build Coastguard Worker static const std::string kFormatBufferKeys[] = {
137*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_THUMBNAIL_CSD_HEVC,
138*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_THUMBNAIL_CSD_AV1C,
139*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_TEXT_FORMAT_DATA,
140*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_SEI,
141*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_PUSH_BLANK_BUFFERS_ON_STOP,
142*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_PSSH,
143*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_MPEGH_COMPATIBLE_SETS,
144*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_MPEG2_STREAM_HEADER,
145*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_MPEG_USER_DATA,
146*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_ICC_PROFILE,
147*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_HDR10_PLUS_INFO,
148*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_HDR_STATIC_INFO,
149*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_ESDS,
150*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_D263,
151*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CSD_HEVC,
152*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CSD_AVC,
153*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CSD_2,
154*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CSD_1,
155*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CSD_0,
156*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CSD,
157*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES,
158*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CRYPTO_KEY,
159*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CRYPTO_IV,
160*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES,
161*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_CREATE_INPUT_SURFACE_SUSPENDED,
162*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_INFO,
163*ec779b8eSAndroid Build Coastguard Worker         AMEDIAFORMAT_KEY_ALBUMART,
164*ec779b8eSAndroid Build Coastguard Worker };
165*ec779b8eSAndroid Build Coastguard Worker 
166*ec779b8eSAndroid Build Coastguard Worker static const std::string kFormatFloatKeys[] = {AMEDIAFORMAT_KEY_I_FRAME_INTERVAL,
167*ec779b8eSAndroid Build Coastguard Worker                                                AMEDIAFORMAT_KEY_CAPTURE_RATE};
168*ec779b8eSAndroid Build Coastguard Worker 
169*ec779b8eSAndroid Build Coastguard Worker static const std::string kFormatStringKeys[] = {AMEDIAFORMAT_KEY_YEAR,
170*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_TITLE,
171*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_TEMPORAL_LAYERING,
172*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_SLOW_MOTION_MARKERS,
173*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER,
174*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_MANUFACTURER,
175*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_LYRICIST,
176*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_LOCATION,
177*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_LANGUAGE,
178*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE,
179*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_IS_AUTOSELECT,
180*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_IS_ADTS,
181*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_GENRE,
182*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_DISCNUMBER,
183*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_DATE,
184*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_COMPOSER,
185*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_COMPILATION,
186*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_COMPLEXITY,
187*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_CDTRACKNUMBER,
188*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_AUTHOR,
189*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_ARTIST,
190*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_ALBUMARTIST,
191*ec779b8eSAndroid Build Coastguard Worker                                                 AMEDIAFORMAT_KEY_ALBUM};
192*ec779b8eSAndroid Build Coastguard Worker 
formatSetString(AMediaFormat * format,const char * AMEDIAFORMAT_KEY,FuzzedDataProvider * fdp)193*ec779b8eSAndroid Build Coastguard Worker void formatSetString(AMediaFormat* format, const char* AMEDIAFORMAT_KEY, FuzzedDataProvider* fdp) {
194*ec779b8eSAndroid Build Coastguard Worker     if (fdp->ConsumeBool()) {
195*ec779b8eSAndroid Build Coastguard Worker         std::string keyValue = fdp->ConsumeRandomLengthString(kMaxBytes);
196*ec779b8eSAndroid Build Coastguard Worker         AMediaFormat_setString(format, AMEDIAFORMAT_KEY, keyValue.c_str());
197*ec779b8eSAndroid Build Coastguard Worker     }
198*ec779b8eSAndroid Build Coastguard Worker }
199*ec779b8eSAndroid Build Coastguard Worker 
formatSetInt(AMediaFormat * format,const char * AMEDIAFORMAT_KEY,FuzzedDataProvider * fdp)200*ec779b8eSAndroid Build Coastguard Worker void formatSetInt(AMediaFormat* format, const char* AMEDIAFORMAT_KEY, FuzzedDataProvider* fdp) {
201*ec779b8eSAndroid Build Coastguard Worker     if (fdp->ConsumeBool()) {
202*ec779b8eSAndroid Build Coastguard Worker         int32_t keyValue = fdp->ConsumeIntegralInRange<size_t>(kMinIntKeyValue, kMaxIntKeyValue);
203*ec779b8eSAndroid Build Coastguard Worker         AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY, keyValue);
204*ec779b8eSAndroid Build Coastguard Worker     }
205*ec779b8eSAndroid Build Coastguard Worker }
206*ec779b8eSAndroid Build Coastguard Worker 
formatSetFloat(AMediaFormat * format,const char * AMEDIAFORMAT_KEY,FuzzedDataProvider * fdp)207*ec779b8eSAndroid Build Coastguard Worker void formatSetFloat(AMediaFormat* format, const char* AMEDIAFORMAT_KEY, FuzzedDataProvider* fdp) {
208*ec779b8eSAndroid Build Coastguard Worker     if (fdp->ConsumeBool()) {
209*ec779b8eSAndroid Build Coastguard Worker         float keyValue =
210*ec779b8eSAndroid Build Coastguard Worker                 fdp->ConsumeFloatingPointInRange<float>(kMinFloatKeyValue, kMaxFloatKeyValue);
211*ec779b8eSAndroid Build Coastguard Worker         AMediaFormat_setFloat(format, AMEDIAFORMAT_KEY, keyValue);
212*ec779b8eSAndroid Build Coastguard Worker     }
213*ec779b8eSAndroid Build Coastguard Worker }
214*ec779b8eSAndroid Build Coastguard Worker 
formatSetBuffer(AMediaFormat * format,const char * AMEDIAFORMAT_KEY,FuzzedDataProvider * fdp)215*ec779b8eSAndroid Build Coastguard Worker void formatSetBuffer(AMediaFormat* format, const char* AMEDIAFORMAT_KEY, FuzzedDataProvider* fdp) {
216*ec779b8eSAndroid Build Coastguard Worker     if (fdp->ConsumeBool()) {
217*ec779b8eSAndroid Build Coastguard Worker         std::vector<uint8_t> buffer = fdp->ConsumeBytes<uint8_t>(
218*ec779b8eSAndroid Build Coastguard Worker                 fdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
219*ec779b8eSAndroid Build Coastguard Worker         AMediaFormat_setBuffer(format, AMEDIAFORMAT_KEY, buffer.data(), buffer.size());
220*ec779b8eSAndroid Build Coastguard Worker     }
221*ec779b8eSAndroid Build Coastguard Worker }
222*ec779b8eSAndroid Build Coastguard Worker 
createAMediaCodecByname(bool isEncoder,bool isCodecForClient)223*ec779b8eSAndroid Build Coastguard Worker AMediaCodec* NdkMediaCodecFuzzerBase::createAMediaCodecByname(bool isEncoder,
224*ec779b8eSAndroid Build Coastguard Worker                                                               bool isCodecForClient) {
225*ec779b8eSAndroid Build Coastguard Worker     std::string name;
226*ec779b8eSAndroid Build Coastguard Worker     if (isEncoder) {
227*ec779b8eSAndroid Build Coastguard Worker         name = mFdp->ConsumeBool() ? mFdp->PickValueInArray(kEncoderNames)
228*ec779b8eSAndroid Build Coastguard Worker                                    : mFdp->ConsumeRandomLengthString(kMaxBytes);
229*ec779b8eSAndroid Build Coastguard Worker     } else {
230*ec779b8eSAndroid Build Coastguard Worker         name = mFdp->ConsumeBool() ? mFdp->PickValueInArray(kDecoderNames)
231*ec779b8eSAndroid Build Coastguard Worker                                    : mFdp->ConsumeRandomLengthString(kMaxBytes);
232*ec779b8eSAndroid Build Coastguard Worker     }
233*ec779b8eSAndroid Build Coastguard Worker 
234*ec779b8eSAndroid Build Coastguard Worker     if (isCodecForClient) {
235*ec779b8eSAndroid Build Coastguard Worker         pid_t pid = mFdp->ConsumeIntegral<pid_t>();
236*ec779b8eSAndroid Build Coastguard Worker         uid_t uid = mFdp->ConsumeIntegral<uid_t>();
237*ec779b8eSAndroid Build Coastguard Worker         return AMediaCodec_createCodecByNameForClient(name.c_str(), pid, uid);
238*ec779b8eSAndroid Build Coastguard Worker 
239*ec779b8eSAndroid Build Coastguard Worker     } else {
240*ec779b8eSAndroid Build Coastguard Worker         return AMediaCodec_createCodecByName(name.c_str());
241*ec779b8eSAndroid Build Coastguard Worker     }
242*ec779b8eSAndroid Build Coastguard Worker }
243*ec779b8eSAndroid Build Coastguard Worker 
createAMediaCodecByType(bool isEncoder,bool isCodecForClient)244*ec779b8eSAndroid Build Coastguard Worker AMediaCodec* NdkMediaCodecFuzzerBase::createAMediaCodecByType(bool isEncoder,
245*ec779b8eSAndroid Build Coastguard Worker                                                               bool isCodecForClient) {
246*ec779b8eSAndroid Build Coastguard Worker     std::string mimeType;
247*ec779b8eSAndroid Build Coastguard Worker     const char* mime = nullptr;
248*ec779b8eSAndroid Build Coastguard Worker 
249*ec779b8eSAndroid Build Coastguard Worker     if (mFdp->ConsumeBool()) {
250*ec779b8eSAndroid Build Coastguard Worker         mimeType = mFdp->ConsumeRandomLengthString(kMaxBytes);
251*ec779b8eSAndroid Build Coastguard Worker         mime = mimeType.c_str();
252*ec779b8eSAndroid Build Coastguard Worker     } else {
253*ec779b8eSAndroid Build Coastguard Worker         AMediaFormat_getString(mFormat, AMEDIAFORMAT_KEY_MIME, &mime);
254*ec779b8eSAndroid Build Coastguard Worker     }
255*ec779b8eSAndroid Build Coastguard Worker 
256*ec779b8eSAndroid Build Coastguard Worker     if (isCodecForClient) {
257*ec779b8eSAndroid Build Coastguard Worker         pid_t pid = mFdp->ConsumeIntegral<pid_t>();
258*ec779b8eSAndroid Build Coastguard Worker         uid_t uid = mFdp->ConsumeIntegral<uid_t>();
259*ec779b8eSAndroid Build Coastguard Worker         return isEncoder ? AMediaCodec_createEncoderByTypeForClient(mime, pid, uid)
260*ec779b8eSAndroid Build Coastguard Worker                          : AMediaCodec_createDecoderByTypeForClient(mime, pid, uid);
261*ec779b8eSAndroid Build Coastguard Worker     } else {
262*ec779b8eSAndroid Build Coastguard Worker         return isEncoder ? AMediaCodec_createEncoderByType(mime)
263*ec779b8eSAndroid Build Coastguard Worker                          : AMediaCodec_createDecoderByType(mime);
264*ec779b8eSAndroid Build Coastguard Worker     }
265*ec779b8eSAndroid Build Coastguard Worker }
266*ec779b8eSAndroid Build Coastguard Worker 
setCodecFormat()267*ec779b8eSAndroid Build Coastguard Worker void NdkMediaCodecFuzzerBase::setCodecFormat() {
268*ec779b8eSAndroid Build Coastguard Worker     std::string value;
269*ec779b8eSAndroid Build Coastguard Worker     int32_t count = 0;
270*ec779b8eSAndroid Build Coastguard Worker     int32_t maxFormatKeys = 0;
271*ec779b8eSAndroid Build Coastguard Worker     AMediaFormat_clear(mFormat);
272*ec779b8eSAndroid Build Coastguard Worker 
273*ec779b8eSAndroid Build Coastguard Worker     /*set mimeType*/
274*ec779b8eSAndroid Build Coastguard Worker     if (mFdp->ConsumeBool()) {
275*ec779b8eSAndroid Build Coastguard Worker         value = mFdp->ConsumeRandomLengthString(kMaxBytes);
276*ec779b8eSAndroid Build Coastguard Worker     } else {
277*ec779b8eSAndroid Build Coastguard Worker         value = mFdp->PickValueInArray(kMimeTypes);
278*ec779b8eSAndroid Build Coastguard Worker     }
279*ec779b8eSAndroid Build Coastguard Worker     if (mFdp->ConsumeBool()) {
280*ec779b8eSAndroid Build Coastguard Worker         AMediaFormat_setString(mFormat, AMEDIAFORMAT_KEY_MIME, value.c_str());
281*ec779b8eSAndroid Build Coastguard Worker     }
282*ec779b8eSAndroid Build Coastguard Worker 
283*ec779b8eSAndroid Build Coastguard Worker     maxFormatKeys = mFdp->ConsumeIntegralInRange<int32_t>(0, std::size(kFormatStringKeys));
284*ec779b8eSAndroid Build Coastguard Worker     for (count = 0; count < maxFormatKeys; ++count) {
285*ec779b8eSAndroid Build Coastguard Worker         std::string formatKey = mFdp->PickValueInArray(kFormatStringKeys);
286*ec779b8eSAndroid Build Coastguard Worker         formatSetString(mFormat, formatKey.c_str(), mFdp);
287*ec779b8eSAndroid Build Coastguard Worker     }
288*ec779b8eSAndroid Build Coastguard Worker 
289*ec779b8eSAndroid Build Coastguard Worker     maxFormatKeys = mFdp->ConsumeIntegralInRange<int32_t>(0, std::size(kFormatIntKeys));
290*ec779b8eSAndroid Build Coastguard Worker     for (count = 0; count < maxFormatKeys; ++count) {
291*ec779b8eSAndroid Build Coastguard Worker         std::string formatKey = mFdp->PickValueInArray(kFormatIntKeys);
292*ec779b8eSAndroid Build Coastguard Worker         formatSetInt(mFormat, formatKey.c_str(), mFdp);
293*ec779b8eSAndroid Build Coastguard Worker     }
294*ec779b8eSAndroid Build Coastguard Worker 
295*ec779b8eSAndroid Build Coastguard Worker     maxFormatKeys = mFdp->ConsumeIntegralInRange<int32_t>(0, std::size(kFormatFloatKeys));
296*ec779b8eSAndroid Build Coastguard Worker     for (count = 0; count < maxFormatKeys; ++count) {
297*ec779b8eSAndroid Build Coastguard Worker         std::string formatKey = mFdp->PickValueInArray(kFormatFloatKeys);
298*ec779b8eSAndroid Build Coastguard Worker         formatSetFloat(mFormat, formatKey.c_str(), mFdp);
299*ec779b8eSAndroid Build Coastguard Worker     }
300*ec779b8eSAndroid Build Coastguard Worker 
301*ec779b8eSAndroid Build Coastguard Worker     maxFormatKeys = mFdp->ConsumeIntegralInRange<int32_t>(0, std::size(kFormatBufferKeys));
302*ec779b8eSAndroid Build Coastguard Worker     for (count = 0; count < maxFormatKeys; ++count) {
303*ec779b8eSAndroid Build Coastguard Worker         std::string formatKey = mFdp->PickValueInArray(kFormatBufferKeys);
304*ec779b8eSAndroid Build Coastguard Worker         formatSetBuffer(mFormat, formatKey.c_str(), mFdp);
305*ec779b8eSAndroid Build Coastguard Worker     }
306*ec779b8eSAndroid Build Coastguard Worker }
307*ec779b8eSAndroid Build Coastguard Worker 
createCodec(bool isEncoder,bool isCodecForClient)308*ec779b8eSAndroid Build Coastguard Worker AMediaCodec* NdkMediaCodecFuzzerBase::createCodec(bool isEncoder, bool isCodecForClient) {
309*ec779b8eSAndroid Build Coastguard Worker     setCodecFormat();
310*ec779b8eSAndroid Build Coastguard Worker     return (mFdp->ConsumeBool() ? createAMediaCodecByname(isEncoder, isCodecForClient)
311*ec779b8eSAndroid Build Coastguard Worker                                 : createAMediaCodecByType(isEncoder, isCodecForClient));
312*ec779b8eSAndroid Build Coastguard Worker }
313*ec779b8eSAndroid Build Coastguard Worker 
invokeCodecFormatAPI(AMediaCodec * codec)314*ec779b8eSAndroid Build Coastguard Worker void NdkMediaCodecFuzzerBase::invokeCodecFormatAPI(AMediaCodec* codec) {
315*ec779b8eSAndroid Build Coastguard Worker     AMediaFormat* codecFormat = nullptr;
316*ec779b8eSAndroid Build Coastguard Worker     size_t codecFormatAPI = mFdp->ConsumeIntegralInRange<size_t>(kMinAPICase, kMaxCodecFormatAPIs);
317*ec779b8eSAndroid Build Coastguard Worker     switch (codecFormatAPI) {
318*ec779b8eSAndroid Build Coastguard Worker         case 0: {
319*ec779b8eSAndroid Build Coastguard Worker             codecFormat = AMediaCodec_getInputFormat(codec);
320*ec779b8eSAndroid Build Coastguard Worker             break;
321*ec779b8eSAndroid Build Coastguard Worker         }
322*ec779b8eSAndroid Build Coastguard Worker         case 1: {
323*ec779b8eSAndroid Build Coastguard Worker             codecFormat = AMediaCodec_getOutputFormat(codec);
324*ec779b8eSAndroid Build Coastguard Worker             break;
325*ec779b8eSAndroid Build Coastguard Worker         }
326*ec779b8eSAndroid Build Coastguard Worker         case 2:
327*ec779b8eSAndroid Build Coastguard Worker         default: {
328*ec779b8eSAndroid Build Coastguard Worker             AMediaCodecBufferInfo info;
329*ec779b8eSAndroid Build Coastguard Worker             int64_t timeOutUs = mFdp->ConsumeIntegralInRange<size_t>(kMinTimeOutUs, kMaxTimeOutUs);
330*ec779b8eSAndroid Build Coastguard Worker             ssize_t bufferIndex = 0;
331*ec779b8eSAndroid Build Coastguard Worker             if (mFdp->ConsumeBool()) {
332*ec779b8eSAndroid Build Coastguard Worker                 bufferIndex = AMediaCodec_dequeueOutputBuffer(codec, &info, timeOutUs);
333*ec779b8eSAndroid Build Coastguard Worker             } else {
334*ec779b8eSAndroid Build Coastguard Worker                 bufferIndex =
335*ec779b8eSAndroid Build Coastguard Worker                         mFdp->ConsumeIntegralInRange<size_t>(kMinBufferIndex, kMaxBufferIndex);
336*ec779b8eSAndroid Build Coastguard Worker             }
337*ec779b8eSAndroid Build Coastguard Worker             codecFormat = AMediaCodec_getBufferFormat(codec, bufferIndex);
338*ec779b8eSAndroid Build Coastguard Worker             break;
339*ec779b8eSAndroid Build Coastguard Worker         }
340*ec779b8eSAndroid Build Coastguard Worker     }
341*ec779b8eSAndroid Build Coastguard Worker     if (codecFormat) {
342*ec779b8eSAndroid Build Coastguard Worker         AMediaFormat_delete(codecFormat);
343*ec779b8eSAndroid Build Coastguard Worker     }
344*ec779b8eSAndroid Build Coastguard Worker }
345*ec779b8eSAndroid Build Coastguard Worker 
invokeInputBufferOperationAPI(AMediaCodec * codec)346*ec779b8eSAndroid Build Coastguard Worker void NdkMediaCodecFuzzerBase::invokeInputBufferOperationAPI(AMediaCodec* codec) {
347*ec779b8eSAndroid Build Coastguard Worker     size_t bufferSize = 0;
348*ec779b8eSAndroid Build Coastguard Worker     ssize_t bufferIndex = 0;
349*ec779b8eSAndroid Build Coastguard Worker     int64_t timeOutUs = mFdp->ConsumeIntegralInRange<size_t>(kMinTimeOutUs, kMaxTimeOutUs);
350*ec779b8eSAndroid Build Coastguard Worker     if (mFdp->ConsumeBool()) {
351*ec779b8eSAndroid Build Coastguard Worker         bufferIndex = AMediaCodec_dequeueInputBuffer(codec, timeOutUs);
352*ec779b8eSAndroid Build Coastguard Worker     } else {
353*ec779b8eSAndroid Build Coastguard Worker         bufferIndex = mFdp->ConsumeIntegralInRange<size_t>(kMinBufferIndex, kMaxBufferIndex);
354*ec779b8eSAndroid Build Coastguard Worker     }
355*ec779b8eSAndroid Build Coastguard Worker 
356*ec779b8eSAndroid Build Coastguard Worker     uint8_t* buffer = AMediaCodec_getInputBuffer(codec, bufferIndex, &bufferSize);
357*ec779b8eSAndroid Build Coastguard Worker     if (buffer) {
358*ec779b8eSAndroid Build Coastguard Worker         std::vector<uint8_t> bytesRead = mFdp->ConsumeBytes<uint8_t>(
359*ec779b8eSAndroid Build Coastguard Worker                 std::min(mFdp->ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes), bufferSize));
360*ec779b8eSAndroid Build Coastguard Worker         memcpy(buffer, bytesRead.data(), bytesRead.size());
361*ec779b8eSAndroid Build Coastguard Worker         bufferSize = bytesRead.size();
362*ec779b8eSAndroid Build Coastguard Worker     }
363*ec779b8eSAndroid Build Coastguard Worker 
364*ec779b8eSAndroid Build Coastguard Worker     int32_t flag = mFdp->ConsumeIntegralInRange<size_t>(AMEDIACODEC_BUFFER_FLAG_CODEC_CONFIG,
365*ec779b8eSAndroid Build Coastguard Worker                                                         AMEDIACODEC_BUFFER_FLAG_PARTIAL_FRAME);
366*ec779b8eSAndroid Build Coastguard Worker     if (mFdp->ConsumeBool()) {
367*ec779b8eSAndroid Build Coastguard Worker         AMediaCodec_queueInputBuffer(codec, bufferIndex, 0 /* offset */, bufferSize, 0 /* time */,
368*ec779b8eSAndroid Build Coastguard Worker                                      flag);
369*ec779b8eSAndroid Build Coastguard Worker     } else {
370*ec779b8eSAndroid Build Coastguard Worker         AMediaCodecCryptoInfo* cryptoInfo = getAMediaCodecCryptoInfo();
371*ec779b8eSAndroid Build Coastguard Worker         AMediaCodec_queueSecureInputBuffer(codec, bufferIndex, 0 /* offset */, cryptoInfo,
372*ec779b8eSAndroid Build Coastguard Worker                                            0 /* time */, flag);
373*ec779b8eSAndroid Build Coastguard Worker         AMediaCodecCryptoInfo_delete(cryptoInfo);
374*ec779b8eSAndroid Build Coastguard Worker     }
375*ec779b8eSAndroid Build Coastguard Worker }
376*ec779b8eSAndroid Build Coastguard Worker 
invokeOutputBufferOperationAPI(AMediaCodec * codec)377*ec779b8eSAndroid Build Coastguard Worker void NdkMediaCodecFuzzerBase::invokeOutputBufferOperationAPI(AMediaCodec* codec) {
378*ec779b8eSAndroid Build Coastguard Worker     ssize_t bufferIndex = 0;
379*ec779b8eSAndroid Build Coastguard Worker     int64_t timeOutUs = mFdp->ConsumeIntegralInRange<size_t>(kMinTimeOutUs, kMaxTimeOutUs);
380*ec779b8eSAndroid Build Coastguard Worker     if (mFdp->ConsumeBool()) {
381*ec779b8eSAndroid Build Coastguard Worker         AMediaCodecBufferInfo info;
382*ec779b8eSAndroid Build Coastguard Worker         bufferIndex = AMediaCodec_dequeueOutputBuffer(codec, &info, timeOutUs);
383*ec779b8eSAndroid Build Coastguard Worker     } else {
384*ec779b8eSAndroid Build Coastguard Worker         bufferIndex = mFdp->ConsumeIntegralInRange<size_t>(kMinBufferIndex, kMaxBufferIndex);
385*ec779b8eSAndroid Build Coastguard Worker     }
386*ec779b8eSAndroid Build Coastguard Worker 
387*ec779b8eSAndroid Build Coastguard Worker     if (mFdp->ConsumeBool()) {
388*ec779b8eSAndroid Build Coastguard Worker         size_t bufferSize = 0;
389*ec779b8eSAndroid Build Coastguard Worker         (void)AMediaCodec_getOutputBuffer(codec, bufferIndex, &bufferSize);
390*ec779b8eSAndroid Build Coastguard Worker     }
391*ec779b8eSAndroid Build Coastguard Worker 
392*ec779b8eSAndroid Build Coastguard Worker     if (mFdp->ConsumeBool()) {
393*ec779b8eSAndroid Build Coastguard Worker         AMediaCodec_releaseOutputBuffer(codec, bufferIndex, mFdp->ConsumeBool());
394*ec779b8eSAndroid Build Coastguard Worker     } else {
395*ec779b8eSAndroid Build Coastguard Worker         AMediaCodec_releaseOutputBufferAtTime(codec, bufferIndex, timeOutUs);
396*ec779b8eSAndroid Build Coastguard Worker     }
397*ec779b8eSAndroid Build Coastguard Worker }
398*ec779b8eSAndroid Build Coastguard Worker 
getAMediaCodecCryptoInfo()399*ec779b8eSAndroid Build Coastguard Worker AMediaCodecCryptoInfo* NdkMediaCodecFuzzerBase::getAMediaCodecCryptoInfo() {
400*ec779b8eSAndroid Build Coastguard Worker     uint8_t key[kMaxCryptoKey];
401*ec779b8eSAndroid Build Coastguard Worker     uint8_t iv[kMaxCryptoKey];
402*ec779b8eSAndroid Build Coastguard Worker     size_t clearBytes[kMaxCryptoKey];
403*ec779b8eSAndroid Build Coastguard Worker     size_t encryptedBytes[kMaxCryptoKey];
404*ec779b8eSAndroid Build Coastguard Worker 
405*ec779b8eSAndroid Build Coastguard Worker     for (int32_t i = 0; i < kMaxCryptoKey; ++i) {
406*ec779b8eSAndroid Build Coastguard Worker         key[i] = mFdp->ConsumeIntegral<uint8_t>();
407*ec779b8eSAndroid Build Coastguard Worker         iv[i] = mFdp->ConsumeIntegral<uint8_t>();
408*ec779b8eSAndroid Build Coastguard Worker         clearBytes[i] = mFdp->ConsumeIntegral<size_t>();
409*ec779b8eSAndroid Build Coastguard Worker         encryptedBytes[i] = mFdp->ConsumeIntegral<size_t>();
410*ec779b8eSAndroid Build Coastguard Worker     }
411*ec779b8eSAndroid Build Coastguard Worker 
412*ec779b8eSAndroid Build Coastguard Worker     return AMediaCodecCryptoInfo_new(kMaxCryptoKey, key, iv, AMEDIACODECRYPTOINFO_MODE_CLEAR,
413*ec779b8eSAndroid Build Coastguard Worker                                      clearBytes, encryptedBytes);
414*ec779b8eSAndroid Build Coastguard Worker }
415