[Protocol-dev] RE: [Client-dev] CR-Client-Resend: Added code to contol how muchlatency can be caused by the transport buffer
Henry Ping ping at real.comlooks good to me -->Henry > -----Original Message----- > From: client-dev-bounces at helixcommunity.org > [mailto:client-dev-bounces at helixcommunity.org]On Behalf Of Aaron Colwell > Sent: Wednesday, October 20, 2004 8:58 AM > To: protocol-dev at lists.helixcommunity.org; > client-dev at lists.helixcommunity.org > Subject: [Client-dev] CR-Client-Resend: Added code to contol how > muchlatency can be caused by the transport buffer > > > 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 > > > _______________________________________________ > Client-dev mailing list > Client-dev at helixcommunity.org > http://lists.helixcommunity.org/mailman/listinfo/client-dev