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