diff --git a/src/engine/config.h b/src/engine/config.h index 5bc3a729..a187f262 100644 --- a/src/engine/config.h +++ b/src/engine/config.h @@ -66,20 +66,20 @@ // AMR codec defines - it requires USE_AMR_CODEC defined // #define USE_AMR_CODEC -#define MT_AMRNB_PAYLOADTYPE -1 +#define MT_AMRNB_PAYLOADTYPE 122 #define MT_AMRNB_CODECNAME "amr" -#define MT_AMRNB_OCTET_PAYLOADTYPE -1 +#define MT_AMRNB_OCTET_PAYLOADTYPE 123 -#define MT_AMRWB_PAYLOADTYPE -1 +#define MT_AMRWB_PAYLOADTYPE 124 #define MT_AMRWB_CODECNAME "amr-wb" -#define MT_AMRWB_OCTET_PAYLOADTYPE -1 +#define MT_AMRWB_OCTET_PAYLOADTYPE 125 -#define MT_GSMEFR_PAYLOADTYPE -1 +#define MT_GSMEFR_PAYLOADTYPE 126 #define MT_GSMEFR_CODECNAME "GERAN-EFR" -#define MT_EVS_PAYLOADTYPE -1 +#define MT_EVS_PAYLOADTYPE 127 #define MT_EVS_CODECNAME "EVS" // OPUS codec defines diff --git a/src/engine/helper/HL_Rtp.cpp b/src/engine/helper/HL_Rtp.cpp index 9f7fcae4..c4af449e 100644 --- a/src/engine/helper/HL_Rtp.cpp +++ b/src/engine/helper/HL_Rtp.cpp @@ -53,7 +53,7 @@ bool RtpHelper::isRtp(const void* buffer, size_t length) return false; unsigned char _type = reinterpret_cast(buffer)->pt; - bool rtp = ( (_type & 0x7F) >= 96 && (_type & 0x7F) < 127) || ((_type & 0x7F) < 35); + bool rtp = ( (_type & 0x7F) >= 96 && (_type & 0x7F) <= 127) || ((_type & 0x7F) < 35); return rtp; } diff --git a/src/engine/media/MT_AudioReceiver.cpp b/src/engine/media/MT_AudioReceiver.cpp index 2ae67e11..d73a5e71 100644 --- a/src/engine/media/MT_AudioReceiver.cpp +++ b/src/engine/media/MT_AudioReceiver.cpp @@ -738,11 +738,17 @@ int AudioReceiver::timelengthFor(jrtplib::RTPPacket& p) PCodec codec = codecIter->second; if (codec) { - int frameCount = static_cast(p.GetPayloadLength() / codec->rtpLength()); - if (p.GetPayloadType() == 9/*G729A silence*/ && p.GetPayloadLength() % codec->rtpLength()) - frameCount++; + int frame_count = 0; + if (codec->rtpLength() != 0) + { + frame_count = static_cast(p.GetPayloadLength() / codec->rtpLength()); + if (p.GetPayloadType() == 9/*G729A silence*/ && p.GetPayloadLength() % codec->rtpLength()) + frame_count++; + } + else + frame_count = 1; - return frameCount * codec->frameTime(); + return frame_count * codec->frameTime(); } else return 0; diff --git a/src/engine/media/MT_Codec.h b/src/engine/media/MT_Codec.h index b6b1b8ad..97d2d41f 100644 --- a/src/engine/media/MT_Codec.h +++ b/src/engine/media/MT_Codec.h @@ -49,10 +49,20 @@ public: virtual const char* name() = 0; virtual int samplerate() = 0; virtual float timestampUnit() { return float(1.0 / samplerate()); } + + // Size of decoded audio frame in bytes virtual int pcmLength() = 0; + + // Time length of single audio frame virtual int frameTime() = 0; + + // Size of RTP frame in bytes. Can be zero for variable sized codecs. virtual int rtpLength() = 0; + + // Number of audio channels virtual int channels() { return 1; } + + virtual int encode(const void* input, int inputBytes, void* output, int outputCapacity) = 0; virtual int decode(const void* input, int inputBytes, void* output, int outputCapacity) = 0; virtual int plc(int lostFrames, void* output, int outputCapacity) = 0; diff --git a/src/engine/media/MT_CodecList.cpp b/src/engine/media/MT_CodecList.cpp index 32c3db06..4adc716b 100644 --- a/src/engine/media/MT_CodecList.cpp +++ b/src/engine/media/MT_CodecList.cpp @@ -62,8 +62,7 @@ CodecList::CodecList(const Settings& settings) mFactoryList.push_back(new GsmHrCodec::GsmHrFactory(mSettings.mGsmHrPayloadType)); #endif - if (mSettings.mEvsPayloadType != -1) - mFactoryList.push_back(new EVSCodec::EVSFactory(EVSCodec::StreamParameters())); + mFactoryList.push_back(new EVSCodec::EVSFactory(EVSCodec::StreamParameters())); } CodecList::~CodecList() @@ -79,7 +78,7 @@ int CodecList::count() const Codec::Factory& CodecList::codecAt(int index) const { - return *mFactoryList[index]; + return *mFactoryList[static_cast(index)]; } int CodecList::findCodec(const std::string &name) const @@ -157,12 +156,12 @@ void CodecListPriority::setupFrom(PVariantMap vmap) } } -int CodecListPriority::count(const CodecList &cl) const +int CodecListPriority::count(const CodecList & /*cl*/) const { - return mPriorityList.size(); + return static_cast(mPriorityList.size()); } Codec::Factory& CodecListPriority::codecAt(const CodecList& cl, int index) const { - return cl.codecAt(mPriorityList[index].mCodecIndex); + return cl.codecAt(mPriorityList[static_cast(index)].mCodecIndex); } diff --git a/src/engine/media/MT_EvsCodec.cpp b/src/engine/media/MT_EvsCodec.cpp index 71072c5a..4eac09d7 100644 --- a/src/engine/media/MT_EvsCodec.cpp +++ b/src/engine/media/MT_EvsCodec.cpp @@ -129,7 +129,7 @@ int EVSCodec::EVSFactory::samplerate() int EVSCodec::EVSFactory::payloadType() { - return 0; + return MT_EVS_PAYLOADTYPE; } PCodec EVSCodec::EVSFactory::create() @@ -145,19 +145,10 @@ EVSCodec::EVSCodec(const StreamParameters &sp) { EVSCodec::sp = sp; - if ((st_dec = (evs::Decoder_State*)malloc(sizeof(evs::Decoder_State))) == NULL) - { - std::stringstream out; - out << "Can not allocate memory for decoder state structure\n"; - throw std::out_of_range(out.str()); - } - /*if ((st_enc = (Encoder_State*)malloc(sizeof(Encoder_State))) == NULL) - { - std::stringstream out; - out << "Can not allocate memory for encoder state structure\n"; - throw std::out_of_range(out.str()); - }*/ - initDecoder(sp); + if ((st_dec = reinterpret_cast(malloc(sizeof(evs::Decoder_State)))) == nullptr) + throw std::bad_alloc(); + + initDecoder(sp); } EVSCodec::~EVSCodec() @@ -165,7 +156,7 @@ EVSCodec::~EVSCodec() if (st_dec) { destroy_decoder(st_dec); - free(st_dec); + free(st_dec); st_dec = nullptr; } } @@ -174,19 +165,9 @@ int EVSCodec::samplerate() return st_dec->output_Fs; } -int EVSCodec::samplerate(int CodecMode) -{ - return samplerate(); -} - int EVSCodec::pcmLength() { - return samplerate() / 50; -} - -int EVSCodec::pcmLength(int CodecMode) -{ - return pcmLength(); + return samplerate() / 50 * 2; } int EVSCodec::frameTime() @@ -196,22 +177,20 @@ int EVSCodec::frameTime() int EVSCodec::rtpLength() { + // Variable sized codec - bitrate can be changed during the call return 0; } int EVSCodec::encode(const void* input, int inputBytes, void* output, int outputCapacity) { + // Encoding is not supported yet. return 0; } int EVSCodec::decode(const void* input, int input_length, void* output, int outputCapacity) { - if (outputCapacity < L_FRAME8k) - { - std::stringstream out; - out << "Buffer for pcm frame is to small\n"; - throw std::out_of_range(out.str()); - } + if (outputCapacity < pcmLength()) + return 0; std::string buffer; @@ -260,15 +239,15 @@ int EVSCodec::decode(const void* input, int input_length, void* output, int outp } /* convert 'float' output data to 'short' */ - evs::syn_output(data, this->pcmLength(), static_cast(output) + offset); - offset += this->pcmLength(); + evs::syn_output(data, static_cast(pcmLength() / 2), static_cast(output) + offset); + offset += pcmLength() / 2; if (st_dec->ini_frame < MAX_FRAME_COUNTER) { st_dec->ini_frame++; } } - // std::fclose(temp); - return 1; + + return pcmLength(); } int EVSCodec::plc(int lostFrames, void* output, int outputCapacity) diff --git a/src/engine/media/MT_EvsCodec.h b/src/engine/media/MT_EvsCodec.h index 6a110862..76e0ba40 100644 --- a/src/engine/media/MT_EvsCodec.h +++ b/src/engine/media/MT_EvsCodec.h @@ -53,9 +53,7 @@ public: const char* name() { return MT_EVS_CODECNAME; }; int samplerate(); - int samplerate(int CodecMode); // DEC or ENC defined in cnst.h int pcmLength(); - int pcmLength(int CodecMode); // DEC or ENC defined in cnst.h int frameTime(); int rtpLength(); int encode(const void* input, int inputBytes, void* output, int outputCapacity);