wirefmgr.cpp

来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,873 行 · 第 1/5 页

CPP
1,873
字号
                    {
                        // Set the opaque data property
                        pValues->SetPropertyBuffer("OpaqueData", pOpBuffer);
                        // Assign the out parameter
                        HX_RELEASE(rpStreamHeader);
                        rpStreamHeader = pValues;
                        rpStreamHeader->AddRef();
                    }
                }
            }
            HX_RELEASE(pOpBuffer);
        }
        HX_RELEASE(pValues);
    }

    return retVal;
}

HX_RESULT PXWireFormatManager::OnHeader(IHXValues* pHeader)
{
    HX_RESULT retVal = HXR_FAIL;

    if (pHeader)
    {
        pHeader->GetPropertyULONG32("Duration",          m_ulDuration);
        pHeader->GetPropertyULONG32("ContentVersion",    m_ulContentVersion);
        pHeader->GetPropertyULONG32("RendererFlags",     m_ulRendererFlags);
        pHeader->GetPropertyULONG32("BackgroundOpacity", m_ulBackgroundOpacity);

        IHXBuffer* pBuffer = NULL;
        retVal              = pHeader->GetPropertyBuffer("OpaqueData", pBuffer);
        if (SUCCEEDED(retVal))
        {
            if (m_ulStreamVersion <= m_ulHighestSupportedStreamVersion)
            {
                // Get the display width and display height
                BYTE *pBuf = pBuffer->GetBuffer();
                UnPack32(pBuf, m_ulDisplayWidth);
                UnPack32(pBuf, m_ulDisplayHeight);

                // Get default URL
                HX_RELEASE(m_pDefaultURLStr);
                retVal = UnPackStringBuffer(pBuf, &m_pDefaultURLStr);
                if (SUCCEEDED(retVal))
                {
                    // Unpack total mimes
                    UINT32 ulTotalMimes = 0;
                    UnPack32(pBuf, ulTotalMimes);

                    // Unpack codec mimes
                    UINT32 ulNumCodecs = 0;
                    UnPack32(pBuf, ulNumCodecs);
                    ReleaseAllCodecMimes();
                    if (ulNumCodecs > 0)
                    {
                        for (UINT32 i = 0; i < ulNumCodecs; i++)
                        {
                            IHXBuffer* pMime = NULL;
                            retVal            = UnPackStringBuffer(pBuf, &pMime);
                            if (SUCCEEDED(retVal))
                            {
                                retVal = AddCodecMime(pMime);
                            }
                            HX_RELEASE(pMime);

                            if (FAILED(retVal))
                            {
                                break;
                            }
                        }
                    }

                    if (SUCCEEDED(retVal))
                    {
                        // Unpack fxpackage mimes
                        UINT32 ulNumFXPackages = 0;
                        UnPack32(pBuf, ulNumFXPackages);
                        ReleaseAllFXPackageMimes();
                        if (ulNumFXPackages > 0)
                        {
                            for (UINT32 i = 0; i < ulNumFXPackages; i++)
                            {
                                IHXBuffer* pMime = NULL;
                                retVal            = UnPackStringBuffer(pBuf, &pMime);
                                if (SUCCEEDED(retVal))
                                {
                                    retVal = AddFXPackageMime(pMime);
                                }
                                HX_RELEASE(pMime);

                                if (FAILED(retVal))
                                {
                                    break;
                                }
                            }
                        }

                        if (SUCCEEDED(retVal))
                        {
                            // If the stream version is greater than or equal to 1.1.0.0,
                            // then get the background color
                            if (m_ulStreamVersion >= U2_STREAM_VERSION)
                            {
                                UnPack32(pBuf, m_ulBackgroundColor);
                            }
                        }
                    }
                }
            }
            else
            {
                retVal = HXR_FAIL;
            }
        }
        HX_RELEASE(pBuffer);
    }

    if (FAILED(retVal))
    {
        // We had an error, so reset the state
        m_ulDisplayWidth  = 0;
        m_ulDisplayHeight = 0;
        HX_RELEASE(m_pDefaultURLStr);
        ReleaseAllCodecMimes();
        ReleaseAllFXPackageMimes();
    }

    return retVal;
}

HX_RESULT PXWireFormatManager::GetPacketType(IHXPacket* pPacket, REF(UINT32) rulType)
{
    HX_RESULT retVal = HXR_OK;

    if (pPacket)
    {
        IHXBuffer* pBuffer = pPacket->GetBuffer();
        if (pBuffer)
        {
            BYTE* pBuf = pBuffer->GetBuffer();
            if (pBuf)
            {
                UnPack32(pBuf, rulType);
            }
            else
            {
                retVal = HXR_FAIL;
            }
        }
        else
        {
            retVal = HXR_FAIL;
        }
        HX_RELEASE(pBuffer);
    }
    else
    {
        retVal = HXR_INVALID_PARAMETER;
    }

    return retVal;
}

HX_RESULT PXWireFormatManager::GetImageHeaderInfo(IHXPacket* pPacket, REF(UINT32) rulHandle,
                                                  REF(UINT32) rulFileLength, REF(UINT32) rulFlags,
                                                  IHXBuffer** ppMimeStr, REF(UINT32) rulOpaqueSize)
{
    HX_RESULT retVal = HXR_OK;

    if (pPacket && ppMimeStr)
    {
        IHXBuffer* pBuffer = pPacket->GetBuffer();
        if (pBuffer)
        {
            BYTE* pBuf = pBuffer->GetBuffer();
            if (pBuf)
            {
                UINT32 ulType = 0xFFFFFFFF;
                UnPack32(pBuf, ulType);

                if (ulType == kPacketTypeImageHeader)
                {
                    UINT32      ulHandle = 0;
                    UINT32      ulLength = 0;
                    UINT32      ulFlags  = 0;
                    IHXBuffer* pMimeStr = NULL;

                    UnPack32(pBuf, ulHandle);
                    UnPack32(pBuf, ulLength);
                    UnPack32(pBuf, ulFlags);

                    retVal = UnPackStringBuffer(pBuf, &pMimeStr);
                    if (SUCCEEDED(retVal))
                    {
                        // Assign out parameters
                        rulHandle      = ulHandle;
                        rulFileLength  = ulLength;
                        rulFlags       = ulFlags;
                        *ppMimeStr     = pMimeStr;
                        (*ppMimeStr)->AddRef();
                        // XXXMEH - this SHOULD come from the image header data,
                        // instead of having it hard-coded in the renderer. Having it
                        // hard-coded introduces codec<->renderer dependencies where
                        // none should exist. However, the current wire format does
                        // not have this information.
                        rulOpaqueSize  = GetOpaqueSize((const char*) pMimeStr->GetBuffer());
                    }
                    HX_RELEASE(pMimeStr);
                }
                else
                {
                    retVal = HXR_FAIL;
                }
            }
            else
            {
                retVal = HXR_FAIL;
            }
        }
        else
        {
            retVal = HXR_FAIL;
        }
        HX_RELEASE(pBuffer);
    }
    else
    {
        retVal = HXR_INVALID_PARAMETER;
    }

    return retVal;
}

HX_RESULT PXWireFormatManager::SetImageHeaderInfo(UINT32 ulHandle, UINT32 ulFileLength, UINT32 ulFlags,
                                                  const char* pszMime, UINT32 ulTimeStamp, REF(IHXPacket*) rpPacket)
{
    HX_RESULT retVal = HXR_FAIL;

    if (pszMime)
    {
        IHXBuffer* pMimeStr = NULL;
        retVal               = SetString(pszMime, pMimeStr);
        if (SUCCEEDED(retVal))
        {
            retVal = SetImageHeaderInfo(ulHandle, ulFileLength, ulFlags, pMimeStr, ulTimeStamp, rpPacket);
        }
        HX_RELEASE(pMimeStr);
    }

    return retVal;
}

HX_RESULT PXWireFormatManager::SetImageHeaderInfo(UINT32 ulHandle, UINT32 ulFileLength, UINT32 ulFlags,
                                                  IHXBuffer* pMimeStr, UINT32 ulTimeStamp, REF(IHXPacket*) rpPacket)
{
    HX_RESULT retVal = HXR_FAIL;

    if (ulHandle && ulFileLength && pMimeStr)
    {
        // Create an IHXBuffer
        IHXBuffer* pBuffer = NULL;
        retVal              = m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer,
                                                                    (void**) &pBuffer);
        if (SUCCEEDED(retVal))
        {
            // Compute the size
            UINT32 ulSize = 0;
            ulSize       += 16; // packet type, handle, length, flags
            ulSize       += 2;  // mime type string length
            UINT32 ulLen  = strlen((const char*) pMimeStr->GetBuffer());
            if (ulLen)
            {
                ulSize += ulLen + 1;
            }

            // Set the size of the buffer
            retVal = pBuffer->SetSize(ulSize);
            if (SUCCEEDED(retVal))
            {
                // Pack the buffer
                BYTE* pBuf = pBuffer->GetBuffer();
                Pack32(pBuf,           kPacketTypeImageHeader);
                Pack32(pBuf,           ulHandle);
                Pack32(pBuf,           ulFileLength);
                Pack32(pBuf,           ulFlags);
                PackStringBuffer(pBuf, pMimeStr);

                // Create an IHXPacket
                IHXPacket* pPacket = NULL;
                retVal              = m_pCommonClassFactory->CreateInstance(CLSID_IHXPacket,
                                                                            (void**) &pPacket);
                if (SUCCEEDED(retVal))
                {
                    retVal = pPacket->Set(pBuffer,           // opaque data
                                          ulTimeStamp,       // time stamp
                                          0,                 // stream 0
                                          HX_ASM_SWITCH_ON, // ASM flag
                                          1);                // ASM rule 1
                    if (SUCCEEDED(retVal))
                    {
                        // Assign to out parameter
                        HX_RELEASE(rpPacket);
                        rpPacket = pPacket;
                        rpPacket->AddRef();
                    }
                }
                HX_RELEASE(pPacket);
            }
        }
        HX_RELEASE(pBuffer);
    }

    return retVal;
}

HX_RESULT PXWireFormatManager::GetImageDataHandle(IHXPacket* pPacket, REF(UINT32) rulHandle)
{
    HX_RESULT retVal = HXR_FAIL;

    if (pPacket)
    {
        IHXBuffer* pBuffer = pPacket->GetBuffer();
        if (pBuffer)
        {
            BYTE* pBuf = pBuffer->GetBuffer();
            if (pBuf)
            {
                // Make sure this is an image data packet
                UINT32 ulType = 0xFFFFFFFF;
                UnPack32(pBuf, ulType);

                if (ulType == kPacketTypeImageData)
                {
                    // Unpack the handle
                    UnPack32(pBuf, rulHandle);
                    retVal = HXR_OK;
                }
            }
        }
        HX_RELEASE(pBuffer);
    }

    return retVal;
}

HX_RESULT PXWireFormatManager::GetImageDataInfo(IHXPacket* pPacket, UINT32 ulOpaqueSize,
                                                REF(IHXBuffer*) rpOpaque, REF(IHXBuffer*) rpData)
{
    HX_RESULT retVal = HXR_FAIL;

    if (pPacket)
    {
        IHXBuffer* pBuffer = pPacket->GetBuffer();
        if (pBuffer)
        {
            BYTE* pBuf = pBuffer->GetBuffer();
            if (pBuf)
            {
                // Make sure this is an image data packet
                UINT32 ulType = 0xFFFFFFFF;
                UnPack32(pBuf, ulType);

                if (ulType == kPacketTypeImageData)
                {
                    // Create a nested buffer class
                    CHXNestedBuffer *pOpaque = NULL;
                    retVal = CHXNestedBuffer::CreateObject(&pOpaque);
                    if (SUCCEEDED(retVal))
                    {
                        // Addref the object
                        pOpaque->AddRef();
                        // Init the object
                        retVal = pOpaque->Init(pBuffer, 8, ulOpaqueSize);
                        if (SUCCEEDED(retVal))
                        {

⌨️ 快捷键说明

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