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