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