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

📄 hxsrc.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    GetStoreInformation(&stInfo);    memAvail = stInfo.dwFreeSize;#elif (_WIN32)    MEMORYSTATUS status;    status.dwLength = sizeof(MEMORYSTATUS);    GlobalMemoryStatus(&status);    memAvail = status.dwAvailPageFile;#elif defined( _WINDOWS)    memAvail = GetFreeSpace(0);#elif defined (_UNIX)    // XXXX Need to get this to compile.    memAvail = 1000000;#endif    return memAvail;}voidHXSource::ReportError(HX_RESULT theErr){    if (m_pPlayer)    {	m_pPlayer->ReportError(this, theErr);    }}HX_RESULT		HXSource::AdjustClipTime(void){    HX_RESULT theErr = HXR_OK;    UINT32  ulOriginalDuration = m_ulDuration;            UINT32  ulTrackEndTime = 0;    CHXMapLongToObj::Iterator i;    BOOL    bCustomEndTimeSet = FALSE;    if (m_bPartOfPrefetchGroup)    {	if (m_ulDelay)	{	    m_ulPrefetchDelay = m_ulDelay;	    m_bDelayed = TRUE;	    AdjustClipBandwidthStats(FALSE);	    DoPause();	}	m_ulEndTime = 0;	m_bCustomEndTime = FALSE;	goto cleanup;    }	    /* For a live stream, the only qualifiers that make sense     * are Duration and Delay. All other qualifiers should be made 0     */    if (mLiveStream)    {	m_ulStartTime = 0;	if (!m_bRestrictedLiveStream)	{	    m_ulEndTime = 0;	}    }    for (i = mStreamInfoTable->Begin(); i != mStreamInfoTable->End(); ++i)     {    	STREAM_INFO*	pStreamInfo = (STREAM_INFO*) (*i);	ulTrackEndTime = 0;	HX_RESULT hrTemp = pStreamInfo->m_pHeader->GetPropertyULONG32("EndTime", ulTrackEndTime);	if (HXR_OK == hrTemp && !m_bCustomEndTime)	{		    if (m_ulEndTime < ulTrackEndTime)	    {		m_ulEndTime = ulTrackEndTime;	    }	    pStreamInfo->m_bCustomEndTime = TRUE;	}	else if (m_bCustomEndTime)	{	    ulTrackEndTime = m_ulEndTime;	    pStreamInfo->m_bCustomEndTime = TRUE;	}	if (ulTrackEndTime > 0 && !mLiveStream)	{	    pStreamInfo->m_pHeader->SetPropertyULONG32("TrackEndTime",							ulTrackEndTime);	    bCustomEndTimeSet = TRUE;	}    }        // if max. duration is set on this source    if (m_pSourceInfo && 	m_pSourceInfo->m_ulMaxDuration)    {	if (m_ulRestrictedDuration)	{	    	    if (m_ulRestrictedDuration > m_pSourceInfo->m_ulMaxDuration)	    {		m_ulRestrictedDuration = m_pSourceInfo->m_ulMaxDuration;	    }	}	else if (m_ulDuration)	{	    if (m_ulDuration > m_pSourceInfo->m_ulMaxDuration)	    {		m_ulRestrictedDuration = m_pSourceInfo->m_ulMaxDuration;	    }	}    }    // By default, we always set the end time to be the duration of the clip,    // but do not set end time if it was manually specified.    if (!bCustomEndTimeSet && !mLiveStream)    {	m_ulEndTime = m_ulDuration;    }    /* Check if there is any end time */    if ((m_ulEndTime < m_ulDuration) || m_bRestrictedLiveStream)    {	m_ulDuration = m_ulEndTime;    }        /* Is "Delay" specified too? */    if (m_ulDelay > 0)     {	/* Increase duration of this clip */	m_ulDuration += m_ulDelay;	UINT32 ulStartTime = 0;	if (m_ulDelay > m_ulPreRollInMs + NETWORK_FUDGE_FACTOR)	{	    ulStartTime = m_ulDelay - (m_ulPreRollInMs + NETWORK_FUDGE_FACTOR);	}	// no need to pause delayed persistent component since Pause() will be called	// on actual tracks' AdjustClipTime() if necessary	if (m_pSourceInfo && !m_pSourceInfo->m_bIsPersistentSource)	{	    m_bDelayed = TRUE;	    AdjustClipBandwidthStats(FALSE);	    DoPause();	}    }    if (m_ulStartTime > 0) /* reduce duration by start time amount */    {    	if (m_ulDuration > m_ulStartTime)    	{	    m_ulDuration -= m_ulStartTime;	}	else	{	    /* This is bad case. We consider it invalid */	    m_ulDuration = 0;	}    }    /* We now allow to increase the default duration of the clip */    if (m_ulRestrictedDuration > 0)    {	m_ulDuration = m_ulRestrictedDuration + m_ulDelay;	if (mLiveStream && !m_bRestrictedLiveStream)	{	    m_bRestrictedLiveStream = TRUE;	    m_ulEndTime = m_ulRestrictedDuration + m_ulStartTime;	}		if (m_ulEndTime > m_ulRestrictedDuration + m_ulStartTime)	{	    m_ulEndTime = m_ulRestrictedDuration + m_ulStartTime;	}    }    // orig duration is active duration for this source -- time for which    // this source lasts.    if (m_ulDuration > m_ulDelay)    {	m_ulOriginalDuration = m_ulDuration - m_ulDelay;    }    else    {	m_ulOriginalDuration = 0;    }    if (m_pURL					    &&	rtspProtocol == m_pURL->GetProtocol()	    &&	m_llLastExpectedPacketTime != m_ulEndTime   &&	!m_bFirstResume)    {	m_bRTSPRuleFlagWorkAround = TRUE;    }    /* If we receive a packet after this stream, we consider the stream to be done */    m_llLastExpectedPacketTime  = CAST_TO_INT64 m_ulEndTime;    // Seek to the starting position only if the source    // has not been resumed yet    if (m_ulStartTime > 0 && m_bFirstResume)     {	/* We will add m_ulStartTime in DoSeek() call*/    	theErr = DoSeek(0);    }    /* Update stream durations if required */    for (i = mStreamInfoTable->Begin(); i != mStreamInfoTable->End(); ++i)     {    	STREAM_INFO* pStreamInfo = (STREAM_INFO*) (*i);	if (m_ulStartTime > 0)	{	    pStreamInfo->m_pHeader->SetPropertyULONG32("TrackStartTime",					    m_ulStartTime);	}		if (m_ulEndTime > 0 && 	    !mLiveStream    &&	    HXR_OK != pStreamInfo->m_pHeader->GetPropertyULONG32("TrackEndTime",								  ulTrackEndTime))	{	    pStreamInfo->m_pHeader->SetPropertyULONG32("TrackEndTime",							m_ulEndTime);	}	if (ulOriginalDuration != m_ulDuration)	{	    pStreamInfo->m_ulDuration = m_ulDuration;	    pStreamInfo->m_pHeader->SetPropertyULONG32("Duration", 					pStreamInfo->m_ulDuration);	}	if (m_ulDelay > 0)	{	    pStreamInfo->m_pHeader->SetPropertyULONG32("Delay", m_ulDelay);	}    }//{FILE* f1 = ::fopen("d:\\temp\\url.txt", "a+"); ::fprintf(f1, "%p %s %lu %lu\n", this, m_pszURL, m_ulDelay, m_ulDuration);::fclose(f1);}cleanup:    m_bClipTimeAdjusted = TRUE;    return theErr;}voidHXSource::GenerateFakeLostPacket(CHXEvent*& theEvent){    IHXPacket* pPacket = theEvent->GetPacket();    CHXPacket* pLostPacket = new CHXPacket;    pLostPacket->AddRef();    pLostPacket->Set(0, 0, pPacket->GetStreamNumber(), 0, 0);    pLostPacket->SetAsLost();    /* Create a new event with lost packet */    CHXEvent* pEvent = new CHXEvent(pLostPacket);    pEvent->SetTimeStartPos(theEvent->GetTimeStartPos());    pEvent->SetTimeOffset(theEvent->GetTimeOffset());    pEvent->SetPreSeekEvent(theEvent->IsPreSeekEvent());    pLostPacket->Release();    delete theEvent;    theEvent = pEvent;}char*HXSource::GetAltURL(BOOL& bDefault){#if defined(HELIX_FEATURE_ALT_URL)    char*   pAltURL = NULL;    if (!m_pURL || m_bInitialized)    {	goto cleanup;    }    pAltURL = m_pURL->GetAltURL(bDefault);cleanup:    return pAltURL;#else    return NULL;#endif /* HELIX_FEATURE_ALT_URL */}HX_RESULTHXSource::SetRequest(const CHXURL* pURL, BOOL bAltURL){    HX_RESULT		hr = HXR_OK;    IHXValues*		pValues = NULL;    IHXValues*		pValuesInRequest = NULL;    IHXGroup*		pGroup = NULL;    IHXGroup2*		pGroup2 = NULL;    IHXGroupManager*	pGroupManager = NULL;    HX_RELEASE(m_pRequest);    if (m_pPlayer)    {	m_pPlayer->GetActiveRequest(m_pRequest);	if (m_pRequest)	{	    m_pPlayer->ResetActiveRequest();	}    }#if defined(HELIX_FEATURE_ADVANCEDGROUPMGR)    if (m_pPlayer && m_pSourceInfo)    {	if (HXR_OK == m_pPlayer->QueryInterface(IID_IHXGroupManager, (void**)&pGroupManager))	{	    if (HXR_OK == pGroupManager->GetGroup(m_pSourceInfo->m_uGroupID, pGroup))	    {		if (HXR_OK == pGroup->QueryInterface(IID_IHXGroup2, (void**)&pGroup2))		{		    pGroup2->GetTrack2(m_pSourceInfo->m_uTrackID, pValues, pValuesInRequest);		    UINT32 ulValue = 0;		    char   szDuration[128] = {0}; /* Flawfinder: ignore */		    IHXBuffer* pBuffer = NULL;		    if (pValues && HXR_OK == pValues->GetPropertyULONG32("Duration", ulValue))		    {			if (!pValuesInRequest)			{			    pValuesInRequest = new CHXHeader();			    if( pValuesInRequest )			    {			        pValuesInRequest->AddRef();			    }			    else			    {			        hr = HXR_OUTOFMEMORY;			    }			}			if (pValuesInRequest)			{			    SafeSprintf (szDuration, 128, "%lu", ulValue); /* Flawfinder: ignore */			    pBuffer = new CHXBuffer();			    pBuffer->AddRef();    			    pBuffer->Set((UCHAR*)szDuration, strlen(szDuration) + 1);			    pValuesInRequest->SetPropertyCString("Duration", pBuffer);			    HX_RELEASE(pBuffer);			}		    }		}		HX_RELEASE(pGroup2);	    }	    HX_RELEASE(pGroup);	}	HX_RELEASE(pGroupManager);    }#endif /* HELIX_FEATURE_ADVANCEDGROUPMGR */    IHXRegistry* pRegistry = NULL;       m_pEngine->QueryInterface(IID_IHXRegistry, (void**)&pRegistry);    hr = ::SetRequest(pURL->GetEscapedURL(), bAltURL, m_pPreferences, pRegistry, pValuesInRequest, m_pRequest);    HX_RELEASE(pValues);    HX_RELEASE(pValuesInRequest);    HX_RELEASE(pRegistry);#if defined(HELIX_FEATURE_RECORDCONTROL)    if(hr == HXR_OK && pURL->GetProtocol() != fileProtocol)    {	if(!m_pRecordControl)	{	    m_pRecordControl = new HXRecordControl((IHXPlayer*)m_pPlayer, (IHXStreamSource*)this);	    if(m_pRecordControl)	    {		m_pRecordControl->AddRef();		if(m_pRecordControl->IsValid())                    m_bPlayFromRecordControl = m_pRecordControl->CanGetPackets();                else		    HX_RELEASE(m_pRecordControl);	    }	}	if(m_pRecordControl)	{	    m_pRecordControl->SetSource((IHXStreamSource*)this);	}    }#endif /* HELIX_FEATURE_RECORDCONTROL */    return hr;}voidHXSource::UpdateDuration(UINT32 ulDuration){    CHXSimpleList* pRepeatList = m_pSourceInfo->GetRepeatList();    // ulDuration excludes the delay time    if (pRepeatList && 	ulDuration >= (m_ulDuration - m_ulDelay))    {	m_pSourceInfo->m_ulTotalTrackDuration = ulDuration + m_ulDelay;	if (m_pSourceInfo->m_pPeerSourceInfo)	{	    m_pSourceInfo->m_pPeerSourceInfo->m_ulTotalTrackDuration = m_pSourceInfo->m_ulTotalTrackDuration;	}    }    else    {	m_ulOriginalDuration = m_ulRestrictedDuration = ulDuration;	AdjustClipTime();	m_pSourceInfo->UpdateDuration(m_ulDuration);    }}voidHXSource::UpdateDelay(UINT32 ulDelay){    m_ulDelay = ulDelay;    AdjustClipTime();    m_pSourceInfo->UpdateDelay(m_ulDelay);}voidHXSource::InitialBufferingDone(void){    m_bInitialBuffering = FALSE;    // resume if we satisfy the initial preroll AND we have issued    // rebuffer    // note: IsRebufferRequired() should return FALSE!!    if (m_bRebufferingRequired)    {	m_bRebufferingRequired = IsRebufferRequired();	HX_ASSERT(!m_bRebufferingRequired);    }    return;}voidHXSource::DoRebuffer(void){    m_bRebufferingRequired  = TRUE;    if (m_pPlayer)    {	m_pPlayer->InternalPause();	            ReBuffer();    }    return;}BOOL		HXSource::IsRebufferRequired(void){    BOOL	    bResult = FALSE;    STREAM_INFO*    pStreamInfo = NULL;    // Check if all streams are doing OK    for (CHXMapLongToObj::Iterator ndxStrm = mStreamInfoTable->Begin();	 ndxStrm != mStreamInfoTable->End(); ++ndxStrm)     {    	pStreamInfo = (STREAM_INFO*) (*ndxStrm);		if (pStreamInfo->m_unNeeded > pStreamInfo->m_unAvailable)	{	    bResult = TRUE;	    break;	}    }    return bResult;}BOOLHXSource::IsRebufferDone(void){    BOOL    bResult = TRUE;    if (m_pSourceInfo)    {	bResult = m_pSourceInfo->IsRebufferDone();    }    return bResult;}void		HXSource::ScheduleProcessCallback(){    if (m_pSourceInfo)    {        m_pSourceInfo->ScheduleProcessCallback();    }}#if defined(HELIX_FEATURE_HYPER_NAVIGATE)/************************************************************************ *	Method: *	    IHXHyperNavigate::GoToURL *	Purpose: *	    Acts as a proxy for actual hypernavigate interface. *	    Is used to convert any relative URLs to absolute URLs */STDMETHODIMP HXSource::GoToURL(const char* pURL, const char* pTarget){    return Execute(pURL, pTarget, NULL, NULL, NULL);}/************************************************************************ *	Method: *	    IHXHyperNavigate2::Execute *	Purpose: *	     *	Parameters: *      pURL:	    URL (absolute or relative) *	    pTargetInstance:	 *	    pTargetApplication:  *	    pTargetRegion: *	    pParams: */STDMETHODIMP HXSource::Execute(const char* pURL,		   const char* pTargetInstance,		   const char* pTargetApplication,		   const char* pTargetRegion,		   IHXValues* pParams){    HX_RESULT theErr = HXR_OK;    CHXString newURL = pURL;//    pURL = "rogers.rt";

⌨️ 快捷键说明

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