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:
parent
0280ceb1b6
commit
a09331a603
@ -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>()) {
|
||||
|
||||
@ -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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user