1 /* 2 * Copyright (c) 2010 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_ONYXC_INT_H_ 12 #define VP9_COMMON_VP9_ONYXC_INT_H_ 13 14 #include "vpx_config.h" 15 #include "vpx/internal/vpx_codec_internal.h" 16 #include "vp9_rtcd.h" 17 #include "vp9/common/vp9_loopfilter.h" 18 #include "vp9/common/vp9_entropymv.h" 19 #include "vp9/common/vp9_entropy.h" 20 #include "vp9/common/vp9_entropymode.h" 21 #include "vp9/common/vp9_quant_common.h" 22 23 #if CONFIG_VP9_POSTPROC 24 #include "vp9/common/vp9_postproc.h" 25 #endif 26 27 #define ALLOWED_REFS_PER_FRAME 3 28 29 #define NUM_REF_FRAMES_LOG2 3 30 #define NUM_REF_FRAMES (1 << NUM_REF_FRAMES_LOG2) 31 32 // 1 scratch frame for the new frame, 3 for scaled references on the encoder 33 // TODO(jkoleszar): These 3 extra references could probably come from the 34 // normal reference pool. 35 #define NUM_YV12_BUFFERS (NUM_REF_FRAMES + 4) 36 37 #define NUM_FRAME_CONTEXTS_LOG2 2 38 #define NUM_FRAME_CONTEXTS (1 << NUM_FRAME_CONTEXTS_LOG2) 39 40 typedef struct frame_contexts { 41 vp9_prob y_mode_prob[BLOCK_SIZE_GROUPS][INTRA_MODES - 1]; 42 vp9_prob uv_mode_prob[INTRA_MODES][INTRA_MODES - 1]; 43 vp9_prob partition_prob[NUM_FRAME_TYPES][NUM_PARTITION_CONTEXTS] 44 [PARTITION_TYPES - 1]; 45 vp9_coeff_probs_model coef_probs[TX_SIZES][BLOCK_TYPES]; 46 vp9_prob switchable_interp_prob[SWITCHABLE_FILTERS + 1] 47 [SWITCHABLE_FILTERS - 1]; 48 vp9_prob inter_mode_probs[INTER_MODE_CONTEXTS][INTER_MODES - 1]; 49 vp9_prob intra_inter_prob[INTRA_INTER_CONTEXTS]; 50 vp9_prob comp_inter_prob[COMP_INTER_CONTEXTS]; 51 vp9_prob single_ref_prob[REF_CONTEXTS][2]; 52 vp9_prob comp_ref_prob[REF_CONTEXTS]; 53 struct tx_probs tx_probs; 54 vp9_prob mbskip_probs[MBSKIP_CONTEXTS]; 55 nmv_context nmvc; 56 } FRAME_CONTEXT; 57 58 typedef struct { 59 unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES]; 60 unsigned int uv_mode[INTRA_MODES][INTRA_MODES]; 61 unsigned int partition[NUM_PARTITION_CONTEXTS][PARTITION_TYPES]; 62 vp9_coeff_count_model coef[TX_SIZES][BLOCK_TYPES]; 63 unsigned int eob_branch[TX_SIZES][BLOCK_TYPES][REF_TYPES] 64 [COEF_BANDS][PREV_COEF_CONTEXTS]; 65 unsigned int switchable_interp[SWITCHABLE_FILTERS + 1] 66 [SWITCHABLE_FILTERS]; 67 unsigned int inter_mode[INTER_MODE_CONTEXTS][INTER_MODES]; 68 unsigned int intra_inter[INTRA_INTER_CONTEXTS][2]; 69 unsigned int comp_inter[COMP_INTER_CONTEXTS][2]; 70 unsigned int single_ref[REF_CONTEXTS][2][2]; 71 unsigned int comp_ref[REF_CONTEXTS][2]; 72 struct tx_counts tx; 73 unsigned int mbskip[MBSKIP_CONTEXTS][2]; 74 nmv_context_counts mv; 75 } FRAME_COUNTS; 76 77 78 typedef enum { 79 SINGLE_PREDICTION_ONLY = 0, 80 COMP_PREDICTION_ONLY = 1, 81 HYBRID_PREDICTION = 2, 82 NB_PREDICTION_TYPES = 3, 83 } COMPPREDMODE_TYPE; 84 85 typedef struct VP9Common { 86 struct vpx_internal_error_info error; 87 88 DECLARE_ALIGNED(16, int16_t, y_dequant[QINDEX_RANGE][8]); 89 DECLARE_ALIGNED(16, int16_t, uv_dequant[QINDEX_RANGE][8]); 90 #if CONFIG_ALPHA 91 DECLARE_ALIGNED(16, int16_t, a_dequant[QINDEX_RANGE][8]); 92 #endif 93 94 int width; 95 int height; 96 int display_width; 97 int display_height; 98 int last_width; 99 int last_height; 100 101 // TODO(jkoleszar): this implies chroma ss right now, but could vary per 102 // plane. Revisit as part of the future change to YV12_BUFFER_CONFIG to 103 // support additional planes. 104 int subsampling_x; 105 int subsampling_y; 106 107 YV12_BUFFER_CONFIG *frame_to_show; 108 109 YV12_BUFFER_CONFIG yv12_fb[NUM_YV12_BUFFERS]; 110 int fb_idx_ref_cnt[NUM_YV12_BUFFERS]; /* reference counts */ 111 int ref_frame_map[NUM_REF_FRAMES]; /* maps fb_idx to reference slot */ 112 113 // TODO(jkoleszar): could expand active_ref_idx to 4, with 0 as intra, and 114 // roll new_fb_idx into it. 115 116 // Each frame can reference ALLOWED_REFS_PER_FRAME buffers 117 int active_ref_idx[ALLOWED_REFS_PER_FRAME]; 118 struct scale_factors active_ref_scale[ALLOWED_REFS_PER_FRAME]; 119 int new_fb_idx; 120 121 YV12_BUFFER_CONFIG post_proc_buffer; 122 123 FRAME_TYPE last_frame_type; /* Save last frame's frame type for motion search. */ 124 FRAME_TYPE frame_type; 125 126 int show_frame; 127 int last_show_frame; 128 129 // Flag signaling that the frame is encoded using only INTRA modes. 130 int intra_only; 131 132 // Flag signaling that the frame context should be reset to default values. 133 // 0 or 1 implies don't reset, 2 reset just the context specified in the 134 // frame header, 3 reset all contexts. 135 int reset_frame_context; 136 137 int frame_flags; 138 // MBs, mb_rows/cols is in 16-pixel units; mi_rows/cols is in 139 // MODE_INFO (8-pixel) units. 140 int MBs; 141 int mb_rows, mi_rows; 142 int mb_cols, mi_cols; 143 int mode_info_stride; 144 145 /* profile settings */ 146 TX_MODE tx_mode; 147 148 int base_qindex; 149 int last_kf_gf_q; /* Q used on the last GF or KF */ 150 151 int y_dc_delta_q; 152 int uv_dc_delta_q; 153 int uv_ac_delta_q; 154 #if CONFIG_ALPHA 155 int a_dc_delta_q; 156 int a_ac_delta_q; 157 #endif 158 159 /* We allocate a MODE_INFO struct for each macroblock, together with 160 an extra row on top and column on the left to simplify prediction. */ 161 162 MODE_INFO *mip; /* Base of allocated array */ 163 MODE_INFO *mi; /* Corresponds to upper left visible macroblock */ 164 MODE_INFO *prev_mip; /* MODE_INFO array 'mip' from last decoded frame */ 165 MODE_INFO *prev_mi; /* 'mi' from last frame (points into prev_mip) */ 166 167 MODE_INFO **mi_grid_base; 168 MODE_INFO **mi_grid_visible; 169 MODE_INFO **prev_mi_grid_base; 170 MODE_INFO **prev_mi_grid_visible; 171 172 // Persistent mb segment id map used in prediction. 173 unsigned char *last_frame_seg_map; 174 175 INTERPOLATIONFILTERTYPE mcomp_filter_type; 176 177 loop_filter_info_n lf_info; 178 179 int refresh_frame_context; /* Two state 0 = NO, 1 = YES */ 180 181 int ref_frame_sign_bias[MAX_REF_FRAMES]; /* Two state 0, 1 */ 182 183 struct loopfilter lf; 184 struct segmentation seg; 185 186 /* Y,U,V */ 187 ENTROPY_CONTEXT *above_context[MAX_MB_PLANE]; 188 ENTROPY_CONTEXT left_context[MAX_MB_PLANE][16]; 189 190 // partition contexts 191 PARTITION_CONTEXT *above_seg_context; 192 PARTITION_CONTEXT left_seg_context[8]; 193 194 // Context probabilities for reference frame prediction 195 int allow_comp_inter_inter; 196 MV_REFERENCE_FRAME comp_fixed_ref; 197 MV_REFERENCE_FRAME comp_var_ref[2]; 198 COMPPREDMODE_TYPE comp_pred_mode; 199 200 FRAME_CONTEXT fc; /* this frame entropy */ 201 FRAME_CONTEXT frame_contexts[NUM_FRAME_CONTEXTS]; 202 unsigned int frame_context_idx; /* Context to use/update */ 203 FRAME_COUNTS counts; 204 205 unsigned int current_video_frame; 206 int version; 207 208 #if CONFIG_VP9_POSTPROC 209 struct postproc_state postproc_state; 210 #endif 211 212 int error_resilient_mode; 213 int frame_parallel_decoding_mode; 214 215 int log2_tile_cols, log2_tile_rows; 216 int cur_tile_mi_col_start, cur_tile_mi_col_end; 217 int cur_tile_mi_row_start, cur_tile_mi_row_end; 218 } VP9_COMMON; 219 220 static int get_free_fb(VP9_COMMON *cm) { 221 int i; 222 for (i = 0; i < NUM_YV12_BUFFERS; i++) 223 if (cm->fb_idx_ref_cnt[i] == 0) 224 break; 225 226 assert(i < NUM_YV12_BUFFERS); 227 cm->fb_idx_ref_cnt[i] = 1; 228 return i; 229 } 230 231 static void ref_cnt_fb(int *buf, int *idx, int new_idx) { 232 if (buf[*idx] > 0) 233 buf[*idx]--; 234 235 *idx = new_idx; 236 237 buf[new_idx]++; 238 } 239 240 static int mi_cols_aligned_to_sb(int n_mis) { 241 return ALIGN_POWER_OF_TWO(n_mis, MI_BLOCK_SIZE_LOG2); 242 } 243 244 static INLINE void set_skip_context(VP9_COMMON *cm, MACROBLOCKD *xd, 245 int mi_row, int mi_col) { 246 const int above_idx = mi_col * 2; 247 const int left_idx = (mi_row * 2) & 15; 248 int i; 249 for (i = 0; i < MAX_MB_PLANE; i++) { 250 struct macroblockd_plane *const pd = &xd->plane[i]; 251 pd->above_context = cm->above_context[i] + (above_idx >> pd->subsampling_x); 252 pd->left_context = cm->left_context[i] + (left_idx >> pd->subsampling_y); 253 } 254 } 255 256 static INLINE void set_partition_seg_context(VP9_COMMON *cm, MACROBLOCKD *xd, 257 int mi_row, int mi_col) { 258 xd->above_seg_context = cm->above_seg_context + mi_col; 259 xd->left_seg_context = cm->left_seg_context + (mi_row & MI_MASK); 260 } 261 262 // return the node index in the prob tree for binary coding 263 static int check_bsize_coverage(int bs, int mi_rows, int mi_cols, 264 int mi_row, int mi_col) { 265 const int r = (mi_row + bs < mi_rows); 266 const int c = (mi_col + bs < mi_cols); 267 268 if (r && c) 269 return 0; 270 271 if (c && !r) 272 return 1; // only allow horizontal/split partition types 273 274 if (r && !c) 275 return 2; // only allow vertical/split partition types 276 277 return -1; 278 } 279 280 static void set_mi_row_col(VP9_COMMON *cm, MACROBLOCKD *xd, 281 int mi_row, int bh, 282 int mi_col, int bw) { 283 xd->mb_to_top_edge = -((mi_row * MI_SIZE) << 3); 284 xd->mb_to_bottom_edge = ((cm->mi_rows - bh - mi_row) * MI_SIZE) << 3; 285 xd->mb_to_left_edge = -((mi_col * MI_SIZE) << 3); 286 xd->mb_to_right_edge = ((cm->mi_cols - bw - mi_col) * MI_SIZE) << 3; 287 288 // Are edges available for intra prediction? 289 xd->up_available = (mi_row != 0); 290 xd->left_available = (mi_col > cm->cur_tile_mi_col_start); 291 xd->right_available = (mi_col + bw < cm->cur_tile_mi_col_end); 292 } 293 294 static int get_token_alloc(int mb_rows, int mb_cols) { 295 return mb_rows * mb_cols * (48 * 16 + 4); 296 } 297 298 static void set_prev_mi(VP9_COMMON *cm) { 299 const int use_prev_in_find_mv_refs = cm->width == cm->last_width && 300 cm->height == cm->last_height && 301 !cm->error_resilient_mode && 302 !cm->intra_only && 303 cm->last_show_frame; 304 // Special case: set prev_mi to NULL when the previous mode info 305 // context cannot be used. 306 cm->prev_mi = use_prev_in_find_mv_refs ? 307 cm->prev_mip + cm->mode_info_stride + 1 : NULL; 308 } 309 #endif // VP9_COMMON_VP9_ONYXC_INT_H_ 310