Utilise new MergeSym feature to no longer overwrite the source .DEF file when buildin...
[openh323.git] / include / dynacodec.h
blob7ea7ad9f08fafbbfd1015f4806eeef3f344a5ff5
1 /*
2 * dynacodec.h
4 * Dynamic codec loading
6 * Open H323 Library
8 * Copyright (c) 2003 Equivalence Pty. Ltd.
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/
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.
20 * The Original Code is Open H323 Library.
22 * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
24 * Contributor(s): ______________________________________.
26 * $Log$
27 * Revision 1.2 2003/04/30 04:57:13 craigs
28 * Changed interface to DLL codec to improve Opal compatibility
30 * Revision 1.1 2003/04/27 23:48:24 craigs
31 * Initial version
35 #ifndef _OPALDYNACODEC
36 #define _OPALDYNACODEC
38 extern "C" {
39 #include "dllcodec.h"
42 #include "h323caps.h"
44 /////////////////////////////////////////////////////////////////////////////
46 class OpalDLLCodecRec;
48 class OpalDynaCodecDLL : public PDynaLink
50 public:
51 PCLASSINFO(OpalDynaCodecDLL, PDynaLink);
53 OpalDynaCodecDLL(const PFilePath & codec);
54 BOOL Load();
56 OpalDLLCodecInfo * EnumerateCodecs(unsigned * count);
58 static BOOL LoadCodecs();
59 static BOOL LoadCodecs(const PDirectory & dir);
60 static BOOL LoadCodec(const PFilePath & file);
62 static PINDEX AddAudioCapabilities(H323EndPoint & ep,
63 PINDEX descriptorNum,
64 PINDEX simultaneousNum,
65 H323Capabilities & capabilities);
67 static PINDEX AddVideoCapabilities(H323EndPoint & ep,
68 PINDEX descriptorNum,
69 PINDEX simultaneousNum,
70 H323Capabilities & capabilities);
72 static PINDEX AddCapabilities(H323EndPoint & ep,
73 PINDEX descriptorNum,
74 PINDEX simultaneousNum,
75 H323Capabilities & capabilities,
76 const PString & type);
78 static PDirectory defaultCodecDir;
80 protected:
81 OpalDLLCodecInfo * (*EnumerateCodecsFn)(unsigned apiVersion, unsigned * count);
82 static PMutex mutex;
83 static BOOL inited;
84 int referenceCount;
87 /////////////////////////////////////////////////////////////////////////////
89 class OpalDLLCodecRec : public PObject {
90 PCLASSINFO(OpalDLLCodecRec, PObject);
91 public:
92 OpalDLLCodecRec(OpalDynaCodecDLL & _encoder,
93 const PStringToString & _attributes,
94 const OpalDLLCodecInfo & _encoderCodeInfo,
95 OpalMediaFormat * _mediaFormat);
97 void * CreateContext() const;
98 void DestroyContext(void * context) const;
100 H323Capability * CreateCapability(H323EndPoint & ep) const;
102 void SetParameter(const PString & attribute, const PString & value) const;
103 PString GetParameter(const PString & attribute, const char * defValue = NULL) const;
105 OpalDynaCodecDLL & encoder;
106 PStringToString attributes;
107 OpalDLLCodecInfo info;
109 OpalMediaFormat * mediaFormat;
110 //H323Capability * capability;
111 //PString h323Name;
114 /////////////////////////////////////////////////////////////////////////////
116 class OpalDynaAudioCodec : public H323FramedAudioCodec
118 PCLASSINFO(OpalDynaAudioCodec, H323FramedAudioCodec)
120 public:
121 OpalDynaAudioCodec(const OpalDLLCodecRec & _info, Direction direction);
122 ~OpalDynaAudioCodec();
123 virtual BOOL EncodeFrame(BYTE * buffer, unsigned & length);
124 virtual BOOL DecodeFrame(const BYTE * buffer, unsigned length, unsigned & written);
126 protected:
127 const OpalDLLCodecRec & info;
128 void * context;
129 unsigned samplesPerFrame;
130 unsigned bytesPerFrame;
133 /////////////////////////////////////////////////////////////////////////////
135 class OpalDynaCodecRegistration : public H323CapabilityRegistration
137 PCLASSINFO(OpalDynaCodecRegistration, H323CapabilityRegistration);
138 public:
139 OpalDynaCodecRegistration(const PString & name,
140 OpalDLLCodecRec * _encoderInfo,
141 OpalDLLCodecRec * _decoderInfo,
142 OpalMediaFormat * _mediaFormat);
144 H323Capability * Create(H323EndPoint & ep) const;
146 friend class OpalDynaCodecDLL;
148 protected:
149 OpalDLLCodecRec * encoderInfo;
150 OpalDLLCodecRec * decoderInfo;
151 OpalMediaFormat * mediaFormat;
154 /////////////////////////////////////////////////////////////////////////////
156 class OpalDynaCodecNonStandardAudioCapability : public H323NonStandardAudioCapability
158 PCLASSINFO(OpalDynaCodecNonStandardAudioCapability, H323NonStandardAudioCapability);
160 public:
161 OpalDynaCodecNonStandardAudioCapability(
162 const OpalDLLCodecRec & _info,
163 H323EndPoint & _endpoint,
164 unsigned maxPacketSize, /// Maximum size of an audio packet in frames
165 unsigned desiredPacketSize, /// Desired transmit size of an audio packet in frames
166 BYTE country, /// t35 information
167 BYTE extension, /// t35 information
168 WORD maufacturer, /// t35 information
169 const BYTE * nonstdHeader, /// nonstandard header
170 PINDEX nonstdHeaderLen);
172 virtual PObject * Clone() const;
173 virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
174 virtual PString GetFormatName() const;
176 protected:
177 const OpalDLLCodecRec & info;
178 H323EndPoint & endpoint;
181 /////////////////////////////////////////////////////////////////////////////
183 class OpalDynaNonStandardAudioCodec : public OpalDynaAudioCodec
185 PCLASSINFO(OpalDynaNonStandardAudioCodec, OpalDynaAudioCodec)
187 public:
188 OpalDynaNonStandardAudioCodec(const OpalDLLCodecRec & _info, Direction direction);
189 ~OpalDynaNonStandardAudioCodec();
192 /////////////////////////////////////////////////////////////////////////////
194 class OpalDynaCodecStandardAudioCapability : public H323AudioCapability
196 PCLASSINFO(OpalDynaCodecStandardAudioCapability, H323AudioCapability);
198 public:
199 OpalDynaCodecStandardAudioCapability(
200 const OpalDLLCodecRec & _info,
201 H323EndPoint & _endpoint,
202 unsigned maxPacketSize, /// Maximum size of an audio packet in frames
203 unsigned desiredPacketSize, /// Desired transmit size of an audio packet in frames
204 unsigned subType);
206 BOOL OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
207 BOOL OnReceivedPDU(const H245_AudioCapability & cap, unsigned & packetSize);
209 PObject * Clone() const;
210 H323Codec * CreateCodec(H323Codec::Direction direction) const;
211 PString GetFormatName() const;
212 unsigned GetSubType() const;
214 protected:
215 const OpalDLLCodecRec & info;
216 H323EndPoint & endpoint;
217 unsigned subType;
220 /////////////////////////////////////////////////////////////////////////////
222 class OpalDynaCodecStandardVideoCapability : public H323VideoCapability
224 PCLASSINFO(OpalDynaCodecStandardVideoCapability, H323VideoCapability);
226 public:
227 OpalDynaCodecStandardVideoCapability(
228 const OpalDLLCodecRec & _info,
229 H323EndPoint & _endpoint,
230 unsigned subType);
232 BOOL OnSendingPDU(H245_VideoCapability & pdu) const;
233 BOOL OnSendingPDU(H245_VideoMode & pdu) const;
234 BOOL OnReceivedPDU(const H245_VideoCapability & pdu);
236 PObject * Clone() const;
237 H323Codec * CreateCodec(H323Codec::Direction direction) const;
238 PString GetFormatName() const;
239 unsigned GetSubType() const;
241 protected:
242 const OpalDLLCodecRec & info;
243 H323EndPoint & endpoint;
244 unsigned subType;
247 /////////////////////////////////////////////////////////////////////////////
249 class OpalDynaVideoCodec : public H323VideoCodec
251 PCLASSINFO(OpalDynaVideoCodec, H323VideoCodec)
253 public:
254 OpalDynaVideoCodec(
255 const OpalDLLCodecRec & _info, Direction direction);
257 ~OpalDynaVideoCodec();
259 BOOL Read(BYTE * buffer,unsigned & length,RTP_DataFrame & rtpFrame);
260 BOOL Write(const BYTE * buffer, unsigned length, const RTP_DataFrame & rtp, unsigned & written);
262 protected:
263 const OpalDLLCodecRec & info;
264 void * context;
268 #endif