diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h index 809af0c327..b3e67be7cf 100644 --- a/modules/rtp_rtcp/source/rtp_packet.h +++ b/modules/rtp_rtcp/source/rtp_packet.h @@ -123,7 +123,7 @@ class RtpPacket { rtc::ArrayView GetRawExtension() const; template - bool SetExtension(Values...); + bool SetExtension(const Values&...); template bool ReserveExtension(); @@ -226,7 +226,7 @@ rtc::ArrayView RtpPacket::GetRawExtension() const { } template -bool RtpPacket::SetExtension(Values... values) { +bool RtpPacket::SetExtension(const Values&... values) { const size_t value_size = Extension::ValueSize(values...); auto buffer = AllocateExtension(Extension::kId, value_size); if (buffer.empty()) diff --git a/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_unittest.cc index 1bb4358c6d..74736a2ab7 100644 --- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_packet_unittest.cc @@ -201,7 +201,6 @@ void TestCreateAndParseColorSpaceExtension(bool with_hdr_metadata) { EXPECT_TRUE(parsed.GetExtension(&parsed_color_space)); EXPECT_EQ(kColorSpace, parsed_color_space); } -} // namespace TEST(RtpPacketTest, CreateMinimum) { RtpPacketToSend packet(nullptr); @@ -751,6 +750,48 @@ TEST(RtpPacketTest, ParseWithMid) { EXPECT_EQ(mid, kMid); } +struct UncopyableValue { + UncopyableValue() = default; + UncopyableValue(const UncopyableValue&) = delete; + UncopyableValue& operator=(const UncopyableValue&) = delete; +}; +struct UncopyableExtension { + static constexpr RTPExtensionType kId = kRtpExtensionGenericFrameDescriptor02; + static constexpr char kUri[] = "uri"; + + static size_t ValueSize(const UncopyableValue& value) { return 1; } + static bool Write(rtc::ArrayView data, + const UncopyableValue& value) { + return true; + } + static bool Parse(rtc::ArrayView data, + UncopyableValue* value) { + return true; + } +}; +constexpr RTPExtensionType UncopyableExtension::kId; +constexpr char UncopyableExtension::kUri[]; + +TEST(RtpPacketTest, SetUncopyableExtension) { + RtpPacket::ExtensionManager extensions; + extensions.Register(1); + RtpPacket rtp_packet(&extensions); + + UncopyableValue value; + EXPECT_TRUE(rtp_packet.SetExtension(value)); +} + +TEST(RtpPacketTest, GetUncopyableExtension) { + RtpPacket::ExtensionManager extensions; + extensions.Register(1); + RtpPacket rtp_packet(&extensions); + UncopyableValue value; + rtp_packet.SetExtension(value); + + UncopyableValue value2; + EXPECT_TRUE(rtp_packet.GetExtension(&value2)); +} + TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) { // Create a packet with video frame timing extension populated. RtpPacketToSend::ExtensionManager send_extensions; @@ -1100,4 +1141,5 @@ TEST(RtpPacketTest, RemoveExtensionFailure) { EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size())); } +} // namespace } // namespace webrtc