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