⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pxschedu.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            {                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 + -