home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / openh323.tar.gz / openh323.tar / openh323 / include / jitter.h < prev    next >
C/C++ Source or Header  |  2002-10-30  |  6KB  |  182 lines

  1. /*
  2.  * jitter.h
  3.  *
  4.  * Jitter buffer support
  5.  *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 1999-2000 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.  * $Log: jitter.h,v $
  30.  * Revision 1.12  2002/10/31 00:32:39  robertj
  31.  * Enhanced jitter buffer system so operates dynamically between minimum and
  32.  *   maximum values. Altered API to assure app writers note the change!
  33.  *
  34.  * Revision 1.11  2002/09/16 01:14:15  robertj
  35.  * Added #define so can select if #pragma interface/implementation is used on
  36.  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
  37.  *
  38.  * Revision 1.10  2002/09/03 05:40:18  robertj
  39.  * Normalised the multi-include header prevention ifdef/define symbol.
  40.  * Added buffer reset on excess buffer overruns.
  41.  * Added ability to get buffer overruns for statistics display.
  42.  *
  43.  * Revision 1.9  2002/08/05 10:03:47  robertj
  44.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  45.  *
  46.  * Revision 1.8  2001/09/11 00:21:21  robertj
  47.  * Fixed missing stack sizes in endpoint for cleaner thread and jitter thread.
  48.  *
  49.  * Revision 1.7  2001/02/09 05:16:24  robertj
  50.  * Added #pragma interface for GNU C++.
  51.  *
  52.  * Revision 1.6  2000/05/25 02:26:12  robertj
  53.  * Added ignore of marker bits on broken clients that sets it on every RTP packet.
  54.  *
  55.  * Revision 1.5  2000/05/04 11:49:21  robertj
  56.  * Added Packets Too Late statistics, requiring major rearrangement of jitter buffer code.
  57.  *
  58.  * Revision 1.4  2000/05/02 04:32:24  robertj
  59.  * Fixed copyright notice comment.
  60.  *
  61.  * Revision 1.3  2000/04/30 03:56:14  robertj
  62.  * More instrumentation to analyse jitter buffer operation.
  63.  *
  64.  * Revision 1.2  2000/03/20 20:51:13  robertj
  65.  * Fixed possible buffer overrun problem in RTP_DataFrames
  66.  *
  67.  * Revision 1.1  1999/12/23 23:02:35  robertj
  68.  * File reorganision for separating RTP from H.323 and creation of LID for VPB support.
  69.  *
  70.  */
  71.  
  72. #ifndef __OPAL_JITTER_H
  73. #define __OPAL_JITTER_H
  74.  
  75. #ifdef P_USE_PRAGMA
  76. #pragma interface
  77. #endif
  78.  
  79.  
  80. #include "rtp.h"
  81.  
  82.  
  83. class RTP_JitterBufferAnalyser;
  84.  
  85.  
  86. ///////////////////////////////////////////////////////////////////////////////
  87.  
  88. class RTP_JitterBuffer : public PThread
  89. {
  90.   PCLASSINFO(RTP_JitterBuffer, PThread);
  91.  
  92.   public:
  93.     RTP_JitterBuffer(
  94.       RTP_Session & session,   /// Associated RTP session tor ead data from
  95.       unsigned minJitterDelay, /// Minimum delay in RTP timestamp units
  96.       unsigned maxJitterDelay, /// Maximum delay in RTP timestamp units
  97.       PINDEX stackSize = 30000 /// Stack size for jitter thread
  98.     );
  99.     ~RTP_JitterBuffer();
  100.  
  101. //    PINDEX GetSize() const { return bufferSize; }
  102.     /**Set the maximum delay the jitter buffer will operate to.
  103.       */
  104.     void SetDelay(
  105.       unsigned minJitterDelay, /// Minimum delay in RTP timestamp units
  106.       unsigned maxJitterDelay  /// Maximum delay in RTP timestamp units
  107.     );
  108.  
  109.     /**Read a data frame from the RTP channel.
  110.        Any control frames received are dispatched to callbacks and are not
  111.        returned by this function. It will block until a data frame is
  112.        available or an error occurs.
  113.       */
  114.     virtual BOOL ReadData(
  115.       DWORD timestamp,        /// Timestamp to read from buffer.
  116.       RTP_DataFrame & frame   /// Frame read from the RTP session
  117.     );
  118.  
  119.     /**Get current delay for jitter buffer.
  120.       */
  121.     DWORD GetJitterTime() const { return currentJitterTime; }
  122.  
  123.     /**Get total number received packets too late to go into jitter buffer.
  124.       */
  125.     DWORD GetPacketsTooLate() const { return packetsTooLate; }
  126.  
  127.     /**Get total number received packets that overran the jitter buffer.
  128.       */
  129.     DWORD GetBufferOverruns() const { return bufferOverruns; }
  130.  
  131.     /**Get maximum consecutive marker bits before buffer starts to ignore them.
  132.       */
  133.     DWORD GetMaxConsecutiveMarkerBits() const { return maxConsecutiveMarkerBits; }
  134.  
  135.     /**Set maximum consecutive marker bits before buffer starts to ignore them.
  136.       */
  137.     void SetMaxConsecutiveMarkerBits(DWORD max) { maxConsecutiveMarkerBits = max; }
  138.  
  139.  
  140.   protected:
  141.     virtual void Main();
  142.  
  143.     class Entry : public RTP_DataFrame
  144.     {
  145.       public:
  146.         Entry * next;
  147.         Entry * prev;
  148.         PTimeInterval tick;
  149.     };
  150.  
  151.     RTP_Session & session;
  152.     PINDEX        bufferSize;
  153.     DWORD         minJitterTime;
  154.     DWORD         maxJitterTime;
  155.     DWORD         maxConsecutiveMarkerBits;
  156.  
  157.     unsigned currentDepth;
  158.     DWORD    currentJitterTime;
  159.     DWORD    packetsTooLate;
  160.     unsigned bufferOverruns;
  161.     unsigned consecutiveBufferOverruns;
  162.     DWORD    consecutiveMarkerBits;
  163.     DWORD    consecutiveEarlyPacketStartTime;
  164.  
  165.     Entry * oldestFrame;
  166.     Entry * newestFrame;
  167.     Entry * freeFrames;
  168.     Entry * currentWriteFrame;
  169.  
  170.     PMutex bufferMutex;
  171.     BOOL   shuttingDown;
  172.     BOOL   preBuffering;
  173.  
  174.     RTP_JitterBufferAnalyser * analyser;
  175. };
  176.  
  177.  
  178. #endif // __OPAL_JITTER_H
  179.  
  180.  
  181. /////////////////////////////////////////////////////////////////////////////
  182.