www.pudn.com > AVChat1.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; // Send this sample if (mSocket != INVALID_SOCKET) { // Send a media type first. Send once! if (!mIsMediaTypeSent) { mIsMediaTypeSent = TRUE; bytes = SendMediaType(); } // Send header mPackHeader.pack_type = PT_Payload; mPackHeader.pack_size = length; mPackHeader.my_hton(); bytes = send(mSocket, (char*)&mPackHeader, sizeof(mPackHeader), 0); // Send payload bytes = send(mSocket, (char*)pData, length, 0); } } } return hr; } int CXInputPin::SendMediaType(void) { int bytes = 0; if (mSocket != INVALID_SOCKET) { // Determine media type: audio ? video ? if (m_mt.formattype == FORMAT_VideoInfo) { mPackHeader.pack_type = PT_VideoMediaType; } else { mPackHeader.pack_type = PT_AudioMediaType; } mPackHeader.pack_size = m_mt.cbFormat; mPackHeader.my_hton(); // Send header bytes = send(mSocket, (char*)&mPackHeader, sizeof(mPackHeader), 0); // Send payload bytes = send(mSocket, (char *)m_mt.pbFormat, m_mt.cbFormat, 0); } return bytes; } STDMETHODIMP CXInputPin::EndOfStream(void) { CAutoLock lck(&mReceiveLock); // if (mSocket != INVALID_SOCKET) // { // closesocket(mSocket); // mSocket = INVALID_SOCKET; // } 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; } }