blob: a832383310c1c0bf90b1a3ab55c46cfa26ffc632 [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>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "modules/rtp_rtcp/include/receive_statistics.h"
14#include "system_wrappers/include/clock.h"
15#include "test/gmock.h"
16#include "test/gtest.h"
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000017
18namespace webrtc {
19
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000020const size_t kPacketSize1 = 100;
21const size_t kPacketSize2 = 300;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000022const uint32_t kSsrc1 = 1;
23const uint32_t kSsrc2 = 2;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000024
25class ReceiveStatisticsTest : public ::testing::Test {
26 public:
27 ReceiveStatisticsTest() :
28 clock_(0),
29 receive_statistics_(ReceiveStatistics::Create(&clock_)) {
30 memset(&header1_, 0, sizeof(header1_));
31 header1_.ssrc = kSsrc1;
sprang@webrtc.org0e932572014-01-23 10:00:39 +000032 header1_.sequenceNumber = 100;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000033 memset(&header2_, 0, sizeof(header2_));
34 header2_.ssrc = kSsrc2;
sprang@webrtc.org0e932572014-01-23 10:00:39 +000035 header2_.sequenceNumber = 100;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000036 }
37
38 protected:
39 SimulatedClock clock_;
kwiberg84be5112016-04-27 01:19:58 -070040 std::unique_ptr<ReceiveStatistics> receive_statistics_;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000041 RTPHeader header1_;
42 RTPHeader header2_;
43};
44
45TEST_F(ReceiveStatisticsTest, TwoIncomingSsrcs) {
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000046 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000047 ++header1_.sequenceNumber;
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000048 receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000049 ++header2_.sequenceNumber;
50 clock_.AdvanceTimeMilliseconds(100);
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000051 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000052 ++header1_.sequenceNumber;
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000053 receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000054 ++header2_.sequenceNumber;
55
56 StreamStatistician* statistician =
57 receive_statistics_->GetStatistician(kSsrc1);
58 ASSERT_TRUE(statistician != NULL);
59 EXPECT_GT(statistician->BitrateReceived(), 0u);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000060 size_t bytes_received = 0;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000061 uint32_t packets_received = 0;
62 statistician->GetDataCounters(&bytes_received, &packets_received);
63 EXPECT_EQ(200u, bytes_received);
64 EXPECT_EQ(2u, packets_received);
65
66 statistician =
67 receive_statistics_->GetStatistician(kSsrc2);
68 ASSERT_TRUE(statistician != NULL);
69 EXPECT_GT(statistician->BitrateReceived(), 0u);
70 statistician->GetDataCounters(&bytes_received, &packets_received);
71 EXPECT_EQ(600u, bytes_received);
72 EXPECT_EQ(2u, packets_received);
73
Danil Chapovalovc5267d22017-09-18 13:57:19 +020074 EXPECT_EQ(2u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000075 // Add more incoming packets and verify that they are registered in both
76 // access methods.
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000077 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000078 ++header1_.sequenceNumber;
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000079 receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000080 ++header2_.sequenceNumber;
81
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000082 receive_statistics_->GetStatistician(kSsrc1)->GetDataCounters(
83 &bytes_received, &packets_received);
84 EXPECT_EQ(300u, bytes_received);
85 EXPECT_EQ(3u, packets_received);
86 receive_statistics_->GetStatistician(kSsrc2)->GetDataCounters(
87 &bytes_received, &packets_received);
88 EXPECT_EQ(900u, bytes_received);
89 EXPECT_EQ(3u, packets_received);
90}
91
92TEST_F(ReceiveStatisticsTest, ActiveStatisticians) {
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000093 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000094 ++header1_.sequenceNumber;
95 clock_.AdvanceTimeMilliseconds(1000);
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +000096 receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000097 ++header2_.sequenceNumber;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +000098 // Nothing should time out since only 1000 ms has passed since the first
99 // packet came in.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200100 EXPECT_EQ(2u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000101
102 clock_.AdvanceTimeMilliseconds(7000);
103 // kSsrc1 should have timed out.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200104 EXPECT_EQ(1u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000105
106 clock_.AdvanceTimeMilliseconds(1000);
107 // kSsrc2 should have timed out.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200108 EXPECT_EQ(0u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000109
stefan@webrtc.org7bb8f022013-09-06 13:40:11 +0000110 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000111 ++header1_.sequenceNumber;
112 // kSsrc1 should be active again and the data counters should have survived.
Danil Chapovalovc5267d22017-09-18 13:57:19 +0200113 EXPECT_EQ(1u, receive_statistics_->RtcpReportBlocks(3).size());
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000114 StreamStatistician* statistician =
115 receive_statistics_->GetStatistician(kSsrc1);
116 ASSERT_TRUE(statistician != NULL);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000117 size_t bytes_received = 0;
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000118 uint32_t packets_received = 0;
119 statistician->GetDataCounters(&bytes_received, &packets_received);
120 EXPECT_EQ(200u, bytes_received);
121 EXPECT_EQ(2u, packets_received);
122}
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000123
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000124TEST_F(ReceiveStatisticsTest, GetReceiveStreamDataCounters) {
125 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
126 StreamStatistician* statistician =
127 receive_statistics_->GetStatistician(kSsrc1);
128 ASSERT_TRUE(statistician != NULL);
129
130 StreamDataCounters counters;
131 statistician->GetReceiveStreamDataCounters(&counters);
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000132 EXPECT_GT(counters.first_packet_time_ms, -1);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000133 EXPECT_EQ(1u, counters.transmitted.packets);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000134
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000135 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
136 statistician->GetReceiveStreamDataCounters(&counters);
asapersson@webrtc.orgd08d3892014-12-16 12:03:11 +0000137 EXPECT_GT(counters.first_packet_time_ms, -1);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000138 EXPECT_EQ(2u, counters.transmitted.packets);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000139}
140
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000141TEST_F(ReceiveStatisticsTest, RtcpCallbacks) {
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000142 class TestCallback : public RtcpStatisticsCallback {
143 public:
144 TestCallback()
145 : RtcpStatisticsCallback(), num_calls_(0), ssrc_(0), stats_() {}
146 virtual ~TestCallback() {}
147
nisseef8b61e2016-04-29 06:09:15 -0700148 void StatisticsUpdated(const RtcpStatistics& statistics,
149 uint32_t ssrc) override {
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000150 ssrc_ = ssrc;
151 stats_ = statistics;
152 ++num_calls_;
153 }
154
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000155 void CNameChanged(const char* cname, uint32_t ssrc) override {}
pbos@webrtc.orgce4e9a32014-12-18 13:50:16 +0000156
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000157 uint32_t num_calls_;
158 uint32_t ssrc_;
159 RtcpStatistics stats_;
160 } callback;
161
162 receive_statistics_->RegisterRtcpStatisticsCallback(&callback);
163
164 // Add some arbitrary data, with loss and jitter.
165 header1_.sequenceNumber = 1;
166 clock_.AdvanceTimeMilliseconds(7);
167 header1_.timestamp += 3;
168 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
169 header1_.sequenceNumber += 2;
170 clock_.AdvanceTimeMilliseconds(9);
171 header1_.timestamp += 9;
172 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
173 --header1_.sequenceNumber;
174 clock_.AdvanceTimeMilliseconds(13);
175 header1_.timestamp += 47;
176 receive_statistics_->IncomingPacket(header1_, kPacketSize1, true);
177 header1_.sequenceNumber += 3;
178 clock_.AdvanceTimeMilliseconds(11);
179 header1_.timestamp += 17;
180 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
181 ++header1_.sequenceNumber;
182
183 EXPECT_EQ(0u, callback.num_calls_);
184
185 // Call GetStatistics, simulating a timed rtcp sender thread.
186 RtcpStatistics statistics;
187 receive_statistics_->GetStatistician(kSsrc1)
188 ->GetStatistics(&statistics, true);
189
190 EXPECT_EQ(1u, callback.num_calls_);
191 EXPECT_EQ(callback.ssrc_, kSsrc1);
srte186d9c32017-08-04 05:03:53 -0700192 EXPECT_EQ(statistics.packets_lost, callback.stats_.packets_lost);
193 EXPECT_EQ(statistics.extended_highest_sequence_number,
194 callback.stats_.extended_highest_sequence_number);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000195 EXPECT_EQ(statistics.fraction_lost, callback.stats_.fraction_lost);
196 EXPECT_EQ(statistics.jitter, callback.stats_.jitter);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000197 EXPECT_EQ(51, statistics.fraction_lost);
srte186d9c32017-08-04 05:03:53 -0700198 EXPECT_EQ(1u, statistics.packets_lost);
199 EXPECT_EQ(5u, statistics.extended_highest_sequence_number);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000200 EXPECT_EQ(4u, statistics.jitter);
sprang@webrtc.org54ae4ff2013-12-19 13:26:02 +0000201
202 receive_statistics_->RegisterRtcpStatisticsCallback(NULL);
203
204 // Add some more data.
205 header1_.sequenceNumber = 1;
206 clock_.AdvanceTimeMilliseconds(7);
207 header1_.timestamp += 3;
208 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
209 header1_.sequenceNumber += 2;
210 clock_.AdvanceTimeMilliseconds(9);
211 header1_.timestamp += 9;
212 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
213 --header1_.sequenceNumber;
214 clock_.AdvanceTimeMilliseconds(13);
215 header1_.timestamp += 47;
216 receive_statistics_->IncomingPacket(header1_, kPacketSize1, true);
217 header1_.sequenceNumber += 3;
218 clock_.AdvanceTimeMilliseconds(11);
219 header1_.timestamp += 17;
220 receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
221 ++header1_.sequenceNumber;
222
223 receive_statistics_->GetStatistician(kSsrc1)
224 ->GetStatistics(&statistics, true);
225
226 // Should not have been called after deregister.
227 EXPECT_EQ(1u, callback.num_calls_);
228}
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000229
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000230class RtpTestCallback : public StreamDataCountersCallback {
231 public:
232 RtpTestCallback()
233 : StreamDataCountersCallback(), num_calls_(0), ssrc_(0), stats_() {}
234 virtual ~RtpTestCallback() {}
235
236 virtual void DataCountersUpdated(const StreamDataCounters& counters,
237 uint32_t ssrc) {
238 ssrc_ = ssrc;
239 stats_ = counters;
240 ++num_calls_;
241 }
242
asapersson@webrtc.org44149392015-02-04 08:34:47 +0000243 void MatchPacketCounter(const RtpPacketCounter& expected,
244 const RtpPacketCounter& actual) {
245 EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
246 EXPECT_EQ(expected.header_bytes, actual.header_bytes);
247 EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
248 EXPECT_EQ(expected.packets, actual.packets);
249 }
250
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000251 void Matches(uint32_t num_calls,
252 uint32_t ssrc,
253 const StreamDataCounters& expected) {
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000254 EXPECT_EQ(num_calls, num_calls_);
255 EXPECT_EQ(ssrc, ssrc_);
asapersson@webrtc.org44149392015-02-04 08:34:47 +0000256 MatchPacketCounter(expected.transmitted, stats_.transmitted);
257 MatchPacketCounter(expected.retransmitted, stats_.retransmitted);
258 MatchPacketCounter(expected.fec, stats_.fec);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000259 }
260
261 uint32_t num_calls_;
262 uint32_t ssrc_;
263 StreamDataCounters stats_;
264};
265
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000266TEST_F(ReceiveStatisticsTest, RtpCallbacks) {
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000267 RtpTestCallback callback;
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000268 receive_statistics_->RegisterRtpStatisticsCallback(&callback);
269
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000270 const size_t kHeaderLength = 20;
271 const size_t kPaddingLength = 9;
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000272
273 // One packet of size kPacketSize1.
274 header1_.headerLength = kHeaderLength;
275 receive_statistics_->IncomingPacket(
276 header1_, kPacketSize1 + kHeaderLength, false);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000277 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000278 expected.transmitted.payload_bytes = kPacketSize1;
279 expected.transmitted.header_bytes = kHeaderLength;
280 expected.transmitted.padding_bytes = 0;
281 expected.transmitted.packets = 1;
282 expected.retransmitted.payload_bytes = 0;
283 expected.retransmitted.header_bytes = 0;
284 expected.retransmitted.padding_bytes = 0;
285 expected.retransmitted.packets = 0;
286 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000287 callback.Matches(1, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000288
289 ++header1_.sequenceNumber;
290 clock_.AdvanceTimeMilliseconds(5);
291 header1_.paddingLength = 9;
292 // Another packet of size kPacketSize1 with 9 bytes padding.
293 receive_statistics_->IncomingPacket(
294 header1_, kPacketSize1 + kHeaderLength + kPaddingLength, false);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000295 expected.transmitted.payload_bytes = kPacketSize1 * 2;
296 expected.transmitted.header_bytes = kHeaderLength * 2;
297 expected.transmitted.padding_bytes = kPaddingLength;
298 expected.transmitted.packets = 2;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000299 callback.Matches(2, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000300
301 clock_.AdvanceTimeMilliseconds(5);
302 // Retransmit last packet.
303 receive_statistics_->IncomingPacket(
304 header1_, kPacketSize1 + kHeaderLength + kPaddingLength, true);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000305 expected.transmitted.payload_bytes = kPacketSize1 * 3;
306 expected.transmitted.header_bytes = kHeaderLength * 3;
307 expected.transmitted.padding_bytes = kPaddingLength * 2;
308 expected.transmitted.packets = 3;
309 expected.retransmitted.payload_bytes = kPacketSize1;
310 expected.retransmitted.header_bytes = kHeaderLength;
311 expected.retransmitted.padding_bytes = kPaddingLength;
312 expected.retransmitted.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000313 callback.Matches(3, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000314
315 header1_.paddingLength = 0;
316 ++header1_.sequenceNumber;
317 clock_.AdvanceTimeMilliseconds(5);
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000318 // One FEC packet.
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000319 receive_statistics_->IncomingPacket(
320 header1_, kPacketSize1 + kHeaderLength, false);
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000321 receive_statistics_->FecPacketReceived(header1_,
322 kPacketSize1 + kHeaderLength);
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000323 expected.transmitted.payload_bytes = kPacketSize1 * 4;
324 expected.transmitted.header_bytes = kHeaderLength * 4;
325 expected.transmitted.packets = 4;
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000326 expected.fec.payload_bytes = kPacketSize1;
327 expected.fec.header_bytes = kHeaderLength;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000328 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000329 callback.Matches(5, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000330
331 receive_statistics_->RegisterRtpStatisticsCallback(NULL);
332
333 // New stats, but callback should not be called.
334 ++header1_.sequenceNumber;
335 clock_.AdvanceTimeMilliseconds(5);
336 receive_statistics_->IncomingPacket(
337 header1_, kPacketSize1 + kHeaderLength, true);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000338 callback.Matches(5, kSsrc1, expected);
sprang@webrtc.org0e932572014-01-23 10:00:39 +0000339}
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000340
341TEST_F(ReceiveStatisticsTest, RtpCallbacksFecFirst) {
342 RtpTestCallback callback;
343 receive_statistics_->RegisterRtpStatisticsCallback(&callback);
344
345 const uint32_t kHeaderLength = 20;
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000346 header1_.headerLength = kHeaderLength;
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000347
348 // If first packet is FEC, ignore it.
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000349 receive_statistics_->FecPacketReceived(header1_,
350 kPacketSize1 + kHeaderLength);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000351 EXPECT_EQ(0u, callback.num_calls_);
352
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000353 receive_statistics_->IncomingPacket(
354 header1_, kPacketSize1 + kHeaderLength, false);
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000355 StreamDataCounters expected;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000356 expected.transmitted.payload_bytes = kPacketSize1;
357 expected.transmitted.header_bytes = kHeaderLength;
358 expected.transmitted.padding_bytes = 0;
359 expected.transmitted.packets = 1;
360 expected.fec.packets = 0;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000361 callback.Matches(1, kSsrc1, expected);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000362
asapersson@webrtc.org273fbbb2015-01-27 12:17:29 +0000363 receive_statistics_->FecPacketReceived(header1_,
364 kPacketSize1 + kHeaderLength);
365 expected.fec.payload_bytes = kPacketSize1;
366 expected.fec.header_bytes = kHeaderLength;
asapersson@webrtc.orgcfd82df2015-01-22 09:39:59 +0000367 expected.fec.packets = 1;
asapersson@webrtc.org97d04892014-12-09 09:47:53 +0000368 callback.Matches(2, kSsrc1, expected);
sprang@webrtc.orgc30e9e22014-09-08 08:20:18 +0000369}
stefan@webrtc.org286fe0b2013-08-21 20:58:21 +0000370} // namespace webrtc