www.pudn.com > FilterTSSource.rar > CTSOutPin.cpp
// // CTSOutPin.cpp // #include#include "CFilterTSSource.h" #include "CTSOutPin.h" /////////////////////////////////////////////////////////////////////////////// CTSOutPin::CTSOutPin(HRESULT *phr, CFilterTSSource * pFilter, LPCWSTR pPinName) : CSourceStream(NAME("MPEG2 TS Stream"), phr, pFilter, pPinName) { mFilter = pFilter; m_fp = NULL; strcpy(mFilePath, ""); mPreferred.InitMediaType(); mPreferred.SetType(&MEDIATYPE_Stream); mPreferred.SetSubtype(&MEDIASUBTYPE_MPEG2_TRANSPORT); mSampleCount = 0; #ifdef _DUMP_SENT m_fpDebug = fopen("C:\\MediaSent.mpg", "wb"); #endif } CTSOutPin::~CTSOutPin() { CAutoLock lck(&mSharedState); if (m_fp) { fclose(m_fp); m_fp = NULL; } #ifdef _DUMP_SENT if (m_fpDebug) { fclose(m_fpDebug); m_fpDebug = NULL; } #endif } STDMETHODIMP CTSOutPin::QueryId(LPWSTR * Id) { return CBaseOutputPin::QueryId(Id); } HRESULT CTSOutPin::FillBuffer(IMediaSample * pSample) { CAutoLock lck(&mSharedState); BYTE * pData = NULL; pSample->GetPointer(&pData); long bytes = fread(pData, 1, SAMPLE_SIZE, m_fp); if (bytes < SAMPLE_SIZE && feof(m_fp)) { ::MessageBox(NULL, "End Of Stream!", "DSNetwork", MB_OK); return S_FALSE; } pSample->SetActualDataLength(bytes); pSample->SetSyncPoint(FALSE); LONGLONG start = mSampleCount++; LONGLONG stop = mSampleCount; pSample->SetMediaTime(&start, &stop); #ifdef _DUMP_SENT PBYTE pData8; pSample->GetPointer(&pData8); if (m_fpDebug) { fwrite(pData8, 1, pSample->GetActualDataLength(), m_fpDebug); } #endif return S_OK; } HRESULT CTSOutPin::DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProperties) { CAutoLock lck(m_pFilter->pStateLock()); ASSERT(pAlloc); ASSERT(pProperties); HRESULT hr = NOERROR; pProperties->cBuffers = 1; pProperties->cbBuffer = SAMPLE_SIZE; ASSERT(pProperties->cbBuffer); ALLOCATOR_PROPERTIES Actual; hr = pAlloc->SetProperties(pProperties, &Actual); if (FAILED(hr)) { return hr; } if (Actual.cbBuffer < pProperties->cbBuffer) { return E_FAIL; } ASSERT( Actual.cBuffers == 1 ); return NOERROR; } HRESULT CTSOutPin::Active(void) { if (m_fp) { CAutoLock lck(&mSharedState); fseek(m_fp, 0, SEEK_SET); } return CSourceStream::Active(); } HRESULT CTSOutPin::CheckMediaType(const CMediaType * inMediatype) { CAutoLock lck(m_pFilter->pStateLock()); if (inMediatype->majortype == MEDIATYPE_Stream && inMediatype->subtype == MEDIASUBTYPE_MPEG2_TRANSPORT) { return NOERROR; } return E_FAIL; } HRESULT CTSOutPin::GetMediaType(int iPosition, CMediaType *pmt) { CAutoLock lck(m_pFilter->pStateLock()); if (iPosition != 0) { return E_FAIL; } *pmt = mPreferred; return NOERROR; } // Quality control STDMETHODIMP CTSOutPin::Notify(IBaseFilter * pSender, Quality q) { return NOERROR; } HRESULT CTSOutPin::OnThreadStartPlay(void) { mSampleCount = 0; return NOERROR; } BOOL CTSOutPin::SetFileSource(const char * inFile) { CAutoLock lck(&mSharedState); strcpy(mFilePath, inFile); if (m_fp) { fclose(m_fp); m_fp = NULL; } m_fp = fopen(mFilePath, "rb"); return (m_fp != NULL); } void CTSOutPin::GetFileSource(char * outFile) { strcpy(outFile, mFilePath); }