1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP9_ENCODER_VP9_BLOCK_H_
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP9_ENCODER_VP9_BLOCK_H_
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropymv.h"
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropy.h"
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/mem.h"
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_onyxc_int.h"
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
20233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" {
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan// motion search site
24233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct {
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan  MV mv;
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int offset;
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan} search_site;
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Structure to hold snapshot of coding context during the mode picking process
30233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct {
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan  MODE_INFO mic;
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint8_t *zcoeff_blk;
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *coeff[MAX_MB_PLANE][3];
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *qcoeff[MAX_MB_PLANE][3];
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *dqcoeff[MAX_MB_PLANE][3];
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint16_t *eobs[MAX_MB_PLANE][3];
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // dual buffer pointers, 0: in use, 1: best in store
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *coeff_pbuf[MAX_MB_PLANE][3];
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *qcoeff_pbuf[MAX_MB_PLANE][3];
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *dqcoeff_pbuf[MAX_MB_PLANE][3];
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint16_t *eobs_pbuf[MAX_MB_PLANE][3];
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int is_coded;
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int num_4x4_blk;
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int skip;
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int_mv best_ref_mv[2];
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int rate;
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int distortion;
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int best_mode_index;
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int rddiv;
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int rdmult;
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int hybrid_pred_diff;
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int comp_pred_diff;
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int single_pred_diff;
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int64_t tx_rd_diff[TX_MODES];
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // motion vector cache for adaptive motion search control in partition
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // search loop
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int_mv pred_mv[MAX_REF_FRAMES];
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan  INTERP_FILTER pred_interp_filter;
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan} PICK_MODE_CONTEXT;
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan
66233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct macroblock_plane {
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan  DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]);
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *qcoeff;
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *coeff;
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint16_t *eobs;
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct buf_2d src;
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Quantizer setings
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *quant;
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *quant_shift;
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *zbin;
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t *round;
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Zbin Over Quant value
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int16_t zbin_extra;
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* The [2] dimension is for whether we skip the EOB node (i.e. if previous
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan * coefficient in this block was zero) or not. */
85233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef unsigned int vp9_coeff_cost[PLANE_TYPES][REF_TYPES][COEF_BANDS][2]
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                   [COEFF_CONTEXTS][ENTROPY_TOKENS];
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan
88233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct macroblock MACROBLOCK;
89233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct macroblock {
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan  struct macroblock_plane plane[MAX_MB_PLANE];
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan  MACROBLOCKD e_mbd;
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int skip_block;
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int select_txfm_size;
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int skip_recode;
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int skip_optimize;
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int q_index;
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan  search_site *ss;
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int ss_count;
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int searches_per_step;
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int errorperbit;
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int sadperbit16;
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int sadperbit4;
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int rddiv;
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int rdmult;
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int mb_energy;
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int *mb_activity_ptr;
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int *mb_norm_activity_ptr;
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan  signed int act_zbin_adj;
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int mv_best_ref_index[MAX_REF_FRAMES];
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int max_mv_context[MAX_REF_FRAMES];
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int source_variance;
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned int pred_sse[MAX_REF_FRAMES];
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int pred_mv_sad[MAX_REF_FRAMES];
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int nmvjointcost[MV_JOINTS];
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int nmvcosts[2][MV_VALS];
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int *nmvcost[2];
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int nmvcosts_hp[2][MV_VALS];
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int *nmvcost_hp[2];
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int **mvcost;
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int nmvjointsadcost[MV_JOINTS];
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int nmvsadcosts[2][MV_VALS];
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int *nmvsadcost[2];
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int nmvsadcosts_hp[2][MV_VALS];
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int *nmvsadcost_hp[2];
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int **mvsadcost;
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int mbmode_cost[INTRA_MODES];
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned inter_mode_cost[INTER_MODE_CONTEXTS][INTER_MODES];
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int intra_uv_mode_cost[FRAME_TYPES][INTRA_MODES];
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES];
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS];
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned char sb_index;   // index of 32x32 block inside the 64x64 block
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned char mb_index;   // index of 16x16 block inside the 32x32 block
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned char b_index;    // index of 8x8 block inside the 16x16 block
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan  unsigned char ab_index;   // index of 4x4 block inside the 8x8 block
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // These define limits to motion vector components to prevent them
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // from extending outside the UMV borders
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int mv_col_min;
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int mv_col_max;
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int mv_row_min;
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int mv_row_max;
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan  uint8_t zcoeff_blk[TX_SIZES][256];
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int skip;
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int encode_breakout;
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int in_active_map;
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // note that token_costs is the cost when eob node is skipped
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan  vp9_coeff_cost token_costs[TX_SIZES];
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int optimize;
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // indicate if it is in the rd search loop or encoding process
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int use_lp32x32fdct;
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int skip_encode;
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // Used to store sub partition's choices.
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int_mv pred_mv[MAX_REF_FRAMES];
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // TODO(jingning): Need to refactor the structure arrays that buffers the
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // coding mode decisions of each partition type.
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT ab4x4_context[4][4][4];
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb8x4_context[4][4][4];
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb4x8_context[4][4][4];
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb8x8_context[4][4][4];
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb8x16_context[4][4][2];
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb16x8_context[4][4][2];
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT mb_context[4][4];
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb32x16_context[4][2];
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb16x32_context[4][2];
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan  // when 4 MBs share coding parameters:
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb32_context[4];
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb32x64_context[2];
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb64x32_context[2];
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan  PICK_MODE_CONTEXT sb64_context;
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan  int partition_cost[PARTITION_CONTEXTS][PARTITION_TYPES];
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan  BLOCK_SIZE b_partitioning[4][4][4];
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan  BLOCK_SIZE mb_partitioning[4][4];
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan  BLOCK_SIZE sb_partitioning[4];
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan  BLOCK_SIZE sb64_partitioning;
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan  void (*fwd_txm4x4)(const int16_t *input, int16_t *output, int stride);
194233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
195233d2500723e5594f3e7c70896ffeeef32b9c950ywan
196233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TODO(jingning): the variables used here are little complicated. need further
197233d2500723e5594f3e7c70896ffeeef32b9c950ywan// refactoring on organizing the temporary buffers, when recursive
198233d2500723e5594f3e7c70896ffeeef32b9c950ywan// partition down to 4x4 block size is enabled.
199233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic INLINE PICK_MODE_CONTEXT *get_block_context(MACROBLOCK *x,
200233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                                   BLOCK_SIZE bsize) {
201233d2500723e5594f3e7c70896ffeeef32b9c950ywan  switch (bsize) {
202233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_64X64:
203233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb64_context;
204233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_64X32:
205233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb64x32_context[x->sb_index];
206233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_32X64:
207233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb32x64_context[x->sb_index];
208233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_32X32:
209233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb32_context[x->sb_index];
210233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_32X16:
211233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb32x16_context[x->sb_index][x->mb_index];
212233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_16X32:
213233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb16x32_context[x->sb_index][x->mb_index];
214233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_16X16:
215233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->mb_context[x->sb_index][x->mb_index];
216233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_16X8:
217233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb16x8_context[x->sb_index][x->mb_index][x->b_index];
218233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_8X16:
219233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb8x16_context[x->sb_index][x->mb_index][x->b_index];
220233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_8X8:
221233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb8x8_context[x->sb_index][x->mb_index][x->b_index];
222233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_8X4:
223233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb8x4_context[x->sb_index][x->mb_index][x->b_index];
224233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_4X8:
225233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->sb4x8_context[x->sb_index][x->mb_index][x->b_index];
226233d2500723e5594f3e7c70896ffeeef32b9c950ywan    case BLOCK_4X4:
227233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return &x->ab4x4_context[x->sb_index][x->mb_index][x->b_index];
228233d2500723e5594f3e7c70896ffeeef32b9c950ywan    default:
229233d2500723e5594f3e7c70896ffeeef32b9c950ywan      assert(0);
230233d2500723e5594f3e7c70896ffeeef32b9c950ywan      return NULL;
231233d2500723e5594f3e7c70896ffeeef32b9c950ywan  }
232233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
233233d2500723e5594f3e7c70896ffeeef32b9c950ywan
234233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
235233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // extern "C"
236233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
237233d2500723e5594f3e7c70896ffeeef32b9c950ywan
238233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // VP9_ENCODER_VP9_BLOCK_H_
239