blob: 25b7c56abd558e9781af3156446e2b7841530c70 [file] [log] [blame]
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +00001/*
phoglund@webrtc.org78088c22012-02-07 14:56:45 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/rtp_rtcp/source/rtp_sender.h"
12
kwiberg84be5112016-04-27 01:19:58 -070013#include <memory>
danilchapb8b6fbb2015-12-10 05:05:27 -080014#include <vector>
15
Danil Chapovalov16cb1f62019-09-05 11:29:59 +020016#include "api/rtc_event_log/rtc_event.h"
Per Kjellandere11b7d22019-02-21 07:55:59 +010017#include "api/transport/field_trial_based_config.h"
Erik Språngf93eda12019-01-16 17:10:57 +010018#include "api/video/video_codec_constants.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/video/video_timing.h"
20#include "logging/rtc_event_log/mock/mock_rtc_event_log.h"
21#include "modules/rtp_rtcp/include/rtp_cvo.h"
22#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
Erik Språngaa59eca2019-07-24 14:52:55 +020023#include "modules/rtp_rtcp/include/rtp_packet_sender.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
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"
Erik Språng77b75292019-10-28 15:51:36 +010032#include "modules/rtp_rtcp/source/rtp_sender_egress.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#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"
Tommi25eb47c2019-08-29 16:39:05 +020041#include "test/rtp_header_parser.h"
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000042
43namespace webrtc {
44
andrew@webrtc.org8a442592011-12-16 21:24:30 +000045namespace {
Elad Alond8d32482019-02-18 23:45:57 +010046enum : int { // The first valid value is 1.
47 kAbsoluteSendTimeExtensionId = 1,
48 kAudioLevelExtensionId,
Elad Alonccb9b752019-02-19 13:01:31 +010049 kGenericDescriptorId00,
50 kGenericDescriptorId01,
Elad Alond8d32482019-02-18 23:45:57 +010051 kMidExtensionId,
52 kRepairedRidExtensionId,
53 kRidExtensionId,
54 kTransmissionTimeOffsetExtensionId,
55 kTransportSequenceNumberExtensionId,
56 kVideoRotationExtensionId,
57 kVideoTimingExtensionId,
58};
59
andrew@webrtc.org8a442592011-12-16 21:24:30 +000060const int kPayload = 100;
Shao Changbine62202f2015-04-21 20:24:50 +080061const int kRtxPayload = 98;
andrew@webrtc.org8a442592011-12-16 21:24:30 +000062const uint32_t kTimestamp = 10;
63const uint16_t kSeqNum = 33;
brandtr9dfff292016-11-14 05:14:50 -080064const uint32_t kSsrc = 725242;
Erik Språng9c771c22019-06-17 16:31:53 +020065const uint32_t kRtxSsrc = 12345;
66const uint32_t kFlexFecSsrc = 45678;
Erik Språng1fbfecd2019-08-26 19:00:05 +020067const uint16_t kTransportSequenceNumber = 1;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +000068const uint64_t kStartTime = 123456789;
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +000069const size_t kMaxPaddingSize = 224u;
Stefan Holmera246cfb2016-08-23 17:51:42 +020070const uint8_t kPayloadData[] = {47, 11, 32, 93, 89};
spranga8ae6f22017-09-04 07:23:56 -070071const int64_t kDefaultExpectedRetransmissionTimeMs = 125;
Amit Hilbuch77938e62018-12-21 09:23:38 -080072const char kNoRid[] = "";
73const char kNoMid[] = "";
andrew@webrtc.org8a442592011-12-16 21:24:30 +000074
Danil Chapovalov5e57b172016-09-02 19:15:59 +020075using ::testing::_;
Erik Språng30a276b2019-04-23 12:00:11 +020076using ::testing::AllOf;
Erik Språngea55b082019-10-02 14:57:46 +020077using ::testing::Contains;
Danil Chapovalov5e57b172016-09-02 19:15:59 +020078using ::testing::ElementsAreArray;
Erik Språng30a276b2019-04-23 12:00:11 +020079using ::testing::Field;
Erik Språng9c771c22019-06-17 16:31:53 +020080using ::testing::NiceMock;
Erik Språng478cb462019-06-26 15:49:27 +020081using ::testing::Pointee;
82using ::testing::Property;
Erik Språng214f5432019-06-20 15:09:58 +020083using ::testing::Return;
Erik Språng9c771c22019-06-17 16:31:53 +020084using ::testing::StrictMock;
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +000085
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +000086uint64_t ConvertMsToAbsSendTime(int64_t time_ms) {
Stefan Holmer0a87ffc2015-10-21 13:41:48 +020087 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +000088}
89
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +000090class LoopbackTransportTest : public webrtc::Transport {
91 public:
Petter Strandmark26bc6692018-05-29 08:43:35 +020092 LoopbackTransportTest() : total_bytes_sent_(0) {
Danil Chapovalova74e4772019-09-12 17:53:04 +020093 receivers_extensions_.Register<TransmissionOffset>(
94 kTransmissionTimeOffsetExtensionId);
95 receivers_extensions_.Register<AbsoluteSendTime>(
96 kAbsoluteSendTimeExtensionId);
97 receivers_extensions_.Register<TransportSequenceNumber>(
98 kTransportSequenceNumberExtensionId);
99 receivers_extensions_.Register<VideoOrientation>(kVideoRotationExtensionId);
100 receivers_extensions_.Register<AudioLevel>(kAudioLevelExtensionId);
101 receivers_extensions_.Register<VideoTimingExtension>(
102 kVideoTimingExtensionId);
103 receivers_extensions_.Register<RtpMid>(kMidExtensionId);
104 receivers_extensions_.Register<RtpGenericFrameDescriptorExtension00>(
105 kGenericDescriptorId00);
106 receivers_extensions_.Register<RtpGenericFrameDescriptorExtension01>(
107 kGenericDescriptorId01);
108 receivers_extensions_.Register<RtpStreamId>(kRidExtensionId);
109 receivers_extensions_.Register<RepairedRtpStreamId>(
110 kRepairedRidExtensionId);
guoweis@webrtc.org45362892015-03-04 22:55:15 +0000111 }
danilchap12ba1862016-10-26 02:41:55 -0700112
stefan1d8a5062015-10-02 03:39:33 -0700113 bool SendRtp(const uint8_t* data,
114 size_t len,
115 const PacketOptions& options) override {
Petter Strandmark26bc6692018-05-29 08:43:35 +0200116 last_options_ = options;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000117 total_bytes_sent_ += len;
danilchap12ba1862016-10-26 02:41:55 -0700118 sent_packets_.push_back(RtpPacketReceived(&receivers_extensions_));
119 EXPECT_TRUE(sent_packets_.back().Parse(data, len));
pbos2d566682015-09-28 09:59:31 -0700120 return true;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000121 }
danilchap162abd32015-12-10 02:39:40 -0800122 bool SendRtcp(const uint8_t* data, size_t len) override { return false; }
danilchap12ba1862016-10-26 02:41:55 -0700123 const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); }
124 int packets_sent() { return sent_packets_.size(); }
125
pbos@webrtc.org72491b92014-07-10 16:24:54 +0000126 size_t total_bytes_sent_;
Petter Strandmark26bc6692018-05-29 08:43:35 +0200127 PacketOptions last_options_;
danilchap12ba1862016-10-26 02:41:55 -0700128 std::vector<RtpPacketReceived> sent_packets_;
129
130 private:
131 RtpHeaderExtensionMap receivers_extensions_;
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000132};
133
Elad Alon4a87e1c2017-10-03 16:11:34 +0200134MATCHER_P(SameRtcEventTypeAs, value, "") {
135 return value == arg->GetType();
136}
137
Erik Språngf6468d22019-07-05 16:53:43 +0200138struct TestConfig {
Erik Språngf5815fa2019-08-21 14:27:31 +0200139 explicit TestConfig(bool with_overhead) : with_overhead(with_overhead) {}
Erik Språngf6468d22019-07-05 16:53:43 +0200140 bool with_overhead = false;
Erik Språngf6468d22019-07-05 16:53:43 +0200141};
142
143std::string ToFieldTrialString(TestConfig config) {
144 std::string field_trials;
145 if (config.with_overhead) {
146 field_trials += "WebRTC-SendSideBwe-WithOverhead/Enabled/";
147 }
Erik Språngf6468d22019-07-05 16:53:43 +0200148 return field_trials;
149}
150
Erik Språngaa59eca2019-07-24 14:52:55 +0200151class MockRtpPacketPacer : public RtpPacketSender {
sprangebbf8a82015-09-21 15:11:14 -0700152 public:
Erik Språng59b86542019-06-23 18:24:46 +0200153 MockRtpPacketPacer() {}
154 virtual ~MockRtpPacketPacer() {}
155
Erik Språngea55b082019-10-02 14:57:46 +0200156 MOCK_METHOD1(EnqueuePackets,
157 void(std::vector<std::unique_ptr<RtpPacketToSend>>));
sprangebbf8a82015-09-21 15:11:14 -0700158
Erik Språngaa59eca2019-07-24 14:52:55 +0200159 MOCK_METHOD2(CreateProbeCluster, void(int bitrate_bps, int cluster_id));
160
161 MOCK_METHOD0(Pause, void());
162 MOCK_METHOD0(Resume, void());
163 MOCK_METHOD1(SetCongestionWindow,
164 void(absl::optional<int64_t> congestion_window_bytes));
165 MOCK_METHOD1(UpdateOutstandingData, void(int64_t outstanding_bytes));
166 MOCK_METHOD1(SetAccountForAudioPackets, void(bool account_for_audio));
sprangebbf8a82015-09-21 15:11:14 -0700167};
168
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200169class MockSendSideDelayObserver : public SendSideDelayObserver {
170 public:
Henrik Boström9fe18342019-05-16 18:38:20 +0200171 MOCK_METHOD4(SendSideDelayUpdated, void(int, int, uint64_t, uint32_t));
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200172};
173
asapersson35151f32016-05-02 23:44:01 -0700174class MockSendPacketObserver : public SendPacketObserver {
175 public:
176 MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t));
177};
178
Stefan Holmera246cfb2016-08-23 17:51:42 +0200179class MockTransportFeedbackObserver : public TransportFeedbackObserver {
180 public:
Erik Språng30a276b2019-04-23 12:00:11 +0200181 MOCK_METHOD1(OnAddPacket, void(const RtpPacketSendInfo&));
Stefan Holmera246cfb2016-08-23 17:51:42 +0200182 MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&));
183};
184
minyue3a407ee2017-04-03 01:10:33 -0700185class MockOverheadObserver : public OverheadObserver {
186 public:
187 MOCK_METHOD1(OnOverheadChanged, void(size_t overhead_bytes_per_packet));
188};
189
Erik Språng7ea9b802019-10-16 19:03:38 +0200190class StreamDataTestCallback : public StreamDataCountersCallback {
191 public:
192 StreamDataTestCallback()
193 : StreamDataCountersCallback(), ssrc_(0), counters_() {}
194 ~StreamDataTestCallback() override = default;
195
196 void DataCountersUpdated(const StreamDataCounters& counters,
197 uint32_t ssrc) override {
198 ssrc_ = ssrc;
199 counters_ = counters;
200 }
201
202 uint32_t ssrc_;
203 StreamDataCounters counters_;
204
205 void MatchPacketCounter(const RtpPacketCounter& expected,
206 const RtpPacketCounter& actual) {
207 EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
208 EXPECT_EQ(expected.header_bytes, actual.header_bytes);
209 EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
210 EXPECT_EQ(expected.packets, actual.packets);
211 }
212
213 void Matches(uint32_t ssrc, const StreamDataCounters& counters) {
214 EXPECT_EQ(ssrc, ssrc_);
215 MatchPacketCounter(counters.transmitted, counters_.transmitted);
216 MatchPacketCounter(counters.retransmitted, counters_.retransmitted);
217 EXPECT_EQ(counters.fec.packets, counters_.fec.packets);
218 }
219};
220
Erik Språng77b75292019-10-28 15:51:36 +0100221// Mimics ModuleRtpRtcp::RtpSenderContext.
222// TODO(sprang): Split up unit tests and test these components individually
223// wherever possible.
224struct RtpSenderContext {
225 explicit RtpSenderContext(const RtpRtcp::Configuration& config)
226 : packet_history_(config.clock),
227 packet_sender_(config, &packet_history_),
228 non_paced_sender_(&packet_sender_),
229 packet_generator_(
230 config,
231 &packet_history_,
232 config.paced_sender ? config.paced_sender : &non_paced_sender_) {}
233 RtpPacketHistory packet_history_;
234 RtpSenderEgress packet_sender_;
235 RtpSenderEgress::NonPacedPacketSender non_paced_sender_;
236 RTPSender packet_generator_;
237};
238
239} // namespace
240
Erik Språngf6468d22019-07-05 16:53:43 +0200241class RtpSenderTest : public ::testing::TestWithParam<TestConfig> {
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000242 protected:
243 RtpSenderTest()
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +0000244 : fake_clock_(kStartTime),
sprangcd349d92016-07-13 09:11:28 -0700245 retransmission_rate_limiter_(&fake_clock_, 1000),
Erik Språng4580ca22019-07-04 10:38:43 +0200246 flexfec_sender_(0,
247 kFlexFecSsrc,
248 kSsrc,
249 "",
250 std::vector<RtpExtension>(),
251 std::vector<RtpExtensionSize>(),
252 nullptr,
253 &fake_clock_),
minyue3a407ee2017-04-03 01:10:33 -0700254 kMarkerBit(true),
Erik Språngf6468d22019-07-05 16:53:43 +0200255 field_trials_(ToFieldTrialString(GetParam())) {}
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000256
Erik Språng7b52f102018-02-07 14:37:37 +0100257 void SetUp() override { SetUpRtpSender(true, false); }
Peter Boströme23e7372015-10-08 11:44:14 +0200258
Erik Språng77b75292019-10-28 15:51:36 +0100259 RTPSender* rtp_sender() {
260 RTC_DCHECK(rtp_sender_context_);
261 return &rtp_sender_context_->packet_generator_;
262 }
263
264 RtpSenderEgress* rtp_egress() {
265 RTC_DCHECK(rtp_sender_context_);
266 return &rtp_sender_context_->packet_sender_;
267 }
268
Erik Språng7b52f102018-02-07 14:37:37 +0100269 void SetUpRtpSender(bool pacer, bool populate_network2) {
Erik Språng4580ca22019-07-04 10:38:43 +0200270 RtpRtcp::Configuration config;
271 config.clock = &fake_clock_;
272 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +0200273 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +0200274 config.rtx_send_ssrc = kRtxSsrc;
275 config.flexfec_sender = &flexfec_sender_;
Erik Språng4580ca22019-07-04 10:38:43 +0200276 config.event_log = &mock_rtc_event_log_;
277 config.send_packet_observer = &send_packet_observer_;
278 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
279 config.paced_sender = pacer ? &mock_paced_sender_ : nullptr;
280 config.populate_network2_timestamp = populate_network2;
Erik Språng7ea9b802019-10-16 19:03:38 +0200281 config.rtp_stats_callback = &rtp_stats_callback_;
Erik Språng77b75292019-10-28 15:51:36 +0100282 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
283 rtp_sender()->SetSequenceNumber(kSeqNum);
284 rtp_sender()->SetTimestampOffset(0);
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +0000285 }
286
stefan@webrtc.orga678a3b2013-01-21 07:42:11 +0000287 SimulatedClock fake_clock_;
Erik Språng9c771c22019-06-17 16:31:53 +0200288 NiceMock<MockRtcEventLog> mock_rtc_event_log_;
Erik Språng59b86542019-06-23 18:24:46 +0200289 MockRtpPacketPacer mock_paced_sender_;
Erik Språng9c771c22019-06-17 16:31:53 +0200290 StrictMock<MockSendPacketObserver> send_packet_observer_;
291 StrictMock<MockTransportFeedbackObserver> feedback_observer_;
sprangcd349d92016-07-13 09:11:28 -0700292 RateLimiter retransmission_rate_limiter_;
Erik Språng4580ca22019-07-04 10:38:43 +0200293 FlexfecSender flexfec_sender_;
Erik Språng77b75292019-10-28 15:51:36 +0100294
295 std::unique_ptr<RtpSenderContext> rtp_sender_context_;
296
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000297 LoopbackTransportTest transport_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000298 const bool kMarkerBit;
minyue3a407ee2017-04-03 01:10:33 -0700299 test::ScopedFieldTrials field_trials_;
Erik Språng7ea9b802019-10-16 19:03:38 +0200300 StreamDataTestCallback rtp_stats_callback_;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000301
danilchapb6f1fb52016-10-19 06:11:39 -0700302 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
303 bool marker_bit,
304 uint32_t timestamp,
305 int64_t capture_time_ms) {
Erik Språng77b75292019-10-28 15:51:36 +0100306 auto packet = rtp_sender()->AllocatePacket();
danilchapb6f1fb52016-10-19 06:11:39 -0700307 packet->SetPayloadType(payload_type);
Erik Språng60ffc312019-07-30 22:03:49 +0200308 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
danilchapb6f1fb52016-10-19 06:11:39 -0700309 packet->SetMarker(marker_bit);
310 packet->SetTimestamp(timestamp);
311 packet->set_capture_time_ms(capture_time_ms);
Erik Språng77b75292019-10-28 15:51:36 +0100312 EXPECT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
danilchapb6f1fb52016-10-19 06:11:39 -0700313 return packet;
314 }
315
Erik Språngf6468d22019-07-05 16:53:43 +0200316 std::unique_ptr<RtpPacketToSend> SendPacket(int64_t capture_time_ms,
317 int payload_length) {
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000318 uint32_t timestamp = capture_time_ms * 90;
danilchapb6f1fb52016-10-19 06:11:39 -0700319 auto packet =
320 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
321 packet->AllocatePayload(payload_length);
Erik Språng70768f42019-08-27 18:16:26 +0200322 packet->set_allow_retransmission(true);
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000323
324 // Packet should be stored in a send bucket.
Erik Språng77b75292019-10-28 15:51:36 +0100325 EXPECT_TRUE(rtp_sender()->SendToNetwork(
326 std::make_unique<RtpPacketToSend>(*packet)));
Erik Språngf6468d22019-07-05 16:53:43 +0200327 return packet;
stefan@webrtc.org7e9315b2013-12-04 10:24:26 +0000328 }
asapersson35151f32016-05-02 23:44:01 -0700329
Erik Språngf6468d22019-07-05 16:53:43 +0200330 std::unique_ptr<RtpPacketToSend> SendGenericPacket() {
asapersson35151f32016-05-02 23:44:01 -0700331 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
Erik Språngf6468d22019-07-05 16:53:43 +0200332 return SendPacket(kCaptureTimeMs, sizeof(kPayloadData));
asapersson35151f32016-05-02 23:44:01 -0700333 }
Steve Anton2bac7da2019-07-21 15:04:21 -0400334
Erik Språng4208a132019-08-26 08:58:45 +0200335 size_t GenerateAndSendPadding(size_t target_size_bytes) {
336 size_t generated_bytes = 0;
Erik Språng77b75292019-10-28 15:51:36 +0100337 for (auto& packet :
338 rtp_sender()->GeneratePadding(target_size_bytes, true)) {
Erik Språng4208a132019-08-26 08:58:45 +0200339 generated_bytes += packet->payload_size() + packet->padding_size();
Erik Språng77b75292019-10-28 15:51:36 +0100340 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng4208a132019-08-26 08:58:45 +0200341 }
342 return generated_bytes;
343 }
344
Steve Anton2bac7da2019-07-21 15:04:21 -0400345 // The following are helpers for configuring the RTPSender. They must be
346 // called before sending any packets.
347
348 // Enable the retransmission stream with sizable packet storage.
349 void EnableRtx() {
350 // RTX needs to be able to read the source packets from the packet store.
351 // Pick a number of packets to store big enough for any unit test.
352 constexpr uint16_t kNumberOfPacketsToStore = 100;
Erik Språng77b75292019-10-28 15:51:36 +0100353 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
354 RtpPacketHistory::StorageMode::kStoreAndCull, kNumberOfPacketsToStore);
355 rtp_sender()->SetRtxPayloadType(kRtxPayload, kPayload);
356 rtp_sender()->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
Steve Anton2bac7da2019-07-21 15:04:21 -0400357 }
358
359 // Enable sending of the MID header extension for both the primary SSRC and
360 // the RTX SSRC.
361 void EnableMidSending(const std::string& mid) {
Erik Språng77b75292019-10-28 15:51:36 +0100362 rtp_sender()->RegisterRtpHeaderExtension(kRtpExtensionMid, kMidExtensionId);
363 rtp_sender()->SetMid(mid);
Steve Anton2bac7da2019-07-21 15:04:21 -0400364 }
365
366 // Enable sending of the RSID header extension for the primary SSRC and the
367 // RRSID header extension for the RTX SSRC.
368 void EnableRidSending(const std::string& rid) {
Erik Språng77b75292019-10-28 15:51:36 +0100369 rtp_sender()->RegisterRtpHeaderExtension(kRtpExtensionRtpStreamId,
370 kRidExtensionId);
371 rtp_sender()->RegisterRtpHeaderExtension(kRtpExtensionRepairedRtpStreamId,
372 kRepairedRidExtensionId);
373 rtp_sender()->SetRid(rid);
Steve Anton2bac7da2019-07-21 15:04:21 -0400374 }
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000375};
376
Peter Boströme23e7372015-10-08 11:44:14 +0200377// TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our
378// default code path.
379class RtpSenderTestWithoutPacer : public RtpSenderTest {
380 public:
Erik Språng7b52f102018-02-07 14:37:37 +0100381 void SetUp() override { SetUpRtpSender(false, false); }
Peter Boströme23e7372015-10-08 11:44:14 +0200382};
383
minyue3a407ee2017-04-03 01:10:33 -0700384TEST_P(RtpSenderTestWithoutPacer, AllocatePacketSetCsrc) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200385 // Configure rtp_sender with csrc.
386 std::vector<uint32_t> csrcs;
387 csrcs.push_back(0x23456789);
Erik Språng77b75292019-10-28 15:51:36 +0100388 rtp_sender()->SetCsrcs(csrcs);
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200389
Erik Språng77b75292019-10-28 15:51:36 +0100390 auto packet = rtp_sender()->AllocatePacket();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200391
392 ASSERT_TRUE(packet);
Erik Språng77b75292019-10-28 15:51:36 +0100393 EXPECT_EQ(rtp_sender()->SSRC(), packet->Ssrc());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200394 EXPECT_EQ(csrcs, packet->Csrcs());
395}
396
minyue3a407ee2017-04-03 01:10:33 -0700397TEST_P(RtpSenderTestWithoutPacer, AllocatePacketReserveExtensions) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200398 // Configure rtp_sender with extensions.
Erik Språng77b75292019-10-28 15:51:36 +0100399 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200400 kRtpExtensionTransmissionTimeOffset,
401 kTransmissionTimeOffsetExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +0100402 ASSERT_EQ(0,
403 rtp_sender()->RegisterRtpHeaderExtension(
404 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
405 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
406 kRtpExtensionAudioLevel, kAudioLevelExtensionId));
407 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200408 kRtpExtensionTransportSequenceNumber,
409 kTransportSequenceNumberExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +0100410 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200411 kRtpExtensionVideoRotation, kVideoRotationExtensionId));
412
Erik Språng77b75292019-10-28 15:51:36 +0100413 auto packet = rtp_sender()->AllocatePacket();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200414
415 ASSERT_TRUE(packet);
416 // Preallocate BWE extensions RtpSender set itself.
417 EXPECT_TRUE(packet->HasExtension<TransmissionOffset>());
418 EXPECT_TRUE(packet->HasExtension<AbsoluteSendTime>());
419 EXPECT_TRUE(packet->HasExtension<TransportSequenceNumber>());
420 // Do not allocate media specific extensions.
421 EXPECT_FALSE(packet->HasExtension<AudioLevel>());
422 EXPECT_FALSE(packet->HasExtension<VideoOrientation>());
423}
424
minyue3a407ee2017-04-03 01:10:33 -0700425TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberAdvanceSequenceNumber) {
Erik Språng77b75292019-10-28 15:51:36 +0100426 auto packet = rtp_sender()->AllocatePacket();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200427 ASSERT_TRUE(packet);
Erik Språng77b75292019-10-28 15:51:36 +0100428 const uint16_t sequence_number = rtp_sender()->SequenceNumber();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200429
Erik Språng77b75292019-10-28 15:51:36 +0100430 EXPECT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200431
432 EXPECT_EQ(sequence_number, packet->SequenceNumber());
Erik Språng77b75292019-10-28 15:51:36 +0100433 EXPECT_EQ(sequence_number + 1, rtp_sender()->SequenceNumber());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200434}
435
minyue3a407ee2017-04-03 01:10:33 -0700436TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberFailsOnNotSending) {
Erik Språng77b75292019-10-28 15:51:36 +0100437 auto packet = rtp_sender()->AllocatePacket();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200438 ASSERT_TRUE(packet);
439
Erik Språng77b75292019-10-28 15:51:36 +0100440 rtp_sender()->SetSendingMediaStatus(false);
441 EXPECT_FALSE(rtp_sender()->AssignSequenceNumber(packet.get()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200442}
443
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100444TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberMayAllowPaddingOnVideo) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200445 constexpr size_t kPaddingSize = 100;
Erik Språng77b75292019-10-28 15:51:36 +0100446 auto packet = rtp_sender()->AllocatePacket();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200447 ASSERT_TRUE(packet);
448
Erik Språng77b75292019-10-28 15:51:36 +0100449 ASSERT_TRUE(rtp_sender()->GeneratePadding(kPaddingSize, true).empty());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200450 packet->SetMarker(false);
Erik Språng77b75292019-10-28 15:51:36 +0100451 ASSERT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100452 // Packet without marker bit doesn't allow padding on video stream.
Erik Språng77b75292019-10-28 15:51:36 +0100453 ASSERT_TRUE(rtp_sender()->GeneratePadding(kPaddingSize, true).empty());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200454
455 packet->SetMarker(true);
Erik Språng77b75292019-10-28 15:51:36 +0100456 ASSERT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200457 // Packet with marker bit allows send padding.
Erik Språng77b75292019-10-28 15:51:36 +0100458 ASSERT_FALSE(rtp_sender()->GeneratePadding(kPaddingSize, true).empty());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200459}
460
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100461TEST_P(RtpSenderTest, AssignSequenceNumberAllowsPaddingOnAudio) {
462 MockTransport transport;
Erik Språng4580ca22019-07-04 10:38:43 +0200463 RtpRtcp::Configuration config;
464 config.audio = true;
465 config.clock = &fake_clock_;
466 config.outgoing_transport = &transport;
467 config.paced_sender = &mock_paced_sender_;
Erik Språng54d5d2c2019-08-20 17:22:36 +0200468 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +0200469 config.event_log = &mock_rtc_event_log_;
470 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
Erik Språng77b75292019-10-28 15:51:36 +0100471 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Erik Språng4580ca22019-07-04 10:38:43 +0200472
Erik Språng77b75292019-10-28 15:51:36 +0100473 rtp_sender()->SetTimestampOffset(0);
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100474
Erik Språng77b75292019-10-28 15:51:36 +0100475 std::unique_ptr<RtpPacketToSend> audio_packet =
476 rtp_sender()->AllocatePacket();
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100477 // Padding on audio stream allowed regardless of marker in the last packet.
478 audio_packet->SetMarker(false);
479 audio_packet->SetPayloadType(kPayload);
Erik Språng77b75292019-10-28 15:51:36 +0100480 rtp_sender()->AssignSequenceNumber(audio_packet.get());
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100481
482 const size_t kPaddingSize = 59;
483 EXPECT_CALL(transport, SendRtp(_, kPaddingSize + kRtpHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +0200484 .WillOnce(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200485 EXPECT_EQ(kPaddingSize, GenerateAndSendPadding(kPaddingSize));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100486
487 // Requested padding size is too small, will send a larger one.
488 const size_t kMinPaddingSize = 50;
489 EXPECT_CALL(transport, SendRtp(_, kMinPaddingSize + kRtpHeaderSize, _))
Erik Språng214f5432019-06-20 15:09:58 +0200490 .WillOnce(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200491 EXPECT_EQ(kMinPaddingSize, GenerateAndSendPadding(kMinPaddingSize - 5));
Danil Chapovalovb3179c72018-03-22 10:13:07 +0100492}
493
minyue3a407ee2017-04-03 01:10:33 -0700494TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberSetPaddingTimestamps) {
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200495 constexpr size_t kPaddingSize = 100;
Erik Språng77b75292019-10-28 15:51:36 +0100496 auto packet = rtp_sender()->AllocatePacket();
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200497 ASSERT_TRUE(packet);
498 packet->SetMarker(true);
499 packet->SetTimestamp(kTimestamp);
500
Erik Språng77b75292019-10-28 15:51:36 +0100501 ASSERT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
502 auto padding_packets = rtp_sender()->GeneratePadding(kPaddingSize, true);
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200503
Erik Språng4208a132019-08-26 08:58:45 +0200504 ASSERT_EQ(1u, padding_packets.size());
danilchap12ba1862016-10-26 02:41:55 -0700505 // Verify padding packet timestamp.
Erik Språng4208a132019-08-26 08:58:45 +0200506 EXPECT_EQ(kTimestamp, padding_packets[0]->Timestamp());
Danil Chapovalov5e57b172016-09-02 19:15:59 +0200507}
508
minyue3a407ee2017-04-03 01:10:33 -0700509TEST_P(RtpSenderTestWithoutPacer,
510 TransportFeedbackObserverGetsCorrectByteCount) {
511 constexpr int kRtpOverheadBytesPerPacket = 12 + 8;
Erik Språng9c771c22019-06-17 16:31:53 +0200512 NiceMock<MockOverheadObserver> mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +0200513
514 RtpRtcp::Configuration config;
515 config.clock = &fake_clock_;
516 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +0200517 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +0200518 config.transport_feedback_callback = &feedback_observer_;
519 config.event_log = &mock_rtc_event_log_;
520 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
521 config.overhead_observer = &mock_overhead_observer;
Erik Språng77b75292019-10-28 15:51:36 +0100522 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Erik Språng4580ca22019-07-04 10:38:43 +0200523
Erik Språng77b75292019-10-28 15:51:36 +0100524 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
minyue3a407ee2017-04-03 01:10:33 -0700525 kRtpExtensionTransportSequenceNumber,
526 kTransportSequenceNumberExtensionId));
minyue3a407ee2017-04-03 01:10:33 -0700527
528 const size_t expected_bytes =
Erik Språngf6468d22019-07-05 16:53:43 +0200529 GetParam().with_overhead
530 ? sizeof(kPayloadData) + kRtpOverheadBytesPerPacket
531 : sizeof(kPayloadData);
minyue3a407ee2017-04-03 01:10:33 -0700532
533 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200534 OnAddPacket(AllOf(
Erik Språng77b75292019-10-28 15:51:36 +0100535 Field(&RtpPacketSendInfo::ssrc, rtp_sender()->SSRC()),
Erik Språng30a276b2019-04-23 12:00:11 +0200536 Field(&RtpPacketSendInfo::transport_sequence_number,
537 kTransportSequenceNumber),
538 Field(&RtpPacketSendInfo::rtp_sequence_number,
Erik Språng77b75292019-10-28 15:51:36 +0100539 rtp_sender()->SequenceNumber()),
Erik Språng30a276b2019-04-23 12:00:11 +0200540 Field(&RtpPacketSendInfo::length, expected_bytes),
541 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
minyue3a407ee2017-04-03 01:10:33 -0700542 .Times(1);
543 EXPECT_CALL(mock_overhead_observer,
544 OnOverheadChanged(kRtpOverheadBytesPerPacket))
545 .Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100546 SendGenericPacket();
minyue3a407ee2017-04-03 01:10:33 -0700547}
548
549TEST_P(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) {
Erik Språng4580ca22019-07-04 10:38:43 +0200550 RtpRtcp::Configuration config;
551 config.clock = &fake_clock_;
552 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +0200553 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +0200554 config.transport_feedback_callback = &feedback_observer_;
555 config.event_log = &mock_rtc_event_log_;
556 config.send_packet_observer = &send_packet_observer_;
557 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
Erik Språng77b75292019-10-28 15:51:36 +0100558 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Erik Språng4580ca22019-07-04 10:38:43 +0200559
Erik Språng77b75292019-10-28 15:51:36 +0100560 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Stefan Holmerf5dca482016-01-27 12:58:51 +0100561 kRtpExtensionTransportSequenceNumber,
562 kTransportSequenceNumberExtensionId));
563
asapersson35151f32016-05-02 23:44:01 -0700564 EXPECT_CALL(send_packet_observer_,
565 OnSendPacket(kTransportSequenceNumber, _, _))
566 .Times(1);
minyue3a407ee2017-04-03 01:10:33 -0700567
568 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200569 OnAddPacket(AllOf(
Erik Språng77b75292019-10-28 15:51:36 +0100570 Field(&RtpPacketSendInfo::ssrc, rtp_sender()->SSRC()),
Erik Språng30a276b2019-04-23 12:00:11 +0200571 Field(&RtpPacketSendInfo::transport_sequence_number,
572 kTransportSequenceNumber),
573 Field(&RtpPacketSendInfo::rtp_sequence_number,
Erik Språng77b75292019-10-28 15:51:36 +0100574 rtp_sender()->SequenceNumber()),
Erik Språng30a276b2019-04-23 12:00:11 +0200575 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
Stefan Holmera246cfb2016-08-23 17:51:42 +0200576 .Times(1);
asapersson35151f32016-05-02 23:44:01 -0700577
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100578 SendGenericPacket();
Stefan Holmerf5dca482016-01-27 12:58:51 +0100579
danilchap12ba1862016-10-26 02:41:55 -0700580 const auto& packet = transport_.last_sent_packet();
581 uint16_t transport_seq_no;
582 ASSERT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
583 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200584 EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200585 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200586}
587
588TEST_P(RtpSenderTestWithoutPacer, PacketOptionsNoRetransmission) {
Erik Språng4580ca22019-07-04 10:38:43 +0200589 RtpRtcp::Configuration config;
590 config.clock = &fake_clock_;
591 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +0200592 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +0200593 config.transport_feedback_callback = &feedback_observer_;
594 config.event_log = &mock_rtc_event_log_;
595 config.send_packet_observer = &send_packet_observer_;
596 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
Erik Språng77b75292019-10-28 15:51:36 +0100597 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200598
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100599 SendGenericPacket();
Petter Strandmark26bc6692018-05-29 08:43:35 +0200600
601 EXPECT_FALSE(transport_.last_options_.is_retransmit);
Stefan Holmerf5dca482016-01-27 12:58:51 +0100602}
603
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200604TEST_P(RtpSenderTestWithoutPacer,
605 SetsIncludedInFeedbackWhenTransportSequenceNumberExtensionIsRegistered) {
606 SetUpRtpSender(false, false);
Erik Språng77b75292019-10-28 15:51:36 +0100607 rtp_sender()->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
608 kTransportSequenceNumberExtensionId);
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200609 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100610 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200611 EXPECT_TRUE(transport_.last_options_.included_in_feedback);
612}
613
614TEST_P(
615 RtpSenderTestWithoutPacer,
616 SetsIncludedInAllocationWhenTransportSequenceNumberExtensionIsRegistered) {
617 SetUpRtpSender(false, false);
Erik Språng77b75292019-10-28 15:51:36 +0100618 rtp_sender()->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
619 kTransportSequenceNumberExtensionId);
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200620 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100621 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200622 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
623}
624
625TEST_P(RtpSenderTestWithoutPacer,
626 SetsIncludedInAllocationWhenForcedAsPartOfAllocation) {
627 SetUpRtpSender(false, false);
Erik Språng77b75292019-10-28 15:51:36 +0100628 rtp_egress()->ForceIncludeSendPacketsInAllocation(true);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100629 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200630 EXPECT_FALSE(transport_.last_options_.included_in_feedback);
631 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
632}
633
634TEST_P(RtpSenderTestWithoutPacer, DoesnSetIncludedInAllocationByDefault) {
635 SetUpRtpSender(false, false);
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100636 SendGenericPacket();
Sebastian Jansson1bca65b2018-10-10 09:58:08 +0200637 EXPECT_FALSE(transport_.last_options_.included_in_feedback);
638 EXPECT_FALSE(transport_.last_options_.included_in_allocation);
stefana23fc622016-07-28 07:56:38 -0700639}
asapersson35151f32016-05-02 23:44:01 -0700640
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200641TEST_P(RtpSenderTestWithoutPacer, OnSendSideDelayUpdated) {
Erik Språng9c771c22019-06-17 16:31:53 +0200642 StrictMock<MockSendSideDelayObserver> send_side_delay_observer_;
Erik Språng4580ca22019-07-04 10:38:43 +0200643
644 RtpRtcp::Configuration config;
645 config.clock = &fake_clock_;
646 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +0200647 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +0200648 config.send_side_delay_observer = &send_side_delay_observer_;
649 config.event_log = &mock_rtc_event_log_;
Erik Språng77b75292019-10-28 15:51:36 +0100650 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Erik Språng4580ca22019-07-04 10:38:43 +0200651
Niels Möller5fe95102019-03-04 16:49:25 +0100652 PlayoutDelayOracle playout_delay_oracle;
Erik Språngdc34a252019-10-04 15:17:29 +0200653 FieldTrialBasedConfig field_trials;
654 RTPSenderVideo::Config video_config;
655 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +0100656 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +0200657 video_config.playout_delay_oracle = &playout_delay_oracle;
658 video_config.field_trials = &field_trials;
659 RTPSenderVideo rtp_sender_video(video_config);
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200660
661 const uint8_t kPayloadType = 127;
Erik Språng6cf554e2019-10-02 20:55:39 +0200662 const absl::optional<VideoCodecType> kCodecType =
663 VideoCodecType::kVideoCodecGeneric;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100664
665 const uint32_t kCaptureTimeMsToRtpTimestamp = 90; // 90 kHz clock
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200666 RTPVideoHeader video_header;
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200667
Henrik Boström9fe18342019-05-16 18:38:20 +0200668 // Send packet with 10 ms send-side delay. The average, max and total should
669 // be 10 ms.
670 EXPECT_CALL(send_side_delay_observer_,
671 SendSideDelayUpdated(10, 10, 10, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200672 .Times(1);
673 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
674 fake_clock_.AdvanceTimeMilliseconds(10);
Danil Chapovalov51bf2002019-10-11 10:53:27 +0200675 video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100676 EXPECT_TRUE(rtp_sender_video.SendVideo(
Danil Chapovalov51bf2002019-10-11 10:53:27 +0200677 kPayloadType, kCodecType, capture_time_ms * kCaptureTimeMsToRtpTimestamp,
678 capture_time_ms, kPayloadData, nullptr, video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200679 kDefaultExpectedRetransmissionTimeMs));
680
Henrik Boström9fe18342019-05-16 18:38:20 +0200681 // Send another packet with 20 ms delay. The average, max and total should be
682 // 15, 20 and 30 ms respectively.
683 EXPECT_CALL(send_side_delay_observer_,
684 SendSideDelayUpdated(15, 20, 30, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200685 .Times(1);
686 fake_clock_.AdvanceTimeMilliseconds(10);
Danil Chapovalov51bf2002019-10-11 10:53:27 +0200687 video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100688 EXPECT_TRUE(rtp_sender_video.SendVideo(
Danil Chapovalov51bf2002019-10-11 10:53:27 +0200689 kPayloadType, kCodecType, capture_time_ms * kCaptureTimeMsToRtpTimestamp,
690 capture_time_ms, kPayloadData, nullptr, video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200691 kDefaultExpectedRetransmissionTimeMs));
692
693 // Send another packet at the same time, which replaces the last packet.
694 // 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 +0200695 // The total counter stays the same though.
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200696 // TODO(terelius): Is is not clear that this is the right behavior.
Henrik Boström9fe18342019-05-16 18:38:20 +0200697 EXPECT_CALL(send_side_delay_observer_, SendSideDelayUpdated(5, 10, 30, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200698 .Times(1);
699 capture_time_ms = fake_clock_.TimeInMilliseconds();
Danil Chapovalov51bf2002019-10-11 10:53:27 +0200700 video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100701 EXPECT_TRUE(rtp_sender_video.SendVideo(
Danil Chapovalov51bf2002019-10-11 10:53:27 +0200702 kPayloadType, kCodecType, capture_time_ms * kCaptureTimeMsToRtpTimestamp,
703 capture_time_ms, kPayloadData, nullptr, video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200704 kDefaultExpectedRetransmissionTimeMs));
705
706 // Send a packet 1 second later. The earlier packets should have timed
Henrik Boström9fe18342019-05-16 18:38:20 +0200707 // out, so both max and average should be the delay of this packet. The total
708 // keeps increasing.
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200709 fake_clock_.AdvanceTimeMilliseconds(1000);
710 capture_time_ms = fake_clock_.TimeInMilliseconds();
711 fake_clock_.AdvanceTimeMilliseconds(1);
Henrik Boström9fe18342019-05-16 18:38:20 +0200712 EXPECT_CALL(send_side_delay_observer_, SendSideDelayUpdated(1, 1, 31, kSsrc))
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200713 .Times(1);
Danil Chapovalov51bf2002019-10-11 10:53:27 +0200714 video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möller59ab1cf2019-02-06 22:48:11 +0100715 EXPECT_TRUE(rtp_sender_video.SendVideo(
Danil Chapovalov51bf2002019-10-11 10:53:27 +0200716 kPayloadType, kCodecType, capture_time_ms * kCaptureTimeMsToRtpTimestamp,
717 capture_time_ms, kPayloadData, nullptr, video_header,
Johannes Kron4a8a5e72018-09-26 09:57:48 +0200718 kDefaultExpectedRetransmissionTimeMs));
719}
720
minyue3a407ee2017-04-03 01:10:33 -0700721TEST_P(RtpSenderTestWithoutPacer, OnSendPacketUpdated) {
Erik Språng77b75292019-10-28 15:51:36 +0100722 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
stefana23fc622016-07-28 07:56:38 -0700723 kRtpExtensionTransportSequenceNumber,
724 kTransportSequenceNumberExtensionId));
asapersson35151f32016-05-02 23:44:01 -0700725 EXPECT_CALL(send_packet_observer_,
726 OnSendPacket(kTransportSequenceNumber, _, _))
727 .Times(1);
728
Niels Möllere7b9e6b2019-02-06 18:23:44 +0100729 SendGenericPacket();
asapersson35151f32016-05-02 23:44:01 -0700730}
731
minyue3a407ee2017-04-03 01:10:33 -0700732TEST_P(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) {
Erik Språng4580ca22019-07-04 10:38:43 +0200733 RtpRtcp::Configuration config;
734 config.clock = &fake_clock_;
735 config.outgoing_transport = &transport_;
736 config.paced_sender = &mock_paced_sender_;
Erik Språng54d5d2c2019-08-20 17:22:36 +0200737 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +0200738 config.transport_feedback_callback = &feedback_observer_;
739 config.event_log = &mock_rtc_event_log_;
740 config.send_packet_observer = &send_packet_observer_;
741 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
Erik Språng77b75292019-10-28 15:51:36 +0100742 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Erik Språng4580ca22019-07-04 10:38:43 +0200743
Erik Språng77b75292019-10-28 15:51:36 +0100744 rtp_sender()->SetSequenceNumber(kSeqNum);
745 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
746 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
747 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Stefan Holmera246cfb2016-08-23 17:51:42 +0200748 kRtpExtensionTransportSequenceNumber,
749 kTransportSequenceNumberExtensionId));
750
Stefan Holmera246cfb2016-08-23 17:51:42 +0200751 EXPECT_CALL(send_packet_observer_,
752 OnSendPacket(kTransportSequenceNumber, _, _))
753 .Times(1);
minyue3a407ee2017-04-03 01:10:33 -0700754 EXPECT_CALL(feedback_observer_,
Erik Språng30a276b2019-04-23 12:00:11 +0200755 OnAddPacket(AllOf(
Erik Språng77b75292019-10-28 15:51:36 +0100756 Field(&RtpPacketSendInfo::ssrc, rtp_sender()->SSRC()),
Erik Språng30a276b2019-04-23 12:00:11 +0200757 Field(&RtpPacketSendInfo::transport_sequence_number,
758 kTransportSequenceNumber),
759 Field(&RtpPacketSendInfo::rtp_sequence_number,
Erik Språng77b75292019-10-28 15:51:36 +0100760 rtp_sender()->SequenceNumber()),
Erik Språng30a276b2019-04-23 12:00:11 +0200761 Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
Stefan Holmera246cfb2016-08-23 17:51:42 +0200762 .Times(1);
763
Erik Språngf5815fa2019-08-21 14:27:31 +0200764 EXPECT_CALL(
765 mock_paced_sender_,
Erik Språngea55b082019-10-02 14:57:46 +0200766 EnqueuePackets(Contains(AllOf(
767 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
768 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum))))));
Erik Språngf5815fa2019-08-21 14:27:31 +0200769 auto packet = SendGenericPacket();
770 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Erik Språng77b75292019-10-28 15:51:36 +0100771 // Transport sequence number is set by PacketRouter, before SendPacket().
Erik Språngf5815fa2019-08-21 14:27:31 +0200772 packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
Erik Språng77b75292019-10-28 15:51:36 +0100773 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Stefan Holmera246cfb2016-08-23 17:51:42 +0200774
danilchap12ba1862016-10-26 02:41:55 -0700775 uint16_t transport_seq_no;
Erik Språngf5815fa2019-08-21 14:27:31 +0200776 EXPECT_TRUE(
777 transport_.last_sent_packet().GetExtension<TransportSequenceNumber>(
778 &transport_seq_no));
danilchap12ba1862016-10-26 02:41:55 -0700779 EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
Petter Strandmark26bc6692018-05-29 08:43:35 +0200780 EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
Stefan Holmera246cfb2016-08-23 17:51:42 +0200781}
782
Erik Språng7b52f102018-02-07 14:37:37 +0100783TEST_P(RtpSenderTest, WritesPacerExitToTimingExtension) {
Erik Språng77b75292019-10-28 15:51:36 +0100784 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
785 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
786 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
ilnik04f4d122017-06-19 07:18:55 -0700787 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
788 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
Erik Språng77b75292019-10-28 15:51:36 +0100789 auto packet = rtp_sender()->AllocatePacket();
ilnik04f4d122017-06-19 07:18:55 -0700790 packet->SetPayloadType(kPayload);
791 packet->SetMarker(true);
792 packet->SetTimestamp(kTimestamp);
793 packet->set_capture_time_ms(capture_time_ms);
ilnik2edc6842017-07-06 03:06:50 -0700794 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
ilnik04f4d122017-06-19 07:18:55 -0700795 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
Erik Språng77b75292019-10-28 15:51:36 +0100796 EXPECT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
ilnik04f4d122017-06-19 07:18:55 -0700797 size_t packet_size = packet->size();
ilnik04f4d122017-06-19 07:18:55 -0700798
799 const int kStoredTimeInMs = 100;
Erik Språngf5815fa2019-08-21 14:27:31 +0200800 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Erik Språng70768f42019-08-27 18:16:26 +0200801 packet->set_allow_retransmission(true);
Erik Språngea55b082019-10-02 14:57:46 +0200802 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(Contains(Pointee(Property(
803 &RtpPacketToSend::Ssrc, kSsrc)))));
Erik Språng70768f42019-08-27 18:16:26 +0200804 EXPECT_TRUE(
Erik Språng77b75292019-10-28 15:51:36 +0100805 rtp_sender()->SendToNetwork(std::make_unique<RtpPacketToSend>(*packet)));
Erik Språngf5815fa2019-08-21 14:27:31 +0200806 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
Erik Språng77b75292019-10-28 15:51:36 +0100807 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
ilnik04f4d122017-06-19 07:18:55 -0700808 EXPECT_EQ(1, transport_.packets_sent());
809 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
810
danilchapce251812017-09-11 12:24:41 -0700811 VideoSendTiming video_timing;
812 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
813 &video_timing));
814 EXPECT_EQ(kStoredTimeInMs, video_timing.pacer_exit_delta_ms);
Erik Språng7b52f102018-02-07 14:37:37 +0100815}
ilnik04f4d122017-06-19 07:18:55 -0700816
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100817TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithPacer) {
818 SetUpRtpSender(/*pacer=*/true, /*populate_network2=*/true);
Erik Språng77b75292019-10-28 15:51:36 +0100819 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
820 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
821 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng7b52f102018-02-07 14:37:37 +0100822 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
823 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
Erik Språng77b75292019-10-28 15:51:36 +0100824 auto packet = rtp_sender()->AllocatePacket();
Erik Språng7b52f102018-02-07 14:37:37 +0100825 packet->SetPayloadType(kPayload);
826 packet->SetMarker(true);
827 packet->SetTimestamp(kTimestamp);
828 packet->set_capture_time_ms(capture_time_ms);
829 const uint16_t kPacerExitMs = 1234u;
830 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, kPacerExitMs, 0u, 0u, true};
831 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
Erik Språng77b75292019-10-28 15:51:36 +0100832 EXPECT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
Erik Språng7b52f102018-02-07 14:37:37 +0100833 size_t packet_size = packet->size();
834
835 const int kStoredTimeInMs = 100;
Erik Språngf6468d22019-07-05 16:53:43 +0200836
Erik Språngf6468d22019-07-05 16:53:43 +0200837 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Erik Språng70768f42019-08-27 18:16:26 +0200838 packet->set_allow_retransmission(true);
Erik Språngea55b082019-10-02 14:57:46 +0200839 EXPECT_CALL(mock_paced_sender_, EnqueuePackets(Contains(Pointee(Property(
840 &RtpPacketToSend::Ssrc, kSsrc)))));
Erik Språng77b75292019-10-28 15:51:36 +0100841 EXPECT_TRUE(rtp_sender()->SendToNetwork(
842 std::make_unique<RtpPacketToSend>(*packet)));
Erik Språnga81e2b42019-10-28 11:17:07 +0000843 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
Erik Språng77b75292019-10-28 15:51:36 +0100844 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språnga81e2b42019-10-28 11:17:07 +0000845
Erik Språng77b75292019-10-28 15:51:36 +0100846 EXPECT_EQ(1, transport_.packets_sent());
847 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
Erik Språnga81e2b42019-10-28 11:17:07 +0000848
Erik Språng77b75292019-10-28 15:51:36 +0100849 VideoSendTiming video_timing;
850 EXPECT_TRUE(
851 transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
852 &video_timing));
853 EXPECT_EQ(kStoredTimeInMs, video_timing.network2_timestamp_delta_ms);
854 EXPECT_EQ(kPacerExitMs, video_timing.pacer_exit_delta_ms);
ilnik04f4d122017-06-19 07:18:55 -0700855}
856
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100857TEST_P(RtpSenderTest, WritesNetwork2ToTimingExtensionWithoutPacer) {
858 SetUpRtpSender(/*pacer=*/false, /*populate_network2=*/true);
Erik Språng77b75292019-10-28 15:51:36 +0100859 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100860 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +0100861 auto packet = rtp_sender()->AllocatePacket();
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100862 packet->SetMarker(true);
863 packet->set_capture_time_ms(fake_clock_.TimeInMilliseconds());
864 const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
865 packet->SetExtension<VideoTimingExtension>(kVideoTiming);
Erik Språng70768f42019-08-27 18:16:26 +0200866 packet->set_allow_retransmission(true);
Erik Språng77b75292019-10-28 15:51:36 +0100867 EXPECT_TRUE(rtp_sender()->AssignSequenceNumber(packet.get()));
Erik Språng1fbfecd2019-08-26 19:00:05 +0200868 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100869
870 const int kPropagateTimeMs = 10;
871 fake_clock_.AdvanceTimeMilliseconds(kPropagateTimeMs);
872
Erik Språng77b75292019-10-28 15:51:36 +0100873 EXPECT_TRUE(rtp_sender()->SendToNetwork(std::move(packet)));
Danil Chapovalovaf52b682018-11-27 10:48:27 +0100874
875 EXPECT_EQ(1, transport_.packets_sent());
876 absl::optional<VideoSendTiming> video_timing =
877 transport_.last_sent_packet().GetExtension<VideoTimingExtension>();
878 ASSERT_TRUE(video_timing);
879 EXPECT_EQ(kPropagateTimeMs, video_timing->network2_timestamp_delta_ms);
880}
881
minyue3a407ee2017-04-03 01:10:33 -0700882TEST_P(RtpSenderTest, TrafficSmoothingWithExtensions) {
Elad Alon4a87e1c2017-10-03 16:11:34 +0200883 EXPECT_CALL(mock_rtc_event_log_,
884 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000885
Erik Språng77b75292019-10-28 15:51:36 +0100886 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
887 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
888 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800889 kRtpExtensionTransmissionTimeOffset,
890 kTransmissionTimeOffsetExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +0100891 EXPECT_EQ(0,
892 rtp_sender()->RegisterRtpHeaderExtension(
893 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000894 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700895 auto packet =
896 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
897 size_t packet_size = packet->size();
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000898
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000899 const int kStoredTimeInMs = 100;
Erik Språngea55b082019-10-02 14:57:46 +0200900 EXPECT_CALL(
901 mock_paced_sender_,
902 EnqueuePackets(Contains(AllOf(
903 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
904 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum))))));
905 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
906 packet->set_allow_retransmission(true);
907 EXPECT_TRUE(
Erik Språng77b75292019-10-28 15:51:36 +0100908 rtp_sender()->SendToNetwork(std::make_unique<RtpPacketToSend>(*packet)));
Erik Språngea55b082019-10-02 14:57:46 +0200909 EXPECT_EQ(0, transport_.packets_sent());
910 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
Erik Språng77b75292019-10-28 15:51:36 +0100911 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000912
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +0000913 // Process send bucket. Packet should now be sent.
danilchap12ba1862016-10-26 02:41:55 -0700914 EXPECT_EQ(1, transport_.packets_sent());
915 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
916
stefan@webrtc.orga5cb98c2013-05-29 12:12:51 +0000917 webrtc::RTPHeader rtp_header;
danilchap12ba1862016-10-26 02:41:55 -0700918 transport_.last_sent_packet().GetHeader(&rtp_header);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000919
920 // Verify transmission time offset.
921 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000922 uint64_t expected_send_time =
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000923 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
solenberg@webrtc.org7ebbea12013-05-16 11:10:31 +0000924 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000925}
926
minyue3a407ee2017-04-03 01:10:33 -0700927TEST_P(RtpSenderTest, TrafficSmoothingRetransmits) {
Elad Alon4a87e1c2017-10-03 16:11:34 +0200928 EXPECT_CALL(mock_rtc_event_log_,
929 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000930
Erik Språng77b75292019-10-28 15:51:36 +0100931 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
932 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
933 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -0800934 kRtpExtensionTransmissionTimeOffset,
935 kTransmissionTimeOffsetExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +0100936 EXPECT_EQ(0,
937 rtp_sender()->RegisterRtpHeaderExtension(
938 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000939 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -0700940 auto packet =
941 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
942 size_t packet_size = packet->size();
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000943
944 // Packet should be stored in a send bucket.
Erik Språngea55b082019-10-02 14:57:46 +0200945 EXPECT_CALL(
946 mock_paced_sender_,
947 EnqueuePackets(Contains(AllOf(
948 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
949 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum))))));
950 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
951 packet->set_allow_retransmission(true);
952 EXPECT_TRUE(
Erik Språng77b75292019-10-28 15:51:36 +0100953 rtp_sender()->SendToNetwork(std::make_unique<RtpPacketToSend>(*packet)));
Erik Språngea55b082019-10-02 14:57:46 +0200954 // Immediately process send bucket and send packet.
Erik Språng77b75292019-10-28 15:51:36 +0100955 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språngf6468d22019-07-05 16:53:43 +0200956
Erik Språng0f4f0552019-05-08 10:15:05 -0700957 EXPECT_EQ(1, transport_.packets_sent());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000958
Erik Språng0f4f0552019-05-08 10:15:05 -0700959 // Retransmit packet.
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000960 const int kStoredTimeInMs = 100;
961 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
962
Erik Språng0f4f0552019-05-08 10:15:05 -0700963 EXPECT_CALL(mock_rtc_event_log_,
964 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)));
Erik Språngf6468d22019-07-05 16:53:43 +0200965 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
966 packet->set_retransmitted_sequence_number(kSeqNum);
967 EXPECT_CALL(
968 mock_paced_sender_,
Erik Språngea55b082019-10-02 14:57:46 +0200969 EnqueuePackets(Contains(AllOf(
Erik Språngf6468d22019-07-05 16:53:43 +0200970 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
Erik Språngea55b082019-10-02 14:57:46 +0200971 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum))))));
Erik Språngf6468d22019-07-05 16:53:43 +0200972 EXPECT_EQ(static_cast<int>(packet_size),
Erik Språng77b75292019-10-28 15:51:36 +0100973 rtp_sender()->ReSendPacket(kSeqNum));
Erik Språngf6468d22019-07-05 16:53:43 +0200974 EXPECT_EQ(1, transport_.packets_sent());
Erik Språng77b75292019-10-28 15:51:36 +0100975 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000976
Erik Språng77b75292019-10-28 15:51:36 +0100977 // Process send bucket. Packet should now be sent.
978 EXPECT_EQ(2, transport_.packets_sent());
979 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000980
Erik Språng77b75292019-10-28 15:51:36 +0100981 webrtc::RTPHeader rtp_header;
982 transport_.last_sent_packet().GetHeader(&rtp_header);
pwestin@webrtc.orgb0061f92013-04-27 00:41:08 +0000983
Erik Språng77b75292019-10-28 15:51:36 +0100984 // Verify transmission time offset.
985 EXPECT_EQ(kStoredTimeInMs * 90,
986 rtp_header.extension.transmissionTimeOffset);
987 uint64_t expected_send_time =
988 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
989 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000990}
991
992// This test sends 1 regular video packet, then 4 padding packets, and then
993// 1 more regular packet.
minyue3a407ee2017-04-03 01:10:33 -0700994TEST_P(RtpSenderTest, SendPadding) {
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000995 // Make all (non-padding) packets go to send queue.
Elad Alon4a87e1c2017-10-03 16:11:34 +0200996 EXPECT_CALL(mock_rtc_event_log_,
997 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
998 .Times(1 + 4 + 1);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +0000999
1000 uint16_t seq_num = kSeqNum;
1001 uint32_t timestamp = kTimestamp;
Erik Språng77b75292019-10-28 15:51:36 +01001002 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
1003 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001004 size_t rtp_header_len = kRtpHeaderSize;
Erik Språng77b75292019-10-28 15:51:36 +01001005 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
danilchap162abd32015-12-10 02:39:40 -08001006 kRtpExtensionTransmissionTimeOffset,
1007 kTransmissionTimeOffsetExtensionId));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001008 rtp_header_len += 4; // 4 bytes extension.
Erik Språng77b75292019-10-28 15:51:36 +01001009 EXPECT_EQ(0,
1010 rtp_sender()->RegisterRtpHeaderExtension(
1011 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001012 rtp_header_len += 4; // 4 bytes extension.
1013 rtp_header_len += 4; // 4 extra bytes common to all extension headers.
1014
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001015 webrtc::RTPHeader rtp_header;
1016
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001017 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -07001018 auto packet =
1019 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
Stefan Holmer586b19b2015-09-18 11:14:31 +02001020 const uint32_t media_packet_timestamp = timestamp;
danilchapb6f1fb52016-10-19 06:11:39 -07001021 size_t packet_size = packet->size();
Erik Språngf6468d22019-07-05 16:53:43 +02001022 int total_packets_sent = 0;
1023 const int kStoredTimeInMs = 100;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001024
1025 // Packet should be stored in a send bucket.
Erik Språngea55b082019-10-02 14:57:46 +02001026 EXPECT_CALL(
1027 mock_paced_sender_,
1028 EnqueuePackets(Contains(AllOf(
1029 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1030 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum))))));
1031 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1032 packet->set_allow_retransmission(true);
1033 EXPECT_TRUE(
Erik Språng77b75292019-10-28 15:51:36 +01001034 rtp_sender()->SendToNetwork(std::make_unique<RtpPacketToSend>(*packet)));
Erik Språngea55b082019-10-02 14:57:46 +02001035 EXPECT_EQ(total_packets_sent, transport_.packets_sent());
1036 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
Erik Språng77b75292019-10-28 15:51:36 +01001037 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språngea55b082019-10-02 14:57:46 +02001038 ++seq_num;
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001039
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001040 // Packet should now be sent. This test doesn't verify the regular video
1041 // packet, since it is tested in another test.
danilchap12ba1862016-10-26 02:41:55 -07001042 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001043 timestamp += 90 * kStoredTimeInMs;
1044
1045 // Send padding 4 times, waiting 50 ms between each.
1046 for (int i = 0; i < 4; ++i) {
1047 const int kPaddingPeriodMs = 50;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001048 const size_t kPaddingBytes = 100;
1049 const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001050 // Padding will be forced to full packets.
Erik Språng4208a132019-08-26 08:58:45 +02001051 EXPECT_EQ(kMaxPaddingLength, GenerateAndSendPadding(kPaddingBytes));
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001052
1053 // Process send bucket. Padding should now be sent.
danilchap12ba1862016-10-26 02:41:55 -07001054 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001055 EXPECT_EQ(kMaxPaddingLength + rtp_header_len,
danilchap12ba1862016-10-26 02:41:55 -07001056 transport_.last_sent_packet().size());
1057
1058 transport_.last_sent_packet().GetHeader(&rtp_header);
pbosbd2522a2015-07-01 05:35:53 -07001059 EXPECT_EQ(kMaxPaddingLength, rtp_header.paddingLength);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001060
Stefan Holmer586b19b2015-09-18 11:14:31 +02001061 // Verify sequence number and timestamp. The timestamp should be the same
1062 // as the last media packet.
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001063 EXPECT_EQ(seq_num++, rtp_header.sequenceNumber);
Stefan Holmer586b19b2015-09-18 11:14:31 +02001064 EXPECT_EQ(media_packet_timestamp, rtp_header.timestamp);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001065 // Verify transmission time offset.
Stefan Holmer586b19b2015-09-18 11:14:31 +02001066 int offset = timestamp - media_packet_timestamp;
1067 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001068 uint64_t expected_send_time =
1069 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
1070 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
1071 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs);
1072 timestamp += 90 * kPaddingPeriodMs;
1073 }
1074
1075 // Send a regular video packet again.
1076 capture_time_ms = fake_clock_.TimeInMilliseconds();
danilchapb6f1fb52016-10-19 06:11:39 -07001077 packet = BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
1078 packet_size = packet->size();
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001079
Erik Språngf6468d22019-07-05 16:53:43 +02001080 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Erik Språng70768f42019-08-27 18:16:26 +02001081 packet->set_allow_retransmission(true);
Erik Språngf6468d22019-07-05 16:53:43 +02001082 EXPECT_CALL(
1083 mock_paced_sender_,
Erik Språngea55b082019-10-02 14:57:46 +02001084 EnqueuePackets(Contains(AllOf(
Erik Språngf6468d22019-07-05 16:53:43 +02001085 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
Erik Språngea55b082019-10-02 14:57:46 +02001086 Pointee(Property(&RtpPacketToSend::SequenceNumber, seq_num))))));
Erik Språng77b75292019-10-28 15:51:36 +01001087 EXPECT_TRUE(rtp_sender()->SendToNetwork(
1088 std::make_unique<RtpPacketToSend>(*packet)));
1089 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
terelius5d332ac2016-01-14 14:37:39 -08001090
Erik Språng77b75292019-10-28 15:51:36 +01001091 // Process send bucket.
1092 EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
1093 EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
1094 transport_.last_sent_packet().GetHeader(&rtp_header);
henrik.lundin@webrtc.org6e95d7a2013-11-15 08:59:19 +00001095
Erik Språng77b75292019-10-28 15:51:36 +01001096 // Verify sequence number and timestamp.
1097 EXPECT_EQ(seq_num, rtp_header.sequenceNumber);
1098 EXPECT_EQ(timestamp, rtp_header.timestamp);
1099 // Verify transmission time offset. This packet is sent without delay.
1100 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
1101 uint64_t expected_send_time =
1102 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
1103 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
asapersson@webrtc.org0b3c35a2012-01-16 11:06:31 +00001104}
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001105
minyue3a407ee2017-04-03 01:10:33 -07001106TEST_P(RtpSenderTest, OnSendPacketUpdated) {
Erik Språng77b75292019-10-28 15:51:36 +01001107 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
stefana23fc622016-07-28 07:56:38 -07001108 kRtpExtensionTransportSequenceNumber,
1109 kTransportSequenceNumberExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +01001110 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
1111 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
asapersson35151f32016-05-02 23:44:01 -07001112
1113 EXPECT_CALL(send_packet_observer_,
1114 OnSendPacket(kTransportSequenceNumber, _, _))
1115 .Times(1);
asapersson35151f32016-05-02 23:44:01 -07001116
Erik Språngea55b082019-10-02 14:57:46 +02001117 EXPECT_CALL(
1118 mock_paced_sender_,
1119 EnqueuePackets(Contains(AllOf(
1120 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1121 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum))))));
1122 auto packet = SendGenericPacket();
1123 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1124 packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
Erik Språng77b75292019-10-28 15:51:36 +01001125 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språngf6468d22019-07-05 16:53:43 +02001126
danilchap12ba1862016-10-26 02:41:55 -07001127 EXPECT_EQ(1, transport_.packets_sent());
asapersson35151f32016-05-02 23:44:01 -07001128}
1129
minyue3a407ee2017-04-03 01:10:33 -07001130TEST_P(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) {
Erik Språng77b75292019-10-28 15:51:36 +01001131 EXPECT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
stefana23fc622016-07-28 07:56:38 -07001132 kRtpExtensionTransportSequenceNumber,
1133 kTransportSequenceNumberExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +01001134 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
1135 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
asapersson35151f32016-05-02 23:44:01 -07001136
1137 EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
asapersson35151f32016-05-02 23:44:01 -07001138
Erik Språngea55b082019-10-02 14:57:46 +02001139 EXPECT_CALL(
1140 mock_paced_sender_,
1141 EnqueuePackets(Contains(AllOf(
1142 Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc)),
1143 Pointee(Property(&RtpPacketToSend::SequenceNumber, kSeqNum))))));
1144 auto packet = SendGenericPacket();
1145 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1146 packet->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
Erik Språng77b75292019-10-28 15:51:36 +01001147 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språngf6468d22019-07-05 16:53:43 +02001148
danilchap12ba1862016-10-26 02:41:55 -07001149 EXPECT_EQ(1, transport_.packets_sent());
Petter Strandmark26bc6692018-05-29 08:43:35 +02001150 EXPECT_TRUE(transport_.last_options_.is_retransmit);
asapersson35151f32016-05-02 23:44:01 -07001151}
1152
minyue3a407ee2017-04-03 01:10:33 -07001153TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) {
Erik Språng6cf554e2019-10-02 20:55:39 +02001154 const uint8_t kPayloadType = 127;
1155 const VideoCodecType kCodecType = VideoCodecType::kVideoCodecGeneric;
Niels Möller5fe95102019-03-04 16:49:25 +01001156 PlayoutDelayOracle playout_delay_oracle;
Erik Språngdc34a252019-10-04 15:17:29 +02001157 FieldTrialBasedConfig field_trials;
1158 RTPSenderVideo::Config video_config;
1159 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +01001160 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +02001161 video_config.playout_delay_oracle = &playout_delay_oracle;
1162 video_config.field_trials = &field_trials;
1163 RTPSenderVideo rtp_sender_video(video_config);
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001164 uint8_t payload[] = {47, 11, 32, 93, 89};
1165
1166 // Send keyframe
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001167 RTPVideoHeader video_header;
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001168 video_header.frame_type = VideoFrameType::kVideoFrameKey;
1169 ASSERT_TRUE(rtp_sender_video.SendVideo(kPayloadType, kCodecType, 1234, 4321,
1170 payload, nullptr, video_header,
1171 kDefaultExpectedRetransmissionTimeMs));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001172
danilchap96c15872016-11-21 01:35:29 -08001173 auto sent_payload = transport_.last_sent_packet().payload();
1174 uint8_t generic_header = sent_payload[0];
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001175 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
1176 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
danilchap96c15872016-11-21 01:35:29 -08001177 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001178
1179 // Send delta frame
1180 payload[0] = 13;
1181 payload[1] = 42;
1182 payload[4] = 13;
1183
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001184 video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1185 ASSERT_TRUE(rtp_sender_video.SendVideo(kPayloadType, kCodecType, 1234, 4321,
1186 payload, nullptr, video_header,
1187 kDefaultExpectedRetransmissionTimeMs));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001188
danilchap96c15872016-11-21 01:35:29 -08001189 sent_payload = transport_.last_sent_packet().payload();
1190 generic_header = sent_payload[0];
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001191 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
1192 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
danilchap96c15872016-11-21 01:35:29 -08001193 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
pbos@webrtc.org8911ce42013-03-18 16:39:03 +00001194}
1195
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001196TEST_P(RtpSenderTestWithoutPacer, SendRawVideo) {
Erik Språng6cf554e2019-10-02 20:55:39 +02001197 const uint8_t kPayloadType = 111;
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001198 const uint8_t payload[] = {11, 22, 33, 44, 55};
1199
1200 PlayoutDelayOracle playout_delay_oracle;
Erik Språngdc34a252019-10-04 15:17:29 +02001201 FieldTrialBasedConfig field_trials;
1202 RTPSenderVideo::Config video_config;
1203 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +01001204 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +02001205 video_config.playout_delay_oracle = &playout_delay_oracle;
1206 video_config.field_trials = &field_trials;
1207 RTPSenderVideo rtp_sender_video(video_config);
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001208
1209 // Send a frame.
1210 RTPVideoHeader video_header;
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001211 video_header.frame_type = VideoFrameType::kVideoFrameKey;
1212 ASSERT_TRUE(rtp_sender_video.SendVideo(kPayloadType, absl::nullopt, 1234,
1213 4321, payload, nullptr, video_header,
1214 kDefaultExpectedRetransmissionTimeMs));
Mirta Dvornicicfe68daa2019-05-23 13:21:12 +02001215
1216 auto sent_payload = transport_.last_sent_packet().payload();
1217 EXPECT_THAT(sent_payload, ElementsAreArray(payload));
1218}
1219
minyue3a407ee2017-04-03 01:10:33 -07001220TEST_P(RtpSenderTest, SendFlexfecPackets) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001221 constexpr uint32_t kTimestamp = 1234;
brandtrdbdb3f12016-11-10 05:04:48 -08001222 constexpr int kMediaPayloadType = 127;
Erik Språng6cf554e2019-10-02 20:55:39 +02001223 constexpr VideoCodecType kCodecType = VideoCodecType::kVideoCodecGeneric;
brandtrdbdb3f12016-11-10 05:04:48 -08001224 constexpr int kFlexfecPayloadType = 118;
brandtrdbdb3f12016-11-10 05:04:48 -08001225 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001226 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språng4580ca22019-07-04 10:38:43 +02001227 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
1228 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001229 nullptr /* rtp_state */, &fake_clock_);
brandtrdbdb3f12016-11-10 05:04:48 -08001230
1231 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001232 RtpRtcp::Configuration config;
1233 config.clock = &fake_clock_;
1234 config.outgoing_transport = &transport_;
1235 config.paced_sender = &mock_paced_sender_;
Erik Språng54d5d2c2019-08-20 17:22:36 +02001236 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +02001237 config.flexfec_sender = &flexfec_sender_;
Erik Språng4580ca22019-07-04 10:38:43 +02001238 config.event_log = &mock_rtc_event_log_;
1239 config.send_packet_observer = &send_packet_observer_;
1240 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
Erik Språng77b75292019-10-28 15:51:36 +01001241 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Erik Språng4580ca22019-07-04 10:38:43 +02001242
Erik Språng77b75292019-10-28 15:51:36 +01001243 rtp_sender()->SetSequenceNumber(kSeqNum);
1244 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
1245 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
brandtrdbdb3f12016-11-10 05:04:48 -08001246
Niels Möller5fe95102019-03-04 16:49:25 +01001247 PlayoutDelayOracle playout_delay_oracle;
Erik Språngdc34a252019-10-04 15:17:29 +02001248 FieldTrialBasedConfig field_trials;
1249 RTPSenderVideo::Config video_config;
1250 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +01001251 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +02001252 video_config.flexfec_sender = &flexfec_sender;
1253 video_config.playout_delay_oracle = &playout_delay_oracle;
1254 video_config.field_trials = &field_trials;
1255 RTPSenderVideo rtp_sender_video(video_config);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001256
brandtrdbdb3f12016-11-10 05:04:48 -08001257 // Parameters selected to generate a single FEC packet per media packet.
1258 FecProtectionParams params;
1259 params.fec_rate = 15;
1260 params.max_fec_frames = 1;
1261 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001262 rtp_sender_video.SetFecParameters(params, params);
brandtrdbdb3f12016-11-10 05:04:48 -08001263
brandtr9dfff292016-11-14 05:14:50 -08001264 uint16_t flexfec_seq_num;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001265 RTPVideoHeader video_header;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001266
Erik Språngf6468d22019-07-05 16:53:43 +02001267 std::unique_ptr<RtpPacketToSend> media_packet;
1268 std::unique_ptr<RtpPacketToSend> fec_packet;
1269
Erik Språngea55b082019-10-02 14:57:46 +02001270 EXPECT_CALL(mock_paced_sender_, EnqueuePackets)
Erik Språngfc78aac2019-10-24 12:55:30 +02001271 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
1272 for (auto& packet : packets) {
1273 if (packet->packet_type() == RtpPacketToSend::Type::kVideo) {
1274 EXPECT_EQ(packet->Ssrc(), kSsrc);
1275 EXPECT_EQ(packet->SequenceNumber(), kSeqNum);
1276 media_packet = std::move(packet);
1277 } else {
1278 EXPECT_EQ(packet->packet_type(),
1279 RtpPacketToSend::Type::kForwardErrorCorrection);
1280 EXPECT_EQ(packet->Ssrc(), kFlexFecSsrc);
1281 fec_packet = std::move(packet);
1282 }
1283 }
1284 });
Erik Språngf6468d22019-07-05 16:53:43 +02001285
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001286 video_header.frame_type = VideoFrameType::kVideoFrameKey;
Erik Språngf6468d22019-07-05 16:53:43 +02001287 EXPECT_TRUE(rtp_sender_video.SendVideo(
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001288 kMediaPayloadType, kCodecType, kTimestamp,
1289 fake_clock_.TimeInMilliseconds(), kPayloadData, nullptr, video_header,
Erik Språng6cf554e2019-10-02 20:55:39 +02001290 kDefaultExpectedRetransmissionTimeMs));
Erik Språngf6468d22019-07-05 16:53:43 +02001291 ASSERT_TRUE(media_packet != nullptr);
1292 ASSERT_TRUE(fec_packet != nullptr);
1293
1294 flexfec_seq_num = fec_packet->SequenceNumber();
Erik Språng77b75292019-10-28 15:51:36 +01001295 rtp_egress()->SendPacket(media_packet.get(), PacedPacketInfo());
1296 rtp_egress()->SendPacket(fec_packet.get(), PacedPacketInfo());
Erik Språngf6468d22019-07-05 16:53:43 +02001297
Erik Språng77b75292019-10-28 15:51:36 +01001298 ASSERT_EQ(2, transport_.packets_sent());
1299 const RtpPacketReceived& sent_media_packet = transport_.sent_packets_[0];
1300 EXPECT_EQ(kMediaPayloadType, sent_media_packet.PayloadType());
1301 EXPECT_EQ(kSeqNum, sent_media_packet.SequenceNumber());
1302 EXPECT_EQ(kSsrc, sent_media_packet.Ssrc());
1303 const RtpPacketReceived& sent_flexfec_packet = transport_.sent_packets_[1];
1304 EXPECT_EQ(kFlexfecPayloadType, sent_flexfec_packet.PayloadType());
1305 EXPECT_EQ(flexfec_seq_num, sent_flexfec_packet.SequenceNumber());
1306 EXPECT_EQ(kFlexFecSsrc, sent_flexfec_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001307}
1308
minyue3a407ee2017-04-03 01:10:33 -07001309TEST_P(RtpSenderTestWithoutPacer, SendFlexfecPackets) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001310 constexpr uint32_t kTimestamp = 1234;
brandtrdbdb3f12016-11-10 05:04:48 -08001311 constexpr int kMediaPayloadType = 127;
Erik Språng6cf554e2019-10-02 20:55:39 +02001312 constexpr VideoCodecType kCodecType = VideoCodecType::kVideoCodecGeneric;
brandtrdbdb3f12016-11-10 05:04:48 -08001313 constexpr int kFlexfecPayloadType = 118;
brandtrdbdb3f12016-11-10 05:04:48 -08001314 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001315 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språngf6468d22019-07-05 16:53:43 +02001316 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
Erik Språng4580ca22019-07-04 10:38:43 +02001317 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001318 nullptr /* rtp_state */, &fake_clock_);
brandtrdbdb3f12016-11-10 05:04:48 -08001319
1320 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001321 RtpRtcp::Configuration config;
1322 config.clock = &fake_clock_;
1323 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +02001324 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +02001325 config.flexfec_sender = &flexfec_sender;
Erik Språng4580ca22019-07-04 10:38:43 +02001326 config.event_log = &mock_rtc_event_log_;
1327 config.send_packet_observer = &send_packet_observer_;
1328 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
Erik Språng77b75292019-10-28 15:51:36 +01001329 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Erik Språng4580ca22019-07-04 10:38:43 +02001330
Erik Språng77b75292019-10-28 15:51:36 +01001331 rtp_sender()->SetSequenceNumber(kSeqNum);
brandtrdbdb3f12016-11-10 05:04:48 -08001332
Niels Möller5fe95102019-03-04 16:49:25 +01001333 PlayoutDelayOracle playout_delay_oracle;
Erik Språngdc34a252019-10-04 15:17:29 +02001334 FieldTrialBasedConfig field_trials;
1335 RTPSenderVideo::Config video_config;
1336 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +01001337 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +02001338 video_config.flexfec_sender = &flexfec_sender;
1339 video_config.playout_delay_oracle = &playout_delay_oracle;
1340 video_config.field_trials = &field_trials;
1341 RTPSenderVideo rtp_sender_video(video_config);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001342
brandtrdbdb3f12016-11-10 05:04:48 -08001343 // Parameters selected to generate a single FEC packet per media packet.
1344 FecProtectionParams params;
1345 params.fec_rate = 15;
1346 params.max_fec_frames = 1;
1347 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001348 rtp_sender_video.SetFecParameters(params, params);
brandtrdbdb3f12016-11-10 05:04:48 -08001349
Elad Alon4a87e1c2017-10-03 16:11:34 +02001350 EXPECT_CALL(mock_rtc_event_log_,
1351 LogProxy(SameRtcEventTypeAs(RtcEvent::Type::RtpPacketOutgoing)))
1352 .Times(2);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001353 RTPVideoHeader video_header;
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001354 video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001355 EXPECT_TRUE(rtp_sender_video.SendVideo(
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001356 kMediaPayloadType, kCodecType, kTimestamp,
1357 fake_clock_.TimeInMilliseconds(), kPayloadData, nullptr, video_header,
1358 kDefaultExpectedRetransmissionTimeMs));
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001359
brandtrdbdb3f12016-11-10 05:04:48 -08001360 ASSERT_EQ(2, transport_.packets_sent());
1361 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1362 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
Erik Språng4580ca22019-07-04 10:38:43 +02001363 EXPECT_EQ(kSsrc, media_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001364 const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
1365 EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
Erik Språngf6468d22019-07-05 16:53:43 +02001366 EXPECT_EQ(kFlexFecSsrc, flexfec_packet.Ssrc());
brandtrdbdb3f12016-11-10 05:04:48 -08001367}
1368
Steve Anton296a0ce2018-03-22 15:17:27 -07001369// Test that the MID header extension is included on sent packets when
1370// configured.
1371TEST_P(RtpSenderTestWithoutPacer, MidIncludedOnSentPackets) {
1372 const char kMid[] = "mid";
1373
Steve Anton2bac7da2019-07-21 15:04:21 -04001374 EnableMidSending(kMid);
Steve Anton296a0ce2018-03-22 15:17:27 -07001375
1376 // Send a couple packets.
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001377 SendGenericPacket();
1378 SendGenericPacket();
Steve Anton296a0ce2018-03-22 15:17:27 -07001379
1380 // Expect both packets to have the MID set.
1381 ASSERT_EQ(2u, transport_.sent_packets_.size());
1382 for (const RtpPacketReceived& packet : transport_.sent_packets_) {
1383 std::string mid;
1384 ASSERT_TRUE(packet.GetExtension<RtpMid>(&mid));
1385 EXPECT_EQ(kMid, mid);
1386 }
1387}
1388
Amit Hilbuch77938e62018-12-21 09:23:38 -08001389TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnSentPackets) {
1390 const char kRid[] = "f";
1391
Steve Anton2bac7da2019-07-21 15:04:21 -04001392 EnableRidSending(kRid);
Amit Hilbuch77938e62018-12-21 09:23:38 -08001393
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001394 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -08001395
1396 ASSERT_EQ(1u, transport_.sent_packets_.size());
1397 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1398 std::string rid;
1399 ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
1400 EXPECT_EQ(kRid, rid);
1401}
1402
1403TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnRtxSentPackets) {
1404 const char kRid[] = "f";
Amit Hilbuch77938e62018-12-21 09:23:38 -08001405
Steve Anton2bac7da2019-07-21 15:04:21 -04001406 EnableRtx();
1407 EnableRidSending(kRid);
Amit Hilbuch77938e62018-12-21 09:23:38 -08001408
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001409 SendGenericPacket();
Amit Hilbuch77938e62018-12-21 09:23:38 -08001410 ASSERT_EQ(1u, transport_.sent_packets_.size());
1411 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1412 std::string rid;
1413 ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
1414 EXPECT_EQ(kRid, rid);
1415 rid = kNoRid;
Steve Anton2bac7da2019-07-21 15:04:21 -04001416 EXPECT_FALSE(packet.HasExtension<RepairedRtpStreamId>());
Amit Hilbuch77938e62018-12-21 09:23:38 -08001417
1418 uint16_t packet_id = packet.SequenceNumber();
Erik Språng77b75292019-10-28 15:51:36 +01001419 rtp_sender()->ReSendPacket(packet_id);
Amit Hilbuch77938e62018-12-21 09:23:38 -08001420 ASSERT_EQ(2u, transport_.sent_packets_.size());
1421 const RtpPacketReceived& rtx_packet = transport_.sent_packets_[1];
1422 ASSERT_TRUE(rtx_packet.GetExtension<RepairedRtpStreamId>(&rid));
1423 EXPECT_EQ(kRid, rid);
1424 EXPECT_FALSE(rtx_packet.HasExtension<RtpStreamId>());
1425}
1426
Steve Anton2bac7da2019-07-21 15:04:21 -04001427TEST_P(RtpSenderTestWithoutPacer, MidAndRidNotIncludedOnSentPacketsAfterAck) {
1428 const char kMid[] = "mid";
1429 const char kRid[] = "f";
1430
1431 EnableMidSending(kMid);
1432 EnableRidSending(kRid);
1433
1434 // This first packet should include both MID and RID.
1435 auto first_built_packet = SendGenericPacket();
1436
Erik Språng77b75292019-10-28 15:51:36 +01001437 rtp_sender()->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -04001438
1439 // The second packet should include neither since an ack was received.
1440 SendGenericPacket();
1441
1442 ASSERT_EQ(2u, transport_.sent_packets_.size());
1443
1444 const RtpPacketReceived& first_packet = transport_.sent_packets_[0];
1445 std::string mid, rid;
1446 ASSERT_TRUE(first_packet.GetExtension<RtpMid>(&mid));
1447 EXPECT_EQ(kMid, mid);
1448 ASSERT_TRUE(first_packet.GetExtension<RtpStreamId>(&rid));
1449 EXPECT_EQ(kRid, rid);
1450
1451 const RtpPacketReceived& second_packet = transport_.sent_packets_[1];
1452 EXPECT_FALSE(second_packet.HasExtension<RtpMid>());
1453 EXPECT_FALSE(second_packet.HasExtension<RtpStreamId>());
1454}
1455
1456// Test that the first RTX packet includes both MID and RRID even if the packet
1457// being retransmitted did not have MID or RID. The MID and RID are needed on
1458// the first packets for a given SSRC, and RTX packets are sent on a separate
1459// SSRC.
1460TEST_P(RtpSenderTestWithoutPacer, MidAndRidIncludedOnFirstRtxPacket) {
1461 const char kMid[] = "mid";
1462 const char kRid[] = "f";
1463
1464 EnableRtx();
1465 EnableMidSending(kMid);
1466 EnableRidSending(kRid);
1467
1468 // This first packet will include both MID and RID.
1469 auto first_built_packet = SendGenericPacket();
Erik Språng77b75292019-10-28 15:51:36 +01001470 rtp_sender()->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -04001471
1472 // The second packet will include neither since an ack was received.
1473 auto second_built_packet = SendGenericPacket();
1474
1475 // The first RTX packet should include MID and RRID.
1476 ASSERT_LT(0,
Erik Språng77b75292019-10-28 15:51:36 +01001477 rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber()));
Steve Anton2bac7da2019-07-21 15:04:21 -04001478
1479 ASSERT_EQ(3u, transport_.sent_packets_.size());
1480
1481 const RtpPacketReceived& rtx_packet = transport_.sent_packets_[2];
1482 std::string mid, rrid;
1483 ASSERT_TRUE(rtx_packet.GetExtension<RtpMid>(&mid));
1484 EXPECT_EQ(kMid, mid);
1485 ASSERT_TRUE(rtx_packet.GetExtension<RepairedRtpStreamId>(&rrid));
1486 EXPECT_EQ(kRid, rrid);
1487}
1488
1489// Test that the RTX packets sent after receving an ACK on the RTX SSRC does
1490// not include either MID or RRID even if the packet being retransmitted did
1491// had a MID or RID.
1492TEST_P(RtpSenderTestWithoutPacer, MidAndRidNotIncludedOnRtxPacketsAfterAck) {
1493 const char kMid[] = "mid";
1494 const char kRid[] = "f";
1495
1496 EnableRtx();
1497 EnableMidSending(kMid);
1498 EnableRidSending(kRid);
1499
1500 // This first packet will include both MID and RID.
1501 auto first_built_packet = SendGenericPacket();
Erik Språng77b75292019-10-28 15:51:36 +01001502 rtp_sender()->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -04001503
1504 // The second packet will include neither since an ack was received.
1505 auto second_built_packet = SendGenericPacket();
1506
1507 // The first RTX packet will include MID and RRID.
1508 ASSERT_LT(0,
Erik Språng77b75292019-10-28 15:51:36 +01001509 rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber()));
Steve Anton2bac7da2019-07-21 15:04:21 -04001510
1511 ASSERT_EQ(3u, transport_.sent_packets_.size());
1512 const RtpPacketReceived& first_rtx_packet = transport_.sent_packets_[2];
1513
Erik Språng77b75292019-10-28 15:51:36 +01001514 rtp_sender()->OnReceivedAckOnRtxSsrc(first_rtx_packet.SequenceNumber());
Steve Anton2bac7da2019-07-21 15:04:21 -04001515
1516 // The second and third RTX packets should not include MID nor RRID.
Steve Anton2bac7da2019-07-21 15:04:21 -04001517 ASSERT_LT(0,
Erik Språng77b75292019-10-28 15:51:36 +01001518 rtp_sender()->ReSendPacket(first_built_packet->SequenceNumber()));
1519 ASSERT_LT(0,
1520 rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber()));
Steve Anton2bac7da2019-07-21 15:04:21 -04001521
1522 ASSERT_EQ(5u, transport_.sent_packets_.size());
1523
1524 const RtpPacketReceived& second_rtx_packet = transport_.sent_packets_[3];
1525 EXPECT_FALSE(second_rtx_packet.HasExtension<RtpMid>());
1526 EXPECT_FALSE(second_rtx_packet.HasExtension<RepairedRtpStreamId>());
1527
1528 const RtpPacketReceived& third_rtx_packet = transport_.sent_packets_[4];
1529 EXPECT_FALSE(third_rtx_packet.HasExtension<RtpMid>());
1530 EXPECT_FALSE(third_rtx_packet.HasExtension<RepairedRtpStreamId>());
1531}
1532
1533// Test that if the RtpState indicates an ACK has been received on that SSRC
1534// then neither the MID nor RID header extensions will be sent.
1535TEST_P(RtpSenderTestWithoutPacer,
1536 MidAndRidNotIncludedOnSentPacketsAfterRtpStateRestored) {
1537 const char kMid[] = "mid";
1538 const char kRid[] = "f";
1539
1540 EnableMidSending(kMid);
1541 EnableRidSending(kRid);
1542
Erik Språng77b75292019-10-28 15:51:36 +01001543 RtpState state = rtp_sender()->GetRtpState();
Steve Anton2bac7da2019-07-21 15:04:21 -04001544 EXPECT_FALSE(state.ssrc_has_acked);
1545 state.ssrc_has_acked = true;
Erik Språng77b75292019-10-28 15:51:36 +01001546 rtp_sender()->SetRtpState(state);
Steve Anton2bac7da2019-07-21 15:04:21 -04001547
1548 SendGenericPacket();
1549
1550 ASSERT_EQ(1u, transport_.sent_packets_.size());
1551 const RtpPacketReceived& packet = transport_.sent_packets_[0];
1552 EXPECT_FALSE(packet.HasExtension<RtpMid>());
1553 EXPECT_FALSE(packet.HasExtension<RtpStreamId>());
1554}
1555
1556// Test that if the RTX RtpState indicates an ACK has been received on that
1557// RTX SSRC then neither the MID nor RRID header extensions will be sent on
1558// RTX packets.
1559TEST_P(RtpSenderTestWithoutPacer,
1560 MidAndRridNotIncludedOnRtxPacketsAfterRtpStateRestored) {
1561 const char kMid[] = "mid";
1562 const char kRid[] = "f";
1563
1564 EnableRtx();
1565 EnableMidSending(kMid);
1566 EnableRidSending(kRid);
1567
Erik Språng77b75292019-10-28 15:51:36 +01001568 RtpState rtx_state = rtp_sender()->GetRtxRtpState();
Steve Anton2bac7da2019-07-21 15:04:21 -04001569 EXPECT_FALSE(rtx_state.ssrc_has_acked);
1570 rtx_state.ssrc_has_acked = true;
Erik Språng77b75292019-10-28 15:51:36 +01001571 rtp_sender()->SetRtxRtpState(rtx_state);
Steve Anton2bac7da2019-07-21 15:04:21 -04001572
1573 auto built_packet = SendGenericPacket();
Erik Språng77b75292019-10-28 15:51:36 +01001574 ASSERT_LT(0, rtp_sender()->ReSendPacket(built_packet->SequenceNumber()));
Steve Anton2bac7da2019-07-21 15:04:21 -04001575
1576 ASSERT_EQ(2u, transport_.sent_packets_.size());
1577 const RtpPacketReceived& rtx_packet = transport_.sent_packets_[1];
1578 EXPECT_FALSE(rtx_packet.HasExtension<RtpMid>());
1579 EXPECT_FALSE(rtx_packet.HasExtension<RepairedRtpStreamId>());
1580}
1581
minyue3a407ee2017-04-03 01:10:33 -07001582TEST_P(RtpSenderTest, FecOverheadRate) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001583 constexpr uint32_t kTimestamp = 1234;
1584 constexpr int kMediaPayloadType = 127;
Erik Språng6cf554e2019-10-02 20:55:39 +02001585 constexpr VideoCodecType kCodecType = VideoCodecType::kVideoCodecGeneric;
brandtr81eab612017-01-24 04:06:09 -08001586 constexpr int kFlexfecPayloadType = 118;
brandtr81eab612017-01-24 04:06:09 -08001587 const std::vector<RtpExtension> kNoRtpExtensions;
erikvarga27883732017-05-17 05:08:38 -07001588 const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
Erik Språng4580ca22019-07-04 10:38:43 +02001589 FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexFecSsrc, kSsrc, kNoMid,
1590 kNoRtpExtensions, kNoRtpExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -07001591 nullptr /* rtp_state */, &fake_clock_);
brandtr81eab612017-01-24 04:06:09 -08001592
1593 // Reset |rtp_sender_| to use FlexFEC.
Erik Språng4580ca22019-07-04 10:38:43 +02001594 RtpRtcp::Configuration config;
1595 config.clock = &fake_clock_;
1596 config.outgoing_transport = &transport_;
1597 config.paced_sender = &mock_paced_sender_;
Erik Språng54d5d2c2019-08-20 17:22:36 +02001598 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +02001599 config.flexfec_sender = &flexfec_sender;
Erik Språng4580ca22019-07-04 10:38:43 +02001600 config.event_log = &mock_rtc_event_log_;
1601 config.send_packet_observer = &send_packet_observer_;
1602 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
Erik Språng77b75292019-10-28 15:51:36 +01001603 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
Erik Språng4580ca22019-07-04 10:38:43 +02001604
Erik Språng77b75292019-10-28 15:51:36 +01001605 rtp_sender()->SetSequenceNumber(kSeqNum);
brandtr81eab612017-01-24 04:06:09 -08001606
Niels Möller5fe95102019-03-04 16:49:25 +01001607 PlayoutDelayOracle playout_delay_oracle;
Erik Språngdc34a252019-10-04 15:17:29 +02001608 FieldTrialBasedConfig field_trials;
1609 RTPSenderVideo::Config video_config;
1610 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +01001611 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +02001612 video_config.flexfec_sender = &flexfec_sender;
1613 video_config.playout_delay_oracle = &playout_delay_oracle;
1614 video_config.field_trials = &field_trials;
1615 RTPSenderVideo rtp_sender_video(video_config);
brandtr81eab612017-01-24 04:06:09 -08001616 // Parameters selected to generate a single FEC packet per media packet.
1617 FecProtectionParams params;
1618 params.fec_rate = 15;
1619 params.max_fec_frames = 1;
1620 params.fec_mask_type = kFecMaskRandom;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001621 rtp_sender_video.SetFecParameters(params, params);
brandtr81eab612017-01-24 04:06:09 -08001622
1623 constexpr size_t kNumMediaPackets = 10;
1624 constexpr size_t kNumFecPackets = kNumMediaPackets;
1625 constexpr int64_t kTimeBetweenPacketsMs = 10;
Erik Språngfc78aac2019-10-24 12:55:30 +02001626 EXPECT_CALL(mock_paced_sender_, EnqueuePackets).Times(kNumMediaPackets);
brandtr81eab612017-01-24 04:06:09 -08001627 for (size_t i = 0; i < kNumMediaPackets; ++i) {
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001628 RTPVideoHeader video_header;
1629
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001630 video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001631 EXPECT_TRUE(rtp_sender_video.SendVideo(
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001632 kMediaPayloadType, kCodecType, kTimestamp,
1633 fake_clock_.TimeInMilliseconds(), kPayloadData, nullptr, video_header,
Erik Språng6cf554e2019-10-02 20:55:39 +02001634 kDefaultExpectedRetransmissionTimeMs));
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001635
brandtr81eab612017-01-24 04:06:09 -08001636 fake_clock_.AdvanceTimeMilliseconds(kTimeBetweenPacketsMs);
1637 }
1638 constexpr size_t kRtpHeaderLength = 12;
1639 constexpr size_t kFlexfecHeaderLength = 20;
1640 constexpr size_t kGenericCodecHeaderLength = 1;
1641 constexpr size_t kPayloadLength = sizeof(kPayloadData);
1642 constexpr size_t kPacketLength = kRtpHeaderLength + kFlexfecHeaderLength +
1643 kGenericCodecHeaderLength + kPayloadLength;
1644 EXPECT_NEAR(kNumFecPackets * kPacketLength * 8 /
1645 (kNumFecPackets * kTimeBetweenPacketsMs / 1000.0f),
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001646 rtp_sender_video.FecOverheadRate(), 500);
brandtr81eab612017-01-24 04:06:09 -08001647}
1648
minyue3a407ee2017-04-03 01:10:33 -07001649TEST_P(RtpSenderTest, BitrateCallbacks) {
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001650 class TestCallback : public BitrateStatisticsObserver {
1651 public:
sprangcd349d92016-07-13 09:11:28 -07001652 TestCallback()
1653 : BitrateStatisticsObserver(),
1654 num_calls_(0),
1655 ssrc_(0),
1656 total_bitrate_(0),
1657 retransmit_bitrate_(0) {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +00001658 ~TestCallback() override = default;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001659
sprangcd349d92016-07-13 09:11:28 -07001660 void Notify(uint32_t total_bitrate,
1661 uint32_t retransmit_bitrate,
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00001662 uint32_t ssrc) override {
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001663 ++num_calls_;
1664 ssrc_ = ssrc;
sprangcd349d92016-07-13 09:11:28 -07001665 total_bitrate_ = total_bitrate;
1666 retransmit_bitrate_ = retransmit_bitrate;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001667 }
1668
1669 uint32_t num_calls_;
1670 uint32_t ssrc_;
sprangcd349d92016-07-13 09:11:28 -07001671 uint32_t total_bitrate_;
1672 uint32_t retransmit_bitrate_;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001673 } callback;
Erik Språng4580ca22019-07-04 10:38:43 +02001674
1675 RtpRtcp::Configuration config;
1676 config.clock = &fake_clock_;
1677 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +02001678 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +02001679 config.send_bitrate_observer = &callback;
1680 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
Erik Språng77b75292019-10-28 15:51:36 +01001681 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001682
Niels Möller5fe95102019-03-04 16:49:25 +01001683 PlayoutDelayOracle playout_delay_oracle;
Erik Språngdc34a252019-10-04 15:17:29 +02001684 FieldTrialBasedConfig field_trials;
1685 RTPSenderVideo::Config video_config;
1686 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +01001687 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +02001688 video_config.playout_delay_oracle = &playout_delay_oracle;
1689 video_config.field_trials = &field_trials;
1690 RTPSenderVideo rtp_sender_video(video_config);
Erik Språng6cf554e2019-10-02 20:55:39 +02001691 const VideoCodecType kCodecType = VideoCodecType::kVideoCodecGeneric;
1692 const uint8_t kPayloadType = 127;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001693
sprangcd349d92016-07-13 09:11:28 -07001694 // Simulate kNumPackets sent with kPacketInterval ms intervals, with the
1695 // number of packets selected so that we fill (but don't overflow) the one
1696 // second averaging window.
1697 const uint32_t kWindowSizeMs = 1000;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001698 const uint32_t kPacketInterval = 20;
sprangcd349d92016-07-13 09:11:28 -07001699 const uint32_t kNumPackets =
1700 (kWindowSizeMs - kPacketInterval) / kPacketInterval;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001701 // Overhead = 12 bytes RTP header + 1 byte generic header.
1702 const uint32_t kPacketOverhead = 13;
1703
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001704 uint8_t payload[] = {47, 11, 32, 93, 89};
Erik Språng77b75292019-10-28 15:51:36 +01001705 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
1706 RtpPacketHistory::StorageMode::kStoreAndCull, 1);
1707 uint32_t ssrc = rtp_sender()->SSRC();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001708
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001709 // Initial process call so we get a new time window.
Erik Språng77b75292019-10-28 15:51:36 +01001710 rtp_egress()->ProcessBitrateAndNotifyObservers();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001711
1712 // Send a few frames.
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001713 RTPVideoHeader video_header;
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001714 for (uint32_t i = 0; i < kNumPackets; ++i) {
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001715 video_header.frame_type = VideoFrameType::kVideoFrameKey;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001716 ASSERT_TRUE(rtp_sender_video.SendVideo(
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001717 kPayloadType, kCodecType, 1234, 4321, payload, nullptr, video_header,
Niels Möller8f7ce222019-03-21 15:43:58 +01001718 kDefaultExpectedRetransmissionTimeMs));
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001719 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval);
1720 }
1721
Erik Språng77b75292019-10-28 15:51:36 +01001722 rtp_egress()->ProcessBitrateAndNotifyObservers();
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001723
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001724 // We get one call for every stats updated, thus two calls since both the
1725 // stream stats and the retransmit stats are updated once.
1726 EXPECT_EQ(2u, callback.num_calls_);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001727 EXPECT_EQ(ssrc, callback.ssrc_);
sprangcd349d92016-07-13 09:11:28 -07001728 const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload);
1729 // Bitrate measured over delta between last and first timestamp, plus one.
1730 const uint32_t kExpectedWindowMs = kNumPackets * kPacketInterval + 1;
1731 const uint32_t kExpectedBitsAccumulated = kTotalPacketSize * kNumPackets * 8;
1732 const uint32_t kExpectedRateBps =
1733 (kExpectedBitsAccumulated * 1000 + (kExpectedWindowMs / 2)) /
1734 kExpectedWindowMs;
1735 EXPECT_EQ(kExpectedRateBps, callback.total_bitrate_);
sprang@webrtc.org6811b6e2013-12-13 09:46:59 +00001736}
1737
minyue3a407ee2017-04-03 01:10:33 -07001738TEST_P(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) {
Erik Språng6cf554e2019-10-02 20:55:39 +02001739 const uint8_t kPayloadType = 127;
1740 const VideoCodecType kCodecType = VideoCodecType::kVideoCodecGeneric;
Niels Möller5fe95102019-03-04 16:49:25 +01001741 PlayoutDelayOracle playout_delay_oracle;
Erik Språngdc34a252019-10-04 15:17:29 +02001742 FieldTrialBasedConfig field_trials;
1743 RTPSenderVideo::Config video_config;
1744 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +01001745 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +02001746 video_config.playout_delay_oracle = &playout_delay_oracle;
1747 video_config.field_trials = &field_trials;
1748 RTPSenderVideo rtp_sender_video(video_config);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001749 uint8_t payload[] = {47, 11, 32, 93, 89};
Erik Språng77b75292019-10-28 15:51:36 +01001750 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
1751 RtpPacketHistory::StorageMode::kStoreAndCull, 1);
1752 uint32_t ssrc = rtp_sender()->SSRC();
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001753
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001754 // Send a frame.
Sami Kalliomäki426a80c2018-08-08 11:37:59 +02001755 RTPVideoHeader video_header;
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001756 video_header.frame_type = VideoFrameType::kVideoFrameKey;
1757 ASSERT_TRUE(rtp_sender_video.SendVideo(kPayloadType, kCodecType, 1234, 4321,
1758 payload, nullptr, video_header,
1759 kDefaultExpectedRetransmissionTimeMs));
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001760 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001761 expected.transmitted.payload_bytes = 6;
1762 expected.transmitted.header_bytes = 12;
1763 expected.transmitted.padding_bytes = 0;
1764 expected.transmitted.packets = 1;
1765 expected.retransmitted.payload_bytes = 0;
1766 expected.retransmitted.header_bytes = 0;
1767 expected.retransmitted.padding_bytes = 0;
1768 expected.retransmitted.packets = 0;
1769 expected.fec.packets = 0;
Erik Språng7ea9b802019-10-16 19:03:38 +02001770 rtp_stats_callback_.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001771
1772 // Retransmit a frame.
Erik Språng77b75292019-10-28 15:51:36 +01001773 uint16_t seqno = rtp_sender()->SequenceNumber() - 1;
1774 rtp_sender()->ReSendPacket(seqno);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001775 expected.transmitted.payload_bytes = 12;
1776 expected.transmitted.header_bytes = 24;
1777 expected.transmitted.packets = 2;
1778 expected.retransmitted.payload_bytes = 6;
1779 expected.retransmitted.header_bytes = 12;
1780 expected.retransmitted.padding_bytes = 0;
1781 expected.retransmitted.packets = 1;
Erik Språng7ea9b802019-10-16 19:03:38 +02001782 rtp_stats_callback_.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001783
1784 // Send padding.
Erik Språng4208a132019-08-26 08:58:45 +02001785 GenerateAndSendPadding(kMaxPaddingSize);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001786 expected.transmitted.payload_bytes = 12;
1787 expected.transmitted.header_bytes = 36;
1788 expected.transmitted.padding_bytes = kMaxPaddingSize;
1789 expected.transmitted.packets = 3;
Erik Språng7ea9b802019-10-16 19:03:38 +02001790 rtp_stats_callback_.Matches(ssrc, expected);
Erik Språngdc34a252019-10-04 15:17:29 +02001791}
1792
1793TEST_P(RtpSenderTestWithoutPacer, StreamDataCountersCallbacksUlpfec) {
Erik Språngdc34a252019-10-04 15:17:29 +02001794 const uint8_t kRedPayloadType = 96;
1795 const uint8_t kUlpfecPayloadType = 97;
1796 const uint8_t kPayloadType = 127;
1797 const VideoCodecType kCodecType = VideoCodecType::kVideoCodecGeneric;
1798 PlayoutDelayOracle playout_delay_oracle;
1799 FieldTrialBasedConfig field_trials;
1800 RTPSenderVideo::Config video_config;
1801 video_config.clock = &fake_clock_;
Erik Språng77b75292019-10-28 15:51:36 +01001802 video_config.rtp_sender = rtp_sender();
Erik Språngdc34a252019-10-04 15:17:29 +02001803 video_config.playout_delay_oracle = &playout_delay_oracle;
1804 video_config.field_trials = &field_trials;
1805 video_config.red_payload_type = kRedPayloadType;
1806 video_config.ulpfec_payload_type = kUlpfecPayloadType;
1807 RTPSenderVideo rtp_sender_video(video_config);
1808 uint8_t payload[] = {47, 11, 32, 93, 89};
Erik Språng77b75292019-10-28 15:51:36 +01001809 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
1810 RtpPacketHistory::StorageMode::kStoreAndCull, 1);
1811 uint32_t ssrc = rtp_sender()->SSRC();
Erik Språngdc34a252019-10-04 15:17:29 +02001812
Erik Språngdc34a252019-10-04 15:17:29 +02001813 RTPVideoHeader video_header;
1814 StreamDataCounters expected;
1815
brandtrf1bb4762016-11-07 03:05:06 -08001816 // Send ULPFEC.
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001817 FecProtectionParams fec_params;
1818 fec_params.fec_mask_type = kFecMaskRandom;
1819 fec_params.fec_rate = 1;
1820 fec_params.max_fec_frames = 1;
Niels Möller59ab1cf2019-02-06 22:48:11 +01001821 rtp_sender_video.SetFecParameters(fec_params, fec_params);
Danil Chapovalov51bf2002019-10-11 10:53:27 +02001822 video_header.frame_type = VideoFrameType::kVideoFrameDelta;
1823 ASSERT_TRUE(rtp_sender_video.SendVideo(kPayloadType, kCodecType, 1234, 4321,
1824 payload, nullptr, video_header,
1825 kDefaultExpectedRetransmissionTimeMs));
Erik Språngdc34a252019-10-04 15:17:29 +02001826 expected.transmitted.payload_bytes = 28;
1827 expected.transmitted.header_bytes = 24;
1828 expected.transmitted.packets = 2;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001829 expected.fec.packets = 1;
Erik Språng7ea9b802019-10-16 19:03:38 +02001830 rtp_stats_callback_.Matches(ssrc, expected);
sprang@webrtc.orgebad7652013-12-05 14:29:02 +00001831}
1832
minyue3a407ee2017-04-03 01:10:33 -07001833TEST_P(RtpSenderTestWithoutPacer, BytesReportedCorrectly) {
Niels Möller59ab1cf2019-02-06 22:48:11 +01001834 // XXX const char* kPayloadName = "GENERIC";
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001835 const uint8_t kPayloadType = 127;
Erik Språng77b75292019-10-28 15:51:36 +01001836 rtp_sender()->SetRtxPayloadType(kPayloadType - 1, kPayloadType);
1837 rtp_sender()->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001838
Niels Möller59ab1cf2019-02-06 22:48:11 +01001839 SendGenericPacket();
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001840 // Will send 2 full-size padding packets.
Erik Språng4208a132019-08-26 08:58:45 +02001841 GenerateAndSendPadding(1);
1842 GenerateAndSendPadding(1);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001843
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001844 StreamDataCounters rtp_stats;
1845 StreamDataCounters rtx_stats;
Erik Språng77b75292019-10-28 15:51:36 +01001846 rtp_egress()->GetDataCounters(&rtp_stats, &rtx_stats);
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001847
Niels Möller59ab1cf2019-02-06 22:48:11 +01001848 // Payload
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +00001849 EXPECT_GT(rtp_stats.first_packet_time_ms, -1);
Niels Möller59ab1cf2019-02-06 22:48:11 +01001850 EXPECT_EQ(rtp_stats.transmitted.payload_bytes, sizeof(kPayloadData));
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001851 EXPECT_EQ(rtp_stats.transmitted.header_bytes, 12u);
1852 EXPECT_EQ(rtp_stats.transmitted.padding_bytes, 0u);
1853 EXPECT_EQ(rtx_stats.transmitted.payload_bytes, 0u);
1854 EXPECT_EQ(rtx_stats.transmitted.header_bytes, 24u);
1855 EXPECT_EQ(rtx_stats.transmitted.padding_bytes, 2 * kMaxPaddingSize);
pbos@webrtc.org2f4b14e2014-07-15 15:25:39 +00001856
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001857 EXPECT_EQ(rtp_stats.transmitted.TotalBytes(),
danilchap162abd32015-12-10 02:39:40 -08001858 rtp_stats.transmitted.payload_bytes +
1859 rtp_stats.transmitted.header_bytes +
1860 rtp_stats.transmitted.padding_bytes);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +00001861 EXPECT_EQ(rtx_stats.transmitted.TotalBytes(),
danilchap162abd32015-12-10 02:39:40 -08001862 rtx_stats.transmitted.payload_bytes +
1863 rtx_stats.transmitted.header_bytes +
1864 rtx_stats.transmitted.padding_bytes);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +00001865
danilchap162abd32015-12-10 02:39:40 -08001866 EXPECT_EQ(
1867 transport_.total_bytes_sent_,
1868 rtp_stats.transmitted.TotalBytes() + rtx_stats.transmitted.TotalBytes());
pbos@webrtc.org72491b92014-07-10 16:24:54 +00001869}
guoweis@webrtc.org45362892015-03-04 22:55:15 +00001870
minyue3a407ee2017-04-03 01:10:33 -07001871TEST_P(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) {
sprang38778b02015-09-29 09:48:22 -07001872 const int32_t kPacketSize = 1400;
1873 const int32_t kNumPackets = 30;
1874
sprangcd349d92016-07-13 09:11:28 -07001875 retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8);
1876
Erik Språng77b75292019-10-28 15:51:36 +01001877 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
1878 RtpPacketHistory::StorageMode::kStoreAndCull, kNumPackets);
1879 const uint16_t kStartSequenceNumber = rtp_sender()->SequenceNumber();
Danil Chapovalov2800d742016-08-26 18:48:46 +02001880 std::vector<uint16_t> sequence_numbers;
sprang38778b02015-09-29 09:48:22 -07001881 for (int32_t i = 0; i < kNumPackets; ++i) {
1882 sequence_numbers.push_back(kStartSequenceNumber + i);
1883 fake_clock_.AdvanceTimeMilliseconds(1);
1884 SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize);
1885 }
danilchap12ba1862016-10-26 02:41:55 -07001886 EXPECT_EQ(kNumPackets, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001887
1888 fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets);
1889
1890 // Resending should work - brings the bandwidth up to the limit.
1891 // NACK bitrate is capped to the same bitrate as the encoder, since the max
1892 // protection overhead is 50% (see MediaOptimization::SetTargetRates).
Erik Språng77b75292019-10-28 15:51:36 +01001893 rtp_sender()->OnReceivedNack(sequence_numbers, 0);
danilchap12ba1862016-10-26 02:41:55 -07001894 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001895
sprangcd349d92016-07-13 09:11:28 -07001896 // Must be at least 5ms in between retransmission attempts.
1897 fake_clock_.AdvanceTimeMilliseconds(5);
1898
sprang38778b02015-09-29 09:48:22 -07001899 // Resending should not work, bandwidth exceeded.
Erik Språng77b75292019-10-28 15:51:36 +01001900 rtp_sender()->OnReceivedNack(sequence_numbers, 0);
danilchap12ba1862016-10-26 02:41:55 -07001901 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
sprang38778b02015-09-29 09:48:22 -07001902}
1903
minyue3a407ee2017-04-03 01:10:33 -07001904TEST_P(RtpSenderTest, OnOverheadChanged) {
michaelt4da30442016-11-17 01:38:43 -08001905 MockOverheadObserver mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02001906 RtpRtcp::Configuration config;
1907 config.clock = &fake_clock_;
1908 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +02001909 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +02001910 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1911 config.overhead_observer = &mock_overhead_observer;
Erik Språng77b75292019-10-28 15:51:36 +01001912 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
michaelt4da30442016-11-17 01:38:43 -08001913
michaelt4da30442016-11-17 01:38:43 -08001914 // RTP overhead is 12B.
nisse284542b2017-01-10 08:58:32 -08001915 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(12)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001916 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001917
Erik Språng77b75292019-10-28 15:51:36 +01001918 rtp_sender()->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
1919 kTransmissionTimeOffsetExtensionId);
michaelt4da30442016-11-17 01:38:43 -08001920
1921 // TransmissionTimeOffset extension has a size of 8B.
nisse284542b2017-01-10 08:58:32 -08001922 // 12B + 8B = 20B
1923 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(20)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001924 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001925}
1926
minyue3a407ee2017-04-03 01:10:33 -07001927TEST_P(RtpSenderTest, DoesNotUpdateOverheadOnEqualSize) {
michaelt4da30442016-11-17 01:38:43 -08001928 MockOverheadObserver mock_overhead_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02001929 RtpRtcp::Configuration config;
1930 config.clock = &fake_clock_;
1931 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +02001932 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +02001933 config.retransmission_rate_limiter = &retransmission_rate_limiter_;
1934 config.overhead_observer = &mock_overhead_observer;
Erik Språng77b75292019-10-28 15:51:36 +01001935 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
michaelt4da30442016-11-17 01:38:43 -08001936
1937 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(_)).Times(1);
Niels Möllere7b9e6b2019-02-06 18:23:44 +01001938 SendGenericPacket();
1939 SendGenericPacket();
michaelt4da30442016-11-17 01:38:43 -08001940}
1941
Erik Språng77b75292019-10-28 15:51:36 +01001942TEST_P(RtpSenderTest, SendPacketMatchesVideo) {
Erik Språng9c771c22019-06-17 16:31:53 +02001943 std::unique_ptr<RtpPacketToSend> packet =
1944 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1945 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
1946
Erik Språng9c771c22019-06-17 16:31:53 +02001947 // Verify sent with correct SSRC.
1948 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1949 packet->SetSsrc(kSsrc);
1950 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Erik Språng77b75292019-10-28 15:51:36 +01001951 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng671b4032019-10-17 16:56:22 +02001952 EXPECT_EQ(transport_.packets_sent(), 1);
Erik Språng9c771c22019-06-17 16:31:53 +02001953}
1954
Erik Språng77b75292019-10-28 15:51:36 +01001955TEST_P(RtpSenderTest, SendPacketMatchesAudio) {
Erik Språng9c771c22019-06-17 16:31:53 +02001956 std::unique_ptr<RtpPacketToSend> packet =
1957 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1958 packet->set_packet_type(RtpPacketToSend::Type::kAudio);
1959
Erik Språng9c771c22019-06-17 16:31:53 +02001960 // Verify sent with correct SSRC.
1961 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1962 packet->SetSsrc(kSsrc);
1963 packet->set_packet_type(RtpPacketToSend::Type::kAudio);
Erik Språng77b75292019-10-28 15:51:36 +01001964 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng671b4032019-10-17 16:56:22 +02001965 EXPECT_EQ(transport_.packets_sent(), 1);
Erik Språng9c771c22019-06-17 16:31:53 +02001966}
1967
Erik Språng77b75292019-10-28 15:51:36 +01001968TEST_P(RtpSenderTest, SendPacketMatchesRetransmissions) {
Erik Språng9c771c22019-06-17 16:31:53 +02001969 std::unique_ptr<RtpPacketToSend> packet =
1970 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1971 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
1972
Erik Språng9c771c22019-06-17 16:31:53 +02001973 // Verify sent with correct SSRC (non-RTX).
1974 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1975 packet->SetSsrc(kSsrc);
1976 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
Erik Språng77b75292019-10-28 15:51:36 +01001977 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng671b4032019-10-17 16:56:22 +02001978 EXPECT_EQ(transport_.packets_sent(), 1);
Erik Språng9c771c22019-06-17 16:31:53 +02001979
1980 // RTX retransmission.
1981 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1982 packet->SetSsrc(kRtxSsrc);
1983 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
Erik Språng77b75292019-10-28 15:51:36 +01001984 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng671b4032019-10-17 16:56:22 +02001985 EXPECT_EQ(transport_.packets_sent(), 2);
Erik Språng9c771c22019-06-17 16:31:53 +02001986}
1987
Erik Språng77b75292019-10-28 15:51:36 +01001988TEST_P(RtpSenderTest, SendPacketMatchesPadding) {
Erik Språng9c771c22019-06-17 16:31:53 +02001989 std::unique_ptr<RtpPacketToSend> packet =
1990 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1991 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
1992
Erik Språng9c771c22019-06-17 16:31:53 +02001993 // Verify sent with correct SSRC (non-RTX).
1994 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
1995 packet->SetSsrc(kSsrc);
1996 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
Erik Språng77b75292019-10-28 15:51:36 +01001997 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng671b4032019-10-17 16:56:22 +02001998 EXPECT_EQ(transport_.packets_sent(), 1);
Erik Språng9c771c22019-06-17 16:31:53 +02001999
2000 // RTX padding.
2001 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2002 packet->SetSsrc(kRtxSsrc);
2003 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
Erik Språng77b75292019-10-28 15:51:36 +01002004 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng671b4032019-10-17 16:56:22 +02002005 EXPECT_EQ(transport_.packets_sent(), 2);
Erik Språng9c771c22019-06-17 16:31:53 +02002006}
2007
Erik Språng77b75292019-10-28 15:51:36 +01002008TEST_P(RtpSenderTest, SendPacketMatchesFlexfec) {
Erik Språng9c771c22019-06-17 16:31:53 +02002009 std::unique_ptr<RtpPacketToSend> packet =
2010 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2011 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2012
Erik Språng9c771c22019-06-17 16:31:53 +02002013 // Verify sent with correct SSRC.
2014 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2015 packet->SetSsrc(kFlexFecSsrc);
2016 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
Erik Språng77b75292019-10-28 15:51:36 +01002017 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng671b4032019-10-17 16:56:22 +02002018 EXPECT_EQ(transport_.packets_sent(), 1);
Erik Språng9c771c22019-06-17 16:31:53 +02002019}
2020
Erik Språng77b75292019-10-28 15:51:36 +01002021TEST_P(RtpSenderTest, SendPacketMatchesUlpfec) {
Erik Språng9c771c22019-06-17 16:31:53 +02002022 std::unique_ptr<RtpPacketToSend> packet =
2023 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2024 packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2025
Erik Språng9c771c22019-06-17 16:31:53 +02002026 // 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);
Erik Språng77b75292019-10-28 15:51:36 +01002030 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng671b4032019-10-17 16:56:22 +02002031 EXPECT_EQ(transport_.packets_sent(), 1);
Erik Språng9c771c22019-06-17 16:31:53 +02002032}
2033
Erik Språng77b75292019-10-28 15:51:36 +01002034TEST_P(RtpSenderTest, SendPacketHandlesRetransmissionHistory) {
2035 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
2036 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
Erik Språng9c771c22019-06-17 16:31:53 +02002037
2038 // Build a media packet and send it.
2039 std::unique_ptr<RtpPacketToSend> packet =
2040 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2041 const uint16_t media_sequence_number = packet->SequenceNumber();
2042 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2043 packet->set_allow_retransmission(true);
Erik Språng77b75292019-10-28 15:51:36 +01002044 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng9c771c22019-06-17 16:31:53 +02002045
2046 // Simulate retransmission request.
2047 fake_clock_.AdvanceTimeMilliseconds(30);
Erik Språng77b75292019-10-28 15:51:36 +01002048 EXPECT_GT(rtp_sender()->ReSendPacket(media_sequence_number), 0);
Erik Språng9c771c22019-06-17 16:31:53 +02002049
2050 // Packet already pending, retransmission not allowed.
2051 fake_clock_.AdvanceTimeMilliseconds(30);
Erik Språng77b75292019-10-28 15:51:36 +01002052 EXPECT_EQ(rtp_sender()->ReSendPacket(media_sequence_number), 0);
Erik Språng9c771c22019-06-17 16:31:53 +02002053
2054 // Packet exiting pacer, mark as not longer pending.
2055 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2056 EXPECT_NE(packet->SequenceNumber(), media_sequence_number);
2057 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2058 packet->SetSsrc(kRtxSsrc);
2059 packet->set_retransmitted_sequence_number(media_sequence_number);
2060 packet->set_allow_retransmission(false);
Erik Språng77b75292019-10-28 15:51:36 +01002061 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng9c771c22019-06-17 16:31:53 +02002062
2063 // Retransmissions allowed again.
2064 fake_clock_.AdvanceTimeMilliseconds(30);
Erik Språng77b75292019-10-28 15:51:36 +01002065 EXPECT_GT(rtp_sender()->ReSendPacket(media_sequence_number), 0);
Erik Språng9c771c22019-06-17 16:31:53 +02002066
2067 // Retransmission of RTX packet should not be allowed.
Erik Språng77b75292019-10-28 15:51:36 +01002068 EXPECT_EQ(rtp_sender()->ReSendPacket(packet->SequenceNumber()), 0);
Erik Språng9c771c22019-06-17 16:31:53 +02002069}
2070
Erik Språng77b75292019-10-28 15:51:36 +01002071TEST_P(RtpSenderTest, SendPacketUpdatesExtensions) {
2072 ASSERT_EQ(rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng9c771c22019-06-17 16:31:53 +02002073 kRtpExtensionTransmissionTimeOffset,
2074 kTransmissionTimeOffsetExtensionId),
2075 0);
Erik Språng77b75292019-10-28 15:51:36 +01002076 ASSERT_EQ(rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng9c771c22019-06-17 16:31:53 +02002077 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId),
2078 0);
Erik Språng77b75292019-10-28 15:51:36 +01002079 ASSERT_EQ(rtp_sender()->RegisterRtpHeaderExtension(kRtpExtensionVideoTiming,
2080 kVideoTimingExtensionId),
Erik Språng9c771c22019-06-17 16:31:53 +02002081 0);
2082
2083 std::unique_ptr<RtpPacketToSend> packet =
2084 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2085 packet->set_packetization_finish_time_ms(fake_clock_.TimeInMilliseconds());
2086
2087 const int32_t kDiffMs = 10;
2088 fake_clock_.AdvanceTimeMilliseconds(kDiffMs);
2089
2090 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Erik Språng77b75292019-10-28 15:51:36 +01002091 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng9c771c22019-06-17 16:31:53 +02002092
2093 const RtpPacketReceived& received_packet = transport_.last_sent_packet();
2094
2095 EXPECT_EQ(received_packet.GetExtension<TransmissionOffset>(), kDiffMs * 90);
2096
2097 EXPECT_EQ(received_packet.GetExtension<AbsoluteSendTime>(),
2098 AbsoluteSendTime::MsTo24Bits(fake_clock_.TimeInMilliseconds()));
2099
2100 VideoSendTiming timing;
2101 EXPECT_TRUE(received_packet.GetExtension<VideoTimingExtension>(&timing));
2102 EXPECT_EQ(timing.pacer_exit_delta_ms, kDiffMs);
2103}
2104
Erik Språng77b75292019-10-28 15:51:36 +01002105TEST_P(RtpSenderTest, SendPacketSetsPacketOptions) {
Erik Språng9c771c22019-06-17 16:31:53 +02002106 const uint16_t kPacketId = 42;
Erik Språng77b75292019-10-28 15:51:36 +01002107 ASSERT_EQ(rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng9c771c22019-06-17 16:31:53 +02002108 kRtpExtensionTransportSequenceNumber,
2109 kTransportSequenceNumberExtensionId),
2110 0);
2111 std::unique_ptr<RtpPacketToSend> packet =
2112 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2113 packet->SetExtension<TransportSequenceNumber>(kPacketId);
2114
2115 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2116 EXPECT_CALL(send_packet_observer_, OnSendPacket);
Erik Språng77b75292019-10-28 15:51:36 +01002117 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng9c771c22019-06-17 16:31:53 +02002118
2119 EXPECT_EQ(transport_.last_options_.packet_id, kPacketId);
2120 EXPECT_TRUE(transport_.last_options_.included_in_allocation);
2121 EXPECT_TRUE(transport_.last_options_.included_in_feedback);
2122 EXPECT_FALSE(transport_.last_options_.is_retransmit);
2123
2124 // Send another packet as retransmission, verify options are populated.
2125 packet = BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2126 packet->SetExtension<TransportSequenceNumber>(kPacketId + 1);
2127 packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
Erik Språng77b75292019-10-28 15:51:36 +01002128 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng9c771c22019-06-17 16:31:53 +02002129 EXPECT_TRUE(transport_.last_options_.is_retransmit);
2130}
2131
Erik Språng77b75292019-10-28 15:51:36 +01002132TEST_P(RtpSenderTest, SendPacketUpdatesStats) {
Erik Språng9c771c22019-06-17 16:31:53 +02002133 const size_t kPayloadSize = 1000;
2134
2135 StrictMock<MockSendSideDelayObserver> send_side_delay_observer;
Erik Språng4580ca22019-07-04 10:38:43 +02002136
2137 RtpRtcp::Configuration config;
2138 config.clock = &fake_clock_;
2139 config.outgoing_transport = &transport_;
Erik Språng54d5d2c2019-08-20 17:22:36 +02002140 config.local_media_ssrc = kSsrc;
Erik Språng4580ca22019-07-04 10:38:43 +02002141 config.rtx_send_ssrc = kRtxSsrc;
2142 config.flexfec_sender = &flexfec_sender_;
2143 config.send_side_delay_observer = &send_side_delay_observer;
2144 config.event_log = &mock_rtc_event_log_;
2145 config.send_packet_observer = &send_packet_observer_;
Erik Språng77b75292019-10-28 15:51:36 +01002146 rtp_sender_context_ = std::make_unique<RtpSenderContext>(config);
2147 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng9c771c22019-06-17 16:31:53 +02002148 kRtpExtensionTransportSequenceNumber,
2149 kTransportSequenceNumberExtensionId));
2150
2151 const int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
2152
2153 std::unique_ptr<RtpPacketToSend> video_packet =
2154 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2155 video_packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2156 video_packet->SetPayloadSize(kPayloadSize);
2157 video_packet->SetExtension<TransportSequenceNumber>(1);
2158
2159 std::unique_ptr<RtpPacketToSend> rtx_packet =
2160 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2161 rtx_packet->SetSsrc(kRtxSsrc);
2162 rtx_packet->set_packet_type(RtpPacketToSend::Type::kRetransmission);
2163 rtx_packet->SetPayloadSize(kPayloadSize);
2164 rtx_packet->SetExtension<TransportSequenceNumber>(2);
2165
2166 std::unique_ptr<RtpPacketToSend> fec_packet =
2167 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2168 fec_packet->SetSsrc(kFlexFecSsrc);
2169 fec_packet->set_packet_type(RtpPacketToSend::Type::kForwardErrorCorrection);
2170 fec_packet->SetPayloadSize(kPayloadSize);
2171 fec_packet->SetExtension<TransportSequenceNumber>(3);
2172
2173 const int64_t kDiffMs = 25;
2174 fake_clock_.AdvanceTimeMilliseconds(kDiffMs);
2175
2176 EXPECT_CALL(send_side_delay_observer,
2177 SendSideDelayUpdated(kDiffMs, kDiffMs, kDiffMs, kSsrc));
2178 EXPECT_CALL(
2179 send_side_delay_observer,
2180 SendSideDelayUpdated(kDiffMs, kDiffMs, 2 * kDiffMs, kFlexFecSsrc));
2181
2182 EXPECT_CALL(send_packet_observer_, OnSendPacket(1, capture_time_ms, kSsrc));
Erik Språng77b75292019-10-28 15:51:36 +01002183
2184 rtp_egress()->SendPacket(video_packet.get(), PacedPacketInfo());
Erik Språng9c771c22019-06-17 16:31:53 +02002185
2186 // Send packet observer not called for padding/retransmissions.
2187 EXPECT_CALL(send_packet_observer_, OnSendPacket(2, _, _)).Times(0);
Erik Språng77b75292019-10-28 15:51:36 +01002188 rtp_egress()->SendPacket(rtx_packet.get(), PacedPacketInfo());
Erik Språng9c771c22019-06-17 16:31:53 +02002189
2190 EXPECT_CALL(send_packet_observer_,
2191 OnSendPacket(3, capture_time_ms, kFlexFecSsrc));
Erik Språng77b75292019-10-28 15:51:36 +01002192 rtp_egress()->SendPacket(fec_packet.get(), PacedPacketInfo());
Erik Språng9c771c22019-06-17 16:31:53 +02002193
2194 StreamDataCounters rtp_stats;
2195 StreamDataCounters rtx_stats;
Erik Språng77b75292019-10-28 15:51:36 +01002196 rtp_egress()->GetDataCounters(&rtp_stats, &rtx_stats);
Erik Språng9c771c22019-06-17 16:31:53 +02002197 EXPECT_EQ(rtp_stats.transmitted.packets, 2u);
2198 EXPECT_EQ(rtp_stats.fec.packets, 1u);
2199 EXPECT_EQ(rtx_stats.retransmitted.packets, 1u);
2200}
2201
Erik Språng478cb462019-06-26 15:49:27 +02002202TEST_P(RtpSenderTest, GeneratePaddingResendsOldPacketsWithRtx) {
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002203 // Min requested size in order to use RTX payload.
2204 const size_t kMinPaddingSize = 50;
2205
Erik Språng77b75292019-10-28 15:51:36 +01002206 rtp_sender()->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2207 rtp_sender()->SetRtxPayloadType(kRtxPayload, kPayload);
2208 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
2209 RtpPacketHistory::StorageMode::kStoreAndCull, 1);
Erik Språng478cb462019-06-26 15:49:27 +02002210
Erik Språng77b75292019-10-28 15:51:36 +01002211 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng0f6191d2019-07-15 20:33:40 +02002212 kRtpExtensionTransmissionTimeOffset,
2213 kTransmissionTimeOffsetExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +01002214 ASSERT_EQ(0,
2215 rtp_sender()->RegisterRtpHeaderExtension(
2216 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
2217 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng0f6191d2019-07-15 20:33:40 +02002218 kRtpExtensionTransportSequenceNumber,
2219 kTransportSequenceNumberExtensionId));
2220
Erik Språng478cb462019-06-26 15:49:27 +02002221 const size_t kPayloadPacketSize = 1234;
2222 std::unique_ptr<RtpPacketToSend> packet =
2223 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2224 packet->set_allow_retransmission(true);
2225 packet->SetPayloadSize(kPayloadPacketSize);
2226 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2227
2228 // Send a dummy video packet so it ends up in the packet history.
Erik Språng0f6191d2019-07-15 20:33:40 +02002229 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Erik Språng77b75292019-10-28 15:51:36 +01002230 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng478cb462019-06-26 15:49:27 +02002231
2232 // Generated padding has large enough budget that the video packet should be
2233 // retransmitted as padding.
Erik Språngf6468d22019-07-05 16:53:43 +02002234 std::vector<std::unique_ptr<RtpPacketToSend>> generated_packets =
Erik Språng77b75292019-10-28 15:51:36 +01002235 rtp_sender()->GeneratePadding(kMinPaddingSize, true);
Erik Språngf6468d22019-07-05 16:53:43 +02002236 ASSERT_EQ(generated_packets.size(), 1u);
2237 auto& padding_packet = generated_packets.front();
2238 EXPECT_EQ(padding_packet->packet_type(), RtpPacketToSend::Type::kPadding);
2239 EXPECT_EQ(padding_packet->Ssrc(), kRtxSsrc);
2240 EXPECT_EQ(padding_packet->payload_size(),
2241 kPayloadPacketSize + kRtxHeaderSize);
Erik Språng0f6191d2019-07-15 20:33:40 +02002242 EXPECT_TRUE(padding_packet->IsExtensionReserved<TransportSequenceNumber>());
2243 EXPECT_TRUE(padding_packet->IsExtensionReserved<AbsoluteSendTime>());
2244 EXPECT_TRUE(padding_packet->IsExtensionReserved<TransmissionOffset>());
2245
2246 // Verify all header extensions are received.
Erik Språng77b75292019-10-28 15:51:36 +01002247 rtp_egress()->SendPacket(padding_packet.get(), PacedPacketInfo());
Erik Språng0f6191d2019-07-15 20:33:40 +02002248 webrtc::RTPHeader rtp_header;
2249 transport_.last_sent_packet().GetHeader(&rtp_header);
2250 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime);
2251 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
2252 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
Erik Språng478cb462019-06-26 15:49:27 +02002253
2254 // Not enough budged for payload padding, use plain padding instead.
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002255 const size_t kPaddingBytesRequested = kMinPaddingSize - 1;
Erik Språngf6468d22019-07-05 16:53:43 +02002256
2257 size_t padding_bytes_generated = 0;
Erik Språng77b75292019-10-28 15:51:36 +01002258 generated_packets =
2259 rtp_sender()->GeneratePadding(kPaddingBytesRequested, true);
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002260 EXPECT_EQ(generated_packets.size(), 1u);
Erik Språngf6468d22019-07-05 16:53:43 +02002261 for (auto& packet : generated_packets) {
2262 EXPECT_EQ(packet->packet_type(), RtpPacketToSend::Type::kPadding);
2263 EXPECT_EQ(packet->Ssrc(), kRtxSsrc);
2264 EXPECT_EQ(packet->payload_size(), 0u);
2265 EXPECT_GT(packet->padding_size(), 0u);
2266 padding_bytes_generated += packet->padding_size();
Erik Språng0f6191d2019-07-15 20:33:40 +02002267
2268 EXPECT_TRUE(packet->IsExtensionReserved<TransportSequenceNumber>());
2269 EXPECT_TRUE(packet->IsExtensionReserved<AbsoluteSendTime>());
2270 EXPECT_TRUE(packet->IsExtensionReserved<TransmissionOffset>());
2271
2272 // Verify all header extensions are received.
Erik Språng77b75292019-10-28 15:51:36 +01002273 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng0f6191d2019-07-15 20:33:40 +02002274 webrtc::RTPHeader rtp_header;
2275 transport_.last_sent_packet().GetHeader(&rtp_header);
2276 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime);
2277 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
2278 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
Erik Språngf6468d22019-07-05 16:53:43 +02002279 }
2280
Mirko Bonadeia7e3bce2019-07-12 17:35:56 +00002281 EXPECT_EQ(padding_bytes_generated, kMaxPaddingSize);
Erik Språng478cb462019-06-26 15:49:27 +02002282}
2283
2284TEST_P(RtpSenderTest, GeneratePaddingCreatesPurePaddingWithoutRtx) {
Erik Språng77b75292019-10-28 15:51:36 +01002285 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
2286 RtpPacketHistory::StorageMode::kStoreAndCull, 1);
2287 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng0f6191d2019-07-15 20:33:40 +02002288 kRtpExtensionTransmissionTimeOffset,
2289 kTransmissionTimeOffsetExtensionId));
Erik Språng77b75292019-10-28 15:51:36 +01002290 ASSERT_EQ(0,
2291 rtp_sender()->RegisterRtpHeaderExtension(
2292 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
2293 ASSERT_EQ(0, rtp_sender()->RegisterRtpHeaderExtension(
Erik Språng0f6191d2019-07-15 20:33:40 +02002294 kRtpExtensionTransportSequenceNumber,
2295 kTransportSequenceNumberExtensionId));
Erik Språng478cb462019-06-26 15:49:27 +02002296
2297 const size_t kPayloadPacketSize = 1234;
2298 // Send a dummy video packet so it ends up in the packet history. Since we
2299 // are not using RTX, it should never be used as padding.
2300 std::unique_ptr<RtpPacketToSend> packet =
2301 BuildRtpPacket(kPayload, true, 0, fake_clock_.TimeInMilliseconds());
2302 packet->set_allow_retransmission(true);
2303 packet->SetPayloadSize(kPayloadPacketSize);
2304 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
Erik Språng0f6191d2019-07-15 20:33:40 +02002305 EXPECT_CALL(send_packet_observer_, OnSendPacket).Times(1);
Erik Språng77b75292019-10-28 15:51:36 +01002306 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng478cb462019-06-26 15:49:27 +02002307
2308 // Payload padding not available without RTX, only generate plain padding on
2309 // the media SSRC.
2310 // Number of padding packets is the requested padding size divided by max
2311 // padding packet size, rounded up. Pure padding packets are always of the
2312 // maximum size.
2313 const size_t kPaddingBytesRequested = kPayloadPacketSize + kRtxHeaderSize;
2314 const size_t kExpectedNumPaddingPackets =
2315 (kPaddingBytesRequested + kMaxPaddingSize - 1) / kMaxPaddingSize;
Erik Språngf6468d22019-07-05 16:53:43 +02002316 size_t padding_bytes_generated = 0;
2317 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets =
Erik Språng77b75292019-10-28 15:51:36 +01002318 rtp_sender()->GeneratePadding(kPaddingBytesRequested, true);
Erik Språngf6468d22019-07-05 16:53:43 +02002319 EXPECT_EQ(padding_packets.size(), kExpectedNumPaddingPackets);
2320 for (auto& packet : padding_packets) {
2321 EXPECT_EQ(packet->packet_type(), RtpPacketToSend::Type::kPadding);
2322 EXPECT_EQ(packet->Ssrc(), kSsrc);
2323 EXPECT_EQ(packet->payload_size(), 0u);
2324 EXPECT_GT(packet->padding_size(), 0u);
2325 padding_bytes_generated += packet->padding_size();
Erik Språng0f6191d2019-07-15 20:33:40 +02002326 EXPECT_TRUE(packet->IsExtensionReserved<TransportSequenceNumber>());
2327 EXPECT_TRUE(packet->IsExtensionReserved<AbsoluteSendTime>());
2328 EXPECT_TRUE(packet->IsExtensionReserved<TransmissionOffset>());
2329
2330 // Verify all header extensions are received.
Erik Språng77b75292019-10-28 15:51:36 +01002331 rtp_egress()->SendPacket(packet.get(), PacedPacketInfo());
Erik Språng0f6191d2019-07-15 20:33:40 +02002332 webrtc::RTPHeader rtp_header;
2333 transport_.last_sent_packet().GetHeader(&rtp_header);
2334 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime);
2335 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
2336 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
Erik Språngf6468d22019-07-05 16:53:43 +02002337 }
2338
2339 EXPECT_EQ(padding_bytes_generated,
2340 kExpectedNumPaddingPackets * kMaxPaddingSize);
Erik Språng478cb462019-06-26 15:49:27 +02002341}
2342
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002343TEST_P(RtpSenderTest, SupportsPadding) {
2344 bool kSendingMediaStats[] = {true, false};
2345 bool kEnableRedundantPayloads[] = {true, false};
2346 RTPExtensionType kBweExtensionTypes[] = {
2347 kRtpExtensionTransportSequenceNumber,
2348 kRtpExtensionTransportSequenceNumber02, kRtpExtensionAbsoluteSendTime,
2349 kRtpExtensionTransmissionTimeOffset};
2350 const int kExtensionsId = 7;
2351
2352 for (bool sending_media : kSendingMediaStats) {
Erik Språng77b75292019-10-28 15:51:36 +01002353 rtp_sender()->SetSendingMediaStatus(sending_media);
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002354 for (bool redundant_payloads : kEnableRedundantPayloads) {
2355 int rtx_mode = kRtxRetransmitted;
2356 if (redundant_payloads) {
2357 rtx_mode |= kRtxRedundantPayloads;
2358 }
Erik Språng77b75292019-10-28 15:51:36 +01002359 rtp_sender()->SetRtxStatus(rtx_mode);
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002360
2361 for (auto extension_type : kBweExtensionTypes) {
Erik Språng77b75292019-10-28 15:51:36 +01002362 EXPECT_FALSE(rtp_sender()->SupportsPadding());
2363 rtp_sender()->RegisterRtpHeaderExtension(extension_type, kExtensionsId);
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002364 if (!sending_media) {
Erik Språng77b75292019-10-28 15:51:36 +01002365 EXPECT_FALSE(rtp_sender()->SupportsPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002366 } else {
Erik Språng77b75292019-10-28 15:51:36 +01002367 EXPECT_TRUE(rtp_sender()->SupportsPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002368 if (redundant_payloads) {
Erik Språng77b75292019-10-28 15:51:36 +01002369 EXPECT_TRUE(rtp_sender()->SupportsRtxPayloadPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002370 } else {
Erik Språng77b75292019-10-28 15:51:36 +01002371 EXPECT_FALSE(rtp_sender()->SupportsRtxPayloadPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002372 }
2373 }
Erik Språng77b75292019-10-28 15:51:36 +01002374 rtp_sender()->DeregisterRtpHeaderExtension(extension_type);
2375 EXPECT_FALSE(rtp_sender()->SupportsPadding());
Mirko Bonadei999a72a2019-07-12 17:33:46 +00002376 }
2377 }
2378 }
2379}
2380
Erik Språnga57711c2019-07-24 10:47:20 +02002381TEST_P(RtpSenderTest, SetsCaptureTimeAndPopulatesTransmissionOffset) {
Erik Språng77b75292019-10-28 15:51:36 +01002382 rtp_sender()->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
2383 kTransmissionTimeOffsetExtensionId);
Erik Språnga57711c2019-07-24 10:47:20 +02002384
Erik Språng77b75292019-10-28 15:51:36 +01002385 rtp_sender()->SetSendingMediaStatus(true);
2386 rtp_sender()->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2387 rtp_sender()->SetRtxPayloadType(kRtxPayload, kPayload);
2388 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
2389 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
Erik Språnga57711c2019-07-24 10:47:20 +02002390
2391 const int64_t kMissingCaptureTimeMs = 0;
2392 const uint32_t kTimestampTicksPerMs = 90;
2393 const int64_t kOffsetMs = 10;
2394
Erik Språnga57711c2019-07-24 10:47:20 +02002395 auto packet =
2396 BuildRtpPacket(kPayload, kMarkerBit, fake_clock_.TimeInMilliseconds(),
2397 kMissingCaptureTimeMs);
2398 packet->set_packet_type(RtpPacketToSend::Type::kVideo);
2399 packet->ReserveExtension<TransmissionOffset>();
2400 packet->AllocatePayload(sizeof(kPayloadData));
2401
2402 std::unique_ptr<RtpPacketToSend> packet_to_pace;
Erik Språngea55b082019-10-02 14:57:46 +02002403 EXPECT_CALL(mock_paced_sender_, EnqueuePackets)
2404 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
2405 EXPECT_EQ(packets.size(), 1u);
2406 EXPECT_GT(packets[0]->capture_time_ms(), 0);
2407 packet_to_pace = std::move(packets[0]);
Erik Språnga57711c2019-07-24 10:47:20 +02002408 });
2409
Erik Språng70768f42019-08-27 18:16:26 +02002410 packet->set_allow_retransmission(true);
Erik Språng77b75292019-10-28 15:51:36 +01002411 EXPECT_TRUE(rtp_sender()->SendToNetwork(std::move(packet)));
Erik Språnga57711c2019-07-24 10:47:20 +02002412
2413 fake_clock_.AdvanceTimeMilliseconds(kOffsetMs);
2414
Erik Språng77b75292019-10-28 15:51:36 +01002415 rtp_egress()->SendPacket(packet_to_pace.get(), PacedPacketInfo());
Erik Språnga57711c2019-07-24 10:47:20 +02002416
Erik Språng77b75292019-10-28 15:51:36 +01002417 EXPECT_EQ(1, transport_.packets_sent());
2418 absl::optional<int32_t> transmission_time_extension =
2419 transport_.sent_packets_.back().GetExtension<TransmissionOffset>();
2420 ASSERT_TRUE(transmission_time_extension.has_value());
2421 EXPECT_EQ(*transmission_time_extension, kOffsetMs * kTimestampTicksPerMs);
Erik Språnga57711c2019-07-24 10:47:20 +02002422
Erik Språng77b75292019-10-28 15:51:36 +01002423 // Retransmit packet. The RTX packet should get the same capture time as the
2424 // original packet, so offset is delta from original packet to now.
2425 fake_clock_.AdvanceTimeMilliseconds(kOffsetMs);
Erik Språnga57711c2019-07-24 10:47:20 +02002426
Erik Språnga57711c2019-07-24 10:47:20 +02002427 std::unique_ptr<RtpPacketToSend> rtx_packet_to_pace;
Erik Språngea55b082019-10-02 14:57:46 +02002428 EXPECT_CALL(mock_paced_sender_, EnqueuePackets)
2429 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
2430 EXPECT_GT(packets[0]->capture_time_ms(), 0);
2431 rtx_packet_to_pace = std::move(packets[0]);
Erik Språnga57711c2019-07-24 10:47:20 +02002432 });
2433
Erik Språng77b75292019-10-28 15:51:36 +01002434 EXPECT_GT(rtp_sender()->ReSendPacket(kSeqNum), 0);
2435 rtp_egress()->SendPacket(rtx_packet_to_pace.get(), PacedPacketInfo());
Erik Språnga57711c2019-07-24 10:47:20 +02002436
Erik Språng77b75292019-10-28 15:51:36 +01002437 EXPECT_EQ(2, transport_.packets_sent());
2438 transmission_time_extension =
2439 transport_.sent_packets_.back().GetExtension<TransmissionOffset>();
2440 ASSERT_TRUE(transmission_time_extension.has_value());
2441 EXPECT_EQ(*transmission_time_extension,
2442 2 * kOffsetMs * kTimestampTicksPerMs);
Erik Språnga57711c2019-07-24 10:47:20 +02002443}
2444
Erik Språng6cacef22019-07-24 14:15:51 +02002445TEST_P(RtpSenderTestWithoutPacer, ClearHistoryOnSequenceNumberCange) {
2446 const int64_t kRtt = 10;
2447
Erik Språng77b75292019-10-28 15:51:36 +01002448 rtp_sender()->SetSendingMediaStatus(true);
2449 rtp_sender()->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2450 rtp_sender()->SetRtxPayloadType(kRtxPayload, kPayload);
2451 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
2452 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
2453 rtp_sender_context_->packet_history_.SetRtt(kRtt);
Erik Språng6cacef22019-07-24 14:15:51 +02002454
2455 // Send a packet and record its sequence numbers.
2456 SendGenericPacket();
2457 ASSERT_EQ(1u, transport_.sent_packets_.size());
2458 const uint16_t packet_seqence_number =
2459 transport_.sent_packets_.back().SequenceNumber();
2460
2461 // Advance time and make sure it can be retransmitted, even if we try to set
2462 // the ssrc the what it already is.
Erik Språng77b75292019-10-28 15:51:36 +01002463 rtp_sender()->SetSequenceNumber(rtp_sender()->SequenceNumber());
Erik Språng6cacef22019-07-24 14:15:51 +02002464 fake_clock_.AdvanceTimeMilliseconds(kRtt);
Erik Språng77b75292019-10-28 15:51:36 +01002465 EXPECT_GT(rtp_sender()->ReSendPacket(packet_seqence_number), 0);
Erik Språng6cacef22019-07-24 14:15:51 +02002466
2467 // Change the sequence number, then move the time and try to retransmit again.
2468 // The old packet should now be gone.
Erik Språng77b75292019-10-28 15:51:36 +01002469 rtp_sender()->SetSequenceNumber(rtp_sender()->SequenceNumber() - 1);
Erik Språng6cacef22019-07-24 14:15:51 +02002470 fake_clock_.AdvanceTimeMilliseconds(kRtt);
Erik Språng77b75292019-10-28 15:51:36 +01002471 EXPECT_EQ(rtp_sender()->ReSendPacket(packet_seqence_number), 0);
Erik Språng6cacef22019-07-24 14:15:51 +02002472}
2473
Erik Språng60ffc312019-07-30 22:03:49 +02002474TEST_P(RtpSenderTest, IgnoresNackAfterDisablingMedia) {
2475 const int64_t kRtt = 10;
2476
Erik Språng77b75292019-10-28 15:51:36 +01002477 rtp_sender()->SetSendingMediaStatus(true);
2478 rtp_sender()->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
2479 rtp_sender()->SetRtxPayloadType(kRtxPayload, kPayload);
2480 rtp_sender_context_->packet_history_.SetStorePacketsStatus(
2481 RtpPacketHistory::StorageMode::kStoreAndCull, 10);
2482 rtp_sender_context_->packet_history_.SetRtt(kRtt);
Erik Språng60ffc312019-07-30 22:03:49 +02002483
2484 // Send a packet so it is in the packet history.
Erik Språng60ffc312019-07-30 22:03:49 +02002485 std::unique_ptr<RtpPacketToSend> packet_to_pace;
Erik Språngea55b082019-10-02 14:57:46 +02002486 EXPECT_CALL(mock_paced_sender_, EnqueuePackets)
2487 .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
2488 packet_to_pace = std::move(packets[0]);
Erik Språng60ffc312019-07-30 22:03:49 +02002489 });
2490
2491 SendGenericPacket();
Erik Språng77b75292019-10-28 15:51:36 +01002492 rtp_egress()->SendPacket(packet_to_pace.get(), PacedPacketInfo());
Erik Språng60ffc312019-07-30 22:03:49 +02002493
2494 ASSERT_EQ(1u, transport_.sent_packets_.size());
2495
2496 // Disable media sending and try to retransmit the packet, it should fail.
Erik Språng77b75292019-10-28 15:51:36 +01002497 rtp_sender()->SetSendingMediaStatus(false);
Erik Språng60ffc312019-07-30 22:03:49 +02002498 fake_clock_.AdvanceTimeMilliseconds(kRtt);
Erik Språng77b75292019-10-28 15:51:36 +01002499 EXPECT_LT(rtp_sender()->ReSendPacket(kSeqNum), 0);
Erik Språng60ffc312019-07-30 22:03:49 +02002500}
2501
Mirko Bonadeic84f6612019-01-31 12:20:57 +01002502INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
2503 RtpSenderTest,
Erik Språngf5815fa2019-08-21 14:27:31 +02002504 ::testing::Values(TestConfig{false},
2505 TestConfig{true}));
Erik Språngf6468d22019-07-05 16:53:43 +02002506
Mirko Bonadeic84f6612019-01-31 12:20:57 +01002507INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
2508 RtpSenderTestWithoutPacer,
Erik Språngf5815fa2019-08-21 14:27:31 +02002509 ::testing::Values(TestConfig{false},
2510 TestConfig{true}));
Niels Möllera34d7762019-02-01 14:13:29 +01002511
solenberg@webrtc.orgc0352d52013-05-20 20:55:07 +00002512} // namespace webrtc