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

📄 sm1doc.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			SMIL1PlayToAssoc* pThisAssoc = (SMIL1PlayToAssoc*)(*i);
			if (pThisAssoc->m_repeatid ==
				pElement->m_pNode->m_repeatid)
			{
			    IHXGroup2* pGroup2 = NULL;
			    IHXTrack*	pHXTrack = NULL;

			    if (HXR_OK == pGroup->QueryInterface(IID_IHXGroup2,
				    (void**)&pGroup2))
			    {
				if (HXR_OK == pGroup2->GetIHXTrack(
					pThisAssoc->m_uTrackIndex, pHXTrack)  &&
					pHXTrack)
				{
				    pHXTrack->AddRepeat(pValues);
				    bRepeatTrackHandled = TRUE;
				}
				HX_RELEASE(pHXTrack);
			    }
			    HX_RELEASE(pGroup2);
			}
		    }
		}
		if (!bRepeatTrackHandled)
#endif
		{
		    (*m_pRepeatIDMap)[pElement->m_pNode->m_repeatid] = pGroup;
		    pGroup->AddTrack(pValues);
		}
	    }
#else
#if defined(PRE_SHAZAM_SMIL_1_0_CODE)
	    IHXGroup* pTempGroup = NULL;
	    if (m_pRepeatIDMap->Lookup(pElement->m_pNode->m_repeatid, (void*&)pTempGroup))
	    {
		IHXGroup2* pTempGroup2 = NULL;

		if (HXR_OK == pTempGroup->QueryInterface(IID_IHXGroup2, (void**)&pTempGroup2))
		{
		    pTempGroup2->AddRepeat(pValues);
		}
		HX_RELEASE(pTempGroup2);
	    }
	    else
#else
	    // /The following was added for SHAZAM since
	    // IHXGroup2's AddRepeatTrack() has been deprecated
	    // in favor of calling IHXTrack's AddTrack():
	    BOOL bRepeatTrackHandled = FALSE;
	    SMIL1PlayToAssoc*    pPlayToAssoc = NULL;
 	    if(m_pPlayToAssocList)
	    {
		CHXSimpleList::Iterator i = m_pPlayToAssocList->Begin();
		for ( ;i!=m_pPlayToAssocList->End()  &&  !bRepeatTrackHandled; ++i)
		{
		    SMIL1PlayToAssoc* pThisAssoc = (SMIL1PlayToAssoc*)(*i);
		    if (pThisAssoc->m_repeatid ==
			    pElement->m_pNode->m_repeatid)
		    {
			IHXGroup2* pGroup2 = NULL;
			IHXTrack*	pHXTrack = NULL;

			if (HXR_OK == pGroup->QueryInterface(IID_IHXGroup2,
				(void**)&pGroup2))
			{
			    if (HXR_OK == pGroup2->GetIHXTrack(
				    pThisAssoc->m_uTrackIndex, pHXTrack)  &&
				    pHXTrack)
			    {
				pHXTrack->AddRepeat(pValues);
				bRepeatTrackHandled = TRUE;
			    }
			    HX_RELEASE(pHXTrack);
			}
			HX_RELEASE(pGroup2);
		    }
		}
	    }
	    if (!bRepeatTrackHandled)
#endif
	    {
		(*m_pRepeatIDMap)[pElement->m_pNode->m_repeatid] = pGroup;
		pGroup->AddTrack(pValues);
	    }
#endif
	    pValues->Release();
	}
    }

    return rc;
}

HX_RESULT
CSmil1DocumentRenderer::handleSourceUpdate(CSmil1SourceUpdate* pElement)
{
    HX_RESULT rc = HXR_OK;

    const char* pID = (const char*)pElement->m_srcID;

    // determine whether this source has been initialized yet...
    SMIL1PlayToAssoc* pPlayToAssoc = 0;
    if(m_pPlayToAssocList)
    {
	CHXSimpleList::Iterator i;
	for(i=m_pPlayToAssocList->Begin();i!=m_pPlayToAssocList->End();++i)
	{
	    SMIL1PlayToAssoc* pThisAssoc = (SMIL1PlayToAssoc*)(*i);
	    if(pThisAssoc->m_id == pID)
	    {
		pPlayToAssoc = pThisAssoc;
		break;
	    }
	}
    }
    if(pPlayToAssoc &&
	pPlayToAssoc->m_sourceMap.GetCount() > 0)
    {
        CSmil1Element* pThisElement = 
	    m_pSmilParser->findElement(pID);
	if(pThisElement->m_ulBeginOffset != (UINT32)-1)
	{
	    if(pElement->m_ulUpdatedDuration > pThisElement->m_ulBeginOffset)
	    {
		updateStreamTiming(pID, pElement->m_ulUpdatedDuration -
		    pThisElement->m_ulBeginOffset);
	    }
	    else
	    {
		updateStreamTiming(pID, 0);
	    }
	}
	else
	{
	    updateStreamTiming(pID, pElement->m_ulUpdatedDuration);
	}
    }
    else
    {
	// stick it into the deferred map,
	// it will be handled in RendererInitialized()
	if(!m_pDeferredSourceMap)
	{
	    m_pDeferredSourceMap = new CHXMapStringToOb;
	}
	
	SMIL1DeferredSourceInfo* pInfo = new SMIL1DeferredSourceInfo;
	pInfo->m_ulDuration = pElement->m_ulUpdatedDuration;
	pInfo->m_ulDelay = 0;
	// /Fixes mem leak when pID is already in the map:
	SMIL1DeferredSourceInfo* pTmpInfo;
	if (m_pDeferredSourceMap->Lookup(pID, (void*&)pTmpInfo))
	{
	    HX_DELETE(pTmpInfo);
	}
	(*m_pDeferredSourceMap)[pID] = pInfo;
    }

    return rc;
}

HX_RESULT
CSmil1DocumentRenderer::handleEndLayout(CSmil1EndLayout* pElement)
{
    return setupRootLayout();
}

HX_RESULT CSmil1DocumentRenderer::setupRootLayout()
{
    HX_RESULT rc = HXR_OK;

    IUnknown* pThisUnk = 0;
    if(HXR_OK == QueryInterface(IID_IUnknown, (void**)&pThisUnk))
    {
	m_pParent->HandleAddLayoutSiteGroup(pThisUnk);
	pThisUnk->Release();
	m_bSiteLayoutComplete = TRUE;
    }
    createRegionSites();

    // force initial redraw
    HXxSize siteWinSize;
    if (m_pMISUSSite)
    {
	m_pMISUSSite->GetSize(siteWinSize);
	CHXxRect updateRect(0, 0, siteWinSize.cx, siteWinSize.cy);
	m_pMISUSSite->DamageRect(updateRect);
#ifndef  _WIN32
	m_pMISUSSite->ForceRedraw();
#endif
    }

    return rc;
}

HX_RESULT
CSmil1DocumentRenderer::handleMeta(CSmil1Meta* pElement)
{
    HX_RESULT rc = HXR_OK;

    IHXPlayer* pPlayer = m_pParent->getPlayer();
    IHXGroupManager* pMgr = NULL;
    IHXValues* pValues = NULL;

    if(pElement->m_name.GetLength() > 0)
    {
	if(HXR_OK == pPlayer->QueryInterface(IID_IHXGroupManager, (void**)&pMgr))
	{
	    pValues = pMgr->GetPresentationProperties();
	    if(!pValues)
	    {
		pValues = new CHXOrderedValues;
		pValues->AddRef();
		pMgr->SetPresentationProperties(pValues);
	    }

	    IHXBuffer* pBuf = new CHXBuffer;
	    pBuf->AddRef();
	    pBuf->Set((BYTE*)(const char*)pElement->m_content,
		pElement->m_content.GetLength()+1);
	    pValues->SetPropertyCString((const char*)pElement->m_name,
		pBuf);
	    pBuf->Release();
	    pValues->Release();
	    pMgr->Release();
	}
    }

    return rc;
}

HX_RESULT
CSmil1DocumentRenderer::handleRendererPreFetch(CSmil1RendererPreFetch *pRend)
{
    HX_RESULT rc = HXR_OK;
    const char* pMimeType = (const char*)pRend->m_mimeType;

    IHXRendererUpgrade* pUpgrade = 0;

    if(m_pContext)
    {
	IHXSystemRequired* pISystemRequired = NULL;
	m_pContext->QueryInterface(IID_IHXSystemRequired, 
	    (void**)&pISystemRequired);
	
	CHXBuffer* pBuffer = new CHXBuffer;
	pBuffer->AddRef();
	pBuffer->Set((BYTE*)pMimeType, strlen(pMimeType)+1);
	if (pISystemRequired)
	{
	    IHXUpgradeCollection* pUpgradeCollection = NULL;
	    IHXPlayer* pPlayer = m_pParent->getPlayer();	    
	    if(pPlayer)
		pPlayer->QueryInterface(IID_IHXUpgradeCollection, (void**)&pUpgradeCollection);

	    if(pUpgradeCollection)
	    {
		pUpgradeCollection->Add(eUT_Required, pBuffer, 0, 0);
		// HasFeatures() calls removes all existing features from pUpgradeCollection.
		pISystemRequired->HasFeatures(pUpgradeCollection);
	    }
	    HX_RELEASE(pUpgradeCollection);
	    HX_RELEASE(pISystemRequired);
	}

	HX_RELEASE(pBuffer);
    }

    return rc;
}

HX_RESULT
CSmil1DocumentRenderer::insertEvent(CSmil1ShowSiteEvent* pEvent)
{
    if(!m_pEventList)
    {
	m_pEventList = new CHXSimpleList;
    }

    LISTPOSITION lPos = m_pEventList->GetHeadPosition();
    LISTPOSITION lPrev = lPos;

    BOOL bInserted = FALSE;
    while(lPos)
    {
	CSmil1ShowSiteEvent* pThisEvent = 
	    (CSmil1ShowSiteEvent*)m_pEventList->GetNext(lPos);

	if(pThisEvent->m_ulEventTime == pEvent->m_ulEventTime &&
	    pThisEvent->getRegionSite() == pEvent->getRegionSite())
	{
	    if(pEvent->showSite())
	    {
		if(!lPos)
		{
		    m_pEventList->AddTail(pEvent);
		    bInserted = TRUE;
		    break;
		}

		// find position of last 'hide' event at this time
		while(lPos &&
		    pThisEvent->m_ulEventTime == pEvent->m_ulEventTime &&
		    pThisEvent->getRegionSite() == pEvent->getRegionSite() &&
		    !pThisEvent->showSite())
		{
		    lPrev = lPos;
		    pThisEvent = (CSmil1ShowSiteEvent*)m_pEventList->GetNext(lPos);
		}
	    }

	    m_pEventList->InsertBefore(lPrev, pEvent);
	    bInserted = TRUE;
	    break;
	}
	else if(pThisEvent->m_ulEventTime > pEvent->m_ulEventTime)
	{
	    m_pEventList->InsertBefore(lPrev, pEvent);
	    bInserted = TRUE;
	    break;
	}
	lPrev = lPos;
    }
    if(!bInserted)
    {
	// not inserted, stick it on the end of the list
	m_pEventList->AddTail(pEvent);
    }

    // set list position member
    m_ulEventListPosition = m_pEventList->GetHeadPosition();

    return HXR_OK;
}

CSmil1ShowSiteEvent* 
CSmil1DocumentRenderer::getShowHideEvent(IHXSite*  pRegionSite,
					 IHXSite*  pRendererSite,
                                         BOOL	    bShowEvent)
{
    CSmil1ShowSiteEvent* pRet = NULL;

    if (m_pEventList && pRegionSite)
    {
        LISTPOSITION pos = m_pEventList->GetHeadPosition();
        while (pos)
        {
            CSmil1ShowSiteEvent* pEvent = (CSmil1ShowSiteEvent*) m_pEventList->GetNext(pos);
            if (pEvent)
            {
                if (pEvent->showSite() == bShowEvent	    &&
		    pEvent->getRegionSite() == pRegionSite  &&
		    pEvent->getRendererSite() == pRendererSite)
                {
                    pRet = pEvent;
                    break;
                }
            }
        }
    }

    return pRet;
}

HX_RESULT
CSmil1DocumentRenderer::insertSiteInfo(void* pVoidInfo)
{
    if(!m_pSiteInfoList)
    {
	m_pSiteInfoList = new CHXSimpleList;
    }

    SMIL1SiteInfo* pInfo = (SMIL1SiteInfo*)pVoidInfo;

    LISTPOSITION lPos = m_pSiteInfoList->GetHeadPosition();
    LISTPOSITION lPrev = lPos;

    BOOL bInserted = FALSE;
    while(lPos)
    {
	SMIL1SiteInfo* pThisInfo = 
	    (SMIL1SiteInfo*)m_pSiteInfoList->GetNext(lPos);

	if(pThisInfo->m_ulDelay > pInfo->m_ulDelay)
	{
	    m_pSiteInfoList->InsertBefore(lPrev, pInfo);
	    bInserted = TRUE;
	    break;
	}
	lPrev = lPos;
    }
    if(!bInserted)
    {
	// not inserted, stick it on the end of the list
	m_pSiteInfoList->AddTail(pInfo);
    }

    return HXR_OK;
}


void
CSmil1DocumentRenderer::resizeSite(IHXSite* pSite,
				  double dXScale,
				  double dYScale)
{
    if (!pSite)
    {
	return;
    }

    HXxSize oldChildSize;
    HXxPoint oldChildPosition;
    pSite->GetSize(oldChildSize);
    pSite->GetPosition(oldChildPosition);
    HXxSize newChildSize;
    HXxPoint newChildPosition;
    newChildSize.cx = (INT32)(dXScale * (double)(oldChildSize.cx) + 0.5);
    newChildSize.cy = (INT32)(dYScale * (double)(oldChildSize.cy) + 0.5);
    newChildPosition.x = (INT32)(dXScale*(double)(oldChildPosition.x) + 0.5);
    newChildPosition.y = (INT32)(dYScale*(double)(oldChildPosition.y) + 0.5);

    CSmil1SiteWatcher* pSiteWatcher = NULL;
    if(m_pSiteWatcherMap && m_pSiteWatcherMap->Lookup(pSite, (void*&)pSiteWatcher))
    {
	pSiteWatcher->SiteChangingSize(TRUE);
//        char szDbgStr[128];
//        DEBUGPRINTF(szDbgStr, "(%ld,%ld) ", newChildSize.cx, newChildSize.cy);
	pSite->SetSize(newChildSize);
	pSiteWatcher->SiteChangingSize(FALSE);
    }
    else
    {
//        char szDbgStr[128];
//        DEBUGPRINTF(szDbgStr, "(%ld,%ld) ", newChildSize.cx, newChildSize.cy);
	pSite->SetSize(newChildSize);
    }
//    char szDbgStr[128];
//    DEBUGPRINTF(szDbgStr, "repos to (%ld,%ld)\n", newChildPosition.x, newChildPosition.y);
    pSite->SetPosition(newChildPosition);

    CHXxRect updateRect(0, 0, newChildSize.cx, newChildSize.cy);
    pSite->DamageRect(updateRect);
#ifndef  _WIN32
    pSite->ForceRedraw();
#endif
}

void CSmil1DocumentRenderer::resizeRegionSiteAbs(CSmil1BasicRegion* pRegion,
                                                double            dXAbsScale,
                                                double            dYAbsScale)
{
    if (pRegion && pRegion->m_pSite)
    {
        HXxSize  cSize = {0, 0};
        HXxPoint cPos  = {0, 0};
        cPos.x         = (INT32) floor(dXAbsScale * ((double) pRegion->m_originalRect.left) + 0.5);
        cPos.y         = (INT32) floor(dYAbsScale * ((double) pRegion->m_originalRect.top)  + 0.5);
        cSize.cx       = (INT32) floor(dXAbsScale * ((double) HXxRECT_WIDTH(pRegion->m_originalRect)) + 0.5);
        cSize.cy       = (INT32) floor(dYAbsScale * ((double) HXxRECT_HEIGHT(pRegion->m_originalRect)) + 0.5);

        CSmil1SiteWatcher* pSiteWatcher = NULL;
        if(m_pSiteWatcherMap && m_pSiteWatcherMap->Lookup(pRegion->m_pSite, (void*&)pSiteWatcher))
        {
	    pSiteWatcher->SiteChangingSize(TRUE);
//            char szDbgStr[128];
//            DEBUGPRINTF(szDbgStr, "(%ld,%ld) ", cSize.cx, cSize.cy);
	    pRegion->m_pSite->SetSize(cSize);
	    pSiteWatcher->SiteChangingSize(FALSE);
        }
        else
        {
//            char szDbgStr[128];
//            DEBUGPRINTF(szDbgStr, "(%ld,%ld) ", cSize.cx, cSize.cy);
	    pRegion->m_pSite->SetSize(cSize);
        }
//        char szDbgStr[128];
//        DEBUGPRINTF(szDbgStr, "repos to (%ld,%ld)\n", cPos.x, cPos.y);
        pRegion->m_pSite->SetPosition(cPos);

⌨️ 快捷键说明

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