packet_sequencer_unittest.cc (10336B)
1 /* 2 * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "modules/rtp_rtcp/source/packet_sequencer.h" 12 13 #include <cstdint> 14 15 #include "api/units/time_delta.h" 16 #include "api/units/timestamp.h" 17 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" 18 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" 19 #include "system_wrappers/include/clock.h" 20 #include "test/gtest.h" 21 22 namespace webrtc { 23 namespace { 24 constexpr Timestamp kStartTime = Timestamp::Millis(98765); 25 constexpr uint32_t kMediaSsrc = 123456; 26 constexpr uint32_t kRtxSsrc = 123457; 27 constexpr uint8_t kMediaPayloadType = 42; 28 constexpr uint16_t kMediaStartSequenceNumber = 123; 29 constexpr uint16_t kRtxStartSequenceNumber = 234; 30 constexpr uint16_t kDefaultSequenceNumber = 0x1234; 31 constexpr uint32_t kStartRtpTimestamp = 798; 32 33 class PacketSequencerTest : public ::testing::Test { 34 public: 35 PacketSequencerTest() 36 : clock_(kStartTime), 37 sequencer_(kMediaSsrc, 38 kRtxSsrc, 39 /*require_marker_before_media_padding=*/true, 40 &clock_) {} 41 42 RtpPacketToSend CreatePacket(RtpPacketMediaType type, uint32_t ssrc) { 43 RtpPacketToSend packet(/*extension_manager=*/nullptr); 44 packet.set_packet_type(type); 45 packet.SetSsrc(ssrc); 46 packet.SetSequenceNumber(kDefaultSequenceNumber); 47 packet.set_capture_time(clock_.CurrentTime()); 48 packet.SetTimestamp( 49 kStartRtpTimestamp + 50 static_cast<uint32_t>(packet.capture_time().ms() - kStartTime.ms())); 51 return packet; 52 } 53 54 protected: 55 SimulatedClock clock_; 56 PacketSequencer sequencer_; 57 }; 58 59 TEST_F(PacketSequencerTest, IgnoresMediaSsrcRetransmissions) { 60 RtpPacketToSend packet = 61 CreatePacket(RtpPacketMediaType::kRetransmission, kMediaSsrc); 62 sequencer_.set_media_sequence_number(kMediaStartSequenceNumber); 63 sequencer_.Sequence(packet); 64 EXPECT_EQ(packet.SequenceNumber(), kDefaultSequenceNumber); 65 EXPECT_EQ(sequencer_.media_sequence_number(), kMediaStartSequenceNumber); 66 } 67 68 TEST_F(PacketSequencerTest, SequencesAudio) { 69 RtpPacketToSend packet = CreatePacket(RtpPacketMediaType::kAudio, kMediaSsrc); 70 sequencer_.set_media_sequence_number(kMediaStartSequenceNumber); 71 sequencer_.Sequence(packet); 72 EXPECT_EQ(packet.SequenceNumber(), kMediaStartSequenceNumber); 73 EXPECT_EQ(sequencer_.media_sequence_number(), kMediaStartSequenceNumber + 1); 74 } 75 76 TEST_F(PacketSequencerTest, SequencesVideo) { 77 RtpPacketToSend packet = CreatePacket(RtpPacketMediaType::kVideo, kMediaSsrc); 78 sequencer_.set_media_sequence_number(kMediaStartSequenceNumber); 79 sequencer_.Sequence(packet); 80 EXPECT_EQ(packet.SequenceNumber(), kMediaStartSequenceNumber); 81 EXPECT_EQ(sequencer_.media_sequence_number(), kMediaStartSequenceNumber + 1); 82 } 83 84 TEST_F(PacketSequencerTest, SequencesUlpFec) { 85 RtpPacketToSend packet = 86 CreatePacket(RtpPacketMediaType::kForwardErrorCorrection, kMediaSsrc); 87 sequencer_.set_media_sequence_number(kMediaStartSequenceNumber); 88 sequencer_.Sequence(packet); 89 EXPECT_EQ(packet.SequenceNumber(), kMediaStartSequenceNumber); 90 EXPECT_EQ(sequencer_.media_sequence_number(), kMediaStartSequenceNumber + 1); 91 } 92 93 TEST_F(PacketSequencerTest, SequencesRtxRetransmissions) { 94 RtpPacketToSend packet = 95 CreatePacket(RtpPacketMediaType::kRetransmission, kRtxSsrc); 96 sequencer_.set_rtx_sequence_number(kRtxStartSequenceNumber); 97 sequencer_.Sequence(packet); 98 EXPECT_EQ(packet.SequenceNumber(), kRtxStartSequenceNumber); 99 EXPECT_EQ(sequencer_.rtx_sequence_number(), kRtxStartSequenceNumber + 1); 100 } 101 102 TEST_F(PacketSequencerTest, ProhibitsPaddingWithinVideoFrame) { 103 // Send a video packet with the marker bit set to false (indicating it is not 104 // the last packet of a frame). 105 RtpPacketToSend media_packet = 106 CreatePacket(RtpPacketMediaType::kVideo, kMediaSsrc); 107 media_packet.SetPayloadType(kMediaPayloadType); 108 media_packet.SetMarker(false); 109 sequencer_.Sequence(media_packet); 110 111 // Sending padding on the media SSRC should not be allowed at this point. 112 EXPECT_FALSE(sequencer_.CanSendPaddingOnMediaSsrc()); 113 114 // Send a video packet with marker set to true, padding should be allowed 115 // again. 116 media_packet.SetMarker(true); 117 sequencer_.Sequence(media_packet); 118 EXPECT_TRUE(sequencer_.CanSendPaddingOnMediaSsrc()); 119 } 120 121 TEST_F(PacketSequencerTest, AllowsPaddingAtAnyTimeIfSoConfigured) { 122 PacketSequencer packet_sequencer( 123 kMediaSsrc, kRtxSsrc, 124 /*require_marker_before_media_padding=*/false, &clock_); 125 126 // Send an audio packet with the marker bit set to false. 127 RtpPacketToSend media_packet = 128 CreatePacket(RtpPacketMediaType::kAudio, kMediaSsrc); 129 media_packet.SetPayloadType(kMediaPayloadType); 130 media_packet.SetMarker(false); 131 packet_sequencer.Sequence(media_packet); 132 133 // Sending padding on the media SSRC should be allowed despite no marker bit. 134 EXPECT_TRUE(packet_sequencer.CanSendPaddingOnMediaSsrc()); 135 } 136 137 TEST_F(PacketSequencerTest, UpdatesPaddingBasedOnLastMediaPacket) { 138 // First send a media packet. 139 RtpPacketToSend media_packet = 140 CreatePacket(RtpPacketMediaType::kVideo, kMediaSsrc); 141 media_packet.SetPayloadType(kMediaPayloadType); 142 media_packet.SetMarker(true); 143 // Advance time so current time doesn't exactly match timestamp. 144 clock_.AdvanceTime(TimeDelta::Millis(5)); 145 sequencer_.set_media_sequence_number(kMediaStartSequenceNumber); 146 sequencer_.Sequence(media_packet); 147 148 // Next send a padding packet and verify the media packet's timestamps and 149 // payload type is transferred to the padding packet. 150 RtpPacketToSend padding_packet = 151 CreatePacket(RtpPacketMediaType::kPadding, kMediaSsrc); 152 padding_packet.SetPadding(/*padding_size=*/100); 153 sequencer_.Sequence(padding_packet); 154 155 EXPECT_EQ(padding_packet.SequenceNumber(), kMediaStartSequenceNumber + 1); 156 EXPECT_EQ(padding_packet.PayloadType(), kMediaPayloadType); 157 EXPECT_EQ(padding_packet.Timestamp(), media_packet.Timestamp()); 158 EXPECT_EQ(padding_packet.capture_time(), media_packet.capture_time()); 159 } 160 161 TEST_F(PacketSequencerTest, UpdatesPaddingBasedOnLastRedPacket) { 162 // First send a media packet. 163 RtpPacketToSend media_packet = 164 CreatePacket(RtpPacketMediaType::kVideo, kMediaSsrc); 165 media_packet.SetPayloadType(kMediaPayloadType); 166 // Simulate a packet with RED encapsulation; 167 media_packet.set_is_red(true); 168 uint8_t* payload_buffer = media_packet.SetPayloadSize(1); 169 payload_buffer[0] = kMediaPayloadType + 1; 170 171 media_packet.SetMarker(true); 172 // Advance time so current time doesn't exactly match timestamp. 173 clock_.AdvanceTime(TimeDelta::Millis(5)); 174 sequencer_.set_media_sequence_number(kMediaStartSequenceNumber); 175 sequencer_.Sequence(media_packet); 176 177 // Next send a padding packet and verify the media packet's timestamps and 178 // payload type is transferred to the padding packet. 179 RtpPacketToSend padding_packet = 180 CreatePacket(RtpPacketMediaType::kPadding, kMediaSsrc); 181 padding_packet.SetPadding(100); 182 sequencer_.Sequence(padding_packet); 183 184 EXPECT_EQ(padding_packet.SequenceNumber(), kMediaStartSequenceNumber + 1); 185 EXPECT_EQ(padding_packet.PayloadType(), kMediaPayloadType + 1); 186 EXPECT_EQ(padding_packet.Timestamp(), media_packet.Timestamp()); 187 EXPECT_EQ(padding_packet.capture_time(), media_packet.capture_time()); 188 } 189 190 TEST_F(PacketSequencerTest, DoesNotUpdateFieldsOnPayloadPadding) { 191 // First send a media packet. 192 RtpPacketToSend media_packet = 193 CreatePacket(RtpPacketMediaType::kVideo, kMediaSsrc); 194 media_packet.SetPayloadType(kMediaPayloadType); 195 media_packet.SetMarker(true); 196 // Advance time so current time doesn't exactly match timestamp. 197 clock_.AdvanceTime(TimeDelta::Millis(5)); 198 sequencer_.set_media_sequence_number(kMediaStartSequenceNumber); 199 sequencer_.Sequence(media_packet); 200 201 // Simulate a payload padding packet on the RTX SSRC. 202 RtpPacketToSend padding_packet = 203 CreatePacket(RtpPacketMediaType::kPadding, kRtxSsrc); 204 padding_packet.SetPayloadSize(100); 205 padding_packet.SetPayloadType(kMediaPayloadType + 1); 206 padding_packet.SetTimestamp(kStartRtpTimestamp + 1); 207 padding_packet.set_capture_time(kStartTime + TimeDelta::Millis(1)); 208 sequencer_.set_rtx_sequence_number(kRtxStartSequenceNumber); 209 sequencer_.Sequence(padding_packet); 210 211 // The sequence number should be updated, but timestamps kept. 212 EXPECT_EQ(padding_packet.SequenceNumber(), kRtxStartSequenceNumber); 213 EXPECT_EQ(padding_packet.PayloadType(), kMediaPayloadType + 1); 214 EXPECT_EQ(padding_packet.Timestamp(), kStartRtpTimestamp + 1); 215 EXPECT_EQ(padding_packet.capture_time(), kStartTime + TimeDelta::Millis(1)); 216 } 217 218 TEST_F(PacketSequencerTest, UpdatesRtxPaddingBasedOnLastMediaPacket) { 219 constexpr uint32_t kTimestampTicksPerMs = 90; 220 221 // First send a media packet. 222 RtpPacketToSend media_packet = 223 CreatePacket(RtpPacketMediaType::kVideo, kMediaSsrc); 224 media_packet.SetPayloadType(kMediaPayloadType); 225 media_packet.SetMarker(true); 226 sequencer_.set_media_sequence_number(kMediaStartSequenceNumber); 227 sequencer_.Sequence(media_packet); 228 229 // Advance time, this time delta will be used to interpolate padding 230 // timestamps. 231 constexpr TimeDelta kTimeDelta = TimeDelta::Millis(10); 232 clock_.AdvanceTime(kTimeDelta); 233 234 RtpPacketToSend padding_packet = 235 CreatePacket(RtpPacketMediaType::kPadding, kRtxSsrc); 236 padding_packet.SetPadding(100); 237 padding_packet.SetPayloadType(kMediaPayloadType + 1); 238 sequencer_.set_rtx_sequence_number(kRtxStartSequenceNumber); 239 sequencer_.Sequence(padding_packet); 240 241 // Assigned RTX sequence number, but payload type unchanged in this case. 242 EXPECT_EQ(padding_packet.SequenceNumber(), kRtxStartSequenceNumber); 243 EXPECT_EQ(padding_packet.PayloadType(), kMediaPayloadType + 1); 244 // Timestamps are offset realtive to last media packet. 245 EXPECT_EQ( 246 padding_packet.Timestamp(), 247 media_packet.Timestamp() + (kTimeDelta.ms() * kTimestampTicksPerMs)); 248 EXPECT_EQ(padding_packet.capture_time(), 249 media_packet.capture_time() + kTimeDelta); 250 } 251 252 } // namespace 253 } // namespace webrtc