| 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 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 | 43 |
| 44 extern struct vp9_token vp9_coef_encodings[MAX_ENTROPY_TOKENS]; | 44 extern struct vp9_token vp9_coef_encodings[MAX_ENTROPY_TOKENS]; |
| 45 | 45 |
| 46 typedef struct { | 46 typedef struct { |
| 47 vp9_tree_p tree; | 47 vp9_tree_p tree; |
| 48 const vp9_prob *prob; | 48 const vp9_prob *prob; |
| 49 int len; | 49 int len; |
| 50 int base_val; | 50 int base_val; |
| 51 } vp9_extra_bit; | 51 } vp9_extra_bit; |
| 52 | 52 |
| 53 extern vp9_extra_bit vp9_extra_bits[12]; /* indexed by token value */ | 53 extern const vp9_extra_bit vp9_extra_bits[12]; /* indexed by token value */ |
| 54 | 54 |
| 55 #define MAX_PROB 255 | 55 #define MAX_PROB 255 |
| 56 #define DCT_MAX_VALUE 16384 | 56 #define DCT_MAX_VALUE 16384 |
| 57 | 57 |
| 58 /* Coefficients are predicted via a 3-dimensional probability table. */ | 58 /* Coefficients are predicted via a 3-dimensional probability table. */ |
| 59 | 59 |
| 60 /* Outside dimension. 0 = Y with DC, 1 = UV */ | 60 /* Outside dimension. 0 = Y with DC, 1 = UV */ |
| 61 #define BLOCK_TYPES 2 | 61 #define BLOCK_TYPES 2 |
| 62 #define REF_TYPES 2 // intra=0, inter=1 | 62 #define REF_TYPES 2 // intra=0, inter=1 |
| 63 | 63 |
| 64 /* Middle dimension reflects the coefficient position within the transform. */ | 64 /* Middle dimension reflects the coefficient position within the transform. */ |
| 65 #define COEF_BANDS 6 | 65 #define COEF_BANDS 6 |
| 66 | 66 |
| 67 /* Inside dimension is measure of nearby complexity, that reflects the energy | 67 /* Inside dimension is measure of nearby complexity, that reflects the energy |
| 68 of nearby coefficients are nonzero. For the first coefficient (DC, unless | 68 of nearby coefficients are nonzero. For the first coefficient (DC, unless |
| 69 block type is 0), we look at the (already encoded) blocks above and to the | 69 block type is 0), we look at the (already encoded) blocks above and to the |
| 70 left of the current block. The context index is then the number (0,1,or 2) | 70 left of the current block. The context index is then the number (0,1,or 2) |
| 71 of these blocks having nonzero coefficients. | 71 of these blocks having nonzero coefficients. |
| 72 After decoding a coefficient, the measure is determined by the size of the | 72 After decoding a coefficient, the measure is determined by the size of the |
| 73 most recently decoded coefficient. | 73 most recently decoded coefficient. |
| 74 Note that the intuitive meaning of this measure changes as coefficients | 74 Note that the intuitive meaning of this measure changes as coefficients |
| 75 are decoded, e.g., prior to the first token, a zero means that my neighbors | 75 are decoded, e.g., prior to the first token, a zero means that my neighbors |
| 76 are empty while, after the first token, because of the use of end-of-block, | 76 are empty while, after the first token, because of the use of end-of-block, |
| 77 a zero means we just decoded a zero and hence guarantees that a non-zero | 77 a zero means we just decoded a zero and hence guarantees that a non-zero |
| 78 coefficient will appear later in this block. However, this shift | 78 coefficient will appear later in this block. However, this shift |
| 79 in meaning is perfectly OK because our context depends also on the | 79 in meaning is perfectly OK because our context depends also on the |
| 80 coefficient band (and since zigzag positions 0, 1, and 2 are in | 80 coefficient band (and since zigzag positions 0, 1, and 2 are in |
| 81 distinct bands). */ | 81 distinct bands). */ |
| 82 | 82 |
| 83 /*# define DC_TOKEN_CONTEXTS 3*/ /* 00, 0!0, !0!0 */ | |
| 84 #define PREV_COEF_CONTEXTS 6 | 83 #define PREV_COEF_CONTEXTS 6 |
| 85 | 84 |
| 86 // #define ENTROPY_STATS | 85 // #define ENTROPY_STATS |
| 87 | 86 |
| 88 typedef unsigned int vp9_coeff_count[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] | 87 typedef unsigned int vp9_coeff_count[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] |
| 89 [MAX_ENTROPY_TOKENS]; | 88 [MAX_ENTROPY_TOKENS]; |
| 90 typedef unsigned int vp9_coeff_stats[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] | 89 typedef unsigned int vp9_coeff_stats[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] |
| 91 [ENTROPY_NODES][2]; | 90 [ENTROPY_NODES][2]; |
| 92 typedef vp9_prob vp9_coeff_probs[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] | 91 typedef vp9_prob vp9_coeff_probs[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] |
| 93 [ENTROPY_NODES]; | 92 [ENTROPY_NODES]; |
| 94 | 93 |
| 95 #define SUBEXP_PARAM 4 /* Subexponential code parameter */ | 94 #define SUBEXP_PARAM 4 /* Subexponential code parameter */ |
| 96 #define MODULUS_PARAM 13 /* Modulus parameter */ | 95 #define MODULUS_PARAM 13 /* Modulus parameter */ |
| 97 | 96 |
| 98 struct VP9Common; | 97 struct VP9Common; |
| 99 void vp9_default_coef_probs(struct VP9Common *); | 98 void vp9_default_coef_probs(struct VP9Common *); |
| 100 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_4x4[16]); | 99 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_4x4[16]); |
| 101 | 100 |
| 102 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_4x4[16]); | 101 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_4x4[16]); |
| 103 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_4x4[16]); | 102 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_4x4[16]); |
| 104 | 103 |
| 105 extern DECLARE_ALIGNED(64, const int16_t, vp9_default_scan_8x8[64]); | 104 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_8x8[64]); |
| 106 | 105 |
| 107 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_8x8[64]); | 106 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_8x8[64]); |
| 108 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_8x8[64]); | 107 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_8x8[64]); |
| 109 | 108 |
| 110 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_16x16[256]); | 109 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_16x16[256]); |
| 111 | 110 |
| 112 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_16x16[256]); | 111 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_16x16[256]); |
| 113 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_16x16[256]); | 112 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_16x16[256]); |
| 114 | 113 |
| 115 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_32x32[1024]); | 114 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_32x32[1024]); |
| 116 | 115 |
| 117 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_4x4[16]); | 116 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_4x4[16]); |
| 118 | 117 |
| 119 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_4x4[16]); | 118 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_4x4[16]); |
| 120 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_4x4[16]); | 119 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_4x4[16]); |
| 121 | 120 |
| 122 extern DECLARE_ALIGNED(64, int16_t, vp9_default_iscan_8x8[64]); | 121 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_8x8[64]); |
| 123 | 122 |
| 124 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_8x8[64]); | 123 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_8x8[64]); |
| 125 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_8x8[64]); | 124 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_8x8[64]); |
| 126 | 125 |
| 127 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_16x16[256]); | 126 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_16x16[256]); |
| 128 | 127 |
| 129 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_16x16[256]); | 128 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_16x16[256]); |
| 130 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_16x16[256]); | 129 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_16x16[256]); |
| 131 | 130 |
| 132 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_32x32[1024]); | 131 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_32x32[1024]); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 150 extern DECLARE_ALIGNED(16, int16_t, | 149 extern DECLARE_ALIGNED(16, int16_t, |
| 151 vp9_row_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); | 150 vp9_row_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); |
| 152 extern DECLARE_ALIGNED(16, int16_t, | 151 extern DECLARE_ALIGNED(16, int16_t, |
| 153 vp9_default_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); | 152 vp9_default_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); |
| 154 extern DECLARE_ALIGNED(16, int16_t, | 153 extern DECLARE_ALIGNED(16, int16_t, |
| 155 vp9_default_scan_32x32_neighbors[1025 * MAX_NEIGHBORS]); | 154 vp9_default_scan_32x32_neighbors[1025 * MAX_NEIGHBORS]); |
| 156 | 155 |
| 157 void vp9_coef_tree_initialize(void); | 156 void vp9_coef_tree_initialize(void); |
| 158 void vp9_adapt_coef_probs(struct VP9Common *); | 157 void vp9_adapt_coef_probs(struct VP9Common *); |
| 159 | 158 |
| 160 static INLINE void vp9_reset_sb_tokens_context(MACROBLOCKD* const xd, | 159 static INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) { |
| 161 BLOCK_SIZE_TYPE bsize) { | |
| 162 /* Clear entropy contexts */ | |
| 163 const int bw = 1 << b_width_log2(bsize); | |
| 164 const int bh = 1 << b_height_log2(bsize); | |
| 165 int i; | 160 int i; |
| 166 for (i = 0; i < MAX_MB_PLANE; i++) { | 161 for (i = 0; i < MAX_MB_PLANE; i++) { |
| 167 vpx_memset(xd->plane[i].above_context, 0, | 162 struct macroblockd_plane *const pd = &xd->plane[i]; |
| 168 sizeof(ENTROPY_CONTEXT) * bw >> xd->plane[i].subsampling_x); | 163 const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); |
| 169 vpx_memset(xd->plane[i].left_context, 0, | 164 vpx_memset(pd->above_context, 0, sizeof(ENTROPY_CONTEXT) * |
| 170 sizeof(ENTROPY_CONTEXT) * bh >> xd->plane[i].subsampling_y); | 165 num_4x4_blocks_wide_lookup[plane_bsize]); |
| 166 vpx_memset(pd->left_context, 0, sizeof(ENTROPY_CONTEXT) * |
| 167 num_4x4_blocks_high_lookup[plane_bsize]); |
| 171 } | 168 } |
| 172 } | 169 } |
| 173 | 170 |
| 174 // This is the index in the scan order beyond which all coefficients for | 171 // This is the index in the scan order beyond which all coefficients for |
| 175 // 8x8 transform and above are in the top band. | 172 // 8x8 transform and above are in the top band. |
| 176 // For 4x4 blocks the index is less but to keep things common the lookup | 173 // For 4x4 blocks the index is less but to keep things common the lookup |
| 177 // table for 4x4 is padded out to this index. | 174 // table for 4x4 is padded out to this index. |
| 178 #define MAXBAND_INDEX 21 | 175 #define MAXBAND_INDEX 21 |
| 179 | 176 |
| 180 extern const uint8_t vp9_coefband_trans_8x8plus[MAXBAND_INDEX + 1]; | 177 extern const uint8_t vp9_coefband_trans_8x8plus[MAXBAND_INDEX + 1]; |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 case DCT_ADST: | 332 case DCT_ADST: |
| 336 return vp9_col_iscan_16x16; | 333 return vp9_col_iscan_16x16; |
| 337 default: | 334 default: |
| 338 return vp9_default_iscan_16x16; | 335 return vp9_default_iscan_16x16; |
| 339 } | 336 } |
| 340 } | 337 } |
| 341 | 338 |
| 342 enum { VP9_COEF_UPDATE_PROB = 252 }; | 339 enum { VP9_COEF_UPDATE_PROB = 252 }; |
| 343 | 340 |
| 344 #endif // VP9_COMMON_VP9_ENTROPY_H_ | 341 #endif // VP9_COMMON_VP9_ENTROPY_H_ |
| OLD | NEW |