diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8033a9f8..ff44cb91 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -56,6 +56,7 @@ set (rtphone_libs libs) set (rtphone_engine engine) set (USE_AMR_CODEC OFF CACHE BOOL "Use AMR codec. Requires libraries.") +set (USE_EVS_CODEC OFF CACHE BOOL "Use EVS codec.") set (OPENSSL_SSL ssl CACHE STRING "Pointer to ssl library") set (OPENSSL_CRYPTO crypto CACHE STRING "Pointer to crypto library") @@ -78,6 +79,7 @@ set (RTPHONE_SOURCES ${rtphone_engine}/media/MT_AudioCodec.cpp ${rtphone_engine}/media/MT_SevanaMos.cpp ${rtphone_engine}/media/MT_AmrCodec.cpp + ${rtphone_engine}/media/MT_EvsCodec.cpp ${rtphone_engine}/media/MT_CngHelper.cpp ${rtphone_engine}/agent/Agent_Impl.cpp ${rtphone_engine}/agent/Agent_AudioManager.cpp @@ -98,6 +100,7 @@ add_subdirectory(${rtphone_libs}/resiprocate) add_subdirectory(${rtphone_libs}/ice) add_subdirectory(${rtphone_libs}/jrtplib/src) add_subdirectory(${rtphone_libs}/libg729) +add_subdirectory(${rtphone_libs}/libevs) add_subdirectory(${rtphone_libs}/libgsm) add_subdirectory(${rtphone_libs}/gsmhr) add_subdirectory(${rtphone_libs}/g722) diff --git a/src/engine/media/MT_EvsCodec.h b/src/engine/media/MT_EvsCodec.h new file mode 100644 index 00000000..8c3af2d9 --- /dev/null +++ b/src/engine/media/MT_EvsCodec.h @@ -0,0 +1,157 @@ +#ifndef MT_EVSCODEC_H +#define MT_EVSCODEC_H + +#include "../config.h" +#include +#include "MT_Codec.h" +#include "../helper/HL_Pointer.h" + +#if defined(USE_EVS_CODEC) +namespace MT +{ + struct AmrCodecConfig + { + bool mIuUP; + bool mOctetAligned; + int mPayloadType; + }; + + class AmrNbCodec : public Codec + { + protected: + void* mEncoderCtx; + void* mDecoderCtx; + AmrCodecConfig mConfig; + unsigned mCurrentDecoderTimestamp; + int mSwitchCounter; + int mPreviousPacketLength; + + public: + class CodecFactory: public Factory + { + public: + CodecFactory(const AmrCodecConfig& config); + + const char* name() override; + int samplerate() override; + int payloadType() override; + +#ifdef USE_RESIP_INTEGRATION + void updateSdp(resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override; + int processSdp(const resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override; + void create(CodecMap& codecs) override; +#endif + PCodec create() override; + + protected: + AmrCodecConfig mConfig; + }; + + AmrNbCodec(const AmrCodecConfig& config); + + virtual ~AmrNbCodec(); + 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; + int getSwitchCounter() const; + }; + + class AmrWbCodec : public Codec + { + protected: + void* mEncoderCtx; + void* mDecoderCtx; + AmrCodecConfig mConfig; + uint64_t mCurrentDecoderTimestamp; + int mSwitchCounter; + int mPreviousPacketLength; + + public: + class CodecFactory: public Factory + { + public: + CodecFactory(const AmrCodecConfig& config); + + const char* name() override; + int samplerate() override; + int payloadType() override; + +#ifdef USE_RESIP_INTEGRATION + void updateSdp(resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override; + int processSdp(const resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override; + void create(CodecMap& codecs) override; +#endif + PCodec create() override; + + protected: + AmrCodecConfig mConfig; + }; + + AmrWbCodec(const AmrCodecConfig& config); + virtual ~AmrWbCodec(); + + 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; + int getSwitchCounter() const; + }; + + class GsmEfrCodec : public Codec + { + protected: + void* mEncoderCtx; + void* mDecoderCtx; + bool mIuUP; + + public: + class GsmEfrFactory: public Factory + { + public: + GsmEfrFactory(bool iuup, int ptype); + + const char* name() override; + int samplerate() override; + int payloadType() override; + +#ifdef USE_RESIP_INTEGRATION + void updateSdp(resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override; + int processSdp(const resip::SdpContents::Session::Medium::CodecContainer& codecs, SdpDirection direction) override; + void create(CodecMap& codecs) override; +#endif + PCodec create() override; + + protected: + bool mIuUP; + int mPayloadType; + }; + + GsmEfrCodec(bool iuup = false); + + virtual ~GsmEfrCodec(); + 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; + }; + +} // End of MT namespace + + +#endif + +#endif // MT_EVSCODE_H +