From ef90c3227ebd4008bbcfabd17a9f422965f11a25 Mon Sep 17 00:00:00 2001 From: "phoglund@webrtc.org" Date: Mon, 26 Nov 2012 16:30:40 +0000 Subject: [PATCH] Will now correctly identify the first-ever received packet as the first packet in its frame. We used to flag the _second_ packet in the first frame as the first. Subsequent frames worked as intended. BUG=1103 TEST=vie_auto_test --automated, rtp_rtcp_unittests Review URL: https://webrtc-codereview.appspot.com/964020 git-svn-id: http://webrtc.googlecode.com/svn/trunk@3164 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../rtp_rtcp/source/mock/mock_rtp_receiver_video.h | 2 ++ webrtc/modules/rtp_rtcp/source/rtp_receiver.cc | 9 +++++++-- webrtc/modules/rtp_rtcp/source/rtp_receiver.h | 2 ++ webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc | 11 +++++++---- webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h | 1 + 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/webrtc/modules/rtp_rtcp/source/mock/mock_rtp_receiver_video.h b/webrtc/modules/rtp_rtcp/source/mock/mock_rtp_receiver_video.h index 37f08eba3f..3e3fce9f5b 100644 --- a/webrtc/modules/rtp_rtcp/source/mock/mock_rtp_receiver_video.h +++ b/webrtc/modules/rtp_rtcp/source/mock/mock_rtp_receiver_video.h @@ -40,6 +40,8 @@ class MockRTPReceiverVideo : public RTPReceiverVideo { const WebRtc_UWord32 rtpTimeStamp)); MOCK_CONST_METHOD0(REDPayloadType, WebRtc_Word8()); + MOCK_CONST_METHOD0(HaveNotReceivedPackets, + bool()); }; } // namespace webrtc diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver.cc b/webrtc/modules/rtp_rtcp/source/rtp_receiver.cc index b4a7e52891..33c66234a8 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver.cc @@ -157,6 +157,11 @@ RTPReceiver::SetPacketTimeout(const WebRtc_UWord32 timeoutMS) return 0; } +bool RTPReceiver::HaveNotReceivedPackets() const +{ + return _lastReceiveTime == 0; +} + void RTPReceiver::PacketTimeout() { bool packetTimeOut = false; @@ -168,7 +173,7 @@ void RTPReceiver::PacketTimeout() return; } - if(_lastReceiveTime == 0) + if (HaveNotReceivedPackets()) { // not active return; @@ -937,7 +942,7 @@ bool RTPReceiver::RetransmitOfOldPacket( // Min maxDelayMs is 1. if (maxDelayMs == 0) { - maxDelayMs = 1; + maxDelayMs = 1; } } else { maxDelayMs = (minRTT / 3) + 1; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver.h index 3893727eed..b07e8f4b6e 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver.h @@ -169,6 +169,8 @@ protected: virtual WebRtc_Word8 REDPayloadType() const; + bool HaveNotReceivedPackets() const; + private: // Is RED configured with payload type payloadType bool REDPayloadType(const WebRtc_Word8 payloadType) const; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc index ad8c3377ce..ebaef9c940 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.cc @@ -321,14 +321,17 @@ WebRtc_Word32 RTPReceiverVideo::ReceiveGenericCodec( const WebRtc_UWord16 payloadDataLength) { rtpHeader->frameType = kVideoFrameKey; - if(((SequenceNumber() + 1) == rtpHeader->header.sequenceNumber) && - (TimeStamp() != rtpHeader->header.timestamp)) { + bool isFirstPacketInFrame = + (SequenceNumber() + 1) == rtpHeader->header.sequenceNumber && + TimeStamp() != rtpHeader->header.timestamp; + + if (isFirstPacketInFrame || HaveNotReceivedPackets()) { rtpHeader->type.Video.isFirstPacket = true; } _criticalSectionReceiverVideo->Leave(); - if(CallbackOfReceivedPayloadData(payloadData, payloadDataLength, - rtpHeader) != 0) { + if (CallbackOfReceivedPayloadData(payloadData, payloadDataLength, + rtpHeader) != 0) { return -1; } return 0; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h index ddfa69e75a..454ba810ac 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h @@ -71,6 +71,7 @@ class RTPReceiverVideo { const WebRtc_UWord32 rtpTimeStamp) const = 0; virtual WebRtc_Word8 REDPayloadType() const = 0; + virtual bool HaveNotReceivedPackets() const = 0; WebRtc_Word32 SetCodecType(const RtpVideoCodecTypes videoType, WebRtcRTPHeader* rtpHeader) const;