diff options
Diffstat (limited to 'vp9/common')
-rw-r--r-- | vp9/common/vp9_blockd.h | 74 | ||||
-rw-r--r-- | vp9/common/vp9_reconintra.c | 21 | ||||
-rw-r--r-- | vp9/common/vp9_reconintra.h | 2 |
3 files changed, 35 insertions, 62 deletions
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h index a09f33ed9..0f197e330 100644 --- a/vp9/common/vp9_blockd.h +++ b/vp9/common/vp9_blockd.h @@ -338,6 +338,7 @@ typedef struct macroblockd { signed char last_ref_lf_deltas[MAX_REF_LF_DELTAS]; /* 0 = Intra, Last, GF, ARF */ signed char ref_lf_deltas[MAX_REF_LF_DELTAS]; + /* 0 = ZERO_MV, MV */ signed char last_mode_lf_deltas[MAX_MODE_LF_DELTAS]; /* 0 = ZERO_MV, MV */ @@ -404,34 +405,15 @@ static INLINE void update_partition_context(MACROBLOCKD *xd, int bwl = b_width_log2(sb_type); int bhl = b_height_log2(sb_type); int boffset = b_width_log2(BLOCK_SIZE_SB64X64) - bsl; - int i; + char pcvalue[2] = {~(0xe << boffset), ~(0xf <<boffset)}; + + assert(MAX(bwl, bhl) <= bsl); // update the partition context at the end notes. set partition bits // of block sizes larger than the current one to be one, and partition // bits of smaller block sizes to be zero. - if ((bwl == bsl) && (bhl == bsl)) { - for (i = 0; i < bs; i++) - xd->left_seg_context[i] = ~(0xf << boffset); - for (i = 0; i < bs; i++) - xd->above_seg_context[i] = ~(0xf << boffset); - } else if ((bwl == bsl) && (bhl < bsl)) { - for (i = 0; i < bs; i++) - xd->left_seg_context[i] = ~(0xe << boffset); - for (i = 0; i < bs; i++) - xd->above_seg_context[i] = ~(0xf << boffset); - } else if ((bwl < bsl) && (bhl == bsl)) { - for (i = 0; i < bs; i++) - xd->left_seg_context[i] = ~(0xf << boffset); - for (i = 0; i < bs; i++) - xd->above_seg_context[i] = ~(0xe << boffset); - } else if ((bwl < bsl) && (bhl < bsl)) { - for (i = 0; i < bs; i++) - xd->left_seg_context[i] = ~(0xe << boffset); - for (i = 0; i < bs; i++) - xd->above_seg_context[i] = ~(0xe << boffset); - } else { - assert(0); - } + vpx_memset(xd->above_seg_context, pcvalue[bwl == bsl], bs); + vpx_memset(xd->left_seg_context, pcvalue[bhl == bsl], bs); } static INLINE int partition_plane_context(MACROBLOCKD *xd, @@ -504,53 +486,25 @@ static BLOCK_SIZE_TYPE get_subsize(BLOCK_SIZE_TYPE bsize, return subsize; } -// transform mapping -static TX_TYPE txfm_map(MB_PREDICTION_MODE bmode) { - switch (bmode) { - case TM_PRED : - case D135_PRED : - return ADST_ADST; - - case V_PRED : - case D117_PRED : - case D63_PRED: - return ADST_DCT; - - case H_PRED : - case D153_PRED : - case D27_PRED : - return DCT_ADST; +extern const TX_TYPE mode2txfm_map[MB_MODE_COUNT]; - default: - return DCT_DCT; - } -} - -static TX_TYPE get_tx_type_4x4(const MACROBLOCKD *xd, int ib) { +static INLINE TX_TYPE get_tx_type_4x4(const MACROBLOCKD *xd, int ib) { MODE_INFO *const mi = xd->mode_info_context; MB_MODE_INFO *const mbmi = &mi->mbmi; if (xd->lossless || mbmi->ref_frame[0] != INTRA_FRAME) return DCT_DCT; - if (mbmi->sb_type < BLOCK_SIZE_SB8X8) { - return txfm_map(mi->bmi[ib].as_mode.first); - } else { - assert(mbmi->mode <= TM_PRED); - return txfm_map(mbmi->mode); - } + return mode2txfm_map[mbmi->sb_type < BLOCK_SIZE_SB8X8 ? + mi->bmi[ib].as_mode.first : mbmi->mode]; } -static TX_TYPE get_tx_type_8x8(const MACROBLOCKD *xd) { - return xd->mode_info_context->mbmi.mode <= TM_PRED - ? txfm_map(xd->mode_info_context->mbmi.mode) - : DCT_DCT; +static INLINE TX_TYPE get_tx_type_8x8(const MACROBLOCKD *xd) { + return mode2txfm_map[xd->mode_info_context->mbmi.mode]; } -static TX_TYPE get_tx_type_16x16(const MACROBLOCKD *xd) { - return xd->mode_info_context->mbmi.mode <= TM_PRED - ? txfm_map(xd->mode_info_context->mbmi.mode) - : DCT_DCT; +static INLINE TX_TYPE get_tx_type_16x16(const MACROBLOCKD *xd) { + return mode2txfm_map[xd->mode_info_context->mbmi.mode]; } void vp9_setup_block_dptrs(MACROBLOCKD *xd, diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c index 4086bf0e2..2989b9ccc 100644 --- a/vp9/common/vp9_reconintra.c +++ b/vp9/common/vp9_reconintra.c @@ -16,6 +16,24 @@ #include "vp9/common/vp9_onyxc_int.h" #include "vpx_mem/vpx_mem.h" +const TX_TYPE mode2txfm_map[MB_MODE_COUNT] = { + DCT_DCT, // DC + ADST_DCT, // V + DCT_ADST, // H + DCT_DCT, // D45 + ADST_ADST, // D135 + ADST_DCT, // D117 + DCT_ADST, // D153 + DCT_ADST, // D27 + ADST_DCT, // D63 + ADST_ADST, // TM + DCT_DCT, // NEARESTMV + DCT_DCT, // NEARMV + DCT_DCT, // ZEROMV + DCT_DCT // NEWMV +}; + + static void d27_predictor(uint8_t *ypred_ptr, int y_stride, int bw, int bh, uint8_t *yabove_row, uint8_t *yleft_col) { @@ -300,6 +318,7 @@ void vp9_predict_intra_block(MACROBLOCKD *xd, int bwl_in, TX_SIZE tx_size, int mode, + uint8_t *reference, int ref_stride, uint8_t *predictor, int pre_stride) { const int bwl = bwl_in - tx_size; const int wmask = (1 << bwl) - 1; @@ -309,7 +328,7 @@ void vp9_predict_intra_block(MACROBLOCKD *xd, const int txfm_block_size = 4 << tx_size; assert(bwl >= 0); - vp9_build_intra_predictors(predictor, pre_stride, + vp9_build_intra_predictors(reference, ref_stride, predictor, pre_stride, mode, txfm_block_size, diff --git a/vp9/common/vp9_reconintra.h b/vp9/common/vp9_reconintra.h index f5f5f42c4..e369a7192 100644 --- a/vp9/common/vp9_reconintra.h +++ b/vp9/common/vp9_reconintra.h @@ -25,6 +25,6 @@ void vp9_predict_intra_block(MACROBLOCKD *xd, int block_idx, int bwl_in, TX_SIZE tx_size, - int mode, + int mode, uint8_t *ref, int ref_stride, uint8_t *predictor, int pre_stride); #endif // VP9_COMMON_VP9_RECONINTRA_H_ |