diff options
Diffstat (limited to 'third_party/libaom/source/libaom/av1/encoder/encodeframe_utils.c')
-rw-r--r-- | third_party/libaom/source/libaom/av1/encoder/encodeframe_utils.c | 222 |
1 files changed, 130 insertions, 92 deletions
diff --git a/third_party/libaom/source/libaom/av1/encoder/encodeframe_utils.c b/third_party/libaom/source/libaom/av1/encoder/encodeframe_utils.c index c10b2ffe6c..d3fa50292b 100644 --- a/third_party/libaom/source/libaom/av1/encoder/encodeframe_utils.c +++ b/third_party/libaom/source/libaom/av1/encoder/encodeframe_utils.c @@ -44,7 +44,6 @@ void av1_set_ssim_rdmult(const AV1_COMP *const cpi, int *errorperbit, assert(cpi->oxcf.tune_cfg.tuning == AOM_TUNE_SSIM); - aom_clear_system_state(); for (row = mi_row / num_mi_w; row < num_rows && row < mi_row / num_mi_w + num_brows; ++row) { for (col = mi_col / num_mi_h; @@ -59,20 +58,19 @@ void av1_set_ssim_rdmult(const AV1_COMP *const cpi, int *errorperbit, *rdmult = (int)((double)(*rdmult) * geom_mean_of_scale + 0.5); *rdmult = AOMMAX(*rdmult, 0); av1_set_error_per_bit(errorperbit, *rdmult); - aom_clear_system_state(); } // Return the end column for the current superblock, in unit of TPL blocks. static int get_superblock_tpl_column_end(const AV1_COMMON *const cm, int mi_col, int num_mi_w) { // Find the start column of this superblock. - const int sb_mi_col_start = (mi_col >> cm->seq_params.mib_size_log2) - << cm->seq_params.mib_size_log2; + const int sb_mi_col_start = (mi_col >> cm->seq_params->mib_size_log2) + << cm->seq_params->mib_size_log2; // Same but in superres upscaled dimension. const int sb_mi_col_start_sr = coded_to_superres_mi(sb_mi_col_start, cm->superres_scale_denominator); // Width of this superblock in mi units. - const int sb_mi_width = mi_size_wide[cm->seq_params.sb_size]; + const int sb_mi_width = mi_size_wide[cm->seq_params->sb_size]; // Same but in superres upscaled dimension. const int sb_mi_width_sr = coded_to_superres_mi(sb_mi_width, cm->superres_scale_denominator); @@ -86,15 +84,16 @@ int av1_get_hier_tpl_rdmult(const AV1_COMP *const cpi, MACROBLOCK *const x, const BLOCK_SIZE bsize, const int mi_row, const int mi_col, int orig_rdmult) { const AV1_COMMON *const cm = &cpi->common; - const GF_GROUP *const gf_group = &cpi->gf_group; - assert(IMPLIES(cpi->gf_group.size > 0, - cpi->gf_group.index < cpi->gf_group.size)); - const int tpl_idx = cpi->gf_group.index; - const TplDepFrame *tpl_frame = &cpi->tpl_data.tpl_frame[tpl_idx]; + const GF_GROUP *const gf_group = &cpi->ppi->gf_group; + assert(IMPLIES(cpi->ppi->gf_group.size > 0, + cpi->gf_frame_index < cpi->ppi->gf_group.size)); + const int tpl_idx = cpi->gf_frame_index; const int deltaq_rdmult = set_deltaq_rdmult(cpi, x); - if (tpl_frame->is_valid == 0) return deltaq_rdmult; - if (!is_frame_tpl_eligible(gf_group, gf_group->index)) return deltaq_rdmult; if (tpl_idx >= MAX_TPL_FRAME_IDX) return deltaq_rdmult; + const TplDepFrame *tpl_frame = &cpi->ppi->tpl_data.tpl_frame[tpl_idx]; + if (!tpl_frame->is_valid) return deltaq_rdmult; + if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) + return deltaq_rdmult; if (cpi->oxcf.q_cfg.aq_mode != NO_AQ) return deltaq_rdmult; const int mi_col_sr = @@ -116,7 +115,6 @@ int av1_get_hier_tpl_rdmult(const AV1_COMP *const cpi, MACROBLOCK *const x, int row, col; double base_block_count = 0.0; double geom_mean_of_scale = 0.0; - aom_clear_system_state(); for (row = mi_row / num_mi_w; row < num_rows && row < mi_row / num_mi_w + num_brows; ++row) { for (col = mi_col_sr / num_mi_h; @@ -124,7 +122,7 @@ int av1_get_hier_tpl_rdmult(const AV1_COMP *const cpi, MACROBLOCK *const x, col < sb_bcol_end; ++col) { const int index = row * num_cols + col; - geom_mean_of_scale += log(cpi->tpl_sb_rdmult_scaling_factors[index]); + geom_mean_of_scale += log(cpi->ppi->tpl_sb_rdmult_scaling_factors[index]); base_block_count += 1.0; } } @@ -132,8 +130,7 @@ int av1_get_hier_tpl_rdmult(const AV1_COMP *const cpi, MACROBLOCK *const x, int rdmult = (int)((double)orig_rdmult * geom_mean_of_scale + 0.5); rdmult = AOMMAX(rdmult, 0); av1_set_error_per_bit(&x->errorperbit, rdmult); - aom_clear_system_state(); - if (bsize == cm->seq_params.sb_size) { + if (bsize == cm->seq_params->sb_size) { const int rdmult_sb = set_deltaq_rdmult(cpi, x); assert(rdmult_sb == rdmult); (void)rdmult_sb; @@ -341,7 +338,7 @@ void av1_update_state(const AV1_COMP *const cpi, ThreadData *td, const int x_mis = AOMMIN(bw, mi_params->mi_cols - mi_col); const int y_mis = AOMMIN(bh, mi_params->mi_rows - mi_row); - if (cm->seq_params.order_hint_info.enable_ref_frame_mvs) + if (cm->seq_params->order_hint_info.enable_ref_frame_mvs) av1_copy_frame_mvs(cm, mi, mi_row, mi_col, x_mis, y_mis); } @@ -604,9 +601,9 @@ static void set_partial_sb_partition(const AV1_COMMON *const cm, MB_MODE_INFO **mib) { int bh = bh_in; int r, c; - for (r = 0; r < cm->seq_params.mib_size; r += bh) { + for (r = 0; r < cm->seq_params->mib_size; r += bh) { int bw = bw_in; - for (c = 0; c < cm->seq_params.mib_size; c += bw) { + for (c = 0; c < cm->seq_params->mib_size; c += bw) { const int grid_index = get_mi_grid_idx(&cm->mi_params, r, c); const int mi_index = get_alloc_mi_idx(&cm->mi_params, r, c); mib[grid_index] = mi + mi_index; @@ -638,11 +635,11 @@ void av1_set_fixed_partitioning(AV1_COMP *cpi, const TileInfo *const tile, assert((mi_rows_remaining > 0) && (mi_cols_remaining > 0)); // Apply the requested partition size to the SB if it is all "in image" - if ((mi_cols_remaining >= cm->seq_params.mib_size) && - (mi_rows_remaining >= cm->seq_params.mib_size)) { - for (int block_row = 0; block_row < cm->seq_params.mib_size; + if ((mi_cols_remaining >= cm->seq_params->mib_size) && + (mi_rows_remaining >= cm->seq_params->mib_size)) { + for (int block_row = 0; block_row < cm->seq_params->mib_size; block_row += bh) { - for (int block_col = 0; block_col < cm->seq_params.mib_size; + for (int block_col = 0; block_col < cm->seq_params->mib_size; block_col += bw) { const int grid_index = get_mi_grid_idx(mi_params, block_row, block_col); const int mi_index = get_alloc_mi_idx(mi_params, block_row, block_col); @@ -682,25 +679,25 @@ int av1_is_leaf_split_partition(AV1_COMMON *cm, int mi_row, int mi_col, int av1_get_rdmult_delta(AV1_COMP *cpi, BLOCK_SIZE bsize, int mi_row, int mi_col, int orig_rdmult) { AV1_COMMON *const cm = &cpi->common; - const GF_GROUP *const gf_group = &cpi->gf_group; - assert(IMPLIES(cpi->gf_group.size > 0, - cpi->gf_group.index < cpi->gf_group.size)); - const int tpl_idx = cpi->gf_group.index; - TplParams *const tpl_data = &cpi->tpl_data; - TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; - TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; + const GF_GROUP *const gf_group = &cpi->ppi->gf_group; + assert(IMPLIES(cpi->ppi->gf_group.size > 0, + cpi->gf_frame_index < cpi->ppi->gf_group.size)); + const int tpl_idx = cpi->gf_frame_index; + TplParams *const tpl_data = &cpi->ppi->tpl_data; const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2; - int tpl_stride = tpl_frame->stride; int64_t intra_cost = 0; int64_t mc_dep_cost = 0; const int mi_wide = mi_size_wide[bsize]; const int mi_high = mi_size_high[bsize]; - if (tpl_frame->is_valid == 0) return orig_rdmult; + if (tpl_idx >= MAX_TPL_FRAME_IDX) return orig_rdmult; - if (!is_frame_tpl_eligible(gf_group, gf_group->index)) return orig_rdmult; + TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; + TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; + int tpl_stride = tpl_frame->stride; + if (!tpl_frame->is_valid) return orig_rdmult; - if (cpi->gf_group.index >= MAX_TPL_FRAME_IDX) return orig_rdmult; + if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) return orig_rdmult; int mi_count = 0; const int mi_col_sr = @@ -727,8 +724,6 @@ int av1_get_rdmult_delta(AV1_COMP *cpi, BLOCK_SIZE bsize, int mi_row, } assert(mi_count <= MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB); - aom_clear_system_state(); - double beta = 1.0; if (mc_dep_cost > 0 && intra_cost > 0) { const double r0 = cpi->rd.r0; @@ -738,8 +733,6 @@ int av1_get_rdmult_delta(AV1_COMP *cpi, BLOCK_SIZE bsize, int mi_row, int rdmult = av1_get_adaptive_rdmult(cpi, beta); - aom_clear_system_state(); - rdmult = AOMMIN(rdmult, orig_rdmult * 3 / 2); rdmult = AOMMAX(rdmult, orig_rdmult * 1 / 2); @@ -760,7 +753,7 @@ int av1_active_h_edge(const AV1_COMP *cpi, int mi_row, int mi_step) { if (is_stat_consumption_stage_twopass(cpi)) { const AV1_COMMON *const cm = &cpi->common; const FIRSTPASS_STATS *const this_frame_stats = read_one_frame_stats( - &cpi->twopass, cm->current_frame.display_order_hint); + &cpi->ppi->twopass, cm->current_frame.display_order_hint); if (this_frame_stats == NULL) return AOM_CODEC_ERROR; // The inactive region is specified in MBs not mi units. @@ -790,7 +783,7 @@ int av1_active_v_edge(const AV1_COMP *cpi, int mi_col, int mi_step) { if (is_stat_consumption_stage_twopass(cpi)) { const AV1_COMMON *const cm = &cpi->common; const FIRSTPASS_STATS *const this_frame_stats = read_one_frame_stats( - &cpi->twopass, cm->current_frame.display_order_hint); + &cpi->ppi->twopass, cm->current_frame.display_order_hint); if (this_frame_stats == NULL) return AOM_CODEC_ERROR; // The inactive region is specified in MBs not mi units. @@ -814,24 +807,26 @@ void av1_get_tpl_stats_sb(AV1_COMP *cpi, BLOCK_SIZE bsize, int mi_row, if (!cpi->oxcf.algo_cfg.enable_tpl_model) return; if (cpi->common.current_frame.frame_type == KEY_FRAME) return; - const FRAME_UPDATE_TYPE update_type = get_frame_update_type(&cpi->gf_group); + const FRAME_UPDATE_TYPE update_type = + get_frame_update_type(&cpi->ppi->gf_group, cpi->gf_frame_index); if (update_type == INTNL_OVERLAY_UPDATE || update_type == OVERLAY_UPDATE) return; - assert(IMPLIES(cpi->gf_group.size > 0, - cpi->gf_group.index < cpi->gf_group.size)); + assert(IMPLIES(cpi->ppi->gf_group.size > 0, + cpi->gf_frame_index < cpi->ppi->gf_group.size)); AV1_COMMON *const cm = &cpi->common; - const int gf_group_index = cpi->gf_group.index; - TplParams *const tpl_data = &cpi->tpl_data; - TplDepFrame *tpl_frame = &tpl_data->tpl_frame[gf_group_index]; - TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; - int tpl_stride = tpl_frame->stride; + const int gf_group_index = cpi->gf_frame_index; + TplParams *const tpl_data = &cpi->ppi->tpl_data; const int mi_wide = mi_size_wide[bsize]; const int mi_high = mi_size_high[bsize]; - if (tpl_frame->is_valid == 0) return; if (gf_group_index >= MAX_TPL_FRAME_IDX) return; + TplDepFrame *tpl_frame = &tpl_data->tpl_frame[gf_group_index]; + TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; + int tpl_stride = tpl_frame->stride; + if (!tpl_frame->is_valid) return; + int mi_count = 0; int count = 0; const int mi_col_sr = @@ -889,26 +884,26 @@ void av1_get_tpl_stats_sb(AV1_COMP *cpi, BLOCK_SIZE bsize, int mi_row, int av1_get_q_for_deltaq_objective(AV1_COMP *const cpi, BLOCK_SIZE bsize, int mi_row, int mi_col) { AV1_COMMON *const cm = &cpi->common; - const GF_GROUP *const gf_group = &cpi->gf_group; - assert(IMPLIES(cpi->gf_group.size > 0, - cpi->gf_group.index < cpi->gf_group.size)); - const int tpl_idx = cpi->gf_group.index; - TplParams *const tpl_data = &cpi->tpl_data; - TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; - TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; + const GF_GROUP *const gf_group = &cpi->ppi->gf_group; + assert(IMPLIES(cpi->ppi->gf_group.size > 0, + cpi->gf_frame_index < cpi->ppi->gf_group.size)); + const int tpl_idx = cpi->gf_frame_index; + TplParams *const tpl_data = &cpi->ppi->tpl_data; const uint8_t block_mis_log2 = tpl_data->tpl_stats_block_mis_log2; - int tpl_stride = tpl_frame->stride; int64_t intra_cost = 0; int64_t mc_dep_cost = 0; const int mi_wide = mi_size_wide[bsize]; const int mi_high = mi_size_high[bsize]; const int base_qindex = cm->quant_params.base_qindex; - if (tpl_frame->is_valid == 0) return base_qindex; + if (tpl_idx >= MAX_TPL_FRAME_IDX) return base_qindex; - if (!is_frame_tpl_eligible(gf_group, gf_group->index)) return base_qindex; + TplDepFrame *tpl_frame = &tpl_data->tpl_frame[tpl_idx]; + TplDepStats *tpl_stats = tpl_frame->tpl_stats_ptr; + int tpl_stride = tpl_frame->stride; + if (!tpl_frame->is_valid) return base_qindex; - if (cpi->gf_group.index >= MAX_TPL_FRAME_IDX) return base_qindex; + if (!is_frame_tpl_eligible(gf_group, cpi->gf_frame_index)) return base_qindex; int mi_count = 0; const int mi_col_sr = @@ -935,8 +930,6 @@ int av1_get_q_for_deltaq_objective(AV1_COMP *const cpi, BLOCK_SIZE bsize, } assert(mi_count <= MAX_TPL_BLK_IN_SB * MAX_TPL_BLK_IN_SB); - aom_clear_system_state(); - int offset = 0; double beta = 1.0; if (mc_dep_cost > 0 && intra_cost > 0) { @@ -945,8 +938,7 @@ int av1_get_q_for_deltaq_objective(AV1_COMP *const cpi, BLOCK_SIZE bsize, beta = (r0 / rk); assert(beta > 0.0); } - offset = av1_get_deltaq_offset(cpi, base_qindex, beta); - aom_clear_system_state(); + offset = av1_get_deltaq_offset(cm->seq_params->bit_depth, base_qindex, beta); const DeltaQInfo *const delta_q_info = &cm->delta_q_info; offset = AOMMIN(offset, delta_q_info->delta_q_res * 9 - 1); @@ -1164,7 +1156,7 @@ void av1_avg_cdf_symbols(FRAME_CONTEXT *ctx_left, FRAME_CONTEXT *ctx_tr, void av1_source_content_sb(AV1_COMP *cpi, MACROBLOCK *x, int offset) { unsigned int tmp_sse; unsigned int tmp_variance; - const BLOCK_SIZE bsize = cpi->common.seq_params.sb_size; + const BLOCK_SIZE bsize = cpi->common.seq_params->sb_size; uint8_t *src_y = cpi->source->y_buffer; int src_ystride = cpi->source->y_stride; uint8_t *last_src_y = cpi->last_source->y_buffer; @@ -1178,8 +1170,8 @@ void av1_source_content_sb(AV1_COMP *cpi, MACROBLOCK *x, int offset) { #endif src_y += offset; last_src_y += offset; - tmp_variance = cpi->fn_ptr[bsize].vf(src_y, src_ystride, last_src_y, - last_src_ystride, &tmp_sse); + tmp_variance = cpi->ppi->fn_ptr[bsize].vf(src_y, src_ystride, last_src_y, + last_src_ystride, &tmp_sse); if (tmp_sse < avg_source_sse_threshold) x->content_state_sb.source_sad = kLowSad; else if (tmp_sse > avg_source_sse_threshold_high) @@ -1233,7 +1225,7 @@ void av1_backup_sb_state(SB_FIRST_PASS_STATS *sb_fp_stats, const AV1_COMP *cpi, const AV1_COMMON *cm = &cpi->common; const int num_planes = av1_num_planes(cm); - const BLOCK_SIZE sb_size = cm->seq_params.sb_size; + const BLOCK_SIZE sb_size = cm->seq_params->sb_size; xd->above_txfm_context = cm->above_contexts.txfm[tile_info->tile_row] + mi_col; @@ -1269,7 +1261,7 @@ void av1_restore_sb_state(const SB_FIRST_PASS_STATS *sb_fp_stats, AV1_COMP *cpi, const AV1_COMMON *cm = &cpi->common; const int num_planes = av1_num_planes(cm); - const BLOCK_SIZE sb_size = cm->seq_params.sb_size; + const BLOCK_SIZE sb_size = cm->seq_params->sb_size; av1_restore_context(x, &sb_fp_stats->x_ctx, mi_row, mi_col, sb_size, num_planes); @@ -1294,33 +1286,32 @@ void av1_restore_sb_state(const SB_FIRST_PASS_STATS *sb_fp_stats, AV1_COMP *cpi, #endif // CONFIG_INTERNAL_STATS } -// Checks for skip status of mv cost update. -static int skip_mv_cost_update(AV1_COMP *cpi, const TileInfo *const tile_info, - const int mi_row, const int mi_col) { - // For intra frames, mv cdfs are not updated during the encode. Hence, the mv - // cost calculation is skipped in this case. - if (frame_is_intra_only(&cpi->common)) return 1; - // mv_cost_upd_level=0: update happens at each sb, - // so return skip status as 0. - // mv_cost_upd_level=1: update happens once for each sb row, - // so return skip status as 1 for - // mi_col != tile_info->mi_col_start. - // mv_cost_upd_level=2: update happens once for a set of rows, - // so return skip status as 1 appropriately. - if (!cpi->sf.inter_sf.mv_cost_upd_level) return 0; +/*! Checks whether to skip updating the entropy cost based on tile info. + * + * This function contains codes common to both \ref skip_mv_cost_update and + * \ref skip_dv_cost_update. + */ +static int skip_cost_update(const SequenceHeader *seq_params, + const TileInfo *const tile_info, const int mi_row, + const int mi_col, + INTERNAL_COST_UPDATE_TYPE upd_level) { + if (upd_level == INTERNAL_COST_UPD_SB) return 0; + if (upd_level == INTERNAL_COST_UPD_OFF) return 1; + + // upd_level is at most as frequent as each sb_row in a tile. if (mi_col != tile_info->mi_col_start) return 1; - if (cpi->sf.inter_sf.mv_cost_upd_level == 2) { - AV1_COMMON *const cm = &cpi->common; - const int mib_size_log2 = cm->seq_params.mib_size_log2; + + if (upd_level == INTERNAL_COST_UPD_SBROW_SET) { + const int mib_size_log2 = seq_params->mib_size_log2; const int sb_row = (mi_row - tile_info->mi_row_start) >> mib_size_log2; - const int sb_size = cm->seq_params.mib_size * MI_SIZE; + const int sb_size = seq_params->mib_size * MI_SIZE; const int tile_height = (tile_info->mi_row_end - tile_info->mi_row_start) * MI_SIZE; - // When mv_cost_upd_level = 2, the cost update happens once for 2, 4 sb - // rows for sb size 128, sb size 64 respectively. However, as the update - // will not be equally spaced in smaller resolutions making it equally - // spaced by calculating (mv_num_rows_cost_update) the number of rows - // after which the cost update should happen. + // When upd_level = INTERNAL_COST_UPD_SBROW_SET, the cost update happens + // once for 2, 4 sb rows for sb size 128, sb size 64 respectively. However, + // as the update will not be equally spaced in smaller resolutions making + // it equally spaced by calculating (mv_num_rows_cost_update) the number of + // rows after which the cost update should happen. const int sb_size_update_freq_map[2] = { 2, 4 }; const int update_freq_sb_rows = sb_size_update_freq_map[sb_size != MAX_SB_SIZE]; @@ -1337,6 +1328,32 @@ static int skip_mv_cost_update(AV1_COMP *cpi, const TileInfo *const tile_info, return 0; } +// Checks for skip status of mv cost update. +static int skip_mv_cost_update(AV1_COMP *cpi, const TileInfo *const tile_info, + const int mi_row, const int mi_col) { + const AV1_COMMON *cm = &cpi->common; + // For intra frames, mv cdfs are not updated during the encode. Hence, the mv + // cost calculation is skipped in this case. + if (frame_is_intra_only(cm)) return 1; + + return skip_cost_update(cm->seq_params, tile_info, mi_row, mi_col, + cpi->sf.inter_sf.mv_cost_upd_level); +} + +// Checks for skip status of dv cost update. +static int skip_dv_cost_update(AV1_COMP *cpi, const TileInfo *const tile_info, + const int mi_row, const int mi_col) { + const AV1_COMMON *cm = &cpi->common; + // Intrabc is only applicable to intra frames. So skip if intrabc is not + // allowed. + if (!av1_allow_intrabc(cm) || is_stat_generation_stage(cpi)) { + return 1; + } + + return skip_cost_update(cm->seq_params, tile_info, mi_row, mi_col, + cpi->sf.intra_sf.dv_cost_upd_level); +} + // Update the rate costs of some symbols according to the frequency directed // by speed features void av1_set_cost_upd_freq(AV1_COMP *cpi, ThreadData *td, @@ -1355,6 +1372,9 @@ void av1_set_cost_upd_freq(AV1_COMP *cpi, ThreadData *td, if (mi_col != tile_info->mi_col_start) break; AOM_FALLTHROUGH_INTENDED; case COST_UPD_SB: // SB level + if (cpi->sf.inter_sf.coeff_cost_upd_level == INTERNAL_COST_UPD_SBROW && + mi_col != tile_info->mi_col_start) + break; av1_fill_coeff_costs(&x->coeff_costs, xd->tile_ctx, num_planes); break; default: assert(0); @@ -1368,6 +1388,9 @@ void av1_set_cost_upd_freq(AV1_COMP *cpi, ThreadData *td, if (mi_col != tile_info->mi_col_start) break; AOM_FALLTHROUGH_INTENDED; case COST_UPD_SB: // SB level + if (cpi->sf.inter_sf.mode_cost_upd_level == INTERNAL_COST_UPD_SBROW && + mi_col != tile_info->mi_col_start) + break; av1_fill_mode_rates(cm, &x->mode_costs, xd->tile_ctx); break; default: assert(0); @@ -1388,4 +1411,19 @@ void av1_set_cost_upd_freq(AV1_COMP *cpi, ThreadData *td, break; default: assert(0); } + + switch (cpi->oxcf.cost_upd_freq.dv) { + case COST_UPD_OFF: + case COST_UPD_TILE: // Tile level + break; + case COST_UPD_SBROW: // SB row level in tile + if (mi_col != tile_info->mi_col_start) break; + AOM_FALLTHROUGH_INTENDED; + case COST_UPD_SB: // SB level + // Checks for skip status of dv cost update. + if (skip_dv_cost_update(cpi, tile_info, mi_row, mi_col)) break; + av1_fill_dv_costs(&xd->tile_ctx->ndvc, x->dv_costs); + break; + default: assert(0); + } } |