diff --git a/modules/rtp_rtcp/source/rtp_packet.cc b/modules/rtp_rtcp/source/rtp_packet.cc index 3835452759..bd5a4c25a4 100644 --- a/modules/rtp_rtcp/source/rtp_packet.cc +++ b/modules/rtp_rtcp/source/rtp_packet.cc @@ -617,4 +617,13 @@ bool RtpPacket::HasExtension(ExtensionType type) const { return !FindExtension(type).empty(); } +bool RtpPacket::IsExtensionReserved(ExtensionType type) const { + uint8_t id = extensions_.GetId(type); + if (id == ExtensionManager::kInvalidId) { + // Extension not registered. + return false; + } + return FindExtensionInfo(id) != nullptr; +} + } // namespace webrtc diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h index 8c4ddf318e..67d8df4894 100644 --- a/modules/rtp_rtcp/source/rtp_packet.h +++ b/modules/rtp_rtcp/source/rtp_packet.h @@ -99,6 +99,10 @@ class RtpPacket { bool HasExtension() const; bool HasExtension(ExtensionType type) const; + template + bool IsExtensionReserved() const; + bool IsExtensionReserved(ExtensionType type) const; + template bool GetExtension(FirstValue, Values...) const; @@ -186,6 +190,11 @@ bool RtpPacket::HasExtension() const { return HasExtension(Extension::kId); } +template +bool RtpPacket::IsExtensionReserved() const { + return IsExtensionReserved(Extension::kId); +} + template bool RtpPacket::GetExtension(FirstValue first, Values... values) const { auto raw = FindExtension(Extension::kId); diff --git a/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_unittest.cc index 84f5020ec3..86fdc500ff 100644 --- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_packet_unittest.cc @@ -952,4 +952,25 @@ TEST(RtpPacketTest, kFeedbackRequest->sequence_count); } +TEST(RtpPacketTest, IsExtensionReserved) { + // Register two extensions. + RtpPacketToSend::ExtensionManager extensions; + extensions.Register(kRtpExtensionTransmissionTimeOffset, + kTransmissionOffsetExtensionId); + extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); + + RtpPacketReceived packet(&extensions); + + // Reserve slot for only one of them. + EXPECT_TRUE(packet.ReserveExtension()); + // Non-registered extension cannot be reserved. + EXPECT_FALSE(packet.ReserveExtension()); + + // Only the extension that is both registered and reserved matches + // IsExtensionReserved(). + EXPECT_FALSE(packet.IsExtensionReserved()); + EXPECT_FALSE(packet.IsExtensionReserved()); + EXPECT_TRUE(packet.IsExtensionReserved()); +} + } // namespace webrtc