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
26static 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};
47const 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]
56static 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};
69const 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 */
75const 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
90static const int16_t zero_cost[] = { 0 };
91static const int16_t sign_cost[1] = { 512 };
92static const int16_t cat1_cost[1 << 1] = { 864, 1229 };
93static const int16_t cat2_cost[1 << 2] = { 1256, 1453, 1696, 1893 };
94static const int16_t cat3_cost[1 << 3] = { 1652, 1791, 1884, 2023,
95                                           2195, 2334, 2427, 2566 };
96static 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 };
99static 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};
104const 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};
126const 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
136const 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};
162const 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
260const 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
276const 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};
290const 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
306const 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
311struct tokenize_b_args {
312  VP9_COMP *cpi;
313  ThreadData *td;
314  TOKENEXTRA **tp;
315};
316
317static 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
329static 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
339static 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
348static 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
420struct is_skippable_args {
421  uint16_t *eobs;
422  int *skippable;
423};
424
425static 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().
438int 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
446static 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
458int 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
466void 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