Implements method on RtpPacket to extract extension.
Removing extension will be used in DatagramDtlsAdaptor to remove transport sequence number to avoid having both datagram and RTP feedback loops. The sequence number will be stored in temporary map and used to re-create RTCP fdeedback packed when we receive datagram ACK. It would enable integration of Datagram transport without any changes in the upper layers of RTP stack. Note that Datagram adaptor changes will be implemented in a separate changelist. In this change: - Implement method to remove extension by rebuilding entire packet without given extension type. - Fails if extension is not registered or not set. - Unit test Bug: webrtc:9719 Change-Id: I9d3811d5d97fadde5a294d5da643b2ebc6a8196e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/145100 Reviewed-by: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Bjorn Mellem <mellem@webrtc.org> Commit-Queue: Anton Sukhanov <sukhanov@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28530}
This commit is contained in:
committed by
Commit Bot
parent
ca5f21e293
commit
ff25b873bf
@ -1031,4 +1031,91 @@ TEST(RtpPacketTest, IsExtensionReserved) {
|
||||
EXPECT_TRUE(packet.IsExtensionReserved<TransmissionOffset>());
|
||||
}
|
||||
|
||||
// Tests that RtpPacket::RemoveExtension can successfully remove extensions.
|
||||
TEST(RtpPacketTest, RemoveMultipleExtensions) {
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
extensions.Register(kRtpExtensionTransmissionTimeOffset,
|
||||
kTransmissionOffsetExtensionId);
|
||||
extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
||||
RtpPacketToSend packet(&extensions);
|
||||
packet.SetPayloadType(kPayloadType);
|
||||
packet.SetSequenceNumber(kSeqNum);
|
||||
packet.SetTimestamp(kTimestamp);
|
||||
packet.SetSsrc(kSsrc);
|
||||
packet.SetExtension<TransmissionOffset>(kTimeOffset);
|
||||
packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
|
||||
|
||||
EXPECT_THAT(kPacketWithTOAndAL,
|
||||
ElementsAreArray(packet.data(), packet.size()));
|
||||
|
||||
// Remove one of two extensions.
|
||||
EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionAudioLevel));
|
||||
|
||||
EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
|
||||
|
||||
// Remove remaining extension.
|
||||
EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionTransmissionTimeOffset));
|
||||
|
||||
EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size()));
|
||||
}
|
||||
|
||||
// Tests that RtpPacket::RemoveExtension can successfully remove extension when
|
||||
// other extensions are present but not registered.
|
||||
TEST(RtpPacketTest, RemoveExtensionPreservesOtherUnregisteredExtensions) {
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
extensions.Register(kRtpExtensionTransmissionTimeOffset,
|
||||
kTransmissionOffsetExtensionId);
|
||||
extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
||||
RtpPacketToSend packet(&extensions);
|
||||
packet.SetPayloadType(kPayloadType);
|
||||
packet.SetSequenceNumber(kSeqNum);
|
||||
packet.SetTimestamp(kTimestamp);
|
||||
packet.SetSsrc(kSsrc);
|
||||
packet.SetExtension<TransmissionOffset>(kTimeOffset);
|
||||
packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
|
||||
|
||||
EXPECT_THAT(kPacketWithTOAndAL,
|
||||
ElementsAreArray(packet.data(), packet.size()));
|
||||
|
||||
// "Unregister" kRtpExtensionTransmissionTimeOffset.
|
||||
RtpPacketToSend::ExtensionManager extensions1;
|
||||
extensions1.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
||||
packet.IdentifyExtensions(extensions1);
|
||||
|
||||
// Make sure we can not delete extension which is set but not registered.
|
||||
EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionTransmissionTimeOffset));
|
||||
|
||||
// Remove registered extension.
|
||||
EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionAudioLevel));
|
||||
|
||||
EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
|
||||
}
|
||||
|
||||
// Tests that RtpPacket::RemoveExtension fails if extension is not present or
|
||||
// not registered and does not modify packet.
|
||||
TEST(RtpPacketTest, RemoveExtensionFailure) {
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
extensions.Register(kRtpExtensionTransmissionTimeOffset,
|
||||
kTransmissionOffsetExtensionId);
|
||||
extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
||||
RtpPacketToSend packet(&extensions);
|
||||
packet.SetPayloadType(kPayloadType);
|
||||
packet.SetSequenceNumber(kSeqNum);
|
||||
packet.SetTimestamp(kTimestamp);
|
||||
packet.SetSsrc(kSsrc);
|
||||
packet.SetExtension<TransmissionOffset>(kTimeOffset);
|
||||
|
||||
EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
|
||||
|
||||
// Try to remove extension, which was registered, but not set.
|
||||
EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionAudioLevel));
|
||||
|
||||
EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
|
||||
|
||||
// Try to remove extension, which was not registered.
|
||||
EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionPlayoutDelay));
|
||||
|
||||
EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Reference in New Issue
Block a user