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

📄 rtsptran.cpp

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

	if (pStreamData->m_pTSOrderHack)
	{
	    IHXBuffer* pBuf=NULL;	    
	    UINT32 ulHX;
	    UINT32 ulRTP;
	    UINT16 unStrmNo;
	    UINT8  uchASMFlag;
	    UINT16 unRuleNo;

	    // pkts've been sorted based on seq_no
	    IHXRTPPacket* pRTPPacket = NULL;

	    pPacket->QueryInterface(IID_IHXRTPPacket, (void**) &pRTPPacket);

	    if (pRTPPacket)
	    {
		// RTP transport generates RTP packets
		result = pRTPPacket->GetRTP(pBuf, ulHX, ulRTP, 
					    unStrmNo, uchASMFlag, unRuleNo);
	    }
	    else
	    {
		// RDT transport generates RMA packets
		result = pPacket->Get(pBuf, ulHX,
				      unStrmNo, uchASMFlag, unRuleNo);

		if (pStreamData->m_pTSConverter)
		{
		    ulRTP = pStreamData->m_pTSConverter->hxa2rtp(ulHX);
		}
		else
		{
		    ulRTP = ulHX;
		}
	    }

	    HX_ASSERT(result == HXR_OK);

	    if (result == HXR_OK)
	    {
		if (((LONG32) (ulHX - pStreamData->m_pTSOrderHack->m_ulLastSentTS)) > 0)
		{
		    pStreamData->m_pTSOrderHack->m_ulLastSentTS = ulHX;
		    pStreamData->m_pTSOrderHack->m_ulLastRecvTS = ulHX;
		}
		else if (ulHX == pStreamData->m_pTSOrderHack->m_ulLastRecvTS)
		{
		    ulHX = pStreamData->m_pTSOrderHack->m_ulLastSentTS;	    	    
		}
		else
		{
		    pStreamData->m_pTSOrderHack->m_ulLastRecvTS = ulHX;
		    ulHX = (++pStreamData->m_pTSOrderHack->m_ulLastSentTS);
		}
		
		HX_RELEASE(pRTPPacket);
		HX_RELEASE(pPacket);
		pRTPPacket = new CHXRTPPacket;
		pRTPPacket->AddRef();
		result = pRTPPacket->SetRTP(pBuf,
					    ulHX,
					    ulRTP,
					    unStrmNo,
					    uchASMFlag,
					    unRuleNo);
		HX_ASSERT(result == HXR_OK);		
		pRTPPacket->QueryInterface(IID_IHXPacket, (void**) &pPacket);
		HX_ASSERT(pPacket);
	    }
	    HX_RELEASE(pBuf);

	    HX_RELEASE(pRTPPacket);
	}
    }

    /*
     * No longer need the ClientPacket wrapper
     */
    HX_RELEASE(clientPacket);    

    return HXR_OK;
}

HX_RESULT
RTSPTransport::startPackets(UINT16 uStreamNumber)
{
    RTSPTransportBuffer* pTransportBuffer = getTransportBuffer(uStreamNumber);

    if (!pTransportBuffer)
    {
	return HXR_FAIL;
    }

    return pTransportBuffer->StartPackets();
}

HX_RESULT
RTSPTransport::stopPackets(UINT16 uStreamNumber)
{
    RTSPTransportBuffer* pTransportBuffer = getTransportBuffer(uStreamNumber);

    if (!pTransportBuffer)
    {
	return HXR_FAIL;
    }

    return pTransportBuffer->StopPackets();
}

void
RTSPTransport::SetFilterResponse(RawPacketFilter* pResp)
{
    HX_RELEASE(m_pPacketFilter);
    m_pPacketFilter = pResp;
    if (m_pPacketFilter)
    {
	m_pPacketFilter->AddRef();
    }
}

void
RTSPTransport::FilterPacket(IHXPacket* pPacket)
{
    UINT16 uStreamNumber;

    ClientPacket* clientPacket = 0;
    clientPacket = (ClientPacket*)m_pClientPacketList->RemoveTail();
    clientPacket->SetPacket(pPacket);
    
    uStreamNumber = clientPacket->GetStreamNumber();
    RTSPTransportBuffer* pTransportBuffer = getTransportBuffer(uStreamNumber);
    pTransportBuffer->Add(clientPacket);
}

void RTSPTransport::GetContext(IUnknown*& pContext)   
{   
	pContext = m_pContext;   

	if (pContext)   
	{   
		pContext->AddRef();   
	}   
} 

void 
RTSPTransport::LeavePrefetch(void)
{
    RTSPStreamData* pStreamData = NULL; 
    
    m_bPrefetch = FALSE;

    HX_ASSERT(m_pStreamHandler);

    pStreamData = m_pStreamHandler->firstStreamData();
    while(pStreamData)    
    {
	if (pStreamData->m_pTransportBuffer)
	{
	    pStreamData->m_pTransportBuffer->LeavePrefetch();
	}
	pStreamData = m_pStreamHandler->nextStreamData();
    }

    return;
}

void 
RTSPTransport::EnterFastStart(void)
{
    RTSPStreamData* pStreamData = NULL; 
    
    m_bFastStart = TRUE;

    HX_ASSERT(m_pStreamHandler);

    pStreamData = m_pStreamHandler->firstStreamData();
    while(pStreamData)    
    {
	if (pStreamData->m_pTransportBuffer)
	{
	    pStreamData->m_pTransportBuffer->EnterFastStart();
	}
	pStreamData = m_pStreamHandler->nextStreamData();
    }

    return;
}

void 
RTSPTransport::LeaveFastStart(void)
{
    RTSPStreamData* pStreamData = NULL; 
    
    m_bFastStart = FALSE;

    HX_ASSERT(m_pStreamHandler);

    pStreamData = m_pStreamHandler->firstStreamData();
    while(pStreamData)    
    {
	if (pStreamData->m_pTransportBuffer)
	{
	    pStreamData->m_pTransportBuffer->LeaveFastStart();
	}
	pStreamData = m_pStreamHandler->nextStreamData();
    }

    return;
}

BOOL 
RTSPTransport::isSparseStream(UINT16 uStreamNumber)
{
    BOOL		bResult = FALSE;
    const char*		pMimeType = NULL;
    IUnknown*		pUnknown = NULL;
    IHXStreamSource*	pStreamSource = NULL;    
    IHXStream*		pStream = NULL;

    if (m_pContext  &&
	HXR_OK == m_pContext->QueryInterface(IID_IHXStreamSource, (void**)&pStreamSource))
    {
	if (HXR_OK == pStreamSource->GetStream(uStreamNumber, pUnknown))
	{
	    if (HXR_OK == pUnknown->QueryInterface(IID_IHXStream, (void**)&pStream))
	    {
		pMimeType = pStream->GetStreamType();

		// special handling for sparsed streams for multicast
		if (pMimeType							&&
		    (strcasecmp(SYNCMM_MIME_TYPE, pMimeType) == 0		||
		     strcasecmp(REALEVENT_MIME_TYPE, pMimeType) == 0		||
		     strcasecmp("application/vnd.rn-realtext", pMimeType) == 0	||
		     strcasecmp("application/x-pn-realtext", pMimeType) == 0))
		{
		    bResult = TRUE;
		}
	    }
	    HX_RELEASE(pStream);
	}
	HX_RELEASE(pUnknown);
    }
    HX_RELEASE(pStreamSource);

    return bResult;
}

HX_RESULT
RTSPTransport::storePacket(IHXPacket* pPacket,
                           UINT16 uStreamNumber,
                           UINT16 uSeqNo,
                           UINT16 uReliableSeqNo,
                           BOOL isReliable)
{
    RTSPTransportBuffer* pTransportBuffer = getTransportBuffer(uStreamNumber);

    if (!pTransportBuffer)
    {
	return HXR_FAIL;
    }

    ClientPacket* clientPacket = 0;
    
    m_bIsReceivedData = TRUE;

    if (pPacket->IsLost())
    {
        clientPacket = new ClientPacket(uSeqNo, uReliableSeqNo,
		                        pPacket->GetTime(), 0, isReliable,
		                        0, pTransportBuffer->GetTime(), FALSE);

	clientPacket->AddRef();

	return pTransportBuffer->Add(clientPacket);
    }
    
    IHXBuffer* pBuffer = pPacket->GetBuffer();

    if (m_pPacketFilter)
    {
	if (!m_pClientPacketList)
	{
	    m_pClientPacketList = new CHXSimpleList;
	    m_pPacketFilter->SetFilterResponse(this);
	}
	clientPacket = new ClientPacket(uSeqNo, uReliableSeqNo,
		pPacket->GetTime(), pBuffer->GetSize(), isReliable,
		NULL, pTransportBuffer->GetTime(),
		FALSE);
	
	clientPacket->AddRef();
	pBuffer->Release();

	m_pClientPacketList->AddHead((void*)clientPacket);
	m_pPacketFilter->FilterPacket(pPacket);

	// just guessing on what this should be?????
        return HXR_OK;
    }
    else
    {
       clientPacket = new ClientPacket(uSeqNo, uReliableSeqNo,
		pPacket->GetTime(), pBuffer->GetSize(), isReliable,
		pPacket, pTransportBuffer->GetTime(), FALSE);

	clientPacket->AddRef();
	pBuffer->Release();

	return pTransportBuffer->Add(clientPacket);
    }
}

HX_RESULT			
RTSPTransport::packetReady(HX_RESULT status, RTSPStreamData* pStreamData, IHXPacket* pPacket)
{
    HX_RESULT result = HXR_OK;

    ASSERT(!m_bIsSource);

    if (!pStreamData)
    {
	return HXR_UNEXPECTED;
    }

    HX_ASSERT(pStreamData);
    
    if (pPacket)
    {
	if (pStreamData->m_bUsesRTPPackets)
	{
	    IHXRTPPacket* pRTPPacket = NULL;

	    pPacket->QueryInterface(IID_IHXRTPPacket, (void**) &pRTPPacket);

	    if (pRTPPacket)
	    {
		// This already is RTP Packet - proceed
		pRTPPacket->Release();
	    }
	    else
	    {
		// Must Transfer to an RTP Packet
		result = m_pCommonClassFactory->CreateInstance(
				CLSID_IHXRTPPacket,
				(void**) &pRTPPacket);

		if (pRTPPacket)
		{
		    ULONG32 ulTime;
		    ULONG32 ulRTPTime;
		    UINT16 uStreamNumber;
		    UINT8 unASMFlags;
		    UINT16 unASMRuleNumber;
		    BOOL bIsLost = pPacket->IsLost();
		    IHXBuffer* pBuffer = NULL;

		    pPacket->Get(pBuffer,
				 ulTime,
				 uStreamNumber,
				 unASMFlags,
				 unASMRuleNumber);

		    if (pStreamData->m_pTSConverter)
		    {
			ulRTPTime = pStreamData->m_pTSConverter->hxa2rtp(ulTime);
		    }
		    else
		    {
			ulRTPTime = ulTime;
		    }

		    pRTPPacket->SetRTP(pBuffer,
				       ulTime,
				       ulRTPTime,
				       uStreamNumber,
				       unASMFlags,
				       unASMRuleNumber);

		    if (bIsLost)
		    {
			pRTPPacket->SetAsLost();
		    }

		    HX_RELEASE(pBuffer);

		    result = m_pResp->PacketReady(status, m_sessionID, pRTPPacket);
		    pRTPPacket->Release();
		}

		return result;
	    }
	}
    }
    else
    {
	/*
	 * This is a lost packet
	 */
	if (pStreamData->m_bUsesRTPPackets)
	{
	    result = m_pCommonClassFactory->CreateInstance(
			CLSID_IHXRTPPacket,
			(void**) &pPacket);
	}
	else
	{
	    result = m_pCommonClassFactory->CreateInstance(
			CLSID_IHXPacket,
			(void**) &pPacket);
	}
	    
	if (pPacket)
	{
	    pPacket->Set(0, 0, pStreamData->m_streamNumber, 0, 0);
	    pPacket->SetAsLost();
	    result = m_pResp->PacketReady(status, m_sessionID, pPacket);
	    pPacket->Release();
	}
	return result;
    }

    return m_pResp->PacketReady(status, m_sessionID, pPacket);
}

HX_RESULT
RTSPTransport::packetReady(HX_RESULT status, UINT16 uStreamNumber, IHXPacket* pPacket)
{
    RTSPStreamData* pStreamData = NULL;

    ASSERT(!m_bIsSource);

    pStreamData = m_pStreamHandler->getStreamData(uStreamNumber);

    HX_ASSERT(pStreamData);

    return packetReady(status, pStreamData, pPacket);
}

HX_RESULT
RTSPTransport::getStatus
(
    UINT16& uStatusCode, 
    IHXBuffer*& pStatusDesc, 
    UINT16& ulPercentDone
)
{
#if 0
    if (!m_pStreamHandler)
    {
	uStatusCode = HX_STATUS_INITIALIZING;
	pStatusDesc = 0;
	ulPercentDone = 0;

	return HXR_OK;
    }

    uStatusCode = HX_STATUS_READY;
    pStatusDesc = 0;
    ulPercentDone = 100;

    RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();

    ASSERT(pStreamData);

    while(pStreamData)
    {
	UINT16 tempStatusCode;
	UINT16 tempPercentDone;

	pStreamData->m_pTransportBuffer->GetStatus(tempStatusCode,
	                                           tempPercentDone);

	/*
	 * The status is always that of the stream which is least ready
	 */

	if (tempStatusCode < uStatusCode)
	{
	    uStatusCode	    = tempStatusCode;
	    ulPercentDone   = tempPercentDone;
	}
	else if (tempStatusCode == uStatusCode && 
		 tempPercentDone < ulPercentDone)
	{
	    ulPercentDone = tempPercentDone;
	}

	pStreamData = m_pStreamHandler->nextStreamData();
    }

    return HXR_OK;
#else
    return HXR_NOTIMPL;
#endif
}

HX_RESULT
RTSPTransport::GetCurrentBuffering(UINT16  uStreamNumber,
				   INT64&  llLowestTimestamp, 
				   INT64&  llHighestTimestamp,
				   UINT32& ulNumBytes,
				   BOOL&   bDone)
{
    if (!m_pStreamHandler)
    {
	return HXR_OK;
    }

    RTSPStreamData* pStreamData;

    pStreamData = m_pStreamHandler->getStreamData(uStreamNumber);

    HX_ASSERT(pStreamData);

    return pStreamData ? 
           pStreamData->m_pTransportBuffer->GetCurrentBuffering(
                                            llLowestTimestamp,
                                            llHighestTimestamp,
                                            ulNumBytes,
                                            bDone) : HXR_OK;
}

HX_RESULT
RTSPTransport::SeekFlush(UINT16 uStreamNumber)
{
    if (!m_pStreamHandler)
    {
	return HXR_OK;
    }

    RTSPStreamData* pStreamData;

    pStreamData = m_pStreamHandler->getStreamData(uStreamNumber);

    HX_ASSERT(pStreamData);

    if (pStreamData)
    {
	pStreamData->m_pTransportBuffer->SeekFlush();
    }

    return HXR_OK;
}

BOOL
RTSPTransport::IsSourceDone(void)
{
    return m_bSourceDone;
}

void      
RTSPTransport::CheckForSourceDone(UINT16 uStreamNumber)
{
    if (m_bSourceDone)
    {
	return;
    }

    HX_ASSERT(m_pStreamHandler);

    if (!m_pStreamHandler)
    {
	return;
    }

    RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();
    HX_ASSERT(pStreamData);

⌨️ 快捷键说明

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