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

📄 sm1rendr.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    IHXPlayer*	    pPlayer){#if defined(HELIX_FEATURE_SMIL2)    m_bCSmil1StartStreamHasBeenCalled = TRUE;    HX_ASSERT(!m_bIsHigherVersionSmilStreamFromOldSMIL1FF);#endif /* defined(HELIX_FEATURE_SMIL2). */    HX_RESULT rc = HXR_OK;    // Save for later use!    m_pStream  = pStream;    m_pStream->AddRef();    m_pPlayer  = pPlayer;    m_pPlayer->AddRef();    m_pPlayer->GetClientEngine(m_pEngine);    m_pPlayer->GetClientContext(m_pClientContext);    IHXBuffer* pBuffer = NULL;    IHXPreferences* pPreferences = NULL;    IHXRendererAdviseSink* pRendererAdviseSink = NULL;    if (HXR_OK == m_pPlayer->QueryInterface(IID_IHXPreferences, (void**)&pPreferences))    {	if (HXR_OK == pPreferences->ReadPref("useNestedMeta", pBuffer))	{	    m_bUseNestedMeta = atoi((const char*)pBuffer->GetBuffer()) ? TRUE : FALSE;	}	HX_RELEASE(pBuffer);    }    HX_RELEASE(pPreferences);    m_pSmilDocRenderer = new CSmil1DocumentRenderer(this, m_pContext);    m_pSmilDocRenderer->AddRef();    if (m_bUseNestedMeta)    {	IHXPersistentComponent* pPersistentComponent = NULL;	if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXPersistentComponentManager, 					       (void**)&m_pPersistentComponentManager))	{	    m_pPersistentComponentManager->CreatePersistentComponent(pPersistentComponent);	    pPersistentComponent->Init((IHXPersistentRenderer*)this);	    pPersistentComponent->AddRendererAdviseSink((IHXRendererAdviseSink*)m_pSmilDocRenderer);	    pPersistentComponent->AddGroupSink((IHXGroupSink*)m_pSmilDocRenderer);	    rc = m_pPersistentComponentManager->AddPersistentComponent(pPersistentComponent);		    generatePreFix();	}    }    else    {	IHXPersistenceManager* pMgr = 0;	if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXPersistenceManager, 	    (void**)&pMgr))	{	    IUnknown* pUnk = 0;	    if(HXR_OK == pMgr->GetPersistentComponent(pUnk))	    {		rc = HXR_FAIL;		CSmil1SMILSyntaxErrorHandler errHandler(m_pContext);		errHandler.ReportError(SMILErrorMetaDatatype, NULL, 0);		pUnk->Release();	    }	    else if(HXR_OK == QueryInterface(IID_IUnknown, (void**)&pUnk))	    {		pMgr->AddPersistentComponent(pUnk);		pUnk->Release();		generatePreFix();	    }	    pMgr->Release();	}	IHXDriverStreamManager* pDriverStreamMgr = 0;	if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXDriverStreamManager,	    (void**)&pDriverStreamMgr))	{	    if(HXR_OK == m_pSmilDocRenderer->QueryInterface(IID_IHXRendererAdviseSink, 							    (void**)&pRendererAdviseSink))	    {		pDriverStreamMgr->AddRendererAdviseSink(pRendererAdviseSink);		pRendererAdviseSink->Release();	    }	    pDriverStreamMgr->Release();	}	IHXGroupManager* pGrpMgr = 0;	if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXGroupManager,	    (void**)&pGrpMgr))	{	    IHXGroupSink* pSnk = 0;	    if(HXR_OK == m_pSmilDocRenderer->QueryInterface(		IID_IHXGroupSink, (void**)&pSnk))	    {		pGrpMgr->AddSink(pSnk);		pSnk->Release();	    }	}	HX_RELEASE(pGrpMgr);    }    return rc;}///////////////////////////////////////////////////////////////////////////  Method://	IHXRenderer::EndStream//  Purpose://	Called by client engine to inform the renderer that the stream//	is was rendering is closed.//STDMETHODIMP CSmil1Renderer::EndStream(){#if defined(HELIX_FEATURE_SMIL2)    m_bCSmil1EndStreamHasBeenCalled = TRUE;#endif /* defined(HELIX_FEATURE_SMIL2). */    if(m_pPlayer)    {	if (m_bUseNestedMeta)	{	    IHXPersistentComponent* pPersistentComponent = NULL;	    IHXRendererAdviseSink* pRendererAdviseSink = 0;	    if (HXR_OK == m_pPersistentComponentManager->GetPersistentComponent(m_pSmilDocRenderer->m_ulPersistentComponentID,										pPersistentComponent))	    {		pPersistentComponent->RemoveRendererAdviseSink((IHXRendererAdviseSink*)m_pSmilDocRenderer);		pPersistentComponent->RemoveGroupSink((IHXGroupSink*)m_pSmilDocRenderer);	    }	    HX_RELEASE(pPersistentComponent);	    	}	else	{	    IHXGroupManager* pGrpMgr = 0;	    if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXGroupManager, 		(void**)&pGrpMgr))	    {		IHXGroupSink* pSnk = 0;		if(m_pSmilDocRenderer &&		    HXR_OK == m_pSmilDocRenderer->QueryInterface(IID_IHXGroupSink, 		    (void**)&pSnk))		{		    pGrpMgr->RemoveSink(pSnk);		    pSnk->Release();		}		pGrpMgr->Release();	    }	    IHXDriverStreamManager* pStrmMgr = 0;	    if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXDriverStreamManager,		(void**)&pStrmMgr))	    {		IHXRendererAdviseSink* pSnk = 0;		if(m_pSmilDocRenderer &&		    HXR_OK == m_pSmilDocRenderer->QueryInterface(		    IID_IHXRendererAdviseSink, (void**)&pSnk))		{		    pStrmMgr->RemoveRendererAdviseSink(pSnk);		    pSnk->Release();		}		pStrmMgr->Release();	    }	}    }    HX_RELEASE(m_pStream);#if defined(HELIX_FEATURE_SMIL2)    if (m_bIsHigherVersionSmilStreamFromOldSMIL1FF)    {	if (!m_pNextGenSmilRenderer)	{	    return HXR_UNEXPECTED;	}	return m_pNextGenSmilRenderer->EndStream();    }#endif /* defined(HELIX_FEATURE_SMIL2). */    if(m_pSmilDocRenderer)    {	m_pSmilDocRenderer->endStream();    }    return HXR_OK;}///////////////////////////////////////////////////////////////////////////  Method://	IHXRenderer::OnHeader//  Purpose://	Called by client engine when a header for this renderer is //	available. The header will arrive before any packets.//STDMETHODIMP CSmil1Renderer::OnHeader(IHXValues* pHeader){    // check stream and content versions so an upgrade can    // be called if necessary...    HX_RESULT	rc = HXR_OK;    if (!pHeader)    {	return HXR_UNEXPECTED;    }#if defined(HELIX_FEATURE_SMIL2)    // /Hang onto header in case we need to send it up to a higher-version    // SMIL renderer:    m_pHeader = pHeader;    m_pHeader->AddRef();    HX_ASSERT(!m_bIsHigherVersionSmilStreamFromOldSMIL1FF);#endif /* defined(HELIX_FEATURE_SMIL2). */    BOOL bVersionOK = TRUE;    UINT16 uGroupCount = 0;    UINT16 uCurrentGroupID = 0;    UINT16 uSupportedType = 0;	// G2 style by default    UINT32 ulStreamVersion = 0;    UINT32 ulContentVersion = 0;    IHXGroupManager* pGrpMgr = NULL;    if(HXR_OK == pHeader->GetPropertyULONG32("StreamVersion", 	ulStreamVersion))    {	UINT32 ulMajorVersion = HX_GET_MAJOR_VERSION(ulStreamVersion);	UINT32 ulMinorVersion = HX_GET_MINOR_VERSION(ulStreamVersion);	if((ulMajorVersion > STREAM_MAJOR_VERSION) ||	   (ulMinorVersion > STREAM_MINOR_VERSION &&	    ulMajorVersion == STREAM_MAJOR_VERSION))	{	    bVersionOK = FALSE;	}    }    if(bVersionOK &&       HXR_OK == pHeader->GetPropertyULONG32("ContentVersion",           ulContentVersion))    {	UINT32 ulMajorVersion = HX_GET_MAJOR_VERSION(ulContentVersion);	UINT32 ulMinorVersion = HX_GET_MINOR_VERSION(ulContentVersion);	if((ulMajorVersion > CONTENT_MAJOR_VERSION) ||	   (ulMinorVersion > CONTENT_MINOR_VERSION &&	    ulMajorVersion == CONTENT_MAJOR_VERSION))	{	    bVersionOK = FALSE;	}    }    if(!bVersionOK)    {        AddToAutoUpgradeCollection((const char*) zm_pStreamMimeTypes[0], m_pContext);	rc = HXR_FAILED;	goto cleanup;    }    m_pPacketParser = new CSmilPacketParser;    m_pSmilDocRenderer->onHeader(pHeader);         if (m_bUseNestedMeta)    {	if (!m_pSmilDocRenderer->IsNestedMetaSupported(uSupportedType))	{	    rc = HXR_INVALID_METAFILE;	    goto cleanup;	}	switch (uSupportedType)	{	case 1:	    // RP8 SS3 - limited SMIL in RAM support, blow-away all the existing groups	    // when it is the last SMIL in RAM.	    if (HXR_OK == m_pPlayer->QueryInterface(IID_IHXGroupManager, (void**)&pGrpMgr))	    {		uGroupCount = pGrpMgr->GetGroupCount();		pGrpMgr->GetCurrentGroup(uCurrentGroupID);				if ((uCurrentGroupID + 1) == uGroupCount)		{			    m_pSmilDocRenderer->m_bLastGroupInRAM20 = TRUE;		    while(pGrpMgr && pGrpMgr->GetGroupCount() > 0)		    {			pGrpMgr->RemoveGroup(0);		    }		}	    }	    HX_RELEASE(pGrpMgr);	    break;	default:	    break;	}    }    else    {	if (HXR_OK == m_pPlayer->QueryInterface(IID_IHXGroupManager, (void**)&pGrpMgr))	{    	    while(pGrpMgr && pGrpMgr->GetGroupCount() > 0)	    {	        pGrpMgr->RemoveGroup(0);	    }	    	}	HX_RELEASE(pGrpMgr);    }cleanup:    return rc;}///////////////////////////////////////////////////////////////////////////  Method://	IHXRenderer::OnPacket//  Purpose://	Called by client engine when a packet for this renderer is //	due.//STDMETHODIMP CSmil1Renderer::OnPacket(IHXPacket* pPacket, 					 LONG32 lTimeOffset){    HX_RESULT rc = HXR_OK;    IHXBuffer* pBuffer = NULL;#if defined(HELIX_FEATURE_SMIL2)    if (m_bIsHigherVersionSmilStreamFromOldSMIL1FF)    {	if (!m_pNextGenSmilRenderer)	{	    rc = HXR_UNEXPECTED;	    goto cleanup;	}	rc = m_pNextGenSmilRenderer->OnPacket(pPacket, lTimeOffset);        goto cleanup;    }#endif /* defined(HELIX_FEATURE_SMIL2). */    HX_ASSERT(lTimeOffset <= 0);    m_pSmilDocRenderer->m_ulPersistentComponentDelay = -lTimeOffset;    //Fix for PR 23352: if we already returned a fail value from    // a prior OnPacket(), don't process this OnPacket():    if (HXR_OK != m_lastOnPacketResult)    {	rc = m_lastOnPacketResult;	goto cleanup;    }    pBuffer = pPacket->GetBuffer();    if(pBuffer)    {	// /If parse() runs into a missing-quote situation,	// we should stop and display an error.  Note that	// CSmilPacketParser::parse(..)  does not keep track of	// line numbers; TODO: add line-number counting to it.	CSmilPacketParser::SMILPacketParseResult pktPrsRslt = CSmilPacketParser::SMILUnknown;	CSmilPacket* pSmilPacket = m_pPacketParser->parse(	    pBuffer, pktPrsRslt);	if (CSmilPacketParser::SMILMissingQuote == pktPrsRslt)	{	    CSmil1SMILSyntaxErrorHandler errHandler(m_pContext);	    errHandler.ReportError(SMILErrorBadAttribute,		    "missing quote", 0);	}	else if(pSmilPacket)	{	    switch(pSmilPacket->m_type)	    {		case CSmilPacket::SMILDocument:		{#if defined(HELIX_FEATURE_SMIL2)		    if (!m_bIsHigherVersionSmilStreamFromOldSMIL1FF)		    {			// /findSmilTagAndVersion returns TRUE if it finds			// the <smil> tag, regardless of the presence of			// a default namespace:			if (HXR_OK == findSmilTagAndVersion(pBuffer))			{			    if (m_bIsHigherVersionSmilStreamFromOldSMIL1FF)			    {				HX_RESULT pSUS2R = setUpNextGenSmilRenderer();				if (HXR_OK!=pSUS2R  ||  !m_pNextGenSmilRenderer)				{				    rc = HXR_UNEXPECTED;				    goto cleanup;				}			    }			}		    }		    if (m_bIsHigherVersionSmilStreamFromOldSMIL1FF)		    {			rc = m_pNextGenSmilRenderer->OnPacket(pPacket,				lTimeOffset);		    }		    else#endif /* defined(HELIX_FEATURE_SMIL2). */		    {			rc = handleSMILDocumentPacket(			    (CSmilDocumentPacket*)pSmilPacket);		    }		    if (HXR_OK != rc)		    {			m_lastOnPacketResult = rc;		    }		}		break;		default:		break;	    }	    delete pSmilPacket;	}	HX_RELEASE(pBuffer);    }cleanup:    return rc;}///////////////////////////////////////////////////////////////////////////  Method://	IHXRenderer::OnTimeSync//  Purpose://	Called by client engine to inform the renderer of the current//	time relative to the streams synchronized time-line. The //	renderer should use this time value to update its display or//	render it's stream data accordingly.//STDMETHODIMP CSmil1Renderer::OnTimeSync(ULONG32 ulTime){    HX_RESULT rc = HXR_OK;#if defined(HELIX_FEATURE_SMIL2)    if (m_bIsHigherVersionSmilStreamFromOldSMIL1FF)    {	if (!m_pNextGenSmilRenderer)	{	    rc = HXR_UNEXPECTED;	    goto cleanup;	}	rc = m_pNextGenSmilRenderer->OnTimeSync(ulTime);        goto cleanup;    }#endif /* defined(HELIX_FEATURE_SMIL2). */    if(m_pSmilDocRenderer)    {	rc = m_pSmilDocRenderer->onTimeSync(ulTime);    }#if defined(HELIX_FEATURE_SMIL2)cleanup:#endif /* defined(HELIX_FEATURE_SMIL2). */    return rc;}///////////////////////////////////////////////////////////////////////////  Method://	IHXRenderer::OnPreSeek//  Purpose://	Called by client engine to inform the renderer that a seek is//	about to occur. The render is informed the last time for the //	stream's time line before the seek, as well as the first new//	time for the stream's time line after the seek will be completed.//STDMETHODIMP CSmil1Renderer::OnPreSeek(ULONG32 ulOldTime, ULONG32 ulNewTime){    HX_RESULT rc = HXR_OK;#if defined(HELIX_FEATURE_SMIL2)

⌨️ 快捷键说明

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