rtphone/src/engine/media/MT_AudioCodec.h

415 lines
10 KiB
C++

/* Copyright(C) 2007-2017 VoIPobjects (voipobjects.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef __AUDIO_CODEC_H
#define __AUDIO_CODEC_H
#include "../engine_config.h"
#include <map>
#include "MT_Codec.h"
#include "../audio/Audio_Resampler.h"
#include "../helper/HL_Pointer.h"
#include "webrtc/ilbcfix/ilbc.h"
#include "webrtc/isac/isacfix.h"
#include "webrtc/g711/g711_interface.h"
extern "C"
{
#include "libgsm/gsm.h"
#include "g722/g722.h"
}
#include "libg729/g729_typedef.h"
#include "libg729/g729_ld8a.h"
#if defined(USE_OPUS_CODEC)
# include "opus.h"
#endif
namespace MT
{
class G729Codec: public Codec
{
protected:
CodState* mEncoder = nullptr;
DecState* mDecoder = nullptr;
void decodeFrame(const uint8_t* rtp, int16_t* pcm);
public:
class G729Factory: public Factory
{
public:
const char* name() override;
int channels() override;
int samplerate() override;
int payloadType() override;
void updateSdp(resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override;
int processSdp(const resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override;
PCodec create() override;
};
G729Codec();
~G729Codec() override;
const char* name() override;
int pcmLength() override;
int rtpLength() override;
int frameTime() override;
int samplerate() override;
int channels() override;
int encode(const void* input, int inputBytes, void* output, int outputCapacity) override;
int decode(const void* input, int inputBytes, void* output, int outputCapacity) override;
int plc(int lostFrames, void* output, int outputCapacity) override;
};
#if defined(USE_OPUS_CODEC)
class OpusCodec: public Codec
{
protected:
OpusEncoder *mEncoderCtx;
OpusDecoder *mDecoderCtx;
int mPTime, mSamplerate, mChannels;
// Audio::SpeexResampler mDecodeResampler;
int mDecoderChannels;
public:
struct Params
{
bool mUseDtx, mUseInbandFec, mStereo;
int mPtime, mTargetBitrate, mExpectedPacketLoss;
Params();
resip::Data toString() const;
void parse(const resip::Data& params);
};
class OpusFactory: public Factory
{
protected:
int mSamplerate, mChannels, mPType;
OpusCodec::Params mParams;
typedef std::vector<PCodec> CodecList;
CodecList mCodecList;
public:
OpusFactory(int samplerate, int channels, int ptype);
const char* name() override;
int channels() override;
int samplerate() override;
int payloadType() override;
void updateSdp(resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override;
int processSdp(const resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override;
PCodec create() override;
};
OpusCodec(int samplerate, int channels, int ptime);
~OpusCodec();
void applyParams(const Params& params);
const char* name();
int pcmLength();
int rtpLength();
int frameTime();
int samplerate();
int channels();
int encode(const void* input, int inputBytes, void* output, int outputCapacity);
int decode(const void* input, int inputBytes, void* output, int outputCapacity);
int plc(int lostFrames, void* output, int outputCapacity);
};
#endif
class IlbcCodec: public Codec
{
protected:
int mPacketTime; /// Single frame time (20 or 30 ms)
iLBC_encinst_t* mEncoderCtx;
iLBC_decinst_t* mDecoderCtx;
public:
class IlbcFactory: public Factory
{
protected:
int mPtime;
int mPType20ms, mPType30ms;
public:
IlbcFactory(int ptype20ms, int ptype30ms);
const char* name();
int samplerate();
int payloadType();
void updateSdp(resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction);
int processSdp(const resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction);
void create(CodecMap& codecs);
PCodec create();
};
IlbcCodec(int packetTime);
virtual ~IlbcCodec();
const char* name();
int pcmLength();
int rtpLength();
int frameTime();
int samplerate();
int encode(const void* input, int inputBytes, void* output, int outputCapacity);
int decode(const void* input, int inputBytes, void* output, int outputCapacity);
int plc(int lostFrames, void* output, int outputCapacity);
};
class G711Codec: public Codec
{
public:
class AlawFactory: public Factory
{
public:
const char* name();
int samplerate();
int payloadType();
PCodec create();
};
class UlawFactory: public Factory
{
public:
const char* name();
int samplerate();
int payloadType();
PCodec create();
};
enum
{
ALaw = 0, /// a-law codec type
ULaw = 1 /// u-law codec type
};
G711Codec(int type);
~G711Codec();
const char* name();
int pcmLength();
int frameTime();
int rtpLength();
int samplerate();
int encode(const void* input, int inputBytes, void* output, int outputCapacity);
int decode(const void* input, int inputBytes, void* output, int outputCapacity);
int plc(int lostSamples, void* output, int outputCapacity);
protected:
int mType; /// Determines if it is u-law or a-law codec. Its value is ALaw or ULaw.
};
class IsacCodec: public Codec
{
protected:
int mSamplerate;
ISACFIX_MainStruct* mEncoderCtx;
ISACFIX_MainStruct* mDecoderCtx;
public:
class IsacFactory16K: public Factory
{
public:
IsacFactory16K(int ptype);
const char* name();
int samplerate();
int payloadType();
PCodec create();
protected:
int mPType;
};
class IsacFactory32K: public Factory
{
public:
IsacFactory32K(int ptype);
const char* name();
int samplerate();
int payloadType();
PCodec create();
protected:
int mPType;
};
IsacCodec(int sampleRate);
~IsacCodec();
const char* name();
int pcmLength();
int rtpLength();
int frameTime();
int samplerate();
int encode(const void* input, int inputBytes, void* output, int outputCapacity);
int decode(const void* input, int inputBytes, void* output, int outputCapacity);
int plc(int lostFrames, void* output, int outputCapacity);
};
/// GSM MIME name
#define GSM_MIME_NAME "gsm"
/// Optional GSM SIP attributes
#define GSM_SIP_ATTR ""
/// GSM codec single frame time in milliseconds
#define GSM_AUDIOFRAME_TIME 20
/// GSM codec single RTP frame size in bytes
#define GSM_RTPFRAME_SIZE_33 33
#define GSM_RTPFRAME_SIZE_32 32
#define GSM_RTPFRAME_SIZE_31 31
/// GSM payload type
#define GSM_PAYLOAD_TYPE 3
/// GSM bitrate (bits/sec)
#define GSM_BITRATE 13000
/*!
* GSM codec wrapper. Based on implementation located in libgsm directory.
* @see IMediaCodec
*/
class GsmCodec: public Codec
{
public:
enum class Type
{
Bytes_33,
Bytes_32,
Bytes_31,
Bytes_65
};
protected:
struct gsm_state * mGSM; /// Pointer to codec context
Type mCodecType;
public:
class GsmFactory: public Factory
{
protected:
int mPayloadType;
Type mCodecType;
public:
GsmFactory(Type codecType = Type::Bytes_33, int pt = GSM_PAYLOAD_TYPE);
const char* name();
int samplerate();
int payloadType();
PCodec create();
};
/*! Default constructor. Initializes codec context's pointer to NULL. */
GsmCodec(Type codecType);
/*! Destructor. */
virtual ~GsmCodec();
const char* name();
int pcmLength();
int rtpLength();
int frameTime();
int samplerate();
int encode(const void* input, int inputBytes, void* output, int outputCapacity);
int decode(const void* input, int inputBytes, void* output, int outputCapacity);
int plc(int lostFrames, void* output, int outputCapacity);
};
/// GSM MIME name
#define G722_MIME_NAME "g722"
/// Optional GSM SIP attributes
#define G722_SIP_ATTR ""
/// GSM codec single frame time in milliseconds
#define G722_AUDIOFRAME_TIME 20
/// GSM codec single RTP frame size in bytes
#define G722_RTPFRAME_SIZE 80
/// GSM payload type
#define G722_PAYLOAD_TYPE 9
/// GSM bitrate (bits/sec)
#define G722_BITRATE 64000
class G722Codec: public Codec
{
protected:
void* mEncoder;
void* mDecoder;
public:
class G722Factory: public Factory
{
public:
G722Factory();
const char* name();
int samplerate();
int payloadType();
PCodec create();
};
G722Codec();
virtual ~G722Codec();
const char* name();
int pcmLength();
int rtpLength();
int frameTime();
int samplerate();
int encode(const void* input, int inputBytes, void* output, int outputCapacity);
int decode(const void* input, int inputBytes, void* output, int outputCapacity);
int plc(int lostFrames, void* output, int outputCapacity);
//unsigned GetSamplerate() { return 16000; }
};
class GsmHrCodec: public Codec
{
protected:
void* mDecoder;
public:
class GsmHrFactory: public Factory
{
protected:
int mPtype;
public:
GsmHrFactory(int ptype);
const char* name() override;
int samplerate() override;
int payloadType() override;
PCodec create() override;
};
GsmHrCodec();
~GsmHrCodec() override;
const char* name() override;
int pcmLength() override;
int rtpLength() override;
int frameTime() override;
int samplerate() override;
int encode(const void* input, int inputBytes, void* output, int outputCapacity) override;
int decode(const void* input, int inputBytes, void* output, int outputCapacity) override;
int plc(int lostFrames, void* output, int outputCapacity) override;
};
}
#endif