1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License. 5da853ecaSopenharmony_ci * You may obtain a copy of the License at 6da853ecaSopenharmony_ci * 7da853ecaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8da853ecaSopenharmony_ci * 9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and 13da853ecaSopenharmony_ci * limitations under the License. 14da853ecaSopenharmony_ci */ 15da853ecaSopenharmony_ci 16da853ecaSopenharmony_ci#include <cstddef> 17da853ecaSopenharmony_ci#include <cstdint> 18da853ecaSopenharmony_ci#include <fcntl.h> 19da853ecaSopenharmony_ci#include <unistd.h> 20da853ecaSopenharmony_ci#include <sys/stat.h> 21da853ecaSopenharmony_ci#include "native_avdemuxer.h" 22da853ecaSopenharmony_ci#include "native_avformat.h" 23da853ecaSopenharmony_ci#include "native_avsource.h" 24da853ecaSopenharmony_ci#include "native_avmemory.h" 25da853ecaSopenharmony_ci 26da853ecaSopenharmony_ci#define FUZZ_PROJECT_NAME "demuxer_fuzzer" 27da853ecaSopenharmony_cinamespace OHOS { 28da853ecaSopenharmony_cistatic int32_t g_width = 3840; 29da853ecaSopenharmony_cistatic int32_t g_height = 2160; 30da853ecaSopenharmony_cistatic int64_t GetFileSize(const char *fileName) 31da853ecaSopenharmony_ci{ 32da853ecaSopenharmony_ci int64_t fileSize = 0; 33da853ecaSopenharmony_ci if (fileName != nullptr) { 34da853ecaSopenharmony_ci struct stat fileStatus {}; 35da853ecaSopenharmony_ci if (stat(fileName, &fileStatus) == 0) { 36da853ecaSopenharmony_ci fileSize = static_cast<int64_t>(fileStatus.st_size); 37da853ecaSopenharmony_ci } 38da853ecaSopenharmony_ci } 39da853ecaSopenharmony_ci return fileSize; 40da853ecaSopenharmony_ci} 41da853ecaSopenharmony_ci 42da853ecaSopenharmony_cistatic void SetVarValue(OH_AVCodecBufferAttr attr, const int &tarckType, bool &audioIsEnd, bool &videoIsEnd) 43da853ecaSopenharmony_ci{ 44da853ecaSopenharmony_ci if (tarckType == MEDIA_TYPE_AUD && (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS)) { 45da853ecaSopenharmony_ci audioIsEnd = true; 46da853ecaSopenharmony_ci } 47da853ecaSopenharmony_ci 48da853ecaSopenharmony_ci if (tarckType == MEDIA_TYPE_VID && (attr.flags & OH_AVCodecBufferFlags::AVCODEC_BUFFER_FLAGS_EOS)) { 49da853ecaSopenharmony_ci videoIsEnd = true; 50da853ecaSopenharmony_ci } 51da853ecaSopenharmony_ci} 52da853ecaSopenharmony_ci 53da853ecaSopenharmony_civoid RunNormalDemuxer() 54da853ecaSopenharmony_ci{ 55da853ecaSopenharmony_ci int tarckType = 0; 56da853ecaSopenharmony_ci int32_t trackCount; 57da853ecaSopenharmony_ci OH_AVCodecBufferAttr attr; 58da853ecaSopenharmony_ci bool audioIsEnd = false; 59da853ecaSopenharmony_ci bool videoIsEnd = false; 60da853ecaSopenharmony_ci const char *file = "/data/test/media/01_video_audio.mp4"; 61da853ecaSopenharmony_ci int fd = open(file, O_RDONLY); 62da853ecaSopenharmony_ci int64_t size = GetFileSize(file); 63da853ecaSopenharmony_ci OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, size); 64da853ecaSopenharmony_ci if (!source) { 65da853ecaSopenharmony_ci close(fd); 66da853ecaSopenharmony_ci return; 67da853ecaSopenharmony_ci } 68da853ecaSopenharmony_ci OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source); 69da853ecaSopenharmony_ci if (!demuxer) { 70da853ecaSopenharmony_ci close(fd); 71da853ecaSopenharmony_ci return; 72da853ecaSopenharmony_ci } 73da853ecaSopenharmony_ci OH_AVFormat *sourceFormat = OH_AVSource_GetSourceFormat(source); 74da853ecaSopenharmony_ci OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &trackCount); 75da853ecaSopenharmony_ci for (int32_t index = 0; index < trackCount; index++) { 76da853ecaSopenharmony_ci OH_AVDemuxer_SelectTrackByID(demuxer, index); 77da853ecaSopenharmony_ci } 78da853ecaSopenharmony_ci OH_AVMemory *memory = OH_AVMemory_Create(g_width * g_height); 79da853ecaSopenharmony_ci while (!audioIsEnd || !videoIsEnd) { 80da853ecaSopenharmony_ci for (int32_t index = 0; index < trackCount; index++) { 81da853ecaSopenharmony_ci OH_AVFormat *trackFormat = OH_AVSource_GetTrackFormat(source, index); 82da853ecaSopenharmony_ci OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType); 83da853ecaSopenharmony_ci if ((audioIsEnd && (tarckType == MEDIA_TYPE_AUD)) || (videoIsEnd && (tarckType == MEDIA_TYPE_VID))) { 84da853ecaSopenharmony_ci continue; 85da853ecaSopenharmony_ci } 86da853ecaSopenharmony_ci if (trackFormat) { 87da853ecaSopenharmony_ci OH_AVFormat_Destroy(trackFormat); 88da853ecaSopenharmony_ci } 89da853ecaSopenharmony_ci OH_AVDemuxer_ReadSample(demuxer, index, memory, &attr); 90da853ecaSopenharmony_ci SetVarValue(attr, tarckType, audioIsEnd, videoIsEnd); 91da853ecaSopenharmony_ci } 92da853ecaSopenharmony_ci } 93da853ecaSopenharmony_ci OH_AVDemuxer_Destroy(demuxer); 94da853ecaSopenharmony_ci OH_AVSource_Destroy(source); 95da853ecaSopenharmony_ci if (sourceFormat) { 96da853ecaSopenharmony_ci OH_AVFormat_Destroy(sourceFormat); 97da853ecaSopenharmony_ci } 98da853ecaSopenharmony_ci if (memory) { 99da853ecaSopenharmony_ci OH_AVMemory_Destroy(memory); 100da853ecaSopenharmony_ci } 101da853ecaSopenharmony_ci close(fd); 102da853ecaSopenharmony_ci} 103da853ecaSopenharmony_ci 104da853ecaSopenharmony_civoid RunNormalDemuxerApi11() 105da853ecaSopenharmony_ci{ 106da853ecaSopenharmony_ci int tarckType = 0; 107da853ecaSopenharmony_ci int32_t trackCount; 108da853ecaSopenharmony_ci OH_AVCodecBufferAttr attr; 109da853ecaSopenharmony_ci bool audioIsEnd = false; 110da853ecaSopenharmony_ci bool videoIsEnd = false; 111da853ecaSopenharmony_ci const char *file = "/data/test/media/01_video_audio.mp4"; 112da853ecaSopenharmony_ci int fd = open(file, O_RDONLY); 113da853ecaSopenharmony_ci int64_t size = GetFileSize(file); 114da853ecaSopenharmony_ci OH_AVSource *source = OH_AVSource_CreateWithFD(fd, 0, size); 115da853ecaSopenharmony_ci if (!source) { 116da853ecaSopenharmony_ci close(fd); 117da853ecaSopenharmony_ci return; 118da853ecaSopenharmony_ci } 119da853ecaSopenharmony_ci OH_AVDemuxer *demuxer = OH_AVDemuxer_CreateWithSource(source); 120da853ecaSopenharmony_ci if (!demuxer) { 121da853ecaSopenharmony_ci close(fd); 122da853ecaSopenharmony_ci return; 123da853ecaSopenharmony_ci } 124da853ecaSopenharmony_ci OH_AVFormat *sourceFormat = OH_AVSource_GetSourceFormat(source); 125da853ecaSopenharmony_ci OH_AVFormat_GetIntValue(sourceFormat, OH_MD_KEY_TRACK_COUNT, &trackCount); 126da853ecaSopenharmony_ci for (int32_t index = 0; index < trackCount; index++) { 127da853ecaSopenharmony_ci OH_AVDemuxer_SelectTrackByID(demuxer, index); 128da853ecaSopenharmony_ci } 129da853ecaSopenharmony_ci OH_AVBuffer *buffer = OH_AVBuffer_Create(g_width * g_height); 130da853ecaSopenharmony_ci while (!audioIsEnd || !videoIsEnd) { 131da853ecaSopenharmony_ci for (int32_t index = 0; index < trackCount; index++) { 132da853ecaSopenharmony_ci OH_AVFormat *trackFormat = OH_AVSource_GetTrackFormat(source, index); 133da853ecaSopenharmony_ci OH_AVFormat_GetIntValue(trackFormat, OH_MD_KEY_TRACK_TYPE, &tarckType); 134da853ecaSopenharmony_ci if ((audioIsEnd && (tarckType == MEDIA_TYPE_AUD)) || (videoIsEnd && (tarckType == MEDIA_TYPE_VID))) { 135da853ecaSopenharmony_ci continue; 136da853ecaSopenharmony_ci } 137da853ecaSopenharmony_ci if (trackFormat) { 138da853ecaSopenharmony_ci OH_AVFormat_Destroy(trackFormat); 139da853ecaSopenharmony_ci } 140da853ecaSopenharmony_ci OH_AVDemuxer_ReadSampleBuffer(demuxer, index, buffer); 141da853ecaSopenharmony_ci OH_AVBuffer_GetBufferAttr(buffer, &attr); 142da853ecaSopenharmony_ci SetVarValue(attr, tarckType, audioIsEnd, videoIsEnd); 143da853ecaSopenharmony_ci } 144da853ecaSopenharmony_ci } 145da853ecaSopenharmony_ci OH_AVDemuxer_Destroy(demuxer); 146da853ecaSopenharmony_ci OH_AVSource_Destroy(source); 147da853ecaSopenharmony_ci if (sourceFormat) { 148da853ecaSopenharmony_ci OH_AVFormat_Destroy(sourceFormat); 149da853ecaSopenharmony_ci } 150da853ecaSopenharmony_ci if (buffer) { 151da853ecaSopenharmony_ci OH_AVBuffer_Destroy(buffer); 152da853ecaSopenharmony_ci } 153da853ecaSopenharmony_ci close(fd); 154da853ecaSopenharmony_ci} 155da853ecaSopenharmony_ci 156da853ecaSopenharmony_cibool DoSomethingInterestingWithMyAPI(const uint8_t *data, size_t size) 157da853ecaSopenharmony_ci{ 158da853ecaSopenharmony_ci if (size < sizeof(int64_t)) { 159da853ecaSopenharmony_ci return false; 160da853ecaSopenharmony_ci } 161da853ecaSopenharmony_ci RunNormalDemuxer(); 162da853ecaSopenharmony_ci RunNormalDemuxerApi11(); 163da853ecaSopenharmony_ci // FUZZ CreateFD 164da853ecaSopenharmony_ci int32_t fd = *reinterpret_cast<const int32_t *>(data); 165da853ecaSopenharmony_ci int64_t offset = *reinterpret_cast<const int64_t *>(data); 166da853ecaSopenharmony_ci int64_t fileSize = *reinterpret_cast<const int64_t *>(data); 167da853ecaSopenharmony_ci OH_AVSource *source = OH_AVSource_CreateWithFD(fd, offset, fileSize); 168da853ecaSopenharmony_ci if (source) { 169da853ecaSopenharmony_ci OH_AVSource_Destroy(source); 170da853ecaSopenharmony_ci } 171da853ecaSopenharmony_ci return true; 172da853ecaSopenharmony_ci} 173da853ecaSopenharmony_ci} // namespace OHOS 174da853ecaSopenharmony_ci 175da853ecaSopenharmony_ci/* Fuzzer entry point */ 176da853ecaSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 177da853ecaSopenharmony_ci{ 178da853ecaSopenharmony_ci /* Run your code on data */ 179da853ecaSopenharmony_ci OHOS::DoSomethingInterestingWithMyAPI(data, size); 180da853ecaSopenharmony_ci return 0; 181da853ecaSopenharmony_ci} 182