From: paulwilkins Date: Wed, 11 Oct 2017 09:31:57 +0000 (+0100) Subject: Prevent double application of min rate in two pass. X-Git-Tag: v1.7.0~95^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=416b7051d7f610ed6d62dff18af7776ec520fd9c;p=libvpx Prevent double application of min rate in two pass. The initial allocation of bits in the two pass code to each frame should be within the min max limits on the command line. However, when forming an ARF group the cost of the ARF is shared by frames in that group such that the residual bits for a frame could drop below the min value. This change prevents the minimum being re-applied after the cost of the ARF has been deducted as this may otherwise cause low rate sections to overshoot their target. Test runs comparing to a baseline run with min and max section pct 0-2000% vs one closer to the YT use case (50-150%) suggest that this fix not only results in better rate control but also gives a better rd outcome. For example the HD set vs 0-2000% baseline (opsnr, ssim). Old code (50-150): +0.751, +1.099 New code(50-150): +0.241, -0.009 Change-Id: I715da7b130bf53ba8aa609532aa9e18b84f5e2ef --- diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index e81d03b29..d201feb31 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -44,8 +44,6 @@ #define MIN_BPB_FACTOR 0.005 #define MAX_BPB_FACTOR 50 -#define FRAME_OVERHEAD_BITS 200 - #if CONFIG_VP9_HIGHBITDEPTH #define ASSIGN_MINQ_TABLE(bit_depth, name) \ do { \ @@ -212,18 +210,23 @@ int vp9_estimate_bits_at_q(FRAME_TYPE frame_type, int q, int mbs, int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) { const RATE_CONTROL *rc = &cpi->rc; const VP9EncoderConfig *oxcf = &cpi->oxcf; - const int min_frame_target = - VPXMAX(rc->min_frame_bandwidth, rc->avg_frame_bandwidth >> 5); - if (target < min_frame_target) target = min_frame_target; - if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) { - // If there is an active ARF at this location use the minimum - // bits on this frame even if it is a constructed arf. - // The active maximum quantizer insures that an appropriate - // number of bits will be spent if needed for constructed ARFs. - target = min_frame_target; + + if (cpi->oxcf.pass != 2) { + const int min_frame_target = + VPXMAX(rc->min_frame_bandwidth, rc->avg_frame_bandwidth >> 5); + if (target < min_frame_target) target = min_frame_target; + if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) { + // If there is an active ARF at this location use the minimum + // bits on this frame even if it is a constructed arf. + // The active maximum quantizer insures that an appropriate + // number of bits will be spent if needed for constructed ARFs. + target = min_frame_target; + } } + // Clip the frame target to the maximum allowed value. if (target > rc->max_frame_bandwidth) target = rc->max_frame_bandwidth; + if (oxcf->rc_max_inter_bitrate_pct) { const int max_rate = rc->avg_frame_bandwidth * oxcf->rc_max_inter_bitrate_pct / 100; diff --git a/vp9/encoder/vp9_ratectrl.h b/vp9/encoder/vp9_ratectrl.h index f851e4286..61e50e9f7 100644 --- a/vp9/encoder/vp9_ratectrl.h +++ b/vp9/encoder/vp9_ratectrl.h @@ -35,6 +35,8 @@ extern "C" { #define FIXED_GF_INTERVAL 8 // Used in some testing modes only #define ONEHALFONLY_RESIZE 0 +#define FRAME_OVERHEAD_BITS 200 + typedef enum { INTER_NORMAL = 0, INTER_HIGH = 1,