| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 if (kbps > 0) { | 65 if (kbps > 0) { |
| 66 if (kbps < 300 /* qvga */) { | 66 if (kbps < 300 /* qvga */) { |
| 67 return 320 * 240; | 67 return 320 * 240; |
| 68 } else if (kbps < 500 /* vga */) { | 68 } else if (kbps < 500 /* vga */) { |
| 69 return 640 * 480; | 69 return 640 * 480; |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 return std::numeric_limits<uint32_t>::max(); | 72 return std::numeric_limits<uint32_t>::max(); |
| 73 } | 73 } |
| 74 | 74 |
| 75 bool IsResolutionScalingEnabled( |
| 76 VideoSendStream::DegradationPreference degradation_preference) { |
| 77 return degradation_preference == |
| 78 VideoSendStream::DegradationPreference::kMaintainFramerate || |
| 79 degradation_preference == |
| 80 VideoSendStream::DegradationPreference::kBalanced; |
| 81 } |
| 82 |
| 83 bool IsFramerateScalingEnabled( |
| 84 VideoSendStream::DegradationPreference degradation_preference) { |
| 85 return degradation_preference == |
| 86 VideoSendStream::DegradationPreference::kMaintainResolution || |
| 87 degradation_preference == |
| 88 VideoSendStream::DegradationPreference::kBalanced; |
| 89 } |
| 90 |
| 75 } // namespace | 91 } // namespace |
| 76 | 92 |
| 77 class ViEEncoder::ConfigureEncoderTask : public rtc::QueuedTask { | 93 class ViEEncoder::ConfigureEncoderTask : public rtc::QueuedTask { |
| 78 public: | 94 public: |
| 79 ConfigureEncoderTask(ViEEncoder* vie_encoder, | 95 ConfigureEncoderTask(ViEEncoder* vie_encoder, |
| 80 VideoEncoderConfig config, | 96 VideoEncoderConfig config, |
| 81 size_t max_data_payload_length, | 97 size_t max_data_payload_length, |
| 82 bool nack_enabled) | 98 bool nack_enabled) |
| 83 : vie_encoder_(vie_encoder), | 99 : vie_encoder_(vie_encoder), |
| 84 config_(std::move(config)), | 100 config_(std::move(config)), |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 RTC_DCHECK_RUN_ON(&thread_checker_); | 428 RTC_DCHECK_RUN_ON(&thread_checker_); |
| 413 encoder_queue_.PostTask([this, bitrate_observer] { | 429 encoder_queue_.PostTask([this, bitrate_observer] { |
| 414 RTC_DCHECK_RUN_ON(&encoder_queue_); | 430 RTC_DCHECK_RUN_ON(&encoder_queue_); |
| 415 RTC_DCHECK(!bitrate_observer_); | 431 RTC_DCHECK(!bitrate_observer_); |
| 416 bitrate_observer_ = bitrate_observer; | 432 bitrate_observer_ = bitrate_observer; |
| 417 }); | 433 }); |
| 418 } | 434 } |
| 419 | 435 |
| 420 void ViEEncoder::SetSource( | 436 void ViEEncoder::SetSource( |
| 421 rtc::VideoSourceInterface<VideoFrame>* source, | 437 rtc::VideoSourceInterface<VideoFrame>* source, |
| 422 const VideoSendStream::VideoSendStream::DegradationPreference& | 438 const VideoSendStream::DegradationPreference& degradation_preference) { |
| 423 degradation_preference) { | |
| 424 RTC_DCHECK_RUN_ON(&thread_checker_); | 439 RTC_DCHECK_RUN_ON(&thread_checker_); |
| 425 source_proxy_->SetSource(source, degradation_preference); | 440 source_proxy_->SetSource(source, degradation_preference); |
| 426 encoder_queue_.PostTask([this, degradation_preference] { | 441 encoder_queue_.PostTask([this, degradation_preference] { |
| 427 RTC_DCHECK_RUN_ON(&encoder_queue_); | 442 RTC_DCHECK_RUN_ON(&encoder_queue_); |
| 428 if (degradation_preference_ != degradation_preference) { | 443 if (degradation_preference_ != degradation_preference) { |
| 429 // Reset adaptation state, so that we're not tricked into thinking there's | 444 // Reset adaptation state, so that we're not tricked into thinking there's |
| 430 // an already pending request of the same type. | 445 // an already pending request of the same type. |
| 431 last_adaptation_request_.reset(); | 446 last_adaptation_request_.reset(); |
| 432 } | 447 } |
| 433 degradation_preference_ = degradation_preference; | 448 degradation_preference_ = degradation_preference; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 RTC_DCHECK_RUN_ON(&encoder_queue_); | 554 RTC_DCHECK_RUN_ON(&encoder_queue_); |
| 540 const auto scaling_settings = settings_.encoder->GetScalingSettings(); | 555 const auto scaling_settings = settings_.encoder->GetScalingSettings(); |
| 541 const bool degradation_preference_allows_scaling = | 556 const bool degradation_preference_allows_scaling = |
| 542 degradation_preference_ == | 557 degradation_preference_ == |
| 543 VideoSendStream::DegradationPreference::kMaintainFramerate || | 558 VideoSendStream::DegradationPreference::kMaintainFramerate || |
| 544 degradation_preference_ == | 559 degradation_preference_ == |
| 545 VideoSendStream::DegradationPreference::kBalanced; | 560 VideoSendStream::DegradationPreference::kBalanced; |
| 546 const bool quality_scaling_allowed = | 561 const bool quality_scaling_allowed = |
| 547 degradation_preference_allows_scaling && scaling_settings.enabled; | 562 degradation_preference_allows_scaling && scaling_settings.enabled; |
| 548 | 563 |
| 549 const std::vector<int>& scale_counters = GetScaleCounters(); | |
| 550 stats_proxy_->SetCpuScalingStats( | |
| 551 degradation_preference_allows_scaling ? scale_counters[kCpu] : -1); | |
| 552 stats_proxy_->SetQualityScalingStats( | |
| 553 quality_scaling_allowed ? scale_counters[kQuality] : -1); | |
| 554 | |
| 555 if (quality_scaling_allowed) { | 564 if (quality_scaling_allowed) { |
| 556 // Abort if quality scaler has already been configured. | 565 if (quality_scaler_.get() == nullptr) { |
| 557 if (quality_scaler_.get() != nullptr) | 566 // Quality scaler has not already been configured. |
| 558 return; | 567 // Drop frames and scale down until desired quality is achieved. |
| 559 // Drop frames and scale down until desired quality is achieved. | 568 if (scaling_settings.thresholds) { |
| 560 if (scaling_settings.thresholds) { | 569 quality_scaler_.reset( |
| 561 quality_scaler_.reset( | 570 new QualityScaler(this, *(scaling_settings.thresholds))); |
| 562 new QualityScaler(this, *(scaling_settings.thresholds))); | 571 } else { |
| 563 } else { | 572 quality_scaler_.reset(new QualityScaler(this, codec_type_)); |
| 564 quality_scaler_.reset(new QualityScaler(this, codec_type_)); | 573 } |
| 565 } | 574 } |
| 566 } else { | 575 } else { |
| 567 quality_scaler_.reset(nullptr); | 576 quality_scaler_.reset(nullptr); |
| 568 initial_rampup_ = kMaxInitialFramedrop; | 577 initial_rampup_ = kMaxInitialFramedrop; |
| 569 } | 578 } |
| 579 |
| 580 stats_proxy_->SetAdaptationStats(GetActiveCounts(kCpu), |
| 581 GetActiveCounts(kQuality)); |
| 570 } | 582 } |
| 571 | 583 |
| 572 void ViEEncoder::OnFrame(const VideoFrame& video_frame) { | 584 void ViEEncoder::OnFrame(const VideoFrame& video_frame) { |
| 573 RTC_DCHECK_RUNS_SERIALIZED(&incoming_frame_race_checker_); | 585 RTC_DCHECK_RUNS_SERIALIZED(&incoming_frame_race_checker_); |
| 574 VideoFrame incoming_frame = video_frame; | 586 VideoFrame incoming_frame = video_frame; |
| 575 | 587 |
| 576 // Local time in webrtc time base. | 588 // Local time in webrtc time base. |
| 577 int64_t current_time_us = clock_->TimeInMicroseconds(); | 589 int64_t current_time_us = clock_->TimeInMicroseconds(); |
| 578 int64_t current_time_ms = current_time_us / rtc::kNumMicrosecsPerMillisec; | 590 int64_t current_time_ms = current_time_us / rtc::kNumMicrosecsPerMillisec; |
| 579 // TODO(nisse): This always overrides the incoming timestamp. Don't | 591 // TODO(nisse): This always overrides the incoming timestamp. Don't |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 stats_proxy_->OnSuspendChange(video_is_suspended); | 804 stats_proxy_->OnSuspendChange(video_is_suspended); |
| 793 } | 805 } |
| 794 } | 806 } |
| 795 | 807 |
| 796 void ViEEncoder::AdaptDown(AdaptReason reason) { | 808 void ViEEncoder::AdaptDown(AdaptReason reason) { |
| 797 RTC_DCHECK_RUN_ON(&encoder_queue_); | 809 RTC_DCHECK_RUN_ON(&encoder_queue_); |
| 798 AdaptationRequest adaptation_request = { | 810 AdaptationRequest adaptation_request = { |
| 799 last_frame_info_->pixel_count(), | 811 last_frame_info_->pixel_count(), |
| 800 stats_proxy_->GetStats().input_frame_rate, | 812 stats_proxy_->GetStats().input_frame_rate, |
| 801 AdaptationRequest::Mode::kAdaptDown}; | 813 AdaptationRequest::Mode::kAdaptDown}; |
| 814 |
| 802 bool downgrade_requested = | 815 bool downgrade_requested = |
| 803 last_adaptation_request_ && | 816 last_adaptation_request_ && |
| 804 last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptDown; | 817 last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptDown; |
| 805 | 818 |
| 806 int max_downgrades = 0; | 819 int max_downgrades = 0; |
| 807 switch (degradation_preference_) { | 820 switch (degradation_preference_) { |
| 808 case VideoSendStream::DegradationPreference::kBalanced: | 821 case VideoSendStream::DegradationPreference::kBalanced: |
| 809 FALLTHROUGH(); | 822 FALLTHROUGH(); |
| 810 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 823 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
| 811 max_downgrades = kMaxCpuResolutionDowngrades; | 824 max_downgrades = kMaxCpuResolutionDowngrades; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 829 // make the same kind of limitations as for resolution, but trust the | 842 // make the same kind of limitations as for resolution, but trust the |
| 830 // overuse detector to not trigger too often. | 843 // overuse detector to not trigger too often. |
| 831 return; | 844 return; |
| 832 } | 845 } |
| 833 break; | 846 break; |
| 834 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 847 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
| 835 return; | 848 return; |
| 836 } | 849 } |
| 837 | 850 |
| 838 if (reason == kCpu) { | 851 if (reason == kCpu) { |
| 839 const int cpu_scale_counter = GetScaleCounters()[reason]; | 852 if (GetConstAdaptCounter().TotalCount(kCpu) >= max_downgrades) |
| 840 if (cpu_scale_counter >= max_downgrades) | |
| 841 return; | 853 return; |
| 842 } | 854 } |
| 843 | 855 |
| 844 switch (degradation_preference_) { | 856 switch (degradation_preference_) { |
| 845 case VideoSendStream::DegradationPreference::kBalanced: | 857 case VideoSendStream::DegradationPreference::kBalanced: |
| 846 FALLTHROUGH(); | 858 FALLTHROUGH(); |
| 847 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 859 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
| 848 if (!source_proxy_->RequestResolutionLowerThan( | 860 if (!source_proxy_->RequestResolutionLowerThan( |
| 849 adaptation_request.input_pixel_count_)) { | 861 adaptation_request.input_pixel_count_)) { |
| 850 return; | 862 return; |
| 851 } | 863 } |
| 852 LOG(LS_INFO) << "Scaling down resolution."; | 864 LOG(LS_INFO) << "Scaling down resolution."; |
| 865 GetAdaptCounter().IncrementResolution(reason, 1); |
| 853 break; | 866 break; |
| 854 case VideoSendStream::DegradationPreference::kMaintainResolution: | 867 case VideoSendStream::DegradationPreference::kMaintainResolution: |
| 855 source_proxy_->RequestFramerateLowerThan( | 868 source_proxy_->RequestFramerateLowerThan( |
| 856 adaptation_request.framerate_fps_); | 869 adaptation_request.framerate_fps_); |
| 857 LOG(LS_INFO) << "Scaling down framerate."; | 870 LOG(LS_INFO) << "Scaling down framerate."; |
| 871 GetAdaptCounter().IncrementFramerate(reason, 1); |
| 858 break; | 872 break; |
| 859 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 873 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
| 860 RTC_NOTREACHED(); | 874 RTC_NOTREACHED(); |
| 861 } | 875 } |
| 862 | 876 |
| 863 last_adaptation_request_.emplace(adaptation_request); | 877 last_adaptation_request_.emplace(adaptation_request); |
| 864 | 878 |
| 865 IncrementScaleCounter(reason, 1); | 879 UpdateAdaptationStats(reason); |
| 866 | 880 |
| 867 // Update stats. | 881 LOG(LS_INFO) << GetConstAdaptCounter().ToString(); |
| 868 const std::vector<int>& scale_counters = GetScaleCounters(); | |
| 869 switch (reason) { | |
| 870 case kQuality: | |
| 871 stats_proxy_->OnQualityRestrictedResolutionChanged( | |
| 872 scale_counters[reason]); | |
| 873 break; | |
| 874 case kCpu: | |
| 875 stats_proxy_->OnCpuRestrictedResolutionChanged(true); | |
| 876 break; | |
| 877 } | |
| 878 | |
| 879 for (size_t i = 0; i < kScaleReasonSize; ++i) { | |
| 880 LOG(LS_INFO) << "Scaled " << scale_counters[i] | |
| 881 << " times for reason: " << (i ? "cpu" : "quality"); | |
| 882 } | |
| 883 } | 882 } |
| 884 | 883 |
| 885 void ViEEncoder::AdaptUp(AdaptReason reason) { | 884 void ViEEncoder::AdaptUp(AdaptReason reason) { |
| 886 RTC_DCHECK_RUN_ON(&encoder_queue_); | 885 RTC_DCHECK_RUN_ON(&encoder_queue_); |
| 887 int scale_counter = GetScaleCounters()[reason]; | 886 |
| 888 if (scale_counter == 0) | 887 const AdaptCounter& adapt_counter = GetConstAdaptCounter(); |
| 888 int num_downgrades = adapt_counter.TotalCount(reason); |
| 889 if (num_downgrades == 0) |
| 889 return; | 890 return; |
| 890 RTC_DCHECK_GT(scale_counter, 0); | 891 RTC_DCHECK_GT(num_downgrades, 0); |
| 892 |
| 891 AdaptationRequest adaptation_request = { | 893 AdaptationRequest adaptation_request = { |
| 892 last_frame_info_->pixel_count(), | 894 last_frame_info_->pixel_count(), |
| 893 stats_proxy_->GetStats().input_frame_rate, | 895 stats_proxy_->GetStats().input_frame_rate, |
| 894 AdaptationRequest::Mode::kAdaptUp}; | 896 AdaptationRequest::Mode::kAdaptUp}; |
| 895 | 897 |
| 896 bool adapt_up_requested = | 898 bool adapt_up_requested = |
| 897 last_adaptation_request_ && | 899 last_adaptation_request_ && |
| 898 last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptUp; | 900 last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptUp; |
| 901 |
| 899 switch (degradation_preference_) { | 902 switch (degradation_preference_) { |
| 900 case VideoSendStream::DegradationPreference::kBalanced: | 903 case VideoSendStream::DegradationPreference::kBalanced: |
| 901 FALLTHROUGH(); | 904 FALLTHROUGH(); |
| 902 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 905 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
| 903 if (adapt_up_requested && | 906 if (adapt_up_requested && |
| 904 adaptation_request.input_pixel_count_ <= | 907 adaptation_request.input_pixel_count_ <= |
| 905 last_adaptation_request_->input_pixel_count_) { | 908 last_adaptation_request_->input_pixel_count_) { |
| 906 // Don't request higher resolution if the current resolution is not | 909 // Don't request higher resolution if the current resolution is not |
| 907 // higher than the last time we asked for the resolution to be higher. | 910 // higher than the last time we asked for the resolution to be higher. |
| 908 return; | 911 return; |
| 909 } | 912 } |
| 910 break; | 913 break; |
| 911 case VideoSendStream::DegradationPreference::kMaintainResolution: | 914 case VideoSendStream::DegradationPreference::kMaintainResolution: |
| 912 // TODO(sprang): Don't request higher framerate if we are already at | 915 // TODO(sprang): Don't request higher framerate if we are already at |
| 913 // max requested fps? | 916 // max requested fps? |
| 914 break; | 917 break; |
| 915 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 918 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
| 916 return; | 919 return; |
| 917 } | 920 } |
| 918 | 921 |
| 919 // Decrease counter of how many times we have scaled down, for this | |
| 920 // degradation preference mode and reason. | |
| 921 IncrementScaleCounter(reason, -1); | |
| 922 | |
| 923 // Get a sum of how many times have scaled down, in total, for this | |
| 924 // degradation preference mode. If it is 0, remove any restraints. | |
| 925 const std::vector<int>& scale_counters = GetScaleCounters(); | |
| 926 const int scale_sum = | |
| 927 std::accumulate(scale_counters.begin(), scale_counters.end(), 0); | |
| 928 switch (degradation_preference_) { | 922 switch (degradation_preference_) { |
| 929 case VideoSendStream::DegradationPreference::kBalanced: | 923 case VideoSendStream::DegradationPreference::kBalanced: |
| 930 FALLTHROUGH(); | 924 FALLTHROUGH(); |
| 931 case VideoSendStream::DegradationPreference::kMaintainFramerate: | 925 case VideoSendStream::DegradationPreference::kMaintainFramerate: |
| 932 if (scale_sum == 0) { | 926 if (adapt_counter.TotalCount() == 1) { |
| 933 LOG(LS_INFO) << "Removing resolution down-scaling setting."; | 927 LOG(LS_INFO) << "Removing resolution down-scaling setting."; |
| 934 source_proxy_->RequestHigherResolutionThan( | 928 source_proxy_->RequestHigherResolutionThan( |
| 935 std::numeric_limits<int>::max()); | 929 std::numeric_limits<int>::max()); |
| 936 } else { | 930 } else { |
| 937 source_proxy_->RequestHigherResolutionThan( | 931 source_proxy_->RequestHigherResolutionThan( |
| 938 adaptation_request.input_pixel_count_); | 932 adaptation_request.input_pixel_count_); |
| 939 LOG(LS_INFO) << "Scaling up resolution."; | 933 LOG(LS_INFO) << "Scaling up resolution."; |
| 940 } | 934 } |
| 935 GetAdaptCounter().IncrementResolution(reason, -1); |
| 941 break; | 936 break; |
| 942 case VideoSendStream::DegradationPreference::kMaintainResolution: | 937 case VideoSendStream::DegradationPreference::kMaintainResolution: |
| 943 if (scale_sum == 0) { | 938 if (adapt_counter.TotalCount() == 1) { |
| 944 LOG(LS_INFO) << "Removing framerate down-scaling setting."; | 939 LOG(LS_INFO) << "Removing framerate down-scaling setting."; |
| 945 source_proxy_->RequestHigherFramerateThan( | 940 source_proxy_->RequestHigherFramerateThan( |
| 946 std::numeric_limits<int>::max()); | 941 std::numeric_limits<int>::max()); |
| 947 } else { | 942 } else { |
| 948 source_proxy_->RequestHigherFramerateThan( | 943 source_proxy_->RequestHigherFramerateThan( |
| 949 adaptation_request.framerate_fps_); | 944 adaptation_request.framerate_fps_); |
| 950 LOG(LS_INFO) << "Scaling up framerate."; | 945 LOG(LS_INFO) << "Scaling up framerate."; |
| 951 } | 946 } |
| 947 GetAdaptCounter().IncrementFramerate(reason, -1); |
| 952 break; | 948 break; |
| 953 case VideoSendStream::DegradationPreference::kDegradationDisabled: | 949 case VideoSendStream::DegradationPreference::kDegradationDisabled: |
| 954 RTC_NOTREACHED(); | 950 RTC_NOTREACHED(); |
| 955 } | 951 } |
| 956 | 952 |
| 957 last_adaptation_request_.emplace(adaptation_request); | 953 last_adaptation_request_.emplace(adaptation_request); |
| 958 | 954 |
| 959 // Update stats. | 955 UpdateAdaptationStats(reason); |
| 956 |
| 957 LOG(LS_INFO) << adapt_counter.ToString(); |
| 958 } |
| 959 |
| 960 void ViEEncoder::UpdateAdaptationStats(AdaptReason reason) { |
| 960 switch (reason) { | 961 switch (reason) { |
| 962 case kCpu: |
| 963 stats_proxy_->OnCpuAdaptationChanged(GetActiveCounts(kCpu), |
| 964 GetActiveCounts(kQuality)); |
| 965 break; |
| 961 case kQuality: | 966 case kQuality: |
| 962 stats_proxy_->OnQualityRestrictedResolutionChanged( | 967 stats_proxy_->OnQualityAdaptationChanged(GetActiveCounts(kCpu), |
| 963 scale_counters[reason]); | 968 GetActiveCounts(kQuality)); |
| 964 break; | 969 break; |
| 965 case kCpu: | |
| 966 stats_proxy_->OnCpuRestrictedResolutionChanged(scale_counters[reason] > | |
| 967 0); | |
| 968 break; | |
| 969 } | |
| 970 | |
| 971 for (size_t i = 0; i < kScaleReasonSize; ++i) { | |
| 972 LOG(LS_INFO) << "Scaled " << scale_counters[i] | |
| 973 << " times for reason: " << (i ? "cpu" : "quality"); | |
| 974 } | 970 } |
| 975 } | 971 } |
| 976 | 972 |
| 977 const std::vector<int>& ViEEncoder::GetScaleCounters() { | 973 ViEEncoder::AdaptCounts ViEEncoder::GetActiveCounts(AdaptReason reason) { |
| 978 auto it = scale_counters_.find(degradation_preference_); | 974 ViEEncoder::AdaptCounts counts = GetConstAdaptCounter().Counts(reason); |
| 979 if (it == scale_counters_.end()) { | 975 switch (reason) { |
| 980 scale_counters_[degradation_preference_].resize(kScaleReasonSize); | 976 case kCpu: |
| 981 return scale_counters_[degradation_preference_]; | 977 if (!IsFramerateScalingEnabled(degradation_preference_)) |
| 978 counts.fps = -1; |
| 979 if (!IsResolutionScalingEnabled(degradation_preference_)) |
| 980 counts.resolution = -1; |
| 981 break; |
| 982 case kQuality: |
| 983 if (!IsFramerateScalingEnabled(degradation_preference_) || |
| 984 !quality_scaler_) { |
| 985 counts.fps = -1; |
| 986 } |
| 987 if (!IsResolutionScalingEnabled(degradation_preference_) || |
| 988 !quality_scaler_) { |
| 989 counts.resolution = -1; |
| 990 } |
| 991 break; |
| 982 } | 992 } |
| 983 return it->second; | 993 return counts; |
| 984 } | 994 } |
| 985 | 995 |
| 986 void ViEEncoder::IncrementScaleCounter(int reason, int delta) { | 996 ViEEncoder::AdaptCounter& ViEEncoder::GetAdaptCounter() { |
| 987 // Get the counters and validate. This may also lazily initialize the state. | 997 return adapt_counters_[degradation_preference_]; |
| 988 const std::vector<int>& counter = GetScaleCounters(); | 998 } |
| 989 if (delta < 0) { | 999 |
| 990 RTC_DCHECK_GE(counter[reason], delta); | 1000 const ViEEncoder::AdaptCounter& ViEEncoder::GetConstAdaptCounter() { |
| 1001 return adapt_counters_[degradation_preference_]; |
| 1002 } |
| 1003 |
| 1004 // Class holding adaptation information. |
| 1005 ViEEncoder::AdaptCounter::AdaptCounter() { |
| 1006 fps_counters_.resize(kScaleReasonSize); |
| 1007 resolution_counters_.resize(kScaleReasonSize); |
| 1008 } |
| 1009 |
| 1010 ViEEncoder::AdaptCounter::~AdaptCounter() {} |
| 1011 |
| 1012 std::string ViEEncoder::AdaptCounter::ToString() const { |
| 1013 std::stringstream ss; |
| 1014 ss << "Downgrade counts: fps: {" << ToString(fps_counters_); |
| 1015 ss << "}, resolution: {" << ToString(resolution_counters_) << "}"; |
| 1016 return ss.str(); |
| 1017 } |
| 1018 |
| 1019 ViEEncoder::AdaptCounts ViEEncoder::AdaptCounter::Counts(int reason) const { |
| 1020 AdaptCounts counts; |
| 1021 counts.fps = fps_counters_[reason]; |
| 1022 counts.resolution = resolution_counters_[reason]; |
| 1023 return counts; |
| 1024 } |
| 1025 |
| 1026 void ViEEncoder::AdaptCounter::IncrementFramerate(int reason, int delta) { |
| 1027 fps_counters_[reason] += delta; |
| 1028 } |
| 1029 |
| 1030 void ViEEncoder::AdaptCounter::IncrementResolution(int reason, int delta) { |
| 1031 resolution_counters_[reason] += delta; |
| 1032 } |
| 1033 |
| 1034 int ViEEncoder::AdaptCounter::FramerateCount() const { |
| 1035 return Count(fps_counters_); |
| 1036 } |
| 1037 |
| 1038 int ViEEncoder::AdaptCounter::ResolutionCount() const { |
| 1039 return Count(resolution_counters_); |
| 1040 } |
| 1041 |
| 1042 int ViEEncoder::AdaptCounter::TotalCount() const { |
| 1043 return FramerateCount() + ResolutionCount(); |
| 1044 } |
| 1045 |
| 1046 int ViEEncoder::AdaptCounter::FramerateCount(int reason) const { |
| 1047 return fps_counters_[reason]; |
| 1048 } |
| 1049 |
| 1050 int ViEEncoder::AdaptCounter::ResolutionCount(int reason) const { |
| 1051 return resolution_counters_[reason]; |
| 1052 } |
| 1053 |
| 1054 int ViEEncoder::AdaptCounter::TotalCount(int reason) const { |
| 1055 return FramerateCount(reason) + ResolutionCount(reason); |
| 1056 } |
| 1057 |
| 1058 int ViEEncoder::AdaptCounter::Count(const std::vector<int>& counters) const { |
| 1059 return std::accumulate(counters.begin(), counters.end(), 0); |
| 1060 } |
| 1061 |
| 1062 std::string ViEEncoder::AdaptCounter::ToString( |
| 1063 const std::vector<int>& counters) const { |
| 1064 std::stringstream ss; |
| 1065 for (size_t reason = 0; reason < kScaleReasonSize; ++reason) { |
| 1066 ss << (reason ? " cpu" : "quality") << ":" << counters[reason]; |
| 991 } | 1067 } |
| 992 scale_counters_[degradation_preference_][reason] += delta; | 1068 return ss.str(); |
| 993 } | 1069 } |
| 994 | 1070 |
| 995 } // namespace webrtc | 1071 } // namespace webrtc |
| OLD | NEW |