blob: 7237bee6485fe46f8694934fb6587074bafd37c4 [file] [log] [blame]
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +00001/*
phoglund@webrtc.org78088c22012-02-07 14:56:45 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +00003 *
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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/rtp_rtcp/source/rtp_sender.h"
12
kwiberg84be5112016-04-27 01:19:58 -070013#include <memory>
danilchapb8b6fbb2015-12-10 05:05:27 -080014#include <vector>
15
Danil Chapovalov16cb1f62019-09-05 11:29:59 +020016#include "api/rtc_event_log/rtc_event.h"
Per Kjellandere11b7d22019-02-21 07:55:59 +010017#include "api/transport/field_trial_based_config.h"
Erik Språngf93eda12019-01-16 17:10:57 +010018#include "api/video/video_codec_constants.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/video/video_timing.h"
20#include "logging/rtc_event_log/mock/mock_rtc_event_log.h"
21#include "modules/rtp_rtcp/include/rtp_cvo.h"
22#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
Erik Språngaa59eca2019-07-24 14:52:55 +020023#include "modules/rtp_rtcp/include/rtp_packet_sender.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "modules/rtp_rtcp/source/rtp_format_video_generic.h"
philipelb3e42a42018-09-13 10:57:14 +020026#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h"
27#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
29#include "modules/rtp_rtcp/source/rtp_packet_received.h"
30#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020031#include "modules/rtp_rtcp/source/rtp_sender_video.h"
32#include "modules/rtp_rtcp/source/rtp_utility.h"
Erik Språng1d50cb62020-07-02 17:41:32 +020033#include "modules/rtp_rtcp/source/video_fec_generator.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020034#include "rtc_base/arraysize.h"
Danil Chapovalov9554a7b2021-02-05 19:30:16 +010035#include "rtc_base/logging.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020036#include "rtc_base/rate_limiter.h"
Erik Språnge886d2e2020-04-16 15:07:56 +020037#include "rtc_base/strings/string_builder.h"
Erik Språng62032d42020-07-03 19:38:04 +020038#include "rtc_base/task_utils/to_queued_task.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020039#include "test/field_trial.h"
40#include "test/gmock.h"
41#include "test/gtest.h"
42#include "test/mock_transport.h"
Erik Språng62032d42020-07-03 19:38:04 +020043#include "test/time_controller/simulated_time_controller.h"
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000044
45namespace webrtc {
46
andrew@webrtc.org8a442592011-12-16 21:24:30 +000047namespace {
Elad Alond8d32482019-02-18 23:45:57 +010048enum : int { // The first valid value is 1.
49 kAbsoluteSendTimeExtensionId = 1,
50 kAudioLevelExtensionId,
Danil Chapovalovec9fc222020-04-14 16:11:59 +020051 kGenericDescriptorId,
Elad Alond8d32482019-02-18 23:45:57 +010052 kMidExtensionId,
53 kRepairedRidExtensionId,
54 kRidExtensionId,
55 kTransmissionTimeOffsetExtensionId,
56 kTransportSequenceNumberExtensionId,
57 kVideoRotationExtensionId,
58 kVideoTimingExtensionId,
59};
60
andrew@webrtc.org8a442592011-12-16 21:24:30 +000061const int kPayload = 100;
Shao Changbine62202f2015-04-21 20:24:50 +080062const int kRtxPayload = 98;
andrew@webrtc.org8a442592011-12-16 21:24:30 +000063const uint32_t kTimestamp = 10;
64const uint16_t kSeqNum = 33;
brandtr9dfff292016-11-14 05:14:50 -080065const uint32_t kSsrc = 725242;
Erik Språng9c771c22019-06-17 16:31:53 +020066const uint32_t kRtxSsrc = 12345;
67const uint32_t kFlexFecSsrc = 45678;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +000068const uint64_t kStartTime = 123456789;
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +000069const size_t kMaxPaddingSize = 224u;
Stefan Holmera246cfb2016-08-23 17:51:42 +020070const uint8_t kPayloadData[] = {47, 11, 32, 93, 89};
spranga8ae6f22017-09-04 07:23:56 -070071const int64_t kDefaultExpectedRetransmissionTimeMs = 125;
Erik Språngdb285552021-05-18 16:38:32 +020072const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc.
73const uint32_t kTimestampTicksPerMs = 90; // 90kHz clock.
andrew@webrtc.org8a442592011-12-16 21:24:30 +000074
Danil Chapovalov5e57b172016-09-02 19:15:59 +020075using ::testing::_;
Erik Språng30a276b2019-04-23 12:00:11 +020076using ::testing::AllOf;
Erik Språngcf15cb52020-12-07 13:18:34 +010077using ::testing::AtLeast;
Erik Språngea55b082019-10-02 14:57:46 +020078using ::testing::Contains;
Erik Språnge886d2e2020-04-16 15:07:56 +020079using ::testing::Each;
Erik Språngcf497892021-05-24 14:26:59 +020080using ::testing::ElementsAre;
Erik Språnge886d2e2020-04-16 15:07:56 +020081using ::testing::Eq;
Erik Språng30a276b2019-04-23 12:00:11 +020082using ::testing::Field;
Erik Språnge886d2e2020-04-16 15:07:56 +020083using ::testing::Gt;
84using ::testing::IsEmpty;
Erik Språng9c771c22019-06-17 16:31:53 +020085using ::testing::NiceMock;
Erik Språnge886d2e2020-04-16 15:07:56 +020086using ::testing::Not;
Erik Språng478cb462019-06-26 15:49:27 +020087using ::testing::Pointee;
88using ::testing::Property;
Erik Språng214f5432019-06-20 15:09:58 +020089using ::testing::Return;
Erik Språnge886d2e2020-04-16 15:07:56 +020090using ::testing::SizeIs;
Erik Språngf6468d22019-07-05 16:53:43 +020091
Erik Språngaa59eca2019-07-24 14:52:55 +020092class MockRtpPacketPacer : public RtpPacketSender {
sprangebbf8a82015-09-21 15:11:14 -070093 public:
Erik Språng59b86542019-06-23 18:24:46 +020094 MockRtpPacketPacer() {}
95 virtual ~MockRtpPacketPacer() {}
96
Danil Chapovalov014197b2020-05-26 19:18:17 +020097 MOCK_METHOD(void,
98 EnqueuePackets,
99 (std::vector<std::unique_ptr<RtpPacketToSend>>),
100 (override));
sprangebbf8a82015-09-21 15:11:14 -0700101};
102
Erik Språnge886d2e2020-04-16 15:07:56 +0200103class FieldTrialConfig : public WebRtcKeyValueConfig {
104 public:
Erik Språng7f110672021-05-26 16:41:20 +0200105 FieldTrialConfig() : max_padding_factor_(1200) {}
Erik Språnge886d2e2020-04-16 15:07:56 +0200106 ~FieldTrialConfig() override {}
107
Erik Språnge886d2e2020-04-16 15:07:56 +0200108 void SetMaxPaddingFactor(double factor) { max_padding_factor_ = factor; }
109
110 std::string Lookup(absl::string_view key) const override {
111 if (key == "WebRTC-LimitPaddingSize") {
112 char string_buf[32];
113 rtc::SimpleStringBuilder ssb(string_buf);
114 ssb << "factor:" << max_padding_factor_;
115 return ssb.str();
Erik Språnge886d2e2020-04-16 15:07:56 +0200116 }
117 return "";
118 }
119
120 private:
Erik Språnge886d2e2020-04-16 15:07:56 +0200121 double max_padding_factor_;
122};
123
Erik Språng77b75292019-10-28 15:51:36 +0100124} // namespace
125
Erik Språng7f110672021-05-26 16:41:20 +0200126class RtpSenderTest : public ::testing::Test {
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000127 protected:
128 RtpSenderTest()
Erik Språng62032d42020-07-03 19:38:04 +0200129 : time_controller_(Timestamp::Millis(kStartTime)),
130 clock_(time_controller_.GetClock()),
131 retransmission_rate_limiter_(clock_, 1000),
Erik Språng4580ca22019-07-04 10:38:43 +0200132 flexfec_sender_(0,
133 kFlexFecSsrc,
134 kSsrc,
135 "",
136 std::vector<RtpExtension>(),
137 std::vector<RtpExtensionSize>(),
138 nullptr,
Erik Språng62032d42020-07-03 19:38:04 +0200139 clock_),
Erik Språnge886d2e2020-04-16 15:07:56 +0200140 kMarkerBit(true) {
Erik Språnge886d2e2020-04-16 15:07:56 +0200141 }
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000142
Erik Språng7f110672021-05-26 16:41:20 +0200143 void SetUp() override { SetUpRtpSender(true, false, nullptr); }
Peter Boströme23e7372015-10-08 11:44:14 +0200144
Erik Språng7f110672021-05-26 16:41:20 +0200145 void SetUpRtpSender(bool populate_network2,
Erik Språng1d50cb62020-07-02 17:41:32 +0200146 bool always_send_mid_and_rid,
147 VideoFecGenerator* fec_generator) {
Erik Språng7f110672021-05-26 16:41:20 +0200148 RtpRtcpInterface::Configuration config = GetDefaultConfig();
Erik Språng1d50cb62020-07-02 17:41:32 +0200149 config.fec_generator = fec_generator;
Erik Språng4580ca22019-07-04 10:38:43 +0200150 config.populate_network2_timestamp = populate_network2;
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100151 config.always_send_mid_and_rid = always_send_mid_and_rid;
Erik Språng7f110672021-05-26 16:41:20 +0200152 CreateSender(config);
153 }
Erik Språnge886d2e2020-04-16 15:07:56 +0200154
Erik Språng7f110672021-05-26 16:41:20 +0200155 RtpRtcpInterface::Configuration GetDefaultConfig() {
156 RtpRtcpInterface::Configuration config;
157 config.clock = clock_;
158 config.local_media_ssrc = kSsrc;
159 config.rtx_send_ssrc = kRtxSsrc;
160 config.event_log = &mock_rtc_event_log_;
161 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
162 config.paced_sender = &mock_paced_sender_;
163 config.field_trials = &field_trials_;
164 return config;
165 }
166
167 void CreateSender(const RtpRtcpInterface::Configuration& config) {
168 packet_history_ = std::make_unique<RtpPacketHistory>(
169 config.clock, config.enable_rtx_padding_prioritization);
170 rtp_sender_ = std::make_unique<RTPSender>(config, packet_history_.get(),
171 config.paced_sender);
172 rtp_sender_->SetSequenceNumber(kSeqNum);
173 rtp_sender_->SetTimestampOffset(0);
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000174 }
175
Erik Språng62032d42020-07-03 19:38:04 +0200176 GlobalSimulatedTimeController time_controller_;
177 Clock* const clock_;
Erik Språng9c771c22019-06-17 16:31:53 +0200178 NiceMock<MockRtcEventLog> mock_rtc_event_log_;
Erik Språng59b86542019-06-23 18:24:46 +0200179 MockRtpPacketPacer mock_paced_sender_;
sprangcd349d92016-07-13 09:11:28 -0700180 RateLimiter retransmission_rate_limiter_;
Erik Språng4580ca22019-07-04 10:38:43 +0200181 FlexfecSender flexfec_sender_;
Erik Språng77b75292019-10-28 15:51:36 +0100182
Erik Språng7f110672021-05-26 16:41:20 +0200183 std::unique_ptr<RtpPacketHistory> packet_history_;
184 std::unique_ptr<RTPSender> rtp_sender_;
Erik Språng77b75292019-10-28 15:51:36 +0100185
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000186 const bool kMarkerBit;
Erik Språnge886d2e2020-04-16 15:07:56 +0200187 FieldTrialConfig field_trials_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000188
danilchapb6f1fb52016-10-19 06:11:39 -0700189 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
190 bool marker_bit,
191 uint32_t timestamp,
192 int64_t capture_time_ms) {
Erik Språng7f110672021-05-26 16:41:20 +0200193 auto packet = rtp_sender_->AllocatePacket();
danilchapb6f1fb52016-10-19 06:11:39 -0700194 packet->SetPayloadType(payload_type);
Björn Terelius31d0f7c2020-02-06 16:35:46 +0100195 packet->set_packet_type(RtpPacketMediaType::kVideo);
danilchapb6f1fb52016-10-19 06:11:39 -0700196 packet->SetMarker(marker_bit);
197 packet->SetTimestamp(timestamp);
198 packet->set_capture_time_ms(capture_time_ms);
Erik Språng7f110672021-05-26 16:41:20 +0200199 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
danilchapb6f1fb52016-10-19 06:11:39 -0700200 return packet;
201 }
202
Erik Språngf6468d22019-07-05 16:53:43 +0200203 std::unique_ptr<RtpPacketToSend> SendPacket(int64_t capture_time_ms,
204 int payload_length) {
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000205 uint32_t timestamp = capture_time_ms * 90;
danilchapb6f1fb52016-10-19 06:11:39 -0700206 auto packet =
207 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
208 packet->AllocatePayload(payload_length);
Erik Språng70768f42019-08-27 18:16:26 +0200209 packet->set_allow_retransmission(true);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000210
211 // Packet should be stored in a send bucket.
Erik Språng7f110672021-05-26 16:41:20 +0200212 EXPECT_TRUE(
213 rtp_sender_->SendToNetwork(std::make_unique<RtpPacketToSend>(*packet)));
Erik Språngf6468d22019-07-05 16:53:43 +0200214 return packet;
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000215 }
asapersson35151f32016-05-02 23:44:01 -0700216
Erik Språngf6468d22019-07-05 16:53:43 +0200217 std::unique_ptr<RtpPacketToSend> SendGenericPacket() {
Erik Språng62032d42020-07-03 19:38:04 +0200218 const int64_t kCaptureTimeMs = clock_->TimeInMilliseconds();
Danil Chapovalov9554a7b2021-02-05 19:30:16 +0100219 // Use maximum allowed size to catch corner cases when packet is dropped
220 // because of lack of capacity for the media packet, or for an rtx packet
221 // containing the media packet.
222 return SendPacket(kCaptureTimeMs,
Erik Språng7f110672021-05-26 16:41:20 +0200223 /*payload_length=*/rtp_sender_->MaxRtpPacketSize() -
224 rtp_sender_->ExpectedPerPacketOverhead());
asapersson35151f32016-05-02 23:44:01 -0700225 }
Steve Anton2bac7da2019-07-21 15:04:21 -0400226
Erik Språng4208a132019-08-26 08:58:45 +0200227 size_t GenerateAndSendPadding(size_t target_size_bytes) {
228 size_t generated_bytes = 0;
Erik Språng7f110672021-05-26 16:41:20 +0200229 for (auto& packet : rtp_sender_->GeneratePadding(target_size_bytes, true)) {
Erik Språng4208a132019-08-26 08:58:45 +0200230 generated_bytes += packet->payload_size() + packet->padding_size();
Erik Språng7f110672021-05-26 16:41:20 +0200231 rtp_sender_->SendToNetwork(std::move(packet));
Erik Språng4208a132019-08-26 08:58:45 +0200232 }
233 return generated_bytes;
234 }
235
Steve Anton2bac7da2019-07-21 15:04:21 -0400236 // The following are helpers for configuring the RTPSender. They must be
237 // called before sending any packets.
238
239 // Enable the retransmission stream with sizable packet storage.
240 void EnableRtx() {
241 // RTX needs to be able to read the source packets from the packet store.
242 // Pick a number of packets to store big enough for any unit test.
243 constexpr uint16_t kNumberOfPacketsToStore = 100;
Erik Språng7f110672021-05-26 16:41:20 +0200244 packet_history_->SetStorePacketsStatus(
Erik Språng77b75292019-10-28 15:51:36 +0100245 RtpPacketHistory::StorageMode::kStoreAndCull, kNumberOfPacketsToStore);
Erik Språng7f110672021-05-26 16:41:20 +0200246 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
247 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
Steve Anton2bac7da2019-07-21 15:04:21 -0400248 }
249
250 // Enable sending of the MID header extension for both the primary SSRC and
251 // the RTX SSRC.
252 void EnableMidSending(const std::string& mid) {
Erik Språng7f110672021-05-26 16:41:20 +0200253 rtp_sender_->RegisterRtpHeaderExtension(RtpMid::kUri, kMidExtensionId);
254 rtp_sender_->SetMid(mid);
Steve Anton2bac7da2019-07-21 15:04:21 -0400255 }
256
257 // Enable sending of the RSID header extension for the primary SSRC and the
258 // RRSID header extension for the RTX SSRC.
259 void EnableRidSending(const std::string& rid) {
Erik Språng7f110672021-05-26 16:41:20 +0200260 rtp_sender_->RegisterRtpHeaderExtension(RtpStreamId::kUri, kRidExtensionId);
261 rtp_sender_->RegisterRtpHeaderExtension(RepairedRtpStreamId::kUri,
262 kRepairedRidExtensionId);
263 rtp_sender_->SetRid(rid);
Steve Anton2bac7da2019-07-21 15:04:21 -0400264 }
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000265};
266
Erik Språng7f110672021-05-26 16:41:20 +0200267TEST_F(RtpSenderTest, AllocatePacketSetCsrc) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200268 // Configure rtp_sender with csrc.
269 std::vector<uint32_t> csrcs;
270 csrcs.push_back(0x23456789);
Erik Språng7f110672021-05-26 16:41:20 +0200271 rtp_sender_->SetCsrcs(csrcs);
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200272
Erik Språng7f110672021-05-26 16:41:20 +0200273 auto packet = rtp_sender_->AllocatePacket();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200274
275 ASSERT_TRUE(packet);
Erik Språng7f110672021-05-26 16:41:20 +0200276 EXPECT_EQ(rtp_sender_->SSRC(), packet->Ssrc());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200277 EXPECT_EQ(csrcs, packet->Csrcs());
278}
279
Erik Språng7f110672021-05-26 16:41:20 +0200280TEST_F(RtpSenderTest, AllocatePacketReserveExtensions) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200281 // Configure rtp_sender with extensions.
Erik Språng7f110672021-05-26 16:41:20 +0200282 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +0100283 TransmissionOffset::kUri, kTransmissionTimeOffsetExtensionId));
Erik Språng7f110672021-05-26 16:41:20 +0200284 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +0100285 AbsoluteSendTime::kUri, kAbsoluteSendTimeExtensionId));
Erik Språng7f110672021-05-26 16:41:20 +0200286 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(AudioLevel::kUri,
287 kAudioLevelExtensionId));
288 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +0100289 TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId));
Erik Språng7f110672021-05-26 16:41:20 +0200290 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +0100291 VideoOrientation::kUri, kVideoRotationExtensionId));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200292
Erik Språng7f110672021-05-26 16:41:20 +0200293 auto packet = rtp_sender_->AllocatePacket();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200294
295 ASSERT_TRUE(packet);
296 // Preallocate BWE extensions RtpSender set itself.
297 EXPECT_TRUE(packet->HasExtension<TransmissionOffset>());
298 EXPECT_TRUE(packet->HasExtension<AbsoluteSendTime>());
299 EXPECT_TRUE(packet->HasExtension<TransportSequenceNumber>());
300 // Do not allocate media specific extensions.
301 EXPECT_FALSE(packet->HasExtension<AudioLevel>());
302 EXPECT_FALSE(packet->HasExtension<VideoOrientation>());
303}
304
Erik Språng7f110672021-05-26 16:41:20 +0200305TEST_F(RtpSenderTest, PaddingAlwaysAllowedOnAudio) {
306 RtpRtcpInterface::Configuration config = GetDefaultConfig();
Erik Språng4580ca22019-07-04 10:38:43 +0200307 config.audio = true;
Erik Språng7f110672021-05-26 16:41:20 +0200308 CreateSender(config);
Erik Språng4580ca22019-07-04 10:38:43 +0200309
Erik Språng7f110672021-05-26 16:41:20 +0200310 std::unique_ptr<RtpPacketToSend> audio_packet = rtp_sender_->AllocatePacket();
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100311 // Padding on audio stream allowed regardless of marker in the last packet.
312 audio_packet->SetMarker(false);
313 audio_packet->SetPayloadType(kPayload);
Erik Språng7f110672021-05-26 16:41:20 +0200314 rtp_sender_->AssignSequenceNumber(audio_packet.get());
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100315
316 const size_t kPaddingSize = 59;
Erik Språng8f8bf252021-05-26 12:29:22 +0200317
318 EXPECT_CALL(
319 mock_paced_sender_,
320 EnqueuePackets(ElementsAre(AllOf(
321 Pointee(Property(&RtpPacketToSend::packet_type,
322 RtpPacketMediaType::kPadding)),
323 Pointee(Property(&RtpPacketToSend::padding_size, kPaddingSize))))));
Erik Språng4208a132019-08-26 08:58:45 +0200324 EXPECT_EQ(kPaddingSize, GenerateAndSendPadding(kPaddingSize));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100325
326 // Requested padding size is too small, will send a larger one.
327 const size_t kMinPaddingSize = 50;
Erik Språng8f8bf252021-05-26 12:29:22 +0200328 EXPECT_CALL(mock_paced_sender_,
329 EnqueuePackets(ElementsAre(
330 AllOf(Pointee(Property(&RtpPacketToSend::packet_type,
331 RtpPacketMediaType::kPadding)),
332 Pointee(Property(&RtpPacketToSend::padding_size,
333 kMinPaddingSize))))));
Erik Språng4208a132019-08-26 08:58:45 +0200334 EXPECT_EQ(kMinPaddingSize, GenerateAndSendPadding(kMinPaddingSize - 5));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100335}
336
Erik Språng7f110672021-05-26 16:41:20 +0200337TEST_F(RtpSenderTest, SendToNetworkForwardsPacketsToPacer) {
Erik Språng726b0e82021-05-17 15:29:29 +0200338 auto packet = BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, 0);
339 int64_t now_ms = clock_->TimeInMilliseconds();
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000340
Erik Språngea55b082019-10-02 14:57:46 +0200341 EXPECT_CALL(
342 mock_paced_sender_,
Erik Språng8f8bf252021-05-26 12:29:22 +0200343 EnqueuePackets(ElementsAre(AllOf(
Erik Språngea55b082019-10-02 14:57:46 +0200344 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
Erik Språng726b0e82021-05-17 15:29:29 +0200345 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)),
346 Pointee(Property(&RtpPacketToSend::capture_time_ms, now_ms))))));
Erik Språngea55b082019-10-02 14:57:46 +0200347 EXPECT_TRUE(
Erik Språng7f110672021-05-26 16:41:20 +0200348 rtp_sender_->SendToNetwork(std::make_unique<RtpPacketToSend>(*packet)));
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000349}
350
Erik Språng7f110672021-05-26 16:41:20 +0200351TEST_F(RtpSenderTest, ReSendPacketForwardsPacketsToPacer) {
352 packet_history_->SetStorePacketsStatus(
Erik Språng77b75292019-10-28 15:51:36 +0100353 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
Erik Språng726b0e82021-05-17 15:29:29 +0200354 int64_t now_ms = clock_->TimeInMilliseconds();
355 auto packet = BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, now_ms);
356 uint16_t seq_no = packet->SequenceNumber();
Erik Språngea55b082019-10-02 14:57:46 +0200357 packet->set_allow_retransmission(true);
Erik Språng7f110672021-05-26 16:41:20 +0200358 packet_history_->PutRtpPacket(std::move(packet), now_ms);
Erik Språngf6468d22019-07-05 16:53:43 +0200359
Erik Språng726b0e82021-05-17 15:29:29 +0200360 EXPECT_CALL(mock_paced_sender_,
Erik Språng8f8bf252021-05-26 12:29:22 +0200361 EnqueuePackets(ElementsAre(AllOf(
Erik Språng726b0e82021-05-17 15:29:29 +0200362 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
363 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)),
364 Pointee(Property(&RtpPacketToSend::capture_time_ms, now_ms)),
365 Pointee(Property(&RtpPacketToSend::packet_type,
366 RtpPacketMediaType::kRetransmission))))));
Erik Språng7f110672021-05-26 16:41:20 +0200367 EXPECT_TRUE(rtp_sender_->ReSendPacket(seq_no));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000368}
369
370// This test sends 1 regular video packet, then 4 padding packets, and then
371// 1 more regular packet.
Erik Språng7f110672021-05-26 16:41:20 +0200372TEST_F(RtpSenderTest, SendPadding) {
Erik Språng7a86aad2021-05-17 14:54:02 +0200373 constexpr int kNumPaddingPackets = 4;
374 EXPECT_CALL(mock_paced_sender_, EnqueuePackets);
375 std::unique_ptr<RtpPacketToSend> media_packet =
376 SendPacket(/*capture_time_ms=*/clock_->TimeInMilliseconds(),
377 /*payload_size=*/100);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000378
Erik Språng7a86aad2021-05-17 14:54:02 +0200379 // Wait 50 ms before generating each padding packet.
380 for (int i = 0; i < kNumPaddingPackets; ++i) {
381 time_controller_.AdvanceTime(TimeDelta::Millis(50));
382 const size_t kPaddingTargetBytes = 100; // Request 100 bytes of padding.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000383
Erik Språng7a86aad2021-05-17 14:54:02 +0200384 // Padding should be sent on the media ssrc, with a continous sequence
385 // number range. Size will be forced to full pack size and the timestamp
386 // shall be that of the last media packet.
387 EXPECT_CALL(mock_paced_sender_,
Erik Språng8f8bf252021-05-26 12:29:22 +0200388 EnqueuePackets(ElementsAre(AllOf(
Erik Språng7a86aad2021-05-17 14:54:02 +0200389 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
390 Pointee(Property(&RtpPacketToSend::SequenceNumber,
391 media_packet->SequenceNumber() + i + 1)),
392 Pointee(Property(&RtpPacketToSend::padding_size,
393 kMaxPaddingLength)),
394 Pointee(Property(&RtpPacketToSend::Timestamp,
395 media_packet->Timestamp()))))));
396 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
Erik Språng7f110672021-05-26 16:41:20 +0200397 rtp_sender_->GeneratePadding(kPaddingTargetBytes,
398 /*media_has_been_sent=*/true);
Erik Språng7a86aad2021-05-17 14:54:02 +0200399 ASSERT_THAT(padding_packets, SizeIs(1));
Erik Språng7f110672021-05-26 16:41:20 +0200400 rtp_sender_->SendToNetwork(std::move(padding_packets[0]));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000401 }
402
403 // Send a regular video packet again.
Erik Språng7a86aad2021-05-17 14:54:02 +0200404 EXPECT_CALL(mock_paced_sender_,
Erik Språng8f8bf252021-05-26 12:29:22 +0200405 EnqueuePackets(ElementsAre(AllOf(
Erik Språng7a86aad2021-05-17 14:54:02 +0200406 Pointee(Property(
407 &RtpPacketToSend::SequenceNumber,
408 media_packet->SequenceNumber() + kNumPaddingPackets + 1)),
409 Pointee(Property(&RtpPacketToSend::Timestamp,
410 Gt(media_packet->Timestamp())))))));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000411
Erik Språng7a86aad2021-05-17 14:54:02 +0200412 std::unique_ptr<RtpPacketToSend> next_media_packet =
413 SendPacket(/*capture_time_ms=*/clock_->TimeInMilliseconds(),
414 /*payload_size=*/100);
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000415}
pbos@webrtc.org8911ce42013-03-18 16:39:03 +0000416
Erik Språng7f110672021-05-26 16:41:20 +0200417TEST_F(RtpSenderTest, NoPaddingAsFirstPacketWithoutBweExtensions) {
418 EXPECT_THAT(rtp_sender_->GeneratePadding(/*target_size_bytes=*/100,
419 /*media_has_been_sent=*/false),
Erik Språngdb285552021-05-18 16:38:32 +0200420 IsEmpty());
421
422 // Don't send padding before media even with RTX.
423 EnableRtx();
Erik Språng7f110672021-05-26 16:41:20 +0200424 EXPECT_THAT(rtp_sender_->GeneratePadding(/*target_size_bytes=*/100,
425 /*media_has_been_sent=*/false),
Erik Språngdb285552021-05-18 16:38:32 +0200426 IsEmpty());
427}
428
Erik Språng7f110672021-05-26 16:41:20 +0200429TEST_F(RtpSenderTest, AllowPaddingAsFirstPacketOnRtxWithTransportCc) {
430 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Erik Språngdb285552021-05-18 16:38:32 +0200431 TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId));
432
433 // Padding can't be sent as first packet on media SSRC since we don't know
434 // what payload type to assign.
Erik Språng7f110672021-05-26 16:41:20 +0200435 EXPECT_THAT(rtp_sender_->GeneratePadding(/*target_size_bytes=*/100,
436 /*media_has_been_sent=*/false),
Erik Språngdb285552021-05-18 16:38:32 +0200437 IsEmpty());
438
439 // With transportcc padding can be sent as first packet on the RTX SSRC.
440 EnableRtx();
Erik Språng7f110672021-05-26 16:41:20 +0200441 EXPECT_THAT(rtp_sender_->GeneratePadding(/*target_size_bytes=*/100,
442 /*media_has_been_sent=*/false),
Erik Språngdb285552021-05-18 16:38:32 +0200443 Not(IsEmpty()));
444}
445
Erik Språng7f110672021-05-26 16:41:20 +0200446TEST_F(RtpSenderTest, AllowPaddingAsFirstPacketOnRtxWithAbsSendTime) {
447 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Erik Språngdb285552021-05-18 16:38:32 +0200448 AbsoluteSendTime::kUri, kAbsoluteSendTimeExtensionId));
449
450 // Padding can't be sent as first packet on media SSRC since we don't know
451 // what payload type to assign.
Erik Språng7f110672021-05-26 16:41:20 +0200452 EXPECT_THAT(rtp_sender_->GeneratePadding(/*target_size_bytes=*/100,
453 /*media_has_been_sent=*/false),
Erik Språngdb285552021-05-18 16:38:32 +0200454 IsEmpty());
455
456 // With abs send time, padding can be sent as first packet on the RTX SSRC.
457 EnableRtx();
Erik Språng7f110672021-05-26 16:41:20 +0200458 EXPECT_THAT(rtp_sender_->GeneratePadding(/*target_size_bytes=*/100,
459 /*media_has_been_sent=*/false),
Erik Språngdb285552021-05-18 16:38:32 +0200460 Not(IsEmpty()));
461}
462
Erik Språng7f110672021-05-26 16:41:20 +0200463TEST_F(RtpSenderTest, UpdatesTimestampsOnPlainRtxPadding) {
Erik Språngdb285552021-05-18 16:38:32 +0200464 EnableRtx();
465 // Timestamps as set based on capture time in RtpSenderTest.
466 const int64_t start_time = clock_->TimeInMilliseconds();
467 const uint32_t start_timestamp = start_time * kTimestampTicksPerMs;
468
469 // Start by sending one media packet.
470 EXPECT_CALL(
471 mock_paced_sender_,
Erik Språng8f8bf252021-05-26 12:29:22 +0200472 EnqueuePackets(ElementsAre(AllOf(
Erik Språngdb285552021-05-18 16:38:32 +0200473 Pointee(Property(&RtpPacketToSend::padding_size, 0u)),
474 Pointee(Property(&RtpPacketToSend::Timestamp, start_timestamp)),
475 Pointee(Property(&RtpPacketToSend::capture_time_ms, start_time))))));
476 std::unique_ptr<RtpPacketToSend> media_packet =
477 SendPacket(start_time, /*payload_size=*/600);
478
479 // Advance time before sending padding.
480 const TimeDelta kTimeDiff = TimeDelta::Millis(17);
481 time_controller_.AdvanceTime(kTimeDiff);
482
483 // Timestamps on padding should be offset from the sent media.
484 EXPECT_THAT(
Erik Språng7f110672021-05-26 16:41:20 +0200485 rtp_sender_->GeneratePadding(/*target_size_bytes=*/100,
486 /*media_has_been_sent=*/true),
Erik Språngdb285552021-05-18 16:38:32 +0200487 Each(AllOf(
488 Pointee(Property(&RtpPacketToSend::padding_size, kMaxPaddingLength)),
489 Pointee(Property(
490 &RtpPacketToSend::Timestamp,
491 start_timestamp + (kTimestampTicksPerMs * kTimeDiff.ms()))),
492 Pointee(Property(&RtpPacketToSend::capture_time_ms,
493 start_time + kTimeDiff.ms())))));
494}
495
Erik Språng7f110672021-05-26 16:41:20 +0200496TEST_F(RtpSenderTest, KeepsTimestampsOnPayloadPadding) {
497 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Erik Språngdb285552021-05-18 16:38:32 +0200498 TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId));
499 EnableRtx();
500 // Timestamps as set based on capture time in RtpSenderTest.
501 const int64_t start_time = clock_->TimeInMilliseconds();
502 const uint32_t start_timestamp = start_time * kTimestampTicksPerMs;
503 const size_t kPayloadSize = 600;
504 const size_t kRtxHeaderSize = 2;
505
506 // Start by sending one media packet and putting in the packet history.
507 EXPECT_CALL(
508 mock_paced_sender_,
Erik Språng8f8bf252021-05-26 12:29:22 +0200509 EnqueuePackets(ElementsAre(AllOf(
Erik Språngdb285552021-05-18 16:38:32 +0200510 Pointee(Property(&RtpPacketToSend::padding_size, 0u)),
511 Pointee(Property(&RtpPacketToSend::Timestamp, start_timestamp)),
512 Pointee(Property(&RtpPacketToSend::capture_time_ms, start_time))))));
513 std::unique_ptr<RtpPacketToSend> media_packet =
514 SendPacket(start_time, kPayloadSize);
Erik Språng7f110672021-05-26 16:41:20 +0200515 packet_history_->PutRtpPacket(std::move(media_packet), start_time);
Erik Språngdb285552021-05-18 16:38:32 +0200516
517 // Advance time before sending padding.
518 const TimeDelta kTimeDiff = TimeDelta::Millis(17);
519 time_controller_.AdvanceTime(kTimeDiff);
520
521 // Timestamps on payload padding should be set to original.
522 EXPECT_THAT(
Erik Språng7f110672021-05-26 16:41:20 +0200523 rtp_sender_->GeneratePadding(/*target_size_bytes=*/100,
524 /*media_has_been_sent=*/true),
Erik Språngdb285552021-05-18 16:38:32 +0200525 Each(AllOf(
526 Pointee(Property(&RtpPacketToSend::padding_size, 0u)),
527 Pointee(Property(&RtpPacketToSend::payload_size,
528 kPayloadSize + kRtxHeaderSize)),
529 Pointee(Property(&RtpPacketToSend::Timestamp, start_timestamp)),
530 Pointee(Property(&RtpPacketToSend::capture_time_ms, start_time)))));
531}
532
Steve Anton296a0ce2018-03-22 15:17:27 -0700533// Test that the MID header extension is included on sent packets when
534// configured.
Erik Språng7f110672021-05-26 16:41:20 +0200535TEST_F(RtpSenderTest, MidIncludedOnSentPackets) {
Steve Anton296a0ce2018-03-22 15:17:27 -0700536 const char kMid[] = "mid";
Steve Anton2bac7da2019-07-21 15:04:21 -0400537 EnableMidSending(kMid);
Steve Anton296a0ce2018-03-22 15:17:27 -0700538
Erik Språng770acab2021-05-26 10:01:17 +0200539 // Send a couple packets, expect both packets to have the MID set.
540 EXPECT_CALL(mock_paced_sender_,
541 EnqueuePackets(ElementsAre(Pointee(
542 Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid)))))
543 .Times(2);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100544 SendGenericPacket();
545 SendGenericPacket();
Steve Anton296a0ce2018-03-22 15:17:27 -0700546}
547
Erik Språng7f110672021-05-26 16:41:20 +0200548TEST_F(RtpSenderTest, RidIncludedOnSentPackets) {
Amit Hilbuch77938e62018-12-21 09:23:38 -0800549 const char kRid[] = "f";
Steve Anton2bac7da2019-07-21 15:04:21 -0400550 EnableRidSending(kRid);
Amit Hilbuch77938e62018-12-21 09:23:38 -0800551
Erik Språng770acab2021-05-26 10:01:17 +0200552 EXPECT_CALL(mock_paced_sender_,
553 EnqueuePackets(ElementsAre(Pointee(Property(
554 &RtpPacketToSend::GetExtension<RtpStreamId>, kRid)))));
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100555 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -0800556}
557
Erik Språng7f110672021-05-26 16:41:20 +0200558TEST_F(RtpSenderTest, RidIncludedOnRtxSentPackets) {
Amit Hilbuch77938e62018-12-21 09:23:38 -0800559 const char kRid[] = "f";
Steve Anton2bac7da2019-07-21 15:04:21 -0400560 EnableRtx();
561 EnableRidSending(kRid);
Amit Hilbuch77938e62018-12-21 09:23:38 -0800562
Erik Språng770acab2021-05-26 10:01:17 +0200563 EXPECT_CALL(mock_paced_sender_,
564 EnqueuePackets(ElementsAre(Pointee(AllOf(
565 Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid),
566 Property(&RtpPacketToSend::HasExtension<RepairedRtpStreamId>,
567 false))))))
568 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200569 packet_history_->PutRtpPacket(std::move(packets[0]),
570 clock_->TimeInMilliseconds());
Erik Språng770acab2021-05-26 10:01:17 +0200571 });
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100572 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -0800573
Erik Språng770acab2021-05-26 10:01:17 +0200574 EXPECT_CALL(
575 mock_paced_sender_,
576 EnqueuePackets(ElementsAre(Pointee(AllOf(
577 Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>, kRid),
578 Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
Erik Språng7f110672021-05-26 16:41:20 +0200579 rtp_sender_->ReSendPacket(kSeqNum);
Amit Hilbuch77938e62018-12-21 09:23:38 -0800580}
581
Erik Språng7f110672021-05-26 16:41:20 +0200582TEST_F(RtpSenderTest, MidAndRidNotIncludedOnSentPacketsAfterAck) {
Steve Anton2bac7da2019-07-21 15:04:21 -0400583 const char kMid[] = "mid";
584 const char kRid[] = "f";
585
586 EnableMidSending(kMid);
587 EnableRidSending(kRid);
588
589 // This first packet should include both MID and RID.
Erik Språng770acab2021-05-26 10:01:17 +0200590 EXPECT_CALL(
591 mock_paced_sender_,
592 EnqueuePackets(ElementsAre(Pointee(AllOf(
593 Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
594 Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))));
Steve Anton2bac7da2019-07-21 15:04:21 -0400595 auto first_built_packet = SendGenericPacket();
Erik Språng7f110672021-05-26 16:41:20 +0200596 rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -0400597
598 // The second packet should include neither since an ack was received.
Erik Språng770acab2021-05-26 10:01:17 +0200599 EXPECT_CALL(
600 mock_paced_sender_,
601 EnqueuePackets(ElementsAre(Pointee(AllOf(
602 Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
603 Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
Steve Anton2bac7da2019-07-21 15:04:21 -0400604 SendGenericPacket();
Steve Anton2bac7da2019-07-21 15:04:21 -0400605}
606
Erik Språng7f110672021-05-26 16:41:20 +0200607TEST_F(RtpSenderTest, MidAndRidAlwaysIncludedOnSentPacketsWhenConfigured) {
608 SetUpRtpSender(false, /*always_send_mid_and_rid=*/true, nullptr);
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100609 const char kMid[] = "mid";
610 const char kRid[] = "f";
611 EnableMidSending(kMid);
612 EnableRidSending(kRid);
613
614 // Send two media packets: one before and one after the ack.
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100615 // Due to the configuration, both sent packets should contain MID and RID.
Erik Språng770acab2021-05-26 10:01:17 +0200616 EXPECT_CALL(
617 mock_paced_sender_,
618 EnqueuePackets(ElementsAre(Pointee(
619 AllOf(Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
620 Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))))
621 .Times(2);
622 auto first_built_packet = SendGenericPacket();
Erik Språng7f110672021-05-26 16:41:20 +0200623 rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
Erik Språng770acab2021-05-26 10:01:17 +0200624 SendGenericPacket();
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100625}
626
Steve Anton2bac7da2019-07-21 15:04:21 -0400627// Test that the first RTX packet includes both MID and RRID even if the packet
628// being retransmitted did not have MID or RID. The MID and RID are needed on
629// the first packets for a given SSRC, and RTX packets are sent on a separate
630// SSRC.
Erik Språng7f110672021-05-26 16:41:20 +0200631TEST_F(RtpSenderTest, MidAndRidIncludedOnFirstRtxPacket) {
Steve Anton2bac7da2019-07-21 15:04:21 -0400632 const char kMid[] = "mid";
633 const char kRid[] = "f";
634
635 EnableRtx();
636 EnableMidSending(kMid);
637 EnableRidSending(kRid);
638
639 // This first packet will include both MID and RID.
Erik Språng770acab2021-05-26 10:01:17 +0200640 EXPECT_CALL(mock_paced_sender_, EnqueuePackets);
Steve Anton2bac7da2019-07-21 15:04:21 -0400641 auto first_built_packet = SendGenericPacket();
Erik Språng7f110672021-05-26 16:41:20 +0200642 rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -0400643
Erik Språng770acab2021-05-26 10:01:17 +0200644 // The second packet will include neither since an ack was received, put
645 // it in the packet history for retransmission.
646 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
647 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200648 packet_history_->PutRtpPacket(std::move(packets[0]),
649 clock_->TimeInMilliseconds());
Erik Språng770acab2021-05-26 10:01:17 +0200650 });
Steve Anton2bac7da2019-07-21 15:04:21 -0400651 auto second_built_packet = SendGenericPacket();
652
653 // The first RTX packet should include MID and RRID.
Erik Språng770acab2021-05-26 10:01:17 +0200654 EXPECT_CALL(mock_paced_sender_,
655 EnqueuePackets(ElementsAre(Pointee(AllOf(
656 Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
657 Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>,
658 kRid))))));
Erik Språng7f110672021-05-26 16:41:20 +0200659 rtp_sender_->ReSendPacket(second_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -0400660}
661
662// Test that the RTX packets sent after receving an ACK on the RTX SSRC does
663// not include either MID or RRID even if the packet being retransmitted did
664// had a MID or RID.
Erik Språng7f110672021-05-26 16:41:20 +0200665TEST_F(RtpSenderTest, MidAndRidNotIncludedOnRtxPacketsAfterAck) {
Steve Anton2bac7da2019-07-21 15:04:21 -0400666 const char kMid[] = "mid";
667 const char kRid[] = "f";
668
669 EnableRtx();
670 EnableMidSending(kMid);
671 EnableRidSending(kRid);
672
673 // This first packet will include both MID and RID.
Erik Språng770acab2021-05-26 10:01:17 +0200674 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
675 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200676 packet_history_->PutRtpPacket(std::move(packets[0]),
677 clock_->TimeInMilliseconds());
Erik Språng770acab2021-05-26 10:01:17 +0200678 });
Steve Anton2bac7da2019-07-21 15:04:21 -0400679 auto first_built_packet = SendGenericPacket();
Erik Språng7f110672021-05-26 16:41:20 +0200680 rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -0400681
682 // The second packet will include neither since an ack was received.
Erik Språng770acab2021-05-26 10:01:17 +0200683 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
684 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200685 packet_history_->PutRtpPacket(std::move(packets[0]),
686 clock_->TimeInMilliseconds());
Erik Språng770acab2021-05-26 10:01:17 +0200687 });
Steve Anton2bac7da2019-07-21 15:04:21 -0400688 auto second_built_packet = SendGenericPacket();
689
690 // The first RTX packet will include MID and RRID.
Erik Språng770acab2021-05-26 10:01:17 +0200691 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
692 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200693 rtp_sender_->OnReceivedAckOnRtxSsrc(packets[0]->SequenceNumber());
694 packet_history_->MarkPacketAsSent(
Erik Språng770acab2021-05-26 10:01:17 +0200695 *packets[0]->retransmitted_sequence_number());
696 });
Erik Språng7f110672021-05-26 16:41:20 +0200697 rtp_sender_->ReSendPacket(second_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -0400698
699 // The second and third RTX packets should not include MID nor RRID.
Erik Språng770acab2021-05-26 10:01:17 +0200700 EXPECT_CALL(mock_paced_sender_,
701 EnqueuePackets(ElementsAre(Pointee(AllOf(
702 Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
703 Property(&RtpPacketToSend::HasExtension<RepairedRtpStreamId>,
704 false))))))
705 .Times(2);
Erik Språng7f110672021-05-26 16:41:20 +0200706 rtp_sender_->ReSendPacket(first_built_packet->SequenceNumber());
707 rtp_sender_->ReSendPacket(second_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -0400708}
709
Erik Språng7f110672021-05-26 16:41:20 +0200710TEST_F(RtpSenderTest, MidAndRidAlwaysIncludedOnRtxPacketsWhenConfigured) {
711 SetUpRtpSender(false, /*always_send_mid_and_rid=*/true, nullptr);
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100712 const char kMid[] = "mid";
713 const char kRid[] = "f";
714 EnableRtx();
715 EnableMidSending(kMid);
716 EnableRidSending(kRid);
717
718 // Send two media packets: one before and one after the ack.
Erik Språng770acab2021-05-26 10:01:17 +0200719 EXPECT_CALL(
720 mock_paced_sender_,
721 EnqueuePackets(ElementsAre(Pointee(
722 AllOf(Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
723 Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))))
724 .Times(2)
725 .WillRepeatedly(
726 [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200727 packet_history_->PutRtpPacket(std::move(packets[0]),
728 clock_->TimeInMilliseconds());
Erik Språng770acab2021-05-26 10:01:17 +0200729 });
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100730 auto media_packet1 = SendGenericPacket();
Erik Språng7f110672021-05-26 16:41:20 +0200731 rtp_sender_->OnReceivedAckOnSsrc(media_packet1->SequenceNumber());
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100732 auto media_packet2 = SendGenericPacket();
733
734 // Send three RTX packets with different combinations of orders w.r.t. the
735 // media and RTX acks.
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100736 // Due to the configuration, all sent packets should contain MID
737 // and either RID (media) or RRID (RTX).
Erik Språng770acab2021-05-26 10:01:17 +0200738 EXPECT_CALL(mock_paced_sender_,
739 EnqueuePackets(ElementsAre(Pointee(AllOf(
740 Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
741 Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>,
742 kRid))))))
743 .Times(3)
744 .WillRepeatedly(
745 [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200746 rtp_sender_->OnReceivedAckOnRtxSsrc(packets[0]->SequenceNumber());
747 packet_history_->MarkPacketAsSent(
Erik Språng770acab2021-05-26 10:01:17 +0200748 *packets[0]->retransmitted_sequence_number());
749 });
Erik Språng7f110672021-05-26 16:41:20 +0200750 rtp_sender_->ReSendPacket(media_packet2->SequenceNumber());
751 rtp_sender_->ReSendPacket(media_packet1->SequenceNumber());
752 rtp_sender_->ReSendPacket(media_packet2->SequenceNumber());
Rasmus Brandtce588ae2020-03-10 14:12:48 +0100753}
754
Steve Anton2bac7da2019-07-21 15:04:21 -0400755// Test that if the RtpState indicates an ACK has been received on that SSRC
756// then neither the MID nor RID header extensions will be sent.
Erik Språng7f110672021-05-26 16:41:20 +0200757TEST_F(RtpSenderTest, MidAndRidNotIncludedOnSentPacketsAfterRtpStateRestored) {
Steve Anton2bac7da2019-07-21 15:04:21 -0400758 const char kMid[] = "mid";
759 const char kRid[] = "f";
760
761 EnableMidSending(kMid);
762 EnableRidSending(kRid);
763
Erik Språng7f110672021-05-26 16:41:20 +0200764 RtpState state = rtp_sender_->GetRtpState();
Steve Anton2bac7da2019-07-21 15:04:21 -0400765 EXPECT_FALSE(state.ssrc_has_acked);
766 state.ssrc_has_acked = true;
Erik Språng7f110672021-05-26 16:41:20 +0200767 rtp_sender_->SetRtpState(state);
Steve Anton2bac7da2019-07-21 15:04:21 -0400768
Erik Språng770acab2021-05-26 10:01:17 +0200769 EXPECT_CALL(
770 mock_paced_sender_,
771 EnqueuePackets(ElementsAre(Pointee(AllOf(
772 Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
773 Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
Steve Anton2bac7da2019-07-21 15:04:21 -0400774 SendGenericPacket();
Steve Anton2bac7da2019-07-21 15:04:21 -0400775}
776
777// Test that if the RTX RtpState indicates an ACK has been received on that
778// RTX SSRC then neither the MID nor RRID header extensions will be sent on
779// RTX packets.
Erik Språng7f110672021-05-26 16:41:20 +0200780TEST_F(RtpSenderTest, MidAndRridNotIncludedOnRtxPacketsAfterRtpStateRestored) {
Steve Anton2bac7da2019-07-21 15:04:21 -0400781 const char kMid[] = "mid";
782 const char kRid[] = "f";
783
784 EnableRtx();
785 EnableMidSending(kMid);
786 EnableRidSending(kRid);
787
Erik Språng7f110672021-05-26 16:41:20 +0200788 RtpState rtx_state = rtp_sender_->GetRtxRtpState();
Steve Anton2bac7da2019-07-21 15:04:21 -0400789 EXPECT_FALSE(rtx_state.ssrc_has_acked);
790 rtx_state.ssrc_has_acked = true;
Erik Språng7f110672021-05-26 16:41:20 +0200791 rtp_sender_->SetRtxRtpState(rtx_state);
Steve Anton2bac7da2019-07-21 15:04:21 -0400792
Erik Språng770acab2021-05-26 10:01:17 +0200793 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
794 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200795 packet_history_->PutRtpPacket(std::move(packets[0]),
796 clock_->TimeInMilliseconds());
Erik Språng770acab2021-05-26 10:01:17 +0200797 });
Steve Anton2bac7da2019-07-21 15:04:21 -0400798 auto built_packet = SendGenericPacket();
Steve Anton2bac7da2019-07-21 15:04:21 -0400799
Erik Språng770acab2021-05-26 10:01:17 +0200800 EXPECT_CALL(
801 mock_paced_sender_,
802 EnqueuePackets(ElementsAre(Pointee(AllOf(
803 Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
804 Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
Erik Språng7f110672021-05-26 16:41:20 +0200805 ASSERT_LT(0, rtp_sender_->ReSendPacket(built_packet->SequenceNumber()));
Steve Anton2bac7da2019-07-21 15:04:21 -0400806}
807
Erik Språng7f110672021-05-26 16:41:20 +0200808TEST_F(RtpSenderTest, RespectsNackBitrateLimit) {
sprang38778b02015-09-29 09:48:22 -0700809 const int32_t kPacketSize = 1400;
810 const int32_t kNumPackets = 30;
811
sprangcd349d92016-07-13 09:11:28 -0700812 retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8);
813
Erik Språng7f110672021-05-26 16:41:20 +0200814 packet_history_->SetStorePacketsStatus(
Erik Språng77b75292019-10-28 15:51:36 +0100815 RtpPacketHistory::StorageMode::kStoreAndCull, kNumPackets);
Erik Språng7f110672021-05-26 16:41:20 +0200816 const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber();
Danil Chapovalov2800d742016-08-26 18:48:46 +0200817 std::vector<uint16_t> sequence_numbers;
sprang38778b02015-09-29 09:48:22 -0700818 for (int32_t i = 0; i < kNumPackets; ++i) {
819 sequence_numbers.push_back(kStartSequenceNumber + i);
Erik Språng62032d42020-07-03 19:38:04 +0200820 time_controller_.AdvanceTime(TimeDelta::Millis(1));
Erik Språng8f8bf252021-05-26 12:29:22 +0200821 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
822 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200823 packet_history_->PutRtpPacket(std::move(packets[0]),
824 clock_->TimeInMilliseconds());
Erik Språng8f8bf252021-05-26 12:29:22 +0200825 });
Erik Språng62032d42020-07-03 19:38:04 +0200826 SendPacket(clock_->TimeInMilliseconds(), kPacketSize);
sprang38778b02015-09-29 09:48:22 -0700827 }
sprang38778b02015-09-29 09:48:22 -0700828
Erik Språng62032d42020-07-03 19:38:04 +0200829 time_controller_.AdvanceTime(TimeDelta::Millis(1000 - kNumPackets));
sprang38778b02015-09-29 09:48:22 -0700830
831 // Resending should work - brings the bandwidth up to the limit.
832 // NACK bitrate is capped to the same bitrate as the encoder, since the max
833 // protection overhead is 50% (see MediaOptimization::SetTargetRates).
Erik Språng8f8bf252021-05-26 12:29:22 +0200834 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(ElementsAre(Pointee(Property(
835 &RtpPacketToSend::packet_type,
836 RtpPacketMediaType::kRetransmission)))))
837 .Times(kNumPackets)
838 .WillRepeatedly(
839 [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
840 for (const auto& packet : packets) {
Erik Språng7f110672021-05-26 16:41:20 +0200841 packet_history_->MarkPacketAsSent(
Erik Språng8f8bf252021-05-26 12:29:22 +0200842 *packet->retransmitted_sequence_number());
843 }
844 });
Erik Språng7f110672021-05-26 16:41:20 +0200845 rtp_sender_->OnReceivedNack(sequence_numbers, 0);
sprang38778b02015-09-29 09:48:22 -0700846
sprangcd349d92016-07-13 09:11:28 -0700847 // Must be at least 5ms in between retransmission attempts.
Erik Språng62032d42020-07-03 19:38:04 +0200848 time_controller_.AdvanceTime(TimeDelta::Millis(5));
sprangcd349d92016-07-13 09:11:28 -0700849
sprang38778b02015-09-29 09:48:22 -0700850 // Resending should not work, bandwidth exceeded.
Erik Språng8f8bf252021-05-26 12:29:22 +0200851 EXPECT_CALL(mock_paced_sender_, EnqueuePackets).Times(0);
Erik Språng7f110672021-05-26 16:41:20 +0200852 rtp_sender_->OnReceivedNack(sequence_numbers, 0);
sprang38778b02015-09-29 09:48:22 -0700853}
854
Erik Språng7f110672021-05-26 16:41:20 +0200855TEST_F(RtpSenderTest, UpdatingCsrcsUpdatedOverhead) {
856 RtpRtcpInterface::Configuration config = GetDefaultConfig();
857 config.rtx_send_ssrc = {};
858 CreateSender(config);
michaelt4da30442016-11-17 01:38:43 -0800859
Erik Språng04e1bab2020-05-07 18:18:32 +0200860 // Base RTP overhead is 12B.
Erik Språng7f110672021-05-26 16:41:20 +0200861 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
Erik Språng04e1bab2020-05-07 18:18:32 +0200862
863 // Adding two csrcs adds 2*4 bytes to the header.
Erik Språng7f110672021-05-26 16:41:20 +0200864 rtp_sender_->SetCsrcs({1, 2});
865 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 20u);
Erik Språng04e1bab2020-05-07 18:18:32 +0200866}
867
Erik Språng7f110672021-05-26 16:41:20 +0200868TEST_F(RtpSenderTest, OnOverheadChanged) {
869 RtpRtcpInterface::Configuration config = GetDefaultConfig();
870 config.rtx_send_ssrc = {};
871 CreateSender(config);
Erik Språng04e1bab2020-05-07 18:18:32 +0200872
873 // Base RTP overhead is 12B.
Erik Språng7f110672021-05-26 16:41:20 +0200874 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
michaelt4da30442016-11-17 01:38:43 -0800875
Erik Språng7f110672021-05-26 16:41:20 +0200876 rtp_sender_->RegisterRtpHeaderExtension(TransmissionOffset::kUri,
877 kTransmissionTimeOffsetExtensionId);
michaelt4da30442016-11-17 01:38:43 -0800878
Erik Språng04e1bab2020-05-07 18:18:32 +0200879 // TransmissionTimeOffset extension has a size of 3B, but with the addition
880 // of header index and rounding to 4 byte boundary we end up with 20B total.
Erik Språng7f110672021-05-26 16:41:20 +0200881 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 20u);
michaelt4da30442016-11-17 01:38:43 -0800882}
883
Erik Språng7f110672021-05-26 16:41:20 +0200884TEST_F(RtpSenderTest, CountMidOnlyUntilAcked) {
885 RtpRtcpInterface::Configuration config = GetDefaultConfig();
886 config.rtx_send_ssrc = {};
887 CreateSender(config);
michaelt4da30442016-11-17 01:38:43 -0800888
Erik Språng04e1bab2020-05-07 18:18:32 +0200889 // Base RTP overhead is 12B.
Erik Språng7f110672021-05-26 16:41:20 +0200890 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
Erik Språng04e1bab2020-05-07 18:18:32 +0200891
Erik Språng7f110672021-05-26 16:41:20 +0200892 rtp_sender_->RegisterRtpHeaderExtension(RtpMid::kUri, kMidExtensionId);
893 rtp_sender_->RegisterRtpHeaderExtension(RtpStreamId::kUri, kRidExtensionId);
Erik Språng04e1bab2020-05-07 18:18:32 +0200894
895 // Counted only if set.
Erik Språng7f110672021-05-26 16:41:20 +0200896 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
897 rtp_sender_->SetMid("foo");
898 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 36u);
899 rtp_sender_->SetRid("bar");
900 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 52u);
Erik Språng04e1bab2020-05-07 18:18:32 +0200901
902 // Ack received, mid/rid no longer sent.
Erik Språng7f110672021-05-26 16:41:20 +0200903 rtp_sender_->OnReceivedAckOnSsrc(0);
904 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
michaelt4da30442016-11-17 01:38:43 -0800905}
906
Erik Språng7f110672021-05-26 16:41:20 +0200907TEST_F(RtpSenderTest, DontCountVolatileExtensionsIntoOverhead) {
908 RtpRtcpInterface::Configuration config = GetDefaultConfig();
909 config.rtx_send_ssrc = {};
910 CreateSender(config);
Erik Språngadaec452020-05-13 15:04:35 +0200911
912 // Base RTP overhead is 12B.
Erik Språng7f110672021-05-26 16:41:20 +0200913 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
Erik Språngadaec452020-05-13 15:04:35 +0200914
Erik Språng7f110672021-05-26 16:41:20 +0200915 rtp_sender_->RegisterRtpHeaderExtension(InbandComfortNoiseExtension::kUri, 1);
916 rtp_sender_->RegisterRtpHeaderExtension(AbsoluteCaptureTimeExtension::kUri,
917 2);
918 rtp_sender_->RegisterRtpHeaderExtension(VideoOrientation::kUri, 3);
919 rtp_sender_->RegisterRtpHeaderExtension(PlayoutDelayLimits::kUri, 4);
920 rtp_sender_->RegisterRtpHeaderExtension(VideoContentTypeExtension::kUri, 5);
921 rtp_sender_->RegisterRtpHeaderExtension(VideoTimingExtension::kUri, 6);
922 rtp_sender_->RegisterRtpHeaderExtension(RepairedRtpStreamId::kUri, 7);
923 rtp_sender_->RegisterRtpHeaderExtension(ColorSpaceExtension::kUri, 8);
Erik Språngadaec452020-05-13 15:04:35 +0200924
925 // Still only 12B counted since can't count on above being sent.
Erik Språng7f110672021-05-26 16:41:20 +0200926 EXPECT_EQ(rtp_sender_->ExpectedPerPacketOverhead(), 12u);
Erik Språngadaec452020-05-13 15:04:35 +0200927}
928
Erik Språng7f110672021-05-26 16:41:20 +0200929TEST_F(RtpSenderTest, SendPacketHandlesRetransmissionHistory) {
930 packet_history_->SetStorePacketsStatus(
Erik Språng77b75292019-10-28 15:51:36 +0100931 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
Erik Språng9c771c22019-06-17 16:31:53 +0200932
Tomas Gunnarsson096c0b02020-06-29 13:56:15 +0200933 // Ignore calls to EnqueuePackets() for this test.
934 EXPECT_CALL(mock_paced_sender_, EnqueuePackets).WillRepeatedly(Return());
935
Erik Språng36005af2021-05-24 18:50:04 +0200936 // Build a media packet and put in the packet history.
Erik Språng9c771c22019-06-17 16:31:53 +0200937 std::unique_ptr<RtpPacketToSend> packet =
Erik Språng62032d42020-07-03 19:38:04 +0200938 BuildRtpPacket(kPayload, true, 0, clock_->TimeInMilliseconds());
Erik Språng9c771c22019-06-17 16:31:53 +0200939 const uint16_t media_sequence_number = packet->SequenceNumber();
Erik Språng9c771c22019-06-17 16:31:53 +0200940 packet->set_allow_retransmission(true);
Erik Språng7f110672021-05-26 16:41:20 +0200941 packet_history_->PutRtpPacket(std::move(packet),
942 clock_->TimeInMilliseconds());
Erik Språng9c771c22019-06-17 16:31:53 +0200943
Erik Språng36005af2021-05-24 18:50:04 +0200944 // Simulate successful retransmission request.
Erik Språng62032d42020-07-03 19:38:04 +0200945 time_controller_.AdvanceTime(TimeDelta::Millis(30));
Erik Språng7f110672021-05-26 16:41:20 +0200946 EXPECT_THAT(rtp_sender_->ReSendPacket(media_sequence_number), Gt(0));
Erik Språng9c771c22019-06-17 16:31:53 +0200947
948 // Packet already pending, retransmission not allowed.
Erik Språng62032d42020-07-03 19:38:04 +0200949 time_controller_.AdvanceTime(TimeDelta::Millis(30));
Erik Språng7f110672021-05-26 16:41:20 +0200950 EXPECT_THAT(rtp_sender_->ReSendPacket(media_sequence_number), Eq(0));
Erik Språng9c771c22019-06-17 16:31:53 +0200951
Erik Språng36005af2021-05-24 18:50:04 +0200952 // Simulate packet exiting pacer, mark as not longer pending.
Erik Språng7f110672021-05-26 16:41:20 +0200953 packet_history_->MarkPacketAsSent(media_sequence_number);
Erik Språng9c771c22019-06-17 16:31:53 +0200954
955 // Retransmissions allowed again.
Erik Språng62032d42020-07-03 19:38:04 +0200956 time_controller_.AdvanceTime(TimeDelta::Millis(30));
Erik Språng7f110672021-05-26 16:41:20 +0200957 EXPECT_THAT(rtp_sender_->ReSendPacket(media_sequence_number), Gt(0));
Erik Språng36005af2021-05-24 18:50:04 +0200958}
Erik Språng9c771c22019-06-17 16:31:53 +0200959
Erik Språng7f110672021-05-26 16:41:20 +0200960TEST_F(RtpSenderTest, MarksRetransmittedPackets) {
961 packet_history_->SetStorePacketsStatus(
Erik Språng36005af2021-05-24 18:50:04 +0200962 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
963
964 // Build a media packet and put in the packet history.
965 std::unique_ptr<RtpPacketToSend> packet =
966 BuildRtpPacket(kPayload, true, 0, clock_->TimeInMilliseconds());
967 const uint16_t media_sequence_number = packet->SequenceNumber();
968 packet->set_allow_retransmission(true);
Erik Språng7f110672021-05-26 16:41:20 +0200969 packet_history_->PutRtpPacket(std::move(packet),
970 clock_->TimeInMilliseconds());
Erik Språng36005af2021-05-24 18:50:04 +0200971
972 // Expect a retransmission packet marked with which packet it is a
973 // retransmit of.
974 EXPECT_CALL(
975 mock_paced_sender_,
976 EnqueuePackets(ElementsAre(AllOf(
977 Pointee(Property(&RtpPacketToSend::packet_type,
978 RtpPacketMediaType::kRetransmission)),
979 Pointee(Property(&RtpPacketToSend::retransmitted_sequence_number,
980 Eq(media_sequence_number)))))));
Erik Språng7f110672021-05-26 16:41:20 +0200981 EXPECT_THAT(rtp_sender_->ReSendPacket(media_sequence_number), Gt(0));
Erik Språng9c771c22019-06-17 16:31:53 +0200982}
983
Erik Språng7f110672021-05-26 16:41:20 +0200984TEST_F(RtpSenderTest, GeneratedPaddingHasBweExtensions) {
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +0000985 // Min requested size in order to use RTX payload.
986 const size_t kMinPaddingSize = 50;
Erik Språng8f8bf252021-05-26 12:29:22 +0200987 EnableRtx();
Erik Språng478cb462019-06-26 15:49:27 +0200988
Erik Språng7f110672021-05-26 16:41:20 +0200989 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +0100990 TransmissionOffset::kUri, kTransmissionTimeOffsetExtensionId));
Erik Språng7f110672021-05-26 16:41:20 +0200991 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +0100992 AbsoluteSendTime::kUri, kAbsoluteSendTimeExtensionId));
Erik Språng7f110672021-05-26 16:41:20 +0200993 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +0100994 TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId));
Erik Språng0f6191d2019-07-15 20:33:40 +0200995
Erik Språng8f8bf252021-05-26 12:29:22 +0200996 // Put a packet in the history, in order to facilitate payload padding.
Erik Språnge886d2e2020-04-16 15:07:56 +0200997 std::unique_ptr<RtpPacketToSend> packet =
Erik Språng62032d42020-07-03 19:38:04 +0200998 BuildRtpPacket(kPayload, true, 0, clock_->TimeInMilliseconds());
Erik Språnge886d2e2020-04-16 15:07:56 +0200999 packet->set_allow_retransmission(true);
1000 packet->SetPayloadSize(kMinPaddingSize);
1001 packet->set_packet_type(RtpPacketMediaType::kVideo);
Erik Språng7f110672021-05-26 16:41:20 +02001002 packet_history_->PutRtpPacket(std::move(packet),
1003 clock_->TimeInMilliseconds());
Erik Språnge886d2e2020-04-16 15:07:56 +02001004
1005 // Generate a plain padding packet, check that extensions are registered.
1006 std::vector<std::unique_ptr<RtpPacketToSend>> generated_packets =
Erik Språng7f110672021-05-26 16:41:20 +02001007 rtp_sender_->GeneratePadding(/*target_size_bytes=*/1, true);
Erik Språnge886d2e2020-04-16 15:07:56 +02001008 ASSERT_THAT(generated_packets, SizeIs(1));
1009 auto& plain_padding = generated_packets.front();
1010 EXPECT_GT(plain_padding->padding_size(), 0u);
1011 EXPECT_TRUE(plain_padding->HasExtension<TransportSequenceNumber>());
1012 EXPECT_TRUE(plain_padding->HasExtension<AbsoluteSendTime>());
1013 EXPECT_TRUE(plain_padding->HasExtension<TransmissionOffset>());
Erik Språng8f8bf252021-05-26 12:29:22 +02001014 EXPECT_GT(plain_padding->padding_size(), 0u);
Erik Språnge886d2e2020-04-16 15:07:56 +02001015
1016 // Generate a payload padding packets, check that extensions are registered.
Erik Språng7f110672021-05-26 16:41:20 +02001017 generated_packets = rtp_sender_->GeneratePadding(kMinPaddingSize, true);
Erik Språnge886d2e2020-04-16 15:07:56 +02001018 ASSERT_EQ(generated_packets.size(), 1u);
1019 auto& payload_padding = generated_packets.front();
1020 EXPECT_EQ(payload_padding->padding_size(), 0u);
1021 EXPECT_TRUE(payload_padding->HasExtension<TransportSequenceNumber>());
1022 EXPECT_TRUE(payload_padding->HasExtension<AbsoluteSendTime>());
1023 EXPECT_TRUE(payload_padding->HasExtension<TransmissionOffset>());
Erik Språng8f8bf252021-05-26 12:29:22 +02001024 EXPECT_GT(payload_padding->payload_size(), 0u);
Erik Språnge886d2e2020-04-16 15:07:56 +02001025}
1026
Erik Språng7f110672021-05-26 16:41:20 +02001027TEST_F(RtpSenderTest, GeneratePaddingResendsOldPacketsWithRtx) {
Erik Språnge886d2e2020-04-16 15:07:56 +02001028 // Min requested size in order to use RTX payload.
1029 const size_t kMinPaddingSize = 50;
1030
Erik Språng7f110672021-05-26 16:41:20 +02001031 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
1032 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
1033 packet_history_->SetStorePacketsStatus(
Erik Språnge886d2e2020-04-16 15:07:56 +02001034 RtpPacketHistory::StorageMode::kStoreAndCull, 1);
1035
Erik Språng7f110672021-05-26 16:41:20 +02001036 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +01001037 TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId));
Erik Språnge886d2e2020-04-16 15:07:56 +02001038
1039 const size_t kPayloadPacketSize = kMinPaddingSize;
Erik Språng478cb462019-06-26 15:49:27 +02001040 std::unique_ptr<RtpPacketToSend> packet =
Erik Språng62032d42020-07-03 19:38:04 +02001041 BuildRtpPacket(kPayload, true, 0, clock_->TimeInMilliseconds());
Erik Språng478cb462019-06-26 15:49:27 +02001042 packet->set_allow_retransmission(true);
1043 packet->SetPayloadSize(kPayloadPacketSize);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001044 packet->set_packet_type(RtpPacketMediaType::kVideo);
Erik Språng7f110672021-05-26 16:41:20 +02001045 packet_history_->PutRtpPacket(std::move(packet),
1046 clock_->TimeInMilliseconds());
Erik Språng478cb462019-06-26 15:49:27 +02001047
1048 // Generated padding has large enough budget that the video packet should be
1049 // retransmitted as padding.
Erik Språngf6468d22019-07-05 16:53:43 +02001050 std::vector<std::unique_ptr<RtpPacketToSend>> generated_packets =
Erik Språng7f110672021-05-26 16:41:20 +02001051 rtp_sender_->GeneratePadding(kMinPaddingSize, true);
Erik Språngf6468d22019-07-05 16:53:43 +02001052 ASSERT_EQ(generated_packets.size(), 1u);
1053 auto& padding_packet = generated_packets.front();
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001054 EXPECT_EQ(padding_packet->packet_type(), RtpPacketMediaType::kPadding);
Erik Språngf6468d22019-07-05 16:53:43 +02001055 EXPECT_EQ(padding_packet->Ssrc(), kRtxSsrc);
1056 EXPECT_EQ(padding_packet->payload_size(),
1057 kPayloadPacketSize + kRtxHeaderSize);
Erik Språng478cb462019-06-26 15:49:27 +02001058
1059 // Not enough budged for payload padding, use plain padding instead.
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00001060 const size_t kPaddingBytesRequested = kMinPaddingSize - 1;
Erik Språngf6468d22019-07-05 16:53:43 +02001061
1062 size_t padding_bytes_generated = 0;
Erik Språng77b75292019-10-28 15:51:36 +01001063 generated_packets =
Erik Språng7f110672021-05-26 16:41:20 +02001064 rtp_sender_->GeneratePadding(kPaddingBytesRequested, true);
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00001065 EXPECT_EQ(generated_packets.size(), 1u);
Erik Språngf6468d22019-07-05 16:53:43 +02001066 for (auto& packet : generated_packets) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001067 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
Erik Språngf6468d22019-07-05 16:53:43 +02001068 EXPECT_EQ(packet->Ssrc(), kRtxSsrc);
1069 EXPECT_EQ(packet->payload_size(), 0u);
1070 EXPECT_GT(packet->padding_size(), 0u);
1071 padding_bytes_generated += packet->padding_size();
1072 }
1073
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00001074 EXPECT_EQ(padding_bytes_generated, kMaxPaddingSize);
Erik Språng478cb462019-06-26 15:49:27 +02001075}
1076
Erik Språng7f110672021-05-26 16:41:20 +02001077TEST_F(RtpSenderTest, LimitsPayloadPaddingSize) {
Erik Språnge886d2e2020-04-16 15:07:56 +02001078 // Limit RTX payload padding to 2x target size.
1079 const double kFactor = 2.0;
1080 field_trials_.SetMaxPaddingFactor(kFactor);
Erik Språng7f110672021-05-26 16:41:20 +02001081 SetUpRtpSender(false, false, nullptr);
1082 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
1083 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
1084 packet_history_->SetStorePacketsStatus(
Erik Språnge886d2e2020-04-16 15:07:56 +02001085 RtpPacketHistory::StorageMode::kStoreAndCull, 1);
1086
Erik Språng7f110672021-05-26 16:41:20 +02001087 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +01001088 TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId));
Erik Språnge886d2e2020-04-16 15:07:56 +02001089
1090 // Send a dummy video packet so it ends up in the packet history.
1091 const size_t kPayloadPacketSize = 1234u;
1092 std::unique_ptr<RtpPacketToSend> packet =
Erik Språng62032d42020-07-03 19:38:04 +02001093 BuildRtpPacket(kPayload, true, 0, clock_->TimeInMilliseconds());
Erik Språnge886d2e2020-04-16 15:07:56 +02001094 packet->set_allow_retransmission(true);
1095 packet->SetPayloadSize(kPayloadPacketSize);
1096 packet->set_packet_type(RtpPacketMediaType::kVideo);
Erik Språng7f110672021-05-26 16:41:20 +02001097 packet_history_->PutRtpPacket(std::move(packet),
1098 clock_->TimeInMilliseconds());
Erik Språnge886d2e2020-04-16 15:07:56 +02001099
1100 // Smallest target size that will result in the sent packet being returned as
1101 // padding.
1102 const size_t kMinTargerSizeForPayload =
1103 (kPayloadPacketSize + kRtxHeaderSize) / kFactor;
1104
1105 // Generated padding has large enough budget that the video packet should be
1106 // retransmitted as padding.
1107 EXPECT_THAT(
Erik Språng7f110672021-05-26 16:41:20 +02001108 rtp_sender_->GeneratePadding(kMinTargerSizeForPayload, true),
Erik Språnge886d2e2020-04-16 15:07:56 +02001109 AllOf(Not(IsEmpty()),
1110 Each(Pointee(Property(&RtpPacketToSend::padding_size, Eq(0u))))));
1111
1112 // If payload padding is > 2x requested size, plain padding is returned
1113 // instead.
1114 EXPECT_THAT(
Erik Språng7f110672021-05-26 16:41:20 +02001115 rtp_sender_->GeneratePadding(kMinTargerSizeForPayload - 1, true),
Erik Språnge886d2e2020-04-16 15:07:56 +02001116 AllOf(Not(IsEmpty()),
1117 Each(Pointee(Property(&RtpPacketToSend::padding_size, Gt(0u))))));
1118}
1119
Erik Språng7f110672021-05-26 16:41:20 +02001120TEST_F(RtpSenderTest, GeneratePaddingCreatesPurePaddingWithoutRtx) {
1121 packet_history_->SetStorePacketsStatus(
Erik Språng77b75292019-10-28 15:51:36 +01001122 RtpPacketHistory::StorageMode::kStoreAndCull, 1);
Erik Språng7f110672021-05-26 16:41:20 +02001123 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +01001124 TransmissionOffset::kUri, kTransmissionTimeOffsetExtensionId));
Erik Språng7f110672021-05-26 16:41:20 +02001125 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +01001126 AbsoluteSendTime::kUri, kAbsoluteSendTimeExtensionId));
Erik Språng7f110672021-05-26 16:41:20 +02001127 ASSERT_TRUE(rtp_sender_->RegisterRtpHeaderExtension(
Danil Chapovalov35623182021-02-16 11:59:29 +01001128 TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId));
Erik Språng478cb462019-06-26 15:49:27 +02001129
1130 const size_t kPayloadPacketSize = 1234;
1131 // Send a dummy video packet so it ends up in the packet history. Since we
1132 // are not using RTX, it should never be used as padding.
1133 std::unique_ptr<RtpPacketToSend> packet =
Erik Språng62032d42020-07-03 19:38:04 +02001134 BuildRtpPacket(kPayload, true, 0, clock_->TimeInMilliseconds());
Erik Språng478cb462019-06-26 15:49:27 +02001135 packet->set_allow_retransmission(true);
1136 packet->SetPayloadSize(kPayloadPacketSize);
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001137 packet->set_packet_type(RtpPacketMediaType::kVideo);
Erik Språng7f110672021-05-26 16:41:20 +02001138 packet_history_->PutRtpPacket(std::move(packet),
1139 clock_->TimeInMilliseconds());
Erik Språng478cb462019-06-26 15:49:27 +02001140
1141 // Payload padding not available without RTX, only generate plain padding on
1142 // the media SSRC.
1143 // Number of padding packets is the requested padding size divided by max
1144 // padding packet size, rounded up. Pure padding packets are always of the
1145 // maximum size.
1146 const size_t kPaddingBytesRequested = kPayloadPacketSize + kRtxHeaderSize;
1147 const size_t kExpectedNumPaddingPackets =
1148 (kPaddingBytesRequested + kMaxPaddingSize - 1) / kMaxPaddingSize;
Erik Språngf6468d22019-07-05 16:53:43 +02001149 size_t padding_bytes_generated = 0;
1150 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
Erik Språng7f110672021-05-26 16:41:20 +02001151 rtp_sender_->GeneratePadding(kPaddingBytesRequested, true);
Erik Språngf6468d22019-07-05 16:53:43 +02001152 EXPECT_EQ(padding_packets.size(), kExpectedNumPaddingPackets);
1153 for (auto& packet : padding_packets) {
Björn Terelius31d0f7c2020-02-06 16:35:46 +01001154 EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
Erik Språngf6468d22019-07-05 16:53:43 +02001155 EXPECT_EQ(packet->Ssrc(), kSsrc);
1156 EXPECT_EQ(packet->payload_size(), 0u);
1157 EXPECT_GT(packet->padding_size(), 0u);
1158 padding_bytes_generated += packet->padding_size();
Danil Chapovalov629de6f2020-01-16 18:59:01 +01001159 EXPECT_TRUE(packet->HasExtension<TransportSequenceNumber>());
1160 EXPECT_TRUE(packet->HasExtension<AbsoluteSendTime>());
1161 EXPECT_TRUE(packet->HasExtension<TransmissionOffset>());
Erik Språngf6468d22019-07-05 16:53:43 +02001162 }
1163
1164 EXPECT_EQ(padding_bytes_generated,
1165 kExpectedNumPaddingPackets * kMaxPaddingSize);
Erik Språng478cb462019-06-26 15:49:27 +02001166}
1167
Erik Språng7f110672021-05-26 16:41:20 +02001168TEST_F(RtpSenderTest, SupportsPadding) {
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001169 bool kSendingMediaStats[] = {true, false};
1170 bool kEnableRedundantPayloads[] = {true, false};
Danil Chapovalov35623182021-02-16 11:59:29 +01001171 absl::string_view kBweExtensionUris[] = {
1172 TransportSequenceNumber::kUri, TransportSequenceNumberV2::kUri,
1173 AbsoluteSendTime::kUri, TransmissionOffset::kUri};
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001174 const int kExtensionsId = 7;
1175
1176 for (bool sending_media : kSendingMediaStats) {
Erik Språng7f110672021-05-26 16:41:20 +02001177 rtp_sender_->SetSendingMediaStatus(sending_media);
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001178 for (bool redundant_payloads : kEnableRedundantPayloads) {
1179 int rtx_mode = kRtxRetransmitted;
1180 if (redundant_payloads) {
1181 rtx_mode |= kRtxRedundantPayloads;
1182 }
Erik Språng7f110672021-05-26 16:41:20 +02001183 rtp_sender_->SetRtxStatus(rtx_mode);
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001184
Danil Chapovalov35623182021-02-16 11:59:29 +01001185 for (auto extension_uri : kBweExtensionUris) {
Erik Språng7f110672021-05-26 16:41:20 +02001186 EXPECT_FALSE(rtp_sender_->SupportsPadding());
1187 rtp_sender_->RegisterRtpHeaderExtension(extension_uri, kExtensionsId);
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001188 if (!sending_media) {
Erik Språng7f110672021-05-26 16:41:20 +02001189 EXPECT_FALSE(rtp_sender_->SupportsPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001190 } else {
Erik Språng7f110672021-05-26 16:41:20 +02001191 EXPECT_TRUE(rtp_sender_->SupportsPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001192 if (redundant_payloads) {
Erik Språng7f110672021-05-26 16:41:20 +02001193 EXPECT_TRUE(rtp_sender_->SupportsRtxPayloadPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001194 } else {
Erik Språng7f110672021-05-26 16:41:20 +02001195 EXPECT_FALSE(rtp_sender_->SupportsRtxPayloadPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001196 }
1197 }
Erik Språng7f110672021-05-26 16:41:20 +02001198 rtp_sender_->DeregisterRtpHeaderExtension(extension_uri);
1199 EXPECT_FALSE(rtp_sender_->SupportsPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00001200 }
1201 }
1202 }
1203}
1204
Erik Språng7f110672021-05-26 16:41:20 +02001205TEST_F(RtpSenderTest, SetsCaptureTimeOnRtxRetransmissions) {
Erik Språngcf497892021-05-24 14:26:59 +02001206 EnableRtx();
Erik Språnga57711c2019-07-24 10:47:20 +02001207
Erik Språngcf497892021-05-24 14:26:59 +02001208 // Put a packet in the packet history, with current time as capture time.
1209 const int64_t start_time_ms = clock_->TimeInMilliseconds();
1210 std::unique_ptr<RtpPacketToSend> packet =
1211 BuildRtpPacket(kPayload, kMarkerBit, start_time_ms,
1212 /*capture_time_ms=*/start_time_ms);
Erik Språng62032d42020-07-03 19:38:04 +02001213 packet->set_allow_retransmission(true);
Erik Språng7f110672021-05-26 16:41:20 +02001214 packet_history_->PutRtpPacket(std::move(packet), start_time_ms);
Erik Språnga57711c2019-07-24 10:47:20 +02001215
Erik Språngcf497892021-05-24 14:26:59 +02001216 // Advance time, request an RTX retransmission. Capture timestamp should be
1217 // preserved.
1218 time_controller_.AdvanceTime(TimeDelta::Millis(10));
Erik Språnga57711c2019-07-24 10:47:20 +02001219
Erik Språngcf497892021-05-24 14:26:59 +02001220 EXPECT_CALL(mock_paced_sender_,
1221 EnqueuePackets(ElementsAre(Pointee(Property(
1222 &RtpPacketToSend::capture_time_ms, start_time_ms)))));
Erik Språng7f110672021-05-26 16:41:20 +02001223 EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
Erik Språnga57711c2019-07-24 10:47:20 +02001224}
1225
Erik Språng7f110672021-05-26 16:41:20 +02001226TEST_F(RtpSenderTest, ClearHistoryOnSequenceNumberCange) {
Erik Språngcf497892021-05-24 14:26:59 +02001227 EnableRtx();
Erik Språng6cacef22019-07-24 14:15:51 +02001228
Erik Språngcf497892021-05-24 14:26:59 +02001229 // Put a packet in the packet history.
1230 const int64_t now_ms = clock_->TimeInMilliseconds();
1231 std::unique_ptr<RtpPacketToSend> packet =
1232 BuildRtpPacket(kPayload, kMarkerBit, now_ms, now_ms);
1233 packet->set_allow_retransmission(true);
Erik Språng7f110672021-05-26 16:41:20 +02001234 packet_history_->PutRtpPacket(std::move(packet), now_ms);
Erik Språng6cacef22019-07-24 14:15:51 +02001235
Erik Språng7f110672021-05-26 16:41:20 +02001236 EXPECT_TRUE(packet_history_->GetPacketState(kSeqNum));
Erik Språng6cacef22019-07-24 14:15:51 +02001237
Erik Språngcf497892021-05-24 14:26:59 +02001238 // Update the sequence number of the RTP module, verify packet has been
1239 // removed.
Erik Språng7f110672021-05-26 16:41:20 +02001240 rtp_sender_->SetSequenceNumber(rtp_sender_->SequenceNumber() - 1);
1241 EXPECT_FALSE(packet_history_->GetPacketState(kSeqNum));
Erik Språng6cacef22019-07-24 14:15:51 +02001242}
1243
Erik Språng7f110672021-05-26 16:41:20 +02001244TEST_F(RtpSenderTest, IgnoresNackAfterDisablingMedia) {
Erik Språng60ffc312019-07-30 22:03:49 +02001245 const int64_t kRtt = 10;
1246
Erik Språngcf497892021-05-24 14:26:59 +02001247 EnableRtx();
Erik Språng7f110672021-05-26 16:41:20 +02001248 packet_history_->SetRtt(kRtt);
Erik Språng60ffc312019-07-30 22:03:49 +02001249
Erik Språngcf497892021-05-24 14:26:59 +02001250 // Put a packet in the history.
1251 const int64_t start_time_ms = clock_->TimeInMilliseconds();
1252 std::unique_ptr<RtpPacketToSend> packet =
1253 BuildRtpPacket(kPayload, kMarkerBit, start_time_ms,
1254 /*capture_time_ms=*/start_time_ms);
1255 packet->set_allow_retransmission(true);
Erik Språng7f110672021-05-26 16:41:20 +02001256 packet_history_->PutRtpPacket(std::move(packet), start_time_ms);
Erik Språng60ffc312019-07-30 22:03:49 +02001257
Erik Språngcf497892021-05-24 14:26:59 +02001258 // Disable media sending and try to retransmit the packet, it should fail.
Erik Språng7f110672021-05-26 16:41:20 +02001259 rtp_sender_->SetSendingMediaStatus(false);
Erik Språngcf497892021-05-24 14:26:59 +02001260 time_controller_.AdvanceTime(TimeDelta::Millis(kRtt));
Erik Språng7f110672021-05-26 16:41:20 +02001261 EXPECT_LT(rtp_sender_->ReSendPacket(kSeqNum), 0);
Erik Språng60ffc312019-07-30 22:03:49 +02001262}
1263
Erik Språng7f110672021-05-26 16:41:20 +02001264TEST_F(RtpSenderTest, DoesntFecProtectRetransmissions) {
Erik Språngf3605062020-09-29 11:53:39 +02001265 // Set up retranmission without RTX, so that a plain copy of the old packet is
1266 // re-sent instead.
1267 const int64_t kRtt = 10;
Erik Språng7f110672021-05-26 16:41:20 +02001268 rtp_sender_->SetSendingMediaStatus(true);
1269 rtp_sender_->SetRtxStatus(kRtxOff);
1270 packet_history_->SetStorePacketsStatus(
Erik Språngf3605062020-09-29 11:53:39 +02001271 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
Erik Språng7f110672021-05-26 16:41:20 +02001272 packet_history_->SetRtt(kRtt);
Erik Språngf3605062020-09-29 11:53:39 +02001273
Erik Språngcf497892021-05-24 14:26:59 +02001274 // Put a fec protected packet in the history.
1275 const int64_t start_time_ms = clock_->TimeInMilliseconds();
1276 std::unique_ptr<RtpPacketToSend> packet =
1277 BuildRtpPacket(kPayload, kMarkerBit, start_time_ms,
1278 /*capture_time_ms=*/start_time_ms);
1279 packet->set_allow_retransmission(true);
1280 packet->set_fec_protect_packet(true);
Erik Språng7f110672021-05-26 16:41:20 +02001281 packet_history_->PutRtpPacket(std::move(packet), start_time_ms);
Erik Språngf3605062020-09-29 11:53:39 +02001282
1283 // Re-send packet, the retransmitted packet should not have the FEC protection
1284 // flag set.
1285 EXPECT_CALL(mock_paced_sender_,
Erik Språngcf497892021-05-24 14:26:59 +02001286 EnqueuePackets(ElementsAre(Pointee(
Erik Språngf3605062020-09-29 11:53:39 +02001287 Property(&RtpPacketToSend::fec_protect_packet, false)))));
1288
1289 time_controller_.AdvanceTime(TimeDelta::Millis(kRtt));
Erik Språng7f110672021-05-26 16:41:20 +02001290 EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
Erik Språngf3605062020-09-29 11:53:39 +02001291}
1292
Erik Språng7f110672021-05-26 16:41:20 +02001293TEST_F(RtpSenderTest, MarksPacketsWithKeyframeStatus) {
Erik Språngcf15cb52020-12-07 13:18:34 +01001294 FieldTrialBasedConfig field_trials;
1295 RTPSenderVideo::Config video_config;
1296 video_config.clock = clock_;
Erik Språng7f110672021-05-26 16:41:20 +02001297 video_config.rtp_sender = rtp_sender_.get();
Erik Språngcf15cb52020-12-07 13:18:34 +01001298 video_config.field_trials = &field_trials;
1299 RTPSenderVideo rtp_sender_video(video_config);
1300
1301 const uint8_t kPayloadType = 127;
1302 const absl::optional<VideoCodecType> kCodecType =
1303 VideoCodecType::kVideoCodecGeneric;
1304
1305 const uint32_t kCaptureTimeMsToRtpTimestamp = 90; // 90 kHz clock
1306
1307 {
1308 EXPECT_CALL(mock_paced_sender_,
1309 EnqueuePackets(Each(
1310 Pointee(Property(&RtpPacketToSend::is_key_frame, true)))))
1311 .Times(AtLeast(1));
1312 RTPVideoHeader video_header;
1313 video_header.frame_type = VideoFrameType::kVideoFrameKey;
1314 int64_t capture_time_ms = clock_->TimeInMilliseconds();
1315 EXPECT_TRUE(rtp_sender_video.SendVideo(
1316 kPayloadType, kCodecType,
1317 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
1318 kPayloadData, video_header, kDefaultExpectedRetransmissionTimeMs));
1319
1320 time_controller_.AdvanceTime(TimeDelta::Millis(33));
1321 }
1322
1323 {
1324 EXPECT_CALL(mock_paced_sender_,
1325 EnqueuePackets(Each(
1326 Pointee(Property(&RtpPacketToSend::is_key_frame, false)))))
1327 .Times(AtLeast(1));
1328 RTPVideoHeader video_header;
1329 video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1330 int64_t capture_time_ms = clock_->TimeInMilliseconds();
1331 EXPECT_TRUE(rtp_sender_video.SendVideo(
1332 kPayloadType, kCodecType,
1333 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
1334 kPayloadData, video_header, kDefaultExpectedRetransmissionTimeMs));
1335
1336 time_controller_.AdvanceTime(TimeDelta::Millis(33));
1337 }
1338}
1339
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +00001340} // namespace webrtc