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