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 "mediacodecdecoderadapterimpl_fuzzer.h"
17
18 #include <cstring>
19
20 #include "avsharedmemory.h"
21 #include "avsharedmemorybase.h"
22 #include "media_codec_decoder_adapter_impl.h"
23
24 using namespace OHOS::NWeb;
25
26 namespace OHOS {
27 class DecoderCallbackAdapterMock : public DecoderCallbackAdapter {
28 public:
29 DecoderCallbackAdapterMock() = default;
30
31 ~DecoderCallbackAdapterMock() override = default;
32
OnError(ErrorType errorType,int32_t errorCode)33 void OnError(ErrorType errorType, int32_t errorCode) override {}
34
OnStreamChanged(int32_t width,int32_t height,double frameRate)35 void OnStreamChanged(int32_t width, int32_t height, double frameRate) 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)39 void OnNeedOutputData(uint32_t index, std::shared_ptr<BufferInfoAdapter> info, BufferFlag flag) override {}
40 };
41
42 class DecoderFormatAdapterMock : public DecoderFormatAdapter {
43 public:
44 DecoderFormatAdapterMock() = 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
GetFrameRate()56 double GetFrameRate() override
57 {
58 return frameRate;
59 }
60
SetWidth(int32_t w)61 void SetWidth(int32_t w) override
62 {
63 width = w;
64 }
65
SetHeight(int32_t h)66 void SetHeight(int32_t h) override
67 {
68 height = h;
69 }
70
SetFrameRate(double fr)71 void SetFrameRate(double fr) override
72 {
73 frameRate = fr;
74 }
75
76 int32_t width;
77 int32_t height;
78 double frameRate;
79 };
80
MediaCodecDecoderAdapterImplFuzzTest(const uint8_t * data,size_t size)81 bool MediaCodecDecoderAdapterImplFuzzTest(const uint8_t* data, size_t size)
82 {
83 NWeb::MediaCodecDecoderAdapterImpl mediaCodecDecoderAdapterImpl;
84 NWeb::DecoderAdapterCode code = mediaCodecDecoderAdapterImpl.CreateVideoDecoderByMime("testmimeType");
85 std::shared_ptr<NWeb::DecoderFormatAdapter> format = std::make_unique<DecoderFormatAdapterMock>();
86 AVCodecBufferInfo info;
87 code = mediaCodecDecoderAdapterImpl.CreateVideoDecoderByName("testname");
88 code = mediaCodecDecoderAdapterImpl.ConfigureDecoder(format);
89 code = mediaCodecDecoderAdapterImpl.SetParameterDecoder(format);
90
91 void* window = nullptr;
92 code = mediaCodecDecoderAdapterImpl.SetOutputSurface(window);
93 code = mediaCodecDecoderAdapterImpl.PrepareDecoder();
94 code = mediaCodecDecoderAdapterImpl.StartDecoder();
95 code = mediaCodecDecoderAdapterImpl.StopDecoder();
96 code = mediaCodecDecoderAdapterImpl.FlushDecoder();
97 code = mediaCodecDecoderAdapterImpl.ResetDecoder();
98 code = mediaCodecDecoderAdapterImpl.ReleaseDecoder();
99
100 code = mediaCodecDecoderAdapterImpl.QueueInputBufferDec(0, 0, 0, 0, BufferFlag::CODEC_BUFFER_FLAG_NONE);
101
102 code = mediaCodecDecoderAdapterImpl.GetOutputFormatDec(format);
103
104 code = mediaCodecDecoderAdapterImpl.ReleaseOutputBufferDec(0, true);
105
106 std::shared_ptr<NWeb::DecoderCallbackImpl> decoderCallback = std::make_shared<NWeb::DecoderCallbackImpl>(nullptr);
107
108 decoderCallback->OnError(OHOS::MediaAVCodec::AVCodecErrorType::AVCODEC_ERROR_INTERNAL, 0);
109 decoderCallback->OnOutputFormatChanged(OHOS::MediaAVCodec::Format());
110 decoderCallback->OnInputBufferAvailable(0, nullptr);
111 decoderCallback->OnOutputBufferAvailable(0, OHOS::MediaAVCodec::AVCodecBufferInfo(),
112 OHOS::MediaAVCodec::AVCodecBufferFlag::AVCODEC_BUFFER_FLAG_NONE, nullptr);
113
114 std::shared_ptr<NWeb::DecoderCallbackAdapter> callback = std::make_shared<DecoderCallbackAdapterMock>();
115 std::shared_ptr<NWeb::DecoderCallbackImpl> decoderCallbackNoNull =
116 std::make_shared<NWeb::DecoderCallbackImpl>(callback);
117 decoderCallbackNoNull->OnError(OHOS::MediaAVCodec::AVCodecErrorType::AVCODEC_ERROR_INTERNAL, 0);
118 decoderCallbackNoNull->OnOutputFormatChanged(OHOS::MediaAVCodec::Format());
119 decoderCallbackNoNull->OnOutputBufferAvailable(
120 0, info, OHOS::MediaAVCodec::AVCodecBufferFlag::AVCODEC_BUFFER_FLAG_NONE, nullptr);
121 std::shared_ptr<Media::AVSharedMemory> memory = std::make_shared<Media::AVSharedMemoryBase>(1, 1.0, "test");
122 decoderCallbackNoNull->OnInputBufferAvailable(1, memory);
123 return true;
124 }
125 } // namespace OHOS
126
127 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)128 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
129 {
130 /* Run your code on data */
131 OHOS::MediaCodecDecoderAdapterImplFuzzTest(data, size);
132 return 0;
133 }