- fix AMR parsing in payload header and SDP

This commit is contained in:
Dmytro Bogovych 2025-02-08 07:01:35 +03:00
parent 93bf339f00
commit caa2239da1
2 changed files with 28 additions and 18 deletions

View File

@ -119,6 +119,7 @@ struct AmrPayload
static AmrPayload parseAmrPayload(AmrPayloadInfo& input)
{
AmrPayload result;
// Do not skip packet by default; I suppose packet is good enough by default.
result.mDiscardPacket = false;
@ -203,43 +204,52 @@ static AmrPayload parseAmrPayload(AmrPayloadInfo& input)
for (size_t frameIndex=0; frameIndex < result.mFrames.size(); frameIndex++)
{
AmrFrame& frame = result.mFrames[frameIndex];
size_t bitsLength = input.mWideband ? amrwb_framelenbits[frame.mFrameType] : amrnb_framelenbits[frame.mFrameType];
size_t byteLength = input.mWideband ? amrwb_framelen[frame.mFrameType] : amrnb_framelen[frame.mFrameType];
ICELogMedia(<< "New AMR speech frame: frame type = " << FT <<
", mode = " << frame.mMode <<
", timestamp = " << static_cast<int>(frame.mTimestamp) <<
AmrFrame& f = result.mFrames[frameIndex];
bool discard = input.mWideband ? (f.mFrameType >= 10 && f.mFrameType <= 13) : (f.mFrameType >= 9 && f.mFrameType <= 14);
discard |= input.mWideband ? f.mFrameType >= 14 : f.mFrameType >= 15;
if (discard)
{
result.mDiscardPacket = true;
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];
std::cout << "New AMR speech frame: frame type = " << FT <<
", mode = " << f.mMode <<
", timestamp = " << static_cast<int>(f.mTimestamp) <<
", bits length = " << static_cast<int>(bitsLength) <<
", byte length =" << static_cast<int>(byteLength) <<
", remaining packet length = " << static_cast<int>(dataIn.size()));
", remaining packet length = " << static_cast<int>(dataIn.size()) << std::endl;;
if (bitsLength > 0)
{
if (input.mOctetAligned)
{
if (dataIn.size() < byteLength)
frame.mGoodQuality = false;
f.mGoodQuality = false;
else
{
// It is octet aligned scheme, so we are on byte boundary now
size_t byteOffset = br.count() / 8;
// Copy data of AMR frame
frame.mData = std::make_shared<ByteBuffer>(input.mPayload + byteOffset, byteLength);
f.mData = std::make_shared<ByteBuffer>(input.mPayload + byteOffset, byteLength);
}
}
else
{
// Allocate place for copying
frame.mData = std::make_shared<ByteBuffer>();
frame.mData->resize(bitsLength / 8 + ((bitsLength % 8) ? 1 : 0) + 1);
f.mData = std::make_shared<ByteBuffer>();
f.mData->resize(bitsLength / 8 + ((bitsLength % 8) ? 1 : 0) + 1);
// Add header for decoder
frame.mData->mutableData()[0] = (frame.mFrameType << 3) | (1 << 2);
f.mData->mutableData()[0] = (f.mFrameType << 3) | (1 << 2);
// Read bits
if (br.readBits(frame.mData->mutableData() + 1, bitsLength /*+ bitsLength*/ ) < (size_t)bitsLength)
frame.mGoodQuality = false;
if (br.readBits(f.mData->mutableData() + 1, bitsLength /*+ bitsLength*/ ) < (size_t)bitsLength)
f.mGoodQuality = false;
}
}
}

View File

@ -256,16 +256,16 @@ CodecList::Settings CodecList::Settings::parseSdp(const std::list<resip::Codec>&
}
}
else
if (codec_name == "AMR")
if (codec_name == "AMR" || codec_name == "AMR-NB")
{
int octet_mode = findOctetMode(params.c_str());
if (octet_mode != -1)
{
if (octet_mode == 0)
r.mAmrWbPayloadType.insert(ptype);
r.mAmrNbPayloadType.insert(ptype);
else
if (octet_mode == 1)
r.mAmrWbOctetPayloadType.insert(ptype);
r.mAmrNbOctetPayloadType.insert(ptype);
}
}
else