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