• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &parameter)
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> &parameter)
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> &parameter)
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