pxgifrnd.cpp

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

CPP
1,936
字号
        {
            // We are going to start receiving packets all over again, so
            // we need to blow away the CGIFCodec class and start over
            // again. We will need to reinit it with the stream header
            // buffer.
            //
            // Delete the old CGIFCodec
            HX_DELETE(m_pGIFCodec);
            // Create a new one
            m_pGIFCodec = new CGIFCodec();
            if (m_pGIFCodec)
            {
                // Get the stream header pointer
                BYTE* pData = m_pStreamHeaderBuffer->GetBuffer() + m_ulStreamHeaderOffset;
                // Initialize the CGIFCodec for decompression
                retVal = m_pGIFCodec->InitDecompress(m_pStreamHeaderBuffer->GetBuffer() + m_ulStreamHeaderOffset,
                                                     m_pStreamHeaderBuffer->GetSize()   - m_ulStreamHeaderOffset);
                if (SUCCEEDED(retVal))
                {
                    // Initialize the rendering members
                    m_ulCurImg           = 0;
                    m_ulCurImgRenderTime = 0;
                    m_ulCurDelayTime     = 0;
                    m_lLastImg           = -1;
                    // Initialize the loop done count
                    m_ulLoopsDone        = 0;
                    // Clear the ignore packets flag
                    m_bIgnorePackets     = FALSE;
                }
            }
            else
            {
                retVal = HXR_OUTOFMEMORY;
            }
        }
    }
    else
    {
        retVal = HXR_UNEXPECTED;
    }
    
    return retVal;
}

STDMETHODIMP CGIFRenderer::OnPause(UINT32 ulTimeBeforePause)
{
    MLOG_MISC(m_pErrorMessages,
              "0x%08x::OnPause(%lu)\n",
              this, ulTimeBeforePause);

    // Set the paused flag
    m_bPaused = TRUE;

    return HXR_OK;
}

STDMETHODIMP CGIFRenderer::OnBuffering(UINT32 ulReason, UINT16 usPercentComplete)
{
    MLOG_MISC(m_pErrorMessages,
              "0x%08x::OnBuffering(%lu,%u)\n",
              this, ulReason, usPercentComplete);
    return HXR_OK;
}

STDMETHODIMP CGIFRenderer::OnEndofPackets()
{
    MLOG_MISC(m_pErrorMessages,
              "0x%08x::OnEndofPackets()\n",
              this);
    return HXR_OK;
}


STDMETHODIMP CGIFRenderer::EndStream()
{
    MLOG_MISC(m_pErrorMessages,
              "0x%08x::EndStream()\n",
              this);
    // We're finished with the stream, but we may have
    // more rendering to do
    HX_RELEASE(m_pStream);

    return HXR_OK;
}

STDMETHODIMP CGIFRenderer::AttachSite(IHXSite *pSite)
{
    MLOG_MISC(m_pErrorMessages,
              "0x%08x::AttachSite(0x%08x)\n",
              this, pSite);

    // Check for input error
    if (pSite == NULL)
    {
        return HXR_INVALID_PARAMETER;
    }

    // Check to see if we alredy have a site interface
    if (m_pMISUSSite)
    {
        return HXR_UNEXPECTED;
    }

    // Save a copy of the IHXSite interface
    m_pMISUSSite = pSite;
    m_pMISUSSite->AddRef();

    // Fill in the size
    m_cSize.cx = m_ulWidth;
    m_cSize.cy = m_ulHeight;

    // Tell the site of our size
    m_pMISUSSite->SetSize(m_cSize);

    // Lets see if we have a new site that supports sub rects.
    IHXSubRectSite* pSubRectSite = NULL;
    if(HXR_OK == m_pMISUSSite->QueryInterface(IID_IHXSubRectSite,
                                              (void**)&pSubRectSite))
    {
        //If so, since IHXSubRectSite inheirits from IHXSite, lets just
        //swap the pointers and sign up for the service.
        HX_RELEASE(m_pMISUSSite);
        m_pMISUSSite = pSubRectSite;
        pSubRectSite->SendSubRectMessages(TRUE);
        // Set the flag
        m_bCanBltSubRects = TRUE;
    }

    // Set the site attached flag
    m_bSiteAttached = TRUE;

    return HXR_OK;
}

STDMETHODIMP CGIFRenderer::DetachSite()
{
    MLOG_MISC(m_pErrorMessages,
              "0x%08x::DetachSite()\n",
              this);

    if (m_pCallback)
    {
        if (m_pCallback->IsCallbackPending())
        {
            m_pCallback->RemovePendingCallback();
        }
    }
    if (m_pClientAdviseSink)
    {
        m_pClientAdviseSink->Close();
    }
    // Release the callback
    // XXXMEH - MUST DO THIS HERE or we'll have circular
    // dependency and leak CGIFRenderers
    HX_RELEASE(m_pCallback);

    // Release our site interface
    HX_RELEASE(m_pMISUSSite);

    // We're done with these...
    if (m_pMISUS)
    {
        m_pMISUS->ReleaseSingleSiteUser();
    }
    HX_RELEASE(m_pMISUS);

    // Clear the site attached flag
    m_bSiteAttached = FALSE;

    return HXR_OK;
}

STDMETHODIMP_(BOOL) CGIFRenderer::NeedsWindowedSites()
{
    return FALSE;
}

STDMETHODIMP CGIFRenderer::InitializeStatistics(UINT32 ulRegistryID)
{
    MLOG_MISC(m_pErrorMessages,
              "0x%08x::InitializeStatistics(%lu)\n",
              this, ulRegistryID);

    // Add our renderer name to the HXRegistry
    IHXRegistry *pRegistry = NULL;
    HX_RESULT retVal = m_pContext->QueryInterface(IID_IHXRegistry, (void **) &pRegistry);
    if (retVal == HXR_OK)
    {
        // Get the current registry key name
        IHXBuffer *pszRegistryName = NULL;
        retVal                      = pRegistry->GetPropName(ulRegistryID, pszRegistryName);
        if (retVal == HXR_OK)
        {
            // Create an IHXBuffer to hold the name
        
            IHXBuffer* pValue = NULL;

            if (m_pCommonClassFactory)
            {
                IUnknown* pUnknown = NULL;
                m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pUnknown);
                if (pUnknown)
                {
                    pUnknown->QueryInterface(IID_IHXBuffer, (void**)&pValue);
                    HX_RELEASE(pUnknown);
                }
            }
            if (!pValue)
            {
                HX_RELEASE(pszRegistryName);
                HX_RELEASE(pRegistry);
                return HXR_OUTOFMEMORY;
            }
            pValue->AddRef();

            // Create the key name
            char szRegistryEntry[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */
            SafeSprintf(szRegistryEntry, MAX_DISPLAY_NAME, "%s.name", pszRegistryName->GetBuffer());

            // Set the key value
            retVal = pValue->Set((const BYTE*) m_pszName, strlen(m_pszName) + 1);
            if (retVal != HXR_OK)
            {
                HX_RELEASE(pValue);
                HX_RELEASE(pszRegistryName);
                HX_RELEASE(pRegistry);
                return retVal;
            }

            // Add the key/value pair to the registry
            pRegistry->AddStr(szRegistryEntry, pValue);

            HX_RELEASE(pValue);
            HX_RELEASE(pszRegistryName);
        }
        HX_RELEASE(pRegistry);
    }

    return retVal;
}

STDMETHODIMP CGIFRenderer::UpdateStatistics()
{
    MLOG_MISC(m_pErrorMessages,
              "0x%08x::UpdateStatistics()\n",
              this);
    return HXR_OK;
}

STDMETHODIMP CGIFRenderer::SetPropertyULONG32(const char* pName, ULONG32 ulVal)
{
    HX_RESULT retVal = HXR_FAIL;

    if (m_pValues)
    {
        // Clear the update needed flag
        BOOL bUpdateNeeded = FALSE;
        if (!strcmp(pName, "backgroundOpacity"))
        {
            if (ulVal > 255) ulVal = 255;
            if (ulVal != m_ulBackgroundOpacity) bUpdateNeeded = TRUE;
            m_ulBackgroundOpacity = ulVal;
        }
        else if (!strcmp(pName, "mediaOpacity"))
        {
            if (ulVal > 255) ulVal = 255;
            if (ulVal != m_ulMediaOpacity) bUpdateNeeded = TRUE;
            m_ulMediaOpacity = ulVal;
        }
        else if (!strcmp(pName, "chromaKey"))
        {
            if (ulVal != m_ulMediaChromaKey) bUpdateNeeded = TRUE;
            m_ulMediaChromaKey         = ulVal;
            m_bMediaChromaKeySpecified = TRUE;
        }
        else if (!strcmp(pName, "chromaKeyTolerance"))
        {
            if (ulVal != m_ulMediaChromaKeyTolerance) bUpdateNeeded = TRUE;
            m_ulMediaChromaKeyTolerance = ulVal;
        }
        else if (!strcmp(pName, "chromaKeyOpacity"))
        {
            if (ulVal != m_ulMediaChromaKeyOpacity) bUpdateNeeded = TRUE;
            m_ulMediaChromaKeyOpacity = ulVal;
        }
        // Did any values change?
        if (bUpdateNeeded)
        {
            // If we have not seen our first time sync yet, then
            // there is no need to update the buffer, since the first
            // copy has not been done yet
            if (!m_bFirstTimeSync && m_pGIFCodec)
            {
                // Compute the current frame we are on (note that
                // m_ulCurImg contains the index of the NEXT frame
                // that we are about to draw
                UINT32 ulCurFrame = (m_ulCurImg > 0 ? m_ulCurImg - 1 : 0);
                // Update the buffer
                // XXXMEH - optimization for later. In some cases if we 
                // just changed the media opacity, then it may not be necessary
                // to start back at the beginning and rebuild the frame buffer
                // from the first frame.
                m_pGIFCodec->GetRGBImageEx(-1,
                                           ulCurFrame,
                                           m_pOutputBuffer->GetBuffer(),
                                           m_pGIFCodec->GetLogicalScreenWidth(),
                                           m_pGIFCodec->GetLogicalScreenHeight(),
                                           m_ulPadWidth,
                                           m_ulBytesPerPixel,
                                           m_bRowsInverted,
                                           m_bRGBOrdering,
                                           m_ulBackgroundColor,
                                           (m_ulMediaOpacity == 255 ? FALSE : TRUE),
                                           m_ulMediaOpacity,
                                           m_bMediaChromaKeySpecified,
                                           m_ulMediaChromaKey,
                                           m_ulMediaChromaKeyTolerance,
                                           m_ulMediaChromaKeyOpacity);
                // XXXMEH - do dumb assignment for now. We should later check
                // chroma key to find if any colors were actually encountered.
                if (m_ulBackgroundOpacity < 255 ||
                    m_ulMediaOpacity < 255      ||
                    m_bMediaChromaKeySpecified)
                {
                    m_bUsesAlphaChannel = TRUE;
                }
            }
        }
        retVal = m_pValues->SetPropertyULONG32(pName, ulVal);
    }

    return retVal;
}

STDMETHODIMP CGIFRenderer::GetPropertyULONG32(const char* pName, REF(ULONG32) rulVal)
{
    HX_RESULT retVal = HXR_FAIL;

    if (m_pValues)
    {
        retVal = m_pValues->GetPropertyULONG32(pName, rulVal);
    }

    return retVal;
}

STDMETHODIMP CGIFRenderer::GetFirstPropertyULONG32(REF(const char*) rpName, REF(ULONG32) rulVal)
{
    HX_RESULT retVal = HXR_FAIL;

    if (m_pValues)
    {
        retVal = m_pValues->GetFirstPropertyULONG32(rpName, rulVal);
    }

    return retVal;
}

STDMETHODIMP CGIFRenderer::GetNextPropertyULONG32(REF(const char*) rpName, REF(ULONG32) rulVal)
{
    HX_RESULT retVal = HXR_FAIL;

    if (m_pValues)
    {
        retVal = m_pValues->GetNextPropertyULONG32(rpName, rulVal);
    }

    return retVal;
}

STDMETHODIMP CGIFRenderer::SetPropertyBuffer(const char* pName, IHXBuffer* pVal)
{
    HX_RESULT retVal = HXR_FAIL;

    if (m_pValues)
    {
        retVal = m_pValues->SetPropertyBuffer(pName, pVal);
    }

    return retVal;
}

STDMETHODIMP CGIFRenderer::GetPropertyBuffer(const char* pName, REF(IHXBuffer*) rpVal)
{
    HX_RESULT retVal = HXR_FAIL;

    if (m_pValues)
    {

⌨️ 快捷键说明

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