Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 321b7c71 authored by Aditya Wazir's avatar Aditya Wazir Committed by Ayushi Khopkar
Browse files

Added ndk_mediaformat_fuzzer

Test: ./ndk_mediaformat_fuzzer
Bug: 231667886

Change-Id: I2d9735de5546f131559d68f1912ef3dad0c8f626
(cherry picked from commit 03ff006f1be1a845bfa28b41d8869e30ef8fe097)
parent d8d908d4
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -78,3 +78,9 @@ cc_fuzz {
    shared_libs: ["libbinder_ndk",],
    shared_libs: ["libbinder_ndk",],
    corpus: ["corpus/*"],
    corpus: ["corpus/*"],
}
}

cc_fuzz {
    name: "ndk_mediaformat_fuzzer",
    srcs: ["ndk_mediaformat_fuzzer.cpp"],
    defaults: ["libmediandk_fuzzer_defaults",],
}
+21 −0
Original line number Original line Diff line number Diff line
@@ -4,6 +4,7 @@
+ [ndk_crypto_fuzzer](#NdkCrypto)
+ [ndk_crypto_fuzzer](#NdkCrypto)
+ [ndk_image_reader_fuzzer](#NdkImageReader)
+ [ndk_image_reader_fuzzer](#NdkImageReader)
+ [ndk_extractor_fuzzer](#NdkExtractor)
+ [ndk_extractor_fuzzer](#NdkExtractor)
+ [ndk_mediaformat_fuzzer](#NdkMediaFormat)


# <a name="NdkCrypto"></a> Fuzzer for NdkCrypto
# <a name="NdkCrypto"></a> Fuzzer for NdkCrypto


@@ -72,3 +73,23 @@ NdkExtractor supports the following parameters:
  $ adb sync data
  $ adb sync data
  $ adb shell /data/fuzz/arm64/ndk_extractor_fuzzer/ndk_extractor_fuzzer /data/fuzz/${TARGET_ARCH}/ndk_extractor_fuzzer/corpus
  $ adb shell /data/fuzz/arm64/ndk_extractor_fuzzer/ndk_extractor_fuzzer /data/fuzz/${TARGET_ARCH}/ndk_extractor_fuzzer/corpus
```
```

# <a name="NdkMediaFormat"></a>Fuzzer for NdkMediaFormat

NdkMediaFormat supports the following parameters:
1. Name (parameter name: "name")

| Parameter| Valid Values |Configured Value|
|-------------|----------|----- |
|`name`|1.`AMEDIAFORMAT_KEY_AAC_DRC_ATTENUATION_FACTOR`, 2.`AMEDIAFORMAT_KEY_AAC_DRC_BOOST_FACTOR`, 3.`AMEDIAFORMAT_KEY_AAC_DRC_HEAVY_COMPRESSION`, 4.`AMEDIAFORMAT_KEY_AAC_DRC_TARGET_REFERENCE_LEVEL`, 5.`AMEDIAFORMAT_KEY_AAC_ENCODED_TARGET_LEVEL`, 6.`AMEDIAFORMAT_KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT`, 7.`AMEDIAFORMAT_KEY_AAC_PROFILE`, 8.`AMEDIAFORMAT_KEY_AAC_SBR_MODE`, 9.`AMEDIAFORMAT_KEY_ALBUM`, 10.`AMEDIAFORMAT_KEY_ALBUMART`, 11.`AMEDIAFORMAT_KEY_ALBUMARTIST`, 12.`AMEDIAFORMAT_KEY_ARTIST`, 13.`AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_INFO`, 14.`AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_PRESENTATION_ID`, 15.`AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_PROGRAM_ID`, 16.`AMEDIAFORMAT_KEY_AUDIO_SESSION_ID`, 17.`AMEDIAFORMAT_KEY_AUTHOR`, 18.`AMEDIAFORMAT_KEY_BITRATE_MODE`, 19.`AMEDIAFORMAT_KEY_BIT_RATE`, 20.`AMEDIAFORMAT_KEY_BITS_PER_SAMPLE`, 21.`AMEDIAFORMAT_KEY_CAPTURE_RATE`, 22.`AMEDIAFORMAT_KEY_CDTRACKNUMBER`, 23.`AMEDIAFORMAT_KEY_CHANNEL_COUNT`, 24.`AMEDIAFORMAT_KEY_CHANNEL_MASK`, 25.`AMEDIAFORMAT_KEY_COLOR_FORMAT`, 26.`AMEDIAFORMAT_KEY_COLOR_RANGE`, 27.`AMEDIAFORMAT_KEY_COLOR_STANDARD`, 28.`AMEDIAFORMAT_KEY_COLOR_TRANSFER`, 29.`AMEDIAFORMAT_KEY_COMPILATION`, 30.`AMEDIAFORMAT_KEY_COMPLEXITY`, 31.`AMEDIAFORMAT_KEY_COMPOSER`, 32.`AMEDIAFORMAT_KEY_CREATE_INPUT_SURFACE_SUSPENDED`, 33.`AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE`, 34.`AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_BYTE_BLOCK`, 35.`AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES`, 36.`AMEDIAFORMAT_KEY_CRYPTO_IV`, 37.`AMEDIAFORMAT_KEY_CRYPTO_KEY`, 38.`AMEDIAFORMAT_KEY_CRYPTO_MODE`, 39.`AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES`, 40.`AMEDIAFORMAT_KEY_CRYPTO_SKIP_BYTE_BLOCK`, 41.`AMEDIAFORMAT_KEY_CSD`, 42.`AMEDIAFORMAT_KEY_CSD_0`, 43.`AMEDIAFORMAT_KEY_CSD_1`, 44.`AMEDIAFORMAT_KEY_CSD_2`, 45.`AMEDIAFORMAT_KEY_CSD_AVC`, 46.`AMEDIAFORMAT_KEY_CSD_HEVC`, 47.`AMEDIAFORMAT_KEY_D263`, 48.`AMEDIAFORMAT_KEY_DATE`, 49.`AMEDIAFORMAT_KEY_DISCNUMBER`, 50.`AMEDIAFORMAT_KEY_DISPLAY_CROP`, 51.`AMEDIAFORMAT_KEY_DISPLAY_HEIGHT`, 52.`AMEDIAFORMAT_KEY_DISPLAY_WIDTH`, 53.`AMEDIAFORMAT_KEY_DURATION`, 54.`AMEDIAFORMAT_KEY_ENCODER_DELAY`, 55.`AMEDIAFORMAT_KEY_ENCODER_PADDING`, 56.`AMEDIAFORMAT_KEY_ESDS`, 57.`AMEDIAFORMAT_KEY_EXIF_OFFSET`, 58.`AMEDIAFORMAT_KEY_EXIF_SIZE`, 59.`AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL`, 60.`AMEDIAFORMAT_KEY_FRAME_COUNT`, 61.`AMEDIAFORMAT_KEY_FRAME_RATE`, 62.`AMEDIAFORMAT_KEY_GENRE`, 63.`AMEDIAFORMAT_KEY_GRID_COLUMNS`, 64.`AMEDIAFORMAT_KEY_GRID_ROWS`, 65.`AMEDIAFORMAT_KEY_HAPTIC_CHANNEL_COUNT`, 66.`AMEDIAFORMAT_KEY_HDR_STATIC_INFO`, 67.`AMEDIAFORMAT_KEY_HDR10_PLUS_INFO`, 68.`AMEDIAFORMAT_KEY_HEIGHT`, 69.`AMEDIAFORMAT_KEY_ICC_PROFILE`, 70.`AMEDIAFORMAT_KEY_INTRA_REFRESH_PERIOD`, 71.`AMEDIAFORMAT_KEY_IS_ADTS`, 72.`AMEDIAFORMAT_KEY_IS_AUTOSELECT`, 73.`AMEDIAFORMAT_KEY_IS_DEFAULT`, 74.`AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE`, 75.`AMEDIAFORMAT_KEY_IS_SYNC_FRAME`, 76.`AMEDIAFORMAT_KEY_I_FRAME_INTERVAL`, 77.`AMEDIAFORMAT_KEY_LANGUAGE`, 78.`AMEDIAFORMAT_KEY_LAST_SAMPLE_INDEX_IN_CHUNK`, 79.`AMEDIAFORMAT_KEY_LATENCY`, 80.`AMEDIAFORMAT_KEY_LEVEL`, 81.`AMEDIAFORMAT_KEY_LOCATION`, 82.`AMEDIAFORMAT_KEY_LOOP`, 83.`AMEDIAFORMAT_KEY_LOW_LATENCY`, 84.`AMEDIAFORMAT_KEY_LYRICIST`, 85.`AMEDIAFORMAT_KEY_MANUFACTURER`, 86.`AMEDIAFORMAT_KEY_MAX_BIT_RATE`, 87.`AMEDIAFORMAT_KEY_MAX_FPS_TO_ENCODER`, 88.`AMEDIAFORMAT_KEY_MAX_HEIGHT`, 89.`AMEDIAFORMAT_KEY_MAX_INPUT_SIZE`, 90.`AMEDIAFORMAT_KEY_MAX_PTS_GAP_TO_ENCODER`, 91.`AMEDIAFORMAT_KEY_MAX_WIDTH`, 92.`AMEDIAFORMAT_KEY_MIME`, 93.`AMEDIAFORMAT_KEY_MPEG_USER_DATA`, 94.`AMEDIAFORMAT_KEY_MPEG2_STREAM_HEADER`, 95.`AMEDIAFORMAT_KEY_MPEGH_COMPATIBLE_SETS`, 96.`AMEDIAFORMAT_KEY_MPEGH_PROFILE_LEVEL_INDICATION`, 97.`AMEDIAFORMAT_KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT`, 98.`AMEDIAFORMAT_KEY_OPERATING_RATE`, 99.`AMEDIAFORMAT_KEY_PCM_ENCODING`, 100.`AMEDIAFORMAT_KEY_PICTURE_TYPE`, 101.`AMEDIAFORMAT_KEY_PRIORITY`, 102.`AMEDIAFORMAT_KEY_PROFILE`, 103.`AMEDIAFORMAT_KEY_PCM_BIG_ENDIAN`, 104.`AMEDIAFORMAT_KEY_PSSH`, 105.`AMEDIAFORMAT_KEY_PUSH_BLANK_BUFFERS_ON_STOP`, 106.`AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER`, 107.`AMEDIAFORMAT_KEY_ROTATION`, 108.`AMEDIAFORMAT_KEY_SAMPLE_FILE_OFFSET`, 109.`AMEDIAFORMAT_KEY_SAMPLE_RATE`, 110.`AMEDIAFORMAT_KEY_SAMPLE_TIME_BEFORE_APPEND`, 111.`AMEDIAFORMAT_KEY_SAR_HEIGHT`, 112.`AMEDIAFORMAT_KEY_SAR_WIDTH`, 113.`AMEDIAFORMAT_KEY_SEI`, 114.`AMEDIAFORMAT_KEY_SLICE_HEIGHT`, 115.`AMEDIAFORMAT_KEY_SLOW_MOTION_MARKERS`, 116.`AMEDIAFORMAT_KEY_STRIDE`, 117.`AMEDIAFORMAT_KEY_TARGET_TIME`, 118.`AMEDIAFORMAT_KEY_TEMPORAL_LAYER_COUNT`, 119.`AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID`, 120.`AMEDIAFORMAT_KEY_TEMPORAL_LAYERING`, 121.`AMEDIAFORMAT_KEY_TEXT_FORMAT_DATA`, 122.`AMEDIAFORMAT_KEY_THUMBNAIL_CSD_AV1C`, 123.`AMEDIAFORMAT_KEY_THUMBNAIL_CSD_HEVC`, 124.`AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT`, 125.`AMEDIAFORMAT_KEY_THUMBNAIL_TIME`, 126.`AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH`, 127.`AMEDIAFORMAT_KEY_TILE_HEIGHT`, 128.`AMEDIAFORMAT_KEY_TILE_WIDTH`, 129.`AMEDIAFORMAT_KEY_TIME_US`, 130.`AMEDIAFORMAT_KEY_TITLE`, 131.`AMEDIAFORMAT_KEY_TRACK_ID`, 132.`AMEDIAFORMAT_KEY_TRACK_INDEX`, 133.`AMEDIAFORMAT_KEY_VALID_SAMPLES`, 134.`AMEDIAFORMAT_KEY_VIDEO_ENCODING_STATISTICS_LEVEL`, 135.`AMEDIAFORMAT_KEY_VIDEO_QP_AVERAGE`, 136.`AMEDIAFORMAT_VIDEO_QP_B_MAX`, 137.`AMEDIAFORMAT_VIDEO_QP_B_MIN`, 138.`AMEDIAFORMAT_VIDEO_QP_I_MAX`, 139.`AMEDIAFORMAT_VIDEO_QP_I_MIN`, 140.`AMEDIAFORMAT_VIDEO_QP_MAX`, 141.`AMEDIAFORMAT_VIDEO_QP_MIN`, 142.`AMEDIAFORMAT_VIDEO_QP_P_MAX`, 143.`AMEDIAFORMAT_VIDEO_QP_P_MIN`, 144.`AMEDIAFORMAT_KEY_WIDTH`, 145.`AMEDIAFORMAT_KEY_XMP_OFFSET`, 146.`AMEDIAFORMAT_KEY_XMP_SIZE`, 147.`AMEDIAFORMAT_KEY_YEAR`| Value obtained from FuzzedDataProvider|

#### Steps to run
1. Build the fuzzer
```
  $ mm -j$(nproc) ndk_mediaformat_fuzzer
```
2. Run on device
```
  $ adb sync data
  $ adb shell /data/fuzz/${TARGET_ARCH}/ndk_mediaformat_fuzzer/ndk_mediaformat_fuzzer /data/fuzz/${TARGET_ARCH}/ndk_mediaformat_fuzzer/corpus
```
+256 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <datasource/FileSource.h>
#include <fcntl.h>
#include <fuzzer/FuzzedDataProvider.h>
#include <media/NdkMediaFormat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <utils/Log.h>
#include <fstream>

const char* kValidKeys[] = {
        AMEDIAFORMAT_KEY_AAC_DRC_ATTENUATION_FACTOR,
        AMEDIAFORMAT_KEY_AAC_DRC_BOOST_FACTOR,
        AMEDIAFORMAT_KEY_AAC_DRC_HEAVY_COMPRESSION,
        AMEDIAFORMAT_KEY_AAC_DRC_TARGET_REFERENCE_LEVEL,
        AMEDIAFORMAT_KEY_AAC_ENCODED_TARGET_LEVEL,
        AMEDIAFORMAT_KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT,
        AMEDIAFORMAT_KEY_AAC_PROFILE,
        AMEDIAFORMAT_KEY_AAC_SBR_MODE,
        AMEDIAFORMAT_KEY_ALBUM,
        AMEDIAFORMAT_KEY_ALBUMART,
        AMEDIAFORMAT_KEY_ALBUMARTIST,
        AMEDIAFORMAT_KEY_ARTIST,
        AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_INFO,
        AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_PRESENTATION_ID,
        AMEDIAFORMAT_KEY_AUDIO_PRESENTATION_PROGRAM_ID,
        AMEDIAFORMAT_KEY_AUDIO_SESSION_ID,
        AMEDIAFORMAT_KEY_AUTHOR,
        AMEDIAFORMAT_KEY_BITRATE_MODE,
        AMEDIAFORMAT_KEY_BIT_RATE,
        AMEDIAFORMAT_KEY_BITS_PER_SAMPLE,
        AMEDIAFORMAT_KEY_CAPTURE_RATE,
        AMEDIAFORMAT_KEY_CDTRACKNUMBER,
        AMEDIAFORMAT_KEY_CHANNEL_COUNT,
        AMEDIAFORMAT_KEY_CHANNEL_MASK,
        AMEDIAFORMAT_KEY_COLOR_FORMAT,
        AMEDIAFORMAT_KEY_COLOR_RANGE,
        AMEDIAFORMAT_KEY_COLOR_STANDARD,
        AMEDIAFORMAT_KEY_COLOR_TRANSFER,
        AMEDIAFORMAT_KEY_COMPILATION,
        AMEDIAFORMAT_KEY_COMPLEXITY,
        AMEDIAFORMAT_KEY_COMPOSER,
        AMEDIAFORMAT_KEY_CREATE_INPUT_SURFACE_SUSPENDED,
        AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE,
        AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_BYTE_BLOCK,
        AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES,
        AMEDIAFORMAT_KEY_CRYPTO_IV,
        AMEDIAFORMAT_KEY_CRYPTO_KEY,
        AMEDIAFORMAT_KEY_CRYPTO_MODE,
        AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES,
        AMEDIAFORMAT_KEY_CRYPTO_SKIP_BYTE_BLOCK,
        AMEDIAFORMAT_KEY_CSD,
        AMEDIAFORMAT_KEY_CSD_0,
        AMEDIAFORMAT_KEY_CSD_1,
        AMEDIAFORMAT_KEY_CSD_2,
        AMEDIAFORMAT_KEY_CSD_AVC,
        AMEDIAFORMAT_KEY_CSD_HEVC,
        AMEDIAFORMAT_KEY_D263,
        AMEDIAFORMAT_KEY_DATE,
        AMEDIAFORMAT_KEY_DISCNUMBER,
        AMEDIAFORMAT_KEY_DISPLAY_CROP,
        AMEDIAFORMAT_KEY_DISPLAY_HEIGHT,
        AMEDIAFORMAT_KEY_DISPLAY_WIDTH,
        AMEDIAFORMAT_KEY_DURATION,
        AMEDIAFORMAT_KEY_ENCODER_DELAY,
        AMEDIAFORMAT_KEY_ENCODER_PADDING,
        AMEDIAFORMAT_KEY_ESDS,
        AMEDIAFORMAT_KEY_EXIF_OFFSET,
        AMEDIAFORMAT_KEY_EXIF_SIZE,
        AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL,
        AMEDIAFORMAT_KEY_FRAME_COUNT,
        AMEDIAFORMAT_KEY_FRAME_RATE,
        AMEDIAFORMAT_KEY_GENRE,
        AMEDIAFORMAT_KEY_GRID_COLUMNS,
        AMEDIAFORMAT_KEY_GRID_ROWS,
        AMEDIAFORMAT_KEY_HAPTIC_CHANNEL_COUNT,
        AMEDIAFORMAT_KEY_HDR_STATIC_INFO,
        AMEDIAFORMAT_KEY_HDR10_PLUS_INFO,
        AMEDIAFORMAT_KEY_HEIGHT,
        AMEDIAFORMAT_KEY_ICC_PROFILE,
        AMEDIAFORMAT_KEY_INTRA_REFRESH_PERIOD,
        AMEDIAFORMAT_KEY_IS_ADTS,
        AMEDIAFORMAT_KEY_IS_AUTOSELECT,
        AMEDIAFORMAT_KEY_IS_DEFAULT,
        AMEDIAFORMAT_KEY_IS_FORCED_SUBTITLE,
        AMEDIAFORMAT_KEY_IS_SYNC_FRAME,
        AMEDIAFORMAT_KEY_I_FRAME_INTERVAL,
        AMEDIAFORMAT_KEY_LANGUAGE,
        AMEDIAFORMAT_KEY_LAST_SAMPLE_INDEX_IN_CHUNK,
        AMEDIAFORMAT_KEY_LATENCY,
        AMEDIAFORMAT_KEY_LEVEL,
        AMEDIAFORMAT_KEY_LOCATION,
        AMEDIAFORMAT_KEY_LOOP,
        AMEDIAFORMAT_KEY_LOW_LATENCY,
        AMEDIAFORMAT_KEY_LYRICIST,
        AMEDIAFORMAT_KEY_MANUFACTURER,
        AMEDIAFORMAT_KEY_MAX_BIT_RATE,
        AMEDIAFORMAT_KEY_MAX_FPS_TO_ENCODER,
        AMEDIAFORMAT_KEY_MAX_HEIGHT,
        AMEDIAFORMAT_KEY_MAX_INPUT_SIZE,
        AMEDIAFORMAT_KEY_MAX_PTS_GAP_TO_ENCODER,
        AMEDIAFORMAT_KEY_MAX_WIDTH,
        AMEDIAFORMAT_KEY_MIME,
        AMEDIAFORMAT_KEY_MPEG_USER_DATA,
        AMEDIAFORMAT_KEY_MPEG2_STREAM_HEADER,
        AMEDIAFORMAT_KEY_MPEGH_COMPATIBLE_SETS,
        AMEDIAFORMAT_KEY_MPEGH_PROFILE_LEVEL_INDICATION,
        AMEDIAFORMAT_KEY_MPEGH_REFERENCE_CHANNEL_LAYOUT,
        AMEDIAFORMAT_KEY_OPERATING_RATE,
        AMEDIAFORMAT_KEY_PCM_ENCODING,
        AMEDIAFORMAT_KEY_PICTURE_TYPE,
        AMEDIAFORMAT_KEY_PRIORITY,
        AMEDIAFORMAT_KEY_PROFILE,
        AMEDIAFORMAT_KEY_PCM_BIG_ENDIAN,
        AMEDIAFORMAT_KEY_PSSH,
        AMEDIAFORMAT_KEY_PUSH_BLANK_BUFFERS_ON_STOP,
        AMEDIAFORMAT_KEY_REPEAT_PREVIOUS_FRAME_AFTER,
        AMEDIAFORMAT_KEY_ROTATION,
        AMEDIAFORMAT_KEY_SAMPLE_FILE_OFFSET,
        AMEDIAFORMAT_KEY_SAMPLE_RATE,
        AMEDIAFORMAT_KEY_SAMPLE_TIME_BEFORE_APPEND,
        AMEDIAFORMAT_KEY_SAR_HEIGHT,
        AMEDIAFORMAT_KEY_SAR_WIDTH,
        AMEDIAFORMAT_KEY_SEI,
        AMEDIAFORMAT_KEY_SLICE_HEIGHT,
        AMEDIAFORMAT_KEY_SLOW_MOTION_MARKERS,
        AMEDIAFORMAT_KEY_STRIDE,
        AMEDIAFORMAT_KEY_TARGET_TIME,
        AMEDIAFORMAT_KEY_TEMPORAL_LAYER_COUNT,
        AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID,
        AMEDIAFORMAT_KEY_TEMPORAL_LAYERING,
        AMEDIAFORMAT_KEY_TEXT_FORMAT_DATA,
        AMEDIAFORMAT_KEY_THUMBNAIL_CSD_AV1C,
        AMEDIAFORMAT_KEY_THUMBNAIL_CSD_HEVC,
        AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT,
        AMEDIAFORMAT_KEY_THUMBNAIL_TIME,
        AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH,
        AMEDIAFORMAT_KEY_TILE_HEIGHT,
        AMEDIAFORMAT_KEY_TILE_WIDTH,
        AMEDIAFORMAT_KEY_TIME_US,
        AMEDIAFORMAT_KEY_TITLE,
        AMEDIAFORMAT_KEY_TRACK_ID,
        AMEDIAFORMAT_KEY_TRACK_INDEX,
        AMEDIAFORMAT_KEY_VALID_SAMPLES,
        AMEDIAFORMAT_KEY_VIDEO_ENCODING_STATISTICS_LEVEL,
        AMEDIAFORMAT_KEY_VIDEO_QP_AVERAGE,
        AMEDIAFORMAT_VIDEO_QP_B_MAX,
        AMEDIAFORMAT_VIDEO_QP_B_MIN,
        AMEDIAFORMAT_VIDEO_QP_I_MAX,
        AMEDIAFORMAT_VIDEO_QP_I_MIN,
        AMEDIAFORMAT_VIDEO_QP_MAX,
        AMEDIAFORMAT_VIDEO_QP_MIN,
        AMEDIAFORMAT_VIDEO_QP_P_MAX,
        AMEDIAFORMAT_VIDEO_QP_P_MIN,
        AMEDIAFORMAT_KEY_WIDTH,
        AMEDIAFORMAT_KEY_XMP_OFFSET,
        AMEDIAFORMAT_KEY_XMP_SIZE,
        AMEDIAFORMAT_KEY_YEAR,
};
constexpr size_t kMinBytes = 0;
constexpr size_t kMaxBytes = 1000;
constexpr size_t kMinChoice = 0;
constexpr size_t kMaxChoice = 9;

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
    FuzzedDataProvider fdp(data, size);
    AMediaFormat* mediaFormat = AMediaFormat_new();
    while (fdp.remaining_bytes()) {
        const char* name = nullptr;
        if (fdp.ConsumeBool()) {
            std::string nameString =
                    fdp.ConsumeBool()
                            ? fdp.PickValueInArray(kValidKeys)
                            : fdp.ConsumeRandomLengthString(
                                      fdp.ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
            name = nameString.c_str();
        }
        switch (fdp.ConsumeIntegralInRange<int32_t>(kMinChoice, kMaxChoice)) {
            case 0: {
                AMediaFormat_setInt32(mediaFormat, name,
                                      fdp.ConsumeIntegral<int32_t>() /* value */);
                break;
            }
            case 1: {
                AMediaFormat_setInt64(mediaFormat, name,
                                      fdp.ConsumeIntegral<int64_t>() /* value */);
                break;
            }
            case 2: {
                AMediaFormat_setFloat(mediaFormat, name,
                                      fdp.ConsumeFloatingPoint<float>() /* value */);
                break;
            }
            case 3: {
                AMediaFormat_setDouble(mediaFormat, name,
                                       fdp.ConsumeFloatingPoint<double>() /* value */);
                break;
            }
            case 4: {
                AMediaFormat_setSize(mediaFormat, name, fdp.ConsumeIntegral<size_t>() /* value */);
                break;
            }
            case 5: {
                std::string value;
                if (fdp.ConsumeBool()) {
                    value = fdp.ConsumeRandomLengthString(
                            fdp.ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
                }
                AMediaFormat_setString(mediaFormat, name,
                                       fdp.ConsumeBool() ? nullptr : value.c_str());
                break;
            }
            case 6: {
                AMediaFormat_setRect(mediaFormat, name, fdp.ConsumeIntegral<int32_t>() /* left */,
                                     fdp.ConsumeIntegral<int32_t>() /* top */,
                                     fdp.ConsumeIntegral<int32_t>() /* bottom */,
                                     fdp.ConsumeIntegral<int32_t>() /* right */);
                break;
            }
            case 7: {
                std::vector<uint8_t> bufferData = fdp.ConsumeBytes<uint8_t>(
                        fdp.ConsumeIntegralInRange<size_t>(kMinBytes, kMaxBytes));
                AMediaFormat_setBuffer(mediaFormat, name, bufferData.data(), bufferData.size());
                break;
            }
            case 8: {
                AMediaFormat_toString(mediaFormat);
                break;
            }
            default: {
                AMediaFormat* format = fdp.ConsumeBool() ? nullptr : AMediaFormat_new();
                AMediaFormat_copy(format, mediaFormat);
                AMediaFormat_delete(format);
                break;
            }
        }
    }
    AMediaFormat_clear(mediaFormat);
    AMediaFormat_delete(mediaFormat);
    return 0;
}