📄 ctsoutpin.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 + -