qttrkmgr.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 1,072 行 · 第 1/2 页
CPP
1,072 行
{
if (m_pStreamToTrackMap[uStrmIdx].m_uGroup == uGroup)
{
m_pStreamToTrackMap[uStrmIdx].m_bActive = FALSE;
}
}
}
m_pStreamToTrackMap[uStreamNum].m_bActive = TRUE;
retVal = HXR_OK;
}
}
return retVal;
}
/****************************************************************************
* Unsubscribe
*/
HX_RESULT CQTTrackManager::Unsubscribe(UINT16 uStreamNum)
{
HX_RESULT retVal = HXR_UNEXPECTED;
if (!m_bSubscriptionWindowClosed)
{
HX_ASSERT(uStreamNum < m_uNumStreams);
retVal = HXR_FAIL;
if (uStreamNum < m_uNumStreams)
{
m_pStreamToTrackMap[uStreamNum].m_bActive = FALSE;
retVal = HXR_OK;
}
}
return retVal;
}
#else // QTCONFIG_ALTERNATE_STREAMS
HX_RESULT CQTTrackManager::AddStreamToGroup(UINT16 uStreamNumber,
UINT16 uGroup,
ULONG32 ulBitrate)
{
return HXR_NOTIMPL;
}
HX_RESULT CQTTrackManager::SubscribeDefault(void)
{
return HXR_NOTIMPL;
}
HX_RESULT CQTTrackManager::Subscribe(UINT16 uStreamNum)
{
return HXR_NOTIMPL;
}
HX_RESULT CQTTrackManager::Unsubscribe(UINT16 uStreamNum)
{
return HXR_NOTIMPL;
}
#endif // QTCONFIG_ALTERNATE_STREAMS
/****************************************************************************
* RemoveInactiveStreams
*/
HX_RESULT CQTTrackManager::RemoveInactiveStreams(BOOL bLeaveReferences)
{
HX_RESULT retVal = HXR_FAIL;
HX_ASSERT(m_pStreamToTrackMap);
UINT16 uActiveStreamCount = GetNumActiveStreams();
if (uActiveStreamCount > 0)
{
CQTStream* pNewStreamToTrackMap = NULL;
retVal = HXR_OK;
if (!bLeaveReferences)
{
pNewStreamToTrackMap = new CQTStream [uActiveStreamCount];
retVal = HXR_OUTOFMEMORY;
if (pNewStreamToTrackMap)
{
retVal = HXR_OK;
}
}
if (SUCCEEDED(retVal))
{
UINT16 uStrmIdx;
UINT16 uNewStrmIdx = 0;
for (uStrmIdx = 0; uStrmIdx < m_uNumStreams; uStrmIdx++)
{
if (m_pStreamToTrackMap[uStrmIdx].m_bActive)
{
if (!bLeaveReferences)
{
HX_ASSERT(uNewStrmIdx < uActiveStreamCount);
pNewStreamToTrackMap[uNewStrmIdx] =
m_pStreamToTrackMap[uStrmIdx];
uNewStrmIdx++;
}
}
else
{
ReleaseTrack(m_pStreamToTrackMap[uStrmIdx].m_pQTTrack);
}
}
if (!bLeaveReferences)
{
delete [] m_pStreamToTrackMap;
m_pStreamToTrackMap = pNewStreamToTrackMap;
m_uNumStreams = uActiveStreamCount;
}
}
m_bSubscriptionWindowClosed = TRUE;
}
return retVal;
}
/****************************************************************************
* IsStreamTrack
*/
BOOL CQTTrackManager::IsStreamTrack(CQTTrack* pTrack)
{
UINT16 uStreamCount = 0;
CQTStream* pStreamTracer = m_pStreamToTrackMap;
HX_ASSERT(pTrack);
while (uStreamCount < m_uNumStreams)
{
if (pTrack == pStreamTracer->m_pQTTrack)
{
return TRUE;
}
pStreamTracer++;
uStreamCount++;
}
return FALSE;
}
UINT16 CQTTrackManager::GetTrackStreamNum(CQTTrack* pTrack)
{
UINT16 uStreamCount = 0;
CQTStream* pStreamTracer = m_pStreamToTrackMap;
HX_ASSERT(pTrack);
while (uStreamCount < m_uNumStreams)
{
if (pTrack == pStreamTracer->m_pQTTrack)
{
return uStreamCount;
}
pStreamTracer++;
uStreamCount++;
}
return INV_STREAM_NUM;
}
/****************************************************************************
* GetTrackById
*/
CQTTrack* CQTTrackManager::GetTrackById(ULONG32 ulTrackID)
{
UINT16 uTrackCount = 0;
CQTTrackTable* pTableTracer = m_pTrackTable;
while (uTrackCount < m_uNumTracks)
{
if (pTableTracer->m_pTrack && (ulTrackID == pTableTracer->m_pTrack->GetID()))
{
return pTableTracer->m_pTrack;
}
uTrackCount++;
pTableTracer++;
}
return NULL;
}
/****************************************************************************
* GetAtomById
*/
CQTAtom* CQTTrackManager::GetTrackAtomById(ULONG32 ulTrackID)
{
UINT16 uTrackCount = 0;
CQTTrackTable* pTableTracer = m_pTrackTable;
while (uTrackCount < m_uNumTracks)
{
if (ulTrackID == pTableTracer->m_pTrack->GetID())
{
return pTableTracer->m_pTrackAtom;
}
uTrackCount++;
pTableTracer++;
}
return NULL;
}
/****************************************************************************
* GetTrackAtomHdlr
*/
CQT_hdlr_Atom* CQTTrackManager::GetTrackAtomHdlr(CQT_trak_Atom* pTrakAtom)
{
CQT_mdia_Atom* pMdiaAtom;
CQT_hdlr_Atom* pHdlrAtom = NULL;
pMdiaAtom = (CQT_mdia_Atom*) pTrakAtom->FindPresentChild(QT_mdia);
if (pMdiaAtom)
{
pHdlrAtom = (CQT_hdlr_Atom*) pMdiaAtom->FindPresentChild(QT_hdlr);
}
return pHdlrAtom;
}
/****************************************************************************
* GetTrackAtomStbl
*/
CQT_stbl_Atom* CQTTrackManager::GetTrackAtomStbl(CQT_trak_Atom* pTrakAtom)
{
CQT_mdia_Atom* pMdiaAtom;
CQT_hdlr_Atom* pMinfAtom;
CQT_stbl_Atom* pStblAtom = NULL;
pMdiaAtom = (CQT_mdia_Atom*) pTrakAtom->FindPresentChild(QT_mdia);
if (pMdiaAtom)
{
pMinfAtom = (CQT_hdlr_Atom*) pMdiaAtom->FindPresentChild(QT_minf);
if (pMinfAtom)
{
pStblAtom = (CQT_stbl_Atom*) pMinfAtom->FindPresentChild(QT_stbl);
}
}
return pStblAtom;
}
/****************************************************************************
* IsHintTrackAtom
*/
BOOL CQTTrackManager::IsHintTrackAtom(CQT_trak_Atom* pTrakAtom)
{
CQT_hdlr_Atom* pHdlrAtom = GetTrackAtomHdlr(pTrakAtom);
if (pHdlrAtom &&
/*** MBO: To strict for some files
(pHdlrAtom->Get_CompType() == QT_mhlr) &&
***/
(pHdlrAtom->Get_CompSubtype() == QT_hint))
{
return TRUE;
}
return FALSE;
}
/****************************************************************************
* IsNonEmptyTrackAtom
*/
BOOL CQTTrackManager::IsNonEmptyTrackAtom(CQT_trak_Atom* pTrakAtom)
{
CQT_SampleSize_Manager sampleSize;
CQT_stbl_Atom* pStblAtom = GetTrackAtomStbl(pTrakAtom);
if (pStblAtom)
{
if (sampleSize.Init(pStblAtom) == HXR_OK)
{
return TRUE;
}
}
return FALSE;
}
/****************************************************************************
* Private Methods
*/
/****************************************************************************
* AddTracks
*/
void CQTTrackManager::AddTracks(CQTAtom *pRootAtom)
{
UINT16 uChildCount;
if (pRootAtom->GetType() == QT_trak)
{
BOOL bAdd = TRUE;
if (IsHintTrackAtom((CQT_trak_Atom *) pRootAtom))
{
bAdd = IsNonEmptyTrackAtom((CQT_trak_Atom*) pRootAtom);
if (bAdd)
{
m_pHintTrackIdxList->AddTail(
(void *) m_pTrackAtomList->GetCount());
}
}
if (bAdd)
{
m_pTrackAtomList->AddTail(pRootAtom);
pRootAtom->AddRef();
}
}
else if (((pRootAtom->GetType() == QT_HXROOT) ||
(pRootAtom->GetType() == QT_moov)) &&
(uChildCount = pRootAtom->GetPresentChildCount()))
{
CQTAtom::ChildIterator i = pRootAtom->BeginChildren();
do
{
AddTracks(*i);
if ((--uChildCount) == 0)
{
break;
}
++i;
} while (TRUE);
}
else if (pRootAtom->GetType() == QT_iods)
{
HX_ASSERT(m_pIodsAtom == NULL);
if (m_pIodsAtom == NULL)
{
m_pIodsAtom = (CQT_iods_Atom*) pRootAtom;
m_pIodsAtom->AddRef();
m_FType = QT_FTYPE_MP4;
}
}
else if (pRootAtom->GetType() == QT_ftyp)
{
HX_ASSERT(m_pFtypAtom == NULL);
if (m_pFtypAtom == NULL)
{
UINT32 ulBrand;
BOOL bKeepLooking;
UINT32 ulCompBrandIdx = 0;
UINT32 ulNumCompBrands = 0;
m_pFtypAtom = (CQT_ftyp_Atom*) pRootAtom;
m_pFtypAtom->AddRef();
ulBrand = m_pFtypAtom->Get_MajorBrand();
ulNumCompBrands = m_pFtypAtom->Get_NumCompatibleBrands();
do
{
bKeepLooking = FALSE;
switch (ulBrand)
{
case QT_isom:
case QT_3gp4:
case QT_3gp5:
case QT_mp41:
case QT_mp42:
case QT_mmp4:
case QT_m4a:
m_FType = QT_FTYPE_MP4;
break;
default:
if (ulCompBrandIdx < ulNumCompBrands)
{
ulBrand = m_pFtypAtom->Get_CompatibleBrand(ulCompBrandIdx);
ulCompBrandIdx++;
bKeepLooking = TRUE;
}
break;
}
} while (bKeepLooking);
}
}
}
/****************************************************************************
* DeleteTrackAtomList
*/
void CQTTrackManager::DeleteTrackAtomList(void)
{
if (m_pTrackAtomList)
{
CQTAtom *pAtom;
while (!m_pTrackAtomList->IsEmpty())
{
pAtom = (CQTAtom*) m_pTrackAtomList->RemoveHead();
HX_ASSERT(pAtom);
pAtom->Release();
}
delete m_pTrackAtomList;
m_pTrackAtomList = NULL;
}
}
/****************************************************************************
* Clear
*/
void CQTTrackManager::Clear(void)
{
HX_VECTOR_DELETE(m_pTrackTable);
HX_VECTOR_DELETE(m_pStreamToTrackMap);
DeleteTrackAtomList();
HX_DELETE(m_pHintTrackIdxList);
HX_RELEASE(m_pIodsAtom);
HX_RELEASE(m_pFtypAtom);
m_uNumTracks = 0;
m_uNumStreams = 0;
}
/****************************************************************************
* GetNumActiveStreams
*/
UINT16 CQTTrackManager::GetNumActiveStreams(void)
{
UINT16 uStrmIdx;
UINT16 uActiveCount = 0;
HX_ASSERT(m_pStreamToTrackMap);
for (uStrmIdx = 0; uStrmIdx < m_uNumStreams; uStrmIdx++)
{
if (m_pStreamToTrackMap[uStrmIdx].m_bActive)
{
uActiveCount++;
}
}
return uActiveCount;
}
/****************************************************************************
* ReleaseTrack
*/
void CQTTrackManager::ReleaseTrack(CQTTrack* pQTTrack)
{
// Remove Track from the Track Table
if (m_pTrackTable)
{
UINT16 uTrackCount = 0;
CQTTrackTable* pTableTracer = m_pTrackTable;
while (uTrackCount < m_uNumTracks)
{
if (pTableTracer->m_pTrack == pQTTrack)
{
HX_RELEASE(pTableTracer->m_pTrack);
HX_RELEASE(pTableTracer->m_pTrackAtom);
break;
}
uTrackCount++;
pTableTracer++;
}
}
// Remove The track from the Stream Map (if there)
if (m_pStreamToTrackMap)
{
UINT16 uStreamCount = 0;
CQTStream* pStreamTracer = m_pStreamToTrackMap;
while (uStreamCount < m_uNumStreams)
{
if (pStreamTracer->m_pQTTrack == pQTTrack)
{
pStreamTracer->m_pQTTrack = NULL;
pStreamTracer->m_bActive = FALSE;
pStreamTracer->m_bGroupped = FALSE;
pStreamTracer->m_uGroup = 0;
pStreamTracer->m_ulBitrate = 0;
break;
}
uStreamCount++;
pStreamTracer++;
}
}
}
/****************************************************************************
* CQTTrackManager::CQTTrackTable
*/
/****************************************************************************
* Destructor
*/
CQTTrackManager::CQTTrackTable::~CQTTrackTable()
{
if (m_pTrack)
{
m_pTrack->Release();
}
if (m_pTrackAtom)
{
m_pTrackAtom->Release();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?