blob: cebc813719b3f4acd47fea4edc9f702acf228f67 [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;
sprang168794c2017-07-06 04:38:06 -070081using ::testing::Invoke;
Erik Språng9c771c22019-06-17 16:31:53 +020082using ::testing::NiceMock;
Erik Språng214f5432019-06-20 15:09:58 +020083using ::testing::Return;
84using ::testing::SaveArg;
Danil Chapovalov84ffb352018-09-25 18:59:09 +020085using ::testing::SizeIs;
Erik Språng9c771c22019-06-17 16:31:53 +020086using ::testing::StrictMock;
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +000087
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +000088uint64_t ConvertMsToAbsSendTime(int64_t time_ms) {
Stefan Holmer0a87ffc2015-10-21 13:41:48 +020089 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +000090}
91
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +000092class LoopbackTransportTest : public webrtc::Transport {
93 public:
Petter Strandmark26bc6692018-05-29 08:43:35 +020094 LoopbackTransportTest() : total_bytes_sent_(0) {
danilchap12ba1862016-10-26 02:41:55 -070095 receivers_extensions_.Register(kRtpExtensionTransmissionTimeOffset,
96 kTransmissionTimeOffsetExtensionId);
97 receivers_extensions_.Register(kRtpExtensionAbsoluteSendTime,
98 kAbsoluteSendTimeExtensionId);
99 receivers_extensions_.Register(kRtpExtensionTransportSequenceNumber,
100 kTransportSequenceNumberExtensionId);
101 receivers_extensions_.Register(kRtpExtensionVideoRotation,
102 kVideoRotationExtensionId);
103 receivers_extensions_.Register(kRtpExtensionAudioLevel,
104 kAudioLevelExtensionId);
ilnik04f4d122017-06-19 07:18:55 -0700105 receivers_extensions_.Register(kRtpExtensionVideoTiming,
106 kVideoTimingExtensionId);
Steve Anton296a0ce2018-03-22 15:17:27 -0700107 receivers_extensions_.Register(kRtpExtensionMid, kMidExtensionId);
Elad Alonccb9b752019-02-19 13:01:31 +0100108 receivers_extensions_.Register(kRtpExtensionGenericFrameDescriptor00,
109 kGenericDescriptorId00);
110 receivers_extensions_.Register(kRtpExtensionGenericFrameDescriptor01,
111 kGenericDescriptorId01);
Amit Hilbuch77938e62018-12-21 09:23:38 -0800112 receivers_extensions_.Register(kRtpExtensionRtpStreamId, kRidExtensionId);
113 receivers_extensions_.Register(kRtpExtensionRepairedRtpStreamId,
114 kRepairedRidExtensionId);
guoweis@webrtc.org45362892015-03-04 22:55:15 +0000115 }
danilchap12ba1862016-10-26 02:41:55 -0700116
stefan1d8a5062015-10-02 03:39:33 -0700117 bool SendRtp(const uint8_t* data,
118 size_t len,
119 const PacketOptions& options) override {
Petter Strandmark26bc6692018-05-29 08:43:35 +0200120 last_options_ = options;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000121 total_bytes_sent_ += len;
danilchap12ba1862016-10-26 02:41:55 -0700122 sent_packets_.push_back(RtpPacketReceived(&receivers_extensions_));
123 EXPECT_TRUE(sent_packets_.back().Parse(data, len));
pbos2d566682015-09-28 09:59:31 -0700124 return true;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000125 }
danilchap162abd32015-12-10 02:39:40 -0800126 bool SendRtcp(const uint8_t* data, size_t len) override { return false; }
danilchap12ba1862016-10-26 02:41:55 -0700127 const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); }
128 int packets_sent() { return sent_packets_.size(); }
129
pbos@webrtc.org72491b92014-07-10 16:24:54 +0000130 size_t total_bytes_sent_;
Petter Strandmark26bc6692018-05-29 08:43:35 +0200131 PacketOptions last_options_;
danilchap12ba1862016-10-26 02:41:55 -0700132 std::vector<RtpPacketReceived> sent_packets_;
133
134 private:
135 RtpHeaderExtensionMap receivers_extensions_;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000136};
137
Elad Alon4a87e1c2017-10-03 16:11:34 +0200138MATCHER_P(SameRtcEventTypeAs, value, "") {
139 return value == arg->GetType();
140}
141
guoweis@webrtc.org45362892015-03-04 22:55:15 +0000142} // namespace
143
Erik Språng59b86542019-06-23 18:24:46 +0200144class MockRtpPacketPacer : public RtpPacketPacer {
sprangebbf8a82015-09-21 15:11:14 -0700145 public:
Erik Språng59b86542019-06-23 18:24:46 +0200146 MockRtpPacketPacer() {}
147 virtual ~MockRtpPacketPacer() {}
148
149 MOCK_METHOD1(EnqueuePacket, void(std::unique_ptr<RtpPacketToSend>));
sprangebbf8a82015-09-21 15:11:14 -0700150
Peter Boströme23e7372015-10-08 11:44:14 +0200151 MOCK_METHOD6(InsertPacket,
152 void(Priority priority,
sprangebbf8a82015-09-21 15:11:14 -0700153 uint32_t ssrc,
154 uint16_t sequence_number,
155 int64_t capture_time_ms,
156 size_t bytes,
157 bool retransmission));
158};
159
Stefan Holmerf5dca482016-01-27 12:58:51 +0100160class MockTransportSequenceNumberAllocator
161 : public TransportSequenceNumberAllocator {
162 public:
163 MOCK_METHOD0(AllocateSequenceNumber, uint16_t());
164};
165
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200166class MockSendSideDelayObserver : public SendSideDelayObserver {
167 public:
Henrik Boström9fe18342019-05-16 18:38:20 +0200168 MOCK_METHOD4(SendSideDelayUpdated, void(int, int, uint64_t, uint32_t));
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200169};
170
asapersson35151f32016-05-02 23:44:01 -0700171class MockSendPacketObserver : public SendPacketObserver {
172 public:
173 MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t));
174};
175
Stefan Holmera246cfb2016-08-23 17:51:42 +0200176class MockTransportFeedbackObserver : public TransportFeedbackObserver {
177 public:
Erik Språng30a276b2019-04-23 12:00:11 +0200178 MOCK_METHOD1(OnAddPacket, void(const RtpPacketSendInfo&));
Stefan Holmera246cfb2016-08-23 17:51:42 +0200179 MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&));
elad.alonf9490002017-03-06 05:32:21 -0800180 MOCK_CONST_METHOD0(GetTransportFeedbackVector, std::vector<PacketFeedback>());
Stefan Holmera246cfb2016-08-23 17:51:42 +0200181};
182
minyue3a407ee2017-04-03 01:10:33 -0700183class MockOverheadObserver : public OverheadObserver {
184 public:
185 MOCK_METHOD1(OnOverheadChanged, void(size_t overhead_bytes_per_packet));
186};
187
188class RtpSenderTest : public ::testing::TestWithParam<bool> {
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000189 protected:
190 RtpSenderTest()
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000191 : fake_clock_(kStartTime),
terelius429c3452016-01-21 05:42:04 -0800192 mock_rtc_event_log_(),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000193 mock_paced_sender_(),
sprangcd349d92016-07-13 09:11:28 -0700194 retransmission_rate_limiter_(&fake_clock_, 1000),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000195 rtp_sender_(),
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000196 transport_(),
minyue3a407ee2017-04-03 01:10:33 -0700197 kMarkerBit(true),
198 field_trials_(GetParam() ? "WebRTC-SendSideBwe-WithOverhead/Enabled/"
199 : "") {}
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000200
Erik Språng7b52f102018-02-07 14:37:37 +0100201 void SetUp() override { SetUpRtpSender(true, false); }
Peter Boströme23e7372015-10-08 11:44:14 +0200202
Erik Språng7b52f102018-02-07 14:37:37 +0100203 void SetUpRtpSender(bool pacer, bool populate_network2) {
asapersson35151f32016-05-02 23:44:01 -0700204 rtp_sender_.reset(new RTPSender(
205 false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr,
Erik Språng9c771c22019-06-17 16:31:53 +0200206 kFlexFecSsrc, &seq_num_allocator_, nullptr, nullptr, nullptr,
sprangcd349d92016-07-13 09:11:28 -0700207 &mock_rtc_event_log_, &send_packet_observer_,
Benjamin Wright192eeec2018-10-17 17:27:25 -0700208 &retransmission_rate_limiter_, nullptr, populate_network2, nullptr,
Per Kjellandere11b7d22019-02-21 07:55:59 +0100209 false, false, FieldTrialBasedConfig()));
brandtr9dfff292016-11-14 05:14:50 -0800210 rtp_sender_->SetSequenceNumber(kSeqNum);
danilchap71fead22016-08-18 02:01:49 -0700211 rtp_sender_->SetTimestampOffset(0);
brandtr9dfff292016-11-14 05:14:50 -0800212 rtp_sender_->SetSSRC(kSsrc);
Erik Språng9c771c22019-06-17 16:31:53 +0200213 rtp_sender_->SetRtxSsrc(kRtxSsrc);
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000214 }
215
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000216 SimulatedClock fake_clock_;
Erik Språng9c771c22019-06-17 16:31:53 +0200217 NiceMock<MockRtcEventLog> mock_rtc_event_log_;
Erik Språng59b86542019-06-23 18:24:46 +0200218 MockRtpPacketPacer mock_paced_sender_;
Erik Språng9c771c22019-06-17 16:31:53 +0200219 StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_;
220 StrictMock<MockSendPacketObserver> send_packet_observer_;
221 StrictMock<MockTransportFeedbackObserver> feedback_observer_;
sprangcd349d92016-07-13 09:11:28 -0700222 RateLimiter retransmission_rate_limiter_;
kwiberg84be5112016-04-27 01:19:58 -0700223 std::unique_ptr<RTPSender> rtp_sender_;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000224 LoopbackTransportTest transport_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000225 const bool kMarkerBit;
minyue3a407ee2017-04-03 01:10:33 -0700226 test::ScopedFieldTrials field_trials_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000227
danilchapb6f1fb52016-10-19 06:11:39 -0700228 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
229 bool marker_bit,
230 uint32_t timestamp,
231 int64_t capture_time_ms) {
232 auto packet = rtp_sender_->AllocatePacket();
233 packet->SetPayloadType(payload_type);
234 packet->SetMarker(marker_bit);
235 packet->SetTimestamp(timestamp);
236 packet->set_capture_time_ms(capture_time_ms);
237 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
238 return packet;
239 }
240
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000241 void SendPacket(int64_t capture_time_ms, int payload_length) {
242 uint32_t timestamp = capture_time_ms * 90;
danilchapb6f1fb52016-10-19 06:11:39 -0700243 auto packet =
244 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
245 packet->AllocatePayload(payload_length);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000246
247 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700248 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
249 kAllowRetransmission,
250 RtpPacketSender::kNormalPriority));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000251 }
asapersson35151f32016-05-02 23:44:01 -0700252
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100253 void SendGenericPacket() {
asapersson35151f32016-05-02 23:44:01 -0700254 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100255 SendPacket(kCaptureTimeMs, sizeof(kPayloadData));
asapersson35151f32016-05-02 23:44:01 -0700256 }
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000257};
258
Peter Boströme23e7372015-10-08 11:44:14 +0200259// TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our
260// default code path.
261class RtpSenderTestWithoutPacer : public RtpSenderTest {
262 public:
Erik Språng7b52f102018-02-07 14:37:37 +0100263 void SetUp() override { SetUpRtpSender(false, false); }
Peter Boströme23e7372015-10-08 11:44:14 +0200264};
265
minyue3a407ee2017-04-03 01:10:33 -0700266TEST_P(RtpSenderTestWithoutPacer, AllocatePacketSetCsrc) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200267 // Configure rtp_sender with csrc.
268 std::vector<uint32_t> csrcs;
269 csrcs.push_back(0x23456789);
270 rtp_sender_->SetCsrcs(csrcs);
271
272 auto packet = rtp_sender_->AllocatePacket();
273
274 ASSERT_TRUE(packet);
275 EXPECT_EQ(rtp_sender_->SSRC(), packet->Ssrc());
276 EXPECT_EQ(csrcs, packet->Csrcs());
277}
278
minyue3a407ee2017-04-03 01:10:33 -0700279TEST_P(RtpSenderTestWithoutPacer, AllocatePacketReserveExtensions) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200280 // Configure rtp_sender with extensions.
281 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
282 kRtpExtensionTransmissionTimeOffset,
283 kTransmissionTimeOffsetExtensionId));
284 ASSERT_EQ(
285 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
286 kAbsoluteSendTimeExtensionId));
287 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
288 kAudioLevelExtensionId));
289 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
290 kRtpExtensionTransportSequenceNumber,
291 kTransportSequenceNumberExtensionId));
292 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
293 kRtpExtensionVideoRotation, kVideoRotationExtensionId));
294
295 auto packet = rtp_sender_->AllocatePacket();
296
297 ASSERT_TRUE(packet);
298 // Preallocate BWE extensions RtpSender set itself.
299 EXPECT_TRUE(packet->HasExtension<TransmissionOffset>());
300 EXPECT_TRUE(packet->HasExtension<AbsoluteSendTime>());
301 EXPECT_TRUE(packet->HasExtension<TransportSequenceNumber>());
302 // Do not allocate media specific extensions.
303 EXPECT_FALSE(packet->HasExtension<AudioLevel>());
304 EXPECT_FALSE(packet->HasExtension<VideoOrientation>());
305}
306
minyue3a407ee2017-04-03 01:10:33 -0700307TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberAdvanceSequenceNumber) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200308 auto packet = rtp_sender_->AllocatePacket();
309 ASSERT_TRUE(packet);
310 const uint16_t sequence_number = rtp_sender_->SequenceNumber();
311
312 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
313
314 EXPECT_EQ(sequence_number, packet->SequenceNumber());
315 EXPECT_EQ(sequence_number + 1, rtp_sender_->SequenceNumber());
316}
317
minyue3a407ee2017-04-03 01:10:33 -0700318TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberFailsOnNotSending) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200319 auto packet = rtp_sender_->AllocatePacket();
320 ASSERT_TRUE(packet);
321
322 rtp_sender_->SetSendingMediaStatus(false);
323 EXPECT_FALSE(rtp_sender_->AssignSequenceNumber(packet.get()));
324}
325
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100326TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberMayAllowPaddingOnVideo) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200327 constexpr size_t kPaddingSize = 100;
328 auto packet = rtp_sender_->AllocatePacket();
329 ASSERT_TRUE(packet);
330
philipel8aadd502017-02-23 02:56:13 -0800331 ASSERT_FALSE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200332 packet->SetMarker(false);
333 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100334 // Packet without marker bit doesn't allow padding on video stream.
philipel8aadd502017-02-23 02:56:13 -0800335 EXPECT_FALSE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200336
337 packet->SetMarker(true);
338 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
339 // Packet with marker bit allows send padding.
philipel8aadd502017-02-23 02:56:13 -0800340 EXPECT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200341}
342
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100343TEST_P(RtpSenderTest, AssignSequenceNumberAllowsPaddingOnAudio) {
344 MockTransport transport;
345 const bool kEnableAudio = true;
346 rtp_sender_.reset(new RTPSender(
Niels Möller59ab1cf2019-02-06 22:48:11 +0100347 kEnableAudio, &fake_clock_, &transport, &mock_paced_sender_,
348 absl::nullopt, nullptr, nullptr, nullptr, nullptr, &mock_rtc_event_log_,
349 nullptr, &retransmission_rate_limiter_, nullptr, false, nullptr, false,
Per Kjellandere11b7d22019-02-21 07:55:59 +0100350 false, FieldTrialBasedConfig()));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100351 rtp_sender_->SetTimestampOffset(0);
352 rtp_sender_->SetSSRC(kSsrc);
353
354 std::unique_ptr<RtpPacketToSend> audio_packet = rtp_sender_->AllocatePacket();
355 // Padding on audio stream allowed regardless of marker in the last packet.
356 audio_packet->SetMarker(false);
357 audio_packet->SetPayloadType(kPayload);
358 rtp_sender_->AssignSequenceNumber(audio_packet.get());
359
360 const size_t kPaddingSize = 59;
361 EXPECT_CALL(transport, SendRtp(_, kPaddingSize + kRtpHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +0200362 .WillOnce(Return(true));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100363 EXPECT_EQ(kPaddingSize,
364 rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
365
366 // Requested padding size is too small, will send a larger one.
367 const size_t kMinPaddingSize = 50;
368 EXPECT_CALL(transport, SendRtp(_, kMinPaddingSize + kRtpHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +0200369 .WillOnce(Return(true));
Yves Gerey665174f2018-06-19 15:03:05 +0200370 EXPECT_EQ(kMinPaddingSize, rtp_sender_->TimeToSendPadding(kMinPaddingSize - 5,
371 PacedPacketInfo()));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100372}
373
minyue3a407ee2017-04-03 01:10:33 -0700374TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberSetPaddingTimestamps) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200375 constexpr size_t kPaddingSize = 100;
376 auto packet = rtp_sender_->AllocatePacket();
377 ASSERT_TRUE(packet);
378 packet->SetMarker(true);
379 packet->SetTimestamp(kTimestamp);
380
381 ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
philipel8aadd502017-02-23 02:56:13 -0800382 ASSERT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200383
384 ASSERT_EQ(1u, transport_.sent_packets_.size());
danilchap12ba1862016-10-26 02:41:55 -0700385 // Verify padding packet timestamp.
386 EXPECT_EQ(kTimestamp, transport_.last_sent_packet().Timestamp());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200387}
388
minyue3a407ee2017-04-03 01:10:33 -0700389TEST_P(RtpSenderTestWithoutPacer,
390 TransportFeedbackObserverGetsCorrectByteCount) {
391 constexpr int kRtpOverheadBytesPerPacket = 12 + 8;
Erik Språng9c771c22019-06-17 16:31:53 +0200392 NiceMock<MockOverheadObserver> mock_overhead_observer;
Per Kjellandere11b7d22019-02-21 07:55:59 +0100393 rtp_sender_.reset(
394 new RTPSender(false, &fake_clock_, &transport_, nullptr, absl::nullopt,
395 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr,
396 &mock_rtc_event_log_, nullptr,
397 &retransmission_rate_limiter_, &mock_overhead_observer,
398 false, nullptr, false, false, FieldTrialBasedConfig()));
minyue3a407ee2017-04-03 01:10:33 -0700399 rtp_sender_->SetSSRC(kSsrc);
400 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
401 kRtpExtensionTransportSequenceNumber,
402 kTransportSequenceNumberExtensionId));
403 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200404 .WillOnce(Return(kTransportSequenceNumber));
minyue3a407ee2017-04-03 01:10:33 -0700405
406 const size_t expected_bytes =
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100407 GetParam() ? sizeof(kPayloadData) + kRtpOverheadBytesPerPacket
408 : sizeof(kPayloadData);
minyue3a407ee2017-04-03 01:10:33 -0700409
410 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200411 OnAddPacket(AllOf(
412 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
413 Field(&RtpPacketSendInfo::transport_sequence_number,
414 kTransportSequenceNumber),
415 Field(&RtpPacketSendInfo::rtp_sequence_number,
416 rtp_sender_->SequenceNumber()),
417 Field(&RtpPacketSendInfo::length, expected_bytes),
418 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
minyue3a407ee2017-04-03 01:10:33 -0700419 .Times(1);
420 EXPECT_CALL(mock_overhead_observer,
421 OnOverheadChanged(kRtpOverheadBytesPerPacket))
422 .Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100423 SendGenericPacket();
minyue3a407ee2017-04-03 01:10:33 -0700424}
425
426TEST_P(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) {
Per Kjellandere11b7d22019-02-21 07:55:59 +0100427 rtp_sender_.reset(
428 new RTPSender(false, &fake_clock_, &transport_, nullptr, absl::nullopt,
429 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr,
430 &mock_rtc_event_log_, &send_packet_observer_,
431 &retransmission_rate_limiter_, nullptr, false, nullptr,
432 false, false, FieldTrialBasedConfig()));
nisse7d59f6b2017-02-21 03:40:24 -0800433 rtp_sender_->SetSSRC(kSsrc);
Stefan Holmerf5dca482016-01-27 12:58:51 +0100434 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
435 kRtpExtensionTransportSequenceNumber,
436 kTransportSequenceNumberExtensionId));
437
Stefan Holmerf5dca482016-01-27 12:58:51 +0100438 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200439 .WillOnce(Return(kTransportSequenceNumber));
asapersson35151f32016-05-02 23:44:01 -0700440 EXPECT_CALL(send_packet_observer_,
441 OnSendPacket(kTransportSequenceNumber, _, _))
442 .Times(1);
minyue3a407ee2017-04-03 01:10:33 -0700443
444 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200445 OnAddPacket(AllOf(
446 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
447 Field(&RtpPacketSendInfo::transport_sequence_number,
448 kTransportSequenceNumber),
449 Field(&RtpPacketSendInfo::rtp_sequence_number,
450 rtp_sender_->SequenceNumber()),
451 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
Stefan Holmera246cfb2016-08-23 17:51:42 +0200452 .Times(1);
asapersson35151f32016-05-02 23:44:01 -0700453
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100454 SendGenericPacket();
Stefan Holmerf5dca482016-01-27 12:58:51 +0100455
danilchap12ba1862016-10-26 02:41:55 -0700456 const auto& packet = transport_.last_sent_packet();
457 uint16_t transport_seq_no;
458 ASSERT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
459 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200460 EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200461 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200462}
463
464TEST_P(RtpSenderTestWithoutPacer, PacketOptionsNoRetransmission) {
Per Kjellandere11b7d22019-02-21 07:55:59 +0100465 rtp_sender_.reset(
466 new RTPSender(false, &fake_clock_, &transport_, nullptr, absl::nullopt,
467 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr,
468 &mock_rtc_event_log_, &send_packet_observer_,
469 &retransmission_rate_limiter_, nullptr, false, nullptr,
470 false, false, FieldTrialBasedConfig()));
Petter Strandmark26bc6692018-05-29 08:43:35 +0200471 rtp_sender_->SetSSRC(kSsrc);
472
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100473 SendGenericPacket();
Petter Strandmark26bc6692018-05-29 08:43:35 +0200474
475 EXPECT_FALSE(transport_.last_options_.is_retransmit);
Stefan Holmerf5dca482016-01-27 12:58:51 +0100476}
477
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200478TEST_P(RtpSenderTestWithoutPacer,
479 SetsIncludedInFeedbackWhenTransportSequenceNumberExtensionIsRegistered) {
480 SetUpRtpSender(false, false);
481 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
482 kTransportSequenceNumberExtensionId);
483 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200484 .WillOnce(Return(kTransportSequenceNumber));
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200485 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100486 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200487 EXPECT_TRUE(transport_.last_options_.included_in_feedback);
488}
489
490TEST_P(
491 RtpSenderTestWithoutPacer,
492 SetsIncludedInAllocationWhenTransportSequenceNumberExtensionIsRegistered) {
493 SetUpRtpSender(false, false);
494 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
495 kTransportSequenceNumberExtensionId);
496 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200497 .WillOnce(Return(kTransportSequenceNumber));
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200498 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100499 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200500 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
501}
502
503TEST_P(RtpSenderTestWithoutPacer,
504 SetsIncludedInAllocationWhenForcedAsPartOfAllocation) {
505 SetUpRtpSender(false, false);
506 rtp_sender_->SetAsPartOfAllocation(true);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100507 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200508 EXPECT_FALSE(transport_.last_options_.included_in_feedback);
509 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
510}
511
512TEST_P(RtpSenderTestWithoutPacer, DoesnSetIncludedInAllocationByDefault) {
513 SetUpRtpSender(false, false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100514 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200515 EXPECT_FALSE(transport_.last_options_.included_in_feedback);
516 EXPECT_FALSE(transport_.last_options_.included_in_allocation);
stefana23fc622016-07-28 07:56:38 -0700517}
asapersson35151f32016-05-02 23:44:01 -0700518
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200519TEST_P(RtpSenderTestWithoutPacer, OnSendSideDelayUpdated) {
Erik Språng9c771c22019-06-17 16:31:53 +0200520 StrictMock<MockSendSideDelayObserver> send_side_delay_observer_;
Per Kjellandere11b7d22019-02-21 07:55:59 +0100521 rtp_sender_.reset(
522 new RTPSender(false, &fake_clock_, &transport_, nullptr, absl::nullopt,
523 nullptr, nullptr, nullptr, &send_side_delay_observer_,
524 &mock_rtc_event_log_, nullptr, nullptr, nullptr, false,
525 nullptr, false, false, FieldTrialBasedConfig()));
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200526 rtp_sender_->SetSSRC(kSsrc);
Niels Möller5fe95102019-03-04 16:49:25 +0100527 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100528 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +0200529 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +0100530 FieldTrialBasedConfig());
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200531
532 const uint8_t kPayloadType = 127;
Niels Möller8a40edd2019-01-24 18:04:44 +0100533 const char payload_name[] = "GENERIC";
Niels Möller59ab1cf2019-02-06 22:48:11 +0100534
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +0200535 rtp_sender_video.RegisterPayloadType(kPayloadType, payload_name,
536 /*raw_payload=*/false);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100537
538 const uint32_t kCaptureTimeMsToRtpTimestamp = 90; // 90 kHz clock
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200539 RTPVideoHeader video_header;
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200540
Henrik Boström9fe18342019-05-16 18:38:20 +0200541 // Send packet with 10 ms send-side delay. The average, max and total should
542 // be 10 ms.
543 EXPECT_CALL(send_side_delay_observer_,
544 SendSideDelayUpdated(10, 10, 10, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200545 .Times(1);
546 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
547 fake_clock_.AdvanceTimeMilliseconds(10);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100548 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100549 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200550 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100551 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200552 kDefaultExpectedRetransmissionTimeMs));
553
Henrik Boström9fe18342019-05-16 18:38:20 +0200554 // Send another packet with 20 ms delay. The average, max and total should be
555 // 15, 20 and 30 ms respectively.
556 EXPECT_CALL(send_side_delay_observer_,
557 SendSideDelayUpdated(15, 20, 30, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200558 .Times(1);
559 fake_clock_.AdvanceTimeMilliseconds(10);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100560 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100561 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200562 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100563 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200564 kDefaultExpectedRetransmissionTimeMs));
565
566 // Send another packet at the same time, which replaces the last packet.
567 // 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 +0200568 // The total counter stays the same though.
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200569 // TODO(terelius): Is is not clear that this is the right behavior.
Henrik Boström9fe18342019-05-16 18:38:20 +0200570 EXPECT_CALL(send_side_delay_observer_, SendSideDelayUpdated(5, 10, 30, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200571 .Times(1);
572 capture_time_ms = fake_clock_.TimeInMilliseconds();
Niels Möller59ab1cf2019-02-06 22:48:11 +0100573 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100574 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200575 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100576 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200577 kDefaultExpectedRetransmissionTimeMs));
578
579 // Send a packet 1 second later. The earlier packets should have timed
Henrik Boström9fe18342019-05-16 18:38:20 +0200580 // out, so both max and average should be the delay of this packet. The total
581 // keeps increasing.
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200582 fake_clock_.AdvanceTimeMilliseconds(1000);
583 capture_time_ms = fake_clock_.TimeInMilliseconds();
584 fake_clock_.AdvanceTimeMilliseconds(1);
Henrik Boström9fe18342019-05-16 18:38:20 +0200585 EXPECT_CALL(send_side_delay_observer_, SendSideDelayUpdated(1, 1, 31, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200586 .Times(1);
Niels Möller59ab1cf2019-02-06 22:48:11 +0100587 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +0100588 VideoFrameType::kVideoFrameKey, kPayloadType,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200589 capture_time_ms * kCaptureTimeMsToRtpTimestamp, capture_time_ms,
Niels Möller59ab1cf2019-02-06 22:48:11 +0100590 kPayloadData, sizeof(kPayloadData), nullptr, &video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200591 kDefaultExpectedRetransmissionTimeMs));
592}
593
minyue3a407ee2017-04-03 01:10:33 -0700594TEST_P(RtpSenderTestWithoutPacer, OnSendPacketUpdated) {
stefana23fc622016-07-28 07:56:38 -0700595 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
596 kRtpExtensionTransportSequenceNumber,
597 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -0700598 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200599 .WillOnce(Return(kTransportSequenceNumber));
asapersson35151f32016-05-02 23:44:01 -0700600 EXPECT_CALL(send_packet_observer_,
601 OnSendPacket(kTransportSequenceNumber, _, _))
602 .Times(1);
603
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100604 SendGenericPacket();
asapersson35151f32016-05-02 23:44:01 -0700605}
606
minyue3a407ee2017-04-03 01:10:33 -0700607TEST_P(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) {
michaelt4da30442016-11-17 01:38:43 -0800608 rtp_sender_.reset(new RTPSender(
Niels Möller59ab1cf2019-02-06 22:48:11 +0100609 false, &fake_clock_, &transport_, &mock_paced_sender_, absl::nullopt,
Niels Möller949f0fd2019-01-29 09:44:24 +0100610 &seq_num_allocator_, &feedback_observer_, nullptr, nullptr,
michaelt4da30442016-11-17 01:38:43 -0800611 &mock_rtc_event_log_, &send_packet_observer_,
Per Kjellandere11b7d22019-02-21 07:55:59 +0100612 &retransmission_rate_limiter_, nullptr, false, nullptr, false, false,
613 FieldTrialBasedConfig()));
brandtr9dfff292016-11-14 05:14:50 -0800614 rtp_sender_->SetSequenceNumber(kSeqNum);
615 rtp_sender_->SetSSRC(kSsrc);
Stefan Holmera246cfb2016-08-23 17:51:42 +0200616 rtp_sender_->SetStorePacketsStatus(true, 10);
617 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
618 kRtpExtensionTransportSequenceNumber,
619 kTransportSequenceNumberExtensionId));
620
brandtr9dfff292016-11-14 05:14:50 -0800621 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
Stefan Holmera246cfb2016-08-23 17:51:42 +0200622 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200623 .WillOnce(Return(kTransportSequenceNumber));
Stefan Holmera246cfb2016-08-23 17:51:42 +0200624 EXPECT_CALL(send_packet_observer_,
625 OnSendPacket(kTransportSequenceNumber, _, _))
626 .Times(1);
minyue3a407ee2017-04-03 01:10:33 -0700627 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200628 OnAddPacket(AllOf(
629 Field(&RtpPacketSendInfo::ssrc, rtp_sender_->SSRC()),
630 Field(&RtpPacketSendInfo::transport_sequence_number,
631 kTransportSequenceNumber),
632 Field(&RtpPacketSendInfo::rtp_sequence_number,
633 rtp_sender_->SequenceNumber()),
634 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
Stefan Holmera246cfb2016-08-23 17:51:42 +0200635 .Times(1);
636
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100637 SendGenericPacket();
philipel8aadd502017-02-23 02:56:13 -0800638 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
639 fake_clock_.TimeInMilliseconds(), false,
640 PacedPacketInfo());
Stefan Holmera246cfb2016-08-23 17:51:42 +0200641
danilchap12ba1862016-10-26 02:41:55 -0700642 const auto& packet = transport_.last_sent_packet();
643 uint16_t transport_seq_no;
644 EXPECT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
645 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200646 EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
Stefan Holmera246cfb2016-08-23 17:51:42 +0200647}
648
Erik Språng7b52f102018-02-07 14:37:37 +0100649TEST_P(RtpSenderTest, WritesPacerExitToTimingExtension) {
ilnik04f4d122017-06-19 07:18:55 -0700650 rtp_sender_->SetStorePacketsStatus(true, 10);
651 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
652 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
653 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
654 auto packet = rtp_sender_->AllocatePacket();
655 packet->SetPayloadType(kPayload);
656 packet->SetMarker(true);
657 packet->SetTimestamp(kTimestamp);
658 packet->set_capture_time_ms(capture_time_ms);
ilnik2edc6842017-07-06 03:06:50 -0700659 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
ilnik04f4d122017-06-19 07:18:55 -0700660 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
661 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
662 size_t packet_size = packet->size();
ilnik04f4d122017-06-19 07:18:55 -0700663
664 const int kStoredTimeInMs = 100;
Erik Språng7b52f102018-02-07 14:37:37 +0100665 {
666 EXPECT_CALL(
667 mock_paced_sender_,
668 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _));
669 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
670 kAllowRetransmission,
671 RtpPacketSender::kNormalPriority));
672 }
ilnik04f4d122017-06-19 07:18:55 -0700673 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
Erik Språng7b52f102018-02-07 14:37:37 +0100674 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
675 PacedPacketInfo());
ilnik04f4d122017-06-19 07:18:55 -0700676 EXPECT_EQ(1, transport_.packets_sent());
677 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
678
danilchapce251812017-09-11 12:24:41 -0700679 VideoSendTiming video_timing;
680 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
681 &video_timing));
682 EXPECT_EQ(kStoredTimeInMs, video_timing.pacer_exit_delta_ms);
Erik Språng7b52f102018-02-07 14:37:37 +0100683}
ilnik04f4d122017-06-19 07:18:55 -0700684
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100685TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithPacer) {
686 SetUpRtpSender(/*pacer=*/true, /*populate_network2=*/true);
Erik Språng7b52f102018-02-07 14:37:37 +0100687 rtp_sender_->SetStorePacketsStatus(true, 10);
688 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
689 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
690 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
691 auto packet = rtp_sender_->AllocatePacket();
692 packet->SetPayloadType(kPayload);
693 packet->SetMarker(true);
694 packet->SetTimestamp(kTimestamp);
695 packet->set_capture_time_ms(capture_time_ms);
696 const uint16_t kPacerExitMs = 1234u;
697 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, kPacerExitMs, 0u, 0u, true};
698 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
699 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
700 size_t packet_size = packet->size();
701
702 const int kStoredTimeInMs = 100;
703 {
704 EXPECT_CALL(
705 mock_paced_sender_,
706 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _));
707 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
708 kAllowRetransmission,
709 RtpPacketSender::kNormalPriority));
710 }
ilnik04f4d122017-06-19 07:18:55 -0700711 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
712 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
713 PacedPacketInfo());
Erik Språng7b52f102018-02-07 14:37:37 +0100714 EXPECT_EQ(1, transport_.packets_sent());
ilnik04f4d122017-06-19 07:18:55 -0700715 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
716
Erik Språng7b52f102018-02-07 14:37:37 +0100717 VideoSendTiming video_timing;
danilchapce251812017-09-11 12:24:41 -0700718 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
719 &video_timing));
Erik Språng7b52f102018-02-07 14:37:37 +0100720 EXPECT_EQ(kStoredTimeInMs, video_timing.network2_timestamp_delta_ms);
721 EXPECT_EQ(kPacerExitMs, video_timing.pacer_exit_delta_ms);
ilnik04f4d122017-06-19 07:18:55 -0700722}
723
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100724TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithoutPacer) {
725 SetUpRtpSender(/*pacer=*/false, /*populate_network2=*/true);
726 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
727 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
728 auto packet = rtp_sender_->AllocatePacket();
729 packet->SetMarker(true);
730 packet->set_capture_time_ms(fake_clock_.TimeInMilliseconds());
731 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
732 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
733 EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
734
735 const int kPropagateTimeMs = 10;
736 fake_clock_.AdvanceTimeMilliseconds(kPropagateTimeMs);
737
738 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
739 kAllowRetransmission,
740 RtpPacketSender::kNormalPriority));
741
742 EXPECT_EQ(1, transport_.packets_sent());
743 absl::optional<VideoSendTiming> video_timing =
744 transport_.last_sent_packet().GetExtension<VideoTimingExtension>();
745 ASSERT_TRUE(video_timing);
746 EXPECT_EQ(kPropagateTimeMs, video_timing->network2_timestamp_delta_ms);
747}
748
minyue3a407ee2017-04-03 01:10:33 -0700749TEST_P(RtpSenderTest, TrafficSmoothingWithExtensions) {
Peter Boströme23e7372015-10-08 11:44:14 +0200750 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
brandtr9dfff292016-11-14 05:14:50 -0800751 kSsrc, kSeqNum, _, _, _));
Elad Alon4a87e1c2017-10-03 16:11:34 +0200752 EXPECT_CALL(mock_rtc_event_log_,
753 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000754
pwestin@webrtc.orgc66e8b32012-11-07 17:01:04 +0000755 rtp_sender_->SetStorePacketsStatus(true, 10);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000756 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800757 kRtpExtensionTransmissionTimeOffset,
758 kTransmissionTimeOffsetExtensionId));
759 EXPECT_EQ(
760 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
761 kAbsoluteSendTimeExtensionId));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000762 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700763 auto packet =
764 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
765 size_t packet_size = packet->size();
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000766
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000767 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700768 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
769 kAllowRetransmission,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700770 RtpPacketSender::kNormalPriority));
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000771
danilchap12ba1862016-10-26 02:41:55 -0700772 EXPECT_EQ(0, transport_.packets_sent());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000773
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000774 const int kStoredTimeInMs = 100;
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000775 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000776
brandtr9dfff292016-11-14 05:14:50 -0800777 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -0800778 PacedPacketInfo());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000779
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000780 // Process send bucket. Packet should now be sent.
danilchap12ba1862016-10-26 02:41:55 -0700781 EXPECT_EQ(1, transport_.packets_sent());
782 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
783
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +0000784 webrtc::RTPHeader rtp_header;
danilchap12ba1862016-10-26 02:41:55 -0700785 transport_.last_sent_packet().GetHeader(&rtp_header);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000786
787 // Verify transmission time offset.
788 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000789 uint64_t expected_send_time =
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000790 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000791 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000792}
793
minyue3a407ee2017-04-03 01:10:33 -0700794TEST_P(RtpSenderTest, TrafficSmoothingRetransmits) {
Peter Boströme23e7372015-10-08 11:44:14 +0200795 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
brandtr9dfff292016-11-14 05:14:50 -0800796 kSsrc, kSeqNum, _, _, _));
Elad Alon4a87e1c2017-10-03 16:11:34 +0200797 EXPECT_CALL(mock_rtc_event_log_,
798 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000799
800 rtp_sender_->SetStorePacketsStatus(true, 10);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000801 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800802 kRtpExtensionTransmissionTimeOffset,
803 kTransmissionTimeOffsetExtensionId));
804 EXPECT_EQ(
805 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
806 kAbsoluteSendTimeExtensionId));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000807 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700808 auto packet =
809 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
810 size_t packet_size = packet->size();
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000811
812 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700813 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
814 kAllowRetransmission,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700815 RtpPacketSender::kNormalPriority));
Erik Språng0f4f0552019-05-08 10:15:05 -0700816 // Immediately process send bucket and send packet.
817 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
818 PacedPacketInfo());
819 EXPECT_EQ(1, transport_.packets_sent());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000820
Erik Språng0f4f0552019-05-08 10:15:05 -0700821 // Retransmit packet.
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000822 const int kStoredTimeInMs = 100;
823 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
824
Erik Språng0f4f0552019-05-08 10:15:05 -0700825 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
826 kSsrc, kSeqNum, _, _, _));
827 EXPECT_CALL(mock_rtc_event_log_,
828 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
829
danilchapb6f1fb52016-10-19 06:11:39 -0700830 EXPECT_EQ(static_cast<int>(packet_size), rtp_sender_->ReSendPacket(kSeqNum));
Erik Språng0f4f0552019-05-08 10:15:05 -0700831 EXPECT_EQ(1, transport_.packets_sent());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000832
brandtr9dfff292016-11-14 05:14:50 -0800833 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -0800834 PacedPacketInfo());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000835
836 // Process send bucket. Packet should now be sent.
Erik Språng0f4f0552019-05-08 10:15:05 -0700837 EXPECT_EQ(2, transport_.packets_sent());
danilchap12ba1862016-10-26 02:41:55 -0700838 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000839
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +0000840 webrtc::RTPHeader rtp_header;
danilchap12ba1862016-10-26 02:41:55 -0700841 transport_.last_sent_packet().GetHeader(&rtp_header);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000842
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000843 // Verify transmission time offset.
844 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000845 uint64_t expected_send_time =
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000846 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
847 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
848}
849
850// This test sends 1 regular video packet, then 4 padding packets, and then
851// 1 more regular packet.
minyue3a407ee2017-04-03 01:10:33 -0700852TEST_P(RtpSenderTest, SendPadding) {
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000853 // Make all (non-padding) packets go to send queue.
terelius5d332ac2016-01-14 14:37:39 -0800854 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
brandtr9dfff292016-11-14 05:14:50 -0800855 kSsrc, kSeqNum, _, _, _));
Elad Alon4a87e1c2017-10-03 16:11:34 +0200856 EXPECT_CALL(mock_rtc_event_log_,
857 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
858 .Times(1 + 4 + 1);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000859
860 uint16_t seq_num = kSeqNum;
861 uint32_t timestamp = kTimestamp;
862 rtp_sender_->SetStorePacketsStatus(true, 10);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000863 size_t rtp_header_len = kRtpHeaderSize;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000864 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800865 kRtpExtensionTransmissionTimeOffset,
866 kTransmissionTimeOffsetExtensionId));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000867 rtp_header_len += 4; // 4 bytes extension.
danilchap162abd32015-12-10 02:39:40 -0800868 EXPECT_EQ(
869 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
870 kAbsoluteSendTimeExtensionId));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000871 rtp_header_len += 4; // 4 bytes extension.
872 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
873
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000874 webrtc::RTPHeader rtp_header;
875
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000876 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700877 auto packet =
878 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
Stefan Holmer586b19b2015-09-18 11:14:31 +0200879 const uint32_t media_packet_timestamp = timestamp;
danilchapb6f1fb52016-10-19 06:11:39 -0700880 size_t packet_size = packet->size();
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000881
882 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700883 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
884 kAllowRetransmission,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700885 RtpPacketSender::kNormalPriority));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000886
887 int total_packets_sent = 0;
danilchap12ba1862016-10-26 02:41:55 -0700888 EXPECT_EQ(total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000889
890 const int kStoredTimeInMs = 100;
891 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
brandtr9dfff292016-11-14 05:14:50 -0800892 rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -0800893 PacedPacketInfo());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000894 // Packet should now be sent. This test doesn't verify the regular video
895 // packet, since it is tested in another test.
danilchap12ba1862016-10-26 02:41:55 -0700896 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000897 timestamp += 90 * kStoredTimeInMs;
898
899 // Send padding 4 times, waiting 50 ms between each.
900 for (int i = 0; i < 4; ++i) {
901 const int kPaddingPeriodMs = 50;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000902 const size_t kPaddingBytes = 100;
903 const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000904 // Padding will be forced to full packets.
philipelc7bf32a2017-02-17 03:59:43 -0800905 EXPECT_EQ(kMaxPaddingLength,
philipel8aadd502017-02-23 02:56:13 -0800906 rtp_sender_->TimeToSendPadding(kPaddingBytes, PacedPacketInfo()));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000907
908 // Process send bucket. Padding should now be sent.
danilchap12ba1862016-10-26 02:41:55 -0700909 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000910 EXPECT_EQ(kMaxPaddingLength + rtp_header_len,
danilchap12ba1862016-10-26 02:41:55 -0700911 transport_.last_sent_packet().size());
912
913 transport_.last_sent_packet().GetHeader(&rtp_header);
pbosbd2522a2015-07-01 05:35:53 -0700914 EXPECT_EQ(kMaxPaddingLength, rtp_header.paddingLength);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000915
Stefan Holmer586b19b2015-09-18 11:14:31 +0200916 // Verify sequence number and timestamp. The timestamp should be the same
917 // as the last media packet.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000918 EXPECT_EQ(seq_num++, rtp_header.sequenceNumber);
Stefan Holmer586b19b2015-09-18 11:14:31 +0200919 EXPECT_EQ(media_packet_timestamp, rtp_header.timestamp);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000920 // Verify transmission time offset.
Stefan Holmer586b19b2015-09-18 11:14:31 +0200921 int offset = timestamp - media_packet_timestamp;
922 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000923 uint64_t expected_send_time =
924 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
925 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
926 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs);
927 timestamp += 90 * kPaddingPeriodMs;
928 }
929
930 // Send a regular video packet again.
931 capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700932 packet = BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
933 packet_size = packet->size();
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000934
brandtr9dfff292016-11-14 05:14:50 -0800935 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
936 kSsrc, seq_num, _, _, _));
terelius5d332ac2016-01-14 14:37:39 -0800937
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000938 // Packet should be stored in a send bucket.
danilchapb6f1fb52016-10-19 06:11:39 -0700939 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
940 kAllowRetransmission,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700941 RtpPacketSender::kNormalPriority));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000942
brandtr9dfff292016-11-14 05:14:50 -0800943 rtp_sender_->TimeToSendPacket(kSsrc, seq_num, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -0800944 PacedPacketInfo());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000945 // Process send bucket.
danilchap12ba1862016-10-26 02:41:55 -0700946 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
947 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
948 transport_.last_sent_packet().GetHeader(&rtp_header);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000949
950 // Verify sequence number and timestamp.
951 EXPECT_EQ(seq_num, rtp_header.sequenceNumber);
952 EXPECT_EQ(timestamp, rtp_header.timestamp);
953 // Verify transmission time offset. This packet is sent without delay.
954 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
955 uint64_t expected_send_time =
956 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000957 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000958}
pbos@webrtc.org8911ce42013-03-18 16:39:03 +0000959
minyue3a407ee2017-04-03 01:10:33 -0700960TEST_P(RtpSenderTest, OnSendPacketUpdated) {
stefana23fc622016-07-28 07:56:38 -0700961 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
962 kRtpExtensionTransportSequenceNumber,
963 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -0700964 rtp_sender_->SetStorePacketsStatus(true, 10);
965
966 EXPECT_CALL(send_packet_observer_,
967 OnSendPacket(kTransportSequenceNumber, _, _))
968 .Times(1);
969 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200970 .WillOnce(Return(kTransportSequenceNumber));
brandtr9dfff292016-11-14 05:14:50 -0800971 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
972 .Times(1);
asapersson35151f32016-05-02 23:44:01 -0700973
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100974 SendGenericPacket(); // Packet passed to pacer.
asapersson35151f32016-05-02 23:44:01 -0700975 const bool kIsRetransmit = false;
brandtr9dfff292016-11-14 05:14:50 -0800976 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
977 fake_clock_.TimeInMilliseconds(), kIsRetransmit,
philipel8aadd502017-02-23 02:56:13 -0800978 PacedPacketInfo());
danilchap12ba1862016-10-26 02:41:55 -0700979 EXPECT_EQ(1, transport_.packets_sent());
asapersson35151f32016-05-02 23:44:01 -0700980}
981
minyue3a407ee2017-04-03 01:10:33 -0700982TEST_P(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) {
stefana23fc622016-07-28 07:56:38 -0700983 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
984 kRtpExtensionTransportSequenceNumber,
985 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -0700986 rtp_sender_->SetStorePacketsStatus(true, 10);
987
988 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
989 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
Erik Språng214f5432019-06-20 15:09:58 +0200990 .WillOnce(Return(kTransportSequenceNumber));
brandtr9dfff292016-11-14 05:14:50 -0800991 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
992 .Times(1);
asapersson35151f32016-05-02 23:44:01 -0700993
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100994 SendGenericPacket(); // Packet passed to pacer.
asapersson35151f32016-05-02 23:44:01 -0700995 const bool kIsRetransmit = true;
brandtr9dfff292016-11-14 05:14:50 -0800996 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
997 fake_clock_.TimeInMilliseconds(), kIsRetransmit,
philipel8aadd502017-02-23 02:56:13 -0800998 PacedPacketInfo());
danilchap12ba1862016-10-26 02:41:55 -0700999 EXPECT_EQ(1, transport_.packets_sent());
Petter Strandmark26bc6692018-05-29 08:43:35 +02001000 EXPECT_TRUE(transport_.last_options_.is_retransmit);
asapersson35151f32016-05-02 23:44:01 -07001001}
1002
minyue3a407ee2017-04-03 01:10:33 -07001003TEST_P(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) {
asapersson35151f32016-05-02 23:44:01 -07001004 rtp_sender_.reset(new RTPSender(
Niels Möller59ab1cf2019-02-06 22:48:11 +01001005 false, &fake_clock_, &transport_, &mock_paced_sender_, absl::nullopt,
asapersson35151f32016-05-02 23:44:01 -07001006 nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr,
Niels Möller949f0fd2019-01-29 09:44:24 +01001007 nullptr, &send_packet_observer_, &retransmission_rate_limiter_, nullptr,
Per Kjellandere11b7d22019-02-21 07:55:59 +01001008 false, nullptr, false, false, FieldTrialBasedConfig()));
brandtr9dfff292016-11-14 05:14:50 -08001009 rtp_sender_->SetSequenceNumber(kSeqNum);
1010 rtp_sender_->SetSSRC(kSsrc);
stefana23fc622016-07-28 07:56:38 -07001011 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1012 kRtpExtensionTransportSequenceNumber,
1013 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -07001014 rtp_sender_->SetSequenceNumber(kSeqNum);
1015 rtp_sender_->SetStorePacketsStatus(true, 10);
1016
1017 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
brandtr9dfff292016-11-14 05:14:50 -08001018 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
1019 .Times(1);
asapersson35151f32016-05-02 23:44:01 -07001020
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001021 SendGenericPacket(); // Packet passed to pacer.
asapersson35151f32016-05-02 23:44:01 -07001022 const bool kIsRetransmit = false;
brandtr9dfff292016-11-14 05:14:50 -08001023 rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
1024 fake_clock_.TimeInMilliseconds(), kIsRetransmit,
philipel8aadd502017-02-23 02:56:13 -08001025 PacedPacketInfo());
danilchap12ba1862016-10-26 02:41:55 -07001026 EXPECT_EQ(1, transport_.packets_sent());
asapersson35151f32016-05-02 23:44:01 -07001027}
1028
Erik Språng214f5432019-06-20 15:09:58 +02001029// TODO(bugs.webrtc.org/8975): Remove this test when non-useful padding is
1030// removed.
minyue3a407ee2017-04-03 01:10:33 -07001031TEST_P(RtpSenderTest, SendRedundantPayloads) {
Erik Språng214f5432019-06-20 15:09:58 +02001032 test::ScopedFieldTrials field_trials(
1033 "WebRTC-PayloadPadding-UseMostUsefulPacket/Disabled/");
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001034 MockTransport transport;
terelius429c3452016-01-21 05:42:04 -08001035 rtp_sender_.reset(new RTPSender(
Niels Möller59ab1cf2019-02-06 22:48:11 +01001036 false, &fake_clock_, &transport, &mock_paced_sender_, absl::nullopt,
1037 nullptr, nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr,
Per Kjellandere11b7d22019-02-21 07:55:59 +01001038 &retransmission_rate_limiter_, nullptr, false, nullptr, false, false,
1039 FieldTrialBasedConfig()));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001040 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtr9dfff292016-11-14 05:14:50 -08001041 rtp_sender_->SetSSRC(kSsrc);
Shao Changbine62202f2015-04-21 20:24:50 +08001042 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001043
1044 uint16_t seq_num = kSeqNum;
1045 rtp_sender_->SetStorePacketsStatus(true, 10);
wu@webrtc.orgebdb0e32014-03-06 23:49:08 +00001046 int32_t rtp_header_len = kRtpHeaderSize;
danilchap162abd32015-12-10 02:39:40 -08001047 EXPECT_EQ(
1048 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
1049 kAbsoluteSendTimeExtensionId));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001050 rtp_header_len += 4; // 4 bytes extension.
1051 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
1052
pbos@webrtc.org0b0c2412015-01-13 14:15:15 +00001053 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
stefan@webrtc.orgef927552014-06-05 08:25:29 +00001054 rtp_sender_->SetRtxSsrc(1234);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001055
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001056 const size_t kNumPayloadSizes = 10;
danilchap162abd32015-12-10 02:39:40 -08001057 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700,
1058 750, 800, 850, 900, 950};
terelius5d332ac2016-01-14 14:37:39 -08001059 // Expect all packets go through the pacer.
1060 EXPECT_CALL(mock_paced_sender_,
brandtr9dfff292016-11-14 05:14:50 -08001061 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _))
terelius5d332ac2016-01-14 14:37:39 -08001062 .Times(kNumPayloadSizes);
Elad Alon4a87e1c2017-10-03 16:11:34 +02001063 EXPECT_CALL(mock_rtc_event_log_,
1064 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
terelius429c3452016-01-21 05:42:04 -08001065 .Times(kNumPayloadSizes);
1066
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001067 // Send 10 packets of increasing size.
1068 for (size_t i = 0; i < kNumPayloadSizes; ++i) {
1069 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
Erik Språng214f5432019-06-20 15:09:58 +02001070 EXPECT_CALL(transport, SendRtp(_, _, _)).WillOnce(Return(true));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001071 SendPacket(capture_time_ms, kPayloadSizes[i]);
brandtr9dfff292016-11-14 05:14:50 -08001072 rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
philipel8aadd502017-02-23 02:56:13 -08001073 PacedPacketInfo());
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001074 fake_clock_.AdvanceTimeMilliseconds(33);
1075 }
terelius429c3452016-01-21 05:42:04 -08001076
Elad Alon4a87e1c2017-10-03 16:11:34 +02001077 EXPECT_CALL(mock_rtc_event_log_,
1078 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
Erik Språng214f5432019-06-20 15:09:58 +02001079 .Times(AtLeast(4));
terelius429c3452016-01-21 05:42:04 -08001080
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001081 // The amount of padding to send it too small to send a payload packet.
stefan1d8a5062015-10-02 03:39:33 -07001082 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
Erik Språng214f5432019-06-20 15:09:58 +02001083 .WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -07001084 EXPECT_EQ(kMaxPaddingSize,
philipel8aadd502017-02-23 02:56:13 -08001085 rtp_sender_->TimeToSendPadding(49, PacedPacketInfo()));
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001086
Petter Strandmark26bc6692018-05-29 08:43:35 +02001087 PacketOptions options;
Peter Boströmac547a62015-09-17 23:03:57 +02001088 EXPECT_CALL(transport,
stefan1d8a5062015-10-02 03:39:33 -07001089 SendRtp(_, kPayloadSizes[0] + rtp_header_len + kRtxHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +02001090 .WillOnce(DoAll(SaveArg<2>(&options), Return(true)));
philipela1ed0b32016-06-01 06:31:17 -07001091 EXPECT_EQ(kPayloadSizes[0],
philipel8aadd502017-02-23 02:56:13 -08001092 rtp_sender_->TimeToSendPadding(500, PacedPacketInfo()));
Petter Strandmark26bc6692018-05-29 08:43:35 +02001093 EXPECT_TRUE(options.is_retransmit);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001094
Yves Gerey665174f2018-06-19 15:03:05 +02001095 EXPECT_CALL(transport, SendRtp(_,
1096 kPayloadSizes[kNumPayloadSizes - 1] +
1097 rtp_header_len + kRtxHeaderSize,
stefan1d8a5062015-10-02 03:39:33 -07001098 _))
Erik Språng214f5432019-06-20 15:09:58 +02001099 .WillOnce(Return(true));
Petter Strandmark26bc6692018-05-29 08:43:35 +02001100
1101 options.is_retransmit = false;
stefan1d8a5062015-10-02 03:39:33 -07001102 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
Erik Språng214f5432019-06-20 15:09:58 +02001103 .WillOnce(DoAll(SaveArg<2>(&options), Return(true)));
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001104 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1] + kMaxPaddingSize,
philipel8aadd502017-02-23 02:56:13 -08001105 rtp_sender_->TimeToSendPadding(999, PacedPacketInfo()));
Petter Strandmark26bc6692018-05-29 08:43:35 +02001106 EXPECT_FALSE(options.is_retransmit);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +00001107}
1108
Erik Språng214f5432019-06-20 15:09:58 +02001109TEST_P(RtpSenderTest, SendRedundantPayloadsUsefulPadding) {
1110 test::ScopedFieldTrials field_trials(
1111 "WebRTC-PayloadPadding-UseMostUsefulPacket/Enabled/");
1112 MockTransport transport;
1113 rtp_sender_ = absl::make_unique<RTPSender>(
1114 false, &fake_clock_, &transport, &mock_paced_sender_, absl::nullopt,
1115 nullptr, nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr,
1116 &retransmission_rate_limiter_, nullptr, false, nullptr, false, false,
1117 FieldTrialBasedConfig());
1118 rtp_sender_->SetSequenceNumber(kSeqNum);
1119 rtp_sender_->SetSSRC(kSsrc);
1120 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
1121
1122 uint16_t seq_num = kSeqNum;
1123 rtp_sender_->SetStorePacketsStatus(true, 10);
1124 int32_t rtp_header_len = kRtpHeaderSize;
1125 EXPECT_EQ(
1126 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
1127 kAbsoluteSendTimeExtensionId));
1128 rtp_header_len += 4; // 4 bytes extension.
1129 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
1130
1131 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
1132 rtp_sender_->SetRtxSsrc(1234);
1133
1134 const size_t kNumPayloadSizes = 10;
1135 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700,
1136 750, 800, 850, 900, 950};
1137 // Expect all packets go through the pacer.
1138 EXPECT_CALL(mock_paced_sender_,
1139 InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _))
1140 .Times(kNumPayloadSizes);
1141 EXPECT_CALL(mock_rtc_event_log_,
1142 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1143 .Times(kNumPayloadSizes);
1144
1145 // Send 10 packets of increasing size.
1146 EXPECT_CALL(transport, SendRtp)
1147 .Times(kNumPayloadSizes)
1148 .WillRepeatedly(Return(true));
1149 for (size_t i = 0; i < kNumPayloadSizes; ++i) {
1150 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
1151 SendPacket(capture_time_ms, kPayloadSizes[i]);
1152 rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
1153 PacedPacketInfo());
1154 fake_clock_.AdvanceTimeMilliseconds(33);
1155 }
1156
1157 EXPECT_CALL(mock_rtc_event_log_,
1158 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1159 .Times(AtLeast(4));
1160
1161 // The amount of padding to send it too small to send a payload packet.
1162 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
1163 .WillOnce(Return(true));
1164 EXPECT_EQ(kMaxPaddingSize,
1165 rtp_sender_->TimeToSendPadding(49, PacedPacketInfo()));
1166
1167 // Payload padding will prefer packets with lower transmit count first and
1168 // lower age second.
1169 EXPECT_CALL(transport, SendRtp(_,
1170 kPayloadSizes[kNumPayloadSizes - 1] +
1171 rtp_header_len + kRtxHeaderSize,
1172 Field(&PacketOptions::is_retransmit, true)))
1173 .WillOnce(Return(true));
1174 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1],
1175 rtp_sender_->TimeToSendPadding(500, PacedPacketInfo()));
1176
1177 EXPECT_CALL(transport, SendRtp(_,
1178 kPayloadSizes[kNumPayloadSizes - 2] +
1179 rtp_header_len + kRtxHeaderSize,
1180 _))
1181 .WillOnce(Return(true));
1182
1183 EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len,
1184 Field(&PacketOptions::is_retransmit, false)))
1185 .WillOnce(Return(true));
1186 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 2] + kMaxPaddingSize,
1187 rtp_sender_->TimeToSendPadding(
1188 kPayloadSizes[kNumPayloadSizes - 2] + 49, PacedPacketInfo()));
1189}
1190
minyue3a407ee2017-04-03 01:10:33 -07001191TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) {
Niels Möller8a40edd2019-01-24 18:04:44 +01001192 const char payload_name[] = "GENERIC";
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001193 const uint8_t payload_type = 127;
Niels Möller5fe95102019-03-04 16:49:25 +01001194 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001195 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001196 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01001197 FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001198 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1199 /*raw_payload=*/false);
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001200 uint8_t payload[] = {47, 11, 32, 93, 89};
1201
1202 // Send keyframe
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001203 RTPVideoHeader video_header;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001204 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001205 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1206 sizeof(payload), nullptr, &video_header,
1207 kDefaultExpectedRetransmissionTimeMs));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001208
danilchap96c15872016-11-21 01:35:29 -08001209 auto sent_payload = transport_.last_sent_packet().payload();
1210 uint8_t generic_header = sent_payload[0];
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001211 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
1212 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
danilchap96c15872016-11-21 01:35:29 -08001213 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001214
1215 // Send delta frame
1216 payload[0] = 13;
1217 payload[1] = 42;
1218 payload[4] = 13;
1219
Niels Möller59ab1cf2019-02-06 22:48:11 +01001220 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001221 VideoFrameType::kVideoFrameDelta, payload_type, 1234, 4321, payload,
1222 sizeof(payload), nullptr, &video_header,
1223 kDefaultExpectedRetransmissionTimeMs));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001224
danilchap96c15872016-11-21 01:35:29 -08001225 sent_payload = transport_.last_sent_packet().payload();
1226 generic_header = sent_payload[0];
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001227 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
1228 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
danilchap96c15872016-11-21 01:35:29 -08001229 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001230}
1231
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001232TEST_P(RtpSenderTestWithoutPacer, SendRawVideo) {
1233 const char payload_name[] = "VP8";
1234 const uint8_t payload_type = 111;
1235 const uint8_t payload[] = {11, 22, 33, 44, 55};
1236
1237 PlayoutDelayOracle playout_delay_oracle;
1238 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001239 &playout_delay_oracle, nullptr, false, false,
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001240 FieldTrialBasedConfig());
1241 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1242 /*raw_payload=*/true);
1243
1244 // Send a frame.
1245 RTPVideoHeader video_header;
1246 ASSERT_TRUE(rtp_sender_video.SendVideo(
1247 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1248 sizeof(payload), nullptr, &video_header,
1249 kDefaultExpectedRetransmissionTimeMs));
1250
1251 auto sent_payload = transport_.last_sent_packet().payload();
1252 EXPECT_THAT(sent_payload, ElementsAreArray(payload));
1253}
1254
minyue3a407ee2017-04-03 01:10:33 -07001255TEST_P(RtpSenderTest, SendFlexfecPackets) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001256 constexpr uint32_t kTimestamp = 1234;
brandtrdbdb3f12016-11-10 05:04:48 -08001257 constexpr int kMediaPayloadType = 127;
1258 constexpr int kFlexfecPayloadType = 118;
1259 constexpr uint32_t kMediaSsrc = 1234;
1260 constexpr uint32_t kFlexfecSsrc = 5678;
1261 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001262 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
brandtrdbdb3f12016-11-10 05:04:48 -08001263 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
Steve Antonf0482ea2018-04-09 13:33:52 -07001264 kNoMid, kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001265 nullptr /* rtp_state */, &fake_clock_);
brandtrdbdb3f12016-11-10 05:04:48 -08001266
1267 // Reset |rtp_sender_| to use FlexFEC.
michaelt4da30442016-11-17 01:38:43 -08001268 rtp_sender_.reset(new RTPSender(
Niels Möller59ab1cf2019-02-06 22:48:11 +01001269 false, &fake_clock_, &transport_, &mock_paced_sender_, kFlexfecSsrc,
Niels Möller949f0fd2019-01-29 09:44:24 +01001270 &seq_num_allocator_, nullptr, nullptr, nullptr, &mock_rtc_event_log_,
1271 &send_packet_observer_, &retransmission_rate_limiter_, nullptr, false,
Per Kjellandere11b7d22019-02-21 07:55:59 +01001272 nullptr, false, false, FieldTrialBasedConfig()));
brandtrdbdb3f12016-11-10 05:04:48 -08001273 rtp_sender_->SetSSRC(kMediaSsrc);
1274 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtrdbdb3f12016-11-10 05:04:48 -08001275 rtp_sender_->SetStorePacketsStatus(true, 10);
1276
Niels Möller5fe95102019-03-04 16:49:25 +01001277 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001278 RTPSenderVideo rtp_sender_video(
1279 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1280 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001281 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1282 /*raw_payload=*/false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001283
brandtrdbdb3f12016-11-10 05:04:48 -08001284 // Parameters selected to generate a single FEC packet per media packet.
1285 FecProtectionParams params;
1286 params.fec_rate = 15;
1287 params.max_fec_frames = 1;
1288 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001289 rtp_sender_video.SetFecParameters(params, params);
brandtrdbdb3f12016-11-10 05:04:48 -08001290
brandtr9dfff292016-11-14 05:14:50 -08001291 EXPECT_CALL(mock_paced_sender_,
1292 InsertPacket(RtpPacketSender::kLowPriority, kMediaSsrc, kSeqNum,
1293 _, _, false));
1294 uint16_t flexfec_seq_num;
brandtrdbdb3f12016-11-10 05:04:48 -08001295 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
brandtr9dfff292016-11-14 05:14:50 -08001296 kFlexfecSsrc, _, _, _, false))
Erik Språng214f5432019-06-20 15:09:58 +02001297 .WillOnce(SaveArg<2>(&flexfec_seq_num));
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001298
1299 RTPVideoHeader video_header;
1300 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001301 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001302 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1303 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1304
Elad Alon4a87e1c2017-10-03 16:11:34 +02001305 EXPECT_CALL(mock_rtc_event_log_,
1306 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1307 .Times(2);
Erik Språngd2879622019-05-10 08:29:01 -07001308 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1309 rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
1310 fake_clock_.TimeInMilliseconds(),
1311 false, PacedPacketInfo()));
1312 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1313 rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
1314 fake_clock_.TimeInMilliseconds(),
1315 false, PacedPacketInfo()));
brandtr9dfff292016-11-14 05:14:50 -08001316 ASSERT_EQ(2, transport_.packets_sent());
brandtrdbdb3f12016-11-10 05:04:48 -08001317 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1318 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
brandtr9dfff292016-11-14 05:14:50 -08001319 EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
brandtrdbdb3f12016-11-10 05:04:48 -08001320 EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
brandtr9dfff292016-11-14 05:14:50 -08001321 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
1322 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
1323 EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
1324 EXPECT_EQ(kFlexfecSsrc, flexfec_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001325}
1326
ilnik10894992017-06-21 08:23:19 -07001327// TODO(ilnik): because of webrtc:7859. Once FEC moved below pacer, this test
1328// should be removed.
1329TEST_P(RtpSenderTest, NoFlexfecForTimingFrames) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001330 constexpr uint32_t kTimestamp = 1234;
1331 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
ilnik10894992017-06-21 08:23:19 -07001332 constexpr int kMediaPayloadType = 127;
1333 constexpr int kFlexfecPayloadType = 118;
1334 constexpr uint32_t kMediaSsrc = 1234;
1335 constexpr uint32_t kFlexfecSsrc = 5678;
1336 const std::vector<RtpExtension> kNoRtpExtensions;
1337 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
ilnike4350192017-06-29 02:27:44 -07001338
ilnik10894992017-06-21 08:23:19 -07001339 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
Steve Antonf0482ea2018-04-09 13:33:52 -07001340 kNoMid, kNoRtpExtensions, kNoRtpExtensionSizes,
ilnik10894992017-06-21 08:23:19 -07001341 nullptr /* rtp_state */, &fake_clock_);
1342
1343 // Reset |rtp_sender_| to use FlexFEC.
1344 rtp_sender_.reset(new RTPSender(
Niels Möller59ab1cf2019-02-06 22:48:11 +01001345 false, &fake_clock_, &transport_, &mock_paced_sender_,
1346 flexfec_sender.ssrc(), &seq_num_allocator_, nullptr, nullptr, nullptr,
1347 &mock_rtc_event_log_, &send_packet_observer_,
Per Kjellandere11b7d22019-02-21 07:55:59 +01001348 &retransmission_rate_limiter_, nullptr, false, nullptr, false, false,
1349 FieldTrialBasedConfig()));
ilnik10894992017-06-21 08:23:19 -07001350 rtp_sender_->SetSSRC(kMediaSsrc);
1351 rtp_sender_->SetSequenceNumber(kSeqNum);
ilnik10894992017-06-21 08:23:19 -07001352 rtp_sender_->SetStorePacketsStatus(true, 10);
1353
Niels Möller5fe95102019-03-04 16:49:25 +01001354 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001355 RTPSenderVideo rtp_sender_video(
1356 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1357 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001358 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1359 /*raw_payload=*/false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001360
ilnike4350192017-06-29 02:27:44 -07001361 // Need extension to be registered for timing frames to be sent.
1362 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1363 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
1364
ilnik10894992017-06-21 08:23:19 -07001365 // Parameters selected to generate a single FEC packet per media packet.
1366 FecProtectionParams params;
1367 params.fec_rate = 15;
1368 params.max_fec_frames = 1;
1369 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001370 rtp_sender_video.SetFecParameters(params, params);
ilnik10894992017-06-21 08:23:19 -07001371
1372 EXPECT_CALL(mock_paced_sender_,
1373 InsertPacket(RtpPacketSender::kLowPriority, kMediaSsrc, kSeqNum,
1374 _, _, false));
1375 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1376 kFlexfecSsrc, _, _, _, false))
1377 .Times(0); // Not called because packet should not be protected.
1378
ilnik10894992017-06-21 08:23:19 -07001379 RTPVideoHeader video_header;
Ilya Nikolaevskiyb6c462d2018-06-05 15:21:32 +02001380 video_header.video_timing.flags = VideoSendTiming::kTriggeredByTimer;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001381 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001382 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
1383 kCaptureTimeMs, kPayloadData, sizeof(kPayloadData), nullptr,
1384 &video_header, kDefaultExpectedRetransmissionTimeMs));
ilnik10894992017-06-21 08:23:19 -07001385
Elad Alon4a87e1c2017-10-03 16:11:34 +02001386 EXPECT_CALL(mock_rtc_event_log_,
1387 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1388 .Times(1);
Erik Språngd2879622019-05-10 08:29:01 -07001389 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1390 rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
1391 fake_clock_.TimeInMilliseconds(),
1392 false, PacedPacketInfo()));
ilnik10894992017-06-21 08:23:19 -07001393 ASSERT_EQ(1, transport_.packets_sent());
1394 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1395 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
1396 EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
1397 EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
1398
1399 // Now try to send not a timing frame.
1400 uint16_t flexfec_seq_num;
1401 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1402 kFlexfecSsrc, _, _, _, false))
Erik Språng214f5432019-06-20 15:09:58 +02001403 .WillOnce(SaveArg<2>(&flexfec_seq_num));
ilnik10894992017-06-21 08:23:19 -07001404 EXPECT_CALL(mock_paced_sender_,
1405 InsertPacket(RtpPacketSender::kLowPriority, kMediaSsrc,
1406 kSeqNum + 1, _, _, false));
Ilya Nikolaevskiyb6c462d2018-06-05 15:21:32 +02001407 video_header.video_timing.flags = VideoSendTiming::kInvalid;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001408 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001409 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp + 1,
1410 kCaptureTimeMs + 1, kPayloadData, sizeof(kPayloadData), nullptr,
1411 &video_header, kDefaultExpectedRetransmissionTimeMs));
ilnik10894992017-06-21 08:23:19 -07001412
Elad Alon4a87e1c2017-10-03 16:11:34 +02001413 EXPECT_CALL(mock_rtc_event_log_,
1414 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1415 .Times(2);
Erik Språngd2879622019-05-10 08:29:01 -07001416 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1417 rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum + 1,
1418 fake_clock_.TimeInMilliseconds(),
1419 false, PacedPacketInfo()));
1420 EXPECT_EQ(RtpPacketSendResult::kSuccess,
1421 rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
1422 fake_clock_.TimeInMilliseconds(),
1423 false, PacedPacketInfo()));
ilnik10894992017-06-21 08:23:19 -07001424 ASSERT_EQ(3, transport_.packets_sent());
1425 const RtpPacketReceived& media_packet2 = transport_.sent_packets_[1];
1426 EXPECT_EQ(kMediaPayloadType, media_packet2.PayloadType());
1427 EXPECT_EQ(kSeqNum + 1, media_packet2.SequenceNumber());
1428 EXPECT_EQ(kMediaSsrc, media_packet2.Ssrc());
1429 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[2];
1430 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
1431 EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
1432 EXPECT_EQ(kFlexfecSsrc, flexfec_packet.Ssrc());
1433}
1434
minyue3a407ee2017-04-03 01:10:33 -07001435TEST_P(RtpSenderTestWithoutPacer, SendFlexfecPackets) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001436 constexpr uint32_t kTimestamp = 1234;
brandtrdbdb3f12016-11-10 05:04:48 -08001437 constexpr int kMediaPayloadType = 127;
1438 constexpr int kFlexfecPayloadType = 118;
1439 constexpr uint32_t kMediaSsrc = 1234;
1440 constexpr uint32_t kFlexfecSsrc = 5678;
1441 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001442 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
brandtrdbdb3f12016-11-10 05:04:48 -08001443 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
Steve Antonf0482ea2018-04-09 13:33:52 -07001444 kNoMid, kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001445 nullptr /* rtp_state */, &fake_clock_);
brandtrdbdb3f12016-11-10 05:04:48 -08001446
1447 // Reset |rtp_sender_| to use FlexFEC.
Benjamin Wright192eeec2018-10-17 17:27:25 -07001448 rtp_sender_.reset(new RTPSender(
Niels Möller59ab1cf2019-02-06 22:48:11 +01001449 false, &fake_clock_, &transport_, nullptr, flexfec_sender.ssrc(),
Niels Möller949f0fd2019-01-29 09:44:24 +01001450 &seq_num_allocator_, nullptr, nullptr, nullptr, &mock_rtc_event_log_,
1451 &send_packet_observer_, &retransmission_rate_limiter_, nullptr, false,
Per Kjellandere11b7d22019-02-21 07:55:59 +01001452 nullptr, false, false, FieldTrialBasedConfig()));
brandtrdbdb3f12016-11-10 05:04:48 -08001453 rtp_sender_->SetSSRC(kMediaSsrc);
1454 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtrdbdb3f12016-11-10 05:04:48 -08001455
Niels Möller5fe95102019-03-04 16:49:25 +01001456 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001457 RTPSenderVideo rtp_sender_video(
1458 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1459 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001460 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1461 /*raw_payload=*/false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001462
brandtrdbdb3f12016-11-10 05:04:48 -08001463 // Parameters selected to generate a single FEC packet per media packet.
1464 FecProtectionParams params;
1465 params.fec_rate = 15;
1466 params.max_fec_frames = 1;
1467 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001468 rtp_sender_video.SetFecParameters(params, params);
brandtrdbdb3f12016-11-10 05:04:48 -08001469
Elad Alon4a87e1c2017-10-03 16:11:34 +02001470 EXPECT_CALL(mock_rtc_event_log_,
1471 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1472 .Times(2);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001473 RTPVideoHeader video_header;
1474 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001475 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001476 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1477 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1478
brandtrdbdb3f12016-11-10 05:04:48 -08001479 ASSERT_EQ(2, transport_.packets_sent());
1480 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1481 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
1482 EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
1483 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
1484 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
1485 EXPECT_EQ(kFlexfecSsrc, flexfec_packet.Ssrc());
1486}
1487
Steve Anton296a0ce2018-03-22 15:17:27 -07001488// Test that the MID header extension is included on sent packets when
1489// configured.
1490TEST_P(RtpSenderTestWithoutPacer, MidIncludedOnSentPackets) {
1491 const char kMid[] = "mid";
1492
1493 // Register MID header extension and set the MID for the RTPSender.
1494 rtp_sender_->SetSendingMediaStatus(false);
1495 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionMid, kMidExtensionId);
1496 rtp_sender_->SetMid(kMid);
1497 rtp_sender_->SetSendingMediaStatus(true);
1498
1499 // Send a couple packets.
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001500 SendGenericPacket();
1501 SendGenericPacket();
Steve Anton296a0ce2018-03-22 15:17:27 -07001502
1503 // Expect both packets to have the MID set.
1504 ASSERT_EQ(2u, transport_.sent_packets_.size());
1505 for (const RtpPacketReceived& packet : transport_.sent_packets_) {
1506 std::string mid;
1507 ASSERT_TRUE(packet.GetExtension<RtpMid>(&mid));
1508 EXPECT_EQ(kMid, mid);
1509 }
1510}
1511
Amit Hilbuch77938e62018-12-21 09:23:38 -08001512TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnSentPackets) {
1513 const char kRid[] = "f";
1514
1515 rtp_sender_->SetSendingMediaStatus(false);
1516 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRtpStreamId,
1517 kRidExtensionId);
1518 rtp_sender_->SetRid(kRid);
1519 rtp_sender_->SetSendingMediaStatus(true);
1520
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001521 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -08001522
1523 ASSERT_EQ(1u, transport_.sent_packets_.size());
1524 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1525 std::string rid;
1526 ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
1527 EXPECT_EQ(kRid, rid);
1528}
1529
1530TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnRtxSentPackets) {
1531 const char kRid[] = "f";
Amit Hilbuch77938e62018-12-21 09:23:38 -08001532
1533 rtp_sender_->SetSendingMediaStatus(false);
1534 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRtpStreamId,
1535 kRidExtensionId);
1536 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionRepairedRtpStreamId,
1537 kRepairedRidExtensionId);
1538 rtp_sender_->SetRid(kRid);
1539 rtp_sender_->SetSendingMediaStatus(true);
1540
1541 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
Erik Språng9c771c22019-06-17 16:31:53 +02001542 rtp_sender_->SetRtxSsrc(kRtxSsrc);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001543 rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
Amit Hilbuch77938e62018-12-21 09:23:38 -08001544
1545 rtp_sender_->SetStorePacketsStatus(true, 10);
1546
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001547 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -08001548 ASSERT_EQ(1u, transport_.sent_packets_.size());
1549 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1550 std::string rid;
1551 ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
1552 EXPECT_EQ(kRid, rid);
1553 rid = kNoRid;
1554 EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&rid));
1555
1556 uint16_t packet_id = packet.SequenceNumber();
1557 rtp_sender_->ReSendPacket(packet_id);
1558 ASSERT_EQ(2u, transport_.sent_packets_.size());
1559 const RtpPacketReceived& rtx_packet = transport_.sent_packets_[1];
1560 ASSERT_TRUE(rtx_packet.GetExtension<RepairedRtpStreamId>(&rid));
1561 EXPECT_EQ(kRid, rid);
1562 EXPECT_FALSE(rtx_packet.HasExtension<RtpStreamId>());
1563}
1564
minyue3a407ee2017-04-03 01:10:33 -07001565TEST_P(RtpSenderTest, FecOverheadRate) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001566 constexpr uint32_t kTimestamp = 1234;
1567 constexpr int kMediaPayloadType = 127;
brandtr81eab612017-01-24 04:06:09 -08001568 constexpr int kFlexfecPayloadType = 118;
1569 constexpr uint32_t kMediaSsrc = 1234;
1570 constexpr uint32_t kFlexfecSsrc = 5678;
1571 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001572 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
brandtr81eab612017-01-24 04:06:09 -08001573 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
Steve Antonf0482ea2018-04-09 13:33:52 -07001574 kNoMid, kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001575 nullptr /* rtp_state */, &fake_clock_);
brandtr81eab612017-01-24 04:06:09 -08001576
1577 // Reset |rtp_sender_| to use FlexFEC.
1578 rtp_sender_.reset(new RTPSender(
Niels Möller59ab1cf2019-02-06 22:48:11 +01001579 false, &fake_clock_, &transport_, &mock_paced_sender_,
1580 flexfec_sender.ssrc(), &seq_num_allocator_, nullptr, nullptr, nullptr,
1581 &mock_rtc_event_log_, &send_packet_observer_,
Per Kjellandere11b7d22019-02-21 07:55:59 +01001582 &retransmission_rate_limiter_, nullptr, false, nullptr, false, false,
1583 FieldTrialBasedConfig()));
brandtr81eab612017-01-24 04:06:09 -08001584 rtp_sender_->SetSSRC(kMediaSsrc);
1585 rtp_sender_->SetSequenceNumber(kSeqNum);
brandtr81eab612017-01-24 04:06:09 -08001586
Niels Möller5fe95102019-03-04 16:49:25 +01001587 PlayoutDelayOracle playout_delay_oracle;
Elad Alona0e99432019-05-24 13:50:56 +02001588 RTPSenderVideo rtp_sender_video(
1589 &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle,
1590 nullptr, false, false, FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001591 rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC",
1592 /*raw_payload=*/false);
brandtr81eab612017-01-24 04:06:09 -08001593 // Parameters selected to generate a single FEC packet per media packet.
1594 FecProtectionParams params;
1595 params.fec_rate = 15;
1596 params.max_fec_frames = 1;
1597 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001598 rtp_sender_video.SetFecParameters(params, params);
brandtr81eab612017-01-24 04:06:09 -08001599
1600 constexpr size_t kNumMediaPackets = 10;
1601 constexpr size_t kNumFecPackets = kNumMediaPackets;
1602 constexpr int64_t kTimeBetweenPacketsMs = 10;
1603 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, false))
1604 .Times(kNumMediaPackets + kNumFecPackets);
1605 for (size_t i = 0; i < kNumMediaPackets; ++i) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001606 RTPVideoHeader video_header;
1607
1608 EXPECT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001609 VideoFrameType::kVideoFrameKey, kMediaPayloadType, kTimestamp,
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001610 fake_clock_.TimeInMilliseconds(), kPayloadData, sizeof(kPayloadData),
1611 nullptr, &video_header, kDefaultExpectedRetransmissionTimeMs));
1612
brandtr81eab612017-01-24 04:06:09 -08001613 fake_clock_.AdvanceTimeMilliseconds(kTimeBetweenPacketsMs);
1614 }
1615 constexpr size_t kRtpHeaderLength = 12;
1616 constexpr size_t kFlexfecHeaderLength = 20;
1617 constexpr size_t kGenericCodecHeaderLength = 1;
1618 constexpr size_t kPayloadLength = sizeof(kPayloadData);
1619 constexpr size_t kPacketLength = kRtpHeaderLength + kFlexfecHeaderLength +
1620 kGenericCodecHeaderLength + kPayloadLength;
1621 EXPECT_NEAR(kNumFecPackets * kPacketLength * 8 /
1622 (kNumFecPackets * kTimeBetweenPacketsMs / 1000.0f),
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001623 rtp_sender_video.FecOverheadRate(), 500);
brandtr81eab612017-01-24 04:06:09 -08001624}
1625
minyue3a407ee2017-04-03 01:10:33 -07001626TEST_P(RtpSenderTest, BitrateCallbacks) {
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001627 class TestCallback : public BitrateStatisticsObserver {
1628 public:
sprangcd349d92016-07-13 09:11:28 -07001629 TestCallback()
1630 : BitrateStatisticsObserver(),
1631 num_calls_(0),
1632 ssrc_(0),
1633 total_bitrate_(0),
1634 retransmit_bitrate_(0) {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +00001635 ~TestCallback() override = default;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001636
sprangcd349d92016-07-13 09:11:28 -07001637 void Notify(uint32_t total_bitrate,
1638 uint32_t retransmit_bitrate,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00001639 uint32_t ssrc) override {
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001640 ++num_calls_;
1641 ssrc_ = ssrc;
sprangcd349d92016-07-13 09:11:28 -07001642 total_bitrate_ = total_bitrate;
1643 retransmit_bitrate_ = retransmit_bitrate;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001644 }
1645
1646 uint32_t num_calls_;
1647 uint32_t ssrc_;
sprangcd349d92016-07-13 09:11:28 -07001648 uint32_t total_bitrate_;
1649 uint32_t retransmit_bitrate_;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001650 } callback;
Per Kjellandere11b7d22019-02-21 07:55:59 +01001651 rtp_sender_.reset(
1652 new RTPSender(false, &fake_clock_, &transport_, nullptr, absl::nullopt,
1653 nullptr, nullptr, &callback, nullptr, nullptr, nullptr,
1654 &retransmission_rate_limiter_, nullptr, false, nullptr,
1655 false, false, FieldTrialBasedConfig()));
nisse7d59f6b2017-02-21 03:40:24 -08001656 rtp_sender_->SetSSRC(kSsrc);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001657
Niels Möller5fe95102019-03-04 16:49:25 +01001658 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001659 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001660 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01001661 FieldTrialBasedConfig());
Niels Möller59ab1cf2019-02-06 22:48:11 +01001662 const char payload_name[] = "GENERIC";
1663 const uint8_t payload_type = 127;
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001664 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1665 /*raw_payload=*/false);
Niels Möller59ab1cf2019-02-06 22:48:11 +01001666
sprangcd349d92016-07-13 09:11:28 -07001667 // Simulate kNumPackets sent with kPacketInterval ms intervals, with the
1668 // number of packets selected so that we fill (but don't overflow) the one
1669 // second averaging window.
1670 const uint32_t kWindowSizeMs = 1000;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001671 const uint32_t kPacketInterval = 20;
sprangcd349d92016-07-13 09:11:28 -07001672 const uint32_t kNumPackets =
1673 (kWindowSizeMs - kPacketInterval) / kPacketInterval;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001674 // Overhead = 12 bytes RTP header + 1 byte generic header.
1675 const uint32_t kPacketOverhead = 13;
1676
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001677 uint8_t payload[] = {47, 11, 32, 93, 89};
1678 rtp_sender_->SetStorePacketsStatus(true, 1);
1679 uint32_t ssrc = rtp_sender_->SSRC();
1680
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001681 // Initial process call so we get a new time window.
1682 rtp_sender_->ProcessBitrate();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001683
1684 // Send a few frames.
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001685 RTPVideoHeader video_header;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001686 for (uint32_t i = 0; i < kNumPackets; ++i) {
Niels Möller59ab1cf2019-02-06 22:48:11 +01001687 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001688 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1689 sizeof(payload), nullptr, &video_header,
1690 kDefaultExpectedRetransmissionTimeMs));
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001691 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval);
1692 }
1693
1694 rtp_sender_->ProcessBitrate();
1695
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001696 // We get one call for every stats updated, thus two calls since both the
1697 // stream stats and the retransmit stats are updated once.
1698 EXPECT_EQ(2u, callback.num_calls_);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001699 EXPECT_EQ(ssrc, callback.ssrc_);
sprangcd349d92016-07-13 09:11:28 -07001700 const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload);
1701 // Bitrate measured over delta between last and first timestamp, plus one.
1702 const uint32_t kExpectedWindowMs = kNumPackets * kPacketInterval + 1;
1703 const uint32_t kExpectedBitsAccumulated = kTotalPacketSize * kNumPackets * 8;
1704 const uint32_t kExpectedRateBps =
1705 (kExpectedBitsAccumulated * 1000 + (kExpectedWindowMs / 2)) /
1706 kExpectedWindowMs;
1707 EXPECT_EQ(kExpectedRateBps, callback.total_bitrate_);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001708
andresp@webrtc.orgd11bec42014-07-08 14:32:58 +00001709 rtp_sender_.reset();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001710}
1711
minyue3a407ee2017-04-03 01:10:33 -07001712TEST_P(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) {
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001713 class TestCallback : public StreamDataCountersCallback {
1714 public:
danilchap162abd32015-12-10 02:39:40 -08001715 TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +00001716 ~TestCallback() override = default;
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001717
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00001718 void DataCountersUpdated(const StreamDataCounters& counters,
1719 uint32_t ssrc) override {
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001720 ssrc_ = ssrc;
1721 counters_ = counters;
1722 }
1723
1724 uint32_t ssrc_;
1725 StreamDataCounters counters_;
asapersson@webrtc.org44149392015-02-04 08:34:47 +00001726
1727 void MatchPacketCounter(const RtpPacketCounter& expected,
1728 const RtpPacketCounter& actual) {
1729 EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
1730 EXPECT_EQ(expected.header_bytes, actual.header_bytes);
1731 EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
1732 EXPECT_EQ(expected.packets, actual.packets);
1733 }
1734
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001735 void Matches(uint32_t ssrc, const StreamDataCounters& counters) {
1736 EXPECT_EQ(ssrc, ssrc_);
asapersson@webrtc.org44149392015-02-04 08:34:47 +00001737 MatchPacketCounter(counters.transmitted, counters_.transmitted);
1738 MatchPacketCounter(counters.retransmitted, counters_.retransmitted);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001739 EXPECT_EQ(counters.fec.packets, counters_.fec.packets);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001740 }
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001741 } callback;
1742
1743 const uint8_t kRedPayloadType = 96;
1744 const uint8_t kUlpfecPayloadType = 97;
Niels Möller8a40edd2019-01-24 18:04:44 +01001745 const char payload_name[] = "GENERIC";
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001746 const uint8_t payload_type = 127;
Niels Möller5fe95102019-03-04 16:49:25 +01001747 PlayoutDelayOracle playout_delay_oracle;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001748 RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr,
Elad Alona0e99432019-05-24 13:50:56 +02001749 &playout_delay_oracle, nullptr, false, false,
Niels Möller5fe95102019-03-04 16:49:25 +01001750 FieldTrialBasedConfig());
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001751 rtp_sender_video.RegisterPayloadType(payload_type, payload_name,
1752 /*raw_payload=*/false);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001753 uint8_t payload[] = {47, 11, 32, 93, 89};
1754 rtp_sender_->SetStorePacketsStatus(true, 1);
1755 uint32_t ssrc = rtp_sender_->SSRC();
1756
1757 rtp_sender_->RegisterRtpStatisticsCallback(&callback);
1758
1759 // Send a frame.
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001760 RTPVideoHeader video_header;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001761 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001762 VideoFrameType::kVideoFrameKey, payload_type, 1234, 4321, payload,
1763 sizeof(payload), nullptr, &video_header,
1764 kDefaultExpectedRetransmissionTimeMs));
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001765 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001766 expected.transmitted.payload_bytes = 6;
1767 expected.transmitted.header_bytes = 12;
1768 expected.transmitted.padding_bytes = 0;
1769 expected.transmitted.packets = 1;
1770 expected.retransmitted.payload_bytes = 0;
1771 expected.retransmitted.header_bytes = 0;
1772 expected.retransmitted.padding_bytes = 0;
1773 expected.retransmitted.packets = 0;
1774 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001775 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001776
1777 // Retransmit a frame.
1778 uint16_t seqno = rtp_sender_->SequenceNumber() - 1;
Erik Språnga12b1d62018-03-14 12:39:24 +01001779 rtp_sender_->ReSendPacket(seqno);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001780 expected.transmitted.payload_bytes = 12;
1781 expected.transmitted.header_bytes = 24;
1782 expected.transmitted.packets = 2;
1783 expected.retransmitted.payload_bytes = 6;
1784 expected.retransmitted.header_bytes = 12;
1785 expected.retransmitted.padding_bytes = 0;
1786 expected.retransmitted.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001787 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001788
1789 // Send padding.
philipel8aadd502017-02-23 02:56:13 -08001790 rtp_sender_->TimeToSendPadding(kMaxPaddingSize, PacedPacketInfo());
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001791 expected.transmitted.payload_bytes = 12;
1792 expected.transmitted.header_bytes = 36;
1793 expected.transmitted.padding_bytes = kMaxPaddingSize;
1794 expected.transmitted.packets = 3;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001795 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001796
brandtrf1bb4762016-11-07 03:05:06 -08001797 // Send ULPFEC.
Niels Möller59ab1cf2019-02-06 22:48:11 +01001798 rtp_sender_video.SetUlpfecConfig(kRedPayloadType, kUlpfecPayloadType);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001799 FecProtectionParams fec_params;
1800 fec_params.fec_mask_type = kFecMaskRandom;
1801 fec_params.fec_rate = 1;
1802 fec_params.max_fec_frames = 1;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001803 rtp_sender_video.SetFecParameters(fec_params, fec_params);
1804 ASSERT_TRUE(rtp_sender_video.SendVideo(
Niels Möller8f7ce222019-03-21 15:43:58 +01001805 VideoFrameType::kVideoFrameDelta, payload_type, 1234, 4321, payload,
1806 sizeof(payload), nullptr, &video_header,
1807 kDefaultExpectedRetransmissionTimeMs));
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001808 expected.transmitted.payload_bytes = 40;
1809 expected.transmitted.header_bytes = 60;
1810 expected.transmitted.packets = 5;
1811 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001812 callback.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001813
sprang867fb522015-08-03 04:38:41 -07001814 rtp_sender_->RegisterRtpStatisticsCallback(nullptr);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001815}
1816
minyue3a407ee2017-04-03 01:10:33 -07001817TEST_P(RtpSenderTestWithoutPacer, BytesReportedCorrectly) {
Niels Möller59ab1cf2019-02-06 22:48:11 +01001818 // XXX const char* kPayloadName = "GENERIC";
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001819 const uint8_t kPayloadType = 127;
1820 rtp_sender_->SetSSRC(1234);
Erik Språng9c771c22019-06-17 16:31:53 +02001821 rtp_sender_->SetRtxSsrc(kRtxSsrc);
Shao Changbine62202f2015-04-21 20:24:50 +08001822 rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType);
pbos@webrtc.org0b0c2412015-01-13 14:15:15 +00001823 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001824
Niels Möller59ab1cf2019-02-06 22:48:11 +01001825 SendGenericPacket();
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001826 // Will send 2 full-size padding packets.
philipel8aadd502017-02-23 02:56:13 -08001827 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
1828 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001829
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001830 StreamDataCounters rtp_stats;
1831 StreamDataCounters rtx_stats;
1832 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001833
Niels Möller59ab1cf2019-02-06 22:48:11 +01001834 // Payload
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +00001835 EXPECT_GT(rtp_stats.first_packet_time_ms, -1);
Niels Möller59ab1cf2019-02-06 22:48:11 +01001836 EXPECT_EQ(rtp_stats.transmitted.payload_bytes, sizeof(kPayloadData));
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001837 EXPECT_EQ(rtp_stats.transmitted.header_bytes, 12u);
1838 EXPECT_EQ(rtp_stats.transmitted.padding_bytes, 0u);
1839 EXPECT_EQ(rtx_stats.transmitted.payload_bytes, 0u);
1840 EXPECT_EQ(rtx_stats.transmitted.header_bytes, 24u);
1841 EXPECT_EQ(rtx_stats.transmitted.padding_bytes, 2 * kMaxPaddingSize);
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001842
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001843 EXPECT_EQ(rtp_stats.transmitted.TotalBytes(),
danilchap162abd32015-12-10 02:39:40 -08001844 rtp_stats.transmitted.payload_bytes +
1845 rtp_stats.transmitted.header_bytes +
1846 rtp_stats.transmitted.padding_bytes);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001847 EXPECT_EQ(rtx_stats.transmitted.TotalBytes(),
danilchap162abd32015-12-10 02:39:40 -08001848 rtx_stats.transmitted.payload_bytes +
1849 rtx_stats.transmitted.header_bytes +
1850 rtx_stats.transmitted.padding_bytes);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001851
danilchap162abd32015-12-10 02:39:40 -08001852 EXPECT_EQ(
1853 transport_.total_bytes_sent_,
1854 rtp_stats.transmitted.TotalBytes() + rtx_stats.transmitted.TotalBytes());
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001855}
guoweis@webrtc.org45362892015-03-04 22:55:15 +00001856
minyue3a407ee2017-04-03 01:10:33 -07001857TEST_P(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) {
sprang38778b02015-09-29 09:48:22 -07001858 const int32_t kPacketSize = 1400;
1859 const int32_t kNumPackets = 30;
1860
sprangcd349d92016-07-13 09:11:28 -07001861 retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8);
1862
sprang38778b02015-09-29 09:48:22 -07001863 rtp_sender_->SetStorePacketsStatus(true, kNumPackets);
sprang38778b02015-09-29 09:48:22 -07001864 const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber();
Danil Chapovalov2800d742016-08-26 18:48:46 +02001865 std::vector<uint16_t> sequence_numbers;
sprang38778b02015-09-29 09:48:22 -07001866 for (int32_t i = 0; i < kNumPackets; ++i) {
1867 sequence_numbers.push_back(kStartSequenceNumber + i);
1868 fake_clock_.AdvanceTimeMilliseconds(1);
1869 SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize);
1870 }
danilchap12ba1862016-10-26 02:41:55 -07001871 EXPECT_EQ(kNumPackets, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001872
1873 fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets);
1874
1875 // Resending should work - brings the bandwidth up to the limit.
1876 // NACK bitrate is capped to the same bitrate as the encoder, since the max
1877 // protection overhead is 50% (see MediaOptimization::SetTargetRates).
Danil Chapovalov2800d742016-08-26 18:48:46 +02001878 rtp_sender_->OnReceivedNack(sequence_numbers, 0);
danilchap12ba1862016-10-26 02:41:55 -07001879 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001880
sprangcd349d92016-07-13 09:11:28 -07001881 // Must be at least 5ms in between retransmission attempts.
1882 fake_clock_.AdvanceTimeMilliseconds(5);
1883
sprang38778b02015-09-29 09:48:22 -07001884 // Resending should not work, bandwidth exceeded.
Danil Chapovalov2800d742016-08-26 18:48:46 +02001885 rtp_sender_->OnReceivedNack(sequence_numbers, 0);
danilchap12ba1862016-10-26 02:41:55 -07001886 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001887}
1888
minyue3a407ee2017-04-03 01:10:33 -07001889TEST_P(RtpSenderTest, OnOverheadChanged) {
michaelt4da30442016-11-17 01:38:43 -08001890 MockOverheadObserver mock_overhead_observer;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001891 rtp_sender_.reset(
1892 new RTPSender(false, &fake_clock_, &transport_, nullptr, absl::nullopt,
1893 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
1894 &retransmission_rate_limiter_, &mock_overhead_observer,
Per Kjellandere11b7d22019-02-21 07:55:59 +01001895 false, nullptr, false, false, FieldTrialBasedConfig()));
nisse7d59f6b2017-02-21 03:40:24 -08001896 rtp_sender_->SetSSRC(kSsrc);
michaelt4da30442016-11-17 01:38:43 -08001897
michaelt4da30442016-11-17 01:38:43 -08001898 // RTP overhead is 12B.
nisse284542b2017-01-10 08:58:32 -08001899 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(12)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001900 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001901
1902 rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
1903 kTransmissionTimeOffsetExtensionId);
1904
1905 // TransmissionTimeOffset extension has a size of 8B.
nisse284542b2017-01-10 08:58:32 -08001906 // 12B + 8B = 20B
1907 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(20)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001908 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001909}
1910
minyue3a407ee2017-04-03 01:10:33 -07001911TEST_P(RtpSenderTest, DoesNotUpdateOverheadOnEqualSize) {
michaelt4da30442016-11-17 01:38:43 -08001912 MockOverheadObserver mock_overhead_observer;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001913 rtp_sender_.reset(
1914 new RTPSender(false, &fake_clock_, &transport_, nullptr, absl::nullopt,
1915 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
1916 &retransmission_rate_limiter_, &mock_overhead_observer,
Per Kjellandere11b7d22019-02-21 07:55:59 +01001917 false, nullptr, false, false, FieldTrialBasedConfig()));
nisse7d59f6b2017-02-21 03:40:24 -08001918 rtp_sender_->SetSSRC(kSsrc);
michaelt4da30442016-11-17 01:38:43 -08001919
1920 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(_)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001921 SendGenericPacket();
1922 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001923}
1924
Erik Språng9c771c22019-06-17 16:31:53 +02001925TEST_P(RtpSenderTest, TrySendPacketMatchesVideo) {
1926 std::unique_ptr<RtpPacketToSend> packet =
1927 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1928 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1929
1930 // Verify not sent with wrong SSRC.
1931 packet->SetSsrc(kSsrc + 1);
1932 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1933
1934 // Verify sent with correct SSRC.
1935 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1936 packet->SetSsrc(kSsrc);
1937 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1938 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1939}
1940
1941TEST_P(RtpSenderTest, TrySendPacketMatchesAudio) {
1942 std::unique_ptr<RtpPacketToSend> packet =
1943 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1944 packet->set_packet_type(RtpPacketToSend::Type::kAudio);
1945
1946 // Verify not sent with wrong SSRC.
1947 packet->SetSsrc(kSsrc + 1);
1948 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1949
1950 // Verify sent with correct SSRC.
1951 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1952 packet->SetSsrc(kSsrc);
1953 packet->set_packet_type(RtpPacketToSend::Type::kAudio);
1954 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1955}
1956
1957TEST_P(RtpSenderTest, TrySendPacketMatchesRetransmissions) {
1958 std::unique_ptr<RtpPacketToSend> packet =
1959 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1960 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1961
1962 // Verify not sent with wrong SSRC.
1963 packet->SetSsrc(kSsrc + 1);
1964 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1965
1966 // Verify sent with correct SSRC (non-RTX).
1967 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1968 packet->SetSsrc(kSsrc);
1969 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1970 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1971
1972 // RTX retransmission.
1973 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1974 packet->SetSsrc(kRtxSsrc);
1975 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1976 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1977}
1978
1979TEST_P(RtpSenderTest, TrySendPacketMatchesPadding) {
1980 std::unique_ptr<RtpPacketToSend> packet =
1981 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1982 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
1983
1984 // Verify not sent with wrong SSRC.
1985 packet->SetSsrc(kSsrc + 1);
1986 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1987
1988 // Verify sent with correct SSRC (non-RTX).
1989 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1990 packet->SetSsrc(kSsrc);
1991 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
1992 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1993
1994 // RTX padding.
1995 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1996 packet->SetSsrc(kRtxSsrc);
1997 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
1998 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
1999}
2000
2001TEST_P(RtpSenderTest, TrySendPacketMatchesFlexfec) {
2002 std::unique_ptr<RtpPacketToSend> packet =
2003 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2004 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2005
2006 // Verify not sent with wrong SSRC.
2007 packet->SetSsrc(kSsrc + 1);
2008 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2009
2010 // Verify sent with correct SSRC.
2011 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2012 packet->SetSsrc(kFlexFecSsrc);
2013 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2014 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2015}
2016
2017TEST_P(RtpSenderTest, TrySendPacketMatchesUlpfec) {
2018 std::unique_ptr<RtpPacketToSend> packet =
2019 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2020 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2021
2022 // Verify not sent with wrong SSRC.
2023 packet->SetSsrc(kSsrc + 1);
2024 EXPECT_FALSE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2025
2026 // Verify sent with correct SSRC.
2027 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2028 packet->SetSsrc(kSsrc);
2029 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2030 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2031}
2032
2033TEST_P(RtpSenderTest, TrySendPacketHandlesRetransmissionHistory) {
2034 rtp_sender_->SetStorePacketsStatus(true, 10);
2035
2036 // Build a media packet and send it.
2037 std::unique_ptr<RtpPacketToSend> packet =
2038 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2039 const uint16_t media_sequence_number = packet->SequenceNumber();
2040 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2041 packet->set_allow_retransmission(true);
2042 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2043
2044 // Simulate retransmission request.
2045 fake_clock_.AdvanceTimeMilliseconds(30);
2046 EXPECT_GT(rtp_sender_->ReSendPacket(media_sequence_number), 0);
2047
2048 // Packet already pending, retransmission not allowed.
2049 fake_clock_.AdvanceTimeMilliseconds(30);
2050 EXPECT_EQ(rtp_sender_->ReSendPacket(media_sequence_number), 0);
2051
2052 // Packet exiting pacer, mark as not longer pending.
2053 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2054 EXPECT_NE(packet->SequenceNumber(), media_sequence_number);
2055 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2056 packet->SetSsrc(kRtxSsrc);
2057 packet->set_retransmitted_sequence_number(media_sequence_number);
2058 packet->set_allow_retransmission(false);
2059 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2060
2061 // Retransmissions allowed again.
2062 fake_clock_.AdvanceTimeMilliseconds(30);
2063 EXPECT_GT(rtp_sender_->ReSendPacket(media_sequence_number), 0);
2064
2065 // Retransmission of RTX packet should not be allowed.
2066 EXPECT_EQ(rtp_sender_->ReSendPacket(packet->SequenceNumber()), 0);
2067}
2068
2069TEST_P(RtpSenderTest, TrySendPacketUpdatesExtensions) {
2070 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2071 kRtpExtensionTransmissionTimeOffset,
2072 kTransmissionTimeOffsetExtensionId),
2073 0);
2074 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2075 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId),
2076 0);
2077 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionVideoTiming,
2078 kVideoTimingExtensionId),
2079 0);
2080
2081 std::unique_ptr<RtpPacketToSend> packet =
2082 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2083 packet->set_packetization_finish_time_ms(fake_clock_.TimeInMilliseconds());
2084
2085 const int32_t kDiffMs = 10;
2086 fake_clock_.AdvanceTimeMilliseconds(kDiffMs);
2087
2088 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2089 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2090
2091 const RtpPacketReceived& received_packet = transport_.last_sent_packet();
2092
2093 EXPECT_EQ(received_packet.GetExtension<TransmissionOffset>(), kDiffMs * 90);
2094
2095 EXPECT_EQ(received_packet.GetExtension<AbsoluteSendTime>(),
2096 AbsoluteSendTime::MsTo24Bits(fake_clock_.TimeInMilliseconds()));
2097
2098 VideoSendTiming timing;
2099 EXPECT_TRUE(received_packet.GetExtension<VideoTimingExtension>(&timing));
2100 EXPECT_EQ(timing.pacer_exit_delta_ms, kDiffMs);
2101}
2102
2103TEST_P(RtpSenderTest, TrySendPacketSetsPacketOptions) {
2104 const uint16_t kPacketId = 42;
2105 ASSERT_EQ(rtp_sender_->RegisterRtpHeaderExtension(
2106 kRtpExtensionTransportSequenceNumber,
2107 kTransportSequenceNumberExtensionId),
2108 0);
2109 std::unique_ptr<RtpPacketToSend> packet =
2110 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2111 packet->SetExtension<TransportSequenceNumber>(kPacketId);
2112
2113 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2114 EXPECT_CALL(send_packet_observer_, OnSendPacket);
2115 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2116
2117 EXPECT_EQ(transport_.last_options_.packet_id, kPacketId);
2118 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
2119 EXPECT_TRUE(transport_.last_options_.included_in_feedback);
2120 EXPECT_FALSE(transport_.last_options_.is_retransmit);
2121
2122 // Send another packet as retransmission, verify options are populated.
2123 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2124 packet->SetExtension<TransportSequenceNumber>(kPacketId + 1);
2125 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2126 EXPECT_TRUE(rtp_sender_->TrySendPacket(packet.get(), PacedPacketInfo()));
2127 EXPECT_TRUE(transport_.last_options_.is_retransmit);
2128}
2129
2130TEST_P(RtpSenderTest, TrySendPacketUpdatesStats) {
2131 const size_t kPayloadSize = 1000;
2132
2133 StrictMock<MockSendSideDelayObserver> send_side_delay_observer;
2134 rtp_sender_.reset(new RTPSender(
2135 false, &fake_clock_, &transport_, nullptr, kFlexFecSsrc, nullptr, nullptr,
2136 nullptr, &send_side_delay_observer, &mock_rtc_event_log_,
2137 &send_packet_observer_, nullptr, nullptr, false, nullptr, false, false,
2138 FieldTrialBasedConfig()));
2139 rtp_sender_->SetSSRC(kSsrc);
2140 rtp_sender_->SetRtxSsrc(kRtxSsrc);
2141 ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
2142 kRtpExtensionTransportSequenceNumber,
2143 kTransportSequenceNumberExtensionId));
2144
2145 const int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
2146
2147 std::unique_ptr<RtpPacketToSend> video_packet =
2148 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2149 video_packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2150 video_packet->SetPayloadSize(kPayloadSize);
2151 video_packet->SetExtension<TransportSequenceNumber>(1);
2152
2153 std::unique_ptr<RtpPacketToSend> rtx_packet =
2154 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2155 rtx_packet->SetSsrc(kRtxSsrc);
2156 rtx_packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2157 rtx_packet->SetPayloadSize(kPayloadSize);
2158 rtx_packet->SetExtension<TransportSequenceNumber>(2);
2159
2160 std::unique_ptr<RtpPacketToSend> fec_packet =
2161 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2162 fec_packet->SetSsrc(kFlexFecSsrc);
2163 fec_packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2164 fec_packet->SetPayloadSize(kPayloadSize);
2165 fec_packet->SetExtension<TransportSequenceNumber>(3);
2166
2167 const int64_t kDiffMs = 25;
2168 fake_clock_.AdvanceTimeMilliseconds(kDiffMs);
2169
2170 EXPECT_CALL(send_side_delay_observer,
2171 SendSideDelayUpdated(kDiffMs, kDiffMs, kDiffMs, kSsrc));
2172 EXPECT_CALL(
2173 send_side_delay_observer,
2174 SendSideDelayUpdated(kDiffMs, kDiffMs, 2 * kDiffMs, kFlexFecSsrc));
2175
2176 EXPECT_CALL(send_packet_observer_, OnSendPacket(1, capture_time_ms, kSsrc));
2177 EXPECT_TRUE(
2178 rtp_sender_->TrySendPacket(video_packet.get(), PacedPacketInfo()));
2179
2180 // Send packet observer not called for padding/retransmissions.
2181 EXPECT_CALL(send_packet_observer_, OnSendPacket(2, _, _)).Times(0);
2182 EXPECT_TRUE(rtp_sender_->TrySendPacket(rtx_packet.get(), PacedPacketInfo()));
2183
2184 EXPECT_CALL(send_packet_observer_,
2185 OnSendPacket(3, capture_time_ms, kFlexFecSsrc));
2186 EXPECT_TRUE(rtp_sender_->TrySendPacket(fec_packet.get(), PacedPacketInfo()));
2187
2188 StreamDataCounters rtp_stats;
2189 StreamDataCounters rtx_stats;
2190 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
2191 EXPECT_EQ(rtp_stats.transmitted.packets, 2u);
2192 EXPECT_EQ(rtp_stats.fec.packets, 1u);
2193 EXPECT_EQ(rtx_stats.retransmitted.packets, 1u);
2194}
2195
Mirko Bonadeic84f6612019-01-31 12:20:57 +01002196INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
2197 RtpSenderTest,
2198 ::testing::Bool());
2199INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
2200 RtpSenderTestWithoutPacer,
2201 ::testing::Bool());
Niels Möllera34d7762019-02-01 14:13:29 +01002202
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +00002203} // namespace webrtc