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 <cstddef>
16da853ecaSopenharmony_ci#include <cstdint>
17da853ecaSopenharmony_ci#include "native_avcodec_videodecoder.h"
18da853ecaSopenharmony_ci#include "native_averrors.h"
19da853ecaSopenharmony_ci#include "native_avcodec_base.h"
20da853ecaSopenharmony_ci#include "videodec_api11_sample.h"
21da853ecaSopenharmony_ciusing namespace std;
22da853ecaSopenharmony_ciusing namespace OHOS;
23da853ecaSopenharmony_ciusing namespace OHOS::Media;
24da853ecaSopenharmony_ci#define FUZZ_PROJECT_NAME "hevcswdecoderapi11_fuzzer"
25da853ecaSopenharmony_ci
26da853ecaSopenharmony_cistatic VDecApi11FuzzSample *g_vDecSample = nullptr;
27da853ecaSopenharmony_ciconstexpr uint32_t DEFAULT_WIDTH = 1920;
28da853ecaSopenharmony_ciconstexpr uint32_t DEFAULT_HEIGHT = 1080;
29da853ecaSopenharmony_ciconstexpr double DEFAULT_FRAME_RATE = 30.0;
30da853ecaSopenharmony_ciconstexpr uint32_t SPS_SIZE = 0x19;
31da853ecaSopenharmony_ciconstexpr uint32_t PPS_SIZE = 0x05;
32da853ecaSopenharmony_ciconstexpr uint32_t START_CODE_SIZE = 4;
33da853ecaSopenharmony_ciconstexpr uint8_t SPS[SPS_SIZE + START_CODE_SIZE] = {0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x28, 0xAC,
34da853ecaSopenharmony_ci                                                     0xB4, 0x03, 0xC0, 0x11, 0x3F, 0x2E, 0x02, 0x20, 0x00,
35da853ecaSopenharmony_ci                                                     0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x07, 0x81, 0xE3,
36da853ecaSopenharmony_ci                                                     0x06, 0x54};
37da853ecaSopenharmony_ciconstexpr uint8_t PPS[PPS_SIZE + START_CODE_SIZE] = {0x00, 0x00, 0x00, 0x01, 0x68, 0xEF, 0x0F, 0x2C, 0x8B};
38da853ecaSopenharmony_cibool g_isSurfMode = true;
39da853ecaSopenharmony_ci
40da853ecaSopenharmony_cinamespace OHOS {
41da853ecaSopenharmony_ci
42da853ecaSopenharmony_civoid RunNormalDecoder()
43da853ecaSopenharmony_ci{
44da853ecaSopenharmony_ci    VDecApi11FuzzSample *vDecSample = new VDecApi11FuzzSample();
45da853ecaSopenharmony_ci    vDecSample->defaultWidth = DEFAULT_WIDTH;
46da853ecaSopenharmony_ci    vDecSample->defaultHeight = DEFAULT_HEIGHT;
47da853ecaSopenharmony_ci    vDecSample->defaultFrameRate = DEFAULT_FRAME_RATE;
48da853ecaSopenharmony_ci    vDecSample->CreateVideoDecoder();
49da853ecaSopenharmony_ci    vDecSample->ConfigureVideoDecoder();
50da853ecaSopenharmony_ci    vDecSample->SetVideoDecoderCallback();
51da853ecaSopenharmony_ci    vDecSample->StartVideoDecoder();
52da853ecaSopenharmony_ci    vDecSample->WaitForEOS();
53da853ecaSopenharmony_ci    delete vDecSample;
54da853ecaSopenharmony_ci
55da853ecaSopenharmony_ci    vDecSample = new VDecApi11FuzzSample();
56da853ecaSopenharmony_ci    vDecSample->isSurfMode = true;
57da853ecaSopenharmony_ci    vDecSample->defaultWidth = DEFAULT_WIDTH;
58da853ecaSopenharmony_ci    vDecSample->defaultHeight = DEFAULT_HEIGHT;
59da853ecaSopenharmony_ci    vDecSample->defaultFrameRate = DEFAULT_FRAME_RATE;
60da853ecaSopenharmony_ci    vDecSample->CreateVideoDecoder();
61da853ecaSopenharmony_ci    vDecSample->ConfigureVideoDecoder();
62da853ecaSopenharmony_ci    vDecSample->SetVideoDecoderCallback();
63da853ecaSopenharmony_ci    vDecSample->StartVideoDecoder();
64da853ecaSopenharmony_ci    vDecSample->WaitForEOS();
65da853ecaSopenharmony_ci    delete vDecSample;
66da853ecaSopenharmony_ci}
67da853ecaSopenharmony_ci
68da853ecaSopenharmony_cibool g_needRunNormalDecoder = true;
69da853ecaSopenharmony_cibool HwdecoderApi11FuzzTest(const uint8_t *data, size_t size)
70da853ecaSopenharmony_ci{
71da853ecaSopenharmony_ci    if (size < sizeof(int32_t)) {
72da853ecaSopenharmony_ci        return false;
73da853ecaSopenharmony_ci    }
74da853ecaSopenharmony_ci
75da853ecaSopenharmony_ci    if (g_needRunNormalDecoder) {
76da853ecaSopenharmony_ci        g_needRunNormalDecoder = false;
77da853ecaSopenharmony_ci        RunNormalDecoder();
78da853ecaSopenharmony_ci    }
79da853ecaSopenharmony_ci    int32_t data_ = *reinterpret_cast<const int32_t *>(data);
80da853ecaSopenharmony_ci    if (!g_vDecSample) {
81da853ecaSopenharmony_ci        g_vDecSample = new VDecApi11FuzzSample();
82da853ecaSopenharmony_ci        g_vDecSample->defaultWidth = DEFAULT_WIDTH;
83da853ecaSopenharmony_ci        g_vDecSample->defaultHeight = DEFAULT_HEIGHT;
84da853ecaSopenharmony_ci        g_vDecSample->defaultFrameRate = DEFAULT_FRAME_RATE;
85da853ecaSopenharmony_ci        g_vDecSample->CreateVideoDecoder();
86da853ecaSopenharmony_ci        g_vDecSample->ConfigureVideoDecoder();
87da853ecaSopenharmony_ci        g_vDecSample->SetVideoDecoderCallback();
88da853ecaSopenharmony_ci        g_vDecSample->Start();
89da853ecaSopenharmony_ci        g_vDecSample->InputFuncFUZZ(SPS, SPS_SIZE + START_CODE_SIZE);
90da853ecaSopenharmony_ci        g_vDecSample->InputFuncFUZZ(PPS, PPS_SIZE + START_CODE_SIZE);
91da853ecaSopenharmony_ci    }
92da853ecaSopenharmony_ci    OH_AVErrCode ret = g_vDecSample->InputFuncFUZZ(data, size);
93da853ecaSopenharmony_ci    g_vDecSample->SetParameter(data_);
94da853ecaSopenharmony_ci    if (ret == AV_ERR_NO_MEMORY) {
95da853ecaSopenharmony_ci        g_vDecSample->Flush();
96da853ecaSopenharmony_ci        g_vDecSample->Stop();
97da853ecaSopenharmony_ci        g_vDecSample->Reset();
98da853ecaSopenharmony_ci        delete g_vDecSample;
99da853ecaSopenharmony_ci        g_vDecSample = nullptr;
100da853ecaSopenharmony_ci        return false;
101da853ecaSopenharmony_ci    }
102da853ecaSopenharmony_ci    return true;
103da853ecaSopenharmony_ci}
104da853ecaSopenharmony_ci} // namespace OHOS
105da853ecaSopenharmony_ci
106da853ecaSopenharmony_ci/* Fuzzer entry point */
107da853ecaSopenharmony_ciextern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
108da853ecaSopenharmony_ci{
109da853ecaSopenharmony_ci    /* Run your code on data */
110da853ecaSopenharmony_ci    OHOS::HwdecoderApi11FuzzTest(data, size);
111da853ecaSopenharmony_ci    return 0;
112da853ecaSopenharmony_ci}
113