Use Timestamp to represent packet receive timestamps Before this CL, timestamps of received packets were rounded to the nearest millisecond and stored as int64_t. Due to the rounding it sometimes happened that timestamps later in the pipeline that are not rounded seem to occur even before the video frame was received. Change-Id: I92d8f3540b23baae2d4a1dc6a7cb3f58bcdaad18 Bug: webrtc:12722 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/216398 Reviewed-by: Chen Xing <chxg@google.com> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Johannes Kron <kron@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33916}
diff --git a/api/BUILD.gn b/api/BUILD.gn index c8e2952..212e9cd 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn
@@ -90,6 +90,7 @@ ":scoped_refptr", "../rtc_base:rtc_base_approved", "../rtc_base/system:rtc_export", + "units:timestamp", ] absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] }
diff --git a/api/rtp_packet_info.cc b/api/rtp_packet_info.cc index a9ebd9d..68e78d7 100644 --- a/api/rtp_packet_info.cc +++ b/api/rtp_packet_info.cc
@@ -16,7 +16,7 @@ namespace webrtc { RtpPacketInfo::RtpPacketInfo() - : ssrc_(0), rtp_timestamp_(0), receive_time_ms_(-1) {} + : ssrc_(0), rtp_timestamp_(0), receive_time_(Timestamp::MinusInfinity()) {} RtpPacketInfo::RtpPacketInfo( uint32_t ssrc, @@ -24,19 +24,19 @@ uint32_t rtp_timestamp, absl::optional<uint8_t> audio_level, absl::optional<AbsoluteCaptureTime> absolute_capture_time, - int64_t receive_time_ms) + Timestamp receive_time) : ssrc_(ssrc), csrcs_(std::move(csrcs)), rtp_timestamp_(rtp_timestamp), audio_level_(audio_level), absolute_capture_time_(absolute_capture_time), - receive_time_ms_(receive_time_ms) {} + receive_time_(receive_time) {} RtpPacketInfo::RtpPacketInfo(const RTPHeader& rtp_header, - int64_t receive_time_ms) + Timestamp receive_time) : ssrc_(rtp_header.ssrc), rtp_timestamp_(rtp_header.timestamp), - receive_time_ms_(receive_time_ms) { + receive_time_(receive_time) { const auto& extension = rtp_header.extension; const auto csrcs_count = std::min<size_t>(rtp_header.numCSRCs, kRtpCsrcSize); @@ -49,12 +49,29 @@ absolute_capture_time_ = extension.absolute_capture_time; } +RtpPacketInfo::RtpPacketInfo( + uint32_t ssrc, + std::vector<uint32_t> csrcs, + uint32_t rtp_timestamp, + absl::optional<uint8_t> audio_level, + absl::optional<AbsoluteCaptureTime> absolute_capture_time, + int64_t receive_time_ms) + : RtpPacketInfo(ssrc, + csrcs, + rtp_timestamp, + audio_level, + absolute_capture_time, + Timestamp::Millis(receive_time_ms)) {} +RtpPacketInfo::RtpPacketInfo(const RTPHeader& rtp_header, + int64_t receive_time_ms) + : RtpPacketInfo(rtp_header, Timestamp::Millis(receive_time_ms)) {} + bool operator==(const RtpPacketInfo& lhs, const RtpPacketInfo& rhs) { return (lhs.ssrc() == rhs.ssrc()) && (lhs.csrcs() == rhs.csrcs()) && (lhs.rtp_timestamp() == rhs.rtp_timestamp()) && (lhs.audio_level() == rhs.audio_level()) && (lhs.absolute_capture_time() == rhs.absolute_capture_time()) && - (lhs.receive_time_ms() == rhs.receive_time_ms()); + (lhs.receive_time() == rhs.receive_time()); } } // namespace webrtc
diff --git a/api/rtp_packet_info.h b/api/rtp_packet_info.h index 639ba32..ed48470 100644 --- a/api/rtp_packet_info.h +++ b/api/rtp_packet_info.h
@@ -17,6 +17,7 @@ #include "absl/types/optional.h" #include "api/rtp_headers.h" +#include "api/units/timestamp.h" #include "rtc_base/system/rtc_export.h" namespace webrtc { @@ -35,8 +36,18 @@ uint32_t rtp_timestamp, absl::optional<uint8_t> audio_level, absl::optional<AbsoluteCaptureTime> absolute_capture_time, - int64_t receive_time_ms); + Timestamp receive_time); + RtpPacketInfo(const RTPHeader& rtp_header, Timestamp receive_time); + + // TODO(bugs.webrtc.org/12722): Deprecated, remove once downstream projects + // are updated. + RtpPacketInfo(uint32_t ssrc, + std::vector<uint32_t> csrcs, + uint32_t rtp_timestamp, + absl::optional<uint8_t> audio_level, + absl::optional<AbsoluteCaptureTime> absolute_capture_time, + int64_t receive_time_ms); RtpPacketInfo(const RTPHeader& rtp_header, int64_t receive_time_ms); RtpPacketInfo(const RtpPacketInfo& other) = default; @@ -64,8 +75,11 @@ absolute_capture_time_ = value; } - int64_t receive_time_ms() const { return receive_time_ms_; } - void set_receive_time_ms(int64_t value) { receive_time_ms_ = value; } + Timestamp receive_time() const { return receive_time_; } + void set_receive_time(Timestamp value) { receive_time_ = value; } + // TODO(bugs.webrtc.org/12722): Deprecated, remove once downstream projects + // are updated. + int64_t receive_time_ms() const { return receive_time_.ms(); } private: // Fields from the RTP header: @@ -83,7 +97,7 @@ absl::optional<AbsoluteCaptureTime> absolute_capture_time_; // Local |webrtc::Clock|-based timestamp of when the packet was received. - int64_t receive_time_ms_; + Timestamp receive_time_; }; bool operator==(const RtpPacketInfo& lhs, const RtpPacketInfo& rhs);
diff --git a/api/rtp_packet_info_unittest.cc b/api/rtp_packet_info_unittest.cc index fe79f6d..7af7323 100644 --- a/api/rtp_packet_info_unittest.cc +++ b/api/rtp_packet_info_unittest.cc
@@ -37,7 +37,7 @@ rhs = RtpPacketInfo(); EXPECT_NE(rhs.ssrc(), value); - rhs = RtpPacketInfo(value, {}, {}, {}, {}, {}); + rhs = RtpPacketInfo(value, {}, {}, {}, {}, Timestamp::Millis(0)); EXPECT_EQ(rhs.ssrc(), value); } @@ -64,7 +64,7 @@ rhs = RtpPacketInfo(); EXPECT_NE(rhs.csrcs(), value); - rhs = RtpPacketInfo({}, value, {}, {}, {}, {}); + rhs = RtpPacketInfo({}, value, {}, {}, {}, Timestamp::Millis(0)); EXPECT_EQ(rhs.csrcs(), value); } @@ -91,7 +91,7 @@ rhs = RtpPacketInfo(); EXPECT_NE(rhs.rtp_timestamp(), value); - rhs = RtpPacketInfo({}, {}, value, {}, {}, {}); + rhs = RtpPacketInfo({}, {}, value, {}, {}, Timestamp::Millis(0)); EXPECT_EQ(rhs.rtp_timestamp(), value); } @@ -118,7 +118,7 @@ rhs = RtpPacketInfo(); EXPECT_NE(rhs.audio_level(), value); - rhs = RtpPacketInfo({}, {}, {}, value, {}, {}); + rhs = RtpPacketInfo({}, {}, {}, value, {}, Timestamp::Millis(0)); EXPECT_EQ(rhs.audio_level(), value); } @@ -145,12 +145,12 @@ rhs = RtpPacketInfo(); EXPECT_NE(rhs.absolute_capture_time(), value); - rhs = RtpPacketInfo({}, {}, {}, {}, value, {}); + rhs = RtpPacketInfo({}, {}, {}, {}, value, Timestamp::Millis(0)); EXPECT_EQ(rhs.absolute_capture_time(), value); } TEST(RtpPacketInfoTest, ReceiveTimeMs) { - const int64_t value = 8868963877546349045LL; + const Timestamp timestamp = Timestamp::Micros(8868963877546349045LL); RtpPacketInfo lhs; RtpPacketInfo rhs; @@ -158,8 +158,8 @@ EXPECT_TRUE(lhs == rhs); EXPECT_FALSE(lhs != rhs); - rhs.set_receive_time_ms(value); - EXPECT_EQ(rhs.receive_time_ms(), value); + rhs.set_receive_time(timestamp); + EXPECT_EQ(rhs.receive_time(), timestamp); EXPECT_FALSE(lhs == rhs); EXPECT_TRUE(lhs != rhs); @@ -170,10 +170,10 @@ EXPECT_FALSE(lhs != rhs); rhs = RtpPacketInfo(); - EXPECT_NE(rhs.receive_time_ms(), value); + EXPECT_NE(rhs.receive_time(), timestamp); - rhs = RtpPacketInfo({}, {}, {}, {}, {}, value); - EXPECT_EQ(rhs.receive_time_ms(), value); + rhs = RtpPacketInfo({}, {}, {}, {}, {}, timestamp); + EXPECT_EQ(rhs.receive_time(), timestamp); } } // namespace webrtc
diff --git a/api/rtp_packet_infos_unittest.cc b/api/rtp_packet_infos_unittest.cc index ce502ac..e83358f 100644 --- a/api/rtp_packet_infos_unittest.cc +++ b/api/rtp_packet_infos_unittest.cc
@@ -27,9 +27,12 @@ } // namespace TEST(RtpPacketInfosTest, BasicFunctionality) { - RtpPacketInfo p0(123, {1, 2}, 89, 5, AbsoluteCaptureTime{45, 78}, 7); - RtpPacketInfo p1(456, {3, 4}, 89, 4, AbsoluteCaptureTime{13, 21}, 1); - RtpPacketInfo p2(789, {5, 6}, 88, 1, AbsoluteCaptureTime{99, 78}, 7); + RtpPacketInfo p0(123, {1, 2}, 89, 5, AbsoluteCaptureTime{45, 78}, + Timestamp::Millis(7)); + RtpPacketInfo p1(456, {3, 4}, 89, 4, AbsoluteCaptureTime{13, 21}, + Timestamp::Millis(1)); + RtpPacketInfo p2(789, {5, 6}, 88, 1, AbsoluteCaptureTime{99, 78}, + Timestamp::Millis(7)); RtpPacketInfos x({p0, p1, p2}); @@ -52,9 +55,12 @@ } TEST(RtpPacketInfosTest, CopyShareData) { - RtpPacketInfo p0(123, {1, 2}, 89, 5, AbsoluteCaptureTime{45, 78}, 7); - RtpPacketInfo p1(456, {3, 4}, 89, 4, AbsoluteCaptureTime{13, 21}, 1); - RtpPacketInfo p2(789, {5, 6}, 88, 1, AbsoluteCaptureTime{99, 78}, 7); + RtpPacketInfo p0(123, {1, 2}, 89, 5, AbsoluteCaptureTime{45, 78}, + Timestamp::Millis(7)); + RtpPacketInfo p1(456, {3, 4}, 89, 4, AbsoluteCaptureTime{13, 21}, + Timestamp::Millis(1)); + RtpPacketInfo p2(789, {5, 6}, 88, 1, AbsoluteCaptureTime{99, 78}, + Timestamp::Millis(7)); RtpPacketInfos lhs({p0, p1, p2}); RtpPacketInfos rhs = lhs;
diff --git a/audio/channel_receive.cc b/audio/channel_receive.cc index 7089d21..6a57b98 100644 --- a/audio/channel_receive.cc +++ b/audio/channel_receive.cc
@@ -299,7 +299,7 @@ // updating RtpSource information. if (source_tracker_) { RtpPacketInfos::vector_type packet_vector = { - RtpPacketInfo(rtpHeader, clock_->TimeInMilliseconds())}; + RtpPacketInfo(rtpHeader, clock_->CurrentTime())}; source_tracker_->OnFrameDelivered(RtpPacketInfos(packet_vector)); }
diff --git a/modules/audio_coding/neteq/neteq_impl.cc b/modules/audio_coding/neteq/neteq_impl.cc index d156352..6ac157f 100644 --- a/modules/audio_coding/neteq/neteq_impl.cc +++ b/modules/audio_coding/neteq/neteq_impl.cc
@@ -565,19 +565,19 @@ return kInvalidPointer; } - int64_t receive_time_ms = clock_->TimeInMilliseconds(); + Timestamp receive_time = clock_->CurrentTime(); stats_->ReceivedPacket(); PacketList packet_list; // Insert packet in a packet list. - packet_list.push_back([&rtp_header, &payload, &receive_time_ms] { + packet_list.push_back([&rtp_header, &payload, &receive_time] { // Convert to Packet. Packet packet; packet.payload_type = rtp_header.payloadType; packet.sequence_number = rtp_header.sequenceNumber; packet.timestamp = rtp_header.timestamp; packet.payload.SetData(payload.data(), payload.size()); - packet.packet_info = RtpPacketInfo(rtp_header, receive_time_ms); + packet.packet_info = RtpPacketInfo(rtp_header, receive_time); // Waiting time will be set upon inserting the packet in the buffer. RTC_DCHECK(!packet.waiting_time); return packet;
diff --git a/modules/audio_coding/neteq/neteq_impl_unittest.cc b/modules/audio_coding/neteq/neteq_impl_unittest.cc index c2a2bee..b3c25ca 100644 --- a/modules/audio_coding/neteq/neteq_impl_unittest.cc +++ b/modules/audio_coding/neteq/neteq_impl_unittest.cc
@@ -497,7 +497,7 @@ // Insert one packet. clock_.AdvanceTimeMilliseconds(123456); - int64_t expected_receive_time_ms = clock_.TimeInMilliseconds(); + Timestamp expected_receive_time = clock_.CurrentTime(); EXPECT_EQ(NetEq::kOK, neteq_->InsertPacket(rtp_header, payload)); // Pull audio once. @@ -518,7 +518,7 @@ EXPECT_THAT(packet_info.csrcs(), ElementsAre(43, 65, 17)); EXPECT_EQ(packet_info.rtp_timestamp(), rtp_header.timestamp); EXPECT_FALSE(packet_info.audio_level().has_value()); - EXPECT_EQ(packet_info.receive_time_ms(), expected_receive_time_ms); + EXPECT_EQ(packet_info.receive_time(), expected_receive_time); } // Start with a simple check that the fake decoder is behaving as expected. @@ -590,7 +590,7 @@ // Insert one packet. clock_.AdvanceTimeMilliseconds(123456); - int64_t expected_receive_time_ms = clock_.TimeInMilliseconds(); + Timestamp expected_receive_time = clock_.CurrentTime(); EXPECT_EQ(NetEq::kOK, neteq_->InsertPacket(rtp_header, payload)); // Pull audio once. @@ -610,7 +610,7 @@ EXPECT_THAT(packet_info.csrcs(), IsEmpty()); EXPECT_EQ(packet_info.rtp_timestamp(), rtp_header.timestamp); EXPECT_EQ(packet_info.audio_level(), rtp_header.extension.audioLevel); - EXPECT_EQ(packet_info.receive_time_ms(), expected_receive_time_ms); + EXPECT_EQ(packet_info.receive_time(), expected_receive_time); } // Insert two more packets. The first one is out of order, and is already too @@ -626,7 +626,7 @@ rtp_header.extension.audioLevel = 2; payload[0] = 2; clock_.AdvanceTimeMilliseconds(2000); - expected_receive_time_ms = clock_.TimeInMilliseconds(); + expected_receive_time = clock_.CurrentTime(); EXPECT_EQ(NetEq::kOK, neteq_->InsertPacket(rtp_header, payload)); // Expect only the second packet to be decoded (the one with "2" as the first @@ -656,7 +656,7 @@ EXPECT_THAT(packet_info.csrcs(), IsEmpty()); EXPECT_EQ(packet_info.rtp_timestamp(), rtp_header.timestamp); EXPECT_EQ(packet_info.audio_level(), rtp_header.extension.audioLevel); - EXPECT_EQ(packet_info.receive_time_ms(), expected_receive_time_ms); + EXPECT_EQ(packet_info.receive_time(), expected_receive_time); } EXPECT_CALL(mock_decoder, Die());
diff --git a/modules/audio_coding/neteq/red_payload_splitter.cc b/modules/audio_coding/neteq/red_payload_splitter.cc index 5681464..f5cd9c2 100644 --- a/modules/audio_coding/neteq/red_payload_splitter.cc +++ b/modules/audio_coding/neteq/red_payload_splitter.cc
@@ -139,7 +139,7 @@ /*rtp_timestamp=*/new_packet.timestamp, /*audio_level=*/absl::nullopt, /*absolute_capture_time=*/absl::nullopt, - /*receive_time_ms=*/red_packet.packet_info.receive_time_ms()); + /*receive_time=*/red_packet.packet_info.receive_time()); new_packets.push_front(std::move(new_packet)); payload_ptr += payload_length; }
diff --git a/modules/rtp_rtcp/source/source_tracker_unittest.cc b/modules/rtp_rtcp/source/source_tracker_unittest.cc index 32f9f4b..c88e801 100644 --- a/modules/rtp_rtcp/source/source_tracker_unittest.cc +++ b/modules/rtp_rtcp/source/source_tracker_unittest.cc
@@ -111,7 +111,7 @@ packet_infos.emplace_back(GenerateSsrc(), GenerateCsrcs(), GenerateRtpTimestamp(), GenerateAudioLevel(), GenerateAbsoluteCaptureTime(), - GenerateReceiveTimeMs()); + GenerateReceiveTime()); } return RtpPacketInfos(std::move(packet_infos)); @@ -192,8 +192,9 @@ return value; } - int64_t GenerateReceiveTimeMs() { - return std::uniform_int_distribution<int64_t>()(generator_); + Timestamp GenerateReceiveTime() { + return Timestamp::Micros( + std::uniform_int_distribution<int64_t>()(generator_)); } const uint32_t ssrcs_count_; @@ -248,14 +249,14 @@ constexpr absl::optional<AbsoluteCaptureTime> kAbsoluteCaptureTime = AbsoluteCaptureTime{/*absolute_capture_timestamp=*/12, /*estimated_capture_clock_offset=*/absl::nullopt}; - constexpr int64_t kReceiveTimeMs = 60; + constexpr Timestamp kReceiveTime = Timestamp::Millis(60); SimulatedClock clock(1000000000000ULL); SourceTracker tracker(&clock); tracker.OnFrameDelivered(RtpPacketInfos( {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp, kAudioLevel, - kAbsoluteCaptureTime, kReceiveTimeMs)})); + kAbsoluteCaptureTime, kReceiveTime)})); int64_t timestamp_ms = clock.TimeInMilliseconds(); constexpr RtpSource::Extensions extensions = {kAudioLevel, @@ -283,15 +284,15 @@ AbsoluteCaptureTime{12, 34}; constexpr absl::optional<AbsoluteCaptureTime> kAbsoluteCaptureTime1 = AbsoluteCaptureTime{56, 78}; - constexpr int64_t kReceiveTimeMs0 = 60; - constexpr int64_t kReceiveTimeMs1 = 61; + constexpr Timestamp kReceiveTime0 = Timestamp::Millis(60); + constexpr Timestamp kReceiveTime1 = Timestamp::Millis(61); SimulatedClock clock(1000000000000ULL); SourceTracker tracker(&clock); tracker.OnFrameDelivered(RtpPacketInfos( {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kAudioLevel0, - kAbsoluteCaptureTime0, kReceiveTimeMs0)})); + kAbsoluteCaptureTime0, kReceiveTime0)})); int64_t timestamp_ms_0 = clock.TimeInMilliseconds(); @@ -299,7 +300,7 @@ tracker.OnFrameDelivered(RtpPacketInfos( {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs2}, kRtpTimestamp1, kAudioLevel1, - kAbsoluteCaptureTime1, kReceiveTimeMs1)})); + kAbsoluteCaptureTime1, kReceiveTime1)})); int64_t timestamp_ms_1 = clock.TimeInMilliseconds(); @@ -333,21 +334,21 @@ AbsoluteCaptureTime{12, 34}; constexpr absl::optional<AbsoluteCaptureTime> kAbsoluteCaptureTime1 = AbsoluteCaptureTime{56, 78}; - constexpr int64_t kReceiveTimeMs0 = 60; - constexpr int64_t kReceiveTimeMs1 = 61; + constexpr Timestamp kReceiveTime0 = Timestamp::Millis(60); + constexpr Timestamp kReceiveTime1 = Timestamp::Millis(61); SimulatedClock clock(1000000000000ULL); SourceTracker tracker(&clock); tracker.OnFrameDelivered(RtpPacketInfos( {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs1}, kRtpTimestamp0, kAudioLevel0, - kAbsoluteCaptureTime0, kReceiveTimeMs0)})); + kAbsoluteCaptureTime0, kReceiveTime0)})); clock.AdvanceTimeMilliseconds(17); tracker.OnFrameDelivered(RtpPacketInfos( {RtpPacketInfo(kSsrc, {kCsrcs0, kCsrcs2}, kRtpTimestamp1, kAudioLevel1, - kAbsoluteCaptureTime1, kReceiveTimeMs1)})); + kAbsoluteCaptureTime1, kReceiveTime1)})); int64_t timestamp_ms_1 = clock.TimeInMilliseconds();
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn index 94312bf..b28517e 100644 --- a/modules/video_coding/BUILD.gn +++ b/modules/video_coding/BUILD.gn
@@ -274,6 +274,7 @@ "../../api:rtp_headers", "../../api:rtp_packet_info", "../../api:sequence_checker", + "../../api/units:timestamp", "../../api/video:encoded_image", "../../api/video:video_frame", "../../api/video:video_frame_type",
diff --git a/modules/video_coding/jitter_buffer_unittest.cc b/modules/video_coding/jitter_buffer_unittest.cc index acfee8c..752ceb8 100644 --- a/modules/video_coding/jitter_buffer_unittest.cc +++ b/modules/video_coding/jitter_buffer_unittest.cc
@@ -67,8 +67,7 @@ video_header.is_first_packet_in_frame = true; video_header.frame_type = VideoFrameType::kVideoFrameDelta; packet_.reset(new VCMPacket(data_, size_, rtp_header, video_header, - /*ntp_time_ms=*/0, - clock_->TimeInMilliseconds())); + /*ntp_time_ms=*/0, clock_->CurrentTime())); } VCMEncodedFrame* DecodeCompleteFrame() { @@ -541,7 +540,7 @@ video_header.codec = kVideoCodecGeneric; video_header.frame_type = VideoFrameType::kEmptyFrame; VCMPacket empty_packet(data_, 0, rtp_header, video_header, - /*ntp_time_ms=*/0, clock_->TimeInMilliseconds()); + /*ntp_time_ms=*/0, clock_->CurrentTime()); EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(empty_packet, &retransmitted)); empty_packet.seqNum += 1;
diff --git a/modules/video_coding/packet.cc b/modules/video_coding/packet.cc index 0c4a658..324248a 100644 --- a/modules/video_coding/packet.cc +++ b/modules/video_coding/packet.cc
@@ -34,7 +34,7 @@ const RTPHeader& rtp_header, const RTPVideoHeader& videoHeader, int64_t ntp_time_ms, - int64_t receive_time_ms) + Timestamp receive_time) : payloadType(rtp_header.payloadType), timestamp(rtp_header.timestamp), ntp_time_ms_(ntp_time_ms), @@ -47,7 +47,7 @@ insertStartCode(videoHeader.codec == kVideoCodecH264 && videoHeader.is_first_packet_in_frame), video_header(videoHeader), - packet_info(rtp_header, receive_time_ms) { + packet_info(rtp_header, receive_time) { if (is_first_packet_in_frame() && markerBit) { completeNALU = kNaluComplete; } else if (is_first_packet_in_frame()) {
diff --git a/modules/video_coding/packet.h b/modules/video_coding/packet.h index f157e10..9aa2d5c 100644 --- a/modules/video_coding/packet.h +++ b/modules/video_coding/packet.h
@@ -17,6 +17,7 @@ #include "absl/types/optional.h" #include "api/rtp_headers.h" #include "api/rtp_packet_info.h" +#include "api/units/timestamp.h" #include "api/video/video_frame_type.h" #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h" #include "modules/rtp_rtcp/source/rtp_video_header.h" @@ -41,7 +42,7 @@ const RTPHeader& rtp_header, const RTPVideoHeader& video_header, int64_t ntp_time_ms, - int64_t receive_time_ms); + Timestamp receive_time); ~VCMPacket();
diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc index 1291f78..99f2891 100644 --- a/modules/video_coding/packet_buffer.cc +++ b/modules/video_coding/packet_buffer.cc
@@ -36,7 +36,7 @@ PacketBuffer::Packet::Packet(const RtpPacketReceived& rtp_packet, const RTPVideoHeader& video_header, - int64_t receive_time_ms) + Timestamp receive_time) : marker_bit(rtp_packet.Marker()), payload_type(rtp_packet.PayloadType()), seq_num(rtp_packet.SequenceNumber()), @@ -48,7 +48,7 @@ rtp_packet.Timestamp(), /*audio_level=*/absl::nullopt, rtp_packet.GetExtension<AbsoluteCaptureTimeExtension>(), - receive_time_ms) {} + receive_time) {} PacketBuffer::PacketBuffer(size_t start_buffer_size, size_t max_buffer_size) : max_size_(max_buffer_size),
diff --git a/modules/video_coding/packet_buffer.h b/modules/video_coding/packet_buffer.h index c0cc752..e8d2446 100644 --- a/modules/video_coding/packet_buffer.h +++ b/modules/video_coding/packet_buffer.h
@@ -18,6 +18,7 @@ #include "absl/base/attributes.h" #include "api/rtp_packet_info.h" +#include "api/units/timestamp.h" #include "api/video/encoded_image.h" #include "modules/rtp_rtcp/source/rtp_packet_received.h" #include "modules/rtp_rtcp/source/rtp_video_header.h" @@ -34,7 +35,7 @@ Packet() = default; Packet(const RtpPacketReceived& rtp_packet, const RTPVideoHeader& video_header, - int64_t receive_time_ms); + Timestamp receive_time); Packet(const Packet&) = delete; Packet(Packet&&) = delete; Packet& operator=(const Packet&) = delete;
diff --git a/modules/video_coding/video_receiver.cc b/modules/video_coding/video_receiver.cc index 74b04ac..43dbc9f 100644 --- a/modules/video_coding/video_receiver.cc +++ b/modules/video_coding/video_receiver.cc
@@ -279,7 +279,7 @@ // Callers don't provide any ntp time. const VCMPacket packet(incomingPayload, payloadLength, rtp_header, video_header, /*ntp_time_ms=*/0, - clock_->TimeInMilliseconds()); + clock_->CurrentTime()); int32_t ret = _receiver.InsertPacket(packet); // TODO(holmer): Investigate if this somehow should use the key frame
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc index 273c0e8..436b3ba 100644 --- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc +++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer.cc
@@ -353,17 +353,16 @@ stream_frame_counters_.at(key).received++; // Determine the time of the last received packet of this video frame. RTC_DCHECK(!input_image.PacketInfos().empty()); - int64_t last_receive_time = + Timestamp last_receive_time = std::max_element(input_image.PacketInfos().cbegin(), input_image.PacketInfos().cend(), [](const RtpPacketInfo& a, const RtpPacketInfo& b) { - return a.receive_time_ms() < b.receive_time_ms(); + return a.receive_time() < b.receive_time(); }) - ->receive_time_ms(); - it->second.OnFramePreDecode( - peer_index, - /*received_time=*/Timestamp::Millis(last_receive_time), - /*decode_start_time=*/Now()); + ->receive_time(); + it->second.OnFramePreDecode(peer_index, + /*received_time=*/last_receive_time, + /*decode_start_time=*/Now()); } void DefaultVideoQualityAnalyzer::OnFrameDecoded(
diff --git a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc index 4cdc681..8d8a1af 100644 --- a/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc +++ b/test/pc/e2e/analyzer/video/default_video_quality_analyzer_test.cc
@@ -63,13 +63,13 @@ EncodedImage FakeEncode(const VideoFrame& frame) { EncodedImage image; std::vector<RtpPacketInfo> packet_infos; - packet_infos.push_back( - RtpPacketInfo(/*ssrc=*/1, - /*csrcs=*/{}, - /*rtp_timestamp=*/frame.timestamp(), - /*audio_level=*/absl::nullopt, - /*absolute_capture_time=*/absl::nullopt, - /*receive_time_ms=*/frame.timestamp_us() + 10)); + packet_infos.push_back(RtpPacketInfo( + /*ssrc=*/1, + /*csrcs=*/{}, + /*rtp_timestamp=*/frame.timestamp(), + /*audio_level=*/absl::nullopt, + /*absolute_capture_time=*/absl::nullopt, + /*receive_time=*/Timestamp::Micros(frame.timestamp_us() + 10000))); image.SetPacketInfos(RtpPacketInfos(packet_infos)); return image; }
diff --git a/video/rtp_video_stream_receiver.cc b/video/rtp_video_stream_receiver.cc index 7e8fe99..9111b6a 100644 --- a/video/rtp_video_stream_receiver.cc +++ b/video/rtp_video_stream_receiver.cc
@@ -507,7 +507,7 @@ const RTPVideoHeader& video) { RTC_DCHECK_RUN_ON(&worker_task_checker_); auto packet = std::make_unique<video_coding::PacketBuffer::Packet>( - rtp_packet, video, clock_->TimeInMilliseconds()); + rtp_packet, video, clock_->CurrentTime()); // Try to extrapolate absolute capture time if it is missing. packet->packet_info.set_absolute_capture_time( @@ -752,16 +752,16 @@ if (packet->is_first_packet_in_frame()) { first_packet = packet.get(); max_nack_count = packet->times_nacked; - min_recv_time = packet->packet_info.receive_time_ms(); - max_recv_time = packet->packet_info.receive_time_ms(); + min_recv_time = packet->packet_info.receive_time().ms(); + max_recv_time = packet->packet_info.receive_time().ms(); payloads.clear(); packet_infos.clear(); } else { max_nack_count = std::max(max_nack_count, packet->times_nacked); min_recv_time = - std::min(min_recv_time, packet->packet_info.receive_time_ms()); + std::min(min_recv_time, packet->packet_info.receive_time().ms()); max_recv_time = - std::max(max_recv_time, packet->packet_info.receive_time_ms()); + std::max(max_recv_time, packet->packet_info.receive_time().ms()); } payloads.emplace_back(packet->video_payload); packet_infos.push_back(packet->packet_info);
diff --git a/video/rtp_video_stream_receiver2.cc b/video/rtp_video_stream_receiver2.cc index fdbd5b6..5b282b4 100644 --- a/video/rtp_video_stream_receiver2.cc +++ b/video/rtp_video_stream_receiver2.cc
@@ -474,7 +474,7 @@ const RTPVideoHeader& video) { RTC_DCHECK_RUN_ON(&worker_task_checker_); auto packet = std::make_unique<video_coding::PacketBuffer::Packet>( - rtp_packet, video, clock_->TimeInMilliseconds()); + rtp_packet, video, clock_->CurrentTime()); // Try to extrapolate absolute capture time if it is missing. packet->packet_info.set_absolute_capture_time( @@ -718,16 +718,16 @@ if (packet->is_first_packet_in_frame()) { first_packet = packet.get(); max_nack_count = packet->times_nacked; - min_recv_time = packet->packet_info.receive_time_ms(); - max_recv_time = packet->packet_info.receive_time_ms(); + min_recv_time = packet->packet_info.receive_time().ms(); + max_recv_time = packet->packet_info.receive_time().ms(); payloads.clear(); packet_infos.clear(); } else { max_nack_count = std::max(max_nack_count, packet->times_nacked); min_recv_time = - std::min(min_recv_time, packet->packet_info.receive_time_ms()); + std::min(min_recv_time, packet->packet_info.receive_time().ms()); max_recv_time = - std::max(max_recv_time, packet->packet_info.receive_time_ms()); + std::max(max_recv_time, packet->packet_info.receive_time().ms()); } payloads.emplace_back(packet->video_payload); packet_infos.push_back(packet->packet_info);
diff --git a/video/video_receive_stream2_unittest.cc b/video/video_receive_stream2_unittest.cc index 7a23112..3bbc070 100644 --- a/video/video_receive_stream2_unittest.cc +++ b/video/video_receive_stream2_unittest.cc
@@ -388,16 +388,16 @@ info.set_csrcs({kCsrc}); info.set_rtp_timestamp(kRtpTimestamp); - info.set_receive_time_ms(clock_->TimeInMilliseconds() - 5000); + info.set_receive_time(clock_->CurrentTime() - TimeDelta::Millis(5000)); infos.push_back(info); - info.set_receive_time_ms(clock_->TimeInMilliseconds() - 3000); + info.set_receive_time(clock_->CurrentTime() - TimeDelta::Millis(3000)); infos.push_back(info); - info.set_receive_time_ms(clock_->TimeInMilliseconds() - 2000); + info.set_receive_time(clock_->CurrentTime() - TimeDelta::Millis(2000)); infos.push_back(info); - info.set_receive_time_ms(clock_->TimeInMilliseconds() - 4000); + info.set_receive_time(clock_->CurrentTime() - TimeDelta::Millis(1000)); infos.push_back(info); packet_infos = RtpPacketInfos(std::move(infos));
diff --git a/video/video_receive_stream_unittest.cc b/video/video_receive_stream_unittest.cc index e69820e..c320bfa 100644 --- a/video/video_receive_stream_unittest.cc +++ b/video/video_receive_stream_unittest.cc
@@ -336,16 +336,16 @@ info.set_csrcs({kCsrc}); info.set_rtp_timestamp(kRtpTimestamp); - info.set_receive_time_ms(clock_->TimeInMilliseconds() - 5000); + info.set_receive_time(clock_->CurrentTime() - TimeDelta::Millis(5000)); infos.push_back(info); - info.set_receive_time_ms(clock_->TimeInMilliseconds() - 3000); + info.set_receive_time(clock_->CurrentTime() - TimeDelta::Millis(3000)); infos.push_back(info); - info.set_receive_time_ms(clock_->TimeInMilliseconds() - 2000); + info.set_receive_time(clock_->CurrentTime() - TimeDelta::Millis(2000)); infos.push_back(info); - info.set_receive_time_ms(clock_->TimeInMilliseconds() - 4000); + info.set_receive_time(clock_->CurrentTime() - TimeDelta::Millis(4000)); infos.push_back(info); packet_infos = RtpPacketInfos(std::move(infos));