Использование GMFBridge в DirectShow - PullRequest
2 голосов
/ 23 мая 2011

enter code here Я должен остановиться и запустить Фильтр видео рендерера динамически. Это невозможно с «нормальной» архитектурой Direct Show без создания нового графика. Но с GMFBridge кажется, что это возможно.

Но я не могу понять, как его использовать. (Да, я прочитал статью на http://www.gdcl.co.uk/gmfbridge/index.htm)

Мой график:

SourceFilter ---> MyCustomTransformFilter ---> Video Rendrer Filter

Так GMFBridge подходит где?

i) I can devide my graph two pieces 
       [ Source Filter + MyCustomFilter ] + Video Rendere


ii) Then how to add my filters to graph, and stop start Video Rendrere without 
affecting the rest of my grapg using GMFBridge?

Обновление:

Спасибо, Виммель

Я просто запутался ... Дай мне понять, что я понимаю

i) Сначала у меня один график

 (SingleGraph) SourceFilter ---> MyCustomTransformFilter ---> Video Rendrer Filter

ii) Чтобы использовать GMFBridge, я разделил свой единственный график на два отдельных графика

 First Graph  :  SourceFilter ---> MyCustomTransformFilter --> GMFBridgeSinkFilter
 Second Graph :  GMFBridgeSourceFilter ---> Video Renderer Filter

Ну, GMFBridgeSinkFilter и GMFBridgeSourceFilter? кто они такие? их тип класса?

iii) Затем я создаю экземпляр IGMFBridgeControllerPtr и выполняю необходимую инициализацию ...

IGMFBridgeControllerPtr bridgeController = ......

.....
bridgeController->AddStream(true, eUncompressed, true); 
bridgeController->AddStream(false, eUncompressed, true); 

iv) Bridge Controller добавляет фильтр приемника к исходному графику и подключает его:

 bridgeController->InsertSinkFilter(sourceGraph, sourceGraphSinkFilter);

Что такое sourceGraph, sourceGraphSinkFilter s?

// now connect it like this:
// SourceFilter ---> MyCustomTransformFilter ---> SourceGraphSinkFilter

Вы имеете в виду программно подключить эти фильтры на исходном графике?

iv) Во втором графике позвольте контроллеру добавить фильтр источника и подключить его к рендереру:

bridgeController->InsertSourceFilter(sinkFilter, renderGraph, renderGraphSourceFilter);

Опять же, что такое SinkFilter, renderGraphSourceFilter и т. Д.?

 // now connect it like this:
 // RenderGraphSourceFilter ---> Video Renderer Filter

И Вы имеете в виду программно соединить эти фильтры в исходном графе?

1 Ответ

3 голосов
/ 23 мая 2011

Возможно, вы захотите создать следующие два графика:

1: SourceFilter ---> MyCustomTransformFilter ---> GMFBridgeSinkFilter

2: GMFBridgeSourceFilter ---> Video Renderer Filter

В основном вы делаете следующее:

Создайте GMFBridgeController и настройте его, например, одно видео и один аудиопоток:

IGMFBridgeControllerPtr  m_pController; 
HRESULT hr = m_pController.CreateInstance(__uuidof(GMFBridgeController)); 
m_pController->AddStream(true, eUncompressed, true); 
m_pController->AddStream(false, eUncompressed, true); 

Теперь позвольте контроллеру добавить фильтр приемника к исходному графику и подключить его:

hr = m_pController->InsertSinkFilter(m_pSourceGraph, &m_pSourceGraphSinkFilter);
// now connect it like this:
// SourceFilter ---> MyCustomTransformFilter ---> SourceGraphSinkFilter

Во втором графике позвольте контроллеру добавить фильтр источника и подключите его к визуализатору:

hr = m_pController->InsertSourceFilter(m_pSourceGraphSinkFilter, m_pRenderGraph, &m_pRenderGraphSourceFilter); 
// now connect it like this:
// RenderGraphSourceFilter ---> Video Renderer Filter

Запустите оба графика и соедините их:

hr = m_pController->BridgeGraphs(m_pSourceGraphSinkFilter, m_pRenderGraphSourceFilter); 

Если вы хотите остановить один график, сначала отключите:

m_pController->BridgeGraphs(NULL, NULL);

редактировать

Вот некоторые уточнения, которые вы просили:

GMFBridgeSinkFilter и GMFBridgeSourceFilter - это фильтры, созданные GMFBridge. Я не знаю их точные типы, но, по крайней мере, они происходят от IBaseFilter.

m_pSourceGraph и m_pRenderGraph - это интерфейсы IGraphBuilder для обоих созданных вами графиков.

m_pSourceGraphSinkFilter и m_pRenderGraphSourceFilter являются указателями на IBaseFilter для получения указателя на фильтр, созданный GMFBridge.

И да, когда я говорю «подключить фильтры», я имею в виду программно подключить их. Насколько я знаю, вы не можете тестировать GMFBridge в графите.

...