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

📄 rtspprotocol.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                spIHXObjectConfigurationAuthenticator =                (                    spIUnknownAuthenticator                );                spIHXObjectConfigurationAuthenticator->SetContext                (                    pIUnknownContext                );                m_spIHXClientAuthConversationAuthenticator =                (                    spIUnknownAuthenticator                );            }        }        if        (            m_spIHXClientAuthConversationAuthenticator.IsValid()            &&            !m_spIHXClientAuthConversationAuthenticator->IsDone()        )        {            HX_ASSERT(m_pRequest);            if (m_pRequest)            {                m_pRequest->SetResponseHeaders                (                    pIHXValuesHeaders                );                HX_RESULTRet =                (                    m_spIHXClientAuthConversationAuthenticator->MakeResponse                    (                        this,                        m_pRequest                    )                );            }            else            {                // Auth Failed!                m_spIHXClientAuthConversationAuthenticator->Authenticated(FALSE);                mOwner->ReportError(HXR_NOT_AUTHORIZED);            }            // Flow continues in ResponseReady()        }        else        {            // Auth Failed!            if (m_spIHXClientAuthConversationAuthenticator.IsValid())            {                m_spIHXClientAuthConversationAuthenticator->Authenticated(FALSE);            }            mOwner->ReportError(HXR_NOT_AUTHORIZED);        }        HX_RELEASE(pIUnknownContext);        return HXR_OK;    }    return HXR_OK;}STDMETHODIMPRTSPProtocol::AuthenticationRequestDone(HX_RESULT result,                                        const char* user,                                        const char* password){    return HXR_NOTIMPL;}#endif /* HELIX_FEATURE_AUTHENTICATION */// XXXGo - IPTV_HACKvoidRTSPProtocol::hackCookie(IHXBuffer* pCookie){    HX_ASSERT(m_bUseRTP);    // XXXGo - Interop Hack    // IP/TV send a spec incomplient cookie...take care of it for now while    // we get them to fix it.    // we will assume Set-Cookie has just NAME=VALUE paris.    IHXBuffer* pBuffer = new CHXBuffer();    pBuffer->AddRef();    pBuffer->Set((const BYTE*)pCookie->GetBuffer(),            strlen((const char*)pCookie->GetBuffer()) +1);    IHXBuffer* pBuf = NULL;    char* pcOneCookie = (char*)pBuffer->GetBuffer();    char* pc = pcOneCookie;    char* pcKey = NULL;    // go thorough each ';'    for (;;)    {        pc = strchr(pc, ';');        if (pc)        {            pBuf = new CHXBuffer();            pBuf->AddRef();            *pc = NULL;            pBuf->Set((const BYTE*)pcOneCookie, strlen(pcOneCookie) + 1);            mOwner->SetCookie(pBuf);            HX_RELEASE(pBuf);            pcOneCookie = ++pc;        }        else        {            // just set it            pBuf = new CHXBuffer();            pBuf->AddRef();            pBuf->Set((const BYTE*)pcOneCookie, strlen(pcOneCookie) + 1);            mOwner->SetCookie(pBuf);            HX_RELEASE(pBuf);            break;        }    }}HX_RESULTRTSPProtocol::SwitchToUnicast(void){    HX_RESULT   rc = HXR_FAILED;    IHXBuffer* pBuffer = NULL;    if (mOwner && mOwner->m_pFileHeader)    {        // get a URL from the file header.  No URL, no Unicast!        if (HXR_OK == mOwner->m_pFileHeader->GetPropertyCString("UnicastURL", pBuffer) &&            pBuffer)        {            rc = HandleRedirectRequest((const char*)pBuffer->GetBuffer(), 0);        }        HX_RELEASE(pBuffer);    }    return rc;}STDMETHODIMPRTSPProtocol::HandleOptionsResponse(HX_RESULT status,    IHXValues* pHeader){    if (FAILED(status))    {        mOwner->ReportError(status);        return status;    }    else if (HXR_REDIRECTION == status)    {        // expect a redirection message soon!        m_idleState = NULL_STATE;        BOOL bHackCookie = FALSE;        IHXBuffer* pAgent = NULL;        if (pHeader->GetPropertyCString("User-Agent", pAgent) == HXR_OK)        {            if (strncasecmp((const char*)pAgent->GetBuffer(), "Cisco IP/TV",                11) == 0)            {                bHackCookie = TRUE;            }        }        HX_RELEASE(pAgent);        // retrieve cookies from the response header        IHXKeyValueList* pKeyValueList = NULL;        if (HXR_OK == pHeader->QueryInterface(IID_IHXKeyValueList,                                        (void**)&pKeyValueList))        {            IHXKeyValueListIterOneKey* pListIter = NULL;            IHXBuffer* pCookie = NULL;            pKeyValueList->GetIterOneKey("Set-Cookie",pListIter);            while (pListIter->GetNextString(pCookie) == HXR_OK)            {                // XXXGo - IPTV_HACK                if (bHackCookie)                {                    hackCookie(pCookie);                }                else                {                    mOwner->SetCookie(pCookie);                }                HX_RELEASE(pCookie);            }            HX_RELEASE(pListIter);        }        HX_RELEASE(pKeyValueList);        return HXR_OK;    }    m_bConnectDone = TRUE;    HX_RESULT result = HXR_OK;    result = m_pProtocolLib->SendStreamDescriptionRequest    (        mPath,        m_spIHXValuesStoredHeaders    );    return result;}STDMETHODIMPRTSPProtocol::HandleStreamDescriptionResponse(HX_RESULT      status,                                                IHXValues*    pFileHeader,                                                CHXSimpleList* pHeaderList,                                                IHXValues*    pResponseHeaders){    HX_RESULT   hr = HXR_OK;    if (FAILED(status))    {        if (!pFileHeader || !pHeaderList)        {            /*             * XXX...Need to get proper errors from protocol library             */            mOwner->ReportError(status);//ConvertHResultToHXError(status));            return (status != (UINT32)HXR_OK) ? status : (UINT32)HXR_FAIL;        }    }    else if (!pFileHeader || !pHeaderList)    {        // Not a severe failure, need to try again.        return m_pProtocolLib->SendStreamDescriptionRequest(mPath,                                                m_spIHXValuesStoredHeaders);    }#if defined(HELIX_FEATURE_REVERTER)    // DESCRIBE Succeeded!    //    m_pDataRevert->RevertHeaders(pFileHeader, pHeaderList, pResponseHeaders);#else    RevertHeadersDone(pFileHeader,                      pHeaderList,                      pResponseHeaders,                      FALSE);#endif /* HELIX_FEATURE_REVERTER */    return HXR_OK;}/* * IHXPreferredTransportSink methods */STDMETHODIMPRTSPProtocol::TransportSucceeded(TransportMode  /* IN */   prefTransportType,                                 UINT16         /* IN */   uCloakPort){    if (m_bHTTPOnly)    {        return mOwner->TransportSucceeded(HTTPCloakMode, uCloakPort);    }    // we ignore the TCP control channel succeeded message if we are attempting    // Multicast or UDP    else if (mCurrentTransport == prefTransportType)    {        return mOwner->TransportSucceeded(prefTransportType, uCloakPort);    }    else    {        HX_ASSERT(mCurrentTransport == UDPMode || mCurrentTransport == MulticastMode);    }    return HXR_OK;}STDMETHODIMPRTSPProtocol::TransportFailed(){    return mOwner->TransportFailed();}voidRTSPProtocol::RevertHeadersDone(IHXValues* pFileHeader,                                CHXSimpleList* pHeaderList,                                IHXValues* pResponseHeaders,                                BOOL bUseReverter){    HX_RESULT status = HXR_OK;    ULONG32 tempLiveStream = 0;    pFileHeader->GetPropertyULONG32("LiveStream", tempLiveStream);    mLiveStream = (tempLiveStream > 0)?TRUE:FALSE;#if defined(HELIX_FEATURE_REVERTER)    if (bUseReverter && m_pDataRevert)    {        m_pProtocolLib->InitPacketFilter(m_pDataRevert);    }#endif /* HELIX_FEATURE_REVERTER */    ULONG32 ulFlags = 0;    pFileHeader->GetPropertyULONG32("Flags", ulFlags);    mSaveAsAllowed = ulFlags & HX_SAVE_ENABLED ? TRUE : FALSE;    IHXBuffer* pBuffer = NULL;    if (HXR_OK == pResponseHeaders->GetPropertyCString("StatsMask", pBuffer))    {        mSendStatsMask = atoi((const char*)pBuffer->GetBuffer());        mOwner->SetOption(HX_STATS_MASK, &mSendStatsMask);    }    HX_RELEASE(pBuffer);    if (HXR_OK == pResponseHeaders->GetPropertyCString("StatsInterval", pBuffer))    {        UINT32 ulStatsInterval = 1000* atoi((const char*)pBuffer->GetBuffer());        // ulStatsInterval = 0 to disable the stats        if (ulStatsInterval && ulStatsInterval < MINIMUM_STATS_INTERVAL)        {            ulStatsInterval = MINIMUM_STATS_INTERVAL;        }        mOwner->SetOption(HX_STATS_INTERVAL, &ulStatsInterval);    }    HX_RELEASE(pBuffer);    if (HXR_OK == pResponseHeaders->GetPropertyCString("MaxBandwidth", pBuffer))    {        UINT32 ulMaxBandwidth = atoi((const char*)pBuffer->GetBuffer());        // ulMaxBandwidth = 0 to disable the faststart        mOwner->SetOption(HX_MAX_BANDWIDTH, &ulMaxBandwidth);    }    HX_RELEASE(pBuffer);    if (HXR_OK == pResponseHeaders->GetPropertyCString("TurboPlay", pBuffer))    {        BOOL bTurboPlay = (BOOL)atoi((const char*)pBuffer->GetBuffer());        mOwner->SetOption(HX_TURBO_PLAY, &bTurboPlay);    }    HX_RELEASE(pBuffer);    // UseRTP was set from RTSPClientProtocol::handleDescribeResponse when    // it detected we were not playing a stream from a RealServer.    ULONG32 ulTemp = 0;    if (HXR_OK == pResponseHeaders->GetPropertyULONG32("UseRTP", ulTemp))    {        m_bUseRTP = ulTemp;    }    // retrieve cookies from the response header    IHXKeyValueList* pKeyValueList = NULL;    if (HXR_OK == pResponseHeaders->QueryInterface(IID_IHXKeyValueList,                                                    (void**)&pKeyValueList))    {        IHXKeyValueListIterOneKey* pListIter = NULL;        IHXBuffer* pCookie = NULL;        pKeyValueList->GetIterOneKey("Set-Cookie",pListIter);        while (pListIter->GetNextString(pCookie) == HXR_OK)        {            mOwner->SetCookie(pCookie);            HX_RELEASE(pCookie);        }        HX_RELEASE(pListIter);    }    HX_RELEASE(pKeyValueList);    m_pRequest->SetResponseHeaders(pResponseHeaders);    // notify the source file header is ready    mOwner->FileHeaderReady(pFileHeader);    UINT32 ulNumHeaders = (UINT32) pHeaderList->GetCount();    HX_ASSERT(m_pStreamInfoList->IsEmpty() == TRUE);    if (m_pStreamInfoList->IsEmpty() && ulNumHeaders > 0 &&        ulNumHeaders < m_pStreamInfoList->GetHashTableSize())    {        m_pStreamInfoList->InitHashTable(ulNumHeaders);    }    CHXSimpleList::Iterator i;    for (i = pHeaderList->Begin(); i != pHeaderList->End(); ++i)    {        IHXValues* pHeader = (IHXValues*)(*i);        mOwner->HeaderCallback(pHeader);        if(!m_bIsASMSource)        {            // see if there's an ASMRuleBook in the stream header and set            //flag for QI. only need to get one rulebook to make this TRUE            IHXBuffer* pRuleBook = NULL;            pHeader->GetPropertyCString("ASMRuleBook", pRuleBook);            if(pRuleBook)            {                m_bIsASMSource = TRUE;                pRuleBook->Release();            }        }        /*         * Need to maintain status for the streams         */        HX_RESULT result;        UINT32 ulStreamNumber = 0;        UINT32 ulClipBandwidth = 0;        IHXBuffer* pMimeType = NULL;        result = pHeader->GetPropertyULONG32("StreamNumber", ulStreamNumber);        if (result != HXR_OK)        {            return;        }        pHeader->GetPropertyCString("MimeType", pMimeType);        pHeader->GetPropertyULONG32("AvgBitRate", ulClipBandwidth);        RTSP_STREAM_INFO* pStreamInfo = new RTSP_STREAM_INFO;        pStreamInfo->m_uStreamNumber = (UINT16)ulStreamNumber;        pStreamInfo->m_ulClipBandwidth = ulClipBandwidth;#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)        pStreamInfo->m_pStreamStats = create_statistics((UINT16)ulStreamNumber);        if (pStreamInfo->m_pStreamStats)        {            pStreamInfo->m_pStreamStats->m_pClipBandwidth->SetInt(0);            if (pMimeType)            {                pStreamInfo->m_pStreamStats->m_pMimeType->SetStr((char*)pMimeType->GetBuffer());            }        }#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */        HX_RELEASE(pMimeType);        (*m_pStreamInfoList)[ulStreamNumber] = pStreamInfo;        m_uStreamCount++;    }    mReceivedControl        = TRUE;    m_uCurrentStreamCount   = m_uStreamCount;    m_idleState             = INIT_SOCKETS_STATE;}voidRTSPProtocol::SendControlBuffer(IHXBuffer* pBuffer){    char* p64Buf = new char[pBuffer->GetSize() * 2 + 4];    BinTo64((const unsigned char*)pBuffer->GetBuffer(),            pBuffer->GetSize(), p64Buf);    m_pProtocolLib->SendSetParameterRequest("DataConvertBuffer", "1",            "base64", p64Buf);    delete[] p64Buf;}UINT16RTSPProtocol::GetRDTFeatureLevel(void){#if defined(HELIX_FEATURE_RDT)    if (m_pProtocolLib)    {        return ((RTSPClientProtocolExt*)m_pProtocolLib)->GetRDTFeatureLevel();    }    else#endif /* HELIX_FEATURE_RDT */    {        return 0;    }}voidRTSPProtocol::LeavePrefetch(void){    m_bPrefetch = FALSE;    if (m_pProtocolLib)    {        ((RTSPClientProtocol*)m_pProtocolLib)->LeavePrefetch();    }    return;}voidRTSPProtocol::EnterFastStart(void){    m_bFastStart = TRUE;    if (m_pProtocolLib)    {        ((RTSPClientProtocol*)m_pProtocolLib)->EnterFastStart();

⌨️ 快捷键说明

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