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

📄 rtspclnt.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
STDMETHODIMP_(IHXStatistics*)RTSPClientProtocol::GetStatistics(){    AddRef();    return (IHXStatistics*)this;}STDMETHODIMP_(BOOL)RTSPClientProtocol::HttpOnly(){    if(m_pSession)    {	return m_pSession->HttpOnly();    }    return FALSE;}/* * IHXResolverResponse methods */STDMETHODIMPRTSPClientProtocol::GetHostByNameDone(HX_RESULT status,    UINT32 ulAddr){    UINT16	uPort = 0;    BOOL	bUseProxy = FALSE;    CHXString	host;    HX_RELEASE(m_pResolver);    /* We may have been deleted by now */    if (!m_pResp)    {	return HXR_OK;    }    m_pMutex->Lock();    HX_RESULT rc = HXR_OK;#if defined(HELIX_FEATURE_TRANSPORT_MULTICAST)    if (m_bSDPInitiated && m_bMulticast)    {        m_ulConnectToAddr = ulAddr;	m_pResp->InitDone(HXR_OK);        IHXValues* pResponseHeaders = NULL;        if (HXR_OK == m_pResponseHeaders->QueryInterface(IID_IHXValues, (void**)&pResponseHeaders))        {	    rc = m_pResp->HandleStreamDescriptionResponse	    (	        HXR_OK,	        m_pSDPFileHeader,	        m_pSDPStreamHeaders,	        pResponseHeaders	    );        }        HX_RELEASE(pResponseHeaders);        RemoveSDPHeaders();        goto exit;    }#endif /* HELIX_FEATURE_TRANSPORT_MULTICAST */    if(status == HXR_OK)    {	if (!m_pSessionManager->isValid())	{	    // just return, this puppy's going away...	    goto exit;	}	if (!m_pSession && !m_pSocket)	{	    RTSPClientSession* pSession = 0;	    IUnknown* pContextToMatch = NULL;	    /* Do not reuse connection for connections coming from the	     * same player. Check for context (IHXPlayer) equality test	     * Context check is needed to simulate real-world scenario	     * for SMIL load testing	     */	    if (m_bNoReuseConnection && m_bLoadTest)	    {		pContextToMatch = m_pContext;	    }	    /* We share established connections if	     * 1. m_bNoReuseConnection is FALSE OR	     * 2. m_bLoadTest is set to TRUE (in which case we share	     *    connections ONLY for the same context (see above)	     * AND	     * 3. m_bHTTPOnly is FALSE OR	     * 4. m_pCloakPorts == NULL which means we *not* gonna	     *    attempt cloakport scanning	     *	     * NOTE: Splitter Plugin uses m_bNoReuseConnection = TRUE	     */	    if ((!m_bHTTPOnly || !m_pCloakPorts) &&		(!m_bNoReuseConnection || m_bLoadTest))	    {		if(m_bUseProxy || m_bUseHTTPProxy)		{		    uPort = m_proxyPort;		}		else if (m_bHTTPOnly)		{		    uPort = m_uCloakPort;		}		else		{		    uPort = m_foreignPort;		}		pSession = m_pSessionManager->findSession		(		    ulAddr,		    uPort,		    (m_bUseProxy | m_bUseHTTPProxy),		    (const char*)m_hostName,		    (m_bUseHTTPProxy?m_uCloakPort:m_foreignPort),		    pContextToMatch		);	    }	    if(pSession)	    {		pSession->addProtocol(this);		m_bSessionSucceeded = TRUE;		m_pSession = pSession;		m_pSocket = pSession->getSocket();		sendInitialMessage(m_pSession, m_pSocket);		IHXPreferredTransportSink* pPreferredTransportSink = NULL;		if (m_pResp &&		    HXR_OK == m_pResp->QueryInterface(IID_IHXPreferredTransportSink,						      (void**)&pPreferredTransportSink))		{		    pPreferredTransportSink->TransportSucceeded(m_currentTransport, m_uCloakPort);		}		HX_RELEASE(pPreferredTransportSink);		m_pResp->InitDone(HXR_OK);	    }	    else	    {		if(m_bUseProxy || m_bUseHTTPProxy)		{		    host = m_proxyHost;		    uPort = m_proxyPort;		    bUseProxy = TRUE;		}		else		{		    host = m_hostName;		    uPort = m_foreignPort;		}		// XXX HP:	the new session is created based on		//		the actual(foreign) host and port to		//		fix SMIL containing diff. servers		//		the better fix will be send a new		//		Challenge but still sharing the same		//.		session		if (m_pCloakPorts)		{		    HX_ASSERT(m_bHTTPOnly);		    // initiating cloakport scanning		    for (int i = 0; i < m_nCloakPorts; i++)		    {			rc = m_pSessionManager->newSession(m_pContext,							  this,							  host,							  uPort,							  ulAddr,							  bUseProxy,							  m_bHTTPOnly,							  m_pCloakPorts[i]);			HX_ASSERT(HXR_OK == rc);		    }		    goto exit;		}		else		{		    rc = m_pSessionManager->newSession		    (			m_pContext,			this,			host,			uPort,			ulAddr,			bUseProxy,			m_bHTTPOnly,			m_uCloakPort		    );		    goto exit;		}	    }	}	else	{	    // being re-inited..	    //sendInitialMessage();	    m_pResp->InitDone(HXR_OK);	}    }    else    {	m_pResp->InitDone(status);    }exit:    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::SendGetParameterRequest(UINT32 lParamType,    const char* pParamName){    if (!m_pIsMethodSupported[GET_PARAM])    {	return HXR_OK;    }    HX_RESULT rc = HXR_OK;    m_pMutex->Lock();    RTSPGetParamMessage* pMsg = new RTSPGetParamMessage;    if(pMsg)    {        pMsg->setURL("*");        AddCommonHeaderToMsg(pMsg);        UINT32 seqNo = m_pSession->getNextSeqNo(this);        rc = sendRequest(pMsg, pParamName, "text/rtsp-parameters", seqNo);    }    else    {        rc = HXR_OUTOFMEMORY;    }    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::SendSetParameterRequest(UINT32 lParamType,			    const char* pParamName, IHXBuffer* pParamValue){    if (!m_pIsMethodSupported[SET_PARAM])    {	return HXR_OK;    }    m_pMutex->Lock();    RTSPSetParamMessage* pMsg = new RTSPSetParamMessage;    pMsg->setURL(m_url);    AddCommonHeaderToMsg(pMsg);    pMsg->addHeader(pParamName, (const char*)pParamValue->GetBuffer());    UINT32 seqNo = m_pSession->getNextSeqNo(this);    HX_RESULT rc = sendRequest(pMsg, seqNo);    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::SendSetParameterRequest(const char* pParamName,	const char* pParamValue, const char* pMimeType,	const char* pContent){    if (!m_pIsMethodSupported[SET_PARAM])    {	return HXR_OK;    }    m_pMutex->Lock();    RTSPSetParamMessage* pMsg = new RTSPSetParamMessage;    pMsg->setURL(m_url);    AddCommonHeaderToMsg(pMsg);    pMsg->addHeader(pParamName, pParamValue);    UINT32 seqNo = m_pSession->getNextSeqNo(this);    HX_RESULT rc = sendRequest(pMsg, pContent, pMimeType, seqNo);    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::PacketReady(HX_RESULT status, const char* pSessionID,    IHXPacket* pPacket){    m_pMutex->Lock();    HX_RESULT rc = m_pResp->HandlePacket(status, pSessionID, pPacket);    m_pMutex->Unlock();    return rc;}/* * OnRTTRequest() and OnBWReport() are server-side functions */STDMETHODIMPRTSPClientProtocol::OnRTTRequest(HX_RESULT status, const char* pSessionID){    return HXR_UNEXPECTED;}STDMETHODIMPRTSPClientProtocol::OnRTTResponse(HX_RESULT status, const char* pSessionID,    UINT32 ulSecs, UINT32 ulUSecs){    m_pMutex->Lock();    HX_RESULT rc = m_pResp->HandleRTTResponse(status, pSessionID,					      ulSecs, ulUSecs);    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::OnBWReport(HX_RESULT status, const char* pSessionID,    INT32 aveBandwidth, INT32 packetLoss, INT32 bandwidthWanted){    return HXR_UNEXPECTED;}STDMETHODIMPRTSPClientProtocol::OnCongestion(HX_RESULT status, const char* pSessionID,    INT32 xmitMultiplier, INT32 recvMultiplier){    m_pMutex->Lock();    HX_RESULT rc = m_pResp->HandleCongestion(status, pSessionID,					xmitMultiplier, recvMultiplier);    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::OnACK(HX_RESULT status, RTSPResendBuffer* pResendBuffer,    UINT16 uStreamNumber, const char* pSessionID,    UINT16* pAckList, UINT32 uAckListCount,    UINT16* pNakList, UINT32 uNakListCount){    /*     * While it's ACKing, remote client is alive     */    m_bConnectionAlive = TRUE;    m_pMutex->Lock();    HX_RESULT rc = handleACK((IHXPacketResend*)this, pResendBuffer,			     uStreamNumber,			     pAckList, uAckListCount,			     pNakList, uNakListCount,			     FALSE);    m_pMutex->Unlock();    return rc;};STDMETHODIMPRTSPClientProtocol::OnStreamDone(HX_RESULT status, UINT16 uStreamNumber){    m_pMutex->Lock();    HX_RESULT rc = m_pResp->HandleStreamDone(status, uStreamNumber);    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::OnSourceDone(void){    m_pMutex->Lock();    HX_RESULT rc = m_pResp->HandleSourceDone();    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::OnProtocolError(HX_RESULT status){    HX_RESULT rc = HXR_OK;    // called from transport layer    m_pMutex->Lock();    if (m_sessionList.IsEmpty() || m_bSessionSucceeded)    {	rc = m_pResp->HandleProtocolError(status);    }    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::GetStatus(    REF(UINT16) uStatusCode,    REF(IHXBuffer*) pStatusDesc,    REF(UINT16) ulPercentDone){#if 0    m_pMutex->Lock();    HX_RESULT rc = HXR_OK;    CHXMapLongToObj::Iterator i = m_pTransportStreamMap->Begin();    if(i != m_pTransportStreamMap->End())    {	RTSPTransport* pTrans = (RTSPTransport*)(*i);	rc = pTrans ? pTrans->getStatus(uStatusCode, pStatusDesc, ulPercentDone) : HXR_OK;    }    else    {	uStatusCode = HX_STATUS_BUFFERING;	pStatusDesc = 0;	ulPercentDone = 0;    }    m_pMutex->Unlock();    return rc;#else    return HXR_NOTIMPL;#endif}STDMETHODIMPRTSPClientProtocol::InitializeStatistics(    UINT32 ulRegistryID){    HX_RESULT rc = HXR_FAIL;    m_pMutex->Lock();    CHXMapLongToObj::Iterator i = m_pTransportStreamMap->Begin();    if(i != m_pTransportStreamMap->End())    {	RTSPTransport* pTrans = (RTSPTransport*)(*i);	rc = pTrans ? pTrans->initializeStatistics(ulRegistryID) : HXR_FAIL;    }    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::UpdateStatistics(){    HX_RESULT rc = HXR_FAIL;    m_pMutex->Lock();    CHXMapLongToObj::Iterator i = m_pTransportStreamMap->Begin();    if(i != m_pTransportStreamMap->End())    {	RTSPTransport* pTrans = (RTSPTransport*)(*i);	rc = pTrans ? pTrans->updateStatistics() : HXR_FAIL;    }    m_pMutex->Unlock();    return rc;}STDMETHODIMPRTSPClientProtocol::OnPacket(UINT16 uStreamNumber, BasePacket** ppPacket){    BasePacket* pPacket;    m_pMutex->Lock();    for (; (pPacket = *ppPacket); ppPacket++)    {	SendPacket(pPacket);    }    m_pMutex->Unlock();    return HXR_OK;}/* * RTSPClientProtocol methods */HX_RESULTRTSPClientProtocol::HandleUnexpected(RTSPMessage* pMsg){    m_pMutex->Lock();    RTSPResponseMessage* pRspMsg = makeResponseMessage(pMsg->seqNo(), "405");    pRspMsg->addHeader("Allow", allowedMethods());    sendResponse(pRspMsg);    delete pRspMsg;    m_pMutex->Unlock();    return HXR_OK;}HX_RESULTRTSPClientProtocol::HandleBadVersion(RTSPMessage* pMsg){    m_pMutex->Lock();    RTSPResponseMessage* pRspMsg = makeResponseMessage(pMsg->seqNo(), "505");    sendResponse(pRspMsg);    delete pRspMsg;    m_pMutex->Unlock();    return HXR_OK;}HX_RESULTRTSPClientProtocol::HandleOptions(RTSPOptionsMessage* pMsg){    sendResponse(pMsg->seqNo(), "200");    return HXR_OK;}HX_RESULTRTSPClientProtocol::HandleTeardown(RTSPTeardownMessage* pMsg){    m_pMutex->Lock();    RTSPResponseMessage* pRespMsg = makeResponseMessage(pMsg->seqNo(), "200");    sendResponse(pRespMsg);    delete pRespMsg;    m_pMutex->Unlock();    return HXR_OK;}HX_RESULTRTSPClientProtocol::HandleGetParam(RTSPGetParamMessage* pMsg){    IHXBuffer* pBuffer = 0;    m_pMutex->Lock();    const char* pParamName = pMsg->getContent();    HX_RESULT rc = m_pResp->HandleGetParameterRequest(	RTSP_PARAM_STRING, pParamName, &pBuffer);    RTSPResponseMessage* pRespMsg = 0;    if(rc == HXR_OK)    {	pRespMsg = makeResponseMessage(pMsg->seqNo(), "200");	sendResponse(pRespMsg, (const char*)pBuffer->GetBuffer(),	    "text/rtsp-parameters");    }    else    {	

⌨️ 快捷键说明

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