1 /*
2  * Copyright (C) 2023 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 #ifndef CODECBASE_MOCK_H
17 #define CODECBASE_MOCK_H
18 
19 #include <gmock/gmock.h>
20 #include <map>
21 #include <string>
22 #include "avcodec_common.h"
23 #include "avcodec_errors.h"
24 #include "avcodec_info.h"
25 #include "buffer/avbuffer.h"
26 #include "buffer/avbuffer_queue.h"
27 #include "buffer/avbuffer_queue_consumer.h"
28 #include "buffer/avbuffer_queue_define.h"
29 #include "buffer/avbuffer_queue_producer.h"
30 #include "buffer/avsharedmemorybase.h"
31 #include "foundation/multimedia/drm_framework/services/drm_service/ipc/i_keysession_service.h"
32 #include "surface.h"
33 
34 namespace OHOS {
35 namespace MediaAVCodec {
36 enum class CallbackFlag : uint8_t {
37     MEMORY_CALLBACK = 1,
38     BUFFER_CALLBACK,
39     INVALID_CALLBACK,
40 };
41 const OHOS::MediaAVCodec::Range DEFAULT_RANGE = {96, 4096};
42 const OHOS::MediaAVCodec::Range HEVC_DECODER_RANGE = {2, 1920};
43 const OHOS::MediaAVCodec::Range DEFALUT_BITRATE_RANGE = {1, 40000000};
44 const OHOS::MediaAVCodec::Range DEFALUT_FRAMERATE_RANGE = {1, 60};
45 const OHOS::MediaAVCodec::Range DEFALUT_CHANNELS_RANGE = {1, 30};
46 const std::vector<int32_t> DEFALUT_PIXFORMAT = {1, 2, 3};
47 const std::vector<int32_t> HEVC_DECODER_PIXFORMAT = {2, 3};
48 const std::vector<int32_t> DEFALUT_SAMPLE_RATE = {1, 2, 3, 4, 5};
49 
50 const std::string DEFAULT_LOCK_FREE_QUEUE_NAME = "decodedBufferInfoQueue";
51 const std::string DEFAULT_TASK_NAME = "PostProcessing";
52 const std::string CODEC_MIME_MOCK_00 = "video/codec_mime_00";
53 const std::string CODEC_MIME_MOCK_01 = "video/codec_mime_01";
54 const std::vector<CapabilityData> FCODEC_CAPS = {{.codecName = "video.F.Decoder.Name.00",
55                                                   .codecType = AVCODEC_TYPE_VIDEO_DECODER,
56                                                   .mimeType = CODEC_MIME_MOCK_00,
57                                                   .isVendor = false,
58                                                   .width = DEFAULT_RANGE,
59                                                   .height = DEFAULT_RANGE,
60                                                   .pixFormat = DEFALUT_PIXFORMAT},
61                                                  {.codecName = "video.F.Decoder.Name.00",
62                                                   .codecType = AVCODEC_TYPE_VIDEO_ENCODER,
63                                                   .mimeType = CODEC_MIME_MOCK_00,
64                                                   .isVendor = false,
65                                                   .width = DEFAULT_RANGE,
66                                                   .height = DEFAULT_RANGE,
67                                                   .pixFormat = DEFALUT_PIXFORMAT},
68                                                  {.codecName = "video.F.Decoder.Name.01",
69                                                   .codecType = AVCODEC_TYPE_VIDEO_DECODER,
70                                                   .mimeType = CODEC_MIME_MOCK_01,
71                                                   .isVendor = false,
72                                                   .width = DEFAULT_RANGE,
73                                                   .height = DEFAULT_RANGE,
74                                                   .pixFormat = DEFALUT_PIXFORMAT},
75                                                  {.codecName = "video.F.Decoder.Name.01",
76                                                   .codecType = AVCODEC_TYPE_VIDEO_ENCODER,
77                                                   .mimeType = CODEC_MIME_MOCK_01,
78                                                   .isVendor = false,
79                                                   .width = DEFAULT_RANGE,
80                                                   .height = DEFAULT_RANGE,
81                                                   .pixFormat = DEFALUT_PIXFORMAT}};
82 const std::vector<CapabilityData> HEVC_DECODER_CAPS = {{.codecName = "video.Hevc.Decoder.Name.00",
83                                                         .codecType = AVCODEC_TYPE_VIDEO_DECODER,
84                                                         .mimeType = CODEC_MIME_MOCK_00,
85                                                         .isVendor = false,
86                                                         .width = HEVC_DECODER_RANGE,
87                                                         .height = HEVC_DECODER_RANGE,
88                                                         .pixFormat = HEVC_DECODER_PIXFORMAT},
89                                                        {.codecName = "video.Hevc.Decoder.Name.01",
90                                                         .codecType = AVCODEC_TYPE_VIDEO_DECODER,
91                                                         .mimeType = CODEC_MIME_MOCK_01,
92                                                         .isVendor = false,
93                                                         .width = HEVC_DECODER_RANGE,
94                                                         .height = HEVC_DECODER_RANGE,
95                                                         .pixFormat = HEVC_DECODER_PIXFORMAT}};
96 const std::vector<CapabilityData> HCODEC_CAPS = {{.codecName = "video.H.Decoder.Name.00",
97                                                   .codecType = AVCODEC_TYPE_VIDEO_DECODER,
98                                                   .mimeType = CODEC_MIME_MOCK_00,
99                                                   .isVendor = true,
100                                                   .width = DEFAULT_RANGE,
101                                                   .height = DEFAULT_RANGE,
102                                                   .pixFormat = DEFALUT_PIXFORMAT},
103                                                  {.codecName = "video.H.Encoder.Name.00",
104                                                   .codecType = AVCODEC_TYPE_VIDEO_ENCODER,
105                                                   .mimeType = CODEC_MIME_MOCK_00,
106                                                   .isVendor = true,
107                                                   .width = DEFAULT_RANGE,
108                                                   .height = DEFAULT_RANGE,
109                                                   .pixFormat = DEFALUT_PIXFORMAT},
110                                                  {.codecName = "video.H.Decoder.Name.01",
111                                                   .codecType = AVCODEC_TYPE_VIDEO_DECODER,
112                                                   .mimeType = CODEC_MIME_MOCK_01,
113                                                   .isVendor = true,
114                                                   .width = DEFAULT_RANGE,
115                                                   .height = DEFAULT_RANGE,
116                                                   .pixFormat = DEFALUT_PIXFORMAT},
117                                                  {.codecName = "video.H.Encoder.Name.01",
118                                                   .codecType = AVCODEC_TYPE_VIDEO_ENCODER,
119                                                   .mimeType = CODEC_MIME_MOCK_01,
120                                                   .isVendor = true,
121                                                   .width = DEFAULT_RANGE,
122                                                   .height = DEFAULT_RANGE,
123                                                   .pixFormat = DEFALUT_PIXFORMAT},
124                                                  {.codecName = "video.H.Decoder.Name.02",
125                                                   .codecType = AVCODEC_TYPE_VIDEO_DECODER,
126                                                   .bitrate = DEFALUT_BITRATE_RANGE,
127                                                   .frameRate = DEFALUT_FRAMERATE_RANGE,
128                                                   .channels = DEFALUT_CHANNELS_RANGE,
129                                                   .sampleRate = DEFALUT_SAMPLE_RATE,
130                                                   .mimeType = CODEC_MIME_MOCK_00,
131                                                   .isVendor = false,
132                                                   .width = DEFAULT_RANGE,
133                                                   .height = DEFAULT_RANGE,
134                                                   .pixFormat = DEFALUT_PIXFORMAT}};
135 
136 class CodecBase;
137 using RetAndCaps = std::pair<int32_t, std::vector<CapabilityData>>;
138 
139 class AVCodecCallbackMock : public AVCodecCallback {
140 public:
141     AVCodecCallbackMock() = default;
142     ~AVCodecCallbackMock() = default;
143 
144     MOCK_METHOD(void, OnError, (AVCodecErrorType errorType, int32_t errorCode), (override));
145     MOCK_METHOD(void, OnOutputFormatChanged, (const Format &format), (override));
146     MOCK_METHOD(void, OnInputBufferAvailable, (uint32_t index, std::shared_ptr<AVSharedMemory> buffer), (override));
147     MOCK_METHOD(void, OnOutputBufferAvailable, (uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag,
148                                               std::shared_ptr<AVSharedMemory> buffer), (override));
149 };
150 
151 class MediaCodecCallbackMock : public MediaCodecCallback {
152 public:
153     MediaCodecCallbackMock() = default;
154     ~MediaCodecCallbackMock() = default;
155 
156     MOCK_METHOD(void, OnError, (AVCodecErrorType errorType, int32_t errorCode), (override));
157     MOCK_METHOD(void, OnOutputFormatChanged, (const Format &format), (override));
158     MOCK_METHOD(void, OnInputBufferAvailable, (uint32_t index, std::shared_ptr<AVBuffer> buffer), (override));
159     MOCK_METHOD(void, OnOutputBufferAvailable, (uint32_t index, std::shared_ptr<AVBuffer> buffer), (override));
160 };
161 
162 class CodecBaseMock {
163 public:
164     CodecBaseMock() = default;
165     ~CodecBaseMock() = default;
166 
167     MOCK_METHOD(std::shared_ptr<CodecBase>, CreateFCodecByName, (const std::string &name));
168     MOCK_METHOD(std::shared_ptr<CodecBase>, CreateHevcDecoderByName, (const std::string &name));
169     MOCK_METHOD(std::shared_ptr<CodecBase>, CreateHCodecByName, (const std::string &name));
170     MOCK_METHOD(RetAndCaps, GetHCapabilityList, ());
171     MOCK_METHOD(RetAndCaps, GetFCapabilityList, ());
172     MOCK_METHOD(RetAndCaps, GetHevcDecoderCapabilityList, ());
173 
174     MOCK_METHOD(void, CodecBaseCtor, ());
175     MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<AVCodecCallback> &callback));
176     MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<MediaCodecCallback> &callback));
177     MOCK_METHOD(int32_t, Configure, ());
178     MOCK_METHOD(int32_t, Start, ());
179     MOCK_METHOD(int32_t, Stop, ());
180     MOCK_METHOD(int32_t, Flush, ());
181     MOCK_METHOD(int32_t, Reset, ());
182     MOCK_METHOD(int32_t, Release, ());
183     MOCK_METHOD(int32_t, SetParameter, ());
184     MOCK_METHOD(int32_t, GetOutputFormat, ());
185     MOCK_METHOD(int32_t, QueueInputBuffer, (uint32_t index, const AVCodecBufferInfo &info, AVCodecBufferFlag flag));
186     MOCK_METHOD(int32_t, QueueInputBuffer, (uint32_t index));
187     MOCK_METHOD(int32_t, QueueInputParameter, (uint32_t index));
188     MOCK_METHOD(int32_t, ReleaseOutputBuffer, (uint32_t index));
189 
190     MOCK_METHOD(int32_t, NotifyEos, ());
191     MOCK_METHOD(sptr<Surface>, CreateInputSurface, ());
192     MOCK_METHOD(int32_t, SetInputSurface, (sptr<Surface> surface));
193     MOCK_METHOD(int32_t, SetOutputSurface, (sptr<Surface> surface));
194     MOCK_METHOD(int32_t, RenderOutputBuffer, (uint32_t index));
195     MOCK_METHOD(int32_t, SignalRequestIDRFrame, ());
196     MOCK_METHOD(int32_t, GetInputFormat, (Format & format));
197     MOCK_METHOD(std::string, GetHidumperInfo, ());
198     MOCK_METHOD(int32_t, Init, ());
199 
200     /* API11 audio codec interface */
201     MOCK_METHOD(int32_t, CreateCodecByName, (const std::string &name));
202     MOCK_METHOD(int32_t, Configure, (const std::shared_ptr<Media::Meta> &meta));
203     MOCK_METHOD(int32_t, SetParameter, (const std::shared_ptr<Media::Meta> &parameter));
204     MOCK_METHOD(int32_t, GetOutputFormat, (std::shared_ptr<Media::Meta> & parameter));
205     MOCK_METHOD(int32_t, SetOutputBufferQueue, (const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer));
206     MOCK_METHOD(int32_t, Prepare, ());
207     MOCK_METHOD(sptr<Media::AVBufferQueueProducer>, GetInputBufferQueue, ());
208     MOCK_METHOD(void, ProcessInputBuffer, ());
209     MOCK_METHOD(int32_t, SetAudioDecryptionConfig,
210                 (const sptr<DrmStandard::IMediaKeySessionService> &keySession, const bool svpFlag));
211     MOCK_METHOD(int32_t, SetCustomBuffer, (std::shared_ptr<AVBuffer> buffer));
212     std::weak_ptr<AVCodecCallback> codecCb_;
213     std::weak_ptr<MediaCodecCallback> videoCb_;
214 };
215 
216 class CodecBase {
217 public:
218     static void RegisterMock(std::shared_ptr<CodecBaseMock> &mock);
219 
220     CodecBase();
221     virtual ~CodecBase();
222     virtual int32_t SetCallback(const std::shared_ptr<AVCodecCallback> &callback);
223     virtual int32_t SetCallback(const std::shared_ptr<MediaCodecCallback> &callback);
224     virtual int32_t Configure(const Format &format);
225     virtual int32_t Start();
226     virtual int32_t Stop();
227     virtual int32_t Flush();
228     virtual int32_t Reset();
229     virtual int32_t Release();
230     virtual int32_t SetParameter(const Format &format);
231     virtual int32_t GetOutputFormat(Format &format);
232     virtual int32_t QueueInputBuffer(uint32_t index, const AVCodecBufferInfo &info, AVCodecBufferFlag flag);
233     virtual int32_t QueueInputBuffer(uint32_t index);
234     virtual int32_t QueueInputParameter(uint32_t index);
235     virtual int32_t ReleaseOutputBuffer(uint32_t index);
236 
237     virtual int32_t NotifyEos();
238     virtual sptr<Surface> CreateInputSurface();
239     virtual int32_t SetInputSurface(sptr<Surface> surface);
240     virtual int32_t SetOutputSurface(sptr<Surface> surface);
241     virtual int32_t RenderOutputBuffer(uint32_t index);
242     virtual int32_t SignalRequestIDRFrame();
243     virtual int32_t GetInputFormat(Format &format);
244     virtual std::string GetHidumperInfo();
245     virtual int32_t Init(Media::Meta &meta);
246     virtual int32_t SetCustomBuffer(std::shared_ptr<AVBuffer> buffer);
247 
248     /* API11 audio codec interface */
249     virtual int32_t CreateCodecByName(const std::string &name);
250     virtual int32_t Configure(const std::shared_ptr<Media::Meta> &meta);
251     virtual int32_t SetParameter(const std::shared_ptr<Media::Meta> &parameter);
252     virtual int32_t GetOutputFormat(std::shared_ptr<Media::Meta> &parameter);
253     virtual int32_t SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer);
254     virtual int32_t Prepare();
255     virtual sptr<Media::AVBufferQueueProducer> GetInputBufferQueue();
256     virtual void ProcessInputBuffer();
257 
258     /* API12 audio codec interface for drm*/
259     virtual int32_t SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession,
260                                              const bool svpFlag);
261 };
262 } // namespace MediaAVCodec
263 } // namespace OHOS
264 #endif // CODECBASE_MOCK_H