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:
Johannes Kron
2019-03-06 09:34:13 +01:00
committed by Commit Bot
parent f441ea9429
commit 0da25a1c8e
6 changed files with 96 additions and 18 deletions

View File

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