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