📄 rtspprotocol.cpp
字号:
} return;}voidRTSPProtocol::LeaveFastStart(void){ m_bFastStart = FALSE; if (m_pProtocolLib) { ((RTSPClientProtocol*)m_pProtocolLib)->LeaveFastStart(); } return;}/* * If this is multicast, make sure to send subscribe msg */HX_RESULTRTSPProtocol::handle_multicast(void){#if defined(HELIX_FEATURE_TRANSPORT_MULTICAST) HX_ASSERT(mCurrentTransport == MulticastMode); STREAM_INFO* pStreamInfo = NULL; IHXBuffer* pRuleBook = NULL; for (UINT16 uStrmNum = 0; uStrmNum < m_uStreamCount; uStrmNum++) { pStreamInfo = NULL; if (FAILED(mOwner->GetStreamInfo(uStrmNum, pStreamInfo))) { return HXR_OK; } HX_ASSERT(pStreamInfo); // If there is an ASMRuleBook, subscription will be done eventually // through RTSPClientProtocol::RuleChange()... pRuleBook = NULL; if (FAILED(pStreamInfo->m_pHeader->GetPropertyCString("ASMRuleBook", pRuleBook))) { HX_ASSERT(!pRuleBook); Subscribe(uStrmNum, 0); } HX_RELEASE(pRuleBook); } return HXR_OK;#else return HXR_NOTIMPL;#endif /* HELIX_FEATURE_TRANSPORT_MULTICAST */}HX_RESULTRTSPProtocol::send_setup_request(){ HX_RESULT rc = HXR_OK; RTSPTransportType* pTransport = new RTSPTransportType[MAX_TRANSPORT]; int nTransports = 0; switch (mCurrentTransport) { /* * Port is omitted here, the transport layer will pick it. */#if defined(HELIX_FEATURE_TRANSPORT_MULTICAST) case MulticastMode: if (!m_bUseRTP) { pTransport[nTransports].m_lTransportType = RTSP_TR_RDT_MCAST; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RDT_UDP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_TNG_UDP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_UDP; pTransport[nTransports++].m_sPort = 0; if (m_ulTransportPrefMask & ATTEMPT_TCP) { pTransport[nTransports].m_lTransportType = RTSP_TR_TNG_TCP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RDT_TCP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_TCP; pTransport[nTransports++].m_sPort = 0; } } else { pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_UDP; pTransport[nTransports++].m_sPort = 0; if (m_ulTransportPrefMask & ATTEMPT_TCP) { pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_TCP; pTransport[nTransports++].m_sPort = 0; } } // tell the owner that we are using multicast... // this is needed to display it on the stats dialog... mOwner->TransportStarted(MulticastMode); break;#endif /* HELIX_FEATURE_TRANSPORT_MULTICAST */ case UDPMode: if(!m_bUseRTP) { pTransport[nTransports].m_lTransportType = RTSP_TR_RDT_UDP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_TNG_UDP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_UDP; pTransport[nTransports++].m_sPort = 0; if (m_ulTransportPrefMask & ATTEMPT_TCP) { pTransport[nTransports].m_lTransportType = RTSP_TR_TNG_TCP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RDT_TCP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_TCP; pTransport[nTransports++].m_sPort = 0; } } else { pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_UDP; pTransport[nTransports++].m_sPort = 0; if (m_ulTransportPrefMask & ATTEMPT_TCP) { pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_TCP; pTransport[nTransports++].m_sPort = 0; } } // tell the owner that we are using UDP... // this is needed to display it on the stats dialog... mOwner->TransportStarted(UDPMode); break; case TCPMode: if(!m_bUseRTP) { pTransport[nTransports].m_lTransportType = RTSP_TR_TNG_TCP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RDT_TCP; pTransport[nTransports++].m_sPort = 0; pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_TCP; pTransport[nTransports++].m_sPort = 0; } else { pTransport[nTransports].m_lTransportType = RTSP_TR_RTP_TCP; pTransport[nTransports++].m_sPort = 0; } // tell the owner that we are using TCPt... // this is needed to display it on the stats dialog... if (m_bHTTPOnly) { mOwner->TransportStarted(HTTPCloakMode); } else { mOwner->TransportStarted(TCPMode); } break; default: HX_VECTOR_DELETE(pTransport);#if defined(_DEBUG) && defined(DEBUG_LOG_INFO) HXStaticStatLog::StatPrintf("SetTransport::wrong mode %d\n", mCurrentTransport);#endif return HXR_FAIL; } HX_ASSERT(nTransports <= MAX_TRANSPORT); // look for a cookie... // If we use pRequsetHeaders straight from m_pRequest, it will contain a // whole bunch of stuff that we don't need. SO, just extract the "Cookie" // and create a new header right here. If you need other headers, we might // need to come up with a better loginc. IHXValues* pRequestHeaders = NULL; IHXBuffer* pCookie = NULL; if (SUCCEEDED(m_pRequest->GetRequestHeaders(pRequestHeaders))) { pRequestHeaders->GetPropertyCString("Cookie", pCookie); HX_RELEASE(pRequestHeaders); if (pCookie) { pRequestHeaders = new CHXHeader(); pRequestHeaders->AddRef(); pRequestHeaders->SetPropertyCString("Cookie", pCookie); HX_RELEASE(pCookie); } } rc = m_pProtocolLib->SendSetupRequest(pTransport, nTransports, pRequestHeaders); HX_RELEASE(pRequestHeaders); HX_VECTOR_DELETE(pTransport); return rc;}STDMETHODIMPRTSPProtocol::HandleStreamRecordDescriptionResponse( HX_RESULT status, IHXValues* pResponseHeaders){ return HXR_NOTIMPL;}STDMETHODIMPRTSPProtocol::HandleSetupResponse( HX_RESULT status){ if (status != HXR_OK) { /* * XXX...Need to get proper errors from protocol library */ mOwner->ReportError(status); return status; } switch(m_pProtocolLib->GetProtocolType()) { case 1: mOwner->TransportStarted(MulticastMode);#if defined(HELIX_FEATURE_TRANSPORT_MULTICAST) // OK, this is multicast for sure...Make sure to send subscription. handle_multicast();#endif /* HELIX_FEATURE_TRANSPORT_MULTICAST */ break; case 2: mOwner->TransportStarted(UDPMode); break; case 3: // notify that the server has selected TCP over UDP // when the player supports both if (!m_bHTTPOnly && mCurrentTransport != TCPMode && HXR_OK == mOwner->TransportStarted(TCPMode)) { mOwner->TransportSucceeded(TCPMode, 0); } /* No need to report TCP success * We may be in TCP/HTTP Cloaking mode */ break; default: HX_ASSERT(FALSE); break; }#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY) /* * Must wait until transport is established before initializing * statistics */ CHXMapLongToObj::Iterator i; for (i = m_pStreamInfoList->Begin(); i != m_pStreamInfoList->End(); ++i) { RTSP_STREAM_INFO* pStreamInfo = (RTSP_STREAM_INFO*)(*i); if (m_pProtocolLib) { ((RTSPClientProtocol*)m_pProtocolLib)->SetStatistics(pStreamInfo->m_uStreamNumber, pStreamInfo->m_pStreamStats); } }#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */ mOwner->Initialize();// return m_pProtocolLib->SendPlayRequest(RTSP_PLAY_RANGE_BLANK, RTSP_PLAY_RANGE_BLANK, 0); return HXR_OK;}STDMETHODIMPRTSPProtocol::HandlePlayResponse( HX_RESULT status){ if (status != HXR_OK) { /* * XXX...Need to get proper errors from protocol library */ mOwner->ReportError(status); //ConvertHResultToHXError(status)); return status; } /* Mark the current state as Playing ONLY if we have called resume */ if (!m_bIsFirstResume) { m_bPlaying = TRUE; // Start Waiting for data.. mOwner->StartDataWait(); } return HXR_OK;}STDMETHODIMPRTSPProtocol::HandleRecordResponse( HX_RESULT status){ return HXR_NOTIMPL;}STDMETHODIMPRTSPProtocol::HandleTeardownResponse( HX_RESULT status){ AddRef(); if (m_pProtocolLib) { m_pProtocolLib->Done(); m_pProtocolLib->Release(); m_pProtocolLib = 0; } Release(); return HXR_OK;}STDMETHODIMPRTSPProtocol::HandleSetParameterRequest( UINT32 lParamType, const char* pParamName, IHXBuffer* pParamValue){ IHXPlayer* pPlayer; IHXBandwidthManager * pBWM; if(!strcmp(pParamName,"MaximumASMBandwidth") && (HXR_OK == mOwner->GetPlayer(pPlayer)) && (HXR_OK == pPlayer->QueryInterface(IID_IHXBandwidthManager, (void **)&pBWM))) { pBWM->ChangeBW((UINT32)atoi((const char *)pParamValue->GetBuffer()), mOwner); return HXR_OK; }#if defined(HELIX_FEATURE_REVERTER) else if (!strcmp(pParamName, "DataConvertBuffer")) { m_pDataRevert->ControlBufferReady(pParamValue); return HXR_OK; }#endif /* HELIX_FEATURE_REVERTER */ return HXR_NOTIMPL;}STDMETHODIMPRTSPProtocol::HandleSetParameterRequest(const char* pParamName, const char* pParamValue, const char* pContent){#if defined(HELIX_FEATURE_REVERTER) if (!strcmp(pParamName, "DataConvertBuffer")) { IHXBuffer* pBuffer = new CHXBuffer(); int contentLen = strlen(pContent); pBuffer->SetSize(contentLen); int offset = BinFrom64(pContent, contentLen, (unsigned char*)pBuffer->GetBuffer()); pBuffer->SetSize(offset); pBuffer->AddRef(); m_pDataRevert->ControlBufferReady(pBuffer); pBuffer->Release(); return HXR_OK; }#endif /* HELIX_FEATURE_REVERTER */ return HXR_NOTIMPL;}STDMETHODIMPRTSPProtocol::HandleSetParameterResponse( HX_RESULT status){ return HXR_OK; // XXXSMP Just return OK for now.}STDMETHODIMPRTSPProtocol::HandleSetParameterResponseWithValues( HX_RESULT status, IHXValues* pValues){ if (status == HXR_OK && pValues) { UINT32 ulStatsInterval = 0; UINT32 ulValue = 0; if (pValues->GetPropertyULONG32("UpdateStatsInterval", ulStatsInterval) == HXR_OK) { ulStatsInterval = ulStatsInterval * 1000; // ulStatsInterval = 0 to disable the stats if (ulStatsInterval && ulStatsInterval < MINIMUM_STATS_INTERVAL) { ulStatsInterval = MINIMUM_STATS_INTERVAL; } mOwner->SetOption(HX_STATS_INTERVAL, &ulStatsInterval); } if (pValues->GetPropertyULONG32("Reconnect", ulValue) == HXR_OK) { mOwner->SetReconnectInfo(pValues); } } return HandleSetParameterResponse(status);}STDMETHODIMPRTSPProtocol::HandleGetParameterRequest( UINT32 lParamType, const char* pParamName, IHXBuffer** pParamValue){ /* * XXX...Need to implement */ return HXR_NOTIMPL;}STDMETHODIMPRTSPProtocol::HandleGetParameterResponse( HX_RESULT status, IHXBuffer* pParamValue){ /* * XXX...Need to implement */ return HXR_NOTIMPL;}STDMETHODIMPRTSPProtocol::HandleAlertRequest( HX_RESULT status, INT32 lAlertNumber, const char* pAlertText){ HX_RESULT theErr = HXR_OK; m_idleState = ALERT_STATE; m_ulLastAlert = (UINT32)lAlertNumber; HX_VECTOR_DELETE(m_pTextBuf); if (pAlertText) { m_pTextBuf = new char[::strlen(pAlertText) + 1]; if(!m_pTextBuf) { theErr = HXR_OUTOFMEMORY; goto cleanup; } strcpy(m_pTextBuf, pAlertText); /* Flawfinder: ignore */ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -