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

📄 rtspprotocol.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
cleanup:    // Clear the authentication cache    if (m_pRegistry)    {        m_pRegistry->DeleteByName("CredCache");    }    return theErr;}STDMETHODIMPRTSPProtocol::HandleUseProxyRequest(    const char* pProxyURL){    HX_RESULT rc = HXR_OK;    if(!pProxyURL)    {        mOwner->ReportError(HXR_DNR);    }    else    {        char* pProxyHost = NULL;        UINT32 ulProxyPort = 0;        // parse host name, port        CHXURL proxyURL(pProxyURL);        IHXValues* pProxyURLProps = proxyURL.GetProperties();        IHXBuffer* pBuffer = NULL;        if(HXR_OK == pProxyURLProps->GetPropertyBuffer(PROPERTY_HOST, pBuffer))        {            pProxyHost = new char[pBuffer->GetSize()+1];            strcpy(pProxyHost, (char*)pBuffer->GetBuffer()); /* Flawfinder: ignore */            HX_RELEASE(pBuffer);        }        pProxyURLProps->GetPropertyULONG32(PROPERTY_PORT, ulProxyPort);        HX_RELEASE(pProxyURLProps);        if(pProxyHost)        {            initialize_members();            set_proxy(pProxyHost, (UINT16)ulProxyPort);            // copy host/path so setup doesn't override            char* pHost = new_string(mHost);            char* pPath = new_string(mPath);            rc = setup(pHost, pPath, mPort, mLossCorrection,                       m_bHTTPOnly, m_bSDPInitiated, mCloakPort);            delete[] pHost;            delete[] pPath;        }        delete[] pProxyHost;    }    return rc;}STDMETHODIMPRTSPProtocol::HandleRedirectRequest(    const char* pURL,    UINT32 msFromNow){    HX_RESULT   rc = HXR_OK;    char*       pHostStr = NULL;    char*       pResource = NULL;    UINT32      ulPort = 0;    IHXValues*  pHeader = NULL;    if(pURL)    {        CHXURL urlObj(pURL);        pHeader = urlObj.GetProperties();        IHXBuffer* pBuffer = 0;        if (HXR_OK != pHeader->GetPropertyBuffer(PROPERTY_HOST, pBuffer))        {            rc = HXR_FAILED;            goto cleanup;        }        pHostStr = new char[pBuffer->GetSize()+1];        strcpy(pHostStr, (char*)pBuffer->GetBuffer()); /* Flawfinder: ignore */        pBuffer->Release();        if (HXR_OK != pHeader->GetPropertyBuffer(PROPERTY_RESOURCE, pBuffer))        {            rc = HXR_FAILED;            goto cleanup;        }        pResource = (char*)pBuffer->GetBuffer();        ulPort = 0;        pHeader->GetPropertyULONG32(PROPERTY_PORT, ulPort);        mOwner->SetRedirectURL(pHostStr, (UINT16)ulPort, pResource, &urlObj);        m_LastError = HXR_REDIRECTION;        pBuffer->Release();        delete[] pHostStr;    }    else    {        mOwner->ReportError(HXR_DNR);    }cleanup:    HX_RELEASE(pHeader);    return rc;}STDMETHODIMPRTSPProtocol::HandlePacket(    HX_RESULT   status,    const char* pSessionID,    IHXPacket* pPacket){    if (HXR_OK == status)    {        /*         * These are flushed pre-seek packets         */        if (pPacket)        {            CHXEvent* pEvent = new CHXEvent(pPacket);            pEvent->SetPreSeekEvent();            mOwner->EventReady(pEvent);        }        // HandlePacket is called with pPacket=NULL to indicate        // the liveness of TCP/UDP data connection in order to        // detect the server timeout        else        {            m_ulLastPacketReceivedTime = HX_GET_TICKCOUNT();        }    }    return HXR_OK;}STDMETHODIMPRTSPProtocol::HandleProtocolError(    HX_RESULT status){    /*     * XXX...Need to get proper errors from protocol library     */    mOwner->ReportError(status);//ConvertHResultToHXError(status));    m_bPlaying = FALSE;    return status;}STDMETHODIMPRTSPProtocol::HandleRTTResponse(    HX_RESULT status,    const char* pSessionID,    UINT32    ulSecs,    UINT32    ulUSecs){    // we handle RTT response in order to detect    // whether the UDP channel is still alive during PAUSE/RESUME    return HXR_OK;}STDMETHODIMPRTSPProtocol::HandleCongestion(    HX_RESULT status,    const char* pSessionID,    INT32     xmitMultiplier,    INT32     recvMultiplier){    return HXR_NOTIMPL;}STDMETHODIMPRTSPProtocol::HandleSourceDone(void){    mSourceEnd = TRUE;    if (mOwner)    {        mOwner->SetEndOfClip();    }    return HXR_OK;}STDMETHODIMPRTSPProtocol::HandlePrerollChange(THIS_ 				  RTSPPrerollTypeEnum prerollType,				  UINT32 ulPreroll){    if (RTSP_PREROLL_PREDECBUFPERIOD == prerollType)    {	// Handle 3GPP 26.234 Annex G x-initpredecbufperiod field	// This field only updates the preroll for video streams	// Look through all the streams	for (UINT16 uStrmNum = 0; uStrmNum < m_uStreamCount; uStrmNum++)	{	    STREAM_INFO* pStreamInfo = NULL;	    IHXBuffer* pMimeType = NULL;	    // Look for video streams	    if ((HXR_OK == mOwner->GetStreamInfo(uStrmNum, pStreamInfo)) &&		(pStreamInfo->m_pHeader) &&		(HXR_OK == pStreamInfo->m_pHeader->GetPropertyCString("Mimetype",								      pMimeType)) &&		(!strncasecmp("video/", (char*)pMimeType->GetBuffer(), 6)))	    {		// Update the preroll value		pStreamInfo->BufferingState().UpdatePreroll(ulPreroll);	    }	    HX_RELEASE(pMimeType);	}    }    return HXR_OK;}STDMETHODIMPRTSPProtocol::HandleStreamDone(    HX_RESULT status,    UINT16    uStreamNumber){    STREAM_INFO* pStreamInfo;    if (HXR_OK != mOwner->GetStreamInfo(uStreamNumber, pStreamInfo))    {        return HXR_FAIL;    }    HX_ASSERT(!pStreamInfo->m_bSrcStreamDone);    if (!pStreamInfo->m_bSrcStreamDone)    {        pStreamInfo->m_bSrcStreamDone = TRUE;        m_uCurrentStreamCount--;        if (!m_uCurrentStreamCount)        {            mOwner->SetEndOfClip();        }    }    return HXR_OK;}STDMETHODIMPRTSPProtocol::GetStatus(    REF(UINT16) uStatusCode,    REF(IHXBuffer*) pStatusDesc,    REF(UINT16) ulPercentDone){// XXX HP// we no longer care about the buffering at the transport layer// playback starts as soon as we get enough data at BufferManager#if 0    /*     * XXX...This needs to be properly implemented     */    CHXBuffer*          pStatus = NULL;    IUnknown*           pContext = NULL;    IHXClientEngine*    pEngine = NULL;    uStatusCode = HX_STATUS_READY;    ulPercentDone = 100;    pStatusDesc = NULL;    if (!m_bConnectDone)    {        uStatusCode     = HX_STATUS_CONTACTING;        ulPercentDone   = 0;        mOwner->GetContext(pContext);#if defined(HELIX_FEATURE_RESOURCEMGR)        if (pContext &&            HXR_OK == pContext->QueryInterface(IID_IHXClientEngine, (void**)&pEngine))        {            pStatus = ((HXClientEngine *)pEngine)->GetResMgr()->GetMiscString(IDS_STATUS_CONTACTING);        }        pStatusDesc     = new CHXBuffer;        if (!pStatusDesc)        {            return HXR_OUTOFMEMORY;        }        pStatusDesc->AddRef();        CHXString statusDesc = "";        if (pStatus)        {            statusDesc += (const char*) pStatus->GetBuffer();            statusDesc += " ";        }        statusDesc += mHost;        statusDesc += "...";        pStatusDesc->Set((UCHAR*)(const char*) statusDesc,                         strlen((const char*)statusDesc)+1);        HX_RELEASE(pStatus);        HX_RELEASE(pEngine);#endif /* HELIX_FEATURE_RESOURCEMGR */        HX_RELEASE(pContext);        return HXR_OK;    }    else if (m_pPendingStatus)    {        return m_pPendingStatus->GetStatus(uStatusCode,                                           pStatusDesc,                                           ulPercentDone);    }    else    {        uStatusCode = HX_STATUS_BUFFERING;        ulPercentDone = 0;    }    return HXR_OK;#else    return HXR_NOTIMPL;#endif}#if defined(HELIX_FEATURE_STATS)/************************************************************************ *      Method: *          IHXStatistics::InitializeStatistics *      Purpose: *          Pass registry ID to the caller */STDMETHODIMPRTSPProtocol::InitializeStatistics(    UINT32      /*IN*/ ulRegistryID){    m_ulRegistryID = ulRegistryID;    return HXR_OK;}/************************************************************************ *      Method: *          IHXStatistics::UpdateStatistics *      Purpose: *          Notify the user to updates its statistics registry */STDMETHODIMPRTSPProtocol::UpdateStatistics(){    if (!m_pStatistics)    {        return HXR_FAIL;    }    return m_pStatistics->UpdateStatistics();}#endif /* HELIX_FEATURE_STATS */HX_RESULTRTSPProtocol::GetStreamStatistics(    ULONG32 ulStreamNumber,    STREAM_STATS** ppStreamStats){#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)    RTSP_STREAM_INFO* pStreamInfo;    if (!m_pStreamInfoList->Lookup(ulStreamNumber, (void*&)pStreamInfo))    {        *ppStreamStats = NULL;        return HXR_FAIL;    }    *ppStreamStats = pStreamInfo->m_pStreamStats;    return HXR_OK;#else    return HXR_NOTIMPL;#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */}HX_RESULTRTSPProtocol::UpdateRegistry(UINT32 ulStreamNumber,                             UINT32 ulRegistryID){#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)    HX_RESULT result = HXR_OK;    if (!m_pRegistry)    {        return HXR_FAIL;    }    CHXMapLongToObj::Iterator i;    for (i = m_pStreamInfoList->Begin(); i != m_pStreamInfoList->End(); ++i)    {        RTSP_STREAM_INFO* pStreamInfo = (RTSP_STREAM_INFO*)(*i);        if (pStreamInfo->m_uStreamNumber == (UINT16)ulStreamNumber)        {            STREAM_STATS* pTmpStreamStats = new STREAM_STATS(m_pRegistry, ulRegistryID);            *pTmpStreamStats = *pStreamInfo->m_pStreamStats;            HX_DELETE(pStreamInfo->m_pStreamStats);            pStreamInfo->m_pStreamStats = pTmpStreamStats;            if (m_pProtocolLib)            {                ((RTSPClientProtocol*)m_pProtocolLib)->SetStatistics(pStreamInfo->m_uStreamNumber,                                                                     pStreamInfo->m_pStreamStats);            }            break;        }    }    return result;#else    return HXR_NOTIMPL;#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */}STDMETHODIMPRTSPProtocol::RuleChange(REF(CHXSimpleList) pList){    return m_pProtocolLib->RuleChange(&pList);}/* * IHXASMSource methods *//************************************************************************ *      Method: *          IHXASMSource::Subscribe *      Purpose: *          Subscribe to a stream */STDMETHODIMPRTSPProtocol::Subscribe(    UINT16 streamNumber,    UINT16 ruleNumber){    RTSPSubscription sub;    sub.m_streamNumber = streamNumber;    sub.m_ruleNumber = ruleNumber;    sub.m_bIsSubscribe = TRUE;    CHXSimpleList subList;    subList.AddTail(&sub);    return m_pProtocolLib->Subscribe(&subList);}/************************************************************************ *      Method: *          IHXASMSource::Unsubscribe *      Purpose: *          Unsubscribe from a stream */STDMETHODIMPRTSPProtocol::Unsubscribe(    UINT16 streamNumber,    UINT16 ruleNumber){

⌨️ 快捷键说明

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