Chromium Code Reviews| Index: webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc |
| diff --git a/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc b/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc |
| index d4a4d7d7e330c23d0d76a251be567c41bb60bfe3..41ee4d11f510f9cd118d3c950872756f594541dd 100644 |
| --- a/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc |
| +++ b/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc |
| @@ -113,41 +113,67 @@ int VP9EncoderImpl::Release() { |
| } |
| bool VP9EncoderImpl::SetSvcRates() { |
| - float rate_ratio[VPX_MAX_LAYERS] = {0}; |
| - float total = 0; |
| uint8_t i = 0; |
| - for (i = 0; i < num_spatial_layers_; ++i) { |
| - if (svc_internal_.svc_params.scaling_factor_num[i] <= 0 || |
| - svc_internal_.svc_params.scaling_factor_den[i] <= 0) { |
| + // Check target_bitrate_bps to see if spatial layers were configured |
| + // manually. |
| + if (num_spatial_layers_ > 1 && |
| + codec_.spatialLayers[0].target_bitrate_bps > 0) { |
| + if (num_temporal_layers_ > 1) { |
| + LOG(LS_ERROR) << "When specifying spatial layers manually, " |
| + "multiple temporal layers are not supported!"; |
| return false; |
| } |
| - rate_ratio[i] = static_cast<float>( |
| - svc_internal_.svc_params.scaling_factor_num[i]) / |
| - svc_internal_.svc_params.scaling_factor_den[i]; |
| - total += rate_ratio[i]; |
| - } |
| - |
| - for (i = 0; i < num_spatial_layers_; ++i) { |
| - config_->ss_target_bitrate[i] = static_cast<unsigned int>( |
| - config_->rc_target_bitrate * rate_ratio[i] / total); |
| - if (num_temporal_layers_ == 1) { |
| - config_->layer_target_bitrate[i] = config_->ss_target_bitrate[i]; |
| - } else if (num_temporal_layers_ == 2) { |
| - config_->layer_target_bitrate[i * num_temporal_layers_] = |
| - config_->ss_target_bitrate[i] * 2 / 3; |
| - config_->layer_target_bitrate[i * num_temporal_layers_ + 1] = |
| - config_->ss_target_bitrate[i]; |
| - } else if (num_temporal_layers_ == 3) { |
| - config_->layer_target_bitrate[i * num_temporal_layers_] = |
| - config_->ss_target_bitrate[i] / 2; |
| - config_->layer_target_bitrate[i * num_temporal_layers_ + 1] = |
| - config_->layer_target_bitrate[i * num_temporal_layers_] + |
| - (config_->ss_target_bitrate[i] / 4); |
| - config_->layer_target_bitrate[i * num_temporal_layers_ + 2] = |
| - config_->ss_target_bitrate[i]; |
| - } else { |
| - return false; |
| + int total_bitrate_bps = 0; |
| + for (i = 0; i < num_spatial_layers_; ++i) |
| + total_bitrate_bps += codec_.spatialLayers[i].target_bitrate_bps; |
| + // If total bitrate differs now from what has been specified at the |
| + // beginning, update the bitrates in the same ratio as before. |
| + for (i = 0; i < num_spatial_layers_; ++i) { |
| + config_->ss_target_bitrate[i] = |
| + config_->layer_target_bitrate[i] = static_cast<int>( |
| + static_cast<int64_t>(config_->rc_target_bitrate) * |
| + codec_.spatialLayers[i].target_bitrate_bps / |
| + total_bitrate_bps / 1000); |
| + } |
| + } else { |
| + float rate_ratio[VPX_MAX_LAYERS] = {0}; |
| + float total = 0; |
| + |
| + for (i = 0; i < num_spatial_layers_; ++i) { |
| + if (svc_internal_.svc_params.scaling_factor_num[i] <= 0 || |
| + svc_internal_.svc_params.scaling_factor_den[i] <= 0) { |
| + LOG(LS_ERROR) << "Scaling factors not specified!"; |
| + return false; |
| + } |
| + rate_ratio[i] = static_cast<float>( |
| + svc_internal_.svc_params.scaling_factor_num[i]) / |
| + svc_internal_.svc_params.scaling_factor_den[i]; |
| + total += rate_ratio[i]; |
| + } |
| + |
| + for (i = 0; i < num_spatial_layers_; ++i) { |
| + config_->ss_target_bitrate[i] = static_cast<unsigned int>( |
| + config_->rc_target_bitrate * rate_ratio[i] / total); |
| + if (num_temporal_layers_ == 1) { |
| + config_->layer_target_bitrate[i] = config_->ss_target_bitrate[i]; |
| + } else if (num_temporal_layers_ == 2) { |
| + config_->layer_target_bitrate[i * num_temporal_layers_] = |
| + config_->ss_target_bitrate[i] * 2 / 3; |
| + config_->layer_target_bitrate[i * num_temporal_layers_ + 1] = |
| + config_->ss_target_bitrate[i]; |
| + } else if (num_temporal_layers_ == 3) { |
| + config_->layer_target_bitrate[i * num_temporal_layers_] = |
| + config_->ss_target_bitrate[i] / 2; |
| + config_->layer_target_bitrate[i * num_temporal_layers_ + 1] = |
| + config_->layer_target_bitrate[i * num_temporal_layers_] + |
| + (config_->ss_target_bitrate[i] / 4); |
| + config_->layer_target_bitrate[i * num_temporal_layers_ + 2] = |
| + config_->ss_target_bitrate[i]; |
| + } else { |
| + 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.
|
| + return false; |
| + } |
|
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?
|
| } |
| } |
| @@ -355,14 +381,27 @@ int VP9EncoderImpl::NumberOfThreads(int width, |
| int VP9EncoderImpl::InitAndSetControlSettings(const VideoCodec* inst) { |
| config_->ss_number_layers = num_spatial_layers_; |
| - int scaling_factor_num = 256; |
| - for (int i = num_spatial_layers_ - 1; i >= 0; --i) { |
| - svc_internal_.svc_params.max_quantizers[i] = config_->rc_max_quantizer; |
| - svc_internal_.svc_params.min_quantizers[i] = config_->rc_min_quantizer; |
| - // 1:2 scaling in each dimension. |
| - svc_internal_.svc_params.scaling_factor_num[i] = scaling_factor_num; |
| - svc_internal_.svc_params.scaling_factor_den[i] = 256; |
| - scaling_factor_num /= 2; |
| + // Check target_bitrate_bps to see whether spatial layers were configured |
| + // manually. |
| + if (num_spatial_layers_ > 1 && |
| + codec_.spatialLayers[0].target_bitrate_bps > 0) { |
| + for (int i = 0; i < num_spatial_layers_; ++i) { |
| + const auto &layer = codec_.spatialLayers[i]; |
| + svc_internal_.svc_params.max_quantizers[i] = config_->rc_max_quantizer; |
| + svc_internal_.svc_params.min_quantizers[i] = config_->rc_min_quantizer; |
| + svc_internal_.svc_params.scaling_factor_num[i] = layer.scaling_factor_num; |
| + svc_internal_.svc_params.scaling_factor_den[i] = layer.scaling_factor_den; |
| + } |
| + } else { |
| + int scaling_factor_num = 256; |
| + for (int i = num_spatial_layers_ - 1; i >= 0; --i) { |
| + svc_internal_.svc_params.max_quantizers[i] = config_->rc_max_quantizer; |
| + svc_internal_.svc_params.min_quantizers[i] = config_->rc_min_quantizer; |
| + // 1:2 scaling in each dimension. |
| + svc_internal_.svc_params.scaling_factor_num[i] = scaling_factor_num; |
| + svc_internal_.svc_params.scaling_factor_den[i] = 256; |
| + scaling_factor_num /= 2; |
| + } |
| } |
| if (!SetSvcRates()) { |