diff --git a/design/codec_hdi_refactor/codec_hdi_refactor-chw.md b/design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor-V1.0.md similarity index 100% rename from design/codec_hdi_refactor/codec_hdi_refactor-chw.md rename to design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor-V1.0.md 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 new file mode 100644 index 0000000000000000000000000000000000000000..72921708c2657fb9c3d2546a30c0a2709e0be4e9 --- /dev/null +++ b/design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor-V2.0.md @@ -0,0 +1,243 @@ +## 分辨率改变时序 +``` plantuml +participant Hdi +participant HdiAdapter +participant VideoDecodeFilter +participant SurfaceSinkFilter +participant HiPlayerImpl + +Hdi -> HdiAdapter:事件触发 +HdiAdapter -> HdiAdapter:分辨率改变添加异步任务 +HdiAdapter -> Hdi:关闭端口 +HdiAdapter -> HdiAdapter:等待所有buffer归还,端口关闭完成 +HdiAdapter -> Hdi:释放Hdi buffer +HdiAdapter -> VideoDecodeFilter:上报分辨率改变事件 +VideoDecodeFilter -> SurfaceSinkFilter:重协商 +VideoDecodeFilter -> VideoDecodeFilter:重新申请内存 +VideoDecodeFilter -> HdiAdapter : 向下传递所有buffer +VideoDecodeFilter -> HiPlayerImpl:通知应用分辨率改变 +HdiAdapter -> Hdi:初始化所有buffer + +HdiAdapter -> Hdi:打开端口 +HdiAdapter -> Hdi:所有buffer向下传递 +HdiAdapter -> Hdi:等待打开端口事件完成 +``` + +## 重构类图 +``` plantuml +'plugin +HdiCodecAdapter -up-|> CodecPlugin +HdiCodecAdapter o-up- CodecManager +HdiCodecAdapter o-right- CodecBufferPool +CodecPort -right-o HdiCodecAdapter +CodecCmdExecutor -up-o HdiCodecAdapter +'manager +HdiCodecManager -up-|> CodecManager +OmxCodecManager -up-|> CodecManager + +'codec buffer pool +CodecBufferPool o-right- CodecBuffer + + +interface CodecPlugin { + +Status Init() override; + +Status Deinit() override; + +Status Prepare() override; + +Status Reset() override; + +Status Start() override; + +Status Stop() override; + +Status GetParameter(Plugin::Tag tag, Plugin::ValueType& value) override; + +Status SetParameter(Plugin::Tag tag, const Plugin::ValueType& value) override; + +shared_ptr GetAllocator() override; + +Status QueueInputBuffer(const shared_ptr& inputBuffer, int32_t timeoutMs) override; + +Status QueueOutputBuffer(const shared_ptr& outputBuffer, int32_t timeoutMs) override; + +Status Flush() override; + +Status SetCallback(Callback* cb) override; + +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 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; + +Status RegisterCodecPlugins(const std::shared_ptr& reg) override; + +Status UnRegisterCodecPlugins() override; + -void Init(); + -void Reset(); + -void AddHdiCap(const CodecCompCapability& hdiCap); + -void InitCaps(); + -static std::vector GetCodecFormats-(const CodecVideoPortCap& port); + -static std::string GetCodecMime(const AvCodecRole& role); + -stdtic PluginType HdiCodecManager::GetCodecType(const CodecType& hdiType); + -CodecComponentManager* mgr_ = nullptr; + -std::vector codecCapabilitys_; + -std::map handleMap_; +} + +class OmxCodecManager { + +} + +class HdiCodecAdapter { + +HdiCodecAdapter(string componentName); + +Status Init(); + +Status Deinit(); + +Status Prepare(); + +Status Reset(); + +Status Start(); + +Status Stop(); + +Status Flush(); + +Status GetParameter(Plugin::Tag tag, Plugin::ValueType& value); + +Status SetParameter(Plugin::Tag tag, const Plugin::ValueType& value); + +Status QueueInputBuffer(const std::shared_ptr& inputBuffer); + +Status QueueOutputBuffer(const std::shared_ptr& outputBuffers); + +Status SetCallback(Callback* cb); + +Status SetDataCallback(DataCallback* dataCallback); + + -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); +} + +class CodecBufferPool { + -shared_ptr BufMap_; + -BlockingQueue freeBufferId_; + +Status ConfigOutPortBufType(); + +Status AllocBuffer(shared_ptr& buffer); + +Status FreeBuffer(); + +Status UseBuffer(size, count); //fill buffer into hdi +} + +class CodecBuffer { + -shared_ptr sharedMem_; + -BufferHandle* bufferHandle_; + +CodecBuffer(shared_ptr); + -InitBuffer(uint32_t CodecBufferType); +} + +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 CodecCmdExecutor { + -struct CodecComponentType* codecComp_ {nullptr}; + -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); +} +``` + + + +## 调用时序图 +```plantuml +participant PluginManager +participant CodecFilter +participant CodecAdapterPlugin +participant CodecAdapter +box "CodecAdapter聚合类" +participant CodecPort +participant CodecCmdExecutor +participant CodecBufferPool +participant CodecFactory +end box +box "HDI_Interface" +participant ComponentManager +participant Component +participant ComponentCallback +end box + +PluginManager -> PluginManager : ctor +PluginManager -> CodecAdapterPlugin : RegisterOneCodecPackage +CodecAdapterPlugin -> PluginManager : AddPackage(PackageName) +CodecAdapterPlugin -> ComponentManager : GetComponentManager +CodecAdapterPlugin -> ComponentManager : GetComponentNumber +CodecAdapterPlugin -> ComponentManager : GetComponentCapabilityList +CodecAdapterPlugin -> PluginManager : AddPlugin(PluginDef) +CodecFilter -> CodecFilter : Prepare() +CodecFilter -> CodecFilter : Negotiate() +CodecFilter -> CodecAdapterPlugin : get plugin list for H264,CreatePlugin +CodecAdapterPlugin -> CodecAdapter : ctor +CodecAdapter -> CodecAdapter : ctor +CodecPort -> CodecAdapter : codecPortIn_, CodecPortOut_ +CodecCmdExecutor -> CodecAdapter : cmdExecutor_ +CodecBufferPool -> CodecAdapter : inBufPool_, outBufPool_ +CodecFactory -> ComponentManager : ctor, GetComponentManager() +CodecFactory -> CodecAdapter : codecFactory_ +CodecFilter -> CodecAdapterPlugin : filter.Negotiate() : plugin -> Init() +CodecAdapterPlugin -> CodecAdapter : Init() +CodecAdapter -> Component : codecFactory_->CreateComponent() +CodecAdapter -> ComponentCallback : CreateComponentCallback() +CodecFilter -> CodecAdapterPlugin : filter.Configure() : plugin -> SetParameter() +CodecAdapterPlugin -> CodecAdapter : SetParameter() +CodecAdapter -> CodecAdapter : save tag value used to config omx port +CodecAdapter -> Component : codecPortIn.Config(), codecPortOut.Config() +CodecAdapter -> Component : codecPort.QueryParam( get buffer size and count from omx ) +CodecFilter -> CodecAdapterPlugin : filter.Configure() : plugin -> GetParameter() +CodecAdapterPlugin -> CodecAdapter : Getparameter() +CodecAdapter -> CodecFilter : send omx buffer count and size to filter +CodecFilter -> CodecAdapterPlugin : filter.Configure() : plugin -> QueueOutputBuffer() // queue all output buffer down +CodecAdapterPlugin -> CodecAdapter : QueueOutputBuffer() +CodecAdapter -> CodecAdapter : outBufferQ_.Push(outputBuffers) +CodecAdapter -> CodecAdapter : outBufPool_.AllocCodecBuffer() +CodecFilter -> CodecAdapterPlugin : filter.Configure() : plugin -> Prepare() +CodecAdapterPlugin -> CodecAdapter : Prepare() +CodecAdapter -> Component : inBufPool_.UseBuffer(size, count) +CodecAdapter -> Component : outBufPool_.UseBuffer(size, count) +CodecAdapter -> Component : cmdExecutor_.SendCmd( OMX_StateIdle ) and wait callback +CodecFilter -> CodecAdapterPlugin : filter.Configure() : plugin -> Start() +CodecAdapterPlugin -> CodecAdapter : Start() +CodecAdapter -> Component : cmdExecutor_.SendCmd( OMX_StateExecuting ) +CodecAdapter -> Component : outBufPool_.FillAllTheBuffer() : for { FillThisBuffer() } +CodecFilter -> CodecAdapterPlugin : filter.Configure() : start new thread : plugin -> QueueInputBuffer() +CodecAdapterPlugin -> CodecAdapter : QueueInputBuffer() +CodecAdapter -> Component : inBufPool_.UseBuffer(size, count) // translate PluginBuffer to OmxBuffer and call EmptyThisBuffer() +CodecAdapter -> CodecFilter : OnInputBufferDone() +ComponentCallback -> CodecAdapter : callback : EmptyBufferDone( unUsedInBufferId_.push_back(buffer->bufferId) ) +ComponentCallback -> CodecAdapter : callback: FillBufferDone( translate OmxBuf to PluginBuf, and send free outBuffer to HDI ) +CodecAdapter -> CodecFilter : OnOutputBufferDone() +CodecFilter -> CodecFilter : Start() +CodecFilter -> CodecAdapterPlugin : filter.Stop() : plugin -> Flush() +CodecAdapterPlugin -> CodecAdapter : Flush() +CodecAdapter -> Component : Flush( cmdExecutor_.SendCmd( OMX_CommandFlush ) +CodecFilter -> CodecAdapterPlugin : filter.Stop() : plugin -> Stop() +CodecAdapterPlugin -> CodecAdapter : Stop() +``` \ No newline at end of file diff --git a/design/codec_hdi_refactor/codec_hdi_refactor.md b/design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor_V0.1.md similarity index 96% rename from design/codec_hdi_refactor/codec_hdi_refactor.md rename to design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor_V0.1.md index 13fce74cf866b2c7aec3a3d0bbb8e4b5888f4c60..3a06857c6b8f075a0eb590222206c697f5b350d5 100644 --- a/design/codec_hdi_refactor/codec_hdi_refactor.md +++ b/design/codec_hdi/codec_hdi_refactor/codec_hdi_refactor_V0.1.md @@ -1,203 +1,203 @@ -## 分辨率改变时序 -``` plantuml -participant Hdi -participant HdiAdapter -participant VideoDecodeFilter -participant SurfaceSinkFilter -participant HiPlayerImpl - -Hdi -> HdiAdapter:事件触发 -HdiAdapter -> HdiAdapter:分辨率改变添加异步任务 -HdiAdapter -> Hdi:关闭端口 -HdiAdapter -> HdiAdapter:等待所有buffer归还,端口关闭完成 -HdiAdapter -> Hdi:释放Hdi buffer -HdiAdapter -> VideoDecodeFilter:上报分辨率改变事件 -VideoDecodeFilter -> SurfaceSinkFilter:重协商 -VideoDecodeFilter -> VideoDecodeFilter:重新申请内存 -VideoDecodeFilter -> HdiAdapter : 向下传递所有buffer -VideoDecodeFilter -> HiPlayerImpl:通知应用分辨率改变 -HdiAdapter -> Hdi:初始化所有buffer - -HdiAdapter -> Hdi:打开端口 -HdiAdapter -> Hdi:所有buffer向下传递 -HdiAdapter -> Hdi:等待打开端口事件完成 -``` - -## 重构类图 -``` plantuml -' event -CodecEvent -left-> EventReceiver -CodecEventType -left-o CodecEvent -' adapter -CodecComponentFactory -right-o CodecAdapter -HdiCodecComponentFactory -up-|> CodecComponentFactory -CodecAdapter -up-|> CodecPlugin -CodecAdapter -up-|> EventReceiver -HdiAdapter -up-|> CodecAdapter -' port -CodecPort -up-|> EventReceiver -CodecPort -left-o CodecAdapter -PortState -down-o CodecPort -' handler -HdiCodecHandler -up-|> CodecHandler -CodecHandler -up-o CodecPort -CodecHandler --up-o CodecAdapter -' buffer -CodecBufferAllocator -left--o CodecPort -ShareMemCodecBufferAllocator -up-|> CodecBufferAllocator -PresetMemCodecBufferAllocator -up-|> CodecBufferAllocator -CodecBufferWrapper -left-> CodecBufferAllocator -ShareMemCodecBuffer -up-|>CodecBufferWrapper -PresetCodecBuffer -up-|>CodecBufferWrapper -CodecBufferType -left-o CodecBufferWrapper - -interface EventReceiver{ - +void OnEvent(const Event& event); -} - -interface CodecPlugin{ - +Status Init() override; - +Status Deinit() override; - +Status Prepare() override; - +Status Reset() override; - +Status Start() override; - +Status Stop() override; - +Status GetParameter(Plugin::Tag tag, Plugin::ValueType& value) override; - +Status SetParameter(Plugin::Tag tag, const Plugin::ValueType& value) override; - +shared_ptr GetAllocator() override; - +Status QueueInputBuffer(const shared_ptr& inputBuffer, int32_t timeoutMs) override; - +Status QueueOutputBuffer(const shared_ptr& outputBuffer, int32_t timeoutMs) override; - +Status Flush() override; - +Status SetCallback(Callback* cb) override; - +Status SetDataCallback(DataCallback* dataCallback) override; -} - -Abstract CodecAdapter{ - #void NotifyInputBufferDone(const std::shared_ptr& input); - #void NotifyOutputBufferDone(const std::shared_ptr& output); - #shared_ptr> inCodecPort_; - #shared_ptr> outCodecPort_; - #shared_ptr> codecHandler_; - #shared_ptr> codecCompFactory_; -} - -class HdiAdapter{ - -} - -interface CodecComponentFactory{ - +shared_ptr> CreateCodecPort(int32_t queueCapacity, PortType portType); - +shared_ptr> CreateCodecHandler(); -} - -class HdiCodecComponentFactory { - -} - -enum CodecBufferType{ - SHARED_MEM, - PRESET_MEM -} - -class CodecBufferWrapper{ - +shared_ptr codecBuffer; - +CodecBufferType type; -} - -class ShareMemCodecBuffer{ - +shared_ptr; -} - -class PresetCodecBuffer{ - +shared_ptr; -} - -interface CodecBufferAllocator { - shared_ptr<> AllocateCodecBuffer(); -} - -class ShareMemCodecBufferAllocator { - -shared_ptr allocator_; -} - -class PresetMemCodecBufferAllocator { - -list> buffers; -} - -class CodecPort{ - +Init(); - +Start(); - +Stop(); - +Flush(); - +ReceiveBuffer(shared_ptr buffer); - +ReceiveCodecBuffer(shared_ptr codecBuffer); - +Status GetParameter(Plugin::Tag tag, Plugin::ValueType& value); - +Status SetParameter(Plugin::Tag tag, const Plugin::ValueType& value); - #Status TransferBufferNoLocked(); - #PortState state_; - #PortType portType_;// 输入输出 - #Mutex mutex_; - #ConditionVariable cond_; - #BlockingQueue> bufferQueue_; - #BlockingQueue> codecBufferQueue_; - #shared_ptr> codecHandler_; - #shared_ptr> codecBufferAllocator_; - #map params_; - -} - -abstract class CodecHandler { - +Status RegisterPort(PortType portType, EventReceiver* codecPort); - +Status RegisterCodecAdapter(EventReceiver* codecPort); - +Status ActivePort(PortType portType, bool isActive); - +Status FreeCodecBuffer(shared_ptr codecBuffer); - +Status Init(); - +Status TransferBuffer(PortType portType, shared_ptr buffer, shared_ptr codecBuffer); - +Status Flush(PortType portType); - +Status GetParameter(Plugin::Tag tag, Plugin::ValueType& value); - +Status SetParameter(Plugin::Tag tag, const Plugin::ValueType& value); - #CodecType codecType; // 编解码 - #EventReceiver* inCodecPort_; - #EventReceiver* outCodecPort_; - #EventReceiver* codecAdapter_; - #map params_; -} - -class HdiCodecHandler{ - -OSAL::Mutex mutex_; - -OSAL::ConditionVariable cond_; - -OMX_STATETYPE state_ - -int lastCmd_; - -bool eventDone_; - -CodecComponentType* codecComp_; - -CodecCallbackType* codecCallback_; - -CodecComponentManager* compManager_; - -uint32_t componentId_; - -std::string componentName_ {}; - -CompVerInfo verInfo_ {}; - static int32_t EventHandler(CodecCallbackType* self, OMX_EVENTTYPE event, EventInfo* info); - static int32_t EmptyBufferDone(CodecCallbackType* self, int64_t appData, const OmxCodecBuffer* omxBuffer); - static int32_t FillBufferDone(CodecCallbackType* self, int64_t appData, const OmxCodecBuffer* buffer); -} - - -enum PortState{ - IDLE, - INITIALIZED, - STARTED, - WAIT, - STOPPED, -} - -class CodecEvent{ - +CodecEventType eventType; - +Any params; -} - -enum CodecEventType{ - FLUSH_DONE, - RESOLUTION_CHANGE, - CHANGE_PORT_STATE_DONE, - CODEC_ERROR, -} +## 分辨率改变时序 +``` plantuml +participant Hdi +participant HdiAdapter +participant VideoDecodeFilter +participant SurfaceSinkFilter +participant HiPlayerImpl + +Hdi -> HdiAdapter:事件触发 +HdiAdapter -> HdiAdapter:分辨率改变添加异步任务 +HdiAdapter -> Hdi:关闭端口 +HdiAdapter -> HdiAdapter:等待所有buffer归还,端口关闭完成 +HdiAdapter -> Hdi:释放Hdi buffer +HdiAdapter -> VideoDecodeFilter:上报分辨率改变事件 +VideoDecodeFilter -> SurfaceSinkFilter:重协商 +VideoDecodeFilter -> VideoDecodeFilter:重新申请内存 +VideoDecodeFilter -> HdiAdapter : 向下传递所有buffer +VideoDecodeFilter -> HiPlayerImpl:通知应用分辨率改变 +HdiAdapter -> Hdi:初始化所有buffer + +HdiAdapter -> Hdi:打开端口 +HdiAdapter -> Hdi:所有buffer向下传递 +HdiAdapter -> Hdi:等待打开端口事件完成 +``` + +## 重构类图 +``` plantuml +' event +CodecEvent -left-> EventReceiver +CodecEventType -left-o CodecEvent +' adapter +CodecComponentFactory -right-o CodecAdapter +HdiCodecComponentFactory -up-|> CodecComponentFactory +CodecAdapter -up-|> CodecPlugin +CodecAdapter -up-|> EventReceiver +HdiAdapter -up-|> CodecAdapter +' port +CodecPort -up-|> EventReceiver +CodecPort -left-o CodecAdapter +PortState -down-o CodecPort +' handler +HdiCodecHandler -up-|> CodecHandler +CodecHandler -up-o CodecPort +CodecHandler --up-o CodecAdapter +' buffer +CodecBufferAllocator -left--o CodecPort +ShareMemCodecBufferAllocator -up-|> CodecBufferAllocator +PresetMemCodecBufferAllocator -up-|> CodecBufferAllocator +CodecBufferWrapper -left-> CodecBufferAllocator +ShareMemCodecBuffer -up-|>CodecBufferWrapper +PresetCodecBuffer -up-|>CodecBufferWrapper +CodecBufferType -left-o CodecBufferWrapper + +interface EventReceiver{ + +void OnEvent(const Event& event); +} + +interface CodecPlugin{ + +Status Init() override; + +Status Deinit() override; + +Status Prepare() override; + +Status Reset() override; + +Status Start() override; + +Status Stop() override; + +Status GetParameter(Plugin::Tag tag, Plugin::ValueType& value) override; + +Status SetParameter(Plugin::Tag tag, const Plugin::ValueType& value) override; + +shared_ptr GetAllocator() override; + +Status QueueInputBuffer(const shared_ptr& inputBuffer, int32_t timeoutMs) override; + +Status QueueOutputBuffer(const shared_ptr& outputBuffer, int32_t timeoutMs) override; + +Status Flush() override; + +Status SetCallback(Callback* cb) override; + +Status SetDataCallback(DataCallback* dataCallback) override; +} + +Abstract CodecAdapter{ + #void NotifyInputBufferDone(const std::shared_ptr& input); + #void NotifyOutputBufferDone(const std::shared_ptr& output); + #shared_ptr> inCodecPort_; + #shared_ptr> outCodecPort_; + #shared_ptr> codecHandler_; + #shared_ptr> codecCompFactory_; +} + +class HdiAdapter{ + +} + +interface CodecComponentFactory{ + +shared_ptr> CreateCodecPort(int32_t queueCapacity, PortType portType); + +shared_ptr> CreateCodecHandler(); +} + +class HdiCodecComponentFactory { + +} + +enum CodecBufferType{ + SHARED_MEM, + PRESET_MEM +} + +class CodecBufferWrapper{ + +shared_ptr codecBuffer; + +CodecBufferType type; +} + +class ShareMemCodecBuffer{ + +shared_ptr; +} + +class PresetCodecBuffer{ + +shared_ptr; +} + +interface CodecBufferAllocator { + shared_ptr<> AllocateCodecBuffer(); +} + +class ShareMemCodecBufferAllocator { + -shared_ptr allocator_; +} + +class PresetMemCodecBufferAllocator { + -list> buffers; +} + +class CodecPort{ + +Init(); + +Start(); + +Stop(); + +Flush(); + +ReceiveBuffer(shared_ptr buffer); + +ReceiveCodecBuffer(shared_ptr codecBuffer); + +Status GetParameter(Plugin::Tag tag, Plugin::ValueType& value); + +Status SetParameter(Plugin::Tag tag, const Plugin::ValueType& value); + #Status TransferBufferNoLocked(); + #PortState state_; + #PortType portType_;// 输入输出 + #Mutex mutex_; + #ConditionVariable cond_; + #BlockingQueue> bufferQueue_; + #BlockingQueue> codecBufferQueue_; + #shared_ptr> codecHandler_; + #shared_ptr> codecBufferAllocator_; + #map params_; + +} + +abstract class CodecHandler { + +Status RegisterPort(PortType portType, EventReceiver* codecPort); + +Status RegisterCodecAdapter(EventReceiver* codecPort); + +Status ActivePort(PortType portType, bool isActive); + +Status FreeCodecBuffer(shared_ptr codecBuffer); + +Status Init(); + +Status TransferBuffer(PortType portType, shared_ptr buffer, shared_ptr codecBuffer); + +Status Flush(PortType portType); + +Status GetParameter(Plugin::Tag tag, Plugin::ValueType& value); + +Status SetParameter(Plugin::Tag tag, const Plugin::ValueType& value); + #CodecType codecType; // 编解码 + #EventReceiver* inCodecPort_; + #EventReceiver* outCodecPort_; + #EventReceiver* codecAdapter_; + #map params_; +} + +class HdiCodecHandler{ + -OSAL::Mutex mutex_; + -OSAL::ConditionVariable cond_; + -OMX_STATETYPE state_ + -int lastCmd_; + -bool eventDone_; + -CodecComponentType* codecComp_; + -CodecCallbackType* codecCallback_; + -CodecComponentManager* compManager_; + -uint32_t componentId_; + -std::string componentName_ {}; + -CompVerInfo verInfo_ {}; + static int32_t EventHandler(CodecCallbackType* self, OMX_EVENTTYPE event, EventInfo* info); + static int32_t EmptyBufferDone(CodecCallbackType* self, int64_t appData, const OmxCodecBuffer* omxBuffer); + static int32_t FillBufferDone(CodecCallbackType* self, int64_t appData, const OmxCodecBuffer* buffer); +} + + +enum PortState{ + IDLE, + INITIALIZED, + STARTED, + WAIT, + STOPPED, +} + +class CodecEvent{ + +CodecEventType eventType; + +Any params; +} + +enum CodecEventType{ + FLUSH_DONE, + RESOLUTION_CHANGE, + CHANGE_PORT_STATE_DONE, + CODEC_ERROR, +} ``` \ No newline at end of file