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 <fuzzer/FuzzedDataProvider.h>
16 #include "mediacodecencoderadapterimpl_fuzzer.h"
17
18 #include "avsharedmemory.h"
19 #include "avsharedmemorybase.h"
20 #include "media_codec_encoder_adapter_impl.h"
21
22 using namespace OHOS::NWeb;
23
24 namespace OHOS {
25 constexpr uint8_t MAX_STRING_LENGTH = 255;
26
27 class EncoderCallbackAdapterMock : public CodecCallbackAdapter {
28 public:
29 EncoderCallbackAdapterMock() = default;
30
31 ~EncoderCallbackAdapterMock() override = default;
32
OnError(ErrorType errorType,int32_t errorCode)33 void OnError(ErrorType errorType, int32_t errorCode) override {}
34
OnStreamChanged(const std::shared_ptr<CodecFormatAdapter> formatApadter_)35 void OnStreamChanged(const std::shared_ptr<CodecFormatAdapter> formatApadter_) override {}
36
OnNeedInputData(uint32_t index,std::shared_ptr<OhosBufferAdapter> buffer)37 void OnNeedInputData(uint32_t index, std::shared_ptr<OhosBufferAdapter> buffer) override {}
38
OnNeedOutputData(uint32_t index,std::shared_ptr<BufferInfoAdapter> info,BufferFlag flag,std::shared_ptr<OhosBufferAdapter> buffer)39 void OnNeedOutputData(uint32_t index, std::shared_ptr<BufferInfoAdapter> info, BufferFlag flag,
40 std::shared_ptr<OhosBufferAdapter> buffer) override
41 {}
42 };
43
44 class CodecConfigParaAdapterMock : public CodecConfigParaAdapter {
45 public:
46 CodecConfigParaAdapterMock() = default;
47
GetWidth()48 int32_t GetWidth() override
49 {
50 return width;
51 }
52
GetHeight()53 int32_t GetHeight() override
54 {
55 return height;
56 }
57
GetBitRate()58 int64_t GetBitRate() override
59 {
60 return bitRate;
61 }
62
GetFrameRate()63 double GetFrameRate() override
64 {
65 return frameRate;
66 }
67
68 int32_t width;
69 int32_t height;
70 int64_t bitRate;
71 double frameRate;
72 };
73
CreateLocationProxyAdapterFuzzTest(const uint8_t * data,size_t size)74 bool CreateLocationProxyAdapterFuzzTest(const uint8_t* data, size_t size)
75 {
76 NWeb::MediaCodecEncoderAdapterImpl mediaCodecEncoderAdapterImpl;
77 std::shared_ptr<NWeb::CodecCallbackAdapter> callbackImpl = std::make_shared<EncoderCallbackAdapterMock>();
78 std::shared_ptr<NWeb::CodecConfigParaAdapter> config = std::make_shared<CodecConfigParaAdapterMock>();
79
80 FuzzedDataProvider dataProvider(data, size);
81 std::string mimeParam = dataProvider.ConsumeRandomLengthString(MAX_STRING_LENGTH);
82 mediaCodecEncoderAdapterImpl.CreateVideoCodecByMime(mimeParam);
83 mediaCodecEncoderAdapterImpl.SetCodecCallback(nullptr);
84 mediaCodecEncoderAdapterImpl.SetCodecCallback(callbackImpl);
85 mediaCodecEncoderAdapterImpl.Configure(nullptr);
86 mediaCodecEncoderAdapterImpl.Configure(config);
87 mediaCodecEncoderAdapterImpl.Prepare();
88 mediaCodecEncoderAdapterImpl.Start();
89 mediaCodecEncoderAdapterImpl.Stop();
90 mediaCodecEncoderAdapterImpl.Reset();
91 mediaCodecEncoderAdapterImpl.Release();
92 mediaCodecEncoderAdapterImpl.CreateInputSurface();
93 mediaCodecEncoderAdapterImpl.ReleaseOutputBuffer(0, true);
94 mediaCodecEncoderAdapterImpl.RequestKeyFrameSoon();
95 mediaCodecEncoderAdapterImpl.GetErrorType(AVCodecErrorType::AVCODEC_ERROR_INTERNAL);
96 mediaCodecEncoderAdapterImpl.GetBufferFlag(AVCodecBufferFlag::AVCODEC_BUFFER_FLAG_NONE);
97
98 std::shared_ptr<NWeb::CodecCallbackAdapter> cb = nullptr;
99 std::shared_ptr<Media::AVSharedMemory> memory = std::make_shared<Media::AVSharedMemoryBase>(1, 1.0, "test");
100
101 NWeb::EncoderCallbackImpl encoderCallback(cb);
102
103 encoderCallback.OnError(OHOS::MediaAVCodec::AVCodecErrorType::AVCODEC_ERROR_INTERNAL, 0);
104 encoderCallback.OnOutputFormatChanged(OHOS::MediaAVCodec::Format());
105 encoderCallback.OnInputBufferAvailable(0, nullptr);
106 encoderCallback.OnInputBufferAvailable(1, memory);
107 encoderCallback.OnOutputBufferAvailable(0, OHOS::MediaAVCodec::AVCodecBufferInfo(),
108 OHOS::MediaAVCodec::AVCodecBufferFlag::AVCODEC_BUFFER_FLAG_NONE, nullptr);
109
110 return true;
111 }
112 } // namespace OHOS
113
114 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)115 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
116 {
117 /* Run your code on data */
118 OHOS::CreateLocationProxyAdapterFuzzTest(data, size);
119 return 0;
120 }