Index: source/libvpx/vp9/common/vp9_entropy.h |
=================================================================== |
--- source/libvpx/vp9/common/vp9_entropy.h (revision 232232) |
+++ source/libvpx/vp9/common/vp9_entropy.h (working copy) |
@@ -12,10 +12,14 @@ |
#define VP9_COMMON_VP9_ENTROPY_H_ |
#include "vpx/vpx_integer.h" |
-#include "vp9/common/vp9_treecoder.h" |
+ |
#include "vp9/common/vp9_blockd.h" |
#include "vp9/common/vp9_common.h" |
+#include "vp9/common/vp9_scan.h" |
+#include "vp9/common/vp9_treecoder.h" |
+#define DIFF_UPDATE_PROB 252 |
+ |
/* Coefficient token alphabet */ |
#define ZERO_TOKEN 0 /* 0 Extra Bits 0+0 */ |
@@ -36,21 +40,25 @@ |
#define INTER_MODE_CONTEXTS 7 |
-extern const vp9_tree_index vp9_coef_tree[]; |
+extern DECLARE_ALIGNED(16, const uint8_t, |
+ vp9_pt_energy_class[MAX_ENTROPY_TOKENS]); |
+extern const vp9_tree_index vp9_coef_tree[TREE_SIZE(MAX_ENTROPY_TOKENS)]; |
+ |
#define DCT_EOB_MODEL_TOKEN 3 /* EOB Extra Bits 0+0 */ |
extern const vp9_tree_index vp9_coefmodel_tree[]; |
extern struct vp9_token vp9_coef_encodings[MAX_ENTROPY_TOKENS]; |
typedef struct { |
- vp9_tree_p tree; |
+ vp9_tree_index *tree; |
const vp9_prob *prob; |
int len; |
int base_val; |
} vp9_extra_bit; |
-extern const vp9_extra_bit vp9_extra_bits[12]; /* indexed by token value */ |
+// indexed by token value |
+extern const vp9_extra_bit vp9_extra_bits[MAX_ENTROPY_TOKENS]; |
#define MAX_PROB 255 |
#define DCT_MAX_VALUE 16384 |
@@ -88,72 +96,14 @@ |
[MAX_ENTROPY_TOKENS]; |
typedef unsigned int vp9_coeff_stats[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] |
[ENTROPY_NODES][2]; |
-typedef vp9_prob vp9_coeff_probs[REF_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS] |
- [ENTROPY_NODES]; |
#define SUBEXP_PARAM 4 /* Subexponential code parameter */ |
#define MODULUS_PARAM 13 /* Modulus parameter */ |
struct VP9Common; |
void vp9_default_coef_probs(struct VP9Common *cm); |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_4x4[16]); |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_4x4[16]); |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_4x4[16]); |
- |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_8x8[64]); |
- |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_8x8[64]); |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_8x8[64]); |
- |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_16x16[256]); |
- |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_16x16[256]); |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_16x16[256]); |
- |
-extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_32x32[1024]); |
- |
-extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_4x4[16]); |
- |
-extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_4x4[16]); |
-extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_4x4[16]); |
- |
-extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_8x8[64]); |
- |
-extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_8x8[64]); |
-extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_8x8[64]); |
- |
-extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_16x16[256]); |
- |
-extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_16x16[256]); |
-extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_16x16[256]); |
- |
-extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_32x32[1024]); |
- |
-#define MAX_NEIGHBORS 2 |
- |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_default_scan_4x4_neighbors[17 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_col_scan_4x4_neighbors[17 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_row_scan_4x4_neighbors[17 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_col_scan_8x8_neighbors[65 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_row_scan_8x8_neighbors[65 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_default_scan_8x8_neighbors[65 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_col_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_row_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_default_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); |
-extern DECLARE_ALIGNED(16, int16_t, |
- vp9_default_scan_32x32_neighbors[1025 * MAX_NEIGHBORS]); |
- |
-void vp9_coef_tree_initialize(void); |
+void vp9_coef_tree_initialize(); |
void vp9_adapt_coef_probs(struct VP9Common *cm); |
static INLINE void reset_skip_context(MACROBLOCKD *xd, BLOCK_SIZE bsize) { |
@@ -183,16 +133,6 @@ |
? (COEF_BANDS-1) : band_translate[coef_index]; |
} |
-static INLINE int get_coef_context(const int16_t *neighbors, |
- uint8_t *token_cache, |
- int c) { |
- return (1 + token_cache[neighbors[MAX_NEIGHBORS * c + 0]] + |
- token_cache[neighbors[MAX_NEIGHBORS * c + 1]]) >> 1; |
-} |
- |
-const int16_t *vp9_get_coef_neighbors_handle(const int16_t *scan); |
- |
- |
// 128 lists of probabilities are stored for the following ONE node probs: |
// 1, 3, 5, 7, ..., 253, 255 |
// In between probabilities are interpolated linearly |
@@ -210,171 +150,62 @@ |
typedef unsigned int vp9_coeff_count_model[REF_TYPES][COEF_BANDS] |
[PREV_COEF_CONTEXTS] |
[UNCONSTRAINED_NODES + 1]; |
-typedef unsigned int vp9_coeff_stats_model[REF_TYPES][COEF_BANDS] |
- [PREV_COEF_CONTEXTS] |
- [UNCONSTRAINED_NODES][2]; |
void vp9_model_to_full_probs(const vp9_prob *model, vp9_prob *full); |
-static INLINE const int16_t* get_scan_4x4(TX_TYPE tx_type) { |
- switch (tx_type) { |
- case ADST_DCT: |
- return vp9_row_scan_4x4; |
- case DCT_ADST: |
- return vp9_col_scan_4x4; |
- default: |
- return vp9_default_scan_4x4; |
- } |
-} |
+static int get_entropy_context(TX_SIZE tx_size, |
+ ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) { |
+ ENTROPY_CONTEXT above_ec = 0, left_ec = 0; |
-static INLINE void get_scan_nb_4x4(TX_TYPE tx_type, |
- const int16_t **scan, const int16_t **nb) { |
- switch (tx_type) { |
- case ADST_DCT: |
- *scan = vp9_row_scan_4x4; |
- *nb = vp9_row_scan_4x4_neighbors; |
+ switch (tx_size) { |
+ case TX_4X4: |
+ above_ec = a[0] != 0; |
+ left_ec = l[0] != 0; |
break; |
- case DCT_ADST: |
- *scan = vp9_col_scan_4x4; |
- *nb = vp9_col_scan_4x4_neighbors; |
+ case TX_8X8: |
+ above_ec = !!*(uint16_t *)a; |
+ left_ec = !!*(uint16_t *)l; |
break; |
- default: |
- *scan = vp9_default_scan_4x4; |
- *nb = vp9_default_scan_4x4_neighbors; |
+ case TX_16X16: |
+ above_ec = !!*(uint32_t *)a; |
+ left_ec = !!*(uint32_t *)l; |
break; |
- } |
-} |
- |
-static INLINE const int16_t* get_iscan_4x4(TX_TYPE tx_type) { |
- switch (tx_type) { |
- case ADST_DCT: |
- return vp9_row_iscan_4x4; |
- case DCT_ADST: |
- return vp9_col_iscan_4x4; |
- default: |
- return vp9_default_iscan_4x4; |
- } |
-} |
- |
-static INLINE const int16_t* get_scan_8x8(TX_TYPE tx_type) { |
- switch (tx_type) { |
- case ADST_DCT: |
- return vp9_row_scan_8x8; |
- case DCT_ADST: |
- return vp9_col_scan_8x8; |
- default: |
- return vp9_default_scan_8x8; |
- } |
-} |
- |
-static INLINE void get_scan_nb_8x8(TX_TYPE tx_type, |
- const int16_t **scan, const int16_t **nb) { |
- switch (tx_type) { |
- case ADST_DCT: |
- *scan = vp9_row_scan_8x8; |
- *nb = vp9_row_scan_8x8_neighbors; |
+ case TX_32X32: |
+ above_ec = !!*(uint64_t *)a; |
+ left_ec = !!*(uint64_t *)l; |
break; |
- case DCT_ADST: |
- *scan = vp9_col_scan_8x8; |
- *nb = vp9_col_scan_8x8_neighbors; |
- break; |
default: |
- *scan = vp9_default_scan_8x8; |
- *nb = vp9_default_scan_8x8_neighbors; |
- break; |
+ assert(!"Invalid transform size."); |
} |
-} |
-static INLINE const int16_t* get_iscan_8x8(TX_TYPE tx_type) { |
- switch (tx_type) { |
- case ADST_DCT: |
- return vp9_row_iscan_8x8; |
- case DCT_ADST: |
- return vp9_col_iscan_8x8; |
- default: |
- return vp9_default_iscan_8x8; |
- } |
+ return combine_entropy_contexts(above_ec, left_ec); |
} |
-static INLINE const int16_t* get_scan_16x16(TX_TYPE tx_type) { |
- switch (tx_type) { |
- case ADST_DCT: |
- return vp9_row_scan_16x16; |
- case DCT_ADST: |
- return vp9_col_scan_16x16; |
- default: |
- return vp9_default_scan_16x16; |
- } |
+static const uint8_t *get_band_translate(TX_SIZE tx_size) { |
+ return tx_size == TX_4X4 ? vp9_coefband_trans_4x4 |
+ : vp9_coefband_trans_8x8plus; |
} |
-static INLINE void get_scan_nb_16x16(TX_TYPE tx_type, |
- const int16_t **scan, const int16_t **nb) { |
- switch (tx_type) { |
- case ADST_DCT: |
- *scan = vp9_row_scan_16x16; |
- *nb = vp9_row_scan_16x16_neighbors; |
- break; |
- case DCT_ADST: |
- *scan = vp9_col_scan_16x16; |
- *nb = vp9_col_scan_16x16_neighbors; |
- break; |
- default: |
- *scan = vp9_default_scan_16x16; |
- *nb = vp9_default_scan_16x16_neighbors; |
- break; |
- } |
-} |
- |
-static INLINE const int16_t* get_iscan_16x16(TX_TYPE tx_type) { |
- switch (tx_type) { |
- case ADST_DCT: |
- return vp9_row_iscan_16x16; |
- case DCT_ADST: |
- return vp9_col_iscan_16x16; |
- default: |
- return vp9_default_iscan_16x16; |
- } |
-} |
- |
-static int get_entropy_context(const MACROBLOCKD *xd, TX_SIZE tx_size, |
- PLANE_TYPE type, int block_idx, |
- ENTROPY_CONTEXT *A, ENTROPY_CONTEXT *L, |
- const int16_t **scan, |
- const uint8_t **band_translate) { |
- ENTROPY_CONTEXT above_ec = 0, left_ec = 0; |
- |
+static void get_scan(const MACROBLOCKD *xd, TX_SIZE tx_size, |
+ PLANE_TYPE type, int block_idx, |
+ const int16_t **scan, const int16_t **scan_nb) { |
switch (tx_size) { |
case TX_4X4: |
- *scan = get_scan_4x4(get_tx_type_4x4(type, xd, block_idx)); |
- *band_translate = vp9_coefband_trans_4x4; |
- above_ec = A[0] != 0; |
- left_ec = L[0] != 0; |
+ get_scan_nb_4x4(get_tx_type_4x4(type, xd, block_idx), scan, scan_nb); |
break; |
case TX_8X8: |
- *scan = get_scan_8x8(get_tx_type_8x8(type, xd)); |
- *band_translate = vp9_coefband_trans_8x8plus; |
- above_ec = !!*(uint16_t *)A; |
- left_ec = !!*(uint16_t *)L; |
+ get_scan_nb_8x8(get_tx_type_8x8(type, xd), scan, scan_nb); |
break; |
case TX_16X16: |
- *scan = get_scan_16x16(get_tx_type_16x16(type, xd)); |
- *band_translate = vp9_coefband_trans_8x8plus; |
- above_ec = !!*(uint32_t *)A; |
- left_ec = !!*(uint32_t *)L; |
+ get_scan_nb_16x16(get_tx_type_16x16(type, xd), scan, scan_nb); |
break; |
case TX_32X32: |
*scan = vp9_default_scan_32x32; |
- *band_translate = vp9_coefband_trans_8x8plus; |
- above_ec = !!*(uint64_t *)A; |
- left_ec = !!*(uint64_t *)L; |
+ *scan_nb = vp9_default_scan_32x32_neighbors; |
break; |
default: |
assert(!"Invalid transform size."); |
} |
- |
- return combine_entropy_contexts(above_ec, left_ec); |
} |
-enum { VP9_COEF_UPDATE_PROB = 252 }; |
- |
#endif // VP9_COMMON_VP9_ENTROPY_H_ |