| 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 | 10 | 
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 91     VideoReceiveStream::Stats stats; | 91     VideoReceiveStream::Stats stats; | 
| 92     { | 92     { | 
| 93       rtc::CritScope lock(&crit_); | 93       rtc::CritScope lock(&crit_); | 
| 94       if (receive_stream_) | 94       if (receive_stream_) | 
| 95         stats = receive_stream_->GetStats(); | 95         stats = receive_stream_->GetStats(); | 
| 96     } | 96     } | 
| 97     if (stats.sync_offset_ms == std::numeric_limits<int>::max()) | 97     if (stats.sync_offset_ms == std::numeric_limits<int>::max()) | 
| 98       return; | 98       return; | 
| 99 | 99 | 
| 100     int64_t now_ms = clock_->TimeInMilliseconds(); | 100     int64_t now_ms = clock_->TimeInMilliseconds(); | 
| 101 |  | 
| 102     sync_offset_ms_list_.push_back(stats.sync_offset_ms); |  | 
| 103     int64_t time_since_creation = now_ms - creation_time_ms_; | 101     int64_t time_since_creation = now_ms - creation_time_ms_; | 
| 104     // During the first couple of seconds audio and video can falsely be | 102     // During the first couple of seconds audio and video can falsely be | 
| 105     // estimated as being synchronized. We don't want to trigger on those. | 103     // estimated as being synchronized. We don't want to trigger on those. | 
| 106     if (time_since_creation < kStartupTimeMs) | 104     if (time_since_creation < kStartupTimeMs) | 
| 107       return; | 105       return; | 
| 108     if (std::abs(stats.sync_offset_ms) < kInSyncThresholdMs) { | 106     if (std::abs(stats.sync_offset_ms) < kInSyncThresholdMs) { | 
| 109       if (first_time_in_sync_ == -1) { | 107       if (first_time_in_sync_ == -1) { | 
| 110         first_time_in_sync_ = now_ms; | 108         first_time_in_sync_ = now_ms; | 
| 111         webrtc::test::PrintResult("sync_convergence_time", | 109         webrtc::test::PrintResult("sync_convergence_time", | 
| 112                                   "", | 110                                   "", | 
| 113                                   "synchronization", | 111                                   "synchronization", | 
| 114                                   time_since_creation, | 112                                   time_since_creation, | 
| 115                                   "ms", | 113                                   "ms", | 
| 116                                   false); | 114                                   false); | 
| 117       } | 115       } | 
| 118       if (time_since_creation > kMinRunTimeMs) | 116       if (time_since_creation > kMinRunTimeMs) | 
| 119         observation_complete_.Set(); | 117         observation_complete_.Set(); | 
| 120     } | 118     } | 
|  | 119     if (first_time_in_sync_ != -1) | 
|  | 120       sync_offset_ms_list_.push_back(stats.sync_offset_ms); | 
| 121   } | 121   } | 
| 122 | 122 | 
| 123   void set_receive_stream(VideoReceiveStream* receive_stream) { | 123   void set_receive_stream(VideoReceiveStream* receive_stream) { | 
| 124     rtc::CritScope lock(&crit_); | 124     rtc::CritScope lock(&crit_); | 
| 125     receive_stream_ = receive_stream; | 125     receive_stream_ = receive_stream; | 
| 126   } | 126   } | 
| 127 | 127 | 
| 128   void PrintResults() { | 128   void PrintResults() { | 
| 129     test::PrintResultList("stream_offset", "", "synchronization", | 129     test::PrintResultList("stream_offset", "", "synchronization", | 
| 130                           test::ValuesToString(sync_offset_ms_list_), "ms", | 130                           test::ValuesToString(sync_offset_ms_list_), "ms", | 
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 525   static const int kMinTransmitBitrateBps = 150000; | 525   static const int kMinTransmitBitrateBps = 150000; | 
| 526   static const int kMinAcceptableTransmitBitrate = 130; | 526   static const int kMinAcceptableTransmitBitrate = 130; | 
| 527   static const int kMaxAcceptableTransmitBitrate = 170; | 527   static const int kMaxAcceptableTransmitBitrate = 170; | 
| 528   static const int kNumBitrateObservationsInRange = 100; | 528   static const int kNumBitrateObservationsInRange = 100; | 
| 529   static const int kAcceptableBitrateErrorMargin = 15;  // +- 7 | 529   static const int kAcceptableBitrateErrorMargin = 15;  // +- 7 | 
| 530   class BitrateObserver : public test::EndToEndTest { | 530   class BitrateObserver : public test::EndToEndTest { | 
| 531    public: | 531    public: | 
| 532     explicit BitrateObserver(bool using_min_transmit_bitrate) | 532     explicit BitrateObserver(bool using_min_transmit_bitrate) | 
| 533         : EndToEndTest(kLongTimeoutMs), | 533         : EndToEndTest(kLongTimeoutMs), | 
| 534           send_stream_(nullptr), | 534           send_stream_(nullptr), | 
|  | 535           converged_(false), | 
| 535           pad_to_min_bitrate_(using_min_transmit_bitrate), | 536           pad_to_min_bitrate_(using_min_transmit_bitrate), | 
|  | 537           min_acceptable_bitrate_(using_min_transmit_bitrate | 
|  | 538                                       ? kMinAcceptableTransmitBitrate | 
|  | 539                                       : (kMaxEncodeBitrateKbps - | 
|  | 540                                          kAcceptableBitrateErrorMargin / 2)), | 
|  | 541           max_acceptable_bitrate_(using_min_transmit_bitrate | 
|  | 542                                       ? kMaxAcceptableTransmitBitrate | 
|  | 543                                       : (kMaxEncodeBitrateKbps + | 
|  | 544                                          kAcceptableBitrateErrorMargin / 2)), | 
| 536           num_bitrate_observations_in_range_(0) {} | 545           num_bitrate_observations_in_range_(0) {} | 
| 537 | 546 | 
| 538    private: | 547    private: | 
| 539     // TODO(holmer): Run this with a timer instead of once per packet. | 548     // TODO(holmer): Run this with a timer instead of once per packet. | 
| 540     Action OnSendRtp(const uint8_t* packet, size_t length) override { | 549     Action OnSendRtp(const uint8_t* packet, size_t length) override { | 
| 541       VideoSendStream::Stats stats = send_stream_->GetStats(); | 550       VideoSendStream::Stats stats = send_stream_->GetStats(); | 
| 542       if (stats.substreams.size() > 0) { | 551       if (stats.substreams.size() > 0) { | 
| 543         RTC_DCHECK_EQ(1u, stats.substreams.size()); | 552         RTC_DCHECK_EQ(1u, stats.substreams.size()); | 
| 544         int bitrate_kbps = | 553         int bitrate_kbps = | 
| 545             stats.substreams.begin()->second.total_bitrate_bps / 1000; | 554             stats.substreams.begin()->second.total_bitrate_bps / 1000; | 
| 546         if (bitrate_kbps > 0) { | 555         if (bitrate_kbps > min_acceptable_bitrate_ && | 
| 547           bitrate_kbps_list.push_back(bitrate_kbps); | 556             bitrate_kbps < max_acceptable_bitrate_) { | 
| 548           if (pad_to_min_bitrate_) { | 557           converged_ = true; | 
| 549             if (bitrate_kbps > kMinAcceptableTransmitBitrate && | 558           ++num_bitrate_observations_in_range_; | 
| 550                 bitrate_kbps < kMaxAcceptableTransmitBitrate) { |  | 
| 551               ++num_bitrate_observations_in_range_; |  | 
| 552             } |  | 
| 553           } else { |  | 
| 554             // Expect bitrate stats to roughly match the max encode bitrate. |  | 
| 555             if (bitrate_kbps > (kMaxEncodeBitrateKbps - |  | 
| 556                                 kAcceptableBitrateErrorMargin / 2) && |  | 
| 557                 bitrate_kbps < (kMaxEncodeBitrateKbps + |  | 
| 558                                 kAcceptableBitrateErrorMargin / 2)) { |  | 
| 559               ++num_bitrate_observations_in_range_; |  | 
| 560             } |  | 
| 561           } |  | 
| 562           if (num_bitrate_observations_in_range_ == | 559           if (num_bitrate_observations_in_range_ == | 
| 563               kNumBitrateObservationsInRange) | 560               kNumBitrateObservationsInRange) | 
| 564             observation_complete_.Set(); | 561             observation_complete_.Set(); | 
| 565         } | 562         } | 
|  | 563         if (converged_) | 
|  | 564           bitrate_kbps_list_.push_back(bitrate_kbps); | 
| 566       } | 565       } | 
| 567       return SEND_PACKET; | 566       return SEND_PACKET; | 
| 568     } | 567     } | 
| 569 | 568 | 
| 570     void OnVideoStreamsCreated( | 569     void OnVideoStreamsCreated( | 
| 571         VideoSendStream* send_stream, | 570         VideoSendStream* send_stream, | 
| 572         const std::vector<VideoReceiveStream*>& receive_streams) override { | 571         const std::vector<VideoReceiveStream*>& receive_streams) override { | 
| 573       send_stream_ = send_stream; | 572       send_stream_ = send_stream; | 
| 574     } | 573     } | 
| 575 | 574 | 
| 576     void ModifyVideoConfigs( | 575     void ModifyVideoConfigs( | 
| 577         VideoSendStream::Config* send_config, | 576         VideoSendStream::Config* send_config, | 
| 578         std::vector<VideoReceiveStream::Config>* receive_configs, | 577         std::vector<VideoReceiveStream::Config>* receive_configs, | 
| 579         VideoEncoderConfig* encoder_config) override { | 578         VideoEncoderConfig* encoder_config) override { | 
| 580       if (pad_to_min_bitrate_) { | 579       if (pad_to_min_bitrate_) { | 
| 581         encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps; | 580         encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps; | 
| 582       } else { | 581       } else { | 
| 583         RTC_DCHECK_EQ(0, encoder_config->min_transmit_bitrate_bps); | 582         RTC_DCHECK_EQ(0, encoder_config->min_transmit_bitrate_bps); | 
| 584       } | 583       } | 
| 585     } | 584     } | 
| 586 | 585 | 
| 587     void PerformTest() override { | 586     void PerformTest() override { | 
| 588       EXPECT_TRUE(Wait()) << "Timeout while waiting for send-bitrate stats."; | 587       EXPECT_TRUE(Wait()) << "Timeout while waiting for send-bitrate stats."; | 
| 589       test::PrintResultList( | 588       test::PrintResultList( | 
| 590           "bitrate_stats_", | 589           "bitrate_stats_", | 
| 591           (pad_to_min_bitrate_ ? "min_transmit_bitrate" | 590           (pad_to_min_bitrate_ ? "min_transmit_bitrate" | 
| 592                                : "without_min_transmit_bitrate"), | 591                                : "without_min_transmit_bitrate"), | 
| 593           "bitrate_kbps", test::ValuesToString(bitrate_kbps_list), "kbps", | 592           "bitrate_kbps", test::ValuesToString(bitrate_kbps_list_), "kbps", | 
| 594           false); | 593           false); | 
| 595     } | 594     } | 
| 596 | 595 | 
| 597     VideoSendStream* send_stream_; | 596     VideoSendStream* send_stream_; | 
|  | 597     bool converged_; | 
| 598     const bool pad_to_min_bitrate_; | 598     const bool pad_to_min_bitrate_; | 
|  | 599     const int min_acceptable_bitrate_; | 
|  | 600     const int max_acceptable_bitrate_; | 
| 599     int num_bitrate_observations_in_range_; | 601     int num_bitrate_observations_in_range_; | 
| 600     std::vector<size_t> bitrate_kbps_list; | 602     std::vector<size_t> bitrate_kbps_list_; | 
| 601   } test(pad_to_min_bitrate); | 603   } test(pad_to_min_bitrate); | 
| 602 | 604 | 
| 603   fake_encoder_.SetMaxBitrate(kMaxEncodeBitrateKbps); | 605   fake_encoder_.SetMaxBitrate(kMaxEncodeBitrateKbps); | 
| 604   RunBaseTest(&test); | 606   RunBaseTest(&test); | 
| 605 } | 607 } | 
| 606 | 608 | 
| 607 TEST_F(CallPerfTest, PadsToMinTransmitBitrate) { TestMinTransmitBitrate(true); } | 609 TEST_F(CallPerfTest, PadsToMinTransmitBitrate) { TestMinTransmitBitrate(true); } | 
| 608 | 610 | 
| 609 TEST_F(CallPerfTest, NoPadWithoutMinTransmitBitrate) { | 611 TEST_F(CallPerfTest, NoPadWithoutMinTransmitBitrate) { | 
| 610   TestMinTransmitBitrate(false); | 612   TestMinTransmitBitrate(false); | 
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 694     int encoder_inits_; | 696     int encoder_inits_; | 
| 695     uint32_t last_set_bitrate_; | 697     uint32_t last_set_bitrate_; | 
| 696     VideoSendStream* send_stream_; | 698     VideoSendStream* send_stream_; | 
| 697     VideoEncoderConfig encoder_config_; | 699     VideoEncoderConfig encoder_config_; | 
| 698   } test; | 700   } test; | 
| 699 | 701 | 
| 700   RunBaseTest(&test); | 702   RunBaseTest(&test); | 
| 701 } | 703 } | 
| 702 | 704 | 
| 703 }  // namespace webrtc | 705 }  // namespace webrtc | 
| OLD | NEW | 
|---|