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
@ -166,10 +166,13 @@ bool TransportSequenceNumber::Write(rtc::ArrayView<uint8_t> data,
|
||||
// +-+-+-+-+-+-+-+-+
|
||||
//
|
||||
// The bit |T| determines whether the feedback should include timing information
|
||||
// or not and |seq_count| determines how many additional packets the feedback
|
||||
// packet should cover.
|
||||
// or not and |seq_count| determines how many packets the feedback packet should
|
||||
// cover including the current packet. If |seq_count| is zero no feedback is
|
||||
// requested.
|
||||
constexpr RTPExtensionType TransportSequenceNumberV2::kId;
|
||||
constexpr uint8_t TransportSequenceNumberV2::kValueSizeBytesWithFeedbackRequest;
|
||||
constexpr uint8_t TransportSequenceNumberV2::kValueSizeBytes;
|
||||
constexpr uint8_t
|
||||
TransportSequenceNumberV2::kValueSizeBytesWithoutFeedbackRequest;
|
||||
constexpr const char TransportSequenceNumberV2::kUri[];
|
||||
constexpr uint16_t TransportSequenceNumberV2::kIncludeTimestampsBit;
|
||||
|
||||
@ -177,21 +180,24 @@ bool TransportSequenceNumberV2::Parse(
|
||||
rtc::ArrayView<const uint8_t> data,
|
||||
uint16_t* transport_sequence_number,
|
||||
absl::optional<FeedbackRequest>* feedback_request) {
|
||||
if (data.size() != TransportSequenceNumber::kValueSizeBytes &&
|
||||
data.size() != kValueSizeBytesWithFeedbackRequest)
|
||||
if (data.size() != kValueSizeBytes &&
|
||||
data.size() != kValueSizeBytesWithoutFeedbackRequest)
|
||||
return false;
|
||||
|
||||
*transport_sequence_number = ByteReader<uint16_t>::ReadBigEndian(data.data());
|
||||
|
||||
if (data.size() == kValueSizeBytesWithFeedbackRequest) {
|
||||
*feedback_request = absl::nullopt;
|
||||
if (data.size() == kValueSizeBytes) {
|
||||
uint16_t feedback_request_raw =
|
||||
ByteReader<uint16_t>::ReadBigEndian(data.data() + 2);
|
||||
bool include_timestamps =
|
||||
(feedback_request_raw & kIncludeTimestampsBit) != 0;
|
||||
uint16_t sequence_count = feedback_request_raw & ~kIncludeTimestampsBit;
|
||||
*feedback_request = {include_timestamps, sequence_count};
|
||||
} else {
|
||||
*feedback_request = absl::nullopt;
|
||||
|
||||
// If |sequence_count| is zero no feedback is requested.
|
||||
if (sequence_count != 0) {
|
||||
*feedback_request = {include_timestamps, sequence_count};
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user