📄 pximgfil.cpp
字号:
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -