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

📄 hxsrc.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//    if (pTargetInstance && //	stricmp(pTargetInstance, "_player") == 0 &&    if (ShouldConvert(pTargetInstance) && 	pURL  &&	strnicmp(pURL, URL_COMMAND, sizeof(URL_COMMAND) - 1) != 0 )    {	CHXURL urlObj(pURL);	IHXValues* pHeader = urlObj.GetProperties();	IHXBuffer* pBuffer = NULL;	if(pHeader && 	   m_pszURL &&	   HXR_OK != pHeader->GetPropertyBuffer(PROPERTY_SCHEME, pBuffer))	{	    // relative URL	    // if it starts with '/', make it relative to the root of 	    // the URL prefix	    CHXString urlPrefix, urlRoot;	    char* pURLFragment = NULL;	    theErr = CHXURL::GeneratePrefixRootFragment(m_pszURL, urlPrefix, urlRoot, pURLFragment);	    HX_VECTOR_DELETE(pURLFragment);	    if (!theErr)	    {		if(*pURL == '/')		{		    newURL = urlRoot + pURL;		}		else		{		    newURL = urlPrefix + pURL;		}		    }	}	HX_RELEASE(pBuffer);	HX_RELEASE(pHeader);    }        AddRef();    HX_ASSERT(m_pPlayer && m_pPlayer->m_pHyperNavigate);    if (m_pPlayer && m_pPlayer->m_pHyperNavigate)    {	theErr = m_pPlayer->m_pHyperNavigate->ExecuteWithContext(newURL, 			pTargetInstance, pTargetApplication, pTargetRegion, 			pParams, (IUnknown*) (IHXStreamSource*) this);    }    Release();    return theErr;}#endif /* defined(HELIX_FEATURE_HYPER_NAVIGATE) */STDMETHODIMPHXSource::GetTotalBuffering(UINT16  uStreamNumber,			    REF(INT64)  llLowestTimestamp, 			    REF(INT64)  llHighestTimestamp,			    REF(UINT32) ulNumBytes,			    REF(BOOL)   bDone){    HX_RESULT res = HXR_NO_DATA;        llLowestTimestamp = 0;    llHighestTimestamp = 0;    ulNumBytes = 0;    bDone = FALSE;    STREAM_INFO* pStreamInfo;    if (mStreamInfoTable->Lookup((LONG32) uStreamNumber, (void*& )pStreamInfo))    {	HXBufferingState& bufState = pStreamInfo->BufferingState();	BOOL   bUseTransportStats = FALSE;	INT64  llTransportLowTS = 0;	INT64  llTransportHighTS = 0;	UINT32 ulTransportBytes = 0;	BOOL   bTransportDone = FALSE;	if (!IsLocalSource() &&	    (HXR_OK == GetCurrentBuffering(uStreamNumber,					   llTransportLowTS,					   llTransportHighTS,					   ulTransportBytes,					   bTransportDone)))	{	    bufState.UpdateTransportStats(llTransportLowTS,					  llTransportHighTS,					  ulTransportBytes,					  bTransportDone);	    bUseTransportStats = TRUE;	    // Update bDone with what the transport says.	    bDone = bTransportDone;	}	res = bufState.GetBufferingStats(llLowestTimestamp,					 llHighestTimestamp,					 ulNumBytes,					 bUseTransportStats);    }    return res;}/*  * All relative URLs are converted to absolute URLs unless the  * original request (ram/smil) passed in OpenRequest/OpenURL() * is a mem: URL AND the target is not _player. * * This fixes relative URLs being hurled to the browser using events * come from the same location as the .ram file. (Broadcase usage case) * PR 31352 * * This also fixes content on CD-ROMs where relative URLs being hurled  * to the browser using events come from the same location as  * the .rm file in which they are merged.  * PR 23489 */BOOL HXSource::ShouldConvert(const char* pTargetInstance){    if (pTargetInstance && 	stricmp(pTargetInstance, "_player") == 0)    {	return TRUE;    }        const char* pPlayerURL = NULL;    IHXRequest* pPlayerRequest = NULL;    if (m_pPlayer)    {	m_pPlayer->GetRequest(pPlayerRequest);	if (pPlayerRequest)	{	    pPlayerRequest->GetURL(pPlayerURL);	}    }    HX_RELEASE(pPlayerRequest);    if (pPlayerURL && ::strncasecmp(pPlayerURL, "mem:", 4) == 0)    {	return FALSE;	    }    return TRUE;}voidHXSource::MergeUpgradeRequest(BOOL bAddDefault /*= FALSE*/, char* pUpgradeString /* = NULL*/){#if defined(HELIX_FEATURE_AUTOUPGRADE)    if (m_pPlayer && 	bAddDefault && 	(!m_pUpgradeCollection || m_pUpgradeCollection->GetCount() == 0))    {	if (!m_pUpgradeCollection)	{	    m_pUpgradeCollection = new HXUpgradeCollection;	}	if (!pUpgradeString)	{	    pUpgradeString = "Missing Component";	}	IHXBuffer* pPluginID = (IHXBuffer*) new CHXBuffer;	pPluginID->AddRef();	pPluginID->Set((const UINT8*)pUpgradeString, strlen(pUpgradeString) + 1);	m_pUpgradeCollection->Add(eUT_Required, pPluginID, 0, 0);	pPluginID->Release();    }    if (m_pPlayer && m_pUpgradeCollection && m_pUpgradeCollection->GetCount() > 0)    {	UINT32 ulCount = m_pUpgradeCollection->GetCount();	IHXUpgradeCollection* pPlayerUpgrade;	m_pPlayer->QueryInterface(IID_IHXUpgradeCollection, (void**) &pPlayerUpgrade);	for (UINT32 i = 0; i < ulCount; i++)	{	    HXUpgradeType upgradeType;	    IHXBuffer* pPluginId = (IHXBuffer*) new CHXBuffer;	    UINT32	majorVersion;	    UINT32	minorVersion;	    pPluginId->AddRef(); 	    // GetAt is a non-COM like API. It expects pPluginID to be allocated by the user	    // and does not perform an addref either!	    m_pUpgradeCollection->GetAt(i, upgradeType, pPluginId, majorVersion, minorVersion);	    pPlayerUpgrade->Add(upgradeType, pPluginId, majorVersion, minorVersion);	    pPluginId->Release();	}	pPlayerUpgrade->Release();	m_pUpgradeCollection->RemoveAll();    }#endif /* HELIX_FEATURE_AUTOUPGRADE */}voidHXSource::ClearUpgradeRequest(){#if defined(HELIX_FEATURE_AUTOUPGRADE)    if (m_pUpgradeCollection)    {	m_pUpgradeCollection->RemoveAll();    }#endif /* HELIX_FEATURE_AUTOUPGRADE */}voidHXSource::EnterPrefetch(PrefetchType prefetchType, UINT32 ulPrefetchValue){    m_bPrefetch = TRUE;    m_prefetchType = prefetchType;    m_ulPrefetchValue = ulPrefetchValue;    return;}voidHXSource::LeavePrefetch(void){    m_bPrefetch = FALSE;    // send prefetch notification so that SMIL    // renderer can resolve the duration on this prefetch track    if (m_pSourceInfo)    {	m_pPlayer->PrefetchTrackDone(m_pSourceInfo->m_uGroupID, 		    		     m_pSourceInfo->m_uTrackID, 				     HXR_OK);    }    return;}void		HXSource::SetSoundLevel(UINT16 uSoundLevel, BOOL bReflushAudioDevice){#if defined(HELIX_FEATURE_SMIL_SOUNDLEVEL)    CHXAudioPlayer* pAudioPlayer = NULL;    CHXAudioStream* pCHXAudioStream = NULL;    CHXSimpleList*  pAudioStreamList = NULL;    if (!m_pPlayer)    {	goto cleanup;    }    pAudioPlayer = m_pPlayer->GetAudioPlayer();    if (!pAudioPlayer)    {	goto cleanup;    }    pAudioPlayer->AddRef();    if (HXR_OK == CollectAudioStreams(pAudioStreamList) && pAudioStreamList)    {	pAudioPlayer->SetSoundLevel(pAudioStreamList, uSoundLevel, bReflushAudioDevice);	ReleaseAudioStreams(pAudioStreamList);	HX_DELETE(pAudioStreamList);    }    HX_RELEASE(pAudioPlayer);cleanup:#endif /* HELIX_FEATURE_SMIL_SOUNDLEVEL */    return;}void		HXSource::SetAudioDeviceReflushHint(void){#if defined(HELIX_FEATURE_SOUNDLEVEL)    CHXAudioPlayer* pAudioPlayer = NULL;    CHXSimpleList*  pAudioStreamList = NULL;    if (!m_pPlayer)    {	goto cleanup;    }    pAudioPlayer = m_pPlayer->GetAudioPlayer();    if (!pAudioPlayer)    {	goto cleanup;    }    pAudioPlayer->AddRef();    if (HXR_OK == CollectAudioStreams(pAudioStreamList) && pAudioStreamList)    {	pAudioPlayer->ManageAudioStreams(pAudioStreamList, CHXAudioPlayer::STR_SETHINT);	ReleaseAudioStreams(pAudioStreamList);	HX_DELETE(pAudioStreamList);    }    HX_RELEASE(pAudioPlayer);cleanup:#endif /* HELIX_FEATURE_SOUNDLEVEL */    return;}voidHXSource::LeaveFastStart(TurboPlayOffReason leftReason){    m_turboPlayStats.tpOffReason = leftReason;    m_bFastStart = FALSE;}voidHXSource::DeleteAllEvents(){    if (m_PacketBufferList.GetCount() > 0)    {	LISTPOSITION pos = m_PacketBufferList.GetHeadPosition();	while (pos != NULL)	{	    CHXEvent* pTempEvent  = (CHXEvent*) m_PacketBufferList.GetNext(pos);	    delete pTempEvent;	}	m_PacketBufferList.RemoveAll();    }}void	HXSource::SetMinimumPreroll(ULONG32 ulMinimumAudioPreroll, ULONG32 ulMinimumStartingPreroll){    UINT32 ulTotalMinimumPreroll = 0;    if (m_pPlayer)    {	// get the user-set minimum preroll	m_pPlayer->GetMinimumPreroll(ulTotalMinimumPreroll);    }    if (IsAnyAudioStream())    {	m_ulPreRollInMs	+= ulMinimumAudioPreroll;    }    if (m_ulPreRollInMs < ulTotalMinimumPreroll)    {	m_ulPreRollInMs = ulTotalMinimumPreroll;    }    DEBUG_OUT(m_pPlayer, DOL_TRANSPORT, (s, "(%p)Preroll: %lu MinPreroll %lu MinAudioPreroll %lu", this, m_ulPreRollInMs, ulTotalMinimumPreroll, ulMinimumStartingPreroll));    m_pBufferManager->SetMinimumPreroll(IsLocalSource() | m_bPerfectPlay,					ulTotalMinimumPreroll,					ulMinimumStartingPreroll);}HX_RESULT		HXSource::SendHeaderToRecordControl(BOOL bFileHeader, IHXValues* pHeader){#if defined(HELIX_FEATURE_RECORDCONTROL)    HX_RESULT nResult = HXR_OK;    if(m_pRecordControl && pHeader)    {	if(bFileHeader)	    nResult = m_pRecordControl->OnFileHeader(pHeader);	else	    nResult = m_pRecordControl->OnStreamHeader(pHeader);	if(nResult != HXR_OK)	{	    m_bPlayFromRecordControl = FALSE;	    if(nResult != HXR_RECORD)		HX_RELEASE(m_pRecordControl);	}    }    return nResult;#else    return HXR_NOTIMPL;#endif /* HELIX_FEATURE_RECORDCONTROL */}voidHXSource::ProcessFileHeader(void){    UINT32      bNonSeekAble = 0;    IHXBuffer*  pTitle = NULL;    IHXBuffer*  pAuthor = NULL;    IHXBuffer*  pCopyright = NULL;    IHXBuffer*  pAbstract = NULL;    IHXBuffer*  pDescription = NULL;    IHXBuffer*  pKeywords = NULL;    IHXValues*  pValues = NULL;    if (m_pURL)    {	pValues = m_pURL->GetOptions();    }    // retrieve the TAC from the URL    if (pValues)    {	pValues->GetPropertyBuffer("Title", pTitle);        pValues->GetPropertyBuffer("Author", pAuthor);        pValues->GetPropertyBuffer("Copyright", pCopyright);        pValues->GetPropertyBuffer("Abstract", pAbstract);        pValues->GetPropertyBuffer("Description", pDescription);        pValues->GetPropertyBuffer("Keywords", pKeywords);//#define LOSS_HACK#ifdef LOSS_HACK	UINT32 ulLoss = 0;	if (HXR_OK == pValues->GetPropertyULONG32("Loss", ulLoss))	{	    m_ulLossHack = ulLoss;	    /* Initialize random number generator */	    ::srand((unsigned int) HX_GET_TICKCOUNT());	}#endif /*LOSS_HACK*/    }    if (m_pFileHeader)    {        if (!pTitle)	    m_pFileHeader->GetPropertyBuffer("Title", pTitle);        if (!pAuthor)	    m_pFileHeader->GetPropertyBuffer("Author", pAuthor);        if (!pCopyright)    m_pFileHeader->GetPropertyBuffer("Copyright", pCopyright);        if (!pDescription)  m_pFileHeader->GetPropertyCString("Description", pDescription);        if (!pAbstract)	    m_pFileHeader->GetPropertyCString("Abstract", pAbstract);        if (!pKeywords)	    m_pFileHeader->GetPropertyCString("Keywords", pKeywords);        m_pFileHeader->GetPropertyULONG32("NonSeekable", bNonSeekAble);	m_bNonSeekable = bNonSeekAble ? TRUE : FALSE;                m_pFileHeader->GetPropertyULONG32("StreamCount",m_ulStreamHeadersExpected);                    HX_ASSERT(mStreamInfoTable->IsEmpty() == TRUE);        if (mStreamInfoTable->IsEmpty() && m_ulStreamHeadersExpected > 0 &&            m_ulStreamHeadersExpected < mStreamInfoTable->GetHashTableSize())        {            mStreamInfoTable->InitHashTable(m_ulStreamHeadersExpected);        }    }#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)    if (m_pStats)    {        if (pTitle && m_pStats->m_pTitle)        {	    m_pStats->m_pTitle->SetStr((char*)(pTitle->GetBuffer()));        }        if (pAuthor && m_pStats->m_pAuthor)        {	    m_pStats->m_pAuthor->SetStr((char*)(pAuthor->GetBuffer()));        }        if (pCopyright && m_pStats->m_pCopyright)        {	    m_pStats->m_pCopyright->SetStr((char*)(pCopyright->GetBuffer()));        }        if (pAbstract && m_pStats->m_pAbstract)        {	    m_pStats->m_pAbstract->SetStr((char*)(pAbstract->GetBuffer()));        }            if (pDescription && m_pStats->m_pDescription)        {            m_pStats->m_pDescription->SetStr((char*)(pDescription->GetBuffer()));        }        if (pKeywords && m_pStats->m_pKeywords)        {	    m_pStats->m_pKeywords->SetStr((char*)(pKeywords->GetBuffer()));        }    }    CopyMetaDataToRegistry(m_pFileHeader);#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */    m_bReceivedHeader = TRUE;    HX_RELEASE(pTitle);    HX_RELEASE(pAuthor);    HX_RELEASE(pCopyright);    HX_RELEASE(pAbstract);    HX_RELEASE(pDescription);    HX_RELEASE(pKeywords);    HX_RELEASE(pValues);    return;}static BOOL GetHeaderBOOL(IHXValues* pHeader, const char* pKey){    BOOL bRet = FALSE;    ULONG32 ulTemp = 0;    if ((HXR_OK == pHeader->GetPropertyULONG32(pKey, ulTemp)) && ulTemp)    {	bRet = TRUE;    }    return bRet;}HX_RESULTHXSource::ProcessStreamHeaders(IHXValues* pHeader, STREAM_INFO*& pStreamInfo){    HX_RESULT       rc = HXR_OK;    UINT32          ulStreamNumber = 0;    UINT32          ulAvgBitRate = 0;    UINT32          ulAvgPacketSize = 0;    UINT32          ulPreroll = 0;    ULONG32         ulPredata = 0;    UINT32          ulDuration = 0;    UINT32          ulTemp = 0;    void*           lTmp = NULL;    pStreamInfo = NULL;    if (!pHeader)    {        rc = HX_INVALID_HEADER;        goto cleanup;    }    // Use f

⌨️ 快捷键说明

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