Don't write TransmissionOffset when capture time is not set

RTX padding packets sent before media packets can legitimately have no
timestamps set (they are 0). Writing the TransmissionOffset extension
with capture time 0 will overflow once current time exceeds ~3 minutes.

Bug: webrtc:15172
Change-Id: I4dd1f341802d45016549b330f0e08cd3a00cfa19
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/305020
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40055}
diff --git a/modules/rtp_rtcp/source/rtp_sender_egress.cc b/modules/rtp_rtcp/source/rtp_sender_egress.cc
index 22da99b..a4aa748 100644
--- a/modules/rtp_rtcp/source/rtp_sender_egress.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_egress.cc
@@ -208,8 +208,9 @@
   // 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<TransmissionOffset>()) {
+  if (packet->HasExtension<TransmissionOffset>() &&
+      packet->capture_time() > Timestamp::Zero()) {
+    TimeDelta diff = now - packet->capture_time();
     packet->SetExtension<TransmissionOffset>(kTimestampTicksPerMs * diff.ms());
   }
   if (packet->HasExtension<AbsoluteSendTime>()) {
diff --git a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
index 75f1835..a31ee37 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 @@
   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<RtpPacketToSend> padding =
+      BuildRtpPacket(/*marker_bit=*/true, /*capture_time_ms=*/0);
+  padding->set_packet_type(RtpPacketMediaType::kPadding);
+  padding->SetSsrc(kRtxSsrc);
+  EXPECT_TRUE(padding->HasExtension<TransmissionOffset>());
+
+  std::unique_ptr<RtpSenderEgress> sender = CreateRtpSenderEgress();
+  sender->SendPacket(std::move(padding), PacedPacketInfo());
+
+  absl::optional<int32_t> offset =
+      transport_.last_packet()->packet.GetExtension<TransmissionOffset>();
+  EXPECT_EQ(offset, 0);
+}
+
 TEST_F(RtpSenderEgressTest, OnSendSideDelayUpdated) {
   StrictMock<MockSendSideDelayObserver> send_side_delay_observer;
   RtpRtcpInterface::Configuration config = DefaultConfig();