OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |