1 /* 2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef VP9_COMMON_VP9_PRED_COMMON_H_ 12 #define VP9_COMMON_VP9_PRED_COMMON_H_ 13 14 #include "vp9/common/vp9_blockd.h" 15 #include "vp9/common/vp9_onyxc_int.h" 16 17 int vp9_get_segment_id(VP9_COMMON *cm, const uint8_t *segment_ids, 18 BLOCK_SIZE bsize, int mi_row, int mi_col); 19 20 21 static INLINE int vp9_get_pred_context_seg_id(const MACROBLOCKD *xd) { 22 const MODE_INFO * const above_mi = xd->mi_8x8[-xd->mode_info_stride]; 23 const MODE_INFO * const left_mi = xd->mi_8x8[-1]; 24 const int above_sip = above_mi ? above_mi->mbmi.seg_id_predicted : 0; 25 const int left_sip = left_mi ? left_mi->mbmi.seg_id_predicted : 0; 26 27 return above_sip + (xd->left_available ? left_sip : 0); 28 } 29 30 static INLINE vp9_prob vp9_get_pred_prob_seg_id(struct segmentation *seg, 31 const MACROBLOCKD *xd) { 32 return seg->pred_probs[vp9_get_pred_context_seg_id(xd)]; 33 } 34 35 void vp9_set_pred_flag_seg_id(MACROBLOCKD *xd, uint8_t pred_flag); 36 37 static INLINE int vp9_get_pred_context_mbskip(const MACROBLOCKD *xd) { 38 const MODE_INFO * const above_mi = xd->mi_8x8[-xd->mode_info_stride]; 39 const MODE_INFO * const left_mi = xd->mi_8x8[-1]; 40 const int above_skip_coeff = above_mi ? above_mi->mbmi.skip_coeff : 0; 41 const int left_skip_coeff = left_mi ? left_mi->mbmi.skip_coeff : 0; 42 43 return above_skip_coeff + (xd->left_available ? left_skip_coeff : 0); 44 } 45 46 static INLINE vp9_prob vp9_get_pred_prob_mbskip(const VP9_COMMON *cm, 47 const MACROBLOCKD *xd) { 48 return cm->fc.mbskip_probs[vp9_get_pred_context_mbskip(xd)]; 49 } 50 51 static INLINE unsigned char vp9_get_pred_flag_mbskip(const MACROBLOCKD *xd) { 52 return xd->this_mi->mbmi.skip_coeff; 53 } 54 55 void vp9_set_pred_flag_mbskip(MACROBLOCKD *xd, BLOCK_SIZE bsize, 56 uint8_t pred_flag); 57 58 unsigned char vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd); 59 60 unsigned char vp9_get_pred_context_intra_inter(const MACROBLOCKD *xd); 61 62 static INLINE vp9_prob vp9_get_pred_prob_intra_inter(const VP9_COMMON *cm, 63 const MACROBLOCKD *xd) { 64 const int pred_context = vp9_get_pred_context_intra_inter(xd); 65 return cm->fc.intra_inter_prob[pred_context]; 66 } 67 68 unsigned char vp9_get_pred_context_comp_inter_inter(const VP9_COMMON *cm, 69 const MACROBLOCKD *xd); 70 71 72 static INLINE vp9_prob vp9_get_pred_prob_comp_inter_inter(const VP9_COMMON *cm, 73 const MACROBLOCKD *xd) { 74 const int pred_context = vp9_get_pred_context_comp_inter_inter(cm, xd); 75 return cm->fc.comp_inter_prob[pred_context]; 76 } 77 78 unsigned char vp9_get_pred_context_comp_ref_p(const VP9_COMMON *cm, 79 const MACROBLOCKD *xd); 80 81 static INLINE vp9_prob vp9_get_pred_prob_comp_ref_p(const VP9_COMMON *cm, 82 const MACROBLOCKD *xd) { 83 const int pred_context = vp9_get_pred_context_comp_ref_p(cm, xd); 84 return cm->fc.comp_ref_prob[pred_context]; 85 } 86 87 unsigned char vp9_get_pred_context_single_ref_p1(const MACROBLOCKD *xd); 88 89 static INLINE vp9_prob vp9_get_pred_prob_single_ref_p1(const VP9_COMMON *cm, 90 const MACROBLOCKD *xd) { 91 const int pred_context = vp9_get_pred_context_single_ref_p1(xd); 92 return cm->fc.single_ref_prob[pred_context][0]; 93 } 94 95 unsigned char vp9_get_pred_context_single_ref_p2(const MACROBLOCKD *xd); 96 97 static INLINE vp9_prob vp9_get_pred_prob_single_ref_p2(const VP9_COMMON *cm, 98 const MACROBLOCKD *xd) { 99 const int pred_context = vp9_get_pred_context_single_ref_p2(xd); 100 return cm->fc.single_ref_prob[pred_context][1]; 101 } 102 103 unsigned char vp9_get_pred_context_tx_size(const MACROBLOCKD *xd); 104 105 static const vp9_prob *get_tx_probs(BLOCK_SIZE bsize, uint8_t context, 106 const struct tx_probs *tx_probs) { 107 if (bsize < BLOCK_16X16) 108 return tx_probs->p8x8[context]; 109 else if (bsize < BLOCK_32X32) 110 return tx_probs->p16x16[context]; 111 else 112 return tx_probs->p32x32[context]; 113 } 114 115 static const vp9_prob *get_tx_probs2(const MACROBLOCKD *xd, 116 const struct tx_probs *tx_probs, 117 const MODE_INFO *m) { 118 const BLOCK_SIZE bsize = m->mbmi.sb_type; 119 const int context = vp9_get_pred_context_tx_size(xd); 120 return get_tx_probs(bsize, context, tx_probs); 121 } 122 123 static void update_tx_counts(BLOCK_SIZE bsize, uint8_t context, 124 TX_SIZE tx_size, struct tx_counts *tx_counts) { 125 if (bsize >= BLOCK_32X32) 126 tx_counts->p32x32[context][tx_size]++; 127 else if (bsize >= BLOCK_16X16) 128 tx_counts->p16x16[context][tx_size]++; 129 else 130 tx_counts->p8x8[context][tx_size]++; 131 } 132 133 #endif // VP9_COMMON_VP9_PRED_COMMON_H_ 134