Index: webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc b/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc |
index acc5926e5b5829db837678226958890b0f90ebb8..7b66fd349017bac03ab947c2b0a66cfe5ae8b9a3 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc |
@@ -212,9 +212,13 @@ int32_t RTPReceiverAudio::ParseAudioCodecSpecific( |
size_t payload_length, |
const AudioPayload& audio_specific, |
bool is_red) { |
- |
- if (payload_length == 0) { |
- return 0; |
+ RTC_DCHECK_GE(payload_length, rtp_header->header.paddingLength); |
+ const size_t payload_data_length = |
+ payload_length - rtp_header->header.paddingLength; |
+ if (payload_data_length == 0) { |
+ rtp_header->type.Audio.isCNG = false; |
+ rtp_header->frameType = kEmptyFrame; |
+ return data_callback_->OnReceivedPayloadData(nullptr, 0, rtp_header); |
} |
bool telephone_event_packet = |
@@ -229,16 +233,17 @@ int32_t RTPReceiverAudio::ParseAudioCodecSpecific( |
// | event |E|R| volume | duration | |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
// |
- if (payload_length % 4 != 0) { |
+ if (payload_data_length % 4 != 0) { |
return -1; |
} |
- size_t number_of_events = payload_length / 4; |
+ size_t number_of_events = payload_data_length / 4; |
// sanity |
if (number_of_events >= MAX_NUMBER_OF_PARALLEL_TELEPHONE_EVENTS) { |
number_of_events = MAX_NUMBER_OF_PARALLEL_TELEPHONE_EVENTS; |
} |
for (size_t n = 0; n < number_of_events; ++n) { |
+ RTC_DCHECK_GE(payload_data_length, (4 * n) + 2); |
bool end = (payload_data[(4 * n) + 1] & 0x80) ? true : false; |
std::set<uint8_t>::iterator event = |
@@ -291,17 +296,18 @@ int32_t RTPReceiverAudio::ParseAudioCodecSpecific( |
} |
} |
// TODO(holmer): Break this out to have RED parsing handled generically. |
+ RTC_DCHECK_GT(payload_data_length, 0); |
if (is_red && !(payload_data[0] & 0x80)) { |
// we recive only one frame packed in a RED packet remove the RED wrapper |
rtp_header->header.payloadType = payload_data[0]; |
// only one frame in the RED strip the one byte to help NetEq |
return data_callback_->OnReceivedPayloadData( |
- payload_data + 1, payload_length - 1, rtp_header); |
+ payload_data + 1, payload_data_length - 1, rtp_header); |
} |
rtp_header->type.Audio.channel = audio_specific.channels; |
- return data_callback_->OnReceivedPayloadData( |
- payload_data, payload_length, rtp_header); |
+ return data_callback_->OnReceivedPayloadData(payload_data, |
+ payload_data_length, rtp_header); |
} |
} // namespace webrtc |