h263vidfmt.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 761 行 · 第 1/2 页
CPP
761 行
if (pNewBuffer)
{
pFramePacket = new CMediaPacket(
pNewBuffer,
pData,
ulNewBufferSize,
ulDataSize,
pPacket->GetTime(),
ulFlags,
pFrameDims);
}
if (pFramePacket)
{
pFramePacket->SetSampleDescKiller(KillH263ampleDesc);
}
else
{
m_LastError = HXR_OUTOFMEMORY;
}
}
pBuffer->Release();
}
if( m_LastError != HXR_OUTOFMEMORY )
{
m_pH263VideoRenderer->BltIfNeeded();
}
pPacket->Release();
}
else
{
if (pCodecData->IsLost())
{
#if defined(HELIX_FEATURE_STATS)
m_pH263VideoRenderer->ReportLostFrame();
#endif /* #if defined(HELIX_FEATURE_STATS) */
}
}
return pFramePacket;
}
/****************************************************************************
* Method:
* CQTVideoFormat::Reset
*
*/
void CH263VideoFormat::Reset()
{
_Reset();
CVideoFormat::Reset();
}
void CH263VideoFormat::_Reset(void)
{
HX_DELETE(m_pAssmDims);
if (m_pRssm)
{
m_pRssm->Reset();
}
m_DecoderDims.cx = 0;
m_DecoderDims.cy = 0;
m_ulDecoderBufSize = 0;
}
/****************************************************************************
* Method:
* CQTVideoFormat::CreateDecodedPacket
*
*/
CMediaPacket* CH263VideoFormat::CreateDecodedPacket(CMediaPacket* pFrameToDecode)
{
HXxSize currentFrameDims;
CMediaPacket* pDecodedFrame = NULL;
UINT8* pData = NULL;
HX_ASSERT(pFrameToDecode);
// Compute Decode Buffer Storage if info. available
if (pFrameToDecode->m_pSampleDesc)
{
if (memcmp(pFrameToDecode->m_pSampleDesc,
&m_DecoderDims,
sizeof(HXxSize)) != 0)
{
m_DecoderDims = *((HXxSize*) pFrameToDecode->m_pSampleDesc);
m_ulDecoderBufSize = m_DecoderDims.cx *
m_DecoderDims.cy *
H263_PIXEL_SIZE /
8;
m_LastFrameDims = m_DecoderDims;
if (m_pDecoder->InitDecoder(&m_DecoderDims) != HXR_OK)
{
m_DecoderDims.cx = 0;
m_DecoderDims.cy = 0;
m_ulDecoderBufSize = 0;
}
}
}
// Get the storage for the Decode Buffer
if (m_ulDecoderBufSize > 0)
{
CMediaPacket* pVideoPacket = NULL;
pVideoPacket = (CMediaPacket*) m_pFramePool->Get(m_ulDecoderBufSize);
if (pVideoPacket)
{
pData = pVideoPacket->m_pData;
HX_ASSERT(pData);
pVideoPacket->Init(pData,
m_ulDecoderBufSize,
pFrameToDecode->m_ulTime,
0,
pFrameToDecode->m_pSampleDesc);
pFrameToDecode->m_pSampleDesc = NULL;
pDecodedFrame = pVideoPacket;
}
else
{
pData = new UINT8 [m_ulDecoderBufSize];
}
}
if (pData && m_pH263VideoRenderer->IsActive())
{
LONG32 lTimeAhead;
lTimeAhead = m_pH263VideoRenderer->ComputeTimeAhead(
pFrameToDecode->m_ulTime,
0);
if (lTimeAhead < NON_KEYFRM_DCDE_FALLBEHIND_THRSHLD)
{
// Throw away this frame
if (pDecodedFrame)
{
m_pFramePool->Put(pDecodedFrame);
pDecodedFrame = NULL;
pData = NULL;
}
else
{
delete [] pData;
pData = NULL;
}
#if defined(HELIX_FEATURE_STATS)
m_pH263VideoRenderer->ReportDroppedFrame();
#endif /* #if defined(HELIX_FEATURE_STATS) */
}
}
// Decode
if (pData)
{
m_pH263VideoRenderer->BltIfNeeded();
if (m_pDecoder->DecodeFrame(pFrameToDecode,
pData,
¤tFrameDims) != HXR_OK)
{
// Throw away this frame
if (pDecodedFrame)
{
m_pFramePool->Put(pDecodedFrame);
pDecodedFrame = NULL;
pData = NULL;
}
else
{
delete [] pData;
pData = NULL;
}
#if defined(HELIX_FEATURE_STATS)
m_pH263VideoRenderer->ReportDroppedFrame();
#endif /* #if defined(HELIX_FEATURE_STATS) */
}
}
m_pH263VideoRenderer->BltIfNeeded();
// If the frame is not formed yet, form it
if (!pDecodedFrame)
{
if (pData)
{
// Data exists to form the docoded packet with
pFrameToDecode->SetBuffer(pData,
pData,
m_ulDecoderBufSize,
m_ulDecoderBufSize);
pDecodedFrame = pFrameToDecode;
pFrameToDecode = NULL;
// If there is a change in frame size, forward the change
if (m_LastFrameDims != currentFrameDims)
{
HXxSize* pNewFrameDims = new HXxSize;
HX_ASSERT(currentFrameDims.cx <= m_DecoderDims.cx);
HX_ASSERT(currentFrameDims.cy <= m_DecoderDims.cy);
if (pNewFrameDims)
{
*pNewFrameDims = currentFrameDims;
pDecodedFrame->SetSampleDesc(pNewFrameDims);
m_LastFrameDims = currentFrameDims;
}
}
}
else if (pFrameToDecode->m_pSampleDesc)
{
// No data exists to form the frame with, but description
// exists and must be passed down the pipe - form empty
// frame packet
pDecodedFrame = pFrameToDecode;
pDecodedFrame->m_pData = NULL;
pDecodedFrame->m_ulDataSize = 0;
pFrameToDecode = NULL;
}
}
if (pFrameToDecode != NULL)
{
pFrameToDecode->Clear();
delete pFrameToDecode;
}
return pDecodedFrame;
}
/****************************************************************************
* Method:
* CH263VideoFormat::CSecureH263VideoFormat
*
*/
CH263Decoder* CH263VideoFormat::CreateDecoder()
{
return new CH263Decoder(m_pH263VideoRenderer->GetContext());
}
/****************************************************************************
* Method:
* CH263VideoFormat::ConfigFrom3GPPHeader
*
*/
HX_RESULT CH263VideoFormat::ConfigFrom3GPPHeader(IHXBuffer* pConfigData)
{
UINT8* pData;
ULONG32 ulSize;
HX_RESULT retVal = HXR_FAIL;
HX_DELETE(m_pMaxDims);
if (pConfigData)
{
pData = pConfigData->GetBuffer();
ulSize = pConfigData->GetSize();
m_pMaxDims = new HXxSize;
retVal = HXR_OUTOFMEMORY;
}
if (m_pMaxDims)
{
retVal = HXR_OK;
// We'll assume unknown size
m_pMaxDims->cx = 0;
m_pMaxDims->cy = 0;
if (ulSize >= sizeof(DecoderSpecificInfoV20))
{
// Try 3GPP-v2.0 DecoderSpecificInfo
if (getlong(((DecoderSpecificInfoV20*) pData)->pType)
== CCCC_ENCODE('d', '2', '6', '3'))
{
// Looks good as 3GPP-v2.0 DecoderSpecificInfo
;
}
else if ((ulSize >= sizeof(DecoderSpecificInfoV10))&&
(((DecoderSpecificInfoV10*) pData)->pTag[0] == 0x05))
{
// Looks good as 3GPP-v1.0 DecoderSpecificInfo
m_pMaxDims->cx = getshort(
((DecoderSpecificInfoV10*) pData)->pMaxWidth);
m_pMaxDims->cy = getshort(
((DecoderSpecificInfoV10*) pData)->pMaxHeight);
}
}
}
return retVal;
}
/****************************************************************************
* Method:
* CH263VideoFormat::IsBitmapFormatChanged
*
*/
BOOL CH263VideoFormat::IsBitmapFormatChanged(
HXBitmapInfoHeader &BitmapInfoHeader,
CMediaPacket* pVideoPacket)
{
if (pVideoPacket->m_pSampleDesc != NULL)
{
HXxSize* pDims = (HXxSize*) pVideoPacket->m_pSampleDesc;
if ((BitmapInfoHeader.biWidth != pDims->cx) ||
(BitmapInfoHeader.biHeight != pDims->cy))
{
return TRUE;
}
}
return FALSE;
}
/****************************************************************************
* Method:
* CH263VideoFormat::InitBitmapInfoHeader
*
*/
HX_RESULT CH263VideoFormat::InitBitmapInfoHeader(
HXBitmapInfoHeader &bitmapInfoHeader,
CMediaPacket* pVideoPacket)
{
HXxSize* pDims = (HXxSize*) pVideoPacket->m_pSampleDesc;
if (pDims)
{
bitmapInfoHeader.biWidth = pDims->cx;
bitmapInfoHeader.biHeight = pDims->cy;
bitmapInfoHeader.biSizeImage = bitmapInfoHeader.biWidth *
bitmapInfoHeader.biHeight *
bitmapInfoHeader.biBitCount /
8;
}
return HXR_OK;
}
/****************************************************************************
* Method:
* CH263VideoFormat::KillH263ampleDesc
*
*/
void CH263VideoFormat::KillH263ampleDesc(void* pSampleDesc, void* pUserData)
{
if (pSampleDesc)
{
HXxSize* pFrameDims = (HXxSize*) pSampleDesc;
delete pFrameDims;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?