From 8ee306fb766e87ebfc58f5e73b32107fe47cb280 Mon Sep 17 00:00:00 2001 From: Dmytro Bogovych Date: Mon, 10 Apr 2023 13:10:43 +0300 Subject: [PATCH] - fix Opus decoder for stereo audio --- src/engine/media/MT_AudioCodec.cpp | 14 ++++++++------ src/engine/media/MT_CodecList.cpp | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/engine/media/MT_AudioCodec.cpp b/src/engine/media/MT_AudioCodec.cpp index d2890923..5a7efb73 100644 --- a/src/engine/media/MT_AudioCodec.cpp +++ b/src/engine/media/MT_AudioCodec.cpp @@ -493,16 +493,18 @@ int OpusCodec::encode(const void* input, int inputBytes, void* output, int outpu int OpusCodec::decode(const void* input, int inputBytes, void* output, int outputCapacity) { - int nrOfChannelsInPacket = opus_packet_get_nb_channels((const unsigned char*)input); - assert(nrOfChannelsInPacket == 1); + int nr_of_channels = opus_packet_get_nb_channels((const unsigned char*)input); + assert(nr_of_channels == channels()); - int nrOfSamplesInPacket = opus_decoder_get_nb_samples(mDecoderCtx, (const unsigned char*)input, inputBytes); - if (nrOfSamplesInPacket > 0) + int nr_of_frames = opus_decoder_get_nb_samples(mDecoderCtx, (const unsigned char*)input, inputBytes); + if (nr_of_frames > 0) { // Send number of bytes for input and number of samples for output - int capacity = nrOfSamplesInPacket * sizeof(opus_int16) * channels(); + int capacity = nr_of_frames * sizeof(opus_int16) * channels(); + + // Dangerous ! opus_int16* buffer = (opus_int16*)alloca(capacity); - int decoded = opus_decode(mDecoderCtx, (const unsigned char*)input, inputBytes, (opus_int16*)buffer, capacity / (sizeof(short) * channels()), 1); + int decoded = opus_decode(mDecoderCtx, (const unsigned char*)input, inputBytes, (opus_int16*)buffer, capacity / (sizeof(short) * channels()), 0 /* FEC decoding is for lost packets */); if (decoded < 0) return 0; else diff --git a/src/engine/media/MT_CodecList.cpp b/src/engine/media/MT_CodecList.cpp index 255208a3..f092faed 100644 --- a/src/engine/media/MT_CodecList.cpp +++ b/src/engine/media/MT_CodecList.cpp @@ -132,7 +132,7 @@ CodecList::CodecList(const Settings& settings) :mSettings(settings) { //mFactoryList.push_back(new OpusCodec::OpusFactory(16000, 1)); -/* + #if defined(USE_OPUS_CODEC) if (settings.mOpusSpec.empty()) { @@ -146,7 +146,7 @@ CodecList::CodecList(const Settings& settings) } } #endif - */ + #if !defined(TARGET_ANDROID) && !defined(TARGET_OPENWRT) && !defined(TARGET_RPI) #if defined(USE_AMR_CODEC)