00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef OPAL_RTP_JITTER_H
00035 #define OPAL_RTP_JITTER_H
00036
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040
00041 #include <opal/buildopts.h>
00042
00043 #include <rtp/rtp.h>
00044
00045
00046 class RTP_JitterBuffer;
00047 class RTP_JitterBufferAnalyser;
00048
00049
00051
00055 class OpalJitterBuffer : public PSafeObject
00056 {
00057 PCLASSINFO(OpalJitterBuffer, PSafeObject);
00058
00059 public:
00065 OpalJitterBuffer(
00066 unsigned minJitterDelay,
00067 unsigned maxJitterDelay,
00068 unsigned timeUnits = 8,
00069 PINDEX packetSize = 2048
00070 );
00071
00074 virtual ~OpalJitterBuffer();
00076
00080 void PrintOn(
00081 ostream & strm
00082 ) const;
00084
00089 void SetDelay(
00090 unsigned minJitterDelay,
00091 unsigned maxJitterDelay,
00092 PINDEX packetSize = 2048
00093 );
00094
00097 void Reset();
00098
00101 virtual PBoolean WriteData(
00102 const RTP_DataFrame & frame,
00103 const PTimeInterval & tick = 0
00104 );
00105
00110 virtual PBoolean ReadData(
00111 RTP_DataFrame & frame,
00112 const PTimeInterval & tick = 0
00113 );
00114
00117 DWORD GetCurrentJitterDelay() const { return m_currentJitterDelay; }
00118
00121 DWORD GetMinJitterDelay() const { return m_minJitterDelay; }
00122
00125 DWORD GetMaxJitterDelay() const { return m_maxJitterDelay; }
00126
00129 unsigned GetTimeUnits() const { return m_timeUnits; }
00130
00133 DWORD GetPacketsTooLate() const { return m_packetsTooLate; }
00134
00137 DWORD GetBufferOverruns() const { return m_bufferOverruns; }
00138
00141 DWORD GetMaxConsecutiveMarkerBits() const { return m_maxConsecutiveMarkerBits; }
00142
00145 void SetMaxConsecutiveMarkerBits(DWORD max) { m_maxConsecutiveMarkerBits = max; }
00147
00148 protected:
00149 DWORD CalculateRequiredTimestamp(DWORD playOutTimestamp) const;
00150 bool AdjustCurrentJitterDelay(int delta);
00151
00152 unsigned m_timeUnits;
00153 PINDEX m_packetSize;
00154 DWORD m_minJitterDelay;
00155 DWORD m_maxJitterDelay;
00156 int m_jitterGrowTime;
00157 DWORD m_jitterShrinkPeriod;
00158
00159 int m_jitterShrinkTime;
00160 DWORD m_silenceShrinkPeriod;
00161 int m_silenceShrinkTime;
00162 DWORD m_jitterDriftPeriod;
00163
00164 int m_currentJitterDelay;
00165 DWORD m_packetsTooLate;
00166 DWORD m_bufferOverruns;
00167 DWORD m_consecutiveMarkerBits;
00168 DWORD m_maxConsecutiveMarkerBits;
00169 DWORD m_consecutiveLatePackets;
00170
00171 DWORD m_averageFrameTime;
00172 DWORD m_lastTimestamp;
00173 DWORD m_lastSyncSource;
00174 DWORD m_bufferFilledTime;
00175 DWORD m_bufferLowTime;
00176 DWORD m_bufferEmptiedTime;
00177 int m_timestampDelta;
00178
00179 enum {
00180 e_SynchronisationStart,
00181 e_SynchronisationFill,
00182 e_SynchronisationShrink,
00183 e_SynchronisationDone
00184 } m_synchronisationState;
00185
00186 typedef std::map<DWORD, RTP_DataFrame> FrameMap;
00187 FrameMap m_frames;
00188 PMutex m_bufferMutex;
00189
00190 RTP_JitterBufferAnalyser * m_analyser;
00191 };
00192
00193
00197 class OpalJitterBufferThread : public OpalJitterBuffer
00198 {
00199 PCLASSINFO(OpalJitterBufferThread, OpalJitterBuffer);
00200 public:
00201 OpalJitterBufferThread(
00202 unsigned minJitterDelay,
00203 unsigned maxJitterDelay,
00204 unsigned timeUnits = 8,
00205 PINDEX packetSize = 2048
00206 );
00207 ~OpalJitterBufferThread();
00208
00215 virtual PBoolean ReadData(
00216 RTP_DataFrame & frame
00217 );
00218
00223 virtual PBoolean OnReadPacket(
00224 RTP_DataFrame & frame
00225 ) = 0;
00226
00227 void StartThread();
00228
00229 protected:
00230 PDECLARE_NOTIFIER(PThread, OpalJitterBufferThread, JitterThreadMain);
00231
00233 void WaitForThreadTermination();
00234
00235 PThread * m_jitterThread;
00236 bool m_running;
00237 };
00238
00239
00241
00244 class RTP_JitterBuffer : public OpalJitterBufferThread
00245 {
00246 PCLASSINFO(RTP_JitterBuffer, OpalJitterBufferThread);
00247 public:
00248 RTP_JitterBuffer(
00249 RTP_Session & session,
00250 unsigned minJitterDelay,
00251 unsigned maxJitterDelay,
00252 unsigned timeUnits = 8,
00253 PINDEX packetSize = 2048
00254 );
00255 ~RTP_JitterBuffer();
00256
00261 virtual PBoolean OnReadPacket(
00262 RTP_DataFrame & frame
00263 );
00264
00265 protected:
00267 RTP_Session & m_session;
00268 };
00269
00270 #endif // OPAL_RTP_JITTER_H
00271
00272