- fix AMR parsing in payload header and SDP
This commit is contained in:
parent
93bf339f00
commit
caa2239da1
|
|
@ -119,6 +119,7 @@ struct AmrPayload
|
||||||
static AmrPayload parseAmrPayload(AmrPayloadInfo& input)
|
static AmrPayload parseAmrPayload(AmrPayloadInfo& input)
|
||||||
{
|
{
|
||||||
AmrPayload result;
|
AmrPayload result;
|
||||||
|
|
||||||
// Do not skip packet by default; I suppose packet is good enough by default.
|
// Do not skip packet by default; I suppose packet is good enough by default.
|
||||||
result.mDiscardPacket = false;
|
result.mDiscardPacket = false;
|
||||||
|
|
||||||
|
|
@ -136,7 +137,7 @@ static AmrPayload parseAmrPayload(AmrPayloadInfo& input)
|
||||||
// in Table 1a in [4]. CMR value 15 indicates that no mode request
|
// in Table 1a in [4]. CMR value 15 indicates that no mode request
|
||||||
// is present, and other values are for future use.
|
// is present, and other values are for future use.
|
||||||
result.mCodeModeRequest = static_cast<uint8_t>(br.readBits(4));
|
result.mCodeModeRequest = static_cast<uint8_t>(br.readBits(4));
|
||||||
//ICELogMedia(<< "CMR: " << result.mCodeModeRequest);
|
// ICELogMedia(<< "CMR: " << result.mCodeModeRequest);
|
||||||
|
|
||||||
// Consume extra 4 bits for octet aligned profile
|
// Consume extra 4 bits for octet aligned profile
|
||||||
if (input.mOctetAligned)
|
if (input.mOctetAligned)
|
||||||
|
|
@ -203,43 +204,52 @@ static AmrPayload parseAmrPayload(AmrPayloadInfo& input)
|
||||||
|
|
||||||
for (size_t frameIndex=0; frameIndex < result.mFrames.size(); frameIndex++)
|
for (size_t frameIndex=0; frameIndex < result.mFrames.size(); frameIndex++)
|
||||||
{
|
{
|
||||||
AmrFrame& frame = result.mFrames[frameIndex];
|
AmrFrame& f = 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];
|
bool discard = input.mWideband ? (f.mFrameType >= 10 && f.mFrameType <= 13) : (f.mFrameType >= 9 && f.mFrameType <= 14);
|
||||||
ICELogMedia(<< "New AMR speech frame: frame type = " << FT <<
|
discard |= input.mWideband ? f.mFrameType >= 14 : f.mFrameType >= 15;
|
||||||
", mode = " << frame.mMode <<
|
if (discard)
|
||||||
", timestamp = " << static_cast<int>(frame.mTimestamp) <<
|
{
|
||||||
|
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) <<
|
", bits length = " << static_cast<int>(bitsLength) <<
|
||||||
", byte length =" << static_cast<int>(byteLength) <<
|
", 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 (bitsLength > 0)
|
||||||
{
|
{
|
||||||
if (input.mOctetAligned)
|
if (input.mOctetAligned)
|
||||||
{
|
{
|
||||||
if (dataIn.size() < byteLength)
|
if (dataIn.size() < byteLength)
|
||||||
frame.mGoodQuality = false;
|
f.mGoodQuality = false;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// It is octet aligned scheme, so we are on byte boundary now
|
// It is octet aligned scheme, so we are on byte boundary now
|
||||||
size_t byteOffset = br.count() / 8;
|
size_t byteOffset = br.count() / 8;
|
||||||
|
|
||||||
// Copy data of AMR frame
|
// 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
|
else
|
||||||
{
|
{
|
||||||
// Allocate place for copying
|
// Allocate place for copying
|
||||||
frame.mData = std::make_shared<ByteBuffer>();
|
f.mData = std::make_shared<ByteBuffer>();
|
||||||
frame.mData->resize(bitsLength / 8 + ((bitsLength % 8) ? 1 : 0) + 1);
|
f.mData->resize(bitsLength / 8 + ((bitsLength % 8) ? 1 : 0) + 1);
|
||||||
|
|
||||||
// Add header for decoder
|
// Add header for decoder
|
||||||
frame.mData->mutableData()[0] = (frame.mFrameType << 3) | (1 << 2);
|
f.mData->mutableData()[0] = (f.mFrameType << 3) | (1 << 2);
|
||||||
|
|
||||||
// Read bits
|
// Read bits
|
||||||
if (br.readBits(frame.mData->mutableData() + 1, bitsLength /*+ bitsLength*/ ) < (size_t)bitsLength)
|
if (br.readBits(f.mData->mutableData() + 1, bitsLength /*+ bitsLength*/ ) < (size_t)bitsLength)
|
||||||
frame.mGoodQuality = false;
|
f.mGoodQuality = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -256,16 +256,16 @@ CodecList::Settings CodecList::Settings::parseSdp(const std::list<resip::Codec>&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (codec_name == "AMR")
|
if (codec_name == "AMR" || codec_name == "AMR-NB")
|
||||||
{
|
{
|
||||||
int octet_mode = findOctetMode(params.c_str());
|
int octet_mode = findOctetMode(params.c_str());
|
||||||
if (octet_mode != -1)
|
if (octet_mode != -1)
|
||||||
{
|
{
|
||||||
if (octet_mode == 0)
|
if (octet_mode == 0)
|
||||||
r.mAmrWbPayloadType.insert(ptype);
|
r.mAmrNbPayloadType.insert(ptype);
|
||||||
else
|
else
|
||||||
if (octet_mode == 1)
|
if (octet_mode == 1)
|
||||||
r.mAmrWbOctetPayloadType.insert(ptype);
|
r.mAmrNbOctetPayloadType.insert(ptype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue