1 /*
2 * Copyright (C) 2025 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 #define AUDIO_DECODER_ADAPTER_CPP
16
17 #include "avcodec_errors.h"
18 #include "common/log.h"
19 #include "meta/meta.h"
20 #include "audio_decoder_adapter.h"
21
22 namespace {
23 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_SYSTEM_PLAYER, "AudioDecoderAdapter"};
24 }
25
26 namespace OHOS {
27 namespace Media {
28
29 using namespace MediaAVCodec;
30
AudioDecoderAdapter()31 AudioDecoderAdapter::AudioDecoderAdapter()
32 {
33 }
34
~AudioDecoderAdapter()35 AudioDecoderAdapter::~AudioDecoderAdapter()
36 {
37 MEDIA_LOG_I("~AudioDecoderAdapter.");
38 FALSE_RETURN_MSG(audiocodec_ != nullptr, "audiocodec_ is nullptr");
39 audiocodec_->Release();
40 }
41
Init(bool isMimeType,const std::string & name)42 Status AudioDecoderAdapter::Init(bool isMimeType, const std::string &name)
43 {
44 MEDIA_LOG_D("isMimeType is %{public}i, name is %{public}s", isMimeType, name.c_str());
45 if (isMimeType) {
46 audiocodec_ = MediaAVCodec::AudioCodecFactory::CreateByMime(name, false);
47 } else {
48 audiocodec_ = MediaAVCodec::AudioCodecFactory::CreateByName(name);
49 }
50 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
51 return Status::OK;
52 }
53
Configure(const std::shared_ptr<Meta> & parameter)54 Status AudioDecoderAdapter::Configure(const std::shared_ptr<Meta> ¶meter)
55 {
56 MEDIA_LOG_D("In");
57 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
58 int32_t ret = audiocodec_->Configure(parameter);
59 if (ret == AVCodecServiceErrCode::AVCS_ERR_INVALID_VAL) {
60 MEDIA_LOG_E("Configure ret is %{public}d", ret);
61 return Status::ERROR_UNSUPPORTED_FORMAT;
62 }
63 FALSE_RETURN_V(ret == AVCodecServiceErrCode::AVCS_ERR_OK, Status::ERROR_INVALID_STATE);
64 MEDIA_LOG_D("out");
65 return Status::OK;
66 }
67
SetParameter(const std::shared_ptr<Meta> & parameter)68 Status AudioDecoderAdapter::SetParameter(const std::shared_ptr<Meta> ¶meter)
69 {
70 MEDIA_LOG_D("In");
71 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
72 FALSE_RETURN_V(parameter != nullptr, Status::ERROR_INVALID_PARAMETER);
73 int32_t ret = audiocodec_->SetParameter(parameter);
74 return ret == AVCodecServiceErrCode::AVCS_ERR_OK ? Status::OK : Status::ERROR_INVALID_STATE;
75 }
76
Prepare()77 Status AudioDecoderAdapter::Prepare()
78 {
79 MEDIA_LOG_D("In");
80 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
81 int32_t ret = audiocodec_->Prepare();
82 FALSE_RETURN_V(ret == AVCodecServiceErrCode::AVCS_ERR_OK, Status::ERROR_INVALID_STATE);
83 isRunning_ = false;
84 MEDIA_LOG_D("out");
85 return Status::OK;
86 }
87
Start()88 Status AudioDecoderAdapter::Start()
89 {
90 MEDIA_LOG_D("In");
91 if (isRunning_.load()) {
92 return Status::OK;
93 }
94 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
95 int32_t ret = audiocodec_->Start();
96 FALSE_RETURN_V(ret == AVCodecServiceErrCode::AVCS_ERR_OK, Status::ERROR_INVALID_STATE);
97 isRunning_ = true;
98 MEDIA_LOG_D("out");
99 return Status::OK;
100 }
101
Stop()102 Status AudioDecoderAdapter::Stop()
103 {
104 MEDIA_LOG_D("In");
105 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::OK, "audiocodec_ is nullptr");
106 int32_t ret = audiocodec_->Stop();
107 FALSE_RETURN_V(ret == AVCodecServiceErrCode::AVCS_ERR_OK, Status::ERROR_INVALID_STATE);
108 isRunning_ = false;
109 MEDIA_LOG_D("out");
110 return Status::OK;
111 }
112
Flush()113 Status AudioDecoderAdapter::Flush()
114 {
115 MEDIA_LOG_D("In");
116 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
117 int32_t ret = audiocodec_->Flush();
118 FALSE_RETURN_V(ret == AVCodecServiceErrCode::AVCS_ERR_OK, Status::ERROR_INVALID_STATE);
119 isRunning_ = false;
120 MEDIA_LOG_D("out");
121 return Status::OK;
122 }
123
Reset()124 Status AudioDecoderAdapter::Reset()
125 {
126 MEDIA_LOG_D("In");
127 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::OK, "audiocodec_ is nullptr");
128 int32_t ret = audiocodec_->Reset();
129 FALSE_RETURN_V(ret == AVCodecServiceErrCode::AVCS_ERR_OK, Status::ERROR_INVALID_STATE);
130 isRunning_ = false;
131 MEDIA_LOG_D("out");
132 return Status::OK;
133 }
134
Release()135 Status AudioDecoderAdapter::Release()
136 {
137 MEDIA_LOG_D("In");
138 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::OK, "audiocodec_ is nullptr");
139 int32_t ret = audiocodec_->Release();
140 FALSE_RETURN_V(ret == AVCodecServiceErrCode::AVCS_ERR_OK, Status::ERROR_INVALID_STATE);
141 isRunning_ = false;
142 MEDIA_LOG_D("out");
143 return Status::OK;
144 }
145
SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> & bufferQueueProducer)146 Status AudioDecoderAdapter::SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer)
147 {
148 FALSE_RETURN_V(bufferQueueProducer != nullptr, Status::ERROR_INVALID_PARAMETER);
149 outputBufferQueueProducer_ = bufferQueueProducer;
150 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
151 int32_t ret = audiocodec_->SetOutputBufferQueue(bufferQueueProducer);
152 return ret == AVCodecServiceErrCode::AVCS_ERR_OK ? Status::OK : Status::ERROR_INVALID_STATE;
153 }
154
GetInputBufferQueue()155 sptr<Media::AVBufferQueueProducer> AudioDecoderAdapter::GetInputBufferQueue()
156 {
157 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, nullptr, "audiocodec_ is nullptr");
158 inputBufferQueueProducer_ = audiocodec_->GetInputBufferQueue();
159 return inputBufferQueueProducer_;
160 }
161
GetInputBufferQueueConsumer()162 sptr<Media::AVBufferQueueConsumer> AudioDecoderAdapter::GetInputBufferQueueConsumer()
163 {
164 return audiocodec_ != nullptr ? audiocodec_->GetInputBufferQueueConsumer() : nullptr;
165 }
166
GetOutputBufferQueueProducer()167 sptr<Media::AVBufferQueueProducer> AudioDecoderAdapter::GetOutputBufferQueueProducer()
168 {
169 return audiocodec_ != nullptr ? audiocodec_->GetOutputBufferQueueProducer() : nullptr;
170 }
171
ProcessInputBufferInner(bool isTriggeredByOutPort,bool isFlushed)172 void AudioDecoderAdapter::ProcessInputBufferInner(bool isTriggeredByOutPort, bool isFlushed)
173 {
174 FALSE_RETURN_MSG(audiocodec_ != nullptr, "ProcessInputBufferInner audiocodec_ is nullptr");
175 audiocodec_->ProcessInputBufferInner(isTriggeredByOutPort, isFlushed);
176 }
177
GetOutputFormat(std::shared_ptr<Meta> & parameter)178 int32_t AudioDecoderAdapter::GetOutputFormat(std::shared_ptr<Meta> ¶meter)
179 {
180 FALSE_RETURN_V(parameter != nullptr, (int32_t)Status::ERROR_INVALID_PARAMETER);
181 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, (int32_t)Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
182 return audiocodec_->GetOutputFormat(parameter);
183 }
184
ChangePlugin(const std::string & mime,bool isEncoder,const std::shared_ptr<Meta> & meta)185 Status AudioDecoderAdapter::ChangePlugin(const std::string &mime, bool isEncoder, const std::shared_ptr<Meta> &meta)
186 {
187 FALSE_RETURN_V(meta != nullptr, Status::ERROR_INVALID_PARAMETER);
188 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
189 int32_t ret = audiocodec_->ChangePlugin(mime, isEncoder, meta);
190 return ret == AVCodecServiceErrCode::AVCS_ERR_OK ? Status::OK : Status::ERROR_INVALID_STATE;
191 }
192
SetDumpInfo(bool isDump,uint64_t instanceId)193 void AudioDecoderAdapter::SetDumpInfo(bool isDump, uint64_t instanceId)
194 {
195 FALSE_RETURN_MSG(audiocodec_ != nullptr, "audiocodec_ is nullptr");
196 audiocodec_->SetDumpInfo(isDump, instanceId);
197 }
198
OnDumpInfo(int32_t fd)199 void AudioDecoderAdapter::OnDumpInfo(int32_t fd)
200 {
201 MEDIA_LOG_D("OnDumpInfo called.");
202 FALSE_RETURN_MSG(fd >= 0, "OnDumpInfo fd is invalid.");
203 std::string dumpString;
204 FALSE_RETURN_MSG(inputBufferQueueProducer_ != nullptr, "inputBufferQueueProducer_ is nullptr");
205 FALSE_RETURN_MSG(outputBufferQueueProducer_ != nullptr, "outputBufferQueueProducer_ is nullptr");
206 dumpString += "AudioDecoderAdapter inputBufferQueueProducer_ size is:" +
207 std::to_string(inputBufferQueueProducer_->GetQueueSize()) + "\n";
208 dumpString += "AudioDecoderAdapter outputBufferQueueProducer_ size is:" +
209 std::to_string(outputBufferQueueProducer_->GetQueueSize()) + "\n";
210 int ret = write(fd, dumpString.c_str(), dumpString.size());
211 FALSE_RETURN_MSG(ret >= 0, "AudioDecoderAdapter::OnDumpInfo write failed.");
212 }
213
NotifyEos()214 int32_t AudioDecoderAdapter::NotifyEos()
215 {
216 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, (int32_t)Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
217 int ret = audiocodec_->NotifyEos();
218 return ret;
219 }
220
SetCodecCallback(const std::shared_ptr<MediaAVCodec::MediaCodecCallback> & codecCallback)221 int32_t AudioDecoderAdapter::SetCodecCallback(const std::shared_ptr<MediaAVCodec::MediaCodecCallback> &codecCallback)
222 {
223 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, (int32_t)Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
224 return audiocodec_->SetCodecCallback(codecCallback);
225 }
226
SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> & keySession,const bool svpFlag)227 int32_t AudioDecoderAdapter::SetAudioDecryptionConfig(
228 const sptr<DrmStandard::IMediaKeySessionService> &keySession, const bool svpFlag)
229 {
230 FALSE_RETURN_V_MSG(audiocodec_ != nullptr, (int32_t)Status::ERROR_INVALID_STATE, "audiocodec_ is nullptr");
231 return audiocodec_->SetAudioDecryptionConfig(keySession, svpFlag);
232 }
233
ProcessInputBuffer()234 void AudioDecoderAdapter::ProcessInputBuffer()
235 {
236 FALSE_RETURN_MSG(audiocodec_ != nullptr, "ProcessInputBuffer audiocodec_ is nullptr");
237 audiocodec_->ProcessInputBuffer();
238 }
239 } // namespace Media
240 } // namespace OHOS
241