Calculate min and max receive timestamps for packets in a video frame
Bug: webrtc:10106
Change-Id: I1d3469abb1e7bb7c91a5912d7b781505526abaca
Reviewed-on: https://webrtc-review.googlesource.com/c/113507
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25935}
diff --git a/modules/video_coding/frame_object.cc b/modules/video_coding/frame_object.cc
index 000c36a..750c977 100644
--- a/modules/video_coding/frame_object.cc
+++ b/modules/video_coding/frame_object.cc
@@ -27,11 +27,12 @@
uint16_t last_seq_num,
size_t frame_size,
int times_nacked,
- int64_t received_time)
+ int64_t first_packet_received_time,
+ int64_t last_packet_received_time)
: packet_buffer_(packet_buffer),
first_seq_num_(first_seq_num),
last_seq_num_(last_seq_num),
- received_time_(received_time),
+ last_packet_received_time_(last_packet_received_time),
times_nacked_(times_nacked) {
VCMPacket* first_packet = packet_buffer_->GetPacket(first_seq_num);
RTC_CHECK(first_packet);
@@ -100,9 +101,9 @@
ntp_time_ms_ +
last_packet->video_header.video_timing.network2_timestamp_delta_ms;
}
+ timing_.receive_start_ms = first_packet_received_time;
+ timing_.receive_finish_ms = last_packet_received_time;
timing_.flags = last_packet->video_header.video_timing.flags;
- timing_.receive_start_ms = first_packet->receive_time_ms;
- timing_.receive_finish_ms = last_packet->receive_time_ms;
is_last_spatial_layer = last_packet->markerBit;
}
@@ -131,7 +132,7 @@
}
int64_t RtpFrameObject::ReceivedTime() const {
- return received_time_;
+ return last_packet_received_time_;
}
int64_t RtpFrameObject::RenderTime() const {
diff --git a/modules/video_coding/frame_object.h b/modules/video_coding/frame_object.h
index bb4513c..5a3efd9 100644
--- a/modules/video_coding/frame_object.h
+++ b/modules/video_coding/frame_object.h
@@ -29,7 +29,8 @@
uint16_t last_seq_num,
size_t frame_size,
int times_nacked,
- int64_t received_time);
+ int64_t first_packet_received_time,
+ int64_t last_packet_received_time);
~RtpFrameObject() override;
uint16_t first_seq_num() const;
@@ -53,7 +54,7 @@
VideoCodecType codec_type_;
uint16_t first_seq_num_;
uint16_t last_seq_num_;
- int64_t received_time_;
+ int64_t last_packet_received_time_;
// Equal to times nacked of the packet with the highet times nacked
// belonging to this frame.
diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc
index 0a2b8bf..80c6666 100644
--- a/modules/video_coding/packet_buffer.cc
+++ b/modules/video_coding/packet_buffer.cc
@@ -285,6 +285,8 @@
size_t frame_size = 0;
int max_nack_count = -1;
uint16_t start_seq_num = seq_num;
+ int64_t min_recv_time = data_buffer_[index].receive_time_ms;
+ int64_t max_recv_time = data_buffer_[index].receive_time_ms;
// Find the start index by searching backward until the packet with
// the |frame_begin| flag is set.
@@ -306,6 +308,11 @@
std::max(max_nack_count, data_buffer_[start_index].timesNacked);
sequence_buffer_[start_index].frame_created = true;
+ min_recv_time =
+ std::min(min_recv_time, data_buffer_[start_index].receive_time_ms);
+ max_recv_time =
+ std::max(max_recv_time, data_buffer_[start_index].receive_time_ms);
+
if (!is_h264 && sequence_buffer_[start_index].frame_begin)
break;
@@ -393,7 +400,7 @@
found_frames.emplace_back(
new RtpFrameObject(this, start_seq_num, seq_num, frame_size,
- max_nack_count, clock_->TimeInMilliseconds()));
+ max_nack_count, min_recv_time, max_recv_time));
}
++seq_num;
}
diff --git a/modules/video_coding/rtp_frame_reference_finder_unittest.cc b/modules/video_coding/rtp_frame_reference_finder_unittest.cc
index 50a8779..1e8a9c5 100644
--- a/modules/video_coding/rtp_frame_reference_finder_unittest.cc
+++ b/modules/video_coding/rtp_frame_reference_finder_unittest.cc
@@ -92,7 +92,7 @@
ref_packet_buffer_->InsertPacket(&packet);
std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject(
- ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0));
+ ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0, 0));
reference_finder_->ManageFrame(std::move(frame));
}
@@ -123,7 +123,7 @@
}
std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject(
- ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0));
+ ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0, 0));
reference_finder_->ManageFrame(std::move(frame));
}
@@ -164,7 +164,7 @@
}
std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject(
- ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0));
+ ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0, 0));
reference_finder_->ManageFrame(std::move(frame));
}
@@ -202,7 +202,7 @@
}
std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject(
- ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0));
+ ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0, 0));
reference_finder_->ManageFrame(std::move(frame));
}
diff --git a/test/fuzzers/rtp_frame_reference_finder_fuzzer.cc b/test/fuzzers/rtp_frame_reference_finder_fuzzer.cc
index 57d7a96..b171e3d 100644
--- a/test/fuzzers/rtp_frame_reference_finder_fuzzer.cc
+++ b/test/fuzzers/rtp_frame_reference_finder_fuzzer.cc
@@ -111,7 +111,7 @@
while (reader.MoreToRead()) {
auto frame = absl::make_unique<video_coding::RtpFrameObject>(
- pb, reader.GetNum<uint16_t>(), reader.GetNum<uint16_t>(), 0, 0, 0);
+ pb, reader.GetNum<uint16_t>(), reader.GetNum<uint16_t>(), 0, 0, 0, 0);
reference_finder.ManageFrame(std::move(frame));
}
}
diff --git a/video/buffered_frame_decryptor_unittest.cc b/video/buffered_frame_decryptor_unittest.cc
index 95c647e..8a0c951 100644
--- a/video/buffered_frame_decryptor_unittest.cc
+++ b/video/buffered_frame_decryptor_unittest.cc
@@ -90,7 +90,7 @@
return std::unique_ptr<video_coding::RtpFrameObject>(
new video_coding::RtpFrameObject(fake_packet_buffer_.get(), seq_num_,
- seq_num_, 0, 0, 0));
+ seq_num_, 0, 0, 0, 0));
}
protected: