From 34ec5c3f20a69c7d255076f75b3cebceb8557676 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Thu, 28 Sep 2023 16:52:19 +0200 Subject: [PATCH] Clear PacketBuffer on large negative jumps at the start of the video stream PacketBuffer is not designed to store wide range of the rtp sequence numbers Bug: webrtc:15508 Change-Id: I62b19ba2896a667d795a41c38a60f55ee3f60566 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/321845 Commit-Queue: Danil Chapovalov Reviewed-by: Ilya Nikolaevskiy Reviewed-by: Ilya Nikolaevskiy Cr-Commit-Position: refs/heads/main@{#40839} --- modules/video_coding/packet_buffer.cc | 7 +++++++ modules/video_coding/packet_buffer_unittest.cc | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc index 52ef5c2d85..420a200ba9 100644 --- a/modules/video_coding/packet_buffer.cc +++ b/modules/video_coding/packet_buffer.cc @@ -77,6 +77,13 @@ PacketBuffer::InsertResult PacketBuffer::InsertPacket( return result; } + if (ForwardDiff(first_seq_num_, seq_num) >= max_size_) { + // Large negative jump in rtp sequence number: clear the buffer and treat + // latest packet as the new first packet. + Clear(); + first_packet_received_ = true; + } + first_seq_num_ = seq_num; } diff --git a/modules/video_coding/packet_buffer_unittest.cc b/modules/video_coding/packet_buffer_unittest.cc index 901f44b188..607ec47dc4 100644 --- a/modules/video_coding/packet_buffer_unittest.cc +++ b/modules/video_coding/packet_buffer_unittest.cc @@ -705,6 +705,12 @@ TEST_P(PacketBufferH264ParameterizedTest, OneFrameMaxSeqNum) { StartSeqNumsAre(65534)); } +TEST_P(PacketBufferH264ParameterizedTest, InsertTooOldPackets) { + InsertH264(4660, kKeyFrame, kFirst, kNotLast, 1000); + InsertH264(37429, kDeltaFrame, kFirst, kNotLast, 1000); + InsertH264(4662, kKeyFrame, kFirst, kLast, 1000); +} + TEST_P(PacketBufferH264ParameterizedTest, ClearMissingPacketsOnKeyframe) { InsertH264(0, kKeyFrame, kFirst, kLast, 1000); InsertH264(2, kKeyFrame, kFirst, kLast, 3000);