diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b13616d4..4d1969c6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -167,13 +167,13 @@ set (LIBS ice_stack jrtplib g729_codec gsm_codec uuid) if (CMAKE_SYSTEM MATCHES "Win*") - set (LIBS ${LIBS} opus ) + set (LIBS ${LIBS} ) else () - set (LIBS ${LIBS} dl opus uuid) + set (LIBS ${LIBS} dl uuid) endif () if (USE_AMR_CODEC) - set (LIBS ${LIBS} opencore-amrnb opencore-amrwb) + set (LIBS ${LIBS}) endif (USE_AMR_CODEC) if (USE_EVS_CODEC) @@ -187,7 +187,7 @@ target_link_libraries(rtphone audio_lib webrtc speexdsp - opus + # opus uuid ${OPENSSL_SSL} ${OPENSSL_CRYPTO} diff --git a/src/engine/helper/HL_File.cpp b/src/engine/helper/HL_File.cpp index c042a93d..395194df 100644 --- a/src/engine/helper/HL_File.cpp +++ b/src/engine/helper/HL_File.cpp @@ -34,7 +34,11 @@ void FileHelper::remove(const char* s) std::string FileHelper::gettempname() { -#if defined(TARGET_LINUX) || defined(TARGET_WIN) +#if defined(TARGET_LINUX) + char template_filename[L_tmpnam] = "rtphone_XXXXXXX.tmp"; + mkstemp(template_filename); + return template_filename; +#elif defined(TARGET_WIN) char buffer[L_tmpnam]; tmpnam(buffer); diff --git a/src/engine/helper/HL_OsVersion.h b/src/engine/helper/HL_OsVersion.h index 8c6fa13e..c5723ec0 100644 --- a/src/engine/helper/HL_OsVersion.h +++ b/src/engine/helper/HL_OsVersion.h @@ -41,7 +41,7 @@ int iosVersion(); #include #include #if defined(TARGET_LINUX) -// # include +//# include #endif extern int _kbhit(); diff --git a/src/engine/media/MT_CodecList.cpp b/src/engine/media/MT_CodecList.cpp index 464b6c25..1e1aba99 100644 --- a/src/engine/media/MT_CodecList.cpp +++ b/src/engine/media/MT_CodecList.cpp @@ -13,9 +13,74 @@ #endif #include "MT_EvsCodec.h" +#include "helper/HL_String.h" using namespace MT; +using strx = StringHelper; + +// ---------------- EvsSpec --------------- +bool CodecList::Settings::EvsSpec::isValid() const +{ + return mPayloadType >= 96 && mPayloadType <= 127; +} + +CodecList::Settings::EvsSpec CodecList::Settings::EvsSpec::parse(const std::string& spec) +{ + EvsSpec result; + + auto parts = strx::split(spec, "-/"); + if (parts.size() == 3) + { + result.mPayloadType = strx::toInt(strx::trim(parts.front()).c_str(), -1); + std::string& encoding_type = parts[1]; + if (encoding_type == "mime") + result.mEncodingType = Encoding_MIME; + else + if (encoding_type == "g192") + result.mEncodingType = Encoding_G192; + else + throw std::logic_error("Bad EVS codec encoding type"); + + std::string& bandwidth = parts.back(); + if (bandwidth == "nb" || bandwidth == "NB") + result.mBandwidth = Bandwidth_NB; + else + if (bandwidth == "wb" || bandwidth == "WB") + result.mBandwidth = Bandwidth_WB; + else + if (bandwidth == "swb" || bandwidth == "SWB") + result.mBandwidth = Bandwidth_SWB; + else + if (bandwidth == "fb" || bandwidth == "FB") + result.mBandwidth = Bandwidth_FB; + } + + return result; +} + +bool CodecList::Settings::OpusSpec::isValid() const +{ + return (mPayloadType >= 96 && mPayloadType <= 127 && + mRate > 0 && + mChannels > 0); +} + +CodecList::Settings::OpusSpec CodecList::Settings::OpusSpec::parse(const std::string &spec) +{ + OpusSpec result; + + auto parts = strx::split(spec, "-"); + if (parts.size() == 3) + { + result.mPayloadType = strx::toInt(strx::trim(parts.front()).c_str(), -1); + result.mRate = strx::toInt(strx::trim(parts[1]).c_str(), -1); + result.mChannels = strx::toInt(strx::trim(parts.back()).c_str(), -1); + } + return result; +} + +// ---------------------------------------- CodecList::Settings CodecList::Settings::DefaultSettings; CodecList::CodecList(const Settings& settings) @@ -62,6 +127,19 @@ CodecList::CodecList(const Settings& settings) mFactoryList.push_back(new GsmHrCodec::GsmHrFactory(mSettings.mGsmHrPayloadType)); #endif +#if !defined(TARGET_ANDROID) + for (auto& spec: settings.mEvsSpec) + { + EVSCodec::StreamParameters evs_params; + evs_params.mime = spec.mEncodingType == Settings::EvsSpec::Encoding_MIME; + evs_params.bw = (int)spec.mBandwidth; + evs_params.ptime = 20; + evs_params.ptype = spec.mPayloadType; + + mFactoryList.push_back(new EVSCodec::EVSFactory(evs_params)); + } +#endif + EVSCodec::StreamParameters evs_params; evs_params.mime = true; evs_params.bw = WB; diff --git a/src/engine/media/MT_CodecList.h b/src/engine/media/MT_CodecList.h index 0ad81a7e..1024dc26 100644 --- a/src/engine/media/MT_CodecList.h +++ b/src/engine/media/MT_CodecList.h @@ -44,13 +44,41 @@ public: int mGsmFrPayloadLength = 33; // Expected GSM payload length int mGsmHrPayloadType = MT_GSMHR_PAYLOADTYPE; int mGsmEfrPayloadType = MT_GSMEFR_PAYLOADTYPE; - int mEvsPayloadType = MT_EVS_PAYLOADTYPE; + + struct EvsSpec + { + int mPayloadType = 0; + enum Bandwidth + { + Bandwidth_NB = 0, + Bandwidth_WB, + Bandwidth_SWB, + Bandwidth_FB + }; + + Bandwidth mBandwidth = Bandwidth_NB; + + enum Encoding + { + Encoding_MIME, + Encoding_G192 + }; + + Encoding mEncodingType = Encoding_MIME; + bool isValid() const; + static EvsSpec parse(const std::string& spec); + }; + + std::vector mEvsSpec; struct OpusSpec { - int mPayloadType = 0; - int mRate = 0; - int mChannels = 0; + int mPayloadType = -1; + int mRate = -1; + int mChannels = -1; + + bool isValid() const; + static OpusSpec parse(const std::string& spec); }; std::vector mOpusSpec; diff --git a/src/engine/media/MT_EvsCodec.cpp b/src/engine/media/MT_EvsCodec.cpp index 4eac09d7..d40fb741 100644 --- a/src/engine/media/MT_EvsCodec.cpp +++ b/src/engine/media/MT_EvsCodec.cpp @@ -119,17 +119,25 @@ static const std::map FixedPayload_EVSAMR_WB{ namespace MT { -EVSCodec::EVSFactory::EVSFactory(StreamParameters sp) : _sp(sp) +EVSCodec::EVSFactory::EVSFactory(StreamParameters& sp) : _sp(sp) {} int EVSCodec::EVSFactory::samplerate() { - return 0; + switch (_sp.bw) + { + case 0: return 8000; + case 1: return 16000; + case 2: return 32000; + case 3: return 48000; + } + + return 0; } int EVSCodec::EVSFactory::payloadType() { - return MT_EVS_PAYLOADTYPE; + return _sp.ptype; } PCodec EVSCodec::EVSFactory::create() diff --git a/src/engine/media/MT_EvsCodec.h b/src/engine/media/MT_EvsCodec.h index 76e0ba40..0adbd69c 100644 --- a/src/engine/media/MT_EvsCodec.h +++ b/src/engine/media/MT_EvsCodec.h @@ -24,12 +24,13 @@ public: // Emulated SDP config/media type parameters struct StreamParameters { - bool mime = false; - bool fh_only = false; /*not use*/ - int CRMByte = -1/*CMR_OFF*/; /*not use*/ - int br = 0; /*not use*/ - int bw = NB; - int ptime = 20; + bool mime = false; /* encoding */ + bool fh_only = false; /* not use*/ + int CRMByte = -1/*CMR_OFF*/; /* not use*/ + int br = 0; /* not use*/ + int bw = NB; /* bandwidth */ + int ptime = 20; /* ptime */ + int ptype = -1; /* payload type */ }; public: @@ -39,7 +40,7 @@ public: StreamParameters _sp; public: - EVSFactory(StreamParameters sp); + EVSFactory(StreamParameters& sp); const char* name() { return MT_EVS_CODECNAME; }; int samplerate(); int payloadType();