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}
This commit is contained in:
Andreas Pehrson 2023-05-12 09:36:34 +02:00 committed by WebRTC LUCI CQ
parent 0280ceb1b6
commit a09331a603
2 changed files with 23 additions and 2 deletions

View File

@ -208,8 +208,9 @@ void RtpSenderEgress::SendPacket(std::unique_ptr<RtpPacketToSend> 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<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>()) {

View File

@ -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<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();