diff --git a/webrtc/video/rtp_stream_receiver.cc b/webrtc/video/rtp_stream_receiver.cc index c2e99507a7..499ee0953e 100644 --- a/webrtc/video/rtp_stream_receiver.cc +++ b/webrtc/video/rtp_stream_receiver.cc @@ -250,6 +250,14 @@ int32_t RtpStreamReceiver::OnReceivedPayloadData( packet.timesNacked = nack_module_ ? nack_module_->OnReceivedPacket(packet) : -1; + // In the case of a video stream without picture ids and no rtx the + // RtpFrameReferenceFinder will need to know about padding to + // correctly calculate frame references. + if (packet.sizeBytes == 0) { + reference_finder_->PaddingReceived(packet.seqNum); + return 0; + } + if (packet.codec == kVideoCodecH264) { // Only when we start to receive packets will we know what payload type // that will be used. When we know the payload type insert the correct diff --git a/webrtc/video/rtp_stream_receiver_unittest.cc b/webrtc/video/rtp_stream_receiver_unittest.cc index 4eb5b6eef9..aace1b7bfa 100644 --- a/webrtc/video/rtp_stream_receiver_unittest.cc +++ b/webrtc/video/rtp_stream_receiver_unittest.cc @@ -296,4 +296,39 @@ TEST_F(RtpStreamReceiverTest, OutOfBandFmtpSpsPps) { &idr_packet); } +TEST_F(RtpStreamReceiverTest, PaddingInMediaStream) { + WebRtcRTPHeader header = GetDefaultPacket(); + std::vector data; + data.insert(data.end(), {1, 2, 3}); + header.header.payloadType = 99; + header.type.Video.is_first_packet_in_frame = true; + header.header.sequenceNumber = 2; + header.header.markerBit = true; + header.frameType = kVideoFrameKey; + header.type.Video.codec = kRtpVideoGeneric; + mock_on_complete_frame_callback_.AppendExpectedBitstream(data.data(), + data.size()); + + EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_)); + rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(), + &header); + + header.header.sequenceNumber = 3; + rtp_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header); + + header.frameType = kVideoFrameDelta; + header.header.sequenceNumber = 4; + EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_)); + rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(), + &header); + + header.header.sequenceNumber = 6; + rtp_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(), + &header); + + EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_)); + header.header.sequenceNumber = 5; + rtp_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header); +} + } // namespace webrtc