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


// 
// CXInputPin.cpp 
// 
 
#include  
#include  
#include "CFilterNetSender.h" 
#include "CXInputPin.h" 
#include "stdio.h" 
 
///////////////////////////////////////////////////////////////////////////////////////// 
CXInputPin::CXInputPin(CFilterNetSender *pFilter, HRESULT *phr) : 
CRenderedInputPin(NAME("Input Pin"), pFilter, &pFilter->mFilterLock, phr, L"Input") 
{ 
	mFilter      = pFilter; 
	mSocket		 = INVALID_SOCKET; 
	mIsMediaTypeSent = FALSE; 
} 
 
CXInputPin::~CXInputPin() 
{ 
	if (mSocket != INVALID_SOCKET) 
	{ 
		closesocket(mSocket); 
		mSocket = INVALID_SOCKET; 
	} 
} 
 
STDMETHODIMP CXInputPin::Receive(IMediaSample *pSample) 
{ 
	CAutoLock  lck(&mReceiveLock); 
	HRESULT hr = CRenderedInputPin::Receive(pSample); 
 
	if (SUCCEEDED(hr)) 
	{ 
		if (m_SampleProps.dwStreamId == AM_STREAM_MEDIA)  
		{ 
			PBYTE pData; 
			pSample->GetPointer(&pData); 
			long length = pSample->GetActualDataLength(); 
			int  bytes  = 0; 
			int nSendLen = 0; 
			PBYTE pSendBuf = NULL; 
 
			// Send this sample 
			if (mSocket != INVALID_SOCKET) 
			{ 
				//// Send a media type first. Send once! 
				//if (!mIsMediaTypeSent) 
				//{ 
				//	mIsMediaTypeSent = TRUE; 
				//	bytes = SendMediaType(); 
				//} 
 
				mPackHeader.pack_type = PT_Payload; 
				mPackHeader.pack_size = length; 
				mPackHeader.my_hton(); 
				nSendLen = sizeof(Pack_Header)+ length; 
				pSendBuf = new BYTE[nSendLen ]; 
				memset(pSendBuf,0,nSendLen); 
				memcpy(pSendBuf,(char*)&mPackHeader,sizeof(Pack_Header)); 
				memcpy(pSendBuf + sizeof(Pack_Header),(char*)pData,length); 
				// Send payload 
				bytes = sendto(mSocket, (char*)pSendBuf, nSendLen, 0, 
					          (sockaddr *) &mAddr, sizeof(mAddr)); 
 
				if (bytes == -1) 
				{ 
					bytes = WSAGetLastError(); 
				} 
			} 
 
			if (pSendBuf) 
			{ 
				delete [] pSendBuf; 
				pSendBuf = NULL; 
			} 
		} 
	} 
	 
	return hr; 
} 
 
STDMETHODIMP CXInputPin::EndOfStream(void) 
{ 
	CAutoLock  lck(&mReceiveLock); 
 
	return CRenderedInputPin::EndOfStream(); 
} 
 
STDMETHODIMP CXInputPin::BeginFlush(void) 
{ 
	CAutoLock lck(&mFilter->mFilterLock); 
 
	HRESULT hr = CRenderedInputPin::BeginFlush(); 
 
	return hr; 
} 
 
STDMETHODIMP CXInputPin::EndFlush(void) 
{ 
	CAutoLock lck(&mFilter->mFilterLock); 
 
	return CRenderedInputPin::EndFlush(); 
} 
 
STDMETHODIMP CXInputPin::ReceiveCanBlock(void) 
{ 
	return S_OK; 
} 
 
HRESULT CXInputPin::CheckMediaType(const CMediaType * inMediaType) 
{ 
	if (inMediaType->formattype == FORMAT_VideoInfo || 
		inMediaType->formattype == FORMAT_WaveFormatEx) 
	{ 
		return S_OK; 
	} 
	return E_FAIL; 
} 
 
void CXInputPin::SetStreamSocket(SOCKET inSocket) 
{ 
	mSocket = inSocket; 
} 
 
void CXInputPin::CancelPendingSend(void) 
{ 
	if (mSocket != INVALID_SOCKET) 
	{ 
		closesocket(mSocket); 
		mSocket = INVALID_SOCKET; 
	} 
} 
 
BYTE * CXInputPin::GetpbFormat(int& nSize) 
{ 
	nSize = m_mt.cbFormat; 
	return m_mt.pbFormat; 
}