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