⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctsoutpin.cpp

📁 最近在学习directshow, Directshow实务精选的源代码
💻 CPP
字号:
//
// CTSOutPin.cpp
// 

#include <streams.h>
#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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -