in RtpPacket packet pass rtp header extension value by const&
to allow writing DependencyDescriptor value that is not copiable.
and avoid copying RtpGenericFrameDescriptor
Bug: webrtc:10342
Change-Id: I6eefa9d06b90d7e858f224443ba6769975b556fe
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166171
Reviewed-by: Markus Handell <handellm@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30322}
diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h
index 809af0c..b3e67be 100644
--- a/modules/rtp_rtcp/source/rtp_packet.h
+++ b/modules/rtp_rtcp/source/rtp_packet.h
@@ -123,7 +123,7 @@
rtc::ArrayView<const uint8_t> GetRawExtension() const;
template <typename Extension, typename... Values>
- bool SetExtension(Values...);
+ bool SetExtension(const Values&...);
template <typename Extension>
bool ReserveExtension();
@@ -226,7 +226,7 @@
}
template <typename Extension, typename... Values>
-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 1bb4358..74736a2 100644
--- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_packet_unittest.cc
@@ -201,7 +201,6 @@
EXPECT_TRUE(parsed.GetExtension<ColorSpaceExtension>(&parsed_color_space));
EXPECT_EQ(kColorSpace, parsed_color_space);
}
-} // namespace
TEST(RtpPacketTest, CreateMinimum) {
RtpPacketToSend packet(nullptr);
@@ -751,6 +750,48 @@
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<uint8_t> data,
+ const UncopyableValue& value) {
+ return true;
+ }
+ static bool Parse(rtc::ArrayView<const uint8_t> data,
+ UncopyableValue* value) {
+ return true;
+ }
+};
+constexpr RTPExtensionType UncopyableExtension::kId;
+constexpr char UncopyableExtension::kUri[];
+
+TEST(RtpPacketTest, SetUncopyableExtension) {
+ RtpPacket::ExtensionManager extensions;
+ extensions.Register<UncopyableExtension>(1);
+ RtpPacket rtp_packet(&extensions);
+
+ UncopyableValue value;
+ EXPECT_TRUE(rtp_packet.SetExtension<UncopyableExtension>(value));
+}
+
+TEST(RtpPacketTest, GetUncopyableExtension) {
+ RtpPacket::ExtensionManager extensions;
+ extensions.Register<UncopyableExtension>(1);
+ RtpPacket rtp_packet(&extensions);
+ UncopyableValue value;
+ rtp_packet.SetExtension<UncopyableExtension>(value);
+
+ UncopyableValue value2;
+ EXPECT_TRUE(rtp_packet.GetExtension<UncopyableExtension>(&value2));
+}
+
TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) {
// Create a packet with video frame timing extension populated.
RtpPacketToSend::ExtensionManager send_extensions;
@@ -1100,4 +1141,5 @@
EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
}
+} // namespace
} // namespace webrtc