diff --git "a/design/MediaFoundation(new)/class\345\256\232\344\271\211.md" "b/design/MediaFoundation(new)/class\345\256\232\344\271\211.md" index b98067519b1f025052aa4961254aa4f73eb0ae00..a71a2bc35fee9c47470bda0435fae1eb6495e3fa 100644 --- "a/design/MediaFoundation(new)/class\345\256\232\344\271\211.md" +++ "b/design/MediaFoundation(new)/class\345\256\232\344\271\211.md" @@ -49,17 +49,20 @@ Interface EventReceiver { class Meta +Interface FilterLinkCallback { + + OnLinkedResult(AVBufferQueueProducer* queue, Meta& meta) + + OnUpdatededResult(Meta& meta) + + OnUnlinkedResult(Meta& meta) +} + Interface Filter { - +Filter(FilterType type) + +Filter(String name, FilterType type) +void Init(EventReceiver* receiver, FilterCallback* callback) +Status SetParameter(shared_ptr meta) +Status GetParameter(shared_ptr meta) +Status LinkNext(Filter* filter, FilterType outType) - +Status OnLinked(Filter* filter, FilterType inType, shared_ptr meta) +Status UpdateNext(Filter* filter, FilterType outType) - +Status OnUpdated(shared_ptr meta) +Status UnlinkNext(Filter* filter, FilterType outType) - +Status OnUnlinked(Filter* filter, FilterType inType) +Status Prepare() +Status Start() +Status Pause() @@ -68,7 +71,10 @@ Interface Filter { +Status Release() +BufferQueueProducer* GetInputBufferQueue() +FilterType GetFitlerType() - -SetOutputBufferQueue(BufferQueueProducer* queue) + #Status OnLinked(FilterType inType, shared_ptr meta, FilterLinkCallback* callback) + #Status OnUpdated(FilterType inType, shared_ptr meta, FilterLinkCallback* callback) + #Status OnUnlinked(FilterType inType, shared_ptr meta) + #SetOutputBufferQueue(BufferQueueProducer* queue) } class SomeFilter { @@ -123,14 +129,14 @@ class PluginManager { +PluginManager& Instance() +void RegisterGenericPlugin(const GenericPluginDef& pluginDef) +vector ListPlugins(PluginType pluginType) - shared_ptr GetPluginInfo(PluginType type, const string& name) - shared_ptr CreatePlugin(PluginType type, const string& name) + +shared_ptr GetPluginInfo(PluginType type, const string& name) + +shared_ptr CreatePlugin(PluginType type, const string& name) } class Pipeline { +void Init(EventReceiver* receiver, FilterCallback* callback) - +Status AddFilters(vector filters) - +Status RemoveFilter(FilterType type, Filter* filter) + +Status AddHeadFilters(vector filters) + +Status RemoveHeadFilter(Filter* filter) +Status LinkFilters(Filter* filter, vector filters, StreamType type) +Status UnlinkFilters(Filter* filter, vector filters, StreamType type) +Status UpdateFilters(Filter* filter, vector filters, StreamType type) @@ -146,6 +152,7 @@ class Pipeline { Filter .up.> Meta Filter --* Pipeline +Filter .up.|> FilterLinkCallback Pipeline ..> FilterType Pipeline .up.|> EventReceiver @@ -161,9 +168,9 @@ MediaSome .up.> PluginManager MediaSome --left> SomePlugin MediaSome --> AVBufferQueue -SomePluginImpl1 .up.|> SomePlugin -SomePluginImpl2 .up.|> SomePlugin -SomePluginImpl3 .up.|> SomePlugin +SomePluginImpl_1 .up.|> SomePlugin +SomePluginImpl_2 .up.|> SomePlugin +SomePluginImpl_3 .up.|> SomePlugin SomePlugin -up-|> Plugin SomePlugin ..> AVBuffer @@ -179,6 +186,8 @@ HiPlayer .right.|> FilterCallback FilterCallback .up.> FilterCallbackCommand - - ``` + +- MediaSome: 重构后的媒体原子能力 +- SomePlugin: 特定原子能力的插件接口 +- SomePluginImpl_x: 特点原子能力的不同实现 diff --git "a/design/MediaFoundation(new)/pipeline\346\223\215\344\275\234.md" "b/design/MediaFoundation(new)/pipeline\346\223\215\344\275\234.md" index ebefaf7a13a9ba6988e3037e9695b441cb2cc2cc..424f27296016993dac1ac1d6b3e2fcf6a524f364 100644 --- "a/design/MediaFoundation(new)/pipeline\346\223\215\344\275\234.md" +++ "b/design/MediaFoundation(new)/pipeline\346\223\215\344\275\234.md" @@ -4,42 +4,19 @@ ```plantuml App -> HiPlayer: new -HiPlayer -> Pipeline: new -HiPlayer -> SourceFilter: create +note right:创建player -App -> HiPlayer: SetSource(url) -HiPlayer -> SourceFilter: SetParameter({SOURCE, url}) +App -> HiPlayer: SetSource() +note right:配置播放源 App -> HiPlayer: Prepare -HiPlayer -> Pipeline: Prepare -activate Pipeline - Pipeline -> SourceFilter: Prepare - activate SourceFilter - SourceFilter -> CodecFilter: create, link, prepare - activate CodecFilter - CodecFilter -> SinkFilter: create, link, prepare - activate SinkFilter - return - return - return -return +note right:播放前调用准备流程 App -> HiPlayer: Play/Pause/Stop/Release -HiPlayer -> Pipeline: Start/Pause/Stop/Release -activate Pipeline - Pipeline -> SourceFilter: Start/Pause/Stop/Release - activate SourceFilter - SourceFilter -> CodecFilter: Start/Pause/Stop/Release - activate CodecFilter - CodecFilter -> SinkFilter: Start/Pause/Stop/Release - activate SinkFilter - return - return - return -return +note right:播放器状态控制 ``` -## A. Pipeline动态构建 +## B. Pipeline动态构建 ### 1. 创建关键filter,并配置给pipeline管理 @@ -167,8 +144,8 @@ activate Pipeline activate Pipeline Pipeline -> SourceFilter: LinkNext(aDecFilter, STREAM_ENC_A) activate SourceFilter - SourceFilter -> CodecFilter: OnLinked(sourceFilter, STREAM_ENC_A, meta) - note left: 将码流信息通过\nmeta配置给audio decoder + SourceFilter -> CodecFilter: OnLinked(STREAM_ENC_A, meta, AsCallback(sourceFilter)) + note left: 将码流信息通过meta\n配置给audio decoder\n同时传递callback return return return @@ -189,7 +166,7 @@ activate Pipeline Pipeline -> CodecFilter: LinkNext activate CodecFilter CodecFilter -> AudioSinkFilter: OnLinked - note left: 将需要的mediainfo\n传递给aSinkFilter + note left: 将需要的mediainfo\n传递给aSinkFilter\n同时传递callback return return return @@ -200,17 +177,23 @@ activate Pipeline AudioSinkFilter -> AudioSinkFilter: PostPrepare note left: 完成插件选择、\n初始化、配置 AudioSinkFilter -> Pipeline: OnEvent + AudioSinkFilter -> CodecFilter: OnLinkedResult(queue, meta) + activate CodecFilter + CodecFilter -> CodecFilter: SetOutputBufferQueue(queue) + CodecFilter -> CodecFilter: PostPrepare + note left: 前置filter在OnLinkedResult中\n完成后续配置,比如插件选择、\n初始化、与后置filter建立连接 + return return - CodecFilter -> AudioSinkFilter: GetInputBufferQueue - CodecFilter -> CodecFilter: PostPrepare - note left: 完成插件选择、初始化\n连接到下游filter CodecFilter -> Pipeline: OnEvent + CodecFilter -> SourceFilter: OnLinkedResult(queue, meta) + activate SourceFilter + SourceFilter -> SourceFilter: SetOutputBufferQueue(queue) + SourceFilter -> SourceFilter: PostPrepare + note left: 前置filter完成连接 + return return - SourceFilter -> CodecFilter: GetInputBufferQueue - SourceFilter -> SourceFilter: PostPrepare - note left: 连接到下游filter SourceFilter -> Pipeline: OnEvent return return @@ -277,8 +260,8 @@ activate Pipeline activate Pipeline Pipeline -> SourceFilter: UpdateNext(aDecFilter, STREAM_ENC_A) activate SourceFilter - SourceFilter -> CodecFilter: OnUpdated(meta) - note left: 传递需要更新的meta + SourceFilter -> CodecFilter: OnUpdated(type, meta, callback) + note left: 传递需要更新的meta\n同时传递callback return return return @@ -295,8 +278,8 @@ activate Pipeline activate Pipeline Pipeline -> CodecFilter: UpdateNext activate CodecFilter - CodecFilter -> AudioSinkFilter: OnUpdated(meta) - note left: 传递需要更新的meta + CodecFilter -> AudioSinkFilter: OnUpdated + note left: 传递需要更新的meta\n同时传递callback return return return @@ -309,19 +292,22 @@ activate Pipeline note left: 更新插件 AudioSinkFilter -> Pipeline: OnEvent - return + AudioSinkFilter -> CodecFilter: OnUpdatedResult(meta) + activate CodecFilter + CodecFilter -> CodecFilter: PostPrepare + note left: 更新解码插件\n更新filter数据通路 + return - CodecFilter -> AudioSinkFilter: GetInputBufferQueue - CodecFilter -> CodecFilter: PostPrepare - note left: 更新解码插件\n更新filter数据通路 + return CodecFilter -> Pipeline: OnEvent + CodecFilter -> SourceFilter: OnUpdatedResult(meta) + activate SourceFilter + SourceFilter -> SourceFilter: PostPrepare + note left: 更新filter数据通路 + return return - SourceFilter -> CodecFilter: GetInputBufferQueue - SourceFilter -> SourceFilter: PostPrepare - note left: 更新filter数据通路 - SourceFilter -> Pipeline: OnEvent return return