[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 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