From af49ee222b12175ada2eaa6e730f6cfe93062cf0 Mon Sep 17 00:00:00 2001 From: SebasLedesma Date: Wed, 25 Mar 2015 18:39:53 -0300 Subject: [PATCH 1/2] Support for GMFbridge Proposed solution for https://github.com/cplussharp/graph-studio-next/issues/266 --- src/display_graph.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/display_graph.cpp b/src/display_graph.cpp index 437c98b..d280d14 100644 --- a/src/display_graph.cpp +++ b/src/display_graph.cpp @@ -12,6 +12,7 @@ #include "MediaTypeSelectForm.h" #include "GRF_File.h" +#include "../GMFBridge/GMFBridge_h.h" #include #include @@ -23,6 +24,12 @@ GRAPHSTUDIO_NAMESPACE_START // cf stdafx.h for explanation +static const GUID nullGUID = {0x00, 0x00, 0x00, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; +static const GUID clsid_GMFBridgeController={0x08E3287F, 0x3A5C, 0x47e9, {0x81, 0x79, 0xA9, 0xE9, 0x22, 0x1A, 0x5C, 0xDE}}; +IGMFBridgeController *pIBridgeController=NULL; +IUnknown* pBridgeSource=NULL; +IUnknown* pBridgeSink=NULL; + static bool CanSeekByTimeFormat(IMediaSeeking * ims, const GUID & time_format) { bool enable = false; @@ -144,6 +151,21 @@ GRAPHSTUDIO_NAMESPACE_START // cf stdafx.h for explanation DisplayGraph::~DisplayGraph() { + if (pBridgeSink||pBridgeSource) { + if (pBridgeSink) { + pBridgeSink->Release(); + pBridgeSink=NULL; + } + if (pBridgeSource) { + pBridgeSource->Release(); + pBridgeSource=NULL; + } + pIBridgeController->BridgeGraphs(NULL, NULL); + if (!pBridgeSink && !pBridgeSource) { + pIBridgeController->Release(); + pIBridgeController=NULL; + } + } CloseLogFile(); if (graph_callback) { graph_callback->NonDelegatingRelease(); @@ -1801,7 +1823,34 @@ GRAPHSTUDIO_NAMESPACE_START // cf stdafx.h for explanation NameGuid(filter.clsid, guidStr, true); _tprintf(_T("Creating filter %d %s, CLSID %s\n"), filter.index, (LPCTSTR)filter.name, (LPCTSTR)guidStr); - hr = filter.ibasefilter.CoCreateInstance(filter.clsid, NULL, CLSCTX_INPROC_SERVER); + if (memcmp(nullGUID, &filter.guid)!=0) { + hr = filter.ibasefilter.CoCreateInstance(filter.clsid, NULL, CLSCTX_INPROC_SERVER); + } + else { + //check for 'Bridge Source filter' or 'Bridge Sink filter' + if (!pIBridgeController) { + hr = CoCreateInstance(clsid_GMFBridgeController, NULL, CLSCTX_INPROC_SERVER, __uuidof(pIBridgeController), (void **)&pIBridgeController); + } + if (_tcscmp(filter.name, _T("Bridge Sink filter")==0) { + if (pIBridgeController) + pIBridgeController->InsertSinkFilter(gb, (IUnknown **) &pBridgeSink); + if (pBridgeSink) { + IBaseFilter *pSinkFilter=NULL; + pBridgeSink->QueryInterface(IID_IBaseFilter, (void**)&pSinkFilter); + filter.ibasefilter=pSinkFilter; + } + } + else if (_tcscmp(filter.name, _T("Bridge Source filter")==0) { + if (pIBridgeController) + pIBridgeController->InsertSourceFilter(NULL/*pSinkFilter*/, gb, (IUnknown**)&pBridgeSource); + if (pBridgeSource) { + IBaseFilter *pSourceFilter=NULL; + pBridgeSource->QueryInterface(IID_IBaseFilter, (void**)&pSourceFilter); + filter.ibasefilter=pSourceFilter; + } + + } + } ASSERT(filter.ibasefilter); From a9dc65d6ce47de9a3b59f530530004663dd58747 Mon Sep 17 00:00:00 2001 From: SebasLedesma Date: Thu, 26 Mar 2015 19:12:03 -0300 Subject: [PATCH 2/2] Update display_graph.cpp bugfixing the bridge solution :P --- src/display_graph.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/display_graph.cpp b/src/display_graph.cpp index d280d14..7775d2e 100644 --- a/src/display_graph.cpp +++ b/src/display_graph.cpp @@ -1823,7 +1823,7 @@ IUnknown* pBridgeSink=NULL; NameGuid(filter.clsid, guidStr, true); _tprintf(_T("Creating filter %d %s, CLSID %s\n"), filter.index, (LPCTSTR)filter.name, (LPCTSTR)guidStr); - if (memcmp(nullGUID, &filter.guid)!=0) { + if (memcmp(&nullGUID, &filter.clsid, sizeof(filter.clsid))!=0) { hr = filter.ibasefilter.CoCreateInstance(filter.clsid, NULL, CLSCTX_INPROC_SERVER); } else { @@ -1831,7 +1831,7 @@ IUnknown* pBridgeSink=NULL; if (!pIBridgeController) { hr = CoCreateInstance(clsid_GMFBridgeController, NULL, CLSCTX_INPROC_SERVER, __uuidof(pIBridgeController), (void **)&pIBridgeController); } - if (_tcscmp(filter.name, _T("Bridge Sink filter")==0) { + if (_tcscmp(filter.name, _T("Bridge Sink filter"))==0) { if (pIBridgeController) pIBridgeController->InsertSinkFilter(gb, (IUnknown **) &pBridgeSink); if (pBridgeSink) { @@ -1840,7 +1840,7 @@ IUnknown* pBridgeSink=NULL; filter.ibasefilter=pSinkFilter; } } - else if (_tcscmp(filter.name, _T("Bridge Source filter")==0) { + else if (_tcscmp(filter.name, _T("Bridge Source filter"))==0) { if (pIBridgeController) pIBridgeController->InsertSourceFilter(NULL/*pSinkFilter*/, gb, (IUnknown**)&pBridgeSource); if (pBridgeSource) {