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;