diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc index 9b3d93e658..741c11e2aa 100644 --- a/modules/video_coding/packet_buffer.cc +++ b/modules/video_coding/packet_buffer.cc @@ -162,8 +162,11 @@ void PacketBuffer::ClearTo(uint16_t seq_num) { first_seq_num_ = seq_num; is_cleared_to_first_seq_num_ = true; - missing_packets_.erase(missing_packets_.begin(), - missing_packets_.upper_bound(seq_num)); + auto clear_to_it = missing_packets_.upper_bound(seq_num); + if (clear_to_it != missing_packets_.begin()) { + --clear_to_it; + missing_packets_.erase(missing_packets_.begin(), clear_to_it); + } } void PacketBuffer::Clear() { diff --git a/modules/video_coding/video_packet_buffer_unittest.cc b/modules/video_coding/video_packet_buffer_unittest.cc index f8b3dc65dc..893649364a 100644 --- a/modules/video_coding/video_packet_buffer_unittest.cc +++ b/modules/video_coding/video_packet_buffer_unittest.cc @@ -489,6 +489,16 @@ INSTANTIATE_TEST_CASE_P(SpsPpsIdrIsKeyframe, TestPacketBufferH264Parameterized, ::testing::Values(false, true)); +TEST_P(TestPacketBufferH264Parameterized, DontRemoveMissingPacketOnClearTo) { + EXPECT_TRUE(InsertH264(0, kKeyFrame, kFirst, kLast, 0)); + EXPECT_TRUE(InsertH264(2, kDeltaFrame, kFirst, kNotLast, 2)); + packet_buffer_->ClearTo(0); + EXPECT_TRUE(InsertH264(3, kDeltaFrame, kNotFirst, kLast, 2)); + + ASSERT_EQ(1UL, frames_from_callback_.size()); + CheckFrame(0); +} + TEST_P(TestPacketBufferH264Parameterized, GetBitstreamOneFrameFullBuffer) { uint8_t* data_arr[kStartSize]; uint8_t expected[kStartSize];