www.pudn.com > H264RtpSource.rar > H264Source.cpp


#include "StdAfx.h" 
#include ".\h264source.h" 
 
#include "initguid.h" 
#include "FilterGuid.h" 
#include "RtpSourceOutPin.h" 
#include "AllProtocol.h" 
#include "MySafeDefine.h" 
 
CH264Source::CH264Source(char* pName,LPUNKNOWN lpunk,HRESULT *phr) 
	:CSource(pName,lpunk,Clsid_H264RtpSource) 
	,m_pAllProtocol(NULL) 
{ 
	//这个地方创建CAllProtocol对象实例,启动线程; 
	//但是线程里面可能还不能采集到数据,因为可能服务器还没有连接; 
	//连接服务器要把服务器的IP地址和端口号传给实例 
	int iRetCode; 
	m_pAllProtocol = new CAllProtocol(); 
	iRetCode = m_pAllProtocol->OpenThread(); 
	//说明线程创建不成功 
	if (iRetCode!=1)return; 
	//这个地方可以创建一个pin和一些初始化 
	char cOutPinName[15] = {"VideoOutPin"}; 
	m_RtpSourceOutPin = NULL; 
	m_RtpSourceOutPin = new CRtpSourceOutPin(cOutPinName,phr,this,L"VideoOutPin"); 
	if (m_RtpSourceOutPin != NULL) 
	{ 
		*phr = S_OK; 
	}else{ 
		*phr = E_OUTOFMEMORY; 
	} 
	//把CAllProtocol实例传给outpin 
	m_RtpSourceOutPin->SetProtocolPtr(m_pAllProtocol); 
} 
 
CH264Source::~CH264Source(void) 
{ 
	//在释放掉实例之前,我们要先关闭进程 
	m_pAllProtocol->CloseThread(); 
	////////////关闭线程后,我们要断开链接 
	//m_pAllProtocol->CloseConnect(); 
	//释放掉outpin中的CAllProtocol实例 
	m_RtpSourceOutPin->SetProtocolPtr(NULL); 
	SAFE_DELETE(m_pAllProtocol); 
	//删掉pin,释放资源 
	SAFE_DELETE(m_RtpSourceOutPin); 
} 
 
CUnknown *WINAPI CH264Source::CreateInstance(LPUNKNOWN lpunk,HRESULT *phr) 
{ 
	CH264Source *pFilter = new CH264Source(NAME("H264RtpSource"),lpunk,phr); 
	if (pFilter!=NULL) 
	{ 
		*phr = S_OK; 
	}else{ 
		//内存泄露 
		*phr = E_OUTOFMEMORY; 
	} 
	return pFilter; 
} 
 
//暴露一些用户自定义的接口 
STDMETHODIMP CH264Source::NonDelegatingQueryInterface(REFIID riid, void **ppv) 
{ 
	CheckPointer(ppv, E_POINTER); 
	if (riid == IID_IH264RtpSource) 
	{ 
		return GetInterface((IH264RtpSource *)this, ppv); 
	}else{ 
		//这里没有接口,我们现在确定只连接一个固定的摄象机 
		return CSource::NonDelegatingQueryInterface(riid,ppv); 
	} 
} 
 
//释放接口 
STDMETHODIMP_(ULONG) CH264Source::NonDelegatingRelease(ULONG) 
{ 
	return CSource::NonDelegatingRelease(); 
} 
 
////设置RTP通讯的端口 
STDMETHODIMP CH264Source::SetRTPPort(unsigned short LocalPort) 
{ 
	m_pAllProtocol->SetRTPPort(LocalPort); 
	return S_OK; 
} 
 
//////一定要实现函数接口,要不然;要创建实例是很困难的. 
STDMETHODIMP CH264Source::USRStart(char *IPaddr, int port) 
{ 
	BOOL bRetCode; 
	bRetCode = m_pAllProtocol->USRStart(IPaddr,port); 
	if (!bRetCode)return 0x80000000+1; 
	return S_OK; 
} 
 
STDMETHODIMP CH264Source::USRStartPlay( unsigned char StartFlag ) 
{ 
	BOOL bRetCode; 
	bRetCode = m_pAllProtocol->USRStartPlay(StartFlag); 
	if (!bRetCode)return 0x80000000+1; 
	return S_OK; 
} 
 
STDMETHODIMP CH264Source::USRStop() 
{ 
	m_pAllProtocol->USRStop(); 
	return S_OK; 
} 
 
//得到视频参数 
STDMETHODIMP CH264Source::USRGetPicture(PICTURE* pic) 
{ 
	BOOL bRetCode; 
	bRetCode = m_pAllProtocol->GetPicture(pic); 
	if (!bRetCode)return 0x80000000+1; 
	return S_OK; 
} 
 
STDMETHODIMP CH264Source::USRSetPicture(PICTURE* pic) 
{ 
	BOOL bRetCode; 
	bRetCode = m_pAllProtocol->SetPicture(pic); 
	if (!bRetCode)return 0x80000000+1; 
	return S_OK; 
}