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 72921708c2657fb9c3d2546a30c0a2709e0be4e9..acf829639db370c9cccc3c4d6f1fa1adef4bedd6 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 @@ -122,19 +122,38 @@ class HdiCodecAdapter { } class CodecBufferPool { - -shared_ptr BufMap_; - -BlockingQueue freeBufferId_; - +Status ConfigOutPortBufType(); - +Status AllocBuffer(shared_ptr& buffer); - +Status FreeBuffer(); - +Status UseBuffer(size, count); //fill buffer into hdi + +CodecBufferPool(CodecComponentType* compType, CompVerInfo verInfo, uint32_t portIndex); + +~CodecBufferPool() = default; + +Status UseBuffer(OHOS::Media::BlockingQueue>& bufQue, MemoryType bufMemType); + +Status FreeBuffers(); + +uint32_t EmptyBufferCount(); + +Status EmptyBuffer(uint32_t bufId); + +std::shared_ptr GetBuffer(uint32_t bufferId = 0, bool useParam = false); + -Status ConfigBufType(const MemoryType& bufMemType); + + -CompVerInfo verInfo_; + -uint32_t bufSize_; + -CodecComponentType* codecComp_ {nullptr}; + -uint32_t portIndex_; + -OHOS::Media::BlockingQueue freeBufferId_; + -std::map> -codecBufMap_; // key is buffer id } class CodecBuffer { - -shared_ptr sharedMem_; - -BufferHandle* bufferHandle_; - +CodecBuffer(shared_ptr); - -InitBuffer(uint32_t CodecBufferType); + +CodecBuffer(std::shared_ptr buffer, CompVerInfo& verInfo, uint32_t bufferSize); + +~CodecBuffer() = default; + +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_; + -std::shared_ptr buffer_; + -std::shared_ptr memory_; + -std::shared_ptr omxBuffer_; } abstract CodecPort { @@ -168,17 +187,11 @@ Class CodecCmdExecutor { ## 调用时序图 + ```plantuml -participant PluginManager participant CodecFilter -participant CodecAdapterPlugin -participant CodecAdapter -box "CodecAdapter聚合类" -participant CodecPort -participant CodecCmdExecutor -participant CodecBufferPool -participant CodecFactory -end box +participant PluginManager +participant HdiCodecAdapter box "HDI_Interface" participant ComponentManager participant Component @@ -186,58 +199,44 @@ 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) +PluginManager -> HdiCodecAdapter : RegisterOneCodecPackage +HdiCodecAdapter -> PluginManager : AddPackage(PackageName) +HdiCodecAdapter -> ComponentManager : GetComponentManager +HdiCodecAdapter -> ComponentManager : GetComponentNumber +HdiCodecAdapter -> ComponentManager : GetComponentCapabilityList +HdiCodecAdapter -> 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 -> HdiCodecAdapter : get plugin list for H264,CreatePlugin +HdiCodecAdapter -> HdiCodecAdapter : ctor +CodecFilter -> HdiCodecAdapter : filter.Negotiate() : plugin -> Init() +HdiCodecAdapter -> Component : CreateComponent() +HdiCodecAdapter -> ComponentCallback : CreateComponentCallback() +HdiCodecAdapter -> Component : GetComponentVersion() +CodecFilter -> HdiCodecAdapter : filter.Configure() : plugin -> SetParameter() +HdiCodecAdapter -> HdiCodecAdapter : save tag value used to config omx port +HdiCodecAdapter -> Component : ConfigOmx() +HdiCodecAdapter -> Component : GetBufferInfoOnPort( get buffer size and count from omx ) +CodecFilter -> HdiCodecAdapter : filter.Configure() : plugin -> GetParameter() +HdiCodecAdapter -> CodecFilter : send omx buffer count and size to filter +CodecFilter -> HdiCodecAdapter : filter.Configure() : plugin -> QueueOutputBuffer() // queue all output buffer down +HdiCodecAdapter -> HdiCodecAdapter : outBufferQ_.Push(outputBuffers) +CodecFilter -> HdiCodecAdapter : filter.Configure() : plugin -> Prepare() +HdiCodecAdapter -> Component : UseBufferOnInputPort(size, count) // allocate and use buffer +HdiCodecAdapter -> Component : UseBufferOnOutputPort(size, count) // allocate and use buffer +HdiCodecAdapter -> Component : set component status : OMX_StateIdle and wait callback +CodecFilter -> HdiCodecAdapter : filter.Configure() : plugin -> Start() +HdiCodecAdapter -> Component : set component status : OMX_StateExecuting +HdiCodecAdapter -> Component : FillAllTheBuffer() : for { FillThisBuffer() } +CodecFilter -> HdiCodecAdapter : filter.Configure() : start new thread : plugin -> QueueInputBuffer() +HdiCodecAdapter -> Component : translate PluginBuffer to OmxBuffer and call EmptyThisBuffer() +HdiCodecAdapter -> CodecFilter : OnInputBufferDone() +ComponentCallback -> HdiCodecAdapter : callback : EmptyBufferDone( unUsedInBufferId_.push_back(buffer->bufferId) ) +ComponentCallback -> HdiCodecAdapter : callback: FillBufferDone( translate OmxBuf to PluginBuf, and send free outBuffer to HDI ) +HdiCodecAdapter -> 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() +CodecFilter -> HdiCodecAdapter : filter.Stop() : plugin -> Flush() +HdiCodecAdapter -> Component : Flush( SendCommand OMX_CommandFlush ) +CodecFilter -> HdiCodecAdapter : filter.Stop() : plugin -> Stop() +HdiCodecAdapter -> Component : Stop( SendCommand OMX_StateIdle ) ``` \ No newline at end of file