Line data Source code
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_TOKENIZE_H_
12 : #define VP9_ENCODER_VP9_TOKENIZE_H_
13 :
14 : #include "vp9/common/vp9_entropy.h"
15 :
16 : #include "vp9/encoder/vp9_block.h"
17 : #include "vp9/encoder/vp9_treewriter.h"
18 :
19 : #ifdef __cplusplus
20 : extern "C" {
21 : #endif
22 :
23 : #define EOSB_TOKEN 127 // Not signalled, encoder only
24 :
25 : #if CONFIG_VP9_HIGHBITDEPTH
26 : typedef int32_t EXTRABIT;
27 : #else
28 : typedef int16_t EXTRABIT;
29 : #endif
30 :
31 : typedef struct {
32 : int16_t token;
33 : EXTRABIT extra;
34 : } TOKENVALUE;
35 :
36 : typedef struct {
37 : const vpx_prob *context_tree;
38 : int16_t token;
39 : EXTRABIT extra;
40 : } TOKENEXTRA;
41 :
42 : extern const vpx_tree_index vp9_coef_tree[];
43 : extern const vpx_tree_index vp9_coef_con_tree[];
44 : extern const struct vp9_token vp9_coef_encodings[];
45 :
46 : int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane);
47 : int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane);
48 :
49 : struct VP9_COMP;
50 : struct ThreadData;
51 :
52 : void vp9_tokenize_sb(struct VP9_COMP *cpi, struct ThreadData *td,
53 : TOKENEXTRA **t, int dry_run, int seg_skip,
54 : BLOCK_SIZE bsize);
55 :
56 : typedef struct {
57 : const vpx_prob *prob;
58 : int len;
59 : int base_val;
60 : const int16_t *cost;
61 : } vp9_extra_bit;
62 :
63 : // indexed by token value
64 : extern const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS];
65 : #if CONFIG_VP9_HIGHBITDEPTH
66 : extern const vp9_extra_bit vp9_extra_bits_high10[ENTROPY_TOKENS];
67 : extern const vp9_extra_bit vp9_extra_bits_high12[ENTROPY_TOKENS];
68 : #endif // CONFIG_VP9_HIGHBITDEPTH
69 :
70 : extern const int16_t *vp9_dct_value_cost_ptr;
71 : /* TODO: The Token field should be broken out into a separate char array to
72 : * improve cache locality, since it's needed for costing when the rest of the
73 : * fields are not.
74 : */
75 : extern const TOKENVALUE *vp9_dct_value_tokens_ptr;
76 : extern const TOKENVALUE *vp9_dct_cat_lt_10_value_tokens;
77 : extern const int *vp9_dct_cat_lt_10_value_cost;
78 : extern const int16_t vp9_cat6_low_cost[256];
79 : extern const int vp9_cat6_high_cost[64];
80 : extern const int vp9_cat6_high10_high_cost[256];
81 : extern const int vp9_cat6_high12_high_cost[1024];
82 0 : static INLINE int vp9_get_cost(int16_t token, EXTRABIT extrabits,
83 : const int *cat6_high_table) {
84 0 : if (token != CATEGORY6_TOKEN)
85 0 : return vp9_extra_bits[token].cost[extrabits >> 1];
86 0 : return vp9_cat6_low_cost[(extrabits >> 1) & 0xff] +
87 0 : cat6_high_table[extrabits >> 9];
88 : }
89 :
90 : #if CONFIG_VP9_HIGHBITDEPTH
91 : static INLINE const int *vp9_get_high_cost_table(int bit_depth) {
92 : return bit_depth == 8 ? vp9_cat6_high_cost
93 : : (bit_depth == 10 ? vp9_cat6_high10_high_cost
94 : : vp9_cat6_high12_high_cost);
95 : }
96 : #else
97 0 : static INLINE const int *vp9_get_high_cost_table(int bit_depth) {
98 : (void)bit_depth;
99 0 : return vp9_cat6_high_cost;
100 : }
101 : #endif // CONFIG_VP9_HIGHBITDEPTH
102 :
103 0 : static INLINE void vp9_get_token_extra(int v, int16_t *token, EXTRABIT *extra) {
104 0 : if (v >= CAT6_MIN_VAL || v <= -CAT6_MIN_VAL) {
105 0 : *token = CATEGORY6_TOKEN;
106 0 : if (v >= CAT6_MIN_VAL)
107 0 : *extra = 2 * v - 2 * CAT6_MIN_VAL;
108 : else
109 0 : *extra = -2 * v - 2 * CAT6_MIN_VAL + 1;
110 0 : return;
111 : }
112 0 : *token = vp9_dct_cat_lt_10_value_tokens[v].token;
113 0 : *extra = vp9_dct_cat_lt_10_value_tokens[v].extra;
114 : }
115 0 : static INLINE int16_t vp9_get_token(int v) {
116 0 : if (v >= CAT6_MIN_VAL || v <= -CAT6_MIN_VAL) return 10;
117 0 : return vp9_dct_cat_lt_10_value_tokens[v].token;
118 : }
119 :
120 0 : static INLINE int vp9_get_token_cost(int v, int16_t *token,
121 : const int *cat6_high_table) {
122 0 : if (v >= CAT6_MIN_VAL || v <= -CAT6_MIN_VAL) {
123 : EXTRABIT extrabits;
124 0 : *token = CATEGORY6_TOKEN;
125 0 : extrabits = abs(v) - CAT6_MIN_VAL;
126 0 : return vp9_cat6_low_cost[extrabits & 0xff] +
127 0 : cat6_high_table[extrabits >> 8];
128 : }
129 0 : *token = vp9_dct_cat_lt_10_value_tokens[v].token;
130 0 : return vp9_dct_cat_lt_10_value_cost[v];
131 : }
132 :
133 : #ifdef __cplusplus
134 : } // extern "C"
135 : #endif
136 :
137 : #endif // VP9_ENCODER_VP9_TOKENIZE_H_
|