Check if packet in PacketBuffer was cleared before the frame was fully received.
Bug: none Change-Id: Iaa5702a8da93462ba80f72821f075a6673eeb0e1 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/260324 Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Commit-Queue: Philip Eliasson <philipel@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36694}
This commit is contained in:
@ -242,11 +242,17 @@ std::vector<std::unique_ptr<PacketBuffer::Packet>> PacketBuffer::FindFrames(
|
||||
bool is_h264_keyframe = false;
|
||||
int idr_width = -1;
|
||||
int idr_height = -1;
|
||||
bool full_frame_found = false;
|
||||
while (true) {
|
||||
++tested_packets;
|
||||
|
||||
if (!is_h264 && buffer_[start_index]->is_first_packet_in_frame())
|
||||
if (!is_h264) {
|
||||
if (buffer_[start_index] == nullptr ||
|
||||
buffer_[start_index]->is_first_packet_in_frame()) {
|
||||
full_frame_found = buffer_[start_index] != nullptr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_h264) {
|
||||
const auto* h264_header = absl::get_if<RTPVideoHeaderH264>(
|
||||
@ -336,6 +342,7 @@ std::vector<std::unique_ptr<PacketBuffer::Packet>> PacketBuffer::FindFrames(
|
||||
}
|
||||
}
|
||||
|
||||
if (is_h264 || full_frame_found) {
|
||||
const uint16_t end_seq_num = seq_num + 1;
|
||||
// Use uint16_t type to handle sequence number wrap around case.
|
||||
uint16_t num_packets = end_seq_num - start_seq_num;
|
||||
@ -353,6 +360,7 @@ std::vector<std::unique_ptr<PacketBuffer::Packet>> PacketBuffer::FindFrames(
|
||||
missing_packets_.erase(missing_packets_.begin(),
|
||||
missing_packets_.upper_bound(seq_num));
|
||||
}
|
||||
}
|
||||
++seq_num;
|
||||
}
|
||||
return found_frames;
|
||||
|
||||
@ -291,6 +291,13 @@ TEST_F(PacketBufferTest, ClearSinglePacket) {
|
||||
Insert(seq_num + kMaxSize, kDeltaFrame, kFirst, kLast).buffer_cleared);
|
||||
}
|
||||
|
||||
TEST_F(PacketBufferTest, ClearPacketBeforeFullyReceivedFrame) {
|
||||
Insert(0, kKeyFrame, kFirst, kNotLast);
|
||||
Insert(1, kKeyFrame, kNotFirst, kNotLast);
|
||||
packet_buffer_.ClearTo(0);
|
||||
EXPECT_THAT(Insert(2, kKeyFrame, kNotFirst, kLast).packets, IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(PacketBufferTest, ClearFullBuffer) {
|
||||
for (int i = 0; i < kMaxSize; ++i)
|
||||
Insert(i, kDeltaFrame, kFirst, kLast);
|
||||
|
||||
Reference in New Issue
Block a user