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 / mediafmt.h < prev    next >
C/C++ Source or Header  |  2002-12-01  |  9KB  |  247 lines

  1. /*
  2.  * mediafmt.h
  3.  *
  4.  * Media Format descriptions
  5.  *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 1998-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.  * Contributor(s): ______________________________________.
  25.  *
  26.  * $Log: mediafmt.h,v $
  27.  * Revision 1.13  2002/12/02 03:06:26  robertj
  28.  * Fixed over zealous removal of code when NO_AUDIO_CODECS set.
  29.  *
  30.  * Revision 1.12  2002/09/16 01:14:15  robertj
  31.  * Added #define so can select if #pragma interface/implementation is used on
  32.  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
  33.  *
  34.  * Revision 1.11  2002/09/03 06:19:37  robertj
  35.  * Normalised the multi-include header prevention ifdef/define symbol.
  36.  *
  37.  * Revision 1.10  2002/08/05 10:03:47  robertj
  38.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  39.  *
  40.  * Revision 1.9  2002/06/25 08:30:08  robertj
  41.  * Changes to differentiate between stright G.723.1 and G.723.1 Annex A using
  42.  *   the OLC dataType silenceSuppression field so does not send SID frames
  43.  *   to receiver codecs that do not understand them.
  44.  *
  45.  * Revision 1.8  2002/03/21 02:39:15  robertj
  46.  * Added backward compatibility define
  47.  *
  48.  * Revision 1.7  2002/02/11 04:15:56  robertj
  49.  * Put G.723.1 at 6.3kbps back to old string value of "G.723.1" to improve
  50.  *   backward compatibility. New #define is a synonym for it.
  51.  *
  52.  * Revision 1.6  2002/01/22 07:08:26  robertj
  53.  * Added IllegalPayloadType enum as need marker for none set
  54.  *   and MaxPayloadType is a legal value.
  55.  *
  56.  * Revision 1.5  2001/12/11 04:27:50  craigs
  57.  * Added support for 5.3kbps G723.1
  58.  *
  59.  * Revision 1.4  2001/09/21 02:49:44  robertj
  60.  * Implemented static object for all "known" media formats.
  61.  * Added default session ID to media format description.
  62.  *
  63.  * Revision 1.3  2001/05/11 04:43:41  robertj
  64.  * Added variable names for standard PCM-16 media format name.
  65.  *
  66.  * Revision 1.2  2001/02/09 05:16:24  robertj
  67.  * Added #pragma interface for GNU C++.
  68.  *
  69.  * Revision 1.1  2001/01/25 07:27:14  robertj
  70.  * Major changes to add more flexible OpalMediaFormat class to normalise
  71.  *   all information about media types, especially codecs.
  72.  *
  73.  */
  74.  
  75. #ifndef __OPAL_MEDIAFMT_H
  76. #define __OPAL_MEDIAFMT_H
  77.  
  78. #ifdef P_USE_PRAGMA
  79. #pragma interface
  80. #endif
  81.  
  82.  
  83. #include "rtp.h"
  84.  
  85.  
  86. ///////////////////////////////////////////////////////////////////////////////
  87.  
  88. /**This class describes a media format as used in the OPAL system. A media
  89.    format is the type of any media data that is trasferred between OPAL
  90.    entities. For example an audio codec such as G.723.1 is a media format, a
  91.    video codec such as H.261 is also a media format.
  92.  
  93.    There
  94.   */
  95. class OpalMediaFormat : public PCaselessString
  96. {
  97.   PCLASSINFO(OpalMediaFormat, PCaselessString);
  98.  
  99.   public:
  100.     PLIST(List, OpalMediaFormat);
  101.  
  102.     /**Default constructor creates a PCM-16 media format.
  103.       */
  104.     OpalMediaFormat();
  105.  
  106.     /**A constructor that only has a string name will search through the
  107.        RegisteredMediaFormats list for the full specification so the other
  108.        information fields can be set from the database.
  109.       */
  110.     OpalMediaFormat(
  111.       const char * search,  /// Name to search for
  112.       BOOL exact = TRUE     /// Flag for if search is to match name exactly
  113.     );
  114.  
  115.     /**This form of the constructor will register the full details of the
  116.        media format into an internal database. This would typically be used
  117.        as a static global. In fact it would be very dangerous for an instance
  118.        to use this constructor in any other way, especially local variables.
  119.  
  120.        If the rtpPayloadType is RTP_DataFrame::DynamicBase, then the RTP
  121.        payload type is actually set to teh first unused dynamic RTP payload
  122.        type that is in the registers set of media formats.
  123.  
  124.        The frameSize parameter indicates that the media format has a maximum
  125.        size for each data frame, eg G.723.1 frames are no more than 24 bytes
  126.        long. If zero then there is no intrinsic maximum, eg G.711.
  127.       */
  128.     OpalMediaFormat(
  129.       const char * fullName,  /// Full name of media format
  130.       unsigned defaultSessionID,  /// Default session for codec type
  131.       RTP_DataFrame::PayloadTypes rtpPayloadType, /// RTP payload type code
  132.       BOOL     needsJitter,   /// Indicate format requires a jitter buffer
  133.       unsigned bandwidth,     /// Bandwidth in bits/second
  134.       PINDEX   frameSize = 0, /// Size of frame in bytes (if applicable)
  135.       unsigned frameTime = 0, /// Time for frame in RTP units (if applicable)
  136.       unsigned timeUnits = 0  /// RTP units for frameTime (if applicable)
  137.     );
  138.  
  139.     /**Return TRUE if media format info is valid. This may be used if the
  140.        single string constructor is used to check that it matched something
  141.        in the registered media formats database.
  142.       */
  143.     BOOL IsValid() const { return rtpPayloadType <= RTP_DataFrame::MaxPayloadType; }
  144.  
  145.     /**Get the RTP payload type that is to be used for this media format.
  146.        This will either be an intrinsic one for the media format eg GSM or it
  147.        will be automatically calculated as a dynamic media format that will be
  148.        uniqueue amongst the registered media formats.
  149.       */
  150.     RTP_DataFrame::PayloadTypes GetPayloadType() const { return rtpPayloadType; }
  151.  
  152.     enum {
  153.       DefaultAudioSessionID = 1,
  154.       DefaultVideoSessionID = 2,
  155.       DefaultDataSessionID  = 3
  156.     };
  157.  
  158.     /**Get the default session ID for media format.
  159.       */
  160.     unsigned GetDefaultSessionID() const { return defaultSessionID; }
  161.  
  162.     /**Determine if the media format requires a jitter buffer. As a rule an
  163.        audio codec needs a jitter buffer and all others do not.
  164.       */
  165.     BOOL NeedsJitterBuffer() const { return needsJitter; }
  166.  
  167.     /**Get the average bandwidth used in bits/second.
  168.       */
  169.     unsigned GetBandwidth() const { return bandwidth; }
  170.  
  171.     /**Get the maximum frame size in bytes. If this returns zero then the
  172.        media format has no intrinsic maximum frame size, eg G.711 would 
  173.        return zero but G.723.1 whoud return 24.
  174.       */
  175.     PINDEX GetFrameSize() const { return frameSize; }
  176.  
  177.     /**Get the frame rate in RTP timestamp units. If this returns zero then
  178.        the media format is not real time and has no intrinsic timing eg
  179.       */
  180.     unsigned GetFrameTime() const { return frameTime; }
  181.  
  182.     /**Get the number of RTP timestamp units per millisecond.
  183.       */
  184.     unsigned GetTimeUnits() const { return timeUnits; }
  185.  
  186.     enum StandardTimeUnits {
  187.       AudioTimeUnits = 8,  // 8kHz sample rate
  188.       VideoTimeUnits = 90  // 90kHz sample rate
  189.     };
  190.  
  191.  
  192.     /**Get the list of media formats that have been registered.
  193.       */
  194.     inline static const List & GetRegisteredMediaFormats() { return GetMediaFormatsList(); }
  195.  
  196.  
  197.   protected:
  198.     RTP_DataFrame::PayloadTypes rtpPayloadType;
  199.     unsigned defaultSessionID;
  200.     BOOL     needsJitter;
  201.     unsigned bandwidth;
  202.     PINDEX   frameSize;
  203.     unsigned frameTime;
  204.     unsigned timeUnits;
  205.  
  206.     static List & GetMediaFormatsList();
  207. };
  208.  
  209.  
  210. // List of known media formats
  211.  
  212. #define OPAL_PCM16         "PCM-16"
  213. #define OPAL_G711_ULAW_64K "G.711-uLaw-64k"
  214. #define OPAL_G711_ALAW_64K "G.711-ALaw-64k"
  215. #define OPAL_G728          "G.728"
  216. #define OPAL_G729          "G.729"
  217. #define OPAL_G729A         "G.729A"
  218. #define OPAL_G729B         "G.729B"
  219. #define OPAL_G729AB        "G.729A/B"
  220. #define OPAL_G7231         "G.723.1"
  221. #define OPAL_G7231_6k3     OPAL_G7231
  222. #define OPAL_G7231_5k3     "G.723.1(5.3k)"
  223. #define OPAL_G7231A_6k3    "G.723.1A(6.3k)"
  224. #define OPAL_G7231A_5k3    "G.723.1A(5.3k)"
  225. #define OPAL_GSM0610       "GSM-06.10"
  226.  
  227. extern OpalMediaFormat const OpalPCM16;
  228.  
  229. extern OpalMediaFormat const OpalG711uLaw;
  230. extern OpalMediaFormat const OpalG711ALaw;
  231. extern OpalMediaFormat const OpalG728;
  232. extern OpalMediaFormat const OpalG729;
  233. extern OpalMediaFormat const OpalG729A;
  234. extern OpalMediaFormat const OpalG729B;
  235. extern OpalMediaFormat const OpalG729AB;
  236. #define OpalG7231 OpalG7231_6k3
  237. extern OpalMediaFormat const OpalG7231_6k3;
  238. extern OpalMediaFormat const OpalG7231_5k3;
  239. extern OpalMediaFormat const OpalG7231A_6k3;
  240. extern OpalMediaFormat const OpalG7231A_5k3;
  241. extern OpalMediaFormat const OpalGSM0610;
  242.  
  243. #endif  // __OPAL_MEDIAFMT_H
  244.  
  245.  
  246. // End of File ///////////////////////////////////////////////////////////////
  247.