pximgfil.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 676 行 · 第 1/2 页
CPP
676 行
UINT32 ulSessionHandle = 0;
retVal = pCodec->ParseImage(pFileBuffer,
ulNumDataPackets,
pParam,
ulSessionHandle);
if (SUCCEEDED(retVal))
{
// Get width and height
pParam->GetPropertyULONG32("ImageWidth", m_ulImageWidth);
pParam->GetPropertyULONG32("ImageHeight", m_ulImageHeight);
// Get all the image data packets
for (UINT32 i = 0; i < ulNumDataPackets && SUCCEEDED(retVal); i++)
{
IHXBuffer* pData = NULL;
IHXBuffer* pOpaque = NULL;
BOOL bReq = FALSE;
retVal = pCodec->GetImagePacket(ulSessionHandle, i, pData, pOpaque, bReq);
if (SUCCEEDED(retVal))
{
IHXPacket* pImageDataPacket = NULL;
retVal = m_pWireFormatManager->SetImageDataInfo(ulHandle, pData, pOpaque,
i, 0, bReq, pImageDataPacket);
if (SUCCEEDED(retVal))
{
// Add image data packet to tail of the list
retVal = AddPacket(pImageDataPacket);
}
HX_RELEASE(pImageDataPacket);
}
HX_RELEASE(pData);
HX_RELEASE(pOpaque);
}
// Now we're done with this parse session
pCodec->ReleaseImage(ulSessionHandle);
}
HX_RELEASE(pParam);
}
}
HX_RELEASE(pImageHeaderPacket);
}
}
HX_RELEASE(pCodec);
}
return retVal;
}
HX_RESULT PXImageFile::EnqueueEffectPacket(UINT32 ulEffectType,
UINT32 ulStart,
UINT32 ulDuration,
UINT32 ulTarget,
const char* pszURL,
UINT32 ulFillColor,
BOOL bBackChannel,
BOOL bLastUse,
BOOL bDisplayImmediately)
{
HX_RESULT retVal = HXR_OK;
// Create an effect object
PXEffect* pEffect = NULL;
retVal = PXEffect::CreateObject(&pEffect);
if (SUCCEEDED(retVal))
{
// AddRef the effect
pEffect->AddRef();
// Set a bunch of parameters
pEffect->SetEffectType((BYTE) ulEffectType);
pEffect->SetStart(ulStart);
pEffect->SetDuration(ulDuration);
pEffect->SetTarget(ulTarget);
if (pszURL)
{
pEffect->SetURL(pszURL);
}
pEffect->SetColor(ulFillColor);
pEffect->SetPostBackChannel(bBackChannel);
pEffect->SetLastUse(bLastUse);
pEffect->SetDisplayImmediately(bDisplayImmediately);
// Get the packet
IHXPacket* pEffectPacket = NULL;
retVal = m_pWireFormatManager->SetEffectInfo(pEffect, 0, pEffectPacket);
if (SUCCEEDED(retVal))
{
// Add the effect packet to the tail
retVal = AddPacket(pEffectPacket);
}
HX_RELEASE(pEffectPacket);
}
HX_RELEASE(pEffect);
return retVal;
}
void PXImageFile::ComputeStatistics()
{
m_ulNumPackets = 0;
m_ulTotalBytes = 0;
if (m_pPacketList)
{
if (m_pPacketList->GetCount() > 0)
{
// Set the number of packets
m_ulNumPackets = m_pPacketList->GetCount();
// Compute the size with overhead
m_ulTotalBytes = 0;
LISTPOSITION pos = m_pPacketList->GetHeadPosition();
while (pos)
{
IHXPacket* pListPacket = (IHXPacket*) m_pPacketList->GetNext(pos);
if (pListPacket)
{
IHXBuffer *pListBuffer = pListPacket->GetBuffer();
if (pListBuffer)
{
m_ulTotalBytes += pListBuffer->GetSize();
}
HX_RELEASE(pListBuffer);
}
}
}
}
}
HX_RESULT PXImageFile::DequeuePacket(REF(IHXPacket*) rpPacket,
UINT32 ulBitrate,
REF(INT32) rlCurrentTimeStamp)
{
HX_RESULT retVal = HXR_FAIL;
if (ulBitrate && m_pPacketList)
{
if (m_pPacketList->GetCount() > 0)
{
IHXPacket* pPacket = (IHXPacket*) m_pPacketList->RemoveHead();
if (pPacket)
{
UINT32 ulTimeStamp = (UINT32) (rlCurrentTimeStamp >= 0 ? rlCurrentTimeStamp : 0);
UINT32 ulSize = 0;
IHXPacket* pNewPacket = NULL;
retVal = SetPacketTimeStamp(pPacket, ulTimeStamp,
ulSize, pNewPacket);
if (SUCCEEDED(retVal))
{
// Update the time stamp
rlCurrentTimeStamp += (INT32) (ulSize * 8000 / ulBitrate);
// Assign the out parameter
HX_RELEASE(rpPacket);
rpPacket = pNewPacket;
rpPacket->AddRef();
}
HX_RELEASE(pNewPacket);
}
HX_RELEASE(pPacket);
}
}
return retVal;
}
HX_RESULT PXImageFile::GetFirstPacket(REF(IHXPacket*) rpPacket)
{
HX_RESULT retVal = HXR_FAIL;
if (m_pPacketList)
{
LISTPOSITION pos = m_pPacketList->GetHeadPosition();
if (pos)
{
IHXPacket* pPacket = (IHXPacket*) m_pPacketList->GetNext(pos);
if (pPacket)
{
HX_RELEASE(rpPacket);
rpPacket = pPacket;
rpPacket->AddRef();
m_pListItr = pos;
retVal = HXR_OK;
}
}
}
return retVal;
}
HX_RESULT PXImageFile::GetNextPacket(REF(IHXPacket*) rpPacket)
{
HX_RESULT retVal = HXR_FAIL;
if (m_pPacketList && m_pListItr)
{
IHXPacket* pPacket = (IHXPacket*) m_pPacketList->GetNext(m_pListItr);
if (pPacket)
{
HX_RELEASE(rpPacket);
rpPacket = pPacket;
rpPacket->AddRef();
retVal = HXR_OK;
}
}
return retVal;
}
HX_RESULT PXImageFile::SetPacketTimeStamp(IHXPacket* pPacket,
UINT32 ulTimeStamp,
REF(UINT32) rulPacketSize,
REF(IHXPacket*) rpPacket)
{
return FactorySetTimeStamp(pPacket, m_pCommonClassFactory, ulTimeStamp,
rulPacketSize, rpPacket);
}
HX_RESULT PXImageFile::FactorySetTimeStamp(IHXPacket* pPacket,
IHXCommonClassFactory* pFactory,
UINT32 ulTimeStamp,
REF(UINT32) rulPacketSize,
REF(IHXPacket*) rpPacket)
{
HX_RESULT retVal = HXR_OK;
if (pPacket && pFactory)
{
// Get the packet parameters
IHXBuffer* pBuffer = NULL;
UINT32 ulTime = 0;
UINT16 usStreamNumber = 0;
UINT8 ucASMFlags = 0;
UINT16 usASMRuleNumber = 0;
retVal = pPacket->Get(pBuffer,
ulTime,
usStreamNumber,
ucASMFlags,
usASMRuleNumber);
if (SUCCEEDED(retVal))
{
// Create a new packet
IHXPacket* pNewPacket = NULL;
retVal = pFactory->CreateInstance(CLSID_IHXPacket,
(void**) &pNewPacket);
if (SUCCEEDED(retVal))
{
// Set these values with the new timestamp into the new packet
retVal = pNewPacket->Set(pBuffer,
ulTimeStamp,
usStreamNumber,
ucASMFlags,
usASMRuleNumber);
if (SUCCEEDED(retVal))
{
// Assign the out parameters
rulPacketSize = pBuffer->GetSize();
HX_RELEASE(rpPacket);
rpPacket = pNewPacket;
rpPacket->AddRef();
}
}
HX_RELEASE(pNewPacket);
}
HX_RELEASE(pBuffer);
}
else
{
retVal = HXR_INVALID_PARAMETER;
}
return retVal;
}
HX_RESULT PXImageFile::AddPacket(IHXPacket* pPacket, BOOL bTail)
{
HX_RESULT retVal = HXR_OK;
if (pPacket)
{
// Create list if it doesn't exist
if (!m_pPacketList)
{
m_pPacketList = new CHXSimpleList();
if (!m_pPacketList)
{
retVal = HXR_OUTOFMEMORY;
}
}
// AddRef the packet
pPacket->AddRef();
if (bTail)
{
// Add the packet at the tail
m_pPacketList->AddTail((void*) pPacket);
}
else
{
// Add the packet at the head
m_pPacketList->AddHead((void*) pPacket);
}
}
else
{
retVal = HXR_FAIL;
}
return retVal;
}
UINT32 PXImageFile::GetNumPacketsLeft() const
{
return (m_pPacketList ? m_pPacketList->GetCount() : 0);
}
UINT32 PXImageFile::GetTotalSendTime(UINT32 ulBitrate) const
{
UINT32 ulTime = 0;
if (ulBitrate)
{
ulTime = (m_ulTotalBytes * 8000 + (ulBitrate >> 1)) / ulBitrate;
}
return ulTime;
}
UINT32 PXImageFile::GetPacketSendTime(IHXPacket* pPacket, UINT32 ulBitrate)
{
UINT32 ulTime = 0;
if (pPacket && ulBitrate)
{
IHXBuffer* pBuffer = pPacket->GetBuffer();
if (pBuffer)
{
ulTime = (pBuffer->GetSize() * 8000 + (ulBitrate >> 1)) / ulBitrate;
}
HX_RELEASE(pBuffer);
}
return ulTime;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?