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_ENCODER_DESCRIPTION_DEMO_BASE_H 17da853ecaSopenharmony_ci#define AUDIO_ENCODER_DESCRIPTION_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_audioencoder.h" 26da853ecaSopenharmony_ci#include "nocopyable.h" 27da853ecaSopenharmony_ci#include "avcodec_audio_common.h" 28da853ecaSopenharmony_ci 29da853ecaSopenharmony_cinamespace OHOS { 30da853ecaSopenharmony_cinamespace MediaAVCodec { 31da853ecaSopenharmony_cinamespace AudioEncDemoAuto { 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_OPUS = 0, 40da853ecaSopenharmony_ci TYPE_G711MU = 1, 41da853ecaSopenharmony_ci TYPE_AAC = 2, 42da853ecaSopenharmony_ci TYPE_FLAC = 3, 43da853ecaSopenharmony_ci TYPE_MAX = 10, 44da853ecaSopenharmony_ci}; 45da853ecaSopenharmony_ci 46da853ecaSopenharmony_ciclass AEncSignal { 47da853ecaSopenharmony_cipublic: 48da853ecaSopenharmony_ci std::mutex inMutex_; 49da853ecaSopenharmony_ci std::mutex outMutex_; 50da853ecaSopenharmony_ci std::mutex startMutex_; 51da853ecaSopenharmony_ci std::condition_variable inCond_; 52da853ecaSopenharmony_ci std::condition_variable outCond_; 53da853ecaSopenharmony_ci std::condition_variable startCond_; 54da853ecaSopenharmony_ci std::queue<uint32_t> inQueue_; 55da853ecaSopenharmony_ci std::queue<uint32_t> outQueue_; 56da853ecaSopenharmony_ci std::queue<OH_AVMemory*> inBufferQueue_; 57da853ecaSopenharmony_ci std::queue<OH_AVMemory*> outBufferQueue_; 58da853ecaSopenharmony_ci std::queue<OH_AVCodecBufferAttr> attrQueue_; 59da853ecaSopenharmony_ci}; 60da853ecaSopenharmony_ci 61da853ecaSopenharmony_ciclass AEncDemoAuto : public NoCopyable { 62da853ecaSopenharmony_cipublic: 63da853ecaSopenharmony_ci AEncDemoAuto(); 64da853ecaSopenharmony_ci virtual ~AEncDemoAuto(); 65da853ecaSopenharmony_ci 66da853ecaSopenharmony_ci bool RunCaseDescription(const uint8_t *data, size_t size); 67da853ecaSopenharmony_ci 68da853ecaSopenharmony_ci OH_AVCodec* CreateByMime(const char* mime); 69da853ecaSopenharmony_ci 70da853ecaSopenharmony_ci OH_AVCodec* CreateByName(const char* mime); 71da853ecaSopenharmony_ci 72da853ecaSopenharmony_ci OH_AVErrCode Destroy(OH_AVCodec* codec); 73da853ecaSopenharmony_ci 74da853ecaSopenharmony_ci OH_AVErrCode SetCallback(OH_AVCodec* codec); 75da853ecaSopenharmony_ci 76da853ecaSopenharmony_ci OH_AVErrCode Prepare(OH_AVCodec* codec); 77da853ecaSopenharmony_ci 78da853ecaSopenharmony_ci OH_AVErrCode Start(OH_AVCodec* codec); 79da853ecaSopenharmony_ci 80da853ecaSopenharmony_ci OH_AVErrCode Stop(OH_AVCodec* codec); 81da853ecaSopenharmony_ci 82da853ecaSopenharmony_ci OH_AVErrCode Flush(OH_AVCodec* codec); 83da853ecaSopenharmony_ci 84da853ecaSopenharmony_ci OH_AVErrCode Reset(OH_AVCodec* codec); 85da853ecaSopenharmony_ci 86da853ecaSopenharmony_ci OH_AVFormat* GetOutputDescription(OH_AVCodec* codec); 87da853ecaSopenharmony_ci 88da853ecaSopenharmony_ci OH_AVErrCode PushInputData(OH_AVCodec* codec, uint32_t index, int32_t size, int32_t offset); 89da853ecaSopenharmony_ci 90da853ecaSopenharmony_ci OH_AVErrCode PushInputDataEOS(OH_AVCodec* codec, uint32_t index); 91da853ecaSopenharmony_ci 92da853ecaSopenharmony_ci OH_AVErrCode FreeOutputData(OH_AVCodec* codec, uint32_t index); 93da853ecaSopenharmony_ci 94da853ecaSopenharmony_ci OH_AVErrCode IsValid(OH_AVCodec* codec, bool* isValid); 95da853ecaSopenharmony_ci 96da853ecaSopenharmony_ci uint32_t GetInputIndex(); 97da853ecaSopenharmony_ci 98da853ecaSopenharmony_ci uint32_t GetOutputIndex(); 99da853ecaSopenharmony_ci 100da853ecaSopenharmony_ci void HandleEOS(const uint32_t& index); 101da853ecaSopenharmony_ci bool InitFile(std::string inputFile); 102da853ecaSopenharmony_ciprivate: 103da853ecaSopenharmony_ci void ClearQueue(); 104da853ecaSopenharmony_ci int32_t CreateEnd(); 105da853ecaSopenharmony_ci int32_t CreateEndByMime(); 106da853ecaSopenharmony_ci int32_t Configure(OH_AVFormat* format); 107da853ecaSopenharmony_ci int32_t Start(); 108da853ecaSopenharmony_ci int32_t Stop(); 109da853ecaSopenharmony_ci int32_t Flush(); 110da853ecaSopenharmony_ci int32_t Reset(); 111da853ecaSopenharmony_ci int32_t Release(); 112da853ecaSopenharmony_ci void InputFunc(); 113da853ecaSopenharmony_ci void OutputFunc(); 114da853ecaSopenharmony_ci void HandleInputEOS(const uint32_t index); 115da853ecaSopenharmony_ci void SetFormat(OH_AVFormat *format); 116da853ecaSopenharmony_ci int32_t HandleNormalInput(const uint32_t& index, const int64_t pts, const size_t size); 117da853ecaSopenharmony_ci 118da853ecaSopenharmony_ci std::atomic<bool> isRunning_ = false; 119da853ecaSopenharmony_ci std::unique_ptr<std::ifstream> testFile_; 120da853ecaSopenharmony_ci std::unique_ptr<std::thread> inputLoop_; 121da853ecaSopenharmony_ci std::unique_ptr<std::thread> outputLoop_; 122da853ecaSopenharmony_ci OH_AVCodec* audioEnc_; 123da853ecaSopenharmony_ci AEncSignal* signal_; 124da853ecaSopenharmony_ci struct OH_AVCodecAsyncCallback cb_; 125da853ecaSopenharmony_ci bool isFirstFrame_ = true; 126da853ecaSopenharmony_ci size_t inputdatasize; 127da853ecaSopenharmony_ci std::string inputdata; 128da853ecaSopenharmony_ci AudioFormatType audioType_; 129da853ecaSopenharmony_ci OH_AVFormat* format_; 130da853ecaSopenharmony_ci}; 131da853ecaSopenharmony_ci} // namespace AudioEncDemoAuto 132da853ecaSopenharmony_ci} // namespace MediaAVCodec 133da853ecaSopenharmony_ci} // namespace OHOS 134da853ecaSopenharmony_ci#endif // AUDIO_ENCODER_DESCRIPTION_DEMO_BASE_H 135