📄 pxschedu.cpp
字号:
{ retVal = HXR_FAIL; } } HX_RELEASE(pEffect); } else { retVal = HXR_UNEXPECTED; } return retVal;}HX_RESULT PXScheduler::GetImageDataInfo(REF(UINT32) rulHandle, REF(IHXBuffer*) rpStreamMimeStr, REF(UINT32) rulSessionHandle, REF(UINT32) rulPacketIndex, REF(UINT32) rulNumPackets, REF(UINT32) rulTimeStamp){ HX_RESULT retVal = HXR_OK; if (m_pEffectItr && m_pRealPixFile) { PXEffect* pEffect = NULL; retVal = m_pRealPixFile->GetCurrentEffect(m_pEffectItr, pEffect); if (SUCCEEDED(retVal)) { if (pEffect->HasTarget() && pEffect->GetFirstUse()) { IHXBuffer* pStreamMimeStr = NULL; retVal = m_pRealPixFile->GetImageStreamMimeType(pEffect->GetTarget(), pStreamMimeStr); if (SUCCEEDED(retVal)) { rulHandle = pEffect->GetTarget(), HX_RELEASE(rpStreamMimeStr); rpStreamMimeStr = pStreamMimeStr; rpStreamMimeStr->AddRef(); rulSessionHandle = m_ulSessionHandle; rulPacketIndex = m_ulPacketIndex; rulNumPackets = m_ulNumPackets; rulTimeStamp = (UINT32) (m_lCurrentTimeStamp >= 0 ? m_lCurrentTimeStamp : 0); } HX_RELEASE(pStreamMimeStr); } else { retVal = HXR_FAIL; } } HX_RELEASE(pEffect); } else { retVal = HXR_UNEXPECTED; } return retVal;}HX_RESULT PXScheduler::PacketSent(UINT32 ulPacketSize){ HX_RESULT retVal = HXR_OK; if (m_pEffectItr && m_pRealPixFile) { if (!m_bSeeking) { if (m_ulPacketTypeState == PXWireFormatManager::kPacketTypeImageHeader) {#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = FALSE, image header -> image data\n");#endif // Move to the kPacketTypeImageData state m_ulPacketTypeState = PXWireFormatManager::kPacketTypeImageData; // Increment time stamp by size of data sent m_lCurrentTimeStamp += (INT32) GetSendTime(ulPacketSize, m_pRealPixFile->GetBitrate()); } else if (m_ulPacketTypeState == PXWireFormatManager::kPacketTypeImageData) { if (m_ulPacketIndex < m_ulNumPackets - 1) { // We are not through sending all the packets of this image, so // we continue to send this image and simply update the packet index. m_ulPacketIndex++;#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = FALSE, image data -> image data\n");#endif } else { // We just got through sending the last packet of this image (i.e. - packet N-1 // of packets numbered 0,1,...,N-1). Therefore, we transition to the // kPacketTypeEffect state. m_ulPacketTypeState = PXWireFormatManager::kPacketTypeEffect;#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = FALSE, image data -> effect\n");#endif } // We update the timestamp based on the size of the data sent. m_lCurrentTimeStamp += (INT32) GetSendTime(ulPacketSize, m_pRealPixFile->GetBitrate()); } else if (m_ulPacketTypeState == PXWireFormatManager::kPacketTypeEffect) { // We just got through sending an effect packet, so we increment // the effect iterator and look at the next effect. PXEffect* pEffect = NULL; retVal = m_pRealPixFile->GetAtNextEffect(m_pEffectItr, pEffect); if (SUCCEEDED(retVal)) { if (pEffect->HasTarget() && pEffect->GetFirstUse()) { // The next effect has a first-use image associated with it. Therefore, // we need to transition to a kPacketTypeImageHeader state. m_ulPacketTypeState = PXWireFormatManager::kPacketTypeImageHeader;#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = FALSE, effect -> image header\n");#endif }#ifdef XXXMEH_OUTPUT_DEBUG_STRING else { OutputDebugString("m_bSeeking = FALSE, effect -> effect\n"); }#endif // We set the time stamp to the StartSendTime() for this effect. m_lCurrentTimeStamp = pEffect->GetStartSendTime(); } HX_RELEASE(pEffect); } } else { if (m_ulPacketTypeState == PXWireFormatManager::kPacketTypeImageHeader) {#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = TRUE, image header -> image data\n");#endif // Move to the kPacketTypeImageData state m_ulPacketTypeState = PXWireFormatManager::kPacketTypeImageData; // Increment time stamp by size of data sent m_lCurrentTimeStamp += (INT32) GetSendTime(ulPacketSize, m_pRealPixFile->GetBitrate()); } else if (m_ulPacketTypeState == PXWireFormatManager::kPacketTypeImageData) { if (m_ulPacketIndex < m_ulNumPackets - 1) { // We are not through sending all the packets of this image, so // we continue to send this image and simply update the packet index. m_ulPacketIndex++;#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = TRUE, image data -> image data\n");#endif } else { // We just got through sending the last packet of this image (i.e. - packet N-1 // of packets numbered 0,1,...,N-1). We need to find the next effect // that either: a) uses a cached image for the first time; or b) // has a start time which is >= m_ulKeyScreenTime. PXEffect* pEffect = NULL; HX_RESULT rv = m_pRealPixFile->GetAtNextEffect(m_pEffectItr, pEffect); while (SUCCEEDED(rv)) {#ifdef XXXMEH_OUTPUT_DEBUG_STRING char szDbgStr[128]; /* Flawfinder: ignore */ sprintf(szDbgStr, "m_bSeeking = TRUE, looking at effect with start=%lu (key=%lu)\n", /* Flawfinder: ignore */ pEffect->GetStart(), m_ulKeyScreenTime); OutputDebugString(szDbgStr);#endif if (pEffect->GetStart() >= m_ulKeyScreenTime) { m_bSeeking = FALSE; if (pEffect->HasTarget() && pEffect->GetFirstUse()) {#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = TRUE, switching off m_bSeeking, image data -> image header\n");#endif m_ulPacketTypeState = PXWireFormatManager::kPacketTypeImageHeader; } else {#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = TRUE, switching off m_bSeeking, image data -> effect\n");#endif m_ulPacketTypeState = PXWireFormatManager::kPacketTypeEffect; } m_lCurrentTimeStamp = pEffect->GetStartSendTime(); break; } else { if (pEffect->HasTarget() && pEffect->GetFirstUse() && IsImageCachedAtTime(pEffect->GetTarget(), m_ulKeyScreenTime)) { m_ulPacketTypeState = PXWireFormatManager::kPacketTypeImageHeader; m_lCurrentTimeStamp = pEffect->GetStartSendTime();#ifdef XXXMEH_OUTPUT_DEBUG_STRING OutputDebugString("m_bSeeking = TRUE, image data -> image header\n");#endif break; } } HX_RELEASE(pEffect); rv = m_pRealPixFile->GetAtNextEffect(m_pEffectItr, pEffect); } HX_RELEASE(pEffect); } } } } else { retVal = HXR_UNEXPECTED; } return retVal;}HX_RESULT PXScheduler::SeekSetup(UINT32 ulSeekTime){#ifdef XXXMEH_OUTPUT_DEBUG_STRING char szDbgStr[128]; /* Flawfinder: ignore */ sprintf(szDbgStr, "SeekSetup(%lu)\n", ulSeekTime); /* Flawfinder: ignore */ OutputDebugString(szDbgStr);#endif HX_RESULT retVal = HXR_OK; if (m_pRealPixFile) { // Calculate time of latest full-screen draw effect which is // not later than ulSeekToTime. To do this, we run backwards // through the effects, and start looking for the first full-screen // write before ulSeekToTime. m_ulKeyScreenTime = 0; void* pItr = NULL; retVal = m_pRealPixFile->GetEffectTailIterator(pItr); if (SUCCEEDED(retVal)) { PXEffect* pEffect = NULL; HX_RESULT rv = m_pRealPixFile->GetPrevEffect(pItr, pEffect); while (SUCCEEDED(rv)) { if (pEffect->GetStart() <= ulSeekTime && (!pEffect->GetDstWidth() || (pEffect->GetDstWidth() == m_pRealPixFile->GetDisplayWidth())) && (!pEffect->GetDstHeight() || (pEffect->GetDstHeight() == m_pRealPixFile->GetDisplayHeight())) && pEffect->GetEffectType() != PXEffect::kEffectTypeViewChange && (pEffect->GetEffectType() != PXEffect::kEffectTypeFadeOut || (pEffect->GetEffectType() == PXEffect::kEffectTypeFadeOut && pEffect->GetEnd() < ulSeekTime))) { m_ulKeyScreenTime = pEffect->GetStart(); break; } HX_RELEASE(pEffect); rv = m_pRealPixFile->GetPrevEffect(pItr, pEffect); } HX_RELEASE(pEffect);#ifdef XXXMEH_OUTPUT_DEBUG_STRING char szDbgStr[128]; /* Flawfinder: ignore */ sprintf(szDbgStr, " m_ulKeyScreenTime=%lu\n", m_ulKeyScreenTime); /* Flawfinder: ignore */ OutputDebugString(szDbgStr);#endif // Rewind the packet type state and effect iterator retVal = Rewind(); if (SUCCEEDED(retVal)) { m_bSeeking = TRUE; HX_RELEASE(pEffect); rv = m_pRealPixFile->GetCurrentEffect(m_pEffectItr, pEffect); while (SUCCEEDED(rv)) { if (pEffect->GetStart() >= m_ulKeyScreenTime) { m_bSeeking = FALSE; if (pEffect->HasTarget() && pEffect->GetFirstUse()) { m_ulPacketTypeState = PXWireFormatManager::kPacketTypeImageHeader; } else { m_ulPacketTypeState = PXWireFormatManager::kPacketTypeEffect; } m_lCurrentTimeStamp = pEffect->GetStartSendTime(); break; } else { if (pEffect->HasTarget() && IsImageCachedAtTime(pEffect->GetTarget(), m_ulKeyScreenTime)) { m_ulPacketTypeState = PXWireFormatManager::kPacketTypeImageHeader; m_lCurrentTimeStamp = pEffect->GetStartSendTime(); break; } } HX_RELEASE(pEffect); rv = m_pRealPixFile->GetAtNextEffect(m_pEffectItr, pEffect); } HX_RELEASE(pEffect); } } } else { retVal = HXR_UNEXPECTED; } return retVal;}HX_RESULT PXScheduler::Rewind(){ HX_RESULT retVal = HXR_FAIL; if (m_pRealPixFile) { // Initialize the effect iterator retVal = m_pRealPixFile->GetEffectHeadIterator(m_pEffectItr); if (SUCCEEDED(retVal)) { // Initialize the packet type state PXEffect* pCurEffect = NULL; retVal = m_pRealPixFile->GetCurrentEffect(m_pEffectItr, pCurEffect); if (SUCCEEDED(retVal)) { if (pCurEffect->HasTarget() && pCurEffect->GetFirstUse()) { m_ulPacketTypeState = PXWireFormatManager::kPacketTypeImageHeader; } else { m_ulPacketTypeState = PXWireFormatManager::kPacketTypeEffect; } // Set the time stamp m_lCurrentTimeStamp = pCurEffect->GetStartSendTime(); } HX_RELEASE(pCurEffect); } } return retVal;}BOOL PXScheduler::IsImageCachedAtTime(UINT32 ulHandle, UINT32 ulTime){ BOOL bRet = FALSE; void* pItr = NULL; HX_RESULT retVal = m_pRealPixFile->GetEffectHeadIterator(pItr); if (SUCCEEDED(retVal)) { BOOL bSawFirstUse = FALSE; BOOL bSawLastUse = FALSE; PXEffect* pEffect = NULL; retVal = m_pRealPixFile->GetNextEffect(pItr, pEffect); while (SUCCEEDED(retVal)) { if (pEffect->GetStart() >= ulTime) { break; } if (pEffect->HasTarget() && pEffect->GetTarget() == ulHandle) { if (pEffect->GetFirstUse()) { bSawFirstUse = TRUE; } if (pEffect->GetLastUse()) { bSawLastUse = TRUE; } } HX_RELEASE(pEffect); retVal = m_pRealPixFile->GetNextEffect(pItr, pEffect); } HX_RELEASE(pEffect); if (bSawFirstUse && !bSawLastUse) { bRet = TRUE; } } return bRet;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -