diff options
Diffstat (limited to 'vp9/encoder/vp9_firstpass.c')
-rw-r--r-- | vp9/encoder/vp9_firstpass.c | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 053552d9c..366aeb193 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -1134,7 +1134,38 @@ static int get_twopass_worst_quality(const VP9_COMP *cpi, } } -extern void vp9_new_framerate(VP9_COMP *cpi, double framerate); +static void setup_rf_level_maxq(VP9_COMP *cpi) { + int i; + RATE_CONTROL *const rc = &cpi->rc; + for (i = INTER_NORMAL; i < RATE_FACTOR_LEVELS; ++i) { + int qdelta = vp9_frame_type_qdelta(cpi, i, rc->worst_quality); + rc->rf_level_maxq[i] = MAX(rc->worst_quality + qdelta, rc->best_quality); + } +} + +void vp9_init_subsampling(VP9_COMP *cpi) { + const VP9_COMMON *const cm = &cpi->common; + RATE_CONTROL *const rc = &cpi->rc; + const int w = cm->width; + const int h = cm->height; + int i; + + for (i = 0; i < FRAME_SCALE_STEPS; ++i) { + // Note: Frames with odd-sized dimensions may result from this scaling. + rc->frame_width[i] = (w * 16) / frame_scale_factor[i]; + rc->frame_height[i] = (h * 16) / frame_scale_factor[i]; + } + + setup_rf_level_maxq(cpi); +} + +void calculate_coded_size(VP9_COMP *cpi, + int *scaled_frame_width, + int *scaled_frame_height) { + RATE_CONTROL *const rc = &cpi->rc; + *scaled_frame_width = rc->frame_width[rc->frame_size_selector]; + *scaled_frame_height = rc->frame_height[rc->frame_size_selector]; +} void vp9_init_second_pass(VP9_COMP *cpi) { SVC *const svc = &cpi->svc; @@ -1204,6 +1235,10 @@ void vp9_init_second_pass(VP9_COMP *cpi) { // Static sequence monitor variables. twopass->kf_zeromotion_pct = 100; twopass->last_kfgroup_zeromotion_pct = 100; + + if (oxcf->resize_mode != RESIZE_NONE) { + vp9_init_subsampling(cpi); + } } #define SR_DIFF_PART 0.0015 @@ -1696,8 +1731,9 @@ static void allocate_gf_group_bits(VP9_COMP *cpi, int64_t gf_group_bits, // Analyse and define a gf/arf group. static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { + VP9_COMMON *const cm = &cpi->common; RATE_CONTROL *const rc = &cpi->rc; - const VP9EncoderConfig *const oxcf = &cpi->oxcf; + VP9EncoderConfig *const oxcf = &cpi->oxcf; TWO_PASS *const twopass = &cpi->twopass; FIRSTPASS_STATS next_frame; const FIRSTPASS_STATS *const start_pos = twopass->stats_in; @@ -1733,10 +1769,11 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { int64_t gf_group_bits; double gf_group_error_left; int gf_arf_bits; + int is_key_frame = frame_is_intra_only(cm); // Reset the GF group data structures unless this is a key // frame in which case it will already have been done. - if (cpi->common.frame_type != KEY_FRAME) { + if (is_key_frame == 0) { vp9_zero(twopass->gf_group); } @@ -1752,7 +1789,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { // If this is a key frame or the overlay from a previous arf then // the error score / cost of this frame has already been accounted for. - if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) { + if (is_key_frame || rc->source_alt_ref_active) { gf_group_err -= gf_first_frame_err; #if GROUP_ADAPTIVE_MAXQ gf_group_raw_error -= this_frame->coded_error; @@ -1864,7 +1901,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { rc->constrained_gf_group = (i >= rc->frames_to_key) ? 1 : 0; // Set the interval until the next gf. - if (cpi->common.frame_type == KEY_FRAME || rc->source_alt_ref_active) + if (is_key_frame || rc->source_alt_ref_active) rc->baseline_gf_interval = i - 1; else rc->baseline_gf_interval = i; @@ -1927,9 +1964,9 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { get_twopass_worst_quality(cpi, group_av_err, vbr_group_bits_per_frame, twopass->kfgroup_inter_fraction); - if (tmp_q < twopass->baseline_worst_quality) { + if (tmp_q < twopass->baseline_active_worst_quality) { twopass->active_worst_quality = - (tmp_q + twopass->baseline_worst_quality + 1) / 2; + (tmp_q + twopass->baseline_active_worst_quality + 1) / 2; } else { twopass->active_worst_quality = tmp_q; } @@ -1951,7 +1988,7 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { // also a key frame in which case it has already been accounted for. if (rc->source_alt_ref_pending) { gf_group_error_left = gf_group_err - mod_frame_err; - } else if (cpi->common.frame_type != KEY_FRAME) { + } else if (is_key_frame == 0) { gf_group_error_left = gf_group_err - gf_first_frame_err; } else { gf_group_error_left = gf_group_err; @@ -1969,6 +2006,11 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { calculate_section_intra_ratio(start_pos, twopass->stats_in_end, rc->baseline_gf_interval); } + + if (oxcf->resize_mode == RESIZE_DYNAMIC) { + // Default to starting GF groups at normal frame size. + cpi->rc.next_frame_size_selector = UNSCALED; + } } // TODO(PGW) Re-examine the use of II ration in this code in the light of# @@ -2293,6 +2335,11 @@ static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { // The count of bits left is adjusted elsewhere based on real coded frame // sizes. twopass->modified_error_left -= kf_group_err; + + if (oxcf->resize_mode == RESIZE_DYNAMIC) { + // Default to normal-sized frame on keyframes. + cpi->rc.next_frame_size_selector = UNSCALED; + } } // Define the reference buffers that will be updated post encode. @@ -2433,7 +2480,7 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { section_target_bandwidth, DEFAULT_GRP_WEIGHT); twopass->active_worst_quality = tmp_q; - twopass->baseline_worst_quality = tmp_q; + twopass->baseline_active_worst_quality = tmp_q; rc->ni_av_qi = tmp_q; rc->last_q[INTER_FRAME] = tmp_q; rc->avg_q = vp9_convert_qindex_to_q(tmp_q, cm->bit_depth); |