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