From 028ce8b982a655cffcf45a377ff741c1996fb0d1 Mon Sep 17 00:00:00 2001 From: Dmytro Bogovych Date: Wed, 30 Jul 2025 14:55:41 +0300 Subject: [PATCH] - fix the AMR parsing --- src/engine/media/MT_AmrCodec.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/engine/media/MT_AmrCodec.cpp b/src/engine/media/MT_AmrCodec.cpp index 76d10ecd..0c5efd2a 100644 --- a/src/engine/media/MT_AmrCodec.cpp +++ b/src/engine/media/MT_AmrCodec.cpp @@ -147,11 +147,6 @@ static AmrPayload parseAmrPayload(AmrPayloadInfo& input) continue; } - /*std::cout << "New AMR speech frame: frame type = " << int(FT) - << ", mode = " << int(f.mMode) - << ", octet-aligned = " << input.mOctetAligned - << ", timestamp = " << static_cast(f.mTimestamp) << std::endl;*/ - if (input.mWideband && f.mFrameType == 15) { // DTX, no sense to decode the data @@ -164,6 +159,12 @@ static AmrPayload parseAmrPayload(AmrPayloadInfo& input) continue; } + if (!f.mGoodQuality) + { + // Bad quality, frame is damaged + continue; + } + size_t bitsLength = input.mWideband ? amrwb_framelenbits[f.mFrameType] : amrnb_framelenbits[f.mFrameType]; size_t byteLength = input.mWideband ? amrwb_framelen[f.mFrameType] : amrnb_framelen[f.mFrameType]; @@ -630,6 +631,7 @@ int AmrWbCodec::decodePlain(std::span input, std::span o return 0; short* dataOut = (short*)output.data(); + size_t dataOutSizeInBytes = 0; for (AmrFrame& frame: ap.mFrames) { memset(dataOut, 0, static_cast(pcmLength())); @@ -638,9 +640,10 @@ int AmrWbCodec::decodePlain(std::span input, std::span o { D_IF_decode(mDecoderCtx, (const unsigned char*)frame.mData->data(), (short*)dataOut, 0); dataOut += pcmLength() / 2; + dataOutSizeInBytes += pcmLength(); } } - return pcmLength() * ap.mFrames.size(); + return dataOutSizeInBytes; } int AmrWbCodec::decode(const void* input, int inputBytes, void* output, int outputCapacity)