xref: /aosp_15_r20/external/libvpx/vp9/common/vp9_blockd.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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