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}
This commit is contained in:
Danil Chapovalov
2020-01-17 12:59:15 +01:00
committed by Commit Bot
parent 7356a5666d
commit cea929923b
2 changed files with 45 additions and 3 deletions

View File

@ -123,7 +123,7 @@ class RtpPacket {
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 @@ rtc::ArrayView<const uint8_t> RtpPacket::GetRawExtension() const {
}
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())

View File

@ -201,7 +201,6 @@ void TestCreateAndParseColorSpaceExtension(bool with_hdr_metadata) {
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 @@ 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<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 @@ TEST(RtpPacketTest, RemoveExtensionFailure) {
EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
}
} // namespace
} // namespace webrtc