📄 rtsptran.cpp
字号:
if (!pStreamData->m_pTSOrderHack) { pStreamData->m_pTSOrderHack = new RTSPStreamData::TSOrderHackInfo(); if (pStreamData->m_pTSOrderHack) { pStreamData->m_pTSOrderHack->m_ulLastSentTS = pPacket->GetTime(); pStreamData->m_pTSOrderHack->m_ulLastRecvTS = pStreamData->m_pTSOrderHack->m_ulLastSentTS; } } 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_RESULTRTSPTransport::startPackets(UINT16 uStreamNumber){ RTSPTransportBuffer* pTransportBuffer = getTransportBuffer(uStreamNumber); if (!pTransportBuffer) { return HXR_FAIL; } return pTransportBuffer->StartPackets();}HX_RESULTRTSPTransport::stopPackets(UINT16 uStreamNumber){ RTSPTransportBuffer* pTransportBuffer = getTransportBuffer(uStreamNumber); if (!pTransportBuffer) { return HXR_FAIL; } return pTransportBuffer->StopPackets();}voidRTSPTransport::SetFilterResponse(RawPacketFilter* pResp){ HX_RELEASE(m_pPacketFilter); m_pPacketFilter = pResp; if (m_pPacketFilter) { m_pPacketFilter->AddRef(); }}voidRTSPTransport::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_RESULTRTSPTransport::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_RESULTRTSPTransport::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_RESULTRTSPTransport::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_RESULTRTSPTransport::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_RESULTRTSPTransport::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;}BOOLRTSPTransport::IsSourceDone(void){ return m_bSourceDone;}void RTSPTransport::CheckForSourceDone(UINT16 uStreamNumber){ if (m_bSourceDone) { return; } HX_ASSERT(m_pStreamHandler); if (!m_pStreamHandler)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -