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> &parameter)
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> &parameter)
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