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

📄 pxcgifff.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            }        }    }    return bRet;}STDMETHODIMP CRealPixGIFFileFormatCodec::ParseImage(IHXBuffer*      pBuffer,                                                    REF(UINT32)      rulNumPackets,                                                    REF(IHXValues*) rpParam,                                                    REF(UINT32)      rulSessionHandle){    HX_RESULT retVal = HXR_FAIL;    if (pBuffer && m_pMapManager)    {        // Compute the maximum number of packets - since we will free up any unused memory        // later, we will compute the absolute upper bound for the number of packets - the        // number of GIF blocks in the image file. This is an upper bound since we don't        // subdivide the file except at GIF block boundaries.        UINT32 ulMaxNumPackets = CGIFCodec::GetMaxNumPackets(pBuffer->GetBuffer(), pBuffer->GetSize());        // Create a PXParseSession object        PXParseSession* pSession = new PXParseSession();        if (pSession)        {            // AddRef the object            pSession->AddRef();            // Init the size            retVal = pSession->InitSize(ulMaxNumPackets);            if (SUCCEEDED(retVal))            {                // Parse the image, putting buffers into the session object                HXxSize rImageDim;                retVal = ParseBuffer(pBuffer, pSession, rImageDim);                if (SUCCEEDED(retVal))                {                    // Now we can reduce our size to the number of packets we actually have                    retVal = pSession->SetSize(pSession->GetNumPackets());                    if (SUCCEEDED(retVal))                    {                        // Add the session to the map                        retVal = m_pMapManager->AddEntry((void*) pSession, rulSessionHandle);                        if (SUCCEEDED(retVal))                        {                            // AddRef the session now that it's in the map                            pSession->AddRef();                            // Create an IHXValues object                            IHXValues* pParam = NULL;                            retVal             = m_pCommonClassFactory->CreateInstance(CLSID_IHXValues,                                                                                       (void**) &pParam);                            if (SUCCEEDED(retVal))                            {                                // Set properties in the IHXValues                                pParam->SetPropertyULONG32("MaxPacketSize",    pSession->GetMaxPacketSize());                                pParam->SetPropertyULONG32("MinPacketSize",    pSession->GetMinPacketSize());                                pParam->SetPropertyULONG32("TotalBytes",       pSession->GetTotalBytes());                                pParam->SetPropertyULONG32("TotalReqBytes",    pSession->GetTotalRequiredBytes());                                pParam->SetPropertyULONG32("TotalNonReqBytes", pSession->GetTotalNonRequiredBytes());                                pParam->SetPropertyULONG32("ImageWidth",       (UINT32) rImageDim.cx);                                pParam->SetPropertyULONG32("ImageHeight",      (UINT32) rImageDim.cy);                                // Set the outgoing parameters                                rulNumPackets = pSession->GetNumPackets();                                HX_RELEASE(rpParam);                                rpParam = pParam;                                rpParam->AddRef();                            }                            HX_RELEASE(pParam);                        }                    }                }            }        }        else        {            retVal = HXR_OUTOFMEMORY;        }        HX_RELEASE(pSession);    }    else    {        retVal = HXR_INVALID_PARAMETER;    }    return retVal;}STDMETHODIMP CRealPixGIFFileFormatCodec::GetImagePacket(UINT32           ulSessionHandle,                                                        UINT32           ulPacketNum,                                                        REF(IHXBuffer*) rpPacketBuffer,                                                        REF(IHXBuffer*) rpOpaquePacketData,                                                        REF(BOOL)        rbRequired){    HX_RESULT retVal = HXR_FAIL;    if (m_pMapManager)    {        PXParseSession* pSession = NULL;        retVal                   = m_pMapManager->GetEntry(ulSessionHandle, (void**) &pSession);        if (SUCCEEDED(retVal))        {            retVal = pSession->GetPacket(ulPacketNum,                                         rpPacketBuffer,                                         rpOpaquePacketData,                                         rbRequired);        }    }    return retVal;}STDMETHODIMP CRealPixGIFFileFormatCodec::ReleaseImage(UINT32 ulSessionHandle){    HX_RESULT retVal = HXR_FAIL;        if (m_pMapManager)    {        PXParseSession* pSession = NULL;        retVal                   = m_pMapManager->DeleteEntry(ulSessionHandle, (void**) &pSession);        HX_RELEASE(pSession);    }    return retVal;}HX_RESULT STDAPICALLTYPE CRealPixGIFFileFormatCodec::HXCreateInstance(IUnknown** ppIUnknown){    HX_RESULT retVal = HXR_OK;    if (ppIUnknown)    {        // Create file format codec        CRealPixGIFFileFormatCodec* pCodec = new CRealPixGIFFileFormatCodec();        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;}STDMETHODIMP CRealPixGIFFileFormatCodec::ParseBuffer(IHXBuffer*     pBuffer,                                                     PXParseSession* pSession,                                                     REF(HXxSize)    rImageDim){    HX_RESULT retVal = HXR_OK;    if (pBuffer && pSession)    {        // Create a new CGIFCodec object        CGIFCodec* pCodec = NULL;        retVal            = CGIFCodec::CreateObject(&pCodec);        if (SUCCEEDED(retVal))        {            // AddRef the object            pCodec->AddRef();            // Initialize the codec for parsing            retVal = pCodec->InitParseWireFormat(pBuffer->GetBuffer(), pBuffer->GetSize());            if (SUCCEEDED(retVal))            {                UINT32 ulSeqNum = 0;                BOOL   bFirst   = TRUE;                while (SUCCEEDED(retVal) && !pCodec->ParseFinished())                {                    UINT32 ulSize = 0;                    retVal = pCodec->GetPacketBufferLength(ulSize);                    if (SUCCEEDED(retVal))                    {                        // Create an IHXBuffer                        IHXBuffer* pData = NULL;                        retVal            = m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer,                                                                                  (void**) &pData);                        if (SUCCEEDED(retVal))                        {                            // Set its size                            retVal = pData->SetSize(ulSize);                            if (SUCCEEDED(retVal))                            {                                BOOL bFirst = FALSE;                                retVal = pCodec->GetPacketBuffer(pData->GetBuffer(),                                                                 pData->GetSize(),                                                                 bFirst);                                if (SUCCEEDED(retVal))                                {                                    // Create an opaque data buffer                                    IHXBuffer* pOpaque = NULL;                                    retVal              = m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer,                                                                                                (void**) &pOpaque);                                    if (SUCCEEDED(retVal))                                    {                                        retVal = pOpaque->SetSize(8);                                        if (SUCCEEDED(retVal))                                        {                                            UINT32 ulFlags = (bFirst ? 1 : 0);                                            BYTE*  pBuf    = pOpaque->GetBuffer();                                            Pack32(pBuf, ulSeqNum);                                            Pack32(pBuf, ulFlags);                                            // Add the buffers to the session                                            retVal = pSession->AddPacket(pData, pOpaque, bFirst);                                            if (SUCCEEDED(retVal))                                            {                                                ulSeqNum++;                                            }                                        }                                    }                                    HX_RELEASE(pOpaque);                                }                            }                        }                        HX_RELEASE(pData);                    }                }            }        }        HX_RELEASE(pCodec);    }    else    {        retVal = HXR_INVALID_PARAMETER;    }    return retVal;}void CRealPixGIFFileFormatCodec::ReleaseAllSessions(){    if (m_pMapManager)    {        UINT32          ulHandle = 0;        PXParseSession* pSession = NULL;        HX_RESULT       retVal   = m_pMapManager->GetFirstEntry(ulHandle, (void**) &pSession);        while (SUCCEEDED(retVal))        {            HX_RELEASE(pSession);            retVal = m_pMapManager->GetNextEntry(ulHandle, (void**) &pSession);        }        m_pMapManager->DeleteAllEntries();    }}

⌨️ 快捷键说明

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