diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h index ad421dc216..9aea1e6d31 100644 --- a/modules/rtp_rtcp/source/rtp_packet.h +++ b/modules/rtp_rtcp/source/rtp_packet.h @@ -97,6 +97,10 @@ class RtpPacket { template bool GetExtension(Values...) const; + // Returns view of the raw extension or empty view on failure. + template + rtc::ArrayView GetRawExtension() const; + template bool SetExtension(Values...); @@ -175,6 +179,11 @@ bool RtpPacket::GetExtension(Values... values) const { return Extension::Parse(raw, values...); } +template +rtc::ArrayView RtpPacket::GetRawExtension() const { + return FindExtension(Extension::kId); +} + template bool RtpPacket::SetExtension(Values... values) { const size_t value_size = Extension::ValueSize(values...); diff --git a/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_unittest.cc index 67a13dc0fc..0fd500191f 100644 --- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_packet_unittest.cc @@ -18,6 +18,8 @@ namespace webrtc { namespace { + +using ::testing::ElementsAre; using ::testing::ElementsAreArray; using ::testing::IsEmpty; using ::testing::make_tuple; @@ -357,6 +359,38 @@ TEST(RtpPacketTest, ParseWithExtension) { EXPECT_EQ(0u, packet.padding_size()); } +TEST(RtpPacketTest, GetRawExtensionWhenPresent) { + constexpr uint8_t kRawPacket[] = { + // comment for clang-format to align kRawPacket nicer. + 0x90, 100, 0x5e, 0x04, // + 0x65, 0x43, 0x12, 0x78, // Timestamp. + 0x12, 0x34, 0x56, 0x78, // Ssrc + 0xbe, 0xde, 0x00, 0x01, // Extension header + 0x12, 'm', 'i', 'd', // 3-byte extension with id=1. + 'p', 'a', 'y', 'l', 'o', 'a', 'd'}; + RtpPacketToSend::ExtensionManager extensions; + extensions.Register(1); + RtpPacket packet(&extensions); + ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket))); + EXPECT_THAT(packet.GetRawExtension(), ElementsAre('m', 'i', 'd')); +} + +TEST(RtpPacketTest, GetRawExtensionWhenAbsent) { + constexpr uint8_t kRawPacket[] = { + // comment for clang-format to align kRawPacket nicer. + 0x90, 100, 0x5e, 0x04, // + 0x65, 0x43, 0x12, 0x78, // Timestamp. + 0x12, 0x34, 0x56, 0x78, // Ssrc + 0xbe, 0xde, 0x00, 0x01, // Extension header + 0x12, 'm', 'i', 'd', // 3-byte extension with id=1. + 'p', 'a', 'y', 'l', 'o', 'a', 'd'}; + RtpPacketToSend::ExtensionManager extensions; + extensions.Register(2); + RtpPacket packet(&extensions); + ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket))); + EXPECT_THAT(packet.GetRawExtension(), IsEmpty()); +} + TEST(RtpPacketTest, ParseWithInvalidSizedExtension) { RtpPacketToSend::ExtensionManager extensions; extensions.Register(kRtpExtensionTransmissionTimeOffset,