| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #ifndef VP9_ENCODER_VP9_BLOCK_H_ | 11 #ifndef VP9_ENCODER_VP9_BLOCK_H_ |
| 12 #define VP9_ENCODER_VP9_BLOCK_H_ | 12 #define VP9_ENCODER_VP9_BLOCK_H_ |
| 13 | 13 |
| 14 #include "vp9/common/vp9_onyx.h" | 14 #include "vp9/common/vp9_onyx.h" |
| 15 #include "vp9/common/vp9_entropymv.h" | 15 #include "vp9/common/vp9_entropymv.h" |
| 16 #include "vp9/common/vp9_entropy.h" | 16 #include "vp9/common/vp9_entropy.h" |
| 17 #include "vpx_ports/mem.h" | 17 #include "vpx_ports/mem.h" |
| 18 #include "vp9/common/vp9_onyxc_int.h" | 18 #include "vp9/common/vp9_onyxc_int.h" |
| 19 | 19 |
| 20 // motion search site | 20 // motion search site |
| 21 typedef struct { | 21 typedef struct { |
| 22 MV mv; | 22 MV mv; |
| 23 int offset; | 23 int offset; |
| 24 } search_site; | 24 } search_site; |
| 25 | 25 |
| 26 typedef struct { | |
| 27 struct { | |
| 28 MB_PREDICTION_MODE mode; | |
| 29 } bmi[4]; | |
| 30 } PARTITION_INFO; | |
| 31 | |
| 32 // Structure to hold snapshot of coding context during the mode picking process | 26 // Structure to hold snapshot of coding context during the mode picking process |
| 33 // TODO Do we need all of these? | |
| 34 typedef struct { | 27 typedef struct { |
| 35 MODE_INFO mic; | 28 MODE_INFO mic; |
| 36 PARTITION_INFO partition_info; | 29 uint8_t *zcoeff_blk; |
| 30 int num_4x4_blk; |
| 37 int skip; | 31 int skip; |
| 38 int_mv best_ref_mv; | 32 int_mv best_ref_mv; |
| 39 int_mv second_best_ref_mv; | 33 int_mv second_best_ref_mv; |
| 40 int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES]; | 34 int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES]; |
| 41 int rate; | 35 int rate; |
| 42 int distortion; | 36 int distortion; |
| 43 int64_t intra_error; | 37 int64_t intra_error; |
| 44 int best_mode_index; | 38 int best_mode_index; |
| 45 int rddiv; | 39 int rddiv; |
| 46 int rdmult; | 40 int rdmult; |
| 47 int hybrid_pred_diff; | 41 int hybrid_pred_diff; |
| 48 int comp_pred_diff; | 42 int comp_pred_diff; |
| 49 int single_pred_diff; | 43 int single_pred_diff; |
| 50 int64_t tx_rd_diff[TX_MODES]; | 44 int64_t tx_rd_diff[TX_MODES]; |
| 51 int64_t best_filter_diff[SWITCHABLE_FILTERS + 1]; | 45 int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]; |
| 52 | 46 |
| 53 // motion vector cache for adaptive motion search control in partition | 47 // motion vector cache for adaptive motion search control in partition |
| 54 // search loop | 48 // search loop |
| 55 int_mv pred_mv[MAX_REF_FRAMES]; | 49 int_mv pred_mv[MAX_REF_FRAMES]; |
| 56 | 50 |
| 57 // Bit flag for each mode whether it has high error in comparison to others. | 51 // Bit flag for each mode whether it has high error in comparison to others. |
| 58 unsigned int modes_with_high_error; | 52 unsigned int modes_with_high_error; |
| 59 | 53 |
| 60 // Bit flag for each ref frame whether it has high error compared to others. | 54 // Bit flag for each ref frame whether it has high error compared to others. |
| 61 unsigned int frames_with_high_error; | 55 unsigned int frames_with_high_error; |
| 62 } PICK_MODE_CONTEXT; | 56 } PICK_MODE_CONTEXT; |
| 63 | 57 |
| 64 struct macroblock_plane { | 58 struct macroblock_plane { |
| 65 DECLARE_ALIGNED(16, int16_t, src_diff[64*64]); | 59 DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]); |
| 66 DECLARE_ALIGNED(16, int16_t, coeff[64*64]); | 60 DECLARE_ALIGNED(16, int16_t, coeff[64 * 64]); |
| 67 struct buf_2d src; | 61 struct buf_2d src; |
| 68 | 62 |
| 69 // Quantizer setings | 63 // Quantizer setings |
| 70 int16_t *quant; | 64 int16_t *quant; |
| 71 int16_t *quant_shift; | 65 int16_t *quant_shift; |
| 72 int16_t *zbin; | 66 int16_t *zbin; |
| 73 int16_t *round; | 67 int16_t *round; |
| 74 | 68 |
| 75 // Zbin Over Quant value | 69 // Zbin Over Quant value |
| 76 int16_t zbin_extra; | 70 int16_t zbin_extra; |
| 77 }; | 71 }; |
| 78 | 72 |
| 79 /* The [2] dimension is for whether we skip the EOB node (i.e. if previous | 73 /* The [2] dimension is for whether we skip the EOB node (i.e. if previous |
| 80 * coefficient in this block was zero) or not. */ | 74 * coefficient in this block was zero) or not. */ |
| 81 typedef unsigned int vp9_coeff_cost[BLOCK_TYPES][REF_TYPES][COEF_BANDS][2] | 75 typedef unsigned int vp9_coeff_cost[BLOCK_TYPES][REF_TYPES][COEF_BANDS][2] |
| 82 [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS]; | 76 [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS]; |
| 83 | 77 |
| 84 typedef struct macroblock MACROBLOCK; | 78 typedef struct macroblock MACROBLOCK; |
| 85 struct macroblock { | 79 struct macroblock { |
| 86 struct macroblock_plane plane[MAX_MB_PLANE]; | 80 struct macroblock_plane plane[MAX_MB_PLANE]; |
| 87 | 81 |
| 88 MACROBLOCKD e_mbd; | 82 MACROBLOCKD e_mbd; |
| 89 int skip_block; | 83 int skip_block; |
| 90 PARTITION_INFO *partition_info; /* work pointer */ | |
| 91 PARTITION_INFO *pi; /* Corresponds to upper left visible macroblock */ | |
| 92 PARTITION_INFO *pip; /* Base of allocated array */ | |
| 93 | 84 |
| 94 search_site *ss; | 85 search_site *ss; |
| 95 int ss_count; | 86 int ss_count; |
| 96 int searches_per_step; | 87 int searches_per_step; |
| 97 | 88 |
| 98 int errorperbit; | 89 int errorperbit; |
| 99 int sadperbit16; | 90 int sadperbit16; |
| 100 int sadperbit4; | 91 int sadperbit4; |
| 101 int rddiv; | 92 int rddiv; |
| 102 int rdmult; | 93 int rdmult; |
| 94 unsigned int mb_energy; |
| 103 unsigned int *mb_activity_ptr; | 95 unsigned int *mb_activity_ptr; |
| 104 int *mb_norm_activity_ptr; | 96 int *mb_norm_activity_ptr; |
| 105 signed int act_zbin_adj; | 97 signed int act_zbin_adj; |
| 106 | 98 |
| 107 int mv_best_ref_index[MAX_REF_FRAMES]; | 99 int mv_best_ref_index[MAX_REF_FRAMES]; |
| 108 unsigned int max_mv_context[MAX_REF_FRAMES]; | 100 unsigned int max_mv_context[MAX_REF_FRAMES]; |
| 109 unsigned int source_variance; | 101 unsigned int source_variance; |
| 110 | 102 |
| 111 int nmvjointcost[MV_JOINTS]; | 103 int nmvjointcost[MV_JOINTS]; |
| 112 int nmvcosts[2][MV_VALS]; | 104 int nmvcosts[2][MV_VALS]; |
| 113 int *nmvcost[2]; | 105 int *nmvcost[2]; |
| 114 int nmvcosts_hp[2][MV_VALS]; | 106 int nmvcosts_hp[2][MV_VALS]; |
| 115 int *nmvcost_hp[2]; | 107 int *nmvcost_hp[2]; |
| 116 int **mvcost; | 108 int **mvcost; |
| 117 | 109 |
| 118 int nmvjointsadcost[MV_JOINTS]; | 110 int nmvjointsadcost[MV_JOINTS]; |
| 119 int nmvsadcosts[2][MV_VALS]; | 111 int nmvsadcosts[2][MV_VALS]; |
| 120 int *nmvsadcost[2]; | 112 int *nmvsadcost[2]; |
| 121 int nmvsadcosts_hp[2][MV_VALS]; | 113 int nmvsadcosts_hp[2][MV_VALS]; |
| 122 int *nmvsadcost_hp[2]; | 114 int *nmvsadcost_hp[2]; |
| 123 int **mvsadcost; | 115 int **mvsadcost; |
| 124 | 116 |
| 125 int mbmode_cost[MB_MODE_COUNT]; | 117 int mbmode_cost[MB_MODE_COUNT]; |
| 126 unsigned inter_mode_cost[INTER_MODE_CONTEXTS][MB_MODE_COUNT - NEARESTMV]; | 118 unsigned inter_mode_cost[INTER_MODE_CONTEXTS][INTER_MODES]; |
| 127 int intra_uv_mode_cost[2][MB_MODE_COUNT]; | 119 int intra_uv_mode_cost[2][MB_MODE_COUNT]; |
| 128 int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES]; | 120 int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES]; |
| 129 int switchable_interp_costs[SWITCHABLE_FILTERS + 1] | 121 int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS]; |
| 130 [SWITCHABLE_FILTERS]; | |
| 131 | 122 |
| 132 // These define limits to motion vector components to prevent them | 123 // These define limits to motion vector components to prevent them |
| 133 // from extending outside the UMV borders | 124 // from extending outside the UMV borders |
| 134 int mv_col_min; | 125 int mv_col_min; |
| 135 int mv_col_max; | 126 int mv_col_max; |
| 136 int mv_row_min; | 127 int mv_row_min; |
| 137 int mv_row_max; | 128 int mv_row_max; |
| 138 | 129 |
| 130 uint8_t zcoeff_blk[TX_SIZES][256]; |
| 139 int skip; | 131 int skip; |
| 140 | 132 |
| 141 int encode_breakout; | 133 int encode_breakout; |
| 142 | 134 |
| 143 unsigned char *active_ptr; | 135 unsigned char *active_ptr; |
| 144 | 136 |
| 145 // note that token_costs is the cost when eob node is skipped | 137 // note that token_costs is the cost when eob node is skipped |
| 146 vp9_coeff_cost token_costs[TX_SIZES]; | 138 vp9_coeff_cost token_costs[TX_SIZES]; |
| 139 uint8_t token_cache[1024]; |
| 147 | 140 |
| 148 int optimize; | 141 int optimize; |
| 149 | 142 |
| 150 // indicate if it is in the rd search loop or encoding process | 143 // indicate if it is in the rd search loop or encoding process |
| 151 int use_lp32x32fdct; | 144 int use_lp32x32fdct; |
| 152 int skip_encode; | 145 int skip_encode; |
| 153 | 146 |
| 154 // Used to store sub partition's choices. | 147 // Used to store sub partition's choices. |
| 155 int fast_ms; | 148 int fast_ms; |
| 156 int_mv pred_mv[MAX_REF_FRAMES]; | 149 int_mv pred_mv[MAX_REF_FRAMES]; |
| 157 int subblock_ref; | 150 int subblock_ref; |
| 158 | 151 |
| 159 // TODO(jingning): Need to refactor the structure arrays that buffers the | 152 // TODO(jingning): Need to refactor the structure arrays that buffers the |
| 160 // coding mode decisions of each partition type. | 153 // coding mode decisions of each partition type. |
| 161 PICK_MODE_CONTEXT ab4x4_context[4][4][4]; | 154 PICK_MODE_CONTEXT ab4x4_context[4][4][4]; |
| 162 PICK_MODE_CONTEXT sb8x4_context[4][4][4]; | 155 PICK_MODE_CONTEXT sb8x4_context[4][4][4]; |
| 163 PICK_MODE_CONTEXT sb4x8_context[4][4][4]; | 156 PICK_MODE_CONTEXT sb4x8_context[4][4][4]; |
| 164 PICK_MODE_CONTEXT sb8x8_context[4][4][4]; | 157 PICK_MODE_CONTEXT sb8x8_context[4][4][4]; |
| 165 PICK_MODE_CONTEXT sb8x16_context[4][4][2]; | 158 PICK_MODE_CONTEXT sb8x16_context[4][4][2]; |
| 166 PICK_MODE_CONTEXT sb16x8_context[4][4][2]; | 159 PICK_MODE_CONTEXT sb16x8_context[4][4][2]; |
| 167 PICK_MODE_CONTEXT mb_context[4][4]; | 160 PICK_MODE_CONTEXT mb_context[4][4]; |
| 168 PICK_MODE_CONTEXT sb32x16_context[4][2]; | 161 PICK_MODE_CONTEXT sb32x16_context[4][2]; |
| 169 PICK_MODE_CONTEXT sb16x32_context[4][2]; | 162 PICK_MODE_CONTEXT sb16x32_context[4][2]; |
| 170 // when 4 MBs share coding parameters: | 163 // when 4 MBs share coding parameters: |
| 171 PICK_MODE_CONTEXT sb32_context[4]; | 164 PICK_MODE_CONTEXT sb32_context[4]; |
| 172 PICK_MODE_CONTEXT sb32x64_context[2]; | 165 PICK_MODE_CONTEXT sb32x64_context[2]; |
| 173 PICK_MODE_CONTEXT sb64x32_context[2]; | 166 PICK_MODE_CONTEXT sb64x32_context[2]; |
| 174 PICK_MODE_CONTEXT sb64_context; | 167 PICK_MODE_CONTEXT sb64_context; |
| 175 int partition_cost[NUM_PARTITION_CONTEXTS][PARTITION_TYPES]; | 168 int partition_cost[PARTITION_CONTEXTS][PARTITION_TYPES]; |
| 176 | 169 |
| 177 BLOCK_SIZE b_partitioning[4][4][4]; | 170 BLOCK_SIZE b_partitioning[4][4][4]; |
| 178 BLOCK_SIZE mb_partitioning[4][4]; | 171 BLOCK_SIZE mb_partitioning[4][4]; |
| 179 BLOCK_SIZE sb_partitioning[4]; | 172 BLOCK_SIZE sb_partitioning[4]; |
| 180 BLOCK_SIZE sb64_partitioning; | 173 BLOCK_SIZE sb64_partitioning; |
| 181 | 174 |
| 182 void (*fwd_txm4x4)(int16_t *input, int16_t *output, int pitch); | 175 void (*fwd_txm4x4)(const int16_t *input, int16_t *output, int stride); |
| 183 void (*fwd_txm8x4)(int16_t *input, int16_t *output, int pitch); | 176 }; |
| 184 void (*fwd_txm8x8)(int16_t *input, int16_t *output, int pitch); | 177 |
| 185 void (*fwd_txm16x16)(int16_t *input, int16_t *output, int pitch); | 178 // TODO(jingning): the variables used here are little complicated. need further |
| 186 void (*quantize_b_4x4)(MACROBLOCK *x, int b_idx, TX_TYPE tx_type, | 179 // refactoring on organizing the temporary buffers, when recursive |
| 187 int y_blocks); | 180 // partition down to 4x4 block size is enabled. |
| 181 static PICK_MODE_CONTEXT *get_block_context(MACROBLOCK *x, BLOCK_SIZE bsize) { |
| 182 MACROBLOCKD *const xd = &x->e_mbd; |
| 183 |
| 184 switch (bsize) { |
| 185 case BLOCK_64X64: |
| 186 return &x->sb64_context; |
| 187 case BLOCK_64X32: |
| 188 return &x->sb64x32_context[xd->sb_index]; |
| 189 case BLOCK_32X64: |
| 190 return &x->sb32x64_context[xd->sb_index]; |
| 191 case BLOCK_32X32: |
| 192 return &x->sb32_context[xd->sb_index]; |
| 193 case BLOCK_32X16: |
| 194 return &x->sb32x16_context[xd->sb_index][xd->mb_index]; |
| 195 case BLOCK_16X32: |
| 196 return &x->sb16x32_context[xd->sb_index][xd->mb_index]; |
| 197 case BLOCK_16X16: |
| 198 return &x->mb_context[xd->sb_index][xd->mb_index]; |
| 199 case BLOCK_16X8: |
| 200 return &x->sb16x8_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 201 case BLOCK_8X16: |
| 202 return &x->sb8x16_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 203 case BLOCK_8X8: |
| 204 return &x->sb8x8_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 205 case BLOCK_8X4: |
| 206 return &x->sb8x4_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 207 case BLOCK_4X8: |
| 208 return &x->sb4x8_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 209 case BLOCK_4X4: |
| 210 return &x->ab4x4_context[xd->sb_index][xd->mb_index][xd->b_index]; |
| 211 default: |
| 212 assert(0); |
| 213 return NULL; |
| 214 } |
| 215 } |
| 216 |
| 217 struct rdcost_block_args { |
| 218 MACROBLOCK *x; |
| 219 ENTROPY_CONTEXT t_above[16]; |
| 220 ENTROPY_CONTEXT t_left[16]; |
| 221 TX_SIZE tx_size; |
| 222 int bw; |
| 223 int bh; |
| 224 int rate; |
| 225 int64_t dist; |
| 226 int64_t sse; |
| 227 int this_rate; |
| 228 int64_t this_dist; |
| 229 int64_t this_sse; |
| 230 int64_t this_rd; |
| 231 int64_t best_rd; |
| 232 int skip; |
| 233 const int16_t *scan, *nb; |
| 188 }; | 234 }; |
| 189 | 235 |
| 190 #endif // VP9_ENCODER_VP9_BLOCK_H_ | 236 #endif // VP9_ENCODER_VP9_BLOCK_H_ |
| OLD | NEW |