Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(617)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/fec_receiver_unittest.cc

Issue 2451643002: Rename FecReceiver to UlpfecReceiver. (Closed)
Patch Set: Fix GYP. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2012 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
11 #include <string.h>
12
13 #include <list>
14 #include <memory>
15
16 #include "webrtc/modules/rtp_rtcp/include/fec_receiver.h"
17 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
18 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
19 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
20 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
21 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
22 #include "webrtc/test/gmock.h"
23 #include "webrtc/test/gtest.h"
24
25 namespace webrtc {
26
27 namespace {
28 using ::testing::_;
29 using ::testing::Args;
30 using ::testing::ElementsAreArray;
31 using ::testing::Return;
32
33 using test::fec::AugmentedPacket;
34 using Packet = ForwardErrorCorrection::Packet;
35 using test::fec::UlpfecPacketGenerator;
36
37 constexpr int kFecPayloadType = 96;
38 constexpr uint32_t kMediaSsrc = 835424;
39 } // namespace
40
41 class ReceiverFecTest : public ::testing::Test {
42 protected:
43 ReceiverFecTest()
44 : fec_(ForwardErrorCorrection::CreateUlpfec()),
45 receiver_fec_(FecReceiver::Create(&rtp_data_callback_)),
46 packet_generator_(kMediaSsrc) {}
47
48 // Generates |num_fec_packets| FEC packets, given |media_packets|.
49 void EncodeFec(const ForwardErrorCorrection::PacketList& media_packets,
50 size_t num_fec_packets,
51 std::list<ForwardErrorCorrection::Packet*>* fec_packets);
52
53 // Generates |num_media_packets| corresponding to a single frame.
54 void PacketizeFrame(size_t num_media_packets,
55 size_t frame_offset,
56 std::list<AugmentedPacket*>* augmented_packets,
57 ForwardErrorCorrection::PacketList* packets);
58
59 // Build a media packet using |packet_generator_| and add it
60 // to the receiver.
61 void BuildAndAddRedMediaPacket(AugmentedPacket* packet);
62
63 // Build a FEC packet using |packet_generator_| and add it
64 // to the receiver.
65 void BuildAndAddRedFecPacket(Packet* packet);
66
67 // Ensure that |rtp_data_callback_| will be called correctly
68 // and that the recovered packet will be identical to the lost packet.
69 void VerifyReconstructedMediaPacket(const AugmentedPacket& packet,
70 size_t times);
71
72 void InjectGarbagePacketLength(size_t fec_garbage_offset);
73
74 static void SurvivesMaliciousPacket(const uint8_t* data,
75 size_t length,
76 uint8_t ulpfec_payload_type);
77
78 MockRtpData rtp_data_callback_;
79 std::unique_ptr<ForwardErrorCorrection> fec_;
80 std::unique_ptr<FecReceiver> receiver_fec_;
81 UlpfecPacketGenerator packet_generator_;
82 };
83
84 void ReceiverFecTest::EncodeFec(
85 const ForwardErrorCorrection::PacketList& media_packets,
86 size_t num_fec_packets,
87 std::list<ForwardErrorCorrection::Packet*>* fec_packets) {
88 const uint8_t protection_factor =
89 num_fec_packets * 255 / media_packets.size();
90 // Unequal protection is turned off, and the number of important
91 // packets is thus irrelevant.
92 constexpr int kNumImportantPackets = 0;
93 constexpr bool kUseUnequalProtection = false;
94 constexpr FecMaskType kFecMaskType = kFecMaskBursty;
95 EXPECT_EQ(
96 0, fec_->EncodeFec(media_packets, protection_factor, kNumImportantPackets,
97 kUseUnequalProtection, kFecMaskType, fec_packets));
98 ASSERT_EQ(num_fec_packets, fec_packets->size());
99 }
100
101 void ReceiverFecTest::PacketizeFrame(
102 size_t num_media_packets,
103 size_t frame_offset,
104 std::list<AugmentedPacket*>* augmented_packets,
105 ForwardErrorCorrection::PacketList* packets) {
106 packet_generator_.NewFrame(num_media_packets);
107 for (size_t i = 0; i < num_media_packets; ++i) {
108 std::unique_ptr<AugmentedPacket> next_packet(
109 packet_generator_.NextPacket(frame_offset + i, kRtpHeaderSize + 10));
110 augmented_packets->push_back(next_packet.get());
111 packets->push_back(std::move(next_packet));
112 }
113 }
114
115 void ReceiverFecTest::BuildAndAddRedMediaPacket(AugmentedPacket* packet) {
116 std::unique_ptr<AugmentedPacket> red_packet(
117 packet_generator_.BuildMediaRedPacket(*packet));
118 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
119 red_packet->header.header, red_packet->data,
120 red_packet->length, kFecPayloadType));
121 }
122
123 void ReceiverFecTest::BuildAndAddRedFecPacket(Packet* packet) {
124 std::unique_ptr<AugmentedPacket> red_packet(
125 packet_generator_.BuildUlpfecRedPacket(*packet));
126 EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
127 red_packet->header.header, red_packet->data,
128 red_packet->length, kFecPayloadType));
129 }
130
131 void ReceiverFecTest::VerifyReconstructedMediaPacket(
132 const AugmentedPacket& packet,
133 size_t times) {
134 // Verify that the content of the reconstructed packet is equal to the
135 // content of |packet|, and that the same content is received |times| number
136 // of times in a row.
137 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, packet.length))
138 .With(Args<0, 1>(ElementsAreArray(packet.data, packet.length)))
139 .Times(times)
140 .WillRepeatedly(Return(true));
141 }
142
143 void ReceiverFecTest::InjectGarbagePacketLength(size_t fec_garbage_offset) {
144 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
145 .WillRepeatedly(Return(true));
146
147 const size_t kNumFecPackets = 1;
148 std::list<AugmentedPacket*> augmented_media_packets;
149 ForwardErrorCorrection::PacketList media_packets;
150 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
151 std::list<ForwardErrorCorrection::Packet*> fec_packets;
152 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
153 ByteWriter<uint16_t>::WriteBigEndian(
154 &fec_packets.front()->data[fec_garbage_offset], 0x4711);
155
156 // Inject first media packet, then first FEC packet, skipping the second media
157 // packet to cause a recovery from the FEC packet.
158 BuildAndAddRedMediaPacket(augmented_media_packets.front());
159 BuildAndAddRedFecPacket(fec_packets.front());
160 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
161
162 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
163 EXPECT_EQ(2U, counter.num_packets);
164 EXPECT_EQ(1U, counter.num_fec_packets);
165 EXPECT_EQ(0U, counter.num_recovered_packets);
166 }
167
168 void ReceiverFecTest::SurvivesMaliciousPacket(const uint8_t* data,
169 size_t length,
170 uint8_t ulpfec_payload_type) {
171 webrtc::RTPHeader header;
172 std::unique_ptr<webrtc::RtpHeaderParser> parser(
173 webrtc::RtpHeaderParser::Create());
174 ASSERT_TRUE(parser->Parse(data, length, &header));
175
176 webrtc::NullRtpData null_callback;
177 std::unique_ptr<webrtc::FecReceiver> receiver_fec(
178 webrtc::FecReceiver::Create(&null_callback));
179
180 receiver_fec->AddReceivedRedPacket(header, data, length, ulpfec_payload_type);
181 }
182
183 TEST_F(ReceiverFecTest, TwoMediaOneFec) {
184 constexpr size_t kNumFecPackets = 1u;
185 std::list<AugmentedPacket*> augmented_media_packets;
186 ForwardErrorCorrection::PacketList media_packets;
187 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
188 std::list<ForwardErrorCorrection::Packet*> fec_packets;
189 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
190
191 // Recovery
192 auto it = augmented_media_packets.begin();
193 BuildAndAddRedMediaPacket(*it);
194 VerifyReconstructedMediaPacket(**it, 1);
195 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
196 // Drop one media packet.
197 auto fec_it = fec_packets.begin();
198 BuildAndAddRedFecPacket(*fec_it);
199 ++it;
200 VerifyReconstructedMediaPacket(**it, 1);
201 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
202
203 FecPacketCounter counter = receiver_fec_->GetPacketCounter();
204 EXPECT_EQ(2u, counter.num_packets);
205 EXPECT_EQ(1u, counter.num_fec_packets);
206 EXPECT_EQ(1u, counter.num_recovered_packets);
207 }
208
209 TEST_F(ReceiverFecTest, InjectGarbageFecHeaderLengthRecovery) {
210 // Byte offset 8 is the 'length recovery' field of the FEC header.
211 InjectGarbagePacketLength(8);
212 }
213
214 TEST_F(ReceiverFecTest, InjectGarbageFecLevelHeaderProtectionLength) {
215 // Byte offset 10 is the 'protection length' field in the first FEC level
216 // header.
217 InjectGarbagePacketLength(10);
218 }
219
220 TEST_F(ReceiverFecTest, TwoMediaTwoFec) {
221 const size_t kNumFecPackets = 2;
222 std::list<AugmentedPacket*> augmented_media_packets;
223 ForwardErrorCorrection::PacketList media_packets;
224 PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
225 std::list<ForwardErrorCorrection::Packet*> fec_packets;
226 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
227
228 // Recovery
229 // Drop both media packets.
230 auto it = augmented_media_packets.begin();
231 auto fec_it = fec_packets.begin();
232 BuildAndAddRedFecPacket(*fec_it);
233 VerifyReconstructedMediaPacket(**it, 1);
234 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
235 ++fec_it;
236 BuildAndAddRedFecPacket(*fec_it);
237 ++it;
238 VerifyReconstructedMediaPacket(**it, 1);
239 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
240 }
241
242 TEST_F(ReceiverFecTest, TwoFramesOneFec) {
243 const size_t kNumFecPackets = 1;
244 std::list<AugmentedPacket*> augmented_media_packets;
245 ForwardErrorCorrection::PacketList media_packets;
246 PacketizeFrame(1, 0, &augmented_media_packets, &media_packets);
247 PacketizeFrame(1, 1, &augmented_media_packets, &media_packets);
248 std::list<ForwardErrorCorrection::Packet*> fec_packets;
249 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
250
251 // Recovery
252 auto it = augmented_media_packets.begin();
253 BuildAndAddRedMediaPacket(augmented_media_packets.front());
254 VerifyReconstructedMediaPacket(**it, 1);
255 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
256 // Drop one media packet.
257 BuildAndAddRedFecPacket(fec_packets.front());
258 ++it;
259 VerifyReconstructedMediaPacket(**it, 1);
260 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
261 }
262
263 TEST_F(ReceiverFecTest, OneCompleteOneUnrecoverableFrame) {
264 const size_t kNumFecPackets = 1;
265 std::list<AugmentedPacket*> augmented_media_packets;
266 ForwardErrorCorrection::PacketList media_packets;
267 PacketizeFrame(1, 0, &augmented_media_packets, &media_packets);
268 PacketizeFrame(2, 1, &augmented_media_packets, &media_packets);
269
270 std::list<ForwardErrorCorrection::Packet*> fec_packets;
271 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
272
273 // Recovery
274 auto it = augmented_media_packets.begin();
275 BuildAndAddRedMediaPacket(*it); // First frame: one packet.
276 VerifyReconstructedMediaPacket(**it, 1);
277 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
278 ++it;
279 BuildAndAddRedMediaPacket(*it); // First packet of second frame.
280 VerifyReconstructedMediaPacket(**it, 1);
281 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
282 }
283
284 TEST_F(ReceiverFecTest, MaxFramesOneFec) {
285 const size_t kNumFecPackets = 1;
286 const size_t kNumMediaPackets = 48;
287 std::list<AugmentedPacket*> augmented_media_packets;
288 ForwardErrorCorrection::PacketList media_packets;
289 for (size_t i = 0; i < kNumMediaPackets; ++i) {
290 PacketizeFrame(1, i, &augmented_media_packets, &media_packets);
291 }
292 std::list<ForwardErrorCorrection::Packet*> fec_packets;
293 EncodeFec(media_packets, kNumFecPackets, &fec_packets);
294
295 // Recovery
296 auto it = augmented_media_packets.begin();
297 ++it; // Drop first packet.
298 for (; it != augmented_media_packets.end(); ++it) {
299 BuildAndAddRedMediaPacket(*it);
300 VerifyReconstructedMediaPacket(**it, 1);
301 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
302 }
303 BuildAndAddRedFecPacket(fec_packets.front());
304 it = augmented_media_packets.begin();
305 VerifyReconstructedMediaPacket(**it, 1);
306 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
307 }
308
309 TEST_F(ReceiverFecTest, TooManyFrames) {
310 const size_t kNumFecPackets = 1;
311 const size_t kNumMediaPackets = 49;
312 std::list<AugmentedPacket*> augmented_media_packets;
313 ForwardErrorCorrection::PacketList media_packets;
314 for (size_t i = 0; i < kNumMediaPackets; ++i) {
315 PacketizeFrame(1, i, &augmented_media_packets, &media_packets);
316 }
317 std::list<ForwardErrorCorrection::Packet*> fec_packets;
318 EXPECT_EQ(-1, fec_->EncodeFec(media_packets,
319 kNumFecPackets * 255 / kNumMediaPackets, 0,
320 false, kFecMaskBursty, &fec_packets));
321 }
322
323 TEST_F(ReceiverFecTest, PacketNotDroppedTooEarly) {
324 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
325 // Delay the FEC packet.
326 Packet* delayed_fec = nullptr;
327 const size_t kNumFecPacketsBatch1 = 1;
328 const size_t kNumMediaPacketsBatch1 = 2;
329 std::list<AugmentedPacket*> augmented_media_packets_batch1;
330 ForwardErrorCorrection::PacketList media_packets_batch1;
331 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1,
332 &media_packets_batch1);
333 std::list<ForwardErrorCorrection::Packet*> fec_packets;
334 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets);
335
336 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front());
337 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
338 .Times(1).WillRepeatedly(Return(true));
339 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
340 delayed_fec = fec_packets.front();
341
342 // Fill the FEC decoder. No packets should be dropped.
343 const size_t kNumMediaPacketsBatch2 = 46;
344 std::list<AugmentedPacket*> augmented_media_packets_batch2;
345 ForwardErrorCorrection::PacketList media_packets_batch2;
346 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) {
347 PacketizeFrame(1, i, &augmented_media_packets_batch2,
348 &media_packets_batch2);
349 }
350 for (auto it = augmented_media_packets_batch2.begin();
351 it != augmented_media_packets_batch2.end(); ++it) {
352 BuildAndAddRedMediaPacket(*it);
353 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
354 .Times(1).WillRepeatedly(Return(true));
355 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
356 }
357
358 // Add the delayed FEC packet. One packet should be reconstructed.
359 BuildAndAddRedFecPacket(delayed_fec);
360 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
361 .Times(1).WillRepeatedly(Return(true));
362 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
363 }
364
365 TEST_F(ReceiverFecTest, PacketDroppedWhenTooOld) {
366 // 1 frame with 2 media packets and one FEC packet. One media packet missing.
367 // Delay the FEC packet.
368 Packet* delayed_fec = nullptr;
369 const size_t kNumFecPacketsBatch1 = 1;
370 const size_t kNumMediaPacketsBatch1 = 2;
371 std::list<AugmentedPacket*> augmented_media_packets_batch1;
372 ForwardErrorCorrection::PacketList media_packets_batch1;
373 PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1,
374 &media_packets_batch1);
375 std::list<ForwardErrorCorrection::Packet*> fec_packets;
376 EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets);
377
378 BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front());
379 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
380 .Times(1).WillRepeatedly(Return(true));
381 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
382 delayed_fec = fec_packets.front();
383
384 // Fill the FEC decoder and force the last packet to be dropped.
385 const size_t kNumMediaPacketsBatch2 = 48;
386 std::list<AugmentedPacket*> augmented_media_packets_batch2;
387 ForwardErrorCorrection::PacketList media_packets_batch2;
388 for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) {
389 PacketizeFrame(1, i, &augmented_media_packets_batch2,
390 &media_packets_batch2);
391 }
392 for (auto it = augmented_media_packets_batch2.begin();
393 it != augmented_media_packets_batch2.end(); ++it) {
394 BuildAndAddRedMediaPacket(*it);
395 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
396 .Times(1).WillRepeatedly(Return(true));
397 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
398 }
399
400 // Add the delayed FEC packet. No packet should be reconstructed since the
401 // first media packet of that frame has been dropped due to being too old.
402 BuildAndAddRedFecPacket(delayed_fec);
403 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
404 .Times(0);
405 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
406 }
407
408 TEST_F(ReceiverFecTest, OldFecPacketDropped) {
409 // 49 frames with 2 media packets and one FEC packet. All media packets
410 // missing.
411 const size_t kNumMediaPackets = 49 * 2;
412 std::list<AugmentedPacket*> augmented_media_packets;
413 ForwardErrorCorrection::PacketList media_packets;
414 for (size_t i = 0; i < kNumMediaPackets / 2; ++i) {
415 std::list<AugmentedPacket*> frame_augmented_media_packets;
416 ForwardErrorCorrection::PacketList frame_media_packets;
417 std::list<ForwardErrorCorrection::Packet*> fec_packets;
418 PacketizeFrame(2, 0, &frame_augmented_media_packets, &frame_media_packets);
419 EncodeFec(frame_media_packets, 1, &fec_packets);
420 for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) {
421 // Only FEC packets inserted. No packets recoverable at this time.
422 BuildAndAddRedFecPacket(*it);
423 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
424 .Times(0);
425 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
426 }
427 // Move unique_ptr's to media_packets for lifetime management.
428 media_packets.insert(media_packets.end(),
429 std::make_move_iterator(frame_media_packets.begin()),
430 std::make_move_iterator(frame_media_packets.end()));
431 augmented_media_packets.insert(augmented_media_packets.end(),
432 frame_augmented_media_packets.begin(),
433 frame_augmented_media_packets.end());
434 }
435 // Insert the oldest media packet. The corresponding FEC packet is too old
436 // and should have been dropped. Only the media packet we inserted will be
437 // returned.
438 BuildAndAddRedMediaPacket(augmented_media_packets.front());
439 EXPECT_CALL(rtp_data_callback_, OnRecoveredPacket(_, _))
440 .Times(1).WillRepeatedly(Return(true));
441 EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
442 }
443
444 TEST_F(ReceiverFecTest, TruncatedPacketWithFBitSet) {
445 const uint8_t kTruncatedPacket[] = {0x80,
446 0x2a,
447 0x68,
448 0x71,
449 0x29,
450 0xa1,
451 0x27,
452 0x3a,
453 0x29,
454 0x12,
455 0x2a,
456 0x98,
457 0xe0,
458 0x29};
459
460 SurvivesMaliciousPacket(kTruncatedPacket, sizeof(kTruncatedPacket), 100);
461 }
462
463 TEST_F(ReceiverFecTest, TruncatedPacketWithFBitSetEndingAfterFirstRedHeader) {
464 const uint8_t kPacket[] = {0x89,
465 0x27,
466 0x3a,
467 0x83,
468 0x27,
469 0x3a,
470 0x3a,
471 0xf3,
472 0x67,
473 0xbe,
474 0x2a,
475 0xa9,
476 0x27,
477 0x54,
478 0x3a,
479 0x3a,
480 0x2a,
481 0x67,
482 0x3a,
483 0xf3,
484 0x67,
485 0xbe,
486 0x2a,
487 0x27,
488 0xe6,
489 0xf6,
490 0x03,
491 0x3e,
492 0x29,
493 0x27,
494 0x21,
495 0x27,
496 0x2a,
497 0x29,
498 0x21,
499 0x4b,
500 0x29,
501 0x3a,
502 0x28,
503 0x29,
504 0xbf,
505 0x29,
506 0x2a,
507 0x26,
508 0x29,
509 0xae,
510 0x27,
511 0xa6,
512 0xf6,
513 0x00,
514 0x03,
515 0x3e};
516 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
517 }
518
519 TEST_F(ReceiverFecTest, TruncatedPacketWithoutDataPastFirstBlock) {
520 const uint8_t kPacket[] = {0x82,
521 0x38,
522 0x92,
523 0x38,
524 0x92,
525 0x38,
526 0xde,
527 0x2a,
528 0x11,
529 0xc8,
530 0xa3,
531 0xc4,
532 0x82,
533 0x38,
534 0x2a,
535 0x21,
536 0x2a,
537 0x28,
538 0x92,
539 0x38,
540 0x92,
541 0x00,
542 0x00,
543 0x0a,
544 0x3a,
545 0xc8,
546 0xa3,
547 0x3a,
548 0x27,
549 0xc4,
550 0x2a,
551 0x21,
552 0x2a,
553 0x28};
554 SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
555 }
556
557 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc ('k') | webrtc/modules/rtp_rtcp/source/flexfec_receiver_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698