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

📄 rtsptran.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:

    m_bSourceDone = TRUE;
    while(pStreamData)
    {
	if (pStreamData->m_streamNumber == uStreamNumber)
	{
	    pStreamData->m_bReceivedAllPackets = TRUE;
	}
	else if (!pStreamData->m_bReceivedAllPackets)
	{
	    m_bSourceDone = FALSE;
	    return;
	}

	pStreamData = m_pStreamHandler->nextStreamData();
    }

    /* We have received all the packets... Tell the reposnse object */
    if (!m_bIsSource)
    {
	m_pResp->OnSourceDone();
    }

}    

void      
RTSPTransport::HandleBufferError()
{
    if (m_pResp)
    {
	m_pResp->OnProtocolError(HXR_BUFFERING);
    }
}

RTSPResendBuffer*
RTSPTransport::getResendBuffer(UINT16 uStreamNumber)
{
    return m_pStreamHandler->getResendBuffer(uStreamNumber);
}

HX_RESULT
RTSPTransport::initializeStatistics
(
    UINT32 ulRegistryID
)
{
    m_bIsInitialized = TRUE;

    if (m_bIsSource)
    {
	m_ulRegistryID = ulRegistryID;
    }
    else
    {
	// XXX HP
	// rather than create a new copy of STREAM_STATS, we simply
	// obtain the same STREAM_STATS* from RTSPProtocol via SetStatistics().
	// this could save us on both the memory and several ms during the startup
/*
	IHXBuffer* pParentName = NULL;
	CHAR RegKeyName[MAX_DISPLAY_NAME] = {0};

	RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();

	ASSERT(pStreamData);

	if (!m_pRegistry)
	{
	    return HXR_FAIL;
	}

	HX_RESULT result = m_pRegistry->GetPropName(ulRegistryID, pParentName);

	if (result != HXR_OK)
	{
	    return result;
	}

	// create registry entries of each stream
	while (pStreamData)
	{
	    UINT16 uStreamNumber = pStreamData->m_streamNumber;

	    sprintf(RegKeyName, "%s.Stream%d", pParentName->GetBuffer(),
	                                       uStreamNumber);
	
	    UINT32 uStreamId = m_pRegistry->GetId(RegKeyName);

	    // create stream reg key if it has not been created
	    // by the source yet
	    if (!uStreamId)
	    {
		return HXR_FAIL;
	    }

	    pStreamData->m_pStreamStats = new STREAM_STATS(m_pRegistry,
	                                                   uStreamId);
							   
	    pStreamData = m_pStreamHandler->nextStreamData();
	}

	pParentName->Release();
*/
    }

    return HXR_OK;
}

HX_RESULT
RTSPTransport::SetStatistics(UINT16 uStreamNumber, STREAM_STATS* pStats)
{
    HX_RESULT	    rc = HXR_OK;
#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)
    RTSPStreamData* pStreamData = NULL;

    if (!m_pStreamHandler)
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    pStreamData = m_pStreamHandler->getStreamData(uStreamNumber);
    if (!pStreamData)
    {
	rc = HXR_FAILED;
	goto cleanup;
    }

    pStreamData->m_pStreamStats = pStats;

cleanup:
#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */

    return rc;
}

HX_RESULT 
RTSPTransport::updateStatistics(BOOL bUseRegistry)
{
    m_bIsUpdated = TRUE;

#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)
    if (m_bIsSource)
    {
	RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();

	if (!pStreamData)
	{
	    return HXR_FAIL;
	}

	/*
	 * XXXGH...streams are managed by the PPM and should not show up
	 *         under the transport
	 */
	while (pStreamData)
	{
	    UINT32 ulResendSuccess = 0;
	    UINT32 ulResendFailure = 0;

	    if (pStreamData->m_pResendBuffer)
	    {
		pStreamData->m_pResendBuffer->UpdateStatistics(ulResendSuccess,
		                                               ulResendFailure);
	    }

	    m_ulTotalSuccessfulResends += ulResendSuccess;
	    m_ulTotalFailedResends += ulResendFailure;

	    pStreamData = m_pStreamHandler->nextStreamData();
	}

        m_ulSendingTime = CALCULATE_ELAPSED_TICKS(m_ulStartTime, HX_GET_TICKCOUNT()) / 1000;

	IHXBuffer* pName;

	if (bUseRegistry
        &&  m_pRegistry 
        &&  HXR_OK == m_pRegistry->GetPropName(m_ulRegistryID, pName))
	{
	    char str[512]; /* Flawfinder: ignore */
	    const char* name = (const char*)pName->GetBuffer();
	    char pTemp[32]; /* Flawfinder: ignore */

	    i64toa(m_lBytesSent, pTemp, 10);

	    sprintf(str, "%-.400s.PacketsSent", name); /* Flawfinder: ignore */
	    m_pRegistry->AddInt(str, m_ulPacketsSent);
	    sprintf(str, "%-.400s.BytesSent", name); /* Flawfinder: ignore */
	    m_pRegistry->AddInt(str, INT64_TO_INT32(m_lBytesSent));

	    // Add the total bytes sent as a string because we don't want
	    // to have to truncate the INT64 value that is storing it
	    sprintf(str, "%-.400s.TotalBytesSent", name); /* Flawfinder: ignore */
	    IHXBuffer* pBuffer = new CHXBuffer();
	    pBuffer->AddRef();
	    pBuffer->Set((UCHAR*)pTemp, strlen(pTemp) + 1);
	    m_pRegistry->AddStr(str, pBuffer);
	    HX_RELEASE(pBuffer);

	    sprintf(str, "%-.400s.SendingTime", name); /* Flawfinder: ignore */
	    m_pRegistry->AddInt(str, m_ulSendingTime); 
	    sprintf(str, "%-.400s.ResendSuccess", name); /* Flawfinder: ignore */
	    m_pRegistry->AddInt(str, m_ulTotalSuccessfulResends);
	    sprintf(str, "%-.400s.ResendFailure", name); /* Flawfinder: ignore */
	    m_pRegistry->AddInt(str, m_ulTotalFailedResends);
	    pName->Release();
	}
    }
    else
    {
	ULONG32 ulNormal = 0;
	ULONG32 ulReceived = 0;
	ULONG32 ulLost = 0;
	ULONG32 ulLate = 0;
	ULONG32 ulTotal = 0;
	ULONG32 ulResendRequested = 0;
	ULONG32 ulResendReceived = 0;
	ULONG32 ulAvgBandwidth = 0;
	ULONG32 ulCurBandwidth = 0;

	UINT32	ulTotal30 = 0;
	UINT32	ulLost30 = 0;
	UINT32  ulDuplicate = 0;
	UINT32	ulOutOfOrder = 0;

	RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();

	if (!pStreamData)
	{
	    return HXR_FAIL;
	}

	while (pStreamData)
	{
	    STREAM_STATS* pStreamStats = pStreamData->m_pStreamStats;

            if (!pStreamStats || !pStreamStats->m_bInitialized)
	    {
		goto updateContinue;
	    }

	    pStreamData->m_pTransportBuffer->UpdateStatistics(ulNormal,
	                                                      ulLost,
	                                                      ulLate,
	                                                      ulResendRequested,
	                                                      ulResendReceived,
	                                                      ulAvgBandwidth,
	                                                      ulCurBandwidth,
							      ulTotal30,
							      ulLost30,
							      ulDuplicate,
							      ulOutOfOrder);
	                  
	    ulReceived = ulNormal + ulResendReceived;
	    ulTotal = ulReceived + ulLost + ulLate;

	    pStreamStats->m_pNormal->SetInt((INT32)ulNormal);
	    pStreamStats->m_pRecovered->SetInt((INT32)ulResendReceived);
	    pStreamStats->m_pReceived->SetInt((INT32)ulReceived);
	    pStreamStats->m_pLost->SetInt((INT32)ulLost);
	    pStreamStats->m_pLate->SetInt((INT32)ulLate);
	    pStreamStats->m_pDuplicate->SetInt((INT32)ulDuplicate);
	    pStreamStats->m_pOutOfOrder->SetInt((INT32)ulOutOfOrder);
	    pStreamStats->m_pTotal->SetInt((INT32)ulTotal);
	    pStreamStats->m_pLost30->SetInt((INT32)ulLost30);
	    pStreamStats->m_pTotal30->SetInt((INT32)ulTotal30);
	    pStreamStats->m_pResendRequested->SetInt((INT32)ulResendRequested);
	    pStreamStats->m_pResendReceived->SetInt((INT32)ulResendReceived);
	    pStreamStats->m_pAvgBandwidth->SetInt((INT32)ulAvgBandwidth);
	    pStreamStats->m_pCurBandwidth->SetInt((INT32)ulCurBandwidth);

updateContinue:

	    pStreamData = m_pStreamHandler->nextStreamData();
	}
    }
#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */

    return HXR_OK;
}

HX_RESULT 
RTSPTransport::UpdateRegistry(UINT32 ulStreamNumber,
			      UINT32 ulRegistryID)
{
    if (m_bIsSource)
    {
	m_ulRegistryID = ulRegistryID;
    }
    else
    {
	// XXX HP
	// rather than create a new copy of STREAM_STATS, we simply
	// obtain the same STREAM_STATS* from RTSPProtocol via SetStatistics().
	// this could save us on both the memory and several ms during the startup
/*
	if (!m_pRegistry)
	{
	    return HXR_FAIL;
	}

	RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();
	while (pStreamData)
	{
	    if (pStreamData->m_streamNumber == (UINT16)ulStreamNumber)
	    {
		HX_DELETE(pStreamData->m_pStreamStats);
		pStreamData->m_pStreamStats = new STREAM_STATS(m_pRegistry,
							       ulRegistryID);
		break;
	    }							   
	    pStreamData = m_pStreamHandler->nextStreamData();
	}
*/
    }

    return HXR_OK;
}

RTSPTransportBuffer*
RTSPTransport::getTransportBuffer(UINT16 uStreamNumber)
{
    if (!m_pStreamHandler)
    {
	return NULL;
    }

    RTSPStreamData* pStreamData;	    

    pStreamData = m_pStreamHandler->getStreamData(uStreamNumber);

    if (!pStreamData)
    {
	return NULL;
    }

    return pStreamData->m_pTransportBuffer;
}

HX_RESULT
RTSPTransport::playReset()
{
    m_bSourceDone = FALSE;

    if(m_pStreamHandler)
    {
	RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();

	while(pStreamData)
	{
	    if (m_bIsSource)
	    {
		pStreamData->m_packetSent = FALSE;
	    }
	    else
	    {
		pStreamData->m_pTransportBuffer->Reset();
		pStreamData->m_bReceivedAllPackets = FALSE;
	    }

	    pStreamData = m_pStreamHandler->nextStreamData();
	}
    }
    return HXR_OK;
}

HX_RESULT
RTSPTransport::pauseBuffers()
{
    if (m_pStreamHandler)
    {
	RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();

	ASSERT(pStreamData);

	while(pStreamData)
	{
	    pStreamData->m_pTransportBuffer->Pause();

	    pStreamData = m_pStreamHandler->nextStreamData();
	}
    }

    return HXR_OK;
}

HX_RESULT
RTSPTransport::resumeBuffers()
{
    m_bIsReceivedData = FALSE;

    if (m_pStreamHandler)
    {
	RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();

	ASSERT(pStreamData);

	while(pStreamData)
	{
	    pStreamData->m_pTransportBuffer->Resume();
	    pStreamData = m_pStreamHandler->nextStreamData();
	}
    }

    return HXR_OK;
}

HX_RESULT
RTSPTransport::setFirstSeqNum(UINT16 uStreamNumber, UINT16 uSeqNum)
{
    RTSPStreamData* pStreamData;

    pStreamData = m_pStreamHandler->getStreamData(uStreamNumber);

    if(pStreamData)
    {
	if (m_bIsSource)
	{	    
	    pStreamData->m_seqNo = uSeqNum;

	    if(pStreamData->m_pResendBuffer)
	    {
		pStreamData->m_pResendBuffer->SetFirstSequenceNumber(uSeqNum);
	    }
	}
	else
	{
	    if (!pStreamData->m_pTransportBuffer)
	    {
		return HXR_FAIL;
	    }

	    if (!m_bMulticast)
	    {
		pStreamData->m_lastSeqNo = uSeqNum;
    		pStreamData->m_pTransportBuffer->Init(uSeqNum);
	    }
	}
    }

    return HXR_OK;
}

HX_RESULT
RTSPTransport::Init(IUnknown* pContext)
{
    HX_RESULT			hresult;
    
    if (!m_pContext)
    {
	m_pContext = pContext;
	m_pContext->AddRef();
    }

    hresult = pContext->QueryInterface(IID_IHXCommonClassFactory,
				       (void**)&m_pCommonClassFactory);

    if (HXR_OK != hresult)
    {
	return hresult;
    }
					    
    hresult = pContext->QueryInterface(IID_IHXScheduler,
                                       (void**)&m_pScheduler);

    if (HXR_OK != hresult)
    {
	DPRINTF(D_INFO, ("could not get scheduler...\n"));
	return hresult;
    }

    pContext->QueryInterface(IID_IHXRegistry, (void**)&m_pRegistry);

    pContext->QueryInterface(IID_IHXInternalReset,
	                               (void**)&m_pInternalReset);

    pContext->QueryInterface(IID_IHXPlayerState,
	                               (void**)&m_pPlayerState);

    pContext->QueryInterface(IID_IHXSourceBufferingStats2,
			     (void**)&m_pSrcBufferStats);

#ifdef RDT_MESSAGE_DEBUG
    IHXPreferences* pPreferences = NULL;
    
    if (pContext &&
	(HXR_OK == pContext->QueryInterface(IID_IHXPreferences,
                                            (void**) &pPreferences)))
    {
	IHXBuffer* pBuffer = NULL;

        ReadPrefBOOL(pPreferences, "RDTMessageDebug", m_bRDTMessageDebug);
	if (m_bRDTMessageDebug)
	{
	    if (HXR_OK == pPreferences->ReadPref("RDTMessageDebugFile", pBuffer))
	    {
		if (pBuffer->GetSize() <= 0)
		{
		    // no file name, no log
		    m_bRDTMessageDebug = FALSE;
		}
		else
		{
		    m_RDTmessageDebugFileName = (const char*) pBuffer->GetBuffer();
		}			
	    }
            HX_RELEASE(pBuffer);
	}
    }

    HX_RELEASE(pPreferences);
#endif	// RDT_MESSAGE_DEBUG
    
    return HXR_OK;
}

HX_RESULT
RTSPTransport::SetResendBufferDepth(UINT32 uMilliseconds)
{
    RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();

    ASSERT(pStreamData);

    while (pStreamData)
    {
	if (m_bIsSource)
	{
	    if (pStreamData->m_pResendBuffer)
	    {
		pStreamData->m_pResendBuffer->SetBufferDepth(uMilliseconds);
	    }
	}
	else
	{
	    if (pStreamData->m_pTransportBuffer)
	    {
		pStreamData->m_pTransportBuffer->SetBufferDepth(uMilliseconds);
	    }
	}

	pStreamData = m_pStreamHandler->nextStreamData();
    }

    return HXR_OK;
}

#ifdef RDT_MESSAGE_DEBUG
void RTSPTransport::RDTmessageFormatDebugFileOut(const char* fmt, ...)
{
    if(m_bRDTMessageDebug)
    {
        char buf[4096]; /* Flawfinder: ignore */
	va_list args;
	va_start(args, fmt);
	FILE* fp = fopen((const char*)m_RDTmessageDebugFileName, "a");
	if (fp)
	{
	    vsprintf(buf, fmt, args);
	    fprintf(fp, "%s\n", buf);
	    fclose(fp);
	}

	va_end(args);
    }
}
#endif	// RDT_MESSAGE_DEBUG

⌨️ 快捷键说明

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