blob: 29fc88daac5226132895c812801666c3ef089b2c [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;
37 return header;
38}
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000039
40class ReceiveStatisticsTest : public ::testing::Test {
41 public:
Yves Gerey665174f2018-06-19 15:03:05 +020042 ReceiveStatisticsTest()
43 : clock_(0), receive_statistics_(ReceiveStatistics::Create(&clock_)) {
Danil Chapovalovd1996b72018-01-16 11:07:18 +010044 header1_ = CreateRtpHeader(kSsrc1);
45 header2_ = CreateRtpHeader(kSsrc2);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000046 }
47
48 protected:
49 SimulatedClock clock_;
kwiberg84be5112016-04-27 01:19:58 -070050 std::unique_ptr<ReceiveStatistics> receive_statistics_;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000051 RTPHeader header1_;
52 RTPHeader header2_;
53};
54
55TEST_F(ReceiveStatisticsTest, TwoIncomingSsrcs) {
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000056 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000057 ++header1_.sequenceNumber;
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000058 receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000059 ++header2_.sequenceNumber;
60 clock_.AdvanceTimeMilliseconds(100);
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000061 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000062 ++header1_.sequenceNumber;
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000063 receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000064 ++header2_.sequenceNumber;
65
66 StreamStatistician* statistician =
67 receive_statistics_->GetStatistician(kSsrc1);
68 ASSERT_TRUE(statistician != NULL);
69 EXPECT_GT(statistician->BitrateReceived(), 0u);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000070 size_t bytes_received = 0;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000071 uint32_t packets_received = 0;
72 statistician->GetDataCounters(&bytes_received, &packets_received);
73 EXPECT_EQ(200u, bytes_received);
74 EXPECT_EQ(2u, packets_received);
75
Yves Gerey665174f2018-06-19 15:03:05 +020076 statistician = receive_statistics_->GetStatistician(kSsrc2);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000077 ASSERT_TRUE(statistician != NULL);
78 EXPECT_GT(statistician->BitrateReceived(), 0u);
79 statistician->GetDataCounters(&bytes_received, &packets_received);
80 EXPECT_EQ(600u, bytes_received);
81 EXPECT_EQ(2u, packets_received);
82
Danil Chapovalovc5267d22017-09-18 13:57:19 +020083 EXPECT_EQ(2u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000084 // Add more incoming packets and verify that they are registered in both
85 // access methods.
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000086 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000087 ++header1_.sequenceNumber;
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000088 receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000089 ++header2_.sequenceNumber;
90
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000091 receive_statistics_->GetStatistician(kSsrc1)->GetDataCounters(
92 &bytes_received, &packets_received);
93 EXPECT_EQ(300u, bytes_received);
94 EXPECT_EQ(3u, packets_received);
95 receive_statistics_->GetStatistician(kSsrc2)->GetDataCounters(
96 &bytes_received, &packets_received);
97 EXPECT_EQ(900u, bytes_received);
98 EXPECT_EQ(3u, packets_received);
99}
100
Danil Chapovalovd1996b72018-01-16 11:07:18 +0100101TEST_F(ReceiveStatisticsTest,
102 RtcpReportBlocksReturnsMaxBlocksWhenThereAreMoreStatisticians) {
103 RTPHeader header1 = CreateRtpHeader(kSsrc1);
104 RTPHeader header2 = CreateRtpHeader(kSsrc2);
105 RTPHeader header3 = CreateRtpHeader(kSsrc3);
106 receive_statistics_->IncomingPacket(header1, kPacketSize1, false);
107 receive_statistics_->IncomingPacket(header2, kPacketSize1, false);
108 receive_statistics_->IncomingPacket(header3, kPacketSize1, false);
109
110 EXPECT_THAT(receive_statistics_->RtcpReportBlocks(2), SizeIs(2));
111 EXPECT_THAT(receive_statistics_->RtcpReportBlocks(2), SizeIs(2));
112 EXPECT_THAT(receive_statistics_->RtcpReportBlocks(2), SizeIs(2));
113}
114
115TEST_F(ReceiveStatisticsTest,
116 RtcpReportBlocksReturnsAllObservedSsrcsWithMultipleCalls) {
117 RTPHeader header1 = CreateRtpHeader(kSsrc1);
118 RTPHeader header2 = CreateRtpHeader(kSsrc2);
119 RTPHeader header3 = CreateRtpHeader(kSsrc3);
120 RTPHeader header4 = CreateRtpHeader(kSsrc4);
121 receive_statistics_->IncomingPacket(header1, kPacketSize1, false);
122 receive_statistics_->IncomingPacket(header2, kPacketSize1, false);
123 receive_statistics_->IncomingPacket(header3, kPacketSize1, false);
124 receive_statistics_->IncomingPacket(header4, kPacketSize1, false);
125
126 std::vector<uint32_t> observed_ssrcs;
127 std::vector<rtcp::ReportBlock> report_blocks =
128 receive_statistics_->RtcpReportBlocks(2);
129 ASSERT_THAT(report_blocks, SizeIs(2));
130 observed_ssrcs.push_back(report_blocks[0].source_ssrc());
131 observed_ssrcs.push_back(report_blocks[1].source_ssrc());
132
133 report_blocks = receive_statistics_->RtcpReportBlocks(2);
134 ASSERT_THAT(report_blocks, SizeIs(2));
135 observed_ssrcs.push_back(report_blocks[0].source_ssrc());
136 observed_ssrcs.push_back(report_blocks[1].source_ssrc());
137
138 EXPECT_THAT(observed_ssrcs,
139 UnorderedElementsAre(kSsrc1, kSsrc2, kSsrc3, kSsrc4));
140}
141
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000142TEST_F(ReceiveStatisticsTest, ActiveStatisticians) {
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +0000143 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000144 ++header1_.sequenceNumber;
145 clock_.AdvanceTimeMilliseconds(1000);
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +0000146 receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000147 ++header2_.sequenceNumber;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000148 // Nothing should time out since only 1000 ms has passed since the first
149 // packet came in.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200150 EXPECT_EQ(2u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000151
152 clock_.AdvanceTimeMilliseconds(7000);
153 // kSsrc1 should have timed out.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200154 EXPECT_EQ(1u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000155
156 clock_.AdvanceTimeMilliseconds(1000);
157 // kSsrc2 should have timed out.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200158 EXPECT_EQ(0u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000159
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +0000160 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000161 ++header1_.sequenceNumber;
162 // kSsrc1 should be active again and the data counters should have survived.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200163 EXPECT_EQ(1u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000164 StreamStatistician* statistician =
165 receive_statistics_->GetStatistician(kSsrc1);
166 ASSERT_TRUE(statistician != NULL);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000167 size_t bytes_received = 0;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000168 uint32_t packets_received = 0;
169 statistician->GetDataCounters(&bytes_received, &packets_received);
170 EXPECT_EQ(200u, bytes_received);
171 EXPECT_EQ(2u, packets_received);
172}
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000173
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000174TEST_F(ReceiveStatisticsTest, GetReceiveStreamDataCounters) {
175 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
176 StreamStatistician* statistician =
177 receive_statistics_->GetStatistician(kSsrc1);
178 ASSERT_TRUE(statistician != NULL);
179
180 StreamDataCounters counters;
181 statistician->GetReceiveStreamDataCounters(&counters);
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000182 EXPECT_GT(counters.first_packet_time_ms, -1);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000183 EXPECT_EQ(1u, counters.transmitted.packets);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000184
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000185 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
186 statistician->GetReceiveStreamDataCounters(&counters);
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000187 EXPECT_GT(counters.first_packet_time_ms, -1);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000188 EXPECT_EQ(2u, counters.transmitted.packets);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000189}
190
Qingsi Wang2370b082018-08-21 14:24:26 -0700191TEST_F(ReceiveStatisticsTest, RtcpCallbacks) {
192 class TestCallback : public RtcpStatisticsCallback {
193 public:
194 TestCallback()
195 : RtcpStatisticsCallback(), num_calls_(0), ssrc_(0), stats_() {}
196 ~TestCallback() override {}
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000197
Qingsi Wang2370b082018-08-21 14:24:26 -0700198 void StatisticsUpdated(const RtcpStatistics& statistics,
199 uint32_t ssrc) override {
200 ssrc_ = ssrc;
201 stats_ = statistics;
202 ++num_calls_;
203 }
204
205 void CNameChanged(const char* cname, uint32_t ssrc) override {}
206
207 uint32_t num_calls_;
208 uint32_t ssrc_;
209 RtcpStatistics stats_;
210 } callback;
211
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000212 receive_statistics_->RegisterRtcpStatisticsCallback(&callback);
213
214 // Add some arbitrary data, with loss and jitter.
215 header1_.sequenceNumber = 1;
216 clock_.AdvanceTimeMilliseconds(7);
217 header1_.timestamp += 3;
218 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
219 header1_.sequenceNumber += 2;
220 clock_.AdvanceTimeMilliseconds(9);
221 header1_.timestamp += 9;
222 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
223 --header1_.sequenceNumber;
224 clock_.AdvanceTimeMilliseconds(13);
225 header1_.timestamp += 47;
226 receive_statistics_->IncomingPacket(header1_, kPacketSize1, true);
227 header1_.sequenceNumber += 3;
228 clock_.AdvanceTimeMilliseconds(11);
229 header1_.timestamp += 17;
230 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
Qingsi Wang2370b082018-08-21 14:24:26 -0700231 ++header1_.sequenceNumber;
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000232
Qingsi Wang2370b082018-08-21 14:24:26 -0700233 EXPECT_EQ(0u, callback.num_calls_);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000234
Qingsi Wang2370b082018-08-21 14:24:26 -0700235 // Call GetStatistics, simulating a timed rtcp sender thread.
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000236 RtcpStatistics statistics;
Qingsi Wang2370b082018-08-21 14:24:26 -0700237 receive_statistics_->GetStatistician(kSsrc1)->GetStatistics(&statistics,
238 true);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000239
Qingsi Wang2370b082018-08-21 14:24:26 -0700240 EXPECT_EQ(1u, callback.num_calls_);
241 EXPECT_EQ(callback.ssrc_, kSsrc1);
242 EXPECT_EQ(statistics.packets_lost, callback.stats_.packets_lost);
243 EXPECT_EQ(statistics.extended_highest_sequence_number,
244 callback.stats_.extended_highest_sequence_number);
245 EXPECT_EQ(statistics.fraction_lost, callback.stats_.fraction_lost);
246 EXPECT_EQ(statistics.jitter, callback.stats_.jitter);
247 EXPECT_EQ(51, statistics.fraction_lost);
Harald Alvestrandc7c41912017-12-08 09:59:34 +0100248 EXPECT_EQ(1, statistics.packets_lost);
Qingsi Wang2370b082018-08-21 14:24:26 -0700249 EXPECT_EQ(5u, statistics.extended_highest_sequence_number);
250 EXPECT_EQ(4u, statistics.jitter);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000251
Qingsi Wang2370b082018-08-21 14:24:26 -0700252 receive_statistics_->RegisterRtcpStatisticsCallback(NULL);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000253
Qingsi Wang2370b082018-08-21 14:24:26 -0700254 // Add some more data.
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000255 header1_.sequenceNumber = 1;
256 clock_.AdvanceTimeMilliseconds(7);
257 header1_.timestamp += 3;
258 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
Qingsi Wang2370b082018-08-21 14:24:26 -0700259 header1_.sequenceNumber += 2;
260 clock_.AdvanceTimeMilliseconds(9);
261 header1_.timestamp += 9;
Taylor Brandstetter84916932018-06-25 15:50:26 -0700262 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
Qingsi Wang2370b082018-08-21 14:24:26 -0700263 --header1_.sequenceNumber;
264 clock_.AdvanceTimeMilliseconds(13);
265 header1_.timestamp += 47;
Taylor Brandstetter84916932018-06-25 15:50:26 -0700266 receive_statistics_->IncomingPacket(header1_, kPacketSize1, true);
Qingsi Wang2370b082018-08-21 14:24:26 -0700267 header1_.sequenceNumber += 3;
268 clock_.AdvanceTimeMilliseconds(11);
269 header1_.timestamp += 17;
270 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
Taylor Brandstetter84916932018-06-25 15:50:26 -0700271 ++header1_.sequenceNumber;
Taylor Brandstetter84916932018-06-25 15:50:26 -0700272
Qingsi Wang2370b082018-08-21 14:24:26 -0700273 receive_statistics_->GetStatistician(kSsrc1)->GetStatistics(&statistics,
274 true);
Taylor Brandstetter84916932018-06-25 15:50:26 -0700275
Qingsi Wang2370b082018-08-21 14:24:26 -0700276 // Should not have been called after deregister.
277 EXPECT_EQ(1u, callback.num_calls_);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000278}
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000279
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000280class RtpTestCallback : public StreamDataCountersCallback {
281 public:
282 RtpTestCallback()
283 : StreamDataCountersCallback(), num_calls_(0), ssrc_(0), stats_() {}
Danil Chapovalovdd7e2842018-03-09 15:37:03 +0000284 ~RtpTestCallback() override = default;
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000285
Danil Chapovalovdd7e2842018-03-09 15:37:03 +0000286 void DataCountersUpdated(const StreamDataCounters& counters,
287 uint32_t ssrc) override {
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000288 ssrc_ = ssrc;
289 stats_ = counters;
290 ++num_calls_;
291 }
292
asapersson@webrtc.org44149392015-02-04 08:34:47 +0000293 void MatchPacketCounter(const RtpPacketCounter& expected,
294 const RtpPacketCounter& actual) {
295 EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
296 EXPECT_EQ(expected.header_bytes, actual.header_bytes);
297 EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
298 EXPECT_EQ(expected.packets, actual.packets);
299 }
300
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000301 void Matches(uint32_t num_calls,
302 uint32_t ssrc,
303 const StreamDataCounters& expected) {
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000304 EXPECT_EQ(num_calls, num_calls_);
305 EXPECT_EQ(ssrc, ssrc_);
asapersson@webrtc.org44149392015-02-04 08:34:47 +0000306 MatchPacketCounter(expected.transmitted, stats_.transmitted);
307 MatchPacketCounter(expected.retransmitted, stats_.retransmitted);
308 MatchPacketCounter(expected.fec, stats_.fec);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000309 }
310
311 uint32_t num_calls_;
312 uint32_t ssrc_;
313 StreamDataCounters stats_;
314};
315
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000316TEST_F(ReceiveStatisticsTest, RtpCallbacks) {
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000317 RtpTestCallback callback;
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000318 receive_statistics_->RegisterRtpStatisticsCallback(&callback);
319
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000320 const size_t kHeaderLength = 20;
321 const size_t kPaddingLength = 9;
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000322
323 // One packet of size kPacketSize1.
324 header1_.headerLength = kHeaderLength;
Yves Gerey665174f2018-06-19 15:03:05 +0200325 receive_statistics_->IncomingPacket(header1_, kPacketSize1 + kHeaderLength,
326 false);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000327 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000328 expected.transmitted.payload_bytes = kPacketSize1;
329 expected.transmitted.header_bytes = kHeaderLength;
330 expected.transmitted.padding_bytes = 0;
331 expected.transmitted.packets = 1;
332 expected.retransmitted.payload_bytes = 0;
333 expected.retransmitted.header_bytes = 0;
334 expected.retransmitted.padding_bytes = 0;
335 expected.retransmitted.packets = 0;
336 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000337 callback.Matches(1, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000338
339 ++header1_.sequenceNumber;
340 clock_.AdvanceTimeMilliseconds(5);
341 header1_.paddingLength = 9;
342 // Another packet of size kPacketSize1 with 9 bytes padding.
343 receive_statistics_->IncomingPacket(
344 header1_, kPacketSize1 + kHeaderLength + kPaddingLength, false);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000345 expected.transmitted.payload_bytes = kPacketSize1 * 2;
346 expected.transmitted.header_bytes = kHeaderLength * 2;
347 expected.transmitted.padding_bytes = kPaddingLength;
348 expected.transmitted.packets = 2;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000349 callback.Matches(2, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000350
351 clock_.AdvanceTimeMilliseconds(5);
352 // Retransmit last packet.
353 receive_statistics_->IncomingPacket(
354 header1_, kPacketSize1 + kHeaderLength + kPaddingLength, true);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000355 expected.transmitted.payload_bytes = kPacketSize1 * 3;
356 expected.transmitted.header_bytes = kHeaderLength * 3;
357 expected.transmitted.padding_bytes = kPaddingLength * 2;
358 expected.transmitted.packets = 3;
359 expected.retransmitted.payload_bytes = kPacketSize1;
360 expected.retransmitted.header_bytes = kHeaderLength;
361 expected.retransmitted.padding_bytes = kPaddingLength;
362 expected.retransmitted.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000363 callback.Matches(3, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000364
365 header1_.paddingLength = 0;
366 ++header1_.sequenceNumber;
367 clock_.AdvanceTimeMilliseconds(5);
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000368 // One FEC packet.
Yves Gerey665174f2018-06-19 15:03:05 +0200369 receive_statistics_->IncomingPacket(header1_, kPacketSize1 + kHeaderLength,
370 false);
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000371 receive_statistics_->FecPacketReceived(header1_,
372 kPacketSize1 + kHeaderLength);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000373 expected.transmitted.payload_bytes = kPacketSize1 * 4;
374 expected.transmitted.header_bytes = kHeaderLength * 4;
375 expected.transmitted.packets = 4;
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000376 expected.fec.payload_bytes = kPacketSize1;
377 expected.fec.header_bytes = kHeaderLength;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000378 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000379 callback.Matches(5, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000380
381 receive_statistics_->RegisterRtpStatisticsCallback(NULL);
382
383 // New stats, but callback should not be called.
384 ++header1_.sequenceNumber;
385 clock_.AdvanceTimeMilliseconds(5);
Yves Gerey665174f2018-06-19 15:03:05 +0200386 receive_statistics_->IncomingPacket(header1_, kPacketSize1 + kHeaderLength,
387 true);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000388 callback.Matches(5, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000389}
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000390
391TEST_F(ReceiveStatisticsTest, RtpCallbacksFecFirst) {
392 RtpTestCallback callback;
393 receive_statistics_->RegisterRtpStatisticsCallback(&callback);
394
395 const uint32_t kHeaderLength = 20;
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000396 header1_.headerLength = kHeaderLength;
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000397
398 // If first packet is FEC, ignore it.
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000399 receive_statistics_->FecPacketReceived(header1_,
400 kPacketSize1 + kHeaderLength);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000401 EXPECT_EQ(0u, callback.num_calls_);
402
Yves Gerey665174f2018-06-19 15:03:05 +0200403 receive_statistics_->IncomingPacket(header1_, kPacketSize1 + kHeaderLength,
404 false);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000405 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000406 expected.transmitted.payload_bytes = kPacketSize1;
407 expected.transmitted.header_bytes = kHeaderLength;
408 expected.transmitted.padding_bytes = 0;
409 expected.transmitted.packets = 1;
410 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000411 callback.Matches(1, kSsrc1, expected);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000412
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000413 receive_statistics_->FecPacketReceived(header1_,
414 kPacketSize1 + kHeaderLength);
415 expected.fec.payload_bytes = kPacketSize1;
416 expected.fec.header_bytes = kHeaderLength;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000417 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000418 callback.Matches(2, kSsrc1, expected);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000419}
Danil Chapovalovd1996b72018-01-16 11:07:18 +0100420
421} // namespace
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000422} // namespace webrtc