Set webrtc::PacketOptions.packet_id from

RtpPacketToSend::transport_sequence_number

packed_id is set to be 64 bit to align with rtc::PacketOptions.
packet_id is only set to RtpPacketToSend::transport_sequence_number if
TransportSequenceNumber header extension is not used in order to not
change current behaviour.

Bug: webrtc:15368
Change-Id: Ia532714226421422bdb292f8dd34b175560e9dc6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/344160
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41950}
This commit is contained in:
Per K 2024-03-22 10:40:05 +01:00 committed by WebRTC LUCI CQ
parent 1cb32aa550
commit ce2b49552e
3 changed files with 54 additions and 3 deletions

View file

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

View file

@ -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<uint16_t> packet_id =
packet->GetExtension<TransportSequenceNumber>();
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 &&

View file

@ -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<RtpPacketToSend> 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<TransportSequenceNumber>(),
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<RtpPacketToSend> 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<TransportSequenceNumber>());
PacketOptions packet_options = transport_.last_packet()->options;
EXPECT_EQ(packet_options.packet_id, kTransportSequenceNumber);
}
TEST_F(RtpSenderEgressTest, SendPacketUpdatesStats) {
const size_t kPayloadSize = 1000;