diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc index e80538bba6..ddf91f5f5a 100644 --- a/modules/rtp_rtcp/source/rtp_sender.cc +++ b/modules/rtp_rtcp/source/rtp_sender.cc @@ -919,15 +919,6 @@ bool RTPSender::SendToNetwork(std::unique_ptr packet, RTC_DCHECK(packet); int64_t now_ms = clock_->TimeInMilliseconds(); - // |capture_time_ms| <= 0 is considered invalid. - // TODO(holmer): This should be changed all over Video Engine so that negative - // time is consider invalid, while 0 is considered a valid time. - if (packet->capture_time_ms() > 0) { - packet->SetExtension( - kTimestampTicksPerMs * (now_ms - packet->capture_time_ms())); - } - packet->SetExtension(AbsoluteSendTime::MsTo24Bits(now_ms)); - if (video_) { BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "VideoTotBitrate_kbps", now_ms, ActualSendBitrateKbit(), packet->Ssrc()); @@ -971,6 +962,20 @@ bool RTPSender::SendToNetwork(std::unique_ptr packet, PacketOptions options; options.is_retransmit = false; + // |capture_time_ms| <= 0 is considered invalid. + // TODO(holmer): This should be changed all over Video Engine so that negative + // time is consider invalid, while 0 is considered a valid time. + if (packet->capture_time_ms() > 0) { + packet->SetExtension( + kTimestampTicksPerMs * (now_ms - packet->capture_time_ms())); + + if (populate_network2_timestamp_ && + packet->HasExtension()) { + packet->set_network2_time_ms(now_ms); + } + } + packet->SetExtension(AbsoluteSendTime::MsTo24Bits(now_ms)); + bool has_transport_seq_num; { rtc::CritScope lock(&send_critsect_); diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc index f30b383e49..a687bcbb35 100644 --- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc @@ -690,8 +690,8 @@ TEST_P(RtpSenderTest, WritesPacerExitToTimingExtension) { EXPECT_EQ(kStoredTimeInMs, video_timing.pacer_exit_delta_ms); } -TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtension) { - SetUpRtpSender(true, true); +TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithPacer) { + SetUpRtpSender(/*pacer=*/true, /*populate_network2=*/true); rtp_sender_->SetStorePacketsStatus(true, 10); EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( kRtpExtensionVideoTiming, kVideoTimingExtensionId)); @@ -729,6 +729,31 @@ TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtension) { EXPECT_EQ(kPacerExitMs, video_timing.pacer_exit_delta_ms); } +TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithoutPacer) { + SetUpRtpSender(/*pacer=*/false, /*populate_network2=*/true); + EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( + kRtpExtensionVideoTiming, kVideoTimingExtensionId)); + auto packet = rtp_sender_->AllocatePacket(); + packet->SetMarker(true); + packet->set_capture_time_ms(fake_clock_.TimeInMilliseconds()); + const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true}; + packet->SetExtension(kVideoTiming); + EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get())); + + const int kPropagateTimeMs = 10; + fake_clock_.AdvanceTimeMilliseconds(kPropagateTimeMs); + + EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet), + kAllowRetransmission, + RtpPacketSender::kNormalPriority)); + + EXPECT_EQ(1, transport_.packets_sent()); + absl::optional video_timing = + transport_.last_sent_packet().GetExtension(); + ASSERT_TRUE(video_timing); + EXPECT_EQ(kPropagateTimeMs, video_timing->network2_timestamp_delta_ms); +} + TEST_P(RtpSenderTest, TrafficSmoothingWithExtensions) { EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum, _, _, _));