| 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_
|
|
|