Skip to content

Commit

Permalink
Revert "Fix calculations in GF only group case"
Browse files Browse the repository at this point in the history
This reverts commit c87ff4a.

Reason for revert: causes division by zero

Original change's description:
> Fix calculations in GF only group case
> 
> - Fix the number of frames considered in calculation of
>   twopass active worst quality. For GF only group, frames
>   considered should be one less than baseline gf interval
>   accounting for the golden frame.
> - Fix in calculation of normal_frames. As baseline gf
>   interval includes the golden frame, the number of
>   normal frames should be one less than baseline gf
>   interval.
> 
> Change-Id: I6c0cd0a39db23586fc390a6fba5d7aebc0dfce08

Change-Id: I522da652587ae7ca4177f6d4bb9f72abcff35637
  • Loading branch information
jzern committed May 25, 2019
1 parent c87ff4a commit b4dcfed
Showing 1 changed file with 17 additions and 22 deletions.
39 changes: 17 additions & 22 deletions vp9/encoder/vp9_firstpass.c
Original file line number Diff line number Diff line change
Expand Up @@ -2048,15 +2048,10 @@ static int calculate_section_intra_ratio(const FIRSTPASS_STATS *begin,
// Calculate the total bits to allocate in this GF/ARF group.
static int64_t calculate_total_gf_group_bits(VP9_COMP *cpi,
double gf_group_err) {
VP9_COMMON *const cm = &cpi->common;
const RATE_CONTROL *const rc = &cpi->rc;
const TWO_PASS *const twopass = &cpi->twopass;
const int max_bits = frame_max_bits(rc, &cpi->oxcf);
int64_t total_group_bits;
const int is_key_frame = frame_is_intra_only(cm);
const int arf_active_or_kf = is_key_frame || rc->source_alt_ref_active;
int gop_frames =
rc->baseline_gf_interval + rc->source_alt_ref_pending - arf_active_or_kf;

// Calculate the bits to be allocated to the group as a whole.
if ((twopass->kf_group_bits > 0) && (twopass->kf_group_error_left > 0.0)) {
Expand All @@ -2074,8 +2069,8 @@ static int64_t calculate_total_gf_group_bits(VP9_COMP *cpi,
: total_group_bits;

// Clip based on user supplied data rate variability limit.
if (total_group_bits > (int64_t)max_bits * gop_frames)
total_group_bits = (int64_t)max_bits * gop_frames;
if (total_group_bits > (int64_t)max_bits * rc->baseline_gf_interval)
total_group_bits = (int64_t)max_bits * rc->baseline_gf_interval;

return total_group_bits;
}
Expand Down Expand Up @@ -2295,7 +2290,7 @@ static void allocate_gf_group_bits(VP9_COMP *cpi, int64_t gf_group_bits,
// Define middle frame
mid_frame_idx = frame_index + (rc->baseline_gf_interval >> 1) - 1;

normal_frames = (rc->baseline_gf_interval - 1);
normal_frames = (rc->baseline_gf_interval - rc->source_alt_ref_pending);
if (normal_frames > 1)
normal_frame_bits = (int)(total_group_bits / normal_frames);
else
Expand Down Expand Up @@ -2457,7 +2452,6 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
const int arf_active_or_kf = is_key_frame || rc->source_alt_ref_active;

double gop_intra_factor = 1.0;
int gop_frames;

// Reset the GF group data structures unless this is a key
// frame in which case it will already have been done.
Expand Down Expand Up @@ -2670,24 +2664,25 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
// Calculate the bits to be allocated to the gf/arf group as a whole
gf_group_bits = calculate_total_gf_group_bits(cpi, gf_group_err);

gop_frames =
rc->baseline_gf_interval + rc->source_alt_ref_pending - arf_active_or_kf;

// Store the average moise level measured for the group
twopass->gf_group.group_noise_energy = (int)(gf_group_noise / gop_frames);
twopass->gf_group.group_noise_energy =
(int)(gf_group_noise / rc->baseline_gf_interval);

// Calculate an estimate of the maxq needed for the group.
// We are more aggressive about correcting for sections
// where there could be significant overshoot than for easier
// sections where we do not wish to risk creating an overshoot
// of the allocated bit budget.
if ((cpi->oxcf.rc_mode != VPX_Q) && (rc->baseline_gf_interval > 1)) {
const int vbr_group_bits_per_frame = (int)(gf_group_bits / gop_frames);
const double group_av_err = gf_group_raw_error / gop_frames;
const double group_av_noise = gf_group_noise / gop_frames;
const double group_av_skip_pct = gf_group_skip_pct / gop_frames;
const double group_av_inactive_zone = ((gf_group_inactive_zone_rows * 2) /
(gop_frames * (double)cm->mb_rows));
const int vbr_group_bits_per_frame =
(int)(gf_group_bits / rc->baseline_gf_interval);
const double group_av_err = gf_group_raw_error / rc->baseline_gf_interval;
const double group_av_noise = gf_group_noise / rc->baseline_gf_interval;
const double group_av_skip_pct =
gf_group_skip_pct / rc->baseline_gf_interval;
const double group_av_inactive_zone =
((gf_group_inactive_zone_rows * 2) /
(rc->baseline_gf_interval * (double)cm->mb_rows));
int tmp_q = get_twopass_worst_quality(
cpi, group_av_err, (group_av_skip_pct + group_av_inactive_zone),
group_av_noise, vbr_group_bits_per_frame);
Expand All @@ -2703,9 +2698,9 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {

// Context Adjustment of ARNR filter strength
if (rc->baseline_gf_interval > 1) {
adjust_group_arnr_filter(cpi, (gf_group_noise / gop_frames),
(gf_group_inter / gop_frames),
(gf_group_motion / gop_frames));
adjust_group_arnr_filter(cpi, (gf_group_noise / rc->baseline_gf_interval),
(gf_group_inter / rc->baseline_gf_interval),
(gf_group_motion / rc->baseline_gf_interval));
} else {
twopass->arnr_strength_adjustment = 0;
}
Expand Down

0 comments on commit b4dcfed

Please sign in to comment.