• 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     return impl;
38 }
39 
CreateByName(const std::string & name)40 std::shared_ptr<AVCodecVideoDecoder> VideoDecoderFactory::CreateByName(const std::string &name)
41 {
42     std::shared_ptr<AVCodecVideoDecoder> impl = nullptr;
43     Format format;
44 
45     int32_t ret = CreateByName(name, format, impl);
46     CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK || impl != nullptr, nullptr,
47         "AVCodec video decoder impl init failed, %{public}s",
48         AVCSErrorToString(static_cast<AVCodecServiceErrCode>(ret)).c_str());
49 
50     return impl;
51 }
52 
CreateByMime(const std::string & mime,Format & format,std::shared_ptr<AVCodecVideoDecoder> & decoder)53 int32_t VideoDecoderFactory::CreateByMime(const std::string &mime,
54                                           Format &format, std::shared_ptr<AVCodecVideoDecoder> &decoder)
55 {
56     auto impl = std::make_shared<AVCodecVideoDecoderImpl>();
57 
58     int32_t ret = impl->Init(AVCODEC_TYPE_VIDEO_DECODER, true, mime, format);
59     CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK, ret, "AVCodec video decoder impl init failed, %{public}s",
60                              AVCSErrorToString(static_cast<AVCodecServiceErrCode>(ret)).c_str());
61 
62     decoder = impl;
63     return AVCS_ERR_OK;
64 }
65 
CreateByName(const std::string & name,Format & format,std::shared_ptr<AVCodecVideoDecoder> & decoder)66 int32_t VideoDecoderFactory::CreateByName(const std::string &name,
67                                           Format &format, std::shared_ptr<AVCodecVideoDecoder> &decoder)
68 {
69     auto impl = std::make_shared<AVCodecVideoDecoderImpl>();
70 
71     int32_t ret = impl->Init(AVCODEC_TYPE_VIDEO_DECODER, false, name, format);
72     CHECK_AND_RETURN_RET_LOG(ret == AVCS_ERR_OK, ret, "AVCodec video decoder impl init failed, %{public}s",
73                              AVCSErrorToString(static_cast<AVCodecServiceErrCode>(ret)).c_str());
74 
75     decoder = impl;
76     return AVCS_ERR_OK;
77 }
78 
Init(AVCodecType type,bool isMimeType,const std::string & name,Format & format)79 int32_t AVCodecVideoDecoderImpl::Init(AVCodecType type, bool isMimeType, const std::string &name, Format &format)
80 {
81     AVCODEC_SYNC_TRACE_WITH_TAG;
82 
83     int32_t ret = AVCodecServiceFactory::GetInstance().CreateCodecService(codecClient_);
84     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, ret, "Codec client create failed");
85     ret = codecClient_->Init(type, isMimeType, name, *format.GetMeta());
86     this->SetTag(codecClient_->GetTag()); // execute with CodecServiceProxy initialization completed
87     return ret;
88 }
89 
AVCodecVideoDecoderImpl()90 AVCodecVideoDecoderImpl::AVCodecVideoDecoderImpl()
91 {
92     AVCODEC_LOGD_WITH_TAG("AVCodecVideoDecoderImpl:0x%{public}06" PRIXPTR " Instances create", FAKE_POINTER(this));
93 }
94 
~AVCodecVideoDecoderImpl()95 AVCodecVideoDecoderImpl::~AVCodecVideoDecoderImpl()
96 {
97     if (codecClient_ != nullptr) {
98         (void)AVCodecServiceFactory::GetInstance().DestroyCodecService(codecClient_);
99         codecClient_ = nullptr;
100     }
101     AVCODEC_LOGD_WITH_TAG("AVCodecVideoDecoderImpl:0x%{public}06" PRIXPTR " Instances destroy", FAKE_POINTER(this));
102 }
103 
Configure(const Format & format)104 int32_t AVCodecVideoDecoderImpl::Configure(const Format &format)
105 {
106     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
107 
108     AVCODEC_SYNC_TRACE_WITH_TAG;
109     return codecClient_->Configure(format);
110 }
111 
Prepare()112 int32_t AVCodecVideoDecoderImpl::Prepare()
113 {
114     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
115     AVCODEC_SYNC_TRACE_WITH_TAG;
116 
117     return codecClient_->Prepare();
118 }
119 
Start()120 int32_t AVCodecVideoDecoderImpl::Start()
121 {
122     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
123 
124     AVCODEC_SYNC_TRACE_WITH_TAG;
125     return codecClient_->Start();
126 }
127 
Stop()128 int32_t AVCodecVideoDecoderImpl::Stop()
129 {
130     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
131 
132     AVCODEC_SYNC_TRACE_WITH_TAG;
133     return codecClient_->Stop();
134 }
135 
Flush()136 int32_t AVCodecVideoDecoderImpl::Flush()
137 {
138     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
139 
140     AVCODEC_SYNC_TRACE_WITH_TAG;
141     return codecClient_->Flush();
142 }
143 
Reset()144 int32_t AVCodecVideoDecoderImpl::Reset()
145 {
146     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
147 
148     AVCODEC_SYNC_TRACE_WITH_TAG;
149     return codecClient_->Reset();
150 }
151 
Release()152 int32_t AVCodecVideoDecoderImpl::Release()
153 {
154     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
155 
156     AVCODEC_SYNC_TRACE_WITH_TAG;
157     return codecClient_->Release();
158 }
159 
SetOutputSurface(sptr<Surface> surface)160 int32_t AVCodecVideoDecoderImpl::SetOutputSurface(sptr<Surface> surface)
161 {
162     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
163 
164     AVCODEC_SYNC_TRACE_WITH_TAG;
165     return codecClient_->SetOutputSurface(surface);
166 }
167 
QueueInputBuffer(uint32_t index,AVCodecBufferInfo info,AVCodecBufferFlag flag)168 int32_t AVCodecVideoDecoderImpl::QueueInputBuffer(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag)
169 {
170     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
171 
172     AVCODEC_SYNC_TRACE_WITH_TAG;
173     return codecClient_->QueueInputBuffer(index, info, flag);
174 }
175 
QueueInputBuffer(uint32_t index)176 int32_t AVCodecVideoDecoderImpl::QueueInputBuffer(uint32_t index)
177 {
178     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
179 
180     AVCODEC_SYNC_TRACE_WITH_TAG;
181     return codecClient_->QueueInputBuffer(index);
182 }
183 
GetOutputFormat(Format & format)184 int32_t AVCodecVideoDecoderImpl::GetOutputFormat(Format &format)
185 {
186     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
187 
188     AVCODEC_SYNC_TRACE_WITH_TAG;
189     return codecClient_->GetOutputFormat(format);
190 }
191 
ReleaseOutputBuffer(uint32_t index,bool render)192 int32_t AVCodecVideoDecoderImpl::ReleaseOutputBuffer(uint32_t index, bool render)
193 {
194     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
195 
196     AVCODEC_SYNC_TRACE_WITH_TAG;
197     return codecClient_->ReleaseOutputBuffer(index, render);
198 }
199 
RenderOutputBufferAtTime(uint32_t index,int64_t renderTimestampNs)200 int32_t AVCodecVideoDecoderImpl::RenderOutputBufferAtTime(uint32_t index, int64_t renderTimestampNs)
201 {
202     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
203 
204     AVCODEC_SYNC_TRACE_WITH_TAG;
205     return codecClient_->RenderOutputBufferAtTime(index, renderTimestampNs);
206 }
207 
SetParameter(const Format & format)208 int32_t AVCodecVideoDecoderImpl::SetParameter(const Format &format)
209 {
210     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
211 
212     AVCODEC_SYNC_TRACE_WITH_TAG;
213     return codecClient_->SetParameter(format);
214 }
215 
SetCallback(const std::shared_ptr<AVCodecCallback> & callback)216 int32_t AVCodecVideoDecoderImpl::SetCallback(const std::shared_ptr<AVCodecCallback> &callback)
217 {
218     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
219     CHECK_AND_RETURN_RET_LOG_WITH_TAG(callback != nullptr, AVCS_ERR_INVALID_VAL, "Callback is nullptr");
220 
221     AVCODEC_SYNC_TRACE_WITH_TAG;
222     return codecClient_->SetCallback(callback);
223 }
224 
SetCallback(const std::shared_ptr<MediaCodecCallback> & callback)225 int32_t AVCodecVideoDecoderImpl::SetCallback(const std::shared_ptr<MediaCodecCallback> &callback)
226 {
227     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr, AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
228     CHECK_AND_RETURN_RET_LOG_WITH_TAG(callback != nullptr, AVCS_ERR_INVALID_VAL, "Callback is nullptr");
229 
230     AVCODEC_SYNC_TRACE_WITH_TAG;
231     return codecClient_->SetCallback(callback);
232 }
233 
234 #ifdef SUPPORT_DRM
SetDecryptConfig(const sptr<DrmStandard::IMediaKeySessionService> & keySessionProxy,const bool svpFlag)235 int32_t AVCodecVideoDecoderImpl::SetDecryptConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySessionProxy,
236     const bool svpFlag)
237 {
238     AVCODEC_LOGI_WITH_TAG("AVCodecVideoDecoderImpl SetDecryptConfig proxy");
239     CHECK_AND_RETURN_RET_LOG_WITH_TAG(codecClient_ != nullptr,
240         AVCS_ERR_INVALID_OPERATION, "Codec service is nullptr");
241     CHECK_AND_RETURN_RET_LOG_WITH_TAG(keySessionProxy != nullptr,
242         AVCS_ERR_INVALID_OPERATION, "keySessionProxy is nullptr");
243 
244     AVCODEC_SYNC_TRACE_WITH_TAG;
245     return codecClient_->SetDecryptConfig(keySessionProxy, svpFlag);
246 }
247 #endif
248 } // namespace MediaAVCodec
249 } // namespace OHOS
250