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 / src / gsmcodec.cxx < prev    next >
C/C++ Source or Header  |  2002-08-05  |  6KB  |  225 lines

  1. /*
  2.  * gsmcodec.cxx
  3.  *
  4.  * H.323 protocol handler
  5.  *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 1998-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: gsmcodec.cxx,v $
  30.  * Revision 1.21  2002/08/05 10:03:47  robertj
  31.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  32.  *
  33.  * Revision 1.20  2001/09/21 02:51:06  robertj
  34.  * Implemented static object for all "known" media formats.
  35.  *
  36.  * Revision 1.19  2001/05/14 05:56:28  robertj
  37.  * Added H323 capability registration system so can add capabilities by
  38.  *   string name instead of having to instantiate explicit classes.
  39.  *
  40.  * Revision 1.18  2001/02/09 05:13:55  craigs
  41.  * Added pragma implementation to (hopefully) reduce the executable image size
  42.  * under Linux
  43.  *
  44.  * Revision 1.17  2001/01/25 07:27:16  robertj
  45.  * Major changes to add more flexible OpalMediaFormat class to normalise
  46.  *   all information about media types, especially codecs.
  47.  *
  48.  * Revision 1.16  2000/10/13 03:43:29  robertj
  49.  * Added clamping to avoid ever setting incorrect tx frame count.
  50.  *
  51.  * Revision 1.15  2000/08/25 03:18:40  craigs
  52.  * More work on support for MS-GSM format
  53.  *
  54.  * Revision 1.14  2000/07/13 17:24:33  robertj
  55.  * Fixed format name to be consistent will all others.
  56.  *
  57.  * Revision 1.13  2000/07/12 10:25:37  robertj
  58.  * Renamed all codecs so obvious whether software or hardware.
  59.  *
  60.  * Revision 1.12  2000/07/09 14:55:15  robertj
  61.  * Bullet proofed packet count so incorrect capabilities does not crash us.
  62.  *
  63.  * Revision 1.11  2000/05/10 04:05:33  robertj
  64.  * Changed capabilities so has a function to get name of codec, instead of relying on PrintOn.
  65.  *
  66.  * Revision 1.10  2000/05/02 04:32:26  robertj
  67.  * Fixed copyright notice comment.
  68.  *
  69.  * Revision 1.9  2000/03/21 03:06:49  robertj
  70.  * Changes to make RTP TX of exact numbers of frames in some codecs.
  71.  *
  72.  * Revision 1.8  1999/12/31 00:05:36  robertj
  73.  * Added Microsoft ACM G.723.1 codec capability.
  74.  *
  75.  * Revision 1.7  1999/11/20 00:53:47  robertj
  76.  * Fixed ability to have variable sized frames in single RTP packet under G.723.1
  77.  *
  78.  * Revision 1.6  1999/10/08 09:59:03  robertj
  79.  * Rewrite of capability for sending multiple audio frames
  80.  *
  81.  * Revision 1.5  1999/10/08 08:30:45  robertj
  82.  * Fixed maximum packet size, must be less than 256
  83.  *
  84.  * Revision 1.4  1999/10/08 04:58:38  robertj
  85.  * Added capability for sending multiple audio frames in single RTP packet
  86.  *
  87.  * Revision 1.3  1999/09/27 01:13:09  robertj
  88.  * Fixed old GNU compiler support
  89.  *
  90.  * Revision 1.2  1999/09/23 07:25:12  robertj
  91.  * Added open audio and video function to connection and started multi-frame codec send functionality.
  92.  *
  93.  * Revision 1.1  1999/09/08 04:05:49  robertj
  94.  * Added support for video capabilities & codec, still needs the actual codec itself!
  95.  *
  96.  */
  97.  
  98. #include <ptlib.h>
  99.  
  100. #ifdef __GNUC__
  101. #pragma implementation "gsmcodec.h"
  102. #endif
  103.  
  104. #include "gsmcodec.h"
  105.  
  106. #include "h245.h"
  107. #include "rtp.h"
  108.  
  109. extern "C" {
  110. #include "gsm/inc/gsm.h"
  111. };
  112.  
  113.  
  114. #define new PNEW
  115.  
  116.  
  117. #define GSM_BYTES_PER_FRAME 33
  118.  
  119. #define H323_NAME "GSM-06.10{sw}"
  120.  
  121. H323_REGISTER_CAPABILITY(H323_GSM0610Capability, H323_NAME);
  122.  
  123.  
  124. /////////////////////////////////////////////////////////////////////////////
  125.  
  126. H323_GSM0610Capability::H323_GSM0610Capability()
  127.   : H323AudioCapability(7, 4)
  128. {
  129. }
  130.  
  131.  
  132. PObject * H323_GSM0610Capability::Clone() const
  133. {
  134.   return new H323_GSM0610Capability(*this);
  135. }
  136.  
  137.  
  138. PString H323_GSM0610Capability::GetFormatName() const
  139. {
  140.   return H323_NAME;
  141. }
  142.  
  143.  
  144. unsigned H323_GSM0610Capability::GetSubType() const
  145. {
  146.   return H245_AudioCapability::e_gsmFullRate;
  147. }
  148.  
  149.  
  150. void H323_GSM0610Capability::SetTxFramesInPacket(unsigned frames)
  151. {
  152.   if (frames > 7)
  153.     txFramesInPacket = 7;
  154.   else
  155.     H323AudioCapability::SetTxFramesInPacket(frames);
  156. }
  157.  
  158.  
  159. BOOL H323_GSM0610Capability::OnSendingPDU(H245_AudioCapability & cap,
  160.                                           unsigned packetSize) const
  161. {
  162.   cap.SetTag(H245_AudioCapability::e_gsmFullRate);
  163.  
  164.   H245_GSMAudioCapability & gsm = cap;
  165.   gsm.m_audioUnitSize = packetSize*GSM_BYTES_PER_FRAME;
  166.   return TRUE;
  167. }
  168.  
  169.  
  170. BOOL H323_GSM0610Capability::OnReceivedPDU(const H245_AudioCapability & cap,
  171.                                            unsigned & packetSize)
  172. {
  173.   if (cap.GetTag() != H245_AudioCapability::e_gsmFullRate)
  174.     return FALSE;
  175.  
  176.   const H245_GSMAudioCapability & gsm = cap;
  177.   packetSize = gsm.m_audioUnitSize / GSM_BYTES_PER_FRAME;
  178.   if (packetSize == 0)
  179.     packetSize = 1;
  180.   return TRUE;
  181. }
  182.  
  183.  
  184. H323Codec * H323_GSM0610Capability::CreateCodec(H323Codec::Direction direction) const
  185. {
  186.   return new H323_GSM0610Codec(direction);
  187. }
  188.  
  189.  
  190. /////////////////////////////////////////////////////////////////////////////
  191.  
  192. H323_GSM0610Codec::H323_GSM0610Codec(Direction dir)
  193.   : H323FramedAudioCodec(OpalGSM0610, dir)
  194. {
  195.   gsm = gsm_create();
  196.   PTRACE(3, "Codec\tGSM " << (dir == Encoder ? "en" : "de")
  197.          << "coder created");
  198. }
  199.  
  200.  
  201. H323_GSM0610Codec::~H323_GSM0610Codec()
  202. {
  203.   gsm_destroy(gsm);
  204. }
  205.  
  206.  
  207. BOOL H323_GSM0610Codec::EncodeFrame(BYTE * buffer, unsigned &)
  208. {
  209.   gsm_encode(gsm, sampleBuffer.GetPointer(), buffer);
  210.   return TRUE;
  211. }
  212.  
  213.  
  214. BOOL H323_GSM0610Codec::DecodeFrame(const BYTE * buffer, unsigned length, unsigned &)
  215. {
  216.   if (length < GSM_BYTES_PER_FRAME)
  217.     return FALSE;
  218.  
  219.   gsm_decode(gsm, (BYTE *)buffer, sampleBuffer.GetPointer());
  220.   return TRUE;
  221. }
  222.  
  223.  
  224. /////////////////////////////////////////////////////////////////////////////
  225.