blob: c33825529f433f7c779ec503542d928802d9e6ce [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
Karl Wiberg918f50c2018-07-05 11:40:33 +020016#include "absl/memory/memory.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"
Elad Alon4a87e1c2017-10-03 16:11:34 +020020#include "logging/rtc_event_log/events/rtc_event.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "logging/rtc_event_log/mock/mock_rtc_event_log.h"
22#include "modules/rtp_rtcp/include/rtp_cvo.h"
23#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
24#include "modules/rtp_rtcp/include/rtp_header_parser.h"
Erik Språngaa59eca2019-07-24 14:52:55 +020025#include "modules/rtp_rtcp/include/rtp_packet_sender.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
27#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
28#include "modules/rtp_rtcp/source/rtp_format_video_generic.h"
philipelb3e42a42018-09-13 10:57:14 +020029#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h"
30#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020031#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
32#include "modules/rtp_rtcp/source/rtp_packet_received.h"
33#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020034#include "modules/rtp_rtcp/source/rtp_sender_video.h"
35#include "modules/rtp_rtcp/source/rtp_utility.h"
36#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020037#include "rtc_base/rate_limiter.h"
38#include "test/field_trial.h"
39#include "test/gmock.h"
40#include "test/gtest.h"
41#include "test/mock_transport.h"
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000042
43namespace webrtc {
44
andrew@webrtc.org8a442592011-12-16 21:24:30 +000045namespace {
Elad Alond8d32482019-02-18 23:45:57 +010046enum : int { // The first valid value is 1.
47 kAbsoluteSendTimeExtensionId = 1,
48 kAudioLevelExtensionId,
Elad Alonccb9b752019-02-19 13:01:31 +010049 kGenericDescriptorId00,
50 kGenericDescriptorId01,
Elad Alond8d32482019-02-18 23:45:57 +010051 kMidExtensionId,
52 kRepairedRidExtensionId,
53 kRidExtensionId,
54 kTransmissionTimeOffsetExtensionId,
55 kTransportSequenceNumberExtensionId,
56 kVideoRotationExtensionId,
57 kVideoTimingExtensionId,
58};
59
andrew@webrtc.org8a442592011-12-16 21:24:30 +000060const int kPayload = 100;
Shao Changbine62202f2015-04-21 20:24:50 +080061const int kRtxPayload = 98;
andrew@webrtc.org8a442592011-12-16 21:24:30 +000062const uint32_t kTimestamp = 10;
63const uint16_t kSeqNum = 33;
brandtr9dfff292016-11-14 05:14:50 -080064const uint32_t kSsrc = 725242;
Erik Språng9c771c22019-06-17 16:31:53 +020065const uint32_t kRtxSsrc = 12345;
66const uint32_t kFlexFecSsrc = 45678;
sprang@webrtc.org30933902015-03-17 14:33:12 +000067const uint16_t kTransportSequenceNumber = 0xaabbu;
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;
Amit Hilbuch77938e62018-12-21 09:23:38 -080072const char kNoRid[] = "";
73const char kNoMid[] = "";
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ång214f5432019-06-20 15:09:58 +020077using ::testing::AtLeast;
78using ::testing::DoAll;
philipelb3e42a42018-09-13 10:57:14 +020079using ::testing::ElementsAre;
Danil Chapovalov5e57b172016-09-02 19:15:59 +020080using ::testing::ElementsAreArray;
Erik Språng30a276b2019-04-23 12:00:11 +020081using ::testing::Field;
Erik Språng478cb462019-06-26 15:49:27 +020082using ::testing::Gt;
sprang168794c2017-07-06 04:38:06 -070083using ::testing::Invoke;
Erik Språng9c771c22019-06-17 16:31:53 +020084using ::testing::NiceMock;
Erik Språng478cb462019-06-26 15:49:27 +020085using ::testing::Pointee;
86using ::testing::Property;
Erik Språng214f5432019-06-20 15:09:58 +020087using ::testing::Return;
88using ::testing::SaveArg;
Danil Chapovalov84ffb352018-09-25 18:59:09 +020089using ::testing::SizeIs;
Erik Språng9c771c22019-06-17 16:31:53 +020090using ::testing::StrictMock;
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +000091
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +000092uint64_t ConvertMsToAbsSendTime(int64_t time_ms) {
Stefan Holmer0a87ffc2015-10-21 13:41:48 +020093 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +000094}
95
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +000096class LoopbackTransportTest : public webrtc::Transport {
97 public:
Petter Strandmark26bc6692018-05-29 08:43:35 +020098 LoopbackTransportTest() : total_bytes_sent_(0) {
danilchap12ba1862016-10-26 02:41:55 -070099 receivers_extensions_.Register(kRtpExtensionTransmissionTimeOffset,
100 kTransmissionTimeOffsetExtensionId);
101 receivers_extensions_.Register(kRtpExtensionAbsoluteSendTime,
102 kAbsoluteSendTimeExtensionId);
103 receivers_extensions_.Register(kRtpExtensionTransportSequenceNumber,
104 kTransportSequenceNumberExtensionId);
105 receivers_extensions_.Register(kRtpExtensionVideoRotation,
106 kVideoRotationExtensionId);
107 receivers_extensions_.Register(kRtpExtensionAudioLevel,
108 kAudioLevelExtensionId);
ilnik04f4d122017-06-19 07:18:55 -0700109 receivers_extensions_.Register(kRtpExtensionVideoTiming,
110 kVideoTimingExtensionId);
Steve Anton296a0ce2018-03-22 15:17:27 -0700111 receivers_extensions_.Register(kRtpExtensionMid, kMidExtensionId);
Elad Alonccb9b752019-02-19 13:01:31 +0100112 receivers_extensions_.Register(kRtpExtensionGenericFrameDescriptor00,
113 kGenericDescriptorId00);
114 receivers_extensions_.Register(kRtpExtensionGenericFrameDescriptor01,
115 kGenericDescriptorId01);
Amit Hilbuch77938e62018-12-21 09:23:38 -0800116 receivers_extensions_.Register(kRtpExtensionRtpStreamId, kRidExtensionId);
117 receivers_extensions_.Register(kRtpExtensionRepairedRtpStreamId,
118 kRepairedRidExtensionId);
guoweis@webrtc.org45362892015-03-04 22:55:15 +0000119 }
danilchap12ba1862016-10-26 02:41:55 -0700120
stefan1d8a5062015-10-02 03:39:33 -0700121 bool SendRtp(const uint8_t* data,
122 size_t len,
123 const PacketOptions& options) override {
Petter Strandmark26bc6692018-05-29 08:43:35 +0200124 last_options_ = options;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000125 total_bytes_sent_ += len;
danilchap12ba1862016-10-26 02:41:55 -0700126 sent_packets_.push_back(RtpPacketReceived(&receivers_extensions_));
127 EXPECT_TRUE(sent_packets_.back().Parse(data, len));
pbos2d566682015-09-28 09:59:31 -0700128 return true;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000129 }
danilchap162abd32015-12-10 02:39:40 -0800130 bool SendRtcp(const uint8_t* data, size_t len) override { return false; }
danilchap12ba1862016-10-26 02:41:55 -0700131 const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); }
132 int packets_sent() { return sent_packets_.size(); }
133
pbos@webrtc.org72491b92014-07-10 16:24:54 +0000134 size_t total_bytes_sent_;
Petter Strandmark26bc6692018-05-29 08:43:35 +0200135 PacketOptions last_options_;
danilchap12ba1862016-10-26 02:41:55 -0700136 std::vector<RtpPacketReceived> sent_packets_;
137
138 private:
139 RtpHeaderExtensionMap receivers_extensions_;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000140};
141
Elad Alon4a87e1c2017-10-03 16:11:34 +0200142MATCHER_P(SameRtcEventTypeAs, value, "") {
143 return value == arg->GetType();
144}
145
Erik Språngf6468d22019-07-05 16:53:43 +0200146struct TestConfig {
147 TestConfig(bool with_overhead, bool pacer_references_packets)
148 : with_overhead(with_overhead),
149 pacer_references_packets(pacer_references_packets) {}
150 bool with_overhead = false;
151 bool pacer_references_packets = false;
152};
153
154std::string ToFieldTrialString(TestConfig config) {
155 std::string field_trials;
156 if (config.with_overhead) {
157 field_trials += "WebRTC-SendSideBwe-WithOverhead/Enabled/";
158 }
159 if (config.pacer_references_packets) {
160 field_trials += "WebRTC-Pacer-LegacyPacketReferencing/Enabled/";
161 } else {
162 field_trials += "WebRTC-Pacer-LegacyPacketReferencing/Disabled/";
163 }
164 return field_trials;
165}
166
guoweis@webrtc.org45362892015-03-04 22:55:15 +0000167} // namespace
168
Erik Språngaa59eca2019-07-24 14:52:55 +0200169class MockRtpPacketPacer : public RtpPacketSender {
sprangebbf8a82015-09-21 15:11:14 -0700170 public:
Erik Språng59b86542019-06-23 18:24:46 +0200171 MockRtpPacketPacer() {}
172 virtual ~MockRtpPacketPacer() {}
173
174 MOCK_METHOD1(EnqueuePacket, void(std::unique_ptr<RtpPacketToSend>));
sprangebbf8a82015-09-21 15:11:14 -0700175
Peter Boströme23e7372015-10-08 11:44:14 +0200176 MOCK_METHOD6(InsertPacket,
177 void(Priority priority,
sprangebbf8a82015-09-21 15:11:14 -0700178 uint32_t ssrc,
179 uint16_t sequence_number,
180 int64_t capture_time_ms,
181 size_t bytes,
182 bool retransmission));
Erik Språngaa59eca2019-07-24 14:52:55 +0200183
184 MOCK_METHOD2(CreateProbeCluster, void(int bitrate_bps, int cluster_id));
185
186 MOCK_METHOD0(Pause, void());
187 MOCK_METHOD0(Resume, void());
188 MOCK_METHOD1(SetCongestionWindow,
189 void(absl::optional<int64_t> congestion_window_bytes));
190 MOCK_METHOD1(UpdateOutstandingData, void(int64_t outstanding_bytes));
191 MOCK_METHOD1(SetAccountForAudioPackets, void(bool account_for_audio));
sprangebbf8a82015-09-21 15:11:14 -0700192};
193
Stefan Holmerf5dca482016-01-27 12:58:51 +0100194class MockTransportSequenceNumberAllocator
195 : public TransportSequenceNumberAllocator {
196 public:
197 MOCK_METHOD0(AllocateSequenceNumber, uint16_t());
198};
199
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200200class MockSendSideDelayObserver : public SendSideDelayObserver {
201 public:
Henrik Boström9fe18342019-05-16 18:38:20 +0200202 MOCK_METHOD4(SendSideDelayUpdated, void(int, int, uint64_t, uint32_t));
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200203};
204
asapersson35151f32016-05-02 23:44:01 -0700205class MockSendPacketObserver : public SendPacketObserver {
206 public:
207 MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t));
208};
209
Stefan Holmera246cfb2016-08-23 17:51:42 +0200210class MockTransportFeedbackObserver : public TransportFeedbackObserver {
211 public:
Erik Språng30a276b2019-04-23 12:00:11 +0200212 MOCK_METHOD1(OnAddPacket, void(const RtpPacketSendInfo&));
Stefan Holmera246cfb2016-08-23 17:51:42 +0200213 MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&));
elad.alonf9490002017-03-06 05:32:21 -0800214 MOCK_CONST_METHOD0(GetTransportFeedbackVector, std::vector<PacketFeedback>());
Stefan Holmera246cfb2016-08-23 17:51:42 +0200215};
216
minyue3a407ee2017-04-03 01:10:33 -0700217class MockOverheadObserver : public OverheadObserver {
218 public:
219 MOCK_METHOD1(OnOverheadChanged, void(size_t overhead_bytes_per_packet));
220};
221
Erik Språngf6468d22019-07-05 16:53:43 +0200222class RtpSenderTest : public ::testing::TestWithParam<TestConfig> {
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000223 protected:
224 RtpSenderTest()
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000225 : fake_clock_(kStartTime),
terelius429c3452016-01-21 05:42:04 -0800226 mock_rtc_event_log_(),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000227 mock_paced_sender_(),
sprangcd349d92016-07-13 09:11:28 -0700228 retransmission_rate_limiter_(&fake_clock_, 1000),
Erik Språng4580ca22019-07-04 10:38:43 +0200229 flexfec_sender_(0,
230 kFlexFecSsrc,
231 kSsrc,
232 "",
233 std::vector<RtpExtension>(),
234 std::vector<RtpExtensionSize>(),
235 nullptr,
236 &fake_clock_),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000237 rtp_sender_(),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000238 transport_(),
minyue3a407ee2017-04-03 01:10:33 -0700239 kMarkerBit(true),
Erik Språngf6468d22019-07-05 16:53:43 +0200240 field_trials_(ToFieldTrialString(GetParam())) {}
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000241
Erik Språng7b52f102018-02-07 14:37:37 +0100242 void SetUp() override { SetUpRtpSender(true, false); }
Peter Boströme23e7372015-10-08 11:44:14 +0200243
Erik Språng7b52f102018-02-07 14:37:37 +0100244 void SetUpRtpSender(bool pacer, bool populate_network2) {
Erik Språng4580ca22019-07-04 10:38:43 +0200245 RtpRtcp::Configuration config;
246 config.clock = &fake_clock_;
247 config.outgoing_transport = &transport_;
248 config.media_send_ssrc = kSsrc;
249 config.rtx_send_ssrc = kRtxSsrc;
250 config.flexfec_sender = &flexfec_sender_;
251 config.transport_sequence_number_allocator = &seq_num_allocator_;
252 config.event_log = &mock_rtc_event_log_;
253 config.send_packet_observer = &send_packet_observer_;
254 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
255 config.paced_sender = pacer ? &mock_paced_sender_ : nullptr;
256 config.populate_network2_timestamp = populate_network2;
257 rtp_sender_.reset(new RTPSender(config));
brandtr9dfff292016-11-14 05:14:50 -0800258 rtp_sender_->SetSequenceNumber(kSeqNum);
danilchap71fead22016-08-18 02:01:49 -0700259 rtp_sender_->SetTimestampOffset(0);
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000260 }
261
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000262 SimulatedClock fake_clock_;
Erik Språng9c771c22019-06-17 16:31:53 +0200263 NiceMock<MockRtcEventLog> mock_rtc_event_log_;
Erik Språng59b86542019-06-23 18:24:46 +0200264 MockRtpPacketPacer mock_paced_sender_;
Erik Språng9c771c22019-06-17 16:31:53 +0200265 StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_;
266 StrictMock<MockSendPacketObserver> send_packet_observer_;
267 StrictMock<MockTransportFeedbackObserver> feedback_observer_;
sprangcd349d92016-07-13 09:11:28 -0700268 RateLimiter retransmission_rate_limiter_;
Erik Språng4580ca22019-07-04 10:38:43 +0200269 FlexfecSender flexfec_sender_;
kwiberg84be5112016-04-27 01:19:58 -0700270 std::unique_ptr<RTPSender> rtp_sender_;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000271 LoopbackTransportTest transport_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000272 const bool kMarkerBit;
minyue3a407ee2017-04-03 01:10:33 -0700273 test::ScopedFieldTrials field_trials_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000274
danilchapb6f1fb52016-10-19 06:11:39 -0700275 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
276 bool marker_bit,
277 uint32_t timestamp,
278 int64_t capture_time_ms) {
279 auto packet = rtp_sender_->AllocatePacket();
280 packet->SetPayloadType(payload_type);
281 packet->SetMarker(marker_bit);
282 packet->SetTimestamp(timestamp);
283 packet->set_capture_time_ms(capture_time_ms);
284 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
285 return packet;
286 }
287
Erik Språngf6468d22019-07-05 16:53:43 +0200288 std::unique_ptr<RtpPacketToSend> SendPacket(int64_t capture_time_ms,
289 int payload_length) {
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000290 uint32_t timestamp = capture_time_ms * 90;
danilchapb6f1fb52016-10-19 06:11:39 -0700291 auto packet =
292 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
293 packet->AllocatePayload(payload_length);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000294
295 // Packet should be stored in a send bucket.
Erik Språngf6468d22019-07-05 16:53:43 +0200296 EXPECT_TRUE(rtp_sender_->SendToNetwork(
297 absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission,
298 RtpPacketSender::kNormalPriority));
299 return packet;
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000300 }
asapersson35151f32016-05-02 23:44:01 -0700301
Erik Språngf6468d22019-07-05 16:53:43 +0200302 std::unique_ptr<RtpPacketToSend> SendGenericPacket() {
asapersson35151f32016-05-02 23:44:01 -0700303 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
Erik Språngf6468d22019-07-05 16:53:43 +0200304 return SendPacket(kCaptureTimeMs, sizeof(kPayloadData));
asapersson35151f32016-05-02 23:44:01 -0700305 }
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000306};
307
Peter Boströme23e7372015-10-08 11:44:14 +0200308// TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our
309// default code path.
310class RtpSenderTestWithoutPacer : public RtpSenderTest {
311 public:
Erik Språng7b52f102018-02-07 14:37:37 +0100312 void SetUp() override { SetUpRtpSender(false, false); }
Peter Boströme23e7372015-10-08 11:44:14 +0200313};
314
minyue3a407ee2017-04-03 01:10:33 -0700315TEST_P(RtpSenderTestWithoutPacer, AllocatePacketSetCsrc) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200316 // Configure rtp_sender with csrc.
317 std::vector<uint32_t> csrcs;
318 csrcs.push_back(0x23456789);
319 rtp_sender_->SetCsrcs(csrcs);
320
321 auto packet = rtp_sender_->AllocatePacket();
322
323 ASSERT_TRUE(packet);
324 EXPECT_EQ(rtp_sender_->SSRC(), packet->Ssrc());
325 EXPECT_EQ(csrcs, packet->Csrcs());
326}
327
minyue3a407ee2017-04-03 01:10:33 -0700328TEST_P(RtpSenderTestWithoutPacer, AllocatePacketReserveExtensions) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200329 // Configure rtp_sender with extensions.
330 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
331 kRtpExtensionTransmissionTimeOffset,
332 kTransmissionTimeOffsetExtensionId));
333 ASSERT_EQ(
334 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
335 kAbsoluteSendTimeExtensionId));
336 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
337 kAudioLevelExtensionId));
338 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
339 kRtpExtensionTransportSequenceNumber,
340 kTransportSequenceNumberExtensionId));
341 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
342 kRtpExtensionVideoRotation, kVideoRotationExtensionId));
343
344 auto packet = rtp_sender_->AllocatePacket();
345
346 ASSERT_TRUE(packet);
347 // Preallocate BWE extensions RtpSender set itself.
348 EXPECT_TRUE(packet->HasExtension<TransmissionOffset>());
349 EXPECT_TRUE(packet->HasExtension<AbsoluteSendTime>());
350 EXPECT_TRUE(packet->HasExtension<TransportSequenceNumber>());
351 // Do not allocate media specific extensions.
352 EXPECT_FALSE(packet->HasExtension<AudioLevel>());
353 EXPECT_FALSE(packet->HasExtension<VideoOrientation>());
354}
355
minyue3a407ee2017-04-03 01:10:33 -0700356TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberAdvanceSequenceNumber) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200357 auto packet = rtp_sender_->AllocatePacket();
358 ASSERT_TRUE(packet);
359 const uint16_t sequence_number = rtp_sender_->SequenceNumber();
360
361 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
362
363 EXPECT_EQ(sequence_number, packet->SequenceNumber());
364 EXPECT_EQ(sequence_number + 1, rtp_sender_->SequenceNumber());
365}
366
minyue3a407ee2017-04-03 01:10:33 -0700367TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberFailsOnNotSending) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200368 auto packet = rtp_sender_->AllocatePacket();
369 ASSERT_TRUE(packet);
370
371 rtp_sender_->SetSendingMediaStatus(false);
372 EXPECT_FALSE(rtp_sender_->AssignSequenceNumber(packet.get()));
373}
374
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100375TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberMayAllowPaddingOnVideo) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200376 constexpr size_t kPaddingSize = 100;
377 auto packet = rtp_sender_->AllocatePacket();
378 ASSERT_TRUE(packet);
379
philipel8aadd502017-02-23 02:56:13 -0800380 ASSERT_FALSE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200381 packet->SetMarker(false);
382 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100383 // Packet without marker bit doesn't allow padding on video stream.
philipel8aadd502017-02-23 02:56:13 -0800384 EXPECT_FALSE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200385
386 packet->SetMarker(true);
387 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
388 // Packet with marker bit allows send padding.
philipel8aadd502017-02-23 02:56:13 -0800389 EXPECT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200390}
391
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100392TEST_P(RtpSenderTest, AssignSequenceNumberAllowsPaddingOnAudio) {
393 MockTransport transport;
Erik Språng4580ca22019-07-04 10:38:43 +0200394 RtpRtcp::Configuration config;
395 config.audio = true;
396 config.clock = &fake_clock_;
397 config.outgoing_transport = &transport;
398 config.paced_sender = &mock_paced_sender_;
399 config.media_send_ssrc = kSsrc;
400 config.event_log = &mock_rtc_event_log_;
401 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
402 rtp_sender_ = absl::make_unique<RTPSender>(config);
403
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100404 rtp_sender_->SetTimestampOffset(0);
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100405
406 std::unique_ptr<RtpPacketToSend> audio_packet = rtp_sender_->AllocatePacket();
407 // Padding on audio stream allowed regardless of marker in the last packet.
408 audio_packet->SetMarker(false);
409 audio_packet->SetPayloadType(kPayload);
410 rtp_sender_->AssignSequenceNumber(audio_packet.get());
411
412 const size_t kPaddingSize = 59;
413 EXPECT_CALL(transport, SendRtp(_, kPaddingSize + kRtpHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +0200414 .WillOnce(Return(true));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100415 EXPECT_EQ(kPaddingSize,
416 rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
417
418 // Requested padding size is too small, will send a larger one.
419 const size_t kMinPaddingSize = 50;
420 EXPECT_CALL(transport, SendRtp(_, kMinPaddingSize + kRtpHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +0200421 .WillOnce(Return(true));
Yves Gerey665174f2018-06-19 15:03:05 +0200422 EXPECT_EQ(kMinPaddingSize, rtp_sender_->TimeToSendPadding(kMinPaddingSize - 5,
423 PacedPacketInfo()));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100424}
425
minyue3a407ee2017-04-03 01:10:33 -0700426TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberSetPaddingTimestamps) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200427 constexpr size_t kPaddingSize = 100;
428 auto packet = rtp_sender_->AllocatePacket();
429 ASSERT_TRUE(packet);
430 packet->SetMarker(true);
431 packet->SetTimestamp(kTimestamp);
432
433 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
philipel8aadd502017-02-23 02:56:13 -0800434 ASSERT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200435
436 ASSERT_EQ(1u, transport_.sent_packets_.size());
danilchap12ba1862016-10-26 02:41:55 -0700437 // Verify padding packet timestamp.
438 EXPECT_EQ(kTimestamp, transport_.last_sent_packet().Timestamp());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200439}
440
minyue3a407ee2017-04-03 01:10:33 -0700441TEST_P(RtpSenderTestWithoutPacer,
442 TransportFeedbackObserverGetsCorrectByteCount) {
443 constexpr int kRtpOverheadBytesPerPacket = 12 + 8;
Erik Språng9c771c22019-06-17 16:31:53 +0200444 NiceMock<MockOverheadObserver> mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +0200445
446 RtpRtcp::Configuration config;
447 config.clock = &fake_clock_;
448 config.outgoing_transport = &transport_;
449 config.media_send_ssrc = kSsrc;
450 config.transport_sequence_number_allocator = &seq_num_allocator_;
451 config.transport_feedback_callback = &feedback_observer_;
452 config.event_log = &mock_rtc_event_log_;
453 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
454 config.overhead_observer = &mock_overhead_observer;
455 rtp_sender_ = absl::make_unique<RTPSender>(config);
456
minyue3a407ee2017-04-03 01:10:33 -0700457 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
458 kRtpExtensionTransportSequenceNumber,
459 kTransportSequenceNumberExtensionId));
460 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200461 .WillOnce(Return(kTransportSequenceNumber));
minyue3a407ee2017-04-03 01:10:33 -0700462
463 const size_t expected_bytes =
Erik Språngf6468d22019-07-05 16:53:43 +0200464 GetParam().with_overhead
465 ? sizeof(kPayloadData) + kRtpOverheadBytesPerPacket
466 : sizeof(kPayloadData);
minyue3a407ee2017-04-03 01:10:33 -0700467
468 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200469 OnAddPacket(AllOf(
470 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
471 Field(&RtpPacketSendInfo::transport_sequence_number,
472 kTransportSequenceNumber),
473 Field(&RtpPacketSendInfo::rtp_sequence_number,
474 rtp_sender_->SequenceNumber()),
475 Field(&RtpPacketSendInfo::length, expected_bytes),
476 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
minyue3a407ee2017-04-03 01:10:33 -0700477 .Times(1);
478 EXPECT_CALL(mock_overhead_observer,
479 OnOverheadChanged(kRtpOverheadBytesPerPacket))
480 .Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100481 SendGenericPacket();
minyue3a407ee2017-04-03 01:10:33 -0700482}
483
484TEST_P(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) {
Erik Språng4580ca22019-07-04 10:38:43 +0200485 RtpRtcp::Configuration config;
486 config.clock = &fake_clock_;
487 config.outgoing_transport = &transport_;
488 config.media_send_ssrc = kSsrc;
489 config.transport_sequence_number_allocator = &seq_num_allocator_;
490 config.transport_feedback_callback = &feedback_observer_;
491 config.event_log = &mock_rtc_event_log_;
492 config.send_packet_observer = &send_packet_observer_;
493 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
494 rtp_sender_ = absl::make_unique<RTPSender>(config);
495
Stefan Holmerf5dca482016-01-27 12:58:51 +0100496 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
497 kRtpExtensionTransportSequenceNumber,
498 kTransportSequenceNumberExtensionId));
499
Stefan Holmerf5dca482016-01-27 12:58:51 +0100500 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200501 .WillOnce(Return(kTransportSequenceNumber));
asapersson35151f32016-05-02 23:44:01 -0700502 EXPECT_CALL(send_packet_observer_,
503 OnSendPacket(kTransportSequenceNumber, _, _))
504 .Times(1);
minyue3a407ee2017-04-03 01:10:33 -0700505
506 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200507 OnAddPacket(AllOf(
508 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
509 Field(&RtpPacketSendInfo::transport_sequence_number,
510 kTransportSequenceNumber),
511 Field(&RtpPacketSendInfo::rtp_sequence_number,
512 rtp_sender_->SequenceNumber()),
513 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
Stefan Holmera246cfb2016-08-23 17:51:42 +0200514 .Times(1);
asapersson35151f32016-05-02 23:44:01 -0700515
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100516 SendGenericPacket();
Stefan Holmerf5dca482016-01-27 12:58:51 +0100517
danilchap12ba1862016-10-26 02:41:55 -0700518 const auto& packet = transport_.last_sent_packet();
519 uint16_t transport_seq_no;
520 ASSERT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
521 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200522 EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200523 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200524}
525
526TEST_P(RtpSenderTestWithoutPacer, PacketOptionsNoRetransmission) {
Erik Språng4580ca22019-07-04 10:38:43 +0200527 RtpRtcp::Configuration config;
528 config.clock = &fake_clock_;
529 config.outgoing_transport = &transport_;
530 config.media_send_ssrc = kSsrc;
531 config.transport_sequence_number_allocator = &seq_num_allocator_;
532 config.transport_feedback_callback = &feedback_observer_;
533 config.event_log = &mock_rtc_event_log_;
534 config.send_packet_observer = &send_packet_observer_;
535 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
536 rtp_sender_ = absl::make_unique<RTPSender>(config);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200537
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100538 SendGenericPacket();
Petter Strandmark26bc6692018-05-29 08:43:35 +0200539
540 EXPECT_FALSE(transport_.last_options_.is_retransmit);
Stefan Holmerf5dca482016-01-27 12:58:51 +0100541}
542
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200543TEST_P(RtpSenderTestWithoutPacer,
544 SetsIncludedInFeedbackWhenTransportSequenceNumberExtensionIsRegistered) {
545 SetUpRtpSender(false, false);
546 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
547 kTransportSequenceNumberExtensionId);
548 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200549 .WillOnce(Return(kTransportSequenceNumber));
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200550 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100551 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200552 EXPECT_TRUE(transport_.last_options_.included_in_feedback);
553}
554
555TEST_P(
556 RtpSenderTestWithoutPacer,
557 SetsIncludedInAllocationWhenTransportSequenceNumberExtensionIsRegistered) {
558 SetUpRtpSender(false, false);
559 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
560 kTransportSequenceNumberExtensionId);
561 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200562 .WillOnce(Return(kTransportSequenceNumber));
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200563 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100564 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200565 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
566}
567
568TEST_P(RtpSenderTestWithoutPacer,
569 SetsIncludedInAllocationWhenForcedAsPartOfAllocation) {
570 SetUpRtpSender(false, false);
571 rtp_sender_->SetAsPartOfAllocation(true);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100572 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200573 EXPECT_FALSE(transport_.last_options_.included_in_feedback);
574 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
575}
576
577TEST_P(RtpSenderTestWithoutPacer, DoesnSetIncludedInAllocationByDefault) {
578 SetUpRtpSender(false, false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100579 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200580 EXPECT_FALSE(transport_.last_options_.included_in_feedback);
581 EXPECT_FALSE(transport_.last_options_.included_in_allocation);
stefana23fc622016-07-28 07:56:38 -0700582}
asapersson35151f32016-05-02 23:44:01 -0700583
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200584TEST_P(RtpSenderTestWithoutPacer, OnSendSideDelayUpdated) {
Erik Språng9c771c22019-06-17 16:31:53 +0200585 StrictMock<MockSendSideDelayObserver> send_side_delay_observer_;
Erik Språng4580ca22019-07-04 10:38:43 +0200586
587 RtpRtcp::Configuration config;
588 config.clock = &fake_clock_;
589 config.outgoing_transport = &transport_;
590 config.media_send_ssrc = kSsrc;
591 config.send_side_delay_observer = &send_side_delay_observer_;
592 config.event_log = &mock_rtc_event_log_;
593 rtp_sender_ = absl::make_unique<RTPSender>(config);
594
Niels Möller5fe95102019-03-04 16:49:25 +0100595 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100596 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +0200597 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +0100598 FieldTrialBasedConfig());
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200599
600 const uint8_t kPayloadType = 127;
Niels Möller8a40edd2019-01-24 18:04:44 +0100601 const char payload_name[] = "GENERIC";
Niels Möller59ab1cf2019-02-06 22:48:11 +0100602
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +0200603 rtp_sender_video.RegisterPayloadType(kPayloadType, payload_name,
604 /*raw_payload=*/false);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100605
606 const uint32_t kCaptureTimeMsToRtpTimestamp = 90; // 90 kHz clock
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200607 RTPVideoHeader video_header;
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200608
Henrik Boström9fe18342019-05-16 18:38:20 +0200609 // Send packet with 10 ms send-side delay. The average, max and total should
610 // be 10 ms.
611 EXPECT_CALL(send_side_delay_observer_,
612 SendSideDelayUpdated(10, 10, 10, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200613 .Times(1);
614 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
615 fake_clock_.AdvanceTimeMilliseconds(10);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100616 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100617 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200618 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100619 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200620 kDefaultExpectedRetransmissionTimeMs));
621
Henrik Boström9fe18342019-05-16 18:38:20 +0200622 // Send another packet with 20 ms delay. The average, max and total should be
623 // 15, 20 and 30 ms respectively.
624 EXPECT_CALL(send_side_delay_observer_,
625 SendSideDelayUpdated(15, 20, 30, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200626 .Times(1);
627 fake_clock_.AdvanceTimeMilliseconds(10);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100628 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100629 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200630 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100631 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200632 kDefaultExpectedRetransmissionTimeMs));
633
634 // Send another packet at the same time, which replaces the last packet.
635 // Since this packet has 0 ms delay, the average is now 5 ms and max is 10 ms.
Henrik Boström9fe18342019-05-16 18:38:20 +0200636 // The total counter stays the same though.
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200637 // TODO(terelius): Is is not clear that this is the right behavior.
Henrik Boström9fe18342019-05-16 18:38:20 +0200638 EXPECT_CALL(send_side_delay_observer_, SendSideDelayUpdated(5, 10, 30, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200639 .Times(1);
640 capture_time_ms = fake_clock_.TimeInMilliseconds();
Niels Möller59ab1cf2019-02-06 22:48:11 +0100641 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100642 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200643 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100644 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200645 kDefaultExpectedRetransmissionTimeMs));
646
647 // Send a packet 1 second later. The earlier packets should have timed
Henrik Boström9fe18342019-05-16 18:38:20 +0200648 // out, so both max and average should be the delay of this packet. The total
649 // keeps increasing.
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200650 fake_clock_.AdvanceTimeMilliseconds(1000);
651 capture_time_ms = fake_clock_.TimeInMilliseconds();
652 fake_clock_.AdvanceTimeMilliseconds(1);
Henrik Boström9fe18342019-05-16 18:38:20 +0200653 EXPECT_CALL(send_side_delay_observer_, SendSideDelayUpdated(1, 1, 31, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200654 .Times(1);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100655 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100656 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200657 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100658 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200659 kDefaultExpectedRetransmissionTimeMs));
660}
661
minyue3a407ee2017-04-03 01:10:33 -0700662TEST_P(RtpSenderTestWithoutPacer, OnSendPacketUpdated) {
stefana23fc622016-07-28 07:56:38 -0700663 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
664 kRtpExtensionTransportSequenceNumber,
665 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -0700666 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200667 .WillOnce(Return(kTransportSequenceNumber));
asapersson35151f32016-05-02 23:44:01 -0700668 EXPECT_CALL(send_packet_observer_,
669 OnSendPacket(kTransportSequenceNumber, _, _))
670 .Times(1);
671
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100672 SendGenericPacket();
asapersson35151f32016-05-02 23:44:01 -0700673}
674
minyue3a407ee2017-04-03 01:10:33 -0700675TEST_P(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) {
Erik Språng4580ca22019-07-04 10:38:43 +0200676 RtpRtcp::Configuration config;
677 config.clock = &fake_clock_;
678 config.outgoing_transport = &transport_;
679 config.paced_sender = &mock_paced_sender_;
680 config.media_send_ssrc = kSsrc;
681 config.transport_sequence_number_allocator = &seq_num_allocator_;
682 config.transport_feedback_callback = &feedback_observer_;
683 config.event_log = &mock_rtc_event_log_;
684 config.send_packet_observer = &send_packet_observer_;
685 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
686 rtp_sender_ = absl::make_unique<RTPSender>(config);
687
brandtr9dfff292016-11-14 05:14:50 -0800688 rtp_sender_->SetSequenceNumber(kSeqNum);
Stefan Holmera246cfb2016-08-23 17:51:42 +0200689 rtp_sender_->SetStorePacketsStatus(true, 10);
690 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
691 kRtpExtensionTransportSequenceNumber,
692 kTransportSequenceNumberExtensionId));
693
Stefan Holmera246cfb2016-08-23 17:51:42 +0200694 EXPECT_CALL(send_packet_observer_,
695 OnSendPacket(kTransportSequenceNumber, _, _))
696 .Times(1);
minyue3a407ee2017-04-03 01:10:33 -0700697 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200698 OnAddPacket(AllOf(
699 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
700 Field(&RtpPacketSendInfo::transport_sequence_number,
701 kTransportSequenceNumber),
702 Field(&RtpPacketSendInfo::rtp_sequence_number,
703 rtp_sender_->SequenceNumber()),
704 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
Stefan Holmera246cfb2016-08-23 17:51:42 +0200705 .Times(1);
706
Erik Språngf6468d22019-07-05 16:53:43 +0200707 if (GetParam().pacer_references_packets) {
708 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
709 SendGenericPacket();
710 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
711 .WillOnce(Return(kTransportSequenceNumber));
712 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
713 fake_clock_.TimeInMilliseconds(), false,
714 PacedPacketInfo());
715 } else {
716 EXPECT_CALL(
717 mock_paced_sender_,
718 EnqueuePacket(AllOf(
719 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
720 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
721 auto packet = SendGenericPacket();
722 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
723 // Transport sequence number is set by PacketRouter, before TrySendPacket().
724 packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
725 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
726 }
Stefan Holmera246cfb2016-08-23 17:51:42 +0200727
danilchap12ba1862016-10-26 02:41:55 -0700728 const auto& packet = transport_.last_sent_packet();
729 uint16_t transport_seq_no;
730 EXPECT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
731 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200732 EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
Stefan Holmera246cfb2016-08-23 17:51:42 +0200733}
734
Erik Språng7b52f102018-02-07 14:37:37 +0100735TEST_P(RtpSenderTest, WritesPacerExitToTimingExtension) {
ilnik04f4d122017-06-19 07:18:55 -0700736 rtp_sender_->SetStorePacketsStatus(true, 10);
737 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
738 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
739 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
740 auto packet = rtp_sender_->AllocatePacket();
741 packet->SetPayloadType(kPayload);
742 packet->SetMarker(true);
743 packet->SetTimestamp(kTimestamp);
744 packet->set_capture_time_ms(capture_time_ms);
ilnik2edc6842017-07-06 03:06:50 -0700745 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
ilnik04f4d122017-06-19 07:18:55 -0700746 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
747 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
748 size_t packet_size = packet->size();
ilnik04f4d122017-06-19 07:18:55 -0700749
750 const int kStoredTimeInMs = 100;
Erik Språngf6468d22019-07-05 16:53:43 +0200751 if (GetParam().pacer_references_packets) {
Erik Språng7b52f102018-02-07 14:37:37 +0100752 EXPECT_CALL(
753 mock_paced_sender_,
754 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _));
755 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
756 kAllowRetransmission,
757 RtpPacketSender::kNormalPriority));
Erik Språngf6468d22019-07-05 16:53:43 +0200758 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
759 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
760 PacedPacketInfo());
761 } else {
762 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
763 EXPECT_CALL(
764 mock_paced_sender_,
765 EnqueuePacket(Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc))));
766 EXPECT_TRUE(rtp_sender_->SendToNetwork(
767 absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
768 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
769 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
Erik Språng7b52f102018-02-07 14:37:37 +0100770 }
ilnik04f4d122017-06-19 07:18:55 -0700771 EXPECT_EQ(1, transport_.packets_sent());
772 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
773
danilchapce251812017-09-11 12:24:41 -0700774 VideoSendTiming video_timing;
775 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
776 &video_timing));
777 EXPECT_EQ(kStoredTimeInMs, video_timing.pacer_exit_delta_ms);
Erik Språng7b52f102018-02-07 14:37:37 +0100778}
ilnik04f4d122017-06-19 07:18:55 -0700779
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100780TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithPacer) {
781 SetUpRtpSender(/*pacer=*/true, /*populate_network2=*/true);
Erik Språng7b52f102018-02-07 14:37:37 +0100782 rtp_sender_->SetStorePacketsStatus(true, 10);
783 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
784 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
785 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
786 auto packet = rtp_sender_->AllocatePacket();
787 packet->SetPayloadType(kPayload);
788 packet->SetMarker(true);
789 packet->SetTimestamp(kTimestamp);
790 packet->set_capture_time_ms(capture_time_ms);
791 const uint16_t kPacerExitMs = 1234u;
792 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, kPacerExitMs, 0u, 0u, true};
793 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
794 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
795 size_t packet_size = packet->size();
796
797 const int kStoredTimeInMs = 100;
Erik Språngf6468d22019-07-05 16:53:43 +0200798
799 if (GetParam().pacer_references_packets) {
Erik Språng7b52f102018-02-07 14:37:37 +0100800 EXPECT_CALL(
801 mock_paced_sender_,
802 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _));
803 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
804 kAllowRetransmission,
805 RtpPacketSender::kNormalPriority));
Erik Språngf6468d22019-07-05 16:53:43 +0200806 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
807 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
808 PacedPacketInfo());
809 } else {
810 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
811 EXPECT_CALL(
812 mock_paced_sender_,
813 EnqueuePacket(Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc))));
814 EXPECT_TRUE(rtp_sender_->SendToNetwork(
815 absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission,
816 RtpPacketSender::kNormalPriority));
817 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
818 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
Erik Språng7b52f102018-02-07 14:37:37 +0100819 }
Erik Språngf6468d22019-07-05 16:53:43 +0200820
Erik Språng7b52f102018-02-07 14:37:37 +0100821 EXPECT_EQ(1, transport_.packets_sent());
ilnik04f4d122017-06-19 07:18:55 -0700822 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
823
Erik Språng7b52f102018-02-07 14:37:37 +0100824 VideoSendTiming video_timing;
danilchapce251812017-09-11 12:24:41 -0700825 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
826 &video_timing));
Erik Språng7b52f102018-02-07 14:37:37 +0100827 EXPECT_EQ(kStoredTimeInMs, video_timing.network2_timestamp_delta_ms);
828 EXPECT_EQ(kPacerExitMs, video_timing.pacer_exit_delta_ms);
ilnik04f4d122017-06-19 07:18:55 -0700829}
830
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100831TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithoutPacer) {
832 SetUpRtpSender(/*pacer=*/false, /*populate_network2=*/true);
833 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
834 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
835 auto packet = rtp_sender_->AllocatePacket();
836 packet->SetMarker(true);
837 packet->set_capture_time_ms(fake_clock_.TimeInMilliseconds());
838 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
839 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
840 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
841
842 const int kPropagateTimeMs = 10;
843 fake_clock_.AdvanceTimeMilliseconds(kPropagateTimeMs);
844
845 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
846 kAllowRetransmission,
847 RtpPacketSender::kNormalPriority));
848
849 EXPECT_EQ(1, transport_.packets_sent());
850 absl::optional<VideoSendTiming> video_timing =
851 transport_.last_sent_packet().GetExtension<VideoTimingExtension>();
852 ASSERT_TRUE(video_timing);
853 EXPECT_EQ(kPropagateTimeMs, video_timing->network2_timestamp_delta_ms);
854}
855
minyue3a407ee2017-04-03 01:10:33 -0700856TEST_P(RtpSenderTest, TrafficSmoothingWithExtensions) {
Elad Alon4a87e1c2017-10-03 16:11:34 +0200857 EXPECT_CALL(mock_rtc_event_log_,
858 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000859
pwestin@webrtc.orgc66e8b32012-11-07 17:01:04 +0000860 rtp_sender_->SetStorePacketsStatus(true, 10);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000861 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800862 kRtpExtensionTransmissionTimeOffset,
863 kTransmissionTimeOffsetExtensionId));
864 EXPECT_EQ(
865 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
866 kAbsoluteSendTimeExtensionId));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000867 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700868 auto packet =
869 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
870 size_t packet_size = packet->size();
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000871
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000872 const int kStoredTimeInMs = 100;
Erik Språngf6468d22019-07-05 16:53:43 +0200873 if (GetParam().pacer_references_packets) {
874 EXPECT_CALL(mock_paced_sender_,
875 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum,
876 _, _, _));
877 // Packet should be stored in a send bucket.
878 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
879 kAllowRetransmission,
880 RtpPacketSender::kNormalPriority));
881 EXPECT_EQ(0, transport_.packets_sent());
882 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
883 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
884 PacedPacketInfo());
885 } else {
886 EXPECT_CALL(
887 mock_paced_sender_,
888 EnqueuePacket(AllOf(
889 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
890 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
891 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
892 EXPECT_TRUE(rtp_sender_->SendToNetwork(
893 absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
894 EXPECT_EQ(0, transport_.packets_sent());
895 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
896 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
897 }
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000898
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000899 // Process send bucket. Packet should now be sent.
danilchap12ba1862016-10-26 02:41:55 -0700900 EXPECT_EQ(1, transport_.packets_sent());
901 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
902
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +0000903 webrtc::RTPHeader rtp_header;
danilchap12ba1862016-10-26 02:41:55 -0700904 transport_.last_sent_packet().GetHeader(&rtp_header);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000905
906 // Verify transmission time offset.
907 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000908 uint64_t expected_send_time =
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000909 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000910 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000911}
912
minyue3a407ee2017-04-03 01:10:33 -0700913TEST_P(RtpSenderTest, TrafficSmoothingRetransmits) {
Elad Alon4a87e1c2017-10-03 16:11:34 +0200914 EXPECT_CALL(mock_rtc_event_log_,
915 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000916
917 rtp_sender_->SetStorePacketsStatus(true, 10);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000918 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800919 kRtpExtensionTransmissionTimeOffset,
920 kTransmissionTimeOffsetExtensionId));
921 EXPECT_EQ(
922 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
923 kAbsoluteSendTimeExtensionId));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000924 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700925 auto packet =
926 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
927 size_t packet_size = packet->size();
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000928
929 // Packet should be stored in a send bucket.
Erik Språngf6468d22019-07-05 16:53:43 +0200930 if (GetParam().pacer_references_packets) {
931 EXPECT_CALL(mock_paced_sender_,
932 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum,
933 _, _, _));
934 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
935 kAllowRetransmission,
936 RtpPacketSender::kNormalPriority));
937 // Immediately process send bucket and send packet.
938 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
939 PacedPacketInfo());
940 } else {
941 EXPECT_CALL(
942 mock_paced_sender_,
943 EnqueuePacket(AllOf(
944 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
945 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
946 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
947 packet->set_allow_retransmission(true);
948 EXPECT_TRUE(rtp_sender_->SendToNetwork(
949 absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
950 // Immediately process send bucket and send packet.
951 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
952 }
953
Erik Språng0f4f0552019-05-08 10:15:05 -0700954 EXPECT_EQ(1, transport_.packets_sent());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000955
Erik Språng0f4f0552019-05-08 10:15:05 -0700956 // Retransmit packet.
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000957 const int kStoredTimeInMs = 100;
958 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
959
Erik Språng0f4f0552019-05-08 10:15:05 -0700960 EXPECT_CALL(mock_rtc_event_log_,
961 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
Erik Språngf6468d22019-07-05 16:53:43 +0200962 if (GetParam().pacer_references_packets) {
963 EXPECT_CALL(mock_paced_sender_,
964 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum,
965 _, _, _));
966 EXPECT_EQ(static_cast<int>(packet_size),
967 rtp_sender_->ReSendPacket(kSeqNum));
968 EXPECT_EQ(1, transport_.packets_sent());
969 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, true,
970 PacedPacketInfo());
971 } else {
972 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
973 packet->set_retransmitted_sequence_number(kSeqNum);
974 EXPECT_CALL(
975 mock_paced_sender_,
976 EnqueuePacket(AllOf(
977 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
978 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
979 EXPECT_EQ(static_cast<int>(packet_size),
980 rtp_sender_->ReSendPacket(kSeqNum));
981 EXPECT_EQ(1, transport_.packets_sent());
982 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
983 }
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000984
985 // Process send bucket. Packet should now be sent.
Erik Språng0f4f0552019-05-08 10:15:05 -0700986 EXPECT_EQ(2, transport_.packets_sent());
danilchap12ba1862016-10-26 02:41:55 -0700987 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000988
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +0000989 webrtc::RTPHeader rtp_header;
danilchap12ba1862016-10-26 02:41:55 -0700990 transport_.last_sent_packet().GetHeader(&rtp_header);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000991
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000992 // Verify transmission time offset.
993 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000994 uint64_t expected_send_time =
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000995 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
996 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
997}
998
999// This test sends 1 regular video packet, then 4 padding packets, and then
1000// 1 more regular packet.
minyue3a407ee2017-04-03 01:10:33 -07001001TEST_P(RtpSenderTest, SendPadding) {
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001002 // Make all (non-padding) packets go to send queue.
Elad Alon4a87e1c2017-10-03 16:11:34 +02001003 EXPECT_CALL(mock_rtc_event_log_,
1004 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1005 .Times(1 + 4 + 1);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001006
1007 uint16_t seq_num = kSeqNum;
1008 uint32_t timestamp = kTimestamp;
1009 rtp_sender_->SetStorePacketsStatus(true, 10);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001010 size_t rtp_header_len = kRtpHeaderSize;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001011 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -08001012 kRtpExtensionTransmissionTimeOffset,
1013 kTransmissionTimeOffsetExtensionId));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001014 rtp_header_len += 4; // 4 bytes extension.
danilchap162abd32015-12-10 02:39:40 -08001015 EXPECT_EQ(
1016 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
1017 kAbsoluteSendTimeExtensionId));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001018 rtp_header_len += 4; // 4 bytes extension.
1019 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
1020
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001021 webrtc::RTPHeader rtp_header;
1022
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001023 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -07001024 auto packet =
1025 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
Stefan Holmer586b19b2015-09-18 11:14:31 +02001026 const uint32_t media_packet_timestamp = timestamp;
danilchapb6f1fb52016-10-19 06:11:39 -07001027 size_t packet_size = packet->size();
Erik Språngf6468d22019-07-05 16:53:43 +02001028 int total_packets_sent = 0;
1029 const int kStoredTimeInMs = 100;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001030
1031 // Packet should be stored in a send bucket.
Erik Språngf6468d22019-07-05 16:53:43 +02001032 if (GetParam().pacer_references_packets) {
1033 EXPECT_CALL(mock_paced_sender_,
1034 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, kSeqNum,
1035 _, _, _));
1036 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
1037 kAllowRetransmission,
1038 RtpPacketSender::kNormalPriority));
1039 EXPECT_EQ(total_packets_sent, transport_.packets_sent());
1040 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
1041 rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
1042 PacedPacketInfo());
1043 } else {
1044 EXPECT_CALL(
1045 mock_paced_sender_,
1046 EnqueuePacket(AllOf(
1047 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1048 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
1049 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1050 packet->set_allow_retransmission(true);
1051 EXPECT_TRUE(rtp_sender_->SendToNetwork(
1052 absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
1053 EXPECT_EQ(total_packets_sent, transport_.packets_sent());
1054 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
1055 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
1056 ++seq_num;
1057 }
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001058
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001059 // Packet should now be sent. This test doesn't verify the regular video
1060 // packet, since it is tested in another test.
danilchap12ba1862016-10-26 02:41:55 -07001061 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001062 timestamp += 90 * kStoredTimeInMs;
1063
1064 // Send padding 4 times, waiting 50 ms between each.
1065 for (int i = 0; i < 4; ++i) {
1066 const int kPaddingPeriodMs = 50;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001067 const size_t kPaddingBytes = 100;
1068 const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001069 // Padding will be forced to full packets.
philipelc7bf32a2017-02-17 03:59:43 -08001070 EXPECT_EQ(kMaxPaddingLength,
philipel8aadd502017-02-23 02:56:13 -08001071 rtp_sender_->TimeToSendPadding(kPaddingBytes, PacedPacketInfo()));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001072
1073 // Process send bucket. Padding should now be sent.
danilchap12ba1862016-10-26 02:41:55 -07001074 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001075 EXPECT_EQ(kMaxPaddingLength + rtp_header_len,
danilchap12ba1862016-10-26 02:41:55 -07001076 transport_.last_sent_packet().size());
1077
1078 transport_.last_sent_packet().GetHeader(&rtp_header);
pbosbd2522a2015-07-01 05:35:53 -07001079 EXPECT_EQ(kMaxPaddingLength, rtp_header.paddingLength);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001080
Stefan Holmer586b19b2015-09-18 11:14:31 +02001081 // Verify sequence number and timestamp. The timestamp should be the same
1082 // as the last media packet.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001083 EXPECT_EQ(seq_num++, rtp_header.sequenceNumber);
Stefan Holmer586b19b2015-09-18 11:14:31 +02001084 EXPECT_EQ(media_packet_timestamp, rtp_header.timestamp);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001085 // Verify transmission time offset.
Stefan Holmer586b19b2015-09-18 11:14:31 +02001086 int offset = timestamp - media_packet_timestamp;
1087 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001088 uint64_t expected_send_time =
1089 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
1090 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
1091 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs);
1092 timestamp += 90 * kPaddingPeriodMs;
1093 }
1094
1095 // Send a regular video packet again.
1096 capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -07001097 packet = BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
1098 packet_size = packet->size();
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001099
Erik Språngf6468d22019-07-05 16:53:43 +02001100 if (GetParam().pacer_references_packets) {
1101 EXPECT_CALL(mock_paced_sender_,
1102 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, seq_num,
1103 _, _, _));
1104 // Packet should be stored in a send bucket.
1105 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
1106 kAllowRetransmission,
1107 RtpPacketSender::kNormalPriority));
1108 rtp_sender_->TimeToSendPacket(kSsrc, seq_num, capture_time_ms, false,
1109 PacedPacketInfo());
1110 } else {
1111 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1112 EXPECT_CALL(
1113 mock_paced_sender_,
1114 EnqueuePacket(AllOf(
1115 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1116 Pointee(Property(&RtpPacketToSend::SequenceNumber, seq_num)))));
1117 EXPECT_TRUE(rtp_sender_->SendToNetwork(
1118 absl::make_unique<RtpPacketToSend>(*packet), kAllowRetransmission));
1119 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
1120 }
terelius5d332ac2016-01-14 14:37:39 -08001121
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001122 // Process send bucket.
danilchap12ba1862016-10-26 02:41:55 -07001123 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
1124 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
1125 transport_.last_sent_packet().GetHeader(&rtp_header);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001126
1127 // Verify sequence number and timestamp.
1128 EXPECT_EQ(seq_num, rtp_header.sequenceNumber);
1129 EXPECT_EQ(timestamp, rtp_header.timestamp);
1130 // Verify transmission time offset. This packet is sent without delay.
1131 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
1132 uint64_t expected_send_time =
1133 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +00001134 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +00001135}
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001136
minyue3a407ee2017-04-03 01:10:33 -07001137TEST_P(RtpSenderTest, OnSendPacketUpdated) {
stefana23fc622016-07-28 07:56:38 -07001138 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1139 kRtpExtensionTransportSequenceNumber,
1140 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -07001141 rtp_sender_->SetStorePacketsStatus(true, 10);
1142
1143 EXPECT_CALL(send_packet_observer_,
1144 OnSendPacket(kTransportSequenceNumber, _, _))
1145 .Times(1);
asapersson35151f32016-05-02 23:44:01 -07001146
Erik Språngf6468d22019-07-05 16:53:43 +02001147 if (GetParam().pacer_references_packets) {
1148 const bool kIsRetransmit = false;
1149 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
1150 SendGenericPacket(); // Packet passed to pacer.
1151 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
1152 .WillOnce(::testing::Return(kTransportSequenceNumber));
1153 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1154 fake_clock_.TimeInMilliseconds(),
1155 kIsRetransmit, PacedPacketInfo());
1156 } else {
1157 EXPECT_CALL(
1158 mock_paced_sender_,
1159 EnqueuePacket(AllOf(
1160 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1161 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
1162 auto packet = SendGenericPacket();
1163 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1164 packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
1165 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
1166 }
1167
danilchap12ba1862016-10-26 02:41:55 -07001168 EXPECT_EQ(1, transport_.packets_sent());
asapersson35151f32016-05-02 23:44:01 -07001169}
1170
minyue3a407ee2017-04-03 01:10:33 -07001171TEST_P(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) {
stefana23fc622016-07-28 07:56:38 -07001172 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1173 kRtpExtensionTransportSequenceNumber,
1174 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -07001175 rtp_sender_->SetStorePacketsStatus(true, 10);
1176
1177 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
asapersson35151f32016-05-02 23:44:01 -07001178
Erik Språngf6468d22019-07-05 16:53:43 +02001179 if (GetParam().pacer_references_packets) {
1180 const bool kIsRetransmit = true;
1181 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
1182 SendGenericPacket(); // Packet passed to pacer.
1183 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
1184 .WillOnce(Return(kTransportSequenceNumber));
1185 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1186 fake_clock_.TimeInMilliseconds(),
1187 kIsRetransmit, PacedPacketInfo());
1188 } else {
1189 EXPECT_CALL(
1190 mock_paced_sender_,
1191 EnqueuePacket(AllOf(
1192 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1193 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))));
1194 auto packet = SendGenericPacket();
1195 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1196 packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
1197 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
1198 }
1199
danilchap12ba1862016-10-26 02:41:55 -07001200 EXPECT_EQ(1, transport_.packets_sent());
Petter Strandmark26bc6692018-05-29 08:43:35 +02001201 EXPECT_TRUE(transport_.last_options_.is_retransmit);
asapersson35151f32016-05-02 23:44:01 -07001202}
1203
minyue3a407ee2017-04-03 01:10:33 -07001204TEST_P(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) {
Erik Språngf6468d22019-07-05 16:53:43 +02001205 if (!GetParam().pacer_references_packets) {
1206 // When PacedSender owns packets, there is no
1207 // TransportSequenceNumberAllocator callback, so this test does not make any
1208 // sense.
1209 // TODO(bugs.webrtc.org/10633): Remove this test once old code is gone.
1210 return;
1211 }
1212
Erik Språng4580ca22019-07-04 10:38:43 +02001213 RtpRtcp::Configuration config;
1214 config.clock = &fake_clock_;
1215 config.outgoing_transport = &transport_;
1216 config.paced_sender = &mock_paced_sender_;
1217 config.media_send_ssrc = kSsrc;
1218 config.send_packet_observer = &send_packet_observer_;
1219 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1220 rtp_sender_ = absl::make_unique<RTPSender>(config);
1221
brandtr9dfff292016-11-14 05:14:50 -08001222 rtp_sender_->SetSequenceNumber(kSeqNum);
stefana23fc622016-07-28 07:56:38 -07001223 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1224 kRtpExtensionTransportSequenceNumber,
1225 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -07001226 rtp_sender_->SetSequenceNumber(kSeqNum);
1227 rtp_sender_->SetStorePacketsStatus(true, 10);
1228
1229 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
asapersson35151f32016-05-02 23:44:01 -07001230
asapersson35151f32016-05-02 23:44:01 -07001231 const bool kIsRetransmit = false;
Erik Språngf6468d22019-07-05 16:53:43 +02001232 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
1233 SendGenericPacket(); // Packet passed to pacer.
brandtr9dfff292016-11-14 05:14:50 -08001234 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1235 fake_clock_.TimeInMilliseconds(), kIsRetransmit,
philipel8aadd502017-02-23 02:56:13 -08001236 PacedPacketInfo());
Erik Språngf6468d22019-07-05 16:53:43 +02001237
danilchap12ba1862016-10-26 02:41:55 -07001238 EXPECT_EQ(1, transport_.packets_sent());
asapersson35151f32016-05-02 23:44:01 -07001239}
1240
minyue3a407ee2017-04-03 01:10:33 -07001241TEST_P(RtpSenderTest, SendRedundantPayloads) {
Erik Språngf6468d22019-07-05 16:53:43 +02001242 if (!GetParam().pacer_references_packets) {
1243 // If PacedSender owns the RTP packets, GeneratePadding() family of methods
1244 // will be called instead and this test makes no sense.
1245 return;
1246 }
1247
Erik Språng214f5432019-06-20 15:09:58 +02001248 MockTransport transport;
Erik Språng4580ca22019-07-04 10:38:43 +02001249 RtpRtcp::Configuration config;
1250 config.clock = &fake_clock_;
1251 config.outgoing_transport = &transport;
1252 config.paced_sender = &mock_paced_sender_;
1253 config.media_send_ssrc = kSsrc;
1254 config.rtx_send_ssrc = kRtxSsrc;
1255 config.event_log = &mock_rtc_event_log_;
1256 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1257 rtp_sender_ = absl::make_unique<RTPSender>(config);
1258
Erik Språng214f5432019-06-20 15:09:58 +02001259 rtp_sender_->SetSequenceNumber(kSeqNum);
Erik Språng214f5432019-06-20 15:09:58 +02001260 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
1261
1262 uint16_t seq_num = kSeqNum;
1263 rtp_sender_->SetStorePacketsStatus(true, 10);
1264 int32_t rtp_header_len = kRtpHeaderSize;
1265 EXPECT_EQ(
1266 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
1267 kAbsoluteSendTimeExtensionId));
1268 rtp_header_len += 4; // 4 bytes extension.
1269 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
1270
1271 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
Erik Språng214f5432019-06-20 15:09:58 +02001272
1273 const size_t kNumPayloadSizes = 10;
1274 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700,
1275 750, 800, 850, 900, 950};
1276 // Expect all packets go through the pacer.
Erik Språng214f5432019-06-20 15:09:58 +02001277 EXPECT_CALL(mock_rtc_event_log_,
1278 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1279 .Times(kNumPayloadSizes);
1280
1281 // Send 10 packets of increasing size.
Erik Språng214f5432019-06-20 15:09:58 +02001282 for (size_t i = 0; i < kNumPayloadSizes; ++i) {
1283 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
Erik Språngf6468d22019-07-05 16:53:43 +02001284
1285 EXPECT_CALL(transport, SendRtp(_, _, _)).WillOnce(::testing::Return(true));
1286
1287 if (GetParam().pacer_references_packets) {
1288 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, seq_num, _, _, _));
1289 SendPacket(capture_time_ms, kPayloadSizes[i]);
1290 rtp_sender_->TimeToSendPacket(kSsrc, seq_num,
1291 fake_clock_.TimeInMilliseconds(), false,
1292 PacedPacketInfo());
1293 } else {
1294 EXPECT_CALL(
1295 mock_paced_sender_,
1296 EnqueuePacket(AllOf(
1297 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1298 Pointee(Property(&RtpPacketToSend::SequenceNumber, seq_num)))));
1299 auto packet = SendPacket(capture_time_ms, kPayloadSizes[i]);
1300 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1301 rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo());
1302 }
1303
1304 ++seq_num;
Erik Språng214f5432019-06-20 15:09:58 +02001305 fake_clock_.AdvanceTimeMilliseconds(33);
1306 }
1307
1308 EXPECT_CALL(mock_rtc_event_log_,
1309 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1310 .Times(AtLeast(4));
1311
1312 // The amount of padding to send it too small to send a payload packet.
1313 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
1314 .WillOnce(Return(true));
1315 EXPECT_EQ(kMaxPaddingSize,
1316 rtp_sender_->TimeToSendPadding(49, PacedPacketInfo()));
1317
1318 // Payload padding will prefer packets with lower transmit count first and
1319 // lower age second.
1320 EXPECT_CALL(transport, SendRtp(_,
1321 kPayloadSizes[kNumPayloadSizes - 1] +
1322 rtp_header_len + kRtxHeaderSize,
1323 Field(&PacketOptions::is_retransmit, true)))
1324 .WillOnce(Return(true));
1325 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1],
1326 rtp_sender_->TimeToSendPadding(500, PacedPacketInfo()));
1327
1328 EXPECT_CALL(transport, SendRtp(_,
1329 kPayloadSizes[kNumPayloadSizes - 2] +
1330 rtp_header_len + kRtxHeaderSize,
1331 _))
1332 .WillOnce(Return(true));
1333
1334 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len,
1335 Field(&PacketOptions::is_retransmit, false)))
1336 .WillOnce(Return(true));
1337 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 2] + kMaxPaddingSize,
1338 rtp_sender_->TimeToSendPadding(
1339 kPayloadSizes[kNumPayloadSizes - 2] + 49, PacedPacketInfo()));
1340}
1341
minyue3a407ee2017-04-03 01:10:33 -07001342TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) {
Niels Möller8a40edd2019-01-24 18:04:44 +01001343 const char payload_name[] = "GENERIC";
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001344 const uint8_t payload_type = 127;
Niels Möller5fe95102019-03-04 16:49:25 +01001345 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001346 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001347 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01001348 FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001349 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1350 /*raw_payload=*/false);
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001351 uint8_t payload[] = {47, 11, 32, 93, 89};
1352
1353 // Send keyframe
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001354 RTPVideoHeader video_header;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001355 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001356 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1357 sizeof(payload), nullptr, &video_header,
1358 kDefaultExpectedRetransmissionTimeMs));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001359
danilchap96c15872016-11-21 01:35:29 -08001360 auto sent_payload = transport_.last_sent_packet().payload();
1361 uint8_t generic_header = sent_payload[0];
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001362 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
1363 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
danilchap96c15872016-11-21 01:35:29 -08001364 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001365
1366 // Send delta frame
1367 payload[0] = 13;
1368 payload[1] = 42;
1369 payload[4] = 13;
1370
Niels Möller59ab1cf2019-02-06 22:48:11 +01001371 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001372 VideoFrameType::kVideoFrameDelta, payload_type, 1234, 4321, payload,
1373 sizeof(payload), nullptr, &video_header,
1374 kDefaultExpectedRetransmissionTimeMs));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001375
danilchap96c15872016-11-21 01:35:29 -08001376 sent_payload = transport_.last_sent_packet().payload();
1377 generic_header = sent_payload[0];
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001378 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
1379 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
danilchap96c15872016-11-21 01:35:29 -08001380 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001381}
1382
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001383TEST_P(RtpSenderTestWithoutPacer, SendRawVideo) {
1384 const char payload_name[] = "VP8";
1385 const uint8_t payload_type = 111;
1386 const uint8_t payload[] = {11, 22, 33, 44, 55};
1387
1388 PlayoutDelayOracle playout_delay_oracle;
1389 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001390 &playout_delay_oracle, nullptr, false, false,
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001391 FieldTrialBasedConfig());
1392 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1393 /*raw_payload=*/true);
1394
1395 // Send a frame.
1396 RTPVideoHeader video_header;
1397 ASSERT_TRUE(rtp_sender_video.SendVideo(
1398 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1399 sizeof(payload), nullptr, &video_header,
1400 kDefaultExpectedRetransmissionTimeMs));
1401
1402 auto sent_payload = transport_.last_sent_packet().payload();
1403 EXPECT_THAT(sent_payload, ElementsAreArray(payload));
1404}
1405
minyue3a407ee2017-04-03 01:10:33 -07001406TEST_P(RtpSenderTest, SendFlexfecPackets) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001407 constexpr uint32_t kTimestamp = 1234;
brandtrdbdb3f12016-11-10 05:04:48 -08001408 constexpr int kMediaPayloadType = 127;
1409 constexpr int kFlexfecPayloadType = 118;
brandtrdbdb3f12016-11-10 05:04:48 -08001410 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001411 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språng4580ca22019-07-04 10:38:43 +02001412 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
1413 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001414 nullptr /* rtp_state */, &fake_clock_);
brandtrdbdb3f12016-11-10 05:04:48 -08001415
1416 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001417 RtpRtcp::Configuration config;
1418 config.clock = &fake_clock_;
1419 config.outgoing_transport = &transport_;
1420 config.paced_sender = &mock_paced_sender_;
1421 config.media_send_ssrc = kSsrc;
1422 config.flexfec_sender = &flexfec_sender_;
1423 config.transport_sequence_number_allocator = &seq_num_allocator_;
1424 config.event_log = &mock_rtc_event_log_;
1425 config.send_packet_observer = &send_packet_observer_;
1426 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1427 rtp_sender_ = absl::make_unique<RTPSender>(config);
1428
brandtrdbdb3f12016-11-10 05:04:48 -08001429 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtrdbdb3f12016-11-10 05:04:48 -08001430 rtp_sender_->SetStorePacketsStatus(true, 10);
1431
Niels Möller5fe95102019-03-04 16:49:25 +01001432 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001433 RTPSenderVideo rtp_sender_video(
1434 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1435 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001436 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1437 /*raw_payload=*/false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001438
brandtrdbdb3f12016-11-10 05:04:48 -08001439 // Parameters selected to generate a single FEC packet per media packet.
1440 FecProtectionParams params;
1441 params.fec_rate = 15;
1442 params.max_fec_frames = 1;
1443 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001444 rtp_sender_video.SetFecParameters(params, params);
brandtrdbdb3f12016-11-10 05:04:48 -08001445
brandtr9dfff292016-11-14 05:14:50 -08001446 uint16_t flexfec_seq_num;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001447 RTPVideoHeader video_header;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001448
Erik Språngf6468d22019-07-05 16:53:43 +02001449 if (GetParam().pacer_references_packets) {
1450 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1451 kSsrc, kSeqNum, _, _, false));
1452 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1453 kFlexFecSsrc, _, _, _, false))
1454 .WillOnce(::testing::SaveArg<2>(&flexfec_seq_num));
1455
1456 EXPECT_TRUE(rtp_sender_video.SendVideo(
1457 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
1458 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1459 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1460
1461 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1462 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1463 fake_clock_.TimeInMilliseconds(),
1464 false, PacedPacketInfo()));
1465 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1466 rtp_sender_->TimeToSendPacket(kFlexFecSsrc, flexfec_seq_num,
1467 fake_clock_.TimeInMilliseconds(),
1468 false, PacedPacketInfo()));
1469 } else {
1470 std::unique_ptr<RtpPacketToSend> media_packet;
1471 std::unique_ptr<RtpPacketToSend> fec_packet;
1472
1473 EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
1474 .Times(2)
1475 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet) {
1476 if (packet->packet_type() == RtpPacketToSend::Type::kVideo) {
1477 EXPECT_EQ(packet->Ssrc(), kSsrc);
1478 EXPECT_EQ(packet->SequenceNumber(), kSeqNum);
1479 media_packet = std::move(packet);
1480 } else {
1481 EXPECT_EQ(packet->packet_type(),
1482 RtpPacketToSend::Type::kForwardErrorCorrection);
1483 EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc);
1484 fec_packet = std::move(packet);
1485 }
1486 });
1487
1488 EXPECT_TRUE(rtp_sender_video.SendVideo(
1489 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
1490 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1491 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1492 ASSERT_TRUE(media_packet != nullptr);
1493 ASSERT_TRUE(fec_packet != nullptr);
1494
1495 flexfec_seq_num = fec_packet->SequenceNumber();
1496 rtp_sender_->TrySendPacket(media_packet.get(), PacedPacketInfo());
1497 rtp_sender_->TrySendPacket(fec_packet.get(), PacedPacketInfo());
1498 }
1499
brandtr9dfff292016-11-14 05:14:50 -08001500 ASSERT_EQ(2, transport_.packets_sent());
brandtrdbdb3f12016-11-10 05:04:48 -08001501 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1502 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
brandtr9dfff292016-11-14 05:14:50 -08001503 EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
Erik Språng4580ca22019-07-04 10:38:43 +02001504 EXPECT_EQ(kSsrc, media_packet.Ssrc());
brandtr9dfff292016-11-14 05:14:50 -08001505 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
1506 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
1507 EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
Erik Språng4580ca22019-07-04 10:38:43 +02001508 EXPECT_EQ(kFlexFecSsrc, flexfec_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001509}
1510
Erik Språngf6468d22019-07-05 16:53:43 +02001511// TODO(ilnik): because of webrtc:7859. Once FEC moved below pacer, this test
1512// should be removed.
1513TEST_P(RtpSenderTest, NoFlexfecForTimingFrames) {
1514 constexpr uint32_t kTimestamp = 1234;
1515 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
1516 constexpr int kMediaPayloadType = 127;
1517 constexpr int kFlexfecPayloadType = 118;
1518 const std::vector<RtpExtension> kNoRtpExtensions;
1519 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
1520
1521 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
1522 kNoRtpExtensions, kNoRtpExtensionSizes,
1523 nullptr /* rtp_state */, &fake_clock_);
1524
1525 // Reset |rtp_sender_| to use FlexFEC.
1526 rtp_sender_.reset(new RTPSender(
1527 false, &fake_clock_, &transport_, &mock_paced_sender_,
1528 flexfec_sender.ssrc(), &seq_num_allocator_, nullptr, nullptr, nullptr,
1529 &mock_rtc_event_log_, &send_packet_observer_,
1530 &retransmission_rate_limiter_, nullptr, false, nullptr, false, false,
1531 FieldTrialBasedConfig()));
1532 rtp_sender_->SetSSRC(kSsrc);
1533 rtp_sender_->SetSequenceNumber(kSeqNum);
1534 rtp_sender_->SetStorePacketsStatus(true, 10);
1535
1536 PlayoutDelayOracle playout_delay_oracle;
1537 RTPSenderVideo rtp_sender_video(
1538 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1539 nullptr, false, false, FieldTrialBasedConfig());
1540 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1541 /*raw_payload=*/false);
1542
1543 // Need extension to be registered for timing frames to be sent.
1544 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1545 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
1546
1547 // Parameters selected to generate a single FEC packet per media packet.
1548 FecProtectionParams params;
1549 params.fec_rate = 15;
1550 params.max_fec_frames = 1;
1551 params.fec_mask_type = kFecMaskRandom;
1552 rtp_sender_video.SetFecParameters(params, params);
1553
1554 RTPVideoHeader video_header;
1555 video_header.video_timing.flags = VideoSendTiming::kTriggeredByTimer;
1556
1557 EXPECT_CALL(mock_rtc_event_log_,
1558 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1559 .Times(1);
1560 if (GetParam().pacer_references_packets) {
1561 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1562 kSsrc, kSeqNum, _, _, false));
1563 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1564 kFlexFecSsrc, _, _, _, false))
1565 .Times(0); // Not called because packet should not be protected.
1566
1567 EXPECT_TRUE(rtp_sender_video.SendVideo(
1568 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
1569 kCaptureTimeMs, kPayloadData, sizeof(kPayloadData), nullptr,
1570 &video_header, kDefaultExpectedRetransmissionTimeMs));
1571
1572 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1573 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1574 fake_clock_.TimeInMilliseconds(),
1575 false, PacedPacketInfo()));
1576 } else {
1577 std::unique_ptr<RtpPacketToSend> rtp_packet;
1578 EXPECT_CALL(
1579 mock_paced_sender_,
1580 EnqueuePacket(AllOf(
1581 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1582 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum)))))
1583 .WillOnce([&rtp_packet](std::unique_ptr<RtpPacketToSend> packet) {
1584 rtp_packet = std::move(packet);
1585 });
1586
1587 EXPECT_CALL(
1588 mock_paced_sender_,
1589 EnqueuePacket(Pointee(Property(&RtpPacketToSend::Ssrc, kFlexFecSsrc))))
1590 .Times(0); // Not called because packet should not be protected.
1591
1592 EXPECT_TRUE(rtp_sender_video.SendVideo(
1593 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
1594 kCaptureTimeMs, kPayloadData, sizeof(kPayloadData), nullptr,
1595 &video_header, kDefaultExpectedRetransmissionTimeMs));
1596
1597 EXPECT_TRUE(
1598 rtp_sender_->TrySendPacket(rtp_packet.get(), PacedPacketInfo()));
1599 }
1600
1601 ASSERT_EQ(1, transport_.packets_sent());
1602 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1603 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
1604 EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
1605 EXPECT_EQ(kSsrc, media_packet.Ssrc());
1606
1607 // Now try to send not a timing frame.
1608 uint16_t flexfec_seq_num;
1609
1610 EXPECT_CALL(mock_rtc_event_log_,
1611 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1612 .Times(2);
1613 if (GetParam().pacer_references_packets) {
1614 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1615 kFlexFecSsrc, _, _, _, false))
1616 .WillOnce(::testing::SaveArg<2>(&flexfec_seq_num));
1617 EXPECT_CALL(mock_paced_sender_,
1618 InsertPacket(RtpPacketSender::kLowPriority, kSsrc, kSeqNum + 1,
1619 _, _, false));
1620 video_header.video_timing.flags = VideoSendTiming::kInvalid;
1621 EXPECT_TRUE(rtp_sender_video.SendVideo(
1622 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp + 1,
1623 kCaptureTimeMs + 1, kPayloadData, sizeof(kPayloadData), nullptr,
1624 &video_header, kDefaultExpectedRetransmissionTimeMs));
1625
1626 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1627 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum + 1,
1628 fake_clock_.TimeInMilliseconds(),
1629 false, PacedPacketInfo()));
1630 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1631 rtp_sender_->TimeToSendPacket(kFlexFecSsrc, flexfec_seq_num,
1632 fake_clock_.TimeInMilliseconds(),
1633 false, PacedPacketInfo()));
1634 } else {
1635 std::unique_ptr<RtpPacketToSend> media_packet;
1636 std::unique_ptr<RtpPacketToSend> fec_packet;
1637
1638 EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
1639 .Times(2)
1640 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet) {
1641 if (packet->packet_type() == RtpPacketToSend::Type::kVideo) {
1642 EXPECT_EQ(packet->Ssrc(), kSsrc);
1643 EXPECT_EQ(packet->SequenceNumber(), kSeqNum + 1);
1644 media_packet = std::move(packet);
1645 } else {
1646 EXPECT_EQ(packet->packet_type(),
1647 RtpPacketToSend::Type::kForwardErrorCorrection);
1648 EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc);
1649 fec_packet = std::move(packet);
1650 }
1651 });
1652
1653 video_header.video_timing.flags = VideoSendTiming::kInvalid;
1654 EXPECT_TRUE(rtp_sender_video.SendVideo(
1655 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp + 1,
1656 kCaptureTimeMs + 1, kPayloadData, sizeof(kPayloadData), nullptr,
1657 &video_header, kDefaultExpectedRetransmissionTimeMs));
1658
1659 ASSERT_TRUE(media_packet != nullptr);
1660 ASSERT_TRUE(fec_packet != nullptr);
1661
1662 flexfec_seq_num = fec_packet->SequenceNumber();
1663 rtp_sender_->TrySendPacket(media_packet.get(), PacedPacketInfo());
1664 rtp_sender_->TrySendPacket(fec_packet.get(), PacedPacketInfo());
1665 }
1666
1667 ASSERT_EQ(3, transport_.packets_sent());
1668 const RtpPacketReceived& media_packet2 = transport_.sent_packets_[1];
1669 EXPECT_EQ(kMediaPayloadType, media_packet2.PayloadType());
1670 EXPECT_EQ(kSeqNum + 1, media_packet2.SequenceNumber());
1671 EXPECT_EQ(kSsrc, media_packet2.Ssrc());
1672 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[2];
1673 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
1674 EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
1675 EXPECT_EQ(kFlexFecSsrc, flexfec_packet.Ssrc());
1676}
1677
minyue3a407ee2017-04-03 01:10:33 -07001678TEST_P(RtpSenderTestWithoutPacer, SendFlexfecPackets) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001679 constexpr uint32_t kTimestamp = 1234;
brandtrdbdb3f12016-11-10 05:04:48 -08001680 constexpr int kMediaPayloadType = 127;
1681 constexpr int kFlexfecPayloadType = 118;
brandtrdbdb3f12016-11-10 05:04:48 -08001682 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001683 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språngf6468d22019-07-05 16:53:43 +02001684 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
Erik Språng4580ca22019-07-04 10:38:43 +02001685 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001686 nullptr /* rtp_state */, &fake_clock_);
brandtrdbdb3f12016-11-10 05:04:48 -08001687
1688 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001689 RtpRtcp::Configuration config;
1690 config.clock = &fake_clock_;
1691 config.outgoing_transport = &transport_;
1692 config.media_send_ssrc = kSsrc;
1693 config.flexfec_sender = &flexfec_sender;
1694 config.transport_sequence_number_allocator = &seq_num_allocator_;
1695 config.event_log = &mock_rtc_event_log_;
1696 config.send_packet_observer = &send_packet_observer_;
1697 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1698 rtp_sender_ = absl::make_unique<RTPSender>(config);
1699
brandtrdbdb3f12016-11-10 05:04:48 -08001700 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtrdbdb3f12016-11-10 05:04:48 -08001701
Niels Möller5fe95102019-03-04 16:49:25 +01001702 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001703 RTPSenderVideo rtp_sender_video(
1704 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1705 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001706 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1707 /*raw_payload=*/false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001708
brandtrdbdb3f12016-11-10 05:04:48 -08001709 // Parameters selected to generate a single FEC packet per media packet.
1710 FecProtectionParams params;
1711 params.fec_rate = 15;
1712 params.max_fec_frames = 1;
1713 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001714 rtp_sender_video.SetFecParameters(params, params);
brandtrdbdb3f12016-11-10 05:04:48 -08001715
Elad Alon4a87e1c2017-10-03 16:11:34 +02001716 EXPECT_CALL(mock_rtc_event_log_,
1717 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1718 .Times(2);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001719 RTPVideoHeader video_header;
1720 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001721 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001722 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1723 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1724
brandtrdbdb3f12016-11-10 05:04:48 -08001725 ASSERT_EQ(2, transport_.packets_sent());
1726 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1727 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
Erik Språng4580ca22019-07-04 10:38:43 +02001728 EXPECT_EQ(kSsrc, media_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001729 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
1730 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
Erik Språngf6468d22019-07-05 16:53:43 +02001731 EXPECT_EQ(kFlexFecSsrc, flexfec_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001732}
1733
Steve Anton296a0ce2018-03-22 15:17:27 -07001734// Test that the MID header extension is included on sent packets when
1735// configured.
1736TEST_P(RtpSenderTestWithoutPacer, MidIncludedOnSentPackets) {
1737 const char kMid[] = "mid";
1738
1739 // Register MID header extension and set the MID for the RTPSender.
1740 rtp_sender_->SetSendingMediaStatus(false);
1741 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionMid, kMidExtensionId);
1742 rtp_sender_->SetMid(kMid);
1743 rtp_sender_->SetSendingMediaStatus(true);
1744
1745 // Send a couple packets.
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001746 SendGenericPacket();
1747 SendGenericPacket();
Steve Anton296a0ce2018-03-22 15:17:27 -07001748
1749 // Expect both packets to have the MID set.
1750 ASSERT_EQ(2u, transport_.sent_packets_.size());
1751 for (const RtpPacketReceived& packet : transport_.sent_packets_) {
1752 std::string mid;
1753 ASSERT_TRUE(packet.GetExtension<RtpMid>(&mid));
1754 EXPECT_EQ(kMid, mid);
1755 }
1756}
1757
Amit Hilbuch77938e62018-12-21 09:23:38 -08001758TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnSentPackets) {
1759 const char kRid[] = "f";
1760
1761 rtp_sender_->SetSendingMediaStatus(false);
1762 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRtpStreamId,
1763 kRidExtensionId);
1764 rtp_sender_->SetRid(kRid);
1765 rtp_sender_->SetSendingMediaStatus(true);
1766
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001767 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -08001768
1769 ASSERT_EQ(1u, transport_.sent_packets_.size());
1770 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1771 std::string rid;
1772 ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
1773 EXPECT_EQ(kRid, rid);
1774}
1775
1776TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnRtxSentPackets) {
1777 const char kRid[] = "f";
Amit Hilbuch77938e62018-12-21 09:23:38 -08001778
1779 rtp_sender_->SetSendingMediaStatus(false);
1780 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRtpStreamId,
1781 kRidExtensionId);
1782 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRepairedRtpStreamId,
1783 kRepairedRidExtensionId);
1784 rtp_sender_->SetRid(kRid);
1785 rtp_sender_->SetSendingMediaStatus(true);
1786
1787 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001788 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
Amit Hilbuch77938e62018-12-21 09:23:38 -08001789
1790 rtp_sender_->SetStorePacketsStatus(true, 10);
1791
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001792 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -08001793 ASSERT_EQ(1u, transport_.sent_packets_.size());
1794 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1795 std::string rid;
1796 ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
1797 EXPECT_EQ(kRid, rid);
1798 rid = kNoRid;
1799 EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&rid));
1800
1801 uint16_t packet_id = packet.SequenceNumber();
1802 rtp_sender_->ReSendPacket(packet_id);
1803 ASSERT_EQ(2u, transport_.sent_packets_.size());
1804 const RtpPacketReceived& rtx_packet = transport_.sent_packets_[1];
1805 ASSERT_TRUE(rtx_packet.GetExtension<RepairedRtpStreamId>(&rid));
1806 EXPECT_EQ(kRid, rid);
1807 EXPECT_FALSE(rtx_packet.HasExtension<RtpStreamId>());
1808}
1809
minyue3a407ee2017-04-03 01:10:33 -07001810TEST_P(RtpSenderTest, FecOverheadRate) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001811 constexpr uint32_t kTimestamp = 1234;
1812 constexpr int kMediaPayloadType = 127;
brandtr81eab612017-01-24 04:06:09 -08001813 constexpr int kFlexfecPayloadType = 118;
brandtr81eab612017-01-24 04:06:09 -08001814 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001815 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språng4580ca22019-07-04 10:38:43 +02001816 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
1817 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001818 nullptr /* rtp_state */, &fake_clock_);
brandtr81eab612017-01-24 04:06:09 -08001819
1820 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001821 RtpRtcp::Configuration config;
1822 config.clock = &fake_clock_;
1823 config.outgoing_transport = &transport_;
1824 config.paced_sender = &mock_paced_sender_;
1825 config.media_send_ssrc = kSsrc;
1826 config.flexfec_sender = &flexfec_sender;
1827 config.transport_sequence_number_allocator = &seq_num_allocator_;
1828 config.event_log = &mock_rtc_event_log_;
1829 config.send_packet_observer = &send_packet_observer_;
1830 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1831 rtp_sender_ = absl::make_unique<RTPSender>(config);
1832
brandtr81eab612017-01-24 04:06:09 -08001833 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtr81eab612017-01-24 04:06:09 -08001834
Niels Möller5fe95102019-03-04 16:49:25 +01001835 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001836 RTPSenderVideo rtp_sender_video(
1837 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1838 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001839 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1840 /*raw_payload=*/false);
brandtr81eab612017-01-24 04:06:09 -08001841 // Parameters selected to generate a single FEC packet per media packet.
1842 FecProtectionParams params;
1843 params.fec_rate = 15;
1844 params.max_fec_frames = 1;
1845 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001846 rtp_sender_video.SetFecParameters(params, params);
brandtr81eab612017-01-24 04:06:09 -08001847
1848 constexpr size_t kNumMediaPackets = 10;
1849 constexpr size_t kNumFecPackets = kNumMediaPackets;
1850 constexpr int64_t kTimeBetweenPacketsMs = 10;
Erik Språngf6468d22019-07-05 16:53:43 +02001851 if (GetParam().pacer_references_packets) {
1852 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, false))
1853 .Times(kNumMediaPackets + kNumFecPackets);
1854 } else {
1855 EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
1856 .Times(kNumMediaPackets + kNumFecPackets);
1857 }
brandtr81eab612017-01-24 04:06:09 -08001858 for (size_t i = 0; i < kNumMediaPackets; ++i) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001859 RTPVideoHeader video_header;
1860
1861 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001862 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001863 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1864 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1865
brandtr81eab612017-01-24 04:06:09 -08001866 fake_clock_.AdvanceTimeMilliseconds(kTimeBetweenPacketsMs);
1867 }
1868 constexpr size_t kRtpHeaderLength = 12;
1869 constexpr size_t kFlexfecHeaderLength = 20;
1870 constexpr size_t kGenericCodecHeaderLength = 1;
1871 constexpr size_t kPayloadLength = sizeof(kPayloadData);
1872 constexpr size_t kPacketLength = kRtpHeaderLength + kFlexfecHeaderLength +
1873 kGenericCodecHeaderLength + kPayloadLength;
1874 EXPECT_NEAR(kNumFecPackets * kPacketLength * 8 /
1875 (kNumFecPackets * kTimeBetweenPacketsMs / 1000.0f),
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001876 rtp_sender_video.FecOverheadRate(), 500);
brandtr81eab612017-01-24 04:06:09 -08001877}
1878
minyue3a407ee2017-04-03 01:10:33 -07001879TEST_P(RtpSenderTest, BitrateCallbacks) {
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001880 class TestCallback : public BitrateStatisticsObserver {
1881 public:
sprangcd349d92016-07-13 09:11:28 -07001882 TestCallback()
1883 : BitrateStatisticsObserver(),
1884 num_calls_(0),
1885 ssrc_(0),
1886 total_bitrate_(0),
1887 retransmit_bitrate_(0) {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +00001888 ~TestCallback() override = default;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001889
sprangcd349d92016-07-13 09:11:28 -07001890 void Notify(uint32_t total_bitrate,
1891 uint32_t retransmit_bitrate,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00001892 uint32_t ssrc) override {
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001893 ++num_calls_;
1894 ssrc_ = ssrc;
sprangcd349d92016-07-13 09:11:28 -07001895 total_bitrate_ = total_bitrate;
1896 retransmit_bitrate_ = retransmit_bitrate;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001897 }
1898
1899 uint32_t num_calls_;
1900 uint32_t ssrc_;
sprangcd349d92016-07-13 09:11:28 -07001901 uint32_t total_bitrate_;
1902 uint32_t retransmit_bitrate_;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001903 } callback;
Erik Språng4580ca22019-07-04 10:38:43 +02001904
1905 RtpRtcp::Configuration config;
1906 config.clock = &fake_clock_;
1907 config.outgoing_transport = &transport_;
1908 config.media_send_ssrc = kSsrc;
1909 config.send_bitrate_observer = &callback;
1910 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1911 rtp_sender_ = absl::make_unique<RTPSender>(config);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001912
Niels Möller5fe95102019-03-04 16:49:25 +01001913 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001914 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001915 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01001916 FieldTrialBasedConfig());
Niels Möller59ab1cf2019-02-06 22:48:11 +01001917 const char payload_name[] = "GENERIC";
1918 const uint8_t payload_type = 127;
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001919 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1920 /*raw_payload=*/false);
Niels Möller59ab1cf2019-02-06 22:48:11 +01001921
sprangcd349d92016-07-13 09:11:28 -07001922 // Simulate kNumPackets sent with kPacketInterval ms intervals, with the
1923 // number of packets selected so that we fill (but don't overflow) the one
1924 // second averaging window.
1925 const uint32_t kWindowSizeMs = 1000;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001926 const uint32_t kPacketInterval = 20;
sprangcd349d92016-07-13 09:11:28 -07001927 const uint32_t kNumPackets =
1928 (kWindowSizeMs - kPacketInterval) / kPacketInterval;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001929 // Overhead = 12 bytes RTP header + 1 byte generic header.
1930 const uint32_t kPacketOverhead = 13;
1931
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001932 uint8_t payload[] = {47, 11, 32, 93, 89};
1933 rtp_sender_->SetStorePacketsStatus(true, 1);
1934 uint32_t ssrc = rtp_sender_->SSRC();
1935
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001936 // Initial process call so we get a new time window.
1937 rtp_sender_->ProcessBitrate();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001938
1939 // Send a few frames.
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001940 RTPVideoHeader video_header;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001941 for (uint32_t i = 0; i < kNumPackets; ++i) {
Niels Möller59ab1cf2019-02-06 22:48:11 +01001942 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001943 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1944 sizeof(payload), nullptr, &video_header,
1945 kDefaultExpectedRetransmissionTimeMs));
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001946 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval);
1947 }
1948
1949 rtp_sender_->ProcessBitrate();
1950
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001951 // We get one call for every stats updated, thus two calls since both the
1952 // stream stats and the retransmit stats are updated once.
1953 EXPECT_EQ(2u, callback.num_calls_);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001954 EXPECT_EQ(ssrc, callback.ssrc_);
sprangcd349d92016-07-13 09:11:28 -07001955 const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload);
1956 // Bitrate measured over delta between last and first timestamp, plus one.
1957 const uint32_t kExpectedWindowMs = kNumPackets * kPacketInterval + 1;
1958 const uint32_t kExpectedBitsAccumulated = kTotalPacketSize * kNumPackets * 8;
1959 const uint32_t kExpectedRateBps =
1960 (kExpectedBitsAccumulated * 1000 + (kExpectedWindowMs / 2)) /
1961 kExpectedWindowMs;
1962 EXPECT_EQ(kExpectedRateBps, callback.total_bitrate_);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001963
andresp@webrtc.orgd11bec42014-07-08 14:32:58 +00001964 rtp_sender_.reset();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001965}
1966
minyue3a407ee2017-04-03 01:10:33 -07001967TEST_P(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) {
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001968 class TestCallback : public StreamDataCountersCallback {
1969 public:
danilchap162abd32015-12-10 02:39:40 -08001970 TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +00001971 ~TestCallback() override = default;
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001972
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00001973 void DataCountersUpdated(const StreamDataCounters& counters,
1974 uint32_t ssrc) override {
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001975 ssrc_ = ssrc;
1976 counters_ = counters;
1977 }
1978
1979 uint32_t ssrc_;
1980 StreamDataCounters counters_;
asapersson@webrtc.org44149392015-02-04 08:34:47 +00001981
1982 void MatchPacketCounter(const RtpPacketCounter& expected,
1983 const RtpPacketCounter& actual) {
1984 EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
1985 EXPECT_EQ(expected.header_bytes, actual.header_bytes);
1986 EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
1987 EXPECT_EQ(expected.packets, actual.packets);
1988 }
1989
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001990 void Matches(uint32_t ssrc, const StreamDataCounters& counters) {
1991 EXPECT_EQ(ssrc, ssrc_);
asapersson@webrtc.org44149392015-02-04 08:34:47 +00001992 MatchPacketCounter(counters.transmitted, counters_.transmitted);
1993 MatchPacketCounter(counters.retransmitted, counters_.retransmitted);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001994 EXPECT_EQ(counters.fec.packets, counters_.fec.packets);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001995 }
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001996 } callback;
1997
1998 const uint8_t kRedPayloadType = 96;
1999 const uint8_t kUlpfecPayloadType = 97;
Niels Möller8a40edd2019-01-24 18:04:44 +01002000 const char payload_name[] = "GENERIC";
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00002001 const uint8_t payload_type = 127;
Niels Möller5fe95102019-03-04 16:49:25 +01002002 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01002003 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02002004 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01002005 FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02002006 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
2007 /*raw_payload=*/false);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00002008 uint8_t payload[] = {47, 11, 32, 93, 89};
2009 rtp_sender_->SetStorePacketsStatus(true, 1);
2010 uint32_t ssrc = rtp_sender_->SSRC();
2011
2012 rtp_sender_->RegisterRtpStatisticsCallback(&callback);
2013
2014 // Send a frame.
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02002015 RTPVideoHeader video_header;
Niels Möller59ab1cf2019-02-06 22:48:11 +01002016 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01002017 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
2018 sizeof(payload), nullptr, &video_header,
2019 kDefaultExpectedRetransmissionTimeMs));
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00002020 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00002021 expected.transmitted.payload_bytes = 6;
2022 expected.transmitted.header_bytes = 12;
2023 expected.transmitted.padding_bytes = 0;
2024 expected.transmitted.packets = 1;
2025 expected.retransmitted.payload_bytes = 0;
2026 expected.retransmitted.header_bytes = 0;
2027 expected.retransmitted.padding_bytes = 0;
2028 expected.retransmitted.packets = 0;
2029 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00002030 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00002031
2032 // Retransmit a frame.
2033 uint16_t seqno = rtp_sender_->SequenceNumber() - 1;
Erik Språnga12b1d62018-03-14 12:39:24 +01002034 rtp_sender_->ReSendPacket(seqno);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00002035 expected.transmitted.payload_bytes = 12;
2036 expected.transmitted.header_bytes = 24;
2037 expected.transmitted.packets = 2;
2038 expected.retransmitted.payload_bytes = 6;
2039 expected.retransmitted.header_bytes = 12;
2040 expected.retransmitted.padding_bytes = 0;
2041 expected.retransmitted.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00002042 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00002043
2044 // Send padding.
philipel8aadd502017-02-23 02:56:13 -08002045 rtp_sender_->TimeToSendPadding(kMaxPaddingSize, PacedPacketInfo());
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00002046 expected.transmitted.payload_bytes = 12;
2047 expected.transmitted.header_bytes = 36;
2048 expected.transmitted.padding_bytes = kMaxPaddingSize;
2049 expected.transmitted.packets = 3;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00002050 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00002051
brandtrf1bb4762016-11-07 03:05:06 -08002052 // Send ULPFEC.
Niels Möller59ab1cf2019-02-06 22:48:11 +01002053 rtp_sender_video.SetUlpfecConfig(kRedPayloadType, kUlpfecPayloadType);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00002054 FecProtectionParams fec_params;
2055 fec_params.fec_mask_type = kFecMaskRandom;
2056 fec_params.fec_rate = 1;
2057 fec_params.max_fec_frames = 1;
Niels Möller59ab1cf2019-02-06 22:48:11 +01002058 rtp_sender_video.SetFecParameters(fec_params, fec_params);
2059 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01002060 VideoFrameType::kVideoFrameDelta, payload_type, 1234, 4321, payload,
2061 sizeof(payload), nullptr, &video_header,
2062 kDefaultExpectedRetransmissionTimeMs));
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00002063 expected.transmitted.payload_bytes = 40;
2064 expected.transmitted.header_bytes = 60;
2065 expected.transmitted.packets = 5;
2066 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00002067 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00002068
sprang867fb522015-08-03 04:38:41 -07002069 rtp_sender_->RegisterRtpStatisticsCallback(nullptr);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00002070}
2071
minyue3a407ee2017-04-03 01:10:33 -07002072TEST_P(RtpSenderTestWithoutPacer, BytesReportedCorrectly) {
Niels Möller59ab1cf2019-02-06 22:48:11 +01002073 // XXX const char* kPayloadName = "GENERIC";
pbos@webrtc.org72491b92014-07-10 16:24:54 +00002074 const uint8_t kPayloadType = 127;
Shao Changbine62202f2015-04-21 20:24:50 +08002075 rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType);
pbos@webrtc.org0b0c2412015-01-13 14:15:15 +00002076 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00002077
Niels Möller59ab1cf2019-02-06 22:48:11 +01002078 SendGenericPacket();
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00002079 // Will send 2 full-size padding packets.
philipel8aadd502017-02-23 02:56:13 -08002080 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
2081 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
pbos@webrtc.org72491b92014-07-10 16:24:54 +00002082
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00002083 StreamDataCounters rtp_stats;
2084 StreamDataCounters rtx_stats;
2085 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00002086
Niels Möller59ab1cf2019-02-06 22:48:11 +01002087 // Payload
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +00002088 EXPECT_GT(rtp_stats.first_packet_time_ms, -1);
Niels Möller59ab1cf2019-02-06 22:48:11 +01002089 EXPECT_EQ(rtp_stats.transmitted.payload_bytes, sizeof(kPayloadData));
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00002090 EXPECT_EQ(rtp_stats.transmitted.header_bytes, 12u);
2091 EXPECT_EQ(rtp_stats.transmitted.padding_bytes, 0u);
2092 EXPECT_EQ(rtx_stats.transmitted.payload_bytes, 0u);
2093 EXPECT_EQ(rtx_stats.transmitted.header_bytes, 24u);
2094 EXPECT_EQ(rtx_stats.transmitted.padding_bytes, 2 * kMaxPaddingSize);
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00002095
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00002096 EXPECT_EQ(rtp_stats.transmitted.TotalBytes(),
danilchap162abd32015-12-10 02:39:40 -08002097 rtp_stats.transmitted.payload_bytes +
2098 rtp_stats.transmitted.header_bytes +
2099 rtp_stats.transmitted.padding_bytes);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00002100 EXPECT_EQ(rtx_stats.transmitted.TotalBytes(),
danilchap162abd32015-12-10 02:39:40 -08002101 rtx_stats.transmitted.payload_bytes +
2102 rtx_stats.transmitted.header_bytes +
2103 rtx_stats.transmitted.padding_bytes);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00002104
danilchap162abd32015-12-10 02:39:40 -08002105 EXPECT_EQ(
2106 transport_.total_bytes_sent_,
2107 rtp_stats.transmitted.TotalBytes() + rtx_stats.transmitted.TotalBytes());
pbos@webrtc.org72491b92014-07-10 16:24:54 +00002108}
guoweis@webrtc.org45362892015-03-04 22:55:15 +00002109
minyue3a407ee2017-04-03 01:10:33 -07002110TEST_P(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) {
sprang38778b02015-09-29 09:48:22 -07002111 const int32_t kPacketSize = 1400;
2112 const int32_t kNumPackets = 30;
2113
sprangcd349d92016-07-13 09:11:28 -07002114 retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8);
2115
sprang38778b02015-09-29 09:48:22 -07002116 rtp_sender_->SetStorePacketsStatus(true, kNumPackets);
sprang38778b02015-09-29 09:48:22 -07002117 const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber();
Danil Chapovalov2800d742016-08-26 18:48:46 +02002118 std::vector<uint16_t> sequence_numbers;
sprang38778b02015-09-29 09:48:22 -07002119 for (int32_t i = 0; i < kNumPackets; ++i) {
2120 sequence_numbers.push_back(kStartSequenceNumber + i);
2121 fake_clock_.AdvanceTimeMilliseconds(1);
2122 SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize);
2123 }
danilchap12ba1862016-10-26 02:41:55 -07002124 EXPECT_EQ(kNumPackets, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07002125
2126 fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets);
2127
2128 // Resending should work - brings the bandwidth up to the limit.
2129 // NACK bitrate is capped to the same bitrate as the encoder, since the max
2130 // protection overhead is 50% (see MediaOptimization::SetTargetRates).
Danil Chapovalov2800d742016-08-26 18:48:46 +02002131 rtp_sender_->OnReceivedNack(sequence_numbers, 0);
danilchap12ba1862016-10-26 02:41:55 -07002132 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07002133
sprangcd349d92016-07-13 09:11:28 -07002134 // Must be at least 5ms in between retransmission attempts.
2135 fake_clock_.AdvanceTimeMilliseconds(5);
2136
sprang38778b02015-09-29 09:48:22 -07002137 // Resending should not work, bandwidth exceeded.
Danil Chapovalov2800d742016-08-26 18:48:46 +02002138 rtp_sender_->OnReceivedNack(sequence_numbers, 0);
danilchap12ba1862016-10-26 02:41:55 -07002139 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07002140}
2141
minyue3a407ee2017-04-03 01:10:33 -07002142TEST_P(RtpSenderTest, OnOverheadChanged) {
michaelt4da30442016-11-17 01:38:43 -08002143 MockOverheadObserver mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02002144 RtpRtcp::Configuration config;
2145 config.clock = &fake_clock_;
2146 config.outgoing_transport = &transport_;
2147 config.media_send_ssrc = kSsrc;
2148 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
2149 config.overhead_observer = &mock_overhead_observer;
2150 rtp_sender_ = absl::make_unique<RTPSender>(config);
michaelt4da30442016-11-17 01:38:43 -08002151
michaelt4da30442016-11-17 01:38:43 -08002152 // RTP overhead is 12B.
nisse284542b2017-01-10 08:58:32 -08002153 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(12)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01002154 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08002155
2156 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
2157 kTransmissionTimeOffsetExtensionId);
2158
2159 // TransmissionTimeOffset extension has a size of 8B.
nisse284542b2017-01-10 08:58:32 -08002160 // 12B + 8B = 20B
2161 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(20)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01002162 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08002163}
2164
minyue3a407ee2017-04-03 01:10:33 -07002165TEST_P(RtpSenderTest, DoesNotUpdateOverheadOnEqualSize) {
michaelt4da30442016-11-17 01:38:43 -08002166 MockOverheadObserver mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02002167 RtpRtcp::Configuration config;
2168 config.clock = &fake_clock_;
2169 config.outgoing_transport = &transport_;
2170 config.media_send_ssrc = kSsrc;
2171 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
2172 config.overhead_observer = &mock_overhead_observer;
2173 rtp_sender_ = absl::make_unique<RTPSender>(config);
michaelt4da30442016-11-17 01:38:43 -08002174
2175 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(_)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01002176 SendGenericPacket();
2177 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08002178}
2179
Erik Språng9c771c22019-06-17 16:31:53 +02002180TEST_P(RtpSenderTest, TrySendPacketMatchesVideo) {
2181 std::unique_ptr<RtpPacketToSend> packet =
2182 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2183 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2184
2185 // Verify not sent with wrong SSRC.
2186 packet->SetSsrc(kSsrc + 1);
2187 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2188
2189 // Verify sent with correct SSRC.
2190 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2191 packet->SetSsrc(kSsrc);
2192 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2193 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2194}
2195
2196TEST_P(RtpSenderTest, TrySendPacketMatchesAudio) {
2197 std::unique_ptr<RtpPacketToSend> packet =
2198 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2199 packet->set_packet_type(RtpPacketToSend::Type::kAudio);
2200
2201 // Verify not sent with wrong SSRC.
2202 packet->SetSsrc(kSsrc + 1);
2203 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2204
2205 // Verify sent with correct SSRC.
2206 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2207 packet->SetSsrc(kSsrc);
2208 packet->set_packet_type(RtpPacketToSend::Type::kAudio);
2209 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2210}
2211
2212TEST_P(RtpSenderTest, TrySendPacketMatchesRetransmissions) {
2213 std::unique_ptr<RtpPacketToSend> packet =
2214 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2215 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2216
2217 // Verify not sent with wrong SSRC.
2218 packet->SetSsrc(kSsrc + 1);
2219 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2220
2221 // Verify sent with correct SSRC (non-RTX).
2222 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2223 packet->SetSsrc(kSsrc);
2224 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2225 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2226
2227 // RTX retransmission.
2228 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2229 packet->SetSsrc(kRtxSsrc);
2230 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2231 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2232}
2233
2234TEST_P(RtpSenderTest, TrySendPacketMatchesPadding) {
2235 std::unique_ptr<RtpPacketToSend> packet =
2236 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2237 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
2238
2239 // Verify not sent with wrong SSRC.
2240 packet->SetSsrc(kSsrc + 1);
2241 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2242
2243 // Verify sent with correct SSRC (non-RTX).
2244 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2245 packet->SetSsrc(kSsrc);
2246 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
2247 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2248
2249 // RTX padding.
2250 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2251 packet->SetSsrc(kRtxSsrc);
2252 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
2253 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2254}
2255
2256TEST_P(RtpSenderTest, TrySendPacketMatchesFlexfec) {
2257 std::unique_ptr<RtpPacketToSend> packet =
2258 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2259 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2260
2261 // Verify not sent with wrong SSRC.
2262 packet->SetSsrc(kSsrc + 1);
2263 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2264
2265 // Verify sent with correct SSRC.
2266 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2267 packet->SetSsrc(kFlexFecSsrc);
2268 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2269 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2270}
2271
2272TEST_P(RtpSenderTest, TrySendPacketMatchesUlpfec) {
2273 std::unique_ptr<RtpPacketToSend> packet =
2274 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2275 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2276
2277 // Verify not sent with wrong SSRC.
2278 packet->SetSsrc(kSsrc + 1);
2279 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2280
2281 // Verify sent with correct SSRC.
2282 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2283 packet->SetSsrc(kSsrc);
2284 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2285 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2286}
2287
2288TEST_P(RtpSenderTest, TrySendPacketHandlesRetransmissionHistory) {
2289 rtp_sender_->SetStorePacketsStatus(true, 10);
2290
2291 // Build a media packet and send it.
2292 std::unique_ptr<RtpPacketToSend> packet =
2293 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2294 const uint16_t media_sequence_number = packet->SequenceNumber();
2295 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2296 packet->set_allow_retransmission(true);
2297 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2298
2299 // Simulate retransmission request.
2300 fake_clock_.AdvanceTimeMilliseconds(30);
2301 EXPECT_GT(rtp_sender_->ReSendPacket(media_sequence_number), 0);
2302
2303 // Packet already pending, retransmission not allowed.
2304 fake_clock_.AdvanceTimeMilliseconds(30);
2305 EXPECT_EQ(rtp_sender_->ReSendPacket(media_sequence_number), 0);
2306
2307 // Packet exiting pacer, mark as not longer pending.
2308 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2309 EXPECT_NE(packet->SequenceNumber(), media_sequence_number);
2310 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2311 packet->SetSsrc(kRtxSsrc);
2312 packet->set_retransmitted_sequence_number(media_sequence_number);
2313 packet->set_allow_retransmission(false);
2314 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2315
2316 // Retransmissions allowed again.
2317 fake_clock_.AdvanceTimeMilliseconds(30);
2318 EXPECT_GT(rtp_sender_->ReSendPacket(media_sequence_number), 0);
2319
2320 // Retransmission of RTX packet should not be allowed.
2321 EXPECT_EQ(rtp_sender_->ReSendPacket(packet->SequenceNumber()), 0);
2322}
2323
2324TEST_P(RtpSenderTest, TrySendPacketUpdatesExtensions) {
2325 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2326 kRtpExtensionTransmissionTimeOffset,
2327 kTransmissionTimeOffsetExtensionId),
2328 0);
2329 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2330 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId),
2331 0);
2332 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionVideoTiming,
2333 kVideoTimingExtensionId),
2334 0);
2335
2336 std::unique_ptr<RtpPacketToSend> packet =
2337 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2338 packet->set_packetization_finish_time_ms(fake_clock_.TimeInMilliseconds());
2339
2340 const int32_t kDiffMs = 10;
2341 fake_clock_.AdvanceTimeMilliseconds(kDiffMs);
2342
2343 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2344 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2345
2346 const RtpPacketReceived& received_packet = transport_.last_sent_packet();
2347
2348 EXPECT_EQ(received_packet.GetExtension<TransmissionOffset>(), kDiffMs * 90);
2349
2350 EXPECT_EQ(received_packet.GetExtension<AbsoluteSendTime>(),
2351 AbsoluteSendTime::MsTo24Bits(fake_clock_.TimeInMilliseconds()));
2352
2353 VideoSendTiming timing;
2354 EXPECT_TRUE(received_packet.GetExtension<VideoTimingExtension>(&timing));
2355 EXPECT_EQ(timing.pacer_exit_delta_ms, kDiffMs);
2356}
2357
2358TEST_P(RtpSenderTest, TrySendPacketSetsPacketOptions) {
2359 const uint16_t kPacketId = 42;
2360 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2361 kRtpExtensionTransportSequenceNumber,
2362 kTransportSequenceNumberExtensionId),
2363 0);
2364 std::unique_ptr<RtpPacketToSend> packet =
2365 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2366 packet->SetExtension<TransportSequenceNumber>(kPacketId);
2367
2368 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2369 EXPECT_CALL(send_packet_observer_, OnSendPacket);
2370 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2371
2372 EXPECT_EQ(transport_.last_options_.packet_id, kPacketId);
2373 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
2374 EXPECT_TRUE(transport_.last_options_.included_in_feedback);
2375 EXPECT_FALSE(transport_.last_options_.is_retransmit);
2376
2377 // Send another packet as retransmission, verify options are populated.
2378 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2379 packet->SetExtension<TransportSequenceNumber>(kPacketId + 1);
2380 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2381 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2382 EXPECT_TRUE(transport_.last_options_.is_retransmit);
2383}
2384
2385TEST_P(RtpSenderTest, TrySendPacketUpdatesStats) {
2386 const size_t kPayloadSize = 1000;
2387
2388 StrictMock<MockSendSideDelayObserver> send_side_delay_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02002389
2390 RtpRtcp::Configuration config;
2391 config.clock = &fake_clock_;
2392 config.outgoing_transport = &transport_;
2393 config.media_send_ssrc = kSsrc;
2394 config.rtx_send_ssrc = kRtxSsrc;
2395 config.flexfec_sender = &flexfec_sender_;
2396 config.send_side_delay_observer = &send_side_delay_observer;
2397 config.event_log = &mock_rtc_event_log_;
2398 config.send_packet_observer = &send_packet_observer_;
2399 rtp_sender_ = absl::make_unique<RTPSender>(config);
Erik Språng9c771c22019-06-17 16:31:53 +02002400 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
2401 kRtpExtensionTransportSequenceNumber,
2402 kTransportSequenceNumberExtensionId));
2403
2404 const int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
2405
2406 std::unique_ptr<RtpPacketToSend> video_packet =
2407 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2408 video_packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2409 video_packet->SetPayloadSize(kPayloadSize);
2410 video_packet->SetExtension<TransportSequenceNumber>(1);
2411
2412 std::unique_ptr<RtpPacketToSend> rtx_packet =
2413 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2414 rtx_packet->SetSsrc(kRtxSsrc);
2415 rtx_packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2416 rtx_packet->SetPayloadSize(kPayloadSize);
2417 rtx_packet->SetExtension<TransportSequenceNumber>(2);
2418
2419 std::unique_ptr<RtpPacketToSend> fec_packet =
2420 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2421 fec_packet->SetSsrc(kFlexFecSsrc);
2422 fec_packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2423 fec_packet->SetPayloadSize(kPayloadSize);
2424 fec_packet->SetExtension<TransportSequenceNumber>(3);
2425
2426 const int64_t kDiffMs = 25;
2427 fake_clock_.AdvanceTimeMilliseconds(kDiffMs);
2428
2429 EXPECT_CALL(send_side_delay_observer,
2430 SendSideDelayUpdated(kDiffMs, kDiffMs, kDiffMs, kSsrc));
2431 EXPECT_CALL(
2432 send_side_delay_observer,
2433 SendSideDelayUpdated(kDiffMs, kDiffMs, 2 * kDiffMs, kFlexFecSsrc));
2434
2435 EXPECT_CALL(send_packet_observer_, OnSendPacket(1, capture_time_ms, kSsrc));
2436 EXPECT_TRUE(
2437 rtp_sender_->TrySendPacket(video_packet.get(), PacedPacketInfo()));
2438
2439 // Send packet observer not called for padding/retransmissions.
2440 EXPECT_CALL(send_packet_observer_, OnSendPacket(2, _, _)).Times(0);
2441 EXPECT_TRUE(rtp_sender_->TrySendPacket(rtx_packet.get(), PacedPacketInfo()));
2442
2443 EXPECT_CALL(send_packet_observer_,
2444 OnSendPacket(3, capture_time_ms, kFlexFecSsrc));
2445 EXPECT_TRUE(rtp_sender_->TrySendPacket(fec_packet.get(), PacedPacketInfo()));
2446
2447 StreamDataCounters rtp_stats;
2448 StreamDataCounters rtx_stats;
2449 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
2450 EXPECT_EQ(rtp_stats.transmitted.packets, 2u);
2451 EXPECT_EQ(rtp_stats.fec.packets, 1u);
2452 EXPECT_EQ(rtx_stats.retransmitted.packets, 1u);
2453}
2454
Erik Språng478cb462019-06-26 15:49:27 +02002455TEST_P(RtpSenderTest, GeneratePaddingResendsOldPacketsWithRtx) {
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002456 // Min requested size in order to use RTX payload.
2457 const size_t kMinPaddingSize = 50;
2458
Erik Språng478cb462019-06-26 15:49:27 +02002459 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2460 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
2461 rtp_sender_->SetStorePacketsStatus(true, 1);
2462
Erik Språng0f6191d2019-07-15 20:33:40 +02002463 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
2464 kRtpExtensionTransmissionTimeOffset,
2465 kTransmissionTimeOffsetExtensionId));
2466 ASSERT_EQ(
2467 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
2468 kAbsoluteSendTimeExtensionId));
2469 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
2470 kRtpExtensionTransportSequenceNumber,
2471 kTransportSequenceNumberExtensionId));
2472
Erik Språng478cb462019-06-26 15:49:27 +02002473 const size_t kPayloadPacketSize = 1234;
2474 std::unique_ptr<RtpPacketToSend> packet =
2475 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2476 packet->set_allow_retransmission(true);
2477 packet->SetPayloadSize(kPayloadPacketSize);
2478 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2479
2480 // Send a dummy video packet so it ends up in the packet history.
Erik Språng0f6191d2019-07-15 20:33:40 +02002481 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Erik Språng478cb462019-06-26 15:49:27 +02002482 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2483
2484 // Generated padding has large enough budget that the video packet should be
2485 // retransmitted as padding.
Erik Språngf6468d22019-07-05 16:53:43 +02002486 std::vector<std::unique_ptr<RtpPacketToSend>> generated_packets =
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002487 rtp_sender_->GeneratePadding(kMinPaddingSize);
Erik Språngf6468d22019-07-05 16:53:43 +02002488 ASSERT_EQ(generated_packets.size(), 1u);
2489 auto& padding_packet = generated_packets.front();
2490 EXPECT_EQ(padding_packet->packet_type(), RtpPacketToSend::Type::kPadding);
2491 EXPECT_EQ(padding_packet->Ssrc(), kRtxSsrc);
2492 EXPECT_EQ(padding_packet->payload_size(),
2493 kPayloadPacketSize + kRtxHeaderSize);
Erik Språng0f6191d2019-07-15 20:33:40 +02002494 EXPECT_TRUE(padding_packet->IsExtensionReserved<TransportSequenceNumber>());
2495 EXPECT_TRUE(padding_packet->IsExtensionReserved<AbsoluteSendTime>());
2496 EXPECT_TRUE(padding_packet->IsExtensionReserved<TransmissionOffset>());
2497
2498 // Verify all header extensions are received.
2499 EXPECT_TRUE(
2500 rtp_sender_->TrySendPacket(padding_packet.get(), PacedPacketInfo()));
2501 webrtc::RTPHeader rtp_header;
2502 transport_.last_sent_packet().GetHeader(&rtp_header);
2503 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime);
2504 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
2505 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
Erik Språng478cb462019-06-26 15:49:27 +02002506
2507 // Not enough budged for payload padding, use plain padding instead.
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002508 const size_t kPaddingBytesRequested = kMinPaddingSize - 1;
Erik Språngf6468d22019-07-05 16:53:43 +02002509
2510 size_t padding_bytes_generated = 0;
2511 generated_packets = rtp_sender_->GeneratePadding(kPaddingBytesRequested);
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002512 EXPECT_EQ(generated_packets.size(), 1u);
Erik Språngf6468d22019-07-05 16:53:43 +02002513 for (auto& packet : generated_packets) {
2514 EXPECT_EQ(packet->packet_type(), RtpPacketToSend::Type::kPadding);
2515 EXPECT_EQ(packet->Ssrc(), kRtxSsrc);
2516 EXPECT_EQ(packet->payload_size(), 0u);
2517 EXPECT_GT(packet->padding_size(), 0u);
2518 padding_bytes_generated += packet->padding_size();
Erik Språng0f6191d2019-07-15 20:33:40 +02002519
2520 EXPECT_TRUE(packet->IsExtensionReserved<TransportSequenceNumber>());
2521 EXPECT_TRUE(packet->IsExtensionReserved<AbsoluteSendTime>());
2522 EXPECT_TRUE(packet->IsExtensionReserved<TransmissionOffset>());
2523
2524 // Verify all header extensions are received.
2525 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2526 webrtc::RTPHeader rtp_header;
2527 transport_.last_sent_packet().GetHeader(&rtp_header);
2528 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime);
2529 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
2530 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
Erik Språngf6468d22019-07-05 16:53:43 +02002531 }
2532
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002533 EXPECT_EQ(padding_bytes_generated, kMaxPaddingSize);
Erik Språng478cb462019-06-26 15:49:27 +02002534}
2535
2536TEST_P(RtpSenderTest, GeneratePaddingCreatesPurePaddingWithoutRtx) {
2537 rtp_sender_->SetStorePacketsStatus(true, 1);
Erik Språng0f6191d2019-07-15 20:33:40 +02002538 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
2539 kRtpExtensionTransmissionTimeOffset,
2540 kTransmissionTimeOffsetExtensionId));
2541 ASSERT_EQ(
2542 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
2543 kAbsoluteSendTimeExtensionId));
2544 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
2545 kRtpExtensionTransportSequenceNumber,
2546 kTransportSequenceNumberExtensionId));
Erik Språng478cb462019-06-26 15:49:27 +02002547
2548 const size_t kPayloadPacketSize = 1234;
2549 // Send a dummy video packet so it ends up in the packet history. Since we
2550 // are not using RTX, it should never be used as padding.
2551 std::unique_ptr<RtpPacketToSend> packet =
2552 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2553 packet->set_allow_retransmission(true);
2554 packet->SetPayloadSize(kPayloadPacketSize);
2555 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Erik Språng0f6191d2019-07-15 20:33:40 +02002556 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Erik Språng478cb462019-06-26 15:49:27 +02002557 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2558
2559 // Payload padding not available without RTX, only generate plain padding on
2560 // the media SSRC.
2561 // Number of padding packets is the requested padding size divided by max
2562 // padding packet size, rounded up. Pure padding packets are always of the
2563 // maximum size.
2564 const size_t kPaddingBytesRequested = kPayloadPacketSize + kRtxHeaderSize;
2565 const size_t kExpectedNumPaddingPackets =
2566 (kPaddingBytesRequested + kMaxPaddingSize - 1) / kMaxPaddingSize;
Erik Språngf6468d22019-07-05 16:53:43 +02002567 size_t padding_bytes_generated = 0;
2568 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
2569 rtp_sender_->GeneratePadding(kPaddingBytesRequested);
2570 EXPECT_EQ(padding_packets.size(), kExpectedNumPaddingPackets);
2571 for (auto& packet : padding_packets) {
2572 EXPECT_EQ(packet->packet_type(), RtpPacketToSend::Type::kPadding);
2573 EXPECT_EQ(packet->Ssrc(), kSsrc);
2574 EXPECT_EQ(packet->payload_size(), 0u);
2575 EXPECT_GT(packet->padding_size(), 0u);
2576 padding_bytes_generated += packet->padding_size();
Erik Språng0f6191d2019-07-15 20:33:40 +02002577 EXPECT_TRUE(packet->IsExtensionReserved<TransportSequenceNumber>());
2578 EXPECT_TRUE(packet->IsExtensionReserved<AbsoluteSendTime>());
2579 EXPECT_TRUE(packet->IsExtensionReserved<TransmissionOffset>());
2580
2581 // Verify all header extensions are received.
2582 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2583 webrtc::RTPHeader rtp_header;
2584 transport_.last_sent_packet().GetHeader(&rtp_header);
2585 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime);
2586 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
2587 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
Erik Språngf6468d22019-07-05 16:53:43 +02002588 }
2589
2590 EXPECT_EQ(padding_bytes_generated,
2591 kExpectedNumPaddingPackets * kMaxPaddingSize);
Erik Språng478cb462019-06-26 15:49:27 +02002592}
2593
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002594TEST_P(RtpSenderTest, SupportsPadding) {
2595 bool kSendingMediaStats[] = {true, false};
2596 bool kEnableRedundantPayloads[] = {true, false};
2597 RTPExtensionType kBweExtensionTypes[] = {
2598 kRtpExtensionTransportSequenceNumber,
2599 kRtpExtensionTransportSequenceNumber02, kRtpExtensionAbsoluteSendTime,
2600 kRtpExtensionTransmissionTimeOffset};
2601 const int kExtensionsId = 7;
2602
2603 for (bool sending_media : kSendingMediaStats) {
2604 rtp_sender_->SetSendingMediaStatus(sending_media);
2605 for (bool redundant_payloads : kEnableRedundantPayloads) {
2606 int rtx_mode = kRtxRetransmitted;
2607 if (redundant_payloads) {
2608 rtx_mode |= kRtxRedundantPayloads;
2609 }
2610 rtp_sender_->SetRtxStatus(rtx_mode);
2611
2612 for (auto extension_type : kBweExtensionTypes) {
2613 EXPECT_FALSE(rtp_sender_->SupportsPadding());
2614 rtp_sender_->RegisterRtpHeaderExtension(extension_type, kExtensionsId);
2615 if (!sending_media) {
2616 EXPECT_FALSE(rtp_sender_->SupportsPadding());
2617 } else {
2618 EXPECT_TRUE(rtp_sender_->SupportsPadding());
2619 if (redundant_payloads) {
2620 EXPECT_TRUE(rtp_sender_->SupportsRtxPayloadPadding());
2621 } else {
2622 EXPECT_FALSE(rtp_sender_->SupportsRtxPayloadPadding());
2623 }
2624 }
2625 rtp_sender_->DeregisterRtpHeaderExtension(extension_type);
2626 EXPECT_FALSE(rtp_sender_->SupportsPadding());
2627 }
2628 }
2629 }
2630}
2631
Erik Språnga57711c2019-07-24 10:47:20 +02002632TEST_P(RtpSenderTest, SetsCaptureTimeAndPopulatesTransmissionOffset) {
2633 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
2634 kTransmissionTimeOffsetExtensionId);
2635
2636 rtp_sender_->SetSendingMediaStatus(true);
2637 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2638 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
2639 rtp_sender_->SetStorePacketsStatus(true, 10);
2640
2641 const int64_t kMissingCaptureTimeMs = 0;
2642 const uint32_t kTimestampTicksPerMs = 90;
2643 const int64_t kOffsetMs = 10;
2644
2645 if (GetParam().pacer_references_packets) {
2646 EXPECT_CALL(mock_paced_sender_, InsertPacket);
2647
2648 auto packet =
2649 BuildRtpPacket(kPayload, kMarkerBit, fake_clock_.TimeInMilliseconds(),
2650 kMissingCaptureTimeMs);
2651 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2652 packet->ReserveExtension<TransmissionOffset>();
2653 packet->AllocatePayload(sizeof(kPayloadData));
2654 EXPECT_TRUE(
2655 rtp_sender_->SendToNetwork(std::move(packet), kAllowRetransmission));
2656
2657 fake_clock_.AdvanceTimeMilliseconds(kOffsetMs);
2658
2659 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
2660 fake_clock_.TimeInMilliseconds(), false,
2661 PacedPacketInfo());
2662 } else {
2663 auto packet =
2664 BuildRtpPacket(kPayload, kMarkerBit, fake_clock_.TimeInMilliseconds(),
2665 kMissingCaptureTimeMs);
2666 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2667 packet->ReserveExtension<TransmissionOffset>();
2668 packet->AllocatePayload(sizeof(kPayloadData));
2669
2670 std::unique_ptr<RtpPacketToSend> packet_to_pace;
2671 EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
2672 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet) {
2673 EXPECT_GT(packet->capture_time_ms(), 0);
2674 packet_to_pace = std::move(packet);
2675 });
2676
2677 EXPECT_TRUE(
2678 rtp_sender_->SendToNetwork(std::move(packet), kAllowRetransmission));
2679
2680 fake_clock_.AdvanceTimeMilliseconds(kOffsetMs);
2681
2682 rtp_sender_->TrySendPacket(packet_to_pace.get(), PacedPacketInfo());
2683 }
2684
2685 EXPECT_EQ(1, transport_.packets_sent());
2686 absl::optional<int32_t> transmission_time_extension =
2687 transport_.sent_packets_.back().GetExtension<TransmissionOffset>();
2688 ASSERT_TRUE(transmission_time_extension.has_value());
2689 EXPECT_EQ(*transmission_time_extension, kOffsetMs * kTimestampTicksPerMs);
2690
2691 // Retransmit packet. The RTX packet should get the same capture time as the
2692 // original packet, so offset is delta from original packet to now.
2693 fake_clock_.AdvanceTimeMilliseconds(kOffsetMs);
2694
2695 if (GetParam().pacer_references_packets) {
2696 EXPECT_CALL(mock_paced_sender_, InsertPacket);
2697 EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
2698 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
2699 fake_clock_.TimeInMilliseconds(), true,
2700 PacedPacketInfo());
2701 } else {
2702 std::unique_ptr<RtpPacketToSend> rtx_packet_to_pace;
2703 EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
2704 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet) {
2705 EXPECT_GT(packet->capture_time_ms(), 0);
2706 rtx_packet_to_pace = std::move(packet);
2707 });
2708
2709 EXPECT_GT(rtp_sender_->ReSendPacket(kSeqNum), 0);
2710 rtp_sender_->TrySendPacket(rtx_packet_to_pace.get(), PacedPacketInfo());
2711 }
2712
2713 EXPECT_EQ(2, transport_.packets_sent());
2714 transmission_time_extension =
2715 transport_.sent_packets_.back().GetExtension<TransmissionOffset>();
2716 ASSERT_TRUE(transmission_time_extension.has_value());
2717 EXPECT_EQ(*transmission_time_extension, 2 * kOffsetMs * kTimestampTicksPerMs);
2718}
2719
Erik Språng6cacef22019-07-24 14:15:51 +02002720TEST_P(RtpSenderTestWithoutPacer, ClearHistoryOnSsrcChange) {
2721 const int64_t kRtt = 10;
2722
2723 rtp_sender_->SetSendingMediaStatus(true);
2724 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2725 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
2726 rtp_sender_->SetStorePacketsStatus(true, 10);
2727 rtp_sender_->SetRtt(kRtt);
2728 rtp_sender_->SetSSRC(kSsrc);
2729
2730 // Send a packet and record its sequence numbers.
2731 SendGenericPacket();
2732 ASSERT_EQ(1u, transport_.sent_packets_.size());
2733 const uint16_t packet_seqence_number =
2734 transport_.sent_packets_.back().SequenceNumber();
2735
2736 // Advance time and make sure it can be retransmitted, even if we try to set
2737 // the ssrc the what it already is.
2738 rtp_sender_->SetSSRC(kSsrc);
2739 fake_clock_.AdvanceTimeMilliseconds(kRtt);
2740 EXPECT_GT(rtp_sender_->ReSendPacket(packet_seqence_number), 0);
2741
2742 // Change the SSRC, then move the time and try to retransmit again. The old
2743 // packet should now be gone.
2744 rtp_sender_->SetSSRC(kSsrc + 1);
2745 fake_clock_.AdvanceTimeMilliseconds(kRtt);
2746 EXPECT_EQ(rtp_sender_->ReSendPacket(packet_seqence_number), 0);
2747}
2748
2749TEST_P(RtpSenderTestWithoutPacer, ClearHistoryOnSequenceNumberCange) {
2750 const int64_t kRtt = 10;
2751
2752 rtp_sender_->SetSendingMediaStatus(true);
2753 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2754 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
2755 rtp_sender_->SetStorePacketsStatus(true, 10);
2756 rtp_sender_->SetRtt(kRtt);
2757
2758 // Send a packet and record its sequence numbers.
2759 SendGenericPacket();
2760 ASSERT_EQ(1u, transport_.sent_packets_.size());
2761 const uint16_t packet_seqence_number =
2762 transport_.sent_packets_.back().SequenceNumber();
2763
2764 // Advance time and make sure it can be retransmitted, even if we try to set
2765 // the ssrc the what it already is.
2766 rtp_sender_->SetSequenceNumber(rtp_sender_->SequenceNumber());
2767 fake_clock_.AdvanceTimeMilliseconds(kRtt);
2768 EXPECT_GT(rtp_sender_->ReSendPacket(packet_seqence_number), 0);
2769
2770 // Change the sequence number, then move the time and try to retransmit again.
2771 // The old packet should now be gone.
2772 rtp_sender_->SetSequenceNumber(rtp_sender_->SequenceNumber() - 1);
2773 fake_clock_.AdvanceTimeMilliseconds(kRtt);
2774 EXPECT_EQ(rtp_sender_->ReSendPacket(packet_seqence_number), 0);
2775}
2776
Mirko Bonadeic84f6612019-01-31 12:20:57 +01002777INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
2778 RtpSenderTest,
Erik Språngf6468d22019-07-05 16:53:43 +02002779 ::testing::Values(TestConfig{false, false},
2780 TestConfig{false, true},
2781 TestConfig{true, false},
2782 TestConfig{true, true}));
2783
Mirko Bonadeic84f6612019-01-31 12:20:57 +01002784INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
2785 RtpSenderTestWithoutPacer,
Erik Språngf6468d22019-07-05 16:53:43 +02002786 ::testing::Values(TestConfig{false, false},
2787 TestConfig{true, false}));
Niels Möllera34d7762019-02-01 14:13:29 +01002788
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +00002789} // namespace webrtc