1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd. 3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License. 5da853ecaSopenharmony_ci * You may obtain a copy of the License at 6da853ecaSopenharmony_ci * 7da853ecaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8da853ecaSopenharmony_ci * 9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and 13da853ecaSopenharmony_ci * limitations under the License. 14da853ecaSopenharmony_ci */ 15da853ecaSopenharmony_ci 16da853ecaSopenharmony_ci#ifndef AUDIO_DECODER_RESET_DEMO_BASE_H 17da853ecaSopenharmony_ci#define AUDIO_DECODER_RESET_DEMO_BASE_H 18da853ecaSopenharmony_ci 19da853ecaSopenharmony_ci#include <atomic> 20da853ecaSopenharmony_ci#include <fstream> 21da853ecaSopenharmony_ci#include <queue> 22da853ecaSopenharmony_ci#include <string> 23da853ecaSopenharmony_ci#include <thread> 24da853ecaSopenharmony_ci 25da853ecaSopenharmony_ci#include "native_avcodec_audiodecoder.h" 26da853ecaSopenharmony_ci#include "nocopyable.h" 27da853ecaSopenharmony_ci#include "avcodec_audio_common.h" 28da853ecaSopenharmony_ci 29da853ecaSopenharmony_cinamespace OHOS { 30da853ecaSopenharmony_cinamespace MediaAVCodec { 31da853ecaSopenharmony_cinamespace AudioDemoAuto { 32da853ecaSopenharmony_ciextern void OnError(OH_AVCodec* codec, int32_t errorCode, void* userData); 33da853ecaSopenharmony_ciextern void OnOutputFormatChanged(OH_AVCodec* codec, OH_AVFormat* format, void* userData); 34da853ecaSopenharmony_ciextern void OnInputBufferAvailable(OH_AVCodec* codec, uint32_t index, OH_AVMemory* data, void* userData); 35da853ecaSopenharmony_ciextern void OnOutputBufferAvailable(OH_AVCodec* codec, uint32_t index, OH_AVMemory* data, 36da853ecaSopenharmony_ci OH_AVCodecBufferAttr* attr, void* userData); 37da853ecaSopenharmony_ci 38da853ecaSopenharmony_cienum AudioFormatType : int32_t { 39da853ecaSopenharmony_ci TYPE_AAC = 0, 40da853ecaSopenharmony_ci TYPE_FLAC = 1, 41da853ecaSopenharmony_ci TYPE_MP3 = 2, 42da853ecaSopenharmony_ci TYPE_VORBIS = 3, 43da853ecaSopenharmony_ci TYPE_AMRNB = 4, 44da853ecaSopenharmony_ci TYPE_AMRWB = 5, 45da853ecaSopenharmony_ci TYPE_OPUS = 6, 46da853ecaSopenharmony_ci TYPE_G711MU = 7, 47da853ecaSopenharmony_ci TYPE_MAX = 10, 48da853ecaSopenharmony_ci}; 49da853ecaSopenharmony_ci 50da853ecaSopenharmony_ciclass ADecSignal { 51da853ecaSopenharmony_cipublic: 52da853ecaSopenharmony_ci std::mutex inMutex_; 53da853ecaSopenharmony_ci std::mutex outMutex_; 54da853ecaSopenharmony_ci std::mutex startMutex_; 55da853ecaSopenharmony_ci std::condition_variable inCond_; 56da853ecaSopenharmony_ci std::condition_variable outCond_; 57da853ecaSopenharmony_ci std::condition_variable startCond_; 58da853ecaSopenharmony_ci std::queue<uint32_t> inQueue_; 59da853ecaSopenharmony_ci std::queue<uint32_t> outQueue_; 60da853ecaSopenharmony_ci std::queue<OH_AVMemory*> inBufferQueue_; 61da853ecaSopenharmony_ci std::queue<OH_AVMemory*> outBufferQueue_; 62da853ecaSopenharmony_ci std::queue<OH_AVCodecBufferAttr> attrQueue_; 63da853ecaSopenharmony_ci}; 64da853ecaSopenharmony_ci 65da853ecaSopenharmony_ciclass ADecDemoAuto : public NoCopyable { 66da853ecaSopenharmony_cipublic: 67da853ecaSopenharmony_ci ADecDemoAuto(); 68da853ecaSopenharmony_ci virtual ~ADecDemoAuto(); 69da853ecaSopenharmony_ci bool InitFile(std::string inputFile); 70da853ecaSopenharmony_ci bool RunCaseReset(const uint8_t *data, size_t size); 71da853ecaSopenharmony_ci 72da853ecaSopenharmony_ci OH_AVCodec* CreateByMime(const char* mime); 73da853ecaSopenharmony_ci 74da853ecaSopenharmony_ci OH_AVCodec* CreateByName(const char* mime); 75da853ecaSopenharmony_ci 76da853ecaSopenharmony_ci OH_AVErrCode Destroy(OH_AVCodec* codec); 77da853ecaSopenharmony_ci 78da853ecaSopenharmony_ci OH_AVErrCode SetCallback(OH_AVCodec* codec); 79da853ecaSopenharmony_ci 80da853ecaSopenharmony_ci OH_AVErrCode Configure(OH_AVCodec* codec, OH_AVFormat* format, int32_t channel, int32_t sampleRate); 81da853ecaSopenharmony_ci 82da853ecaSopenharmony_ci OH_AVErrCode Prepare(OH_AVCodec* codec); 83da853ecaSopenharmony_ci 84da853ecaSopenharmony_ci OH_AVErrCode Start(OH_AVCodec* codec); 85da853ecaSopenharmony_ci 86da853ecaSopenharmony_ci OH_AVErrCode Stop(OH_AVCodec* codec); 87da853ecaSopenharmony_ci 88da853ecaSopenharmony_ci OH_AVErrCode Flush(OH_AVCodec* codec); 89da853ecaSopenharmony_ci 90da853ecaSopenharmony_ci OH_AVErrCode Reset(OH_AVCodec* codec); 91da853ecaSopenharmony_ci 92da853ecaSopenharmony_ci OH_AVFormat* GetOutputDescription(OH_AVCodec* codec); 93da853ecaSopenharmony_ci 94da853ecaSopenharmony_ci OH_AVErrCode PushInputData(OH_AVCodec* codec, uint32_t index, int32_t size, int32_t offset); 95da853ecaSopenharmony_ci 96da853ecaSopenharmony_ci OH_AVErrCode PushInputDataEOS(OH_AVCodec* codec, uint32_t index); 97da853ecaSopenharmony_ci 98da853ecaSopenharmony_ci OH_AVErrCode FreeOutputData(OH_AVCodec* codec, uint32_t index); 99da853ecaSopenharmony_ci 100da853ecaSopenharmony_ci OH_AVErrCode IsValid(OH_AVCodec* codec, bool* isValid); 101da853ecaSopenharmony_ci 102da853ecaSopenharmony_ci uint32_t GetInputIndex(); 103da853ecaSopenharmony_ci 104da853ecaSopenharmony_ci uint32_t GetOutputIndex(); 105da853ecaSopenharmony_ciprivate: 106da853ecaSopenharmony_ci void ClearQueue(); 107da853ecaSopenharmony_ci int32_t CreateDec(); 108da853ecaSopenharmony_ci int32_t CreateDecByMime(); 109da853ecaSopenharmony_ci int32_t Configure(OH_AVFormat* format); 110da853ecaSopenharmony_ci int32_t Start(); 111da853ecaSopenharmony_ci int32_t Stop(); 112da853ecaSopenharmony_ci int32_t Flush(); 113da853ecaSopenharmony_ci int32_t Reset(); 114da853ecaSopenharmony_ci int32_t Release(); 115da853ecaSopenharmony_ci void InputFunc(); 116da853ecaSopenharmony_ci void OutputFunc(); 117da853ecaSopenharmony_ci void HandleInputEOS(const uint32_t index); 118da853ecaSopenharmony_ci bool InitFormat(OH_AVFormat *format); 119da853ecaSopenharmony_ci int32_t HandleNormalInput(const uint32_t& index, const int64_t pts, const size_t size); 120da853ecaSopenharmony_ci 121da853ecaSopenharmony_ci std::atomic<bool> isRunning_ = false; 122da853ecaSopenharmony_ci std::unique_ptr<std::thread> inputLoop_; 123da853ecaSopenharmony_ci std::unique_ptr<std::thread> outputLoop_; 124da853ecaSopenharmony_ci OH_AVCodec* audioDec_; 125da853ecaSopenharmony_ci ADecSignal* signal_; 126da853ecaSopenharmony_ci struct OH_AVCodecAsyncCallback cb_; 127da853ecaSopenharmony_ci bool isFirstFrame_ = true; 128da853ecaSopenharmony_ci uint32_t frameCount_ = 0; 129da853ecaSopenharmony_ci AudioFormatType audioType_; 130da853ecaSopenharmony_ci OH_AVFormat* format_; 131da853ecaSopenharmony_ci size_t inputdatasize; 132da853ecaSopenharmony_ci std::string inputdata; 133da853ecaSopenharmony_ci}; 134da853ecaSopenharmony_ci} // namespace AudioDemoAuto 135da853ecaSopenharmony_ci} // namespace MediaAVCodec 136da853ecaSopenharmony_ci} // namespace OHOS 137da853ecaSopenharmony_ci#endif // AUDIO_DECODER_RESET_DEMO_BASE_H 138