Chromium Code Reviews

Side by Side Diff: webrtc/video/video_send_stream_tests.cc

Issue 2558303002: Try to deflake VideoSendStream tests with ULPFEC. (Closed)
Patch Set: Rebase. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include <algorithm> // max 10 #include <algorithm> // max
(...skipping 335 matching lines...)
346 RtcpStatistics stats_; 346 RtcpStatistics stats_;
347 }; 347 };
348 348
349 std::unique_ptr<LossyStatistician> lossy_stats_; 349 std::unique_ptr<LossyStatistician> lossy_stats_;
350 StatisticianMap stats_map_; 350 StatisticianMap stats_map_;
351 }; 351 };
352 352
353 class UlpfecObserver : public test::EndToEndTest { 353 class UlpfecObserver : public test::EndToEndTest {
354 public: 354 public:
355 UlpfecObserver(bool header_extensions_enabled, 355 UlpfecObserver(bool header_extensions_enabled,
356 bool use_nack, 356 bool use_nack,
357 bool expect_red, 357 bool expect_red,
358 bool expect_ulpfec, 358 bool expect_ulpfec,
359 const std::string& codec) 359 const std::string& codec)
360 : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs), 360 : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs),
361 payload_name_(codec), 361 payload_name_(codec),
362 use_nack_(use_nack), 362 use_nack_(use_nack),
363 expect_red_(expect_red), 363 expect_red_(expect_red),
364 expect_ulpfec_(expect_ulpfec), 364 expect_ulpfec_(expect_ulpfec),
365 send_count_(0), 365 sent_media_(false),
366 received_media_(false), 366 sent_ulpfec_(false),
367 received_fec_(false),
368 header_extensions_enabled_(header_extensions_enabled) { 367 header_extensions_enabled_(header_extensions_enabled) {
369 if (codec == "H264") { 368 if (codec == "H264") {
370 encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock())); 369 encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock()));
371 } else if (codec == "VP8") { 370 } else if (codec == "VP8") {
372 encoder_.reset(VP8Encoder::Create()); 371 encoder_.reset(VP8Encoder::Create());
373 } else if (codec == "VP9") { 372 } else if (codec == "VP9") {
374 encoder_.reset(VP9Encoder::Create()); 373 encoder_.reset(VP9Encoder::Create());
375 } else { 374 } else {
376 RTC_NOTREACHED(); 375 RTC_NOTREACHED();
377 } 376 }
378 } 377 }
379 378
380 private: 379 private:
381 Action OnSendRtp(const uint8_t* packet, size_t length) override { 380 Action OnSendRtp(const uint8_t* packet, size_t length) override {
382 RTPHeader header; 381 RTPHeader header;
383 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 382 EXPECT_TRUE(parser_->Parse(packet, length, &header));
384 383
385 ++send_count_;
386 int encapsulated_payload_type = -1; 384 int encapsulated_payload_type = -1;
387 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) { 385 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) {
388 EXPECT_TRUE(expect_red_); 386 EXPECT_TRUE(expect_red_);
389 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]); 387 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]);
390 if (encapsulated_payload_type != 388 if (encapsulated_payload_type !=
391 VideoSendStreamTest::kFakeVideoSendPayloadType) { 389 VideoSendStreamTest::kFakeVideoSendPayloadType) {
392 EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType, 390 EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType,
393 encapsulated_payload_type); 391 encapsulated_payload_type);
394 } 392 }
395 } else { 393 } else {
396 EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType, 394 EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType,
397 header.payloadType); 395 header.payloadType);
398 if (static_cast<size_t>(header.headerLength + header.paddingLength) < 396 if (static_cast<size_t>(header.headerLength + header.paddingLength) <
399 length) { 397 length) {
400 // Not padding-only, media received outside of RED. 398 // Not padding-only, media received outside of RED.
401 EXPECT_FALSE(expect_red_); 399 EXPECT_FALSE(expect_red_);
402 received_media_ = true; 400 sent_media_ = true;
403 } 401 }
404 } 402 }
405 403
406 if (header_extensions_enabled_) { 404 if (header_extensions_enabled_) {
407 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); 405 EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
408 uint32_t kHalf24BitsSpace = 0xFFFFFF / 2; 406 uint32_t kHalf24BitsSpace = 0xFFFFFF / 2;
409 if (header.extension.absoluteSendTime <= kHalf24BitsSpace && 407 if (header.extension.absoluteSendTime <= kHalf24BitsSpace &&
410 prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) { 408 prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) {
411 // 24 bits wrap. 409 // 24 bits wrap.
412 EXPECT_GT(prev_header_.extension.absoluteSendTime, 410 EXPECT_GT(prev_header_.extension.absoluteSendTime,
413 header.extension.absoluteSendTime); 411 header.extension.absoluteSendTime);
414 } else { 412 } else {
415 EXPECT_GE(header.extension.absoluteSendTime, 413 EXPECT_GE(header.extension.absoluteSendTime,
416 prev_header_.extension.absoluteSendTime); 414 prev_header_.extension.absoluteSendTime);
417 } 415 }
418 EXPECT_TRUE(header.extension.hasTransportSequenceNumber); 416 EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
419 uint16_t seq_num_diff = header.extension.transportSequenceNumber - 417 uint16_t seq_num_diff = header.extension.transportSequenceNumber -
420 prev_header_.extension.transportSequenceNumber; 418 prev_header_.extension.transportSequenceNumber;
421 EXPECT_EQ(1, seq_num_diff); 419 EXPECT_EQ(1, seq_num_diff);
422 } 420 }
423 421
424 if (encapsulated_payload_type != -1) { 422 if (encapsulated_payload_type != -1) {
425 if (encapsulated_payload_type == 423 if (encapsulated_payload_type ==
426 VideoSendStreamTest::kUlpfecPayloadType) { 424 VideoSendStreamTest::kUlpfecPayloadType) {
427 EXPECT_TRUE(expect_ulpfec_); 425 EXPECT_TRUE(expect_ulpfec_);
428 received_fec_ = true; 426 sent_ulpfec_ = true;
429 } else { 427 } else {
430 received_media_ = true; 428 sent_media_ = true;
431 } 429 }
432 } 430 }
433 431
434 if (send_count_ > 100 && received_media_) { 432 if (sent_media_) {
435 if (received_fec_ || !expect_ulpfec_) 433 if (sent_ulpfec_ || !expect_ulpfec_)
436 observation_complete_.Set(); 434 observation_complete_.Set();
437 } 435 }
438 436
439 prev_header_ = header; 437 prev_header_ = header;
440 438
441 return SEND_PACKET; 439 return SEND_PACKET;
442 } 440 }
443 441
444 test::PacketTransport* CreateSendTransport(Call* sender_call) override { 442 test::PacketTransport* CreateSendTransport(Call* sender_call) override {
445 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC. 443 // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
446 // Configure some network delay. 444 // Configure some network delay.
447 const int kNetworkDelayMs = 100; 445 const int kNetworkDelayMs = 100;
448 FakeNetworkPipe::Config config; 446 FakeNetworkPipe::Config config;
449 config.loss_percent = 50; 447 config.loss_percent = 5;
450 config.queue_delay_ms = kNetworkDelayMs; 448 config.queue_delay_ms = kNetworkDelayMs;
451 return new test::PacketTransport(sender_call, this, 449 return new test::PacketTransport(sender_call, this,
452 test::PacketTransport::kSender, config); 450 test::PacketTransport::kSender, config);
453 } 451 }
454 452
455 void ModifyVideoConfigs( 453 void ModifyVideoConfigs(
456 VideoSendStream::Config* send_config, 454 VideoSendStream::Config* send_config,
457 std::vector<VideoReceiveStream::Config>* receive_configs, 455 std::vector<VideoReceiveStream::Config>* receive_configs,
458 VideoEncoderConfig* encoder_config) override { 456 VideoEncoderConfig* encoder_config) override {
459 transport_adapter_.reset( 457 transport_adapter_.reset(
(...skipping 17 matching lines...)
477 RtpExtension(RtpExtension::kTransportSequenceNumberUri, 475 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
478 test::kTransportSequenceNumberExtensionId)); 476 test::kTransportSequenceNumberExtensionId));
479 } 477 }
480 (*receive_configs)[0].rtp.ulpfec.red_payload_type = 478 (*receive_configs)[0].rtp.ulpfec.red_payload_type =
481 send_config->rtp.ulpfec.red_payload_type; 479 send_config->rtp.ulpfec.red_payload_type;
482 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = 480 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type =
483 send_config->rtp.ulpfec.ulpfec_payload_type; 481 send_config->rtp.ulpfec.ulpfec_payload_type;
484 } 482 }
485 483
486 void PerformTest() override { 484 void PerformTest() override {
487 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; 485 EXPECT_TRUE(Wait()) << "Timed out waiting for ULPFEC and/or media packets.";
488 } 486 }
489 487
490 std::unique_ptr<internal::TransportAdapter> transport_adapter_; 488 std::unique_ptr<internal::TransportAdapter> transport_adapter_;
491 std::unique_ptr<VideoEncoder> encoder_; 489 std::unique_ptr<VideoEncoder> encoder_;
492 const std::string payload_name_; 490 const std::string payload_name_;
493 const bool use_nack_; 491 const bool use_nack_;
494 const bool expect_red_; 492 const bool expect_red_;
495 const bool expect_ulpfec_; 493 const bool expect_ulpfec_;
496 int send_count_; 494 bool sent_media_;
497 bool received_media_; 495 bool sent_ulpfec_;
498 bool received_fec_;
499 bool header_extensions_enabled_; 496 bool header_extensions_enabled_;
500 RTPHeader prev_header_; 497 RTPHeader prev_header_;
501 }; 498 };
502 499
503 TEST_F(VideoSendStreamTest, SupportsUlpfecWithExtensions) { 500 TEST_F(VideoSendStreamTest, SupportsUlpfecWithExtensions) {
504 UlpfecObserver test(true, false, true, true, "VP8"); 501 UlpfecObserver test(true, false, true, true, "VP8");
505 RunBaseTest(&test); 502 RunBaseTest(&test);
506 } 503 }
507 504
508 TEST_F(VideoSendStreamTest, SupportsUlpfecWithoutExtensions) { 505 TEST_F(VideoSendStreamTest, SupportsUlpfecWithoutExtensions) {
(...skipping 2705 matching lines...)
3214 private: 3211 private:
3215 Call* call_; 3212 Call* call_;
3216 rtc::CriticalSection crit_; 3213 rtc::CriticalSection crit_;
3217 uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_); 3214 uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_);
3218 } test; 3215 } test;
3219 3216
3220 RunBaseTest(&test); 3217 RunBaseTest(&test);
3221 } 3218 }
3222 3219
3223 } // namespace webrtc 3220 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine