OLD | NEW |
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 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 VideoEncoder* encoder) |
360 : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs), | 361 : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs), |
| 362 encoder_(encoder), |
361 payload_name_(codec), | 363 payload_name_(codec), |
362 use_nack_(use_nack), | 364 use_nack_(use_nack), |
363 expect_red_(expect_red), | 365 expect_red_(expect_red), |
364 expect_ulpfec_(expect_ulpfec), | 366 expect_ulpfec_(expect_ulpfec), |
365 sent_media_(false), | 367 sent_media_(false), |
366 sent_ulpfec_(false), | 368 sent_ulpfec_(false), |
367 header_extensions_enabled_(header_extensions_enabled) { | 369 header_extensions_enabled_(header_extensions_enabled) {} |
368 if (codec == "H264") { | |
369 encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock())); | |
370 } else if (codec == "VP8") { | |
371 encoder_.reset(VP8Encoder::Create()); | |
372 } else if (codec == "VP9") { | |
373 encoder_.reset(VP9Encoder::Create()); | |
374 } else { | |
375 RTC_NOTREACHED(); | |
376 } | |
377 } | |
378 | 370 |
379 private: | 371 private: |
380 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 372 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
381 RTPHeader header; | 373 RTPHeader header; |
382 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 374 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
383 | 375 |
384 int encapsulated_payload_type = -1; | 376 int encapsulated_payload_type = -1; |
385 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) { | 377 if (header.payloadType == VideoSendStreamTest::kRedPayloadType) { |
386 EXPECT_TRUE(expect_red_); | 378 EXPECT_TRUE(expect_red_); |
387 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]); | 379 encapsulated_payload_type = static_cast<int>(packet[header.headerLength]); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 std::vector<VideoReceiveStream::Config>* receive_configs, | 447 std::vector<VideoReceiveStream::Config>* receive_configs, |
456 VideoEncoderConfig* encoder_config) override { | 448 VideoEncoderConfig* encoder_config) override { |
457 transport_adapter_.reset( | 449 transport_adapter_.reset( |
458 new internal::TransportAdapter(send_config->send_transport)); | 450 new internal::TransportAdapter(send_config->send_transport)); |
459 transport_adapter_->Enable(); | 451 transport_adapter_->Enable(); |
460 if (use_nack_) { | 452 if (use_nack_) { |
461 send_config->rtp.nack.rtp_history_ms = | 453 send_config->rtp.nack.rtp_history_ms = |
462 (*receive_configs)[0].rtp.nack.rtp_history_ms = | 454 (*receive_configs)[0].rtp.nack.rtp_history_ms = |
463 VideoSendStreamTest::kNackRtpHistoryMs; | 455 VideoSendStreamTest::kNackRtpHistoryMs; |
464 } | 456 } |
465 send_config->encoder_settings.encoder = encoder_.get(); | 457 send_config->encoder_settings.encoder = encoder_; |
466 send_config->encoder_settings.payload_name = payload_name_; | 458 send_config->encoder_settings.payload_name = payload_name_; |
467 send_config->rtp.ulpfec.red_payload_type = | 459 send_config->rtp.ulpfec.red_payload_type = |
468 VideoSendStreamTest::kRedPayloadType; | 460 VideoSendStreamTest::kRedPayloadType; |
469 send_config->rtp.ulpfec.ulpfec_payload_type = | 461 send_config->rtp.ulpfec.ulpfec_payload_type = |
470 VideoSendStreamTest::kUlpfecPayloadType; | 462 VideoSendStreamTest::kUlpfecPayloadType; |
471 if (header_extensions_enabled_) { | 463 if (header_extensions_enabled_) { |
472 send_config->rtp.extensions.push_back(RtpExtension( | 464 send_config->rtp.extensions.push_back(RtpExtension( |
473 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); | 465 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); |
474 send_config->rtp.extensions.push_back( | 466 send_config->rtp.extensions.push_back( |
475 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | 467 RtpExtension(RtpExtension::kTransportSequenceNumberUri, |
476 test::kTransportSequenceNumberExtensionId)); | 468 test::kTransportSequenceNumberExtensionId)); |
477 } | 469 } |
478 (*receive_configs)[0].rtp.ulpfec.red_payload_type = | 470 (*receive_configs)[0].rtp.ulpfec.red_payload_type = |
479 send_config->rtp.ulpfec.red_payload_type; | 471 send_config->rtp.ulpfec.red_payload_type; |
480 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = | 472 (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = |
481 send_config->rtp.ulpfec.ulpfec_payload_type; | 473 send_config->rtp.ulpfec.ulpfec_payload_type; |
482 } | 474 } |
483 | 475 |
484 void PerformTest() override { | 476 void PerformTest() override { |
485 EXPECT_TRUE(Wait()) << "Timed out waiting for ULPFEC and/or media packets."; | 477 EXPECT_TRUE(Wait()) << "Timed out waiting for ULPFEC and/or media packets."; |
486 } | 478 } |
487 | 479 |
488 std::unique_ptr<internal::TransportAdapter> transport_adapter_; | 480 std::unique_ptr<internal::TransportAdapter> transport_adapter_; |
489 std::unique_ptr<VideoEncoder> encoder_; | 481 VideoEncoder* const encoder_; |
490 const std::string payload_name_; | 482 std::string payload_name_; |
491 const bool use_nack_; | 483 const bool use_nack_; |
492 const bool expect_red_; | 484 const bool expect_red_; |
493 const bool expect_ulpfec_; | 485 const bool expect_ulpfec_; |
494 bool sent_media_; | 486 bool sent_media_; |
495 bool sent_ulpfec_; | 487 bool sent_ulpfec_; |
496 bool header_extensions_enabled_; | 488 bool header_extensions_enabled_; |
497 RTPHeader prev_header_; | 489 RTPHeader prev_header_; |
498 }; | 490 }; |
499 | 491 |
500 TEST_F(VideoSendStreamTest, SupportsUlpfecWithExtensions) { | 492 TEST_F(VideoSendStreamTest, SupportsUlpfecWithExtensions) { |
501 UlpfecObserver test(true, false, true, true, "VP8"); | 493 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); |
| 494 UlpfecObserver test(true, false, true, true, "VP8", encoder.get()); |
502 RunBaseTest(&test); | 495 RunBaseTest(&test); |
503 } | 496 } |
504 | 497 |
505 TEST_F(VideoSendStreamTest, SupportsUlpfecWithoutExtensions) { | 498 TEST_F(VideoSendStreamTest, SupportsUlpfecWithoutExtensions) { |
506 UlpfecObserver test(false, false, true, true, "VP8"); | 499 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); |
| 500 UlpfecObserver test(false, false, true, true, "VP8", encoder.get()); |
507 RunBaseTest(&test); | 501 RunBaseTest(&test); |
508 } | 502 } |
509 | 503 |
510 // The FEC scheme used is not efficient for H264, so we should not use RED/FEC | 504 // The FEC scheme used is not efficient for H264, so we should not use RED/FEC |
511 // since we'll still have to re-request FEC packets, effectively wasting | 505 // since we'll still have to re-request FEC packets, effectively wasting |
512 // bandwidth since the receiver has to wait for FEC retransmissions to determine | 506 // bandwidth since the receiver has to wait for FEC retransmissions to determine |
513 // that the received state is actually decodable. | 507 // that the received state is actually decodable. |
514 TEST_F(VideoSendStreamTest, DoesNotUtilizeUlpfecForH264WithNackEnabled) { | 508 TEST_F(VideoSendStreamTest, DoesNotUtilizeUlpfecForH264WithNackEnabled) { |
515 UlpfecObserver test(false, true, true, false, "H264"); | 509 std::unique_ptr<VideoEncoder> encoder( |
| 510 new test::FakeH264Encoder(Clock::GetRealTimeClock())); |
| 511 UlpfecObserver test(false, true, true, false, "H264", encoder.get()); |
516 RunBaseTest(&test); | 512 RunBaseTest(&test); |
517 } | 513 } |
518 | 514 |
519 // Without retransmissions FEC for H264 is fine. | 515 // Without retransmissions FEC for H264 is fine. |
520 TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForH264WithoutNackEnabled) { | 516 TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForH264WithoutNackEnabled) { |
521 UlpfecObserver test(false, false, true, true, "H264"); | 517 std::unique_ptr<VideoEncoder> encoder( |
| 518 new test::FakeH264Encoder(Clock::GetRealTimeClock())); |
| 519 UlpfecObserver test(false, false, true, true, "H264", encoder.get()); |
522 RunBaseTest(&test); | 520 RunBaseTest(&test); |
523 } | 521 } |
524 | 522 |
525 TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForVp8WithNackEnabled) { | 523 TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForVp8WithNackEnabled) { |
526 UlpfecObserver test(false, true, true, true, "VP8"); | 524 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); |
| 525 UlpfecObserver test(false, true, true, true, "VP8", encoder.get()); |
527 RunBaseTest(&test); | 526 RunBaseTest(&test); |
528 } | 527 } |
529 | 528 |
530 #if !defined(RTC_DISABLE_VP9) | 529 #if !defined(RTC_DISABLE_VP9) |
531 TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForVp9WithNackEnabled) { | 530 TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForVp9WithNackEnabled) { |
532 UlpfecObserver test(false, true, true, true, "VP9"); | 531 std::unique_ptr<VideoEncoder> encoder(VP9Encoder::Create()); |
| 532 UlpfecObserver test(false, true, true, true, "VP9", encoder.get()); |
533 RunBaseTest(&test); | 533 RunBaseTest(&test); |
534 } | 534 } |
535 #endif // !defined(RTC_DISABLE_VP9) | 535 #endif // !defined(RTC_DISABLE_VP9) |
536 | 536 |
| 537 TEST_F(VideoSendStreamTest, SupportsUlpfecWithMultiThreadedH264) { |
| 538 std::unique_ptr<VideoEncoder> encoder( |
| 539 new test::MultiThreadedFakeH264Encoder(Clock::GetRealTimeClock())); |
| 540 UlpfecObserver test(false, false, true, true, "H264", encoder.get()); |
| 541 RunBaseTest(&test); |
| 542 } |
| 543 |
537 // TODO(brandtr): Move these FlexFEC tests when we have created | 544 // TODO(brandtr): Move these FlexFEC tests when we have created |
538 // FlexfecSendStream. | 545 // FlexfecSendStream. |
539 class FlexfecObserver : public test::EndToEndTest { | 546 class FlexfecObserver : public test::EndToEndTest { |
540 public: | 547 public: |
541 FlexfecObserver(bool header_extensions_enabled, | 548 FlexfecObserver(bool header_extensions_enabled, |
542 bool use_nack, | 549 bool use_nack, |
543 const std::string& codec) | 550 const std::string& codec, |
| 551 VideoEncoder* encoder) |
544 : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs), | 552 : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs), |
| 553 encoder_(encoder), |
545 payload_name_(codec), | 554 payload_name_(codec), |
546 use_nack_(use_nack), | 555 use_nack_(use_nack), |
547 sent_media_(false), | 556 sent_media_(false), |
548 sent_flexfec_(false), | 557 sent_flexfec_(false), |
549 header_extensions_enabled_(header_extensions_enabled) { | 558 header_extensions_enabled_(header_extensions_enabled) {} |
550 if (codec == "H264") { | |
551 encoder_.reset(new test::FakeH264Encoder(Clock::GetRealTimeClock())); | |
552 } else if (codec == "VP8") { | |
553 encoder_.reset(VP8Encoder::Create()); | |
554 } else if (codec == "VP9") { | |
555 encoder_.reset(VP9Encoder::Create()); | |
556 } else { | |
557 RTC_NOTREACHED(); | |
558 } | |
559 } | |
560 | 559 |
561 size_t GetNumFlexfecStreams() const override { return 1; } | 560 size_t GetNumFlexfecStreams() const override { return 1; } |
562 | 561 |
563 private: | 562 private: |
564 Action OnSendRtp(const uint8_t* packet, size_t length) override { | 563 Action OnSendRtp(const uint8_t* packet, size_t length) override { |
565 RTPHeader header; | 564 RTPHeader header; |
566 EXPECT_TRUE(parser_->Parse(packet, length, &header)); | 565 EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
567 | 566 |
568 if (header.payloadType == VideoSendStreamTest::kFlexfecPayloadType) { | 567 if (header.payloadType == VideoSendStreamTest::kFlexfecPayloadType) { |
569 EXPECT_EQ(VideoSendStreamTest::kFlexfecSendSsrc, header.ssrc); | 568 EXPECT_EQ(VideoSendStreamTest::kFlexfecSendSsrc, header.ssrc); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 std::vector<VideoReceiveStream::Config>* receive_configs, | 603 std::vector<VideoReceiveStream::Config>* receive_configs, |
605 VideoEncoderConfig* encoder_config) override { | 604 VideoEncoderConfig* encoder_config) override { |
606 transport_adapter_.reset( | 605 transport_adapter_.reset( |
607 new internal::TransportAdapter(send_config->send_transport)); | 606 new internal::TransportAdapter(send_config->send_transport)); |
608 transport_adapter_->Enable(); | 607 transport_adapter_->Enable(); |
609 if (use_nack_) { | 608 if (use_nack_) { |
610 send_config->rtp.nack.rtp_history_ms = | 609 send_config->rtp.nack.rtp_history_ms = |
611 (*receive_configs)[0].rtp.nack.rtp_history_ms = | 610 (*receive_configs)[0].rtp.nack.rtp_history_ms = |
612 VideoSendStreamTest::kNackRtpHistoryMs; | 611 VideoSendStreamTest::kNackRtpHistoryMs; |
613 } | 612 } |
614 send_config->encoder_settings.encoder = encoder_.get(); | 613 send_config->encoder_settings.encoder = encoder_; |
615 send_config->encoder_settings.payload_name = payload_name_; | 614 send_config->encoder_settings.payload_name = payload_name_; |
616 if (header_extensions_enabled_) { | 615 if (header_extensions_enabled_) { |
617 send_config->rtp.extensions.push_back(RtpExtension( | 616 send_config->rtp.extensions.push_back(RtpExtension( |
618 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); | 617 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); |
619 send_config->rtp.extensions.push_back(RtpExtension( | 618 send_config->rtp.extensions.push_back(RtpExtension( |
620 RtpExtension::kTimestampOffsetUri, test::kTOffsetExtensionId)); | 619 RtpExtension::kTimestampOffsetUri, test::kTOffsetExtensionId)); |
621 send_config->rtp.extensions.push_back( | 620 send_config->rtp.extensions.push_back( |
622 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | 621 RtpExtension(RtpExtension::kTransportSequenceNumberUri, |
623 test::kTransportSequenceNumberExtensionId)); | 622 test::kTransportSequenceNumberExtensionId)); |
624 } | 623 } |
625 } | 624 } |
626 | 625 |
627 void PerformTest() override { | 626 void PerformTest() override { |
628 EXPECT_TRUE(Wait()) | 627 EXPECT_TRUE(Wait()) |
629 << "Timed out waiting for FlexFEC and/or media packets."; | 628 << "Timed out waiting for FlexFEC and/or media packets."; |
630 } | 629 } |
631 | 630 |
632 std::unique_ptr<internal::TransportAdapter> transport_adapter_; | 631 std::unique_ptr<internal::TransportAdapter> transport_adapter_; |
633 std::unique_ptr<VideoEncoder> encoder_; | 632 VideoEncoder* const encoder_; |
634 const std::string payload_name_; | 633 std::string payload_name_; |
635 const bool use_nack_; | 634 const bool use_nack_; |
636 bool sent_media_; | 635 bool sent_media_; |
637 bool sent_flexfec_; | 636 bool sent_flexfec_; |
638 bool header_extensions_enabled_; | 637 bool header_extensions_enabled_; |
639 }; | 638 }; |
640 | 639 |
641 TEST_F(VideoSendStreamTest, SupportsFlexfecVp8) { | 640 TEST_F(VideoSendStreamTest, SupportsFlexfecVp8) { |
642 FlexfecObserver test(false, false, "VP8"); | 641 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); |
| 642 FlexfecObserver test(false, false, "VP8", encoder.get()); |
643 RunBaseTest(&test); | 643 RunBaseTest(&test); |
644 } | 644 } |
645 | 645 |
646 TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackVp8) { | 646 TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackVp8) { |
647 FlexfecObserver test(false, true, "VP8"); | 647 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); |
| 648 FlexfecObserver test(false, true, "VP8", encoder.get()); |
648 RunBaseTest(&test); | 649 RunBaseTest(&test); |
649 } | 650 } |
650 | 651 |
651 TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsVp8) { | 652 TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsVp8) { |
652 FlexfecObserver test(true, false, "VP8"); | 653 std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create()); |
| 654 FlexfecObserver test(true, false, "VP8", encoder.get()); |
653 RunBaseTest(&test); | 655 RunBaseTest(&test); |
654 } | 656 } |
655 | 657 |
656 #if !defined(RTC_DISABLE_VP9) | 658 #if !defined(RTC_DISABLE_VP9) |
657 TEST_F(VideoSendStreamTest, SupportsFlexfecVp9) { | 659 TEST_F(VideoSendStreamTest, SupportsFlexfecVp9) { |
658 FlexfecObserver test(false, false, "VP9"); | 660 std::unique_ptr<VideoEncoder> encoder(VP9Encoder::Create()); |
| 661 FlexfecObserver test(false, false, "VP9", encoder.get()); |
659 RunBaseTest(&test); | 662 RunBaseTest(&test); |
660 } | 663 } |
661 | 664 |
662 TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackVp9) { | 665 TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackVp9) { |
663 FlexfecObserver test(false, true, "VP9"); | 666 std::unique_ptr<VideoEncoder> encoder(VP9Encoder::Create()); |
| 667 FlexfecObserver test(false, true, "VP9", encoder.get()); |
664 RunBaseTest(&test); | 668 RunBaseTest(&test); |
665 } | 669 } |
666 #endif // defined(RTC_DISABLE_VP9) | 670 #endif // defined(RTC_DISABLE_VP9) |
667 | 671 |
668 TEST_F(VideoSendStreamTest, SupportsFlexfecH264) { | 672 TEST_F(VideoSendStreamTest, SupportsFlexfecH264) { |
669 FlexfecObserver test(false, false, "H264"); | 673 std::unique_ptr<VideoEncoder> encoder( |
| 674 new test::FakeH264Encoder(Clock::GetRealTimeClock())); |
| 675 FlexfecObserver test(false, false, "H264", encoder.get()); |
670 RunBaseTest(&test); | 676 RunBaseTest(&test); |
671 } | 677 } |
672 | 678 |
673 TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackH264) { | 679 TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackH264) { |
674 FlexfecObserver test(false, true, "H264"); | 680 std::unique_ptr<VideoEncoder> encoder( |
| 681 new test::FakeH264Encoder(Clock::GetRealTimeClock())); |
| 682 FlexfecObserver test(false, true, "H264", encoder.get()); |
675 RunBaseTest(&test); | 683 RunBaseTest(&test); |
676 } | 684 } |
677 | 685 |
| 686 TEST_F(VideoSendStreamTest, SupportsFlexfecWithMultiThreadedH264) { |
| 687 std::unique_ptr<VideoEncoder> encoder( |
| 688 new test::MultiThreadedFakeH264Encoder(Clock::GetRealTimeClock())); |
| 689 FlexfecObserver test(false, false, "H264", encoder.get()); |
| 690 RunBaseTest(&test); |
| 691 } |
| 692 |
678 void VideoSendStreamTest::TestNackRetransmission( | 693 void VideoSendStreamTest::TestNackRetransmission( |
679 uint32_t retransmit_ssrc, | 694 uint32_t retransmit_ssrc, |
680 uint8_t retransmit_payload_type) { | 695 uint8_t retransmit_payload_type) { |
681 class NackObserver : public test::SendTest { | 696 class NackObserver : public test::SendTest { |
682 public: | 697 public: |
683 explicit NackObserver(uint32_t retransmit_ssrc, | 698 explicit NackObserver(uint32_t retransmit_ssrc, |
684 uint8_t retransmit_payload_type) | 699 uint8_t retransmit_payload_type) |
685 : SendTest(kDefaultTimeoutMs), | 700 : SendTest(kDefaultTimeoutMs), |
686 send_count_(0), | 701 send_count_(0), |
687 retransmit_ssrc_(retransmit_ssrc), | 702 retransmit_ssrc_(retransmit_ssrc), |
(...skipping 2523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3211 private: | 3226 private: |
3212 Call* call_; | 3227 Call* call_; |
3213 rtc::CriticalSection crit_; | 3228 rtc::CriticalSection crit_; |
3214 uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_); | 3229 uint32_t max_bitrate_kbps_ GUARDED_BY(&crit_); |
3215 } test; | 3230 } test; |
3216 | 3231 |
3217 RunBaseTest(&test); | 3232 RunBaseTest(&test); |
3218 } | 3233 } |
3219 | 3234 |
3220 } // namespace webrtc | 3235 } // namespace webrtc |
OLD | NEW |