]> granicus.if.org Git - libvpx/blob - vp10/encoder/tokenize.c
Remove palette from VP10
[libvpx] / vp10 / encoder / tokenize.c
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 "vp10/common/entropy.h"
19 #include "vp10/common/pred_common.h"
20 #include "vp10/common/scan.h"
21 #include "vp10/common/seg_common.h"
22
23 #include "vp10/encoder/cost.h"
24 #include "vp10/encoder/encoder.h"
25 #include "vp10/encoder/tokenize.h"
26
27 static const TOKENVALUE dct_cat_lt_10_value_tokens[] = {
28   {9, 63}, {9, 61}, {9, 59}, {9, 57}, {9, 55}, {9, 53}, {9, 51}, {9, 49},
29   {9, 47}, {9, 45}, {9, 43}, {9, 41}, {9, 39}, {9, 37}, {9, 35}, {9, 33},
30   {9, 31}, {9, 29}, {9, 27}, {9, 25}, {9, 23}, {9, 21}, {9, 19}, {9, 17},
31   {9, 15}, {9, 13}, {9, 11}, {9, 9}, {9, 7}, {9, 5}, {9, 3}, {9, 1},
32   {8, 31}, {8, 29}, {8, 27}, {8, 25}, {8, 23}, {8, 21},
33   {8, 19}, {8, 17}, {8, 15}, {8, 13}, {8, 11}, {8, 9},
34   {8, 7}, {8, 5}, {8, 3}, {8, 1},
35   {7, 15}, {7, 13}, {7, 11}, {7, 9}, {7, 7}, {7, 5}, {7, 3}, {7, 1},
36   {6, 7}, {6, 5}, {6, 3}, {6, 1}, {5, 3}, {5, 1},
37   {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 0},
38   {1, 0},  {2, 0}, {3, 0}, {4, 0},
39   {5, 0}, {5, 2}, {6, 0}, {6, 2}, {6, 4}, {6, 6},
40   {7, 0}, {7, 2}, {7, 4}, {7, 6}, {7, 8}, {7, 10}, {7, 12}, {7, 14},
41   {8, 0}, {8, 2}, {8, 4}, {8, 6}, {8, 8}, {8, 10}, {8, 12},
42   {8, 14}, {8, 16}, {8, 18}, {8, 20}, {8, 22}, {8, 24},
43   {8, 26}, {8, 28}, {8, 30}, {9, 0}, {9, 2},
44   {9, 4}, {9, 6}, {9, 8}, {9, 10}, {9, 12}, {9, 14}, {9, 16},
45   {9, 18}, {9, 20}, {9, 22}, {9, 24}, {9, 26}, {9, 28},
46   {9, 30}, {9, 32}, {9, 34}, {9, 36}, {9, 38}, {9, 40},
47   {9, 42}, {9, 44}, {9, 46}, {9, 48}, {9, 50}, {9, 52},
48   {9, 54}, {9, 56}, {9, 58}, {9, 60}, {9, 62}
49 };
50 const TOKENVALUE *vp10_dct_cat_lt_10_value_tokens = dct_cat_lt_10_value_tokens +
51     (sizeof(dct_cat_lt_10_value_tokens) / sizeof(*dct_cat_lt_10_value_tokens))
52     / 2;
53
54 // Array indices are identical to previously-existing CONTEXT_NODE indices
55 const vpx_tree_index vp10_coef_tree[TREE_SIZE(ENTROPY_TOKENS)] = {
56   -EOB_TOKEN, 2,                       // 0  = EOB
57   -ZERO_TOKEN, 4,                      // 1  = ZERO
58   -ONE_TOKEN, 6,                       // 2  = ONE
59   8, 12,                               // 3  = LOW_VAL
60   -TWO_TOKEN, 10,                      // 4  = TWO
61   -THREE_TOKEN, -FOUR_TOKEN,           // 5  = THREE
62   14, 16,                              // 6  = HIGH_LOW
63   -CATEGORY1_TOKEN, -CATEGORY2_TOKEN,  // 7  = CAT_ONE
64   18, 20,                              // 8  = CAT_THREEFOUR
65   -CATEGORY3_TOKEN, -CATEGORY4_TOKEN,  // 9  = CAT_THREE
66   -CATEGORY5_TOKEN, -CATEGORY6_TOKEN   // 10 = CAT_FIVE
67 };
68
69 static const vpx_tree_index cat1[2] = {0, 0};
70 static const vpx_tree_index cat2[4] = {2, 2, 0, 0};
71 static const vpx_tree_index cat3[6] = {2, 2, 4, 4, 0, 0};
72 static const vpx_tree_index cat4[8] = {2, 2, 4, 4, 6, 6, 0, 0};
73 static const vpx_tree_index cat5[10] = {2, 2, 4, 4, 6, 6, 8, 8, 0, 0};
74 static const vpx_tree_index cat6[28] = {2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12,
75     14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 0, 0};
76
77 static const int16_t zero_cost[] = {0};
78 static const int16_t one_cost[] = {255, 257};
79 static const int16_t two_cost[] = {255, 257};
80 static const int16_t three_cost[] = {255, 257};
81 static const int16_t four_cost[] = {255, 257};
82 static const int16_t cat1_cost[] = {429, 431, 616, 618};
83 static const int16_t cat2_cost[] = {624, 626, 727, 729, 848, 850, 951, 953};
84 static const int16_t cat3_cost[] = {
85   820, 822, 893, 895, 940, 942, 1013, 1015, 1096, 1098, 1169, 1171, 1216, 1218,
86   1289, 1291
87 };
88 static const int16_t cat4_cost[] = {
89   1032, 1034, 1075, 1077, 1105, 1107, 1148, 1150, 1194, 1196, 1237, 1239,
90   1267, 1269, 1310, 1312, 1328, 1330, 1371, 1373, 1401, 1403, 1444, 1446,
91   1490, 1492, 1533, 1535, 1563, 1565, 1606, 1608
92 };
93 static const int16_t cat5_cost[] = {
94   1269, 1271, 1283, 1285, 1306, 1308, 1320,
95   1322, 1347, 1349, 1361, 1363, 1384, 1386, 1398, 1400, 1443, 1445, 1457,
96   1459, 1480, 1482, 1494, 1496, 1521, 1523, 1535, 1537, 1558, 1560, 1572,
97   1574, 1592, 1594, 1606, 1608, 1629, 1631, 1643, 1645, 1670, 1672, 1684,
98   1686, 1707, 1709, 1721, 1723, 1766, 1768, 1780, 1782, 1803, 1805, 1817,
99   1819, 1844, 1846, 1858, 1860, 1881, 1883, 1895, 1897
100 };
101 const int16_t vp10_cat6_low_cost[256] = {
102   1638, 1640, 1646, 1648, 1652, 1654, 1660, 1662,
103   1670, 1672, 1678, 1680, 1684, 1686, 1692, 1694, 1711, 1713, 1719, 1721,
104   1725, 1727, 1733, 1735, 1743, 1745, 1751, 1753, 1757, 1759, 1765, 1767,
105   1787, 1789, 1795, 1797, 1801, 1803, 1809, 1811, 1819, 1821, 1827, 1829,
106   1833, 1835, 1841, 1843, 1860, 1862, 1868, 1870, 1874, 1876, 1882, 1884,
107   1892, 1894, 1900, 1902, 1906, 1908, 1914, 1916, 1940, 1942, 1948, 1950,
108   1954, 1956, 1962, 1964, 1972, 1974, 1980, 1982, 1986, 1988, 1994, 1996,
109   2013, 2015, 2021, 2023, 2027, 2029, 2035, 2037, 2045, 2047, 2053, 2055,
110   2059, 2061, 2067, 2069, 2089, 2091, 2097, 2099, 2103, 2105, 2111, 2113,
111   2121, 2123, 2129, 2131, 2135, 2137, 2143, 2145, 2162, 2164, 2170, 2172,
112   2176, 2178, 2184, 2186, 2194, 2196, 2202, 2204, 2208, 2210, 2216, 2218,
113   2082, 2084, 2090, 2092, 2096, 2098, 2104, 2106, 2114, 2116, 2122, 2124,
114   2128, 2130, 2136, 2138, 2155, 2157, 2163, 2165, 2169, 2171, 2177, 2179,
115   2187, 2189, 2195, 2197, 2201, 2203, 2209, 2211, 2231, 2233, 2239, 2241,
116   2245, 2247, 2253, 2255, 2263, 2265, 2271, 2273, 2277, 2279, 2285, 2287,
117   2304, 2306, 2312, 2314, 2318, 2320, 2326, 2328, 2336, 2338, 2344, 2346,
118   2350, 2352, 2358, 2360, 2384, 2386, 2392, 2394, 2398, 2400, 2406, 2408,
119   2416, 2418, 2424, 2426, 2430, 2432, 2438, 2440, 2457, 2459, 2465, 2467,
120   2471, 2473, 2479, 2481, 2489, 2491, 2497, 2499, 2503, 2505, 2511, 2513,
121   2533, 2535, 2541, 2543, 2547, 2549, 2555, 2557, 2565, 2567, 2573, 2575,
122   2579, 2581, 2587, 2589, 2606, 2608, 2614, 2616, 2620, 2622, 2628, 2630,
123   2638, 2640, 2646, 2648, 2652, 2654, 2660, 2662
124 };
125 const int16_t vp10_cat6_high_cost[128] = {
126   72, 892, 1183, 2003, 1448, 2268, 2559, 3379,
127   1709, 2529, 2820, 3640, 3085, 3905, 4196, 5016, 2118, 2938, 3229, 4049,
128   3494, 4314, 4605, 5425, 3755, 4575, 4866, 5686, 5131, 5951, 6242, 7062,
129   2118, 2938, 3229, 4049, 3494, 4314, 4605, 5425, 3755, 4575, 4866, 5686,
130   5131, 5951, 6242, 7062, 4164, 4984, 5275, 6095, 5540, 6360, 6651, 7471,
131   5801, 6621, 6912, 7732, 7177, 7997, 8288, 9108, 2118, 2938, 3229, 4049,
132   3494, 4314, 4605, 5425, 3755, 4575, 4866, 5686, 5131, 5951, 6242, 7062,
133   4164, 4984, 5275, 6095, 5540, 6360, 6651, 7471, 5801, 6621, 6912, 7732,
134   7177, 7997, 8288, 9108, 4164, 4984, 5275, 6095, 5540, 6360, 6651, 7471,
135   5801, 6621, 6912, 7732, 7177, 7997, 8288, 9108, 6210, 7030, 7321, 8141,
136   7586, 8406, 8697, 9517, 7847, 8667, 8958, 9778, 9223, 10043, 10334, 11154
137 };
138
139 #if CONFIG_VP9_HIGHBITDEPTH
140 const int16_t vp10_cat6_high10_high_cost[512] = {
141   74, 894, 1185, 2005, 1450, 2270, 2561,
142   3381, 1711, 2531, 2822, 3642, 3087, 3907, 4198, 5018, 2120, 2940, 3231,
143   4051, 3496, 4316, 4607, 5427, 3757, 4577, 4868, 5688, 5133, 5953, 6244,
144   7064, 2120, 2940, 3231, 4051, 3496, 4316, 4607, 5427, 3757, 4577, 4868,
145   5688, 5133, 5953, 6244, 7064, 4166, 4986, 5277, 6097, 5542, 6362, 6653,
146   7473, 5803, 6623, 6914, 7734, 7179, 7999, 8290, 9110, 2120, 2940, 3231,
147   4051, 3496, 4316, 4607, 5427, 3757, 4577, 4868, 5688, 5133, 5953, 6244,
148   7064, 4166, 4986, 5277, 6097, 5542, 6362, 6653, 7473, 5803, 6623, 6914,
149   7734, 7179, 7999, 8290, 9110, 4166, 4986, 5277, 6097, 5542, 6362, 6653,
150   7473, 5803, 6623, 6914, 7734, 7179, 7999, 8290, 9110, 6212, 7032, 7323,
151   8143, 7588, 8408, 8699, 9519, 7849, 8669, 8960, 9780, 9225, 10045, 10336,
152   11156, 2120, 2940, 3231, 4051, 3496, 4316, 4607, 5427, 3757, 4577, 4868,
153   5688, 5133, 5953, 6244, 7064, 4166, 4986, 5277, 6097, 5542, 6362, 6653,
154   7473, 5803, 6623, 6914, 7734, 7179, 7999, 8290, 9110, 4166, 4986, 5277,
155   6097, 5542, 6362, 6653, 7473, 5803, 6623, 6914, 7734, 7179, 7999, 8290,
156   9110, 6212, 7032, 7323, 8143, 7588, 8408, 8699, 9519, 7849, 8669, 8960,
157   9780, 9225, 10045, 10336, 11156, 4166, 4986, 5277, 6097, 5542, 6362, 6653,
158   7473, 5803, 6623, 6914, 7734, 7179, 7999, 8290, 9110, 6212, 7032, 7323,
159   8143, 7588, 8408, 8699, 9519, 7849, 8669, 8960, 9780, 9225, 10045, 10336,
160   11156, 6212, 7032, 7323, 8143, 7588, 8408, 8699, 9519, 7849, 8669, 8960,
161   9780, 9225, 10045, 10336, 11156, 8258, 9078, 9369, 10189, 9634, 10454,
162   10745, 11565, 9895, 10715, 11006, 11826, 11271, 12091, 12382, 13202, 2120,
163   2940, 3231, 4051, 3496, 4316, 4607, 5427, 3757, 4577, 4868, 5688, 5133,
164   5953, 6244, 7064, 4166, 4986, 5277, 6097, 5542, 6362, 6653, 7473, 5803,
165   6623, 6914, 7734, 7179, 7999, 8290, 9110, 4166, 4986, 5277, 6097, 5542,
166   6362, 6653, 7473, 5803, 6623, 6914, 7734, 7179, 7999, 8290, 9110, 6212,
167   7032, 7323, 8143, 7588, 8408, 8699, 9519, 7849, 8669, 8960, 9780, 9225,
168   10045, 10336, 11156, 4166, 4986, 5277, 6097, 5542, 6362, 6653, 7473, 5803,
169   6623, 6914, 7734, 7179, 7999, 8290, 9110, 6212, 7032, 7323, 8143, 7588,
170   8408, 8699, 9519, 7849, 8669, 8960, 9780, 9225, 10045, 10336, 11156, 6212,
171   7032, 7323, 8143, 7588, 8408, 8699, 9519, 7849, 8669, 8960, 9780, 9225,
172   10045, 10336, 11156, 8258, 9078, 9369, 10189, 9634, 10454, 10745, 11565,
173   9895, 10715, 11006, 11826, 11271, 12091, 12382, 13202, 4166, 4986, 5277,
174   6097, 5542, 6362, 6653, 7473, 5803, 6623, 6914, 7734, 7179, 7999, 8290,
175   9110, 6212, 7032, 7323, 8143, 7588, 8408, 8699, 9519, 7849, 8669, 8960,
176   9780, 9225, 10045, 10336, 11156, 6212, 7032, 7323, 8143, 7588, 8408, 8699,
177   9519, 7849, 8669, 8960, 9780, 9225, 10045, 10336, 11156, 8258, 9078, 9369,
178   10189, 9634, 10454, 10745, 11565, 9895, 10715, 11006, 11826, 11271, 12091,
179   12382, 13202, 6212, 7032, 7323, 8143, 7588, 8408, 8699, 9519, 7849, 8669,
180   8960, 9780, 9225, 10045, 10336, 11156, 8258, 9078, 9369, 10189, 9634, 10454,
181   10745, 11565, 9895, 10715, 11006, 11826, 11271, 12091, 12382, 13202, 8258,
182   9078, 9369, 10189, 9634, 10454, 10745, 11565, 9895, 10715, 11006, 11826,
183   11271, 12091, 12382, 13202, 10304, 11124, 11415, 12235, 11680, 12500, 12791,
184   13611, 11941, 12761, 13052, 13872, 13317, 14137, 14428, 15248,
185 };
186 const int16_t vp10_cat6_high12_high_cost[2048] = {
187   76, 896, 1187, 2007, 1452, 2272, 2563,
188   3383, 1713, 2533, 2824, 3644, 3089, 3909, 4200, 5020, 2122, 2942, 3233,
189   4053, 3498, 4318, 4609, 5429, 3759, 4579, 4870, 5690, 5135, 5955, 6246,
190   7066, 2122, 2942, 3233, 4053, 3498, 4318, 4609, 5429, 3759, 4579, 4870,
191   5690, 5135, 5955, 6246, 7066, 4168, 4988, 5279, 6099, 5544, 6364, 6655,
192   7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292, 9112, 2122, 2942, 3233,
193   4053, 3498, 4318, 4609, 5429, 3759, 4579, 4870, 5690, 5135, 5955, 6246,
194   7066, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475, 5805, 6625, 6916,
195   7736, 7181, 8001, 8292, 9112, 4168, 4988, 5279, 6099, 5544, 6364, 6655,
196   7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292, 9112, 6214, 7034, 7325,
197   8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338,
198   11158, 2122, 2942, 3233, 4053, 3498, 4318, 4609, 5429, 3759, 4579, 4870,
199   5690, 5135, 5955, 6246, 7066, 4168, 4988, 5279, 6099, 5544, 6364, 6655,
200   7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292, 9112, 4168, 4988, 5279,
201   6099, 5544, 6364, 6655, 7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292,
202   9112, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962,
203   9782, 9227, 10047, 10338, 11158, 4168, 4988, 5279, 6099, 5544, 6364, 6655,
204   7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292, 9112, 6214, 7034, 7325,
205   8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338,
206   11158, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962,
207   9782, 9227, 10047, 10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456,
208   10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 2122,
209   2942, 3233, 4053, 3498, 4318, 4609, 5429, 3759, 4579, 4870, 5690, 5135,
210   5955, 6246, 7066, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475, 5805,
211   6625, 6916, 7736, 7181, 8001, 8292, 9112, 4168, 4988, 5279, 6099, 5544,
212   6364, 6655, 7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292, 9112, 6214,
213   7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227,
214   10047, 10338, 11158, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475, 5805,
215   6625, 6916, 7736, 7181, 8001, 8292, 9112, 6214, 7034, 7325, 8145, 7590,
216   8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 6214,
217   7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227,
218   10047, 10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567,
219   9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 4168, 4988, 5279,
220   6099, 5544, 6364, 6655, 7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292,
221   9112, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962,
222   9782, 9227, 10047, 10338, 11158, 6214, 7034, 7325, 8145, 7590, 8410, 8701,
223   9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 8260, 9080, 9371,
224   10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093,
225   12384, 13204, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671,
226   8962, 9782, 9227, 10047, 10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456,
227   10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 8260,
228   9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828,
229   11273, 12093, 12384, 13204, 10306, 11126, 11417, 12237, 11682, 12502, 12793,
230   13613, 11943, 12763, 13054, 13874, 13319, 14139, 14430, 15250, 2122, 2942,
231   3233, 4053, 3498, 4318, 4609, 5429, 3759, 4579, 4870, 5690, 5135, 5955,
232   6246, 7066, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475, 5805, 6625,
233   6916, 7736, 7181, 8001, 8292, 9112, 4168, 4988, 5279, 6099, 5544, 6364,
234   6655, 7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292, 9112, 6214, 7034,
235   7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047,
236   10338, 11158, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475, 5805, 6625,
237   6916, 7736, 7181, 8001, 8292, 9112, 6214, 7034, 7325, 8145, 7590, 8410,
238   8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 6214, 7034,
239   7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047,
240   10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897,
241   10717, 11008, 11828, 11273, 12093, 12384, 13204, 4168, 4988, 5279, 6099,
242   5544, 6364, 6655, 7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292, 9112,
243   6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782,
244   9227, 10047, 10338, 11158, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521,
245   7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 8260, 9080, 9371, 10191,
246   9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384,
247   13204, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962,
248   9782, 9227, 10047, 10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456,
249   10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 8260,
250   9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828,
251   11273, 12093, 12384, 13204, 10306, 11126, 11417, 12237, 11682, 12502, 12793,
252   13613, 11943, 12763, 13054, 13874, 13319, 14139, 14430, 15250, 4168, 4988,
253   5279, 6099, 5544, 6364, 6655, 7475, 5805, 6625, 6916, 7736, 7181, 8001,
254   8292, 9112, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671,
255   8962, 9782, 9227, 10047, 10338, 11158, 6214, 7034, 7325, 8145, 7590, 8410,
256   8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 8260, 9080,
257   9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273,
258   12093, 12384, 13204, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851,
259   8671, 8962, 9782, 9227, 10047, 10338, 11158, 8260, 9080, 9371, 10191, 9636,
260   10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204,
261   8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008,
262   11828, 11273, 12093, 12384, 13204, 10306, 11126, 11417, 12237, 11682, 12502,
263   12793, 13613, 11943, 12763, 13054, 13874, 13319, 14139, 14430, 15250, 6214,
264   7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227,
265   10047, 10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567,
266   9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 8260, 9080, 9371,
267   10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093,
268   12384, 13204, 10306, 11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943,
269   12763, 13054, 13874, 13319, 14139, 14430, 15250, 8260, 9080, 9371, 10191,
270   9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384,
271   13204, 10306, 11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763,
272   13054, 13874, 13319, 14139, 14430, 15250, 10306, 11126, 11417, 12237, 11682,
273   12502, 12793, 13613, 11943, 12763, 13054, 13874, 13319, 14139, 14430, 15250,
274   12352, 13172, 13463, 14283, 13728, 14548, 14839, 15659, 13989, 14809, 15100,
275   15920, 15365, 16185, 16476, 17296, 2122, 2942, 3233, 4053, 3498, 4318, 4609,
276   5429, 3759, 4579, 4870, 5690, 5135, 5955, 6246, 7066, 4168, 4988, 5279,
277   6099, 5544, 6364, 6655, 7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292,
278   9112, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475, 5805, 6625, 6916,
279   7736, 7181, 8001, 8292, 9112, 6214, 7034, 7325, 8145, 7590, 8410, 8701,
280   9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 4168, 4988, 5279,
281   6099, 5544, 6364, 6655, 7475, 5805, 6625, 6916, 7736, 7181, 8001, 8292,
282   9112, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962,
283   9782, 9227, 10047, 10338, 11158, 6214, 7034, 7325, 8145, 7590, 8410, 8701,
284   9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 8260, 9080, 9371,
285   10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093,
286   12384, 13204, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475, 5805, 6625,
287   6916, 7736, 7181, 8001, 8292, 9112, 6214, 7034, 7325, 8145, 7590, 8410,
288   8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 6214, 7034,
289   7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047,
290   10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897,
291   10717, 11008, 11828, 11273, 12093, 12384, 13204, 6214, 7034, 7325, 8145,
292   7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158,
293   8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008,
294   11828, 11273, 12093, 12384, 13204, 8260, 9080, 9371, 10191, 9636, 10456,
295   10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 10306,
296   11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763, 13054, 13874,
297   13319, 14139, 14430, 15250, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475,
298   5805, 6625, 6916, 7736, 7181, 8001, 8292, 9112, 6214, 7034, 7325, 8145,
299   7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158,
300   6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782,
301   9227, 10047, 10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456, 10747,
302   11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 6214, 7034,
303   7325, 8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047,
304   10338, 11158, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897,
305   10717, 11008, 11828, 11273, 12093, 12384, 13204, 8260, 9080, 9371, 10191,
306   9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384,
307   13204, 10306, 11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763,
308   13054, 13874, 13319, 14139, 14430, 15250, 6214, 7034, 7325, 8145, 7590,
309   8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 8260,
310   9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828,
311   11273, 12093, 12384, 13204, 8260, 9080, 9371, 10191, 9636, 10456, 10747,
312   11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 10306, 11126,
313   11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763, 13054, 13874, 13319,
314   14139, 14430, 15250, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567,
315   9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 10306, 11126, 11417,
316   12237, 11682, 12502, 12793, 13613, 11943, 12763, 13054, 13874, 13319, 14139,
317   14430, 15250, 10306, 11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943,
318   12763, 13054, 13874, 13319, 14139, 14430, 15250, 12352, 13172, 13463, 14283,
319   13728, 14548, 14839, 15659, 13989, 14809, 15100, 15920, 15365, 16185, 16476,
320   17296, 4168, 4988, 5279, 6099, 5544, 6364, 6655, 7475, 5805, 6625, 6916,
321   7736, 7181, 8001, 8292, 9112, 6214, 7034, 7325, 8145, 7590, 8410, 8701,
322   9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 6214, 7034, 7325,
323   8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338,
324   11158, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717,
325   11008, 11828, 11273, 12093, 12384, 13204, 6214, 7034, 7325, 8145, 7590,
326   8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338, 11158, 8260,
327   9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828,
328   11273, 12093, 12384, 13204, 8260, 9080, 9371, 10191, 9636, 10456, 10747,
329   11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 10306, 11126,
330   11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763, 13054, 13874, 13319,
331   14139, 14430, 15250, 6214, 7034, 7325, 8145, 7590, 8410, 8701, 9521, 7851,
332   8671, 8962, 9782, 9227, 10047, 10338, 11158, 8260, 9080, 9371, 10191, 9636,
333   10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204,
334   8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008,
335   11828, 11273, 12093, 12384, 13204, 10306, 11126, 11417, 12237, 11682, 12502,
336   12793, 13613, 11943, 12763, 13054, 13874, 13319, 14139, 14430, 15250, 8260,
337   9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717, 11008, 11828,
338   11273, 12093, 12384, 13204, 10306, 11126, 11417, 12237, 11682, 12502, 12793,
339   13613, 11943, 12763, 13054, 13874, 13319, 14139, 14430, 15250, 10306, 11126,
340   11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763, 13054, 13874, 13319,
341   14139, 14430, 15250, 12352, 13172, 13463, 14283, 13728, 14548, 14839, 15659,
342   13989, 14809, 15100, 15920, 15365, 16185, 16476, 17296, 6214, 7034, 7325,
343   8145, 7590, 8410, 8701, 9521, 7851, 8671, 8962, 9782, 9227, 10047, 10338,
344   11158, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567, 9897, 10717,
345   11008, 11828, 11273, 12093, 12384, 13204, 8260, 9080, 9371, 10191, 9636,
346   10456, 10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204,
347   10306, 11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763, 13054,
348   13874, 13319, 14139, 14430, 15250, 8260, 9080, 9371, 10191, 9636, 10456,
349   10747, 11567, 9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 10306,
350   11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763, 13054, 13874,
351   13319, 14139, 14430, 15250, 10306, 11126, 11417, 12237, 11682, 12502, 12793,
352   13613, 11943, 12763, 13054, 13874, 13319, 14139, 14430, 15250, 12352, 13172,
353   13463, 14283, 13728, 14548, 14839, 15659, 13989, 14809, 15100, 15920, 15365,
354   16185, 16476, 17296, 8260, 9080, 9371, 10191, 9636, 10456, 10747, 11567,
355   9897, 10717, 11008, 11828, 11273, 12093, 12384, 13204, 10306, 11126, 11417,
356   12237, 11682, 12502, 12793, 13613, 11943, 12763, 13054, 13874, 13319, 14139,
357   14430, 15250, 10306, 11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943,
358   12763, 13054, 13874, 13319, 14139, 14430, 15250, 12352, 13172, 13463, 14283,
359   13728, 14548, 14839, 15659, 13989, 14809, 15100, 15920, 15365, 16185, 16476,
360   17296, 10306, 11126, 11417, 12237, 11682, 12502, 12793, 13613, 11943, 12763,
361   13054, 13874, 13319, 14139, 14430, 15250, 12352, 13172, 13463, 14283, 13728,
362   14548, 14839, 15659, 13989, 14809, 15100, 15920, 15365, 16185, 16476, 17296,
363   12352, 13172, 13463, 14283, 13728, 14548, 14839, 15659, 13989, 14809, 15100,
364   15920, 15365, 16185, 16476, 17296, 14398, 15218, 15509, 16329, 15774, 16594,
365   16885, 17705, 16035, 16855, 17146, 17966, 17411, 18231, 18522, 19342
366 };
367 #endif
368
369 #if CONFIG_VP9_HIGHBITDEPTH
370 static const vpx_tree_index cat1_high10[2] = {0, 0};
371 static const vpx_tree_index cat2_high10[4] = {2, 2, 0, 0};
372 static const vpx_tree_index cat3_high10[6] = {2, 2, 4, 4, 0, 0};
373 static const vpx_tree_index cat4_high10[8] = {2, 2, 4, 4, 6, 6, 0, 0};
374 static const vpx_tree_index cat5_high10[10] = {2, 2, 4, 4, 6, 6, 8, 8, 0, 0};
375 static const vpx_tree_index cat6_high10[32] = {2, 2, 4, 4, 6, 6, 8, 8, 10, 10,
376   12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28,
377   30, 30, 0, 0};
378 static const vpx_tree_index cat1_high12[2] = {0, 0};
379 static const vpx_tree_index cat2_high12[4] = {2, 2, 0, 0};
380 static const vpx_tree_index cat3_high12[6] = {2, 2, 4, 4, 0, 0};
381 static const vpx_tree_index cat4_high12[8] = {2, 2, 4, 4, 6, 6, 0, 0};
382 static const vpx_tree_index cat5_high12[10] = {2, 2, 4, 4, 6, 6, 8, 8, 0, 0};
383 static const vpx_tree_index cat6_high12[36] = {2, 2, 4, 4, 6, 6, 8, 8, 10, 10,
384   12, 12, 14, 14, 16, 16, 18, 18, 20, 20, 22, 22, 24, 24, 26, 26, 28, 28,
385   30, 30, 32, 32, 34, 34, 0, 0};
386 #endif
387
388 const vp10_extra_bit vp10_extra_bits[ENTROPY_TOKENS] = {
389   {0, 0, 0, 0, zero_cost},                             // ZERO_TOKEN
390   {0, 0, 0, 1, one_cost},                              // ONE_TOKEN
391   {0, 0, 0, 2, two_cost},                              // TWO_TOKEN
392   {0, 0, 0, 3, three_cost},                            // THREE_TOKEN
393   {0, 0, 0, 4, four_cost},                             // FOUR_TOKEN
394   {cat1, vp10_cat1_prob, 1,  CAT1_MIN_VAL, cat1_cost},  // CATEGORY1_TOKEN
395   {cat2, vp10_cat2_prob, 2,  CAT2_MIN_VAL, cat2_cost},  // CATEGORY2_TOKEN
396   {cat3, vp10_cat3_prob, 3,  CAT3_MIN_VAL, cat3_cost},  // CATEGORY3_TOKEN
397   {cat4, vp10_cat4_prob, 4,  CAT4_MIN_VAL, cat4_cost},  // CATEGORY4_TOKEN
398   {cat5, vp10_cat5_prob, 5,  CAT5_MIN_VAL, cat5_cost},  // CATEGORY5_TOKEN
399   {cat6, vp10_cat6_prob, 14, CAT6_MIN_VAL, 0},          // CATEGORY6_TOKEN
400   {0, 0, 0, 0, zero_cost}                              // EOB_TOKEN
401 };
402
403 #if CONFIG_VP9_HIGHBITDEPTH
404 const vp10_extra_bit vp10_extra_bits_high10[ENTROPY_TOKENS] = {
405   {0, 0, 0, 0, zero_cost},                                           // ZERO
406   {0, 0, 0, 1, one_cost},                                            // ONE
407   {0, 0, 0, 2, two_cost},                                            // TWO
408   {0, 0, 0, 3, three_cost},                                          // THREE
409   {0, 0, 0, 4, four_cost},                                           // FOUR
410   {cat1_high10, vp10_cat1_prob_high10, 1,  CAT1_MIN_VAL, cat1_cost},  // CAT1
411   {cat2_high10, vp10_cat2_prob_high10, 2,  CAT2_MIN_VAL, cat2_cost},  // CAT2
412   {cat3_high10, vp10_cat3_prob_high10, 3,  CAT3_MIN_VAL, cat3_cost},  // CAT3
413   {cat4_high10, vp10_cat4_prob_high10, 4,  CAT4_MIN_VAL, cat4_cost},  // CAT4
414   {cat5_high10, vp10_cat5_prob_high10, 5,  CAT5_MIN_VAL, cat5_cost},  // CAT5
415   {cat6_high10, vp10_cat6_prob_high10, 16, CAT6_MIN_VAL, 0},          // CAT6
416   {0, 0, 0, 0, zero_cost}                                            // EOB
417 };
418 const vp10_extra_bit vp10_extra_bits_high12[ENTROPY_TOKENS] = {
419   {0, 0, 0, 0, zero_cost},                                           // ZERO
420   {0, 0, 0, 1, one_cost},                                            // ONE
421   {0, 0, 0, 2, two_cost},                                            // TWO
422   {0, 0, 0, 3, three_cost},                                          // THREE
423   {0, 0, 0, 4, four_cost},                                           // FOUR
424   {cat1_high12, vp10_cat1_prob_high12, 1,  CAT1_MIN_VAL, cat1_cost},  // CAT1
425   {cat2_high12, vp10_cat2_prob_high12, 2,  CAT2_MIN_VAL, cat2_cost},  // CAT2
426   {cat3_high12, vp10_cat3_prob_high12, 3,  CAT3_MIN_VAL, cat3_cost},  // CAT3
427   {cat4_high12, vp10_cat4_prob_high12, 4,  CAT4_MIN_VAL, cat4_cost},  // CAT4
428   {cat5_high12, vp10_cat5_prob_high12, 5,  CAT5_MIN_VAL, cat5_cost},  // CAT5
429   {cat6_high12, vp10_cat6_prob_high12, 18, CAT6_MIN_VAL, 0},          // CAT6
430   {0, 0, 0, 0, zero_cost}                                            // EOB
431 };
432 #endif
433
434 const struct vp10_token vp10_coef_encodings[ENTROPY_TOKENS] = {
435   {2, 2}, {6, 3}, {28, 5}, {58, 6}, {59, 6}, {60, 6}, {61, 6}, {124, 7},
436   {125, 7}, {126, 7}, {127, 7}, {0, 1}
437 };
438
439
440 struct tokenize_b_args {
441   VP10_COMP *cpi;
442   ThreadData *td;
443   TOKENEXTRA **tp;
444 };
445
446 static void set_entropy_context_b(int plane, int block,
447                                   int blk_row, int blk_col,
448                                   BLOCK_SIZE plane_bsize,
449                                   TX_SIZE tx_size, void *arg) {
450   struct tokenize_b_args* const args = arg;
451   ThreadData *const td = args->td;
452   MACROBLOCK *const x = &td->mb;
453   MACROBLOCKD *const xd = &x->e_mbd;
454   struct macroblock_plane *p = &x->plane[plane];
455   struct macroblockd_plane *pd = &xd->plane[plane];
456   vp10_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0,
457                     blk_col, blk_row);
458 }
459
460 static INLINE void add_token(TOKENEXTRA **t, const vpx_prob *context_tree,
461                              int32_t extra, uint8_t token,
462                              uint8_t skip_eob_node,
463                              unsigned int *counts) {
464   (*t)->token = token;
465   (*t)->extra = extra;
466   (*t)->context_tree = context_tree;
467   (*t)->skip_eob_node = skip_eob_node;
468   (*t)++;
469   ++counts[token];
470 }
471
472 static INLINE void add_token_no_extra(TOKENEXTRA **t,
473                                       const vpx_prob *context_tree,
474                                       uint8_t token,
475                                       uint8_t skip_eob_node,
476                                       unsigned int *counts) {
477   (*t)->token = token;
478   (*t)->context_tree = context_tree;
479   (*t)->skip_eob_node = skip_eob_node;
480   (*t)++;
481   ++counts[token];
482 }
483
484 static INLINE int get_tx_eob(const struct segmentation *seg, int segment_id,
485                              TX_SIZE tx_size) {
486   const int eob_max = 16 << (tx_size << 1);
487   return segfeature_active(seg, segment_id, SEG_LVL_SKIP) ? 0 : eob_max;
488 }
489
490 static void tokenize_b(int plane, int block, int blk_row, int blk_col,
491                        BLOCK_SIZE plane_bsize,
492                        TX_SIZE tx_size, void *arg) {
493   struct tokenize_b_args* const args = arg;
494   VP10_COMP *cpi = args->cpi;
495   ThreadData *const td = args->td;
496   MACROBLOCK *const x = &td->mb;
497   MACROBLOCKD *const xd = &x->e_mbd;
498   TOKENEXTRA **tp = args->tp;
499   uint8_t token_cache[32 * 32];
500   struct macroblock_plane *p = &x->plane[plane];
501   struct macroblockd_plane *pd = &xd->plane[plane];
502   MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
503   int pt; /* near block/prev token context index */
504   int c;
505   TOKENEXTRA *t = *tp;        /* store tokens starting here */
506   int eob = p->eobs[block];
507   const PLANE_TYPE type = pd->plane_type;
508   const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
509   const int segment_id = mbmi->segment_id;
510   const int16_t *scan, *nb;
511   const TX_TYPE tx_type = get_tx_type(type, xd, block);
512   const scan_order *const so = get_scan(tx_size, tx_type);
513   const int ref = is_inter_block(mbmi);
514   unsigned int (*const counts)[COEFF_CONTEXTS][ENTROPY_TOKENS] =
515       td->rd_counts.coef_counts[tx_size][type][ref];
516   vpx_prob (*const coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
517       cpi->common.fc->coef_probs[tx_size][type][ref];
518   unsigned int (*const eob_branch)[COEFF_CONTEXTS] =
519       td->counts->eob_branch[tx_size][type][ref];
520   const uint8_t *const band = get_band_translate(tx_size);
521   const int seg_eob = get_tx_eob(&cpi->common.seg, segment_id, tx_size);
522   int16_t token;
523   EXTRABIT extra;
524   pt = get_entropy_context(tx_size, pd->above_context + blk_col,
525                            pd->left_context + blk_row);
526   scan = so->scan;
527   nb = so->neighbors;
528   c = 0;
529
530   while (c < eob) {
531     int v = 0;
532     int skip_eob = 0;
533     v = qcoeff[scan[c]];
534
535     while (!v) {
536       add_token_no_extra(&t, coef_probs[band[c]][pt], ZERO_TOKEN, skip_eob,
537                          counts[band[c]][pt]);
538       eob_branch[band[c]][pt] += !skip_eob;
539
540       skip_eob = 1;
541       token_cache[scan[c]] = 0;
542       ++c;
543       pt = get_coef_context(nb, token_cache, c);
544       v = qcoeff[scan[c]];
545     }
546
547     vp10_get_token_extra(v, &token, &extra);
548
549     add_token(&t, coef_probs[band[c]][pt], extra, (uint8_t)token,
550               (uint8_t)skip_eob, counts[band[c]][pt]);
551     eob_branch[band[c]][pt] += !skip_eob;
552
553     token_cache[scan[c]] = vp10_pt_energy_class[token];
554     ++c;
555     pt = get_coef_context(nb, token_cache, c);
556   }
557   if (c < seg_eob) {
558     add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN, 0,
559                        counts[band[c]][pt]);
560     ++eob_branch[band[c]][pt];
561   }
562
563   *tp = t;
564
565   vp10_set_contexts(xd, pd, plane_bsize, tx_size, c > 0, blk_col, blk_row);
566 }
567
568 struct is_skippable_args {
569   uint16_t *eobs;
570   int *skippable;
571 };
572 static void is_skippable(int plane, int block, int blk_row, int blk_col,
573                          BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
574                          void *argv) {
575   struct is_skippable_args *args = argv;
576   (void)plane;
577   (void)plane_bsize;
578   (void)tx_size;
579   (void)blk_row;
580   (void)blk_col;
581   args->skippable[0] &= (!args->eobs[block]);
582 }
583
584 // TODO(yaowu): rewrite and optimize this function to remove the usage of
585 //              vp10_foreach_transform_block() and simplify is_skippable().
586 int vp10_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
587   int result = 1;
588   struct is_skippable_args args = {x->plane[plane].eobs, &result};
589   vp10_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable,
590                                          &args);
591   return result;
592 }
593
594 static void has_high_freq_coeff(int plane, int block, int blk_row, int blk_col,
595                                 BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
596                                 void *argv) {
597   struct is_skippable_args *args = argv;
598   int eobs = (tx_size == TX_4X4) ? 3 : 10;
599   (void) plane;
600   (void) plane_bsize;
601   (void) blk_row;
602   (void) blk_col;
603
604   *(args->skippable) |= (args->eobs[block] > eobs);
605 }
606
607 int vp10_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
608   int result = 0;
609   struct is_skippable_args args = {x->plane[plane].eobs, &result};
610   vp10_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane,
611                                          has_high_freq_coeff, &args);
612   return result;
613 }
614
615 void vp10_tokenize_sb(VP10_COMP *cpi, ThreadData *td, TOKENEXTRA **t,
616                      int dry_run, BLOCK_SIZE bsize) {
617   VP10_COMMON *const cm = &cpi->common;
618   MACROBLOCK *const x = &td->mb;
619   MACROBLOCKD *const xd = &x->e_mbd;
620   MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
621   const int ctx = vp10_get_skip_context(xd);
622   const int skip_inc = !segfeature_active(&cm->seg, mbmi->segment_id,
623                                           SEG_LVL_SKIP);
624   struct tokenize_b_args arg = {cpi, td, t};
625   if (mbmi->skip) {
626     if (!dry_run)
627       td->counts->skip[ctx][1] += skip_inc;
628     reset_skip_context(xd, bsize);
629     return;
630   }
631
632   if (!dry_run) {
633     int plane;
634
635     td->counts->skip[ctx][0] += skip_inc;
636
637     for (plane = 0; plane < MAX_MB_PLANE; ++plane) {
638       vp10_foreach_transformed_block_in_plane(xd, bsize, plane, tokenize_b,
639                                               &arg);
640       (*t)->token = EOSB_TOKEN;
641       (*t)++;
642     }
643   } else {
644     vp10_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg);
645   }
646 }