1da853ecaSopenharmony_ci/*
2da853ecaSopenharmony_ci * Copyright (C) 2024 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#include <atomic>
16da853ecaSopenharmony_ci#include <iostream>
17da853ecaSopenharmony_ci#include <fstream>
18da853ecaSopenharmony_ci#include <queue>
19da853ecaSopenharmony_ci#include <string>
20da853ecaSopenharmony_ci#include <thread>
21da853ecaSopenharmony_ci#include "audiodecoderdemo.h"
22da853ecaSopenharmony_ci#define FUZZ_PROJECT_NAME "audiodecoderpreapiflush_fuzzer"
23da853ecaSopenharmony_ci
24da853ecaSopenharmony_ciusing namespace std;
25da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec;
26da853ecaSopenharmony_ciusing namespace OHOS;
27da853ecaSopenharmony_ciusing namespace OHOS::MediaAVCodec::AudioDemoAuto;
28da853ecaSopenharmony_ci
29da853ecaSopenharmony_cinamespace OHOS {
30da853ecaSopenharmony_cibool AudioDecoderAACFlushFuzzTest(const uint8_t *data, size_t size)
31da853ecaSopenharmony_ci{
32da853ecaSopenharmony_ci    if (size < sizeof(int64_t)) {
33da853ecaSopenharmony_ci        return false;
34da853ecaSopenharmony_ci    }
35da853ecaSopenharmony_ci    // FUZZ aac
36da853ecaSopenharmony_ci    ADecDemoAuto* aDecBufferDemo = new ADecDemoAuto();
37da853ecaSopenharmony_ci    aDecBufferDemo->InitFile("aac");
38da853ecaSopenharmony_ci    auto res = aDecBufferDemo->RunCaseFlush(data, size);
39da853ecaSopenharmony_ci    delete aDecBufferDemo;
40da853ecaSopenharmony_ci    return res;
41da853ecaSopenharmony_ci}
42da853ecaSopenharmony_ci
43da853ecaSopenharmony_cibool AudioDecoderFlacFlushFuzzTest(const uint8_t *data, size_t size)
44da853ecaSopenharmony_ci{
45da853ecaSopenharmony_ci    if (size < sizeof(int64_t)) {
46da853ecaSopenharmony_ci        return false;
47da853ecaSopenharmony_ci    }
48da853ecaSopenharmony_ci    // FUZZ flac
49da853ecaSopenharmony_ci    ADecDemoAuto* aDecBufferDemo = new ADecDemoAuto();
50da853ecaSopenharmony_ci    aDecBufferDemo->InitFile("flac");
51da853ecaSopenharmony_ci    auto res = aDecBufferDemo->RunCaseFlush(data, size);
52da853ecaSopenharmony_ci    delete aDecBufferDemo;
53da853ecaSopenharmony_ci    return res;
54da853ecaSopenharmony_ci}
55da853ecaSopenharmony_ci
56da853ecaSopenharmony_cibool AudioDecoderVORBISFlushFuzzTest(const uint8_t *data, size_t size)
57da853ecaSopenharmony_ci{
58da853ecaSopenharmony_ci    if (size < sizeof(int64_t)) {
59da853ecaSopenharmony_ci        return false;
60da853ecaSopenharmony_ci    }
61da853ecaSopenharmony_ci    // FUZZ vorbis
62da853ecaSopenharmony_ci    ADecDemoAuto* aDecBufferDemo = new ADecDemoAuto();
63da853ecaSopenharmony_ci    aDecBufferDemo->InitFile("vorbis");
64da853ecaSopenharmony_ci    auto res = aDecBufferDemo->RunCaseFlush(data, size);
65da853ecaSopenharmony_ci    delete aDecBufferDemo;
66da853ecaSopenharmony_ci    return res;
67da853ecaSopenharmony_ci}
68da853ecaSopenharmony_ci
69da853ecaSopenharmony_cibool AudioDecoderAMRNBFlushFuzzTest(const uint8_t *data, size_t size)
70da853ecaSopenharmony_ci{
71da853ecaSopenharmony_ci    if (size < sizeof(int64_t)) {
72da853ecaSopenharmony_ci        return false;
73da853ecaSopenharmony_ci    }
74da853ecaSopenharmony_ci    // FUZZ amrnb
75da853ecaSopenharmony_ci    ADecDemoAuto* aDecBufferDemo = new ADecDemoAuto();
76da853ecaSopenharmony_ci    aDecBufferDemo->InitFile("amrnb");
77da853ecaSopenharmony_ci    auto res = aDecBufferDemo->RunCaseFlush(data, size);
78da853ecaSopenharmony_ci    delete aDecBufferDemo;
79da853ecaSopenharmony_ci    return res;
80da853ecaSopenharmony_ci}
81da853ecaSopenharmony_ci
82da853ecaSopenharmony_cibool AudioDecoderAMRWBFlushFuzzTest(const uint8_t *data, size_t size)
83da853ecaSopenharmony_ci{
84da853ecaSopenharmony_ci    if (size < sizeof(int64_t)) {
85da853ecaSopenharmony_ci        return false;
86da853ecaSopenharmony_ci    }
87da853ecaSopenharmony_ci    // FUZZ amrwb
88da853ecaSopenharmony_ci    ADecDemoAuto* aDecBufferDemo = new ADecDemoAuto();
89da853ecaSopenharmony_ci    aDecBufferDemo->InitFile("amrwb");
90da853ecaSopenharmony_ci    auto res = aDecBufferDemo->RunCaseFlush(data, size);
91da853ecaSopenharmony_ci    delete aDecBufferDemo;
92da853ecaSopenharmony_ci    return res;
93da853ecaSopenharmony_ci}
94da853ecaSopenharmony_ci
95da853ecaSopenharmony_cibool AudioDecoderOPUSFlushFuzzTest(const uint8_t *data, size_t size)
96da853ecaSopenharmony_ci{
97da853ecaSopenharmony_ci    if (size < sizeof(int64_t)) {
98da853ecaSopenharmony_ci        return false;
99da853ecaSopenharmony_ci    }
100da853ecaSopenharmony_ci    // FUZZ opus
101da853ecaSopenharmony_ci    ADecDemoAuto* aDecBufferDemo = new ADecDemoAuto();
102da853ecaSopenharmony_ci    aDecBufferDemo->InitFile("opus");
103da853ecaSopenharmony_ci    auto res = aDecBufferDemo->RunCaseFlush(data, size);
104da853ecaSopenharmony_ci    delete aDecBufferDemo;
105da853ecaSopenharmony_ci    return res;
106da853ecaSopenharmony_ci}
107da853ecaSopenharmony_ci
108da853ecaSopenharmony_cibool AudioDecoderG711FlushFuzzTest(const uint8_t *data, size_t size)
109da853ecaSopenharmony_ci{
110da853ecaSopenharmony_ci    if (size < sizeof(int64_t)) {
111da853ecaSopenharmony_ci        return false;
112da853ecaSopenharmony_ci    }
113da853ecaSopenharmony_ci    // FUZZ g711
114da853ecaSopenharmony_ci    ADecDemoAuto* aDecBufferDemo = new ADecDemoAuto();
115da853ecaSopenharmony_ci    aDecBufferDemo->InitFile("g711mu");
116da853ecaSopenharmony_ci    auto res = aDecBufferDemo->RunCaseFlush(data, size);
117da853ecaSopenharmony_ci    delete aDecBufferDemo;
118da853ecaSopenharmony_ci    return res;
119da853ecaSopenharmony_ci}
120da853ecaSopenharmony_ci
121da853ecaSopenharmony_cibool AudioDecoderMP3FlushFuzzTest(const uint8_t *data, size_t size)
122da853ecaSopenharmony_ci{
123da853ecaSopenharmony_ci    if (size < sizeof(int64_t)) {
124da853ecaSopenharmony_ci        return false;
125da853ecaSopenharmony_ci    }
126da853ecaSopenharmony_ci    // FUZZ mp3
127da853ecaSopenharmony_ci    ADecDemoAuto* aDecBufferDemo = new ADecDemoAuto();
128da853ecaSopenharmony_ci    aDecBufferDemo->InitFile("mp3");
129da853ecaSopenharmony_ci    auto res = aDecBufferDemo->RunCaseFlush(data, size);
130da853ecaSopenharmony_ci    delete aDecBufferDemo;
131da853ecaSopenharmony_ci    return res;
132da853ecaSopenharmony_ci}
133da853ecaSopenharmony_ci
134da853ecaSopenharmony_ci}
135da853ecaSopenharmony_ci
136da853ecaSopenharmony_ci/* Fuzzer entry point */
137da853ecaSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
138da853ecaSopenharmony_ci{
139da853ecaSopenharmony_ci    /* Run your code on data */
140da853ecaSopenharmony_ci    OHOS::AudioDecoderAACFlushFuzzTest(data, size);
141da853ecaSopenharmony_ci    OHOS::AudioDecoderFlacFlushFuzzTest(data, size);
142da853ecaSopenharmony_ci    OHOS::AudioDecoderG711FlushFuzzTest(data, size);
143da853ecaSopenharmony_ci    OHOS::AudioDecoderVORBISFlushFuzzTest(data, size);
144da853ecaSopenharmony_ci    OHOS::AudioDecoderAMRNBFlushFuzzTest(data, size);
145da853ecaSopenharmony_ci    OHOS::AudioDecoderAMRWBFlushFuzzTest(data, size);
146da853ecaSopenharmony_ci    OHOS::AudioDecoderMP3FlushFuzzTest(data, size);
147da853ecaSopenharmony_ci    return 0;
148da853ecaSopenharmony_ci}