• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }