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 / g7231codec.cxx < prev    next >
C/C++ Source or Header  |  2002-08-05  |  5KB  |  222 lines

  1. /*
  2.  * g7231codec.cxx
  3.  *
  4. * H.323 interface for a G.723.1 codec
  5.   *
  6.  * Open H323 Library
  7.  *
  8.  * Copyright (c) 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: g7231codec.cxx,v $
  27.  * Revision 1.6  2002/08/05 10:03:47  robertj
  28.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  29.  *
  30.  * Revision 1.5  2002/07/02 23:13:32  robertj
  31.  * Fixed copy & paste error in Compare() function, thanks Federico Pinna
  32.  *
  33.  * Revision 1.4  2002/06/25 08:27:38  robertj
  34.  * Changes to differentiate between stright G.723.1 and G.723.1 Annex A using
  35.  *   the OLC dataType silenceSuppression field so does not send SID frames
  36.  *   to receiver codecs that do not understand them.
  37.  *
  38.  * Revision 1.3  2002/02/08 14:45:05  craigs
  39.  * Changed to use #define from mediastream.h. Thanks to Roger Hardiman
  40.  *
  41.  * Revision 1.2  2001/09/21 03:57:49  robertj
  42.  * Added missing includes.
  43.  * Added pragma interface
  44.  *
  45.  * Revision 1.1  2001/09/21 02:54:47  robertj
  46.  * Added new codec framework with no actual implementation.
  47.  *
  48.  */
  49.  
  50. #include <ptlib.h>
  51.  
  52. #ifdef __GNUC__
  53. #pragma implementation "g7231codec.h"
  54. #endif
  55.  
  56. #include "g7231codec.h"
  57.  
  58. #include "h245.h"
  59. #include "rtp.h"
  60.  
  61.  
  62. #ifdef ITU_REFERENCE_G7231
  63. extern "C" {
  64.  
  65. #include "itu_g.723.1/typedef.h"
  66. #include "itu_g.723.1/cst_lbc.h"
  67. #include "itu_g.723.1/decod.h"
  68. #include "itu_g.723.1/coder.h"
  69.  
  70. Flag UsePf = True;
  71. Flag UseHp = True;
  72. Flag UseVx = True;
  73. enum Crate WrkRate = Rate63;
  74.  
  75. };
  76. #endif
  77.  
  78.  
  79. #define new PNEW
  80.  
  81.  
  82. #define H323_NAME OPAL_G7231_6k3"{sw}"
  83.  
  84. H323_REGISTER_CAPABILITY(H323_G7231Capability, H323_NAME);
  85.  
  86.  
  87. /////////////////////////////////////////////////////////////////////////////
  88.  
  89. H323_G7231Capability::H323_G7231Capability(BOOL annexA_)
  90.   : H323AudioCapability(7, 4)
  91. {
  92.   annexA = annexA_;
  93. }
  94.  
  95.  
  96. PObject::Comparison H323_G7231Capability::Compare(const PObject & obj) const
  97. {
  98.   Comparison result = H323AudioCapability::Compare(obj);
  99.   if (result != EqualTo)
  100.     return result;
  101.  
  102.   PINDEX otherAnnexA = ((const H323_G7231Capability &)obj).annexA;
  103.   if (annexA < otherAnnexA)
  104.     return LessThan;
  105.   if (annexA > otherAnnexA)
  106.     return GreaterThan;
  107.   return EqualTo;
  108. }
  109.  
  110.  
  111. PObject * H323_G7231Capability::Clone() const
  112. {
  113.   return new H323_G7231Capability(*this);
  114. }
  115.  
  116.  
  117. PString H323_G7231Capability::GetFormatName() const
  118. {
  119.   return H323_NAME;
  120. }
  121.  
  122.  
  123. unsigned H323_G7231Capability::GetSubType() const
  124. {
  125.   return H245_AudioCapability::e_g7231;
  126. }
  127.  
  128.  
  129. BOOL H323_G7231Capability::OnSendingPDU(H245_AudioCapability & cap,
  130.                                           unsigned packetSize) const
  131. {
  132.   cap.SetTag(H245_AudioCapability::e_g7231);
  133.  
  134.   H245_AudioCapability_g7231 & g7231 = cap;
  135.   g7231.m_maxAl_sduAudioFrames = packetSize;
  136.   g7231.m_silenceSuppression = annexA;
  137.  
  138.   return TRUE;
  139. }
  140.  
  141.  
  142. BOOL H323_G7231Capability::OnReceivedPDU(const H245_AudioCapability & cap,
  143.                                            unsigned & packetSize)
  144. {
  145.   if (cap.GetTag() != H245_AudioCapability::e_g7231)
  146.     return FALSE;
  147.  
  148.   const H245_AudioCapability_g7231 & g7231 = cap;
  149.   packetSize = g7231.m_maxAl_sduAudioFrames;
  150.   annexA = g7231.m_silenceSuppression;
  151.  
  152.   return TRUE;
  153. }
  154.  
  155.  
  156. H323Codec * H323_G7231Capability::CreateCodec(H323Codec::Direction direction) const
  157. {
  158.   return new H323_G7231Codec(direction, annexA);
  159. }
  160.  
  161.  
  162. /////////////////////////////////////////////////////////////////////////////
  163.  
  164. H323_G7231Codec::H323_G7231Codec(Direction dir, BOOL /*annexA*/)
  165.   : H323FramedAudioCodec(OpalG7231, dir)
  166. {
  167. #ifdef ITU_REFERENCE_G7231
  168.   if (dir == Encoder) {
  169.     decoderState = NULL;
  170.     encoderState = new cod_state;
  171.     ::Init_Coder(encoderState);
  172.   }
  173.   else {
  174.     encoderState = NULL;
  175.     decoderState = new dec_state;
  176.     ::Init_Decod(decoderState);
  177.   }
  178. #endif
  179.  
  180.   PTRACE(3, "Codec\tG.723.1 " << (dir == Encoder ? "en" : "de")
  181.          << "coder created");
  182. }
  183.  
  184.  
  185. H323_G7231Codec::~H323_G7231Codec()
  186. {
  187. #ifdef ITU_REFERENCE_G7231
  188.   delete encoderState;
  189.   delete decoderState;
  190. #endif
  191. }
  192.  
  193.  
  194. static unsigned const FrameSizes[4] = { 24, 20, 4, 1 };
  195.  
  196. BOOL H323_G7231Codec::EncodeFrame(BYTE * buffer, unsigned & length)
  197. {
  198. #ifdef ITU_REFERENCE_G7231
  199.   ::Coder(encoderState, sampleBuffer.GetPointer(), (char *)buffer);
  200. #endif
  201.  
  202.   length = FrameSizes[*buffer&3];
  203.   return TRUE;
  204. }
  205.  
  206.  
  207. BOOL H323_G7231Codec::DecodeFrame(const BYTE * buffer, unsigned length, unsigned & written)
  208. {
  209.   written = FrameSizes[*buffer&3];
  210.  
  211.   if (length < written)
  212.     return FALSE;
  213.  
  214. #ifdef ITU_REFERENCE_G7231
  215.   ::Decod(decoderState, sampleBuffer.GetPointer(), (char *)buffer, 0);
  216. #endif
  217.   return TRUE;
  218. }
  219.  
  220.  
  221. /////////////////////////////////////////////////////////////////////////////
  222.