⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphrebuildhelper.cpp

📁 mysee网络直播源代码Mysee Lite是Mysee独立研发的网络视频流媒体播放系统。在应有了P2P技术和一系列先进流媒体技术之后
💻 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 + -