blob: b721b034f5d0a6ecd6994cf01a9c7565c3b4d72f [file] [log] [blame]
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
kwiberg84be5112016-04-27 01:19:58 -070011#include <memory>
Danil Chapovalovd1996b72018-01-16 11:07:18 +010012#include <vector>
kwiberg84be5112016-04-27 01:19:58 -070013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/rtp_rtcp/include/receive_statistics.h"
15#include "system_wrappers/include/clock.h"
16#include "test/gmock.h"
17#include "test/gtest.h"
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000018
19namespace webrtc {
Danil Chapovalovd1996b72018-01-16 11:07:18 +010020namespace {
21
22using ::testing::SizeIs;
23using ::testing::UnorderedElementsAre;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000024
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000025const size_t kPacketSize1 = 100;
26const size_t kPacketSize2 = 300;
Danil Chapovalovd1996b72018-01-16 11:07:18 +010027const uint32_t kSsrc1 = 101;
28const uint32_t kSsrc2 = 202;
29const uint32_t kSsrc3 = 203;
30const uint32_t kSsrc4 = 304;
31
32RTPHeader CreateRtpHeader(uint32_t ssrc) {
33 RTPHeader header;
34 memset(&header, 0, sizeof(header));
35 header.ssrc = ssrc;
36 header.sequenceNumber = 100;
Niels Möller5304a322018-08-27 13:27:05 +020037 header.payload_type_frequency = 90000;
Danil Chapovalovd1996b72018-01-16 11:07:18 +010038 return header;
39}
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000040
41class ReceiveStatisticsTest : public ::testing::Test {
42 public:
Yves Gerey665174f2018-06-19 15:03:05 +020043 ReceiveStatisticsTest()
44 : clock_(0), receive_statistics_(ReceiveStatistics::Create(&clock_)) {
Danil Chapovalovd1996b72018-01-16 11:07:18 +010045 header1_ = CreateRtpHeader(kSsrc1);
46 header2_ = CreateRtpHeader(kSsrc2);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000047 }
48
49 protected:
50 SimulatedClock clock_;
kwiberg84be5112016-04-27 01:19:58 -070051 std::unique_ptr<ReceiveStatistics> receive_statistics_;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000052 RTPHeader header1_;
53 RTPHeader header2_;
54};
55
56TEST_F(ReceiveStatisticsTest, TwoIncomingSsrcs) {
Niels Möller5304a322018-08-27 13:27:05 +020057 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000058 ++header1_.sequenceNumber;
Niels Möller5304a322018-08-27 13:27:05 +020059 receive_statistics_->IncomingPacket(header2_, kPacketSize2);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000060 ++header2_.sequenceNumber;
61 clock_.AdvanceTimeMilliseconds(100);
Niels Möller5304a322018-08-27 13:27:05 +020062 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000063 ++header1_.sequenceNumber;
Niels Möller5304a322018-08-27 13:27:05 +020064 receive_statistics_->IncomingPacket(header2_, kPacketSize2);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000065 ++header2_.sequenceNumber;
66
67 StreamStatistician* statistician =
68 receive_statistics_->GetStatistician(kSsrc1);
69 ASSERT_TRUE(statistician != NULL);
70 EXPECT_GT(statistician->BitrateReceived(), 0u);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000071 size_t bytes_received = 0;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000072 uint32_t packets_received = 0;
73 statistician->GetDataCounters(&bytes_received, &packets_received);
74 EXPECT_EQ(200u, bytes_received);
75 EXPECT_EQ(2u, packets_received);
76
Yves Gerey665174f2018-06-19 15:03:05 +020077 statistician = receive_statistics_->GetStatistician(kSsrc2);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000078 ASSERT_TRUE(statistician != NULL);
79 EXPECT_GT(statistician->BitrateReceived(), 0u);
80 statistician->GetDataCounters(&bytes_received, &packets_received);
81 EXPECT_EQ(600u, bytes_received);
82 EXPECT_EQ(2u, packets_received);
83
Danil Chapovalovc5267d22017-09-18 13:57:19 +020084 EXPECT_EQ(2u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000085 // Add more incoming packets and verify that they are registered in both
86 // access methods.
Niels Möller5304a322018-08-27 13:27:05 +020087 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000088 ++header1_.sequenceNumber;
Niels Möller5304a322018-08-27 13:27:05 +020089 receive_statistics_->IncomingPacket(header2_, kPacketSize2);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000090 ++header2_.sequenceNumber;
91
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000092 receive_statistics_->GetStatistician(kSsrc1)->GetDataCounters(
93 &bytes_received, &packets_received);
94 EXPECT_EQ(300u, bytes_received);
95 EXPECT_EQ(3u, packets_received);
96 receive_statistics_->GetStatistician(kSsrc2)->GetDataCounters(
97 &bytes_received, &packets_received);
98 EXPECT_EQ(900u, bytes_received);
99 EXPECT_EQ(3u, packets_received);
100}
101
Danil Chapovalovd1996b72018-01-16 11:07:18 +0100102TEST_F(ReceiveStatisticsTest,
103 RtcpReportBlocksReturnsMaxBlocksWhenThereAreMoreStatisticians) {
104 RTPHeader header1 = CreateRtpHeader(kSsrc1);
105 RTPHeader header2 = CreateRtpHeader(kSsrc2);
106 RTPHeader header3 = CreateRtpHeader(kSsrc3);
Niels Möller5304a322018-08-27 13:27:05 +0200107 receive_statistics_->IncomingPacket(header1, kPacketSize1);
108 receive_statistics_->IncomingPacket(header2, kPacketSize1);
109 receive_statistics_->IncomingPacket(header3, kPacketSize1);
Danil Chapovalovd1996b72018-01-16 11:07:18 +0100110
111 EXPECT_THAT(receive_statistics_->RtcpReportBlocks(2), SizeIs(2));
112 EXPECT_THAT(receive_statistics_->RtcpReportBlocks(2), SizeIs(2));
113 EXPECT_THAT(receive_statistics_->RtcpReportBlocks(2), SizeIs(2));
114}
115
116TEST_F(ReceiveStatisticsTest,
117 RtcpReportBlocksReturnsAllObservedSsrcsWithMultipleCalls) {
118 RTPHeader header1 = CreateRtpHeader(kSsrc1);
119 RTPHeader header2 = CreateRtpHeader(kSsrc2);
120 RTPHeader header3 = CreateRtpHeader(kSsrc3);
121 RTPHeader header4 = CreateRtpHeader(kSsrc4);
Niels Möller5304a322018-08-27 13:27:05 +0200122 receive_statistics_->IncomingPacket(header1, kPacketSize1);
123 receive_statistics_->IncomingPacket(header2, kPacketSize1);
124 receive_statistics_->IncomingPacket(header3, kPacketSize1);
125 receive_statistics_->IncomingPacket(header4, kPacketSize1);
Danil Chapovalovd1996b72018-01-16 11:07:18 +0100126
127 std::vector<uint32_t> observed_ssrcs;
128 std::vector<rtcp::ReportBlock> report_blocks =
129 receive_statistics_->RtcpReportBlocks(2);
130 ASSERT_THAT(report_blocks, SizeIs(2));
131 observed_ssrcs.push_back(report_blocks[0].source_ssrc());
132 observed_ssrcs.push_back(report_blocks[1].source_ssrc());
133
134 report_blocks = receive_statistics_->RtcpReportBlocks(2);
135 ASSERT_THAT(report_blocks, SizeIs(2));
136 observed_ssrcs.push_back(report_blocks[0].source_ssrc());
137 observed_ssrcs.push_back(report_blocks[1].source_ssrc());
138
139 EXPECT_THAT(observed_ssrcs,
140 UnorderedElementsAre(kSsrc1, kSsrc2, kSsrc3, kSsrc4));
141}
142
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000143TEST_F(ReceiveStatisticsTest, ActiveStatisticians) {
Niels Möller5304a322018-08-27 13:27:05 +0200144 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000145 ++header1_.sequenceNumber;
146 clock_.AdvanceTimeMilliseconds(1000);
Niels Möller5304a322018-08-27 13:27:05 +0200147 receive_statistics_->IncomingPacket(header2_, kPacketSize2);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000148 ++header2_.sequenceNumber;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000149 // Nothing should time out since only 1000 ms has passed since the first
150 // packet came in.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200151 EXPECT_EQ(2u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000152
153 clock_.AdvanceTimeMilliseconds(7000);
154 // kSsrc1 should have timed out.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200155 EXPECT_EQ(1u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000156
157 clock_.AdvanceTimeMilliseconds(1000);
158 // kSsrc2 should have timed out.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200159 EXPECT_EQ(0u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000160
Niels Möller5304a322018-08-27 13:27:05 +0200161 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000162 ++header1_.sequenceNumber;
163 // kSsrc1 should be active again and the data counters should have survived.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200164 EXPECT_EQ(1u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000165 StreamStatistician* statistician =
166 receive_statistics_->GetStatistician(kSsrc1);
167 ASSERT_TRUE(statistician != NULL);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000168 size_t bytes_received = 0;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000169 uint32_t packets_received = 0;
170 statistician->GetDataCounters(&bytes_received, &packets_received);
171 EXPECT_EQ(200u, bytes_received);
172 EXPECT_EQ(2u, packets_received);
173}
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000174
Niels Möller5304a322018-08-27 13:27:05 +0200175TEST_F(ReceiveStatisticsTest,
176 DoesntCreateRtcpReportBlockUntilFirstReceivedPacketForSsrc) {
177 // Creates a statistician object for the ssrc.
178 receive_statistics_->EnableRetransmitDetection(kSsrc1, true);
179 EXPECT_TRUE(receive_statistics_->GetStatistician(kSsrc1) != nullptr);
180 EXPECT_EQ(0u, receive_statistics_->RtcpReportBlocks(3).size());
181 // Receive first packet
182 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
183 EXPECT_EQ(1u, receive_statistics_->RtcpReportBlocks(3).size());
184}
185
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000186TEST_F(ReceiveStatisticsTest, GetReceiveStreamDataCounters) {
Niels Möller5304a322018-08-27 13:27:05 +0200187 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000188 StreamStatistician* statistician =
189 receive_statistics_->GetStatistician(kSsrc1);
190 ASSERT_TRUE(statistician != NULL);
191
192 StreamDataCounters counters;
193 statistician->GetReceiveStreamDataCounters(&counters);
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000194 EXPECT_GT(counters.first_packet_time_ms, -1);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000195 EXPECT_EQ(1u, counters.transmitted.packets);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000196
Niels Möller5304a322018-08-27 13:27:05 +0200197 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000198 statistician->GetReceiveStreamDataCounters(&counters);
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000199 EXPECT_GT(counters.first_packet_time_ms, -1);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000200 EXPECT_EQ(2u, counters.transmitted.packets);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000201}
202
Qingsi Wang2370b082018-08-21 14:24:26 -0700203TEST_F(ReceiveStatisticsTest, RtcpCallbacks) {
204 class TestCallback : public RtcpStatisticsCallback {
205 public:
206 TestCallback()
207 : RtcpStatisticsCallback(), num_calls_(0), ssrc_(0), stats_() {}
208 ~TestCallback() override {}
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000209
Qingsi Wang2370b082018-08-21 14:24:26 -0700210 void StatisticsUpdated(const RtcpStatistics& statistics,
211 uint32_t ssrc) override {
212 ssrc_ = ssrc;
213 stats_ = statistics;
214 ++num_calls_;
215 }
216
217 void CNameChanged(const char* cname, uint32_t ssrc) override {}
218
219 uint32_t num_calls_;
220 uint32_t ssrc_;
221 RtcpStatistics stats_;
222 } callback;
223
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000224 receive_statistics_->RegisterRtcpStatisticsCallback(&callback);
Niels Möller5304a322018-08-27 13:27:05 +0200225 receive_statistics_->EnableRetransmitDetection(kSsrc1, true);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000226
227 // Add some arbitrary data, with loss and jitter.
228 header1_.sequenceNumber = 1;
229 clock_.AdvanceTimeMilliseconds(7);
230 header1_.timestamp += 3;
Niels Möller5304a322018-08-27 13:27:05 +0200231 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000232 header1_.sequenceNumber += 2;
233 clock_.AdvanceTimeMilliseconds(9);
234 header1_.timestamp += 9;
Niels Möller5304a322018-08-27 13:27:05 +0200235 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000236 --header1_.sequenceNumber;
237 clock_.AdvanceTimeMilliseconds(13);
238 header1_.timestamp += 47;
Niels Möller5304a322018-08-27 13:27:05 +0200239 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000240 header1_.sequenceNumber += 3;
241 clock_.AdvanceTimeMilliseconds(11);
242 header1_.timestamp += 17;
Niels Möller5304a322018-08-27 13:27:05 +0200243 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
Qingsi Wang2370b082018-08-21 14:24:26 -0700244 ++header1_.sequenceNumber;
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000245
Qingsi Wang2370b082018-08-21 14:24:26 -0700246 EXPECT_EQ(0u, callback.num_calls_);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000247
Qingsi Wang2370b082018-08-21 14:24:26 -0700248 // Call GetStatistics, simulating a timed rtcp sender thread.
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000249 RtcpStatistics statistics;
Qingsi Wang2370b082018-08-21 14:24:26 -0700250 receive_statistics_->GetStatistician(kSsrc1)->GetStatistics(&statistics,
251 true);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000252
Qingsi Wang2370b082018-08-21 14:24:26 -0700253 EXPECT_EQ(1u, callback.num_calls_);
254 EXPECT_EQ(callback.ssrc_, kSsrc1);
255 EXPECT_EQ(statistics.packets_lost, callback.stats_.packets_lost);
256 EXPECT_EQ(statistics.extended_highest_sequence_number,
257 callback.stats_.extended_highest_sequence_number);
258 EXPECT_EQ(statistics.fraction_lost, callback.stats_.fraction_lost);
259 EXPECT_EQ(statistics.jitter, callback.stats_.jitter);
260 EXPECT_EQ(51, statistics.fraction_lost);
Harald Alvestrandc7c41912017-12-08 09:59:34 +0100261 EXPECT_EQ(1, statistics.packets_lost);
Qingsi Wang2370b082018-08-21 14:24:26 -0700262 EXPECT_EQ(5u, statistics.extended_highest_sequence_number);
Niels Möller5304a322018-08-27 13:27:05 +0200263 EXPECT_EQ(177u, statistics.jitter);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000264
Qingsi Wang2370b082018-08-21 14:24:26 -0700265 receive_statistics_->RegisterRtcpStatisticsCallback(NULL);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000266
Qingsi Wang2370b082018-08-21 14:24:26 -0700267 // Add some more data.
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000268 header1_.sequenceNumber = 1;
269 clock_.AdvanceTimeMilliseconds(7);
270 header1_.timestamp += 3;
Niels Möller5304a322018-08-27 13:27:05 +0200271 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
Qingsi Wang2370b082018-08-21 14:24:26 -0700272 header1_.sequenceNumber += 2;
273 clock_.AdvanceTimeMilliseconds(9);
274 header1_.timestamp += 9;
Niels Möller5304a322018-08-27 13:27:05 +0200275 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
Qingsi Wang2370b082018-08-21 14:24:26 -0700276 --header1_.sequenceNumber;
277 clock_.AdvanceTimeMilliseconds(13);
278 header1_.timestamp += 47;
Niels Möller5304a322018-08-27 13:27:05 +0200279 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
Qingsi Wang2370b082018-08-21 14:24:26 -0700280 header1_.sequenceNumber += 3;
281 clock_.AdvanceTimeMilliseconds(11);
282 header1_.timestamp += 17;
Niels Möller5304a322018-08-27 13:27:05 +0200283 receive_statistics_->IncomingPacket(header1_, kPacketSize1);
Taylor Brandstetter84916932018-06-25 15:50:26 -0700284 ++header1_.sequenceNumber;
Taylor Brandstetter84916932018-06-25 15:50:26 -0700285
Qingsi Wang2370b082018-08-21 14:24:26 -0700286 receive_statistics_->GetStatistician(kSsrc1)->GetStatistics(&statistics,
287 true);
Taylor Brandstetter84916932018-06-25 15:50:26 -0700288
Qingsi Wang2370b082018-08-21 14:24:26 -0700289 // Should not have been called after deregister.
290 EXPECT_EQ(1u, callback.num_calls_);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000291}
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000292
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000293class RtpTestCallback : public StreamDataCountersCallback {
294 public:
295 RtpTestCallback()
296 : StreamDataCountersCallback(), num_calls_(0), ssrc_(0), stats_() {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +0000297 ~RtpTestCallback() override = default;
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000298
Danil Chapovalovdd7e2842018-03-09 15:37:03 +0000299 void DataCountersUpdated(const StreamDataCounters& counters,
300 uint32_t ssrc) override {
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000301 ssrc_ = ssrc;
302 stats_ = counters;
303 ++num_calls_;
304 }
305
asapersson@webrtc.org44149392015-02-04 08:34:47 +0000306 void MatchPacketCounter(const RtpPacketCounter& expected,
307 const RtpPacketCounter& actual) {
308 EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
309 EXPECT_EQ(expected.header_bytes, actual.header_bytes);
310 EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
311 EXPECT_EQ(expected.packets, actual.packets);
312 }
313
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000314 void Matches(uint32_t num_calls,
315 uint32_t ssrc,
316 const StreamDataCounters& expected) {
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000317 EXPECT_EQ(num_calls, num_calls_);
318 EXPECT_EQ(ssrc, ssrc_);
asapersson@webrtc.org44149392015-02-04 08:34:47 +0000319 MatchPacketCounter(expected.transmitted, stats_.transmitted);
320 MatchPacketCounter(expected.retransmitted, stats_.retransmitted);
321 MatchPacketCounter(expected.fec, stats_.fec);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000322 }
323
324 uint32_t num_calls_;
325 uint32_t ssrc_;
326 StreamDataCounters stats_;
327};
328
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000329TEST_F(ReceiveStatisticsTest, RtpCallbacks) {
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000330 RtpTestCallback callback;
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000331 receive_statistics_->RegisterRtpStatisticsCallback(&callback);
Niels Möller5304a322018-08-27 13:27:05 +0200332 receive_statistics_->EnableRetransmitDetection(kSsrc1, true);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000333
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000334 const size_t kHeaderLength = 20;
335 const size_t kPaddingLength = 9;
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000336
337 // One packet of size kPacketSize1.
338 header1_.headerLength = kHeaderLength;
Niels Möller5304a322018-08-27 13:27:05 +0200339 receive_statistics_->IncomingPacket(header1_, kPacketSize1 + kHeaderLength);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000340 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000341 expected.transmitted.payload_bytes = kPacketSize1;
342 expected.transmitted.header_bytes = kHeaderLength;
343 expected.transmitted.padding_bytes = 0;
344 expected.transmitted.packets = 1;
345 expected.retransmitted.payload_bytes = 0;
346 expected.retransmitted.header_bytes = 0;
347 expected.retransmitted.padding_bytes = 0;
348 expected.retransmitted.packets = 0;
349 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000350 callback.Matches(1, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000351
352 ++header1_.sequenceNumber;
353 clock_.AdvanceTimeMilliseconds(5);
354 header1_.paddingLength = 9;
355 // Another packet of size kPacketSize1 with 9 bytes padding.
356 receive_statistics_->IncomingPacket(
Niels Möller5304a322018-08-27 13:27:05 +0200357 header1_, kPacketSize1 + kHeaderLength + kPaddingLength);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000358 expected.transmitted.payload_bytes = kPacketSize1 * 2;
359 expected.transmitted.header_bytes = kHeaderLength * 2;
360 expected.transmitted.padding_bytes = kPaddingLength;
361 expected.transmitted.packets = 2;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000362 callback.Matches(2, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000363
364 clock_.AdvanceTimeMilliseconds(5);
365 // Retransmit last packet.
366 receive_statistics_->IncomingPacket(
Niels Möller5304a322018-08-27 13:27:05 +0200367 header1_, kPacketSize1 + kHeaderLength + kPaddingLength);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000368 expected.transmitted.payload_bytes = kPacketSize1 * 3;
369 expected.transmitted.header_bytes = kHeaderLength * 3;
370 expected.transmitted.padding_bytes = kPaddingLength * 2;
371 expected.transmitted.packets = 3;
372 expected.retransmitted.payload_bytes = kPacketSize1;
373 expected.retransmitted.header_bytes = kHeaderLength;
374 expected.retransmitted.padding_bytes = kPaddingLength;
375 expected.retransmitted.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000376 callback.Matches(3, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000377
378 header1_.paddingLength = 0;
379 ++header1_.sequenceNumber;
380 clock_.AdvanceTimeMilliseconds(5);
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000381 // One FEC packet.
Niels Möller5304a322018-08-27 13:27:05 +0200382 receive_statistics_->IncomingPacket(header1_, kPacketSize1 + kHeaderLength);
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000383 receive_statistics_->FecPacketReceived(header1_,
384 kPacketSize1 + kHeaderLength);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000385 expected.transmitted.payload_bytes = kPacketSize1 * 4;
386 expected.transmitted.header_bytes = kHeaderLength * 4;
387 expected.transmitted.packets = 4;
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000388 expected.fec.payload_bytes = kPacketSize1;
389 expected.fec.header_bytes = kHeaderLength;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000390 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000391 callback.Matches(5, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000392
393 receive_statistics_->RegisterRtpStatisticsCallback(NULL);
394
395 // New stats, but callback should not be called.
396 ++header1_.sequenceNumber;
397 clock_.AdvanceTimeMilliseconds(5);
Niels Möller5304a322018-08-27 13:27:05 +0200398 receive_statistics_->IncomingPacket(header1_, kPacketSize1 + kHeaderLength);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000399 callback.Matches(5, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000400}
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000401
402TEST_F(ReceiveStatisticsTest, RtpCallbacksFecFirst) {
403 RtpTestCallback callback;
404 receive_statistics_->RegisterRtpStatisticsCallback(&callback);
405
406 const uint32_t kHeaderLength = 20;
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000407 header1_.headerLength = kHeaderLength;
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000408
409 // If first packet is FEC, ignore it.
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000410 receive_statistics_->FecPacketReceived(header1_,
411 kPacketSize1 + kHeaderLength);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000412 EXPECT_EQ(0u, callback.num_calls_);
413
Niels Möller5304a322018-08-27 13:27:05 +0200414 receive_statistics_->IncomingPacket(header1_, kPacketSize1 + kHeaderLength);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000415 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000416 expected.transmitted.payload_bytes = kPacketSize1;
417 expected.transmitted.header_bytes = kHeaderLength;
418 expected.transmitted.padding_bytes = 0;
419 expected.transmitted.packets = 1;
420 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000421 callback.Matches(1, kSsrc1, expected);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000422
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000423 receive_statistics_->FecPacketReceived(header1_,
424 kPacketSize1 + kHeaderLength);
425 expected.fec.payload_bytes = kPacketSize1;
426 expected.fec.header_bytes = kHeaderLength;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000427 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000428 callback.Matches(2, kSsrc1, expected);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000429}
Danil Chapovalovd1996b72018-01-16 11:07:18 +0100430
431} // namespace
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000432} // namespace webrtc