diff --git a/api/call/transport.h b/api/call/transport.h index 216251f368..c27377f17f 100644 --- a/api/call/transport.h +++ b/api/call/transport.h @@ -25,9 +25,9 @@ struct PacketOptions { PacketOptions(const PacketOptions&); ~PacketOptions(); - // A 16 bits positive id. Negative ids are invalid and should be interpreted + // Negative ids are invalid and should be interpreted // as packet_id not being set. - int packet_id = -1; + int64_t packet_id = -1; // Whether this is a retransmission of an earlier packet. bool is_retransmit = false; bool included_in_feedback = false; diff --git a/modules/rtp_rtcp/source/rtp_sender_egress.cc b/modules/rtp_rtcp/source/rtp_sender_egress.cc index 46b66103c0..58ac0f819d 100644 --- a/modules/rtp_rtcp/source/rtp_sender_egress.cc +++ b/modules/rtp_rtcp/source/rtp_sender_egress.cc @@ -253,13 +253,24 @@ void RtpSenderEgress::CompleteSendPacket(const Packet& compound_packet, // Downstream code actually uses this flag to distinguish between media and // everything else. options.is_retransmit = !is_media; + + // Set Packet id from transport sequence number header extension if it is + // used. The source of the header extension is + // RtpPacketToSend::transport_sequence_number(), but the extension is only 16 + // bit and will wrap. We should be able to use the 64bit value as id, but in + // order to not change behaviour we use the 16bit extension value if it is + // used. absl::optional packet_id = packet->GetExtension(); if (packet_id.has_value()) { options.packet_id = *packet_id; options.included_in_feedback = true; options.included_in_allocation = true; - AddPacketToTransportFeedback(*packet_id, *packet, pacing_info); + } else if (packet->transport_sequence_number()) { + options.packet_id = *packet->transport_sequence_number(); + } + if (options.packet_id >= 0) { + AddPacketToTransportFeedback(options.packet_id, *packet, pacing_info); } if (packet->packet_type() != RtpPacketMediaType::kPadding && diff --git a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc index f648cb4b07..a3cf61226c 100644 --- a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc @@ -820,6 +820,46 @@ TEST_F(RtpSenderEgressTest, SendPacketSetsPacketOptions) { EXPECT_TRUE(transport_.last_packet()->options.is_retransmit); } +TEST_F(RtpSenderEgressTest, SendPacketSetsPacketOptionsIdFromExtension) { + header_extensions_.RegisterByUri(kTransportSequenceNumberExtensionId, + TransportSequenceNumber::Uri()); + RtpSenderEgress sender(DefaultConfig(), &packet_history_); + + // 64-bit transport sequence number. + const int64_t kTransportSequenceNumber = 0xFFFF000F; + std::unique_ptr packet = BuildRtpPacket(); + packet->set_transport_sequence_number(kTransportSequenceNumber); + + EXPECT_CALL(send_packet_observer_, OnSendPacket); + sender.SendPacket(std::move(packet), PacedPacketInfo()); + + ASSERT_TRUE(transport_.last_packet().has_value()); + EXPECT_EQ( + transport_.last_packet()->packet.GetExtension(), + kTransportSequenceNumber & 0xFFFF); + PacketOptions packet_options = transport_.last_packet()->options; + // 16 bit packet id. + EXPECT_EQ(packet_options.packet_id, kTransportSequenceNumber & 0xFFFF); +} + +TEST_F(RtpSenderEgressTest, + SendPacketSetsPacketOptionsIdFromRtpSendPacketIfNotUsingExtension) { + RtpSenderEgress sender(DefaultConfig(), &packet_history_); + // 64-bit transport sequence number. + const int64_t kTransportSequenceNumber = 0xFFFF000F; + std::unique_ptr packet = BuildRtpPacket(); + packet->set_transport_sequence_number(kTransportSequenceNumber); + + EXPECT_CALL(send_packet_observer_, OnSendPacket); + sender.SendPacket(std::move(packet), PacedPacketInfo()); + + ASSERT_TRUE(transport_.last_packet().has_value()); + ASSERT_FALSE( + transport_.last_packet()->packet.HasExtension()); + PacketOptions packet_options = transport_.last_packet()->options; + EXPECT_EQ(packet_options.packet_id, kTransportSequenceNumber); +} + TEST_F(RtpSenderEgressTest, SendPacketUpdatesStats) { const size_t kPayloadSize = 1000;