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

📄 srcinfo.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	    {		theErr = HXR_OK;		HX_RELEASE(pRendInfo->m_pRenderer);		goto tryNextRendererForSameMimeType;	    }	    else	    {		if (!theFinalErr)		{		    bSourceInitialized = FALSE;		    theFinalErr = theErr;		}	    		// merge any upgrade requests for this source to the player		m_pSource->MergeUpgradeRequest(bAddDefaultUpgrade, pMimeTypeBuffer ? (char*) pMimeTypeBuffer->GetBuffer() : (char*)NULL);		theErr = HXR_OK;	    }	}    }exit:    if (theErr && !theFinalErr)    {	bSourceInitialized = FALSE;	theFinalErr = theErr;    }#if defined(HELIX_FEATURE_BASICGROUPMGR)    if(!theFinalErr &&        m_bTrackStartedToBeSent)    {    	m_pPlayer->m_pGroupManager->TrackStarted(m_uGroupID, m_uTrackID);  	m_bTrackStartedToBeSent = FALSE;	if (m_pPeerSourceInfo)	{	    m_pPeerSourceInfo->m_bTrackStartedToBeSent = FALSE;	}    }#endif /* HELIX_FEATURE_BASICGROUPMGR */    HX_RELEASE(pMimeTypeBuffer);    HX_RELEASE(pUnkRenderer);    if (!theFinalErr)    {	theFinalErr = InitializeRenderersExt(bSourceInitialized);    }    if (!theFinalErr && bSourceInitialized)    {	m_bInitialized = TRUE;	  	// renderers initialized...clear any pending upgrade requests for this source!	m_pSource->ClearUpgradeRequest();	if (m_bAudioDeviceReflushHint)	{	    m_pSource->SetAudioDeviceReflushHint();	}	// set the soundLevel != 100 by default	if (m_uSoundLevel != 100)	{	    m_pSource->SetSoundLevel(m_uSoundLevel, FALSE);	}	/* Enter the order of the stream numbers in which they will be 	 * scheduled for GetEvent() calls	 */	if (NULL == m_pCurrentScheduleList)	{	    m_pCurrentScheduleList = new CHXSimpleList;	}	CHXMapLongToObj::Iterator ndxRend = m_pRendererMap->Begin();	for (; ndxRend != m_pRendererMap->End(); ++ndxRend)	{	    RendererInfo* pRendInfo = (RendererInfo*)(*ndxRend);	    m_pCurrentScheduleList->AddTail((void*) pRendInfo);	}    }    return theFinalErr;}HX_RESULTSourceInfo::InitializeRenderersExt(BOOL& bSourceInitialized){    return HXR_OK;}HX_RESULTSourceInfo::SetupStreams(){    if (m_bAreStreamsSetup)    {	return HXR_OK;    }    HX_RESULT	    theErr          = HXR_OK;    IHXValues*	    pHeader         = NULL;    HXStream*	    pStream         = NULL;    STREAM_INFO*    pStreamInfo     = NULL;    RendererInfo*   pRendInfo       = NULL;    HXSource*	    pSource	    = m_pSource;    if (!pSource->IsInitialized())    {	HX_ASSERT(FALSE);	return HXR_UNEXPECTED;    }    UINT16 uNumStreams = pSource->GetNumStreams();    HX_ASSERT(m_pRendererMap->IsEmpty() == TRUE);    if (m_pRendererMap->IsEmpty() && uNumStreams > 0 &&	(UINT32) uNumStreams < m_pRendererMap->GetHashTableSize())    {	m_pRendererMap->InitHashTable((UINT32) uNumStreams);    }        for (UINT16 i=0; i < uNumStreams; i++)    {	UINT32	ulStreamNumber = 0;	pHeader         = NULL;	pStream         = NULL;	pSource->GetStreamHeaderInfo(i, pHeader);	if (!pHeader)	{	    GOTOEXITONERROR(theErr = HXR_FAILED, exit);	    	}	pStream = new HXStream;	if (!pStream)	{	    theErr = HXR_OUTOFMEMORY;	    goto exit;	}	pStream->AddRef();	theErr = pStream->Init(m_pPlayer, pSource, pHeader);		GOTOEXITONERROR(theErr, exit);	pHeader->GetPropertyULONG32("StreamNumber", ulStreamNumber);	if (HXR_OK != pSource->GetStreamInfo(ulStreamNumber, pStreamInfo) || !pStreamInfo)	{	    GOTOEXITONERROR(theErr = HXR_FAILED, exit);	}	HX_RELEASE(pHeader);	pRendInfo = NewRendererInfo();	if (!pRendInfo)	{	    theErr = HXR_OUTOFMEMORY;	    GOTOEXITONERROR(theErr, exit);	}	// get properties of the header	pRendInfo->m_pRenderer          = NULL;	pRendInfo->m_pStreamInfo        = pStreamInfo;	pRendInfo->m_ulGranularity      = 0;	pRendInfo->m_ulDuration         = pStreamInfo->m_ulDuration;	pRendInfo->m_BufferingReason    = BUFFERING_START_UP;                struct timeSyncParamStruct obj = {this, pRendInfo};        pRendInfo->m_pTimeSyncCallback  = new CTimeSyncCallback((void*)&obj, (fGenericCBFunc)TimeSyncCallback);	pRendInfo->m_pStream		= pStream;	pRendInfo->m_pStream->AddRef();	if (m_ulSourceDuration < pStreamInfo->m_ulDuration)	{	    m_ulSourceDuration = pStreamInfo->m_ulDuration;	}    	if (pRendInfo->m_pTimeSyncCallback)	{	    pRendInfo->m_pTimeSyncCallback->AddRef();	}	else	{	    theErr = HXR_OUTOFMEMORY;	    GOTOEXITONERROR(theErr, exit);	}	m_pRendererMap->SetAt(pStreamInfo->m_uStreamNumber, (void*) pRendInfo);	if (pStream)	{	    if (pStream->IsSureStream())	    {		pSource->m_bSureStreamClip = TRUE;	    }	    pSource->AddHXStream(pStream);	    HX_RELEASE(pStream);	}    }exit:    HX_RELEASE(pStream);    HX_RELEASE(pHeader);    if (!theErr)    {	m_bAreStreamsSetup = TRUE;    }    return theErr;}RendererInfo* SourceInfo::NewRendererInfo(){    return (new RendererInfo());}HX_RESULTSourceInfo::SetupRenderer(RendererInfo*& pRendInfo, IHXRenderer*& pRenderer, 			 STREAM_INFO*& pStreamInfo, HXStream*& pStream){    HX_RESULT       theErr              = HXR_OK;    ULONG32         ulSyncGranularity   = DEFAULT_TIMESYNC_GRANULARITY;    BOOL	    bLiveSource		= FALSE;    HXSource*      pSource             = m_pSource;    IHXPlugin*     pPlugin             = NULL;    STREAM_INFO*    pSrcStreamInfo	= NULL;    IHXStatistics* pStatistics		= NULL;    const char**    ppTmpMimeType = 0;    pRendInfo->m_pRenderer          = pRenderer;    if (HXR_OK != pRenderer->QueryInterface(IID_IHXPlugin,(void**)&pPlugin))    {	theErr = HXR_NOT_INITIALIZED;    }    else    {	/* Initialize the plugin for use */	if (HXR_OK != pPlugin->InitPlugin((IUnknown*) (IHXStreamSource*) m_pSource))	{	    theErr = HXR_NOT_INITIALIZED;	}	pPlugin->Release();    }    GOTOEXITONERROR(theErr, exit);#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)    if (HXR_OK == pRenderer->QueryInterface(IID_IHXStatistics, (void**) &pStatistics))    {	if (HXR_OK == pSource->GetStreamInfo(pRendInfo->m_pStreamInfo->m_uStreamNumber, pSrcStreamInfo) &&	    pSrcStreamInfo && pSrcStreamInfo->m_pStats)	{	    pStatistics->InitializeStatistics(pSrcStreamInfo->m_pStats->m_pRenderer->m_ulRegistryID);	}	HX_RELEASE (pStatistics);    }#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */    theErr = pRenderer->StartStream(pStream, m_pPlayer);    GOTOEXITONERROR(theErr, exit);    theErr = pRenderer->OnHeader(pStreamInfo->m_pHeader);    GOTOEXITONERROR(theErr, exit);    // start the stream    /* get the minimum granularity */    pRenderer->GetRendererInfo(ppTmpMimeType, ulSyncGranularity);    /* sanity check */    if (ulSyncGranularity < MINIMUM_TIMESYNC_GRANULARITY)    {	ulSyncGranularity = MINIMUM_TIMESYNC_GRANULARITY;    }    if (ulSyncGranularity < m_pPlayer->m_ulLowestGranularity)    {	m_pPlayer->m_ulLowestGranularity = ulSyncGranularity;    }    // get properties of the header    pStreamInfo->m_ulDelay  	    = m_pSource->GetDelay();    pRendInfo->m_ulGranularity      = ulSyncGranularity;    pRendInfo->m_ulDuration         = pStreamInfo->m_ulDuration;    // OnHeader may have overriddden the m_ulPreroll from the stream header    // if it was too big or too small or not set.    ULONG32 ulPreroll;    if (HXR_OK == pStreamInfo->m_pHeader->GetPropertyULONG32("Preroll", ulPreroll))    {	pStreamInfo->BufferingState().SetPreroll(ulPreroll);    }    // check if renderer is interrupt safe    IHXInterruptSafe* pInterruptSafe;    if (HXR_OK == pRenderer->QueryInterface(IID_IHXInterruptSafe,(void**)&pInterruptSafe))    {	HX_ASSERT(pInterruptSafe) ;	if (pInterruptSafe)	{	    pRendInfo->m_bInterruptSafe = pInterruptSafe->IsInterruptSafe();	    pInterruptSafe->Release();	}    }            m_pPlayer->m_bResumeOnlyAtSystemTime |= (!pRendInfo->m_bInterruptSafe);        /* Enter to the begin list so that we can call Begin at the right time */    m_pPlayer->EnterToBeginList(pRendInfo);    // notify the persistent renderer(source) who implements    // IHXRendererAdviseSink to monitor the status of its tracks    if (m_pRendererAdviseSink && pStream && !m_bIsPersistentSource)    {	bLiveSource = pSource->IsLive();	if (m_bIndefiniteDuration)	{	    m_ulTrackDuration = MAX_UINT32;	}	else		{		    m_ulTrackDuration = m_pSource->GetDuration();	}	if (!m_bIsTrackDurationSet)	{	    	    m_bIsTrackDurationSet = TRUE;	    m_pRendererAdviseSink->TrackDurationSet(m_uGroupID,						    m_uTrackID,						    m_ulTrackDuration,						    pStreamInfo->m_ulDelay,						    bLiveSource);	}    }	    if (m_pRendererAdviseSink && pStream)    {	IUnknown* pUnk = 0;	if(HXR_OK == pStream->QueryInterface(IID_IUnknown, (void**)&pUnk))	{	    /* 	     * construct the IHXValues info for the RendererInitialized call	     */	    IHXValues* pValues = new CHXHeader;	    pValues->AddRef();	    pValues->SetPropertyULONG32("GroupIndex", m_uGroupID);	    pValues->SetPropertyULONG32("TrackIndex", m_uTrackID);	    pValues->SetPropertyULONG32("Delay", pStreamInfo->m_ulDelay);	    	    /* We should really fix SMIL renderer to look at MAX duration	     * For now, we will pass max duration for all the renderers.	     * The only case where the duration is different is with image maps 	     * in video/audio stream.	     */	    pValues->SetPropertyULONG32("Duration", m_ulTrackDuration);	    	    pValues->SetPropertyULONG32("LiveSource", bLiveSource);	    if (!m_id.IsEmpty())	    {    		IHXBuffer* pBuffer = new CHXBuffer();		pBuffer->AddRef();    		pBuffer->Set((const UCHAR*)(const char*)m_id, m_id.GetLength()+1);		pValues->SetPropertyCString("id", pBuffer);		HX_RELEASE(pBuffer);	    }	    HX_RESULT rc = m_pRendererAdviseSink->RendererInitialized(pRenderer, pUnk, pValues);	    pValues->Release();	    pUnk->Release();	}    }    // XXX HP we need to re-examine how the SMIL renderer's layout site     // setup work!!    if (m_bIsPersistentSource)    {	m_pPlayer->m_bSetupLayoutSiteGroup = FALSE;    }exit:    return theErr;}HX_RESULTSourceInfo::InitializeAndSetupRendererSites(){    HX_RESULT theErr = HXR_OK;    BOOL bInitialized = FALSE;    if (HXR_OK != m_lastError)    {        return m_lastError;    }    if (m_bLocked)    {	return HXR_OK;    }    m_bLocked = TRUE;    m_pMutex->Lock();    theErr = InitializeRenderers(bInitialized);    if (!theErr && m_bInitialized)    {	/* This source may have audio streams */	if (!m_pPlayer->m_ulMinimumAudioPreroll)	{	    m_pPlayer->m_ulMinimumAudioPreroll = 		m_pPlayer->m_pAudioPlayer->GetInitialPushdown();	}	UINT32 ulMinimumStartingPreroll = m_pPlayer->m_pAudioPlayer->GetInitialPushdown(TRUE);	m_pSource->SetMinimumPreroll(m_pPlayer->m_ulMinimumAudioPreroll, ulMinimumStartingPreroll);#if defined(HELIX_FEATURE_VIDEO)	/* Set all the renderer sites */	SetupRendererSites(!m_pPlayer->m_bSetupLayoutSiteGroup);	/* Did we have to call BeginChangeLayout? */	if (m_pPlayer->m_pSiteSupplier			&& 	    !m_pPlayer->m_bBeginChangeLayoutTobeCalled	&&	    // XXX HP we will not call DoneChangeLayout on persistent source until	    //	      the actual source has been initialized. this fixed the resizing	    //	      problem during stop/play on SMIL in RAM	    //	      the other DoneChangeLayout in HXPlayer won't be called either	    //	      since we set m_bSetupLayoutSiteGroup=FALSE in SetupRenderer() of	    //	      the persistent source	    !m_bIsPersistentSource)	{	    /*	     * At this point all renderers are layed out!	     */	    m_pPlayer->m_bBeginChangeLayoutTobeCalled	= TRUE;	    m_pPlayer->m_pSiteSupplier->DoneChangeLayout();	}#endif /* HELIX_FEATURE_VIDEO */	if (m_pSource->TryResume())	{	    m_pPlayer->RegisterSourcesDone();	}	Begin();    }    if (HXR_OK != theErr && HXR_OK == m_lastError)    {        m_lastError = theErr;    }    m_pMutex->Unlock();    m_bLocked = FALSE;    return theErr;}voidSourceInfo::RenderersCleanup(){    CHXMapLongToObj::Iterator ndxRend = m_pRendererMap->Begin();    for (; ndxRend != m_pRendererMap->End(); ++ndxRend)    {	RendererInfo* pRendInfo = (RendererInfo*)(*ndxRend);	LONG32	      lStreamNumber = ndxRend.get_key();	if(m_pRendererAdviseSink && pRendInfo->m_pRenderer)	{	    IHXValues* pValues = new CHXHeader;	    pValues->AddRef();	    pValues->SetPropertyULONG32("GroupIndex", m_uGroupID);	    pValues->SetPropertyULONG32("TrackIndex", m_uTrackID);	    pValues->SetPropertyULONG32("StreamNumber", lStreamNumber);	    if (!m_id.IsEmpty())	    {    		IHXBuffer* pBuffer = new CHXBuffer();		pBuffer->AddRef();    		pBuffer->Set((const UCHAR*)(

⌨️ 快捷键说明

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