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 / g729codec.cxx < prev    next >
C/C++ Source or Header  |  2003-05-05  |  6KB  |  232 lines

  1. /*
  2.  * g729codec.cxx
  3.  *
  4.  * H.323 interface for G.729A 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.  * 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: g729codec.cxx,v $
  30.  * Revision 1.7  2003/05/05 11:59:25  robertj
  31.  * Changed to use autoconf style selection of options and subsystems.
  32.  *
  33.  * Revision 1.6  2002/11/12 00:07:12  robertj
  34.  * Added check for Voice Age G.729 only being able to do a single instance
  35.  *   of the encoder and decoder. Now fails the second isntance isntead of
  36.  *   interfering with the first one.
  37.  *
  38.  * Revision 1.5  2002/08/05 10:03:47  robertj
  39.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  40.  *
  41.  * Revision 1.4  2002/06/27 03:13:11  robertj
  42.  * Added G.729 capabilitity support even though is really G.729A.
  43.  * Changed compilation under Windows to use environment variables for
  44.  *   determining if Voice Age G.729A library installed.
  45.  *
  46.  * Revision 1.3  2001/09/21 04:37:30  robertj
  47.  * Added missing GetSubType() function.
  48.  *
  49.  * Revision 1.2  2001/09/21 03:57:18  robertj
  50.  * Fixed warning when no voice age library present.
  51.  * Added pragma interface
  52.  *
  53.  * Revision 1.1  2001/09/21 02:54:47  robertj
  54.  * Added new codec framework with no actual implementation.
  55.  *
  56.  */
  57.  
  58. #include <ptlib.h>
  59.  
  60. #ifdef __GNUC__
  61. #pragma implementation "g729codec.h"
  62. #endif
  63.  
  64. #include "g729codec.h"
  65.  
  66. #include "h245.h"
  67.  
  68.  
  69. #if VOICE_AGE_G729A
  70.  
  71. extern "C" {
  72. #include "va_g729a.h"
  73. };
  74.  
  75.  
  76. #if defined(_MSC_VER)
  77.  
  78. #pragma comment(lib, VOICE_AGE_G729_LIBRARY)
  79.  
  80. // All of PWLib/OpenH323 use MSVCRT.LIB or MSVCRTD.LIB, but vag729a.lib uses
  81. // libcmt.lib, so we need to tell the linker to ignore it, can't have two
  82. // Run Time libraries!
  83. #pragma comment(linker, "/NODEFAULTLIB:libcmt.lib")
  84.  
  85. #endif
  86.  
  87.  
  88. #define new PNEW
  89.  
  90.  
  91. #define H323_G729  OPAL_G729 "{sw}"
  92. #define H323_G729A OPAL_G729A"{sw}"
  93. static H323_G729ACodec * voiceAgeEncoderInUse = NULL;
  94. static H323_G729ACodec * voiceAgeDecoderInUse = NULL;
  95.  
  96. H323_REGISTER_CAPABILITY(H323_G729Capability,  H323_G729);
  97. H323_REGISTER_CAPABILITY(H323_G729ACapability, H323_G729A);
  98.  
  99.  
  100. /////////////////////////////////////////////////////////////////////////////
  101.  
  102. H323_G729Capability::H323_G729Capability()
  103.   : H323AudioCapability(24, 6)
  104. {
  105. }
  106.  
  107.  
  108. PObject * H323_G729Capability::Clone() const
  109. {
  110.   return new H323_G729Capability(*this);
  111. }
  112.  
  113.  
  114. unsigned H323_G729Capability::GetSubType() const
  115. {
  116.   return H245_AudioCapability::e_g729;
  117. }
  118.  
  119.  
  120. PString H323_G729Capability::GetFormatName() const
  121. {
  122.   return H323_G729;
  123. }
  124.  
  125.  
  126. H323Codec * H323_G729Capability::CreateCodec(H323Codec::Direction direction) const
  127. {
  128.   return new H323_G729ACodec(direction);
  129. }
  130.  
  131.  
  132. /////////////////////////////////////////////////////////////////////////////
  133.  
  134. H323_G729ACapability::H323_G729ACapability()
  135.   : H323AudioCapability(24, 6)
  136. {
  137. }
  138.  
  139.  
  140. PObject * H323_G729ACapability::Clone() const
  141. {
  142.   return new H323_G729ACapability(*this);
  143. }
  144.  
  145.  
  146. unsigned H323_G729ACapability::GetSubType() const
  147. {
  148.   return H245_AudioCapability::e_g729AnnexA;
  149. }
  150.  
  151.  
  152. PString H323_G729ACapability::GetFormatName() const
  153. {
  154.   return H323_G729A;
  155. }
  156.  
  157.  
  158. H323Codec * H323_G729ACapability::CreateCodec(H323Codec::Direction direction) const
  159. {
  160.   return new H323_G729ACodec(direction);
  161. }
  162.  
  163.  
  164. /////////////////////////////////////////////////////////////////////////////
  165.  
  166. H323_G729ACodec::H323_G729ACodec(Direction dir)
  167.   : H323FramedAudioCodec(OpalG729A, dir)
  168. {
  169.   if(dir == Encoder) {
  170.     if (voiceAgeEncoderInUse != NULL) {
  171.       PTRACE(1, "Codec\tVoice Age G.729A encoder already in use!");
  172.       return;
  173.     }
  174.     voiceAgeEncoderInUse = this;
  175.     va_g729a_init_encoder();
  176.   }
  177.   else {
  178.     if (voiceAgeDecoderInUse != NULL) {
  179.       PTRACE(1, "Codec\tVoice Age G.729A decoder already in use!");
  180.       return;
  181.     }
  182.     voiceAgeDecoderInUse = this;
  183.     va_g729a_init_decoder();
  184.   }
  185.  
  186.   PTRACE(1, "Codec\tG.729A " << (dir == Encoder ? " en" : " de") << "coder created");
  187. }
  188.  
  189.  
  190. H323_G729ACodec::~H323_G729ACodec()
  191. {
  192.   if (voiceAgeEncoderInUse == this) {
  193.     voiceAgeEncoderInUse = NULL;
  194.     PTRACE(1, "Codec\tG.729A encoder destroyed");
  195.   }
  196.   if (voiceAgeDecoderInUse == this) {
  197.     voiceAgeDecoderInUse = NULL;
  198.     PTRACE(1, "Codec\tG.729A decoder destroyed");
  199.   }
  200. }
  201.  
  202.  
  203. BOOL H323_G729ACodec::EncodeFrame(BYTE * buffer, unsigned & /*length*/)
  204. {
  205.   if (voiceAgeEncoderInUse != this)
  206.     return FALSE;
  207.  
  208.   va_g729a_encoder(sampleBuffer.GetPointer(), buffer);
  209.   return TRUE;
  210. }
  211.  
  212.  
  213. BOOL H323_G729ACodec::DecodeFrame(const BYTE * buffer,
  214.                                   unsigned length,
  215.                                   unsigned & /*written*/)
  216. {
  217.   if (voiceAgeDecoderInUse != this)
  218.     return FALSE;
  219.  
  220.   if (length < L_FRAME_COMPRESSED)
  221.     return FALSE;
  222.  
  223.   va_g729a_decoder((BYTE*)buffer, sampleBuffer.GetPointer(), 0);
  224.   return TRUE;
  225. }
  226.  
  227.  
  228. #endif // VOICE_AGE_G729A
  229.  
  230.  
  231. /////////////////////////////////////////////////////////////////////////////
  232.