Commit a4245511 authored by Yue Chen's avatar Yue Chen

Update cdf and mode rate per superblock in RDO

Update cdf after each superblock being finalized, and re-compute
symbol costs. Affected symbols include prediction parameters and
tx type.
BDRate: -0.119% lowres, -0.092% midres

Change-Id: I724900ac04f725910ed7055a18c2f6a139469b52
parent 7bc599f5
...@@ -201,6 +201,7 @@ struct macroblock { ...@@ -201,6 +201,7 @@ struct macroblock {
#if CONFIG_EXT_INTER #if CONFIG_EXT_INTER
int inter_compound_mode_cost[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES]; int inter_compound_mode_cost[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
int compound_type_cost[BLOCK_SIZES_ALL][COMPOUND_TYPES];
#if CONFIG_COMPOUND_SINGLEREF #if CONFIG_COMPOUND_SINGLEREF
int inter_singleref_comp_mode_cost[INTER_MODE_CONTEXTS] int inter_singleref_comp_mode_cost[INTER_MODE_CONTEXTS]
[INTER_SINGLEREF_COMP_MODES]; [INTER_SINGLEREF_COMP_MODES];
......
...@@ -478,6 +478,9 @@ static void update_filter_type_count(FRAME_COUNTS *counts, ...@@ -478,6 +478,9 @@ static void update_filter_type_count(FRAME_COUNTS *counts,
has_subpel_mv_component(xd->mi[0], xd, dir + 2))) { has_subpel_mv_component(xd->mi[0], xd, dir + 2))) {
const int ctx = av1_get_pred_context_switchable_interp(xd, dir); const int ctx = av1_get_pred_context_switchable_interp(xd, dir);
++counts->switchable_interp[ctx][mbmi->interp_filter[dir]]; ++counts->switchable_interp[ctx][mbmi->interp_filter[dir]];
update_cdf(xd->tile_ctx->switchable_interp_cdf[ctx],
av1_switchable_interp_ind[mbmi->interp_filter[dir]],
SWITCHABLE_FILTERS);
} }
} }
} }
...@@ -1604,6 +1607,7 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, ...@@ -1604,6 +1607,7 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row,
const MB_MODE_INFO *const mbmi = &mi->mbmi; const MB_MODE_INFO *const mbmi = &mi->mbmi;
const MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext; const MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
const BLOCK_SIZE bsize = mbmi->sb_type; const BLOCK_SIZE bsize = mbmi->sb_type;
FRAME_CONTEXT *fc = xd->tile_ctx;
#if CONFIG_DELTA_Q #if CONFIG_DELTA_Q
// delta quant applies to both intra and inter // delta quant applies to both intra and inter
...@@ -1648,6 +1652,10 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, ...@@ -1648,6 +1652,10 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row,
if (!supertx_enabled) if (!supertx_enabled)
#endif #endif
counts->intra_inter[av1_get_intra_inter_context(xd)][inter_block]++; counts->intra_inter[av1_get_intra_inter_context(xd)][inter_block]++;
#if CONFIG_NEW_MULTISYMBOL
update_cdf(fc->intra_inter_cdf[av1_get_intra_inter_context(xd)],
inter_block, 2);
#endif
// If the segment reference feature is enabled we have only a single // If the segment reference feature is enabled we have only a single
// reference frame allowed for the segment so exclude it from // reference frame allowed for the segment so exclude it from
// the reference frame counts used to work out probabilities. // the reference frame counts used to work out probabilities.
...@@ -1665,12 +1673,21 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, ...@@ -1665,12 +1673,21 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row,
// This flag is also updated for 4x4 blocks // This flag is also updated for 4x4 blocks
rdc->single_ref_used_flag = 1; rdc->single_ref_used_flag = 1;
#if !SUB8X8_COMP_REF #if !SUB8X8_COMP_REF
if (mbmi->sb_type != BLOCK_4X4) if (mbmi->sb_type != BLOCK_4X4) {
counts->comp_inter[av1_get_reference_mode_context(cm, xd)] counts->comp_inter[av1_get_reference_mode_context(cm, xd)]
[has_second_ref(mbmi)]++; [has_second_ref(mbmi)]++;
#if CONFIG_NEW_MULTISYMBOL
update_cdf(av1_get_reference_mode_cdf(cm, xd), has_second_ref(mbmi),
2);
#endif
}
#else #else
counts->comp_inter[av1_get_reference_mode_context(cm, xd)] counts->comp_inter[av1_get_reference_mode_context(cm, xd)]
[has_second_ref(mbmi)]++; [has_second_ref(mbmi)]++;
#if CONFIG_NEW_MULTISYMBOL
update_cdf(av1_get_reference_mode_cdf(cm, xd), has_second_ref(mbmi),
2);
#endif
#endif #endif
} }
...@@ -1775,11 +1792,24 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, ...@@ -1775,11 +1792,24 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row,
const int bsize_group = size_group_lookup[bsize]; const int bsize_group = size_group_lookup[bsize];
if (mbmi->ref_frame[1] == INTRA_FRAME) { if (mbmi->ref_frame[1] == INTRA_FRAME) {
counts->interintra[bsize_group][1]++; counts->interintra[bsize_group][1]++;
#if CONFIG_NEW_MULTISYMBOL
update_cdf(fc->interintra_cdf[bsize_group], 1, 2);
#endif
counts->interintra_mode[bsize_group][mbmi->interintra_mode]++; counts->interintra_mode[bsize_group][mbmi->interintra_mode]++;
if (is_interintra_wedge_used(bsize)) update_cdf(fc->interintra_mode_cdf[bsize_group],
mbmi->interintra_mode, INTERINTRA_MODES);
if (is_interintra_wedge_used(bsize)) {
counts->wedge_interintra[bsize][mbmi->use_wedge_interintra]++; counts->wedge_interintra[bsize][mbmi->use_wedge_interintra]++;
#if CONFIG_NEW_MULTISYMBOL
update_cdf(fc->wedge_interintra_cdf[bsize],
mbmi->use_wedge_interintra, 2);
#endif
}
} else { } else {
counts->interintra[bsize_group][0]++; counts->interintra[bsize_group][0]++;
#if CONFIG_NEW_MULTISYMBOL
update_cdf(fc->interintra_cdf[bsize_group], 0, 2);
#endif
} }
} }
#endif // CONFIG_INTERINTRA #endif // CONFIG_INTERINTRA
...@@ -1807,17 +1837,21 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, ...@@ -1807,17 +1837,21 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row,
{ {
if (motion_allowed == WARPED_CAUSAL) { if (motion_allowed == WARPED_CAUSAL) {
counts->motion_mode[mbmi->sb_type][mbmi->motion_mode]++; counts->motion_mode[mbmi->sb_type][mbmi->motion_mode]++;
update_cdf(xd->tile_ctx->motion_mode_cdf[mbmi->sb_type], update_cdf(fc->motion_mode_cdf[mbmi->sb_type], mbmi->motion_mode,
mbmi->motion_mode, MOTION_MODES); MOTION_MODES);
} else if (motion_allowed == OBMC_CAUSAL) { } else if (motion_allowed == OBMC_CAUSAL) {
counts->obmc[mbmi->sb_type][mbmi->motion_mode == OBMC_CAUSAL]++; counts->obmc[mbmi->sb_type][mbmi->motion_mode == OBMC_CAUSAL]++;
#if CONFIG_NEW_MULTISYMBOL
update_cdf(fc->obmc_cdf[mbmi->sb_type],
mbmi->motion_mode == OBMC_CAUSAL, 2);
#endif
} }
} }
#else #else
if (motion_allowed > SIMPLE_TRANSLATION) { if (motion_allowed > SIMPLE_TRANSLATION) {
counts->motion_mode[mbmi->sb_type][mbmi->motion_mode]++; counts->motion_mode[mbmi->sb_type][mbmi->motion_mode]++;
update_cdf(xd->tile_ctx->motion_mode_cdf[mbmi->sb_type], update_cdf(fc->motion_mode_cdf[mbmi->sb_type], mbmi->motion_mode,
mbmi->motion_mode, MOTION_MODES); MOTION_MODES);
} }
#endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION #endif // CONFIG_MOTION_VAR && CONFIG_WARPED_MOTION
...@@ -1826,12 +1860,12 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, ...@@ -1826,12 +1860,12 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row,
ADAPT_OVERLAP_BLOCK ao_block = ADAPT_OVERLAP_BLOCK ao_block =
adapt_overlap_block_lookup[mbmi->sb_type]; adapt_overlap_block_lookup[mbmi->sb_type];
++counts->ncobmc_mode[ao_block][mbmi->ncobmc_mode[0]]; ++counts->ncobmc_mode[ao_block][mbmi->ncobmc_mode[0]];
update_cdf(xd->tile_ctx->ncobmc_mode_cdf[ao_block], update_cdf(fc->ncobmc_mode_cdf[ao_block], mbmi->ncobmc_mode[0],
mbmi->ncobmc_mode[0], MAX_NCOBMC_MODES); MAX_NCOBMC_MODES);
if (mi_size_wide[mbmi->sb_type] != mi_size_high[mbmi->sb_type]) { if (mi_size_wide[mbmi->sb_type] != mi_size_high[mbmi->sb_type]) {
++counts->ncobmc_mode[ao_block][mbmi->ncobmc_mode[1]]; ++counts->ncobmc_mode[ao_block][mbmi->ncobmc_mode[1]];
update_cdf(xd->tile_ctx->ncobmc_mode_cdf[ao_block], update_cdf(fc->ncobmc_mode_cdf[ao_block], mbmi->ncobmc_mode[1],
mbmi->ncobmc_mode[1], MAX_NCOBMC_MODES); MAX_NCOBMC_MODES);
} }
} }
#endif #endif
...@@ -1850,7 +1884,16 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, ...@@ -1850,7 +1884,16 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row,
&& mbmi->motion_mode == SIMPLE_TRANSLATION && mbmi->motion_mode == SIMPLE_TRANSLATION
#endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION #endif // CONFIG_MOTION_VAR || CONFIG_WARPED_MOTION
) { ) {
counts->compound_interinter[bsize][mbmi->interinter_compound_type]++; #if CONFIG_WEDGE && CONFIG_COMPOUND_SEGMENT
if (is_interinter_compound_used(COMPOUND_WEDGE, bsize)) {
#endif
counts
->compound_interinter[bsize][mbmi->interinter_compound_type]++;
update_cdf(fc->compound_type_cdf[bsize],
mbmi->interinter_compound_type, COMPOUND_TYPES);
#if CONFIG_WEDGE && CONFIG_COMPOUND_SEGMENT
}
#endif
} }
#endif // CONFIG_EXT_INTER #endif // CONFIG_EXT_INTER
} }
...@@ -1864,6 +1907,8 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row, ...@@ -1864,6 +1907,8 @@ static void update_stats(const AV1_COMMON *const cm, ThreadData *td, int mi_row,
if (has_second_ref(mbmi)) { if (has_second_ref(mbmi)) {
mode_ctx = mbmi_ext->compound_mode_context[mbmi->ref_frame[0]]; mode_ctx = mbmi_ext->compound_mode_context[mbmi->ref_frame[0]];
++counts->inter_compound_mode[mode_ctx][INTER_COMPOUND_OFFSET(mode)]; ++counts->inter_compound_mode[mode_ctx][INTER_COMPOUND_OFFSET(mode)];
update_cdf(fc->inter_compound_mode_cdf[mode_ctx],
INTER_COMPOUND_OFFSET(mode), INTER_COMPOUND_MODES);
#if CONFIG_COMPOUND_SINGLEREF #if CONFIG_COMPOUND_SINGLEREF
} else if (is_inter_singleref_comp_mode(mode)) { } else if (is_inter_singleref_comp_mode(mode)) {
mode_ctx = mbmi_ext->compound_mode_context[mbmi->ref_frame[0]]; mode_ctx = mbmi_ext->compound_mode_context[mbmi->ref_frame[0]];
...@@ -4550,7 +4595,6 @@ static void encode_rd_sb_row(AV1_COMP *cpi, ThreadData *td, ...@@ -4550,7 +4595,6 @@ static void encode_rd_sb_row(AV1_COMP *cpi, ThreadData *td,
// Initialize the left context for the new SB row // Initialize the left context for the new SB row
av1_zero_left_context(xd); av1_zero_left_context(xd);
av1_fill_mode_rates(cm, x, xd->tile_ctx);
#if CONFIG_DELTA_Q #if CONFIG_DELTA_Q
// Reset delta for every tile // Reset delta for every tile
...@@ -4587,6 +4631,7 @@ static void encode_rd_sb_row(AV1_COMP *cpi, ThreadData *td, ...@@ -4587,6 +4631,7 @@ static void encode_rd_sb_row(AV1_COMP *cpi, ThreadData *td,
av1_fill_token_costs_from_cdf(x->token_tail_costs, av1_fill_token_costs_from_cdf(x->token_tail_costs,
x->e_mbd.tile_ctx->coef_tail_cdfs); x->e_mbd.tile_ctx->coef_tail_cdfs);
#endif #endif
av1_fill_mode_rates(cm, x, xd->tile_ctx);
if (sf->adaptive_pred_interp_filter) { if (sf->adaptive_pred_interp_filter) {
#if !CONFIG_CB4X4 #if !CONFIG_CB4X4
...@@ -5772,21 +5817,18 @@ static void sum_intra_stats(FRAME_COUNTS *counts, MACROBLOCKD *xd, ...@@ -5772,21 +5817,18 @@ static void sum_intra_stats(FRAME_COUNTS *counts, MACROBLOCKD *xd,
const MODE_INFO *mi, const MODE_INFO *above_mi, const MODE_INFO *mi, const MODE_INFO *above_mi,
const MODE_INFO *left_mi, const int intraonly, const MODE_INFO *left_mi, const int intraonly,
const int mi_row, const int mi_col) { const int mi_row, const int mi_col) {
FRAME_CONTEXT *fc = xd->tile_ctx;
const MB_MODE_INFO *const mbmi = &mi->mbmi; const MB_MODE_INFO *const mbmi = &mi->mbmi;
#if CONFIG_ENTROPY_STATS
const PREDICTION_MODE y_mode = mbmi->mode; const PREDICTION_MODE y_mode = mbmi->mode;
const UV_PREDICTION_MODE uv_mode = mbmi->uv_mode; const UV_PREDICTION_MODE uv_mode = mbmi->uv_mode;
#else // CONFIG_ENTROPY_STATS
(void)counts; (void)counts;
(void)above_mi; (void)above_mi;
(void)left_mi; (void)left_mi;
(void)intraonly; (void)intraonly;
#endif // CONFIG_ENTROPY_STATS
const BLOCK_SIZE bsize = mbmi->sb_type; const BLOCK_SIZE bsize = mbmi->sb_type;
const int unify_bsize = CONFIG_CB4X4; const int unify_bsize = CONFIG_CB4X4;
if (bsize < BLOCK_8X8 && !unify_bsize) { if (bsize < BLOCK_8X8 && !unify_bsize) {
#if CONFIG_ENTROPY_STATS
int idx, idy; int idx, idy;
const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize]; const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];
const int num_4x4_h = num_4x4_blocks_high_lookup[bsize]; const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];
...@@ -5795,24 +5837,37 @@ static void sum_intra_stats(FRAME_COUNTS *counts, MACROBLOCKD *xd, ...@@ -5795,24 +5837,37 @@ static void sum_intra_stats(FRAME_COUNTS *counts, MACROBLOCKD *xd,
const int bidx = idy * 2 + idx; const int bidx = idy * 2 + idx;
const PREDICTION_MODE bmode = mi->bmi[bidx].as_mode; const PREDICTION_MODE bmode = mi->bmi[bidx].as_mode;
if (intraonly) { if (intraonly) {
#if CONFIG_ENTROPY_STATS
const PREDICTION_MODE a = av1_above_block_mode(mi, above_mi, bidx); const PREDICTION_MODE a = av1_above_block_mode(mi, above_mi, bidx);
const PREDICTION_MODE l = av1_left_block_mode(mi, left_mi, bidx); const PREDICTION_MODE l = av1_left_block_mode(mi, left_mi, bidx);
++counts->kf_y_mode[a][l][bmode]; ++counts->kf_y_mode[a][l][bmode];
#endif // CONFIG_ENTROPY_STATS
update_cdf(get_y_mode_cdf(fc, mi, above_mi, left_mi, bidx),
av1_intra_mode_ind[bmode], INTRA_MODES);
} else { } else {
#if CONFIG_ENTROPY_STATS
++counts->y_mode[0][bmode]; ++counts->y_mode[0][bmode];
#endif // CONFIG_ENTROPY_STATS
update_cdf(fc->y_mode_cdf[0], av1_intra_mode_ind[bmode], INTRA_MODES);
} }
} }
#endif // CONFIG_ENTROPY_STATS
} else { } else {
#if CONFIG_ENTROPY_STATS
if (intraonly) { if (intraonly) {
#if CONFIG_ENTROPY_STATS
const PREDICTION_MODE above = av1_above_block_mode(mi, above_mi, 0); const PREDICTION_MODE above = av1_above_block_mode(mi, above_mi, 0);
const PREDICTION_MODE left = av1_left_block_mode(mi, left_mi, 0); const PREDICTION_MODE left = av1_left_block_mode(mi, left_mi, 0);
++counts->kf_y_mode[above][left][y_mode]; ++counts->kf_y_mode[above][left][y_mode];
#endif // CONFIG_ENTROPY_STATS
update_cdf(get_y_mode_cdf(fc, mi, above_mi, left_mi, 0),
av1_intra_mode_ind[y_mode], INTRA_MODES);
} else { } else {
#if CONFIG_ENTROPY_STATS
++counts->y_mode[size_group_lookup[bsize]][y_mode]; ++counts->y_mode[size_group_lookup[bsize]][y_mode];
}
#endif // CONFIG_ENTROPY_STATS #endif // CONFIG_ENTROPY_STATS
update_cdf(fc->y_mode_cdf[size_group_lookup[bsize]],
av1_intra_mode_ind[y_mode], INTRA_MODES);
}
#if CONFIG_FILTER_INTRA #if CONFIG_FILTER_INTRA
if (mbmi->mode == DC_PRED && mbmi->palette_mode_info.palette_size[0] == 0) { if (mbmi->mode == DC_PRED && mbmi->palette_mode_info.palette_size[0] == 0) {
const int use_filter_intra_mode = const int use_filter_intra_mode =
...@@ -5854,6 +5909,7 @@ static void sum_intra_stats(FRAME_COUNTS *counts, MACROBLOCKD *xd, ...@@ -5854,6 +5909,7 @@ static void sum_intra_stats(FRAME_COUNTS *counts, MACROBLOCKD *xd,
#if CONFIG_ENTROPY_STATS #if CONFIG_ENTROPY_STATS
++counts->uv_mode[y_mode][uv_mode]; ++counts->uv_mode[y_mode][uv_mode];
#endif // CONFIG_ENTROPY_STATS #endif // CONFIG_ENTROPY_STATS
update_cdf(fc->uv_mode_cdf[y_mode], av1_intra_mode_ind[uv_mode], INTRA_MODES);
} }
#if CONFIG_VAR_TX #if CONFIG_VAR_TX
...@@ -6012,6 +6068,7 @@ void av1_update_tx_type_count(const AV1_COMMON *cm, MACROBLOCKD *xd, ...@@ -6012,6 +6068,7 @@ void av1_update_tx_type_count(const AV1_COMMON *cm, MACROBLOCKD *xd,
FRAME_COUNTS *counts) { FRAME_COUNTS *counts) {
MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
int is_inter = is_inter_block(mbmi); int is_inter = is_inter_block(mbmi);
FRAME_CONTEXT *fc = xd->tile_ctx;
#if !CONFIG_TXK_SEL #if !CONFIG_TXK_SEL
TX_TYPE tx_type = mbmi->tx_type; TX_TYPE tx_type = mbmi->tx_type;
...@@ -6031,10 +6088,15 @@ void av1_update_tx_type_count(const AV1_COMMON *cm, MACROBLOCKD *xd, ...@@ -6031,10 +6088,15 @@ void av1_update_tx_type_count(const AV1_COMMON *cm, MACROBLOCKD *xd,
get_ext_tx_set(tx_size, bsize, is_inter, cm->reduced_tx_set_used); get_ext_tx_set(tx_size, bsize, is_inter, cm->reduced_tx_set_used);
if (eset > 0) { if (eset > 0) {
if (is_inter) { if (is_inter) {
update_cdf(fc->inter_ext_tx_cdf[eset][txsize_sqr_map[tx_size]],
av1_ext_tx_inter_ind[eset][tx_type], ext_tx_cnt_inter[eset]);
++counts->inter_ext_tx[eset][txsize_sqr_map[tx_size]][tx_type]; ++counts->inter_ext_tx[eset][txsize_sqr_map[tx_size]][tx_type];
} else { } else {
++counts->intra_ext_tx[eset][txsize_sqr_map[tx_size]][mbmi->mode] ++counts->intra_ext_tx[eset][txsize_sqr_map[tx_size]][mbmi->mode]
[tx_type]; [tx_type];
update_cdf(
fc->intra_ext_tx_cdf[eset][txsize_sqr_map[tx_size]][mbmi->mode],
av1_ext_tx_intra_ind[eset][tx_type], ext_tx_cnt_intra[eset]);
} }
} }
} }
...@@ -6047,9 +6109,15 @@ void av1_update_tx_type_count(const AV1_COMMON *cm, MACROBLOCKD *xd, ...@@ -6047,9 +6109,15 @@ void av1_update_tx_type_count(const AV1_COMMON *cm, MACROBLOCKD *xd,
!segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) { !segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) {
if (is_inter) { if (is_inter) {
++counts->inter_ext_tx[tx_size][tx_type]; ++counts->inter_ext_tx[tx_size][tx_type];
update_cdf(fc->inter_ext_tx_cdf[tx_size], av1_ext_tx_ind[tx_type],
TX_TYPES);
} else { } else {
++counts->intra_ext_tx[tx_size][intra_mode_to_tx_type_context[mbmi->mode]] ++counts->intra_ext_tx[tx_size][intra_mode_to_tx_type_context[mbmi->mode]]
[tx_type]; [tx_type];
update_cdf(
fc->intra_ext_tx_cdf[tx_size]
[intra_mode_to_tx_type_context[mbmi->mode]],
av1_ext_tx_ind[tx_type], TX_TYPES);
} }
} }
#endif // CONFIG_EXT_TX #endif // CONFIG_EXT_TX
......
...@@ -251,6 +251,9 @@ void av1_fill_mode_rates(AV1_COMMON *const cm, MACROBLOCK *x, ...@@ -251,6 +251,9 @@ void av1_fill_mode_rates(AV1_COMMON *const cm, MACROBLOCK *x,
for (i = 0; i < INTER_MODE_CONTEXTS; ++i) for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
av1_cost_tokens_from_cdf(x->inter_compound_mode_cost[i], av1_cost_tokens_from_cdf(x->inter_compound_mode_cost[i],
fc->inter_compound_mode_cdf[i], NULL); fc->inter_compound_mode_cdf[i], NULL);
for (i = 0; i < BLOCK_SIZES_ALL; ++i)
av1_cost_tokens_from_cdf(x->compound_type_cost[i],
fc->compound_type_cdf[i], NULL);
#if CONFIG_COMPOUND_SINGLEREF #if CONFIG_COMPOUND_SINGLEREF
for (i = 0; i < INTER_MODE_CONTEXTS; ++i) for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
av1_cost_tokens_from_cdf(x->inter_singleref_comp_mode_cost[i], av1_cost_tokens_from_cdf(x->inter_singleref_comp_mode_cost[i],
......
...@@ -9149,7 +9149,6 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x, ...@@ -9149,7 +9149,6 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x,
int best_tmp_rate_mv = rate_mv; int best_tmp_rate_mv = rate_mv;
int tmp_skip_txfm_sb; int tmp_skip_txfm_sb;
int64_t tmp_skip_sse_sb; int64_t tmp_skip_sse_sb;
int compound_type_cost[COMPOUND_TYPES];
DECLARE_ALIGNED(16, uint8_t, pred0[2 * MAX_SB_SQUARE]); DECLARE_ALIGNED(16, uint8_t, pred0[2 * MAX_SB_SQUARE]);
DECLARE_ALIGNED(16, uint8_t, pred1[2 * MAX_SB_SQUARE]); DECLARE_ALIGNED(16, uint8_t, pred1[2 * MAX_SB_SQUARE]);
uint8_t *preds0[1] = { pred0 }; uint8_t *preds0[1] = { pred0 };
...@@ -9161,6 +9160,7 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x, ...@@ -9161,6 +9160,7 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x,
masked_compound_used = masked_compound_used && cm->allow_masked_compound; masked_compound_used = masked_compound_used && cm->allow_masked_compound;
#endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE #endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
COMPOUND_TYPE cur_type; COMPOUND_TYPE cur_type;
int best_compmode_interinter_cost = 0;
best_mv[0].as_int = cur_mv[0].as_int; best_mv[0].as_int = cur_mv[0].as_int;
best_mv[1].as_int = cur_mv[1].as_int; best_mv[1].as_int = cur_mv[1].as_int;
...@@ -9182,8 +9182,6 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x, ...@@ -9182,8 +9182,6 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x,
#endif // CONFIG_EXT_INTER && CONFIG_COMPOUND_SINGLEREF #endif // CONFIG_EXT_INTER && CONFIG_COMPOUND_SINGLEREF
if (masked_compound_used) { if (masked_compound_used) {
av1_cost_tokens(compound_type_cost, cm->fc->compound_type_prob[bsize],
av1_compound_type_tree);
// get inter predictors to use for masked compound modes // get inter predictors to use for masked compound modes
av1_build_inter_predictors_for_planes_single_buf( av1_build_inter_predictors_for_planes_single_buf(
xd, bsize, 0, 0, mi_row, mi_col, 0, preds0, strides); xd, bsize, 0, 0, mi_row, mi_col, 0, preds0, strides);
...@@ -9205,7 +9203,7 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x, ...@@ -9205,7 +9203,7 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x,
else else
#endif // CONFIG_WEDGE && CONFIG_COMPOUND_SEGMENT #endif // CONFIG_WEDGE && CONFIG_COMPOUND_SEGMENT
masked_type_cost += masked_type_cost +=
compound_type_cost[mbmi->interinter_compound_type]; x->compound_type_cost[bsize][mbmi->interinter_compound_type];
} }
rs2 = av1_cost_literal(get_interinter_compound_type_bits( rs2 = av1_cost_literal(get_interinter_compound_type_bits(
bsize, mbmi->interinter_compound_type)) + bsize, mbmi->interinter_compound_type)) +
...@@ -9259,6 +9257,7 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x, ...@@ -9259,6 +9257,7 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x,
#endif // CONFIG_COMPOUND_SEGMENT #endif // CONFIG_COMPOUND_SEGMENT
best_compound_data.interinter_compound_type = best_compound_data.interinter_compound_type =
mbmi->interinter_compound_type; mbmi->interinter_compound_type;
best_compmode_interinter_cost = rs2;
if (have_newmv_in_inter_mode(this_mode)) { if (have_newmv_in_inter_mode(this_mode)) {
if (use_masked_motion_search(cur_type)) { if (use_masked_motion_search(cur_type)) {
best_tmp_rate_mv = tmp_rate_mv; best_tmp_rate_mv = tmp_rate_mv;
...@@ -9303,12 +9302,7 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x, ...@@ -9303,12 +9302,7 @@ static int64_t handle_inter_mode(const AV1_COMP *const cpi, MACROBLOCK *x,
pred_exists = 0; pred_exists = 0;
compmode_interinter_cost = compmode_interinter_cost = best_compmode_interinter_cost;
av1_cost_literal(get_interinter_compound_type_bits(
bsize, mbmi->interinter_compound_type)) +
(masked_compound_used
? compound_type_cost[mbmi->interinter_compound_type]
: 0);
} }
#endif // CONFIG_WEDGE || CONFIG_COMPOUND_SEGMENT #endif // CONFIG_WEDGE || CONFIG_COMPOUND_SEGMENT
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment