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;
}