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

📄 pxcjpgrn.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                        BYTE* pBuf = pOpaquePacketData->GetBuffer();                        if (pBuf)                        {// XXXMEH - seq num is now beginning of opaque//                            // Advance to seq num//                            pBuf += 8;                            // Get seq num                            UINT32 ulSeqNum = 0;                            UnPack32(pBuf, ulSeqNum);                            // Check seq num                            if (ulSeqNum != pWrapper->GetLastSequenceNumber() + 1)                            {                                // We lost one or more packets in between                                //                                // Do we have restart markers in this image?                                if (pWrapper->GetRestartInterval() == 0)                                {                                    // This image has no restart markers. Therefore, we set the image to invalid                                    pWrapper->SetValid(FALSE);                                }                                else                                {                                    // Insert some fake data with proper restart markers                                    retVal = InsertDummyData(pWrapper, pBuffer, pOpaquePacketData);                                }                            }                            else                            {                                // Update the last sequence number                                pWrapper->SetLastSequenceNumber(ulSeqNum);                            }                        }                        else                        {                            retVal = HXR_FAIL;                        }                    }                    if (SUCCEEDED(retVal) && pWrapper->GetValid())                    {                        // Append this buffer to the wrapper's list                        pWrapper->AppendBuffer(pBuffer);                        // Now call decompress for the wrapper                        retVal = pWrapper->Decompress();                        if (SUCCEEDED(retVal))                        {                            // Set the last opaque buffer in the wrapper                            pWrapper->SetLastOpaqueBuffer(pOpaquePacketData);                        }                    }                }                else                {                    pWrapper->SetNeedPacket(TRUE);                }            }        }    }    return retVal;}STDMETHODIMP CRealPixJPEGRendererCodec::GetDecompressStatus(UINT32     ulSessionHandle,                                                            REF(INT32) rlStatus){    HX_RESULT retVal = HXR_FAIL;    if (m_pMapManager)    {        CIJGLibraryWrapper* pWrapper = NULL;        retVal                       = m_pMapManager->GetEntry(ulSessionHandle, (void**) &pWrapper);        if (SUCCEEDED(retVal))        {            if (!pWrapper->GetValid())            {                rlStatus = DECOMPRESS_STATUS_ABORTED;            }            else if (pWrapper->IsFinished())            {                rlStatus = DECOMPRESS_STATUS_FINISHED;            }            else            {                rlStatus = DECOMPRESS_STATUS_INPROGRESS;            }        }    }    return retVal;}STDMETHODIMP CRealPixJPEGRendererCodec::FinishDecompress(UINT32 ulSessionHandle){    HX_RESULT retVal = HXR_FAIL;    if (m_pMapManager)    {        CIJGLibraryWrapper* pWrapper = NULL;        retVal                       = m_pMapManager->DeleteEntry(ulSessionHandle, (void**) &pWrapper);        if (SUCCEEDED(retVal))        {            pWrapper->Terminate();        }        HX_RELEASE(pWrapper);    }    return retVal;}HX_RESULT STDAPICALLTYPE CRealPixJPEGRendererCodec::HXCreateInstance(IUnknown** ppIUnknown){    HX_RESULT retVal = HXR_OK;    if (ppIUnknown)    {        // Create renderer codec        CRealPixJPEGRendererCodec* pCodec = new CRealPixJPEGRendererCodec();        if (pCodec)        {            // QI for IUnknown            retVal = pCodec->QueryInterface(IID_IUnknown, (void**) ppIUnknown);        }        else        {            retVal = HXR_OUTOFMEMORY;        }        if (FAILED(retVal))        {            HX_DELETE(pCodec);        }    }    else    {        retVal = HXR_FAIL;    }    return retVal;}HX_RESULT CRealPixJPEGRendererCodec::ComputeStatistics(BYTE *pBuf,            UINT32 ulLen,                                                       UINT32 &rulNumPackets, UINT32 &rulMinSize,                                                       UINT32 &rulMaxSize,    UINT32 &rulAvgSize){    UINT32 ulNumPackets = 0;    UINT32 ulMinSize    = 0xFFFFFFFF;    UINT32 ulMaxSize    = 0;    UINT32 ulPacketSize;    // Parse the header    UINT32 ulRestartInterval = 0;    BOOL   bHeaderComplete   = FALSE;    BYTE  *pCurByte          = pBuf;    BYTE  *pBufLimit         = pBuf + ulLen;    while (bHeaderComplete == FALSE && pCurByte < pBufLimit)    {        // Look for a 0xFF, which would signify a marker        if (*pCurByte++ == 0xFF)        {            // Now take different actions depending on what kind of            // marker this is - some markers have data associated with            // them (such as DRI) and others don't (such as SOI and EOI)            BYTE ucMarker = *pCurByte++;            if (!(ucMarker == kMarkerSOI ||                  ucMarker == kMarkerEOI ||                  ucMarker == kMarkerTEM ||                  (ucMarker >= kMarkerRST0 && ucMarker <= kMarkerRST7)))            {                UINT32 ulSegLen = (pCurByte[0] << 8) | pCurByte[1];                if (ucMarker == kMarkerAPP0)                {                    // We look at this marker to verify this is a JFIF image file                    if (pCurByte[0] != 0x00 || pCurByte[1] != 0x10 ||                        pCurByte[2] != 'J'  || pCurByte[3] != 'F'  ||                        pCurByte[4] != 'I'  || pCurByte[5] != 'F'  ||                        pCurByte[6] != '\0')                    {                        return HXR_FAIL;                    }                }                else if (ucMarker == kMarkerSOF0)                {                    // We look at this marker to extract the width and height//                    m_ulImageHeight = (pCurByte[3] << 8) | pCurByte[4];//                    m_ulImageWidth  = (pCurByte[5] << 8) | pCurByte[6];                }                else if (ucMarker == kMarkerDRI)                {                    // We look at this marker to extract the restart interval                    ulRestartInterval = (pCurByte[2] << 8) | pCurByte[3];                }                else if (ucMarker == kMarkerSOS)                {                    // This marker is the last marker in the header                    bHeaderComplete = TRUE;                }                // Advance the pointer                pCurByte += ulSegLen;            }        }    }    // Did we get a valid header?    if (!bHeaderComplete)    {        return HXR_FAIL;    }    // Update statistics    ulPacketSize = pCurByte - pBuf;    if (ulPacketSize < ulMinSize)    {        ulMinSize = ulPacketSize;    }    if (ulPacketSize > ulMaxSize)    {        ulMaxSize = ulPacketSize;    }    ulNumPackets++;    // If the restart interval is zero, something's wrong    if (ulRestartInterval == 0)    {        return HXR_FAIL;    }    BOOL bImageComplete = FALSE;    while (pCurByte < pBufLimit && bImageComplete == FALSE)    {        BOOL   bPacketComplete = FALSE;        BYTE  *pCurStart       = pCurByte;        while (bPacketComplete == FALSE && pCurByte < pBufLimit)        {            if (*pCurByte++ == 0xFF)            {                BYTE ucMarker = *pCurByte++;                if (ucMarker >= kMarkerRST0 && ucMarker <= kMarkerRST7)                {                    bPacketComplete = TRUE;                }                else if (ucMarker == kMarkerEOI)                {                    bPacketComplete = TRUE;                    bImageComplete  = TRUE;                }            }        }        // Did we get a valid packet?        if (bPacketComplete == FALSE)        {            return HXR_FAIL;        }        // Update statistics        ulPacketSize = pCurByte - pCurStart;        if (ulPacketSize < ulMinSize)        {            ulMinSize = ulPacketSize;        }        if (ulPacketSize > ulMaxSize)        {            ulMaxSize = ulPacketSize;        }        ulNumPackets++;    }    // Did we finish the image OK?    if (bImageComplete == FALSE)    {        return HXR_FAIL;    }    // Assign statistics    rulNumPackets = ulNumPackets;    rulMinSize    = ulMinSize;    rulMaxSize    = ulMaxSize;    // Compute average    rulAvgSize = (ulLen + (ulNumPackets >> 1)) / ulNumPackets;    return HXR_OK;}void CRealPixJPEGRendererCodec::ReleaseAllWrappers(){    if (m_pMapManager)    {        UINT32              ulHandle = 0;        CIJGLibraryWrapper* pWrapper = NULL;        HX_RESULT           retVal   = m_pMapManager->GetFirstEntry(ulHandle, (void**) &pWrapper);        while (SUCCEEDED(retVal))        {            HX_RELEASE(pWrapper);            retVal = m_pMapManager->GetNextEntry(ulHandle, (void**) &pWrapper);        }        m_pMapManager->DeleteAllEntries();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -