📄 perscmgr.cpp
字号:
{
HXPersistentComponent* pHXPersistentComponent = NULL;
CHXSimpleList::Iterator i;
if (m_pPersistentChildList)
{
for(i = m_pPersistentChildList->Begin();i != m_pPersistentChildList->End();++i)
{
pHXPersistentComponent = (HXPersistentComponent*)(*i);
pHXPersistentComponent->Reset();
}
}
m_pComponentManager->m_pPlayer->m_pSourceMap->RemoveKey(m_pSourceInfo->m_pSource);
m_pComponentManager->m_pPlayer->m_bSourceMapUpdated = TRUE;
m_pSourceInfo->m_bIsPersistentSource = FALSE;
m_pSourceInfo->Stop();
m_bToBeClosed = TRUE;
return;
}
void
HXPersistentComponent::Remove()
{
HXPersistentComponent* pHXPersistentComponent = NULL;
CHXSimpleList::Iterator i;
if (m_pPersistentChildList)
{
for(i = m_pPersistentChildList->Begin();i != m_pPersistentChildList->End();++i)
{
pHXPersistentComponent = (HXPersistentComponent*)(*i);
pHXPersistentComponent->Remove();
HX_RELEASE(pHXPersistentComponent);
}
m_pPersistentChildList->RemoveAll();
}
if (m_pSourceInfo)
{
HX_ASSERT(!m_pSourceInfo->m_bIsPersistentSource);
m_pSourceInfo->CloseRenderers();
HX_DELETE(m_pSourceInfo);
}
HX_RELEASE(m_pProperties);
HX_RELEASE(m_pRendererAdviseSink);
HX_RELEASE(m_pGroupSink);
HX_RELEASE(m_pPersistentRenderer);
return;
}
HXPersistentComponentManager::HXPersistentComponentManager(HXPlayer* pPlayer)
: m_lRefCount(0)
, m_ulComponentIndex(0)
, m_nCurrentGroup(0)
, m_pPlayer(pPlayer)
, m_pRootPersistentComponent(NULL)
{
HX_ADDREF(m_pPlayer);
}
HXPersistentComponentManager::~HXPersistentComponentManager(void)
{
Close();
HX_RELEASE(m_pPlayer);
}
/*
* IUnknown methods
*/
STDMETHODIMP HXPersistentComponentManager::QueryInterface(REFIID riid, void** ppvObj)
{
QInterfaceList qiList[] =
{
{ GET_IIDHANDLE(IID_IHXPersistentComponentManager), (IHXPersistentComponentManager*)this },
{ GET_IIDHANDLE(IID_IHXGroupSink), (IHXGroupSink*)this },
{ GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXPersistentComponentManager*)this },
};
return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
}
STDMETHODIMP_(ULONG32) HXPersistentComponentManager::AddRef()
{
return InterlockedIncrement(&m_lRefCount);
}
STDMETHODIMP_(ULONG32) HXPersistentComponentManager::Release()
{
if (InterlockedDecrement(&m_lRefCount) > 0)
{
return m_lRefCount;
}
delete this;
return 0;
}
/************************************************************************
* Method:
* IHXPersistentComponentManager::CreatePersistentComponent
* Purpose:
* create persistent component
*/
STDMETHODIMP
HXPersistentComponentManager::CreatePersistentComponent(REF(IHXPersistentComponent*) pPersistentComponent)
{
pPersistentComponent = new HXPersistentComponent(this);
if (!pPersistentComponent)
{
return HXR_OUTOFMEMORY;
}
return HXR_OK;
}
/************************************************************************
* Method:
* IHXPersistentComponentManager::AddPersistentComponent
* Purpose:
* add persistent component
*/
STDMETHODIMP
HXPersistentComponentManager::AddPersistentComponent(IHXPersistentComponent* pPersistentComponent)
{
HX_RESULT rc = HXR_OK;
BOOL bFound = FALSE;
HXSource* pSource = NULL;
SourceInfo* pSourceInfo = NULL;
RendererInfo* pRendInfo = NULL;
HXPersistentComponent* pHXPersistentComponent = NULL;
HXPersistentComponent* pHXPersistentParentComponent = NULL;
IHXValues* pProperties = NULL;
IHXGroup* pGroup = NULL;
IHXPersistentComponent* pPersistentParentComponent = NULL;
IHXPersistentRenderer* pPersistentRenderer = NULL;
IHXRenderer* pRenderer = NULL;
CHXMapPtrToPtr::Iterator ndxSource;
CHXMapLongToObj::Iterator ndxRend;
pHXPersistentComponent = (HXPersistentComponent*)pPersistentComponent;
if (!pHXPersistentComponent || !pHXPersistentComponent->m_bInitialized)
{
rc = HXR_FAILED;
goto cleanup;
}
pPersistentRenderer = pHXPersistentComponent->m_pPersistentRenderer;
if (HXR_OK != pPersistentRenderer->QueryInterface(IID_IHXRenderer, (void**)&pRenderer))
{
rc = HXR_INVALID_PARAMETER;
goto cleanup;
}
// find component's source info - better way?
ndxSource = m_pPlayer->m_pSourceMap->Begin();
for (; ndxSource != m_pPlayer->m_pSourceMap->End() && !bFound; ++ndxSource)
{
pSourceInfo = (SourceInfo*)(*ndxSource);
pSource = pSourceInfo->m_pSource;
ndxRend = pSourceInfo->m_pRendererMap->Begin();
for (; ndxRend != pSourceInfo->m_pRendererMap->End(); ++ndxRend)
{
pRendInfo = (RendererInfo*) (*ndxRend);
if (pRendInfo->m_pRenderer == pRenderer)
{
bFound = TRUE;
break;
}
}
}
if (!bFound)
{
rc = HXR_FAILED;
goto cleanup;
}
if (!m_pRootPersistentComponent)
{
m_ulComponentIndex = 0;
m_pRootPersistentComponent = pHXPersistentComponent;
m_pRootPersistentComponent->AddRef();
// XXX HP TBD - when we support timing attributes on a SMIL URL
// for now, we resets all timing attributes on the root persistent
// component since there could be a case when the same timing values
// are specified in a CGI URL sent to the player
if (pSourceInfo && pSourceInfo->m_pSource)
{
IHXValues* pValues = new CHXHeader();
pValues->AddRef();
pValues->SetPropertyULONG32("Start", 0);
pValues->SetPropertyULONG32("End", 0);
pValues->SetPropertyULONG32("Delay", 0);
pValues->SetPropertyULONG32("Duration", 0);
pSourceInfo->m_pSource->UpdatePlayTimes(pValues);
HX_RELEASE(pValues);
}
}
else if (HXR_OK == GetPersistentComponent(pSourceInfo->m_ulPersistentComponentID, pPersistentParentComponent))
{
pHXPersistentParentComponent = (HXPersistentComponent*)pPersistentParentComponent;
// XXX HP
// to workaround the screwed-up layout handling within nested meta, we call
// CleanupLayout() on the alternated persistent source if we haven't called
// CleanupLayout() yet. this is a no-worse-than-before temporary solution.
// REMOVE THIS AFTER PROPERLY HANDLING LAYOUT WITHIN NESTED META
if (pSourceInfo->m_bAltURL && !pHXPersistentParentComponent->m_bCleanupLayoutCalled)
{
m_pPlayer->CleanupLayout();
pHXPersistentParentComponent->m_bCleanupLayoutCalled = TRUE;
}
if (!pHXPersistentParentComponent->m_pPersistentChildList)
{
pHXPersistentParentComponent->m_pPersistentChildList = new CHXSimpleList();
}
pHXPersistentParentComponent->m_pPersistentChildList->AddTail(pHXPersistentComponent);
pHXPersistentComponent->AddRef();
pHXPersistentComponent->m_pPersistentParent = pHXPersistentParentComponent;
pHXPersistentParentComponent->AddRef();
}
pSourceInfo->m_bIsPersistentSource = TRUE;
if (HXR_OK == pHXPersistentComponent->m_pPersistentRenderer->GetPersistentProperties(pProperties))
{
pProperties->GetPropertyULONG32("PersistentType", pHXPersistentComponent->m_ulPersistentType);
}
HX_RELEASE(pProperties);
pSourceInfo->m_ulPersistentComponentSelfID = m_ulComponentIndex;
// new persistent info
pHXPersistentComponent->m_pSourceInfo = pSourceInfo;
pHXPersistentComponent->m_ulComponentID = m_ulComponentIndex;
// get the persistent properties(track properties)
if (HXR_OK == m_pPlayer->m_pGroupManager->GetGroup(pSourceInfo->m_uGroupID, pGroup))
{
pGroup->GetTrack(pSourceInfo->m_uTrackID, pHXPersistentComponent->m_pProperties);
}
HX_RELEASE(pGroup);
pPersistentRenderer->InitPersistent(m_ulComponentIndex,
pSourceInfo->m_uGroupID,
pSourceInfo->m_uTrackID,
pHXPersistentParentComponent?pHXPersistentParentComponent->m_pPersistentRenderer:((IHXPersistentRenderer*) NULL));
m_ulComponentIndex++;
m_pPlayer->m_pGroupManager->PersistentComponentAdded(pSourceInfo->m_uGroupID, pSourceInfo->m_uTrackID);
cleanup:
HX_RELEASE(pPersistentParentComponent);
HX_RELEASE(pRenderer);
return rc;
}
/************************************************************************
* Method:
* IHXPersistentComponentManager::RemovePersistentComponent
* Purpose:
* remove persistent component
*/
STDMETHODIMP
HXPersistentComponentManager::RemovePersistentComponent(UINT32 ulPersistentComponentID)
{
HX_RESULT rc = HXR_OK;
LISTPOSITION lPosition = NULL;
HXPersistentComponent* pHXPersistentParentComponent = NULL;
HXPersistentComponent* pHXPersistentComponent = NULL;
IHXPersistentComponent* pPersistentComponent = NULL;
if (HXR_OK == GetPersistentComponent(ulPersistentComponentID, pPersistentComponent))
{
pHXPersistentComponent = (HXPersistentComponent*)pPersistentComponent;
pHXPersistentParentComponent = pHXPersistentComponent->m_pPersistentParent;
if (pHXPersistentParentComponent)
{
pHXPersistentComponent->Remove();
HX_ASSERT(pHXPersistentParentComponent->m_pPersistentChildList &&
pHXPersistentParentComponent->m_pPersistentChildList->GetCount());
lPosition = pHXPersistentParentComponent->m_pPersistentChildList->Find(pHXPersistentComponent);
HX_ASSERT(lPosition);
pHXPersistentParentComponent->m_pPersistentChildList->RemoveAt(lPosition);
HX_RELEASE(pHXPersistentComponent);
}
}
HX_RELEASE(pPersistentComponent);
if (m_pRootPersistentComponent &&
m_pRootPersistentComponent->m_ulComponentID == ulPersistentComponentID)
{
HX_RELEASE(m_pRootPersistentComponent);
}
return rc;
}
/************************************************************************
* Method:
* IHXPersistentComponentManager::GetPersistentComponent
* Purpose:
* get persistent component information
*/
STDMETHODIMP
HXPersistentComponentManager::GetPersistentComponent(UINT32 ulPersistentComponentID,
REF(IHXPersistentComponent*) pPersistentComponent)
{
HX_RESULT rc = HXR_FAILED;
pPersistentComponent = NULL;
if (m_pRootPersistentComponent)
{
rc = m_pRootPersistentComponent->GetPersistentComponent(ulPersistentComponentID, pPersistentComponent);
}
return rc;
}
/************************************************************************
* Method:
* IHXPersistentComponentManager::AttachPersistentComponentLayout
* Purpose:
* get persistent component information
*/
STDMETHODIMP
HXPersistentComponentManager::AttachPersistentComponentLayout(IUnknown* pLSG,
IHXValues* pProps)
{
HX_RESULT rc = HXR_OK;
IHXSiteUser* pSiteUser = NULL;
if (m_pPlayer)
{
#if defined(HELIX_FEATURE_VIDEO)
if (HXR_OK == pLSG->QueryInterface(IID_IHXSiteUser, (void**)&pSiteUser))
{
rc = m_pPlayer->m_pSiteManager->HookupSingleSiteByPlayToFrom(pSiteUser, pProps, FALSE);
}
HX_RELEASE(pSiteUser);
#endif //HELIX_FEATURE_VIDEO
}
return rc;
}
/************************************************************************
* Method:
* IHXGroupSink::GroupAdded
* Purpose:
* Notification of a new group being added to the presentation.
*/
STDMETHODIMP
HXPersistentComponentManager::GroupAdded(UINT16 /*IN*/ uGroupIndex,
IHXGroup* /*IN*/ pGroup)
{
HX_RESULT rc = HXR_OK;
UINT32 ulPersistentComponentID = 0;
IHXValues* pProperties = NULL;
IHXGroupSink* pGroupSink = NULL;
IHXPersistentComponent* pPersistentComponent = NULL;
pProperties = pGroup->GetGroupProperties();
if (pProperties)
{
if (HXR_OK == pProperties->GetPropertyULONG32("PersistentComponentID", ulPersistentComponentID))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -