00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
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
00111
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