• 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 
16 #ifndef AUDIO_CODEC_DECODER_ADAPTER_IMPL_H
17 #define AUDIO_CODEC_DECODER_ADAPTER_IMPL_H
18 
19 #include <atomic>
20 #include <condition_variable>
21 #include <cstdint>
22 #include <mutex>
23 #include <queue>
24 #include <map>
25 
26 #include "native_averrors.h"
27 #include "native_avcodec_audiodecoder.h"
28 #include "native_avcodec_base.h"
29 #include "native_cencinfo.h"
30 #include "native_avformat.h"
31 #include "avcodec_common.h"
32 
33 #include "audio_codec_decoder_adapter.h"
34 #include "audio_cenc_info_adapter.h"
35 
36 namespace OHOS::NWeb {
37 
38 enum class AudioMimeType {
39     MIMETYPE_UNKNOW = 0,
40     MIMETYPE_AUDIO_AAC = 1, // "audio/mp4a-latm"
41     MIMETYPE_AUDIO_FLAC = 2, // "audio/flac"
42     MIMETYPE_AUDIO_VORBIS = 3, // "audio/vorbis"
43     MIMETYPE_AUDIO_MPEG = 4, // "audio/mpeg"
44     MIMETYPE_AUDIO_AMR_NB = 5, // "audio/3gpp"
45     MIMETYPE_AUDIO_AMR_WB = 6, // "audio/amr-wb"
46     MIMETYPE_AUDIO_G711MU = 7, // "audio/g711mu"
47     MIMETYPE_AUDIO_APE = 8 // "audio/x-ape"
48 };
49 
50 class AudioDecoderFormatAdapterImpl : public AudioDecoderFormatAdapter {
51 public:
52     AudioDecoderFormatAdapterImpl() = default;
53 
54     ~AudioDecoderFormatAdapterImpl() override;
55 
56     int32_t GetSampleRate() override;
57 
58     int32_t GetChannelCount() override;
59 
60     int64_t GetBitRate() override;
61 
62     int32_t GetMaxInputSize() override;
63 
64     bool GetAACIsAdts() override;
65 
66     int32_t GetAudioSampleFormat() override;
67 
68     int32_t GetIdentificationHeader() override;
69 
70     int32_t GetSetupHeader() override;
71 
72     uint8_t* GetCodecConfig() override;
73 
74     uint32_t GetCodecConfigSize() override;
75 
76     void SetSampleRate(int32_t sampleRate) override;
77 
78     void SetChannelCount(int32_t channelCount) override;
79 
80     void SetBitRate(int64_t bitRate) override;
81 
82     void SetMaxInputSize(int32_t maxInputSize) override;
83 
84     void SetAACIsAdts(bool isAdts) override;
85 
86     void SetAudioSampleFormat(int32_t audioSampleFormat) override;
87 
88     void SetIdentificationHeader(int32_t idHeader) override;
89 
90     void SetSetupHeader(int32_t setupHeader) override;
91 
92     void SetCodecConfig(uint8_t* codecConfig) override;
93 
94     void SetCodecConfigSize(uint32_t size) override;
95 
96     static void PrintFormatData(std::shared_ptr<AudioDecoderFormatAdapter> format);
97 
98 private:
99     int32_t sampleRate_ = 0;
100     int32_t channelCount_ = 0;
101     int32_t bitRate_ = 0;
102     int32_t maxInputSize_ = 0;
103     bool aacIsAdts_ = false;
104     int32_t audioSampleFormat_ = 0;
105     int32_t idHeader_ = 0;
106     int32_t setupHeader_ = 0;
107     uint8_t* codecConfig_ = nullptr;
108     uint32_t codecConfigSize_ = 0;
109 };
110 
111 class AudioDecoderCallbackAdapterImpl {
112 public:
113     explicit AudioDecoderCallbackAdapterImpl(std::shared_ptr<OHOS::NWeb::AudioDecoderCallbackAdapter> cb);
114 
115     ~AudioDecoderCallbackAdapterImpl() = default;
116 
117     void OnError(int32_t errorCode);
118 
119     void OnOutputFormatChanged();
120 
121     void OnInputBufferAvailable(uint32_t index);
122 
123     void OnOutputBufferAvailable(
124         uint32_t index, uint8_t *bufferData, int32_t size, int64_t pts, int32_t offset, uint32_t flags);
125 
126 private:
127     std::shared_ptr<OHOS::NWeb::AudioDecoderCallbackAdapter> cb_ = nullptr;
128 };
129 
130 class AudioCodecDecoderAdapterImpl : public AudioCodecDecoderAdapter {
131 public:
132     AudioCodecDecoderAdapterImpl();
133 
134     ~AudioCodecDecoderAdapterImpl() override;
135 
136     AudioDecoderAdapterCode CreateAudioDecoderByMime(const std::string& mimetype) override;
137 
138     AudioDecoderAdapterCode CreateAudioDecoderByName(const std::string& name) override;
139 
140     AudioDecoderAdapterCode ConfigureDecoder(const std::shared_ptr<AudioDecoderFormatAdapter> format) override;
141 
142     AudioDecoderAdapterCode SetParameterDecoder(const std::shared_ptr<AudioDecoderFormatAdapter> format) override;
143 
144     AudioDecoderAdapterCode PrepareDecoder() override;
145 
146     AudioDecoderAdapterCode StartDecoder() override;
147 
148     AudioDecoderAdapterCode StopDecoder() override;
149 
150     AudioDecoderAdapterCode FlushDecoder() override;
151 
152     AudioDecoderAdapterCode ResetDecoder() override;
153 
154     AudioDecoderAdapterCode ReleaseDecoder() override;
155 
156     AudioDecoderAdapterCode QueueInputBufferDec(uint32_t index, int64_t presentationTimeUs, uint8_t *bufferData,
157         int32_t bufferSize, std::shared_ptr<AudioCencInfoAdapter> cencInfo, bool isEncrypted,
158         BufferFlag flag) override;
159 
160     AudioDecoderAdapterCode GetOutputFormatDec(std::shared_ptr<AudioDecoderFormatAdapter> format) override;
161 
162     AudioDecoderAdapterCode ReleaseOutputBufferDec(uint32_t index) override;
163 
164     AudioDecoderAdapterCode SetCallbackDec(
165         const std::shared_ptr<OHOS::NWeb::AudioDecoderCallbackAdapter> callback) override;
166 
167     AudioDecoderAdapterCode SetDecryptionConfig(void *session, bool secureAudio) override;
168 
169     OH_AVCodec* GetAVCodec();
170 
171     AudioDecoderCallbackAdapterImpl* GetAudioDecoderCallBack();
172 
173     void SetInputBuffer(uint32_t index, OH_AVBuffer *buffer);
174 
175     void SetOutputBuffer(uint32_t index, OH_AVBuffer *buffer);
176 
177     static BufferFlag GetBufferFlag(OHOS::MediaAVCodec::AVCodecBufferFlag codecBufferFlag);
178 
179     static std::mutex& GetDecoderMutex();
180 
181 private:
182 
183     AudioDecoderAdapterCode GetParamFromAVFormat(
184         OH_AVFormat *avFormat, std::shared_ptr<AudioDecoderFormatAdapter> format);
185 
186     AudioDecoderAdapterCode SetBufferCencInfo(uint32_t index, std::shared_ptr<AudioCencInfoAdapter> cencInfo);
187 
188     AudioDecoderAdapterCode SetAVCencInfo(OH_AVCencInfo *avCencInfo, std::shared_ptr<AudioCencInfoAdapter> cencInfo);
189 
190     OH_AVBuffer* GetInputBuffer(uint32_t index);
191 
192     OH_AVBuffer* GetOutputBuffer(uint32_t index);
193 
194     AudioMimeType mimeType_ = AudioMimeType::MIMETYPE_UNKNOW;
195     OH_AVCodec *decoder_  = nullptr;
196     std::shared_ptr<AudioDecoderCallbackAdapterImpl> callback_ = nullptr;
197     std::mutex inMutex_;
198     std::mutex outMutex_;
199     std::map<uint32_t, OH_AVBuffer *> inputBuffers_;
200     std::map<uint32_t, OH_AVBuffer *> outputBuffers_;
201     static std::mutex decoderMutex_;
202 };
203 
204 class AudioDecoderCallbackManager {
205 public:
206     static void OnError(OH_AVCodec *codec, int32_t errorCode, void *userData);
207 
208     static void OnOutputFormatChanged(OH_AVCodec *codec, OH_AVFormat *format, void *userData);
209 
210     static void OnInputBufferAvailable(OH_AVCodec *codec, uint32_t index, OH_AVBuffer *data, void *userData);
211 
212     static void OnOutputBufferAvailable(OH_AVCodec *codec, uint32_t index, OH_AVBuffer *data, void *userData);
213 
214     static OHOS::NWeb::AudioCodecDecoderAdapterImpl *FindAudioDecoder(OH_AVCodec *decoder);
215 
216     static void DeleteAudioDecoder(OH_AVCodec *decoder);
217 
218     static void AddAudioDecoder(OHOS::NWeb::AudioCodecDecoderAdapterImpl *decoder);
219 
220 private:
221     static std::map<OH_AVCodec *, OHOS::NWeb::AudioCodecDecoderAdapterImpl *> decoders_;
222 
223     static std::mutex decodersMapMutex_;
224 };
225 } // namespace OHOS::NWeb
226 
227 #endif // MEDIA_CODEC_DECODER_ADAPTER_H
228