Check RTP sequence number order when assembling H264 frame in PacketBuffer PacketBuffer::buffer_ slots can be re-used by packets with with different sequence numbers when their difference is multiple of buffer_.size() Non-H264 code path validates RTP sequence numbers continuity in `PotentialNewFrame` helper, H264 code path missed such check as the new test demonstrate. Bug: chromium:537233963 Change-Id: I6af0f52bfcb3a4437450dffcece85bee7ce172cd Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/490840 Reviewed-by: Åsa Persson <asapersson@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#48222}
diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc index 961b41e..0efaa87 100644 --- a/modules/video_coding/packet_buffer.cc +++ b/modules/video_coding/packet_buffer.cc
@@ -339,6 +339,8 @@ // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=7106 if (is_h264_descriptor && (buffer_[start_index] == nullptr || + buffer_[start_index]->seq_num() != + static_cast<uint16_t>(start_seq_num - 1) || buffer_[start_index]->timestamp != frame_timestamp)) { break; }
diff --git a/modules/video_coding/packet_buffer_unittest.cc b/modules/video_coding/packet_buffer_unittest.cc index 29f13e4..45b09e6 100644 --- a/modules/video_coding/packet_buffer_unittest.cc +++ b/modules/video_coding/packet_buffer_unittest.cc
@@ -709,6 +709,14 @@ InsertH264(4662, kKeyFrame, kFirst, kLast, 1000); } +TEST_P(PacketBufferH264ParameterizedTest, InsertMisOrderedPackets) { + InsertH264(4660, kKeyFrame, kFirst, kNotLast, 1000); + // packet (4661 + kStartSize) can use the same buffer slot as packet 4661, + // PacketBuffer need to be careful to detect they are not the same packet. + InsertH264(4661 + kStartSize, 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);