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

📄 rtspclnt.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    if (HXR_OK != m_pContext->QueryInterface(IID_IHXNetworkServices, (void**)&m_pNetworkServices) ||	HXR_OK != m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences))    {	hresult = HXR_FAILED;        goto cleanup;    }    if (NULL == pHostName &&        NULL != pInfo &&        HXR_OK == pInfo->GetPropertyCString("helix-sdp", pSrcBuffer))    {        m_bSDPInitiated = TRUE;        if (HXR_OK != ParseSDP("application/sdp", pSrcBuffer))        {            hresult = HXR_FAILED;            goto cleanup;        }        if (!m_sessionHost.IsEmpty())        {	    UINT32 addr = HXinet_addr((const char*)m_sessionHost);	    UINT32 ulHostAddr = DwToHost(addr);            if (ulHostAddr >= MULTICAST_ADDRESS_RANGE_LOW &&                ulHostAddr <= MULTICAST_ADDRESS_RANGE_HIGH)            {                m_bMulticast = TRUE;                m_ulMulticastAddress = ulHostAddr;                pHostName = (const char*)m_sessionHost;                pInfo->SetPropertyULONG32("MulticastOnly", 1);                m_pSDPFileHeader->SetPropertyULONG32("LiveStream", 1);            }        }        if (!m_bMulticast)        {            pURL = new CHXURL(m_headerControl);            if (!(pURLProps = pURL->GetProperties()))            {                hresult = HXR_FAILED;                goto cleanup;            }            ULONG32 ulForeignPort = 0;            pURLProps->GetPropertyULONG32(PROPERTY_PORT, ulForeignPort);            foreignPort = (UINT16)ulForeignPort;            if (HXR_OK != pURLProps->GetPropertyBuffer(PROPERTY_HOST, pHostBuffer))            {                hresult = HXR_FAILED;                goto cleanup;            }            pHostName = (char*)pHostBuffer->GetBuffer();        }    }    ReadPrefINT32(m_pPreferences, "ConnectionTimeOut", m_uConnectionTimeout);    ReadPrefINT32(m_pPreferences, "ServerTimeOut", m_ulServerTimeOut);    if (m_ulServerTimeOut < MINIMUM_TIMEOUT)    {        m_ulServerTimeOut = MINIMUM_TIMEOUT;    }    m_ulServerTimeOut *= MILLISECS_PER_SECOND;    if (bHTTPCloak && m_bUseProxy)    {	m_bUseHTTPProxy = TRUE;    }    ReadPrefBOOL(m_pPreferences, "RTSPMessageDebug", m_bMessageDebug);    if (m_bMessageDebug)    {	if (HXR_OK == m_pPreferences->ReadPref("RTSPMessageDebugFile", pBuffer))	{	    if (pBuffer->GetSize() <= 0)	    {		// no file name, no log		m_bMessageDebug = FALSE;	    }	    else	    {		m_messageDebugFileName = (const char*)pBuffer->GetBuffer();	    }	}        HX_RELEASE(pBuffer);    }    // XXXGo - Interop workaround    ReadPrefBOOL(m_pPreferences, "NonRS", m_bNonRSRTP);    if (m_bNonRSRTP)    {	m_pIsMethodSupported[SET_PARAM] = FALSE;	m_pIsMethodSupported[GET_PARAM] = FALSE;	m_pIsMethodSupported[RECORD] = FALSE;	m_pIsMethodSupported[ANNOUNCE] = FALSE;    }    ReadPrefBOOL(m_pPreferences, "RTSPNoReuseConnection", bNoReuseConnection);    ReadPrefBOOL(m_pPreferences, "LoadTest", m_bLoadTest);    if (!m_pTransportStreamMap)    {	m_pTransportStreamMap = new CHXMapLongToObj;        if(!m_pTransportStreamMap)        {            hresult = HXR_OUTOFMEMORY;            goto cleanup;        }    }    if (!m_pTransportPortMap)    {	m_pTransportPortMap = new CHXMapLongToObj;        if(!m_pTransportPortMap)        {            hresult = HXR_OUTOFMEMORY;            goto cleanup;        }    }    if (!m_pTransportMPortMap)    {	m_pTransportMPortMap = new CHXMapLongToObj;        if(!m_pTransportMPortMap)        {            hresult = HXR_OUTOFMEMORY;            goto cleanup;        }    }    m_hostName = pHostName;    m_foreignPort = foreignPort;    m_bHTTPOnly	= bHTTPCloak;    m_uCloakPort = uCloakPort;    m_bNoReuseConnection = bNoReuseConnection;    if (m_bHTTPOnly)    {	m_currentTransport = HTTPCloakMode;    }    if(pSessionHeaders && !m_pSessionHeaders)    {	m_pSessionHeaders = pSessionHeaders;	m_pSessionHeaders->AddRef();    }    HX_RELEASE(m_pResponseHeaders);    if (HXR_OK != m_pCommonClassFactory->CreateInstance(CLSID_IHXKeyValueList, (void**)&pUnknown))    {	hresult = HXR_FAILED;	goto cleanup;    }    if (HXR_OK != pUnknown->QueryInterface(IID_IHXKeyValueList, (void**)&m_pResponseHeaders))    {	hresult = HXR_FAILED;	goto cleanup;    }    if(!m_pRegistry)    {#if defined(HELIX_FEATURE_REGISTRY)	// get registry ptr	IHXRegistry* pRegistry = 0;	hresult = m_pContext->QueryInterface(IID_IHXRegistry,					(void**)&pRegistry);	HX_VERIFY(HXR_OK == hresult);	if(hresult == HXR_OK)	{	    m_pRegistry = pRegistry;	}#endif /* HELIX_FEATURE_REGISTRY */    }    if(!m_pResolver)    {	m_pNetworkServices->CreateResolver(&pResolver);	if(!pResolver)	{	    hresult = HXR_OUTOFMEMORY;	    goto cleanup;	}	HX_RELEASE(m_pResolver);	m_pResolver = pResolver;	m_pResolver->Init(this);        CHXString pHost;	if (m_bUseHTTPProxy || m_bUseProxy)	{            pHost = m_proxyHost;        }        else        {            pHost = m_hostName;        }	if(IsNumericAddr(pHost, pHost.GetLength()))	{	    UINT32 addr = HXinet_addr((const char*)pHost);	    UINT32 ulHostAddr = DwToHost(addr);	    hresult = GetHostByNameDone(HXR_OK, ulHostAddr);	}	else	{	    hresult = m_pResolver->GetHostByName(pHost);	}    }    HX_RELEASE(m_pScheduler);    if (HXR_OK != m_pContext->QueryInterface(IID_IHXScheduler,                                             (void**)&m_pScheduler))    {	hresult = HXR_OUTOFMEMORY;	goto cleanup;    }    // check for UAProf headers    if (m_pPreferences)    {	HX_RELEASE(m_pUAProfURI);	HX_RELEASE(m_pUAProfDiff);	m_pPreferences->ReadPref("XWapProfileURI", m_pUAProfURI);	m_pPreferences->ReadPref("XWapProfileDiff", m_pUAProfDiff);    }#if defined(_MACINTOSH)    if (m_pCallback &&	m_pCallback->m_bIsCallbackPending &&	m_pScheduler)    {	m_pCallback->m_bIsCallbackPending = FALSE;	m_pScheduler->Remove(m_pCallback->m_Handle);    }#endif /* _MACINTOSH */cleanup:    HX_RELEASE(pSrcBuffer);    HX_RELEASE(pURLProps);    HX_RELEASE(pUnknown);    HX_RELEASE(pHostBuffer);                HX_DELETE(pURL);    return hresult;}STDMETHODIMPRTSPClientProtocol::SetProxy(const char* pProxyHost, UINT16 uProxyPort){    m_bUseProxy = TRUE;    m_proxyHost = pProxyHost;    m_proxyPort = uProxyPort;    return HXR_OK;}STDMETHODIMPRTSPClientProtocol::SetResponse(IHXRTSPClientProtocolResponse* pResp){    HX_RELEASE(m_pResp);    m_pResp = pResp;    m_pResp->AddRef();    return HXR_OK;}STDMETHODIMPRTSPClientProtocol::SetBuildVersion(const char* pVersionString){    m_versionString = pVersionString;    return HXR_OK;}STDMETHODIMPRTSPClientProtocol::Done(){    m_bClientDone = TRUE;    if (m_pMutex)    {	m_pMutex->Lock();    }#if defined(_MACINTOSH)    if (m_pCallback &&	m_pCallback->m_bIsCallbackPending &&	m_pScheduler)    {	m_pCallback->m_bIsCallbackPending = FALSE;	m_pScheduler->Remove(m_pCallback->m_Handle);    }    HX_RELEASE(m_pCallback);#endif /* _MACINTOSH */    while (!m_sessionList.IsEmpty())    {	RTSPClientSession* pTempSession = (RTSPClientSession*)m_sessionList.RemoveHead();	m_pSessionManager->removeFromSession(this, pTempSession);    }    HX_ASSERT(m_pSessionManager && m_pSessionManager->isValid());    if (m_pSession)    {	m_pSessionManager->removeFromSession(this, m_pSession);        m_pSession = NULL;    }    HX_RELEASE(m_pSessionManager);    clearSocketStreamMap(m_pUDPSocketStreamMap);    clearSocketStreamMap(m_pRTCPSocketStreamMap);    reset();    if (m_pMutex)    {	m_pMutex->Unlock();    }    return HXR_OK;}STDMETHODIMPRTSPClientProtocol::SendStreamDescriptionRequest(const char* pURL,    IHXValues* pRequestHeaders){#ifdef _MACINTOSH    if (m_pInterruptState && m_pInterruptState->AtInterruptTime())    {	/*	* We cannot load DLLs (Stream Desc Plugins) at deferred time.	* Also, encodeURL calls HXIsLeadByte->CharType->...internally	* calls GetPort. Mac does not like that either at deferred time.	* Schedule a callback and do this operation at system time	*/	if (!m_pCallback)	{	    m_pCallback = new RTSPClientProtocolCallback(this);            if(!m_pCallback)            {                return HXR_OUTOFMEMORY;            }	    m_pCallback->AddRef();	}	HX_ASSERT(m_pScheduler);	if (!m_pCallback->m_bIsCallbackPending)	{	    m_pCallback->m_bIsCallbackPending = TRUE;	    m_pCallback->m_Handle =		m_pScheduler->RelativeEnter(m_pCallback, 0);	}	/*	* If we receive a SendStreamDescriptionRequest when	* one is already pending, we do not queue them up.	* The last one wins	*/	m_pCallback->m_PendingDescURL = pURL;	HX_RELEASE(m_pCallback->m_pPendingRequestHeaders);	m_pCallback->m_pPendingRequestHeaders = pRequestHeaders;	m_pCallback->m_pPendingRequestHeaders->AddRef();	return HXR_OK;    }    HX_ASSERT(m_pScheduler);    /* remove any previously scheduled callback */    if (m_pCallback &&	m_pCallback->m_bIsCallbackPending)    {	m_pCallback->m_bIsCallbackPending = FALSE;	m_pScheduler->Remove(m_pCallback->m_Handle);    }#endif    return sendPendingStreamDescription(pURL, pRequestHeaders);}HX_RESULTRTSPClientProtocol::sendPendingStreamDescription(const char* pURL,    IHXValues* pRequestHeaders){    m_pMutex->Lock();    HX_RESULT rc = HXR_OK;    if (HXR_OUTOFMEMORY == extractExistingAuthorizationInformation(pRequestHeaders))    {        m_pMutex->Unlock();        return HXR_OUTOFMEMORY;    }    RTSPDescribeMessage* pMsg = new RTSPDescribeMessage;    if(!pMsg)    {        m_pMutex->Unlock();        return HXR_OUTOFMEMORY;    }    CHXString encodedURL;    CHXURL::encodeURL(pURL, encodedURL);    UINT32 stringSize = 7 + m_hostName.GetLength() + 1 + 5 + 1 + encodedURL.GetLength() + 1;    char* pURLBuffer = new char[ stringSize ];    if(!pURLBuffer)    {        HX_DELETE(pMsg);        m_pMutex->Unlock();        return HXR_OUTOFMEMORY;    }    SafeSprintf( pURLBuffer, stringSize, "rtsp://%s:%u/%s", (const char*)m_hostName, m_foreignPort, (const char*)encodedURL ); /* Flawfinder: ignore */    m_url = pURLBuffer;    delete [] pURLBuffer;    pMsg->setURL(m_url);    IHXValues* pValuesRequestHeaders = NULL;    pValuesRequestHeaders = new CHXHeader();    if(!pValuesRequestHeaders)    {        HX_DELETE(pMsg);        m_pMutex->Unlock();        return HXR_OUTOFMEMORY;    }    pValuesRequestHeaders->AddRef();    if (m_bEntityRequired)    {	CHXString CHXStringRequireValue	(	    RTSPClientProtocol::RTSPRequireOptionsTable	    [		RTSPClientProtocol::RTSP_REQUIRE_ENTITY	    ].pcharOption	);	IHXBuffer* pBufferRequireValue = NULL;	CHXBuffer::FromCharArray	(	    CHXStringRequireValue.GetBuffer(0),	    &pBufferRequireValue	);	// Set require header	pValuesRequestHeaders->SetPropertyCString	(	    "Require",	    pBufferRequireValue	);	HX_RELEASE(pBufferRequireValue);    }    addUAProfHeaders(pValuesRequestHeaders);    CHXHeader::mergeHeaders    (	pValuesRequestHeaders,	pRequestHeaders    );    // get all StreamDescription plugin mime types    CHXString mimeTypes;    IHXCommonClassFactory*	pClassFactory	    = NULL;    IHXPluginGroupEnumerator*	pPluginGroupEnum    = NULL;    // ok we are going to get an IRMA PluginGroupEnumerator from the core.    if    (	SUCCEEDED	(	    m_pContext->QueryInterface	    (		IID_IHXCommonClassFactory,		(void**) &pClassFactory	    )	)    )    {	pClassFactory->CreateInstance	(	    CLSID_IHXPluginGroupEnumerator,	    (void**)&pPluginGroupEnum	);	HX_RELEASE(pClassFactory);    }    if(pPluginGroupEnum &&       (HXR_OK == pPluginGroupEnum->Init(IID_IHXStreamDescription)))    {	IUnknown* pUnknown = NULL;	ULONG32 ulNumPlugins = pPluginGroupEnum->GetNumOfPlugins();	for(ULONG32 i=0;i<ulNumPlugins;++i)	{	    if (SUCCEEDED(pPluginGroupEnum->GetPlugin(i, pUnknown)))	    {                GetStreamDescriptionInfo(pUnknown, mimeTypes);                HX_RELEASE(pUnknown);	    }	}    }    else    {	// if we don't have a CCF or we don't have a pluginGroupEnumerator	// then we will have to use a plugin Enumerator.	IHXPluginEnumerator* pPluginEnumerator = NULL;	m_pContext->QueryInterface	(	    IID_IHXPluginEnumerator,	    (void**)&pPluginEnumerator	);	if(pPluginEnumerator)	{	    IUnknown* pUnknown = NULL;            ULONG32 ulNumPlugins = pPluginEnumerator->GetNumOfPlugins();	    for(ULONG32 i=0;i<ulNumPlugins;++i)	    {		if(SUCCEEDED(pPluginEnumerator->GetPlugin(i, pUnknown)))		{                    GetStreamDescriptionInfo(pUnknown, mimeTypes);                    HX_RELEASE(pUnknown);                }

⌨️ 快捷键说明

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