/src/libvpx/vp9/encoder/vp9_tokenize.c
Line | Count | Source (jump to first uncovered line) |
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 | | #include <assert.h> |
12 | | #include <math.h> |
13 | | #include <stdio.h> |
14 | | #include <string.h> |
15 | | |
16 | | #include "vpx_mem/vpx_mem.h" |
17 | | |
18 | | #include "vp9/common/vp9_entropy.h" |
19 | | #include "vp9/common/vp9_pred_common.h" |
20 | | #include "vp9/common/vp9_scan.h" |
21 | | |
22 | | #include "vp9/encoder/vp9_cost.h" |
23 | | #include "vp9/encoder/vp9_encoder.h" |
24 | | #include "vp9/encoder/vp9_tokenize.h" |
25 | | |
26 | | static const TOKENVALUE dct_cat_lt_10_value_tokens[] = { |
27 | | { 9, 63 }, { 9, 61 }, { 9, 59 }, { 9, 57 }, { 9, 55 }, { 9, 53 }, { 9, 51 }, |
28 | | { 9, 49 }, { 9, 47 }, { 9, 45 }, { 9, 43 }, { 9, 41 }, { 9, 39 }, { 9, 37 }, |
29 | | { 9, 35 }, { 9, 33 }, { 9, 31 }, { 9, 29 }, { 9, 27 }, { 9, 25 }, { 9, 23 }, |
30 | | { 9, 21 }, { 9, 19 }, { 9, 17 }, { 9, 15 }, { 9, 13 }, { 9, 11 }, { 9, 9 }, |
31 | | { 9, 7 }, { 9, 5 }, { 9, 3 }, { 9, 1 }, { 8, 31 }, { 8, 29 }, { 8, 27 }, |
32 | | { 8, 25 }, { 8, 23 }, { 8, 21 }, { 8, 19 }, { 8, 17 }, { 8, 15 }, { 8, 13 }, |
33 | | { 8, 11 }, { 8, 9 }, { 8, 7 }, { 8, 5 }, { 8, 3 }, { 8, 1 }, { 7, 15 }, |
34 | | { 7, 13 }, { 7, 11 }, { 7, 9 }, { 7, 7 }, { 7, 5 }, { 7, 3 }, { 7, 1 }, |
35 | | { 6, 7 }, { 6, 5 }, { 6, 3 }, { 6, 1 }, { 5, 3 }, { 5, 1 }, { 4, 1 }, |
36 | | { 3, 1 }, { 2, 1 }, { 1, 1 }, { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, |
37 | | { 4, 0 }, { 5, 0 }, { 5, 2 }, { 6, 0 }, { 6, 2 }, { 6, 4 }, { 6, 6 }, |
38 | | { 7, 0 }, { 7, 2 }, { 7, 4 }, { 7, 6 }, { 7, 8 }, { 7, 10 }, { 7, 12 }, |
39 | | { 7, 14 }, { 8, 0 }, { 8, 2 }, { 8, 4 }, { 8, 6 }, { 8, 8 }, { 8, 10 }, |
40 | | { 8, 12 }, { 8, 14 }, { 8, 16 }, { 8, 18 }, { 8, 20 }, { 8, 22 }, { 8, 24 }, |
41 | | { 8, 26 }, { 8, 28 }, { 8, 30 }, { 9, 0 }, { 9, 2 }, { 9, 4 }, { 9, 6 }, |
42 | | { 9, 8 }, { 9, 10 }, { 9, 12 }, { 9, 14 }, { 9, 16 }, { 9, 18 }, { 9, 20 }, |
43 | | { 9, 22 }, { 9, 24 }, { 9, 26 }, { 9, 28 }, { 9, 30 }, { 9, 32 }, { 9, 34 }, |
44 | | { 9, 36 }, { 9, 38 }, { 9, 40 }, { 9, 42 }, { 9, 44 }, { 9, 46 }, { 9, 48 }, |
45 | | { 9, 50 }, { 9, 52 }, { 9, 54 }, { 9, 56 }, { 9, 58 }, { 9, 60 }, { 9, 62 } |
46 | | }; |
47 | | const TOKENVALUE *vp9_dct_cat_lt_10_value_tokens = |
48 | | dct_cat_lt_10_value_tokens + |
49 | | (sizeof(dct_cat_lt_10_value_tokens) / sizeof(*dct_cat_lt_10_value_tokens)) / |
50 | | 2; |
51 | | // The corresponding costs of the extrabits for the tokens in the above table |
52 | | // are stored in the table below. The values are obtained from looking up the |
53 | | // entry for the specified extrabits in the table corresponding to the token |
54 | | // (as defined in cost element vp9_extra_bits) |
55 | | // e.g. {9, 63} maps to cat5_cost[63 >> 1], {1, 1} maps to sign_cost[1 >> 1] |
56 | | static const int dct_cat_lt_10_value_cost[] = { |
57 | | 3773, 3750, 3704, 3681, 3623, 3600, 3554, 3531, 3432, 3409, 3363, 3340, 3282, |
58 | | 3259, 3213, 3190, 3136, 3113, 3067, 3044, 2986, 2963, 2917, 2894, 2795, 2772, |
59 | | 2726, 2703, 2645, 2622, 2576, 2553, 3197, 3116, 3058, 2977, 2881, 2800, 2742, |
60 | | 2661, 2615, 2534, 2476, 2395, 2299, 2218, 2160, 2079, 2566, 2427, 2334, 2195, |
61 | | 2023, 1884, 1791, 1652, 1893, 1696, 1453, 1256, 1229, 864, 512, 512, 512, |
62 | | 512, 0, 512, 512, 512, 512, 864, 1229, 1256, 1453, 1696, 1893, 1652, |
63 | | 1791, 1884, 2023, 2195, 2334, 2427, 2566, 2079, 2160, 2218, 2299, 2395, 2476, |
64 | | 2534, 2615, 2661, 2742, 2800, 2881, 2977, 3058, 3116, 3197, 2553, 2576, 2622, |
65 | | 2645, 2703, 2726, 2772, 2795, 2894, 2917, 2963, 2986, 3044, 3067, 3113, 3136, |
66 | | 3190, 3213, 3259, 3282, 3340, 3363, 3409, 3432, 3531, 3554, 3600, 3623, 3681, |
67 | | 3704, 3750, 3773, |
68 | | }; |
69 | | const int *vp9_dct_cat_lt_10_value_cost = |
70 | | dct_cat_lt_10_value_cost + |
71 | | (sizeof(dct_cat_lt_10_value_cost) / sizeof(*dct_cat_lt_10_value_cost)) / 2; |
72 | | |
73 | | // Array indices are identical to previously-existing CONTEXT_NODE indices |
74 | | /* clang-format off */ |
75 | | const vpx_tree_index vp9_coef_tree[TREE_SIZE(ENTROPY_TOKENS)] = { |
76 | | -EOB_TOKEN, 2, // 0 = EOB |
77 | | -ZERO_TOKEN, 4, // 1 = ZERO |
78 | | -ONE_TOKEN, 6, // 2 = ONE |
79 | | 8, 12, // 3 = LOW_VAL |
80 | | -TWO_TOKEN, 10, // 4 = TWO |
81 | | -THREE_TOKEN, -FOUR_TOKEN, // 5 = THREE |
82 | | 14, 16, // 6 = HIGH_LOW |
83 | | -CATEGORY1_TOKEN, -CATEGORY2_TOKEN, // 7 = CAT_ONE |
84 | | 18, 20, // 8 = CAT_THREEFOUR |
85 | | -CATEGORY3_TOKEN, -CATEGORY4_TOKEN, // 9 = CAT_THREE |
86 | | -CATEGORY5_TOKEN, -CATEGORY6_TOKEN // 10 = CAT_FIVE |
87 | | }; |
88 | | /* clang-format on */ |
89 | | |
90 | | static const int16_t zero_cost[] = { 0 }; |
91 | | static const int16_t sign_cost[1] = { 512 }; |
92 | | static const int16_t cat1_cost[1 << 1] = { 864, 1229 }; |
93 | | static const int16_t cat2_cost[1 << 2] = { 1256, 1453, 1696, 1893 }; |
94 | | static const int16_t cat3_cost[1 << 3] = { 1652, 1791, 1884, 2023, |
95 | | 2195, 2334, 2427, 2566 }; |
96 | | static const int16_t cat4_cost[1 << 4] = { 2079, 2160, 2218, 2299, 2395, 2476, |
97 | | 2534, 2615, 2661, 2742, 2800, 2881, |
98 | | 2977, 3058, 3116, 3197 }; |
99 | | static const int16_t cat5_cost[1 << 5] = { |
100 | | 2553, 2576, 2622, 2645, 2703, 2726, 2772, 2795, 2894, 2917, 2963, |
101 | | 2986, 3044, 3067, 3113, 3136, 3190, 3213, 3259, 3282, 3340, 3363, |
102 | | 3409, 3432, 3531, 3554, 3600, 3623, 3681, 3704, 3750, 3773 |
103 | | }; |
104 | | const int16_t vp9_cat6_low_cost[256] = { |
105 | | 3378, 3390, 3401, 3413, 3435, 3447, 3458, 3470, 3517, 3529, 3540, 3552, 3574, |
106 | | 3586, 3597, 3609, 3671, 3683, 3694, 3706, 3728, 3740, 3751, 3763, 3810, 3822, |
107 | | 3833, 3845, 3867, 3879, 3890, 3902, 3973, 3985, 3996, 4008, 4030, 4042, 4053, |
108 | | 4065, 4112, 4124, 4135, 4147, 4169, 4181, 4192, 4204, 4266, 4278, 4289, 4301, |
109 | | 4323, 4335, 4346, 4358, 4405, 4417, 4428, 4440, 4462, 4474, 4485, 4497, 4253, |
110 | | 4265, 4276, 4288, 4310, 4322, 4333, 4345, 4392, 4404, 4415, 4427, 4449, 4461, |
111 | | 4472, 4484, 4546, 4558, 4569, 4581, 4603, 4615, 4626, 4638, 4685, 4697, 4708, |
112 | | 4720, 4742, 4754, 4765, 4777, 4848, 4860, 4871, 4883, 4905, 4917, 4928, 4940, |
113 | | 4987, 4999, 5010, 5022, 5044, 5056, 5067, 5079, 5141, 5153, 5164, 5176, 5198, |
114 | | 5210, 5221, 5233, 5280, 5292, 5303, 5315, 5337, 5349, 5360, 5372, 4988, 5000, |
115 | | 5011, 5023, 5045, 5057, 5068, 5080, 5127, 5139, 5150, 5162, 5184, 5196, 5207, |
116 | | 5219, 5281, 5293, 5304, 5316, 5338, 5350, 5361, 5373, 5420, 5432, 5443, 5455, |
117 | | 5477, 5489, 5500, 5512, 5583, 5595, 5606, 5618, 5640, 5652, 5663, 5675, 5722, |
118 | | 5734, 5745, 5757, 5779, 5791, 5802, 5814, 5876, 5888, 5899, 5911, 5933, 5945, |
119 | | 5956, 5968, 6015, 6027, 6038, 6050, 6072, 6084, 6095, 6107, 5863, 5875, 5886, |
120 | | 5898, 5920, 5932, 5943, 5955, 6002, 6014, 6025, 6037, 6059, 6071, 6082, 6094, |
121 | | 6156, 6168, 6179, 6191, 6213, 6225, 6236, 6248, 6295, 6307, 6318, 6330, 6352, |
122 | | 6364, 6375, 6387, 6458, 6470, 6481, 6493, 6515, 6527, 6538, 6550, 6597, 6609, |
123 | | 6620, 6632, 6654, 6666, 6677, 6689, 6751, 6763, 6774, 6786, 6808, 6820, 6831, |
124 | | 6843, 6890, 6902, 6913, 6925, 6947, 6959, 6970, 6982 |
125 | | }; |
126 | | const uint16_t vp9_cat6_high_cost[64] = { |
127 | | 88, 2251, 2727, 4890, 3148, 5311, 5787, 7950, 3666, 5829, 6305, |
128 | | 8468, 6726, 8889, 9365, 11528, 3666, 5829, 6305, 8468, 6726, 8889, |
129 | | 9365, 11528, 7244, 9407, 9883, 12046, 10304, 12467, 12943, 15106, 3666, |
130 | | 5829, 6305, 8468, 6726, 8889, 9365, 11528, 7244, 9407, 9883, 12046, |
131 | | 10304, 12467, 12943, 15106, 7244, 9407, 9883, 12046, 10304, 12467, 12943, |
132 | | 15106, 10822, 12985, 13461, 15624, 13882, 16045, 16521, 18684 |
133 | | }; |
134 | | |
135 | | #if CONFIG_VP9_HIGHBITDEPTH |
136 | | const uint16_t vp9_cat6_high10_high_cost[256] = { |
137 | | 94, 2257, 2733, 4896, 3154, 5317, 5793, 7956, 3672, 5835, 6311, |
138 | | 8474, 6732, 8895, 9371, 11534, 3672, 5835, 6311, 8474, 6732, 8895, |
139 | | 9371, 11534, 7250, 9413, 9889, 12052, 10310, 12473, 12949, 15112, 3672, |
140 | | 5835, 6311, 8474, 6732, 8895, 9371, 11534, 7250, 9413, 9889, 12052, |
141 | | 10310, 12473, 12949, 15112, 7250, 9413, 9889, 12052, 10310, 12473, 12949, |
142 | | 15112, 10828, 12991, 13467, 15630, 13888, 16051, 16527, 18690, 4187, 6350, |
143 | | 6826, 8989, 7247, 9410, 9886, 12049, 7765, 9928, 10404, 12567, 10825, |
144 | | 12988, 13464, 15627, 7765, 9928, 10404, 12567, 10825, 12988, 13464, 15627, |
145 | | 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 7765, 9928, 10404, |
146 | | 12567, 10825, 12988, 13464, 15627, 11343, 13506, 13982, 16145, 14403, 16566, |
147 | | 17042, 19205, 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 14921, |
148 | | 17084, 17560, 19723, 17981, 20144, 20620, 22783, 4187, 6350, 6826, 8989, |
149 | | 7247, 9410, 9886, 12049, 7765, 9928, 10404, 12567, 10825, 12988, 13464, |
150 | | 15627, 7765, 9928, 10404, 12567, 10825, 12988, 13464, 15627, 11343, 13506, |
151 | | 13982, 16145, 14403, 16566, 17042, 19205, 7765, 9928, 10404, 12567, 10825, |
152 | | 12988, 13464, 15627, 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, |
153 | | 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 14921, 17084, 17560, |
154 | | 19723, 17981, 20144, 20620, 22783, 8280, 10443, 10919, 13082, 11340, 13503, |
155 | | 13979, 16142, 11858, 14021, 14497, 16660, 14918, 17081, 17557, 19720, 11858, |
156 | | 14021, 14497, 16660, 14918, 17081, 17557, 19720, 15436, 17599, 18075, 20238, |
157 | | 18496, 20659, 21135, 23298, 11858, 14021, 14497, 16660, 14918, 17081, 17557, |
158 | | 19720, 15436, 17599, 18075, 20238, 18496, 20659, 21135, 23298, 15436, 17599, |
159 | | 18075, 20238, 18496, 20659, 21135, 23298, 19014, 21177, 21653, 23816, 22074, |
160 | | 24237, 24713, 26876 |
161 | | }; |
162 | | const uint16_t vp9_cat6_high12_high_cost[1024] = { |
163 | | 100, 2263, 2739, 4902, 3160, 5323, 5799, 7962, 3678, 5841, 6317, |
164 | | 8480, 6738, 8901, 9377, 11540, 3678, 5841, 6317, 8480, 6738, 8901, |
165 | | 9377, 11540, 7256, 9419, 9895, 12058, 10316, 12479, 12955, 15118, 3678, |
166 | | 5841, 6317, 8480, 6738, 8901, 9377, 11540, 7256, 9419, 9895, 12058, |
167 | | 10316, 12479, 12955, 15118, 7256, 9419, 9895, 12058, 10316, 12479, 12955, |
168 | | 15118, 10834, 12997, 13473, 15636, 13894, 16057, 16533, 18696, 4193, 6356, |
169 | | 6832, 8995, 7253, 9416, 9892, 12055, 7771, 9934, 10410, 12573, 10831, |
170 | | 12994, 13470, 15633, 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, |
171 | | 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 7771, 9934, 10410, |
172 | | 12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, |
173 | | 17048, 19211, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, |
174 | | 17090, 17566, 19729, 17987, 20150, 20626, 22789, 4193, 6356, 6832, 8995, |
175 | | 7253, 9416, 9892, 12055, 7771, 9934, 10410, 12573, 10831, 12994, 13470, |
176 | | 15633, 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, 11349, 13512, |
177 | | 13988, 16151, 14409, 16572, 17048, 19211, 7771, 9934, 10410, 12573, 10831, |
178 | | 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, |
179 | | 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, 17090, 17566, |
180 | | 19729, 17987, 20150, 20626, 22789, 8286, 10449, 10925, 13088, 11346, 13509, |
181 | | 13985, 16148, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, |
182 | | 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, |
183 | | 18502, 20665, 21141, 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, |
184 | | 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, |
185 | | 18081, 20244, 18502, 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, |
186 | | 24243, 24719, 26882, 4193, 6356, 6832, 8995, 7253, 9416, 9892, 12055, |
187 | | 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, 7771, 9934, 10410, |
188 | | 12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, |
189 | | 17048, 19211, 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, 11349, |
190 | | 13512, 13988, 16151, 14409, 16572, 17048, 19211, 11349, 13512, 13988, 16151, |
191 | | 14409, 16572, 17048, 19211, 14927, 17090, 17566, 19729, 17987, 20150, 20626, |
192 | | 22789, 8286, 10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, |
193 | | 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, |
194 | | 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, |
195 | | 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, |
196 | | 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, |
197 | | 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, 8286, |
198 | | 10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, 14503, 16666, |
199 | | 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, 17087, 17563, |
200 | | 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 11864, 14027, |
201 | | 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, |
202 | | 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, |
203 | | 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, 12379, 14542, 15018, |
204 | | 17181, 15439, 17602, 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, |
205 | | 21656, 23819, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, |
206 | | 21698, 22174, 24337, 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, |
207 | | 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, |
208 | | 27397, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, |
209 | | 25752, 27915, 26173, 28336, 28812, 30975, 4193, 6356, 6832, 8995, 7253, |
210 | | 9416, 9892, 12055, 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, |
211 | | 7771, 9934, 10410, 12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, |
212 | | 16151, 14409, 16572, 17048, 19211, 7771, 9934, 10410, 12573, 10831, 12994, |
213 | | 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 11349, |
214 | | 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, 17090, 17566, 19729, |
215 | | 17987, 20150, 20626, 22789, 8286, 10449, 10925, 13088, 11346, 13509, 13985, |
216 | | 16148, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, |
217 | | 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, |
218 | | 20665, 21141, 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, |
219 | | 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, |
220 | | 20244, 18502, 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, |
221 | | 24719, 26882, 8286, 10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, |
222 | | 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, |
223 | | 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, |
224 | | 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, |
225 | | 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, |
226 | | 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, |
227 | | 12379, 14542, 15018, 17181, 15439, 17602, 18078, 20241, 15957, 18120, 18596, |
228 | | 20759, 19017, 21180, 21656, 23819, 15957, 18120, 18596, 20759, 19017, 21180, |
229 | | 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 15957, |
230 | | 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337, |
231 | | 22595, 24758, 25234, 27397, 19535, 21698, 22174, 24337, 22595, 24758, 25234, |
232 | | 27397, 23113, 25276, 25752, 27915, 26173, 28336, 28812, 30975, 8286, 10449, |
233 | | 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, 14503, 16666, 14924, |
234 | | 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, |
235 | | 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 11864, 14027, 14503, |
236 | | 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, |
237 | | 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 19020, |
238 | | 21183, 21659, 23822, 22080, 24243, 24719, 26882, 12379, 14542, 15018, 17181, |
239 | | 15439, 17602, 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, 21656, |
240 | | 23819, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, |
241 | | 22174, 24337, 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, 19017, |
242 | | 21180, 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, |
243 | | 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, 25752, |
244 | | 27915, 26173, 28336, 28812, 30975, 12379, 14542, 15018, 17181, 15439, 17602, |
245 | | 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 15957, |
246 | | 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337, |
247 | | 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, 19017, 21180, 21656, |
248 | | 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 19535, 21698, |
249 | | 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, 25752, 27915, 26173, |
250 | | 28336, 28812, 30975, 16472, 18635, 19111, 21274, 19532, 21695, 22171, 24334, |
251 | | 20050, 22213, 22689, 24852, 23110, 25273, 25749, 27912, 20050, 22213, 22689, |
252 | | 24852, 23110, 25273, 25749, 27912, 23628, 25791, 26267, 28430, 26688, 28851, |
253 | | 29327, 31490, 20050, 22213, 22689, 24852, 23110, 25273, 25749, 27912, 23628, |
254 | | 25791, 26267, 28430, 26688, 28851, 29327, 31490, 23628, 25791, 26267, 28430, |
255 | | 26688, 28851, 29327, 31490, 27206, 29369, 29845, 32008, 30266, 32429, 32905, |
256 | | 35068 |
257 | | }; |
258 | | #endif |
259 | | |
260 | | const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS] = { |
261 | | { 0, 0, 0, zero_cost }, // ZERO_TOKEN |
262 | | { 0, 0, 1, sign_cost }, // ONE_TOKEN |
263 | | { 0, 0, 2, sign_cost }, // TWO_TOKEN |
264 | | { 0, 0, 3, sign_cost }, // THREE_TOKEN |
265 | | { 0, 0, 4, sign_cost }, // FOUR_TOKEN |
266 | | { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost }, // CATEGORY1_TOKEN |
267 | | { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost }, // CATEGORY2_TOKEN |
268 | | { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost }, // CATEGORY3_TOKEN |
269 | | { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost }, // CATEGORY4_TOKEN |
270 | | { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost }, // CATEGORY5_TOKEN |
271 | | { vp9_cat6_prob, 14, CAT6_MIN_VAL, 0 }, // CATEGORY6_TOKEN |
272 | | { 0, 0, 0, zero_cost } // EOB_TOKEN |
273 | | }; |
274 | | |
275 | | #if CONFIG_VP9_HIGHBITDEPTH |
276 | | const vp9_extra_bit vp9_extra_bits_high10[ENTROPY_TOKENS] = { |
277 | | { 0, 0, 0, zero_cost }, // ZERO |
278 | | { 0, 0, 1, sign_cost }, // ONE |
279 | | { 0, 0, 2, sign_cost }, // TWO |
280 | | { 0, 0, 3, sign_cost }, // THREE |
281 | | { 0, 0, 4, sign_cost }, // FOUR |
282 | | { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost }, // CAT1 |
283 | | { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost }, // CAT2 |
284 | | { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost }, // CAT3 |
285 | | { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost }, // CAT4 |
286 | | { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost }, // CAT5 |
287 | | { vp9_cat6_prob_high12 + 2, 16, CAT6_MIN_VAL, 0 }, // CAT6 |
288 | | { 0, 0, 0, zero_cost } // EOB |
289 | | }; |
290 | | const vp9_extra_bit vp9_extra_bits_high12[ENTROPY_TOKENS] = { |
291 | | { 0, 0, 0, zero_cost }, // ZERO |
292 | | { 0, 0, 1, sign_cost }, // ONE |
293 | | { 0, 0, 2, sign_cost }, // TWO |
294 | | { 0, 0, 3, sign_cost }, // THREE |
295 | | { 0, 0, 4, sign_cost }, // FOUR |
296 | | { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost }, // CAT1 |
297 | | { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost }, // CAT2 |
298 | | { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost }, // CAT3 |
299 | | { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost }, // CAT4 |
300 | | { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost }, // CAT5 |
301 | | { vp9_cat6_prob_high12, 18, CAT6_MIN_VAL, 0 }, // CAT6 |
302 | | { 0, 0, 0, zero_cost } // EOB |
303 | | }; |
304 | | #endif |
305 | | |
306 | | const struct vp9_token vp9_coef_encodings[ENTROPY_TOKENS] = { |
307 | | { 2, 2 }, { 6, 3 }, { 28, 5 }, { 58, 6 }, { 59, 6 }, { 60, 6 }, |
308 | | { 61, 6 }, { 124, 7 }, { 125, 7 }, { 126, 7 }, { 127, 7 }, { 0, 1 } |
309 | | }; |
310 | | |
311 | | struct tokenize_b_args { |
312 | | VP9_COMP *cpi; |
313 | | ThreadData *td; |
314 | | TOKENEXTRA **tp; |
315 | | }; |
316 | | |
317 | | static void set_entropy_context_b(int plane, int block, int row, int col, |
318 | | BLOCK_SIZE plane_bsize, TX_SIZE tx_size, |
319 | 30.8M | void *arg) { |
320 | 30.8M | struct tokenize_b_args *const args = arg; |
321 | 30.8M | ThreadData *const td = args->td; |
322 | 30.8M | MACROBLOCK *const x = &td->mb; |
323 | 30.8M | MACROBLOCKD *const xd = &x->e_mbd; |
324 | 30.8M | struct macroblock_plane *p = &x->plane[plane]; |
325 | 30.8M | struct macroblockd_plane *pd = &xd->plane[plane]; |
326 | 30.8M | vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, col, row); |
327 | 30.8M | } |
328 | | |
329 | | static INLINE void add_token(TOKENEXTRA **t, const vpx_prob *context_tree, |
330 | | int16_t token, EXTRABIT extra, |
331 | 99.2M | unsigned int *counts) { |
332 | 99.2M | (*t)->context_tree = context_tree; |
333 | 99.2M | (*t)->token = token; |
334 | 99.2M | (*t)->extra = extra; |
335 | 99.2M | (*t)++; |
336 | 99.2M | ++counts[token]; |
337 | 99.2M | } |
338 | | |
339 | | static INLINE void add_token_no_extra(TOKENEXTRA **t, |
340 | | const vpx_prob *context_tree, |
341 | 30.5M | int16_t token, unsigned int *counts) { |
342 | 30.5M | (*t)->context_tree = context_tree; |
343 | 30.5M | (*t)->token = token; |
344 | 30.5M | (*t)++; |
345 | 30.5M | ++counts[token]; |
346 | 30.5M | } |
347 | | |
348 | | static void tokenize_b(int plane, int block, int row, int col, |
349 | 9.90M | BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg) { |
350 | 9.90M | struct tokenize_b_args *const args = arg; |
351 | 9.90M | VP9_COMP *cpi = args->cpi; |
352 | 9.90M | ThreadData *const td = args->td; |
353 | 9.90M | MACROBLOCK *const x = &td->mb; |
354 | 9.90M | MACROBLOCKD *const xd = &x->e_mbd; |
355 | 9.90M | TOKENEXTRA **tp = args->tp; |
356 | 9.90M | uint8_t token_cache[32 * 32]; |
357 | 9.90M | struct macroblock_plane *p = &x->plane[plane]; |
358 | 9.90M | struct macroblockd_plane *pd = &xd->plane[plane]; |
359 | 9.90M | MODE_INFO *mi = xd->mi[0]; |
360 | 9.90M | int pt; /* near block/prev token context index */ |
361 | 9.90M | int c; |
362 | 9.90M | TOKENEXTRA *t = *tp; /* store tokens starting here */ |
363 | 9.90M | int eob = p->eobs[block]; |
364 | 9.90M | const PLANE_TYPE type = get_plane_type(plane); |
365 | 9.90M | const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block); |
366 | 9.90M | const int16_t *scan, *nb; |
367 | 9.90M | const ScanOrder *so; |
368 | 9.90M | const int ref = is_inter_block(mi); |
369 | 9.90M | unsigned int(*const counts)[COEFF_CONTEXTS][ENTROPY_TOKENS] = |
370 | 9.90M | td->rd_counts.coef_counts[tx_size][type][ref]; |
371 | 9.90M | vpx_prob(*const coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] = |
372 | 9.90M | cpi->common.fc->coef_probs[tx_size][type][ref]; |
373 | 9.90M | unsigned int(*const eob_branch)[COEFF_CONTEXTS] = |
374 | 9.90M | td->counts->eob_branch[tx_size][type][ref]; |
375 | 9.90M | const uint8_t *const band = get_band_translate(tx_size); |
376 | 9.90M | const int tx_eob = 16 << (tx_size << 1); |
377 | 9.90M | int16_t token; |
378 | 9.90M | EXTRABIT extra; |
379 | 9.90M | pt = get_entropy_context(tx_size, pd->above_context + col, |
380 | 9.90M | pd->left_context + row); |
381 | 9.90M | so = get_scan(xd, tx_size, type, block); |
382 | 9.90M | scan = so->scan; |
383 | 9.90M | nb = so->neighbors; |
384 | 9.90M | c = 0; |
385 | | |
386 | 109M | while (c < eob) { |
387 | 99.2M | int v = 0; |
388 | 99.2M | v = qcoeff[scan[c]]; |
389 | 99.2M | ++eob_branch[band[c]][pt]; |
390 | | |
391 | 125M | while (!v) { |
392 | 25.8M | add_token_no_extra(&t, coef_probs[band[c]][pt], ZERO_TOKEN, |
393 | 25.8M | counts[band[c]][pt]); |
394 | | |
395 | 25.8M | token_cache[scan[c]] = 0; |
396 | 25.8M | ++c; |
397 | 25.8M | pt = get_coef_context(nb, token_cache, c); |
398 | 25.8M | v = qcoeff[scan[c]]; |
399 | 25.8M | } |
400 | | |
401 | 99.2M | vp9_get_token_extra(v, &token, &extra); |
402 | | |
403 | 99.2M | add_token(&t, coef_probs[band[c]][pt], token, extra, counts[band[c]][pt]); |
404 | | |
405 | 99.2M | token_cache[scan[c]] = vp9_pt_energy_class[token]; |
406 | 99.2M | ++c; |
407 | 99.2M | pt = get_coef_context(nb, token_cache, c); |
408 | 99.2M | } |
409 | 9.90M | if (c < tx_eob) { |
410 | 4.68M | ++eob_branch[band[c]][pt]; |
411 | 4.68M | add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN, |
412 | 4.68M | counts[band[c]][pt]); |
413 | 4.68M | } |
414 | | |
415 | 9.90M | *tp = t; |
416 | | |
417 | 9.90M | vp9_set_contexts(xd, pd, plane_bsize, tx_size, c > 0, col, row); |
418 | 9.90M | } |
419 | | |
420 | | struct is_skippable_args { |
421 | | uint16_t *eobs; |
422 | | int *skippable; |
423 | | }; |
424 | | |
425 | | static void is_skippable(int plane, int block, int row, int col, |
426 | 16.2M | BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *argv) { |
427 | 16.2M | struct is_skippable_args *args = argv; |
428 | 16.2M | (void)plane; |
429 | 16.2M | (void)plane_bsize; |
430 | 16.2M | (void)tx_size; |
431 | 16.2M | (void)row; |
432 | 16.2M | (void)col; |
433 | 16.2M | args->skippable[0] &= (!args->eobs[block]); |
434 | 16.2M | } |
435 | | |
436 | | // TODO(yaowu): rewrite and optimize this function to remove the usage of |
437 | | // vp9_foreach_transform_block() and simplify is_skippable(). |
438 | 4.06M | int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { |
439 | 4.06M | int result = 1; |
440 | 4.06M | struct is_skippable_args args = { x->plane[plane].eobs, &result }; |
441 | 4.06M | vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable, |
442 | 4.06M | &args); |
443 | 4.06M | return result; |
444 | 4.06M | } |
445 | | |
446 | | static void has_high_freq_coeff(int plane, int block, int row, int col, |
447 | | BLOCK_SIZE plane_bsize, TX_SIZE tx_size, |
448 | 6.67M | void *argv) { |
449 | 6.67M | struct is_skippable_args *args = argv; |
450 | 6.67M | int eobs = (tx_size == TX_4X4) ? 3 : 10; |
451 | 6.67M | (void)plane; |
452 | 6.67M | (void)plane_bsize; |
453 | 6.67M | (void)row; |
454 | 6.67M | (void)col; |
455 | 6.67M | *(args->skippable) |= (args->eobs[block] > eobs); |
456 | 6.67M | } |
457 | | |
458 | 3.52M | int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { |
459 | 3.52M | int result = 0; |
460 | 3.52M | struct is_skippable_args args = { x->plane[plane].eobs, &result }; |
461 | 3.52M | vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, |
462 | 3.52M | has_high_freq_coeff, &args); |
463 | 3.52M | return result; |
464 | 3.52M | } |
465 | | |
466 | | void vp9_tokenize_sb(VP9_COMP *cpi, ThreadData *td, TOKENEXTRA **t, int dry_run, |
467 | 7.54M | int seg_skip, BLOCK_SIZE bsize) { |
468 | 7.54M | MACROBLOCK *const x = &td->mb; |
469 | 7.54M | MACROBLOCKD *const xd = &x->e_mbd; |
470 | 7.54M | MODE_INFO *const mi = xd->mi[0]; |
471 | 7.54M | const int ctx = vp9_get_skip_context(xd); |
472 | 7.54M | struct tokenize_b_args arg = { cpi, td, t }; |
473 | | |
474 | 7.54M | if (seg_skip) { |
475 | 0 | assert(mi->skip); |
476 | 0 | } |
477 | | |
478 | 7.54M | if (mi->skip) { |
479 | 902k | if (!dry_run && !seg_skip) ++td->counts->skip[ctx][1]; |
480 | 902k | reset_skip_context(xd, bsize); |
481 | 902k | return; |
482 | 902k | } |
483 | | |
484 | 6.63M | if (!dry_run) { |
485 | 1.70M | ++td->counts->skip[ctx][0]; |
486 | 1.70M | vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg); |
487 | 4.93M | } else { |
488 | 4.93M | vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg); |
489 | 4.93M | } |
490 | 6.63M | } |