From: Deb Mukherjee Date: Thu, 15 Aug 2013 18:17:50 +0000 (-0700) Subject: Adds sb-type context to probs in interintra expt X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=92fb82a98001c9a5d644613a9eabcb69f3124788;p=libvpx Adds sb-type context to probs in interintra expt Adds sb_type context to the probabilities in the interintra experiment. Change-Id: I5dec4318fb859a550ad5e7ed83378e17ba48e8ed --- diff --git a/vp9/common/vp9_entropymode.c b/vp9/common/vp9_entropymode.c index 31b2a3540..6753e7c9f 100644 --- a/vp9/common/vp9_entropymode.c +++ b/vp9/common/vp9_entropymode.c @@ -335,6 +335,12 @@ static const vp9_prob default_switchable_interp_prob[VP9_SWITCHABLE_FILTERS+1] { 149, 144, }, }; +#if CONFIG_INTERINTRA +static const vp9_prob default_interintra_prob[BLOCK_SIZE_TYPES] = { + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192 +}; +#endif + void vp9_init_mbmode_probs(VP9_COMMON *cm) { vp9_copy(cm->fc.uv_mode_prob, default_if_uv_probs); vp9_copy(cm->fc.y_mode_prob, default_if_y_probs); @@ -347,7 +353,7 @@ void vp9_init_mbmode_probs(VP9_COMMON *cm) { cm->fc.tx_probs = default_tx_probs; vp9_copy(cm->fc.mbskip_probs, default_mbskip_probs); #if CONFIG_INTERINTRA - cm->fc.interintra_prob = VP9_DEF_INTERINTRA_PROB; + vp9_copy(cm->fc.interintra_prob, default_interintra_prob); #endif #if CONFIG_FILTERINTRA vp9_copy(cm->fc.filterintra_prob, vp9_default_filterintra_prob); @@ -479,8 +485,11 @@ void vp9_adapt_mode_probs(VP9_COMMON *cm) { #if CONFIG_INTERINTRA if (cm->use_interintra) { - fc->interintra_prob = update_ct2(pre_fc->interintra_prob, - counts->interintra); + for (i = 0; i < BLOCK_SIZE_TYPES; ++i) { + if (is_interintra_allowed(i)) + fc->interintra_prob[i] = update_ct2(pre_fc->interintra_prob[i], + counts->interintra[i]); + } } #endif #if CONFIG_FILTERINTRA diff --git a/vp9/common/vp9_entropymode.h b/vp9/common/vp9_entropymode.h index 9be9365fc..4276a35a1 100644 --- a/vp9/common/vp9_entropymode.h +++ b/vp9/common/vp9_entropymode.h @@ -20,7 +20,6 @@ #define VP9_SWITCHABLE_FILTERS 3 // number of switchable filters #if CONFIG_INTERINTRA -#define VP9_DEF_INTERINTRA_PROB 192 #define VP9_UPD_INTERINTRA_PROB 248 #define SEPARATE_INTERINTRA_UV 0 #endif diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h index f1c86e83c..0981071aa 100644 --- a/vp9/common/vp9_onyxc_int.h +++ b/vp9/common/vp9_onyxc_int.h @@ -54,7 +54,7 @@ typedef struct frame_contexts { vp9_prob mbskip_probs[MBSKIP_CONTEXTS]; nmv_context nmvc; #if CONFIG_INTERINTRA - vp9_prob interintra_prob; + vp9_prob interintra_prob[BLOCK_SIZE_TYPES]; #endif #if CONFIG_FILTERINTRA vp9_prob filterintra_prob[TX_SIZES][VP9_INTRA_MODES]; @@ -82,7 +82,7 @@ typedef struct { unsigned int mbskip[MBSKIP_CONTEXTS][2]; nmv_context_counts mv; #if CONFIG_INTERINTRA - unsigned int interintra[2]; + unsigned int interintra[BLOCK_SIZE_TYPES][2]; #endif #if CONFIG_FILTERINTRA unsigned int filterintra[TX_SIZES][VP9_INTRA_MODES][2]; diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c index aacf74ad0..c582662ca 100644 --- a/vp9/decoder/vp9_decodemv.c +++ b/vp9/decoder/vp9_decodemv.c @@ -561,9 +561,9 @@ static void read_inter_block_mode_info(VP9D_COMP *pbi, MODE_INFO *mi, && is_inter_mode(mbmi->mode) && (mbmi->ref_frame[1] == NONE) ) { - mbmi->ref_frame[1] = (vp9_read(r, cm->fc.interintra_prob) ? + mbmi->ref_frame[1] = (vp9_read(r, cm->fc.interintra_prob[bsize]) ? INTRA_FRAME : NONE); - cm->counts.interintra[mbmi->ref_frame[1] == INTRA_FRAME]++; + cm->counts.interintra[bsize][mbmi->ref_frame[1] == INTRA_FRAME]++; if (mbmi->ref_frame[1] == INTRA_FRAME) { int bsg = MIN(MIN(b_width_log2(bsize), b_height_log2(bsize)), 3); mbmi->interintra_mode = read_intra_mode(r, cm->fc.y_mode_prob[bsg]); @@ -774,8 +774,12 @@ void vp9_prepare_read_mode_info(VP9D_COMP* pbi, vp9_reader *r) { #if CONFIG_INTERINTRA if (cm->use_interintra) { - if (vp9_read(r, VP9_UPD_INTERINTRA_PROB)) - cm->fc.interintra_prob = vp9_read_prob(r); + int b; + for (b = 0; b < BLOCK_SIZE_TYPES; ++b) { + if (is_interintra_allowed(b)) + if (vp9_read(r, VP9_UPD_INTERINTRA_PROB)) + vp9_diff_update_prob(r, &cm->fc.interintra_prob[b]); + } } #endif diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index 228707228..18b51c35f 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -509,7 +509,8 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m, vp9_writer *bc) { && is_interintra_allowed(bsize) && is_inter_mode(mode) && (mi->ref_frame[1] <= INTRA_FRAME)) { - vp9_write(bc, mi->ref_frame[1] == INTRA_FRAME, pc->fc.interintra_prob); + vp9_write(bc, mi->ref_frame[1] == INTRA_FRAME, + pc->fc.interintra_prob[bsize]); if (mi->ref_frame[1] == INTRA_FRAME) { const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize); @@ -1396,8 +1397,16 @@ static void write_uncompressed_header(VP9_COMP *cpi, fix_mcomp_filter_type(cpi); write_interp_filter_type(cm->mcomp_filter_type, wb); #if CONFIG_INTERINTRA - if (!cpi->dummy_packing && cm->use_interintra) - cm->use_interintra = (cpi->interintra_count[1] > 0); + if (!cpi->dummy_packing && cm->use_interintra) { + int b; + cm->use_interintra = 0; + for (b = 0; b < BLOCK_SIZE_TYPES; ++b) { + if (is_interintra_allowed(b) && cpi->interintra_count[b][1] > 0) { + cm->use_interintra = 1; + break; + } + } + } vp9_wb_write_bit(wb, cm->use_interintra); if (!cm->use_interintra) vp9_zero(cpi->interintra_count); @@ -1454,10 +1463,14 @@ static size_t write_compressed_header(VP9_COMP *cpi, uint8_t *data) { #if CONFIG_INTERINTRA if (cm->use_interintra) { - vp9_cond_prob_update(&header_bc, - &cm->fc.interintra_prob, - VP9_UPD_INTERINTRA_PROB, - cpi->interintra_count); + int b; + for (b = 0; b < BLOCK_SIZE_TYPES; ++b) { + if (is_interintra_allowed(b)) + vp9_cond_prob_diff_update(&header_bc, + &cm->fc.interintra_prob[b], + VP9_UPD_INTERINTRA_PROB, + cpi->interintra_count[b]); + } } #endif diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index ffd9a32de..3813ba37b 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -443,12 +443,12 @@ static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx, const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize); const int bsl = MIN(bwl, bhl); ++cpi->y_mode_count[MIN(bsl, 3)][mbmi->interintra_mode]; - ++cpi->interintra_count[1]; + ++cpi->interintra_count[mbmi->sb_type][1]; #if SEPARATE_INTERINTRA_UV ++cpi->uv_mode_count[mbmi->interintra_mode][mbmi->interintra_uv_mode]; #endif } else { - ++cpi->interintra_count[0]; + ++cpi->interintra_count[mbmi->sb_type][0]; } } #endif diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h index 55fc4cd1c..f45b61313 100644 --- a/vp9/encoder/vp9_onyx_int.h +++ b/vp9/encoder/vp9_onyx_int.h @@ -97,7 +97,7 @@ typedef struct { vp9_prob mbskip_probs[MBSKIP_CONTEXTS]; #if CONFIG_INTERINTRA - vp9_prob interintra_prob; + vp9_prob interintra_prob[BLOCK_SIZE_TYPES]; #endif #if CONFIG_FILTERINTRA vp9_prob filterintra_prob[TX_SIZES][VP9_INTRA_MODES]; @@ -500,7 +500,7 @@ typedef struct VP9_COMP { unsigned int partition_count[NUM_PARTITION_CONTEXTS][PARTITION_TYPES]; #if CONFIG_INTERINTRA - unsigned int interintra_count[2]; + unsigned int interintra_count[BLOCK_SIZE_TYPES][2]; unsigned int interintra_select_count[2]; #endif #if CONFIG_MASKED_COMPOUND_INTER diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 045416364..690f94e4a 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -107,7 +107,7 @@ void vp9_save_coding_context(VP9_COMP *cpi) { cc->tx_probs = cm->fc.tx_probs; vp9_copy(cc->mbskip_probs, cm->fc.mbskip_probs); #if CONFIG_INTERINTRA - cc->interintra_prob = cm->fc.interintra_prob; + vp9_copy(cc->interintra_prob, cm->fc.interintra_prob); #endif #if CONFIG_FILTERINTRA vp9_copy(cc->filterintra_prob, cm->fc.filterintra_prob); @@ -155,7 +155,7 @@ void vp9_restore_coding_context(VP9_COMP *cpi) { cm->fc.tx_probs = cc->tx_probs; vp9_copy(cm->fc.mbskip_probs, cc->mbskip_probs); #if CONFIG_INTERINTRA - cm->fc.interintra_prob = cc->interintra_prob; + vp9_copy(cm->fc.interintra_prob, cc->interintra_prob); #endif #if CONFIG_FILTERINTRA vp9_copy(cm->fc.filterintra_prob, cc->filterintra_prob); diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index a4a37cda7..9f0216229 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -3268,7 +3268,7 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } if (!is_comp_pred) { - *compmode_interintra_cost = vp9_cost_bit(cm->fc.interintra_prob, + *compmode_interintra_cost = vp9_cost_bit(cm->fc.interintra_prob[bsize], is_comp_interintra_pred); if (is_comp_interintra_pred) { *compmode_interintra_cost += x->mbmode_cost[mbmi->interintra_mode];