diff options
Diffstat (limited to 'third_party/aom/av1/encoder/firstpass.c')
-rw-r--r-- | third_party/aom/av1/encoder/firstpass.c | 524 |
1 files changed, 113 insertions, 411 deletions
diff --git a/third_party/aom/av1/encoder/firstpass.c b/third_party/aom/av1/encoder/firstpass.c index 2a42008879..113c068c19 100644 --- a/third_party/aom/av1/encoder/firstpass.c +++ b/third_party/aom/av1/encoder/firstpass.c @@ -13,8 +13,8 @@ #include <math.h> #include <stdio.h> -#include "./aom_dsp_rtcd.h" -#include "./aom_scale_rtcd.h" +#include "config/aom_dsp_rtcd.h" +#include "config/aom_scale_rtcd.h" #include "aom_dsp/aom_dsp_common.h" #include "aom_mem/aom_mem.h" @@ -27,9 +27,7 @@ #include "av1/common/entropymv.h" #include "av1/common/quant_common.h" #include "av1/common/reconinter.h" // av1_setup_dst_planes() -#if CONFIG_LV_MAP #include "av1/common/txb_common.h" -#endif #include "av1/encoder/aq_variance.h" #include "av1/encoder/av1_quantize.h" #include "av1/encoder/block.h" @@ -41,6 +39,7 @@ #include "av1/encoder/firstpass.h" #include "av1/encoder/mcomp.h" #include "av1/encoder/rd.h" +#include "av1/encoder/dwt.h" #define OUTPUT_FPF 0 #define ARF_STATS_OUTPUT 0 @@ -143,6 +142,7 @@ static void zero_stats(FIRSTPASS_STATS *section) { section->frame = 0.0; section->weight = 0.0; section->intra_error = 0.0; + section->frame_avg_wavelet_energy = 0.0; section->coded_error = 0.0; section->sr_coded_error = 0.0; section->pcnt_inter = 0.0; @@ -169,6 +169,7 @@ static void accumulate_stats(FIRSTPASS_STATS *section, section->frame += frame->frame; section->weight += frame->weight; section->intra_error += frame->intra_error; + section->frame_avg_wavelet_energy += frame->frame_avg_wavelet_energy; section->coded_error += frame->coded_error; section->sr_coded_error += frame->sr_coded_error; section->pcnt_inter += frame->pcnt_inter; @@ -195,6 +196,7 @@ static void subtract_stats(FIRSTPASS_STATS *section, section->frame -= frame->frame; section->weight -= frame->weight; section->intra_error -= frame->intra_error; + section->frame_avg_wavelet_energy -= frame->frame_avg_wavelet_energy; section->coded_error -= frame->coded_error; section->sr_coded_error -= frame->sr_coded_error; section->pcnt_inter -= frame->pcnt_inter; @@ -305,7 +307,6 @@ static unsigned int get_prediction_error(BLOCK_SIZE bsize, return sse; } -#if CONFIG_HIGHBITDEPTH static aom_variance_fn_t highbd_get_block_variance_fn(BLOCK_SIZE bsize, int bd) { switch (bd) { @@ -345,7 +346,6 @@ static unsigned int highbd_get_prediction_error(BLOCK_SIZE bsize, fn(src->buf, src->stride, ref->buf, ref->stride, &sse); return sse; } -#endif // CONFIG_HIGHBITDEPTH // Refine the motion search range according to the frame dimension // for first pass test. @@ -361,10 +361,10 @@ static void first_pass_motion_search(AV1_COMP *cpi, MACROBLOCK *x, const MV *ref_mv, MV *best_mv, int *best_motion_err) { MACROBLOCKD *const xd = &x->e_mbd; - MV tmp_mv = { 0, 0 }; + MV tmp_mv = kZeroMv; MV ref_mv_full = { ref_mv->row >> 3, ref_mv->col >> 3 }; int num00, tmp_err, n; - const BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type; + const BLOCK_SIZE bsize = xd->mi[0]->sb_type; aom_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[bsize]; const int new_mv_mode_penalty = NEW_MV_MODE_PENALTY; @@ -376,11 +376,9 @@ static void first_pass_motion_search(AV1_COMP *cpi, MACROBLOCK *x, // Override the default variance function to use MSE. v_fn_ptr.vf = get_block_variance_fn(bsize); -#if CONFIG_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { v_fn_ptr.vf = highbd_get_block_variance_fn(bsize, xd->bd); } -#endif // CONFIG_HIGHBITDEPTH // Center the initial step/diamond search on best mv. tmp_err = cpi->diamond_search_sad(x, &cpi->ss_cfg, &ref_mv_full, &tmp_mv, @@ -459,7 +457,6 @@ static void set_first_pass_params(AV1_COMP *cpi) { cpi->rc.frames_to_key = INT_MAX; } -#if CONFIG_EXT_REFS static double raw_motion_error_stdev(int *raw_motion_err_list, int raw_motion_err_counts) { int64_t sum_raw_err = 0; @@ -482,7 +479,6 @@ static double raw_motion_error_stdev(int *raw_motion_err_list, raw_err_stdev = sqrt(raw_err_stdev / raw_motion_err_counts); return raw_err_stdev; } -#endif // CONFIG_EXT_REFS #define UL_INTRA_THRESH 50 #define INVALID_ROW -1 @@ -490,6 +486,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { int mb_row, mb_col; MACROBLOCK *const x = &cpi->td.mb; AV1_COMMON *const cm = &cpi->common; + const int num_planes = av1_num_planes(cm); MACROBLOCKD *const xd = &x->e_mbd; TileInfo tile; struct macroblock_plane *const p = x->plane; @@ -500,6 +497,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { int recon_yoffset, recon_uvoffset; int64_t intra_error = 0; + int64_t frame_avg_wavelet_energy = 0; int64_t coded_error = 0; int64_t sr_coded_error = 0; @@ -515,9 +513,8 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { int image_data_start_row = INVALID_ROW; int new_mv_count = 0; int sum_in_vectors = 0; - MV lastmv = { 0, 0 }; + MV lastmv = kZeroMv; TWO_PASS *twopass = &cpi->twopass; - const MV zero_mv = { 0, 0 }; int recon_y_stride, recon_uv_stride, uv_mb_height; YV12_BUFFER_CONFIG *const lst_yv12 = get_ref_frame_buffer(cpi, LAST_FRAME); @@ -529,18 +526,12 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { BufferPool *const pool = cm->buffer_pool; const int qindex = find_fp_qindex(cm->bit_depth); const int mb_scale = mi_size_wide[BLOCK_16X16]; -#if CONFIG_PVQ - PVQ_QUEUE pvq_q; - od_adapt_ctx pvq_context; -#endif -#if CONFIG_EXT_REFS int *raw_motion_err_list; int raw_motion_err_counts = 0; CHECK_MEM_ERROR( cm, raw_motion_err_list, aom_calloc(cm->mb_rows * cm->mb_cols, sizeof(*raw_motion_err_list))); -#endif // CONFIG_EXT_REFS // First pass code requires valid last and new frame buffers. assert(new_yv12 != NULL); assert(frame_is_intra_only(cm) || (lst_yv12 != NULL)); @@ -555,7 +546,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { xd->mi = cm->mi_grid_visible; xd->mi[0] = cm->mi; - x->e_mbd.mi[0]->mbmi.sb_type = BLOCK_16X16; + x->e_mbd.mi[0]->sb_type = BLOCK_16X16; intra_factor = 0.0; brightness_factor = 0.0; @@ -564,80 +555,34 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { set_first_pass_params(cpi); av1_set_quantizer(cm, qindex); - av1_setup_block_planes(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); + av1_setup_block_planes(&x->e_mbd, cm->subsampling_x, cm->subsampling_y, + num_planes); - av1_setup_src_planes(x, cpi->source, 0, 0); - av1_setup_dst_planes(xd->plane, cm->sb_size, new_yv12, 0, 0); + av1_setup_src_planes(x, cpi->source, 0, 0, num_planes); + av1_setup_dst_planes(xd->plane, cm->seq_params.sb_size, new_yv12, 0, 0, 0, + num_planes); if (!frame_is_intra_only(cm)) { - av1_setup_pre_planes(xd, 0, first_ref_buf, 0, 0, NULL); + av1_setup_pre_planes(xd, 0, first_ref_buf, 0, 0, NULL, num_planes); } xd->mi = cm->mi_grid_visible; xd->mi[0] = cm->mi; -#if CONFIG_CFL // Don't store luma on the fist pass since chroma is not computed - xd->cfl->store_y = 0; -#endif // CONFIG_CFL + xd->cfl.store_y = 0; av1_frame_init_quantizer(cpi); -#if CONFIG_PVQ - // For pass 1 of 2-pass encoding, init here for PVQ for now. - { - pvq_q.buf_len = 5000; - CHECK_MEM_ERROR(cm, pvq_q.buf, - aom_malloc(pvq_q.buf_len * sizeof(PVQ_INFO))); - pvq_q.curr_pos = 0; - x->pvq_coded = 0; - - x->pvq_q = &pvq_q; - - // TODO(yushin): Since this init step is also called in 2nd pass, - // or 1-pass encoding, consider factoring out it as a function. - // TODO(yushin) - // If activity masking is enabled, change below to OD_HVS_QM - x->daala_enc.qm = OD_FLAT_QM; // Hard coded. Enc/dec required to sync. - x->daala_enc.pvq_norm_lambda = OD_PVQ_LAMBDA; - x->daala_enc.pvq_norm_lambda_dc = OD_PVQ_LAMBDA; - - od_init_qm(x->daala_enc.state.qm, x->daala_enc.state.qm_inv, - x->daala_enc.qm == OD_HVS_QM ? OD_QM8_Q4_HVS : OD_QM8_Q4_FLAT); -#if !CONFIG_ANS - od_ec_enc_init(&x->daala_enc.w.ec, 65025); - od_ec_enc_reset(&x->daala_enc.w.ec); -#else -#error "CONFIG_PVQ currently requires !CONFIG_ANS." -#endif - } -#endif - - for (i = 0; i < MAX_MB_PLANE; ++i) { + for (i = 0; i < num_planes; ++i) { p[i].coeff = ctx->coeff[i]; p[i].qcoeff = ctx->qcoeff[i]; pd[i].dqcoeff = ctx->dqcoeff[i]; -#if CONFIG_PVQ - pd[i].pvq_ref_coeff = ctx->pvq_ref_coeff[i]; -#endif p[i].eobs = ctx->eobs[i]; -#if CONFIG_LV_MAP p[i].txb_entropy_ctx = ctx->txb_entropy_ctx[i]; -#endif } av1_init_mv_probs(cm); -#if CONFIG_LV_MAP av1_init_lv_map(cm); -#endif -#if CONFIG_ADAPT_SCAN - av1_init_scan_order(cm); - av1_deliver_eob_threshold(cm, xd); -#endif - av1_convolve_init(cm); -#if CONFIG_PVQ - od_adapt_ctx_reset(&pvq_context, 0); - x->daala_enc.state.adapt = &pvq_context; -#endif // CONFIG_PVQ av1_initialize_rd_consts(cpi); // Tiling is ignored in the first pass. @@ -648,7 +593,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { uv_mb_height = 16 >> (new_yv12->y_height > new_yv12->uv_height); for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) { - MV best_ref_mv = { 0, 0 }; + MV best_ref_mv = kZeroMv; // Reset above block coeffs. xd->up_available = (mb_row != 0); @@ -674,31 +619,28 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { aom_clear_system_state(); + const int idx_str = xd->mi_stride * mb_row * mb_scale + mb_col * mb_scale; + xd->mi = cm->mi_grid_visible + idx_str; + xd->mi[0] = cm->mi + idx_str; xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset; xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset; xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset; xd->left_available = (mb_col != 0); - xd->mi[0]->mbmi.sb_type = bsize; - xd->mi[0]->mbmi.ref_frame[0] = INTRA_FRAME; + xd->mi[0]->sb_type = bsize; + xd->mi[0]->ref_frame[0] = INTRA_FRAME; set_mi_row_col(xd, &tile, mb_row * mb_scale, mi_size_high[bsize], - mb_col * mb_scale, mi_size_wide[bsize], -#if CONFIG_DEPENDENT_HORZTILES - cm->dependent_horz_tiles, -#endif // CONFIG_DEPENDENT_HORZTILES - cm->mi_rows, cm->mi_cols); + mb_col * mb_scale, mi_size_wide[bsize], cm->mi_rows, + cm->mi_cols); - set_plane_n4(xd, mi_size_wide[bsize], mi_size_high[bsize]); + set_plane_n4(xd, mi_size_wide[bsize], mi_size_high[bsize], num_planes); // Do intra 16x16 prediction. - xd->mi[0]->mbmi.segment_id = 0; -#if CONFIG_SUPERTX - xd->mi[0]->mbmi.segment_id_supertx = 0; -#endif // CONFIG_SUPERTX - xd->lossless[xd->mi[0]->mbmi.segment_id] = (qindex == 0); - xd->mi[0]->mbmi.mode = DC_PRED; - xd->mi[0]->mbmi.tx_size = + xd->mi[0]->segment_id = 0; + xd->lossless[xd->mi[0]->segment_id] = (qindex == 0); + xd->mi[0]->mode = DC_PRED; + xd->mi[0]->tx_size = use_dc_pred ? (bsize >= BLOCK_16X16 ? TX_16X16 : TX_8X8) : TX_4X4; - av1_encode_intra_block_plane(cm, x, bsize, 0, 0, mb_row * 2, mb_col * 2); + av1_encode_intra_block_plane(cpi, x, bsize, 0, 0, mb_row * 2, mb_col * 2); this_error = aom_get_mb_ss(x->plane[0].src_diff); // Keep a record of blocks that have almost no intra error residual @@ -712,7 +654,6 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { image_data_start_row = mb_row; } -#if CONFIG_HIGHBITDEPTH if (cm->use_highbitdepth) { switch (cm->bit_depth) { case AOM_BITS_8: break; @@ -725,7 +666,6 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { return; } } -#endif // CONFIG_HIGHBITDEPTH aom_clear_system_state(); log_intra = log(this_error + 1.0); @@ -734,14 +674,10 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { else intra_factor += 1.0; -#if CONFIG_HIGHBITDEPTH if (cm->use_highbitdepth) level_sample = CONVERT_TO_SHORTPTR(x->plane[0].src.buf)[0]; else level_sample = x->plane[0].src.buf[0]; -#else - level_sample = x->plane[0].src.buf[0]; -#endif if ((level_sample < DARK_THRESH) && (log_intra < 9.0)) brightness_factor += 1.0 + (0.01 * (DARK_THRESH - level_sample)); else @@ -759,6 +695,15 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { // Accumulate the intra error. intra_error += (int64_t)this_error; + int stride = x->plane[0].src.stride; + uint8_t *buf = x->plane[0].src.buf; + for (int r8 = 0; r8 < 2; ++r8) + for (int c8 = 0; c8 < 2; ++c8) { + int hbd = xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH; + frame_avg_wavelet_energy += av1_haar_ac_sad_8x8_uint8_input( + buf + c8 * 8 + r8 * 8 * stride, stride, hbd); + } + #if CONFIG_FP_MB_STATS if (cpi->use_fp_mb_stats) { // initialization @@ -775,11 +720,10 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { if (!frame_is_intra_only(cm)) { // Do a motion search int tmp_err, motion_error, raw_motion_error; // Assume 0,0 motion with no mv overhead. - MV mv = { 0, 0 }, tmp_mv = { 0, 0 }; + MV mv = kZeroMv, tmp_mv = kZeroMv; struct buf_2d unscaled_last_source_buf_2d; xd->plane[0].pre[0].buf = first_ref_buf->y_buffer + recon_yoffset; -#if CONFIG_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { motion_error = highbd_get_prediction_error( bsize, &x->plane[0].src, &xd->plane[0].pre[0], xd->bd); @@ -787,10 +731,6 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { motion_error = get_prediction_error(bsize, &x->plane[0].src, &xd->plane[0].pre[0]); } -#else - motion_error = - get_prediction_error(bsize, &x->plane[0].src, &xd->plane[0].pre[0]); -#endif // CONFIG_HIGHBITDEPTH // Compute the motion error of the 0,0 motion using the last source // frame as the reference. Skip the further motion search on @@ -799,7 +739,6 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { cpi->unscaled_last_source->y_buffer + recon_yoffset; unscaled_last_source_buf_2d.stride = cpi->unscaled_last_source->y_stride; -#if CONFIG_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { raw_motion_error = highbd_get_prediction_error( bsize, &x->plane[0].src, &unscaled_last_source_buf_2d, xd->bd); @@ -807,10 +746,6 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { raw_motion_error = get_prediction_error(bsize, &x->plane[0].src, &unscaled_last_source_buf_2d); } -#else - raw_motion_error = get_prediction_error(bsize, &x->plane[0].src, - &unscaled_last_source_buf_2d); -#endif // CONFIG_HIGHBITDEPTH // TODO(pengchong): Replace the hard-coded threshold if (raw_motion_error > 25) { @@ -822,7 +757,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { // 0,0 based search as well. if (!is_zero_mv(&best_ref_mv)) { tmp_err = INT_MAX; - first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv, &tmp_err); + first_pass_motion_search(cpi, x, &kZeroMv, &tmp_mv, &tmp_err); if (tmp_err < motion_error) { motion_error = tmp_err; @@ -836,7 +771,6 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { int gf_motion_error; xd->plane[0].pre[0].buf = gld_yv12->y_buffer + recon_yoffset; -#if CONFIG_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { gf_motion_error = highbd_get_prediction_error( bsize, &x->plane[0].src, &xd->plane[0].pre[0], xd->bd); @@ -844,12 +778,8 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { gf_motion_error = get_prediction_error(bsize, &x->plane[0].src, &xd->plane[0].pre[0]); } -#else - gf_motion_error = get_prediction_error(bsize, &x->plane[0].src, - &xd->plane[0].pre[0]); -#endif // CONFIG_HIGHBITDEPTH - first_pass_motion_search(cpi, x, &zero_mv, &tmp_mv, + first_pass_motion_search(cpi, x, &kZeroMv, &tmp_mv, &gf_motion_error); if (gf_motion_error < motion_error && gf_motion_error < this_error) @@ -913,11 +843,11 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { mv.row *= 8; mv.col *= 8; this_error = motion_error; - xd->mi[0]->mbmi.mode = NEWMV; - xd->mi[0]->mbmi.mv[0].as_mv = mv; - xd->mi[0]->mbmi.tx_size = TX_4X4; - xd->mi[0]->mbmi.ref_frame[0] = LAST_FRAME; - xd->mi[0]->mbmi.ref_frame[1] = NONE_FRAME; + xd->mi[0]->mode = NEWMV; + xd->mi[0]->mv[0].as_mv = mv; + xd->mi[0]->tx_size = TX_4X4; + xd->mi[0]->ref_frame[0] = LAST_FRAME; + xd->mi[0]->ref_frame[1] = NONE_FRAME; av1_build_inter_predictors_sby(cm, xd, mb_row * mb_scale, mb_col * mb_scale, NULL, bsize); av1_encode_sby_pass1(cm, x, bsize); @@ -1006,9 +936,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { } } } -#if CONFIG_EXT_REFS raw_motion_err_list[raw_motion_err_counts++] = raw_motion_error; -#endif // CONFIG_EXT_REFS } else { sr_coded_error += (int64_t)this_error; } @@ -1031,25 +959,9 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { aom_clear_system_state(); } -#if CONFIG_EXT_REFS const double raw_err_stdev = raw_motion_error_stdev(raw_motion_err_list, raw_motion_err_counts); aom_free(raw_motion_err_list); -#endif // CONFIG_EXT_REFS - -#if CONFIG_PVQ -#if !CONFIG_ANS - od_ec_enc_clear(&x->daala_enc.w.ec); -#else -#error "CONFIG_PVQ currently requires !CONFIG_ANS." -#endif - - x->pvq_q->last_pos = x->pvq_q->curr_pos; - x->pvq_q->curr_pos = 0; - x->pvq_q = NULL; - - aom_free(pvq_q.buf); -#endif // Clamp the image start to rows/2. This number of rows is discarded top // and bottom as dead data so rows / 2 means the frame is blank. @@ -1083,6 +995,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { fps.coded_error = (double)(coded_error >> 8) + min_err; fps.sr_coded_error = (double)(sr_coded_error >> 8) + min_err; fps.intra_error = (double)(intra_error >> 8) + min_err; + fps.frame_avg_wavelet_energy = (double)frame_avg_wavelet_energy; fps.count = 1.0; fps.pcnt_inter = (double)intercount / num_mbs; fps.pcnt_second_ref = (double)second_ref_count / num_mbs; @@ -1090,9 +1003,7 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { fps.intra_skip_pct = (double)intra_skip_count / num_mbs; fps.inactive_zone_rows = (double)image_data_start_row; fps.inactive_zone_cols = (double)0; // TODO(paulwilkins): fix -#if CONFIG_EXT_REFS fps.raw_error_stdev = raw_err_stdev; -#endif // CONFIG_EXT_REFS if (mvcount > 0) { fps.MVr = (double)sum_mvr / mvcount; @@ -1144,41 +1055,29 @@ void av1_first_pass(AV1_COMP *cpi, const struct lookahead_entry *source) { ((twopass->this_frame_stats.intra_error / DOUBLE_DIVIDE_CHECK(twopass->this_frame_stats.coded_error)) > 2.0))) { if (gld_yv12 != NULL) { -#if CONFIG_EXT_REFS - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx], - cm->ref_frame_map[cpi->lst_fb_idxes[LAST_FRAME - LAST_FRAME]]); -#else - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx], - cm->ref_frame_map[cpi->lst_fb_idx]); -#endif // CONFIG_EXT_REFS + ref_cnt_fb(pool->frame_bufs, + &cm->ref_frame_map[cpi->ref_fb_idx[GOLDEN_FRAME - 1]], + cm->ref_frame_map[cpi->ref_fb_idx[LAST_FRAME - 1]]); } twopass->sr_update_lag = 1; } else { ++twopass->sr_update_lag; } - aom_extend_frame_borders(new_yv12); + aom_extend_frame_borders(new_yv12, num_planes); -// The frame we just compressed now becomes the last frame. -#if CONFIG_EXT_REFS + // The frame we just compressed now becomes the last frame. ref_cnt_fb(pool->frame_bufs, - &cm->ref_frame_map[cpi->lst_fb_idxes[LAST_FRAME - LAST_FRAME]], - cm->new_fb_idx); -#else - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->lst_fb_idx], + &cm->ref_frame_map[cpi->ref_fb_idx[LAST_FRAME - 1]], cm->new_fb_idx); -#endif // CONFIG_EXT_REFS // Special case for the first frame. Copy into the GF buffer as a second // reference. - if (cm->current_video_frame == 0 && cpi->gld_fb_idx != INVALID_IDX) { -#if CONFIG_EXT_REFS - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx], - cm->ref_frame_map[cpi->lst_fb_idxes[LAST_FRAME - LAST_FRAME]]); -#else - ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx], - cm->ref_frame_map[cpi->lst_fb_idx]); -#endif // CONFIG_EXT_REFS + if (cm->current_video_frame == 0 && + cpi->ref_fb_idx[GOLDEN_FRAME - 1] != INVALID_IDX) { + ref_cnt_fb(pool->frame_bufs, + &cm->ref_frame_map[cpi->ref_fb_idx[GOLDEN_FRAME - 1]], + cm->ref_frame_map[cpi->ref_fb_idx[LAST_FRAME - 1]]); } // Use this to see what the first pass reconstruction looks like. @@ -1234,7 +1133,7 @@ static int get_twopass_worst_quality(const AV1_COMP *cpi, : cpi->common.MBs; const int active_mbs = AOMMAX(1, num_mbs - (int)(num_mbs * inactive_zone)); 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; double ediv_size_correction; const int target_norm_bits_per_mb = (int)((uint64_t)section_target_bandwidth << BPER_MB_NORMBITS) / @@ -1662,21 +1561,6 @@ static int calculate_boost_bits(int frame_count, int boost, 0); } -#if !CONFIG_EXT_REFS -// Current limit on maximum number of active arfs in a GF/ARF group. -#define MAX_ACTIVE_ARFS 2 -#define ARF_SLOT1 2 -#define ARF_SLOT2 3 -// This function indirects the choice of buffers for arfs. -// At the moment the values are fixed but this may change as part of -// the integration process with other codec features that swap buffers around. -static void get_arf_buffer_indices(unsigned char *arf_buffer_indices) { - arf_buffer_indices[0] = ARF_SLOT1; - arf_buffer_indices[1] = ARF_SLOT2; -} -#endif // !CONFIG_EXT_REFS - -#if CONFIG_EXT_REFS #if USE_GF16_MULTI_LAYER // === GF Group of 16 === #define GF_INTERVAL_16 16 @@ -2146,10 +2030,8 @@ static void define_gf_group_structure_16(AV1_COMP *cpi) { gf_group->bidir_pred_enabled[frame_index] = 0; for (int ref_idx = 0; ref_idx < REF_FRAMES; ++ref_idx) gf_group->ref_fb_idx_map[frame_index][ref_idx] = ref_idx; - gf_group->refresh_idx[frame_index] = - cpi->lst_fb_idxes[LAST_FRAME - LAST_FRAME]; - gf_group->refresh_flag[frame_index] = - cpi->lst_fb_idxes[LAST_FRAME - LAST_FRAME]; + gf_group->refresh_idx[frame_index] = cpi->ref_fb_idx[LAST_FRAME - 1]; + gf_group->refresh_flag[frame_index] = cpi->ref_fb_idx[LAST_FRAME - 1]; continue; } @@ -2247,19 +2129,16 @@ static void define_gf_group_structure_16(AV1_COMP *cpi) { } } #endif // USE_GF16_MULTI_LAYER -#endif // CONFIG_EXT_REFS static void define_gf_group_structure(AV1_COMP *cpi) { RATE_CONTROL *const rc = &cpi->rc; -#if CONFIG_EXT_REFS #if USE_GF16_MULTI_LAYER if (rc->baseline_gf_interval == 16) { define_gf_group_structure_16(cpi); return; } #endif // USE_GF16_MULTI_LAYER -#endif // CONFIG_EXT_REFS TWO_PASS *const twopass = &cpi->twopass; GF_GROUP *const gf_group = &twopass->gf_group; @@ -2267,7 +2146,6 @@ static void define_gf_group_structure(AV1_COMP *cpi) { int frame_index = 0; const int key_frame = cpi->common.frame_type == KEY_FRAME; -#if CONFIG_EXT_REFS // The use of bi-predictive frames are only enabled when following 3 // conditions are met: // (1) ALTREF is enabled; @@ -2275,7 +2153,7 @@ static void define_gf_group_structure(AV1_COMP *cpi) { // (3) The bi-predictive group interval is strictly smaller than the // golden group interval. const int is_bipred_enabled = - cpi->bwd_ref_allowed && rc->source_alt_ref_pending && + cpi->extra_arf_allowed && rc->source_alt_ref_pending && rc->bipred_group_interval && rc->bipred_group_interval <= (rc->baseline_gf_interval - rc->source_alt_ref_pending); @@ -2288,14 +2166,6 @@ static void define_gf_group_structure(AV1_COMP *cpi) { int subgroup_interval[MAX_EXT_ARFS + 1]; int is_sg_bipred_enabled = is_bipred_enabled; int accumulative_subgroup_interval = 0; -#else - int mid_frame_idx; - unsigned char arf_buffer_indices[MAX_ACTIVE_ARFS]; -#endif // CONFIG_EXT_REFS - -#if !CONFIG_EXT_REFS - get_arf_buffer_indices(arf_buffer_indices); -#endif // !CONFIG_EXT_REFS // For key frames the frame target rate is already set and it // is also the golden frame. @@ -2308,25 +2178,16 @@ static void define_gf_group_structure(AV1_COMP *cpi) { gf_group->update_type[frame_index] = GF_UPDATE; gf_group->rf_level[frame_index] = GF_ARF_STD; } -#if CONFIG_EXT_REFS gf_group->arf_update_idx[frame_index] = 0; gf_group->arf_ref_idx[frame_index] = 0; -#else - gf_group->arf_update_idx[frame_index] = arf_buffer_indices[0]; - gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[0]; -#endif // CONFIG_EXT_REFS } -#if CONFIG_EXT_REFS gf_group->bidir_pred_enabled[frame_index] = 0; gf_group->brf_src_offset[frame_index] = 0; -#endif // CONFIG_EXT_REFS frame_index++; -#if CONFIG_EXT_REFS bipred_frame_index++; -#endif // CONFIG_EXT_REFS // === [frame_index == 1] === if (rc->source_alt_ref_pending) { @@ -2335,21 +2196,13 @@ static void define_gf_group_structure(AV1_COMP *cpi) { gf_group->arf_src_offset[frame_index] = (unsigned char)(rc->baseline_gf_interval - 1); -#if CONFIG_EXT_REFS gf_group->arf_update_idx[frame_index] = 0; gf_group->arf_ref_idx[frame_index] = 0; gf_group->bidir_pred_enabled[frame_index] = 0; gf_group->brf_src_offset[frame_index] = 0; -// NOTE: "bidir_pred_frame_index" stays unchanged for ARF_UPDATE frames. -#else - gf_group->arf_update_idx[frame_index] = arf_buffer_indices[0]; - gf_group->arf_ref_idx[frame_index] = - arf_buffer_indices[cpi->multi_arf_last_grp_enabled && - rc->source_alt_ref_active]; -#endif // CONFIG_EXT_REFS - -#if CONFIG_EXT_REFS + // NOTE: "bidir_pred_frame_index" stays unchanged for ARF_UPDATE frames. + // Work out the ARFs' positions in this gf group // NOTE(weitinglin): ALT_REFs' are indexed inversely, but coded in display // order (except for the original ARF). In the example of three ALT_REF's, @@ -2370,11 +2223,9 @@ static void define_gf_group_structure(AV1_COMP *cpi) { subgroup_interval[cpi->num_extra_arfs] = cpi->arf_pos_for_ovrly[cpi->num_extra_arfs] - frame_index - (cpi->num_extra_arfs == 0 ? 1 : 2); -#endif // CONFIG_EXT_REFS ++frame_index; -#if CONFIG_EXT_REFS // Insert an extra ARF // === [frame_index == 2] === if (cpi->num_extra_arfs) { @@ -2387,43 +2238,12 @@ static void define_gf_group_structure(AV1_COMP *cpi) { ++frame_index; } accumulative_subgroup_interval += subgroup_interval[cpi->num_extra_arfs]; -#else // !CONFIG_EXT_ARFS - if (cpi->multi_arf_enabled) { - // Set aside a slot for a level 1 arf. - gf_group->update_type[frame_index] = ARF_UPDATE; - gf_group->rf_level[frame_index] = GF_ARF_LOW; - gf_group->arf_src_offset[frame_index] = - (unsigned char)((rc->baseline_gf_interval >> 1) - 1); - gf_group->arf_update_idx[frame_index] = arf_buffer_indices[1]; - gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[0]; - ++frame_index; - } -#endif // CONFIG_EXT_ARFS } -#if !CONFIG_EXT_REFS - // Define middle frame - mid_frame_idx = frame_index + (rc->baseline_gf_interval >> 1) - 1; -#endif // !CONFIG_EXT_REFS - for (i = 0; i < rc->baseline_gf_interval - rc->source_alt_ref_pending; ++i) { -#if !CONFIG_EXT_REFS - int arf_idx = 0; - - if (rc->source_alt_ref_pending && cpi->multi_arf_enabled) { - if (frame_index <= mid_frame_idx) arf_idx = 1; - } -#endif // !CONFIG_EXT_REFS - -#if CONFIG_EXT_REFS gf_group->arf_update_idx[frame_index] = which_arf; gf_group->arf_ref_idx[frame_index] = which_arf; -#else - gf_group->arf_update_idx[frame_index] = arf_buffer_indices[arf_idx]; - gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[arf_idx]; -#endif // CONFIG_EXT_REFS -#if CONFIG_EXT_REFS // If we are going to have ARFs, check whether we can have BWDREF in this // subgroup, and further, whether we can have ARF subgroup which contains // the BWDREF subgroup but contained within the GF group: @@ -2472,18 +2292,14 @@ static void define_gf_group_structure(AV1_COMP *cpi) { bipred_group_end = 1; } } else { -#endif // CONFIG_EXT_REFS gf_group->update_type[frame_index] = LF_UPDATE; gf_group->rf_level[frame_index] = INTER_NORMAL; -#if CONFIG_EXT_REFS gf_group->bidir_pred_enabled[frame_index] = 0; gf_group->brf_src_offset[frame_index] = 0; } -#endif // CONFIG_EXT_REFS ++frame_index; -#if CONFIG_EXT_REFS // Check if we need to update the ARF. if (is_sg_bipred_enabled && cpi->num_extra_arfs && which_arf > 0 && frame_index > cpi->arf_pos_for_ovrly[which_arf]) { @@ -2503,25 +2319,19 @@ static void define_gf_group_structure(AV1_COMP *cpi) { ++frame_index; } } -#endif // CONFIG_EXT_REFS } -// NOTE: We need to configure the frame at the end of the sequence + 1 that will -// be the start frame for the next group. Otherwise prior to the call to -// av1_rc_get_second_pass_params() the data will be undefined. -#if CONFIG_EXT_REFS + // NOTE: We need to configure the frame at the end of the sequence + 1 that + // will + // be the start frame for the next group. Otherwise prior to the call to + // av1_rc_get_second_pass_params() the data will be undefined. gf_group->arf_update_idx[frame_index] = 0; gf_group->arf_ref_idx[frame_index] = 0; -#else - gf_group->arf_update_idx[frame_index] = arf_buffer_indices[0]; - gf_group->arf_ref_idx[frame_index] = arf_buffer_indices[0]; -#endif // CONFIG_EXT_REFS if (rc->source_alt_ref_pending) { gf_group->update_type[frame_index] = OVERLAY_UPDATE; gf_group->rf_level[frame_index] = INTER_NORMAL; -#if CONFIG_EXT_REFS cpi->arf_pos_in_gf[0] = 1; if (cpi->num_extra_arfs) { // Overwrite the update_type for extra-ARF's corresponding internal @@ -2534,21 +2344,13 @@ static void define_gf_group_structure(AV1_COMP *cpi) { gf_group->rf_level[cpi->arf_pos_for_ovrly[i]] = INTER_NORMAL; } } -#else - // Final setup for second arf and its overlay. - if (cpi->multi_arf_enabled) { - gf_group->update_type[mid_frame_idx] = OVERLAY_UPDATE; - } -#endif // CONFIG_EXT_REFS } else { gf_group->update_type[frame_index] = GF_UPDATE; gf_group->rf_level[frame_index] = GF_ARF_STD; } -#if CONFIG_EXT_REFS gf_group->bidir_pred_enabled[frame_index] = 0; gf_group->brf_src_offset[frame_index] = 0; -#endif // CONFIG_EXT_REFS } static void allocate_gf_group_bits(AV1_COMP *cpi, int64_t gf_group_bits, @@ -2566,18 +2368,11 @@ static void allocate_gf_group_bits(AV1_COMP *cpi, int64_t gf_group_bits, int64_t total_group_bits = gf_group_bits; double modified_err = 0.0; double err_fraction; - int mid_boost_bits = 0; -#if CONFIG_EXT_REFS int ext_arf_boost[MAX_EXT_ARFS]; -#else - int mid_frame_idx; -#endif // CONFIG_EXT_REFS define_gf_group_structure(cpi); -#if CONFIG_EXT_REFS av1_zero_array(ext_arf_boost, MAX_EXT_ARFS); -#endif // CONFIG_EXT_REFS key_frame = cpi->common.frame_type == KEY_FRAME; @@ -2607,24 +2402,14 @@ static void allocate_gf_group_bits(AV1_COMP *cpi, int64_t gf_group_bits, ++frame_index; -#if CONFIG_EXT_REFS // Skip all the extra-ARF's right after ARF at the starting segment of // the current GF group. if (cpi->num_extra_arfs) { while (gf_group->update_type[frame_index] == INTNL_ARF_UPDATE) ++frame_index; } -#else // !CONFIG_EXT_ARFS - // Set aside a slot for a level 1 arf. - if (cpi->multi_arf_enabled) ++frame_index; -#endif // CONFIG_EXT_ARFS } -#if !CONFIG_EXT_REFS - // Define middle frame - mid_frame_idx = frame_index + (rc->baseline_gf_interval >> 1) - 1; -#endif // !CONFIG_EXT_REFS - // Allocate bits to the other frames in the group. for (i = 0; i < rc->baseline_gf_interval - rc->source_alt_ref_pending; ++i) { if (EOF == input_stats(twopass, &frame_stats)) break; @@ -2638,15 +2423,9 @@ static void allocate_gf_group_bits(AV1_COMP *cpi, int64_t gf_group_bits, target_frame_size = (int)((double)total_group_bits * err_fraction); - if (rc->source_alt_ref_pending && cpi->multi_arf_enabled) { - mid_boost_bits += (target_frame_size >> 4); - target_frame_size -= (target_frame_size >> 4); - } - target_frame_size = clamp(target_frame_size, 0, AOMMIN(max_bits, (int)total_group_bits)); -#if CONFIG_EXT_REFS if (gf_group->update_type[frame_index] == BRF_UPDATE) { // Boost up the allocated bits on BWDREF_FRAME gf_group->bit_allocation[frame_index] = @@ -2662,28 +2441,22 @@ static void allocate_gf_group_bits(AV1_COMP *cpi, int64_t gf_group_bits, } else { assert(gf_group->update_type[frame_index] == LF_UPDATE || gf_group->update_type[frame_index] == INTNL_OVERLAY_UPDATE); -#endif // CONFIG_EXT_REFS gf_group->bit_allocation[frame_index] = target_frame_size; -#if CONFIG_EXT_REFS } -#endif // CONFIG_EXT_REFS ++frame_index; -#if CONFIG_EXT_REFS // Skip all the extra-ARF's. if (cpi->num_extra_arfs) { while (gf_group->update_type[frame_index] == INTNL_ARF_UPDATE) ++frame_index; } -#endif // CONFIG_EXT_REFS } // NOTE: We need to configure the frame at the end of the sequence + 1 that // will be the start frame for the next group. Otherwise prior to the // call to av1_rc_get_second_pass_params() the data will be undefined. if (rc->source_alt_ref_pending) { -#if CONFIG_EXT_REFS if (cpi->num_extra_arfs) { // NOTE: For bit allocation, move the allocated bits associated with // INTNL_OVERLAY_UPDATE to the corresponding INTNL_ARF_UPDATE. @@ -2702,18 +2475,7 @@ static void allocate_gf_group_bits(AV1_COMP *cpi, int64_t gf_group_bits, gf_group->bit_allocation[cpi->arf_pos_for_ovrly[i]] = 0; } } -#else - // Final setup for second arf and its overlay. - if (cpi->multi_arf_enabled) { - gf_group->bit_allocation[2] = - gf_group->bit_allocation[mid_frame_idx] + mid_boost_bits; - gf_group->bit_allocation[mid_frame_idx] = 0; - } -#endif // CONFIG_EXT_REFS } - - // Note whether multi-arf was enabled this group for next time. - cpi->multi_arf_last_grp_enabled = cpi->multi_arf_enabled; } // Analyse and define a gf/arf group. @@ -2761,10 +2523,7 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { const int is_key_frame = frame_is_intra_only(cm); const int arf_active_or_kf = is_key_frame || rc->source_alt_ref_active; -#if CONFIG_EXT_REFS cpi->extra_arf_allowed = 1; - cpi->bwd_ref_allowed = 1; -#endif // CONFIG_EXT_REFS // Reset the GF group data structures unless this is a key // frame in which case it will already have been done. @@ -2826,15 +2585,9 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { } } -#if CONFIG_EXT_REFS || CONFIG_BGSPRITE double avg_sr_coded_error = 0; double avg_raw_err_stdev = 0; int non_zero_stdev_count = 0; -#endif // CONFIG_EXT_REFS || CONFIG_BGSPRITE -#if CONFIG_BGSPRITE - double avg_pcnt_second_ref = 0; - int non_zero_pcnt_second_ref_count = 0; -#endif i = 0; while (i < rc->static_scene_max_gf_interval && i < rc->frames_to_key) { @@ -2859,20 +2612,12 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { accumulate_frame_motion_stats( &next_frame, &this_frame_mv_in_out, &mv_in_out_accumulator, &abs_mv_in_out_accumulator, &mv_ratio_accumulator); -#if CONFIG_EXT_REFS || CONFIG_BGSPRITE // sum up the metric values of current gf group avg_sr_coded_error += next_frame.sr_coded_error; if (fabs(next_frame.raw_error_stdev) > 0.000001) { non_zero_stdev_count++; avg_raw_err_stdev += next_frame.raw_error_stdev; } -#endif // CONFIG_EXT_REFS || CONFIG_BGSPRITE -#if CONFIG_BGSPRITE - if (this_frame->pcnt_second_ref) { - avg_pcnt_second_ref += this_frame->pcnt_second_ref; - } - non_zero_pcnt_second_ref_count++; -#endif // CONFIG_BGSPRITE // Accumulate the effect of prediction quality decay. if (!flash_detected) { @@ -2912,18 +2657,14 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { (abs_mv_in_out_accumulator > 3.0) || (mv_in_out_accumulator < -2.0) || ((boost_score - old_boost_score) < BOOST_BREAKOUT)))) { -#if CONFIG_EXT_REFS // If GF group interval is < 12, we force it to be 8. Otherwise, // if it is >= 12, we keep it as is. // NOTE: 'i' is 1 more than the GF group interval candidate that is being // checked. if (i == (8 + 1) || i >= (12 + 1)) { -#endif // CONFIG_EXT_REFS boost_score = old_boost_score; break; -#if CONFIG_EXT_REFS } -#endif // CONFIG_EXT_REFS } *this_frame = next_frame; @@ -2934,12 +2675,10 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { // Was the group length constrained by the requirement for a new KF? rc->constrained_gf_group = (i >= rc->frames_to_key) ? 1 : 0; -#if CONFIG_EXT_REFS || CONFIG_BGSPRITE const int num_mbs = (cpi->oxcf.resize_mode != RESIZE_NONE) ? cpi->initial_mbs : cpi->common.MBs; assert(num_mbs > 0); if (i) avg_sr_coded_error /= i; -#endif // CONFIG_EXT_REFS || CONFIG_BGSPRITE // Should we use the alternate reference frame. if (allow_alt_ref && (i < cpi->oxcf.lag_in_frames) && @@ -2948,24 +2687,6 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { rc->gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost, &b_boost); rc->source_alt_ref_pending = 1; - - // Test to see if multi arf is appropriate. - cpi->multi_arf_enabled = - (cpi->multi_arf_allowed && (rc->baseline_gf_interval >= 6) && - (zero_motion_accumulator < 0.995)) - ? 1 - : 0; -#if CONFIG_BGSPRITE - if (non_zero_pcnt_second_ref_count) { - avg_pcnt_second_ref /= non_zero_pcnt_second_ref_count; - } - - cpi->bgsprite_allowed = 1; - if (abs_mv_in_out_accumulator > 0.30 || decay_accumulator < 0.90 || - avg_sr_coded_error / num_mbs < 20 || avg_pcnt_second_ref < 0.30) { - cpi->bgsprite_allowed = 0; - } -#endif // CONFIG_BGSPRITE } else { rc->gfu_boost = AOMMAX((int)boost_score, MIN_ARF_GF_BOOST); rc->source_alt_ref_pending = 0; @@ -2973,7 +2694,6 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { // Set the interval until the next gf. rc->baseline_gf_interval = i - (is_key_frame || rc->source_alt_ref_pending); -#if CONFIG_EXT_REFS if (non_zero_stdev_count) avg_raw_err_stdev /= non_zero_stdev_count; // Disable extra altrefs and backward refs for "still" gf group: @@ -2981,13 +2701,12 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { // avg_sr_coded_error: average of the SSE per pixel of each frame; // avg_raw_err_stdev: average of the standard deviation of (0,0) // motion error per block of each frame. - assert(num_mbs > 0); const int disable_bwd_extarf = (zero_motion_accumulator > MIN_ZERO_MOTION && avg_sr_coded_error / num_mbs < MAX_SR_CODED_ERROR && avg_raw_err_stdev < MAX_RAW_ERR_VAR); - if (disable_bwd_extarf) cpi->extra_arf_allowed = cpi->bwd_ref_allowed = 0; + if (disable_bwd_extarf) cpi->extra_arf_allowed = 0; if (!cpi->extra_arf_allowed) { cpi->num_extra_arfs = 0; @@ -2998,15 +2717,12 @@ static void define_gf_group(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { } // Currently at maximum two extra ARFs' are allowed assert(cpi->num_extra_arfs <= MAX_EXT_ARFS); -#endif // CONFIG_EXT_REFS rc->frames_till_gf_update_due = rc->baseline_gf_interval; -#if CONFIG_EXT_REFS rc->bipred_group_interval = BFG_INTERVAL; // The minimum bi-predictive frame group interval is 2. if (rc->bipred_group_interval < 2) rc->bipred_group_interval = 0; -#endif // CONFIG_EXT_REFS // Reset the file position. reset_fpf_position(twopass, start_pos); @@ -3226,7 +2942,6 @@ static void find_next_key_frame(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { // Clear the alt ref active flag and last group multi arf flags as they // can never be set for a key frame. rc->source_alt_ref_active = 0; - cpi->multi_arf_last_grp_enabled = 0; // KF is always a GF so clear frames till next gf counter. rc->frames_till_gf_update_due = 0; @@ -3397,6 +3112,8 @@ static void find_next_key_frame(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { // Work out how many bits to allocate for the key frame itself. kf_bits = calculate_boost_bits((rc->frames_to_key - 1), rc->kf_boost, twopass->kf_group_bits); + // printf("kf boost = %d kf_bits = %d kf_zeromotion_pct = %d\n", rc->kf_boost, + // kf_bits, twopass->kf_zeromotion_pct); // Work out the fraction of the kf group bits reserved for the inter frames // within the group after discounting the bits for the kf itself. @@ -3433,17 +3150,9 @@ void av1_ref_frame_map_idx_updates(AV1_COMP *cpi, int gf_frame_index) { int ref_fb_idx_prev[REF_FRAMES]; int ref_fb_idx_curr[REF_FRAMES]; - ref_fb_idx_prev[LAST_FRAME - LAST_FRAME] = - cpi->lst_fb_idxes[LAST_FRAME - LAST_FRAME]; - ref_fb_idx_prev[LAST2_FRAME - LAST_FRAME] = - cpi->lst_fb_idxes[LAST2_FRAME - LAST_FRAME]; - ref_fb_idx_prev[LAST3_FRAME - LAST_FRAME] = - cpi->lst_fb_idxes[LAST3_FRAME - LAST_FRAME]; - ref_fb_idx_prev[GOLDEN_FRAME - LAST_FRAME] = cpi->gld_fb_idx; - ref_fb_idx_prev[BWDREF_FRAME - LAST_FRAME] = cpi->bwd_fb_idx; - ref_fb_idx_prev[ALTREF2_FRAME - LAST_FRAME] = cpi->alt2_fb_idx; - ref_fb_idx_prev[ALTREF_FRAME - LAST_FRAME] = cpi->alt_fb_idx; - ref_fb_idx_prev[REF_FRAMES - LAST_FRAME] = cpi->ext_fb_idx; + for (int ref_frame = 0; ref_frame < REF_FRAMES; ++ref_frame) { + ref_fb_idx_prev[ref_frame] = cpi->ref_fb_idx[ref_frame]; + } // Update map index for each reference frame for (int ref_idx = 0; ref_idx < REF_FRAMES; ++ref_idx) { @@ -3451,17 +3160,9 @@ void av1_ref_frame_map_idx_updates(AV1_COMP *cpi, int gf_frame_index) { ref_fb_idx_curr[ref_idx] = ref_fb_idx_prev[ref_frame - LAST_FRAME]; } - cpi->lst_fb_idxes[LAST_FRAME - LAST_FRAME] = - ref_fb_idx_curr[LAST_FRAME - LAST_FRAME]; - cpi->lst_fb_idxes[LAST2_FRAME - LAST_FRAME] = - ref_fb_idx_curr[LAST2_FRAME - LAST_FRAME]; - cpi->lst_fb_idxes[LAST3_FRAME - LAST_FRAME] = - ref_fb_idx_curr[LAST3_FRAME - LAST_FRAME]; - cpi->gld_fb_idx = ref_fb_idx_curr[GOLDEN_FRAME - LAST_FRAME]; - cpi->bwd_fb_idx = ref_fb_idx_curr[BWDREF_FRAME - LAST_FRAME]; - cpi->alt2_fb_idx = ref_fb_idx_curr[ALTREF2_FRAME - LAST_FRAME]; - cpi->alt_fb_idx = ref_fb_idx_curr[ALTREF_FRAME - LAST_FRAME]; - cpi->ext_fb_idx = ref_fb_idx_curr[REF_FRAMES - LAST_FRAME]; + for (int ref_frame = 0; ref_frame < REF_FRAMES; ++ref_frame) { + cpi->ref_fb_idx[ref_frame] = ref_fb_idx_curr[ref_frame]; + } } // Define the reference buffers that will be updated post encode. @@ -3487,26 +3188,36 @@ static void configure_buffer_updates_16(AV1_COMP *cpi) { // Update refresh index switch (gf_group->refresh_idx[gf_group->index]) { case LAST_FRAME: - cpi->refresh_fb_idx = cpi->lst_fb_idxes[LAST_FRAME - LAST_FRAME]; + cpi->refresh_fb_idx = cpi->ref_fb_idx[LAST_FRAME - LAST_FRAME]; break; case LAST2_FRAME: - cpi->refresh_fb_idx = cpi->lst_fb_idxes[LAST2_FRAME - LAST_FRAME]; + cpi->refresh_fb_idx = cpi->ref_fb_idx[LAST2_FRAME - LAST_FRAME]; break; case LAST3_FRAME: - cpi->refresh_fb_idx = cpi->lst_fb_idxes[LAST3_FRAME - LAST_FRAME]; + cpi->refresh_fb_idx = cpi->ref_fb_idx[LAST3_FRAME - LAST_FRAME]; break; - case GOLDEN_FRAME: cpi->refresh_fb_idx = cpi->gld_fb_idx; break; + case GOLDEN_FRAME: + cpi->refresh_fb_idx = cpi->ref_fb_idx[GOLDEN_FRAME - 1]; + break; - case BWDREF_FRAME: cpi->refresh_fb_idx = cpi->bwd_fb_idx; break; + case BWDREF_FRAME: + cpi->refresh_fb_idx = cpi->ref_fb_idx[BWDREF_FRAME - 1]; + break; - case ALTREF2_FRAME: cpi->refresh_fb_idx = cpi->alt2_fb_idx; break; + case ALTREF2_FRAME: + cpi->refresh_fb_idx = cpi->ref_fb_idx[ALTREF2_FRAME - 1]; + break; - case ALTREF_FRAME: cpi->refresh_fb_idx = cpi->alt_fb_idx; break; + case ALTREF_FRAME: + cpi->refresh_fb_idx = cpi->ref_fb_idx[ALTREF_FRAME - 1]; + break; - case REF_FRAMES: cpi->refresh_fb_idx = cpi->ext_fb_idx; break; + case REF_FRAMES: + cpi->refresh_fb_idx = cpi->ref_fb_idx[REF_FRAMES - 1]; + break; default: assert(0); break; } @@ -3579,7 +3290,6 @@ static void configure_buffer_updates(AV1_COMP *cpi) { // cpi->rc.is_$Source_Type to make this function as it is in the comment? cpi->rc.is_src_frame_alt_ref = 0; -#if CONFIG_EXT_REFS cpi->rc.is_bwd_ref_frame = 0; cpi->rc.is_last_bipred_frame = 0; cpi->rc.is_bipred_frame = 0; @@ -3592,22 +3302,21 @@ static void configure_buffer_updates(AV1_COMP *cpi) { return; } #endif // USE_GF16_MULTI_LAYER -#endif // CONFIG_EXT_REFS switch (twopass->gf_group.update_type[twopass->gf_group.index]) { - case KF_UPDATE: cpi->refresh_last_frame = 1; cpi->refresh_golden_frame = 1; -#if CONFIG_EXT_REFS + case KF_UPDATE: + cpi->refresh_last_frame = 1; + cpi->refresh_golden_frame = 1; cpi->refresh_bwd_ref_frame = 1; cpi->refresh_alt2_ref_frame = 1; -#endif // CONFIG_EXT_REFS cpi->refresh_alt_ref_frame = 1; break; - case LF_UPDATE: cpi->refresh_last_frame = 1; cpi->refresh_golden_frame = 0; -#if CONFIG_EXT_REFS + case LF_UPDATE: + cpi->refresh_last_frame = 1; + cpi->refresh_golden_frame = 0; cpi->refresh_bwd_ref_frame = 0; cpi->refresh_alt2_ref_frame = 0; -#endif // CONFIG_EXT_REFS cpi->refresh_alt_ref_frame = 0; break; @@ -3616,35 +3325,30 @@ static void configure_buffer_updates(AV1_COMP *cpi) { // needed. cpi->refresh_last_frame = 1; cpi->refresh_golden_frame = 1; -#if CONFIG_EXT_REFS cpi->refresh_bwd_ref_frame = 0; cpi->refresh_alt2_ref_frame = 0; -#endif // CONFIG_EXT_REFS cpi->refresh_alt_ref_frame = 0; break; case OVERLAY_UPDATE: cpi->refresh_last_frame = 0; cpi->refresh_golden_frame = 1; -#if CONFIG_EXT_REFS cpi->refresh_bwd_ref_frame = 0; cpi->refresh_alt2_ref_frame = 0; -#endif // CONFIG_EXT_REFS cpi->refresh_alt_ref_frame = 0; cpi->rc.is_src_frame_alt_ref = 1; break; - case ARF_UPDATE: cpi->refresh_last_frame = 0; cpi->refresh_golden_frame = 0; -#if CONFIG_EXT_REFS + case ARF_UPDATE: + cpi->refresh_last_frame = 0; + cpi->refresh_golden_frame = 0; // NOTE: BWDREF does not get updated along with ALTREF_FRAME. cpi->refresh_bwd_ref_frame = 0; cpi->refresh_alt2_ref_frame = 0; -#endif // CONFIG_EXT_REFS cpi->refresh_alt_ref_frame = 1; break; -#if CONFIG_EXT_REFS case BRF_UPDATE: cpi->refresh_last_frame = 0; cpi->refresh_golden_frame = 0; @@ -3693,7 +3397,6 @@ static void configure_buffer_updates(AV1_COMP *cpi) { cpi->refresh_alt2_ref_frame = 1; cpi->refresh_alt_ref_frame = 0; break; -#endif // CONFIG_EXT_REFS default: assert(0); break; } @@ -3734,11 +3437,8 @@ void av1_rc_get_second_pass_params(AV1_COMP *cpi) { // If this is an arf frame then we dont want to read the stats file or // advance the input pointer as we already have what we need. - if (gf_group->update_type[gf_group->index] == ARF_UPDATE -#if CONFIG_EXT_REFS - || gf_group->update_type[gf_group->index] == INTNL_ARF_UPDATE -#endif // CONFIG_EXT_REFS - ) { + if (gf_group->update_type[gf_group->index] == ARF_UPDATE || + gf_group->update_type[gf_group->index] == INTNL_ARF_UPDATE) { configure_buffer_updates(cpi); target_rate = gf_group->bit_allocation[gf_group->index]; target_rate = av1_rc_clamp_pframe_target_size(cpi, target_rate); @@ -3850,6 +3550,8 @@ void av1_rc_get_second_pass_params(AV1_COMP *cpi) { // applied when combining MB error values for the frame. twopass->mb_av_energy = log(((this_frame.intra_error * 256.0) / num_mbs) + 1.0); + twopass->frame_avg_haar_energy = + log((this_frame.frame_avg_wavelet_energy / num_mbs) + 1.0); } // Update the total stats remaining structure. |