vp9_block.h revision a72801d7d92ababb50eecf27a36bd222d031d2fe
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_ENCODER_VP9_BLOCK_H_
12#define VP9_ENCODER_VP9_BLOCK_H_
13
14#include "vp9/common/vp9_entropymv.h"
15#include "vp9/common/vp9_entropy.h"
16#include "vpx_ports/mem.h"
17#include "vp9/common/vp9_onyxc_int.h"
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23// motion search site
24typedef struct {
25  MV mv;
26  int offset;
27} search_site;
28
29// Structure to hold snapshot of coding context during the mode picking process
30typedef struct {
31  MODE_INFO mic;
32  uint8_t *zcoeff_blk;
33  int16_t *coeff[MAX_MB_PLANE][3];
34  int16_t *qcoeff[MAX_MB_PLANE][3];
35  int16_t *dqcoeff[MAX_MB_PLANE][3];
36  uint16_t *eobs[MAX_MB_PLANE][3];
37
38  // dual buffer pointers, 0: in use, 1: best in store
39  int16_t *coeff_pbuf[MAX_MB_PLANE][3];
40  int16_t *qcoeff_pbuf[MAX_MB_PLANE][3];
41  int16_t *dqcoeff_pbuf[MAX_MB_PLANE][3];
42  uint16_t *eobs_pbuf[MAX_MB_PLANE][3];
43
44  int is_coded;
45  int num_4x4_blk;
46  int skip;
47  int_mv best_ref_mv[2];
48  int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
49  int rate;
50  int distortion;
51  int best_mode_index;
52  int rddiv;
53  int rdmult;
54  int hybrid_pred_diff;
55  int comp_pred_diff;
56  int single_pred_diff;
57  int64_t tx_rd_diff[TX_MODES];
58  int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
59
60  // motion vector cache for adaptive motion search control in partition
61  // search loop
62  int_mv pred_mv[MAX_REF_FRAMES];
63  INTERP_FILTER pred_interp_filter;
64} PICK_MODE_CONTEXT;
65
66struct macroblock_plane {
67  DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]);
68  int16_t *qcoeff;
69  int16_t *coeff;
70  uint16_t *eobs;
71  struct buf_2d src;
72
73  // Quantizer setings
74  int16_t *quant;
75  int16_t *quant_shift;
76  int16_t *zbin;
77  int16_t *round;
78
79  // Zbin Over Quant value
80  int16_t zbin_extra;
81};
82
83/* The [2] dimension is for whether we skip the EOB node (i.e. if previous
84 * coefficient in this block was zero) or not. */
85typedef unsigned int vp9_coeff_cost[PLANE_TYPES][REF_TYPES][COEF_BANDS][2]
86                                   [COEFF_CONTEXTS][ENTROPY_TOKENS];
87
88typedef struct macroblock MACROBLOCK;
89struct macroblock {
90  struct macroblock_plane plane[MAX_MB_PLANE];
91
92  MACROBLOCKD e_mbd;
93  int skip_block;
94  int select_txfm_size;
95  int skip_recode;
96  int skip_optimize;
97  int q_index;
98
99  search_site *ss;
100  int ss_count;
101  int searches_per_step;
102
103  int errorperbit;
104  int sadperbit16;
105  int sadperbit4;
106  int rddiv;
107  int rdmult;
108  unsigned int mb_energy;
109  unsigned int *mb_activity_ptr;
110  int *mb_norm_activity_ptr;
111  signed int act_zbin_adj;
112
113  int mv_best_ref_index[MAX_REF_FRAMES];
114  unsigned int max_mv_context[MAX_REF_FRAMES];
115  unsigned int source_variance;
116  unsigned int pred_sse[MAX_REF_FRAMES];
117  int pred_mv_sad[MAX_REF_FRAMES];
118
119  int nmvjointcost[MV_JOINTS];
120  int nmvcosts[2][MV_VALS];
121  int *nmvcost[2];
122  int nmvcosts_hp[2][MV_VALS];
123  int *nmvcost_hp[2];
124  int **mvcost;
125
126  int nmvjointsadcost[MV_JOINTS];
127  int nmvsadcosts[2][MV_VALS];
128  int *nmvsadcost[2];
129  int nmvsadcosts_hp[2][MV_VALS];
130  int *nmvsadcost_hp[2];
131  int **mvsadcost;
132
133  int mbmode_cost[INTRA_MODES];
134  unsigned inter_mode_cost[INTER_MODE_CONTEXTS][INTER_MODES];
135  int intra_uv_mode_cost[FRAME_TYPES][INTRA_MODES];
136  int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES];
137  int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS];
138
139  unsigned char sb_index;   // index of 32x32 block inside the 64x64 block
140  unsigned char mb_index;   // index of 16x16 block inside the 32x32 block
141  unsigned char b_index;    // index of 8x8 block inside the 16x16 block
142  unsigned char ab_index;   // index of 4x4 block inside the 8x8 block
143
144  // These define limits to motion vector components to prevent them
145  // from extending outside the UMV borders
146  int mv_col_min;
147  int mv_col_max;
148  int mv_row_min;
149  int mv_row_max;
150
151  uint8_t zcoeff_blk[TX_SIZES][256];
152  int skip;
153
154  int encode_breakout;
155
156  int in_active_map;
157
158  // note that token_costs is the cost when eob node is skipped
159  vp9_coeff_cost token_costs[TX_SIZES];
160  DECLARE_ALIGNED(16, uint8_t, token_cache[1024]);
161
162  int optimize;
163
164  // indicate if it is in the rd search loop or encoding process
165  int use_lp32x32fdct;
166  int skip_encode;
167
168  // Used to store sub partition's choices.
169  int_mv pred_mv[MAX_REF_FRAMES];
170
171  // TODO(jingning): Need to refactor the structure arrays that buffers the
172  // coding mode decisions of each partition type.
173  PICK_MODE_CONTEXT ab4x4_context[4][4][4];
174  PICK_MODE_CONTEXT sb8x4_context[4][4][4];
175  PICK_MODE_CONTEXT sb4x8_context[4][4][4];
176  PICK_MODE_CONTEXT sb8x8_context[4][4][4];
177  PICK_MODE_CONTEXT sb8x16_context[4][4][2];
178  PICK_MODE_CONTEXT sb16x8_context[4][4][2];
179  PICK_MODE_CONTEXT mb_context[4][4];
180  PICK_MODE_CONTEXT sb32x16_context[4][2];
181  PICK_MODE_CONTEXT sb16x32_context[4][2];
182  // when 4 MBs share coding parameters:
183  PICK_MODE_CONTEXT sb32_context[4];
184  PICK_MODE_CONTEXT sb32x64_context[2];
185  PICK_MODE_CONTEXT sb64x32_context[2];
186  PICK_MODE_CONTEXT sb64_context;
187  int partition_cost[PARTITION_CONTEXTS][PARTITION_TYPES];
188
189  BLOCK_SIZE b_partitioning[4][4][4];
190  BLOCK_SIZE mb_partitioning[4][4];
191  BLOCK_SIZE sb_partitioning[4];
192  BLOCK_SIZE sb64_partitioning;
193
194  void (*fwd_txm4x4)(const int16_t *input, int16_t *output, int stride);
195};
196
197// TODO(jingning): the variables used here are little complicated. need further
198// refactoring on organizing the temporary buffers, when recursive
199// partition down to 4x4 block size is enabled.
200static PICK_MODE_CONTEXT *get_block_context(MACROBLOCK *x, BLOCK_SIZE bsize) {
201  switch (bsize) {
202    case BLOCK_64X64:
203      return &x->sb64_context;
204    case BLOCK_64X32:
205      return &x->sb64x32_context[x->sb_index];
206    case BLOCK_32X64:
207      return &x->sb32x64_context[x->sb_index];
208    case BLOCK_32X32:
209      return &x->sb32_context[x->sb_index];
210    case BLOCK_32X16:
211      return &x->sb32x16_context[x->sb_index][x->mb_index];
212    case BLOCK_16X32:
213      return &x->sb16x32_context[x->sb_index][x->mb_index];
214    case BLOCK_16X16:
215      return &x->mb_context[x->sb_index][x->mb_index];
216    case BLOCK_16X8:
217      return &x->sb16x8_context[x->sb_index][x->mb_index][x->b_index];
218    case BLOCK_8X16:
219      return &x->sb8x16_context[x->sb_index][x->mb_index][x->b_index];
220    case BLOCK_8X8:
221      return &x->sb8x8_context[x->sb_index][x->mb_index][x->b_index];
222    case BLOCK_8X4:
223      return &x->sb8x4_context[x->sb_index][x->mb_index][x->b_index];
224    case BLOCK_4X8:
225      return &x->sb4x8_context[x->sb_index][x->mb_index][x->b_index];
226    case BLOCK_4X4:
227      return &x->ab4x4_context[x->sb_index][x->mb_index][x->b_index];
228    default:
229      assert(0);
230      return NULL;
231  }
232}
233
234#ifdef __cplusplus
235}  // extern "C"
236#endif
237
238#endif  // VP9_ENCODER_VP9_BLOCK_H_
239