summaryrefslogtreecommitdiff
path: root/voice_engine
diff options
context:
space:
mode:
authorstefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2013-11-08 15:18:52 +0000
committerstefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2013-11-08 15:18:52 +0000
commit7e97e4c84dc21b2853f5158a03dcceb569e493ad (patch)
treea9a4a0798be918d4dd8ac4c169ea1d4b3a7b7bfb /voice_engine
parentb89fa697afa12adf1f3501eab484125e28713125 (diff)
downloadwebrtc-7e97e4c84dc21b2853f5158a03dcceb569e493ad.tar.gz
Fix for making sure that the packet in order checks are done prior to updating the last received packet state.
Without this fix all packets are considered out-of-order by the rtp receiver, causing the last received state in the rtp receiver to never get valid. Also makes sure that only valid timestamps and receive times are used for audio/video sync. BUG=2608 R=mflodman@webrtc.org Review URL: https://webrtc-codereview.appspot.com/3609004 git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@5102 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'voice_engine')
-rw-r--r--voice_engine/channel.cc11
-rw-r--r--voice_engine/channel.h2
2 files changed, 7 insertions, 6 deletions
diff --git a/voice_engine/channel.cc b/voice_engine/channel.cc
index 9e616a35..37016ced 100644
--- a/voice_engine/channel.cc
+++ b/voice_engine/channel.cc
@@ -2107,11 +2107,11 @@ int32_t Channel::ReceivedRTPPacket(const int8_t* data, int32_t length) {
rtp_payload_registry_->GetPayloadTypeFrequency(header.payloadType);
if (header.payload_type_frequency < 0)
return -1;
+ bool in_order = IsPacketInOrder(header);
rtp_receive_statistics_->IncomingPacket(header, length,
- IsPacketRetransmitted(header));
+ IsPacketRetransmitted(header, in_order));
rtp_payload_registry_->SetIncomingPayloadType(header);
- return ReceivePacket(received_packet, length, header,
- IsPacketInOrder(header)) ? 0 : -1;
+ return ReceivePacket(received_packet, length, header, in_order) ? 0 : -1;
}
bool Channel::ReceivePacket(const uint8_t* packet,
@@ -2171,7 +2171,8 @@ bool Channel::IsPacketInOrder(const RTPHeader& header) const {
return statistician->IsPacketInOrder(header.sequenceNumber);
}
-bool Channel::IsPacketRetransmitted(const RTPHeader& header) const {
+bool Channel::IsPacketRetransmitted(const RTPHeader& header,
+ bool in_order) const {
// Retransmissions are handled separately if RTX is enabled.
if (rtp_payload_registry_->RtxEnabled())
return false;
@@ -2182,7 +2183,7 @@ bool Channel::IsPacketRetransmitted(const RTPHeader& header) const {
// Check if this is a retransmission.
uint16_t min_rtt = 0;
_rtpRtcpModule->RTT(rtp_receiver_->SSRC(), NULL, NULL, &min_rtt, NULL);
- return !IsPacketInOrder(header) &&
+ return !in_order &&
statistician->IsRetransmitOfOldPacket(header, min_rtt);
}
diff --git a/voice_engine/channel.h b/voice_engine/channel.h
index 39d36a87..4647056b 100644
--- a/voice_engine/channel.h
+++ b/voice_engine/channel.h
@@ -431,7 +431,7 @@ private:
int packet_length,
const RTPHeader& header);
bool IsPacketInOrder(const RTPHeader& header) const;
- bool IsPacketRetransmitted(const RTPHeader& header) const;
+ bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const;
int ResendPackets(const uint16_t* sequence_numbers, int length);
int InsertInbandDtmfTone();
int32_t MixOrReplaceAudioWithFile(int mixingFrequency);