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 <mutex>
16 #include "avcodec_log.h"
17 #include "codecbase.h"
18 #include "fcodec_loader.h"
19 #include "hevc_decoder_loader.h"
20 #include "hcodec_loader.h"
21 #define PRINT_HILOG
22 #include "unittest_log.h"
23 namespace {
24 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_TEST, "CodecBaseMock"};
25 std::mutex g_mutex;
26 std::weak_ptr<OHOS::MediaAVCodec::CodecBaseMock> g_mockObject;
27 } // namespace
28
29 namespace OHOS {
30 namespace MediaAVCodec {
CreateByName(const std::string & name)31 std::shared_ptr<CodecBase> HCodecLoader::CreateByName(const std::string &name)
32 {
33 std::lock_guard<std::mutex> lock(g_mutex);
34 UNITTEST_INFO_LOG("name: %s", name.c_str());
35 auto mock = g_mockObject.lock();
36 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, nullptr, "mock object is nullptr");
37 return mock->CreateHCodecByName(name);
38 }
39
CreateByName(const std::string & name)40 std::shared_ptr<CodecBase> FCodecLoader::CreateByName(const std::string &name)
41 {
42 std::lock_guard<std::mutex> lock(g_mutex);
43 UNITTEST_INFO_LOG("name: %s", name.c_str());
44 auto mock = g_mockObject.lock();
45 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, nullptr, "mock object is nullptr");
46 return mock->CreateFCodecByName(name);
47 }
48
CreateByName(const std::string & name)49 std::shared_ptr<CodecBase> HevcDecoderLoader::CreateByName(const std::string &name)
50 {
51 std::lock_guard<std::mutex> lock(g_mutex);
52 UNITTEST_INFO_LOG("name: %s", name.c_str());
53 auto mock = g_mockObject.lock();
54 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, nullptr, "mock object is nullptr");
55 return mock->CreateHevcDecoderByName(name);
56 }
57
GetCapabilityList(std::vector<CapabilityData> & caps)58 int32_t HCodecLoader::GetCapabilityList(std::vector<CapabilityData> &caps)
59 {
60 std::lock_guard<std::mutex> lock(g_mutex);
61 UNITTEST_INFO_LOG("HCodec");
62 auto mock = g_mockObject.lock();
63 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
64 auto item = mock->GetHCapabilityList();
65 caps = item.second;
66 return item.first;
67 }
68
GetCapabilityList(std::vector<CapabilityData> & caps)69 int32_t FCodecLoader::GetCapabilityList(std::vector<CapabilityData> &caps)
70 {
71 std::lock_guard<std::mutex> lock(g_mutex);
72 UNITTEST_INFO_LOG("FCodec");
73 auto mock = g_mockObject.lock();
74 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
75 auto item = mock->GetFCapabilityList();
76 caps = item.second;
77 return item.first;
78 }
79
GetCapabilityList(std::vector<CapabilityData> & caps)80 int32_t HevcDecoderLoader::GetCapabilityList(std::vector<CapabilityData> &caps)
81 {
82 std::lock_guard<std::mutex> lock(g_mutex);
83 UNITTEST_INFO_LOG("HevcDecoder");
84 auto mock = g_mockObject.lock();
85 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
86 auto item = mock->GetHevcDecoderCapabilityList();
87 caps = item.second;
88 return item.first;
89 }
90
RegisterMock(std::shared_ptr<CodecBaseMock> & mock)91 void CodecBase::RegisterMock(std::shared_ptr<CodecBaseMock> &mock)
92 {
93 std::lock_guard<std::mutex> lock(g_mutex);
94 UNITTEST_INFO_LOG("CodecBase:0x%" PRIXPTR, FAKE_POINTER(mock.get()));
95 g_mockObject = mock;
96 }
97
CodecBase()98 CodecBase::CodecBase()
99 {
100 std::lock_guard<std::mutex> lock(g_mutex);
101 UNITTEST_INFO_LOG("");
102 auto mock = g_mockObject.lock();
103 UNITTEST_CHECK_AND_RETURN_LOG(mock != nullptr, "mock object is nullptr");
104 mock->CodecBaseCtor();
105 }
106
~CodecBase()107 CodecBase::~CodecBase()
108 {
109 UNITTEST_INFO_LOG("");
110 }
111
SetCallback(const std::shared_ptr<AVCodecCallback> & callback)112 int32_t CodecBase::SetCallback(const std::shared_ptr<AVCodecCallback> &callback)
113 {
114 std::lock_guard<std::mutex> lock(g_mutex);
115 UNITTEST_INFO_LOG("callback:0x%" PRIXPTR, FAKE_POINTER(callback.get()));
116 auto mock = g_mockObject.lock();
117 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
118 mock->codecCb_ = callback;
119 return mock->SetCallback(std::shared_ptr<AVCodecCallback>(nullptr));
120 }
121
SetCallback(const std::shared_ptr<MediaCodecCallback> & callback)122 int32_t CodecBase::SetCallback(const std::shared_ptr<MediaCodecCallback> &callback)
123 {
124 std::lock_guard<std::mutex> lock(g_mutex);
125 UNITTEST_INFO_LOG("callback:0x%" PRIXPTR, FAKE_POINTER(callback.get()));
126 auto mock = g_mockObject.lock();
127 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
128 mock->videoCb_ = callback;
129 return mock->SetCallback(std::shared_ptr<MediaCodecCallback>(nullptr));
130 }
131
Configure(const Format & format)132 int32_t CodecBase::Configure(const Format &format)
133 {
134 std::lock_guard<std::mutex> lock(g_mutex);
135 UNITTEST_INFO_LOG("format:%s", format.Stringify().c_str());
136 auto mock = g_mockObject.lock();
137 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
138 return mock->Configure();
139 }
140
SetCustomBuffer(std::shared_ptr<AVBuffer> buffer)141 int32_t CodecBase::SetCustomBuffer(std::shared_ptr<AVBuffer> buffer)
142 {
143 std::lock_guard<std::mutex> lock(g_mutex);
144 UNITTEST_INFO_LOG("");
145 auto mock = g_mockObject.lock();
146 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
147 return mock->SetCustomBuffer(buffer);
148 }
149
Start()150 int32_t CodecBase::Start()
151 {
152 std::lock_guard<std::mutex> lock(g_mutex);
153 UNITTEST_INFO_LOG("");
154 auto mock = g_mockObject.lock();
155 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
156 return mock->Start();
157 }
158
Stop()159 int32_t CodecBase::Stop()
160 {
161 std::lock_guard<std::mutex> lock(g_mutex);
162 UNITTEST_INFO_LOG("");
163 auto mock = g_mockObject.lock();
164 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
165 return mock->Stop();
166 }
167
Flush()168 int32_t CodecBase::Flush()
169 {
170 std::lock_guard<std::mutex> lock(g_mutex);
171 UNITTEST_INFO_LOG("");
172 auto mock = g_mockObject.lock();
173 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
174 return mock->Flush();
175 }
176
Reset()177 int32_t CodecBase::Reset()
178 {
179 std::lock_guard<std::mutex> lock(g_mutex);
180 UNITTEST_INFO_LOG("");
181 auto mock = g_mockObject.lock();
182 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
183 return mock->Reset();
184 }
185
Release()186 int32_t CodecBase::Release()
187 {
188 std::lock_guard<std::mutex> lock(g_mutex);
189 UNITTEST_INFO_LOG("");
190 auto mock = g_mockObject.lock();
191 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
192 return mock->Release();
193 }
194
SetParameter(const Format & format)195 int32_t CodecBase::SetParameter(const Format &format)
196 {
197 std::lock_guard<std::mutex> lock(g_mutex);
198 UNITTEST_INFO_LOG("format:%s", format.Stringify().c_str());
199 auto mock = g_mockObject.lock();
200 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
201 return mock->SetParameter();
202 }
203
GetOutputFormat(Format & format)204 int32_t CodecBase::GetOutputFormat(Format &format)
205 {
206 std::lock_guard<std::mutex> lock(g_mutex);
207 UNITTEST_INFO_LOG("format:%s", format.Stringify().c_str());
208 auto mock = g_mockObject.lock();
209 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
210 return mock->GetOutputFormat();
211 }
212
QueueInputBuffer(uint32_t index,const AVCodecBufferInfo & info,AVCodecBufferFlag flag)213 int32_t CodecBase::QueueInputBuffer(uint32_t index, const AVCodecBufferInfo &info, AVCodecBufferFlag flag)
214 {
215 std::lock_guard<std::mutex> lock(g_mutex);
216 UNITTEST_INFO_LOG("index:%u, size:%d, flag:%d", index, info.size, static_cast<int32_t>(flag));
217 auto mock = g_mockObject.lock();
218 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
219 return mock->QueueInputBuffer(index, info, flag);
220 }
221
QueueInputBuffer(uint32_t index)222 int32_t CodecBase::QueueInputBuffer(uint32_t index)
223 {
224 std::lock_guard<std::mutex> lock(g_mutex);
225 UNITTEST_INFO_LOG("index:%u", index);
226 auto mock = g_mockObject.lock();
227 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
228 return mock->QueueInputBuffer(index);
229 }
230
QueueInputParameter(uint32_t index)231 int32_t CodecBase::QueueInputParameter(uint32_t index)
232 {
233 std::lock_guard<std::mutex> lock(g_mutex);
234 UNITTEST_INFO_LOG("index:%u", index);
235 auto mock = g_mockObject.lock();
236 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
237 return mock->QueueInputParameter(index);
238 }
239
ReleaseOutputBuffer(uint32_t index)240 int32_t CodecBase::ReleaseOutputBuffer(uint32_t index)
241 {
242 std::lock_guard<std::mutex> lock(g_mutex);
243 UNITTEST_INFO_LOG("index:%u", index);
244 auto mock = g_mockObject.lock();
245 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
246 return mock->ReleaseOutputBuffer(index);
247 }
248
NotifyEos()249 int32_t CodecBase::NotifyEos()
250 {
251 std::lock_guard<std::mutex> lock(g_mutex);
252 UNITTEST_INFO_LOG("");
253 auto mock = g_mockObject.lock();
254 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
255 return mock->NotifyEos();
256 }
257
CreateInputSurface()258 sptr<Surface> CodecBase::CreateInputSurface()
259 {
260 std::lock_guard<std::mutex> lock(g_mutex);
261 UNITTEST_INFO_LOG("");
262 auto mock = g_mockObject.lock();
263 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, nullptr, "mock object is nullptr");
264 return mock->CreateInputSurface();
265 }
266
SetInputSurface(sptr<Surface> surface)267 int32_t CodecBase::SetInputSurface(sptr<Surface> surface)
268 {
269 std::lock_guard<std::mutex> lock(g_mutex);
270 UNITTEST_INFO_LOG("surface:0x%" PRIXPTR, FAKE_POINTER(surface.GetRefPtr()));
271 auto mock = g_mockObject.lock();
272 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
273 return mock->SetInputSurface(surface);
274 }
275
SetOutputSurface(sptr<Surface> surface)276 int32_t CodecBase::SetOutputSurface(sptr<Surface> surface)
277 {
278 std::lock_guard<std::mutex> lock(g_mutex);
279 UNITTEST_INFO_LOG("");
280 auto mock = g_mockObject.lock();
281 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
282 return mock->SetOutputSurface(surface);
283 }
284
RenderOutputBuffer(uint32_t index)285 int32_t CodecBase::RenderOutputBuffer(uint32_t index)
286 {
287 std::lock_guard<std::mutex> lock(g_mutex);
288 UNITTEST_INFO_LOG("index:%u", index);
289 auto mock = g_mockObject.lock();
290 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
291 return mock->RenderOutputBuffer(index);
292 }
293
SignalRequestIDRFrame()294 int32_t CodecBase::SignalRequestIDRFrame()
295 {
296 std::lock_guard<std::mutex> lock(g_mutex);
297 UNITTEST_INFO_LOG("");
298 auto mock = g_mockObject.lock();
299 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
300 return mock->SignalRequestIDRFrame();
301 }
302
GetInputFormat(Format & format)303 int32_t CodecBase::GetInputFormat(Format &format)
304 {
305 std::lock_guard<std::mutex> lock(g_mutex);
306 UNITTEST_INFO_LOG("format:%s", format.Stringify().c_str());
307 auto mock = g_mockObject.lock();
308 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
309 return mock->GetInputFormat(format);
310 }
311
GetHidumperInfo()312 std::string CodecBase::GetHidumperInfo()
313 {
314 std::lock_guard<std::mutex> lock(g_mutex);
315 UNITTEST_INFO_LOG("");
316 auto mock = g_mockObject.lock();
317 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, "", "mock object is nullptr");
318 return mock->GetHidumperInfo();
319 }
320
Init(Media::Meta & callerInfo)321 int32_t CodecBase::Init(Media::Meta &callerInfo)
322 {
323 (void) callerInfo;
324 std::lock_guard<std::mutex> lock(g_mutex);
325 UNITTEST_INFO_LOG("Init");
326 auto mock = g_mockObject.lock();
327 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
328 return mock->Init();
329 }
330
CreateCodecByName(const std::string & name)331 int32_t CodecBase::CreateCodecByName(const std::string &name)
332 {
333 std::lock_guard<std::mutex> lock(g_mutex);
334 UNITTEST_INFO_LOG("name: %s", name.c_str());
335 auto mock = g_mockObject.lock();
336 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
337 return mock->CreateCodecByName(name);
338 }
339
Configure(const std::shared_ptr<Media::Meta> & meta)340 int32_t CodecBase::Configure(const std::shared_ptr<Media::Meta> &meta)
341 {
342 std::lock_guard<std::mutex> lock(g_mutex);
343 UNITTEST_INFO_LOG("meta:0x%" PRIXPTR, FAKE_POINTER(meta.get()));
344 auto mock = g_mockObject.lock();
345 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
346 return mock->Configure(meta);
347 }
348
SetParameter(const std::shared_ptr<Media::Meta> & parameter)349 int32_t CodecBase::SetParameter(const std::shared_ptr<Media::Meta> ¶meter)
350 {
351 std::lock_guard<std::mutex> lock(g_mutex);
352 UNITTEST_INFO_LOG("parameter:0x%" PRIXPTR, FAKE_POINTER(parameter.get()));
353 auto mock = g_mockObject.lock();
354 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
355 return mock->SetParameter(parameter);
356 }
357
GetOutputFormat(std::shared_ptr<Media::Meta> & parameter)358 int32_t CodecBase::GetOutputFormat(std::shared_ptr<Media::Meta> ¶meter)
359 {
360 std::lock_guard<std::mutex> lock(g_mutex);
361 UNITTEST_INFO_LOG("parameter:0x%" PRIXPTR, FAKE_POINTER(parameter.get()));
362 auto mock = g_mockObject.lock();
363 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
364 return mock->GetOutputFormat(parameter);
365 }
366
SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> & bufferQueueProducer)367 int32_t CodecBase::SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer)
368 {
369 std::lock_guard<std::mutex> lock(g_mutex);
370 UNITTEST_INFO_LOG("bufferQueueProducer:0x%" PRIXPTR, FAKE_POINTER(bufferQueueProducer.GetRefPtr()));
371 auto mock = g_mockObject.lock();
372 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
373 return mock->SetOutputBufferQueue(bufferQueueProducer);
374 }
375
Prepare()376 int32_t CodecBase::Prepare()
377 {
378 std::lock_guard<std::mutex> lock(g_mutex);
379 UNITTEST_INFO_LOG("");
380 auto mock = g_mockObject.lock();
381 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
382 return mock->Prepare();
383 }
384
GetInputBufferQueue()385 sptr<Media::AVBufferQueueProducer> CodecBase::GetInputBufferQueue()
386 {
387 std::lock_guard<std::mutex> lock(g_mutex);
388 UNITTEST_INFO_LOG("");
389 auto mock = g_mockObject.lock();
390 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, nullptr, "mock object is nullptr");
391 return mock->GetInputBufferQueue();
392 }
393
ProcessInputBuffer()394 void CodecBase::ProcessInputBuffer()
395 {
396 std::lock_guard<std::mutex> lock(g_mutex);
397 UNITTEST_INFO_LOG("");
398 auto mock = g_mockObject.lock();
399 UNITTEST_CHECK_AND_RETURN_LOG(mock != nullptr, "mock object is nullptr");
400 mock->ProcessInputBuffer();
401 }
402
SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> & keySession,const bool svpFlag)403 int32_t CodecBase::SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession,
404 const bool svpFlag)
405 {
406 std::lock_guard<std::mutex> lock(g_mutex);
407 UNITTEST_INFO_LOG("");
408 auto mock = g_mockObject.lock();
409 UNITTEST_CHECK_AND_RETURN_RET_LOG(mock != nullptr, AVCS_ERR_UNKNOWN, "mock object is nullptr");
410 return mock->SetAudioDecryptionConfig(keySession, svpFlag);
411 }
412 } // namespace MediaAVCodec
413 } // namespace OHOS
414