• 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 #ifndef CODEC_AUDIO_CODEC_H
17 #define CODEC_AUDIO_CODEC_H
18 
19 #include "audio_base_codec.h"
20 #include "media_codec.h"
21 #include "avcodec_common.h"
22 #include "codecbase.h"
23 #include "nocopyable.h"
24 
25 namespace OHOS {
26 namespace MediaAVCodec {
27 class AudioCodec;
28 class AudioCodecCallback : public Media::AudioBaseCodecCallback {
29 public:
AudioCodecCallback(const std::shared_ptr<AudioCodec> & codec)30     AudioCodecCallback(const std::shared_ptr<AudioCodec> &codec) : codec_(codec) {}
~AudioCodecCallback()31     virtual ~AudioCodecCallback()
32     {
33         codec_ = nullptr;
34     }
35 
36     void OnError(Media::CodecErrorType errorType, int32_t errorCode) override;
37 
38     void OnOutputBufferDone(const std::shared_ptr<AVBuffer> &outputBuffer) override;
39 
40     void OnOutputFormatChanged(const std::shared_ptr<Meta> &format) override;
41 
42 private:
43     std::shared_ptr<AudioCodec> codec_;
44 };
45 
46 class AudioCodec : public std::enable_shared_from_this<AudioCodec>, public CodecBase {
47 public:
AudioCodec()48     explicit AudioCodec()
49     {
50         mediaCodec_ = std::make_shared<Media::MediaCodec>();
51     }
CreateCodecByName(const std::string & name)52     int32_t CreateCodecByName(const std::string &name) override
53     {
54         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->Init(name)));
55     }
56 
Configure(const std::shared_ptr<Media::Meta> & meta)57     int32_t Configure(const std::shared_ptr<Media::Meta> &meta) override
58     {
59         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->Configure(meta)));
60     }
SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> & bufferQueueProducer)61     int32_t SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer) override
62     {
63         return StatusToAVCodecServiceErrCode(
64             static_cast<Media::Status>(mediaCodec_->SetOutputBufferQueue(bufferQueueProducer)));
65     }
66 
SetCodecCallback(const std::shared_ptr<Media::CodecCallback> & codecCallback)67     int32_t SetCodecCallback(const std::shared_ptr<Media::CodecCallback> &codecCallback)
68     {
69         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->SetCodecCallback(codecCallback)));
70     }
71 
SetCallback(const std::shared_ptr<MediaCodecCallback> & codecCallback)72     int32_t SetCallback(const std::shared_ptr<MediaCodecCallback> &codecCallback) override
73     {
74         callback_ = codecCallback;
75         mediaCallback_ = std::make_shared<AudioCodecCallback>(shared_from_this());
76         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->SetCodecCallback(mediaCallback_)));
77     }
78 
Prepare()79     int32_t Prepare() override
80     {
81         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->Prepare()));
82     }
83 
GetInputBufferQueue()84     sptr<Media::AVBufferQueueProducer> GetInputBufferQueue() override
85     {
86         return mediaCodec_->GetInputBufferQueue();
87     }
88 
Start()89     int32_t Start() override
90     {
91         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->Start()));
92     }
93 
Stop()94     int32_t Stop() override
95     {
96         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->Stop()));
97     }
98 
Flush()99     int32_t Flush() override
100     {
101         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->Flush()));
102     }
103 
Reset()104     int32_t Reset() override
105     {
106         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->Reset()));
107     }
108 
Release()109     int32_t Release() override
110     {
111         int32_t ret = StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->Release()));
112         mediaCallback_ = nullptr;
113         return ret;
114     }
115 
NotifyEos()116     int32_t NotifyEos() override
117     {
118         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->NotifyEos()));
119     }
120 
SetParameter(const std::shared_ptr<Media::Meta> & parameter)121     int32_t SetParameter(const std::shared_ptr<Media::Meta> &parameter) override
122     {
123         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->SetParameter(parameter)));
124     }
125 
GetOutputFormat(std::shared_ptr<Media::Meta> & parameter)126     int32_t GetOutputFormat(std::shared_ptr<Media::Meta> &parameter) override
127     {
128         return StatusToAVCodecServiceErrCode(static_cast<Media::Status>(mediaCodec_->GetOutputFormat(parameter)));
129     }
130 
Configure(const MediaAVCodec::Format & format)131     int32_t Configure(const MediaAVCodec::Format &format) override
132     {
133         (void)format;
134         return 0;
135     }
SetParameter(const MediaAVCodec::Format & format)136     int32_t SetParameter(const MediaAVCodec::Format &format) override
137     {
138         (void)format;
139         return 0;
140     }
141 
GetOutputFormat(MediaAVCodec::Format & format)142     int32_t GetOutputFormat(MediaAVCodec::Format &format) override
143     {
144         (void)format;
145         return 0;
146     }
147 
ReleaseOutputBuffer(uint32_t index)148     int32_t ReleaseOutputBuffer(uint32_t index) override
149     {
150         (void)index;
151         return 0;
152     }
153 
OnError(CodecErrorType errorType,int32_t errorCode)154     void OnError(CodecErrorType errorType, int32_t errorCode)
155     {
156         auto realPtr = callback_.lock();
157         if (realPtr == nullptr) {
158             return;
159         }
160         switch (errorType) {
161             case CodecErrorType::CODEC_DRM_DECRYTION_FAILED:
162                 realPtr->OnError(AVCodecErrorType::AVCODEC_ERROR_DECRYTION_FAILED,
163                     StatusToAVCodecServiceErrCode(static_cast<Media::Status>(errorCode)));
164                 break;
165             default:
166                 realPtr->OnError(AVCodecErrorType::AVCODEC_ERROR_INTERNAL,
167                     StatusToAVCodecServiceErrCode(static_cast<Media::Status>(errorCode)));
168                 break;
169         }
170     }
171 
OnOutputBufferDone(const std::shared_ptr<AVBuffer> & outputBuffer)172     void OnOutputBufferDone(const std::shared_ptr<AVBuffer> &outputBuffer)
173     {
174         auto realPtr = callback_.lock();
175         if (realPtr != nullptr) {
176             realPtr->OnOutputBufferAvailable(0, outputBuffer);
177         }
178     }
179 
OnOutputFormatChanged(const std::shared_ptr<Meta> & format)180     void OnOutputFormatChanged(const std::shared_ptr<Meta> &format)
181     {
182         auto realPtr = callback_.lock();
183         if (realPtr != nullptr) {
184             Media::Format outputFormat;
185             outputFormat.SetMeta(format);
186             realPtr->OnOutputFormatChanged(outputFormat);
187         }
188     }
189 
190 #ifdef SUPPORT_DRM
SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> & keySession,const bool svpFlag)191     int32_t SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession,
192                                      const bool svpFlag) override
193     {
194         return StatusToAVCodecServiceErrCode(
195             static_cast<Media::Status>(mediaCodec_->SetAudioDecryptionConfig(keySession, svpFlag)));
196     }
197 #endif
198 
199 private:
200     std::shared_ptr<Media::MediaCodec> mediaCodec_;
201     // other callback from north interface(codec server)
202     std::weak_ptr<MediaCodecCallback> callback_;
203     // self callback register in mediaCodec_
204     std::shared_ptr<Media::AudioBaseCodecCallback> mediaCallback_ = nullptr;
205 };
206 
OnError(Media::CodecErrorType errorType,int32_t errorCode)207 void AudioCodecCallback::OnError(Media::CodecErrorType errorType, int32_t errorCode)
208 {
209     if (codec_) {
210         codec_->OnError(errorType, errorCode);
211     }
212 }
213 
OnOutputBufferDone(const std::shared_ptr<AVBuffer> & outputBuffer)214 void AudioCodecCallback::OnOutputBufferDone(const std::shared_ptr<AVBuffer> &outputBuffer)
215 {
216     if (codec_) {
217         codec_->OnOutputBufferDone(outputBuffer);
218     }
219 }
220 
OnOutputFormatChanged(const std::shared_ptr<Meta> & format)221 void AudioCodecCallback::OnOutputFormatChanged(const std::shared_ptr<Meta> &format)
222 {
223     if (codec_) {
224         codec_->OnOutputFormatChanged(format);
225     }
226 }
227 
228 } // namespace MediaAVCodec
229 } // namespace OHOS
230 #endif