Update TransportSequenceNumberV2 extension to support fixed size
The initial implementation forced the sender to use different sizes of the RTP header extension depending on if a feedback request is included or not. This can be a problem if the RTP header is pre- allocated. This CL changes this so that a static size of 4 bytes can be used for the TransportSequenceNumberV2 RTP header extension. The change in the protocol to get this to work is that FeedbackRequest::sequence_count == 0 means that no feedback is requested, and FeedbackRequest::sequence_count == 1 means that feedback is requested for the current packet only. Bug: webrtc:10262 Change-Id: Ia5134b3daf49f8a5b89f6c717894f6e055f39c8e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/125420 Commit-Queue: Johannes Kron <kron@webrtc.org> Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Reviewed-by: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26985}
This commit is contained in:
committed by
Commit Bot
parent
f441ea9429
commit
0da25a1c8e
@ -851,7 +851,74 @@ TEST(RtpPacketTest, CreateAndParseTransportSequenceNumber) {
|
||||
EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
|
||||
}
|
||||
|
||||
TEST(RtpPacketTest, CreateAndParseTransportSequenceNumberWithFeedbackRequest) {
|
||||
TEST(RtpPacketTest, CreateAndParseTransportSequenceNumberV2) {
|
||||
// Create a packet with transport sequence number V2 extension populated.
|
||||
// No feedback request means that the extension will be two bytes unless it's
|
||||
// pre-allocated.
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
constexpr int kExtensionId = 1;
|
||||
extensions.Register<TransportSequenceNumberV2>(kExtensionId);
|
||||
RtpPacketToSend send_packet(&extensions);
|
||||
send_packet.SetPayloadType(kPayloadType);
|
||||
send_packet.SetSequenceNumber(kSeqNum);
|
||||
send_packet.SetTimestamp(kTimestamp);
|
||||
send_packet.SetSsrc(kSsrc);
|
||||
|
||||
constexpr int kTransportSequenceNumber = 12345;
|
||||
send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
|
||||
absl::nullopt);
|
||||
EXPECT_EQ(send_packet.GetRawExtension<TransportSequenceNumberV2>().size(),
|
||||
2u);
|
||||
|
||||
// Serialize the packet and then parse it again.
|
||||
RtpPacketReceived receive_packet(&extensions);
|
||||
EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
|
||||
|
||||
uint16_t received_transport_sequeunce_number;
|
||||
absl::optional<FeedbackRequest> received_feedback_request;
|
||||
EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
|
||||
&received_transport_sequeunce_number, &received_feedback_request));
|
||||
EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
|
||||
EXPECT_FALSE(received_feedback_request);
|
||||
}
|
||||
|
||||
TEST(RtpPacketTest, CreateAndParseTransportSequenceNumberV2Preallocated) {
|
||||
// Create a packet with transport sequence number V2 extension populated.
|
||||
// No feedback request means that the extension could be two bytes, but since
|
||||
// it's pre-allocated we don't know if it is with or without feedback request
|
||||
// therefore the size is four bytes.
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
constexpr int kExtensionId = 1;
|
||||
extensions.Register<TransportSequenceNumberV2>(kExtensionId);
|
||||
RtpPacketToSend send_packet(&extensions);
|
||||
send_packet.SetPayloadType(kPayloadType);
|
||||
send_packet.SetSequenceNumber(kSeqNum);
|
||||
send_packet.SetTimestamp(kTimestamp);
|
||||
send_packet.SetSsrc(kSsrc);
|
||||
|
||||
constexpr int kTransportSequenceNumber = 12345;
|
||||
constexpr absl::optional<FeedbackRequest> kNoFeedbackRequest =
|
||||
FeedbackRequest{/*include_timestamps=*/false, /*sequence_count=*/0};
|
||||
send_packet.ReserveExtension<TransportSequenceNumberV2>();
|
||||
send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
|
||||
kNoFeedbackRequest);
|
||||
EXPECT_EQ(send_packet.GetRawExtension<TransportSequenceNumberV2>().size(),
|
||||
4u);
|
||||
|
||||
// Serialize the packet and then parse it again.
|
||||
RtpPacketReceived receive_packet(&extensions);
|
||||
EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
|
||||
|
||||
uint16_t received_transport_sequeunce_number;
|
||||
absl::optional<FeedbackRequest> received_feedback_request;
|
||||
EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
|
||||
&received_transport_sequeunce_number, &received_feedback_request));
|
||||
EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
|
||||
EXPECT_FALSE(received_feedback_request);
|
||||
}
|
||||
|
||||
TEST(RtpPacketTest,
|
||||
CreateAndParseTransportSequenceNumberV2WithFeedbackRequest) {
|
||||
// Create a packet with TransportSequenceNumberV2 extension populated.
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
constexpr int kExtensionId = 1;
|
||||
|
||||
Reference in New Issue
Block a user