Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(666)

Side by Side Diff: webrtc/modules/video_coding/utility/simulcast_rate_allocator.cc

Issue 2529073003: Fix perf regression in screenshare temporal layer bitrate allocation (Closed)
Patch Set: Yet another failing test Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 // Finally, distribute the bitrate for the simulcast streams across the 92 // Finally, distribute the bitrate for the simulcast streams across the
93 // available temporal layers. 93 // available temporal layers.
94 for (int simulcast_id = 0; simulcast_id < num_spatial_streams; 94 for (int simulcast_id = 0; simulcast_id < num_spatial_streams;
95 ++simulcast_id) { 95 ++simulcast_id) {
96 auto tl_it = temporal_layers_.find(simulcast_id); 96 auto tl_it = temporal_layers_.find(simulcast_id);
97 if (tl_it == temporal_layers_.end()) 97 if (tl_it == temporal_layers_.end())
98 continue; // TODO(sprang): If > 1 SS, assume default TL alloc? 98 continue; // TODO(sprang): If > 1 SS, assume default TL alloc?
99 99
100 uint32_t target_bitrate_kbps = 100 uint32_t target_bitrate_kbps =
101 allocated_bitrates_bps.GetBitrate(simulcast_id, 0) / 1000; 101 allocated_bitrates_bps.GetBitrate(simulcast_id, 0) / 1000;
102 const uint32_t expected_allocated_bitrate_kbps = target_bitrate_kbps;
102 RTC_DCHECK_EQ( 103 RTC_DCHECK_EQ(
103 target_bitrate_kbps, 104 target_bitrate_kbps,
104 allocated_bitrates_bps.GetSpatialLayerSum(simulcast_id) / 1000); 105 allocated_bitrates_bps.GetSpatialLayerSum(simulcast_id) / 1000);
106 const int num_temporal_streams = std::max<uint8_t>(
107 1, codec_.numberOfSimulcastStreams == 0
108 ? codec_.VP8().numberOfTemporalLayers
109 : codec_.simulcastStream[0].numberOfTemporalLayers);
110
105 uint32_t max_bitrate_kbps; 111 uint32_t max_bitrate_kbps;
106 if (num_spatial_streams == 1) { 112 if (num_spatial_streams == 1) {
107 max_bitrate_kbps = codec_.maxBitrate; 113 max_bitrate_kbps = codec_.maxBitrate;
108 const int num_temporal_streams =
109 codec_.numberOfSimulcastStreams == 0
110 ? codec_.VP8().numberOfTemporalLayers
111 : codec_.simulcastStream[0].numberOfTemporalLayers;
112 114
113 // TODO(holmer): This is a temporary hack for screensharing, where we 115 // TODO(holmer): This is a temporary hack for screensharing, where we
114 // interpret the startBitrate as the encoder target bitrate. This is 116 // interpret the startBitrate as the encoder target bitrate. This is
115 // to allow for a different max bitrate, so if the codec can't meet 117 // to allow for a different max bitrate, so if the codec can't meet
116 // the target we still allow it to overshoot up to the max before dropping 118 // the target we still allow it to overshoot up to the max before dropping
117 // frames. This hack should be improved. 119 // frames. This hack should be improved.
118 if (codec_.mode == kScreensharing && codec_.targetBitrate > 0 && 120 if (codec_.mode == kScreensharing && codec_.targetBitrate > 0 &&
119 num_temporal_streams == 2) { 121 num_temporal_streams == 2) {
120 int tl0_bitrate = std::min(codec_.targetBitrate, target_bitrate_kbps); 122 int tl0_bitrate = std::min(codec_.targetBitrate, target_bitrate_kbps);
121 max_bitrate_kbps = std::min(codec_.maxBitrate, target_bitrate_kbps); 123 max_bitrate_kbps = std::min(codec_.maxBitrate, target_bitrate_kbps);
122 target_bitrate_kbps = tl0_bitrate; 124 target_bitrate_kbps = tl0_bitrate;
123 } 125 }
124 } else { 126 } else {
125 max_bitrate_kbps = codec_.simulcastStream[simulcast_id].maxBitrate; 127 max_bitrate_kbps = codec_.simulcastStream[simulcast_id].maxBitrate;
126 } 128 }
127 129
128 std::vector<uint32_t> tl_allocation = tl_it->second->OnRatesUpdated( 130 std::vector<uint32_t> tl_allocation = tl_it->second->OnRatesUpdated(
129 target_bitrate_kbps, max_bitrate_kbps, framerate); 131 target_bitrate_kbps, max_bitrate_kbps, framerate);
132 RTC_DCHECK_GT(tl_allocation.size(), 0);
133 RTC_DCHECK_LE(tl_allocation.size(), num_temporal_streams);
130 134
135 uint64_t tl_allocation_sum_kbps = 0;
131 for (size_t tl_index = 0; tl_index < tl_allocation.size(); ++tl_index) { 136 for (size_t tl_index = 0; tl_index < tl_allocation.size(); ++tl_index) {
137 uint32_t layer_rate_kbps = tl_allocation[tl_index];
132 allocated_bitrates_bps.SetBitrate(simulcast_id, tl_index, 138 allocated_bitrates_bps.SetBitrate(simulcast_id, tl_index,
133 tl_allocation[tl_index] * 1000); 139 layer_rate_kbps * 1000);
140 tl_allocation_sum_kbps += layer_rate_kbps;
134 } 141 }
142 RTC_DCHECK_LE(tl_allocation_sum_kbps, expected_allocated_bitrate_kbps);
135 } 143 }
136 144
137 return allocated_bitrates_bps; 145 return allocated_bitrates_bps;
138 } 146 }
139 147
140 uint32_t SimulcastRateAllocator::GetPreferredBitrateBps(uint32_t framerate) { 148 uint32_t SimulcastRateAllocator::GetPreferredBitrateBps(uint32_t framerate) {
149 // Create a temporary instance without temporal layers, as they may be
150 // stateful, and updating the bitrate to max here can cause side effects.
151 SimulcastRateAllocator temp_allocator(codec_, nullptr);
141 BitrateAllocation allocation = 152 BitrateAllocation allocation =
142 GetAllocation(codec_.maxBitrate * 1000, framerate); 153 temp_allocator.GetAllocation(codec_.maxBitrate * 1000, framerate);
143 return allocation.get_sum_bps(); 154 return allocation.get_sum_bps();
144 } 155 }
145 156
146 const VideoCodec& webrtc::SimulcastRateAllocator::GetCodec() const { 157 const VideoCodec& webrtc::SimulcastRateAllocator::GetCodec() const {
147 return codec_; 158 return codec_;
148 } 159 }
149 160
150 } // namespace webrtc 161 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698