1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP9_COMMON_VP9_BLOCKD_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP9_COMMON_VP9_BLOCKD_H_
13*fb1b10abSAndroid Build Coastguard Worker
14*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
15*fb1b10abSAndroid Build Coastguard Worker
16*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/vpx_dsp_common.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/mem.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale/yv12config.h"
19*fb1b10abSAndroid Build Coastguard Worker
20*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_common_data.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropymode.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_mv.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_scale.h"
25*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_seg_common.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_tile_common.h"
27*fb1b10abSAndroid Build Coastguard Worker
28*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
29*fb1b10abSAndroid Build Coastguard Worker extern "C" {
30*fb1b10abSAndroid Build Coastguard Worker #endif
31*fb1b10abSAndroid Build Coastguard Worker
32*fb1b10abSAndroid Build Coastguard Worker #define MAX_MB_PLANE 3
33*fb1b10abSAndroid Build Coastguard Worker
34*fb1b10abSAndroid Build Coastguard Worker typedef enum {
35*fb1b10abSAndroid Build Coastguard Worker KEY_FRAME = 0,
36*fb1b10abSAndroid Build Coastguard Worker INTER_FRAME = 1,
37*fb1b10abSAndroid Build Coastguard Worker FRAME_TYPES,
38*fb1b10abSAndroid Build Coastguard Worker } FRAME_TYPE;
39*fb1b10abSAndroid Build Coastguard Worker
is_inter_mode(PREDICTION_MODE mode)40*fb1b10abSAndroid Build Coastguard Worker static INLINE int is_inter_mode(PREDICTION_MODE mode) {
41*fb1b10abSAndroid Build Coastguard Worker return mode >= NEARESTMV && mode <= NEWMV;
42*fb1b10abSAndroid Build Coastguard Worker }
43*fb1b10abSAndroid Build Coastguard Worker
44*fb1b10abSAndroid Build Coastguard Worker /* For keyframes, intra block modes are predicted by the (already decoded)
45*fb1b10abSAndroid Build Coastguard Worker modes for the Y blocks to the left and above us; for interframes, there
46*fb1b10abSAndroid Build Coastguard Worker is a single probability table. */
47*fb1b10abSAndroid Build Coastguard Worker
48*fb1b10abSAndroid Build Coastguard Worker typedef struct {
49*fb1b10abSAndroid Build Coastguard Worker PREDICTION_MODE as_mode;
50*fb1b10abSAndroid Build Coastguard Worker int_mv as_mv[2]; // first, second inter predictor motion vectors
51*fb1b10abSAndroid Build Coastguard Worker } b_mode_info;
52*fb1b10abSAndroid Build Coastguard Worker
53*fb1b10abSAndroid Build Coastguard Worker // Note that the rate-distortion optimization loop, bit-stream writer, and
54*fb1b10abSAndroid Build Coastguard Worker // decoder implementation modules critically rely on the defined entry values
55*fb1b10abSAndroid Build Coastguard Worker // specified herein. They should be refactored concurrently.
56*fb1b10abSAndroid Build Coastguard Worker
57*fb1b10abSAndroid Build Coastguard Worker #define NO_REF_FRAME (-1)
58*fb1b10abSAndroid Build Coastguard Worker #define INTRA_FRAME 0
59*fb1b10abSAndroid Build Coastguard Worker #define LAST_FRAME 1
60*fb1b10abSAndroid Build Coastguard Worker #define GOLDEN_FRAME 2
61*fb1b10abSAndroid Build Coastguard Worker #define ALTREF_FRAME 3
62*fb1b10abSAndroid Build Coastguard Worker #define MAX_REF_FRAMES 4
63*fb1b10abSAndroid Build Coastguard Worker #define MAX_INTER_REF_FRAMES 3
64*fb1b10abSAndroid Build Coastguard Worker
65*fb1b10abSAndroid Build Coastguard Worker typedef int8_t MV_REFERENCE_FRAME;
66*fb1b10abSAndroid Build Coastguard Worker
mv_ref_frame_to_inter_ref_idx(MV_REFERENCE_FRAME mv_ref_frame)67*fb1b10abSAndroid Build Coastguard Worker static INLINE int mv_ref_frame_to_inter_ref_idx(
68*fb1b10abSAndroid Build Coastguard Worker MV_REFERENCE_FRAME mv_ref_frame) {
69*fb1b10abSAndroid Build Coastguard Worker assert(mv_ref_frame >= LAST_FRAME && mv_ref_frame < MAX_REF_FRAMES);
70*fb1b10abSAndroid Build Coastguard Worker return mv_ref_frame - 1;
71*fb1b10abSAndroid Build Coastguard Worker }
72*fb1b10abSAndroid Build Coastguard Worker
73*fb1b10abSAndroid Build Coastguard Worker // This structure now relates to 8x8 block regions.
74*fb1b10abSAndroid Build Coastguard Worker typedef struct MODE_INFO {
75*fb1b10abSAndroid Build Coastguard Worker // Common for both INTER and INTRA blocks
76*fb1b10abSAndroid Build Coastguard Worker BLOCK_SIZE sb_type;
77*fb1b10abSAndroid Build Coastguard Worker PREDICTION_MODE mode;
78*fb1b10abSAndroid Build Coastguard Worker TX_SIZE tx_size;
79*fb1b10abSAndroid Build Coastguard Worker int8_t skip;
80*fb1b10abSAndroid Build Coastguard Worker int8_t segment_id;
81*fb1b10abSAndroid Build Coastguard Worker int8_t seg_id_predicted; // valid only when temporal_update is enabled
82*fb1b10abSAndroid Build Coastguard Worker
83*fb1b10abSAndroid Build Coastguard Worker // Only for INTRA blocks
84*fb1b10abSAndroid Build Coastguard Worker PREDICTION_MODE uv_mode;
85*fb1b10abSAndroid Build Coastguard Worker
86*fb1b10abSAndroid Build Coastguard Worker // Only for INTER blocks
87*fb1b10abSAndroid Build Coastguard Worker INTERP_FILTER interp_filter;
88*fb1b10abSAndroid Build Coastguard Worker
89*fb1b10abSAndroid Build Coastguard Worker // if ref_frame[idx] is equal to ALTREF_FRAME then
90*fb1b10abSAndroid Build Coastguard Worker // MACROBLOCKD::block_ref[idx] is an altref
91*fb1b10abSAndroid Build Coastguard Worker MV_REFERENCE_FRAME ref_frame[2];
92*fb1b10abSAndroid Build Coastguard Worker
93*fb1b10abSAndroid Build Coastguard Worker // TODO(slavarnway): Delete and use bmi[3].as_mv[] instead.
94*fb1b10abSAndroid Build Coastguard Worker int_mv mv[2];
95*fb1b10abSAndroid Build Coastguard Worker
96*fb1b10abSAndroid Build Coastguard Worker b_mode_info bmi[4];
97*fb1b10abSAndroid Build Coastguard Worker } MODE_INFO;
98*fb1b10abSAndroid Build Coastguard Worker
get_y_mode(const MODE_INFO * mi,int block)99*fb1b10abSAndroid Build Coastguard Worker static INLINE PREDICTION_MODE get_y_mode(const MODE_INFO *mi, int block) {
100*fb1b10abSAndroid Build Coastguard Worker return mi->sb_type < BLOCK_8X8 ? mi->bmi[block].as_mode : mi->mode;
101*fb1b10abSAndroid Build Coastguard Worker }
102*fb1b10abSAndroid Build Coastguard Worker
is_inter_block(const MODE_INFO * mi)103*fb1b10abSAndroid Build Coastguard Worker static INLINE int is_inter_block(const MODE_INFO *mi) {
104*fb1b10abSAndroid Build Coastguard Worker return mi->ref_frame[0] > INTRA_FRAME;
105*fb1b10abSAndroid Build Coastguard Worker }
106*fb1b10abSAndroid Build Coastguard Worker
has_second_ref(const MODE_INFO * mi)107*fb1b10abSAndroid Build Coastguard Worker static INLINE int has_second_ref(const MODE_INFO *mi) {
108*fb1b10abSAndroid Build Coastguard Worker return mi->ref_frame[1] > INTRA_FRAME;
109*fb1b10abSAndroid Build Coastguard Worker }
110*fb1b10abSAndroid Build Coastguard Worker
111*fb1b10abSAndroid Build Coastguard Worker PREDICTION_MODE vp9_left_block_mode(const MODE_INFO *cur_mi,
112*fb1b10abSAndroid Build Coastguard Worker const MODE_INFO *left_mi, int b);
113*fb1b10abSAndroid Build Coastguard Worker
114*fb1b10abSAndroid Build Coastguard Worker PREDICTION_MODE vp9_above_block_mode(const MODE_INFO *cur_mi,
115*fb1b10abSAndroid Build Coastguard Worker const MODE_INFO *above_mi, int b);
116*fb1b10abSAndroid Build Coastguard Worker
117*fb1b10abSAndroid Build Coastguard Worker enum mv_precision { MV_PRECISION_Q3, MV_PRECISION_Q4 };
118*fb1b10abSAndroid Build Coastguard Worker
119*fb1b10abSAndroid Build Coastguard Worker struct buf_2d {
120*fb1b10abSAndroid Build Coastguard Worker uint8_t *buf;
121*fb1b10abSAndroid Build Coastguard Worker int stride;
122*fb1b10abSAndroid Build Coastguard Worker };
123*fb1b10abSAndroid Build Coastguard Worker
124*fb1b10abSAndroid Build Coastguard Worker struct macroblockd_plane {
125*fb1b10abSAndroid Build Coastguard Worker tran_low_t *dqcoeff;
126*fb1b10abSAndroid Build Coastguard Worker int subsampling_x;
127*fb1b10abSAndroid Build Coastguard Worker int subsampling_y;
128*fb1b10abSAndroid Build Coastguard Worker struct buf_2d dst;
129*fb1b10abSAndroid Build Coastguard Worker struct buf_2d pre[2];
130*fb1b10abSAndroid Build Coastguard Worker ENTROPY_CONTEXT *above_context;
131*fb1b10abSAndroid Build Coastguard Worker ENTROPY_CONTEXT *left_context;
132*fb1b10abSAndroid Build Coastguard Worker int16_t seg_dequant[MAX_SEGMENTS][2];
133*fb1b10abSAndroid Build Coastguard Worker
134*fb1b10abSAndroid Build Coastguard Worker // number of 4x4s in current block
135*fb1b10abSAndroid Build Coastguard Worker uint16_t n4_w, n4_h;
136*fb1b10abSAndroid Build Coastguard Worker // log2 of n4_w, n4_h
137*fb1b10abSAndroid Build Coastguard Worker uint8_t n4_wl, n4_hl;
138*fb1b10abSAndroid Build Coastguard Worker
139*fb1b10abSAndroid Build Coastguard Worker // encoder
140*fb1b10abSAndroid Build Coastguard Worker const int16_t *dequant;
141*fb1b10abSAndroid Build Coastguard Worker
142*fb1b10abSAndroid Build Coastguard Worker int *eob;
143*fb1b10abSAndroid Build Coastguard Worker };
144*fb1b10abSAndroid Build Coastguard Worker
145*fb1b10abSAndroid Build Coastguard Worker #define BLOCK_OFFSET(x, i) ((x) + (i)*16)
146*fb1b10abSAndroid Build Coastguard Worker
147*fb1b10abSAndroid Build Coastguard Worker typedef struct RefBuffer {
148*fb1b10abSAndroid Build Coastguard Worker // TODO(dkovalev): idx is not really required and should be removed, now it
149*fb1b10abSAndroid Build Coastguard Worker // is used in vp9_onyxd_if.c
150*fb1b10abSAndroid Build Coastguard Worker int idx;
151*fb1b10abSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG *buf;
152*fb1b10abSAndroid Build Coastguard Worker struct scale_factors sf;
153*fb1b10abSAndroid Build Coastguard Worker } RefBuffer;
154*fb1b10abSAndroid Build Coastguard Worker
155*fb1b10abSAndroid Build Coastguard Worker typedef struct macroblockd {
156*fb1b10abSAndroid Build Coastguard Worker struct macroblockd_plane plane[MAX_MB_PLANE];
157*fb1b10abSAndroid Build Coastguard Worker uint8_t bmode_blocks_wl;
158*fb1b10abSAndroid Build Coastguard Worker uint8_t bmode_blocks_hl;
159*fb1b10abSAndroid Build Coastguard Worker
160*fb1b10abSAndroid Build Coastguard Worker FRAME_COUNTS *counts;
161*fb1b10abSAndroid Build Coastguard Worker TileInfo tile;
162*fb1b10abSAndroid Build Coastguard Worker
163*fb1b10abSAndroid Build Coastguard Worker int mi_stride;
164*fb1b10abSAndroid Build Coastguard Worker
165*fb1b10abSAndroid Build Coastguard Worker // Grid of 8x8 cells is placed over the block.
166*fb1b10abSAndroid Build Coastguard Worker // If some of them belong to the same mbtree-block
167*fb1b10abSAndroid Build Coastguard Worker // they will just have same mi[i][j] value
168*fb1b10abSAndroid Build Coastguard Worker MODE_INFO **mi;
169*fb1b10abSAndroid Build Coastguard Worker MODE_INFO *left_mi;
170*fb1b10abSAndroid Build Coastguard Worker MODE_INFO *above_mi;
171*fb1b10abSAndroid Build Coastguard Worker
172*fb1b10abSAndroid Build Coastguard Worker unsigned int max_blocks_wide;
173*fb1b10abSAndroid Build Coastguard Worker unsigned int max_blocks_high;
174*fb1b10abSAndroid Build Coastguard Worker
175*fb1b10abSAndroid Build Coastguard Worker const vpx_prob (*partition_probs)[PARTITION_TYPES - 1];
176*fb1b10abSAndroid Build Coastguard Worker
177*fb1b10abSAndroid Build Coastguard Worker /* Distance of MB away from frame edges */
178*fb1b10abSAndroid Build Coastguard Worker int mb_to_left_edge;
179*fb1b10abSAndroid Build Coastguard Worker int mb_to_right_edge;
180*fb1b10abSAndroid Build Coastguard Worker int mb_to_top_edge;
181*fb1b10abSAndroid Build Coastguard Worker int mb_to_bottom_edge;
182*fb1b10abSAndroid Build Coastguard Worker
183*fb1b10abSAndroid Build Coastguard Worker FRAME_CONTEXT *fc;
184*fb1b10abSAndroid Build Coastguard Worker
185*fb1b10abSAndroid Build Coastguard Worker /* pointers to reference frames */
186*fb1b10abSAndroid Build Coastguard Worker const RefBuffer *block_refs[2];
187*fb1b10abSAndroid Build Coastguard Worker
188*fb1b10abSAndroid Build Coastguard Worker /* pointer to current frame */
189*fb1b10abSAndroid Build Coastguard Worker const YV12_BUFFER_CONFIG *cur_buf;
190*fb1b10abSAndroid Build Coastguard Worker
191*fb1b10abSAndroid Build Coastguard Worker ENTROPY_CONTEXT *above_context[MAX_MB_PLANE];
192*fb1b10abSAndroid Build Coastguard Worker ENTROPY_CONTEXT left_context[MAX_MB_PLANE][16];
193*fb1b10abSAndroid Build Coastguard Worker
194*fb1b10abSAndroid Build Coastguard Worker PARTITION_CONTEXT *above_seg_context;
195*fb1b10abSAndroid Build Coastguard Worker PARTITION_CONTEXT left_seg_context[8];
196*fb1b10abSAndroid Build Coastguard Worker
197*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
198*fb1b10abSAndroid Build Coastguard Worker /* Bit depth: 8, 10, 12 */
199*fb1b10abSAndroid Build Coastguard Worker int bd;
200*fb1b10abSAndroid Build Coastguard Worker #endif
201*fb1b10abSAndroid Build Coastguard Worker
202*fb1b10abSAndroid Build Coastguard Worker int lossless;
203*fb1b10abSAndroid Build Coastguard Worker int corrupted;
204*fb1b10abSAndroid Build Coastguard Worker
205*fb1b10abSAndroid Build Coastguard Worker struct vpx_internal_error_info *error_info;
206*fb1b10abSAndroid Build Coastguard Worker
207*fb1b10abSAndroid Build Coastguard Worker PARTITION_TYPE *partition;
208*fb1b10abSAndroid Build Coastguard Worker } MACROBLOCKD;
209*fb1b10abSAndroid Build Coastguard Worker
get_plane_type(int plane)210*fb1b10abSAndroid Build Coastguard Worker static INLINE PLANE_TYPE get_plane_type(int plane) {
211*fb1b10abSAndroid Build Coastguard Worker return (PLANE_TYPE)(plane > 0);
212*fb1b10abSAndroid Build Coastguard Worker }
213*fb1b10abSAndroid Build Coastguard Worker
get_subsize(BLOCK_SIZE bsize,PARTITION_TYPE partition)214*fb1b10abSAndroid Build Coastguard Worker static INLINE BLOCK_SIZE get_subsize(BLOCK_SIZE bsize,
215*fb1b10abSAndroid Build Coastguard Worker PARTITION_TYPE partition) {
216*fb1b10abSAndroid Build Coastguard Worker return subsize_lookup[partition][bsize];
217*fb1b10abSAndroid Build Coastguard Worker }
218*fb1b10abSAndroid Build Coastguard Worker
219*fb1b10abSAndroid Build Coastguard Worker extern const TX_TYPE intra_mode_to_tx_type_lookup[INTRA_MODES];
220*fb1b10abSAndroid Build Coastguard Worker
get_tx_type(PLANE_TYPE plane_type,const MACROBLOCKD * xd)221*fb1b10abSAndroid Build Coastguard Worker static INLINE TX_TYPE get_tx_type(PLANE_TYPE plane_type,
222*fb1b10abSAndroid Build Coastguard Worker const MACROBLOCKD *xd) {
223*fb1b10abSAndroid Build Coastguard Worker const MODE_INFO *const mi = xd->mi[0];
224*fb1b10abSAndroid Build Coastguard Worker
225*fb1b10abSAndroid Build Coastguard Worker if (plane_type != PLANE_TYPE_Y || xd->lossless || is_inter_block(mi))
226*fb1b10abSAndroid Build Coastguard Worker return DCT_DCT;
227*fb1b10abSAndroid Build Coastguard Worker
228*fb1b10abSAndroid Build Coastguard Worker return intra_mode_to_tx_type_lookup[mi->mode];
229*fb1b10abSAndroid Build Coastguard Worker }
230*fb1b10abSAndroid Build Coastguard Worker
get_tx_type_4x4(PLANE_TYPE plane_type,const MACROBLOCKD * xd,int ib)231*fb1b10abSAndroid Build Coastguard Worker static INLINE TX_TYPE get_tx_type_4x4(PLANE_TYPE plane_type,
232*fb1b10abSAndroid Build Coastguard Worker const MACROBLOCKD *xd, int ib) {
233*fb1b10abSAndroid Build Coastguard Worker const MODE_INFO *const mi = xd->mi[0];
234*fb1b10abSAndroid Build Coastguard Worker
235*fb1b10abSAndroid Build Coastguard Worker if (plane_type != PLANE_TYPE_Y || xd->lossless || is_inter_block(mi))
236*fb1b10abSAndroid Build Coastguard Worker return DCT_DCT;
237*fb1b10abSAndroid Build Coastguard Worker
238*fb1b10abSAndroid Build Coastguard Worker return intra_mode_to_tx_type_lookup[get_y_mode(mi, ib)];
239*fb1b10abSAndroid Build Coastguard Worker }
240*fb1b10abSAndroid Build Coastguard Worker
241*fb1b10abSAndroid Build Coastguard Worker void vp9_setup_block_planes(MACROBLOCKD *xd, int ss_x, int ss_y);
242*fb1b10abSAndroid Build Coastguard Worker
get_uv_tx_size(const MODE_INFO * mi,const struct macroblockd_plane * pd)243*fb1b10abSAndroid Build Coastguard Worker static INLINE TX_SIZE get_uv_tx_size(const MODE_INFO *mi,
244*fb1b10abSAndroid Build Coastguard Worker const struct macroblockd_plane *pd) {
245*fb1b10abSAndroid Build Coastguard Worker assert(mi->sb_type < BLOCK_8X8 ||
246*fb1b10abSAndroid Build Coastguard Worker ss_size_lookup[mi->sb_type][pd->subsampling_x][pd->subsampling_y] !=
247*fb1b10abSAndroid Build Coastguard Worker BLOCK_INVALID);
248*fb1b10abSAndroid Build Coastguard Worker return uv_txsize_lookup[mi->sb_type][mi->tx_size][pd->subsampling_x]
249*fb1b10abSAndroid Build Coastguard Worker [pd->subsampling_y];
250*fb1b10abSAndroid Build Coastguard Worker }
251*fb1b10abSAndroid Build Coastguard Worker
252*fb1b10abSAndroid Build Coastguard Worker static INLINE BLOCK_SIZE
get_plane_block_size(BLOCK_SIZE bsize,const struct macroblockd_plane * pd)253*fb1b10abSAndroid Build Coastguard Worker get_plane_block_size(BLOCK_SIZE bsize, const struct macroblockd_plane *pd) {
254*fb1b10abSAndroid Build Coastguard Worker return ss_size_lookup[bsize][pd->subsampling_x][pd->subsampling_y];
255*fb1b10abSAndroid Build Coastguard Worker }
256*fb1b10abSAndroid Build Coastguard Worker
reset_skip_context(MACROBLOCKD * xd,BLOCK_SIZE bsize)257*fb1b10abSAndroid Build Coastguard Worker static INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) {
258*fb1b10abSAndroid Build Coastguard Worker int i;
259*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < MAX_MB_PLANE; i++) {
260*fb1b10abSAndroid Build Coastguard Worker struct macroblockd_plane *const pd = &xd->plane[i];
261*fb1b10abSAndroid Build Coastguard Worker const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
262*fb1b10abSAndroid Build Coastguard Worker memset(pd->above_context, 0,
263*fb1b10abSAndroid Build Coastguard Worker sizeof(ENTROPY_CONTEXT) * num_4x4_blocks_wide_lookup[plane_bsize]);
264*fb1b10abSAndroid Build Coastguard Worker memset(pd->left_context, 0,
265*fb1b10abSAndroid Build Coastguard Worker sizeof(ENTROPY_CONTEXT) * num_4x4_blocks_high_lookup[plane_bsize]);
266*fb1b10abSAndroid Build Coastguard Worker }
267*fb1b10abSAndroid Build Coastguard Worker }
268*fb1b10abSAndroid Build Coastguard Worker
get_y_mode_probs(const MODE_INFO * mi,const MODE_INFO * above_mi,const MODE_INFO * left_mi,int block)269*fb1b10abSAndroid Build Coastguard Worker static INLINE const vpx_prob *get_y_mode_probs(const MODE_INFO *mi,
270*fb1b10abSAndroid Build Coastguard Worker const MODE_INFO *above_mi,
271*fb1b10abSAndroid Build Coastguard Worker const MODE_INFO *left_mi,
272*fb1b10abSAndroid Build Coastguard Worker int block) {
273*fb1b10abSAndroid Build Coastguard Worker const PREDICTION_MODE above = vp9_above_block_mode(mi, above_mi, block);
274*fb1b10abSAndroid Build Coastguard Worker const PREDICTION_MODE left = vp9_left_block_mode(mi, left_mi, block);
275*fb1b10abSAndroid Build Coastguard Worker return vp9_kf_y_mode_prob[above][left];
276*fb1b10abSAndroid Build Coastguard Worker }
277*fb1b10abSAndroid Build Coastguard Worker
278*fb1b10abSAndroid Build Coastguard Worker typedef void (*foreach_transformed_block_visitor)(int plane, int block, int row,
279*fb1b10abSAndroid Build Coastguard Worker int col,
280*fb1b10abSAndroid Build Coastguard Worker BLOCK_SIZE plane_bsize,
281*fb1b10abSAndroid Build Coastguard Worker TX_SIZE tx_size, void *arg);
282*fb1b10abSAndroid Build Coastguard Worker
283*fb1b10abSAndroid Build Coastguard Worker void vp9_foreach_transformed_block_in_plane(
284*fb1b10abSAndroid Build Coastguard Worker const MACROBLOCKD *const xd, BLOCK_SIZE bsize, int plane,
285*fb1b10abSAndroid Build Coastguard Worker foreach_transformed_block_visitor visit, void *arg);
286*fb1b10abSAndroid Build Coastguard Worker
287*fb1b10abSAndroid Build Coastguard Worker void vp9_foreach_transformed_block(const MACROBLOCKD *const xd,
288*fb1b10abSAndroid Build Coastguard Worker BLOCK_SIZE bsize,
289*fb1b10abSAndroid Build Coastguard Worker foreach_transformed_block_visitor visit,
290*fb1b10abSAndroid Build Coastguard Worker void *arg);
291*fb1b10abSAndroid Build Coastguard Worker
292*fb1b10abSAndroid Build Coastguard Worker void vp9_set_contexts(const MACROBLOCKD *xd, struct macroblockd_plane *pd,
293*fb1b10abSAndroid Build Coastguard Worker BLOCK_SIZE plane_bsize, TX_SIZE tx_size, int has_eob,
294*fb1b10abSAndroid Build Coastguard Worker int aoff, int loff);
295*fb1b10abSAndroid Build Coastguard Worker
296*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_MISMATCH_DEBUG
297*fb1b10abSAndroid Build Coastguard Worker #define TX_UNIT_SIZE_LOG2 2
mi_to_pixel_loc(int * pixel_c,int * pixel_r,int mi_col,int mi_row,int tx_blk_col,int tx_blk_row,int subsampling_x,int subsampling_y)298*fb1b10abSAndroid Build Coastguard Worker static INLINE void mi_to_pixel_loc(int *pixel_c, int *pixel_r, int mi_col,
299*fb1b10abSAndroid Build Coastguard Worker int mi_row, int tx_blk_col, int tx_blk_row,
300*fb1b10abSAndroid Build Coastguard Worker int subsampling_x, int subsampling_y) {
301*fb1b10abSAndroid Build Coastguard Worker *pixel_c = ((mi_col << MI_SIZE_LOG2) >> subsampling_x) +
302*fb1b10abSAndroid Build Coastguard Worker (tx_blk_col << TX_UNIT_SIZE_LOG2);
303*fb1b10abSAndroid Build Coastguard Worker *pixel_r = ((mi_row << MI_SIZE_LOG2) >> subsampling_y) +
304*fb1b10abSAndroid Build Coastguard Worker (tx_blk_row << TX_UNIT_SIZE_LOG2);
305*fb1b10abSAndroid Build Coastguard Worker }
306*fb1b10abSAndroid Build Coastguard Worker
get_block_width(BLOCK_SIZE bsize)307*fb1b10abSAndroid Build Coastguard Worker static INLINE int get_block_width(BLOCK_SIZE bsize) {
308*fb1b10abSAndroid Build Coastguard Worker const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];
309*fb1b10abSAndroid Build Coastguard Worker return 4 * num_4x4_w;
310*fb1b10abSAndroid Build Coastguard Worker }
311*fb1b10abSAndroid Build Coastguard Worker
get_block_height(BLOCK_SIZE bsize)312*fb1b10abSAndroid Build Coastguard Worker static INLINE int get_block_height(BLOCK_SIZE bsize) {
313*fb1b10abSAndroid Build Coastguard Worker const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];
314*fb1b10abSAndroid Build Coastguard Worker return 4 * num_4x4_h;
315*fb1b10abSAndroid Build Coastguard Worker }
316*fb1b10abSAndroid Build Coastguard Worker #endif
317*fb1b10abSAndroid Build Coastguard Worker
318*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
319*fb1b10abSAndroid Build Coastguard Worker } // extern "C"
320*fb1b10abSAndroid Build Coastguard Worker #endif
321*fb1b10abSAndroid Build Coastguard Worker
322*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP9_COMMON_VP9_BLOCKD_H_
323