• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_description_demo.h"
22 #define FUZZ_PROJECT_NAME "audiodecoderdescription_fuzzer"
23 
24 using namespace std;
25 using namespace OHOS::MediaAVCodec;
26 using namespace OHOS;
27 using namespace OHOS::MediaAVCodec::AudioBufferDemo;
28 
29 namespace OHOS {
30 
AudioDecoderFuzzTest(const uint8_t * data,size_t size)31 bool 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 
49 /*OutputDescription*/
AudioDecoderAACDescriptionFuzzTest(const uint8_t * data,size_t size)50 bool AudioDecoderAACDescriptionFuzzTest(const uint8_t *data, size_t size)
51 {
52     if (size < sizeof(int64_t)) {
53         return false;
54     }
55     // FUZZ lbvc
56     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
57     aDecBufferDemo->InitFile("aac");
58     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
59     delete aDecBufferDemo;
60     return res;
61 }
62 
AudioDecoderFlacDescriptionFuzzTest(const uint8_t * data,size_t size)63 bool AudioDecoderFlacDescriptionFuzzTest(const uint8_t *data, size_t size)
64 {
65     if (size < sizeof(int64_t)) {
66         return false;
67     }
68     // FUZZ flac
69     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
70     aDecBufferDemo->InitFile("flac");
71     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
72     delete aDecBufferDemo;
73     return res;
74 }
75 
AudioDecoderVORBISDescriptionFuzzTest(const uint8_t * data,size_t size)76 bool AudioDecoderVORBISDescriptionFuzzTest(const uint8_t *data, size_t size)
77 {
78     if (size < sizeof(int64_t)) {
79         return false;
80     }
81     // FUZZ vorbis
82     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
83     aDecBufferDemo->InitFile("vorbis");
84     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
85     delete aDecBufferDemo;
86     return res;
87 }
88 
AudioDecoderAMRNBDescriptionFuzzTest(const uint8_t * data,size_t size)89 bool AudioDecoderAMRNBDescriptionFuzzTest(const uint8_t *data, size_t size)
90 {
91     if (size < sizeof(int64_t)) {
92         return false;
93     }
94     // FUZZ amrnb
95     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
96     aDecBufferDemo->InitFile("amrnb");
97     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
98     delete aDecBufferDemo;
99     return res;
100 }
101 
AudioDecoderAMRWBDescriptionFuzzTest(const uint8_t * data,size_t size)102 bool AudioDecoderAMRWBDescriptionFuzzTest(const uint8_t *data, size_t size)
103 {
104     if (size < sizeof(int64_t)) {
105         return false;
106     }
107     // FUZZ amrwb
108     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
109     aDecBufferDemo->InitFile("amrwb");
110     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
111     delete aDecBufferDemo;
112     return res;
113 }
114 
AudioDecoderVividDescriptionFuzzTest(const uint8_t * data,size_t size)115 bool AudioDecoderVividDescriptionFuzzTest(const uint8_t *data, size_t size)
116 {
117     if (size < sizeof(int64_t)) {
118         return false;
119     }
120     // FUZZ vivid
121     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
122     aDecBufferDemo->InitFile("vivid");
123     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
124     delete aDecBufferDemo;
125     return res;
126 }
127 
AudioDecoderOPUSDescriptionFuzzTest(const uint8_t * data,size_t size)128 bool AudioDecoderOPUSDescriptionFuzzTest(const uint8_t *data, size_t size)
129 {
130     if (size < sizeof(int64_t)) {
131         return false;
132     }
133     // FUZZ opus
134     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
135     aDecBufferDemo->InitFile("opus");
136     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
137     delete aDecBufferDemo;
138     return res;
139 }
140 
AudioDecoderG711DescriptionFuzzTest(const uint8_t * data,size_t size)141 bool AudioDecoderG711DescriptionFuzzTest(const uint8_t *data, size_t size)
142 {
143     if (size < sizeof(int64_t)) {
144         return false;
145     }
146     // FUZZ g711
147     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
148     aDecBufferDemo->InitFile("g711mu");
149     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
150     delete aDecBufferDemo;
151     return res;
152 }
153 
AudioDecoderAPEDescriptionFuzzTest(const uint8_t * data,size_t size)154 bool AudioDecoderAPEDescriptionFuzzTest(const uint8_t *data, size_t size)
155 {
156     if (size < sizeof(int64_t)) {
157         return false;
158     }
159     // FUZZ ape
160     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
161     aDecBufferDemo->InitFile("ape");
162     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
163     delete aDecBufferDemo;
164     return res;
165 }
166 
AudioDecoderLBVCDescriptionFuzzTest(const uint8_t * data,size_t size)167 bool AudioDecoderLBVCDescriptionFuzzTest(const uint8_t *data, size_t size)
168 {
169     if (size < sizeof(int64_t)) {
170         return false;
171     }
172     // FUZZ lbvc
173     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
174     aDecBufferDemo->InitFile("lbvc");
175     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
176     delete aDecBufferDemo;
177     return res;
178 }
179 
AudioDecoderMP3DescriptionFuzzTest(const uint8_t * data,size_t size)180 bool AudioDecoderMP3DescriptionFuzzTest(const uint8_t *data, size_t size)
181 {
182     if (size < sizeof(int64_t)) {
183         return false;
184     }
185     // FUZZ lbvc
186     ADecBufferDemo* aDecBufferDemo = new ADecBufferDemo();
187     aDecBufferDemo->InitFile("mp3");
188     auto res = aDecBufferDemo->CheckGetOutputDescription(data, size);
189     delete aDecBufferDemo;
190     return res;
191 }
192 
193 }
194 
195 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)196 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
197 {
198     /* Run your code on data */
199     OHOS::AudioDecoderFuzzTest(data, size);
200     OHOS::AudioDecoderAACDescriptionFuzzTest(data, size);
201     OHOS::AudioDecoderFlacDescriptionFuzzTest(data, size);
202     OHOS::AudioDecoderAPEDescriptionFuzzTest(data, size);
203     OHOS::AudioDecoderG711DescriptionFuzzTest(data, size);
204     OHOS::AudioDecoderOPUSDescriptionFuzzTest(data, size);
205     OHOS::AudioDecoderLBVCDescriptionFuzzTest(data, size);
206     OHOS::AudioDecoderVividDescriptionFuzzTest(data, size);
207     OHOS::AudioDecoderAMRNBDescriptionFuzzTest(data, size);
208     OHOS::AudioDecoderAMRWBDescriptionFuzzTest(data, size);
209     OHOS::AudioDecoderMP3DescriptionFuzzTest(data, size);
210     return 0;
211 }