1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (C) 2023 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 CODEC_SERVER_H 17da853ecaSopenharmony_ci#define CODEC_SERVER_H 18da853ecaSopenharmony_ci 19da853ecaSopenharmony_ci#include <atomic> 20da853ecaSopenharmony_ci#include <shared_mutex> 21da853ecaSopenharmony_ci#include <unordered_map> 22da853ecaSopenharmony_ci#include "avcodec_sysevent.h" 23da853ecaSopenharmony_ci#include "codecbase.h" 24da853ecaSopenharmony_ci#include "i_codec_service.h" 25da853ecaSopenharmony_ci#include "nocopyable.h" 26da853ecaSopenharmony_ci#include "codec_drm_decrypt.h" 27da853ecaSopenharmony_ci#include "temporal_scalability.h" 28da853ecaSopenharmony_ci#include "task_thread.h" 29da853ecaSopenharmony_ci#include "codec_param_checker.h" 30da853ecaSopenharmony_ci#include "lock_free_queue.h" 31da853ecaSopenharmony_ci#include "post_processing.h" 32da853ecaSopenharmony_ci 33da853ecaSopenharmony_cinamespace OHOS { 34da853ecaSopenharmony_cinamespace MediaAVCodec { 35da853ecaSopenharmony_ciclass CodecServer : public std::enable_shared_from_this<CodecServer>, public ICodecService, public NoCopyable { 36da853ecaSopenharmony_cipublic: 37da853ecaSopenharmony_ci static std::shared_ptr<ICodecService> Create(); 38da853ecaSopenharmony_ci CodecServer(); 39da853ecaSopenharmony_ci virtual ~CodecServer(); 40da853ecaSopenharmony_ci 41da853ecaSopenharmony_ci enum CodecStatus { 42da853ecaSopenharmony_ci UNINITIALIZED = 0, 43da853ecaSopenharmony_ci INITIALIZED, 44da853ecaSopenharmony_ci CONFIGURED, 45da853ecaSopenharmony_ci RUNNING, 46da853ecaSopenharmony_ci FLUSHED, 47da853ecaSopenharmony_ci END_OF_STREAM, 48da853ecaSopenharmony_ci ERROR, 49da853ecaSopenharmony_ci }; 50da853ecaSopenharmony_ci 51da853ecaSopenharmony_ci typedef struct { 52da853ecaSopenharmony_ci std::shared_ptr<AVBuffer> inBuf; 53da853ecaSopenharmony_ci std::shared_ptr<AVBuffer> outBuf; 54da853ecaSopenharmony_ci } DrmDecryptVideoBuf; 55da853ecaSopenharmony_ci 56da853ecaSopenharmony_ci int32_t Init(AVCodecType type, bool isMimeType, const std::string &name, 57da853ecaSopenharmony_ci Meta &callerInfo, API_VERSION apiVersion = API_VERSION::API_VERSION_10) override; 58da853ecaSopenharmony_ci int32_t Configure(const Format &format) override; 59da853ecaSopenharmony_ci int32_t Start() override; 60da853ecaSopenharmony_ci int32_t Stop() override; 61da853ecaSopenharmony_ci int32_t Flush() override; 62da853ecaSopenharmony_ci int32_t Reset() override; 63da853ecaSopenharmony_ci int32_t Release() override; 64da853ecaSopenharmony_ci int32_t NotifyEos() override; 65da853ecaSopenharmony_ci sptr<Surface> CreateInputSurface() override; 66da853ecaSopenharmony_ci int32_t SetInputSurface(sptr<Surface> surface); 67da853ecaSopenharmony_ci int32_t SetOutputSurface(sptr<Surface> surface) override; 68da853ecaSopenharmony_ci int32_t QueueInputBuffer(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag) override; 69da853ecaSopenharmony_ci int32_t QueueInputBuffer(uint32_t index) override; 70da853ecaSopenharmony_ci int32_t QueueInputParameter(uint32_t index) override; 71da853ecaSopenharmony_ci int32_t GetOutputFormat(Format &format) override; 72da853ecaSopenharmony_ci int32_t ReleaseOutputBuffer(uint32_t index, bool render) override; 73da853ecaSopenharmony_ci int32_t RenderOutputBufferAtTime(uint32_t index, int64_t renderTimestampNs) override; 74da853ecaSopenharmony_ci int32_t SetParameter(const Format &format) override; 75da853ecaSopenharmony_ci int32_t SetCallback(const std::shared_ptr<AVCodecCallback> &callback) override; 76da853ecaSopenharmony_ci int32_t SetCallback(const std::shared_ptr<MediaCodecCallback> &callback) override; 77da853ecaSopenharmony_ci int32_t SetCallback(const std::shared_ptr<MediaCodecParameterCallback> &callback) override; 78da853ecaSopenharmony_ci int32_t SetCallback(const std::shared_ptr<MediaCodecParameterWithAttrCallback> &callback) override; 79da853ecaSopenharmony_ci int32_t GetInputFormat(Format &format) override; 80da853ecaSopenharmony_ci#ifdef SUPPORT_DRM 81da853ecaSopenharmony_ci int32_t SetDecryptConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession, 82da853ecaSopenharmony_ci const bool svpFlag) override; 83da853ecaSopenharmony_ci#endif 84da853ecaSopenharmony_ci int32_t SetCustomBuffer(std::shared_ptr<AVBuffer> buffer) override; 85da853ecaSopenharmony_ci int32_t DumpInfo(int32_t fd); 86da853ecaSopenharmony_ci void SetCallerInfo(const Meta &callerInfo); 87da853ecaSopenharmony_ci 88da853ecaSopenharmony_ci void OnError(int32_t errorType, int32_t errorCode); 89da853ecaSopenharmony_ci void OnOutputFormatChanged(const Format &format); 90da853ecaSopenharmony_ci void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVSharedMemory> buffer); 91da853ecaSopenharmony_ci void OnOutputBufferAvailable(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag, 92da853ecaSopenharmony_ci std::shared_ptr<AVSharedMemory> buffer); 93da853ecaSopenharmony_ci 94da853ecaSopenharmony_ci void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer); 95da853ecaSopenharmony_ci void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer); 96da853ecaSopenharmony_ci 97da853ecaSopenharmony_ci int32_t Configure(const std::shared_ptr<Media::Meta> &meta) override; 98da853ecaSopenharmony_ci int32_t SetParameter(const std::shared_ptr<Media::Meta> ¶meter) override; 99da853ecaSopenharmony_ci int32_t GetOutputFormat(std::shared_ptr<Media::Meta> ¶meter) override; 100da853ecaSopenharmony_ci 101da853ecaSopenharmony_ci int32_t SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer) override; 102da853ecaSopenharmony_ci int32_t Prepare() override; 103da853ecaSopenharmony_ci sptr<Media::AVBufferQueueProducer> GetInputBufferQueue() override; 104da853ecaSopenharmony_ci void ProcessInputBuffer() override; 105da853ecaSopenharmony_ci bool CheckRunning() override; 106da853ecaSopenharmony_ci 107da853ecaSopenharmony_ci // post processing callback 108da853ecaSopenharmony_ci void PostProcessingOnError(int32_t errorCode); 109da853ecaSopenharmony_ci void PostProcessingOnOutputBufferAvailable(uint32_t index, [[maybe_unused]] int32_t flag); 110da853ecaSopenharmony_ci void PostProcessingOnOutputFormatChanged(const Format &format); 111da853ecaSopenharmony_ci 112da853ecaSopenharmony_ci#ifdef SUPPORT_DRM 113da853ecaSopenharmony_ci int32_t SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession, 114da853ecaSopenharmony_ci const bool svpFlag) override; 115da853ecaSopenharmony_ci#endif 116da853ecaSopenharmony_ci 117da853ecaSopenharmony_ciprivate: 118da853ecaSopenharmony_ci int32_t InitByName(Meta &callerInfo, API_VERSION apiVersion); 119da853ecaSopenharmony_ci int32_t InitByMime(Meta &callerInfo, API_VERSION apiVersion); 120da853ecaSopenharmony_ci int32_t InitServer(); 121da853ecaSopenharmony_ci int32_t CodecScenarioInit(Format &config); 122da853ecaSopenharmony_ci void StartInputParamTask(); 123da853ecaSopenharmony_ci void ExitProcessor(); 124da853ecaSopenharmony_ci const std::string &GetStatusDescription(OHOS::MediaAVCodec::CodecServer::CodecStatus status); 125da853ecaSopenharmony_ci void StatusChanged(CodecStatus newStatus); 126da853ecaSopenharmony_ci int32_t GetCodecDfxInfo(CodecDfxInfo &codecDfxInfo); 127da853ecaSopenharmony_ci int32_t DrmVideoCencDecrypt(uint32_t index); 128da853ecaSopenharmony_ci int32_t CheckDrmSvpConsistency(const sptr<DrmStandard::IMediaKeySessionService> &keySession, bool svpFlag); 129da853ecaSopenharmony_ci void SetFreeStatus(bool isFree); 130da853ecaSopenharmony_ci int32_t QueueInputBufferIn(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag); 131da853ecaSopenharmony_ci int32_t ReleaseOutputBufferOfCodec(uint32_t index, bool render); 132da853ecaSopenharmony_ci int32_t ParamCheck(Format &config); 133da853ecaSopenharmony_ci 134da853ecaSopenharmony_ci CodecStatus status_ = UNINITIALIZED; 135da853ecaSopenharmony_ci 136da853ecaSopenharmony_ci std::shared_ptr<CodecBase> codecBase_; 137da853ecaSopenharmony_ci std::shared_ptr<AVCodecCallback> codecCb_; 138da853ecaSopenharmony_ci std::shared_ptr<MediaCodecCallback> videoCb_; 139da853ecaSopenharmony_ci std::shared_mutex mutex_; 140da853ecaSopenharmony_ci std::shared_mutex cbMutex_; 141da853ecaSopenharmony_ci std::string lastErrMsg_; 142da853ecaSopenharmony_ci std::string codecName_; 143da853ecaSopenharmony_ci AVCodecType codecType_ = AVCODEC_TYPE_NONE; 144da853ecaSopenharmony_ci struct CallerInfo { 145da853ecaSopenharmony_ci pid_t pid = -1; 146da853ecaSopenharmony_ci uid_t uid = 0; 147da853ecaSopenharmony_ci std::string processName; 148da853ecaSopenharmony_ci } caller_, forwardCaller_; 149da853ecaSopenharmony_ci bool isSurfaceMode_ = false; 150da853ecaSopenharmony_ci bool isModeConfirmed_ = false; 151da853ecaSopenharmony_ci bool isCreateSurface_ = false; 152da853ecaSopenharmony_ci bool isSetParameterCb_ = false; 153da853ecaSopenharmony_ci std::shared_ptr<TemporalScalability> temporalScalability_ = nullptr; 154da853ecaSopenharmony_ci std::shared_ptr<CodecDrmDecrypt> drmDecryptor_ = nullptr; 155da853ecaSopenharmony_ci std::unordered_map<uint32_t, DrmDecryptVideoBuf> decryptVideoBufs_; 156da853ecaSopenharmony_ci std::shared_mutex freeMutex_; 157da853ecaSopenharmony_ci bool isFree_ = false; 158da853ecaSopenharmony_ci std::shared_ptr<TaskThread> inputParamTask_ = nullptr; 159da853ecaSopenharmony_ci CodecScenario scenario_ = CodecScenario::CODEC_SCENARIO_ENC_NORMAL; 160da853ecaSopenharmony_ci 161da853ecaSopenharmony_ci // post processing, video decoder and surface mode only 162da853ecaSopenharmony_ci int32_t SetCallbackForPostProcessing(); 163da853ecaSopenharmony_ci void ClearCallbackForPostProcessing(); 164da853ecaSopenharmony_ci int32_t CreatePostProcessing(const Format& format); 165da853ecaSopenharmony_ci int32_t SetOutputSurfaceForPostProcessing(sptr<Surface> surface); 166da853ecaSopenharmony_ci int32_t PreparePostProcessing(); 167da853ecaSopenharmony_ci int32_t StartPostProcessing(); 168da853ecaSopenharmony_ci int32_t StopPostProcessing(); 169da853ecaSopenharmony_ci int32_t FlushPostProcessing(); 170da853ecaSopenharmony_ci int32_t ResetPostProcessing(); 171da853ecaSopenharmony_ci int32_t ReleasePostProcessing(); 172da853ecaSopenharmony_ci int32_t GetPostProcessingOutputFormat(Format& format); 173da853ecaSopenharmony_ci int32_t ReleaseOutputBufferOfPostProcessing(uint32_t index, bool render); 174da853ecaSopenharmony_ci int32_t PushDecodedBufferInfo(uint32_t index, std::shared_ptr<AVBuffer> buffer); 175da853ecaSopenharmony_ci int32_t StartPostProcessingTask(); 176da853ecaSopenharmony_ci void PostProcessingTask(); 177da853ecaSopenharmony_ci void DeactivatePostProcessingQueue(); 178da853ecaSopenharmony_ci void CleanPostProcessingResource(); 179da853ecaSopenharmony_ci using PostProcessingType = PostProcessing::DynamicPostProcessing; 180da853ecaSopenharmony_ci std::unique_ptr<PostProcessingType> postProcessing_{nullptr}; 181da853ecaSopenharmony_ci void* postProcessingUserData_{nullptr}; 182da853ecaSopenharmony_ci PostProcessing::Callback postProcessingCallback_; 183da853ecaSopenharmony_ci static constexpr size_t decodedBufferInfoQueueSize_{8}; 184da853ecaSopenharmony_ci struct DecodedBufferInfo { 185da853ecaSopenharmony_ci uint32_t index; 186da853ecaSopenharmony_ci std::shared_ptr<AVBuffer> buffer; 187da853ecaSopenharmony_ci }; 188da853ecaSopenharmony_ci using DecodedBufferInfoQueue = LockFreeQueue<std::shared_ptr<DecodedBufferInfo>, decodedBufferInfoQueueSize_>; 189da853ecaSopenharmony_ci std::shared_ptr<DecodedBufferInfoQueue> decodedBufferInfoQueue_{nullptr}; 190da853ecaSopenharmony_ci std::shared_ptr<DecodedBufferInfoQueue> postProcessingInputBufferInfoQueue_{nullptr}; 191da853ecaSopenharmony_ci std::shared_ptr<DecodedBufferInfoQueue> postProcessingOutputBufferInfoQueue_{nullptr}; 192da853ecaSopenharmony_ci std::unique_ptr<TaskThread> postProcessingTask_{nullptr}; 193da853ecaSopenharmony_ci Format outputFormatChanged_; 194da853ecaSopenharmony_ci std::atomic<uint64_t> decodedFrameCount_{0}; 195da853ecaSopenharmony_ci std::atomic<uint64_t> processedFrameCount_{0}; 196da853ecaSopenharmony_ci std::atomic<bool> decoderIsEOS_{false}; 197da853ecaSopenharmony_ci}; 198da853ecaSopenharmony_ci 199da853ecaSopenharmony_ciclass CodecBaseCallback : public AVCodecCallback, public NoCopyable { 200da853ecaSopenharmony_cipublic: 201da853ecaSopenharmony_ci explicit CodecBaseCallback(const std::shared_ptr<CodecServer> &codec); 202da853ecaSopenharmony_ci virtual ~CodecBaseCallback(); 203da853ecaSopenharmony_ci 204da853ecaSopenharmony_ci void OnError(AVCodecErrorType errorType, int32_t errorCode) override; 205da853ecaSopenharmony_ci void OnOutputFormatChanged(const Format &format) override; 206da853ecaSopenharmony_ci void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVSharedMemory> buffer) override; 207da853ecaSopenharmony_ci void OnOutputBufferAvailable(uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag, 208da853ecaSopenharmony_ci std::shared_ptr<AVSharedMemory> buffer) override; 209da853ecaSopenharmony_ci 210da853ecaSopenharmony_ciprivate: 211da853ecaSopenharmony_ci std::shared_ptr<CodecServer> codec_ = nullptr; 212da853ecaSopenharmony_ci}; 213da853ecaSopenharmony_ci 214da853ecaSopenharmony_ciclass VCodecBaseCallback : public MediaCodecCallback, public NoCopyable { 215da853ecaSopenharmony_cipublic: 216da853ecaSopenharmony_ci explicit VCodecBaseCallback(const std::shared_ptr<CodecServer> &codec); 217da853ecaSopenharmony_ci virtual ~VCodecBaseCallback(); 218da853ecaSopenharmony_ci 219da853ecaSopenharmony_ci void OnError(AVCodecErrorType errorType, int32_t errorCode) override; 220da853ecaSopenharmony_ci void OnOutputFormatChanged(const Format &format) override; 221da853ecaSopenharmony_ci void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override; 222da853ecaSopenharmony_ci void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override; 223da853ecaSopenharmony_ci 224da853ecaSopenharmony_ciprivate: 225da853ecaSopenharmony_ci std::shared_ptr<CodecServer> codec_ = nullptr; 226da853ecaSopenharmony_ci}; 227da853ecaSopenharmony_ci} // namespace MediaAVCodec 228da853ecaSopenharmony_ci} // namespace OHOS 229da853ecaSopenharmony_ci#endif // CODEC_SERVER_H