From: Sami Pietila Date: Mon, 27 May 2013 07:14:53 +0000 (+0300) Subject: Moving txfm_size bits before prediction mode bits. X-Git-Tag: v1.3.0~1104^2~126^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=80812829c2d45d9f5597e619b8759e9562d6f1c0;p=libvpx Moving txfm_size bits before prediction mode bits. Hardware implementation needs to load coeff probs based on the transform size. For selectable transform size, moving these bits earlier in the bitstream adds some delay giving time to preload the probs and speeds up the decoding process. Change-Id: I3bfc1f662ae6f219c9286fe9ae6310c7d8a63ea7 --- diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c index 2bf308669..9f6a0f2cc 100644 --- a/vp9/decoder/vp9_decodemv.c +++ b/vp9/decoder/vp9_decodemv.c @@ -118,6 +118,24 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, if (!m->mbmi.mb_skip_coeff) m->mbmi.mb_skip_coeff = vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_MBSKIP)); + if (cm->txfm_mode == TX_MODE_SELECT && + m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) { + const int allow_16x16 = m->mbmi.sb_type >= BLOCK_SIZE_MB16X16; + const int allow_32x32 = m->mbmi.sb_type >= BLOCK_SIZE_SB32X32; + m->mbmi.txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32); + } else if (cm->txfm_mode >= ALLOW_32X32 && + m->mbmi.sb_type >= BLOCK_SIZE_SB32X32) { + m->mbmi.txfm_size = TX_32X32; + } else if (cm->txfm_mode >= ALLOW_16X16 && + m->mbmi.sb_type >= BLOCK_SIZE_MB16X16) { + m->mbmi.txfm_size = TX_16X16; + } else if (cm->txfm_mode >= ALLOW_8X8 && + m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) { + m->mbmi.txfm_size = TX_8X8; + } else { + m->mbmi.txfm_size = TX_4X4; + } + // luma mode if (m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) { const MB_PREDICTION_MODE A = above_block_mode(m, 0, mis); @@ -153,25 +171,6 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, } m->mbmi.uv_mode = read_uv_mode(r, cm->kf_uv_mode_prob[m->mbmi.mode]); - - if (cm->txfm_mode == TX_MODE_SELECT && - m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) { - const int allow_16x16 = m->mbmi.sb_type >= BLOCK_SIZE_MB16X16; - const int allow_32x32 = m->mbmi.sb_type >= BLOCK_SIZE_SB32X32; - m->mbmi.txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32); - } else if (cm->txfm_mode >= ALLOW_32X32 && - m->mbmi.sb_type >= BLOCK_SIZE_SB32X32) { - m->mbmi.txfm_size = TX_32X32; - } else if (cm->txfm_mode >= ALLOW_16X16 && - m->mbmi.sb_type >= BLOCK_SIZE_MB16X16 && - m->mbmi.mode <= TM_PRED) { - m->mbmi.txfm_size = TX_16X16; - } else if (cm->txfm_mode >= ALLOW_8X8 && - m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) { - m->mbmi.txfm_size = TX_8X8; - } else { - m->mbmi.txfm_size = TX_4X4; - } } static int read_mv_component(vp9_reader *r, @@ -569,6 +568,24 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, // Read the reference frame mbmi->ref_frame = read_ref_frame(pbi, r, mbmi->segment_id); + if (cm->txfm_mode == TX_MODE_SELECT && + (mbmi->mb_skip_coeff == 0 || mbmi->ref_frame == INTRA_FRAME) && + bsize >= BLOCK_SIZE_SB8X8) { + const int allow_16x16 = bsize >= BLOCK_SIZE_MB16X16; + const int allow_32x32 = bsize >= BLOCK_SIZE_SB32X32; + mbmi->txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32); + } else if (bsize >= BLOCK_SIZE_SB32X32 && + cm->txfm_mode >= ALLOW_32X32) { + mbmi->txfm_size = TX_32X32; + } else if (cm->txfm_mode >= ALLOW_16X16 && + bsize >= BLOCK_SIZE_MB16X16) { + mbmi->txfm_size = TX_16X16; + } else if (cm->txfm_mode >= ALLOW_8X8 && (bsize >= BLOCK_SIZE_SB8X8)) { + mbmi->txfm_size = TX_8X8; + } else { + mbmi->txfm_size = TX_4X4; + } + // If reference frame is an Inter frame if (mbmi->ref_frame) { int_mv nearest, nearby, best_mv; @@ -833,24 +850,6 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, mbmi->uv_mode = read_uv_mode(r, cm->fc.uv_mode_prob[mbmi->mode]); cm->fc.uv_mode_counts[mbmi->mode][mbmi->uv_mode]++; } - - if (cm->txfm_mode == TX_MODE_SELECT && - (mbmi->mb_skip_coeff == 0 || mbmi->ref_frame == INTRA_FRAME) && - bsize >= BLOCK_SIZE_SB8X8) { - const int allow_16x16 = bsize >= BLOCK_SIZE_MB16X16; - const int allow_32x32 = bsize >= BLOCK_SIZE_SB32X32; - mbmi->txfm_size = select_txfm_size(cm, r, allow_16x16, allow_32x32); - } else if (bsize >= BLOCK_SIZE_SB32X32 && - cm->txfm_mode >= ALLOW_32X32) { - mbmi->txfm_size = TX_32X32; - } else if (cm->txfm_mode >= ALLOW_16X16 && - bsize >= BLOCK_SIZE_MB16X16) { - mbmi->txfm_size = TX_16X16; - } else if (cm->txfm_mode >= ALLOW_8X8 && (bsize >= BLOCK_SIZE_SB8X8)) { - mbmi->txfm_size = TX_8X8; - } else { - mbmi->txfm_size = TX_4X4; - } } void vp9_decode_mode_mvs_init(VP9D_COMP* const pbi, vp9_reader *r) { diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index 49b2d29ec..48f70e2e4 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -700,6 +700,19 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m, // Encode the reference frame. encode_ref_frame(bc, pc, xd, segment_id, rf); + if (mi->sb_type >= BLOCK_SIZE_SB8X8 && pc->txfm_mode == TX_MODE_SELECT && + !(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]); + if (mi->sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) { + vp9_write(bc, sz != TX_8X8, pc->prob_tx[1]); + if (mi->sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8) + vp9_write(bc, sz != TX_16X16, pc->prob_tx[2]); + } + } + if (rf == INTRA_FRAME) { #ifdef ENTROPY_STATS active_section = 6; @@ -807,19 +820,6 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m, break; } } - - if (mi->sb_type >= BLOCK_SIZE_SB8X8 && pc->txfm_mode == TX_MODE_SELECT && - !(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]); - if (mi->sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) { - vp9_write(bc, sz != TX_8X8, pc->prob_tx[1]); - if (mi->sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8) - vp9_write(bc, sz != TX_16X16, pc->prob_tx[2]); - } - } } static void write_mb_modes_kf(const VP9_COMP *cpi, @@ -842,6 +842,17 @@ static void write_mb_modes_kf(const VP9_COMP *cpi, vp9_write(bc, skip_coeff, vp9_get_pred_prob(c, xd, PRED_MBSKIP)); } + 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]); + if (m->mbmi.sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) { + vp9_write(bc, sz != TX_8X8, c->prob_tx[1]); + if (m->mbmi.sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8) + vp9_write(bc, sz != TX_16X16, c->prob_tx[2]); + } + } + if (m->mbmi.sb_type >= BLOCK_SIZE_SB8X8) { const B_PREDICTION_MODE A = above_block_mode(m, 0, mis); const B_PREDICTION_MODE L = xd->left_available ? @@ -866,17 +877,6 @@ static void write_mb_modes_kf(const VP9_COMP *cpi, } write_uv_mode(bc, m->mbmi.uv_mode, c->kf_uv_mode_prob[ym]); - - 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]); - if (m->mbmi.sb_type >= BLOCK_SIZE_MB16X16 && sz != TX_4X4) { - vp9_write(bc, sz != TX_8X8, c->prob_tx[1]); - if (m->mbmi.sb_type >= BLOCK_SIZE_SB32X32 && sz != TX_8X8) - vp9_write(bc, sz != TX_16X16, c->prob_tx[2]); - } - } } static void write_modes_b(VP9_COMP *cpi, MODE_INFO *m, vp9_writer *bc,