| Index: webrtc/media/engine/webrtcvideoengine2.cc
|
| diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
|
| index 2440fce642fc9aa37e5738365aeed729dcbd26cc..5862102cb84a83ae84456e0ec1929d4a0f77ce75 100644
|
| --- a/webrtc/media/engine/webrtcvideoengine2.cc
|
| +++ b/webrtc/media/engine/webrtcvideoengine2.cc
|
| @@ -371,6 +371,9 @@ static const int kDefaultQpMax = 56;
|
|
|
| static const int kDefaultRtcpReceiverReportSsrc = 1;
|
|
|
| +// Down grade resolution at most 2 times for CPU reasons.
|
| +static const int kMaxCpuDowngrades = 2;
|
| +
|
| std::vector<VideoCodec> DefaultVideoCodecList() {
|
| std::vector<VideoCodec> codecs;
|
| codecs.push_back(MakeVideoCodecWithDefaultFeedbackParams(kDefaultVp8PlType,
|
| @@ -1832,7 +1835,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters(
|
| << "RecreateWebRtcStream (send) because of SetSendParameters";
|
| RecreateWebRtcStream();
|
| }
|
| - } // release |lock_|
|
| + } // release |lock_|
|
|
|
| // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since
|
| // that might cause a lock order inversion.
|
| @@ -2023,8 +2026,14 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) {
|
| rtc::Optional<int> max_pixel_count;
|
| rtc::Optional<int> max_pixel_count_step_up;
|
| if (load == kOveruse) {
|
| - max_pixel_count = rtc::Optional<int>(
|
| - (last_dimensions_.height * last_dimensions_.width) / 2);
|
| + if (cpu_restricted_counter_ >= kMaxCpuDowngrades) {
|
| + return;
|
| + }
|
| + // The input video frame size will have a resolution with less than or
|
| + // equal to |max_pixel_count| depending on how the capturer can scale the
|
| + // input frame size.
|
| + max_pixel_count = rtc::Optional<int>(
|
| + (last_dimensions_.height * last_dimensions_.width * 3) / 5);
|
| // Increase |number_of_cpu_adapt_changes_| if
|
| // sink_wants_.max_pixel_count will be changed since
|
| // last time |capturer_->AddOrUpdateSink| was called. That is, this will
|
| @@ -2036,6 +2045,9 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) {
|
| }
|
| } else {
|
| RTC_DCHECK(load == kUnderuse);
|
| + // The input video frame size will have a resolution with "one step up"
|
| + // pixels than |max_pixel_count_step_up| where "one step up" depends on
|
| + // how the capturer can scale the input frame size.
|
| max_pixel_count_step_up = rtc::Optional<int>(last_dimensions_.height *
|
| last_dimensions_.width);
|
| // Increase |number_of_cpu_adapt_changes_| if
|
| @@ -2085,16 +2097,15 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::GetVideoSenderInfo() {
|
| stats = stream_->GetStats();
|
| }
|
| info.adapt_changes = number_of_cpu_adapt_changes_;
|
| - info.adapt_reason = cpu_restricted_counter_ <= 0
|
| - ? CoordinatedVideoAdapter::ADAPTREASON_NONE
|
| - : CoordinatedVideoAdapter::ADAPTREASON_CPU;
|
| + info.adapt_reason =
|
| + cpu_restricted_counter_ <= 0 ? ADAPTREASON_NONE : ADAPTREASON_CPU;
|
|
|
| // Get bandwidth limitation info from stream_->GetStats().
|
| // Input resolution (output from video_adapter) can be further scaled down or
|
| // higher video layer(s) can be dropped due to bitrate constraints.
|
| // Note, adapt_changes only include changes from the video_adapter.
|
| if (stats.bw_limited_resolution)
|
| - info.adapt_reason |= CoordinatedVideoAdapter::ADAPTREASON_BANDWIDTH;
|
| + info.adapt_reason |= ADAPTREASON_BANDWIDTH;
|
|
|
| info.encoder_implementation_name = stats.encoder_implementation_name;
|
| info.ssrc_groups = ssrc_groups_;
|
|
|