AVObjects Library: Samples
From AVObjects Knowledge Base
(Difference between revisions)
| Line 4: | Line 4: | ||
TODO: Samples | TODO: Samples | ||
| + | <pre> | ||
HRESULT CMuxedPCM::ReadFrame(ULONGLONG ullFrame, BYTE* pbFrame, DWORD cbFrame, DWORD* pcbActual, | HRESULT CMuxedPCM::ReadFrame(ULONGLONG ullFrame, BYTE* pbFrame, DWORD cbFrame, DWORD* pcbActual, | ||
LONG* plTempOffset/* = NULL*/, bool bReverse/* = false*/,DWORD nSkip /*= 0*/, bool bDirectRead/* = false*/) | LONG* plTempOffset/* = NULL*/, bool bReverse/* = false*/,DWORD nSkip /*= 0*/, bool bDirectRead/* = false*/) | ||
| Line 74: | Line 75: | ||
return S_OK; | return S_OK; | ||
}; | }; | ||
| − | + | </pre> | |
[[Category:AVObjects Library]] | [[Category:AVObjects Library]] | ||
Revision as of 15:24, 30 June 2014
This page is a copy of the original page on the AVObjects' web site and can also be viewed here.
TODO: Samples
HRESULT CMuxedPCM::ReadFrame(ULONGLONG ullFrame, BYTE* pbFrame, DWORD cbFrame, DWORD* pcbActual,
LONG* plTempOffset/* = NULL*/, bool bReverse/* = false*/,DWORD nSkip /*= 0*/, bool bDirectRead/* = false*/)
{
ATLASSERT(pbFrame != NULL);
if(pbFrame == NULL) return E_INVALIDARG;
ATLASSERT(pcbActual != NULL);
if(pcbActual == NULL) return E_INVALIDARG;
DWORD cbFrameSize = GetFrameSize();
ATLASSERT(cbFrame >= cbFrameSize);
if(cbFrame < cbFrameSize) return E_INVALIDARG;
DWORD dwSourceCount = m_source.GetSize();
ATLASSERT(dwSourceCount > 0);
if (dwSourceCount == 1)
return m_source[0]->ReadFrame(ullFrame, pbFrame, cbFrame, pcbActual, plTempOffset, bReverse, nSkip, bDirectRead);
CMType mt;
HRESULT hr = FillMT(mt);
if (hr != S_OK)
return hr;
ATLASSERT(mt.IsAudio());
const WAVEFORMATEX* pwf = mt;
DWORD cbBuf = cbFrame / dwSourceCount;
CMAlloc mem;
if (!mem.Alloc(cbBuf))
return hr;
BYTE* pbBuf = mem.Memory();
ATLASSERT(pbBuf);
DWORD nBlockAlign = pwf->nBlockAlign / dwSourceCount;
*pcbActual = 0;
// ATLTRACE2(atlTraceGeneral, 2, _T("%s::ReadFrame(): ")
// _T("MuxedReadStart: ullFrame = %I64u(0x%I64x), cbFrame = %d(0x%x)\n"), GetClassName(), ullFrame, ullFrame,
// cbFrame, cbFrame);
memset(pbFrame, 0, cbFrame);
for(DWORD n = 0; n < dwSourceCount; n++)
{
DWORD cbActual = 0;
hr = m_source[n]->ReadFrame(ullFrame, pbBuf, cbBuf, &cbActual, NULL, bReverse, nSkip, bDirectRead);
if (hr != S_OK)
return hr;
if (cbActual > *pcbActual)
*pcbActual = cbActual;
BYTE* pbIn = pbBuf;
BYTE* pbOut = pbFrame + nBlockAlign * n;
BYTE* pbEnd = pbBuf + cbActual;
for(; pbIn < pbEnd; pbIn += nBlockAlign, pbOut += pwf->nBlockAlign)
{
//DWORD cbLen = (pbIn + nBlockAlign >= pbEnd)? pbEnd - pbIn : nBlockAlign;
memcpy(pbOut, pbIn, nBlockAlign);
}
}
*pcbActual *= dwSourceCount;
// ATLTRACE2(atlTraceGeneral, 2, _T("%s::ReadFrame(): ")
// _T("MuxedReadAStop Actual: %d(0x%x)\n"), GetClassName(), *pcbActual, *pcbActual);
// Debug_Dump(atlTraceGeneral, 2, *pcbActual, pbFrame);
return S_OK;
};