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

Side by Side Diff: webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc

Issue 1353263005: Adding support for simulcast and spatial layers into VideoQualityTest (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: whoops, compile errors Created 5 years, 2 months 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) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 } 106 }
107 if (raw_ != NULL) { 107 if (raw_ != NULL) {
108 vpx_img_free(raw_); 108 vpx_img_free(raw_);
109 raw_ = NULL; 109 raw_ = NULL;
110 } 110 }
111 inited_ = false; 111 inited_ = false;
112 return WEBRTC_VIDEO_CODEC_OK; 112 return WEBRTC_VIDEO_CODEC_OK;
113 } 113 }
114 114
115 bool VP9EncoderImpl::SetSvcRates() { 115 bool VP9EncoderImpl::SetSvcRates() {
116 float rate_ratio[VPX_MAX_LAYERS] = {0};
117 float total = 0;
118 uint8_t i = 0; 116 uint8_t i = 0;
119 117
120 for (i = 0; i < num_spatial_layers_; ++i) { 118 // Check target_bitrate_bps to see if spatial layers were configured
121 if (svc_internal_.svc_params.scaling_factor_num[i] <= 0 || 119 // manually.
122 svc_internal_.svc_params.scaling_factor_den[i] <= 0) { 120 if (num_spatial_layers_ > 1 &&
121 codec_.spatialLayers[0].target_bitrate_bps > 0) {
122 if (num_temporal_layers_ > 1) {
123 LOG(LS_ERROR) << "When specifying spatial layers manually, "
124 "multiple temporal layers are not supported!";
123 return false; 125 return false;
124 } 126 }
125 rate_ratio[i] = static_cast<float>( 127 int total_bitrate_bps = 0;
126 svc_internal_.svc_params.scaling_factor_num[i]) / 128 for (i = 0; i < num_spatial_layers_; ++i)
127 svc_internal_.svc_params.scaling_factor_den[i]; 129 total_bitrate_bps += codec_.spatialLayers[i].target_bitrate_bps;
128 total += rate_ratio[i]; 130 // If total bitrate differs now from what has been specified at the
129 } 131 // beginning, update the bitrates in the same ratio as before.
132 for (i = 0; i < num_spatial_layers_; ++i) {
133 config_->ss_target_bitrate[i] =
134 config_->layer_target_bitrate[i] = static_cast<int>(
135 static_cast<int64_t>(config_->rc_target_bitrate) *
136 codec_.spatialLayers[i].target_bitrate_bps /
137 total_bitrate_bps / 1000);
138 }
139 } else {
140 float rate_ratio[VPX_MAX_LAYERS] = {0};
141 float total = 0;
130 142
131 for (i = 0; i < num_spatial_layers_; ++i) { 143 for (i = 0; i < num_spatial_layers_; ++i) {
132 config_->ss_target_bitrate[i] = static_cast<unsigned int>( 144 if (svc_internal_.svc_params.scaling_factor_num[i] <= 0 ||
133 config_->rc_target_bitrate * rate_ratio[i] / total); 145 svc_internal_.svc_params.scaling_factor_den[i] <= 0) {
134 if (num_temporal_layers_ == 1) { 146 LOG(LS_ERROR) << "Scaling factors not specified!";
135 config_->layer_target_bitrate[i] = config_->ss_target_bitrate[i]; 147 return false;
136 } else if (num_temporal_layers_ == 2) { 148 }
137 config_->layer_target_bitrate[i * num_temporal_layers_] = 149 rate_ratio[i] = static_cast<float>(
138 config_->ss_target_bitrate[i] * 2 / 3; 150 svc_internal_.svc_params.scaling_factor_num[i]) /
139 config_->layer_target_bitrate[i * num_temporal_layers_ + 1] = 151 svc_internal_.svc_params.scaling_factor_den[i];
140 config_->ss_target_bitrate[i]; 152 total += rate_ratio[i];
141 } else if (num_temporal_layers_ == 3) { 153 }
142 config_->layer_target_bitrate[i * num_temporal_layers_] = 154
143 config_->ss_target_bitrate[i] / 2; 155 for (i = 0; i < num_spatial_layers_; ++i) {
144 config_->layer_target_bitrate[i * num_temporal_layers_ + 1] = 156 config_->ss_target_bitrate[i] = static_cast<unsigned int>(
145 config_->layer_target_bitrate[i * num_temporal_layers_] + 157 config_->rc_target_bitrate * rate_ratio[i] / total);
146 (config_->ss_target_bitrate[i] / 4); 158 if (num_temporal_layers_ == 1) {
147 config_->layer_target_bitrate[i * num_temporal_layers_ + 2] = 159 config_->layer_target_bitrate[i] = config_->ss_target_bitrate[i];
148 config_->ss_target_bitrate[i]; 160 } else if (num_temporal_layers_ == 2) {
149 } else { 161 config_->layer_target_bitrate[i * num_temporal_layers_] =
150 return false; 162 config_->ss_target_bitrate[i] * 2 / 3;
163 config_->layer_target_bitrate[i * num_temporal_layers_ + 1] =
164 config_->ss_target_bitrate[i];
165 } else if (num_temporal_layers_ == 3) {
166 config_->layer_target_bitrate[i * num_temporal_layers_] =
167 config_->ss_target_bitrate[i] / 2;
168 config_->layer_target_bitrate[i * num_temporal_layers_ + 1] =
169 config_->layer_target_bitrate[i * num_temporal_layers_] +
170 (config_->ss_target_bitrate[i] / 4);
171 config_->layer_target_bitrate[i * num_temporal_layers_ + 2] =
172 config_->ss_target_bitrate[i];
173 } else {
174 LOG(LS_ERROR) << "Unsupported number of temporal layers!";
sprang_webrtc 2015/09/29 14:19:33 LOG(LS_ERROR) << "Unsupported number of temporal l
ivica 2015/09/29 15:14:51 Done.
175 return false;
176 }
sprang_webrtc 2015/09/29 14:19:33 Why not switch?
ivica 2015/09/29 15:14:51 This is not my code, should I change it?
151 } 177 }
152 } 178 }
153 179
154 // For now, temporal layers only supported when having one spatial layer. 180 // For now, temporal layers only supported when having one spatial layer.
155 if (num_spatial_layers_ == 1) { 181 if (num_spatial_layers_ == 1) {
156 for (i = 0; i < num_temporal_layers_; ++i) { 182 for (i = 0; i < num_temporal_layers_; ++i) {
157 config_->ts_target_bitrate[i] = config_->layer_target_bitrate[i]; 183 config_->ts_target_bitrate[i] = config_->layer_target_bitrate[i];
158 } 184 }
159 } 185 }
160 186
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 return 2; 374 return 2;
349 } else { 375 } else {
350 // 1 thread less than VGA. 376 // 1 thread less than VGA.
351 return 1; 377 return 1;
352 } 378 }
353 } 379 }
354 380
355 int VP9EncoderImpl::InitAndSetControlSettings(const VideoCodec* inst) { 381 int VP9EncoderImpl::InitAndSetControlSettings(const VideoCodec* inst) {
356 config_->ss_number_layers = num_spatial_layers_; 382 config_->ss_number_layers = num_spatial_layers_;
357 383
358 int scaling_factor_num = 256; 384 // Check target_bitrate_bps to see whether spatial layers were configured
359 for (int i = num_spatial_layers_ - 1; i >= 0; --i) { 385 // manually.
360 svc_internal_.svc_params.max_quantizers[i] = config_->rc_max_quantizer; 386 if (num_spatial_layers_ > 1 &&
361 svc_internal_.svc_params.min_quantizers[i] = config_->rc_min_quantizer; 387 codec_.spatialLayers[0].target_bitrate_bps > 0) {
362 // 1:2 scaling in each dimension. 388 for (int i = 0; i < num_spatial_layers_; ++i) {
363 svc_internal_.svc_params.scaling_factor_num[i] = scaling_factor_num; 389 const auto &layer = codec_.spatialLayers[i];
364 svc_internal_.svc_params.scaling_factor_den[i] = 256; 390 svc_internal_.svc_params.max_quantizers[i] = config_->rc_max_quantizer;
365 scaling_factor_num /= 2; 391 svc_internal_.svc_params.min_quantizers[i] = config_->rc_min_quantizer;
392 svc_internal_.svc_params.scaling_factor_num[i] = layer.scaling_factor_num;
393 svc_internal_.svc_params.scaling_factor_den[i] = layer.scaling_factor_den;
394 }
395 } else {
396 int scaling_factor_num = 256;
397 for (int i = num_spatial_layers_ - 1; i >= 0; --i) {
398 svc_internal_.svc_params.max_quantizers[i] = config_->rc_max_quantizer;
399 svc_internal_.svc_params.min_quantizers[i] = config_->rc_min_quantizer;
400 // 1:2 scaling in each dimension.
401 svc_internal_.svc_params.scaling_factor_num[i] = scaling_factor_num;
402 svc_internal_.svc_params.scaling_factor_den[i] = 256;
403 scaling_factor_num /= 2;
404 }
366 } 405 }
367 406
368 if (!SetSvcRates()) { 407 if (!SetSvcRates()) {
369 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; 408 return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
370 } 409 }
371 410
372 if (vpx_codec_enc_init(encoder_, vpx_codec_vp9_cx(), config_, 0)) { 411 if (vpx_codec_enc_init(encoder_, vpx_codec_vp9_cx(), config_, 0)) {
373 return WEBRTC_VIDEO_CODEC_UNINITIALIZED; 412 return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
374 } 413 }
375 vpx_codec_control(encoder_, VP8E_SET_CPUUSED, cpu_speed_); 414 vpx_codec_control(encoder_, VP8E_SET_CPUUSED, cpu_speed_);
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 decoder_ = NULL; 820 decoder_ = NULL;
782 } 821 }
783 // Releases buffers from the pool. Any buffers not in use are deleted. Buffers 822 // Releases buffers from the pool. Any buffers not in use are deleted. Buffers
784 // still referenced externally are deleted once fully released, not returning 823 // still referenced externally are deleted once fully released, not returning
785 // to the pool. 824 // to the pool.
786 frame_buffer_pool_.ClearPool(); 825 frame_buffer_pool_.ClearPool();
787 inited_ = false; 826 inited_ = false;
788 return WEBRTC_VIDEO_CODEC_OK; 827 return WEBRTC_VIDEO_CODEC_OK;
789 } 828 }
790 } // namespace webrtc 829 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698