Commit 762c0f22 authored by Paul Wilkins's avatar Paul Wilkins

Bug in clamping of base_frame_target.

Bug relating to issue:- http://b/25090786

base_frame_target is supposed to track the idealized bit
allocation based on error score and not the actual bits
allocated to each frame.

The clamping of this value based on the VBR min and max pct values
was causing a bug where in some cases the loop that adjusts the
active max quantizer for each GF group was running out of bits at
the end of a KF group. This caused a spike in Q and some ugly artifacts.

A second change makes sure that the calculation of the active
Q range for a group DOES, however, take account of clamping.

Change-Id: I31035e97d18853530b0874b433c1da7703f607d1
parent 56cfbeef
...@@ -1183,10 +1183,13 @@ static int get_twopass_worst_quality(const VP9_COMP *cpi, ...@@ -1183,10 +1183,13 @@ static int get_twopass_worst_quality(const VP9_COMP *cpi,
double group_weight_factor) { double group_weight_factor) {
const RATE_CONTROL *const rc = &cpi->rc; const RATE_CONTROL *const rc = &cpi->rc;
const VP9EncoderConfig *const oxcf = &cpi->oxcf; const VP9EncoderConfig *const oxcf = &cpi->oxcf;
// Clamp the target rate to VBR min / max limts.
const int target_rate =
vp9_rc_clamp_pframe_target_size(cpi, section_target_bandwidth);
inactive_zone = fclamp(inactive_zone, 0.0, 1.0); inactive_zone = fclamp(inactive_zone, 0.0, 1.0);
if (section_target_bandwidth <= 0) { if (target_rate <= 0) {
return rc->worst_quality; // Highest value allowed return rc->worst_quality; // Highest value allowed
} else { } else {
const int num_mbs = (cpi->oxcf.resize_mode != RESIZE_NONE) const int num_mbs = (cpi->oxcf.resize_mode != RESIZE_NONE)
...@@ -1195,7 +1198,7 @@ static int get_twopass_worst_quality(const VP9_COMP *cpi, ...@@ -1195,7 +1198,7 @@ static int get_twopass_worst_quality(const VP9_COMP *cpi,
const double av_err_per_mb = section_err / active_mbs; const double av_err_per_mb = section_err / active_mbs;
const double speed_term = 1.0 + 0.04 * oxcf->speed; const double speed_term = 1.0 + 0.04 * oxcf->speed;
const double ediv_size_correction = (double)num_mbs / EDIV_SIZE_FACTOR; const double ediv_size_correction = (double)num_mbs / EDIV_SIZE_FACTOR;
const int target_norm_bits_per_mb = ((uint64_t)section_target_bandwidth << const int target_norm_bits_per_mb = ((uint64_t)target_rate <<
BPER_MB_NORMBITS) / active_mbs; BPER_MB_NORMBITS) / active_mbs;
int q; int q;
...@@ -2737,11 +2740,6 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { ...@@ -2737,11 +2740,6 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) {
} }
target_rate = gf_group->bit_allocation[gf_group->index]; target_rate = gf_group->bit_allocation[gf_group->index];
if (cpi->common.frame_type == KEY_FRAME)
target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate);
else
target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate);
rc->base_frame_target = target_rate; rc->base_frame_target = target_rate;
{ {
......
...@@ -1816,6 +1816,11 @@ void vp9_set_target_rate(VP9_COMP *cpi) { ...@@ -1816,6 +1816,11 @@ void vp9_set_target_rate(VP9_COMP *cpi) {
RATE_CONTROL *const rc = &cpi->rc; RATE_CONTROL *const rc = &cpi->rc;
int target_rate = rc->base_frame_target; int target_rate = rc->base_frame_target;
if (cpi->common.frame_type == KEY_FRAME)
target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate);
else
target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate);
// Correction to rate target based on prior over or under shoot. // Correction to rate target based on prior over or under shoot.
if (cpi->oxcf.rc_mode == VPX_VBR || cpi->oxcf.rc_mode == VPX_CQ) if (cpi->oxcf.rc_mode == VPX_VBR || cpi->oxcf.rc_mode == VPX_CQ)
vbr_rate_correction(cpi, &target_rate); vbr_rate_correction(cpi, &target_rate);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment