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 <cstddef>
16 #include <cstdint>
17 
18 #include "native_avcodec_videoencoder.h"
19 #include "native_averrors.h"
20 #include "native_avcodec_base.h"
21 #include "native_avcapability.h"
22 #include "videoenc_api11_sample.h"
23 using namespace std;
24 using namespace OHOS;
25 using namespace OHOS::Media;
26 #define FUZZ_PROJECT_NAME "encoderapi11_fuzzer"
27 
RunNormalEncoder()28 void RunNormalEncoder()
29 {
30     auto vEncSample = make_unique<VEncAPI11FuzzSample>();
31     vEncSample->CreateVideoEncoder();
32     vEncSample->SetVideoEncoderCallback();
33     vEncSample->ConfigureVideoEncoder();
34     vEncSample->StartVideoEncoder();
35     vEncSample->WaitForEOS();
36 
37     auto vEncSampleSurf = make_unique<VEncAPI11FuzzSample>();
38     vEncSample->surfInput = true;
39     vEncSampleSurf->CreateVideoEncoder();
40     vEncSampleSurf->SetVideoEncoderCallback();
41     vEncSampleSurf->ConfigureVideoEncoder();
42     vEncSampleSurf->StartVideoEncoder();
43     vEncSampleSurf->WaitForEOS();
44 }
45 
46 bool g_needRunNormalEncoder = true;
47 namespace OHOS {
EncoderAPI11FuzzTest(const uint8_t * data,size_t size)48 bool EncoderAPI11FuzzTest(const uint8_t *data, size_t size)
49 {
50     if (size < sizeof(int32_t)) {
51         return false;
52     }
53     if (g_needRunNormalEncoder) {
54         g_needRunNormalEncoder = false;
55         RunNormalEncoder();
56     }
57     bool result = false;
58     int32_t data2 = *reinterpret_cast<const int32_t *>(data);
59     VEncAPI11FuzzSample *vEncSample = new VEncAPI11FuzzSample();
60 
61     vEncSample->CreateVideoEncoder();
62     vEncSample->SetVideoEncoderCallback();
63     vEncSample->fuzzMode = true;
64     vEncSample->ConfigureVideoEncoderFuzz(data2);
65     vEncSample->StartVideoEncoder();
66     vEncSample->SetParameter(data2);
67     vEncSample->WaitForEOS();
68     delete vEncSample;
69 
70     vEncSample = new VEncAPI11FuzzSample();
71     vEncSample->CreateVideoEncoder();
72     vEncSample->SetVideoEncoderCallback();
73     vEncSample->surfInput = true;
74     vEncSample->ConfigureVideoEncoderFuzz(data2);
75     vEncSample->StartVideoEncoder();
76     vEncSample->SetParameter(data2);
77     vEncSample->WaitForEOS();
78     delete vEncSample;
79 
80     return result;
81 }
82 } // namespace OHOS
83 
84 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)85 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
86 {
87     /* Run your code on data */
88     OHOS::EncoderAPI11FuzzTest(data, size);
89     return 0;
90 }
91