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

📄 hxntsrc.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    }    delete this;    return 0;}HX_RESULTHXNetSource::Setup(const char*  host,                    const char* resource,                    UINT16      port,                    BOOL        LossCorrection,                    const CHXURL* pURL,                    BOOL        bAltURL){    HX_TRACE("HXNetSource::Setup");    HX_RESULT       theErr = HXR_OK;    IHXValues*      pValues = NULL;    IHXValues*      pRequestHeaders = NULL;    IHXBuffer*      pBuffer = NULL;    IHXBuffer*      pPlayerCookies = NULL;    if (!m_bBruteForceReconnected &&        !m_bReSetup)    {        theErr = SetupRegistry();        if (HXR_OK != theErr)        {            goto cleanup;        }    }    if (!m_bReSetup)    {        m_ulOriginalDelay = m_ulDelay;    }    // Remember whether or not we ask for loss correction!    m_bLossCorrection = LossCorrection;    // delete protocol object if one exists    HX_RELEASE (m_pProto);    m_uProtocolType = pURL->GetProtocol();    if (rtspProtocol == m_uProtocolType || helixSDPProtocol == m_uProtocolType)    {        m_bRTSPProtocol = TRUE;        m_ulSendStatsMask = MAX_STATS_MASK;        /* Perfect Play Always supported iin RTSP,         * till we add some preference to disable it.         */        BOOL bSupported = TRUE;        SetOption(HX_PERFECTPLAY_SUPPORTED, &bSupported);    }    if (helixSDPProtocol != m_uProtocolType)    {        //  get out immediately if we have bogus parameters        if(!host || !*host)        {            theErr = HXR_INVALID_URL_HOST;            goto cleanup;        }        if(!theErr && (!resource || !*resource))        {            theErr = HXR_INVALID_URL_PATH;            goto cleanup;        }        if  (m_pHost != host)        {            HX_VECTOR_DELETE(m_pHost);            m_pHost = new char[::strlen(host) + 1];            if (!m_pHost)            {                theErr = HXR_OUTOFMEMORY;                goto cleanup;            }            ::strcpy(m_pHost, host); /* Flawfinder: ignore */        }        if(m_pResource != resource)        {            HX_VECTOR_DELETE(m_pResource);            m_pResource = new char[::strlen(resource) + 1];            if (!m_pResource)            {                theErr = HXR_OUTOFMEMORY;                goto cleanup;            }            ::strcpy(m_pResource, resource); /* Flawfinder: ignore */        }    }    if (m_pURL != pURL)    {        HX_DELETE(m_pURL);        m_pURL = new CHXURL(*pURL);        if (!m_pURL)        {            theErr = HXR_OUTOFMEMORY;            goto cleanup;        }        HX_VECTOR_DELETE(m_pszURL);        m_pszURL = new char[::strlen(m_pURL->GetURL()) + 1];        if (!m_pszURL)        {            theErr = HXR_OUTOFMEMORY;            goto cleanup;        }        ::strcpy(m_pszURL, m_pURL->GetURL()); /* Flawfinder: ignore */    }    m_uPort = port;    HX_VECTOR_DELETE(m_pPath);    pValues = m_pURL->GetProperties();    if (pValues &&        HXR_OK == pValues->GetPropertyBuffer(PROPERTY_PATH, pBuffer) && pBuffer)    {        StrAllocCopy(m_pPath, (char*)pBuffer->GetBuffer());    }    HX_RELEASE(pBuffer);    HX_RELEASE(pValues);    // save parameters for use with different protocols.#if defined(HELIX_FEATURE_STATS) && defined(HELIX_FEATURE_REGISTRY)    // save URL to the registry    if (m_pStats)    {        m_pStats->m_pSourceName->SetStr((char*)pURL);    }#endif /* HELIX_FEATURE_STATS && HELIX_FEATURE_REGISTRY */    // set request    m_bAltURL = bAltURL;   SetRequest(m_pURL, bAltURL);    if (!m_pCookies && HXR_OK != m_pEngine->QueryInterface(IID_IHXCookies, (void**)&m_pCookies))    {        m_pCookies = NULL;    }    if (!m_pCookies2 && HXR_OK != m_pEngine->QueryInterface(IID_IHXCookies2, (void**)&m_pCookies2))    {        m_pCookies2 = NULL;    }    if (m_pCookies || m_pCookies2)    {        if (HXR_OK == m_pRequest->GetRequestHeaders(pRequestHeaders) && pRequestHeaders)        {            HX_RESULT res = HXR_FAIL;            if(m_pCookies2)                res = m_pCookies2->GetCookies(m_pHost, m_pPath, pBuffer, pPlayerCookies);            else if(m_pCookies)                res = m_pCookies->GetCookies(m_pHost, m_pPath, pBuffer);            if (HXR_OK == res && pBuffer)            {                pRequestHeaders->SetPropertyCString("Cookie", pBuffer);                if(pPlayerCookies)                {                    pRequestHeaders->SetPropertyCString("PlayerCookie", pPlayerCookies);                }            }            HX_RELEASE(pBuffer);            HX_RELEASE(pPlayerCookies);        }    }    HX_RELEASE(pRequestHeaders);#if defined(HELIX_FEATURE_SMARTERNETWORK)    if (!m_pPreferredTransportManager &&        HXR_OK != m_pEngine->QueryInterface(IID_IHXPreferredTransportManager,                                            (void**)&m_pPreferredTransportManager))    {        theErr = HXR_FAILED;        goto cleanup;    }#endif /* HELIX_FEATURE_SMARTERNETWORK */    // Read all relevant preferences...    theErr = ReadPreferences();    // either we will wait for the first source to negotiate the transport    //        then connect the remaining sources    // or we are initiating PAC(ProxyAutoConfig)    if (HXR_WOULD_BLOCK == theErr)    {        theErr = HXR_OK;    }    else if (HXR_OK == theErr)    {        theErr = FinishSetup();    }cleanup:    return theErr;}HX_RESULTHXNetSource::FinishSetup(){    HX_RESULT   rc = HXR_OK;    BOOL        bSDPInitiated = FALSE;    CHXString   pString;    // start off with the preferred protocol    rc = CreateProtocol();    if (HXR_OK != rc)    {        goto cleanup;    }    rc = InitializeProtocol();    if (HXR_OK != rc)    {        goto cleanup;    }    if (helixSDPProtocol == m_uProtocolType)    {        bSDPInitiated = TRUE;        CHXURL::decodeURL(m_pURL->GetEscapedURL(), pString);                    HX_VECTOR_DELETE(m_pResource);        m_pResource = new char[pString.GetLength() - 9];        ::strcpy(m_pResource, (const char*)pString + 10);    }                    rc = m_pProto->setup(m_pHost,                         m_pResource,                         m_uPort,                         m_bLossCorrection,                         (HTTPCloakMode == m_CurrentTransport)?TRUE:FALSE,                         bSDPInitiated,                         m_uCurrCloakedPort);    // Mask this error    // Let the _ProcessIdle() determine whether ReportError() or    // TransportSwitching for HXR_BAD_TRANSPORT    if(rc == HXR_BLOCK_CANCELED || rc == HXR_BAD_TRANSPORT)    {        rc = HXR_OK;    }    if (HXR_OK != rc)    {        mLastError = rc;        goto cleanup;    }    // create log info list    m_pLogInfoList = new CHXSimpleList;    m_ulLogInfoLength = 0;    // start time of this source    m_ulSourceStartTime = HX_GET_TICKCOUNT();    if (m_pBufferCtl)    {	m_pBufferCtl->Close();    }    HX_RELEASE(m_pBufferCtl);    HX_RELEASE(m_pWMBufferCtl);    #ifdef HELIX_FEATURE_FEEDBACK_BUFFER_CONTROL    m_pBufferCtl = new HXFeedbackBufferControl();#else    m_pBufferCtl = new HXWatermarkBufferControl();#endif /* HELIX_FEATURE_FEEDBACK_BUFFER_CONTROL */    if (m_pBufferCtl)    {	m_pBufferCtl->AddRef();	m_pBufferCtl->QueryInterface(IID_IHXWatermarkBufferControl,				     (void**)&m_pWMBufferCtl);	m_pBufferCtl->Init((IUnknown*)(IHXStreamSource*)this);	if (m_pWMBufferCtl)	{	    m_pWMBufferCtl->SetSource(this);	}    }cleanup:    if (HXR_OK != rc)    {        HX_RELEASE(m_pProto);    }    return rc;}HX_RESULTHXNetSource::DoSeek(ULONG32 seekTime){    HX_TRACE("HXNetSource::DoSeek");    BOOL bSeekInsideRecordControl = FALSE;    if ((!m_pProto && m_state != NETSRC_RECONNECTPENDING) ||         (mLiveStream && !m_bPlayFromRecordControl && m_bSourceEnd))    {        return HXR_OK;    }    // log seek action    LogInformation("SEEK", NULL);    if (seekTime >= m_ulDelay)    {        seekTime -= m_ulDelay;        m_bDelayed = FALSE;    }    else    {        seekTime = 0;        /* This source has not been even started yet...         * Do not attempt to seek it if the start time = 0         */        if (m_bDelayed && m_ulStartTime == 0 && !m_bSourceEnd)        {            // will start pre-fetch again in TryResume()            if (!m_bIsPreBufferingDone)            {                m_bIsPreBufferingStarted = FALSE;                // will be registered again in DoResume() or TryResume()                if (m_pSourceInfo)                {                    m_pSourceInfo->UnRegister();                }            }            return HXR_OK;        }        m_bDelayed = TRUE;    }    /* Add any start time to seek time */    seekTime    += m_ulStartTime;    /* Are we seeking past the last expected packet time?     * If so, don't bother... and mark this source as done     */    HX_ASSERT(m_llLastExpectedPacketTime <= MAX_UINT32);    // XXX HP make sure the source has been initialized otherwise    // m_llLastExpectedPacketTime could be 0 and we could falsely    // mark the source ended    if (m_bInitialized && !mLiveStream && seekTime >= m_llLastExpectedPacketTime)    {        if (m_pSourceInfo && m_pSourceInfo->m_bSeekToLastFrame)        {            seekTime = INT64_TO_ULONG32(m_llLastExpectedPacketTime);        }        else        {            m_bSourceEnd = TRUE;            m_bForcedSourceEnd = TRUE;            AdjustClipBandwidthStats(FALSE);#if defined(HELIX_FEATURE_RECORDCONTROL)            if (m_pRecordControl)            {                m_pRecordControl->Seek(seekTime);            }#endif /* HELIX_FEATURE_RECORDCONTROL*/            goto cleanup;        }    }    // workaround for b#42118 for older servers(<= RealServer8.0 Gold)    // server sends no more streamdone when reaching the endtime if seek    // is occurred after streamdone has been sent. fix has been made in the latest server    if (m_bSourceEnd && m_bCustomEndTime && m_pProto && m_pProto->GetRDTFeatureLevel() < 2)    {        m_bRTSPRuleFlagWorkAround = TRUE;    }    if (mLiveStream)    {        seekTime += m_ulFirstPacketTime;    }#if defined(HELIX_FEATURE_RECORDCONTROL)    if (m_pRecordControl && m_pRecordControl->Seek(seekTime) == HXR_OK &&        m_bPlayFromRecordControl)    {        bSeekInsideRecordControl = TRUE;    }    else#endif /* HELIX_FEATURE_RECORDCONTROL */    {        m_ulSeekPendingTime = seekTime;        m_bSeekPending = TRUE;        if(m_pProto)            m_pProto->seek(seekTime, seekTime, FALSE);        if (mLiveStream)        {            seekTime = 0;        }        m_bSourceEnd        = FALSE;        m_bForcedSourceEnd  = FALSE;        STREAM_INFO*    pStreamInfo = NULL;        CHXMapLongToObj::Iterator lStreamIterator = mStreamInfoTable->Begin();        for (; lStreamIterator != mStreamInfoTable->End(); ++lStreamIterator)        {            pStreamInfo = (STREAM_INFO*) (*lStreamIterator);            pStreamInfo->ResetPreReconnectEventList();        }    }    // initiating reconnect NOW ...    if (NETSRC_RECONNECTPENDING == m_state)    {        m_state = NETSRC_RECONNECTFORCED;        if (m_pReconnectCallback)        {            m_pReconnectCallback->CancelCallback();        }        StartReconnect();    }    m_uLastBuffering                = 0;    m_bInitialBuffering             = TRUE;    m_bIsPreBufferingStarted        = FALSE;    m_bIsPreBufferingDone           = FALSE;    m_pushDownStatus                = PUSHDOWN_NONE;    if (m_pBufferCtl)    {	m_pBufferCtl->OnSeek();    }    // Buffer manager needs to know whether we seek inside the RecordControl    // to not reset variables related to stream completeness.    m_pBufferManager->DoSeek(seekTime, bSeekInsideRecordControl);cleanup:    return HXR_OK;}HX_RESULTHXNetSource::DoPause(void){    HX_TRACE("HXNetSource::DoPause");    if (!m_pProto || m_bPaused)

⌨️ 快捷键说明

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