From 0088c477e3fb4f475c0dc5602c2cc3acac9c9832 Mon Sep 17 00:00:00 2001 From: chenhaiwen Date: Fri, 10 Mar 2023 10:56:42 +0800 Subject: [PATCH] Update interface of hdi refactor code Signed-off-by: chenhaiwen --- .../codec_hdi_refactor-V2.0.md | 142 ++++++++++-------- 1 file changed, 82 insertions(+), 60 deletions(-) diff --git a/design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor-V2.0.md b/design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor-V2.0.md index a65a87f..3cf5e91 100644 --- a/design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor-V2.0.md +++ b/design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor-V2.0.md @@ -93,37 +93,36 @@ interface CodecPlugin { +Status SetDataCallback(DataCallback* dataCallback) override; } - - Abstract CodecManager { +virtual ~CodecManager() = default; - +virtual int32_t CreateComponent(Plugin::Any &component, uint32_t &id, std::string name, Plugin::Any &appData, Plugin::Any &callbacks) = 0; - +virtual int32_t DestroyComponent(Plugin::Any &component, uint32_t id) = 0; + +virtual int32_t CreateComponent(const Plugin::Any& component, uint32_t& id, std::string name, const Plugin::Any& appData, const Plugin::Any& callbacks) = 0; + +virtual int32_t DestroyComponent(const Plugin::Any& component, uint32_t id) = 0; +virtual Status RegisterCodecPlugins(const std::shared_ptr& reg) = 0; +virtual Status UnRegisterCodecPlugins() = 0; } class HdiCodecManager { - +HdiCodecManager(); - +~HdiCodecManager(); - +int32_t CreateComponent(Plugin::Any& component, uint32_t& id, std::string name, Plugin::Any& appData, Plugin::Any& callbacks) override; - +int32_t DestroyComponent(Plugin::Any& component, uint32_t id) override; + +static HdiCodecManager& GetInstance(); + +~HdiCodecManager() override; + +int32_t CreateComponent(const Plugin::Any& component, uint32_t& id, std::string name, const Plugin::Any& appData, const Plugin::Any& callbacks) override; + +int32_t DestroyComponent(const Plugin::Any& component, uint32_t id) override; +Status RegisterCodecPlugins(const std::shared_ptr& reg) override; +Status UnRegisterCodecPlugins() override; + + -HdiCodecManager(); -void Init(); -void Reset(); -void AddHdiCap(const CodecCompCapability& hdiCap); -void InitCaps(); - -static std::vector GetCodecFormats-(const CodecVideoPortCap& port); + -static std::vector GetCodecFormats(const CodecVideoPortCap& port); -static std::string GetCodecMime(const AvCodecRole& role); - -stdtic PluginType HdiCodecManager::GetCodecType(const CodecType& hdiType); - -CodecComponentManager* mgr_ = nullptr; + -static PluginType GetCodecType(const CodecType& hdiType); + + -CodecComponentManager* mgr_ {nullptr}; -std::vector codecCapabilitys_; - -std::map handleMap_; } class OmxCodecManager { - } class HdiCodecAdapter { @@ -141,83 +140,106 @@ class HdiCodecAdapter { +Status QueueOutputBuffer(const std::shared_ptr& outputBuffers); +Status SetCallback(Callback* cb); +Status SetDataCallback(DataCallback* dataCallback); + +std::shared_ptr GetAllocator(); + -Status InitPortIndex(); + -Status FreeBuffers(); + -void HandleFrame(); + -bool FillAllTheOutBuffer(); -void NotifyInputBufferDone(const std::shared_ptr& input); -void NotifyOutputBufferDone(const std::shared_ptr& output); - -shared_ptr codecMgr_; - -struct CodecComponentType* codecComp_ {nullptr}; - -struct CodecCallbackType* codecCallback_ {nullptr}; - -shared_ptr inBufPool_; - -shared_ptr outBufPool_; - -shared_ptr codecPortIn_; - -shared_ptr codecPortOut_; - -shared_ptr cmdExecutor_; - -Status int32_t EventHandler(CodecCallbackType* self, OMX_EVENTTYPE event, EventInfo* info); - -Status int32_t EmptyBufferDone(CodecCallbackType* self, int64_t appData, const OmxCodecBuffer* buffer); - -Status int32_t FillBufferDone(CodecCallbackType* self, int64_t appData, const OmxCodecBuffer* buffer); + -static int32_t EventHandler(CodecCallbackType* self, OMX_EVENTTYPE event, EventInfo* info); // HDI callback + -static int32_t EmptyBufferDone(CodecCallbackType* self, int64_t appData, const OmxCodecBuffer* buffer); + -static int32_t FillBufferDone(CodecCallbackType* self, int64_t appData, const OmxCodecBuffer* buffer); + + -Status ConfigOmx(); + -Status ChangeState(OMX_STATETYPE state); + -Status WaitForState(OMX_STATETYPE state); + + -CodecComponentType* codecComp_ {nullptr}; + -CodecCallbackType* codecCallback_ {nullptr}; + -std::string componentName_ {}; + -uint32_t componentId_; + + -std::list> inBufQue_ {}; + -OHOS::Media::BlockingQueue> outBufQue_; + + -uint32_t outBufferSize_ {std::numeric_limits::max()}; + -uint32_t outBufferCnt_ {std::numeric_limits::max()}; + -std::shared_ptr inBufPool_ {}; + -std::shared_ptr outBufPool_ {}; + -std::shared_ptr shaAlloc_ {nullptr}; + + -std::shared_ptr inCodecPort_{}; + -std::shared_ptr outCodecPort_{}; + -std::shared_ptr codecCmdExecutor_{}; + + -OMX_STATETYPE curState_ {OMX_StateInvalid}; + -OMX_STATETYPE targetState_ {OMX_StateInvalid}; } class CodecBufferPool { - +CodecBufferPool(CodecComponentType* compType, CompVerInfo verInfo, uint32_t portIndex); - +~CodecBufferPool() = default; - +Status UseBuffer(OHOS::Media::BlockingQueue>& bufQue, MemoryType bufMemType); - +Status FreeBuffers(); + +CodecBufferPool(CodecComponentType* compType, CompVerInfo& verInfo, uint32_t portIndex); + +Status UseBuffers(OHOS::Media::BlockingQueue>& bufQue, MemoryType bufMemType); + +Status FreeBuffers(); // 释放所有buffer +uint32_t EmptyBufferCount(); - +Status EmptyBuffer(uint32_t bufId); - +std::shared_ptr GetBuffer(uint32_t bufferId = 0, bool useParam = false); + +Status UseBufferDone(uint32_t bufId); // 根据该bufferId,重置omxBuffer对应的CodecBuffer + +std::shared_ptr GetBuffer(int32_t bufferId = -1); + -Status ConfigBufType(const MemoryType& bufMemType); - -CompVerInfo verInfo_; - -uint32_t bufSize_; -CodecComponentType* codecComp_ {nullptr}; + -CompVerInfo verInfo_; -uint32_t portIndex_; -OHOS::Media::BlockingQueue freeBufferId_; - -std::map> -codecBufMap_; // key is buffer id + -std::map> codecBufMap_; // key is buffer id } class CodecBuffer { - +CodecBuffer(std::shared_ptr buffer, CompVerInfo& verInfo, uint32_t bufferSize); - +~CodecBuffer() = default; + +CodecBuffer(std::shared_ptr& buffer, CompVerInfo& verInfo); +std::shared_ptr GetOmxBuffer(); +uint32_t GetBufferId(); - +Status ResetBufferLen(); +Status Copy(const std::shared_ptr& Buffer); - +Status Rebind(const std::shared_ptr& buffer); - +Status Unbind(std::shared_ptr& buffer); - -Status Init(); - -CompVerInfo verInfo_ {}; - -uint32_t bufferSize_; + +Status Rebind(const std::shared_ptr& buffer); // 重新申请内存时, CodecBuffer都要重新创建 + +Status Unbind(std::shared_ptr& buffer, const OmxCodecBuffer* omxBuffer); + -void Init(); -std::shared_ptr buffer_; + -CompVerInfo verInfo_ {}; -std::shared_ptr memory_; -std::shared_ptr omxBuffer_; } -abstract CodecPort { - -struct CodecComponentType* codecComp_ {nullptr}; - +enum class PortType { PORT_TYPE_INPUT = 0, PORT_TYPE_OUTPUT = 1 }; - +status CodecPort(PortType pType); - +status Config(TagMap& tagMap); - +status QueryParam(TagMap& tagMap); - +status Disable(); - +status Enable(); +Class CodecPort { + +CodecPort(CodecComponentType* component, uint32_t portIndex, const +CompVerInfo& verInfo); + +~CodecPort() = default; + +Status Config(TagMap& tagMap); + +Status QueryParam(PortInfo& portInfo); + -CodecComponentType* codecComp_ {nullptr}; + -OMX_PARAM_PORTDEFINITIONTYPE portDef_ {}; + -CompVerInfo verInfo_ {}; } Class CodecCmdExecutor { - -struct CodecComponentType* codecComp_ {nullptr}; + +CodecCmdExecutor(CodecComponentType* component, uint32_t inPortIndex); + +~CodecCmdExecutor() = default; + +Status OnEvent(OMX_EVENTTYPE event, EventInfo* info); + +Status SendCmd(OMX_COMMANDTYPE cmd, const Plugin::Any& param); + +bool WaitCmdResult(OMX_COMMANDTYPE cmd, const Plugin::Any& param); + +Status SetCallback(Callback* cb); + + -void HandleEventCmdComplete(uint32_t data1, uint32_t data2); + -void HandleEventPortSettingsChanged(OMX_U32 data1, OMX_U32 data2); + -void HandleEventBufferFlag(OMX_U32 data1, OMX_U32 data2); + -void HandleEventError(OMX_U32 data1); + + -Callback* callback_ {nullptr}; + -CodecComponentType* codecComp_ {nullptr}; + -uint32_t inPortIndex_; -OSAL::Mutex mutex_; -OSAL::ConditionVariable cond_; -int lastCmd_ = -2; // -1 for error cmd and -2 for invaild - -bool eventDone_ = false; - +SendCmd(OMX_COMMANDTYPE cmd, bool wait); - +WaitCmdComplete(); - +OnEvent(OMX_EVENTTYPE event, EventInfo* info); - #void HandelEventCmdComplete(uint32_t data1, uint32_t data2); - #void HandelEventCmdCompleteEvent(OMX_U32 data1, OMX_U32 data2); - #void HandelEventStateSet(OMX_U32 data1, OMX_U32 data2); - #void HandelEventFlush(OMX_U32 data1, OMX_U32 data2); - #void HandleEventPortSettingsChangedEvent(OMX_U32 data1, OMX_U32 data2); - #void HandleEventError(OMX_U32 data1); + -std::map resultMap_{}; } ``` -- Gitee