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 }