From 18d1d0f793651cb124ccb880a220bd63b13b6af4 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Tue, 16 Jan 2024 15:54:31 +0100 Subject: [PATCH] Fix perfect forwarding in RtpPacket::GetExtension Thus allow to pass output parameter by reference. Bug: None Change-Id: I64821caf72875efee62d6cfc90691070dceba775 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/334644 Auto-Submit: Danil Chapovalov Commit-Queue: Philip Eliasson Reviewed-by: Philip Eliasson Cr-Commit-Position: refs/heads/main@{#41542} --- modules/rtp_rtcp/source/rtp_packet.h | 8 +++-- .../rtp_rtcp/source/rtp_packet_unittest.cc | 35 +++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h index e91ec6368b..c002e51de6 100644 --- a/modules/rtp_rtcp/source/rtp_packet.h +++ b/modules/rtp_rtcp/source/rtp_packet.h @@ -11,6 +11,7 @@ #define MODULES_RTP_RTCP_SOURCE_RTP_PACKET_H_ #include +#include #include #include "absl/types/optional.h" @@ -127,7 +128,7 @@ class RtpPacket { bool IsRegistered() const; template - bool GetExtension(FirstValue, Values...) const; + bool GetExtension(FirstValue&&, Values&&...) const; template absl::optional GetExtension() const; @@ -231,11 +232,12 @@ bool RtpPacket::IsRegistered() const { } template -bool RtpPacket::GetExtension(FirstValue first, Values... values) const { +bool RtpPacket::GetExtension(FirstValue&& first, Values&&... values) const { auto raw = FindExtension(Extension::kId); if (raw.empty()) return false; - return Extension::Parse(raw, first, values...); + return Extension::Parse(raw, std::forward(first), + std::forward(values)...); } template diff --git a/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_unittest.cc index a1d1c9d4df..ac464493b8 100644 --- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_packet_unittest.cc @@ -903,6 +903,41 @@ TEST(RtpPacketTest, GetUncopyableExtension) { EXPECT_TRUE(rtp_packet.GetExtension(&value2)); } +struct ParseByReferenceExtension { + static constexpr RTPExtensionType kId = kRtpExtensionDependencyDescriptor; + static constexpr absl::string_view Uri() { return "uri"; } + + static size_t ValueSize(uint8_t value1, uint8_t value2) { return 2; } + static bool Write(rtc::ArrayView data, + uint8_t value1, + uint8_t value2) { + data[0] = value1; + data[1] = value2; + return true; + } + static bool Parse(rtc::ArrayView data, + uint8_t& value1, + uint8_t& value2) { + value1 = data[0]; + value2 = data[1]; + return true; + } +}; + +TEST(RtpPacketTest, GetExtensionByReference) { + RtpHeaderExtensionMap extensions; + extensions.Register(1); + RtpPacket rtp_packet(&extensions); + rtp_packet.SetExtension(13, 42); + + uint8_t value1 = 1; + uint8_t value2 = 1; + EXPECT_TRUE( + rtp_packet.GetExtension(value1, value2)); + EXPECT_EQ(int{value1}, 13); + EXPECT_EQ(int{value2}, 42); +} + TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) { // Create a packet with video frame timing extension populated. RtpPacketToSend::ExtensionManager send_extensions;