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#include <atomic> 16#include <iostream> 17#include <fstream> 18#include <queue> 19#include <string> 20#include <thread> 21#include "audio_decoder_demo.h" 22#define FUZZ_PROJECT_NAME "audiodecoder_fuzzer" 23 24using namespace std; 25using namespace OHOS::MediaAVCodec; 26using namespace OHOS; 27using namespace OHOS::MediaAVCodec::AudioBufferDemo; 28 29namespace OHOS { 30 31bool AudioDecoderFuzzTest(const uint8_t *data, size_t size) 32{ 33 if (size < sizeof(int64_t)) { 34 return false; 35 } 36 // FUZZ OH_AudioCodec_CreateByMime 37 std::string codecdata(reinterpret_cast<const char*>(data), size); 38 OH_AVCodec *source = OH_AudioCodec_CreateByMime(codecdata.c_str(), true); 39 if (source) { 40 OH_AudioCodec_Destroy(source); 41 } 42 OH_AVCodec *sourcename = OH_AudioCodec_CreateByName(codecdata.c_str()); 43 if (sourcename) { 44 OH_AudioCodec_Destroy(sourcename); 45 } 46 return true; 47} 48 49bool AudioDecoderAACFuzzTest(const uint8_t *data, size_t size) 50{ 51 if (size < sizeof(int64_t)) { 52 return false; 53 } 54 // FUZZ aac 55 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 56 aDecBufferDemo->InitFile("aac"); 57 auto res = aDecBufferDemo->RunCase(data, size); 58 delete aDecBufferDemo; 59 return res; 60} 61 62bool AudioDecoderFlacFuzzTest(const uint8_t *data, size_t size) 63{ 64 if (size < sizeof(int64_t)) { 65 return false; 66 } 67 // FUZZ flac 68 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 69 aDecBufferDemo->InitFile("flac"); 70 auto res = aDecBufferDemo->RunCase(data, size); 71 delete aDecBufferDemo; 72 return res; 73} 74 75bool AudioDecoderVORBISFuzzTest(const uint8_t *data, size_t size) 76{ 77 if (size < sizeof(int64_t)) { 78 return false; 79 } 80 // FUZZ vorbis 81 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 82 aDecBufferDemo->InitFile("vorbis"); 83 auto res = aDecBufferDemo->RunCase(data, size); 84 delete aDecBufferDemo; 85 return res; 86} 87 88bool AudioDecoderAMRNBFuzzTest(const uint8_t *data, size_t size) 89{ 90 if (size < sizeof(int64_t)) { 91 return false; 92 } 93 // FUZZ amrnb 94 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 95 aDecBufferDemo->InitFile("amrnb"); 96 auto res = aDecBufferDemo->RunCase(data, size); 97 delete aDecBufferDemo; 98 return res; 99} 100 101bool AudioDecoderAMRWBFuzzTest(const uint8_t *data, size_t size) 102{ 103 if (size < sizeof(int64_t)) { 104 return false; 105 } 106 // FUZZ amrwb 107 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 108 aDecBufferDemo->InitFile("amrwb"); 109 auto res = aDecBufferDemo->RunCase(data, size); 110 delete aDecBufferDemo; 111 return res; 112} 113 114bool AudioDecoderVividFuzzTest(const uint8_t *data, size_t size) 115{ 116 if (size < sizeof(int64_t)) { 117 return false; 118 } 119 // FUZZ vivid 120 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 121 aDecBufferDemo->InitFile("vivid"); 122 auto res = aDecBufferDemo->RunCase(data, size); 123 delete aDecBufferDemo; 124 return res; 125} 126 127bool AudioDecoderOPUSFuzzTest(const uint8_t *data, size_t size) 128{ 129 if (size < sizeof(int64_t)) { 130 return false; 131 } 132 // FUZZ opus 133 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 134 aDecBufferDemo->InitFile("opus"); 135 auto res = aDecBufferDemo->RunCase(data, size); 136 delete aDecBufferDemo; 137 return res; 138} 139 140bool AudioDecoderG711FuzzTest(const uint8_t *data, size_t size) 141{ 142 if (size < sizeof(int64_t)) { 143 return false; 144 } 145 // FUZZ g711 146 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 147 aDecBufferDemo->InitFile("g711mu"); 148 auto res = aDecBufferDemo->RunCase(data, size); 149 delete aDecBufferDemo; 150 return res; 151} 152 153bool AudioDecoderAPEFuzzTest(const uint8_t *data, size_t size) 154{ 155 if (size < sizeof(int64_t)) { 156 return false; 157 } 158 // FUZZ ape 159 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 160 aDecBufferDemo->InitFile("ape"); 161 auto res = aDecBufferDemo->RunCase(data, size); 162 delete aDecBufferDemo; 163 return res; 164} 165 166bool AudioDecoderLBVCFuzzTest(const uint8_t *data, size_t size) 167{ 168 if (size < sizeof(int64_t)) { 169 return false; 170 } 171 // FUZZ lbvc 172 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 173 aDecBufferDemo->InitFile("lbvc"); 174 auto res = aDecBufferDemo->RunCase(data, size); 175 delete aDecBufferDemo; 176 return res; 177} 178 179bool AudioDecoderMP3FuzzTest(const uint8_t *data, size_t size) 180{ 181 if (size < sizeof(int64_t)) { 182 return false; 183 } 184 // FUZZ lbvc 185 ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo(); 186 aDecBufferDemo->InitFile("mp3"); 187 auto res = aDecBufferDemo->RunCase(data, size); 188 delete aDecBufferDemo; 189 return res; 190} 191} 192 193/* Fuzzer entry point */ 194extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 195{ 196 /* Run your code on data */ 197 OHOS::AudioDecoderFuzzTest(data, size); 198 OHOS::AudioDecoderAACFuzzTest(data, size); 199 OHOS::AudioDecoderFlacFuzzTest(data, size); 200 OHOS::AudioDecoderAPEFuzzTest(data, size); 201 OHOS::AudioDecoderG711FuzzTest(data, size); 202 OHOS::AudioDecoderOPUSFuzzTest(data, size); 203 OHOS::AudioDecoderLBVCFuzzTest(data, size); 204 OHOS::AudioDecoderVividFuzzTest(data, size); 205 OHOS::AudioDecoderAMRNBFuzzTest(data, size); 206 OHOS::AudioDecoderAMRWBFuzzTest(data, size); 207 OHOS::AudioDecoderMP3FuzzTest(data, size); 208 OHOS::AudioDecoderVORBISFuzzTest(data, size); 209 return 0; 210}