diff --git a/modules/rtp_rtcp/source/rtp_packet.cc b/modules/rtp_rtcp/source/rtp_packet.cc index 878942b62f..9b5bc8671b 100644 --- a/modules/rtp_rtcp/source/rtp_packet.cc +++ b/modules/rtp_rtcp/source/rtp_packet.cc @@ -251,37 +251,7 @@ void RtpPacket::SetCsrcs(const std::vector& csrcs) { buffer_.SetSize(payload_offset_); } -bool RtpPacket::HasRawExtension(int id) const { - if (id == ExtensionManager::kInvalidId) - return false; - RTC_DCHECK_GE(id, kMinExtensionId); - RTC_DCHECK_LE(id, kMaxExtensionId); - return extension_entries_[id - 1].offset != 0; -} - -rtc::ArrayView RtpPacket::GetRawExtension(int id) const { - if (id == ExtensionManager::kInvalidId) - return nullptr; - RTC_DCHECK_GE(id, kMinExtensionId); - RTC_DCHECK_LE(id, kMaxExtensionId); - const ExtensionInfo& extension = extension_entries_[id - 1]; - if (extension.offset == 0) - return nullptr; - return rtc::MakeArrayView(data() + extension.offset, extension.length); -} - -bool RtpPacket::SetRawExtension(int id, rtc::ArrayView data) { - auto buffer = AllocateRawExtension(id, data.size()); - if (buffer.empty()) - return false; - RTC_DCHECK_EQ(buffer.size(), data.size()); - memcpy(buffer.data(), data.data(), data.size()); - return true; -} - rtc::ArrayView RtpPacket::AllocateRawExtension(int id, size_t length) { - if (id == ExtensionManager::kInvalidId) - return nullptr; RTC_DCHECK_GE(id, kMinExtensionId); RTC_DCHECK_LE(id, kMaxExtensionId); RTC_DCHECK_GE(length, 1); diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h index 2f0ef75418..64a4bcb0ae 100644 --- a/modules/rtp_rtcp/source/rtp_packet.h +++ b/modules/rtp_rtcp/source/rtp_packet.h @@ -102,21 +102,6 @@ class RtpPacket { template bool ReserveExtension(); - // Following 4 helpers identify rtp header extension by |id| negotiated with - // remote peer and written in an rtp packet. - bool HasRawExtension(int id) const; - - // Returns place where extension with |id| is stored. - // Returns empty arrayview if extension is not present. - rtc::ArrayView GetRawExtension(int id) const; - - // Allocates and store header extension. Returns true on success. - bool SetRawExtension(int id, rtc::ArrayView data); - - // Allocates and returns place to store rtp header extension. - // Returns empty arrayview on failure. - rtc::ArrayView AllocateRawExtension(int id, size_t length); - // Reserve size_bytes for payload. Returns nullptr on failure. uint8_t* SetPayloadSize(size_t size_bytes); // Same as SetPayloadSize but doesn't guarantee to keep current payload. @@ -138,6 +123,10 @@ class RtpPacket { // Returns view of the raw extension or empty view on failure. rtc::ArrayView FindExtension(ExtensionType type) const; + // Allocates and returns place to store rtp header extension. + // Returns empty arrayview on failure. + rtc::ArrayView AllocateRawExtension(int id, size_t length); + // Find or allocate an extension |type|. Returns view of size |length| // to write raw extension to or an empty view on failure. rtc::ArrayView AllocateExtension(ExtensionType type, size_t length); diff --git a/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_unittest.cc index 60d23d856b..e19f191439 100644 --- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_packet_unittest.cc @@ -196,50 +196,27 @@ TEST(RtpPacketTest, TryToCreateWithLongMid) { EXPECT_FALSE(packet.SetExtension(kLongMid)); } -TEST(RtpPacketTest, CreateWithExtensionsWithoutManager) { - RtpPacketToSend packet(nullptr); - packet.SetPayloadType(kPayloadType); - packet.SetSequenceNumber(kSeqNum); - packet.SetTimestamp(kTimestamp); - packet.SetSsrc(kSsrc); - - auto raw = packet.AllocateRawExtension(kTransmissionOffsetExtensionId, - TransmissionOffset::kValueSizeBytes); - EXPECT_EQ(raw.size(), TransmissionOffset::kValueSizeBytes); - TransmissionOffset::Write(raw, kTimeOffset); - - raw = packet.AllocateRawExtension(kAudioLevelExtensionId, - AudioLevel::kValueSizeBytes); - EXPECT_EQ(raw.size(), AudioLevel::kValueSizeBytes); - AudioLevel::Write(raw, kVoiceActive, kAudioLevel); - - EXPECT_THAT(kPacketWithTOAndAL, - ElementsAreArray(packet.data(), packet.size())); -} - TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) { - const size_t kMaxExtensionSize = 16; - const int kId = 1; - const uint8_t kValue[16] = "123456789abcdef"; + const std::string kValue = "123456789abcdef"; + RtpPacket::ExtensionManager extensions; + extensions.Register(1); + extensions.Register(2); - // Write packet with a custom extension. - RtpPacketToSend packet(nullptr); - packet.SetRawExtension(kId, kValue); - // Using different size for same id is not allowed. - EXPECT_TRUE(packet.AllocateRawExtension(kId, kMaxExtensionSize - 1).empty()); + RtpPacket packet(&extensions); + EXPECT_TRUE(packet.SetExtension(kValue)); packet.SetPayloadSize(42); // Rewriting allocated extension is allowed. - EXPECT_EQ(packet.AllocateRawExtension(kId, kMaxExtensionSize).size(), - kMaxExtensionSize); + EXPECT_TRUE(packet.SetExtension(kValue)); // Adding another extension after payload is set is not allowed. - EXPECT_TRUE(packet.AllocateRawExtension(kId + 1, kMaxExtensionSize).empty()); + EXPECT_FALSE(packet.SetExtension(kValue)); - // Read packet with the custom extension. - RtpPacketReceived parsed; + // Read packet with the extension. + RtpPacketReceived parsed(&extensions); EXPECT_TRUE(parsed.Parse(packet.Buffer())); - auto read_raw = parsed.GetRawExtension(kId); - EXPECT_THAT(read_raw, ElementsAreArray(kValue, kMaxExtensionSize)); + std::string read; + EXPECT_TRUE(parsed.GetExtension(&read)); + EXPECT_EQ(read, kValue); } TEST(RtpPacketTest, SetReservedExtensionsAfterPayload) { @@ -426,23 +403,6 @@ TEST(RtpPacketTest, ParseWithExtensionDelayed) { EXPECT_EQ(0u, packet.padding_size()); } -TEST(RtpPacketTest, ParseWithoutExtensionManager) { - RtpPacketReceived packet; - EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO))); - - EXPECT_FALSE(packet.HasRawExtension(kAudioLevelExtensionId)); - EXPECT_TRUE(packet.GetRawExtension(kAudioLevelExtensionId).empty()); - - EXPECT_TRUE(packet.HasRawExtension(kTransmissionOffsetExtensionId)); - - int32_t time_offset = 0; - auto raw_extension = packet.GetRawExtension(kTransmissionOffsetExtensionId); - EXPECT_EQ(raw_extension.size(), TransmissionOffset::kValueSizeBytes); - EXPECT_TRUE(TransmissionOffset::Parse(raw_extension, &time_offset)); - - EXPECT_EQ(time_offset, kTimeOffset); -} - TEST(RtpPacketTest, ParseDynamicSizeExtension) { // clang-format off const uint8_t kPacket1[] = { @@ -493,23 +453,6 @@ TEST(RtpPacketTest, ParseWithMid) { EXPECT_EQ(mid, kMid); } -TEST(RtpPacketTest, RawExtensionFunctionsAcceptZeroIdAndReturnFalse) { - RtpPacketReceived::ExtensionManager extensions; - RtpPacketReceived packet(&extensions); - // Use ExtensionManager to set kInvalidId to 0 to demonstrate natural way for - // using zero value as a parameter to Packet::*RawExtension functions. - const int kInvalidId = extensions.GetId(TransmissionOffset::kId); - ASSERT_EQ(kInvalidId, 0); - - ASSERT_TRUE(packet.Parse(kPacket, sizeof(kPacket))); - - EXPECT_FALSE(packet.HasRawExtension(kInvalidId)); - EXPECT_THAT(packet.GetRawExtension(kInvalidId), IsEmpty()); - const uint8_t kExtension[] = {'e', 'x', 't'}; - EXPECT_FALSE(packet.SetRawExtension(kInvalidId, kExtension)); - EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); -} - TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) { // Create a packet with video frame timing extension populated. RtpPacketToSend::ExtensionManager send_extensions;