www.pudn.com > openh323-v1_15_1-src.zip > dynacodec.h
/*
* dynacodec.h
*
* Dynamic codec loading
*
* Open H323 Library
*
* Copyright (c) 2003 Equivalence Pty. Ltd.
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is Open H323 Library.
*
* The Initial Developer of the Original Code is Equivalence Pty. Ltd.
*
* Contributor(s): ______________________________________.
*
* $Log: dynacodec.h,v $
* Revision 1.2 2003/04/30 04:57:13 craigs
* Changed interface to DLL codec to improve Opal compatibility
*
* Revision 1.1 2003/04/27 23:48:24 craigs
* Initial version
*
*/
#ifndef _OPALDYNACODEC
#define _OPALDYNACODEC
extern "C" {
#include "dllcodec.h"
};
#include "h323caps.h"
/////////////////////////////////////////////////////////////////////////////
class OpalDLLCodecRec;
class OpalDynaCodecDLL : public PDynaLink
{
public:
PCLASSINFO(OpalDynaCodecDLL, PDynaLink);
OpalDynaCodecDLL(const PFilePath & codec);
BOOL Load();
OpalDLLCodecInfo * EnumerateCodecs(unsigned * count);
static BOOL LoadCodecs();
static BOOL LoadCodecs(const PDirectory & dir);
static BOOL LoadCodec(const PFilePath & file);
static PINDEX AddAudioCapabilities(H323EndPoint & ep,
PINDEX descriptorNum,
PINDEX simultaneousNum,
H323Capabilities & capabilities);
static PINDEX AddVideoCapabilities(H323EndPoint & ep,
PINDEX descriptorNum,
PINDEX simultaneousNum,
H323Capabilities & capabilities);
static PINDEX AddCapabilities(H323EndPoint & ep,
PINDEX descriptorNum,
PINDEX simultaneousNum,
H323Capabilities & capabilities,
const PString & type);
static PDirectory defaultCodecDir;
protected:
OpalDLLCodecInfo * (*EnumerateCodecsFn)(unsigned apiVersion, unsigned * count);
static PMutex mutex;
static BOOL inited;
int referenceCount;
};
/////////////////////////////////////////////////////////////////////////////
class OpalDLLCodecRec : public PObject {
PCLASSINFO(OpalDLLCodecRec, PObject);
public:
OpalDLLCodecRec(OpalDynaCodecDLL & _encoder,
const PStringToString & _attributes,
const OpalDLLCodecInfo & _encoderCodeInfo,
OpalMediaFormat * _mediaFormat);
void * CreateContext() const;
void DestroyContext(void * context) const;
H323Capability * CreateCapability(H323EndPoint & ep) const;
void SetParameter(const PString & attribute, const PString & value) const;
PString GetParameter(const PString & attribute, const char * defValue = NULL) const;
OpalDynaCodecDLL & encoder;
PStringToString attributes;
OpalDLLCodecInfo info;
OpalMediaFormat * mediaFormat;
//H323Capability * capability;
//PString h323Name;
};
/////////////////////////////////////////////////////////////////////////////
class OpalDynaAudioCodec : public H323FramedAudioCodec
{
PCLASSINFO(OpalDynaAudioCodec, H323FramedAudioCodec)
public:
OpalDynaAudioCodec(const OpalDLLCodecRec & _info, Direction direction);
~OpalDynaAudioCodec();
virtual BOOL EncodeFrame(BYTE * buffer, unsigned & length);
virtual BOOL DecodeFrame(const BYTE * buffer, unsigned length, unsigned & written);
protected:
const OpalDLLCodecRec & info;
void * context;
unsigned samplesPerFrame;
unsigned bytesPerFrame;
};
/////////////////////////////////////////////////////////////////////////////
class OpalDynaCodecRegistration : public H323CapabilityRegistration
{
PCLASSINFO(OpalDynaCodecRegistration, H323CapabilityRegistration);
public:
OpalDynaCodecRegistration(const PString & name,
OpalDLLCodecRec * _encoderInfo,
OpalDLLCodecRec * _decoderInfo,
OpalMediaFormat * _mediaFormat);
H323Capability * Create(H323EndPoint & ep) const;
friend class OpalDynaCodecDLL;
protected:
OpalDLLCodecRec * encoderInfo;
OpalDLLCodecRec * decoderInfo;
OpalMediaFormat * mediaFormat;
};
/////////////////////////////////////////////////////////////////////////////
class OpalDynaCodecNonStandardAudioCapability : public H323NonStandardAudioCapability
{
PCLASSINFO(OpalDynaCodecNonStandardAudioCapability, H323NonStandardAudioCapability);
public:
OpalDynaCodecNonStandardAudioCapability(
const OpalDLLCodecRec & _info,
H323EndPoint & _endpoint,
unsigned maxPacketSize, /// Maximum size of an audio packet in frames
unsigned desiredPacketSize, /// Desired transmit size of an audio packet in frames
BYTE country, /// t35 information
BYTE extension, /// t35 information
WORD maufacturer, /// t35 information
const BYTE * nonstdHeader, /// nonstandard header
PINDEX nonstdHeaderLen);
virtual PObject * Clone() const;
virtual H323Codec * CreateCodec(H323Codec::Direction direction) const;
virtual PString GetFormatName() const;
protected:
const OpalDLLCodecRec & info;
H323EndPoint & endpoint;
};
/////////////////////////////////////////////////////////////////////////////
class OpalDynaNonStandardAudioCodec : public OpalDynaAudioCodec
{
PCLASSINFO(OpalDynaNonStandardAudioCodec, OpalDynaAudioCodec)
public:
OpalDynaNonStandardAudioCodec(const OpalDLLCodecRec & _info, Direction direction);
~OpalDynaNonStandardAudioCodec();
};
/////////////////////////////////////////////////////////////////////////////
class OpalDynaCodecStandardAudioCapability : public H323AudioCapability
{
PCLASSINFO(OpalDynaCodecStandardAudioCapability, H323AudioCapability);
public:
OpalDynaCodecStandardAudioCapability(
const OpalDLLCodecRec & _info,
H323EndPoint & _endpoint,
unsigned maxPacketSize, /// Maximum size of an audio packet in frames
unsigned desiredPacketSize, /// Desired transmit size of an audio packet in frames
unsigned subType);
BOOL OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
BOOL OnReceivedPDU(const H245_AudioCapability & cap, unsigned & packetSize);
PObject * Clone() const;
H323Codec * CreateCodec(H323Codec::Direction direction) const;
PString GetFormatName() const;
unsigned GetSubType() const;
protected:
const OpalDLLCodecRec & info;
H323EndPoint & endpoint;
unsigned subType;
};
/////////////////////////////////////////////////////////////////////////////
class OpalDynaCodecStandardVideoCapability : public H323VideoCapability
{
PCLASSINFO(OpalDynaCodecStandardVideoCapability, H323VideoCapability);
public:
OpalDynaCodecStandardVideoCapability(
const OpalDLLCodecRec & _info,
H323EndPoint & _endpoint,
unsigned subType);
BOOL OnSendingPDU(H245_VideoCapability & pdu) const;
BOOL OnSendingPDU(H245_VideoMode & pdu) const;
BOOL OnReceivedPDU(const H245_VideoCapability & pdu);
PObject * Clone() const;
H323Codec * CreateCodec(H323Codec::Direction direction) const;
PString GetFormatName() const;
unsigned GetSubType() const;
protected:
const OpalDLLCodecRec & info;
H323EndPoint & endpoint;
unsigned subType;
};
/////////////////////////////////////////////////////////////////////////////
class OpalDynaVideoCodec : public H323VideoCodec
{
PCLASSINFO(OpalDynaVideoCodec, H323VideoCodec)
public:
OpalDynaVideoCodec(
const OpalDLLCodecRec & _info, Direction direction);
~OpalDynaVideoCodec();
BOOL Read(BYTE * buffer,unsigned & length,RTP_DataFrame & rtpFrame);
BOOL Write(const BYTE * buffer, unsigned length, const RTP_DataFrame & rtp, unsigned & written);
protected:
const OpalDLLCodecRec & info;
void * context;
};
#endif