www.pudn.com > AVChat0926.rar > CFilterNetSender.cpp


// 
// CFilterNetSender.cpp 
// 
 
#include           // quartz, includes windows 
#include  
 
#include "CFilterNetSender.h" 
 
// {A7F18A36-2899-4546-8D88-4D21D4F2DA4D} 
DEFINE_GUID(CLSID_NetSender,  
0xa7f18a36, 0x2899, 0x4546, 0x8d, 0x88, 0x4d, 0x21, 0xd4, 0xf2, 0xda, 0x4d); 
 
// ---------------------------------------------------------------------------- 
//            Filter implementation 
// ---------------------------------------------------------------------------- 
CFilterNetSender::CFilterNetSender(LPUNKNOWN lpunk, HRESULT *phr) : 
CBaseFilter(NAME("NetSender"), lpunk, &mFilterLock, CLSID_NetSender) 
{ 
	mPosition = NULL; 
	mInputPin = new CXInputPin(this, phr); 
}  
 
CFilterNetSender::~CFilterNetSender() 
{ 
	delete mInputPin; 
	if (mPosition != NULL) 
	{ 
		delete mPosition; 
		mPosition = NULL; 
	} 
} 
 
// 
// Basic COM - used here to reveal our own interfaces 
STDMETHODIMP CFilterNetSender::NonDelegatingQueryInterface(REFIID riid, void ** ppv) 
{ 
	if (riid == IID_IMediaPosition || riid == IID_IMediaSeeking)  
	{ 
		// Expose mediaseeking interface on our renderer 
		HRESULT hr = S_OK; 
		if (mPosition == NULL)  
		{ 
			mPosition  = new CPosPassThru(NAME("Pass Through"), 
										(IUnknown *) GetOwner(), 
										(HRESULT *) &hr, mInputPin); 
			if (mPosition == NULL)  
			{ 
				return E_OUTOFMEMORY; 
			} 
		} 
		if (FAILED(hr))  
		{ 
			delete mPosition; 
			mPosition = NULL; 
			return hr; 
		} 
		return mPosition->NonDelegatingQueryInterface(riid, ppv); 
	} 
	else 
	{ 
		return CBaseFilter::NonDelegatingQueryInterface(riid, ppv); 
	} 
}  
 
// Instantiate the pin object 
CBasePin * CFilterNetSender::GetPin(int n) 
{ 
	if (n == 0)  
	{ 
		return mInputPin; 
	} 
	else  
	{ 
		return NULL; 
	} 
}  
 
// We have only one rendered input pin 
int CFilterNetSender::GetPinCount() 
{ 
	return 1; 
} 
 
STDMETHODIMP CFilterNetSender::Stop() 
{ 
	if (mInputPin) 
	{ 
		mInputPin->CancelPendingSend(); 
	} 
 
	return CBaseFilter::Stop(); 
} 
 
// --- public methods --- 
void CFilterNetSender::SetStreamSocket(SOCKET inSocket) 
{ 
	if (mInputPin) 
	{ 
		mInputPin->SetStreamSocket(inSocket); 
	} 
} 
 
 
void CFilterNetSender::SetTargetAddress(SOCKADDR_IN addr) 
{ 
	if (mInputPin) 
	{ 
		mInputPin->SetTargetAddress(addr); 
	} 
} 
 
//得到媒体类型信息,以便建立接收媒体数据的GRAPH 
BYTE* CFilterNetSender::GetPinpbFormat(int& nSize) 
{ 
	if (mInputPin) 
	{ 
		return mInputPin->GetpbFormat(nSize); 
	} 
	return NULL; 
}