1 /*
2 * Copyright (c) 2025 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 #include <fuzzer/FuzzedDataProvider.h>
24 #include <fstream>
25 using namespace std;
26 using namespace OHOS;
27 using namespace OHOS::Media;
28 #define FUZZ_PROJECT_NAME "encoderapi11_fuzzer"
29
30 VEncAPI11FuzzSample *g_vEncSample = nullptr;
31
SaveCorpus(const uint8_t * data,size_t size,const std::string & filename)32 void SaveCorpus(const uint8_t *data, size_t size, const std::string& filename)
33 {
34 std::ofstream file(filename, std::ios::out | std::ios::binary);
35 if (file.is_open()) {
36 file.write(reinterpret_cast<const char*>(data), size);
37 file.close();
38 }
39 }
RunNormalEncoder()40 void RunNormalEncoder()
41 {
42 auto vEncSample = make_unique<VEncAPI11FuzzSample>();
43 int32_t ret = vEncSample->CreateVideoEncoder();
44 if (ret != 0) {
45 return;
46 }
47 if (vEncSample->SetVideoEncoderCallback() != AV_ERR_OK) {
48 return;
49 }
50 if (vEncSample->ConfigureVideoEncoder() != AV_ERR_OK) {
51 return;
52 }
53 if (vEncSample->StartVideoEncoder() != AV_ERR_OK) {
54 return;
55 }
56 vEncSample->WaitForEOS();
57
58 auto vEncSampleSurf = make_unique<VEncAPI11FuzzSample>();
59 vEncSampleSurf->surfInput = true;
60 ret = vEncSampleSurf->CreateVideoEncoder();
61 if (ret != 0) {
62 return;
63 }
64 if (vEncSampleSurf->SetVideoEncoderCallback() != AV_ERR_OK) {
65 return;
66 }
67 if (vEncSampleSurf->ConfigureVideoEncoder() != AV_ERR_OK) {
68 return;
69 }
70 if (vEncSampleSurf->StartVideoEncoder() != AV_ERR_OK) {
71 return;
72 }
73 vEncSampleSurf->WaitForEOS();
74 }
75
ReleaseSample()76 bool ReleaseSample()
77 {
78 delete g_vEncSample;
79 g_vEncSample = nullptr;
80 return true;
81 }
82
83 bool g_needRunNormalEncoder = true;
84 namespace OHOS {
EncoderAPI11FuzzTest(const uint8_t * data,size_t size)85 bool EncoderAPI11FuzzTest(const uint8_t *data, size_t size)
86 {
87 if (size < sizeof(int32_t)) {
88 return false;
89 }
90 std::string filename = "/data/test/corpus-EncoderAPI11H26510BitFuzzTest";
91 SaveCorpus(data, size, filename);
92 if (g_needRunNormalEncoder) {
93 g_needRunNormalEncoder = false;
94 RunNormalEncoder();
95 }
96 FuzzedDataProvider fdp(data, size);
97 int data1 = fdp.ConsumeIntegral<int32_t>();
98 bool data2 = fdp.ConsumeBool();
99 g_vEncSample = new VEncAPI11FuzzSample();
100 g_vEncSample->fuzzMode = true;
101 g_vEncSample->fuzzData = data;
102 g_vEncSample->fuzzSize = size;
103 g_vEncSample->surfInput = data2;
104 g_vEncSample->enableRepeat = fdp.ConsumeBool();
105 g_vEncSample->setMaxCount = fdp.ConsumeBool();
106 g_vEncSample->defaultRangeFlag = fdp.ConsumeIntegral<uint32_t>();
107 g_vEncSample->defaultColorPrimaries = fdp.ConsumeIntegral<uint32_t>();
108 g_vEncSample->defaultTransferCharacteristics = fdp.ConsumeIntegral<uint32_t>();
109 g_vEncSample->defaultMatarixCoefficients = fdp.ConsumeIntegral<uint32_t>();
110 g_vEncSample->defaultKeyFrameInterval = fdp.ConsumeIntegral<uint32_t>();
111 g_vEncSample->defaultBitrateMode = fdp.ConsumeIntegral<uint32_t>();
112 g_vEncSample->defaultBitRate = fdp.ConsumeIntegral<uint32_t>();
113 g_vEncSample->defaultQuality = fdp.ConsumeIntegral<uint32_t>();
114 g_vEncSample->defaultFrameAfter = fdp.ConsumeIntegral<int32_t>();
115 g_vEncSample->defaultMaxCount = fdp.ConsumeIntegral<int32_t>();
116 if (g_vEncSample->CreateVideoEncoder() != AV_ERR_OK) {
117 return ReleaseSample();
118 }
119 if (g_vEncSample->SetVideoEncoderCallback() != AV_ERR_OK) {
120 return ReleaseSample();
121 }
122 if (g_vEncSample->ConfigureVideoEncoder() != AV_ERR_OK) {
123 return ReleaseSample();
124 }
125 if (g_vEncSample->StartVideoEncoder() != AV_ERR_OK) {
126 return ReleaseSample();
127 }
128 g_vEncSample->SetParameter(data1);
129 g_vEncSample->WaitForEOS();
130 return ReleaseSample();
131 }
132 } // namespace OHOS
133
134 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)135 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
136 {
137 /* Run your code on data */
138 OHOS::EncoderAPI11FuzzTest(data, size);
139 return 0;
140 }
141