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
set_entropy_context_b(int plane,int block,int row,int col,BLOCK_SIZE plane_bsize,TX_SIZE tx_size,void * arg)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 void *arg) {
320 struct tokenize_b_args *const args = arg;
321 ThreadData *const td = args->td;
322 MACROBLOCK *const x = &td->mb;
323 MACROBLOCKD *const xd = &x->e_mbd;
324 struct macroblock_plane *p = &x->plane[plane];
325 struct macroblockd_plane *pd = &xd->plane[plane];
326 vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, col, row);
327 }
328
add_token(TOKENEXTRA ** t,const vpx_prob * context_tree,int16_t token,EXTRABIT extra,unsigned int * counts)329 static INLINE void add_token(TOKENEXTRA **t, const vpx_prob *context_tree,
330 int16_t token, EXTRABIT extra,
331 unsigned int *counts) {
332 (*t)->context_tree = context_tree;
333 (*t)->token = token;
334 (*t)->extra = extra;
335 (*t)++;
336 ++counts[token];
337 }
338
add_token_no_extra(TOKENEXTRA ** t,const vpx_prob * context_tree,int16_t token,unsigned int * counts)339 static INLINE void add_token_no_extra(TOKENEXTRA **t,
340 const vpx_prob *context_tree,
341 int16_t token, unsigned int *counts) {
342 (*t)->context_tree = context_tree;
343 (*t)->token = token;
344 (*t)++;
345 ++counts[token];
346 }
347
tokenize_b(int plane,int block,int row,int col,BLOCK_SIZE plane_bsize,TX_SIZE tx_size,void * arg)348 static void tokenize_b(int plane, int block, int row, int col,
349 BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg) {
350 struct tokenize_b_args *const args = arg;
351 VP9_COMP *cpi = args->cpi;
352 ThreadData *const td = args->td;
353 MACROBLOCK *const x = &td->mb;
354 MACROBLOCKD *const xd = &x->e_mbd;
355 TOKENEXTRA **tp = args->tp;
356 uint8_t token_cache[32 * 32];
357 struct macroblock_plane *p = &x->plane[plane];
358 struct macroblockd_plane *pd = &xd->plane[plane];
359 MODE_INFO *mi = xd->mi[0];
360 int pt; /* near block/prev token context index */
361 int c;
362 TOKENEXTRA *t = *tp; /* store tokens starting here */
363 int eob = p->eobs[block];
364 const PLANE_TYPE type = get_plane_type(plane);
365 const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
366 const int16_t *scan, *nb;
367 const scan_order *so;
368 const int ref = is_inter_block(mi);
369 unsigned int(*const counts)[COEFF_CONTEXTS][ENTROPY_TOKENS] =
370 td->rd_counts.coef_counts[tx_size][type][ref];
371 vpx_prob(*const coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
372 cpi->common.fc->coef_probs[tx_size][type][ref];
373 unsigned int(*const eob_branch)[COEFF_CONTEXTS] =
374 td->counts->eob_branch[tx_size][type][ref];
375 const uint8_t *const band = get_band_translate(tx_size);
376 const int tx_eob = 16 << (tx_size << 1);
377 int16_t token;
378 EXTRABIT extra;
379 pt = get_entropy_context(tx_size, pd->above_context + col,
380 pd->left_context + row);
381 so = get_scan(xd, tx_size, type, block);
382 scan = so->scan;
383 nb = so->neighbors;
384 c = 0;
385
386 while (c < eob) {
387 int v = 0;
388 v = qcoeff[scan[c]];
389 ++eob_branch[band[c]][pt];
390
391 while (!v) {
392 add_token_no_extra(&t, coef_probs[band[c]][pt], ZERO_TOKEN,
393 counts[band[c]][pt]);
394
395 token_cache[scan[c]] = 0;
396 ++c;
397 pt = get_coef_context(nb, token_cache, c);
398 v = qcoeff[scan[c]];
399 }
400
401 vp9_get_token_extra(v, &token, &extra);
402
403 add_token(&t, coef_probs[band[c]][pt], token, extra, counts[band[c]][pt]);
404
405 token_cache[scan[c]] = vp9_pt_energy_class[token];
406 ++c;
407 pt = get_coef_context(nb, token_cache, c);
408 }
409 if (c < tx_eob) {
410 ++eob_branch[band[c]][pt];
411 add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN,
412 counts[band[c]][pt]);
413 }
414
415 *tp = t;
416
417 vp9_set_contexts(xd, pd, plane_bsize, tx_size, c > 0, col, row);
418 }
419
420 struct is_skippable_args {
421 uint16_t *eobs;
422 int *skippable;
423 };
424
is_skippable(int plane,int block,int row,int col,BLOCK_SIZE plane_bsize,TX_SIZE tx_size,void * argv)425 static void is_skippable(int plane, int block, int row, int col,
426 BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *argv) {
427 struct is_skippable_args *args = argv;
428 (void)plane;
429 (void)plane_bsize;
430 (void)tx_size;
431 (void)row;
432 (void)col;
433 args->skippable[0] &= (!args->eobs[block]);
434 }
435
436 // TODO(yaowu): rewrite and optimize this function to remove the usage of
437 // vp9_foreach_transform_block() and simplify is_skippable().
vp9_is_skippable_in_plane(MACROBLOCK * x,BLOCK_SIZE bsize,int plane)438 int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
439 int result = 1;
440 struct is_skippable_args args = { x->plane[plane].eobs, &result };
441 vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable,
442 &args);
443 return result;
444 }
445
has_high_freq_coeff(int plane,int block,int row,int col,BLOCK_SIZE plane_bsize,TX_SIZE tx_size,void * argv)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 void *argv) {
449 struct is_skippable_args *args = argv;
450 int eobs = (tx_size == TX_4X4) ? 3 : 10;
451 (void)plane;
452 (void)plane_bsize;
453 (void)row;
454 (void)col;
455 *(args->skippable) |= (args->eobs[block] > eobs);
456 }
457
vp9_has_high_freq_in_plane(MACROBLOCK * x,BLOCK_SIZE bsize,int plane)458 int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
459 int result = 0;
460 struct is_skippable_args args = { x->plane[plane].eobs, &result };
461 vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane,
462 has_high_freq_coeff, &args);
463 return result;
464 }
465
vp9_tokenize_sb(VP9_COMP * cpi,ThreadData * td,TOKENEXTRA ** t,int dry_run,int seg_skip,BLOCK_SIZE bsize)466 void vp9_tokenize_sb(VP9_COMP *cpi, ThreadData *td, TOKENEXTRA **t, int dry_run,
467 int seg_skip, BLOCK_SIZE bsize) {
468 MACROBLOCK *const x = &td->mb;
469 MACROBLOCKD *const xd = &x->e_mbd;
470 MODE_INFO *const mi = xd->mi[0];
471 const int ctx = vp9_get_skip_context(xd);
472 struct tokenize_b_args arg = { cpi, td, t };
473
474 if (seg_skip) {
475 assert(mi->skip);
476 }
477
478 if (mi->skip) {
479 if (!dry_run && !seg_skip) ++td->counts->skip[ctx][1];
480 reset_skip_context(xd, bsize);
481 return;
482 }
483
484 if (!dry_run) {
485 ++td->counts->skip[ctx][0];
486 vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg);
487 } else {
488 vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg);
489 }
490 }
491