www.pudn.com > AVChat0926.rar > CNetOutPin.cpp
// // CNetOutPin.cpp // #include "stdafx.h" #include "GlobalDefs.h" #include#include "CFilterNetReceiver.h" #include "CNetOutPin.h" /////////////////////////////////////////////////////////////////////////////// CNetOutPin::CNetOutPin(CFilterNetReceiver *inFilter, HRESULT *phr, LPCWSTR pName) : CBaseOutputPin(NAME("Net_Stream"), inFilter, &inFilter->mFilterLock, phr, pName) { mFilter = inFilter; mPreferredMt.InitMediaType(); // Test /* mPreferredMt.SetType(&MEDIATYPE_Video); mPreferredMt.SetSubtype(&MEDIASUBTYPE_RGB24); mPreferredMt.SetFormatType(&FORMAT_VideoInfo); mPreferredMt.SetTemporalCompression(FALSE); VIDEOINFOHEADER info; ZeroMemory(&info, sizeof(VIDEOINFOHEADER)); info.AvgTimePerFrame = 400000; info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info.bmiHeader.biWidth = 360; info.bmiHeader.biHeight = 288; info.bmiHeader.biBitCount = 24; info.bmiHeader.biSizeImage = 360 * 288 * 3; info.bmiHeader.biCompression = 0; info.bmiHeader.biPlanes = 1; mPreferredMt.SetFormat((BYTE*)&info, sizeof(VIDEOINFOHEADER)); mPreferredMt.SetSampleSize(info.bmiHeader.biSizeImage);*/ } CNetOutPin::~CNetOutPin() { } void CNetOutPin::SetupMediaType(long inType, char * inFormat, long inLength) { if (inType == PT_VideoMediaType) { mPreferredMt.SetType(&MEDIATYPE_Video); mPreferredMt.SetFormatType(&FORMAT_VideoInfo); // Determine the video subtype VIDEOINFOHEADER * pvi = (VIDEOINFOHEADER *) inFormat; const GUID subtype = GetBitmapSubtype(&pvi->bmiHeader); mPreferredMt.SetSubtype(&subtype); // Verify image size pvi->bmiHeader.biSizeImage = pvi->bmiHeader.biWidth * pvi->bmiHeader.biHeight * pvi->bmiHeader.biBitCount / 8; mPreferredMt.SetFormat((BYTE*)inFormat, inLength); mPreferredMt.SetSampleSize(pvi->bmiHeader.biSizeImage); } else { mPreferredMt.SetType(&MEDIATYPE_Audio); mPreferredMt.SetSubtype(&MEDIASUBTYPE_PCM); mPreferredMt.SetFormatType(&FORMAT_WaveFormatEx); // Verify sample size (one second) WAVEFORMATEX * wave = (WAVEFORMATEX *) inFormat; wave->nAvgBytesPerSec = wave->nSamplesPerSec * wave->nChannels * wave->wBitsPerSample / 8; mPreferredMt.SetFormat((BYTE*)inFormat, inLength); mFilter->SetAudioBytesPerSecond(wave->nAvgBytesPerSec); } mPreferredMt.SetTemporalCompression(FALSE); } HRESULT CNetOutPin::CheckMediaType(const CMediaType * inMediaType) { if (*inMediaType == mPreferredMt) { return NOERROR; } return E_FAIL; } HRESULT CNetOutPin::DecideBufferSize(IMemAllocator * pAlloc, ALLOCATOR_PROPERTIES * pprop) { ASSERT(pAlloc); ASSERT(pprop); HRESULT hr = NOERROR; // Determine sample size if (mPreferredMt.formattype == FORMAT_VideoInfo) { VIDEOINFOHEADER * info = (VIDEOINFOHEADER *) mPreferredMt.pbFormat; pprop->cbBuffer = info->bmiHeader.biSizeImage; } else { WAVEFORMATEX * info = (WAVEFORMATEX *) mPreferredMt.pbFormat; pprop->cbBuffer = info->nAvgBytesPerSec; } pprop->cBuffers = 1; pprop->cbAlign = 1; ASSERT(pprop->cbBuffer); ALLOCATOR_PROPERTIES Actual; hr = pAlloc->SetProperties(pprop, &Actual); if (FAILED(hr)) { return hr; } ASSERT( Actual.cBuffers == 1 ); if (pprop->cBuffers > Actual.cBuffers || pprop->cbBuffer > Actual.cbBuffer) { return E_FAIL; } return NOERROR; } HRESULT CNetOutPin::GetMediaType(int iPosition,CMediaType *pMediaType) { if (iPosition == 0) { *pMediaType = mPreferredMt; return NOERROR; } return E_INVALIDARG; }