OPAL  Version 3.18.8
jitter.h
Go to the documentation of this file.
1 /*
2  * jitter.h
3  *
4  * Jitter buffer support
5  *
6  * Open H323 Library
7  *
8  * Copyright (c) 1999-2001 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Open H323 Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Portions of this code were written with the assisance of funding from
25  * Vovida Networks, Inc. http://www.vovida.com.
26  *
27  * Contributor(s): ______________________________________.
28  *
29  */
30 
31 #ifndef OPAL_RTP_JITTER_H
32 #define OPAL_RTP_JITTER_H
33 
34 #ifdef P_USE_PRAGMA
35 #pragma interface
36 #endif
37 
38 #include <opal_config.h>
39 
40 #include <opal/mediatype.h>
41 #include <rtp/rtp.h>
42 
43 
44 class OpalManager;
45 
46 
48 
51 class OpalJitterBuffer : public PObject
52 {
53  PCLASSINFO(OpalJitterBuffer, PObject);
54  public:
55  struct Params
56  {
57  unsigned m_minJitterDelay;
58  unsigned m_maxJitterDelay;
60  unsigned m_jitterGrowTime;
62  unsigned m_jitterShrinkTime;
66  unsigned m_overrunFactor;
67 
69  unsigned minJitterDelay = 40,
70  unsigned maxJitterDelay = 250
71  )
72  : m_minJitterDelay(minJitterDelay)
73  , m_maxJitterDelay(maxJitterDelay)
75  , m_jitterGrowTime(10)
76  , m_jitterShrinkPeriod(1000)
78  , m_silenceShrinkPeriod(5000)
80  , m_jitterDriftPeriod(500)
81  , m_overrunFactor(2)
82  { }
83  };
84 
86  struct Init : Params
87  {
88  Init(
89  const OpalManager & manager,
90  unsigned timeUnits
91  );
93  const OpalMediaType & mediaType,
94  unsigned minJitterDelay,
95  unsigned maxJitterDelay,
96  unsigned timeUnits = 8,
97  PINDEX packetSize = 2048
98  ) : Params(minJitterDelay, maxJitterDelay)
99  , m_mediaType(mediaType)
100  , m_timeUnits(timeUnits)
101  , m_packetSize(packetSize)
102  { }
103 
105  unsigned m_timeUnits;
106  PINDEX m_packetSize;
107  };
108 
115  const Init & init
116  );
117 
120  virtual ~OpalJitterBuffer();
121 
122  // Create an appropriate jitter buffer for the media type
123  static OpalJitterBuffer * Create(
124  const OpalMediaType & mediaType,
125  const Init & init
126  );
128 
133  virtual void SetDelay(
134  const Init & init
135  );
136 
139  virtual void Close() = 0;
140 
143  virtual void Restart() = 0;
144 
147  virtual bool WriteData(
148  const RTP_DataFrame & frame,
149  const PTimeInterval & tick = PTimer::Tick()
150  ) = 0;
151 
156  virtual bool ReadData(
157  RTP_DataFrame & frame,
158  const PTimeInterval & timeout = PMaxTimeInterval
159  PTRACE_PARAM(, const PTimeInterval & tick = PMaxTimeInterval)
160  ) = 0;
161 
164  virtual RTP_Timestamp GetCurrentJitterDelay() const { return 0; }
165 
168  virtual RTP_Timestamp GetPacketTime() const { return 0; }
169 
172  unsigned GetTimeUnits() const { return m_timeUnits; }
173 
177 
181 
184  unsigned GetPacketsTooLate() const;
185 
188  unsigned GetBufferOverruns() const;
190 
191  protected:
192  const unsigned m_timeUnits;
193  PINDEX m_packetSize;
198 
199  class Analyser;
200  Analyser * m_analyser;
201 
202  PDECLARE_MUTEX(m_bufferMutex);
203 };
204 
205 
206 typedef PParamFactory<OpalJitterBuffer, OpalJitterBuffer::Init, OpalMediaType> OpalJitterBufferFactory;
207 
208 
212 {
214 
215  public:
222  const Init & init
223  );
224 
227  virtual ~OpalAudioJitterBuffer();
229 
233  void PrintOn(
234  ostream & strm
235  ) const;
237 
242  virtual void SetDelay(
243  const Init & init
244  );
245 
248  virtual void Close();
249 
252  virtual void Restart();
253 
256  virtual bool WriteData(
257  const RTP_DataFrame & frame,
258  const PTimeInterval & tick = PTimer::Tick()
259  );
260 
265  virtual bool ReadData(
266  RTP_DataFrame & frame,
267  const PTimeInterval & timeout = PMaxTimeInterval
268  PTRACE_PARAM(, const PTimeInterval & tick = PMaxTimeInterval)
269  );
270 
273  virtual RTP_Timestamp GetCurrentJitterDelay() const;
274 
277  virtual RTP_Timestamp GetPacketTime() const;
278 
282 
287 
288  protected:
289  void InternalReset();
297  };
298  friend ostream & operator<<(ostream & strm, const AdjustResult adjusted);
300 
303  int m_jitterShrinkTime;
308  unsigned m_overrunFactor;
309 
310  bool m_closed;
317 
319  uint64_t m_frameTimeSum;
329 
330  enum {
336 
337  typedef std::map<RTP_Timestamp, RTP_DataFrame> FrameMap;
339  PSemaphore m_frameCount;
340 
341  PTimeInterval m_lastInsertTick;
342 #if PTRACING
343  PTimeInterval m_lastRemoveTick;
344  public:
345  static unsigned sm_EveryPacketLogLevel;
346 #endif
347 };
348 
349 
352 {
354  public:
361  const Init & init
362  );
364 
369  virtual void Close();
370 
373  virtual void Restart();
374 
377  virtual bool WriteData(
378  const RTP_DataFrame & frame,
379  const PTimeInterval & tick = PTimer::Tick()
380  );
381 
386  virtual bool ReadData(
387  RTP_DataFrame & frame,
388  const PTimeInterval & timeout = PMaxTimeInterval
389  PTRACE_PARAM(, const PTimeInterval & tick = PMaxTimeInterval)
390  );
392 
393  protected:
394  PSyncQueue<RTP_DataFrame> m_queue;
395 };
396 
397 
398 #endif // OPAL_RTP_JITTER_H
399 
400 
virtual void Close()=0
Definition: manager.h:150
virtual RTP_Timestamp GetPacketTime() const
unsigned m_currentJitterDelay
Current/initial delay in milliseconds.
Definition: jitter.h:59
RTP_Timestamp m_minJitterDelay
Minimum jitter delay in timestamp units.
Definition: jitter.h:194
OpalAudioJitterBuffer(const Init &init)
RTP_SyncSourceId m_lastSyncSource
Definition: jitter.h:323
int m_silenceShrinkTime
Amount to shrink jitter delay by if consistently silent.
Definition: jitter.h:306
virtual RTP_Timestamp GetPacketTime() const
Definition: jitter.h:168
Definition: jitter.h:211
void PrintOn(ostream &strm) const
OpalNonJitterBuffer(const Init &init)
PTimeInterval m_lastInsertTick
Definition: jitter.h:341
virtual bool ReadData(RTP_DataFrame &frame, const PTimeInterval &timeout=PMaxTimeInterval)
RTP_Timestamp m_jitterDriftPeriod
Definition: jitter.h:307
unsigned m_silenceShrinkTime
Amount to shrink jitter delay by if consistently silent.
Definition: jitter.h:64
RTP_Timestamp GetMinJitterDelay() const
PParamFactory< OpalJitterBuffer, OpalJitterBuffer::Init, OpalMediaType > OpalJitterBufferFactory
Definition: jitter.h:206
friend ostream & operator<<(ostream &strm, const AdjustResult adjusted)
unsigned m_consecutiveLatePackets
Definition: jitter.h:314
virtual bool WriteData(const RTP_DataFrame &frame, const PTimeInterval &tick=PTimer::Tick())
int m_jitterShrinkTime
Amount to shrink jitter delay by if consistently filled.
Definition: jitter.h:304
enum OpalAudioJitterBuffer::@37 m_synchronisationState
Definition: mediatype.h:66
unsigned m_consecutiveEmpty
Definition: jitter.h:316
FrameMap m_frames
Definition: jitter.h:338
unsigned m_maxConsecutiveMarkerBits
Definition: jitter.h:313
static OpalJitterBuffer * Create(const OpalMediaType &mediaType, const Init &init)
Init(const OpalManager &manager, unsigned timeUnits)
RTP_Timestamp m_lastTimestamp
Definition: jitter.h:322
std::map< RTP_Timestamp, RTP_DataFrame > FrameMap
Definition: jitter.h:337
RTP_Timestamp m_silenceShrinkPeriod
Reduce jitter delay is silent for this long.
Definition: jitter.h:305
Definition: jitter.h:55
RTP_Timestamp m_packetTime
Definition: jitter.h:320
unsigned m_timeUnits
Time units, usually 8 or 16.
Definition: jitter.h:105
unsigned m_jitterShrinkTime
Amount to reduce buffer delay.
Definition: jitter.h:62
virtual bool WriteData(const RTP_DataFrame &frame, const PTimeInterval &tick=PTimer::Tick())
OpalMediaType m_mediaType
Definition: jitter.h:104
unsigned m_minJitterDelay
Minimum delay in milliseconds.
Definition: jitter.h:57
virtual void Close()
int m_jitterGrowTime
Amount to increase jitter delay by when get &quot;late&quot; packet.
Definition: jitter.h:301
uint16_t RTP_SequenceNumber
Definition: rtp.h:45
Definition: jitter.h:293
const unsigned m_timeUnits
Definition: jitter.h:192
PSemaphore m_frameCount
Definition: jitter.h:339
unsigned m_overrunFactor
Multiplier on JB length (in packets) before throwing away packets.
Definition: jitter.h:66
unsigned m_packetsTooLate
Definition: jitter.h:196
virtual void Restart()
bool m_closed
Definition: jitter.h:310
Init(const OpalMediaType &mediaType, unsigned minJitterDelay, unsigned maxJitterDelay, unsigned timeUnits=8, PINDEX packetSize=2048)
Definition: jitter.h:92
Definition: jitter.h:292
RTP_Timestamp CalculateRequiredTimestamp(RTP_Timestamp playOutTimestamp) const
Initialisation information.
Definition: jitter.h:86
OpalJitterBuffer(const Init &init)
PINDEX m_packetSize
Max RTP packet size.
Definition: jitter.h:106
uint64_t m_frameTimeSum
Definition: jitter.h:319
virtual void Restart()
Definition: rtp.h:540
Definition: jitter.h:51
Params(unsigned minJitterDelay=40, unsigned maxJitterDelay=250)
Definition: jitter.h:68
virtual ~OpalJitterBuffer()
int m_lastBufferSize
Definition: jitter.h:324
virtual ~OpalAudioJitterBuffer()
AdjustResult
Definition: jitter.h:291
unsigned GetPacketsTooLate() const
Null jitter buffer, just a simpple queue.
Definition: jitter.h:351
RTP_Timestamp GetMaxJitterDelay() const
int m_timestampDelta
Definition: jitter.h:328
unsigned GetMaxConsecutiveMarkerBits() const
Definition: jitter.h:281
virtual RTP_Timestamp GetCurrentJitterDelay() const
Definition: jitter.h:164
RTP_Timestamp m_bufferEmptiedTime
Definition: jitter.h:327
PDECLARE_MUTEX(m_bufferMutex)
Definition: jitter.h:294
unsigned m_consecutiveMarkerBits
Definition: jitter.h:312
unsigned m_jitterShrinkPeriod
Deadband of low jitter before shrink delay.
Definition: jitter.h:61
virtual void Close()
unsigned m_jitterDriftPeriod
Time over which repeated undeflows cause packet to be dropped.
Definition: jitter.h:65
RTP_Timestamp m_maxJitterDelay
Maximum jitter delay in timestamp units.
Definition: jitter.h:195
uint32_t RTP_Timestamp
Definition: rtp.h:44
unsigned GetTimeUnits() const
Definition: jitter.h:172
unsigned m_bufferOverruns
Definition: jitter.h:197
unsigned GetBufferOverruns() const
unsigned m_frameTimeCount
Definition: jitter.h:318
RTP_Timestamp m_bufferStaticTime
Definition: jitter.h:325
virtual bool ReadData(RTP_DataFrame &frame, const PTimeInterval &timeout=PMaxTimeInterval)=0
virtual void SetDelay(const Init &init)
virtual void Restart()=0
void SetMaxConsecutiveMarkerBits(unsigned max)
Definition: jitter.h:285
AdjustResult AdjustCurrentJitterDelay(int delta)
virtual bool WriteData(const RTP_DataFrame &frame, const PTimeInterval &tick=PTimer::Tick())=0
unsigned m_consecutiveOverflows
Definition: jitter.h:315
virtual RTP_Timestamp GetCurrentJitterDelay() const
virtual bool ReadData(RTP_DataFrame &frame, const PTimeInterval &timeout=PMaxTimeInterval)
unsigned m_silenceShrinkPeriod
Reduce jitter delay is silent for this long.
Definition: jitter.h:63
RTP_SequenceNumber m_lastSequenceNum
Definition: jitter.h:321
int m_currentJitterDelay
Definition: jitter.h:311
Analyser * m_analyser
Definition: jitter.h:199
unsigned m_jitterGrowTime
Amount to increase jitter delay by when get &quot;late&quot; packet.
Definition: jitter.h:60
PINDEX m_packetSize
Definition: jitter.h:193
unsigned m_overrunFactor
Definition: jitter.h:308
uint32_t RTP_SyncSourceId
Definition: rtp.h:46
RTP_Timestamp m_jitterShrinkPeriod
consistently filled before shrinking
Definition: jitter.h:302
unsigned m_maxJitterDelay
Maximum delay in milliseconds.
Definition: jitter.h:58
PSyncQueue< RTP_DataFrame > m_queue
Definition: jitter.h:394
RTP_Timestamp m_bufferLowTime
Definition: jitter.h:326
virtual void SetDelay(const Init &init)