diff options
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_firstpass.c | 111 | ||||
-rw-r--r-- | vp9/encoder/vp9_picklpf.c | 12 |
2 files changed, 66 insertions, 57 deletions
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index efa320f3f..43ae7c1f4 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -1417,6 +1417,58 @@ void define_fixed_arf_period(VP9_COMP *cpi) { } #endif +// Calculate a section intra ratio used in setting max loop filter. +static void calculate_section_intra_ratio(struct twopass_rc *twopass, + const FIRSTPASS_STATS *start_pos, + int section_length) { + FIRSTPASS_STATS next_frame = { 0 }; + FIRSTPASS_STATS sectionstats = { 0 }; + int i; + + reset_fpf_position(twopass, start_pos); + + for (i = 0; i < section_length; ++i) { + input_stats(twopass, &next_frame); + accumulate_stats(§ionstats, &next_frame); + } + + avg_stats(§ionstats); + + twopass->section_intra_rating = + (int)(sectionstats.intra_error / + DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); + + reset_fpf_position(twopass, start_pos); +} + +// 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) { + const RATE_CONTROL *const rc = &cpi->rc; + const struct twopass_rc *const twopass = &cpi->twopass; + const int max_bits = frame_max_bits(rc, &cpi->oxcf); + int64_t total_group_bits; + + // Calculate the bits to be allocated to the group as a whole. + if ((twopass->kf_group_bits > 0) && (twopass->kf_group_error_left > 0)) { + total_group_bits = (int64_t)(twopass->kf_group_bits * + (gf_group_err / twopass->kf_group_error_left)); + } else { + total_group_bits = 0; + } + + // Clamp odd edge cases. + total_group_bits = (total_group_bits < 0) ? + 0 : (total_group_bits > twopass->kf_group_bits) ? + twopass->kf_group_bits : total_group_bits; + + // Clip based on user supplied data rate variability limit. + 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; +} + // Analyse and define a gf/arf group. static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { RATE_CONTROL *const rc = &cpi->rc; @@ -1442,8 +1494,6 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { double mv_in_out_accumulator = 0.0; double abs_mv_in_out_accumulator = 0.0; double mv_ratio_accumulator_thresh; - // Max bits for a single frame. - const int max_bits = frame_max_bits(rc, oxcf); unsigned int allow_alt_ref = oxcf->play_alternate && oxcf->lag_in_frames; int f_boost = 0; @@ -1658,21 +1708,8 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { #endif #endif - // Calculate the bits to be allocated to the group as a whole. - if (twopass->kf_group_bits > 0 && twopass->kf_group_error_left > 0) { - twopass->gf_group_bits = (int64_t)(twopass->kf_group_bits * - (gf_group_err / twopass->kf_group_error_left)); - } else { - twopass->gf_group_bits = 0; - } - twopass->gf_group_bits = (twopass->gf_group_bits < 0) ? - 0 : (twopass->gf_group_bits > twopass->kf_group_bits) ? - twopass->kf_group_bits : twopass->gf_group_bits; - - // Clip cpi->twopass.gf_group_bits based on user supplied data rate - // variability limit, cpi->oxcf.two_pass_vbrmax_section. - if (twopass->gf_group_bits > (int64_t)max_bits * rc->baseline_gf_interval) - twopass->gf_group_bits = (int64_t)max_bits * rc->baseline_gf_interval; + // Calculate the bits to be allocated to the gf/arf group as a whole + twopass->gf_group_bits = calculate_total_gf_group_bits(cpi, gf_group_err); // Reset the file position. reset_fpf_position(twopass, start_pos); @@ -1782,24 +1819,9 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { } } + // Calculate a section intra ratio used in setting max loop filter. if (cpi->common.frame_type != KEY_FRAME) { - FIRSTPASS_STATS sectionstats; - - zero_stats(§ionstats); - reset_fpf_position(twopass, start_pos); - - for (i = 0; i < rc->baseline_gf_interval; ++i) { - input_stats(twopass, &next_frame); - accumulate_stats(§ionstats, &next_frame); - } - - avg_stats(§ionstats); - - twopass->section_intra_rating = (int) - (sectionstats.intra_error / - DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); - - reset_fpf_position(twopass, start_pos); + calculate_section_intra_ratio(twopass, start_pos, rc->baseline_gf_interval); } } @@ -2095,25 +2117,8 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { } } - { - FIRSTPASS_STATS sectionstats; - - zero_stats(§ionstats); - reset_fpf_position(twopass, start_position); - - for (i = 0; i < rc->frames_to_key; ++i) { - input_stats(twopass, &next_frame); - accumulate_stats(§ionstats, &next_frame); - } - - avg_stats(§ionstats); - - twopass->section_intra_rating = (int) (sectionstats.intra_error / - DOUBLE_DIVIDE_CHECK(sectionstats.coded_error)); - } - - // Reset the first pass file position. - reset_fpf_position(twopass, start_position); + // Calculate a section intra ratio used in setting max loop filter. + calculate_section_intra_ratio(twopass, start_position, rc->frames_to_key); // Work out how many bits to allocate for the key frame itself. if (1) { diff --git a/vp9/encoder/vp9_picklpf.c b/vp9/encoder/vp9_picklpf.c index 7c42bb84f..a4b280c53 100644 --- a/vp9/encoder/vp9_picklpf.c +++ b/vp9/encoder/vp9_picklpf.c @@ -24,8 +24,12 @@ #include "vp9/encoder/vp9_quantize.h" static int get_max_filter_level(const VP9_COMP *cpi) { - return cpi->twopass.section_intra_rating > 8 ? MAX_LOOP_FILTER * 3 / 4 - : MAX_LOOP_FILTER; + if (cpi->pass == 2) { + return cpi->twopass.section_intra_rating > 8 ? MAX_LOOP_FILTER * 3 / 4 + : MAX_LOOP_FILTER; + } else { + return MAX_LOOP_FILTER; + } } @@ -77,8 +81,8 @@ static int search_filter_level(const YV12_BUFFER_CONFIG *sd, VP9_COMP *cpi, // Bias against raising loop filter in favor of lowering it. int bias = (best_err >> (15 - (filt_mid / 8))) * filter_step; - if (cpi->twopass.section_intra_rating < 20) - bias = bias * cpi->twopass.section_intra_rating / 20; + if ((cpi->pass == 2) && (cpi->twopass.section_intra_rating < 20)) + bias = (bias * cpi->twopass.section_intra_rating) / 20; // yx, bias less for large block size if (cm->tx_mode != ONLY_4X4) |