From 6ac2e89ccafd2d631f3fc97b852a69377e0e8b22 Mon Sep 17 00:00:00 2001 From: z00803289 Date: Wed, 4 Jan 2023 10:45:28 +0800 Subject: [PATCH] codec_hdi_refactor Signed-off-by: z00803289 --- .../codec_hdi_refactor/codec_hdi_refactor.md | 203 ++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 design/codec_hdi_refactor/codec_hdi_refactor.md diff --git a/design/codec_hdi_refactor/codec_hdi_refactor.md b/design/codec_hdi_refactor/codec_hdi_refactor.md new file mode 100644 index 0000000..13fce74 --- /dev/null +++ b/design/codec_hdi_refactor/codec_hdi_refactor.md @@ -0,0 +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, +} +``` \ No newline at end of file -- Gitee