diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h index aba4975b7a..3401a462be 100644 --- a/modules/rtp_rtcp/source/rtp_packet.h +++ b/modules/rtp_rtcp/source/rtp_packet.h @@ -136,6 +136,9 @@ class RtpPacket { template bool SetExtension(const Values&...); + template + bool SetRawExtension(rtc::ArrayView data); + template bool ReserveExtension(); @@ -252,6 +255,17 @@ bool RtpPacket::SetExtension(const Values&... values) { return Extension::Write(buffer, values...); } +template +bool RtpPacket::SetRawExtension(rtc::ArrayView data) { + rtc::ArrayView buffer = + AllocateExtension(Extension::kId, data.size()); + if (buffer.empty()) { + return false; + } + std::memcpy(buffer.data(), data.data(), data.size()); + return true; +} + template bool RtpPacket::ReserveExtension() { auto buffer = AllocateExtension(Extension::kId, Extension::kValueSizeBytes); diff --git a/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_unittest.cc index 8a82e98d76..1d51d75662 100644 --- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_packet_unittest.cc @@ -9,6 +9,7 @@ */ #include "common_video/test/utilities.h" #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" +#include "modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h" #include "modules/rtp_rtcp/source/rtp_header_extensions.h" #include "modules/rtp_rtcp/source/rtp_packet_received.h" #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" @@ -31,6 +32,7 @@ constexpr uint8_t kSeqNumFirstByte = kSeqNum >> 8; constexpr uint8_t kSeqNumSecondByte = kSeqNum & 0xff; constexpr uint32_t kTimestamp = 0x65431278; constexpr uint8_t kTransmissionOffsetExtensionId = 1; +constexpr uint8_t kDependencyDescriptorExtensionId = 2; constexpr uint8_t kAudioLevelExtensionId = 9; constexpr uint8_t kRtpStreamIdExtensionId = 0xa; constexpr uint8_t kRtpMidExtensionId = 0xb; @@ -1238,5 +1240,16 @@ TEST(RtpPacketTest, RemoveExtensionFailure) { EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size())); } +TEST(RtpPacketTest, SetExtensionWithArray) { + RtpPacketToSend::ExtensionManager extensions; + extensions.Register( + kDependencyDescriptorExtensionId); + RtpPacketToSend packet(&extensions); + const uint8_t extension_data[] = {1, 2, 3, 4, 5}; + packet.SetRawExtension(extension_data); + EXPECT_THAT(packet.GetRawExtension(), + ElementsAreArray(extension_data)); +} + } // namespace } // namespace webrtc