Avoid assembling complicated but unused video rtp header extensions

Bug: chromium:1219407
Change-Id: I017de10813a1e80f4af0ba55d8d1aa73077dd131
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/222615
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34326}
This commit is contained in:
Danil Chapovalov 2021-06-17 15:27:12 +02:00 committed by WebRTC LUCI CQ
parent afb28116d3
commit 7d5418233d
3 changed files with 45 additions and 3 deletions

View File

@ -114,6 +114,11 @@ class RtpPacket {
bool HasExtension() const;
bool HasExtension(ExtensionType type) const;
// Returns whether there is an associated id for the extension and thus it is
// possible to set the extension.
template <typename Extension>
bool IsRegistered() const;
template <typename Extension, typename FirstValue, typename... Values>
bool GetExtension(FirstValue, Values...) const;
@ -207,6 +212,11 @@ bool RtpPacket::HasExtension() const {
return HasExtension(Extension::kId);
}
template <typename Extension>
bool RtpPacket::IsRegistered() const {
return extensions_.IsRegistered(Extension::kId);
}
template <typename Extension, typename FirstValue, typename... Values>
bool RtpPacket::GetExtension(FirstValue first, Values... values) const {
auto raw = FindExtension(Extension::kId);

View File

@ -354,6 +354,35 @@ TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) {
EXPECT_EQ(read, kValue);
}
TEST(RtpPacketTest, SetsRegisteredExtension) {
RtpPacketToSend::ExtensionManager extensions;
extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
RtpPacketToSend packet(&extensions);
EXPECT_TRUE(packet.IsRegistered<TransmissionOffset>());
EXPECT_FALSE(packet.HasExtension<TransmissionOffset>());
// Try to set the extensions.
EXPECT_TRUE(packet.SetExtension<TransmissionOffset>(kTimeOffset));
EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
EXPECT_EQ(packet.GetExtension<TransmissionOffset>(), kTimeOffset);
}
TEST(RtpPacketTest, FailsToSetUnregisteredExtension) {
RtpPacketToSend::ExtensionManager extensions;
extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
RtpPacketToSend packet(&extensions);
EXPECT_FALSE(packet.IsRegistered<TransportSequenceNumber>());
EXPECT_FALSE(packet.HasExtension<TransportSequenceNumber>());
EXPECT_FALSE(packet.SetExtension<TransportSequenceNumber>(42));
EXPECT_FALSE(packet.HasExtension<TransportSequenceNumber>());
EXPECT_EQ(packet.GetExtension<TransportSequenceNumber>(), absl::nullopt);
}
TEST(RtpPacketTest, SetReservedExtensionsAfterPayload) {
const size_t kPayloadSize = 4;
RtpPacketToSend::ExtensionManager extensions;

View File

@ -361,7 +361,8 @@ void RTPSenderVideo::AddRtpHeaderExtensions(
if (video_header.generic) {
bool extension_is_set = false;
if (video_structure_ != nullptr) {
if (packet->IsRegistered<RtpDependencyDescriptorExtension>() &&
video_structure_ != nullptr) {
DependencyDescriptor descriptor;
descriptor.first_packet_in_frame = first_packet;
descriptor.last_packet_in_frame = last_packet;
@ -407,7 +408,8 @@ void RTPSenderVideo::AddRtpHeaderExtensions(
}
// Do not use generic frame descriptor when dependency descriptor is stored.
if (!extension_is_set) {
if (packet->IsRegistered<RtpGenericFrameDescriptorExtension00>() &&
!extension_is_set) {
RtpGenericFrameDescriptor generic_descriptor;
generic_descriptor.SetFirstPacketInSubFrame(first_packet);
generic_descriptor.SetLastPacketInSubFrame(last_packet);
@ -437,7 +439,8 @@ void RTPSenderVideo::AddRtpHeaderExtensions(
}
}
if (first_packet &&
if (packet->IsRegistered<RtpVideoLayersAllocationExtension>() &&
first_packet &&
send_allocation_ != SendVideoLayersAllocation::kDontSend &&
(video_header.frame_type == VideoFrameType::kVideoFrameKey ||
PacketWillLikelyBeRequestedForRestransmitionIfLost(video_header))) {