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

📄 rtspprotocol.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    }    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 + -