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