diff options
author | Deb Mukherjee <debargha@google.com> | 2013-06-06 11:14:04 -0700 |
---|---|---|
committer | Deb Mukherjee <debargha@google.com> | 2013-06-07 08:54:00 -0700 |
commit | 3ee1a21a4291fb35f7cb7dc8835ceae1539ccb71 (patch) | |
tree | f60492a624c563f2f80f4271af64391258bd059f /vp9/encoder | |
parent | 4df9e7883c0ffb752715c87931baf58b7caee76c (diff) | |
download | libvpx-3ee1a21a4291fb35f7cb7dc8835ceae1539ccb71.tar libvpx-3ee1a21a4291fb35f7cb7dc8835ceae1539ccb71.tar.gz libvpx-3ee1a21a4291fb35f7cb7dc8835ceae1539ccb71.tar.bz2 libvpx-3ee1a21a4291fb35f7cb7dc8835ceae1539ccb71.zip |
Coding updates for tx-size selection
Changes to the coding of transform sizes, along with forward
and backward probability updates.
Results:
derf300: +0.241%
Context based coding of transform sizes will be in a separate
patch.
Change-Id: I97241d60a926f014fee2de21fa4446ca56495756
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_bitstream.c | 70 | ||||
-rw-r--r-- | vp9/encoder/vp9_encodeframe.c | 37 | ||||
-rw-r--r-- | vp9/encoder/vp9_onyx_if.c | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_onyx_int.h | 5 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.c | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_rdopt.c | 12 |
6 files changed, 57 insertions, 71 deletions
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index 844a1c1bd..9e0713ad3 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -575,12 +575,12 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m, !(rf != INTRA_FRAME && (skip_coeff || vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)))) { TX_SIZE sz = mi->txfm_size; - // FIXME(rbultje) code ternary symbol once all experiments are merged - vp9_write(bc, sz != TX_4X4, pc->prob_tx[0]); + int tx_probs_offset = get_tx_probs_offset(mi->sb_type); + vp9_write(bc, sz != TX_4X4, pc->fc.tx_probs[tx_probs_offset]); if (mi->sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) { - vp9_write(bc, sz != TX_8X8, pc->prob_tx[1]); + vp9_write(bc, sz != TX_8X8, pc->fc.tx_probs[tx_probs_offset + 1]); if (mi->sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8) - vp9_write(bc, sz != TX_16X16, pc->prob_tx[2]); + vp9_write(bc, sz != TX_16X16, pc->fc.tx_probs[tx_probs_offset + 2]); } } @@ -706,12 +706,12 @@ static void write_mb_modes_kf(const VP9_COMP *cpi, if (m->mbmi.sb_type >= BLOCK_SIZE_SB8X8 && c->txfm_mode == TX_MODE_SELECT) { TX_SIZE sz = m->mbmi.txfm_size; - // FIXME(rbultje) code ternary symbol once all experiments are merged - vp9_write(bc, sz != TX_4X4, c->prob_tx[0]); + int tx_probs_offset = get_tx_probs_offset(m->mbmi.sb_type); + vp9_write(bc, sz != TX_4X4, c->fc.tx_probs[tx_probs_offset]); if (m->mbmi.sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) { - vp9_write(bc, sz != TX_8X8, c->prob_tx[1]); + vp9_write(bc, sz != TX_8X8, c->fc.tx_probs[tx_probs_offset + 1]); if (m->mbmi.sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8) - vp9_write(bc, sz != TX_16X16, c->prob_tx[2]); + vp9_write(bc, sz != TX_16X16, c->fc.tx_probs[tx_probs_offset + 2]); } } @@ -1217,7 +1217,7 @@ static void encode_segmentation(VP9_COMP *cpi, } -static void encode_txfm(VP9_COMP *cpi, vp9_writer *w) { +static void encode_txfm_probs(VP9_COMP *cpi, vp9_writer *w) { VP9_COMMON *const cm = &cpi->common; // Mode @@ -1227,35 +1227,19 @@ static void encode_txfm(VP9_COMP *cpi, vp9_writer *w) { // Probabilities if (cm->txfm_mode == TX_MODE_SELECT) { - cm->prob_tx[0] = get_prob(cpi->txfm_count_32x32p[TX_4X4] + - cpi->txfm_count_16x16p[TX_4X4] + - cpi->txfm_count_8x8p[TX_4X4], - cpi->txfm_count_32x32p[TX_4X4] + - cpi->txfm_count_32x32p[TX_8X8] + - cpi->txfm_count_32x32p[TX_16X16] + - cpi->txfm_count_32x32p[TX_32X32] + - cpi->txfm_count_16x16p[TX_4X4] + - cpi->txfm_count_16x16p[TX_8X8] + - cpi->txfm_count_16x16p[TX_16X16] + - cpi->txfm_count_8x8p[TX_4X4] + - cpi->txfm_count_8x8p[TX_8X8]); - cm->prob_tx[1] = get_prob(cpi->txfm_count_32x32p[TX_8X8] + - cpi->txfm_count_16x16p[TX_8X8], - cpi->txfm_count_32x32p[TX_8X8] + - cpi->txfm_count_32x32p[TX_16X16] + - cpi->txfm_count_32x32p[TX_32X32] + - cpi->txfm_count_16x16p[TX_8X8] + - cpi->txfm_count_16x16p[TX_16X16]); - cm->prob_tx[2] = get_prob(cpi->txfm_count_32x32p[TX_16X16], - cpi->txfm_count_32x32p[TX_16X16] + - cpi->txfm_count_32x32p[TX_32X32]); - vp9_write_prob(w, cm->prob_tx[0]); - vp9_write_prob(w, cm->prob_tx[1]); - vp9_write_prob(w, cm->prob_tx[2]); + int i; + unsigned int ct[TX_SIZE_PROBS][2]; + tx_counts_to_branch_counts(cm->fc.tx_count_32x32p, + cm->fc.tx_count_16x16p, + cm->fc.tx_count_8x8p, ct); + + for (i = 0; i < TX_SIZE_PROBS; i++) { + vp9_cond_prob_diff_update(w, &cm->fc.tx_probs[i], + VP9_DEF_UPDATE_PROB, ct[i]); + } } else { - cm->prob_tx[0] = 128; - cm->prob_tx[1] = 128; - cm->prob_tx[2] = 128; + vpx_memcpy(cm->fc.tx_probs, vp9_default_tx_probs, + sizeof(vp9_default_tx_probs)); } } @@ -1440,11 +1424,6 @@ void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, unsigned long *size) { active_section = 7; #endif - if (xd->lossless) - pc->txfm_mode = ONLY_4X4; - else - encode_txfm(cpi, &header_bc); - vp9_clear_system_state(); // __asm emms; vp9_copy(pc->fc.pre_coef_probs, pc->fc.coef_probs); @@ -1460,6 +1439,13 @@ void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, unsigned long *size) { vp9_copy(pc->fc.pre_comp_ref_prob, pc->fc.comp_ref_prob); vp9_copy(pc->fc.pre_single_ref_prob, pc->fc.single_ref_prob); cpi->common.fc.pre_nmvc = cpi->common.fc.nmvc; + vp9_copy(cpi->common.fc.pre_tx_probs, cpi->common.fc.tx_probs); + + if (xd->lossless) { + pc->txfm_mode = ONLY_4X4; + } else { + encode_txfm_probs(cpi, &header_bc); + } update_coef_probs(cpi, &header_bc); diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index ea86bba4f..abd3da318 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -1464,12 +1464,15 @@ static void init_encode_frame_mb_context(VP9_COMP *cpi) { vp9_zero(cpi->y_mode_count) vp9_zero(cpi->y_uv_mode_count) - vp9_zero(cpi->common.fc.inter_mode_counts) + vp9_zero(cm->fc.inter_mode_counts) vp9_zero(cpi->partition_count); vp9_zero(cpi->intra_inter_count); vp9_zero(cpi->comp_inter_count); vp9_zero(cpi->single_ref_count); vp9_zero(cpi->comp_ref_count); + vp9_zero(cm->fc.tx_count_32x32p); + vp9_zero(cm->fc.tx_count_16x16p); + vp9_zero(cm->fc.tx_count_8x8p); // Note: this memset assumes above_context[0], [1] and [2] // are allocated as part of the same buffer. @@ -1560,9 +1563,6 @@ static void encode_frame_internal(VP9_COMP *cpi) { init_encode_frame_mb_context(cpi); vpx_memset(cpi->rd_comp_pred_diff, 0, sizeof(cpi->rd_comp_pred_diff)); - vpx_memset(cpi->txfm_count_32x32p, 0, sizeof(cpi->txfm_count_32x32p)); - vpx_memset(cpi->txfm_count_16x16p, 0, sizeof(cpi->txfm_count_16x16p)); - vpx_memset(cpi->txfm_count_8x8p, 0, sizeof(cpi->txfm_count_8x8p)); vpx_memset(cpi->rd_tx_select_diff, 0, sizeof(cpi->rd_tx_select_diff)); vpx_memset(cpi->rd_tx_select_threshes, 0, sizeof(cpi->rd_tx_select_threshes)); @@ -1841,11 +1841,6 @@ void vp9_encode_frame(VP9_COMP *cpi) { ALLOW_32X32 : TX_MODE_SELECT; #endif cpi->common.txfm_mode = txfm_type; - if (txfm_type != TX_MODE_SELECT) { - cpi->common.prob_tx[0] = 128; - cpi->common.prob_tx[1] = 128; - cpi->common.prob_tx[2] = 128; - } cpi->common.comp_pred_mode = pred_type; encode_frame_internal(cpi); @@ -1885,15 +1880,15 @@ void vp9_encode_frame(VP9_COMP *cpi) { } if (cpi->common.txfm_mode == TX_MODE_SELECT) { - const int count4x4 = cpi->txfm_count_16x16p[TX_4X4] + - cpi->txfm_count_32x32p[TX_4X4] + - cpi->txfm_count_8x8p[TX_4X4]; - const int count8x8_lp = cpi->txfm_count_32x32p[TX_8X8] + - cpi->txfm_count_16x16p[TX_8X8]; - const int count8x8_8x8p = cpi->txfm_count_8x8p[TX_8X8]; - const int count16x16_16x16p = cpi->txfm_count_16x16p[TX_16X16]; - const int count16x16_lp = cpi->txfm_count_32x32p[TX_16X16]; - const int count32x32 = cpi->txfm_count_32x32p[TX_32X32]; + const int count4x4 = cm->fc.tx_count_16x16p[TX_4X4] + + cm->fc.tx_count_32x32p[TX_4X4] + + cm->fc.tx_count_8x8p[TX_4X4]; + const int count8x8_lp = cm->fc.tx_count_32x32p[TX_8X8] + + cm->fc.tx_count_16x16p[TX_8X8]; + const int count8x8_8x8p = cm->fc.tx_count_8x8p[TX_8X8]; + const int count16x16_16x16p = cm->fc.tx_count_16x16p[TX_16X16]; + const int count16x16_lp = cm->fc.tx_count_32x32p[TX_16X16]; + const int count32x32 = cm->fc.tx_count_32x32p[TX_32X32]; if (count4x4 == 0 && count16x16_lp == 0 && count16x16_16x16p == 0 && count32x32 == 0) { @@ -2077,11 +2072,11 @@ static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, !(mbmi->ref_frame[0] != INTRA_FRAME && (mbmi->mb_skip_coeff || vp9_segfeature_active(xd, segment_id, SEG_LVL_SKIP)))) { if (bsize >= BLOCK_SIZE_SB32X32) { - cpi->txfm_count_32x32p[mbmi->txfm_size]++; + cm->fc.tx_count_32x32p[mbmi->txfm_size]++; } else if (bsize >= BLOCK_SIZE_MB16X16) { - cpi->txfm_count_16x16p[mbmi->txfm_size]++; + cm->fc.tx_count_16x16p[mbmi->txfm_size]++; } else { - cpi->txfm_count_8x8p[mbmi->txfm_size]++; + cm->fc.tx_count_8x8p[mbmi->txfm_size]++; } } else { int x, y; diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c index 4ca5ef3ec..c4c83746c 100644 --- a/vp9/encoder/vp9_onyx_if.c +++ b/vp9/encoder/vp9_onyx_if.c @@ -1298,8 +1298,6 @@ VP9_PTR vp9_create_compressor(VP9_CONFIG *oxcf) { cpi->frames_till_gf_update_due = 0; cpi->gf_overspend_bits = 0; cpi->non_gf_bitrate_adjustment = 0; - for (i = 0; i < TX_SIZE_MAX_SB - 1; i++) - cm->prob_tx[i] = 128; // Set reference frame sign bias for ALTREF frame to 1 (for now) cpi->common.ref_frame_sign_bias[ALTREF_FRAME] = 1; diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h index 79a57eeb6..a2ecf6d82 100644 --- a/vp9/encoder/vp9_onyx_int.h +++ b/vp9/encoder/vp9_onyx_int.h @@ -89,6 +89,7 @@ typedef struct { int inter_mode_counts[INTER_MODE_CONTEXTS][VP9_INTER_MODES - 1][2]; vp9_prob inter_mode_probs[INTER_MODE_CONTEXTS][VP9_INTER_MODES - 1]; + vp9_prob tx_probs[TX_SIZE_PROBS]; } CODING_CONTEXT; typedef struct { @@ -326,9 +327,7 @@ typedef struct VP9_COMP { unsigned int comp_ref_count[REF_CONTEXTS][2]; // FIXME contextualize - int txfm_count_32x32p[TX_SIZE_MAX_SB]; - int txfm_count_16x16p[TX_SIZE_MAX_SB - 1]; - int txfm_count_8x8p[TX_SIZE_MAX_SB - 2]; + int64_t rd_tx_select_diff[NB_TXFM_MODES]; int rd_tx_select_threshes[4][NB_TXFM_MODES]; diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index 9515ea4a5..60ca355c5 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -143,6 +143,7 @@ void vp9_save_coding_context(VP9_COMP *cpi) { vp9_copy(cc->coef_probs, cm->fc.coef_probs); vp9_copy(cc->switchable_interp_prob, cm->fc.switchable_interp_prob); + vp9_copy(cc->tx_probs, cm->fc.tx_probs); } void vp9_restore_coding_context(VP9_COMP *cpi) { @@ -180,6 +181,7 @@ void vp9_restore_coding_context(VP9_COMP *cpi) { vp9_copy(cm->fc.coef_probs, cc->coef_probs); vp9_copy(cm->fc.switchable_interp_prob, cc->switchable_interp_prob); + vp9_copy(cm->fc.tx_probs, cc->tx_probs); } void vp9_setup_key_frame(VP9_COMP *cpi) { diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 8eedfc13a..0fea2b931 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -420,6 +420,7 @@ static void choose_txfm_size_from_rd(VP9_COMP *cpi, MACROBLOCK *x, int *d, int *distortion, int *s, int *skip, int64_t txfm_cache[NB_TXFM_MODES], + BLOCK_SIZE_TYPE bs, TX_SIZE max_txfm_size) { VP9_COMMON *const cm = &cpi->common; MACROBLOCKD *const xd = &x->e_mbd; @@ -429,13 +430,15 @@ static void choose_txfm_size_from_rd(VP9_COMP *cpi, MACROBLOCK *x, int n, m; int s0, s1; + int tx_probs_offset = get_tx_probs_offset(bs); + for (n = TX_4X4; n <= max_txfm_size; n++) { r[n][1] = r[n][0]; for (m = 0; m <= n - (n == max_txfm_size); m++) { if (m == n) - r[n][1] += vp9_cost_zero(cm->prob_tx[m]); + r[n][1] += vp9_cost_zero(cm->fc.tx_probs[tx_probs_offset + m]); else - r[n][1] += vp9_cost_one(cm->prob_tx[m]); + r[n][1] += vp9_cost_one(cm->fc.tx_probs[tx_probs_offset + m]); } } @@ -608,6 +611,8 @@ static void super_block_yrd(VP9_COMP *cpi, MACROBLOCKD *xd = &x->e_mbd; MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; + assert(bs == mbmi->sb_type); + if (mbmi->ref_frame[0] > INTRA_FRAME) vp9_subtract_sby(x, bs); @@ -637,7 +642,8 @@ static void super_block_yrd(VP9_COMP *cpi, super_block_yrd_for_txfm(cm, x, &r[TX_4X4][0], &d[TX_4X4], &s[TX_4X4], bs, TX_4X4); - choose_txfm_size_from_rd(cpi, x, r, rate, d, distortion, s, skip, txfm_cache, + choose_txfm_size_from_rd(cpi, x, r, rate, d, distortion, s, + skip, txfm_cache, bs, TX_32X32 - (bs < BLOCK_SIZE_SB32X32) - (bs < BLOCK_SIZE_MB16X16)); } |