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

📄 sm1rendr.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				UINT16		    uTrackID,				UINT32		    ulCurrentTime,				REF(IHXValues*)    pStatus){    return m_pSmilDocRenderer->GetElementStatus(uGroupID,						uTrackID,						ulCurrentTime,						pStatus);}HX_RESULTCSmil1Renderer::HandleAddLayoutSiteGroup(IUnknown* pLSG){    HX_RESULT		    rc = HXR_OK;    IHXValues*		    pProps = NULL;    IHXPersistentRenderer* pPersistentParentRenderer = NULL;    pPersistentParentRenderer = m_pSmilDocRenderer->m_pPersistentParentRenderer;    // nested meta, get layout from its parent    if (pPersistentParentRenderer)    {	pProps = new CHXHeader();		if (pProps)	{	    pProps->AddRef();	    pProps->SetPropertyULONG32("PersistentType", m_persistentType);	}	rc = pPersistentParentRenderer->AttachElementLayout(m_pSmilDocRenderer->m_uPersistentGroupID,							    m_pSmilDocRenderer->m_uPersistentTrackID,							    (IHXRenderer*)pLSG,							    NULL,							    pProps);    }    else if (m_pPlayer)    {	IHXLayoutSiteGroupManager* pLSGMgr = 0;	if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXLayoutSiteGroupManager, (void**)&pLSGMgr))	{	    rc = pLSGMgr->AddLayoutSiteGroup(pLSG);	    pLSGMgr->Release();	}    }    HX_RELEASE(pProps);    return rc;}HX_RESULTCSmil1Renderer::HandleRemoveLayoutSiteGroup(IUnknown* pLSG){    HX_RESULT		    rc = HXR_OK;    IHXPersistentRenderer* pPersistentParentRenderer = NULL;    pPersistentParentRenderer = m_pSmilDocRenderer->m_pPersistentParentRenderer;    // nested meta, remove layout from its parent    if (pPersistentParentRenderer)    {	rc = pPersistentParentRenderer->DetachElementLayout(pLSG);    }    else if (m_pPlayer)    {	IHXLayoutSiteGroupManager* pLSGMgr = 0;	if(HXR_OK == m_pPlayer->QueryInterface(IID_IHXLayoutSiteGroupManager, (void**)&pLSGMgr))	{	    rc = pLSGMgr->RemoveLayoutSiteGroup(pLSG);	    pLSGMgr->Release();	}    }    return rc;}HX_RESULTCSmil1Renderer::HandleAttachElementLayout(IUnknown* pLSG, IHXValues* pProps){    HX_RESULT	rc = HXR_OK;    if (m_pPersistentComponentManager)    {	rc = m_pPersistentComponentManager->AttachPersistentComponentLayout(pLSG, pProps);    }    return rc;}HX_RESULTCSmil1Renderer::handleSMILDocumentPacket(CSmilDocumentPacket* pPacket){    HX_RESULT rc = HXR_OK;    if(pPacket->m_version == RMA_DRIVER_VERSION)    {	CHXBuffer* pBuffer = new CHXBuffer;	pBuffer->AddRef();	BOOL bLastPacket = FALSE;	UINT32 ulDocLen = (UINT32)pPacket->m_document.GetLength();	HX_ASSERT(ulDocLen);	// /Extra safety check:	if (0 == ulDocLen)	{	    rc = HXR_UNEXPECTED;	    bLastPacket = FALSE;	}	else	{	    pBuffer->Set((const BYTE*)(const char*)pPacket->m_document,		    pPacket->m_document.GetLength());	    m_ulTotalSMILPackets++;	    bLastPacket = pPacket->m_ulTotalPackets == m_ulTotalSMILPackets;	    rc = m_pSmilDocRenderer->onPacket(pBuffer, bLastPacket);	}	HX_RELEASE(pBuffer);	if(HXR_OK != rc)	{	    // XML parsing error	    UINT32 ulLineNumber = 0;	    UINT32 ulColumnNumber = 0;	    IHXBuffer* pErrorText = NULL;	    m_pSmilDocRenderer->getErrorInfo(ulLineNumber,		ulColumnNumber, pErrorText);	    const char* pActualErrorText = NULL;	    if(pErrorText)	    {		pActualErrorText = (const char*)pErrorText->GetBuffer();	    }	    CSmil1XMLSyntaxErrorHandler errHandler(m_pContext);	    errHandler.ReportError(rc, pActualErrorText, ulLineNumber);	    HX_RELEASE(pErrorText);	}	else if(bLastPacket)	{	    //[SMIL 1.0 compliance] Handle error from setDocument()	    // otherwise it "plays" (nothing for 20 seconds) when it	    // should halt under error conditions:	    rc = m_pSmilDocRenderer->setDocument(m_pURLFragment);	}    }    return rc;}voidCSmil1Renderer::generatePreFix(){    // get the protocol/server for later...    IHXStreamSource* pSource = 0;    m_pStream->GetSource(pSource);    HX_ASSERT(pSource);    if (!pSource)    {	return;    }    const char* pURL = pSource->GetURL();    HX_ASSERT(pURL);        if (!pURL)    {	return;    }    CHXURL::GeneratePrefixRootFragment(pURL, m_urlPrefix, m_urlRoot, m_pURLFragment);    HX_RELEASE(pSource);    return;}#if defined(HELIX_FEATURE_SMIL2)HX_RESULT CSmil1Renderer::findValidDefaultNamespace(IHXBuffer* pStartOfFile){    HX_RESULT pnreslt = HXR_OK;    const char* pSmilTag = NULL;    const char* pCloseOfSmilTag = NULL;    const char* pXmlns = NULL;    const char* pXmlnsOpenQuotationMark = NULL;    const char* pBuf = NULL;    ULONG32 ulBufLen = 0;    const char* pEqualsSign = NULL;    const char* pTmp = NULL;    char* pTmp2 = NULL;    char* pszStartOfFile = NULL;    ULONG32 ulCount = 0;    LONG32 lNumCommentsOpen = 0;    if (!pStartOfFile)    {	pnreslt = HXR_BUFFERTOOSMALL;	goto cleanup;    }    // /Fixes PR 59282: pStartOfFile is not necessarily NULL-terminated,    // so we have to limit our access of it to the size of the buffer:    ulBufLen = pStartOfFile->GetSize();    pBuf = (const char*)pStartOfFile->GetBuffer();    if (!pBuf  ||  !ulBufLen)    {	pnreslt = HXR_BUFFERTOOSMALL;	goto cleanup;    }    pszStartOfFile = new char[ulBufLen+1];    if (!pszStartOfFile)    {	pnreslt = HXR_OUTOFMEMORY;	goto cleanup;    }    // /Now, walk through and copy each character from non-NULL terminated buf:    pTmp = pBuf;     pTmp2 = pszStartOfFile;    while (*pTmp  &&  ulCount<ulBufLen)    {	*pTmp2 = *pTmp;	pTmp++;	pTmp2++;	ulCount++;    }    pszStartOfFile[ulCount] = '\0'; // /NULL-terminate it.    // /Now, let's walk through the start of pszStartOfFile looking for    // namespace declaration(s) inside the <smil ...> tag, and make sure that    // the smil tag is NOT inside of a comment:    pTmp = pszStartOfFile;    while (*pTmp)    {	if (0==strncmp(pTmp, "<!--", 4) )	{	    lNumCommentsOpen++;	    pTmp+=4;	}	else if (0==strncmp(pTmp, "-->", 3) )	{	    lNumCommentsOpen--;	    pTmp+=3;	}	else if (lNumCommentsOpen<=0  &&  0==strncmp(pTmp, "<smil", 5) )	{	    pSmilTag = pTmp; // /We found the smil tag outside of a comment.	    break;	}	else	{	    pTmp++;	}    }    if (!pSmilTag  ||  ulBufLen-(pSmilTag-pszStartOfFile) < 6) // /6==min size: "<smil>"    {	// /There had better be a <smil...> tag!	pnreslt = HXR_UNEXPECTED;	goto cleanup;    }    pCloseOfSmilTag = strchr(pSmilTag, '>');    // /Add 6 so that we don't allow "<smilxmlns ..." (which is invalid):    pXmlns = strstr(pSmilTag+6, "xmlns");    if (pXmlns  &&  isspace(*(pXmlns-1)) ) // /"xmlns" must follow a space.    {	pEqualsSign = strchr(pXmlns, '=');	if (pEqualsSign)	{	    pXmlnsOpenQuotationMark = strchr(pXmlns, '\"');	}    }    if (pXmlns  &&   pEqualsSign  &&  pXmlnsOpenQuotationMark  &&	    (!pCloseOfSmilTag  ||  pXmlns<pCloseOfSmilTag))    {	m_bIsHigherVersionSmilStreamFromOldSMIL1FF = TRUE;	// /First, make sure there is nothing but whitespace between	// the "xmlns" and the '=' as well as between the '=' and the	// quotation mark:	char* pTmp = (char*)(pXmlns + strlen("xmlns"));	while (pTmp<pEqualsSign)	{	    if (!isspace(*pTmp))	    {		m_bIsHigherVersionSmilStreamFromOldSMIL1FF = FALSE;		break;	    }	    pTmp++;	}	pTmp = (char*)(pEqualsSign+1);	while(pTmp<pXmlnsOpenQuotationMark)	{	    if (!isspace(*pTmp)  &&  *pTmp != '\\')	    {		m_bIsHigherVersionSmilStreamFromOldSMIL1FF = FALSE;		break;	    }	    pTmp++;	}	char* pDefaultNamespace = (char*)pXmlnsOpenQuotationMark+1;	if (strlen(pDefaultNamespace) > 0)	{	    char* pXmlnsCloseQuotationMark = strstr(pDefaultNamespace, "\\\"");	    if (pXmlnsCloseQuotationMark)	    {		*pXmlnsCloseQuotationMark = '\0'; // /NULL-terminate it.	    }	    else	    {		HX_ASSERT(pXmlnsCloseQuotationMark);		pnreslt = HXR_FAIL;		goto cleanup;	    }	}	HX_RELEASE(m_pDefaultNamespace);	if (m_pCommonClassFactory  &&		HXR_OK == m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer,		(void**)&m_pDefaultNamespace) )	{	    LONG32 lLen = strlen(pDefaultNamespace);	    if (lLen > 0  &&  lLen < 10000) // /sanity check	    {		m_pDefaultNamespace->Set((const BYTE*)pDefaultNamespace,		        lLen + 1);	    }	    pnreslt = HXR_OK;	}    }cleanup:    if (pszStartOfFile)    {	HX_VECTOR_DELETE(pszStartOfFile);    }    return pnreslt;}#endif /* defined(HELIX_FEATURE_SMIL2). */#if defined(HELIX_FEATURE_SMIL2)// /The following two methods are used for looking for and handling SMIL 2+// streams coming from SMIL 1.0 File Format plugins (that didn't have smarts// to look for default namespace which identifies the SMIL file version):HX_RESULTCSmil1Renderer::findSmilTagAndVersion(IHXBuffer* pFileChunk){    HX_RESULT rc = HXR_OK;    ULONG32 ulLen = 0;    if (!pFileChunk  ||  (ulLen=pFileChunk->GetSize()) < 6)    {	rc = HXR_FAILED;	goto cleanup;    }    rc = findValidDefaultNamespace(pFileChunk);cleanup:    return rc;}HX_RESULTCSmil1Renderer::setUpNextGenSmilRenderer(){    HX_RESULT rc = HXR_OK;    rc = CSmilRenderer::HXCreateInstance((IUnknown**)(&m_pNextGenSmilRenderer));    if (HXR_OK == rc  &&  m_pNextGenSmilRenderer)    {	IHXSmilToSmilRendererCommunicator* pSmilToSmilComm = NULL;	if (HXR_OK == m_pNextGenSmilRenderer->		QueryInterface(IID_IHXSmilToSmilRendererCommunicator,		(void**) &pSmilToSmilComm))	{	    if (HXR_OK ==		    pSmilToSmilComm->InitSmilStreamProxiedByOtherRenderer(		    m_pDefaultNamespace))	    {		rc = m_pNextGenSmilRenderer->InitPlugin(m_pContext);	    }	    HX_RELEASE(pSmilToSmilComm);	}	if (HXR_OK == rc)	{	    // /XXXEH- note that the REF parameters in GetPluginInfo() and	    // GetRendererInfo are set by the callee, but we can't do	    // anything with the values passed back as we've already set these	    // to our own vals and there's no way to re-set them in the core:	    BOOL bLoadMultiple = FALSE;	    const char* pszDescription = NULL;	    const char* pszCopyright = NULL;	    const char* pszMoreInfoURL = NULL;	    ULONG32 ulVersionNumber = 0;	    rc = m_pNextGenSmilRenderer->GetPluginInfo(bLoadMultiple,		    pszDescription, pszCopyright, pszMoreInfoURL,		    ulVersionNumber);	    if (HXR_OK == rc)	    {		const char** ppStreamMimeTypes = NULL;		ULONG32 ulInitialGranularity = m_ulGranularity;		rc = m_pNextGenSmilRenderer->GetRendererInfo(			ppStreamMimeTypes, ulInitialGranularity);	    }	    if (HXR_OK == rc)	    {		HX_ASSERT(m_bCSmil1StartStreamHasBeenCalled);		rc = m_pNextGenSmilRenderer->StartStream(m_pStream,			m_pPlayer);	    }	    if (HXR_OK == rc  &&  m_bCSmil1EndStreamHasBeenCalled)	    {		rc = m_pNextGenSmilRenderer->EndStream();	    }	    if (HXR_OK == rc)	    {		if (!m_pHeader)		{		    HX_ASSERT(m_pHeader);		    rc = HXR_UNEXPECTED;		}		else		{		    rc = m_pNextGenSmilRenderer->OnHeader(m_pHeader);		}	    }	    if (HXR_OK == rc  &&  m_bCSmil1GetDisplayTypeHasBeenCalled)	    {		HX_DISPLAY_TYPE ulFlags = HX_DISPLAY_NONE;		IHXBuffer* pBuffer = NULL;		rc = m_pNextGenSmilRenderer->GetDisplayType(ulFlags, pBuffer);		if (pBuffer)		{		    // /XXXEH- We can't use it here, so just clean it up:		    HX_DELETE(pBuffer);		}	    }	    if (HXR_OK == rc  &&  m_bCSmil1InitializeStatisticsHasBeenCalled)	    {		rc = m_pNextGenSmilRenderer->InitializeStatistics(m_ulRegistryID);	    }#if defined(DO_INIT_PERSISTENT_ON_NEXTGEN_SMILREND)	    if (HXR_OK == rc  &&  m_bCSmil1InitPersistenHasBeenCalled)	    {		// /NOTE: it's perfectly OK for m_pPersistentParent to be NULL		rc = m_pNextGenSmilRenderer->InitPersistent(			m_ulPersistentComponentID, m_uPersistentGroupID,			m_uPersistentTrackID, m_pPersistentParent);	    }#endif	    if (HXR_OK == rc  &&  m_bCSmil1GetElementPropertiesHasBeenCalled)	    {		IHXValues* pProperties = NULL;		// /XXXEH- TODO: we need to notify the original caller of this		// of the next-gen renderer's setting of pProperties.		rc = m_pNextGenSmilRenderer->GetElementProperties(			m_uGroupID, m_uTrackID, pProperties);	    }	    if (HXR_OK == rc  &&  m_bCSmil1RemoveLayoutSiteGroupHasBeenCalled)	    {		// /XXXEH- Need to handle this (unexpected) case by saving the 		// removed layout site group (which could differ from the		// add site layout group,  m_pLayoutSiteGroup (or not?):		HX_ASSERT(!m_bCSmil1RemoveLayoutSiteGroupHasBeenCalled);	    }	}    }    return rc;}#endif /* defined(HELIX_FEATURE_SMIL2). */

⌨️ 快捷键说明

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