📄 graphrebuildhelper.cpp
字号:
#include "stdafx.h"
#include "graphrebuildhelper.h"
GraphRebuildHelper::GraphRebuildHelper(void) : p_pin(NULL), p_render_filter(NULL), used(false)
{
}
GraphRebuildHelper::~GraphRebuildHelper(void)
{
reset();
}
void GraphRebuildHelper::reset()
{
if(p_pin)
p_pin->Release();
if(p_render_filter)
p_render_filter->Release();
}
HRESULT GraphRebuildHelper::rungraph(IFilterGraph *_igraph)
{
assert(_igraph);
if(_igraph == NULL)
return S_FALSE;
IMediaControl* _pcontrol = NULL;
HRESULT hr = _igraph->QueryInterface(IID_IMediaControl, (void**) &_pcontrol);
if(FAILED(hr))
return hr;
hr = _pcontrol->Run();
_pcontrol->Release();
return hr;
}
HRESULT GraphRebuildHelper::stopgraph(IFilterGraph *_igraph)
{
assert(_igraph);
if(_igraph == NULL)
return S_FALSE;
IMediaControl* _pcontrol = NULL;
HRESULT hr = _igraph->QueryInterface(IID_IMediaControl, (void**) &_pcontrol);
if(FAILED(hr))
return hr;
hr = _pcontrol->Stop();
_pcontrol->Release();
return hr;
}
HRESULT GraphRebuildHelper::startbuilding(IFilterGraph *_igraph, CBasePin *_ipin, bool _isaudio)
{
reset();
assert(_igraph);
if(_igraph == NULL)
return S_FALSE;
if(!get_render_filters(_isaudio, _igraph))
return E_FAIL;
if(!get_render_pin())
return E_FAIL;
//总算拿到render的pin啦
IGraphBuilder* p_builder = NULL;
HRESULT hr;
hr = _igraph->QueryInterface(IID_IGraphBuilder, (void**) &p_builder);
if(FAILED(hr))
return hr;
//先断开连接
_igraph->Disconnect(_ipin);
_igraph->Disconnect(p_pin);
//使用reconnect方法进行重连
hr = p_builder->Connect(_ipin, p_pin);
p_builder->Release();
return hr;
}
namespace{
inline bool is_filter_video_render(GUID &guid)
{
if (CLSID_VideoMixingRenderer == guid ||
CLSID_VideoRendererDefault == guid||
CLSID_VideoRenderer == guid)
return true;
else
return false;
}
inline bool is_filter_audio_render(GUID &guid)
{
if (CLSID_DSoundRender == guid ||
CLSID_AudioRender == guid )
return true;
else
return false;
}
}
bool GraphRebuildHelper::get_render_filters (bool _isaudio, IFilterGraph *p_graph)
{
IEnumFilters* pEnum = NULL;
HRESULT hr = p_graph->EnumFilters(&pEnum);
if (FAILED(hr))
return false;
//
GUID *p_first_guid = NULL;
GUID _guid;
bool b_ok = false;
pEnum->Reset();
while(pEnum->Next(1, &p_render_filter, NULL) == S_OK)
{
GUID guid;
hr = p_render_filter->GetClassID(&guid);
if(FAILED(hr))
continue;
if(p_first_guid == NULL)
{
p_first_guid = &_guid;
*p_first_guid = guid;
}
else if(*p_first_guid == guid) //搜了一圈都没找到……
break;
if(_isaudio)
b_ok = is_filter_audio_render(guid);
else
b_ok = is_filter_video_render(guid);
if(b_ok)
break;
p_render_filter->Release();
}
//
pEnum->Release();
return b_ok;
}
bool GraphRebuildHelper::get_render_pin()
{
IEnumPins* ppEnum = NULL;
//
if (S_OK == p_render_filter->EnumPins(&ppEnum))
{
ppEnum->Reset();
HRESULT hr = ppEnum->Next(1, &p_pin, NULL);
if(FAILED(hr))
return false;
else
return true;
}
else
ppEnum->Release();
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -