1/* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <cstddef> 17#include <cstdint> 18#include "avcodec_common.h" 19#include "avcodec_audio_common.h" 20#include "native_avcodec_audioencoder.h" 21#include "common/native_mfmagic.h" 22#include "native_avcodec_audiocodec.h" 23#include "avcodec_audio_encoder.h" 24#include "audio_encoder_demo.h" 25#define FUZZ_PROJECT_NAME "audioencoder_fuzzer" 26 27using namespace OHOS::MediaAVCodec::AudioAacEncDemo; 28 29namespace OHOS { 30bool AudioEncoderFuzzTest(const uint8_t *data, size_t size) 31{ 32 if (size < sizeof(int64_t)) { 33 return false; 34 } 35 // FUZZ OH_AudioCodec_CreateByMime 36 std::string codecdata(reinterpret_cast<const char*>(data), size); 37 OH_AVCodec *source = OH_AudioCodec_CreateByMime(codecdata.c_str(), true); 38 if (source) { 39 OH_AudioCodec_Destroy(source); 40 } 41 OH_AVCodec *sourcename = OH_AudioCodec_CreateByName(codecdata.c_str()); 42 if (sourcename) { 43 OH_AudioCodec_Destroy(sourcename); 44 } 45 return true; 46} 47 48bool AudioEncoderAACFuzzTest(const uint8_t *data, size_t size) 49{ 50 if (size < sizeof(int64_t)) { 51 return false; 52 } 53 // FUZZ aac 54 AudioBufferAacEncDemo* aDecBufferDemo = new AudioBufferAacEncDemo(); 55 aDecBufferDemo->InitFile("aac"); 56 bool ret = aDecBufferDemo->RunCase(data, size); 57 delete aDecBufferDemo; 58 return ret; 59} 60 61bool AudioEncoderOPUSFuzzTest(const uint8_t *data, size_t size) 62{ 63 if (size < sizeof(int64_t)) { 64 return false; 65 } 66 // FUZZ opus 67 AudioBufferAacEncDemo* aDecBufferDemo = new AudioBufferAacEncDemo(); 68 aDecBufferDemo->InitFile("opus"); 69 bool ret = aDecBufferDemo->RunCase(data, size); 70 delete aDecBufferDemo; 71 return ret; 72} 73 74bool AudioEncoderG711FuzzTest(const uint8_t *data, size_t size) 75{ 76 if (size < sizeof(int64_t)) { 77 return false; 78 } 79 // FUZZ g711 80 AudioBufferAacEncDemo* aDecBufferDemo = new AudioBufferAacEncDemo(); 81 aDecBufferDemo->InitFile("g711"); 82 bool ret = aDecBufferDemo->RunCase(data, size); 83 delete aDecBufferDemo; 84 return ret; 85} 86 87bool AudioEncoderLBVCFuzzTest(const uint8_t *data, size_t size) 88{ 89 if (size < sizeof(int64_t)) { 90 return false; 91 } 92 // FUZZ lbvc 93 AudioBufferAacEncDemo* aDecBufferDemo = new AudioBufferAacEncDemo(); 94 aDecBufferDemo->InitFile("lbvc"); 95 bool ret = aDecBufferDemo->RunCase(data, size); 96 delete aDecBufferDemo; 97 return ret; 98} 99 100bool AudioEncoderFLACFuzzTest(const uint8_t *data, size_t size) 101{ 102 if (size < sizeof(int64_t)) { 103 return false; 104 } 105 // FUZZ flac 106 AudioBufferAacEncDemo* aDecBufferDemo = new AudioBufferAacEncDemo(); 107 aDecBufferDemo->InitFile("flac"); 108 bool ret = aDecBufferDemo->RunCase(data, size); 109 delete aDecBufferDemo; 110 return ret; 111} 112 113bool AudioEncoderAMRNBFuzzTest(const uint8_t *data, size_t size) 114{ 115 if (size < sizeof(int64_t)) { 116 return false; 117 } 118 // FUZZ amrnb 119 AudioBufferAacEncDemo* aDecBufferDemo = new AudioBufferAacEncDemo(); 120 aDecBufferDemo->InitFile("amrnb"); 121 bool ret = aDecBufferDemo->RunCase(data, size); 122 delete aDecBufferDemo; 123 return ret; 124} 125 126bool AudioEncoderAMRWBFuzzTest(const uint8_t *data, size_t size) 127{ 128 if (size < sizeof(int64_t)) { 129 return false; 130 } 131 // FUZZ amrwb 132 AudioBufferAacEncDemo* aDecBufferDemo = new AudioBufferAacEncDemo(); 133 aDecBufferDemo->InitFile("amrwb"); 134 bool ret = aDecBufferDemo->RunCase(data, size); 135 delete aDecBufferDemo; 136 return ret; 137} 138 139bool AudioEncoderMP3FuzzTest(const uint8_t *data, size_t size) 140{ 141 if (size < sizeof(int64_t)) { 142 return false; 143 } 144 // FUZZ mp3 145 AudioBufferAacEncDemo* aDecBufferDemo = new AudioBufferAacEncDemo(); 146 aDecBufferDemo->InitFile("mp3"); 147 bool ret = aDecBufferDemo->RunCase(data, size); 148 delete aDecBufferDemo; 149 return ret; 150} 151 152} // namespace OHOS 153 154/* Fuzzer entry point */ 155extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 156{ 157 /* Run your code on data */ 158 OHOS::AudioEncoderFuzzTest(data, size); 159 OHOS::AudioEncoderAACFuzzTest(data, size); 160 OHOS::AudioEncoderG711FuzzTest(data, size); 161 OHOS::AudioEncoderOPUSFuzzTest(data, size); 162 OHOS::AudioEncoderLBVCFuzzTest(data, size); 163 OHOS::AudioEncoderFLACFuzzTest(data, size); 164 OHOS::AudioEncoderAMRNBFuzzTest(data, size); 165 OHOS::AudioEncoderAMRWBFuzzTest(data, size); 166 OHOS::AudioEncoderMP3FuzzTest(data, size); 167 return 0; 168} 169