Add support for sending RTP two-byte header extensions.
Automatic detection if one-byte header or two-byte header should be used based on extension ID and extension length. Bug: webrtc:7990 Change-Id: I9fc848ecc59458d1ca97bace0e57ea04d3d0ced6 Reviewed-on: https://webrtc-review.googlesource.com/c/103422 Commit-Queue: Johannes Kron <kron@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Reviewed-by: Seth Hampson <shampson@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25004}
This commit is contained in:
committed by
Commit Bot
parent
7880be1799
commit
78cdde3df6
@ -64,6 +64,27 @@ constexpr uint8_t kPacketWithTOAndAL[] = {
|
||||
0x12, 0x00, 0x56, 0xce,
|
||||
0x90, 0x80|kAudioLevel, 0x00, 0x00};
|
||||
|
||||
constexpr uint8_t kPacketWithTwoByteExtensionIdLast[] = {
|
||||
0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
|
||||
0x65, 0x43, 0x12, 0x78,
|
||||
0x12, 0x34, 0x56, 0x78,
|
||||
0x10, 0x00, 0x00, 0x04,
|
||||
0x01, 0x03, 0x00, 0x56,
|
||||
0xce, 0x09, 0x01, 0x80|kAudioLevel,
|
||||
kTwoByteExtensionId, 0x03, 0x00, 0x30, // => 0x00 0x30 0x22
|
||||
0x22, 0x00, 0x00, 0x00}; // => Playout delay.min_ms = 3*10
|
||||
// => Playout delay.max_ms = 34*10
|
||||
|
||||
constexpr uint8_t kPacketWithTwoByteExtensionIdFirst[] = {
|
||||
0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
|
||||
0x65, 0x43, 0x12, 0x78,
|
||||
0x12, 0x34, 0x56, 0x78,
|
||||
0x10, 0x00, 0x00, 0x04,
|
||||
kTwoByteExtensionId, 0x03, 0x00, 0x30, // => 0x00 0x30 0x22
|
||||
0x22, 0x01, 0x03, 0x00, // => Playout delay.min_ms = 3*10
|
||||
0x56, 0xce, 0x09, 0x01, // => Playout delay.max_ms = 34*10
|
||||
0x80|kAudioLevel, 0x00, 0x00, 0x00};
|
||||
|
||||
constexpr uint8_t kPacketWithTOAndALInvalidPadding[] = {
|
||||
0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
|
||||
0x65, 0x43, 0x12, 0x78,
|
||||
@ -203,6 +224,51 @@ TEST(RtpPacketTest, CreateWith2Extensions) {
|
||||
ElementsAreArray(packet.data(), packet.size()));
|
||||
}
|
||||
|
||||
TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionFirst) {
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
extensions.SetMixedOneTwoByteHeaderSupported(true);
|
||||
extensions.Register(kRtpExtensionTransmissionTimeOffset,
|
||||
kTransmissionOffsetExtensionId);
|
||||
extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
||||
extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
|
||||
RtpPacketToSend packet(&extensions);
|
||||
packet.SetPayloadType(kPayloadType);
|
||||
packet.SetSequenceNumber(kSeqNum);
|
||||
packet.SetTimestamp(kTimestamp);
|
||||
packet.SetSsrc(kSsrc);
|
||||
// Set extension that requires two-byte header.
|
||||
PlayoutDelay playoutDelay = {30, 340};
|
||||
ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
|
||||
packet.SetExtension<TransmissionOffset>(kTimeOffset);
|
||||
packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
|
||||
EXPECT_THAT(kPacketWithTwoByteExtensionIdFirst,
|
||||
ElementsAreArray(packet.data(), packet.size()));
|
||||
}
|
||||
|
||||
TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionLast) {
|
||||
// This test will trigger RtpPacket::PromoteToTwoByteHeaderExtension().
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
extensions.SetMixedOneTwoByteHeaderSupported(true);
|
||||
extensions.Register(kRtpExtensionTransmissionTimeOffset,
|
||||
kTransmissionOffsetExtensionId);
|
||||
extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
||||
extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
|
||||
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()));
|
||||
// Set extension that requires two-byte header.
|
||||
PlayoutDelay playoutDelay = {30, 340};
|
||||
ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
|
||||
EXPECT_THAT(kPacketWithTwoByteExtensionIdLast,
|
||||
ElementsAreArray(packet.data(), packet.size()));
|
||||
}
|
||||
|
||||
TEST(RtpPacketTest, CreateWithDynamicSizedExtensions) {
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
|
||||
@ -247,6 +313,14 @@ TEST(RtpPacketTest, TryToCreateWithLongMid) {
|
||||
EXPECT_FALSE(packet.SetExtension<RtpMid>(kLongMid));
|
||||
}
|
||||
|
||||
TEST(RtpPacketTest, TryToCreateTwoByteHeaderNotSupported) {
|
||||
RtpPacketToSend::ExtensionManager extensions;
|
||||
extensions.Register(kRtpExtensionAudioLevel, kTwoByteExtensionId);
|
||||
RtpPacketToSend packet(&extensions);
|
||||
// Set extension that requires two-byte header.
|
||||
EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
|
||||
}
|
||||
|
||||
TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) {
|
||||
const std::string kValue = "123456789abcdef";
|
||||
RtpPacket::ExtensionManager extensions;
|
||||
|
||||
Reference in New Issue
Block a user