Add RtpPacket::GetRawExtension function

to extract byte representation of a built extension without rebuilding it.

Bug: webrtc:9361
Change-Id: I5e2a5caeb8ff28dcb58dc25d53407c449c86df44
Reviewed-on: https://webrtc-review.googlesource.com/102940
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24925}
This commit is contained in:
Danil Chapovalov
2018-10-01 16:12:28 +02:00
committed by Commit Bot
parent 73d117f64e
commit e19953bdcb
2 changed files with 43 additions and 0 deletions

View File

@ -97,6 +97,10 @@ class RtpPacket {
template <typename Extension, typename... Values>
bool GetExtension(Values...) const;
// Returns view of the raw extension or empty view on failure.
template <typename Extension>
rtc::ArrayView<const uint8_t> GetRawExtension() const;
template <typename Extension, typename... Values>
bool SetExtension(Values...);
@ -175,6 +179,11 @@ bool RtpPacket::GetExtension(Values... values) const {
return Extension::Parse(raw, values...);
}
template <typename Extension>
rtc::ArrayView<const uint8_t> RtpPacket::GetRawExtension() const {
return FindExtension(Extension::kId);
}
template <typename Extension, typename... Values>
bool RtpPacket::SetExtension(Values... values) {
const size_t value_size = Extension::ValueSize(values...);

View File

@ -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<RtpMid>(1);
RtpPacket packet(&extensions);
ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
EXPECT_THAT(packet.GetRawExtension<RtpMid>(), 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<RtpMid>(2);
RtpPacket packet(&extensions);
ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
EXPECT_THAT(packet.GetRawExtension<RtpMid>(), IsEmpty());
}
TEST(RtpPacketTest, ParseWithInvalidSizedExtension) {
RtpPacketToSend::ExtensionManager extensions;
extensions.Register(kRtpExtensionTransmissionTimeOffset,