blob: 19614d2bbd17db552ca6aa25a025fba2184c7af7 [file] [log] [blame]
brandtrc295e002016-11-03 09:22:33 -07001/*
2 * Copyright (c) 2016 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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/rtp_rtcp/include/flexfec_sender.h"
12
brandtrc295e002016-11-03 09:22:33 -070013#include <vector>
14
Steve Anton10542f22019-01-11 09:11:00 -080015#include "api/rtp_parameters.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
17#include "modules/rtp_rtcp/source/fec_test_helper.h"
18#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
19#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
20#include "modules/rtp_rtcp/source/rtp_sender.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "system_wrappers/include/clock.h"
22#include "test/gtest.h"
brandtrc295e002016-11-03 09:22:33 -070023
24namespace webrtc {
25
26namespace {
27
28using test::fec::AugmentedPacket;
29using test::fec::AugmentedPacketGenerator;
30
31constexpr int kFlexfecPayloadType = 123;
32constexpr uint32_t kMediaSsrc = 1234;
33constexpr uint32_t kFlexfecSsrc = 5678;
Steve Antonf0482ea2018-04-09 13:33:52 -070034const char kNoMid[] = "";
brandtrc295e002016-11-03 09:22:33 -070035const std::vector<RtpExtension> kNoRtpHeaderExtensions;
erikvarga27883732017-05-17 05:08:38 -070036const std::vector<RtpExtensionSize> kNoRtpHeaderExtensionSizes;
brandtrc295e002016-11-03 09:22:33 -070037// Assume a single protected media SSRC.
38constexpr size_t kFlexfecMaxHeaderSize = 32;
39constexpr size_t kPayloadLength = 50;
40
41constexpr int64_t kInitialSimulatedClockTime = 1;
42// These values are deterministically given by the PRNG, due to our fixed seed.
43// They should be updated if the PRNG implementation changes.
44constexpr uint16_t kDeterministicSequenceNumber = 28732;
45constexpr uint32_t kDeterministicTimestamp = 2305613085;
46
Danil Chapovalov64a59f12021-07-27 22:17:04 +020047// Round up to the nearest size that is a multiple of 4.
48size_t Word32Align(size_t size) {
49 uint32_t remainder = size % 4;
50 if (remainder != 0)
51 return size + 4 - remainder;
52 return size;
53}
54
brandtrc295e002016-11-03 09:22:33 -070055std::unique_ptr<RtpPacketToSend> GenerateSingleFlexfecPacket(
56 FlexfecSender* sender) {
57 // Parameters selected to generate a single FEC packet.
58 FecProtectionParams params;
59 params.fec_rate = 15;
60 params.max_fec_frames = 1;
61 params.fec_mask_type = kFecMaskRandom;
62 constexpr size_t kNumPackets = 4;
63
Erik Språngf87536c2020-03-05 10:14:04 +010064 sender->SetProtectionParameters(params, params);
brandtrc295e002016-11-03 09:22:33 -070065 AugmentedPacketGenerator packet_generator(kMediaSsrc);
66 packet_generator.NewFrame(kNumPackets);
67 for (size_t i = 0; i < kNumPackets; ++i) {
68 std::unique_ptr<AugmentedPacket> packet =
69 packet_generator.NextPacket(i, kPayloadLength);
70 RtpPacketToSend rtp_packet(nullptr); // No header extensions.
Ilya Nikolaevskiya5d952f2019-09-03 11:07:37 +020071 rtp_packet.Parse(packet->data);
Erik Språngf87536c2020-03-05 10:14:04 +010072 sender->AddPacketAndGenerateFec(rtp_packet);
brandtrc295e002016-11-03 09:22:33 -070073 }
brandtrc295e002016-11-03 09:22:33 -070074 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
75 sender->GetFecPackets();
brandtrc295e002016-11-03 09:22:33 -070076 EXPECT_EQ(1U, fec_packets.size());
Erik Språngf87536c2020-03-05 10:14:04 +010077 EXPECT_TRUE(sender->GetFecPackets().empty());
brandtrc295e002016-11-03 09:22:33 -070078
79 return std::move(fec_packets.front());
80}
81
82} // namespace
83
brandtr9dfff292016-11-14 05:14:50 -080084TEST(FlexfecSenderTest, Ssrc) {
85 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -070086 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -070087 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -070088 nullptr /* rtp_state */, &clock);
brandtr9dfff292016-11-14 05:14:50 -080089
Erik Språngf87536c2020-03-05 10:14:04 +010090 EXPECT_EQ(kFlexfecSsrc, sender.FecSsrc());
brandtr9dfff292016-11-14 05:14:50 -080091}
92
brandtrc295e002016-11-03 09:22:33 -070093TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) {
94 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -070095 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -070096 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -070097 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -070098
Erik Språngf87536c2020-03-05 10:14:04 +010099 EXPECT_TRUE(sender.GetFecPackets().empty());
brandtrc295e002016-11-03 09:22:33 -0700100}
101
102TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) {
103 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700104 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700105 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700106 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700107 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
108
109 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
110 EXPECT_FALSE(fec_packet->Marker());
111 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
112 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
113 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
114 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
115 EXPECT_LE(kPayloadLength, fec_packet->payload_size());
116}
117
118TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) {
119 // FEC parameters selected to generate a single FEC packet per frame.
120 FecProtectionParams params;
121 params.fec_rate = 15;
122 params.max_fec_frames = 2;
123 params.fec_mask_type = kFecMaskRandom;
124 constexpr size_t kNumFrames = 2;
125 constexpr size_t kNumPacketsPerFrame = 2;
126 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700127 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700128 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700129 nullptr /* rtp_state */, &clock);
Erik Språngf87536c2020-03-05 10:14:04 +0100130 sender.SetProtectionParameters(params, params);
brandtrc295e002016-11-03 09:22:33 -0700131
132 AugmentedPacketGenerator packet_generator(kMediaSsrc);
133 for (size_t i = 0; i < kNumFrames; ++i) {
134 packet_generator.NewFrame(kNumPacketsPerFrame);
135 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) {
136 std::unique_ptr<AugmentedPacket> packet =
137 packet_generator.NextPacket(i, kPayloadLength);
138 RtpPacketToSend rtp_packet(nullptr);
Ilya Nikolaevskiya5d952f2019-09-03 11:07:37 +0200139 rtp_packet.Parse(packet->data);
Erik Språngf87536c2020-03-05 10:14:04 +0100140 sender.AddPacketAndGenerateFec(rtp_packet);
brandtrc295e002016-11-03 09:22:33 -0700141 }
142 }
brandtrc295e002016-11-03 09:22:33 -0700143 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
144 sender.GetFecPackets();
brandtrc295e002016-11-03 09:22:33 -0700145 ASSERT_EQ(1U, fec_packets.size());
Erik Språngf87536c2020-03-05 10:14:04 +0100146 EXPECT_TRUE(sender.GetFecPackets().empty());
brandtrc295e002016-11-03 09:22:33 -0700147
148 RtpPacketToSend* fec_packet = fec_packets.front().get();
149 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
150 EXPECT_FALSE(fec_packet->Marker());
151 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
152 EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
153 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
154 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
155}
156
157TEST(FlexfecSenderTest, ProtectTwoFramesWithTwoFecPackets) {
158 // FEC parameters selected to generate a single FEC packet per frame.
159 FecProtectionParams params;
160 params.fec_rate = 30;
161 params.max_fec_frames = 1;
162 params.fec_mask_type = kFecMaskRandom;
163 constexpr size_t kNumFrames = 2;
164 constexpr size_t kNumPacketsPerFrame = 2;
165 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700166 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700167 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700168 nullptr /* rtp_state */, &clock);
Erik Språngf87536c2020-03-05 10:14:04 +0100169 sender.SetProtectionParameters(params, params);
brandtrc295e002016-11-03 09:22:33 -0700170
171 AugmentedPacketGenerator packet_generator(kMediaSsrc);
172 for (size_t i = 0; i < kNumFrames; ++i) {
173 packet_generator.NewFrame(kNumPacketsPerFrame);
174 for (size_t j = 0; j < kNumPacketsPerFrame; ++j) {
175 std::unique_ptr<AugmentedPacket> packet =
176 packet_generator.NextPacket(i, kPayloadLength);
177 RtpPacketToSend rtp_packet(nullptr);
Ilya Nikolaevskiya5d952f2019-09-03 11:07:37 +0200178 rtp_packet.Parse(packet->data);
Erik Språngf87536c2020-03-05 10:14:04 +0100179 sender.AddPacketAndGenerateFec(rtp_packet);
brandtrc295e002016-11-03 09:22:33 -0700180 }
brandtrc295e002016-11-03 09:22:33 -0700181 std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
182 sender.GetFecPackets();
brandtrc295e002016-11-03 09:22:33 -0700183 ASSERT_EQ(1U, fec_packets.size());
Erik Språngf87536c2020-03-05 10:14:04 +0100184 EXPECT_TRUE(sender.GetFecPackets().empty());
brandtrc295e002016-11-03 09:22:33 -0700185
186 RtpPacketToSend* fec_packet = fec_packets.front().get();
187 EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
188 EXPECT_FALSE(fec_packet->Marker());
189 EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
190 EXPECT_EQ(static_cast<uint16_t>(kDeterministicSequenceNumber + i),
191 fec_packet->SequenceNumber());
192 EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
193 EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
194 }
195}
196
197// In the tests, we only consider RTP header extensions that are useful for BWE.
198TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) {
199 const std::vector<RtpExtension> kRtpHeaderExtensions{};
200 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700201 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700202 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700203 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700204 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
205
206 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
207 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
208 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
209}
210
211TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) {
212 const std::vector<RtpExtension> kRtpHeaderExtensions{
213 {RtpExtension::kAbsSendTimeUri, 1}};
214 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700215 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700216 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700217 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700218 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
219
220 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>());
221 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
222 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
223}
224
225TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) {
226 const std::vector<RtpExtension> kRtpHeaderExtensions{
227 {RtpExtension::kTimestampOffsetUri, 1}};
228 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700229 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700230 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700231 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700232 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
233
234 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
235 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>());
236 EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
237}
238
239TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) {
240 const std::vector<RtpExtension> kRtpHeaderExtensions{
241 {RtpExtension::kTransportSequenceNumberUri, 1}};
242 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700243 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700244 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700245 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700246 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
247
248 EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
249 EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
250 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>());
251}
252
253TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) {
254 const std::vector<RtpExtension> kRtpHeaderExtensions{
255 {RtpExtension::kAbsSendTimeUri, 1},
256 {RtpExtension::kTimestampOffsetUri, 2},
257 {RtpExtension::kTransportSequenceNumberUri, 3}};
258 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700259 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700260 kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700261 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700262 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
263
264 EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>());
265 EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>());
266 EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>());
267}
268
269TEST(FlexfecSenderTest, MaxPacketOverhead) {
270 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700271 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700272 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
brandtr48d21a22017-05-30 02:32:12 -0700273 nullptr /* rtp_state */, &clock);
brandtrc295e002016-11-03 09:22:33 -0700274
275 EXPECT_EQ(kFlexfecMaxHeaderSize, sender.MaxPacketOverhead());
276}
277
erikvarga27883732017-05-17 05:08:38 -0700278TEST(FlexfecSenderTest, MaxPacketOverheadWithExtensions) {
279 const std::vector<RtpExtension> kRtpHeaderExtensions{
280 {RtpExtension::kAbsSendTimeUri, 1},
281 {RtpExtension::kTimestampOffsetUri, 2},
282 {RtpExtension::kTransportSequenceNumberUri, 3}};
283 SimulatedClock clock(kInitialSimulatedClockTime);
284 const size_t kExtensionHeaderLength = 1;
285 const size_t kRtpOneByteHeaderLength = 4;
Yves Gerey665174f2018-06-19 15:03:05 +0200286 const size_t kExtensionsTotalSize =
287 Word32Align(kRtpOneByteHeaderLength + kExtensionHeaderLength +
288 AbsoluteSendTime::kValueSizeBytes + kExtensionHeaderLength +
289 TransmissionOffset::kValueSizeBytes + kExtensionHeaderLength +
290 TransportSequenceNumber::kValueSizeBytes);
Steve Antonf0482ea2018-04-09 13:33:52 -0700291 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
erikvarga27883732017-05-17 05:08:38 -0700292 kRtpHeaderExtensions, RTPSender::FecExtensionSizes(),
brandtr48d21a22017-05-30 02:32:12 -0700293 nullptr /* rtp_state */, &clock);
erikvarga27883732017-05-17 05:08:38 -0700294
295 EXPECT_EQ(kExtensionsTotalSize + kFlexfecMaxHeaderSize,
296 sender.MaxPacketOverhead());
297}
298
Steve Antonf0482ea2018-04-09 13:33:52 -0700299TEST(FlexfecSenderTest, MidIncludedInPacketsWhenSet) {
300 const std::vector<RtpExtension> kRtpHeaderExtensions{
301 {RtpExtension::kMidUri, 1}};
302 const char kMid[] = "mid";
303 SimulatedClock clock(kInitialSimulatedClockTime);
304 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kMid,
305 kRtpHeaderExtensions, RTPSender::FecExtensionSizes(),
306 nullptr /* rtp_state */, &clock);
307
308 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
309
310 std::string mid;
311 ASSERT_TRUE(fec_packet->GetExtension<RtpMid>(&mid));
312 EXPECT_EQ(kMid, mid);
313}
314
brandtr48d21a22017-05-30 02:32:12 -0700315TEST(FlexfecSenderTest, SetsAndGetsRtpState) {
316 RtpState initial_rtp_state;
317 initial_rtp_state.sequence_number = 100;
318 initial_rtp_state.start_timestamp = 200;
319 SimulatedClock clock(kInitialSimulatedClockTime);
Steve Antonf0482ea2018-04-09 13:33:52 -0700320 FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
brandtr48d21a22017-05-30 02:32:12 -0700321 kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
322 &initial_rtp_state, &clock);
323
324 auto fec_packet = GenerateSingleFlexfecPacket(&sender);
325 EXPECT_EQ(initial_rtp_state.sequence_number, fec_packet->SequenceNumber());
326 EXPECT_EQ(initial_rtp_state.start_timestamp, fec_packet->Timestamp());
327
328 clock.AdvanceTimeMilliseconds(1000);
329 fec_packet = GenerateSingleFlexfecPacket(&sender);
330 EXPECT_EQ(initial_rtp_state.sequence_number + 1,
331 fec_packet->SequenceNumber());
332 EXPECT_EQ(initial_rtp_state.start_timestamp + 1 * kVideoPayloadTypeFrequency,
333 fec_packet->Timestamp());
334
Erik Språng42108882020-05-05 14:51:09 +0200335 RtpState updated_rtp_state = sender.GetRtpState().value();
brandtr48d21a22017-05-30 02:32:12 -0700336 EXPECT_EQ(initial_rtp_state.sequence_number + 2,
337 updated_rtp_state.sequence_number);
338 EXPECT_EQ(initial_rtp_state.start_timestamp,
339 updated_rtp_state.start_timestamp);
340}
341
brandtrc295e002016-11-03 09:22:33 -0700342} // namespace webrtc