4 * Dynamic codec loading
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
20 * The Original Code is Open H323 Library.
22 * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
24 * Contributor(s): ______________________________________.
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
35 #ifndef _OPALDYNACODEC
36 #define _OPALDYNACODEC
44 /////////////////////////////////////////////////////////////////////////////
46 class OpalDLLCodecRec
;
48 class OpalDynaCodecDLL
: public PDynaLink
51 PCLASSINFO(OpalDynaCodecDLL
, PDynaLink
);
53 OpalDynaCodecDLL(const PFilePath
& codec
);
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
,
64 PINDEX simultaneousNum
,
65 H323Capabilities
& capabilities
);
67 static PINDEX
AddVideoCapabilities(H323EndPoint
& ep
,
69 PINDEX simultaneousNum
,
70 H323Capabilities
& capabilities
);
72 static PINDEX
AddCapabilities(H323EndPoint
& ep
,
74 PINDEX simultaneousNum
,
75 H323Capabilities
& capabilities
,
76 const PString
& type
);
78 static PDirectory defaultCodecDir
;
81 OpalDLLCodecInfo
* (*EnumerateCodecsFn
)(unsigned apiVersion
, unsigned * count
);
87 /////////////////////////////////////////////////////////////////////////////
89 class OpalDLLCodecRec
: public PObject
{
90 PCLASSINFO(OpalDLLCodecRec
, PObject
);
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;
114 /////////////////////////////////////////////////////////////////////////////
116 class OpalDynaAudioCodec
: public H323FramedAudioCodec
118 PCLASSINFO(OpalDynaAudioCodec
, H323FramedAudioCodec
)
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
);
127 const OpalDLLCodecRec
& info
;
129 unsigned samplesPerFrame
;
130 unsigned bytesPerFrame
;
133 /////////////////////////////////////////////////////////////////////////////
135 class OpalDynaCodecRegistration
: public H323CapabilityRegistration
137 PCLASSINFO(OpalDynaCodecRegistration
, H323CapabilityRegistration
);
139 OpalDynaCodecRegistration(const PString
& name
,
140 OpalDLLCodecRec
* _encoderInfo
,
141 OpalDLLCodecRec
* _decoderInfo
,
142 OpalMediaFormat
* _mediaFormat
);
144 H323Capability
* Create(H323EndPoint
& ep
) const;
146 friend class OpalDynaCodecDLL
;
149 OpalDLLCodecRec
* encoderInfo
;
150 OpalDLLCodecRec
* decoderInfo
;
151 OpalMediaFormat
* mediaFormat
;
154 /////////////////////////////////////////////////////////////////////////////
156 class OpalDynaCodecNonStandardAudioCapability
: public H323NonStandardAudioCapability
158 PCLASSINFO(OpalDynaCodecNonStandardAudioCapability
, H323NonStandardAudioCapability
);
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;
177 const OpalDLLCodecRec
& info
;
178 H323EndPoint
& endpoint
;
181 /////////////////////////////////////////////////////////////////////////////
183 class OpalDynaNonStandardAudioCodec
: public OpalDynaAudioCodec
185 PCLASSINFO(OpalDynaNonStandardAudioCodec
, OpalDynaAudioCodec
)
188 OpalDynaNonStandardAudioCodec(const OpalDLLCodecRec
& _info
, Direction direction
);
189 ~OpalDynaNonStandardAudioCodec();
192 /////////////////////////////////////////////////////////////////////////////
194 class OpalDynaCodecStandardAudioCapability
: public H323AudioCapability
196 PCLASSINFO(OpalDynaCodecStandardAudioCapability
, H323AudioCapability
);
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
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;
215 const OpalDLLCodecRec
& info
;
216 H323EndPoint
& endpoint
;
220 /////////////////////////////////////////////////////////////////////////////
222 class OpalDynaCodecStandardVideoCapability
: public H323VideoCapability
224 PCLASSINFO(OpalDynaCodecStandardVideoCapability
, H323VideoCapability
);
227 OpalDynaCodecStandardVideoCapability(
228 const OpalDLLCodecRec
& _info
,
229 H323EndPoint
& _endpoint
,
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;
242 const OpalDLLCodecRec
& info
;
243 H323EndPoint
& endpoint
;
247 /////////////////////////////////////////////////////////////////////////////
249 class OpalDynaVideoCodec
: public H323VideoCodec
251 PCLASSINFO(OpalDynaVideoCodec
, H323VideoCodec
)
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
);
263 const OpalDLLCodecRec
& info
;