From 7e97e4c84dc21b2853f5158a03dcceb569e493ad Mon Sep 17 00:00:00 2001 From: "stefan@webrtc.org" Date: Fri, 8 Nov 2013 15:18:52 +0000 Subject: 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 --- voice_engine/channel.cc | 11 ++++++----- voice_engine/channel.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'voice_engine') 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); -- cgit v1.2.3