tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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