• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "avcodec_video_decoder_impl.h"
17 #include "avcodec_trace.h"
18 #include "avcodec_errors.h"
19 #include "avcodec_log.h"
20 #include "i_avcodec_service.h"
21 
22 namespace {
23 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_FRAMEWORK, "AVCodecVideoDecoderImpl"};
24 }
25 
26 namespace OHOS {
27 namespace MediaAVCodec {
CreateByMime(const std::string & mime)28 std::shared_ptr<AVCodecVideoDecoder> VideoDecoderFactory::CreateByMime(const std::string &mime)
29 {
30     std::shared_ptr<AVCodecVideoDecoder> impl = nullptr;
31     Format format;
32 
33     int32_t ret = CreateByMime(mime, format, impl);
34     CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK || impl != nullptr, nullptr,
35         "AVCodec video decoder impl init failed, %{public}s",
36         AVCSErrorToString(static_cast<AVCodecServiceErrCode>(ret)).c_str());
37 
38     return impl;
39 }
40 
CreateByName(const std::string & name)41 std::shared_ptr<AVCodecVideoDecoder> VideoDecoderFactory::CreateByName(const std::string &name)
42 {
43     std::shared_ptr<AVCodecVideoDecoder> impl = nullptr;
44     Format format;
45 
46     int32_t ret = CreateByName(name, format, impl);
47     CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK || impl != nullptr, nullptr,
48         "AVCodec video decoder impl init failed, %{public}s",
49         AVCSErrorToString(static_cast<AVCodecServiceErrCode>(ret)).c_str());
50 
51     return impl;
52 }
53 
CreateByMime(const std::string & mime,Format & format,std::shared_ptr<AVCodecVideoDecoder> & decoder)54 int32_t VideoDecoderFactory::CreateByMime(const std::string &mime,
55                                           Format &format, std::shared_ptr<AVCodecVideoDecoder> &decoder)
56 {
57     auto impl = std::make_shared<AVCodecVideoDecoderImpl>();
58 
59     int32_t ret = impl->Init(AVCODEC_TYPE_VIDEO_DECODER, true, mime, format);
60     CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK, ret, "AVCodec video decoder impl init failed, %{public}s",
61                              AVCSErrorToString(static_cast<AVCodecServiceErrCode>(ret)).c_str());
62 
63     decoder = impl;
64     return AVCS_ERR_OK;
65 }
66 
CreateByName(const std::string & name,Format & format,std::shared_ptr<AVCodecVideoDecoder> & decoder)67 int32_t VideoDecoderFactory::CreateByName(const std::string &name,
68                                           Format &format, std::shared_ptr<AVCodecVideoDecoder> &decoder)
69 {
70     auto impl = std::make_shared<AVCodecVideoDecoderImpl>();
71 
72     int32_t ret = impl->Init(AVCODEC_TYPE_VIDEO_DECODER, false, name, format);
73     CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK, ret, "AVCodec video decoder impl init failed, %{public}s",
74                              AVCSErrorToString(static_cast<AVCodecServiceErrCode>(ret)).c_str());
75 
76     decoder = impl;
77     return AVCS_ERR_OK;
78 }
79 
Init(AVCodecType type,bool isMimeType,const std::string & name,Format & format)80 int32_t AVCodecVideoDecoderImpl::Init(AVCodecType type, bool isMimeType, const std::string &name, Format &format)
81 {
82     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
83 
84     int32_t ret = AVCodecServiceFactory::GetInstance().CreateCodecService(codecClient_);
85     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, ret, "Codec client create failed");
86     ret = codecClient_->Init(type, isMimeType, name, *format.GetMeta());
87     this->SetTag(codecClient_->GetTag()); // execute with CodecServiceProxy initialization completed
88     return ret;
89 }
90 
AVCodecVideoDecoderImpl()91 AVCodecVideoDecoderImpl::AVCodecVideoDecoderImpl()
92 {
93     AVCODEC_LOGD_WITH_TAG("AVCodecVideoDecoderImpl:0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
94 }
95 
~AVCodecVideoDecoderImpl()96 AVCodecVideoDecoderImpl::~AVCodecVideoDecoderImpl()
97 {
98     if (codecClient_ != nullptr) {
99         (void)AVCodecServiceFactory::GetInstance().DestroyCodecService(codecClient_);
100         codecClient_ = nullptr;
101     }
102     AVCODEC_LOGD_WITH_TAG("AVCodecVideoDecoderImpl:0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
103 }
104 
Configure(const Format & format)105 int32_t AVCodecVideoDecoderImpl::Configure(const Format &format)
106 {
107     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
108 
109     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
110     return codecClient_->Configure(format);
111 }
112 
Prepare()113 int32_t AVCodecVideoDecoderImpl::Prepare()
114 {
115     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
116     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
117 
118     return codecClient_->Prepare();
119 }
120 
Start()121 int32_t AVCodecVideoDecoderImpl::Start()
122 {
123     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
124 
125     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
126     return codecClient_->Start();
127 }
128 
Stop()129 int32_t AVCodecVideoDecoderImpl::Stop()
130 {
131     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
132 
133     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
134     return codecClient_->Stop();
135 }
136 
Flush()137 int32_t AVCodecVideoDecoderImpl::Flush()
138 {
139     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
140 
141     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
142     return codecClient_->Flush();
143 }
144 
Reset()145 int32_t AVCodecVideoDecoderImpl::Reset()
146 {
147     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
148 
149     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
150     return codecClient_->Reset();
151 }
152 
Release()153 int32_t AVCodecVideoDecoderImpl::Release()
154 {
155     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
156 
157     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
158     return codecClient_->Release();
159 }
160 
SetOutputSurface(sptr<Surface> surface)161 int32_t AVCodecVideoDecoderImpl::SetOutputSurface(sptr<Surface> surface)
162 {
163     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
164 
165     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
166     return codecClient_->SetOutputSurface(surface);
167 }
168 
QueueInputBuffer(uint32_t index,AVCodecBufferInfo info,AVCodecBufferFlag flag)169 int32_t AVCodecVideoDecoderImpl::QueueInputBuffer(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag)
170 {
171     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
172 
173     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
174     return codecClient_->QueueInputBuffer(index, info, flag);
175 }
176 
QueueInputBuffer(uint32_t index)177 int32_t AVCodecVideoDecoderImpl::QueueInputBuffer(uint32_t index)
178 {
179     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
180 
181     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
182     return codecClient_->QueueInputBuffer(index);
183 }
184 
GetOutputFormat(Format & format)185 int32_t AVCodecVideoDecoderImpl::GetOutputFormat(Format &format)
186 {
187     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
188 
189     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
190     return codecClient_->GetOutputFormat(format);
191 }
192 
ReleaseOutputBuffer(uint32_t index,bool render)193 int32_t AVCodecVideoDecoderImpl::ReleaseOutputBuffer(uint32_t index, bool render)
194 {
195     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
196 
197     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
198     return codecClient_->ReleaseOutputBuffer(index, render);
199 }
200 
RenderOutputBufferAtTime(uint32_t index,int64_t renderTimestampNs)201 int32_t AVCodecVideoDecoderImpl::RenderOutputBufferAtTime(uint32_t index, int64_t renderTimestampNs)
202 {
203     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
204 
205     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
206     return codecClient_->RenderOutputBufferAtTime(index, renderTimestampNs);
207 }
208 
QueryInputBuffer(uint32_t & index,int64_t timeoutUs)209 int32_t AVCodecVideoDecoderImpl::QueryInputBuffer(uint32_t &index, int64_t timeoutUs)
210 {
211     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
212 
213     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
214     return codecClient_->QueryInputBuffer(index, timeoutUs);
215 }
216 
QueryOutputBuffer(uint32_t & index,int64_t timeoutUs)217 int32_t AVCodecVideoDecoderImpl::QueryOutputBuffer(uint32_t &index, int64_t timeoutUs)
218 {
219     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
220 
221     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
222     return codecClient_->QueryOutputBuffer(index, timeoutUs);
223 }
224 
GetInputBuffer(uint32_t index)225 std::shared_ptr<AVBuffer> AVCodecVideoDecoderImpl::GetInputBuffer(uint32_t index)
226 {
227     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, nullptr, "Codec service is nullptr");
228 
229     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
230     return codecClient_->GetInputBuffer(index);
231 }
232 
GetOutputBuffer(uint32_t index)233 std::shared_ptr<AVBuffer> AVCodecVideoDecoderImpl::GetOutputBuffer(uint32_t index)
234 {
235     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, nullptr, "Codec service is nullptr");
236 
237     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
238     return codecClient_->GetOutputBuffer(index);
239 }
240 
SetParameter(const Format & format)241 int32_t AVCodecVideoDecoderImpl::SetParameter(const Format &format)
242 {
243     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
244 
245     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
246     return codecClient_->SetParameter(format);
247 }
248 
SetCallback(const std::shared_ptr<AVCodecCallback> & callback)249 int32_t AVCodecVideoDecoderImpl::SetCallback(const std::shared_ptr<AVCodecCallback> &callback)
250 {
251     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
252     CHECK_AND_RETURN_RET_LOG_WITH_TAG(callback != nullptr, AVCS_ERR_INVALID_VAL, "Callback is nullptr");
253 
254     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
255     return codecClient_->SetCallback(callback);
256 }
257 
SetCallback(const std::shared_ptr<MediaCodecCallback> & callback)258 int32_t AVCodecVideoDecoderImpl::SetCallback(const std::shared_ptr<MediaCodecCallback> &callback)
259 {
260     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
261     CHECK_AND_RETURN_RET_LOG_WITH_TAG(callback != nullptr, AVCS_ERR_INVALID_VAL, "Callback is nullptr");
262 
263     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
264     return codecClient_->SetCallback(callback);
265 }
266 
267 #ifdef SUPPORT_DRM
SetDecryptConfig(const sptr<DrmStandard::IMediaKeySessionService> & keySessionProxy,const bool svpFlag)268 int32_t AVCodecVideoDecoderImpl::SetDecryptConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySessionProxy,
269     const bool svpFlag)
270 {
271     AVCODEC_LOGI_WITH_TAG("AVCodecVideoDecoderImpl SetDecryptConfig proxy");
272     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr,
273         AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
274     CHECK_AND_RETURN_RET_LOG_WITH_TAG(keySessionProxy != nullptr,
275         AVCS_ERR_INVALID_OPERATION, "keySessionProxy is nullptr");
276 
277     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
278     return codecClient_->SetDecryptConfig(keySessionProxy, svpFlag);
279 }
280 #endif
281 
GetChannelId(int32_t & channelId)282 int32_t AVCodecVideoDecoderImpl::GetChannelId(int32_t &channelId)
283 {
284     CHECK_AND_RETURN_RET_LOG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
285 
286     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
287     return codecClient_->GetChannelId(channelId);
288 }
289 
SetLowPowerPlayerMode(bool isLpp)290 int32_t AVCodecVideoDecoderImpl::SetLowPowerPlayerMode(bool isLpp)
291 {
292     CHECK_AND_RETURN_RET_LOG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
293 
294     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
295     return codecClient_->SetLowPowerPlayerMode(isLpp);
296 }
297 
NotifyMemoryExchange(const bool exchangeFlag)298 int32_t AVCodecVideoDecoderImpl::NotifyMemoryExchange(const bool exchangeFlag)
299 {
300     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
301 
302     AVCODEC_FUNC_TRACE_WITH_TAG_CLIENT;
303     return codecClient_->NotifyMemoryExchange(exchangeFlag);
304 }
305 } // namespace MediaAVCodec
306 } // namespace OHOS
307