diff --git a/modules/video_coding/codecs/vp9/svc_config.cc b/modules/video_coding/codecs/vp9/svc_config.cc index 2935dd1571..ac6b4e5883 100644 --- a/modules/video_coding/codecs/vp9/svc_config.cc +++ b/modules/video_coding/codecs/vp9/svc_config.cc @@ -18,6 +18,10 @@ namespace webrtc { +namespace { +const int kMinVp9SvcBitrateKbps = 30; // Lowest VP9 video rate in kbps. +} // namespace + std::vector GetSvcConfig(size_t input_width, size_t input_height, size_t num_spatial_layers, @@ -45,16 +49,19 @@ std::vector GetSvcConfig(size_t input_width, spatial_layer.height = input_height >> (num_spatial_layers - sl_idx - 1); spatial_layer.numberOfTemporalLayers = num_temporal_layers; - // minBitrate and maxBitrate formulas were derived to fit VP9 - // subjective-quality data for bit rate below which video quality is - // unacceptable and above which additional bits do not provide benefit. + // minBitrate and maxBitrate formulas were derived from + // subjective-quality data to determing bit rates below which video + // quality is unacceptable and above which additional bits do not provide + // benefit. The formulas express rate in units of kbps. + // TODO(ssilkin): Add to the comment PSNR/SSIM we get at encoding certain // video to min/max bitrate specified by those formulas. const size_t num_pixels = spatial_layer.width * spatial_layer.height; - spatial_layer.minBitrate = - static_cast(360 * std::sqrt(num_pixels) / 1000); + const int min_bitrate = + static_cast((600. * std::sqrt(num_pixels) - 95000.) / 1000.); + spatial_layer.minBitrate = std::max(min_bitrate, kMinVp9SvcBitrateKbps); spatial_layer.maxBitrate = - static_cast((1.5 * num_pixels + 75 * 1000) / 1000); + static_cast((1.6 * num_pixels + 50 * 1000) / 1000); spatial_layer.targetBitrate = (spatial_layer.maxBitrate + spatial_layer.minBitrate) / 2;