blob: dad0d741026d504a0c6edf0b2e29fd1440757528 [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
kwiberg84be5112016-04-27 01:19:58 -070011#include <memory>
danilchapb8b6fbb2015-12-10 05:05:27 -080012#include <vector>
13
Karl Wiberg918f50c2018-07-05 11:40:33 +020014#include "absl/memory/memory.h"
Per Kjellandere11b7d22019-02-21 07:55:59 +010015#include "api/transport/field_trial_based_config.h"
Erik Språngf93eda12019-01-16 17:10:57 +010016#include "api/video/video_codec_constants.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/video/video_timing.h"
Elad Alon4a87e1c2017-10-03 16:11:34 +020018#include "logging/rtc_event_log/events/rtc_event.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "logging/rtc_event_log/mock/mock_rtc_event_log.h"
20#include "modules/rtp_rtcp/include/rtp_cvo.h"
21#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
22#include "modules/rtp_rtcp/include/rtp_header_parser.h"
Erik Språng59b86542019-06-23 18:24:46 +020023#include "modules/rtp_rtcp/include/rtp_packet_pacer.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
25#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
26#include "modules/rtp_rtcp/source/rtp_format_video_generic.h"
philipelb3e42a42018-09-13 10:57:14 +020027#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h"
28#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
30#include "modules/rtp_rtcp/source/rtp_packet_received.h"
31#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
32#include "modules/rtp_rtcp/source/rtp_sender.h"
33#include "modules/rtp_rtcp/source/rtp_sender_video.h"
34#include "modules/rtp_rtcp/source/rtp_utility.h"
35#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020036#include "rtc_base/rate_limiter.h"
37#include "test/field_trial.h"
38#include "test/gmock.h"
39#include "test/gtest.h"
40#include "test/mock_transport.h"
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000041
42namespace webrtc {
43
andrew@webrtc.org8a442592011-12-16 21:24:30 +000044namespace {
Elad Alond8d32482019-02-18 23:45:57 +010045enum : int { // The first valid value is 1.
46 kAbsoluteSendTimeExtensionId = 1,
47 kAudioLevelExtensionId,
Elad Alonccb9b752019-02-19 13:01:31 +010048 kGenericDescriptorId00,
49 kGenericDescriptorId01,
Elad Alond8d32482019-02-18 23:45:57 +010050 kMidExtensionId,
51 kRepairedRidExtensionId,
52 kRidExtensionId,
53 kTransmissionTimeOffsetExtensionId,
54 kTransportSequenceNumberExtensionId,
55 kVideoRotationExtensionId,
56 kVideoTimingExtensionId,
57};
58
andrew@webrtc.org8a442592011-12-16 21:24:30 +000059const int kPayload = 100;
Shao Changbine62202f2015-04-21 20:24:50 +080060const int kRtxPayload = 98;
andrew@webrtc.org8a442592011-12-16 21:24:30 +000061const uint32_t kTimestamp = 10;
62const uint16_t kSeqNum = 33;
brandtr9dfff292016-11-14 05:14:50 -080063const uint32_t kSsrc = 725242;
Erik Språng9c771c22019-06-17 16:31:53 +020064const uint32_t kRtxSsrc = 12345;
65const uint32_t kFlexFecSsrc = 45678;
sprang@webrtc.org30933902015-03-17 14:33:12 +000066const uint16_t kTransportSequenceNumber = 0xaabbu;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +000067const uint64_t kStartTime = 123456789;
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +000068const size_t kMaxPaddingSize = 224u;
Stefan Holmera246cfb2016-08-23 17:51:42 +020069const uint8_t kPayloadData[] = {47, 11, 32, 93, 89};
spranga8ae6f22017-09-04 07:23:56 -070070const int64_t kDefaultExpectedRetransmissionTimeMs = 125;
Amit Hilbuch77938e62018-12-21 09:23:38 -080071const char kNoRid[] = "";
72const char kNoMid[] = "";
andrew@webrtc.org8a442592011-12-16 21:24:30 +000073
Danil Chapovalov5e57b172016-09-02 19:15:59 +020074using ::testing::_;
Erik Språng30a276b2019-04-23 12:00:11 +020075using ::testing::AllOf;
Erik Språng214f5432019-06-20 15:09:58 +020076using ::testing::AtLeast;
77using ::testing::DoAll;
philipelb3e42a42018-09-13 10:57:14 +020078using ::testing::ElementsAre;
Danil Chapovalov5e57b172016-09-02 19:15:59 +020079using ::testing::ElementsAreArray;
Erik Språng30a276b2019-04-23 12:00:11 +020080using ::testing::Field;
Erik Språng478cb462019-06-26 15:49:27 +020081using ::testing::Gt;
sprang168794c2017-07-06 04:38:06 -070082using ::testing::Invoke;
Erik Språng9c771c22019-06-17 16:31:53 +020083using ::testing::NiceMock;
Erik Språng478cb462019-06-26 15:49:27 +020084using ::testing::Pointee;
85using ::testing::Property;
Erik Språng214f5432019-06-20 15:09:58 +020086using ::testing::Return;
87using ::testing::SaveArg;
Danil Chapovalov84ffb352018-09-25 18:59:09 +020088using ::testing::SizeIs;
Erik Språng9c771c22019-06-17 16:31:53 +020089using ::testing::StrictMock;
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +000090
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +000091uint64_t ConvertMsToAbsSendTime(int64_t time_ms) {
Stefan Holmer0a87ffc2015-10-21 13:41:48 +020092 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +000093}
94
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +000095class LoopbackTransportTest : public webrtc::Transport {
96 public:
Petter Strandmark26bc6692018-05-29 08:43:35 +020097 LoopbackTransportTest() : total_bytes_sent_(0) {
danilchap12ba1862016-10-26 02:41:55 -070098 receivers_extensions_.Register(kRtpExtensionTransmissionTimeOffset,
99 kTransmissionTimeOffsetExtensionId);
100 receivers_extensions_.Register(kRtpExtensionAbsoluteSendTime,
101 kAbsoluteSendTimeExtensionId);
102 receivers_extensions_.Register(kRtpExtensionTransportSequenceNumber,
103 kTransportSequenceNumberExtensionId);
104 receivers_extensions_.Register(kRtpExtensionVideoRotation,
105 kVideoRotationExtensionId);
106 receivers_extensions_.Register(kRtpExtensionAudioLevel,
107 kAudioLevelExtensionId);
ilnik04f4d122017-06-19 07:18:55 -0700108 receivers_extensions_.Register(kRtpExtensionVideoTiming,
109 kVideoTimingExtensionId);
Steve Anton296a0ce2018-03-22 15:17:27 -0700110 receivers_extensions_.Register(kRtpExtensionMid, kMidExtensionId);
Elad Alonccb9b752019-02-19 13:01:31 +0100111 receivers_extensions_.Register(kRtpExtensionGenericFrameDescriptor00,
112 kGenericDescriptorId00);
113 receivers_extensions_.Register(kRtpExtensionGenericFrameDescriptor01,
114 kGenericDescriptorId01);
Amit Hilbuch77938e62018-12-21 09:23:38 -0800115 receivers_extensions_.Register(kRtpExtensionRtpStreamId, kRidExtensionId);
116 receivers_extensions_.Register(kRtpExtensionRepairedRtpStreamId,
117 kRepairedRidExtensionId);
guoweis@webrtc.org45362892015-03-04 22:55:15 +0000118 }
danilchap12ba1862016-10-26 02:41:55 -0700119
stefan1d8a5062015-10-02 03:39:33 -0700120 bool SendRtp(const uint8_t* data,
121 size_t len,
122 const PacketOptions& options) override {
Petter Strandmark26bc6692018-05-29 08:43:35 +0200123 last_options_ = options;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000124 total_bytes_sent_ += len;
danilchap12ba1862016-10-26 02:41:55 -0700125 sent_packets_.push_back(RtpPacketReceived(&receivers_extensions_));
126 EXPECT_TRUE(sent_packets_.back().Parse(data, len));
pbos2d566682015-09-28 09:59:31 -0700127 return true;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000128 }
danilchap162abd32015-12-10 02:39:40 -0800129 bool SendRtcp(const uint8_t* data, size_t len) override { return false; }
danilchap12ba1862016-10-26 02:41:55 -0700130 const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); }
131 int packets_sent() { return sent_packets_.size(); }
132
pbos@webrtc.org72491b92014-07-10 16:24:54 +0000133 size_t total_bytes_sent_;
Petter Strandmark26bc6692018-05-29 08:43:35 +0200134 PacketOptions last_options_;
danilchap12ba1862016-10-26 02:41:55 -0700135 std::vector<RtpPacketReceived> sent_packets_;
136
137 private:
138 RtpHeaderExtensionMap receivers_extensions_;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000139};
140
Elad Alon4a87e1c2017-10-03 16:11:34 +0200141MATCHER_P(SameRtcEventTypeAs, value, "") {
142 return value == arg->GetType();
143}
144
guoweis@webrtc.org45362892015-03-04 22:55:15 +0000145} // namespace
146
Erik Språng59b86542019-06-23 18:24:46 +0200147class MockRtpPacketPacer : public RtpPacketPacer {
sprangebbf8a82015-09-21 15:11:14 -0700148 public:
Erik Språng59b86542019-06-23 18:24:46 +0200149 MockRtpPacketPacer() {}
150 virtual ~MockRtpPacketPacer() {}
151
152 MOCK_METHOD1(EnqueuePacket, void(std::unique_ptr<RtpPacketToSend>));
sprangebbf8a82015-09-21 15:11:14 -0700153
Peter Boströme23e7372015-10-08 11:44:14 +0200154 MOCK_METHOD6(InsertPacket,
155 void(Priority priority,
sprangebbf8a82015-09-21 15:11:14 -0700156 uint32_t ssrc,
157 uint16_t sequence_number,
158 int64_t capture_time_ms,
159 size_t bytes,
160 bool retransmission));
161};
162
Stefan Holmerf5dca482016-01-27 12:58:51 +0100163class MockTransportSequenceNumberAllocator
164 : public TransportSequenceNumberAllocator {
165 public:
166 MOCK_METHOD0(AllocateSequenceNumber, uint16_t());
167};
168
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200169class MockSendSideDelayObserver : public SendSideDelayObserver {
170 public:
Henrik Boström9fe18342019-05-16 18:38:20 +0200171 MOCK_METHOD4(SendSideDelayUpdated, void(int, int, uint64_t, uint32_t));
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200172};
173
asapersson35151f32016-05-02 23:44:01 -0700174class MockSendPacketObserver : public SendPacketObserver {
175 public:
176 MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t));
177};
178
Stefan Holmera246cfb2016-08-23 17:51:42 +0200179class MockTransportFeedbackObserver : public TransportFeedbackObserver {
180 public:
Erik Språng30a276b2019-04-23 12:00:11 +0200181 MOCK_METHOD1(OnAddPacket, void(const RtpPacketSendInfo&));
Stefan Holmera246cfb2016-08-23 17:51:42 +0200182 MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&));
elad.alonf9490002017-03-06 05:32:21 -0800183 MOCK_CONST_METHOD0(GetTransportFeedbackVector, std::vector<PacketFeedback>());
Stefan Holmera246cfb2016-08-23 17:51:42 +0200184};
185
minyue3a407ee2017-04-03 01:10:33 -0700186class MockOverheadObserver : public OverheadObserver {
187 public:
188 MOCK_METHOD1(OnOverheadChanged, void(size_t overhead_bytes_per_packet));
189};
190
191class RtpSenderTest : public ::testing::TestWithParam<bool> {
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000192 protected:
193 RtpSenderTest()
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000194 : fake_clock_(kStartTime),
terelius429c3452016-01-21 05:42:04 -0800195 mock_rtc_event_log_(),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000196 mock_paced_sender_(),
sprangcd349d92016-07-13 09:11:28 -0700197 retransmission_rate_limiter_(&fake_clock_, 1000),
Erik Språng4580ca22019-07-04 10:38:43 +0200198 flexfec_sender_(0,
199 kFlexFecSsrc,
200 kSsrc,
201 "",
202 std::vector<RtpExtension>(),
203 std::vector<RtpExtensionSize>(),
204 nullptr,
205 &fake_clock_),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000206 rtp_sender_(),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000207 transport_(),
minyue3a407ee2017-04-03 01:10:33 -0700208 kMarkerBit(true),
209 field_trials_(GetParam() ? "WebRTC-SendSideBwe-WithOverhead/Enabled/"
210 : "") {}
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000211
Erik Språng7b52f102018-02-07 14:37:37 +0100212 void SetUp() override { SetUpRtpSender(true, false); }
Peter Boströme23e7372015-10-08 11:44:14 +0200213
Erik Språng7b52f102018-02-07 14:37:37 +0100214 void SetUpRtpSender(bool pacer, bool populate_network2) {
Erik Språng4580ca22019-07-04 10:38:43 +0200215 RtpRtcp::Configuration config;
216 config.clock = &fake_clock_;
217 config.outgoing_transport = &transport_;
218 config.media_send_ssrc = kSsrc;
219 config.rtx_send_ssrc = kRtxSsrc;
220 config.flexfec_sender = &flexfec_sender_;
221 config.transport_sequence_number_allocator = &seq_num_allocator_;
222 config.event_log = &mock_rtc_event_log_;
223 config.send_packet_observer = &send_packet_observer_;
224 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
225 config.paced_sender = pacer ? &mock_paced_sender_ : nullptr;
226 config.populate_network2_timestamp = populate_network2;
227 rtp_sender_.reset(new RTPSender(config));
brandtr9dfff292016-11-14 05:14:50 -0800228 rtp_sender_->SetSequenceNumber(kSeqNum);
danilchap71fead22016-08-18 02:01:49 -0700229 rtp_sender_->SetTimestampOffset(0);
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000230 }
231
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000232 SimulatedClock fake_clock_;
Erik Språng9c771c22019-06-17 16:31:53 +0200233 NiceMock<MockRtcEventLog> mock_rtc_event_log_;
Erik Språng59b86542019-06-23 18:24:46 +0200234 MockRtpPacketPacer mock_paced_sender_;
Erik Språng9c771c22019-06-17 16:31:53 +0200235 StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_;
236 StrictMock<MockSendPacketObserver> send_packet_observer_;
237 StrictMock<MockTransportFeedbackObserver> feedback_observer_;
sprangcd349d92016-07-13 09:11:28 -0700238 RateLimiter retransmission_rate_limiter_;
Erik Språng4580ca22019-07-04 10:38:43 +0200239 FlexfecSender flexfec_sender_;
kwiberg84be5112016-04-27 01:19:58 -0700240 std::unique_ptr<RTPSender> rtp_sender_;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000241 LoopbackTransportTest transport_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000242 const bool kMarkerBit;
minyue3a407ee2017-04-03 01:10:33 -0700243 test::ScopedFieldTrials field_trials_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000244
danilchapb6f1fb52016-10-19 06:11:39 -0700245 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
246 bool marker_bit,
247 uint32_t timestamp,
248 int64_t capture_time_ms) {
249 auto packet = rtp_sender_->AllocatePacket();
250 packet->SetPayloadType(payload_type);
251 packet->SetMarker(marker_bit);
252 packet->SetTimestamp(timestamp);
253 packet->set_capture_time_ms(capture_time_ms);
254 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
255 return packet;
256 }
257
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000258 void SendPacket(int64_t capture_time_ms, int payload_length) {
259 uint32_t timestamp = capture_time_ms * 90;
danilchapb6f1fb52016-10-19 06:11:39 -0700260 auto packet =
261 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
262 packet->AllocatePayload(payload_length);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000263
264 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700265 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
266 kAllowRetransmission,
267 RtpPacketSender::kNormalPriority));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000268 }
asapersson35151f32016-05-02 23:44:01 -0700269
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100270 void SendGenericPacket() {
asapersson35151f32016-05-02 23:44:01 -0700271 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100272 SendPacket(kCaptureTimeMs, sizeof(kPayloadData));
asapersson35151f32016-05-02 23:44:01 -0700273 }
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000274};
275
Peter Boströme23e7372015-10-08 11:44:14 +0200276// TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our
277// default code path.
278class RtpSenderTestWithoutPacer : public RtpSenderTest {
279 public:
Erik Språng7b52f102018-02-07 14:37:37 +0100280 void SetUp() override { SetUpRtpSender(false, false); }
Peter Boströme23e7372015-10-08 11:44:14 +0200281};
282
minyue3a407ee2017-04-03 01:10:33 -0700283TEST_P(RtpSenderTestWithoutPacer, AllocatePacketSetCsrc) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200284 // Configure rtp_sender with csrc.
285 std::vector<uint32_t> csrcs;
286 csrcs.push_back(0x23456789);
287 rtp_sender_->SetCsrcs(csrcs);
288
289 auto packet = rtp_sender_->AllocatePacket();
290
291 ASSERT_TRUE(packet);
292 EXPECT_EQ(rtp_sender_->SSRC(), packet->Ssrc());
293 EXPECT_EQ(csrcs, packet->Csrcs());
294}
295
minyue3a407ee2017-04-03 01:10:33 -0700296TEST_P(RtpSenderTestWithoutPacer, AllocatePacketReserveExtensions) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200297 // Configure rtp_sender with extensions.
298 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
299 kRtpExtensionTransmissionTimeOffset,
300 kTransmissionTimeOffsetExtensionId));
301 ASSERT_EQ(
302 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
303 kAbsoluteSendTimeExtensionId));
304 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
305 kAudioLevelExtensionId));
306 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
307 kRtpExtensionTransportSequenceNumber,
308 kTransportSequenceNumberExtensionId));
309 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
310 kRtpExtensionVideoRotation, kVideoRotationExtensionId));
311
312 auto packet = rtp_sender_->AllocatePacket();
313
314 ASSERT_TRUE(packet);
315 // Preallocate BWE extensions RtpSender set itself.
316 EXPECT_TRUE(packet->HasExtension<TransmissionOffset>());
317 EXPECT_TRUE(packet->HasExtension<AbsoluteSendTime>());
318 EXPECT_TRUE(packet->HasExtension<TransportSequenceNumber>());
319 // Do not allocate media specific extensions.
320 EXPECT_FALSE(packet->HasExtension<AudioLevel>());
321 EXPECT_FALSE(packet->HasExtension<VideoOrientation>());
322}
323
minyue3a407ee2017-04-03 01:10:33 -0700324TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberAdvanceSequenceNumber) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200325 auto packet = rtp_sender_->AllocatePacket();
326 ASSERT_TRUE(packet);
327 const uint16_t sequence_number = rtp_sender_->SequenceNumber();
328
329 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
330
331 EXPECT_EQ(sequence_number, packet->SequenceNumber());
332 EXPECT_EQ(sequence_number + 1, rtp_sender_->SequenceNumber());
333}
334
minyue3a407ee2017-04-03 01:10:33 -0700335TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberFailsOnNotSending) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200336 auto packet = rtp_sender_->AllocatePacket();
337 ASSERT_TRUE(packet);
338
339 rtp_sender_->SetSendingMediaStatus(false);
340 EXPECT_FALSE(rtp_sender_->AssignSequenceNumber(packet.get()));
341}
342
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100343TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberMayAllowPaddingOnVideo) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200344 constexpr size_t kPaddingSize = 100;
345 auto packet = rtp_sender_->AllocatePacket();
346 ASSERT_TRUE(packet);
347
philipel8aadd502017-02-23 02:56:13 -0800348 ASSERT_FALSE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200349 packet->SetMarker(false);
350 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100351 // Packet without marker bit doesn't allow padding on video stream.
philipel8aadd502017-02-23 02:56:13 -0800352 EXPECT_FALSE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200353
354 packet->SetMarker(true);
355 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
356 // Packet with marker bit allows send padding.
philipel8aadd502017-02-23 02:56:13 -0800357 EXPECT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200358}
359
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100360TEST_P(RtpSenderTest, AssignSequenceNumberAllowsPaddingOnAudio) {
361 MockTransport transport;
Erik Språng4580ca22019-07-04 10:38:43 +0200362 RtpRtcp::Configuration config;
363 config.audio = true;
364 config.clock = &fake_clock_;
365 config.outgoing_transport = &transport;
366 config.paced_sender = &mock_paced_sender_;
367 config.media_send_ssrc = kSsrc;
368 config.event_log = &mock_rtc_event_log_;
369 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
370 rtp_sender_ = absl::make_unique<RTPSender>(config);
371
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100372 rtp_sender_->SetTimestampOffset(0);
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100373
374 std::unique_ptr<RtpPacketToSend> audio_packet = rtp_sender_->AllocatePacket();
375 // Padding on audio stream allowed regardless of marker in the last packet.
376 audio_packet->SetMarker(false);
377 audio_packet->SetPayloadType(kPayload);
378 rtp_sender_->AssignSequenceNumber(audio_packet.get());
379
380 const size_t kPaddingSize = 59;
381 EXPECT_CALL(transport, SendRtp(_, kPaddingSize + kRtpHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +0200382 .WillOnce(Return(true));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100383 EXPECT_EQ(kPaddingSize,
384 rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
385
386 // Requested padding size is too small, will send a larger one.
387 const size_t kMinPaddingSize = 50;
388 EXPECT_CALL(transport, SendRtp(_, kMinPaddingSize + kRtpHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +0200389 .WillOnce(Return(true));
Yves Gerey665174f2018-06-19 15:03:05 +0200390 EXPECT_EQ(kMinPaddingSize, rtp_sender_->TimeToSendPadding(kMinPaddingSize - 5,
391 PacedPacketInfo()));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100392}
393
minyue3a407ee2017-04-03 01:10:33 -0700394TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberSetPaddingTimestamps) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200395 constexpr size_t kPaddingSize = 100;
396 auto packet = rtp_sender_->AllocatePacket();
397 ASSERT_TRUE(packet);
398 packet->SetMarker(true);
399 packet->SetTimestamp(kTimestamp);
400
401 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
philipel8aadd502017-02-23 02:56:13 -0800402 ASSERT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200403
404 ASSERT_EQ(1u, transport_.sent_packets_.size());
danilchap12ba1862016-10-26 02:41:55 -0700405 // Verify padding packet timestamp.
406 EXPECT_EQ(kTimestamp, transport_.last_sent_packet().Timestamp());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200407}
408
minyue3a407ee2017-04-03 01:10:33 -0700409TEST_P(RtpSenderTestWithoutPacer,
410 TransportFeedbackObserverGetsCorrectByteCount) {
411 constexpr int kRtpOverheadBytesPerPacket = 12 + 8;
Erik Språng9c771c22019-06-17 16:31:53 +0200412 NiceMock<MockOverheadObserver> mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +0200413
414 RtpRtcp::Configuration config;
415 config.clock = &fake_clock_;
416 config.outgoing_transport = &transport_;
417 config.media_send_ssrc = kSsrc;
418 config.transport_sequence_number_allocator = &seq_num_allocator_;
419 config.transport_feedback_callback = &feedback_observer_;
420 config.event_log = &mock_rtc_event_log_;
421 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
422 config.overhead_observer = &mock_overhead_observer;
423 rtp_sender_ = absl::make_unique<RTPSender>(config);
424
minyue3a407ee2017-04-03 01:10:33 -0700425 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
426 kRtpExtensionTransportSequenceNumber,
427 kTransportSequenceNumberExtensionId));
428 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200429 .WillOnce(Return(kTransportSequenceNumber));
minyue3a407ee2017-04-03 01:10:33 -0700430
431 const size_t expected_bytes =
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100432 GetParam() ? sizeof(kPayloadData) + kRtpOverheadBytesPerPacket
433 : sizeof(kPayloadData);
minyue3a407ee2017-04-03 01:10:33 -0700434
435 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200436 OnAddPacket(AllOf(
437 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
438 Field(&RtpPacketSendInfo::transport_sequence_number,
439 kTransportSequenceNumber),
440 Field(&RtpPacketSendInfo::rtp_sequence_number,
441 rtp_sender_->SequenceNumber()),
442 Field(&RtpPacketSendInfo::length, expected_bytes),
443 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
minyue3a407ee2017-04-03 01:10:33 -0700444 .Times(1);
445 EXPECT_CALL(mock_overhead_observer,
446 OnOverheadChanged(kRtpOverheadBytesPerPacket))
447 .Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100448 SendGenericPacket();
minyue3a407ee2017-04-03 01:10:33 -0700449}
450
451TEST_P(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) {
Erik Språng4580ca22019-07-04 10:38:43 +0200452 RtpRtcp::Configuration config;
453 config.clock = &fake_clock_;
454 config.outgoing_transport = &transport_;
455 config.media_send_ssrc = kSsrc;
456 config.transport_sequence_number_allocator = &seq_num_allocator_;
457 config.transport_feedback_callback = &feedback_observer_;
458 config.event_log = &mock_rtc_event_log_;
459 config.send_packet_observer = &send_packet_observer_;
460 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
461 rtp_sender_ = absl::make_unique<RTPSender>(config);
462
Stefan Holmerf5dca482016-01-27 12:58:51 +0100463 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
464 kRtpExtensionTransportSequenceNumber,
465 kTransportSequenceNumberExtensionId));
466
Stefan Holmerf5dca482016-01-27 12:58:51 +0100467 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200468 .WillOnce(Return(kTransportSequenceNumber));
asapersson35151f32016-05-02 23:44:01 -0700469 EXPECT_CALL(send_packet_observer_,
470 OnSendPacket(kTransportSequenceNumber, _, _))
471 .Times(1);
minyue3a407ee2017-04-03 01:10:33 -0700472
473 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200474 OnAddPacket(AllOf(
475 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
476 Field(&RtpPacketSendInfo::transport_sequence_number,
477 kTransportSequenceNumber),
478 Field(&RtpPacketSendInfo::rtp_sequence_number,
479 rtp_sender_->SequenceNumber()),
480 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
Stefan Holmera246cfb2016-08-23 17:51:42 +0200481 .Times(1);
asapersson35151f32016-05-02 23:44:01 -0700482
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100483 SendGenericPacket();
Stefan Holmerf5dca482016-01-27 12:58:51 +0100484
danilchap12ba1862016-10-26 02:41:55 -0700485 const auto& packet = transport_.last_sent_packet();
486 uint16_t transport_seq_no;
487 ASSERT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
488 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200489 EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200490 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200491}
492
493TEST_P(RtpSenderTestWithoutPacer, PacketOptionsNoRetransmission) {
Erik Språng4580ca22019-07-04 10:38:43 +0200494 RtpRtcp::Configuration config;
495 config.clock = &fake_clock_;
496 config.outgoing_transport = &transport_;
497 config.media_send_ssrc = kSsrc;
498 config.transport_sequence_number_allocator = &seq_num_allocator_;
499 config.transport_feedback_callback = &feedback_observer_;
500 config.event_log = &mock_rtc_event_log_;
501 config.send_packet_observer = &send_packet_observer_;
502 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
503 rtp_sender_ = absl::make_unique<RTPSender>(config);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200504
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100505 SendGenericPacket();
Petter Strandmark26bc6692018-05-29 08:43:35 +0200506
507 EXPECT_FALSE(transport_.last_options_.is_retransmit);
Stefan Holmerf5dca482016-01-27 12:58:51 +0100508}
509
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200510TEST_P(RtpSenderTestWithoutPacer,
511 SetsIncludedInFeedbackWhenTransportSequenceNumberExtensionIsRegistered) {
512 SetUpRtpSender(false, false);
513 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
514 kTransportSequenceNumberExtensionId);
515 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200516 .WillOnce(Return(kTransportSequenceNumber));
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200517 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100518 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200519 EXPECT_TRUE(transport_.last_options_.included_in_feedback);
520}
521
522TEST_P(
523 RtpSenderTestWithoutPacer,
524 SetsIncludedInAllocationWhenTransportSequenceNumberExtensionIsRegistered) {
525 SetUpRtpSender(false, false);
526 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
527 kTransportSequenceNumberExtensionId);
528 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200529 .WillOnce(Return(kTransportSequenceNumber));
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200530 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100531 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200532 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
533}
534
535TEST_P(RtpSenderTestWithoutPacer,
536 SetsIncludedInAllocationWhenForcedAsPartOfAllocation) {
537 SetUpRtpSender(false, false);
538 rtp_sender_->SetAsPartOfAllocation(true);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100539 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200540 EXPECT_FALSE(transport_.last_options_.included_in_feedback);
541 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
542}
543
544TEST_P(RtpSenderTestWithoutPacer, DoesnSetIncludedInAllocationByDefault) {
545 SetUpRtpSender(false, false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100546 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200547 EXPECT_FALSE(transport_.last_options_.included_in_feedback);
548 EXPECT_FALSE(transport_.last_options_.included_in_allocation);
stefana23fc622016-07-28 07:56:38 -0700549}
asapersson35151f32016-05-02 23:44:01 -0700550
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200551TEST_P(RtpSenderTestWithoutPacer, OnSendSideDelayUpdated) {
Erik Språng9c771c22019-06-17 16:31:53 +0200552 StrictMock<MockSendSideDelayObserver> send_side_delay_observer_;
Erik Språng4580ca22019-07-04 10:38:43 +0200553
554 RtpRtcp::Configuration config;
555 config.clock = &fake_clock_;
556 config.outgoing_transport = &transport_;
557 config.media_send_ssrc = kSsrc;
558 config.send_side_delay_observer = &send_side_delay_observer_;
559 config.event_log = &mock_rtc_event_log_;
560 rtp_sender_ = absl::make_unique<RTPSender>(config);
561
Niels Möller5fe95102019-03-04 16:49:25 +0100562 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100563 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +0200564 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +0100565 FieldTrialBasedConfig());
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200566
567 const uint8_t kPayloadType = 127;
Niels Möller8a40edd2019-01-24 18:04:44 +0100568 const char payload_name[] = "GENERIC";
Niels Möller59ab1cf2019-02-06 22:48:11 +0100569
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +0200570 rtp_sender_video.RegisterPayloadType(kPayloadType, payload_name,
571 /*raw_payload=*/false);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100572
573 const uint32_t kCaptureTimeMsToRtpTimestamp = 90; // 90 kHz clock
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200574 RTPVideoHeader video_header;
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200575
Henrik Boström9fe18342019-05-16 18:38:20 +0200576 // Send packet with 10 ms send-side delay. The average, max and total should
577 // be 10 ms.
578 EXPECT_CALL(send_side_delay_observer_,
579 SendSideDelayUpdated(10, 10, 10, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200580 .Times(1);
581 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
582 fake_clock_.AdvanceTimeMilliseconds(10);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100583 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100584 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200585 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100586 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200587 kDefaultExpectedRetransmissionTimeMs));
588
Henrik Boström9fe18342019-05-16 18:38:20 +0200589 // Send another packet with 20 ms delay. The average, max and total should be
590 // 15, 20 and 30 ms respectively.
591 EXPECT_CALL(send_side_delay_observer_,
592 SendSideDelayUpdated(15, 20, 30, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200593 .Times(1);
594 fake_clock_.AdvanceTimeMilliseconds(10);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100595 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100596 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200597 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100598 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200599 kDefaultExpectedRetransmissionTimeMs));
600
601 // Send another packet at the same time, which replaces the last packet.
602 // 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 +0200603 // The total counter stays the same though.
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200604 // TODO(terelius): Is is not clear that this is the right behavior.
Henrik Boström9fe18342019-05-16 18:38:20 +0200605 EXPECT_CALL(send_side_delay_observer_, SendSideDelayUpdated(5, 10, 30, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200606 .Times(1);
607 capture_time_ms = fake_clock_.TimeInMilliseconds();
Niels Möller59ab1cf2019-02-06 22:48:11 +0100608 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100609 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200610 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100611 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200612 kDefaultExpectedRetransmissionTimeMs));
613
614 // Send a packet 1 second later. The earlier packets should have timed
Henrik Boström9fe18342019-05-16 18:38:20 +0200615 // out, so both max and average should be the delay of this packet. The total
616 // keeps increasing.
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200617 fake_clock_.AdvanceTimeMilliseconds(1000);
618 capture_time_ms = fake_clock_.TimeInMilliseconds();
619 fake_clock_.AdvanceTimeMilliseconds(1);
Henrik Boström9fe18342019-05-16 18:38:20 +0200620 EXPECT_CALL(send_side_delay_observer_, SendSideDelayUpdated(1, 1, 31, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200621 .Times(1);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100622 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100623 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200624 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100625 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200626 kDefaultExpectedRetransmissionTimeMs));
627}
628
minyue3a407ee2017-04-03 01:10:33 -0700629TEST_P(RtpSenderTestWithoutPacer, OnSendPacketUpdated) {
stefana23fc622016-07-28 07:56:38 -0700630 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
631 kRtpExtensionTransportSequenceNumber,
632 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -0700633 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200634 .WillOnce(Return(kTransportSequenceNumber));
asapersson35151f32016-05-02 23:44:01 -0700635 EXPECT_CALL(send_packet_observer_,
636 OnSendPacket(kTransportSequenceNumber, _, _))
637 .Times(1);
638
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100639 SendGenericPacket();
asapersson35151f32016-05-02 23:44:01 -0700640}
641
minyue3a407ee2017-04-03 01:10:33 -0700642TEST_P(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) {
Erik Språng4580ca22019-07-04 10:38:43 +0200643 RtpRtcp::Configuration config;
644 config.clock = &fake_clock_;
645 config.outgoing_transport = &transport_;
646 config.paced_sender = &mock_paced_sender_;
647 config.media_send_ssrc = kSsrc;
648 config.transport_sequence_number_allocator = &seq_num_allocator_;
649 config.transport_feedback_callback = &feedback_observer_;
650 config.event_log = &mock_rtc_event_log_;
651 config.send_packet_observer = &send_packet_observer_;
652 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
653 rtp_sender_ = absl::make_unique<RTPSender>(config);
654
brandtr9dfff292016-11-14 05:14:50 -0800655 rtp_sender_->SetSequenceNumber(kSeqNum);
Stefan Holmera246cfb2016-08-23 17:51:42 +0200656 rtp_sender_->SetStorePacketsStatus(true, 10);
657 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
658 kRtpExtensionTransportSequenceNumber,
659 kTransportSequenceNumberExtensionId));
660
brandtr9dfff292016-11-14 05:14:50 -0800661 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
Stefan Holmera246cfb2016-08-23 17:51:42 +0200662 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200663 .WillOnce(Return(kTransportSequenceNumber));
Stefan Holmera246cfb2016-08-23 17:51:42 +0200664 EXPECT_CALL(send_packet_observer_,
665 OnSendPacket(kTransportSequenceNumber, _, _))
666 .Times(1);
minyue3a407ee2017-04-03 01:10:33 -0700667 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200668 OnAddPacket(AllOf(
669 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
670 Field(&RtpPacketSendInfo::transport_sequence_number,
671 kTransportSequenceNumber),
672 Field(&RtpPacketSendInfo::rtp_sequence_number,
673 rtp_sender_->SequenceNumber()),
674 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
Stefan Holmera246cfb2016-08-23 17:51:42 +0200675 .Times(1);
676
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100677 SendGenericPacket();
philipel8aadd502017-02-23 02:56:13 -0800678 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
679 fake_clock_.TimeInMilliseconds(), false,
680 PacedPacketInfo());
Stefan Holmera246cfb2016-08-23 17:51:42 +0200681
danilchap12ba1862016-10-26 02:41:55 -0700682 const auto& packet = transport_.last_sent_packet();
683 uint16_t transport_seq_no;
684 EXPECT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
685 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200686 EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
Stefan Holmera246cfb2016-08-23 17:51:42 +0200687}
688
Erik Språng7b52f102018-02-07 14:37:37 +0100689TEST_P(RtpSenderTest, WritesPacerExitToTimingExtension) {
ilnik04f4d122017-06-19 07:18:55 -0700690 rtp_sender_->SetStorePacketsStatus(true, 10);
691 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
692 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
693 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
694 auto packet = rtp_sender_->AllocatePacket();
695 packet->SetPayloadType(kPayload);
696 packet->SetMarker(true);
697 packet->SetTimestamp(kTimestamp);
698 packet->set_capture_time_ms(capture_time_ms);
ilnik2edc6842017-07-06 03:06:50 -0700699 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
ilnik04f4d122017-06-19 07:18:55 -0700700 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
701 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
702 size_t packet_size = packet->size();
ilnik04f4d122017-06-19 07:18:55 -0700703
704 const int kStoredTimeInMs = 100;
Erik Språng7b52f102018-02-07 14:37:37 +0100705 {
706 EXPECT_CALL(
707 mock_paced_sender_,
708 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _));
709 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
710 kAllowRetransmission,
711 RtpPacketSender::kNormalPriority));
712 }
ilnik04f4d122017-06-19 07:18:55 -0700713 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
Erik Språng7b52f102018-02-07 14:37:37 +0100714 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
715 PacedPacketInfo());
ilnik04f4d122017-06-19 07:18:55 -0700716 EXPECT_EQ(1, transport_.packets_sent());
717 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
718
danilchapce251812017-09-11 12:24:41 -0700719 VideoSendTiming video_timing;
720 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
721 &video_timing));
722 EXPECT_EQ(kStoredTimeInMs, video_timing.pacer_exit_delta_ms);
Erik Språng7b52f102018-02-07 14:37:37 +0100723}
ilnik04f4d122017-06-19 07:18:55 -0700724
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100725TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithPacer) {
726 SetUpRtpSender(/*pacer=*/true, /*populate_network2=*/true);
Erik Språng7b52f102018-02-07 14:37:37 +0100727 rtp_sender_->SetStorePacketsStatus(true, 10);
728 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
729 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
730 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
731 auto packet = rtp_sender_->AllocatePacket();
732 packet->SetPayloadType(kPayload);
733 packet->SetMarker(true);
734 packet->SetTimestamp(kTimestamp);
735 packet->set_capture_time_ms(capture_time_ms);
736 const uint16_t kPacerExitMs = 1234u;
737 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, kPacerExitMs, 0u, 0u, true};
738 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
739 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
740 size_t packet_size = packet->size();
741
742 const int kStoredTimeInMs = 100;
743 {
744 EXPECT_CALL(
745 mock_paced_sender_,
746 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _));
747 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
748 kAllowRetransmission,
749 RtpPacketSender::kNormalPriority));
750 }
ilnik04f4d122017-06-19 07:18:55 -0700751 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
752 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
753 PacedPacketInfo());
Erik Språng7b52f102018-02-07 14:37:37 +0100754 EXPECT_EQ(1, transport_.packets_sent());
ilnik04f4d122017-06-19 07:18:55 -0700755 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
756
Erik Språng7b52f102018-02-07 14:37:37 +0100757 VideoSendTiming video_timing;
danilchapce251812017-09-11 12:24:41 -0700758 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
759 &video_timing));
Erik Språng7b52f102018-02-07 14:37:37 +0100760 EXPECT_EQ(kStoredTimeInMs, video_timing.network2_timestamp_delta_ms);
761 EXPECT_EQ(kPacerExitMs, video_timing.pacer_exit_delta_ms);
ilnik04f4d122017-06-19 07:18:55 -0700762}
763
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100764TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithoutPacer) {
765 SetUpRtpSender(/*pacer=*/false, /*populate_network2=*/true);
766 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
767 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
768 auto packet = rtp_sender_->AllocatePacket();
769 packet->SetMarker(true);
770 packet->set_capture_time_ms(fake_clock_.TimeInMilliseconds());
771 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
772 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
773 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
774
775 const int kPropagateTimeMs = 10;
776 fake_clock_.AdvanceTimeMilliseconds(kPropagateTimeMs);
777
778 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
779 kAllowRetransmission,
780 RtpPacketSender::kNormalPriority));
781
782 EXPECT_EQ(1, transport_.packets_sent());
783 absl::optional<VideoSendTiming> video_timing =
784 transport_.last_sent_packet().GetExtension<VideoTimingExtension>();
785 ASSERT_TRUE(video_timing);
786 EXPECT_EQ(kPropagateTimeMs, video_timing->network2_timestamp_delta_ms);
787}
788
minyue3a407ee2017-04-03 01:10:33 -0700789TEST_P(RtpSenderTest, TrafficSmoothingWithExtensions) {
Peter Boströme23e7372015-10-08 11:44:14 +0200790 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
brandtr9dfff292016-11-14 05:14:50 -0800791 kSsrc, kSeqNum, _, _, _));
Elad Alon4a87e1c2017-10-03 16:11:34 +0200792 EXPECT_CALL(mock_rtc_event_log_,
793 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000794
pwestin@webrtc.orgc66e8b32012-11-07 17:01:04 +0000795 rtp_sender_->SetStorePacketsStatus(true, 10);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000796 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800797 kRtpExtensionTransmissionTimeOffset,
798 kTransmissionTimeOffsetExtensionId));
799 EXPECT_EQ(
800 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
801 kAbsoluteSendTimeExtensionId));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000802 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700803 auto packet =
804 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
805 size_t packet_size = packet->size();
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000806
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000807 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700808 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
809 kAllowRetransmission,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700810 RtpPacketSender::kNormalPriority));
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000811
danilchap12ba1862016-10-26 02:41:55 -0700812 EXPECT_EQ(0, transport_.packets_sent());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000813
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000814 const int kStoredTimeInMs = 100;
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000815 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000816
brandtr9dfff292016-11-14 05:14:50 -0800817 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -0800818 PacedPacketInfo());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000819
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000820 // Process send bucket. Packet should now be sent.
danilchap12ba1862016-10-26 02:41:55 -0700821 EXPECT_EQ(1, transport_.packets_sent());
822 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
823
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +0000824 webrtc::RTPHeader rtp_header;
danilchap12ba1862016-10-26 02:41:55 -0700825 transport_.last_sent_packet().GetHeader(&rtp_header);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000826
827 // Verify transmission time offset.
828 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000829 uint64_t expected_send_time =
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000830 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000831 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000832}
833
minyue3a407ee2017-04-03 01:10:33 -0700834TEST_P(RtpSenderTest, TrafficSmoothingRetransmits) {
Peter Boströme23e7372015-10-08 11:44:14 +0200835 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
brandtr9dfff292016-11-14 05:14:50 -0800836 kSsrc, kSeqNum, _, _, _));
Elad Alon4a87e1c2017-10-03 16:11:34 +0200837 EXPECT_CALL(mock_rtc_event_log_,
838 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000839
840 rtp_sender_->SetStorePacketsStatus(true, 10);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000841 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800842 kRtpExtensionTransmissionTimeOffset,
843 kTransmissionTimeOffsetExtensionId));
844 EXPECT_EQ(
845 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
846 kAbsoluteSendTimeExtensionId));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000847 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700848 auto packet =
849 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
850 size_t packet_size = packet->size();
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000851
852 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700853 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
854 kAllowRetransmission,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700855 RtpPacketSender::kNormalPriority));
Erik Språng0f4f0552019-05-08 10:15:05 -0700856 // Immediately process send bucket and send packet.
857 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
858 PacedPacketInfo());
859 EXPECT_EQ(1, transport_.packets_sent());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000860
Erik Språng0f4f0552019-05-08 10:15:05 -0700861 // Retransmit packet.
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000862 const int kStoredTimeInMs = 100;
863 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
864
Erik Språng0f4f0552019-05-08 10:15:05 -0700865 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
866 kSsrc, kSeqNum, _, _, _));
867 EXPECT_CALL(mock_rtc_event_log_,
868 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
869
danilchapb6f1fb52016-10-19 06:11:39 -0700870 EXPECT_EQ(static_cast<int>(packet_size), rtp_sender_->ReSendPacket(kSeqNum));
Erik Språng0f4f0552019-05-08 10:15:05 -0700871 EXPECT_EQ(1, transport_.packets_sent());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000872
brandtr9dfff292016-11-14 05:14:50 -0800873 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -0800874 PacedPacketInfo());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000875
876 // Process send bucket. Packet should now be sent.
Erik Språng0f4f0552019-05-08 10:15:05 -0700877 EXPECT_EQ(2, transport_.packets_sent());
danilchap12ba1862016-10-26 02:41:55 -0700878 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000879
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +0000880 webrtc::RTPHeader rtp_header;
danilchap12ba1862016-10-26 02:41:55 -0700881 transport_.last_sent_packet().GetHeader(&rtp_header);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000882
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000883 // Verify transmission time offset.
884 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000885 uint64_t expected_send_time =
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000886 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
887 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
888}
889
890// This test sends 1 regular video packet, then 4 padding packets, and then
891// 1 more regular packet.
minyue3a407ee2017-04-03 01:10:33 -0700892TEST_P(RtpSenderTest, SendPadding) {
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000893 // Make all (non-padding) packets go to send queue.
terelius5d332ac2016-01-14 14:37:39 -0800894 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
brandtr9dfff292016-11-14 05:14:50 -0800895 kSsrc, kSeqNum, _, _, _));
Elad Alon4a87e1c2017-10-03 16:11:34 +0200896 EXPECT_CALL(mock_rtc_event_log_,
897 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
898 .Times(1 + 4 + 1);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000899
900 uint16_t seq_num = kSeqNum;
901 uint32_t timestamp = kTimestamp;
902 rtp_sender_->SetStorePacketsStatus(true, 10);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000903 size_t rtp_header_len = kRtpHeaderSize;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000904 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800905 kRtpExtensionTransmissionTimeOffset,
906 kTransmissionTimeOffsetExtensionId));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000907 rtp_header_len += 4; // 4 bytes extension.
danilchap162abd32015-12-10 02:39:40 -0800908 EXPECT_EQ(
909 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
910 kAbsoluteSendTimeExtensionId));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000911 rtp_header_len += 4; // 4 bytes extension.
912 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
913
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000914 webrtc::RTPHeader rtp_header;
915
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000916 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700917 auto packet =
918 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
Stefan Holmer586b19b2015-09-18 11:14:31 +0200919 const uint32_t media_packet_timestamp = timestamp;
danilchapb6f1fb52016-10-19 06:11:39 -0700920 size_t packet_size = packet->size();
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000921
922 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700923 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
924 kAllowRetransmission,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700925 RtpPacketSender::kNormalPriority));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000926
927 int total_packets_sent = 0;
danilchap12ba1862016-10-26 02:41:55 -0700928 EXPECT_EQ(total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000929
930 const int kStoredTimeInMs = 100;
931 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
brandtr9dfff292016-11-14 05:14:50 -0800932 rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -0800933 PacedPacketInfo());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000934 // Packet should now be sent. This test doesn't verify the regular video
935 // packet, since it is tested in another test.
danilchap12ba1862016-10-26 02:41:55 -0700936 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000937 timestamp += 90 * kStoredTimeInMs;
938
939 // Send padding 4 times, waiting 50 ms between each.
940 for (int i = 0; i < 4; ++i) {
941 const int kPaddingPeriodMs = 50;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000942 const size_t kPaddingBytes = 100;
943 const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000944 // Padding will be forced to full packets.
philipelc7bf32a2017-02-17 03:59:43 -0800945 EXPECT_EQ(kMaxPaddingLength,
philipel8aadd502017-02-23 02:56:13 -0800946 rtp_sender_->TimeToSendPadding(kPaddingBytes, PacedPacketInfo()));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000947
948 // Process send bucket. Padding should now be sent.
danilchap12ba1862016-10-26 02:41:55 -0700949 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000950 EXPECT_EQ(kMaxPaddingLength + rtp_header_len,
danilchap12ba1862016-10-26 02:41:55 -0700951 transport_.last_sent_packet().size());
952
953 transport_.last_sent_packet().GetHeader(&rtp_header);
pbosbd2522a2015-07-01 05:35:53 -0700954 EXPECT_EQ(kMaxPaddingLength, rtp_header.paddingLength);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000955
Stefan Holmer586b19b2015-09-18 11:14:31 +0200956 // Verify sequence number and timestamp. The timestamp should be the same
957 // as the last media packet.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000958 EXPECT_EQ(seq_num++, rtp_header.sequenceNumber);
Stefan Holmer586b19b2015-09-18 11:14:31 +0200959 EXPECT_EQ(media_packet_timestamp, rtp_header.timestamp);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000960 // Verify transmission time offset.
Stefan Holmer586b19b2015-09-18 11:14:31 +0200961 int offset = timestamp - media_packet_timestamp;
962 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000963 uint64_t expected_send_time =
964 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
965 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
966 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs);
967 timestamp += 90 * kPaddingPeriodMs;
968 }
969
970 // Send a regular video packet again.
971 capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700972 packet = BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
973 packet_size = packet->size();
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000974
brandtr9dfff292016-11-14 05:14:50 -0800975 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
976 kSsrc, seq_num, _, _, _));
terelius5d332ac2016-01-14 14:37:39 -0800977
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000978 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700979 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
980 kAllowRetransmission,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700981 RtpPacketSender::kNormalPriority));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000982
brandtr9dfff292016-11-14 05:14:50 -0800983 rtp_sender_->TimeToSendPacket(kSsrc, seq_num, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -0800984 PacedPacketInfo());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000985 // Process send bucket.
danilchap12ba1862016-10-26 02:41:55 -0700986 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
987 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
988 transport_.last_sent_packet().GetHeader(&rtp_header);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000989
990 // Verify sequence number and timestamp.
991 EXPECT_EQ(seq_num, rtp_header.sequenceNumber);
992 EXPECT_EQ(timestamp, rtp_header.timestamp);
993 // Verify transmission time offset. This packet is sent without delay.
994 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
995 uint64_t expected_send_time =
996 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000997 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000998}
pbos@webrtc.org8911ce42013-03-18 16:39:03 +0000999
minyue3a407ee2017-04-03 01:10:33 -07001000TEST_P(RtpSenderTest, OnSendPacketUpdated) {
stefana23fc622016-07-28 07:56:38 -07001001 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1002 kRtpExtensionTransportSequenceNumber,
1003 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -07001004 rtp_sender_->SetStorePacketsStatus(true, 10);
1005
1006 EXPECT_CALL(send_packet_observer_,
1007 OnSendPacket(kTransportSequenceNumber, _, _))
1008 .Times(1);
1009 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +02001010 .WillOnce(Return(kTransportSequenceNumber));
brandtr9dfff292016-11-14 05:14:50 -08001011 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
1012 .Times(1);
asapersson35151f32016-05-02 23:44:01 -07001013
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001014 SendGenericPacket(); // Packet passed to pacer.
asapersson35151f32016-05-02 23:44:01 -07001015 const bool kIsRetransmit = false;
brandtr9dfff292016-11-14 05:14:50 -08001016 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1017 fake_clock_.TimeInMilliseconds(), kIsRetransmit,
philipel8aadd502017-02-23 02:56:13 -08001018 PacedPacketInfo());
danilchap12ba1862016-10-26 02:41:55 -07001019 EXPECT_EQ(1, transport_.packets_sent());
asapersson35151f32016-05-02 23:44:01 -07001020}
1021
minyue3a407ee2017-04-03 01:10:33 -07001022TEST_P(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) {
stefana23fc622016-07-28 07:56:38 -07001023 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1024 kRtpExtensionTransportSequenceNumber,
1025 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -07001026 rtp_sender_->SetStorePacketsStatus(true, 10);
1027
1028 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
1029 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +02001030 .WillOnce(Return(kTransportSequenceNumber));
brandtr9dfff292016-11-14 05:14:50 -08001031 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
1032 .Times(1);
asapersson35151f32016-05-02 23:44:01 -07001033
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001034 SendGenericPacket(); // Packet passed to pacer.
asapersson35151f32016-05-02 23:44:01 -07001035 const bool kIsRetransmit = true;
brandtr9dfff292016-11-14 05:14:50 -08001036 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1037 fake_clock_.TimeInMilliseconds(), kIsRetransmit,
philipel8aadd502017-02-23 02:56:13 -08001038 PacedPacketInfo());
danilchap12ba1862016-10-26 02:41:55 -07001039 EXPECT_EQ(1, transport_.packets_sent());
Petter Strandmark26bc6692018-05-29 08:43:35 +02001040 EXPECT_TRUE(transport_.last_options_.is_retransmit);
asapersson35151f32016-05-02 23:44:01 -07001041}
1042
minyue3a407ee2017-04-03 01:10:33 -07001043TEST_P(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) {
Erik Språng4580ca22019-07-04 10:38:43 +02001044 RtpRtcp::Configuration config;
1045 config.clock = &fake_clock_;
1046 config.outgoing_transport = &transport_;
1047 config.paced_sender = &mock_paced_sender_;
1048 config.media_send_ssrc = kSsrc;
1049 config.send_packet_observer = &send_packet_observer_;
1050 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1051 rtp_sender_ = absl::make_unique<RTPSender>(config);
1052
brandtr9dfff292016-11-14 05:14:50 -08001053 rtp_sender_->SetSequenceNumber(kSeqNum);
stefana23fc622016-07-28 07:56:38 -07001054 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1055 kRtpExtensionTransportSequenceNumber,
1056 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -07001057 rtp_sender_->SetSequenceNumber(kSeqNum);
1058 rtp_sender_->SetStorePacketsStatus(true, 10);
1059
1060 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
brandtr9dfff292016-11-14 05:14:50 -08001061 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
1062 .Times(1);
asapersson35151f32016-05-02 23:44:01 -07001063
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001064 SendGenericPacket(); // Packet passed to pacer.
asapersson35151f32016-05-02 23:44:01 -07001065 const bool kIsRetransmit = false;
brandtr9dfff292016-11-14 05:14:50 -08001066 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1067 fake_clock_.TimeInMilliseconds(), kIsRetransmit,
philipel8aadd502017-02-23 02:56:13 -08001068 PacedPacketInfo());
danilchap12ba1862016-10-26 02:41:55 -07001069 EXPECT_EQ(1, transport_.packets_sent());
asapersson35151f32016-05-02 23:44:01 -07001070}
1071
Erik Språng214f5432019-06-20 15:09:58 +02001072// TODO(bugs.webrtc.org/8975): Remove this test when non-useful padding is
1073// removed.
minyue3a407ee2017-04-03 01:10:33 -07001074TEST_P(RtpSenderTest, SendRedundantPayloads) {
Erik Språng214f5432019-06-20 15:09:58 +02001075 test::ScopedFieldTrials field_trials(
1076 "WebRTC-PayloadPadding-UseMostUsefulPacket/Disabled/");
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001077 MockTransport transport;
Erik Språng4580ca22019-07-04 10:38:43 +02001078 RtpRtcp::Configuration config;
1079 config.clock = &fake_clock_;
1080 config.outgoing_transport = &transport;
1081 config.paced_sender = &mock_paced_sender_;
1082 config.media_send_ssrc = kSsrc;
1083 config.rtx_send_ssrc = kRtxSsrc;
1084 config.event_log = &mock_rtc_event_log_;
1085 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1086 rtp_sender_ = absl::make_unique<RTPSender>(config);
1087
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001088 rtp_sender_->SetSequenceNumber(kSeqNum);
Shao Changbine62202f2015-04-21 20:24:50 +08001089 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001090
1091 uint16_t seq_num = kSeqNum;
1092 rtp_sender_->SetStorePacketsStatus(true, 10);
wu@webrtc.orgebdb0e32014-03-06 23:49:08 +00001093 int32_t rtp_header_len = kRtpHeaderSize;
danilchap162abd32015-12-10 02:39:40 -08001094 EXPECT_EQ(
1095 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
1096 kAbsoluteSendTimeExtensionId));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001097 rtp_header_len += 4; // 4 bytes extension.
1098 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
1099
pbos@webrtc.org0b0c2412015-01-13 14:15:15 +00001100 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001101
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001102 const size_t kNumPayloadSizes = 10;
danilchap162abd32015-12-10 02:39:40 -08001103 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700,
1104 750, 800, 850, 900, 950};
terelius5d332ac2016-01-14 14:37:39 -08001105 // Expect all packets go through the pacer.
1106 EXPECT_CALL(mock_paced_sender_,
brandtr9dfff292016-11-14 05:14:50 -08001107 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _))
terelius5d332ac2016-01-14 14:37:39 -08001108 .Times(kNumPayloadSizes);
Elad Alon4a87e1c2017-10-03 16:11:34 +02001109 EXPECT_CALL(mock_rtc_event_log_,
1110 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
terelius429c3452016-01-21 05:42:04 -08001111 .Times(kNumPayloadSizes);
1112
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001113 // Send 10 packets of increasing size.
1114 for (size_t i = 0; i < kNumPayloadSizes; ++i) {
1115 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
Erik Språng214f5432019-06-20 15:09:58 +02001116 EXPECT_CALL(transport, SendRtp(_, _, _)).WillOnce(Return(true));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001117 SendPacket(capture_time_ms, kPayloadSizes[i]);
brandtr9dfff292016-11-14 05:14:50 -08001118 rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -08001119 PacedPacketInfo());
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001120 fake_clock_.AdvanceTimeMilliseconds(33);
1121 }
terelius429c3452016-01-21 05:42:04 -08001122
Elad Alon4a87e1c2017-10-03 16:11:34 +02001123 EXPECT_CALL(mock_rtc_event_log_,
1124 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
Erik Språng214f5432019-06-20 15:09:58 +02001125 .Times(AtLeast(4));
terelius429c3452016-01-21 05:42:04 -08001126
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001127 // The amount of padding to send it too small to send a payload packet.
stefan1d8a5062015-10-02 03:39:33 -07001128 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
Erik Språng214f5432019-06-20 15:09:58 +02001129 .WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -07001130 EXPECT_EQ(kMaxPaddingSize,
philipel8aadd502017-02-23 02:56:13 -08001131 rtp_sender_->TimeToSendPadding(49, PacedPacketInfo()));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001132
Petter Strandmark26bc6692018-05-29 08:43:35 +02001133 PacketOptions options;
Peter Boströmac547a62015-09-17 23:03:57 +02001134 EXPECT_CALL(transport,
stefan1d8a5062015-10-02 03:39:33 -07001135 SendRtp(_, kPayloadSizes[0] + rtp_header_len + kRtxHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +02001136 .WillOnce(DoAll(SaveArg<2>(&options), Return(true)));
philipela1ed0b32016-06-01 06:31:17 -07001137 EXPECT_EQ(kPayloadSizes[0],
philipel8aadd502017-02-23 02:56:13 -08001138 rtp_sender_->TimeToSendPadding(500, PacedPacketInfo()));
Petter Strandmark26bc6692018-05-29 08:43:35 +02001139 EXPECT_TRUE(options.is_retransmit);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001140
Yves Gerey665174f2018-06-19 15:03:05 +02001141 EXPECT_CALL(transport, SendRtp(_,
1142 kPayloadSizes[kNumPayloadSizes - 1] +
1143 rtp_header_len + kRtxHeaderSize,
stefan1d8a5062015-10-02 03:39:33 -07001144 _))
Erik Språng214f5432019-06-20 15:09:58 +02001145 .WillOnce(Return(true));
Petter Strandmark26bc6692018-05-29 08:43:35 +02001146
1147 options.is_retransmit = false;
stefan1d8a5062015-10-02 03:39:33 -07001148 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
Erik Språng214f5432019-06-20 15:09:58 +02001149 .WillOnce(DoAll(SaveArg<2>(&options), Return(true)));
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001150 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1] + kMaxPaddingSize,
philipel8aadd502017-02-23 02:56:13 -08001151 rtp_sender_->TimeToSendPadding(999, PacedPacketInfo()));
Petter Strandmark26bc6692018-05-29 08:43:35 +02001152 EXPECT_FALSE(options.is_retransmit);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001153}
1154
Erik Språng214f5432019-06-20 15:09:58 +02001155TEST_P(RtpSenderTest, SendRedundantPayloadsUsefulPadding) {
1156 test::ScopedFieldTrials field_trials(
1157 "WebRTC-PayloadPadding-UseMostUsefulPacket/Enabled/");
1158 MockTransport transport;
Erik Språng4580ca22019-07-04 10:38:43 +02001159 RtpRtcp::Configuration config;
1160 config.clock = &fake_clock_;
1161 config.outgoing_transport = &transport;
1162 config.paced_sender = &mock_paced_sender_;
1163 config.media_send_ssrc = kSsrc;
1164 config.rtx_send_ssrc = kRtxSsrc;
1165 config.event_log = &mock_rtc_event_log_;
1166 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1167 rtp_sender_ = absl::make_unique<RTPSender>(config);
1168
Erik Språng214f5432019-06-20 15:09:58 +02001169 rtp_sender_->SetSequenceNumber(kSeqNum);
Erik Språng214f5432019-06-20 15:09:58 +02001170 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
1171
1172 uint16_t seq_num = kSeqNum;
1173 rtp_sender_->SetStorePacketsStatus(true, 10);
1174 int32_t rtp_header_len = kRtpHeaderSize;
1175 EXPECT_EQ(
1176 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
1177 kAbsoluteSendTimeExtensionId));
1178 rtp_header_len += 4; // 4 bytes extension.
1179 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
1180
1181 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
Erik Språng214f5432019-06-20 15:09:58 +02001182
1183 const size_t kNumPayloadSizes = 10;
1184 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700,
1185 750, 800, 850, 900, 950};
1186 // Expect all packets go through the pacer.
1187 EXPECT_CALL(mock_paced_sender_,
1188 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _))
1189 .Times(kNumPayloadSizes);
1190 EXPECT_CALL(mock_rtc_event_log_,
1191 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1192 .Times(kNumPayloadSizes);
1193
1194 // Send 10 packets of increasing size.
1195 EXPECT_CALL(transport, SendRtp)
1196 .Times(kNumPayloadSizes)
1197 .WillRepeatedly(Return(true));
1198 for (size_t i = 0; i < kNumPayloadSizes; ++i) {
1199 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
1200 SendPacket(capture_time_ms, kPayloadSizes[i]);
1201 rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
1202 PacedPacketInfo());
1203 fake_clock_.AdvanceTimeMilliseconds(33);
1204 }
1205
1206 EXPECT_CALL(mock_rtc_event_log_,
1207 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1208 .Times(AtLeast(4));
1209
1210 // The amount of padding to send it too small to send a payload packet.
1211 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
1212 .WillOnce(Return(true));
1213 EXPECT_EQ(kMaxPaddingSize,
1214 rtp_sender_->TimeToSendPadding(49, PacedPacketInfo()));
1215
1216 // Payload padding will prefer packets with lower transmit count first and
1217 // lower age second.
1218 EXPECT_CALL(transport, SendRtp(_,
1219 kPayloadSizes[kNumPayloadSizes - 1] +
1220 rtp_header_len + kRtxHeaderSize,
1221 Field(&PacketOptions::is_retransmit, true)))
1222 .WillOnce(Return(true));
1223 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1],
1224 rtp_sender_->TimeToSendPadding(500, PacedPacketInfo()));
1225
1226 EXPECT_CALL(transport, SendRtp(_,
1227 kPayloadSizes[kNumPayloadSizes - 2] +
1228 rtp_header_len + kRtxHeaderSize,
1229 _))
1230 .WillOnce(Return(true));
1231
1232 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len,
1233 Field(&PacketOptions::is_retransmit, false)))
1234 .WillOnce(Return(true));
1235 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 2] + kMaxPaddingSize,
1236 rtp_sender_->TimeToSendPadding(
1237 kPayloadSizes[kNumPayloadSizes - 2] + 49, PacedPacketInfo()));
1238}
1239
minyue3a407ee2017-04-03 01:10:33 -07001240TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) {
Niels Möller8a40edd2019-01-24 18:04:44 +01001241 const char payload_name[] = "GENERIC";
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001242 const uint8_t payload_type = 127;
Niels Möller5fe95102019-03-04 16:49:25 +01001243 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001244 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001245 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01001246 FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001247 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1248 /*raw_payload=*/false);
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001249 uint8_t payload[] = {47, 11, 32, 93, 89};
1250
1251 // Send keyframe
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001252 RTPVideoHeader video_header;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001253 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001254 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1255 sizeof(payload), nullptr, &video_header,
1256 kDefaultExpectedRetransmissionTimeMs));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001257
danilchap96c15872016-11-21 01:35:29 -08001258 auto sent_payload = transport_.last_sent_packet().payload();
1259 uint8_t generic_header = sent_payload[0];
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001260 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
1261 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
danilchap96c15872016-11-21 01:35:29 -08001262 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001263
1264 // Send delta frame
1265 payload[0] = 13;
1266 payload[1] = 42;
1267 payload[4] = 13;
1268
Niels Möller59ab1cf2019-02-06 22:48:11 +01001269 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001270 VideoFrameType::kVideoFrameDelta, payload_type, 1234, 4321, payload,
1271 sizeof(payload), nullptr, &video_header,
1272 kDefaultExpectedRetransmissionTimeMs));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001273
danilchap96c15872016-11-21 01:35:29 -08001274 sent_payload = transport_.last_sent_packet().payload();
1275 generic_header = sent_payload[0];
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001276 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
1277 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
danilchap96c15872016-11-21 01:35:29 -08001278 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001279}
1280
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001281TEST_P(RtpSenderTestWithoutPacer, SendRawVideo) {
1282 const char payload_name[] = "VP8";
1283 const uint8_t payload_type = 111;
1284 const uint8_t payload[] = {11, 22, 33, 44, 55};
1285
1286 PlayoutDelayOracle playout_delay_oracle;
1287 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001288 &playout_delay_oracle, nullptr, false, false,
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001289 FieldTrialBasedConfig());
1290 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1291 /*raw_payload=*/true);
1292
1293 // Send a frame.
1294 RTPVideoHeader video_header;
1295 ASSERT_TRUE(rtp_sender_video.SendVideo(
1296 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1297 sizeof(payload), nullptr, &video_header,
1298 kDefaultExpectedRetransmissionTimeMs));
1299
1300 auto sent_payload = transport_.last_sent_packet().payload();
1301 EXPECT_THAT(sent_payload, ElementsAreArray(payload));
1302}
1303
minyue3a407ee2017-04-03 01:10:33 -07001304TEST_P(RtpSenderTest, SendFlexfecPackets) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001305 constexpr uint32_t kTimestamp = 1234;
brandtrdbdb3f12016-11-10 05:04:48 -08001306 constexpr int kMediaPayloadType = 127;
1307 constexpr int kFlexfecPayloadType = 118;
brandtrdbdb3f12016-11-10 05:04:48 -08001308 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001309 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språng4580ca22019-07-04 10:38:43 +02001310 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
1311 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001312 nullptr /* rtp_state */, &fake_clock_);
brandtrdbdb3f12016-11-10 05:04:48 -08001313
1314 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001315 RtpRtcp::Configuration config;
1316 config.clock = &fake_clock_;
1317 config.outgoing_transport = &transport_;
1318 config.paced_sender = &mock_paced_sender_;
1319 config.media_send_ssrc = kSsrc;
1320 config.flexfec_sender = &flexfec_sender_;
1321 config.transport_sequence_number_allocator = &seq_num_allocator_;
1322 config.event_log = &mock_rtc_event_log_;
1323 config.send_packet_observer = &send_packet_observer_;
1324 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1325 rtp_sender_ = absl::make_unique<RTPSender>(config);
1326
brandtrdbdb3f12016-11-10 05:04:48 -08001327 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtrdbdb3f12016-11-10 05:04:48 -08001328 rtp_sender_->SetStorePacketsStatus(true, 10);
1329
Niels Möller5fe95102019-03-04 16:49:25 +01001330 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001331 RTPSenderVideo rtp_sender_video(
1332 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1333 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001334 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1335 /*raw_payload=*/false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001336
brandtrdbdb3f12016-11-10 05:04:48 -08001337 // Parameters selected to generate a single FEC packet per media packet.
1338 FecProtectionParams params;
1339 params.fec_rate = 15;
1340 params.max_fec_frames = 1;
1341 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001342 rtp_sender_video.SetFecParameters(params, params);
brandtrdbdb3f12016-11-10 05:04:48 -08001343
Erik Språng4580ca22019-07-04 10:38:43 +02001344 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1345 kSsrc, kSeqNum, _, _, false));
brandtr9dfff292016-11-14 05:14:50 -08001346 uint16_t flexfec_seq_num;
brandtrdbdb3f12016-11-10 05:04:48 -08001347 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
Erik Språng4580ca22019-07-04 10:38:43 +02001348 kFlexFecSsrc, _, _, _, false))
Erik Språng214f5432019-06-20 15:09:58 +02001349 .WillOnce(SaveArg<2>(&flexfec_seq_num));
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001350
1351 RTPVideoHeader video_header;
1352 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001353 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001354 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1355 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1356
Elad Alon4a87e1c2017-10-03 16:11:34 +02001357 EXPECT_CALL(mock_rtc_event_log_,
1358 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1359 .Times(2);
Erik Språngd2879622019-05-10 08:29:01 -07001360 EXPECT_EQ(RtpPacketSendResult::kSuccess,
Erik Språng4580ca22019-07-04 10:38:43 +02001361 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
Erik Språngd2879622019-05-10 08:29:01 -07001362 fake_clock_.TimeInMilliseconds(),
1363 false, PacedPacketInfo()));
1364 EXPECT_EQ(RtpPacketSendResult::kSuccess,
Erik Språng4580ca22019-07-04 10:38:43 +02001365 rtp_sender_->TimeToSendPacket(kFlexFecSsrc, flexfec_seq_num,
Erik Språngd2879622019-05-10 08:29:01 -07001366 fake_clock_.TimeInMilliseconds(),
1367 false, PacedPacketInfo()));
brandtr9dfff292016-11-14 05:14:50 -08001368 ASSERT_EQ(2, transport_.packets_sent());
brandtrdbdb3f12016-11-10 05:04:48 -08001369 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1370 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
brandtr9dfff292016-11-14 05:14:50 -08001371 EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
Erik Språng4580ca22019-07-04 10:38:43 +02001372 EXPECT_EQ(kSsrc, media_packet.Ssrc());
brandtr9dfff292016-11-14 05:14:50 -08001373 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
1374 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
1375 EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
Erik Språng4580ca22019-07-04 10:38:43 +02001376 EXPECT_EQ(kFlexFecSsrc, flexfec_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001377}
1378
minyue3a407ee2017-04-03 01:10:33 -07001379TEST_P(RtpSenderTestWithoutPacer, SendFlexfecPackets) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001380 constexpr uint32_t kTimestamp = 1234;
brandtrdbdb3f12016-11-10 05:04:48 -08001381 constexpr int kMediaPayloadType = 127;
1382 constexpr int kFlexfecPayloadType = 118;
brandtrdbdb3f12016-11-10 05:04:48 -08001383 constexpr uint32_t kFlexfecSsrc = 5678;
1384 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001385 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språng4580ca22019-07-04 10:38:43 +02001386 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kSsrc, kNoMid,
1387 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001388 nullptr /* rtp_state */, &fake_clock_);
brandtrdbdb3f12016-11-10 05:04:48 -08001389
1390 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001391 RtpRtcp::Configuration config;
1392 config.clock = &fake_clock_;
1393 config.outgoing_transport = &transport_;
1394 config.media_send_ssrc = kSsrc;
1395 config.flexfec_sender = &flexfec_sender;
1396 config.transport_sequence_number_allocator = &seq_num_allocator_;
1397 config.event_log = &mock_rtc_event_log_;
1398 config.send_packet_observer = &send_packet_observer_;
1399 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1400 rtp_sender_ = absl::make_unique<RTPSender>(config);
1401
brandtrdbdb3f12016-11-10 05:04:48 -08001402 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtrdbdb3f12016-11-10 05:04:48 -08001403
Niels Möller5fe95102019-03-04 16:49:25 +01001404 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001405 RTPSenderVideo rtp_sender_video(
1406 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1407 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001408 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1409 /*raw_payload=*/false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001410
brandtrdbdb3f12016-11-10 05:04:48 -08001411 // Parameters selected to generate a single FEC packet per media packet.
1412 FecProtectionParams params;
1413 params.fec_rate = 15;
1414 params.max_fec_frames = 1;
1415 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001416 rtp_sender_video.SetFecParameters(params, params);
brandtrdbdb3f12016-11-10 05:04:48 -08001417
Elad Alon4a87e1c2017-10-03 16:11:34 +02001418 EXPECT_CALL(mock_rtc_event_log_,
1419 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1420 .Times(2);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001421 RTPVideoHeader video_header;
1422 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001423 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001424 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1425 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1426
brandtrdbdb3f12016-11-10 05:04:48 -08001427 ASSERT_EQ(2, transport_.packets_sent());
1428 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1429 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
Erik Språng4580ca22019-07-04 10:38:43 +02001430 EXPECT_EQ(kSsrc, media_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001431 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
1432 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
1433 EXPECT_EQ(kFlexfecSsrc, flexfec_packet.Ssrc());
1434}
1435
Steve Anton296a0ce2018-03-22 15:17:27 -07001436// Test that the MID header extension is included on sent packets when
1437// configured.
1438TEST_P(RtpSenderTestWithoutPacer, MidIncludedOnSentPackets) {
1439 const char kMid[] = "mid";
1440
1441 // Register MID header extension and set the MID for the RTPSender.
1442 rtp_sender_->SetSendingMediaStatus(false);
1443 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionMid, kMidExtensionId);
1444 rtp_sender_->SetMid(kMid);
1445 rtp_sender_->SetSendingMediaStatus(true);
1446
1447 // Send a couple packets.
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001448 SendGenericPacket();
1449 SendGenericPacket();
Steve Anton296a0ce2018-03-22 15:17:27 -07001450
1451 // Expect both packets to have the MID set.
1452 ASSERT_EQ(2u, transport_.sent_packets_.size());
1453 for (const RtpPacketReceived& packet : transport_.sent_packets_) {
1454 std::string mid;
1455 ASSERT_TRUE(packet.GetExtension<RtpMid>(&mid));
1456 EXPECT_EQ(kMid, mid);
1457 }
1458}
1459
Amit Hilbuch77938e62018-12-21 09:23:38 -08001460TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnSentPackets) {
1461 const char kRid[] = "f";
1462
1463 rtp_sender_->SetSendingMediaStatus(false);
1464 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRtpStreamId,
1465 kRidExtensionId);
1466 rtp_sender_->SetRid(kRid);
1467 rtp_sender_->SetSendingMediaStatus(true);
1468
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001469 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -08001470
1471 ASSERT_EQ(1u, transport_.sent_packets_.size());
1472 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1473 std::string rid;
1474 ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
1475 EXPECT_EQ(kRid, rid);
1476}
1477
1478TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnRtxSentPackets) {
1479 const char kRid[] = "f";
Amit Hilbuch77938e62018-12-21 09:23:38 -08001480
1481 rtp_sender_->SetSendingMediaStatus(false);
1482 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRtpStreamId,
1483 kRidExtensionId);
1484 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRepairedRtpStreamId,
1485 kRepairedRidExtensionId);
1486 rtp_sender_->SetRid(kRid);
1487 rtp_sender_->SetSendingMediaStatus(true);
1488
1489 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001490 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
Amit Hilbuch77938e62018-12-21 09:23:38 -08001491
1492 rtp_sender_->SetStorePacketsStatus(true, 10);
1493
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001494 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -08001495 ASSERT_EQ(1u, transport_.sent_packets_.size());
1496 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1497 std::string rid;
1498 ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
1499 EXPECT_EQ(kRid, rid);
1500 rid = kNoRid;
1501 EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&rid));
1502
1503 uint16_t packet_id = packet.SequenceNumber();
1504 rtp_sender_->ReSendPacket(packet_id);
1505 ASSERT_EQ(2u, transport_.sent_packets_.size());
1506 const RtpPacketReceived& rtx_packet = transport_.sent_packets_[1];
1507 ASSERT_TRUE(rtx_packet.GetExtension<RepairedRtpStreamId>(&rid));
1508 EXPECT_EQ(kRid, rid);
1509 EXPECT_FALSE(rtx_packet.HasExtension<RtpStreamId>());
1510}
1511
minyue3a407ee2017-04-03 01:10:33 -07001512TEST_P(RtpSenderTest, FecOverheadRate) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001513 constexpr uint32_t kTimestamp = 1234;
1514 constexpr int kMediaPayloadType = 127;
brandtr81eab612017-01-24 04:06:09 -08001515 constexpr int kFlexfecPayloadType = 118;
brandtr81eab612017-01-24 04:06:09 -08001516 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001517 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språng4580ca22019-07-04 10:38:43 +02001518 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
1519 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001520 nullptr /* rtp_state */, &fake_clock_);
brandtr81eab612017-01-24 04:06:09 -08001521
1522 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001523 RtpRtcp::Configuration config;
1524 config.clock = &fake_clock_;
1525 config.outgoing_transport = &transport_;
1526 config.paced_sender = &mock_paced_sender_;
1527 config.media_send_ssrc = kSsrc;
1528 config.flexfec_sender = &flexfec_sender;
1529 config.transport_sequence_number_allocator = &seq_num_allocator_;
1530 config.event_log = &mock_rtc_event_log_;
1531 config.send_packet_observer = &send_packet_observer_;
1532 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1533 rtp_sender_ = absl::make_unique<RTPSender>(config);
1534
brandtr81eab612017-01-24 04:06:09 -08001535 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtr81eab612017-01-24 04:06:09 -08001536
Niels Möller5fe95102019-03-04 16:49:25 +01001537 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001538 RTPSenderVideo rtp_sender_video(
1539 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1540 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001541 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1542 /*raw_payload=*/false);
brandtr81eab612017-01-24 04:06:09 -08001543 // Parameters selected to generate a single FEC packet per media packet.
1544 FecProtectionParams params;
1545 params.fec_rate = 15;
1546 params.max_fec_frames = 1;
1547 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001548 rtp_sender_video.SetFecParameters(params, params);
brandtr81eab612017-01-24 04:06:09 -08001549
1550 constexpr size_t kNumMediaPackets = 10;
1551 constexpr size_t kNumFecPackets = kNumMediaPackets;
1552 constexpr int64_t kTimeBetweenPacketsMs = 10;
1553 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, false))
1554 .Times(kNumMediaPackets + kNumFecPackets);
1555 for (size_t i = 0; i < kNumMediaPackets; ++i) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001556 RTPVideoHeader video_header;
1557
1558 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001559 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001560 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1561 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1562
brandtr81eab612017-01-24 04:06:09 -08001563 fake_clock_.AdvanceTimeMilliseconds(kTimeBetweenPacketsMs);
1564 }
1565 constexpr size_t kRtpHeaderLength = 12;
1566 constexpr size_t kFlexfecHeaderLength = 20;
1567 constexpr size_t kGenericCodecHeaderLength = 1;
1568 constexpr size_t kPayloadLength = sizeof(kPayloadData);
1569 constexpr size_t kPacketLength = kRtpHeaderLength + kFlexfecHeaderLength +
1570 kGenericCodecHeaderLength + kPayloadLength;
1571 EXPECT_NEAR(kNumFecPackets * kPacketLength * 8 /
1572 (kNumFecPackets * kTimeBetweenPacketsMs / 1000.0f),
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001573 rtp_sender_video.FecOverheadRate(), 500);
brandtr81eab612017-01-24 04:06:09 -08001574}
1575
minyue3a407ee2017-04-03 01:10:33 -07001576TEST_P(RtpSenderTest, BitrateCallbacks) {
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001577 class TestCallback : public BitrateStatisticsObserver {
1578 public:
sprangcd349d92016-07-13 09:11:28 -07001579 TestCallback()
1580 : BitrateStatisticsObserver(),
1581 num_calls_(0),
1582 ssrc_(0),
1583 total_bitrate_(0),
1584 retransmit_bitrate_(0) {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +00001585 ~TestCallback() override = default;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001586
sprangcd349d92016-07-13 09:11:28 -07001587 void Notify(uint32_t total_bitrate,
1588 uint32_t retransmit_bitrate,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00001589 uint32_t ssrc) override {
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001590 ++num_calls_;
1591 ssrc_ = ssrc;
sprangcd349d92016-07-13 09:11:28 -07001592 total_bitrate_ = total_bitrate;
1593 retransmit_bitrate_ = retransmit_bitrate;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001594 }
1595
1596 uint32_t num_calls_;
1597 uint32_t ssrc_;
sprangcd349d92016-07-13 09:11:28 -07001598 uint32_t total_bitrate_;
1599 uint32_t retransmit_bitrate_;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001600 } callback;
Erik Språng4580ca22019-07-04 10:38:43 +02001601
1602 RtpRtcp::Configuration config;
1603 config.clock = &fake_clock_;
1604 config.outgoing_transport = &transport_;
1605 config.media_send_ssrc = kSsrc;
1606 config.send_bitrate_observer = &callback;
1607 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1608 rtp_sender_ = absl::make_unique<RTPSender>(config);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001609
Niels Möller5fe95102019-03-04 16:49:25 +01001610 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001611 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001612 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01001613 FieldTrialBasedConfig());
Niels Möller59ab1cf2019-02-06 22:48:11 +01001614 const char payload_name[] = "GENERIC";
1615 const uint8_t payload_type = 127;
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001616 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1617 /*raw_payload=*/false);
Niels Möller59ab1cf2019-02-06 22:48:11 +01001618
sprangcd349d92016-07-13 09:11:28 -07001619 // Simulate kNumPackets sent with kPacketInterval ms intervals, with the
1620 // number of packets selected so that we fill (but don't overflow) the one
1621 // second averaging window.
1622 const uint32_t kWindowSizeMs = 1000;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001623 const uint32_t kPacketInterval = 20;
sprangcd349d92016-07-13 09:11:28 -07001624 const uint32_t kNumPackets =
1625 (kWindowSizeMs - kPacketInterval) / kPacketInterval;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001626 // Overhead = 12 bytes RTP header + 1 byte generic header.
1627 const uint32_t kPacketOverhead = 13;
1628
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001629 uint8_t payload[] = {47, 11, 32, 93, 89};
1630 rtp_sender_->SetStorePacketsStatus(true, 1);
1631 uint32_t ssrc = rtp_sender_->SSRC();
1632
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001633 // Initial process call so we get a new time window.
1634 rtp_sender_->ProcessBitrate();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001635
1636 // Send a few frames.
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001637 RTPVideoHeader video_header;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001638 for (uint32_t i = 0; i < kNumPackets; ++i) {
Niels Möller59ab1cf2019-02-06 22:48:11 +01001639 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001640 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1641 sizeof(payload), nullptr, &video_header,
1642 kDefaultExpectedRetransmissionTimeMs));
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001643 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval);
1644 }
1645
1646 rtp_sender_->ProcessBitrate();
1647
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001648 // We get one call for every stats updated, thus two calls since both the
1649 // stream stats and the retransmit stats are updated once.
1650 EXPECT_EQ(2u, callback.num_calls_);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001651 EXPECT_EQ(ssrc, callback.ssrc_);
sprangcd349d92016-07-13 09:11:28 -07001652 const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload);
1653 // Bitrate measured over delta between last and first timestamp, plus one.
1654 const uint32_t kExpectedWindowMs = kNumPackets * kPacketInterval + 1;
1655 const uint32_t kExpectedBitsAccumulated = kTotalPacketSize * kNumPackets * 8;
1656 const uint32_t kExpectedRateBps =
1657 (kExpectedBitsAccumulated * 1000 + (kExpectedWindowMs / 2)) /
1658 kExpectedWindowMs;
1659 EXPECT_EQ(kExpectedRateBps, callback.total_bitrate_);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001660
andresp@webrtc.orgd11bec42014-07-08 14:32:58 +00001661 rtp_sender_.reset();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001662}
1663
minyue3a407ee2017-04-03 01:10:33 -07001664TEST_P(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) {
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001665 class TestCallback : public StreamDataCountersCallback {
1666 public:
danilchap162abd32015-12-10 02:39:40 -08001667 TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +00001668 ~TestCallback() override = default;
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001669
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00001670 void DataCountersUpdated(const StreamDataCounters& counters,
1671 uint32_t ssrc) override {
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001672 ssrc_ = ssrc;
1673 counters_ = counters;
1674 }
1675
1676 uint32_t ssrc_;
1677 StreamDataCounters counters_;
asapersson@webrtc.org44149392015-02-04 08:34:47 +00001678
1679 void MatchPacketCounter(const RtpPacketCounter& expected,
1680 const RtpPacketCounter& actual) {
1681 EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
1682 EXPECT_EQ(expected.header_bytes, actual.header_bytes);
1683 EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
1684 EXPECT_EQ(expected.packets, actual.packets);
1685 }
1686
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001687 void Matches(uint32_t ssrc, const StreamDataCounters& counters) {
1688 EXPECT_EQ(ssrc, ssrc_);
asapersson@webrtc.org44149392015-02-04 08:34:47 +00001689 MatchPacketCounter(counters.transmitted, counters_.transmitted);
1690 MatchPacketCounter(counters.retransmitted, counters_.retransmitted);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001691 EXPECT_EQ(counters.fec.packets, counters_.fec.packets);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001692 }
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001693 } callback;
1694
1695 const uint8_t kRedPayloadType = 96;
1696 const uint8_t kUlpfecPayloadType = 97;
Niels Möller8a40edd2019-01-24 18:04:44 +01001697 const char payload_name[] = "GENERIC";
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001698 const uint8_t payload_type = 127;
Niels Möller5fe95102019-03-04 16:49:25 +01001699 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001700 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001701 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01001702 FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001703 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1704 /*raw_payload=*/false);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001705 uint8_t payload[] = {47, 11, 32, 93, 89};
1706 rtp_sender_->SetStorePacketsStatus(true, 1);
1707 uint32_t ssrc = rtp_sender_->SSRC();
1708
1709 rtp_sender_->RegisterRtpStatisticsCallback(&callback);
1710
1711 // Send a frame.
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001712 RTPVideoHeader video_header;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001713 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001714 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1715 sizeof(payload), nullptr, &video_header,
1716 kDefaultExpectedRetransmissionTimeMs));
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001717 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001718 expected.transmitted.payload_bytes = 6;
1719 expected.transmitted.header_bytes = 12;
1720 expected.transmitted.padding_bytes = 0;
1721 expected.transmitted.packets = 1;
1722 expected.retransmitted.payload_bytes = 0;
1723 expected.retransmitted.header_bytes = 0;
1724 expected.retransmitted.padding_bytes = 0;
1725 expected.retransmitted.packets = 0;
1726 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001727 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001728
1729 // Retransmit a frame.
1730 uint16_t seqno = rtp_sender_->SequenceNumber() - 1;
Erik Språnga12b1d62018-03-14 12:39:24 +01001731 rtp_sender_->ReSendPacket(seqno);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001732 expected.transmitted.payload_bytes = 12;
1733 expected.transmitted.header_bytes = 24;
1734 expected.transmitted.packets = 2;
1735 expected.retransmitted.payload_bytes = 6;
1736 expected.retransmitted.header_bytes = 12;
1737 expected.retransmitted.padding_bytes = 0;
1738 expected.retransmitted.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001739 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001740
1741 // Send padding.
philipel8aadd502017-02-23 02:56:13 -08001742 rtp_sender_->TimeToSendPadding(kMaxPaddingSize, PacedPacketInfo());
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001743 expected.transmitted.payload_bytes = 12;
1744 expected.transmitted.header_bytes = 36;
1745 expected.transmitted.padding_bytes = kMaxPaddingSize;
1746 expected.transmitted.packets = 3;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001747 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001748
brandtrf1bb4762016-11-07 03:05:06 -08001749 // Send ULPFEC.
Niels Möller59ab1cf2019-02-06 22:48:11 +01001750 rtp_sender_video.SetUlpfecConfig(kRedPayloadType, kUlpfecPayloadType);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001751 FecProtectionParams fec_params;
1752 fec_params.fec_mask_type = kFecMaskRandom;
1753 fec_params.fec_rate = 1;
1754 fec_params.max_fec_frames = 1;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001755 rtp_sender_video.SetFecParameters(fec_params, fec_params);
1756 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001757 VideoFrameType::kVideoFrameDelta, payload_type, 1234, 4321, payload,
1758 sizeof(payload), nullptr, &video_header,
1759 kDefaultExpectedRetransmissionTimeMs));
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001760 expected.transmitted.payload_bytes = 40;
1761 expected.transmitted.header_bytes = 60;
1762 expected.transmitted.packets = 5;
1763 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001764 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001765
sprang867fb522015-08-03 04:38:41 -07001766 rtp_sender_->RegisterRtpStatisticsCallback(nullptr);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001767}
1768
minyue3a407ee2017-04-03 01:10:33 -07001769TEST_P(RtpSenderTestWithoutPacer, BytesReportedCorrectly) {
Niels Möller59ab1cf2019-02-06 22:48:11 +01001770 // XXX const char* kPayloadName = "GENERIC";
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001771 const uint8_t kPayloadType = 127;
Shao Changbine62202f2015-04-21 20:24:50 +08001772 rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType);
pbos@webrtc.org0b0c2412015-01-13 14:15:15 +00001773 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001774
Niels Möller59ab1cf2019-02-06 22:48:11 +01001775 SendGenericPacket();
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001776 // Will send 2 full-size padding packets.
philipel8aadd502017-02-23 02:56:13 -08001777 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
1778 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001779
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001780 StreamDataCounters rtp_stats;
1781 StreamDataCounters rtx_stats;
1782 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001783
Niels Möller59ab1cf2019-02-06 22:48:11 +01001784 // Payload
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +00001785 EXPECT_GT(rtp_stats.first_packet_time_ms, -1);
Niels Möller59ab1cf2019-02-06 22:48:11 +01001786 EXPECT_EQ(rtp_stats.transmitted.payload_bytes, sizeof(kPayloadData));
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001787 EXPECT_EQ(rtp_stats.transmitted.header_bytes, 12u);
1788 EXPECT_EQ(rtp_stats.transmitted.padding_bytes, 0u);
1789 EXPECT_EQ(rtx_stats.transmitted.payload_bytes, 0u);
1790 EXPECT_EQ(rtx_stats.transmitted.header_bytes, 24u);
1791 EXPECT_EQ(rtx_stats.transmitted.padding_bytes, 2 * kMaxPaddingSize);
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001792
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001793 EXPECT_EQ(rtp_stats.transmitted.TotalBytes(),
danilchap162abd32015-12-10 02:39:40 -08001794 rtp_stats.transmitted.payload_bytes +
1795 rtp_stats.transmitted.header_bytes +
1796 rtp_stats.transmitted.padding_bytes);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001797 EXPECT_EQ(rtx_stats.transmitted.TotalBytes(),
danilchap162abd32015-12-10 02:39:40 -08001798 rtx_stats.transmitted.payload_bytes +
1799 rtx_stats.transmitted.header_bytes +
1800 rtx_stats.transmitted.padding_bytes);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001801
danilchap162abd32015-12-10 02:39:40 -08001802 EXPECT_EQ(
1803 transport_.total_bytes_sent_,
1804 rtp_stats.transmitted.TotalBytes() + rtx_stats.transmitted.TotalBytes());
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001805}
guoweis@webrtc.org45362892015-03-04 22:55:15 +00001806
minyue3a407ee2017-04-03 01:10:33 -07001807TEST_P(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) {
sprang38778b02015-09-29 09:48:22 -07001808 const int32_t kPacketSize = 1400;
1809 const int32_t kNumPackets = 30;
1810
sprangcd349d92016-07-13 09:11:28 -07001811 retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8);
1812
sprang38778b02015-09-29 09:48:22 -07001813 rtp_sender_->SetStorePacketsStatus(true, kNumPackets);
sprang38778b02015-09-29 09:48:22 -07001814 const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber();
Danil Chapovalov2800d742016-08-26 18:48:46 +02001815 std::vector<uint16_t> sequence_numbers;
sprang38778b02015-09-29 09:48:22 -07001816 for (int32_t i = 0; i < kNumPackets; ++i) {
1817 sequence_numbers.push_back(kStartSequenceNumber + i);
1818 fake_clock_.AdvanceTimeMilliseconds(1);
1819 SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize);
1820 }
danilchap12ba1862016-10-26 02:41:55 -07001821 EXPECT_EQ(kNumPackets, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001822
1823 fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets);
1824
1825 // Resending should work - brings the bandwidth up to the limit.
1826 // NACK bitrate is capped to the same bitrate as the encoder, since the max
1827 // protection overhead is 50% (see MediaOptimization::SetTargetRates).
Danil Chapovalov2800d742016-08-26 18:48:46 +02001828 rtp_sender_->OnReceivedNack(sequence_numbers, 0);
danilchap12ba1862016-10-26 02:41:55 -07001829 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001830
sprangcd349d92016-07-13 09:11:28 -07001831 // Must be at least 5ms in between retransmission attempts.
1832 fake_clock_.AdvanceTimeMilliseconds(5);
1833
sprang38778b02015-09-29 09:48:22 -07001834 // Resending should not work, bandwidth exceeded.
Danil Chapovalov2800d742016-08-26 18:48:46 +02001835 rtp_sender_->OnReceivedNack(sequence_numbers, 0);
danilchap12ba1862016-10-26 02:41:55 -07001836 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001837}
1838
minyue3a407ee2017-04-03 01:10:33 -07001839TEST_P(RtpSenderTest, OnOverheadChanged) {
michaelt4da30442016-11-17 01:38:43 -08001840 MockOverheadObserver mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02001841 RtpRtcp::Configuration config;
1842 config.clock = &fake_clock_;
1843 config.outgoing_transport = &transport_;
1844 config.media_send_ssrc = kSsrc;
1845 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1846 config.overhead_observer = &mock_overhead_observer;
1847 rtp_sender_ = absl::make_unique<RTPSender>(config);
michaelt4da30442016-11-17 01:38:43 -08001848
michaelt4da30442016-11-17 01:38:43 -08001849 // RTP overhead is 12B.
nisse284542b2017-01-10 08:58:32 -08001850 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(12)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001851 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001852
1853 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
1854 kTransmissionTimeOffsetExtensionId);
1855
1856 // TransmissionTimeOffset extension has a size of 8B.
nisse284542b2017-01-10 08:58:32 -08001857 // 12B + 8B = 20B
1858 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(20)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001859 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001860}
1861
minyue3a407ee2017-04-03 01:10:33 -07001862TEST_P(RtpSenderTest, DoesNotUpdateOverheadOnEqualSize) {
michaelt4da30442016-11-17 01:38:43 -08001863 MockOverheadObserver mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02001864 RtpRtcp::Configuration config;
1865 config.clock = &fake_clock_;
1866 config.outgoing_transport = &transport_;
1867 config.media_send_ssrc = kSsrc;
1868 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1869 config.overhead_observer = &mock_overhead_observer;
1870 rtp_sender_ = absl::make_unique<RTPSender>(config);
michaelt4da30442016-11-17 01:38:43 -08001871
1872 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(_)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001873 SendGenericPacket();
1874 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001875}
1876
Erik Språng9c771c22019-06-17 16:31:53 +02001877TEST_P(RtpSenderTest, TrySendPacketMatchesVideo) {
1878 std::unique_ptr<RtpPacketToSend> packet =
1879 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1880 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1881
1882 // Verify not sent with wrong SSRC.
1883 packet->SetSsrc(kSsrc + 1);
1884 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1885
1886 // Verify sent with correct SSRC.
1887 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1888 packet->SetSsrc(kSsrc);
1889 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1890 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1891}
1892
1893TEST_P(RtpSenderTest, TrySendPacketMatchesAudio) {
1894 std::unique_ptr<RtpPacketToSend> packet =
1895 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1896 packet->set_packet_type(RtpPacketToSend::Type::kAudio);
1897
1898 // Verify not sent with wrong SSRC.
1899 packet->SetSsrc(kSsrc + 1);
1900 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1901
1902 // Verify sent with correct SSRC.
1903 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1904 packet->SetSsrc(kSsrc);
1905 packet->set_packet_type(RtpPacketToSend::Type::kAudio);
1906 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1907}
1908
1909TEST_P(RtpSenderTest, TrySendPacketMatchesRetransmissions) {
1910 std::unique_ptr<RtpPacketToSend> packet =
1911 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1912 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1913
1914 // Verify not sent with wrong SSRC.
1915 packet->SetSsrc(kSsrc + 1);
1916 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1917
1918 // Verify sent with correct SSRC (non-RTX).
1919 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1920 packet->SetSsrc(kSsrc);
1921 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1922 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1923
1924 // RTX retransmission.
1925 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1926 packet->SetSsrc(kRtxSsrc);
1927 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1928 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1929}
1930
1931TEST_P(RtpSenderTest, TrySendPacketMatchesPadding) {
1932 std::unique_ptr<RtpPacketToSend> packet =
1933 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1934 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
1935
1936 // Verify not sent with wrong SSRC.
1937 packet->SetSsrc(kSsrc + 1);
1938 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1939
1940 // Verify sent with correct SSRC (non-RTX).
1941 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1942 packet->SetSsrc(kSsrc);
1943 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
1944 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1945
1946 // RTX padding.
1947 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1948 packet->SetSsrc(kRtxSsrc);
1949 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
1950 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1951}
1952
1953TEST_P(RtpSenderTest, TrySendPacketMatchesFlexfec) {
1954 std::unique_ptr<RtpPacketToSend> packet =
1955 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1956 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
1957
1958 // Verify not sent with wrong SSRC.
1959 packet->SetSsrc(kSsrc + 1);
1960 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1961
1962 // Verify sent with correct SSRC.
1963 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1964 packet->SetSsrc(kFlexFecSsrc);
1965 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
1966 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1967}
1968
1969TEST_P(RtpSenderTest, TrySendPacketMatchesUlpfec) {
1970 std::unique_ptr<RtpPacketToSend> packet =
1971 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1972 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
1973
1974 // Verify not sent with wrong SSRC.
1975 packet->SetSsrc(kSsrc + 1);
1976 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1977
1978 // Verify sent with correct SSRC.
1979 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1980 packet->SetSsrc(kSsrc);
1981 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
1982 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1983}
1984
1985TEST_P(RtpSenderTest, TrySendPacketHandlesRetransmissionHistory) {
1986 rtp_sender_->SetStorePacketsStatus(true, 10);
1987
1988 // Build a media packet and send it.
1989 std::unique_ptr<RtpPacketToSend> packet =
1990 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1991 const uint16_t media_sequence_number = packet->SequenceNumber();
1992 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1993 packet->set_allow_retransmission(true);
1994 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1995
1996 // Simulate retransmission request.
1997 fake_clock_.AdvanceTimeMilliseconds(30);
1998 EXPECT_GT(rtp_sender_->ReSendPacket(media_sequence_number), 0);
1999
2000 // Packet already pending, retransmission not allowed.
2001 fake_clock_.AdvanceTimeMilliseconds(30);
2002 EXPECT_EQ(rtp_sender_->ReSendPacket(media_sequence_number), 0);
2003
2004 // Packet exiting pacer, mark as not longer pending.
2005 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2006 EXPECT_NE(packet->SequenceNumber(), media_sequence_number);
2007 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2008 packet->SetSsrc(kRtxSsrc);
2009 packet->set_retransmitted_sequence_number(media_sequence_number);
2010 packet->set_allow_retransmission(false);
2011 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2012
2013 // Retransmissions allowed again.
2014 fake_clock_.AdvanceTimeMilliseconds(30);
2015 EXPECT_GT(rtp_sender_->ReSendPacket(media_sequence_number), 0);
2016
2017 // Retransmission of RTX packet should not be allowed.
2018 EXPECT_EQ(rtp_sender_->ReSendPacket(packet->SequenceNumber()), 0);
2019}
2020
2021TEST_P(RtpSenderTest, TrySendPacketUpdatesExtensions) {
2022 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2023 kRtpExtensionTransmissionTimeOffset,
2024 kTransmissionTimeOffsetExtensionId),
2025 0);
2026 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2027 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId),
2028 0);
2029 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionVideoTiming,
2030 kVideoTimingExtensionId),
2031 0);
2032
2033 std::unique_ptr<RtpPacketToSend> packet =
2034 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2035 packet->set_packetization_finish_time_ms(fake_clock_.TimeInMilliseconds());
2036
2037 const int32_t kDiffMs = 10;
2038 fake_clock_.AdvanceTimeMilliseconds(kDiffMs);
2039
2040 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2041 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2042
2043 const RtpPacketReceived& received_packet = transport_.last_sent_packet();
2044
2045 EXPECT_EQ(received_packet.GetExtension<TransmissionOffset>(), kDiffMs * 90);
2046
2047 EXPECT_EQ(received_packet.GetExtension<AbsoluteSendTime>(),
2048 AbsoluteSendTime::MsTo24Bits(fake_clock_.TimeInMilliseconds()));
2049
2050 VideoSendTiming timing;
2051 EXPECT_TRUE(received_packet.GetExtension<VideoTimingExtension>(&timing));
2052 EXPECT_EQ(timing.pacer_exit_delta_ms, kDiffMs);
2053}
2054
2055TEST_P(RtpSenderTest, TrySendPacketSetsPacketOptions) {
2056 const uint16_t kPacketId = 42;
2057 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2058 kRtpExtensionTransportSequenceNumber,
2059 kTransportSequenceNumberExtensionId),
2060 0);
2061 std::unique_ptr<RtpPacketToSend> packet =
2062 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2063 packet->SetExtension<TransportSequenceNumber>(kPacketId);
2064
2065 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2066 EXPECT_CALL(send_packet_observer_, OnSendPacket);
2067 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2068
2069 EXPECT_EQ(transport_.last_options_.packet_id, kPacketId);
2070 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
2071 EXPECT_TRUE(transport_.last_options_.included_in_feedback);
2072 EXPECT_FALSE(transport_.last_options_.is_retransmit);
2073
2074 // Send another packet as retransmission, verify options are populated.
2075 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2076 packet->SetExtension<TransportSequenceNumber>(kPacketId + 1);
2077 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2078 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2079 EXPECT_TRUE(transport_.last_options_.is_retransmit);
2080}
2081
2082TEST_P(RtpSenderTest, TrySendPacketUpdatesStats) {
2083 const size_t kPayloadSize = 1000;
2084
2085 StrictMock<MockSendSideDelayObserver> send_side_delay_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02002086
2087 RtpRtcp::Configuration config;
2088 config.clock = &fake_clock_;
2089 config.outgoing_transport = &transport_;
2090 config.media_send_ssrc = kSsrc;
2091 config.rtx_send_ssrc = kRtxSsrc;
2092 config.flexfec_sender = &flexfec_sender_;
2093 config.send_side_delay_observer = &send_side_delay_observer;
2094 config.event_log = &mock_rtc_event_log_;
2095 config.send_packet_observer = &send_packet_observer_;
2096 rtp_sender_ = absl::make_unique<RTPSender>(config);
Erik Språng9c771c22019-06-17 16:31:53 +02002097 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
2098 kRtpExtensionTransportSequenceNumber,
2099 kTransportSequenceNumberExtensionId));
2100
2101 const int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
2102
2103 std::unique_ptr<RtpPacketToSend> video_packet =
2104 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2105 video_packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2106 video_packet->SetPayloadSize(kPayloadSize);
2107 video_packet->SetExtension<TransportSequenceNumber>(1);
2108
2109 std::unique_ptr<RtpPacketToSend> rtx_packet =
2110 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2111 rtx_packet->SetSsrc(kRtxSsrc);
2112 rtx_packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2113 rtx_packet->SetPayloadSize(kPayloadSize);
2114 rtx_packet->SetExtension<TransportSequenceNumber>(2);
2115
2116 std::unique_ptr<RtpPacketToSend> fec_packet =
2117 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2118 fec_packet->SetSsrc(kFlexFecSsrc);
2119 fec_packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2120 fec_packet->SetPayloadSize(kPayloadSize);
2121 fec_packet->SetExtension<TransportSequenceNumber>(3);
2122
2123 const int64_t kDiffMs = 25;
2124 fake_clock_.AdvanceTimeMilliseconds(kDiffMs);
2125
2126 EXPECT_CALL(send_side_delay_observer,
2127 SendSideDelayUpdated(kDiffMs, kDiffMs, kDiffMs, kSsrc));
2128 EXPECT_CALL(
2129 send_side_delay_observer,
2130 SendSideDelayUpdated(kDiffMs, kDiffMs, 2 * kDiffMs, kFlexFecSsrc));
2131
2132 EXPECT_CALL(send_packet_observer_, OnSendPacket(1, capture_time_ms, kSsrc));
2133 EXPECT_TRUE(
2134 rtp_sender_->TrySendPacket(video_packet.get(), PacedPacketInfo()));
2135
2136 // Send packet observer not called for padding/retransmissions.
2137 EXPECT_CALL(send_packet_observer_, OnSendPacket(2, _, _)).Times(0);
2138 EXPECT_TRUE(rtp_sender_->TrySendPacket(rtx_packet.get(), PacedPacketInfo()));
2139
2140 EXPECT_CALL(send_packet_observer_,
2141 OnSendPacket(3, capture_time_ms, kFlexFecSsrc));
2142 EXPECT_TRUE(rtp_sender_->TrySendPacket(fec_packet.get(), PacedPacketInfo()));
2143
2144 StreamDataCounters rtp_stats;
2145 StreamDataCounters rtx_stats;
2146 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
2147 EXPECT_EQ(rtp_stats.transmitted.packets, 2u);
2148 EXPECT_EQ(rtp_stats.fec.packets, 1u);
2149 EXPECT_EQ(rtx_stats.retransmitted.packets, 1u);
2150}
2151
Erik Språng478cb462019-06-26 15:49:27 +02002152TEST_P(RtpSenderTest, GeneratePaddingResendsOldPacketsWithRtx) {
2153 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2154 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
2155 rtp_sender_->SetStorePacketsStatus(true, 1);
2156
2157 const size_t kPayloadPacketSize = 1234;
2158 std::unique_ptr<RtpPacketToSend> packet =
2159 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2160 packet->set_allow_retransmission(true);
2161 packet->SetPayloadSize(kPayloadPacketSize);
2162 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2163
2164 // Send a dummy video packet so it ends up in the packet history.
2165 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2166
2167 // Generated padding has large enough budget that the video packet should be
2168 // retransmitted as padding.
2169 EXPECT_CALL(mock_paced_sender_,
2170 EnqueuePacket(AllOf(
2171 Pointee(Property(&RtpPacketToSend::packet_type,
2172 RtpPacketToSend::Type::kPadding)),
2173 Pointee(Property(&RtpPacketToSend::Ssrc, kRtxSsrc)),
2174 Pointee(Property(&RtpPacketToSend::payload_size,
2175 kPayloadPacketSize + kRtxHeaderSize)))))
2176 .Times(1);
2177 rtp_sender_->GeneratePadding(kPayloadPacketSize + kRtxHeaderSize);
2178
2179 // Not enough budged for payload padding, use plain padding instead.
2180 EXPECT_CALL(mock_paced_sender_,
2181 EnqueuePacket(AllOf(
2182 Pointee(Property(&RtpPacketToSend::packet_type,
2183 RtpPacketToSend::Type::kPadding)),
2184 Pointee(Property(&RtpPacketToSend::Ssrc, kRtxSsrc)),
2185 Pointee(Property(&RtpPacketToSend::payload_size, 0)),
2186 Pointee(Property(&RtpPacketToSend::padding_size, Gt(0u))))))
2187 .Times((kPayloadPacketSize + kMaxPaddingSize - 1) / kMaxPaddingSize);
2188 rtp_sender_->GeneratePadding(kPayloadPacketSize + kRtxHeaderSize - 1);
2189}
2190
2191TEST_P(RtpSenderTest, GeneratePaddingCreatesPurePaddingWithoutRtx) {
2192 rtp_sender_->SetStorePacketsStatus(true, 1);
2193
2194 const size_t kPayloadPacketSize = 1234;
2195 // Send a dummy video packet so it ends up in the packet history. Since we
2196 // are not using RTX, it should never be used as padding.
2197 std::unique_ptr<RtpPacketToSend> packet =
2198 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2199 packet->set_allow_retransmission(true);
2200 packet->SetPayloadSize(kPayloadPacketSize);
2201 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2202 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2203
2204 // Payload padding not available without RTX, only generate plain padding on
2205 // the media SSRC.
2206 // Number of padding packets is the requested padding size divided by max
2207 // padding packet size, rounded up. Pure padding packets are always of the
2208 // maximum size.
2209 const size_t kPaddingBytesRequested = kPayloadPacketSize + kRtxHeaderSize;
2210 const size_t kExpectedNumPaddingPackets =
2211 (kPaddingBytesRequested + kMaxPaddingSize - 1) / kMaxPaddingSize;
2212 size_t padding_bytes_sent = 0;
2213 EXPECT_CALL(mock_paced_sender_, EnqueuePacket)
2214 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet) {
2215 EXPECT_EQ(packet->packet_type(), RtpPacketToSend::Type::kPadding);
2216 EXPECT_EQ(packet->Ssrc(), kSsrc);
2217 EXPECT_EQ(packet->payload_size(), 0u);
2218 EXPECT_GT(packet->padding_size(), 0u);
2219 padding_bytes_sent += packet->padding_size();
2220 });
2221 rtp_sender_->GeneratePadding(kPaddingBytesRequested);
2222 EXPECT_EQ(padding_bytes_sent, kExpectedNumPaddingPackets * kMaxPaddingSize);
2223}
2224
Mirko Bonadeic84f6612019-01-31 12:20:57 +01002225INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
2226 RtpSenderTest,
2227 ::testing::Bool());
2228INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
2229 RtpSenderTestWithoutPacer,
2230 ::testing::Bool());
Niels Möllera34d7762019-02-01 14:13:29 +01002231
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +00002232} // namespace webrtc