OpenH323 1.18.0
dynacodec.h
Go to the documentation of this file.
00001 /*
00002  * dynacodec.h
00003  *
00004  * Dynamic codec loading
00005  *
00006  * Open H323 Library
00007  *
00008  * Copyright (c) 2003 Equivalence Pty. Ltd.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open H323 Library.
00021  *
00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00023  *
00024  * Contributor(s): ______________________________________.
00025  *
00026  * $Log: dynacodec.h,v $
00027  * Revision 1.2  2003/04/30 04:57:13  craigs
00028  * Changed interface to DLL codec to improve Opal compatibility
00029  *
00030  * Revision 1.1  2003/04/27 23:48:24  craigs
00031  * Initial version
00032  *
00033  */
00034 
00035 #ifndef _OPALDYNACODEC
00036 #define _OPALDYNACODEC
00037 
00038 extern "C" {
00039 #include "dllcodec.h"
00040 };
00041 
00042 #include "h323caps.h"
00043 
00045 
00046 class OpalDLLCodecRec;
00047 
00048 class OpalDynaCodecDLL : public PDynaLink
00049 {
00050   public:
00051     PCLASSINFO(OpalDynaCodecDLL, PDynaLink);
00052 
00053     OpalDynaCodecDLL(const PFilePath & codec);
00054     BOOL Load();
00055 
00056     OpalDLLCodecInfo * EnumerateCodecs(unsigned * count);
00057 
00058     static BOOL LoadCodecs();
00059     static BOOL LoadCodecs(const PDirectory & dir);
00060     static BOOL LoadCodec(const PFilePath & file);
00061 
00062     static PINDEX AddAudioCapabilities(H323EndPoint & ep,
00063                                        PINDEX descriptorNum,
00064                                        PINDEX simultaneousNum,
00065                                        H323Capabilities & capabilities);
00066 
00067     static PINDEX AddVideoCapabilities(H323EndPoint & ep,
00068                                        PINDEX descriptorNum,
00069                                        PINDEX simultaneousNum,
00070                                        H323Capabilities & capabilities);
00071 
00072     static PINDEX AddCapabilities(H323EndPoint & ep,
00073                                   PINDEX descriptorNum,
00074                                   PINDEX simultaneousNum,
00075                                   H323Capabilities & capabilities,
00076                                   const PString & type);
00077 
00078     static PDirectory defaultCodecDir;
00079 
00080   protected:
00081     OpalDLLCodecInfo * (*EnumerateCodecsFn)(unsigned apiVersion, unsigned * count);
00082     static PMutex mutex;
00083     static BOOL inited;
00084     int referenceCount;
00085 };
00086 
00088 
00089 class OpalDLLCodecRec : public PObject {
00090   PCLASSINFO(OpalDLLCodecRec, PObject);
00091   public:
00092     OpalDLLCodecRec(OpalDynaCodecDLL & _encoder, 
00093                const PStringToString & _attributes, 
00094               const OpalDLLCodecInfo & _encoderCodeInfo,
00095                      OpalMediaFormat * _mediaFormat);
00096 
00097     void * CreateContext() const;
00098     void DestroyContext(void * context) const;
00099 
00100     H323Capability * CreateCapability(H323EndPoint & ep) const;
00101 
00102     void SetParameter(const PString & attribute, const PString & value) const;
00103     PString GetParameter(const PString & attribute, const char * defValue = NULL) const;
00104 
00105     OpalDynaCodecDLL & encoder;
00106     PStringToString    attributes;
00107     OpalDLLCodecInfo   info;
00108 
00109     OpalMediaFormat  * mediaFormat;
00110     //H323Capability   * capability;
00111     //PString            h323Name;
00112 };
00113 
00115 
00116 class OpalDynaAudioCodec : public H323FramedAudioCodec
00117 {
00118   PCLASSINFO(OpalDynaAudioCodec, H323FramedAudioCodec)
00119 
00120   public:
00121     OpalDynaAudioCodec(const OpalDLLCodecRec & _info, Direction direction);
00122     ~OpalDynaAudioCodec();
00123     virtual BOOL EncodeFrame(BYTE * buffer, unsigned & length);
00124     virtual BOOL DecodeFrame(const BYTE * buffer, unsigned length, unsigned & written);
00125 
00126   protected:
00127     const OpalDLLCodecRec & info;
00128     void * context;
00129     unsigned samplesPerFrame;
00130     unsigned bytesPerFrame;
00131 };
00132 
00134 
00135 class OpalDynaCodecRegistration : public H323CapabilityRegistration
00136 {
00137   PCLASSINFO(OpalDynaCodecRegistration, H323CapabilityRegistration);
00138   public:
00139     OpalDynaCodecRegistration(const PString & name, 
00140                               OpalDLLCodecRec * _encoderInfo,
00141                               OpalDLLCodecRec * _decoderInfo,
00142                               OpalMediaFormat * _mediaFormat);
00143 
00144     H323Capability * Create(H323EndPoint & ep) const;
00145 
00146     friend class OpalDynaCodecDLL;
00147 
00148   protected:
00149     OpalDLLCodecRec * encoderInfo;
00150     OpalDLLCodecRec * decoderInfo;
00151     OpalMediaFormat * mediaFormat;
00152 };
00153 
00155 
00156 class OpalDynaCodecNonStandardAudioCapability : public H323NonStandardAudioCapability
00157 {
00158   PCLASSINFO(OpalDynaCodecNonStandardAudioCapability, H323NonStandardAudioCapability);
00159 
00160   public:
00161     OpalDynaCodecNonStandardAudioCapability(
00162       const OpalDLLCodecRec & _info,
00163       H323EndPoint & _endpoint,
00164       unsigned maxPacketSize,         
00165       unsigned desiredPacketSize,     
00166       BYTE country,                   
00167       BYTE extension,                 
00168       WORD maufacturer,               
00169       const BYTE * nonstdHeader,      
00170       PINDEX nonstdHeaderLen);
00171 
00172     virtual PObject * Clone() const;
00173     virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
00174     virtual PString GetFormatName() const;
00175 
00176   protected:
00177     const OpalDLLCodecRec & info;
00178     H323EndPoint & endpoint;
00179 };
00180 
00182 
00183 class OpalDynaNonStandardAudioCodec : public OpalDynaAudioCodec
00184 {
00185   PCLASSINFO(OpalDynaNonStandardAudioCodec, OpalDynaAudioCodec)
00186 
00187   public:
00188     OpalDynaNonStandardAudioCodec(const OpalDLLCodecRec & _info, Direction direction);
00189     ~OpalDynaNonStandardAudioCodec();
00190 };
00191 
00193 
00194 class OpalDynaCodecStandardAudioCapability : public H323AudioCapability
00195 {
00196   PCLASSINFO(OpalDynaCodecStandardAudioCapability, H323AudioCapability);
00197 
00198   public:
00199     OpalDynaCodecStandardAudioCapability(
00200       const OpalDLLCodecRec & _info,
00201       H323EndPoint & _endpoint,
00202       unsigned maxPacketSize,         
00203       unsigned desiredPacketSize,     
00204       unsigned subType);
00205 
00206     BOOL OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
00207     BOOL OnReceivedPDU(const H245_AudioCapability & cap, unsigned & packetSize);
00208 
00209     PObject * Clone() const;
00210     H323Codec * CreateCodec(H323Codec::Direction direction) const;
00211     PString GetFormatName() const;
00212     unsigned GetSubType() const;
00213 
00214   protected:
00215     const OpalDLLCodecRec & info;
00216     H323EndPoint & endpoint;
00217     unsigned subType;
00218 };
00219 
00221 
00222 class OpalDynaCodecStandardVideoCapability : public H323VideoCapability
00223 {
00224   PCLASSINFO(OpalDynaCodecStandardVideoCapability, H323VideoCapability);
00225 
00226   public:
00227     OpalDynaCodecStandardVideoCapability(
00228       const OpalDLLCodecRec & _info,
00229       H323EndPoint & _endpoint,
00230       unsigned subType);
00231 
00232     BOOL OnSendingPDU(H245_VideoCapability & pdu) const;
00233     BOOL OnSendingPDU(H245_VideoMode & pdu) const;
00234     BOOL OnReceivedPDU(const H245_VideoCapability & pdu);
00235 
00236     PObject * Clone() const;
00237     H323Codec * CreateCodec(H323Codec::Direction direction) const;
00238     PString GetFormatName() const;
00239     unsigned GetSubType() const;
00240 
00241   protected:
00242     const OpalDLLCodecRec & info;
00243     H323EndPoint & endpoint;
00244     unsigned subType;
00245 };
00246 
00248 
00249 class OpalDynaVideoCodec : public H323VideoCodec
00250 {
00251   PCLASSINFO(OpalDynaVideoCodec, H323VideoCodec)
00252 
00253   public:
00254     OpalDynaVideoCodec(
00255       const OpalDLLCodecRec & _info, Direction direction);
00256 
00257     ~OpalDynaVideoCodec();
00258 
00259     BOOL Read(BYTE * buffer,unsigned & length,RTP_DataFrame & rtpFrame);
00260     BOOL Write(const BYTE * buffer, unsigned length, const RTP_DataFrame & rtp, unsigned & written);
00261 
00262   protected:
00263     const OpalDLLCodecRec & info;
00264     void * context;
00265 };
00266 
00267 
00268 #endif