diff --git a/modules/rtp_rtcp/source/rtp_sender_egress.cc b/modules/rtp_rtcp/source/rtp_sender_egress.cc index 22da99b786..a4aa7482f1 100644 --- a/modules/rtp_rtcp/source/rtp_sender_egress.cc +++ b/modules/rtp_rtcp/source/rtp_sender_egress.cc @@ -208,8 +208,9 @@ void RtpSenderEgress::SendPacket(std::unique_ptr packet, // In case of VideoTimingExtension, since it's present not in every packet, // data after rtp header may be corrupted if these packets are protected by // the FEC. - TimeDelta diff = now - packet->capture_time(); - if (packet->HasExtension()) { + if (packet->HasExtension() && + packet->capture_time() > Timestamp::Zero()) { + TimeDelta diff = now - packet->capture_time(); packet->SetExtension(kTimestampTicksPerMs * diff.ms()); } if (packet->HasExtension()) { diff --git a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc index 75f18354ec..a31ee37c43 100644 --- a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc @@ -309,6 +309,26 @@ TEST_F(RtpSenderEgressTest, EXPECT_TRUE(transport_.last_packet()->options.included_in_allocation); } +TEST_F(RtpSenderEgressTest, + DoesntWriteTransmissionOffsetOnRtxPaddingBeforeMedia) { + header_extensions_.RegisterByUri(kTransmissionOffsetExtensionId, + TransmissionOffset::Uri()); + + // Prior to sending media, timestamps are 0. + std::unique_ptr padding = + BuildRtpPacket(/*marker_bit=*/true, /*capture_time_ms=*/0); + padding->set_packet_type(RtpPacketMediaType::kPadding); + padding->SetSsrc(kRtxSsrc); + EXPECT_TRUE(padding->HasExtension()); + + std::unique_ptr sender = CreateRtpSenderEgress(); + sender->SendPacket(std::move(padding), PacedPacketInfo()); + + absl::optional offset = + transport_.last_packet()->packet.GetExtension(); + EXPECT_EQ(offset, 0); +} + TEST_F(RtpSenderEgressTest, OnSendSideDelayUpdated) { StrictMock send_side_delay_observer; RtpRtcpInterface::Configuration config = DefaultConfig();