📄 srcinfo.cpp
字号:
{ 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 + -