[Protocol-dev] CR-Client-Resend: Added code to contol how much latency can be caused by the transport buffer

[Protocol-dev] CR-Client-Resend: Added code to contol how much latency can be caused by the transport buffer

Aaron Colwell acolwell at real.com
Wed Oct 20 08:58:01 PDT 2004


 On Mon, Oct 18, 2004 at 02:20:30PM -0700, Aaron Colwell wrote:
> 
> Synopsis: Added code to contol how much latency can be caused by the 
>           transport buffer.
> 
> Overview: These changes allow the HXNetSource object to control the amount
>           of latency that can be introduced by the transport buffer. These
>           latency parameters are controlled by a LatencyMode parameter in
>           the stream header. Latency mode 0 represents normal legacy latency.
>           This results in a 2 second transport latency with an extra 2 seconds
>           during buffering. Latency mode 1 is auto-latency mode. This mode is
>           a little fuzzy to me at this time so I just set it to only allow 1
>           second of transport latency and no extra latency during buffering.
>           This mode can be tuned later once it is better defined. Latency Mode
>           2 doesn't allow the transport to introduce any latency. All of
>           these default values can be overloaded with preferences. You can
>           also force a specific latency mode by setting a LatencyMode 
>           preference.
> 
>           - Created the new IHXResendBufferControl2 interface to allow 
>             tighter control over the transport buffer parameters.
>             IHXResendBufferControl only allows you to specify one of the
>             parameters that controls latency and it uses seconds as the
>             parameter units. IHXResendBufferControl2 allows you to control
>             the minimum and maximum latencies as well as the extra latency
>             that is added when the client is rebuffering. The units for 
>             these parameter are in milliseconds so that you can have tighter
>             control over the latency.
> 
>           - Added code to RTSPClientProtocol to implement 
>             IHXResendBufferControl2. This required that RTSPTransport and
>             RTSPTransportBuffer to be modified as well so the parameters could
>             get to the code that they effect.
> 
>           - Fixed RTSPClientProtocol::SetResendBufferDepth() so that it would
>             actually set the resend buffer depth on the transports when called.
>             The previous code was depending on the buffer depth to get set
>             by some other code, but that sequence of events never happened so
>             this call basically did nothing before.
> 
>           - Created the CHXLatencyModeHelper class to contain all the logic for
>             managing the various latency modes. Currently this only entails
>             setting the resend buffer parameters, but it will likely contain 
>             more code in the future.
> 
>           - Added code to HXNetSource to figure out the latency mode and use
>             the CHXLatencyModeHelper class to configure the source for that
>             latency mode.
>             
> 
> Files Modified:
> client/core/hxntsrc.cpp
> client/core/hxntsrc.h
> client/core/clntcorelib
> protocol/transport/common/system/rtsptran.cpp
> protocol/transport/common/system/transbuf.cpp
> protocol/transport/common/system/pub/rtsptran.h
> protocol/transport/common/system/pub/transbuf.h
> protocol/rtsp/rtspclnt.cpp
> protocol/rtsp/include/hxrsdbf.h
> protocol/rtsp/pub/rtspclnt.h
> 
> Files Added:
> client/core/latency_mode_hlpr.h
> client/core/latency_mode_hlpr.cpp
> 
> Image Size and Heap Use impact:
> 
> Platforms and Profiles affected: all
> 
> Distribution Libraries affected: none
> 
> Distribution library impact and planned action: none
> 
> Platforms and Profiles Build Verified: win32
> 
> Platforms and Profiles Functionality verified: win32
> 
> Branch: HEAD
> 
> QA Instructions: none
> 
> Index: hxntsrc.cpp
> ===================================================================
> RCS file: /cvsroot/client/core/hxntsrc.cpp,v
> retrieving revision 1.106
> diff -u -r1.106 hxntsrc.cpp
> --- hxntsrc.cpp	13 Oct 2004 20:31:48 -0000	1.106
> +++ hxntsrc.cpp	18 Oct 2004 18:49:45 -0000
> @@ -89,6 +89,7 @@
>  #include "hxprotocol.h"
>  #include "dtrvtcon.h"
>  #include "rtspprotocol.h"
> +#include "latency_mode_hlpr.h"
>  
>  #if defined(HELIX_FEATURE_PNA)
>  #include "hxpnapro.h"
> @@ -212,8 +213,8 @@
>      , m_bUserHasCalledStartInit(FALSE)
>      , m_bTimeBased(FALSE)
>      , m_bAltURL(FALSE)
> -    , m_bNoLatency(FALSE)
> -    , m_bNoLatencySet(FALSE)
> +    , m_uLatencyMode(0)
> +    , m_bLatencyModeSet(FALSE)
>      , m_pCookies(NULL)
>      , m_pCookies2(NULL)
>      , m_bABDCalibrationDone(FALSE)
> @@ -1044,7 +1045,7 @@
>              }
>          }
>  
> -        SetNoLatency();
> +        SetLatencyMode();
>  
>          HX_ASSERT(m_llLastExpectedPacketTime <= MAX_UINT32);
>  
> @@ -1156,7 +1157,7 @@
>                  }
>              }
>  
> -            SetNoLatency();
> +            SetLatencyMode();
>  
>              if (m_bBruteForceReconnected && m_bSeekPending)
>              {
> @@ -3608,16 +3609,40 @@
>  
>      ProcessFileHeader();
>  
> -    UINT32 ulNoLatency = 0;
> -    if (pHeader->GetPropertyULONG32("MinimizeLatency", ulNoLatency) == HXR_OK)
> +    m_uLatencyMode = 0;
> +
> +    ULONG32 ulLatencyMode;
> +    if (HXR_OK == pHeader->GetPropertyULONG32("LatencyMode", ulLatencyMode))
>      {
> -        m_bNoLatency = (ulNoLatency == 1);
> +        m_uLatencyMode = (UINT32)ulLatencyMode;
>      }
>  
> -    // "MinimizeLatency" in player's preference
> -    // can overwrite the one in file header
> -    ReadPrefBOOL(m_pPreferences, "MinimizeLatency", m_bNoLatency);
> +    ULONG32 ulNoLatency = 0;
> +    if (((HXR_OK == pHeader->GetPropertyULONG32("MinimizeLatency", 
> +                                                ulNoLatency)) &&
> +         (ulNoLatency == 1)))
> +    {
> +        // The minimize latency feature is equivalent to latency mode 2
> +        m_uLatencyMode = 2;
> +    }
> +
> +    // The player's preference can overwrite the one in file header
> +    BOOL bNoLatency = FALSE;
> +    if ((HXR_OK == ReadPrefBOOL(m_pPreferences, "MinimizeLatency", 
> +                                bNoLatency)) && bNoLatency)
> +    {
> +        // The minimize latency feature is equivalent to latency mode 2
> +        m_uLatencyMode = 2;
> +    }
>  
> +    // The player's "LatencyMode" preference gets the final say
> +    UINT32 uLatencyModePref;
> +    if (HXR_OK == ReadPrefUINT32(m_pPreferences, "LatencyMode", 
> +                                 uLatencyModePref))
> +    {
> +        m_uLatencyMode = uLatencyModePref;
> +    }
> +   
>      PostFileHeaderReadyExt();
>  
>      return HXR_OK;
> @@ -4960,7 +4985,7 @@
>      m_bFirstResume = TRUE;
>      m_bResendAuthenticationInfo = TRUE;
>      m_bRTSPRuleFlagWorkAround = FALSE;
> -    m_bNoLatencySet = FALSE;
> +    m_bLatencyModeSet = FALSE;
>      m_bIsActive = FALSE;
>  
>      return;
> @@ -5799,21 +5824,22 @@
>  }
>  
>  void
> -HXNetSource::SetNoLatency()
> +HXNetSource::SetLatencyMode()
>  {
> -    if (!m_bNoLatencySet && m_bNoLatency)
> +    if (!m_bLatencyModeSet)
>      {
> -        m_bNoLatencySet = TRUE;
> -        IHXResendBufferControl* pResendBufferControl = NULL;
> +        m_bLatencyModeSet = TRUE;
>  
> -        if (m_pProto &&
> -            HXR_OK == m_pProto->QueryInterface(IID_IHXResendBufferControl,
> -                                              (void**)&pResendBufferControl))
> +        CHXLatencyModeHelper latencyModeHlpr;
> +        IUnknown* pUnk = NULL;
> +        
> +        if ((HXR_OK == QueryInterface(IID_IUnknown, (void**)&pUnk)) &&
> +            (HXR_OK == latencyModeHlpr.Init(pUnk)))
>          {
> -            pResendBufferControl->SetResendBufferDepth(0);
> +            latencyModeHlpr.SetLatencyMode(m_uLatencyMode);
>          }
>  
> -        HX_RELEASE(pResendBufferControl);
> +        HX_RELEASE(pUnk);
>      }
>  }
>  
> Index: hxntsrc.h
> ===================================================================
> RCS file: /cvsroot/client/core/hxntsrc.h,v
> retrieving revision 1.33
> diff -u -r1.33 hxntsrc.h
> --- hxntsrc.h	9 Sep 2004 17:13:51 -0000	1.33
> +++ hxntsrc.h	18 Oct 2004 18:49:45 -0000
> @@ -253,7 +253,7 @@
>  
>  	        BOOL		IsSourceDone(void);
>  
> -		void		SetNoLatency();
> +		void		SetLatencyMode();
>  
>  		void		EnterBufferedPlay(void);
>  		void		LeaveBufferedPlay(void);
> @@ -441,8 +441,8 @@
>  	HX_BITFIELD	m_bBruteForceReconnected : 1;
>  	HX_BITFIELD	m_bBruteForceConnectToBeDone : 1;
>  	HX_BITFIELD	m_bReconnect : 1;
> -	BOOL    	m_bNoLatency;
> -	HX_BITFIELD	m_bNoLatencySet : 1;
> +	UINT32    	m_uLatencyMode;
> +	HX_BITFIELD	m_bLatencyModeSet : 1;
>  	HX_BITFIELD	m_bPerfectPlayPreferenceRead : 1;
>  	BOOL    	m_bPerfectPlayErrorChecked;	
>  	HX_BITFIELD	m_bServerHasPerfectPlay : 1;
> Index: clntcorelib
> ===================================================================
> RCS file: /cvsroot/client/core/clntcorelib,v
> retrieving revision 1.23
> diff -u -r1.23 clntcorelib
> --- clntcorelib	12 Oct 2004 21:30:35 -0000	1.23
> +++ clntcorelib	18 Oct 2004 18:49:45 -0000
> @@ -102,7 +102,8 @@
>                     "wmbufctl.cpp",
>                     "fbbufctl.cpp",
>                     "client_preroll_hlpr.cpp",
> -                   "velproxy.cpp")
> +                   "velproxy.cpp",
> +                   "latency_mode_hlpr.cpp")
>  
>  if "HELIX_FEATURE_PLAYBACK_LOCAL" in project.defines:
>      project.AddSources('hxflsrc.cpp')
> Index: rtsptran.cpp
> ===================================================================
> RCS file: /cvsroot/protocol/transport/common/system/rtsptran.cpp,v
> retrieving revision 1.32
> diff -u -r1.32 rtsptran.cpp
> --- rtsptran.cpp	5 Aug 2004 14:37:09 -0000	1.32
> +++ rtsptran.cpp	18 Oct 2004 19:08:59 -0000
> @@ -1886,6 +1886,30 @@
>      return HXR_OK;
>  }
>  
> +HX_RESULT 
> +RTSPTransport::SetResendBufferParameters(UINT32 uMinimumDelay,             /* ms */
> +                                         UINT32 uMaximumDelay,             /* ms */
> +                                         UINT32 uExtraDelayDuringBuffering /* ms */)
> +{
> +    RTSPStreamData* pStreamData = m_pStreamHandler->firstStreamData();
> +
> +    ASSERT(pStreamData);
> +
> +    while (pStreamData)
> +    {
> +	if (!m_bIsSource && pStreamData->m_pTransportBuffer)
> +        {
> +            pStreamData->m_pTransportBuffer->SetBufferParameters(uMinimumDelay,
> +                                                                 uMaximumDelay,
> +                                                                 uExtraDelayDuringBuffering);
> +	}
> +
> +	pStreamData = m_pStreamHandler->nextStreamData();
> +    }
> +
> +    return HXR_OK;
> +}
> +
>  #ifdef RDT_MESSAGE_DEBUG
>  void RTSPTransport::RDTmessageFormatDebugFileOut(const char* fmt, ...)
>  {
> Index: transbuf.cpp
> ===================================================================
> RCS file: /cvsroot/protocol/transport/common/system/transbuf.cpp,v
> retrieving revision 1.18
> diff -u -r1.18 transbuf.cpp
> --- transbuf.cpp	9 Jul 2004 18:41:12 -0000	1.18
> +++ transbuf.cpp	18 Oct 2004 19:08:59 -0000
> @@ -114,6 +114,7 @@
>  ) : m_pOwner(owner),
>      m_uStreamNumber(streamNumber),
>      m_bufferDuration(bufferDuration),
> +    m_extraDelayDuringBuffering(MIN_NETWORK_JITTER_MSECS),
>      m_maxBufferDuration(maxBufferDuration),
>      m_growthRate(growthRate),
>      m_wrapSequenceNumber(wrapSequenceNumber),
> @@ -206,7 +207,7 @@
>  }
>  
>  RTSPTransportBuffer::~RTSPTransportBuffer()
> -{
> +{    
>      CHXSimpleList::Iterator i;
>      ClientPacket* pPacket;
>  
> @@ -1081,105 +1082,12 @@
>      UINT16& ulPercentDone
>  )
>  {
> -#if 0
> -    uStatusCode     = HX_STATUS_READY;
> -    ulPercentDone   = 100;
> -
> -    if (m_bIsEnded)
> -    {
> -        return HXR_OK;
> -    }
> -    
> -    /* ignore multicasted sparsed streams(i.e. events)
> -     * it is OK to not be initialized if we are dealing with
> -     * sparse streams over multicast. This is because
> -     * in multicast, the transport gets initialialized on 
> -     * receiving the first packet. We do not want to hold
> -     * the entire presenation if we never receive a packet
> -     * for this sparse stream.
> -     */
> -    else if ((!m_bIsInitialized || m_uSeekCount) &&
> -             (!m_bMulticast || !m_bSparseStream))
> -    {
> -        uStatusCode     = HX_STATUS_BUFFERING;
> -        ulPercentDone   = 0;
> -
> -        return HXR_OK;
> -    }
> -
> -    UINT32 ulCurrentBuffering   = 0;
> -    INT64 llActualLastTimestampReceived = 0;
> -
> -    if (m_bAtLeastOnePacketReceived)
> -    {
> -        llActualLastTimestampReceived = CAST_TO_INT64 m_ulTSRollOver * CAST_TO_INT64 MAX_UINT32 + 
> -                                        CAST_TO_INT64 m_ulLastTimestampReceived;
> -
> -        // FileFormats may send packets with out of order timestamps
> -        // if the stream has been continuesly playing for 49 days
> -        // we will set llCurrentBufferingInMs to MAX_UINT32
> -        if (llActualLastTimestampReceived > CAST_TO_INT64 m_ulFirstTimestampReceived)
> -        {
> -            if (llActualLastTimestampReceived - CAST_TO_INT64 m_ulFirstTimestampReceived > MAX_UINT32)
> -            {
> -                ulCurrentBuffering = MAX_UINT32;
> -            }
> -            else
> -            {
> -                ulCurrentBuffering = INT64_TO_UINT32(llActualLastTimestampReceived - 
> -                                                     m_ulFirstTimestampReceived);
> -            }
> -        }
> -    }
> -
> -    UINT32 ulElapsedBufferingTime = 
> -        CALCULATE_ELAPSED_TICKS(m_ulBufferingStartTime,
> -                                HX_GET_TICKCOUNT());
> -
> -    UINT32 ulPauseTime = m_PacketTime.m_PauseTime.tv_sec*1000 + 
> -                         m_PacketTime.m_PauseTime.tv_usec/1000;
> -
> -    if (ulPauseTime > 0 && ulElapsedBufferingTime > ulPauseTime)
> -    {
> -        ulElapsedBufferingTime -= ulPauseTime;
> -    }
> -
> -    /*
> -     * If the buffer duration = 0, then there is no network jitter to worry
> -     * about
> -     */
> -
> -    UINT32 ulMinimumToBuffer =
> -         m_bufferDuration + (m_bufferDuration ? MIN_NETWORK_JITTER_MSECS : 0);
> -
> -    if (m_status == TRANSBUF_FILLING || 
> -        (ulElapsedBufferingTime < ulMinimumToBuffer &&
> -         ulCurrentBuffering     < ulMinimumToBuffer))
> -    {
> -        uStatusCode = HX_STATUS_BUFFERING;
> -
> -        UINT32 ulHighVal = ulCurrentBuffering > ulElapsedBufferingTime ? 
> -                          ulCurrentBuffering : ulElapsedBufferingTime;
> -
> -        if (ulHighVal < ulMinimumToBuffer)
> -        {
> -            ulPercentDone = HX_SAFEUINT16(ulHighVal*100/ulMinimumToBuffer);
> -        }
> -        else // Waiting for a reliable packet
> -        {
> -            ulPercentDone = 99;
> -        }
> -    }
> -
> -    return HXR_OK;
> -#else
>      return HXR_NOTIMPL;
> -#endif
>  }
>  
>  HX_RESULT
>  RTSPTransportBuffer::SetupForACKPacket
> -(
> +(    
>      UINT16& uSeqNo,
>      CHXBitset& pBitset,
>      UINT16& uBitCount,
> @@ -2067,6 +1975,21 @@
>      }
>  }
>  
> +void 
> +RTSPTransportBuffer::SetBufferParameters(UINT32 uMinimumDelay,             /* ms */
> +                                         UINT32 uMaximumDelay,             /* ms */
> +                                         UINT32 uExtraDelayDuringBuffering /* ms */)
> +{
> +    if (uMaximumDelay < uMinimumDelay)
> +    {
> +        uMaximumDelay = uMinimumDelay;
> +    }
> +
> +    m_bufferDuration = uMinimumDelay;
> +    m_maxBufferDuration = uMaximumDelay;
> +    m_extraDelayDuringBuffering = uExtraDelayDuringBuffering;
> +}
> +
>  void
>  RTSPTransportBuffer::EnterPrefetch(void)
>  {
> @@ -2234,8 +2157,8 @@
>      {
>          bPlaying = m_pOwner->m_pPlayerState->IsPlaying();
>  
> -        if (!bPlaying && ulMinimumToBuffer != 0 )
> -            ulMinimumToBuffer += MIN_NETWORK_JITTER_MSECS;
> +        if (!bPlaying)
> +            ulMinimumToBuffer += m_extraDelayDuringBuffering;
>      }
>  
>      // We only want to get packets as soon as possible for FastStart when 
> Index: pub/rtsptran.h
> ===================================================================
> RCS file: /cvsroot/protocol/transport/common/system/pub/rtsptran.h,v
> retrieving revision 1.30
> diff -u -r1.30 rtsptran.h
> --- pub/rtsptran.h	5 Aug 2004 14:37:09 -0000	1.30
> +++ pub/rtsptran.h	18 Oct 2004 19:08:59 -0000
> @@ -318,6 +318,9 @@
>      virtual HX_RESULT resumeBuffers     (void);
>      HX_RESULT Init                      (IUnknown* pContext);
>      HX_RESULT SetResendBufferDepth      (UINT32 uMilliseconds);
> +    HX_RESULT SetResendBufferParameters(UINT32 uMinimumDelay,             /* ms */
> +                                        UINT32 uMaximumDelay,             /* ms */
> +                                        UINT32 uExtraDelayDuringBuffering /* ms */);
>  
>      BOOL IsInitialized                  (void);
>      BOOL IsUpdated                      (void);
> Index: pub/transbuf.h
> ===================================================================
> RCS file: /cvsroot/protocol/transport/common/system/pub/transbuf.h,v
> retrieving revision 1.8
> diff -u -r1.8 transbuf.h
> --- pub/transbuf.h	9 Jul 2004 18:41:08 -0000	1.8
> +++ pub/transbuf.h	18 Oct 2004 19:08:59 -0000
> @@ -167,6 +167,9 @@
>      void		UpdateStatsFromPacket(ClientPacket* pPacket);
>      void		SeekFlush();
>      void		SetBufferDepth(UINT32 uMilliseconds);
> +    void                SetBufferParameters(UINT32 uMinimumDelay,             /* ms */
> +                                            UINT32 uMaximumDelay,             /* ms */
> +                                            UINT32 uExtraDelayDuringBuffering /* ms */);
>  
>      void		EnterPrefetch(void);
>      void		LeavePrefetch(void);
> @@ -247,6 +250,7 @@
>      BOOL		m_bPausedHack;
>      UINT32		m_ulTSRollOver;
>      UINT32		m_bufferDuration;
> +    UINT32              m_extraDelayDuringBuffering;
>      UINT32		m_maxBufferDuration;
>      UINT32		m_growthRate;
>      UINT32		m_wrapSequenceNumber;
> 
> Index: rtspclnt.cpp
> ===================================================================
> RCS file: /cvsroot/protocol/rtsp/rtspclnt.cpp,v
> retrieving revision 1.117
> diff -u -r1.117 rtspclnt.cpp
> --- rtspclnt.cpp	13 Oct 2004 20:32:53 -0000	1.117
> +++ rtspclnt.cpp	18 Oct 2004 19:10:29 -0000
> @@ -1485,6 +1485,7 @@
>          { GET_IIDHANDLE(IID_IHXResolverResponse), (IHXResolverResponse*) this },
>          { GET_IIDHANDLE(IID_IHXInterruptSafe), (IHXInterruptSafe*) this },
>          { GET_IIDHANDLE(IID_IHXResendBufferControl), (IHXResendBufferControl*) this },
> +        { GET_IIDHANDLE(IID_IHXResendBufferControl2), (IHXResendBufferControl2*) this },
>          { GET_IIDHANDLE(IID_IHXThinnableSource), (IHXThinnableSource*) this },
>          { GET_IIDHANDLE(IID_IHXTransportSyncServer), (IHXTransportSyncServer*) this },
>          { GET_IIDHANDLE(IID_IHXTransportBufferLimit), (IHXTransportBufferLimit*) this },
> @@ -5120,9 +5121,47 @@
>  {
>      m_ulBufferDepth = uSeconds * 1000;
>  
> +    CHXMapLongToObj::Iterator i;
> +    for(i=m_pTransportStreamMap->Begin(); i!=m_pTransportStreamMap->End(); ++i)
> +    {
> +
> +        RTSPTransport* pTransport = (RTSPTransport*)(*i);
> +
> +        HX_RESULT hresult =
> +            pTransport->SetResendBufferDepth(m_ulBufferDepth);
> +
> +        if (HXR_OK != hresult)
> +        {
> +            return hresult;
> +        }
> +    }
> +
>      return HXR_OK;
>  }
>  
> +STDMETHODIMP
> +RTSPClientProtocol::SetResendBufferParameters(THIS_
> +                                              UINT32 uMinimumDelay,  /* ms */
> +                                              UINT32 uMaximumDelay,  /* ms */
> +                                         UINT32 uExtraBufferingDelay /* ms */) 
> +{
> +    CHXMapLongToObj::Iterator i;
> +    for(i=m_pTransportStreamMap->Begin(); i!=m_pTransportStreamMap->End(); ++i)
> +    {
> +
> +        RTSPTransport* pTransport = (RTSPTransport*)(*i);
> +
> +        HX_RESULT hresult =
> +            pTransport->SetResendBufferParameters(uMinimumDelay, 
> +                                                  uMaximumDelay,
> +                                                  uExtraBufferingDelay);
> +
> +        if (HXR_OK != hresult)
> +        {
> +            return hresult;
> +        }
> +    }
> +}
>  
>  /*
>   * IHXTransportSyncServer methods
> @@ -9772,6 +9811,7 @@
>             break;
>             case HX_SOCK_EVENT_WRITE:
>                 //HX_ASSERT(false); //XXXLCM buffered write socket prevents this
> +               hr = HXR_OK;
>                 break;
>             default:
>                 hr = HXR_OK;
> Index: include/hxrsdbf.h
> ===================================================================
> RCS file: /cvsroot/protocol/rtsp/include/hxrsdbf.h,v
> retrieving revision 1.2
> diff -u -r1.2 hxrsdbf.h
> --- include/hxrsdbf.h	9 Jul 2004 18:41:16 -0000	1.2
> +++ include/hxrsdbf.h	18 Oct 2004 19:10:29 -0000
> @@ -94,4 +94,50 @@
>  					UINT32 uSeconds) PURE;
>  };
>  
> +typedef _INTERFACE	IHXResendBufferControl2	    IHXResendBufferControl2;
> +
> +/****************************************************************************
> + * 
> + *  Interface:
> + *
> + *	IHXResendBufferControl2
> + *
> + *  Purpose:
> + *
> + *	Allows management of the transport resend buffer
> + *
> + *  IID_IHXResendBufferControl2:
> + *
> + *	{D3103F1E-738F-4161-9B39-1DE7BC60E0E3}
> + *
> + */
> +DEFINE_GUID(IID_IHXResendBufferControl2, 0xd3103f1e, 0x738f, 0x4161, 
> +            0x9b, 0x39, 0x1d, 0xe7, 0xbc, 0x60, 0xe0, 0xe3);
> +
> +#undef  INTERFACE
> +#define INTERFACE   IHXResendBufferControl2
> +
> +DECLARE_INTERFACE_(IHXResendBufferControl2, IUnknown)
> +{
> +    /*
> +     *	IUnknown methods
> +     */
> +    STDMETHOD(QueryInterface)	(THIS_
> +				REFIID riid,
> +				void** ppvObj) PURE;
> +
> +    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;
> +
> +    STDMETHOD_(ULONG32,Release)	(THIS) PURE;
> +
> +    /*
> +     *	IHXResendBufferControl2 methods
> +     */
> +
> +    STDMETHOD(SetResendBufferParameters) (THIS_
> +                                          UINT32 uMinimumDelay,/* ms */
> +                                          UINT32 uMaximumDelay, /* ms */
> +                                          UINT32 uExtraBufferingDelay/* ms */) PURE;
> +};
> +
>  #endif /* _HXRSDBF_H_ */
> Index: pub/rtspclnt.h
> ===================================================================
> RCS file: /cvsroot/protocol/rtsp/pub/rtspclnt.h,v
> retrieving revision 1.52
> diff -u -r1.52 rtspclnt.h
> --- pub/rtspclnt.h	3 Aug 2004 23:24:54 -0000	1.52
> +++ pub/rtspclnt.h	18 Oct 2004 19:10:29 -0000
> @@ -419,6 +419,7 @@
>                            public IHXPacketResend,
>                            public IHXInterruptSafe,
>                            public IHXResendBufferControl,
> +                          public IHXResendBufferControl2,
>                            public IHXTransportSyncServer,
>                            public IHXTransportBufferLimit,
>                            public IHXResolveResponse,
> @@ -770,8 +771,20 @@
>      STDMETHOD(InitPacketFilter)         (THIS_
>                                          RawPacketFilter* pFilter);
>  
> +    /*
> +     *	IHXResendBufferControl methods
> +     */
>      STDMETHOD(SetResendBufferDepth)     (THIS_
>                                          UINT32 uSeconds);
> +
> +    /*
> +     *	IHXResendBufferControl2 methods
> +     */
> +
> +    STDMETHOD(SetResendBufferParameters) (THIS_
> +                                          UINT32 uMinimumDelay,      /* ms */
> +                                          UINT32 uMaximumDelay,      /* ms */
> +                                          UINT32 uExtraBufferingDelay/* ms */);
>  
>      /*
>       * IHXTransportSyncServer methods



> _______________________________________________
> Client-dev mailing list
> Client-dev at helixcommunity.org
> http://lists.helixcommunity.org/mailman/listinfo/client-dev




More information about the Protocol-dev mailing list
 

Site Map   |   Terms of Use   |   Privacy Policy   |   Contact Us

Copyright © 1995-2007 RealNetworks, Inc. All rights reserved. RealNetworks and Helix are trademarks of RealNetworks.
All other trademarks or registered trademarks are the property of their respective holders.