xref: /aosp_15_r20/external/libvpx/vp9/encoder/vp9_tokenize.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include <assert.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <math.h>
13*fb1b10abSAndroid Build Coastguard Worker #include <stdio.h>
14*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_pred_common.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_scan.h"
21*fb1b10abSAndroid Build Coastguard Worker 
22*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_cost.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_encoder.h"
24*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_tokenize.h"
25*fb1b10abSAndroid Build Coastguard Worker 
26*fb1b10abSAndroid Build Coastguard Worker static const TOKENVALUE dct_cat_lt_10_value_tokens[] = {
27*fb1b10abSAndroid Build Coastguard Worker   { 9, 63 }, { 9, 61 }, { 9, 59 }, { 9, 57 }, { 9, 55 }, { 9, 53 }, { 9, 51 },
28*fb1b10abSAndroid Build Coastguard Worker   { 9, 49 }, { 9, 47 }, { 9, 45 }, { 9, 43 }, { 9, 41 }, { 9, 39 }, { 9, 37 },
29*fb1b10abSAndroid Build Coastguard Worker   { 9, 35 }, { 9, 33 }, { 9, 31 }, { 9, 29 }, { 9, 27 }, { 9, 25 }, { 9, 23 },
30*fb1b10abSAndroid Build Coastguard Worker   { 9, 21 }, { 9, 19 }, { 9, 17 }, { 9, 15 }, { 9, 13 }, { 9, 11 }, { 9, 9 },
31*fb1b10abSAndroid Build Coastguard Worker   { 9, 7 },  { 9, 5 },  { 9, 3 },  { 9, 1 },  { 8, 31 }, { 8, 29 }, { 8, 27 },
32*fb1b10abSAndroid Build Coastguard Worker   { 8, 25 }, { 8, 23 }, { 8, 21 }, { 8, 19 }, { 8, 17 }, { 8, 15 }, { 8, 13 },
33*fb1b10abSAndroid Build Coastguard Worker   { 8, 11 }, { 8, 9 },  { 8, 7 },  { 8, 5 },  { 8, 3 },  { 8, 1 },  { 7, 15 },
34*fb1b10abSAndroid Build Coastguard Worker   { 7, 13 }, { 7, 11 }, { 7, 9 },  { 7, 7 },  { 7, 5 },  { 7, 3 },  { 7, 1 },
35*fb1b10abSAndroid Build Coastguard Worker   { 6, 7 },  { 6, 5 },  { 6, 3 },  { 6, 1 },  { 5, 3 },  { 5, 1 },  { 4, 1 },
36*fb1b10abSAndroid Build Coastguard Worker   { 3, 1 },  { 2, 1 },  { 1, 1 },  { 0, 0 },  { 1, 0 },  { 2, 0 },  { 3, 0 },
37*fb1b10abSAndroid Build Coastguard Worker   { 4, 0 },  { 5, 0 },  { 5, 2 },  { 6, 0 },  { 6, 2 },  { 6, 4 },  { 6, 6 },
38*fb1b10abSAndroid Build Coastguard Worker   { 7, 0 },  { 7, 2 },  { 7, 4 },  { 7, 6 },  { 7, 8 },  { 7, 10 }, { 7, 12 },
39*fb1b10abSAndroid Build Coastguard Worker   { 7, 14 }, { 8, 0 },  { 8, 2 },  { 8, 4 },  { 8, 6 },  { 8, 8 },  { 8, 10 },
40*fb1b10abSAndroid Build Coastguard Worker   { 8, 12 }, { 8, 14 }, { 8, 16 }, { 8, 18 }, { 8, 20 }, { 8, 22 }, { 8, 24 },
41*fb1b10abSAndroid Build Coastguard Worker   { 8, 26 }, { 8, 28 }, { 8, 30 }, { 9, 0 },  { 9, 2 },  { 9, 4 },  { 9, 6 },
42*fb1b10abSAndroid Build Coastguard Worker   { 9, 8 },  { 9, 10 }, { 9, 12 }, { 9, 14 }, { 9, 16 }, { 9, 18 }, { 9, 20 },
43*fb1b10abSAndroid Build Coastguard Worker   { 9, 22 }, { 9, 24 }, { 9, 26 }, { 9, 28 }, { 9, 30 }, { 9, 32 }, { 9, 34 },
44*fb1b10abSAndroid Build Coastguard Worker   { 9, 36 }, { 9, 38 }, { 9, 40 }, { 9, 42 }, { 9, 44 }, { 9, 46 }, { 9, 48 },
45*fb1b10abSAndroid Build Coastguard Worker   { 9, 50 }, { 9, 52 }, { 9, 54 }, { 9, 56 }, { 9, 58 }, { 9, 60 }, { 9, 62 }
46*fb1b10abSAndroid Build Coastguard Worker };
47*fb1b10abSAndroid Build Coastguard Worker const TOKENVALUE *vp9_dct_cat_lt_10_value_tokens =
48*fb1b10abSAndroid Build Coastguard Worker     dct_cat_lt_10_value_tokens +
49*fb1b10abSAndroid Build Coastguard Worker     (sizeof(dct_cat_lt_10_value_tokens) / sizeof(*dct_cat_lt_10_value_tokens)) /
50*fb1b10abSAndroid Build Coastguard Worker         2;
51*fb1b10abSAndroid Build Coastguard Worker // The corresponding costs of the extrabits for the tokens in the above table
52*fb1b10abSAndroid Build Coastguard Worker // are stored in the table below. The values are obtained from looking up the
53*fb1b10abSAndroid Build Coastguard Worker // entry for the specified extrabits in the table corresponding to the token
54*fb1b10abSAndroid Build Coastguard Worker // (as defined in cost element vp9_extra_bits)
55*fb1b10abSAndroid Build Coastguard Worker // e.g. {9, 63} maps to cat5_cost[63 >> 1], {1, 1} maps to sign_cost[1 >> 1]
56*fb1b10abSAndroid Build Coastguard Worker static const int dct_cat_lt_10_value_cost[] = {
57*fb1b10abSAndroid Build Coastguard Worker   3773, 3750, 3704, 3681, 3623, 3600, 3554, 3531, 3432, 3409, 3363, 3340, 3282,
58*fb1b10abSAndroid Build Coastguard Worker   3259, 3213, 3190, 3136, 3113, 3067, 3044, 2986, 2963, 2917, 2894, 2795, 2772,
59*fb1b10abSAndroid Build Coastguard Worker   2726, 2703, 2645, 2622, 2576, 2553, 3197, 3116, 3058, 2977, 2881, 2800, 2742,
60*fb1b10abSAndroid Build Coastguard Worker   2661, 2615, 2534, 2476, 2395, 2299, 2218, 2160, 2079, 2566, 2427, 2334, 2195,
61*fb1b10abSAndroid Build Coastguard Worker   2023, 1884, 1791, 1652, 1893, 1696, 1453, 1256, 1229, 864,  512,  512,  512,
62*fb1b10abSAndroid Build Coastguard Worker   512,  0,    512,  512,  512,  512,  864,  1229, 1256, 1453, 1696, 1893, 1652,
63*fb1b10abSAndroid Build Coastguard Worker   1791, 1884, 2023, 2195, 2334, 2427, 2566, 2079, 2160, 2218, 2299, 2395, 2476,
64*fb1b10abSAndroid Build Coastguard Worker   2534, 2615, 2661, 2742, 2800, 2881, 2977, 3058, 3116, 3197, 2553, 2576, 2622,
65*fb1b10abSAndroid Build Coastguard Worker   2645, 2703, 2726, 2772, 2795, 2894, 2917, 2963, 2986, 3044, 3067, 3113, 3136,
66*fb1b10abSAndroid Build Coastguard Worker   3190, 3213, 3259, 3282, 3340, 3363, 3409, 3432, 3531, 3554, 3600, 3623, 3681,
67*fb1b10abSAndroid Build Coastguard Worker   3704, 3750, 3773,
68*fb1b10abSAndroid Build Coastguard Worker };
69*fb1b10abSAndroid Build Coastguard Worker const int *vp9_dct_cat_lt_10_value_cost =
70*fb1b10abSAndroid Build Coastguard Worker     dct_cat_lt_10_value_cost +
71*fb1b10abSAndroid Build Coastguard Worker     (sizeof(dct_cat_lt_10_value_cost) / sizeof(*dct_cat_lt_10_value_cost)) / 2;
72*fb1b10abSAndroid Build Coastguard Worker 
73*fb1b10abSAndroid Build Coastguard Worker // Array indices are identical to previously-existing CONTEXT_NODE indices
74*fb1b10abSAndroid Build Coastguard Worker /* clang-format off */
75*fb1b10abSAndroid Build Coastguard Worker const vpx_tree_index vp9_coef_tree[TREE_SIZE(ENTROPY_TOKENS)] = {
76*fb1b10abSAndroid Build Coastguard Worker   -EOB_TOKEN, 2,                       // 0  = EOB
77*fb1b10abSAndroid Build Coastguard Worker   -ZERO_TOKEN, 4,                      // 1  = ZERO
78*fb1b10abSAndroid Build Coastguard Worker   -ONE_TOKEN, 6,                       // 2  = ONE
79*fb1b10abSAndroid Build Coastguard Worker   8, 12,                               // 3  = LOW_VAL
80*fb1b10abSAndroid Build Coastguard Worker   -TWO_TOKEN, 10,                      // 4  = TWO
81*fb1b10abSAndroid Build Coastguard Worker   -THREE_TOKEN, -FOUR_TOKEN,           // 5  = THREE
82*fb1b10abSAndroid Build Coastguard Worker   14, 16,                              // 6  = HIGH_LOW
83*fb1b10abSAndroid Build Coastguard Worker   -CATEGORY1_TOKEN, -CATEGORY2_TOKEN,  // 7  = CAT_ONE
84*fb1b10abSAndroid Build Coastguard Worker   18, 20,                              // 8  = CAT_THREEFOUR
85*fb1b10abSAndroid Build Coastguard Worker   -CATEGORY3_TOKEN, -CATEGORY4_TOKEN,  // 9  = CAT_THREE
86*fb1b10abSAndroid Build Coastguard Worker   -CATEGORY5_TOKEN, -CATEGORY6_TOKEN   // 10 = CAT_FIVE
87*fb1b10abSAndroid Build Coastguard Worker };
88*fb1b10abSAndroid Build Coastguard Worker /* clang-format on */
89*fb1b10abSAndroid Build Coastguard Worker 
90*fb1b10abSAndroid Build Coastguard Worker static const int16_t zero_cost[] = { 0 };
91*fb1b10abSAndroid Build Coastguard Worker static const int16_t sign_cost[1] = { 512 };
92*fb1b10abSAndroid Build Coastguard Worker static const int16_t cat1_cost[1 << 1] = { 864, 1229 };
93*fb1b10abSAndroid Build Coastguard Worker static const int16_t cat2_cost[1 << 2] = { 1256, 1453, 1696, 1893 };
94*fb1b10abSAndroid Build Coastguard Worker static const int16_t cat3_cost[1 << 3] = { 1652, 1791, 1884, 2023,
95*fb1b10abSAndroid Build Coastguard Worker                                            2195, 2334, 2427, 2566 };
96*fb1b10abSAndroid Build Coastguard Worker static const int16_t cat4_cost[1 << 4] = { 2079, 2160, 2218, 2299, 2395, 2476,
97*fb1b10abSAndroid Build Coastguard Worker                                            2534, 2615, 2661, 2742, 2800, 2881,
98*fb1b10abSAndroid Build Coastguard Worker                                            2977, 3058, 3116, 3197 };
99*fb1b10abSAndroid Build Coastguard Worker static const int16_t cat5_cost[1 << 5] = {
100*fb1b10abSAndroid Build Coastguard Worker   2553, 2576, 2622, 2645, 2703, 2726, 2772, 2795, 2894, 2917, 2963,
101*fb1b10abSAndroid Build Coastguard Worker   2986, 3044, 3067, 3113, 3136, 3190, 3213, 3259, 3282, 3340, 3363,
102*fb1b10abSAndroid Build Coastguard Worker   3409, 3432, 3531, 3554, 3600, 3623, 3681, 3704, 3750, 3773
103*fb1b10abSAndroid Build Coastguard Worker };
104*fb1b10abSAndroid Build Coastguard Worker const int16_t vp9_cat6_low_cost[256] = {
105*fb1b10abSAndroid Build Coastguard Worker   3378, 3390, 3401, 3413, 3435, 3447, 3458, 3470, 3517, 3529, 3540, 3552, 3574,
106*fb1b10abSAndroid Build Coastguard Worker   3586, 3597, 3609, 3671, 3683, 3694, 3706, 3728, 3740, 3751, 3763, 3810, 3822,
107*fb1b10abSAndroid Build Coastguard Worker   3833, 3845, 3867, 3879, 3890, 3902, 3973, 3985, 3996, 4008, 4030, 4042, 4053,
108*fb1b10abSAndroid Build Coastguard Worker   4065, 4112, 4124, 4135, 4147, 4169, 4181, 4192, 4204, 4266, 4278, 4289, 4301,
109*fb1b10abSAndroid Build Coastguard Worker   4323, 4335, 4346, 4358, 4405, 4417, 4428, 4440, 4462, 4474, 4485, 4497, 4253,
110*fb1b10abSAndroid Build Coastguard Worker   4265, 4276, 4288, 4310, 4322, 4333, 4345, 4392, 4404, 4415, 4427, 4449, 4461,
111*fb1b10abSAndroid Build Coastguard Worker   4472, 4484, 4546, 4558, 4569, 4581, 4603, 4615, 4626, 4638, 4685, 4697, 4708,
112*fb1b10abSAndroid Build Coastguard Worker   4720, 4742, 4754, 4765, 4777, 4848, 4860, 4871, 4883, 4905, 4917, 4928, 4940,
113*fb1b10abSAndroid Build Coastguard Worker   4987, 4999, 5010, 5022, 5044, 5056, 5067, 5079, 5141, 5153, 5164, 5176, 5198,
114*fb1b10abSAndroid Build Coastguard Worker   5210, 5221, 5233, 5280, 5292, 5303, 5315, 5337, 5349, 5360, 5372, 4988, 5000,
115*fb1b10abSAndroid Build Coastguard Worker   5011, 5023, 5045, 5057, 5068, 5080, 5127, 5139, 5150, 5162, 5184, 5196, 5207,
116*fb1b10abSAndroid Build Coastguard Worker   5219, 5281, 5293, 5304, 5316, 5338, 5350, 5361, 5373, 5420, 5432, 5443, 5455,
117*fb1b10abSAndroid Build Coastguard Worker   5477, 5489, 5500, 5512, 5583, 5595, 5606, 5618, 5640, 5652, 5663, 5675, 5722,
118*fb1b10abSAndroid Build Coastguard Worker   5734, 5745, 5757, 5779, 5791, 5802, 5814, 5876, 5888, 5899, 5911, 5933, 5945,
119*fb1b10abSAndroid Build Coastguard Worker   5956, 5968, 6015, 6027, 6038, 6050, 6072, 6084, 6095, 6107, 5863, 5875, 5886,
120*fb1b10abSAndroid Build Coastguard Worker   5898, 5920, 5932, 5943, 5955, 6002, 6014, 6025, 6037, 6059, 6071, 6082, 6094,
121*fb1b10abSAndroid Build Coastguard Worker   6156, 6168, 6179, 6191, 6213, 6225, 6236, 6248, 6295, 6307, 6318, 6330, 6352,
122*fb1b10abSAndroid Build Coastguard Worker   6364, 6375, 6387, 6458, 6470, 6481, 6493, 6515, 6527, 6538, 6550, 6597, 6609,
123*fb1b10abSAndroid Build Coastguard Worker   6620, 6632, 6654, 6666, 6677, 6689, 6751, 6763, 6774, 6786, 6808, 6820, 6831,
124*fb1b10abSAndroid Build Coastguard Worker   6843, 6890, 6902, 6913, 6925, 6947, 6959, 6970, 6982
125*fb1b10abSAndroid Build Coastguard Worker };
126*fb1b10abSAndroid Build Coastguard Worker const uint16_t vp9_cat6_high_cost[64] = {
127*fb1b10abSAndroid Build Coastguard Worker   88,    2251,  2727,  4890,  3148,  5311,  5787,  7950,  3666,  5829,  6305,
128*fb1b10abSAndroid Build Coastguard Worker   8468,  6726,  8889,  9365,  11528, 3666,  5829,  6305,  8468,  6726,  8889,
129*fb1b10abSAndroid Build Coastguard Worker   9365,  11528, 7244,  9407,  9883,  12046, 10304, 12467, 12943, 15106, 3666,
130*fb1b10abSAndroid Build Coastguard Worker   5829,  6305,  8468,  6726,  8889,  9365,  11528, 7244,  9407,  9883,  12046,
131*fb1b10abSAndroid Build Coastguard Worker   10304, 12467, 12943, 15106, 7244,  9407,  9883,  12046, 10304, 12467, 12943,
132*fb1b10abSAndroid Build Coastguard Worker   15106, 10822, 12985, 13461, 15624, 13882, 16045, 16521, 18684
133*fb1b10abSAndroid Build Coastguard Worker };
134*fb1b10abSAndroid Build Coastguard Worker 
135*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
136*fb1b10abSAndroid Build Coastguard Worker const uint16_t vp9_cat6_high10_high_cost[256] = {
137*fb1b10abSAndroid Build Coastguard Worker   94,    2257,  2733,  4896,  3154,  5317,  5793,  7956,  3672,  5835,  6311,
138*fb1b10abSAndroid Build Coastguard Worker   8474,  6732,  8895,  9371,  11534, 3672,  5835,  6311,  8474,  6732,  8895,
139*fb1b10abSAndroid Build Coastguard Worker   9371,  11534, 7250,  9413,  9889,  12052, 10310, 12473, 12949, 15112, 3672,
140*fb1b10abSAndroid Build Coastguard Worker   5835,  6311,  8474,  6732,  8895,  9371,  11534, 7250,  9413,  9889,  12052,
141*fb1b10abSAndroid Build Coastguard Worker   10310, 12473, 12949, 15112, 7250,  9413,  9889,  12052, 10310, 12473, 12949,
142*fb1b10abSAndroid Build Coastguard Worker   15112, 10828, 12991, 13467, 15630, 13888, 16051, 16527, 18690, 4187,  6350,
143*fb1b10abSAndroid Build Coastguard Worker   6826,  8989,  7247,  9410,  9886,  12049, 7765,  9928,  10404, 12567, 10825,
144*fb1b10abSAndroid Build Coastguard Worker   12988, 13464, 15627, 7765,  9928,  10404, 12567, 10825, 12988, 13464, 15627,
145*fb1b10abSAndroid Build Coastguard Worker   11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 7765,  9928,  10404,
146*fb1b10abSAndroid Build Coastguard Worker   12567, 10825, 12988, 13464, 15627, 11343, 13506, 13982, 16145, 14403, 16566,
147*fb1b10abSAndroid Build Coastguard Worker   17042, 19205, 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 14921,
148*fb1b10abSAndroid Build Coastguard Worker   17084, 17560, 19723, 17981, 20144, 20620, 22783, 4187,  6350,  6826,  8989,
149*fb1b10abSAndroid Build Coastguard Worker   7247,  9410,  9886,  12049, 7765,  9928,  10404, 12567, 10825, 12988, 13464,
150*fb1b10abSAndroid Build Coastguard Worker   15627, 7765,  9928,  10404, 12567, 10825, 12988, 13464, 15627, 11343, 13506,
151*fb1b10abSAndroid Build Coastguard Worker   13982, 16145, 14403, 16566, 17042, 19205, 7765,  9928,  10404, 12567, 10825,
152*fb1b10abSAndroid Build Coastguard Worker   12988, 13464, 15627, 11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205,
153*fb1b10abSAndroid Build Coastguard Worker   11343, 13506, 13982, 16145, 14403, 16566, 17042, 19205, 14921, 17084, 17560,
154*fb1b10abSAndroid Build Coastguard Worker   19723, 17981, 20144, 20620, 22783, 8280,  10443, 10919, 13082, 11340, 13503,
155*fb1b10abSAndroid Build Coastguard Worker   13979, 16142, 11858, 14021, 14497, 16660, 14918, 17081, 17557, 19720, 11858,
156*fb1b10abSAndroid Build Coastguard Worker   14021, 14497, 16660, 14918, 17081, 17557, 19720, 15436, 17599, 18075, 20238,
157*fb1b10abSAndroid Build Coastguard Worker   18496, 20659, 21135, 23298, 11858, 14021, 14497, 16660, 14918, 17081, 17557,
158*fb1b10abSAndroid Build Coastguard Worker   19720, 15436, 17599, 18075, 20238, 18496, 20659, 21135, 23298, 15436, 17599,
159*fb1b10abSAndroid Build Coastguard Worker   18075, 20238, 18496, 20659, 21135, 23298, 19014, 21177, 21653, 23816, 22074,
160*fb1b10abSAndroid Build Coastguard Worker   24237, 24713, 26876
161*fb1b10abSAndroid Build Coastguard Worker };
162*fb1b10abSAndroid Build Coastguard Worker const uint16_t vp9_cat6_high12_high_cost[1024] = {
163*fb1b10abSAndroid Build Coastguard Worker   100,   2263,  2739,  4902,  3160,  5323,  5799,  7962,  3678,  5841,  6317,
164*fb1b10abSAndroid Build Coastguard Worker   8480,  6738,  8901,  9377,  11540, 3678,  5841,  6317,  8480,  6738,  8901,
165*fb1b10abSAndroid Build Coastguard Worker   9377,  11540, 7256,  9419,  9895,  12058, 10316, 12479, 12955, 15118, 3678,
166*fb1b10abSAndroid Build Coastguard Worker   5841,  6317,  8480,  6738,  8901,  9377,  11540, 7256,  9419,  9895,  12058,
167*fb1b10abSAndroid Build Coastguard Worker   10316, 12479, 12955, 15118, 7256,  9419,  9895,  12058, 10316, 12479, 12955,
168*fb1b10abSAndroid Build Coastguard Worker   15118, 10834, 12997, 13473, 15636, 13894, 16057, 16533, 18696, 4193,  6356,
169*fb1b10abSAndroid Build Coastguard Worker   6832,  8995,  7253,  9416,  9892,  12055, 7771,  9934,  10410, 12573, 10831,
170*fb1b10abSAndroid Build Coastguard Worker   12994, 13470, 15633, 7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633,
171*fb1b10abSAndroid Build Coastguard Worker   11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 7771,  9934,  10410,
172*fb1b10abSAndroid Build Coastguard Worker   12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572,
173*fb1b10abSAndroid Build Coastguard Worker   17048, 19211, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927,
174*fb1b10abSAndroid Build Coastguard Worker   17090, 17566, 19729, 17987, 20150, 20626, 22789, 4193,  6356,  6832,  8995,
175*fb1b10abSAndroid Build Coastguard Worker   7253,  9416,  9892,  12055, 7771,  9934,  10410, 12573, 10831, 12994, 13470,
176*fb1b10abSAndroid Build Coastguard Worker   15633, 7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633, 11349, 13512,
177*fb1b10abSAndroid Build Coastguard Worker   13988, 16151, 14409, 16572, 17048, 19211, 7771,  9934,  10410, 12573, 10831,
178*fb1b10abSAndroid Build Coastguard Worker   12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211,
179*fb1b10abSAndroid Build Coastguard Worker   11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, 17090, 17566,
180*fb1b10abSAndroid Build Coastguard Worker   19729, 17987, 20150, 20626, 22789, 8286,  10449, 10925, 13088, 11346, 13509,
181*fb1b10abSAndroid Build Coastguard Worker   13985, 16148, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864,
182*fb1b10abSAndroid Build Coastguard Worker   14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244,
183*fb1b10abSAndroid Build Coastguard Worker   18502, 20665, 21141, 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563,
184*fb1b10abSAndroid Build Coastguard Worker   19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605,
185*fb1b10abSAndroid Build Coastguard Worker   18081, 20244, 18502, 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080,
186*fb1b10abSAndroid Build Coastguard Worker   24243, 24719, 26882, 4193,  6356,  6832,  8995,  7253,  9416,  9892,  12055,
187*fb1b10abSAndroid Build Coastguard Worker   7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633, 7771,  9934,  10410,
188*fb1b10abSAndroid Build Coastguard Worker   12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572,
189*fb1b10abSAndroid Build Coastguard Worker   17048, 19211, 7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633, 11349,
190*fb1b10abSAndroid Build Coastguard Worker   13512, 13988, 16151, 14409, 16572, 17048, 19211, 11349, 13512, 13988, 16151,
191*fb1b10abSAndroid Build Coastguard Worker   14409, 16572, 17048, 19211, 14927, 17090, 17566, 19729, 17987, 20150, 20626,
192*fb1b10abSAndroid Build Coastguard Worker   22789, 8286,  10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027,
193*fb1b10abSAndroid Build Coastguard Worker   14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924,
194*fb1b10abSAndroid Build Coastguard Worker   17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304,
195*fb1b10abSAndroid Build Coastguard Worker   11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081,
196*fb1b10abSAndroid Build Coastguard Worker   20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665,
197*fb1b10abSAndroid Build Coastguard Worker   21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, 8286,
198*fb1b10abSAndroid Build Coastguard Worker   10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, 14503, 16666,
199*fb1b10abSAndroid Build Coastguard Worker   14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, 17087, 17563,
200*fb1b10abSAndroid Build Coastguard Worker   19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 11864, 14027,
201*fb1b10abSAndroid Build Coastguard Worker   14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502,
202*fb1b10abSAndroid Build Coastguard Worker   20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304,
203*fb1b10abSAndroid Build Coastguard Worker   19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882, 12379, 14542, 15018,
204*fb1b10abSAndroid Build Coastguard Worker   17181, 15439, 17602, 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180,
205*fb1b10abSAndroid Build Coastguard Worker   21656, 23819, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535,
206*fb1b10abSAndroid Build Coastguard Worker   21698, 22174, 24337, 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759,
207*fb1b10abSAndroid Build Coastguard Worker   19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234,
208*fb1b10abSAndroid Build Coastguard Worker   27397, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276,
209*fb1b10abSAndroid Build Coastguard Worker   25752, 27915, 26173, 28336, 28812, 30975, 4193,  6356,  6832,  8995,  7253,
210*fb1b10abSAndroid Build Coastguard Worker   9416,  9892,  12055, 7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633,
211*fb1b10abSAndroid Build Coastguard Worker   7771,  9934,  10410, 12573, 10831, 12994, 13470, 15633, 11349, 13512, 13988,
212*fb1b10abSAndroid Build Coastguard Worker   16151, 14409, 16572, 17048, 19211, 7771,  9934,  10410, 12573, 10831, 12994,
213*fb1b10abSAndroid Build Coastguard Worker   13470, 15633, 11349, 13512, 13988, 16151, 14409, 16572, 17048, 19211, 11349,
214*fb1b10abSAndroid Build Coastguard Worker   13512, 13988, 16151, 14409, 16572, 17048, 19211, 14927, 17090, 17566, 19729,
215*fb1b10abSAndroid Build Coastguard Worker   17987, 20150, 20626, 22789, 8286,  10449, 10925, 13088, 11346, 13509, 13985,
216*fb1b10abSAndroid Build Coastguard Worker   16148, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027,
217*fb1b10abSAndroid Build Coastguard Worker   14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502,
218*fb1b10abSAndroid Build Coastguard Worker   20665, 21141, 23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726,
219*fb1b10abSAndroid Build Coastguard Worker   15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081,
220*fb1b10abSAndroid Build Coastguard Worker   20244, 18502, 20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243,
221*fb1b10abSAndroid Build Coastguard Worker   24719, 26882, 8286,  10449, 10925, 13088, 11346, 13509, 13985, 16148, 11864,
222*fb1b10abSAndroid Build Coastguard Worker   14027, 14503, 16666, 14924, 17087, 17563, 19726, 11864, 14027, 14503, 16666,
223*fb1b10abSAndroid Build Coastguard Worker   14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665, 21141,
224*fb1b10abSAndroid Build Coastguard Worker   23304, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726, 15442, 17605,
225*fb1b10abSAndroid Build Coastguard Worker   18081, 20244, 18502, 20665, 21141, 23304, 15442, 17605, 18081, 20244, 18502,
226*fb1b10abSAndroid Build Coastguard Worker   20665, 21141, 23304, 19020, 21183, 21659, 23822, 22080, 24243, 24719, 26882,
227*fb1b10abSAndroid Build Coastguard Worker   12379, 14542, 15018, 17181, 15439, 17602, 18078, 20241, 15957, 18120, 18596,
228*fb1b10abSAndroid Build Coastguard Worker   20759, 19017, 21180, 21656, 23819, 15957, 18120, 18596, 20759, 19017, 21180,
229*fb1b10abSAndroid Build Coastguard Worker   21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 15957,
230*fb1b10abSAndroid Build Coastguard Worker   18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337,
231*fb1b10abSAndroid Build Coastguard Worker   22595, 24758, 25234, 27397, 19535, 21698, 22174, 24337, 22595, 24758, 25234,
232*fb1b10abSAndroid Build Coastguard Worker   27397, 23113, 25276, 25752, 27915, 26173, 28336, 28812, 30975, 8286,  10449,
233*fb1b10abSAndroid Build Coastguard Worker   10925, 13088, 11346, 13509, 13985, 16148, 11864, 14027, 14503, 16666, 14924,
234*fb1b10abSAndroid Build Coastguard Worker   17087, 17563, 19726, 11864, 14027, 14503, 16666, 14924, 17087, 17563, 19726,
235*fb1b10abSAndroid Build Coastguard Worker   15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 11864, 14027, 14503,
236*fb1b10abSAndroid Build Coastguard Worker   16666, 14924, 17087, 17563, 19726, 15442, 17605, 18081, 20244, 18502, 20665,
237*fb1b10abSAndroid Build Coastguard Worker   21141, 23304, 15442, 17605, 18081, 20244, 18502, 20665, 21141, 23304, 19020,
238*fb1b10abSAndroid Build Coastguard Worker   21183, 21659, 23822, 22080, 24243, 24719, 26882, 12379, 14542, 15018, 17181,
239*fb1b10abSAndroid Build Coastguard Worker   15439, 17602, 18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, 21656,
240*fb1b10abSAndroid Build Coastguard Worker   23819, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698,
241*fb1b10abSAndroid Build Coastguard Worker   22174, 24337, 22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, 19017,
242*fb1b10abSAndroid Build Coastguard Worker   21180, 21656, 23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397,
243*fb1b10abSAndroid Build Coastguard Worker   19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, 25752,
244*fb1b10abSAndroid Build Coastguard Worker   27915, 26173, 28336, 28812, 30975, 12379, 14542, 15018, 17181, 15439, 17602,
245*fb1b10abSAndroid Build Coastguard Worker   18078, 20241, 15957, 18120, 18596, 20759, 19017, 21180, 21656, 23819, 15957,
246*fb1b10abSAndroid Build Coastguard Worker   18120, 18596, 20759, 19017, 21180, 21656, 23819, 19535, 21698, 22174, 24337,
247*fb1b10abSAndroid Build Coastguard Worker   22595, 24758, 25234, 27397, 15957, 18120, 18596, 20759, 19017, 21180, 21656,
248*fb1b10abSAndroid Build Coastguard Worker   23819, 19535, 21698, 22174, 24337, 22595, 24758, 25234, 27397, 19535, 21698,
249*fb1b10abSAndroid Build Coastguard Worker   22174, 24337, 22595, 24758, 25234, 27397, 23113, 25276, 25752, 27915, 26173,
250*fb1b10abSAndroid Build Coastguard Worker   28336, 28812, 30975, 16472, 18635, 19111, 21274, 19532, 21695, 22171, 24334,
251*fb1b10abSAndroid Build Coastguard Worker   20050, 22213, 22689, 24852, 23110, 25273, 25749, 27912, 20050, 22213, 22689,
252*fb1b10abSAndroid Build Coastguard Worker   24852, 23110, 25273, 25749, 27912, 23628, 25791, 26267, 28430, 26688, 28851,
253*fb1b10abSAndroid Build Coastguard Worker   29327, 31490, 20050, 22213, 22689, 24852, 23110, 25273, 25749, 27912, 23628,
254*fb1b10abSAndroid Build Coastguard Worker   25791, 26267, 28430, 26688, 28851, 29327, 31490, 23628, 25791, 26267, 28430,
255*fb1b10abSAndroid Build Coastguard Worker   26688, 28851, 29327, 31490, 27206, 29369, 29845, 32008, 30266, 32429, 32905,
256*fb1b10abSAndroid Build Coastguard Worker   35068
257*fb1b10abSAndroid Build Coastguard Worker };
258*fb1b10abSAndroid Build Coastguard Worker #endif
259*fb1b10abSAndroid Build Coastguard Worker 
260*fb1b10abSAndroid Build Coastguard Worker const vp9_extra_bit vp9_extra_bits[ENTROPY_TOKENS] = {
261*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 0, zero_cost },                         // ZERO_TOKEN
262*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 1, sign_cost },                         // ONE_TOKEN
263*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 2, sign_cost },                         // TWO_TOKEN
264*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 3, sign_cost },                         // THREE_TOKEN
265*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 4, sign_cost },                         // FOUR_TOKEN
266*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost },  // CATEGORY1_TOKEN
267*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost },  // CATEGORY2_TOKEN
268*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost },  // CATEGORY3_TOKEN
269*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost },  // CATEGORY4_TOKEN
270*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost },  // CATEGORY5_TOKEN
271*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat6_prob, 14, CAT6_MIN_VAL, 0 },         // CATEGORY6_TOKEN
272*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 0, zero_cost }                          // EOB_TOKEN
273*fb1b10abSAndroid Build Coastguard Worker };
274*fb1b10abSAndroid Build Coastguard Worker 
275*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
276*fb1b10abSAndroid Build Coastguard Worker const vp9_extra_bit vp9_extra_bits_high10[ENTROPY_TOKENS] = {
277*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 0, zero_cost },                             // ZERO
278*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 1, sign_cost },                             // ONE
279*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 2, sign_cost },                             // TWO
280*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 3, sign_cost },                             // THREE
281*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 4, sign_cost },                             // FOUR
282*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost },      // CAT1
283*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost },      // CAT2
284*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost },      // CAT3
285*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost },      // CAT4
286*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost },      // CAT5
287*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat6_prob_high12 + 2, 16, CAT6_MIN_VAL, 0 },  // CAT6
288*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 0, zero_cost }                              // EOB
289*fb1b10abSAndroid Build Coastguard Worker };
290*fb1b10abSAndroid Build Coastguard Worker const vp9_extra_bit vp9_extra_bits_high12[ENTROPY_TOKENS] = {
291*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 0, zero_cost },                         // ZERO
292*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 1, sign_cost },                         // ONE
293*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 2, sign_cost },                         // TWO
294*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 3, sign_cost },                         // THREE
295*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 4, sign_cost },                         // FOUR
296*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat1_prob, 1, CAT1_MIN_VAL, cat1_cost },  // CAT1
297*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat2_prob, 2, CAT2_MIN_VAL, cat2_cost },  // CAT2
298*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat3_prob, 3, CAT3_MIN_VAL, cat3_cost },  // CAT3
299*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat4_prob, 4, CAT4_MIN_VAL, cat4_cost },  // CAT4
300*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat5_prob, 5, CAT5_MIN_VAL, cat5_cost },  // CAT5
301*fb1b10abSAndroid Build Coastguard Worker   { vp9_cat6_prob_high12, 18, CAT6_MIN_VAL, 0 },  // CAT6
302*fb1b10abSAndroid Build Coastguard Worker   { 0, 0, 0, zero_cost }                          // EOB
303*fb1b10abSAndroid Build Coastguard Worker };
304*fb1b10abSAndroid Build Coastguard Worker #endif
305*fb1b10abSAndroid Build Coastguard Worker 
306*fb1b10abSAndroid Build Coastguard Worker const struct vp9_token vp9_coef_encodings[ENTROPY_TOKENS] = {
307*fb1b10abSAndroid Build Coastguard Worker   { 2, 2 },  { 6, 3 },   { 28, 5 },  { 58, 6 },  { 59, 6 },  { 60, 6 },
308*fb1b10abSAndroid Build Coastguard Worker   { 61, 6 }, { 124, 7 }, { 125, 7 }, { 126, 7 }, { 127, 7 }, { 0, 1 }
309*fb1b10abSAndroid Build Coastguard Worker };
310*fb1b10abSAndroid Build Coastguard Worker 
311*fb1b10abSAndroid Build Coastguard Worker struct tokenize_b_args {
312*fb1b10abSAndroid Build Coastguard Worker   VP9_COMP *cpi;
313*fb1b10abSAndroid Build Coastguard Worker   ThreadData *td;
314*fb1b10abSAndroid Build Coastguard Worker   TOKENEXTRA **tp;
315*fb1b10abSAndroid Build Coastguard Worker };
316*fb1b10abSAndroid Build Coastguard Worker 
set_entropy_context_b(int plane,int block,int row,int col,BLOCK_SIZE plane_bsize,TX_SIZE tx_size,void * arg)317*fb1b10abSAndroid Build Coastguard Worker static void set_entropy_context_b(int plane, int block, int row, int col,
318*fb1b10abSAndroid Build Coastguard Worker                                   BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
319*fb1b10abSAndroid Build Coastguard Worker                                   void *arg) {
320*fb1b10abSAndroid Build Coastguard Worker   struct tokenize_b_args *const args = arg;
321*fb1b10abSAndroid Build Coastguard Worker   ThreadData *const td = args->td;
322*fb1b10abSAndroid Build Coastguard Worker   MACROBLOCK *const x = &td->mb;
323*fb1b10abSAndroid Build Coastguard Worker   MACROBLOCKD *const xd = &x->e_mbd;
324*fb1b10abSAndroid Build Coastguard Worker   struct macroblock_plane *p = &x->plane[plane];
325*fb1b10abSAndroid Build Coastguard Worker   struct macroblockd_plane *pd = &xd->plane[plane];
326*fb1b10abSAndroid Build Coastguard Worker   vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, col, row);
327*fb1b10abSAndroid Build Coastguard Worker }
328*fb1b10abSAndroid Build Coastguard Worker 
add_token(TOKENEXTRA ** t,const vpx_prob * context_tree,int16_t token,EXTRABIT extra,unsigned int * counts)329*fb1b10abSAndroid Build Coastguard Worker static INLINE void add_token(TOKENEXTRA **t, const vpx_prob *context_tree,
330*fb1b10abSAndroid Build Coastguard Worker                              int16_t token, EXTRABIT extra,
331*fb1b10abSAndroid Build Coastguard Worker                              unsigned int *counts) {
332*fb1b10abSAndroid Build Coastguard Worker   (*t)->context_tree = context_tree;
333*fb1b10abSAndroid Build Coastguard Worker   (*t)->token = token;
334*fb1b10abSAndroid Build Coastguard Worker   (*t)->extra = extra;
335*fb1b10abSAndroid Build Coastguard Worker   (*t)++;
336*fb1b10abSAndroid Build Coastguard Worker   ++counts[token];
337*fb1b10abSAndroid Build Coastguard Worker }
338*fb1b10abSAndroid Build Coastguard Worker 
add_token_no_extra(TOKENEXTRA ** t,const vpx_prob * context_tree,int16_t token,unsigned int * counts)339*fb1b10abSAndroid Build Coastguard Worker static INLINE void add_token_no_extra(TOKENEXTRA **t,
340*fb1b10abSAndroid Build Coastguard Worker                                       const vpx_prob *context_tree,
341*fb1b10abSAndroid Build Coastguard Worker                                       int16_t token, unsigned int *counts) {
342*fb1b10abSAndroid Build Coastguard Worker   (*t)->context_tree = context_tree;
343*fb1b10abSAndroid Build Coastguard Worker   (*t)->token = token;
344*fb1b10abSAndroid Build Coastguard Worker   (*t)++;
345*fb1b10abSAndroid Build Coastguard Worker   ++counts[token];
346*fb1b10abSAndroid Build Coastguard Worker }
347*fb1b10abSAndroid Build Coastguard Worker 
tokenize_b(int plane,int block,int row,int col,BLOCK_SIZE plane_bsize,TX_SIZE tx_size,void * arg)348*fb1b10abSAndroid Build Coastguard Worker static void tokenize_b(int plane, int block, int row, int col,
349*fb1b10abSAndroid Build Coastguard Worker                        BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg) {
350*fb1b10abSAndroid Build Coastguard Worker   struct tokenize_b_args *const args = arg;
351*fb1b10abSAndroid Build Coastguard Worker   VP9_COMP *cpi = args->cpi;
352*fb1b10abSAndroid Build Coastguard Worker   ThreadData *const td = args->td;
353*fb1b10abSAndroid Build Coastguard Worker   MACROBLOCK *const x = &td->mb;
354*fb1b10abSAndroid Build Coastguard Worker   MACROBLOCKD *const xd = &x->e_mbd;
355*fb1b10abSAndroid Build Coastguard Worker   TOKENEXTRA **tp = args->tp;
356*fb1b10abSAndroid Build Coastguard Worker   uint8_t token_cache[32 * 32];
357*fb1b10abSAndroid Build Coastguard Worker   struct macroblock_plane *p = &x->plane[plane];
358*fb1b10abSAndroid Build Coastguard Worker   struct macroblockd_plane *pd = &xd->plane[plane];
359*fb1b10abSAndroid Build Coastguard Worker   MODE_INFO *mi = xd->mi[0];
360*fb1b10abSAndroid Build Coastguard Worker   int pt; /* near block/prev token context index */
361*fb1b10abSAndroid Build Coastguard Worker   int c;
362*fb1b10abSAndroid Build Coastguard Worker   TOKENEXTRA *t = *tp; /* store tokens starting here */
363*fb1b10abSAndroid Build Coastguard Worker   int eob = p->eobs[block];
364*fb1b10abSAndroid Build Coastguard Worker   const PLANE_TYPE type = get_plane_type(plane);
365*fb1b10abSAndroid Build Coastguard Worker   const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
366*fb1b10abSAndroid Build Coastguard Worker   const int16_t *scan, *nb;
367*fb1b10abSAndroid Build Coastguard Worker   const ScanOrder *so;
368*fb1b10abSAndroid Build Coastguard Worker   const int ref = is_inter_block(mi);
369*fb1b10abSAndroid Build Coastguard Worker   unsigned int(*const counts)[COEFF_CONTEXTS][ENTROPY_TOKENS] =
370*fb1b10abSAndroid Build Coastguard Worker       td->rd_counts.coef_counts[tx_size][type][ref];
371*fb1b10abSAndroid Build Coastguard Worker   vpx_prob(*const coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
372*fb1b10abSAndroid Build Coastguard Worker       cpi->common.fc->coef_probs[tx_size][type][ref];
373*fb1b10abSAndroid Build Coastguard Worker   unsigned int(*const eob_branch)[COEFF_CONTEXTS] =
374*fb1b10abSAndroid Build Coastguard Worker       td->counts->eob_branch[tx_size][type][ref];
375*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *const band = get_band_translate(tx_size);
376*fb1b10abSAndroid Build Coastguard Worker   const int tx_eob = 16 << (tx_size << 1);
377*fb1b10abSAndroid Build Coastguard Worker   int16_t token;
378*fb1b10abSAndroid Build Coastguard Worker   EXTRABIT extra;
379*fb1b10abSAndroid Build Coastguard Worker   pt = get_entropy_context(tx_size, pd->above_context + col,
380*fb1b10abSAndroid Build Coastguard Worker                            pd->left_context + row);
381*fb1b10abSAndroid Build Coastguard Worker   so = get_scan(xd, tx_size, type, block);
382*fb1b10abSAndroid Build Coastguard Worker   scan = so->scan;
383*fb1b10abSAndroid Build Coastguard Worker   nb = so->neighbors;
384*fb1b10abSAndroid Build Coastguard Worker   c = 0;
385*fb1b10abSAndroid Build Coastguard Worker 
386*fb1b10abSAndroid Build Coastguard Worker   while (c < eob) {
387*fb1b10abSAndroid Build Coastguard Worker     int v = 0;
388*fb1b10abSAndroid Build Coastguard Worker     v = qcoeff[scan[c]];
389*fb1b10abSAndroid Build Coastguard Worker     ++eob_branch[band[c]][pt];
390*fb1b10abSAndroid Build Coastguard Worker 
391*fb1b10abSAndroid Build Coastguard Worker     while (!v) {
392*fb1b10abSAndroid Build Coastguard Worker       add_token_no_extra(&t, coef_probs[band[c]][pt], ZERO_TOKEN,
393*fb1b10abSAndroid Build Coastguard Worker                          counts[band[c]][pt]);
394*fb1b10abSAndroid Build Coastguard Worker 
395*fb1b10abSAndroid Build Coastguard Worker       token_cache[scan[c]] = 0;
396*fb1b10abSAndroid Build Coastguard Worker       ++c;
397*fb1b10abSAndroid Build Coastguard Worker       pt = get_coef_context(nb, token_cache, c);
398*fb1b10abSAndroid Build Coastguard Worker       v = qcoeff[scan[c]];
399*fb1b10abSAndroid Build Coastguard Worker     }
400*fb1b10abSAndroid Build Coastguard Worker 
401*fb1b10abSAndroid Build Coastguard Worker     vp9_get_token_extra(v, &token, &extra);
402*fb1b10abSAndroid Build Coastguard Worker 
403*fb1b10abSAndroid Build Coastguard Worker     add_token(&t, coef_probs[band[c]][pt], token, extra, counts[band[c]][pt]);
404*fb1b10abSAndroid Build Coastguard Worker 
405*fb1b10abSAndroid Build Coastguard Worker     token_cache[scan[c]] = vp9_pt_energy_class[token];
406*fb1b10abSAndroid Build Coastguard Worker     ++c;
407*fb1b10abSAndroid Build Coastguard Worker     pt = get_coef_context(nb, token_cache, c);
408*fb1b10abSAndroid Build Coastguard Worker   }
409*fb1b10abSAndroid Build Coastguard Worker   if (c < tx_eob) {
410*fb1b10abSAndroid Build Coastguard Worker     ++eob_branch[band[c]][pt];
411*fb1b10abSAndroid Build Coastguard Worker     add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN,
412*fb1b10abSAndroid Build Coastguard Worker                        counts[band[c]][pt]);
413*fb1b10abSAndroid Build Coastguard Worker   }
414*fb1b10abSAndroid Build Coastguard Worker 
415*fb1b10abSAndroid Build Coastguard Worker   *tp = t;
416*fb1b10abSAndroid Build Coastguard Worker 
417*fb1b10abSAndroid Build Coastguard Worker   vp9_set_contexts(xd, pd, plane_bsize, tx_size, c > 0, col, row);
418*fb1b10abSAndroid Build Coastguard Worker }
419*fb1b10abSAndroid Build Coastguard Worker 
420*fb1b10abSAndroid Build Coastguard Worker struct is_skippable_args {
421*fb1b10abSAndroid Build Coastguard Worker   uint16_t *eobs;
422*fb1b10abSAndroid Build Coastguard Worker   int *skippable;
423*fb1b10abSAndroid Build Coastguard Worker };
424*fb1b10abSAndroid Build Coastguard Worker 
is_skippable(int plane,int block,int row,int col,BLOCK_SIZE plane_bsize,TX_SIZE tx_size,void * argv)425*fb1b10abSAndroid Build Coastguard Worker static void is_skippable(int plane, int block, int row, int col,
426*fb1b10abSAndroid Build Coastguard Worker                          BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *argv) {
427*fb1b10abSAndroid Build Coastguard Worker   struct is_skippable_args *args = argv;
428*fb1b10abSAndroid Build Coastguard Worker   (void)plane;
429*fb1b10abSAndroid Build Coastguard Worker   (void)plane_bsize;
430*fb1b10abSAndroid Build Coastguard Worker   (void)tx_size;
431*fb1b10abSAndroid Build Coastguard Worker   (void)row;
432*fb1b10abSAndroid Build Coastguard Worker   (void)col;
433*fb1b10abSAndroid Build Coastguard Worker   args->skippable[0] &= (!args->eobs[block]);
434*fb1b10abSAndroid Build Coastguard Worker }
435*fb1b10abSAndroid Build Coastguard Worker 
436*fb1b10abSAndroid Build Coastguard Worker // TODO(yaowu): rewrite and optimize this function to remove the usage of
437*fb1b10abSAndroid Build Coastguard Worker //              vp9_foreach_transform_block() and simplify is_skippable().
vp9_is_skippable_in_plane(MACROBLOCK * x,BLOCK_SIZE bsize,int plane)438*fb1b10abSAndroid Build Coastguard Worker int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
439*fb1b10abSAndroid Build Coastguard Worker   int result = 1;
440*fb1b10abSAndroid Build Coastguard Worker   struct is_skippable_args args = { x->plane[plane].eobs, &result };
441*fb1b10abSAndroid Build Coastguard Worker   vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable,
442*fb1b10abSAndroid Build Coastguard Worker                                          &args);
443*fb1b10abSAndroid Build Coastguard Worker   return result;
444*fb1b10abSAndroid Build Coastguard Worker }
445*fb1b10abSAndroid Build Coastguard Worker 
has_high_freq_coeff(int plane,int block,int row,int col,BLOCK_SIZE plane_bsize,TX_SIZE tx_size,void * argv)446*fb1b10abSAndroid Build Coastguard Worker static void has_high_freq_coeff(int plane, int block, int row, int col,
447*fb1b10abSAndroid Build Coastguard Worker                                 BLOCK_SIZE plane_bsize, TX_SIZE tx_size,
448*fb1b10abSAndroid Build Coastguard Worker                                 void *argv) {
449*fb1b10abSAndroid Build Coastguard Worker   struct is_skippable_args *args = argv;
450*fb1b10abSAndroid Build Coastguard Worker   int eobs = (tx_size == TX_4X4) ? 3 : 10;
451*fb1b10abSAndroid Build Coastguard Worker   (void)plane;
452*fb1b10abSAndroid Build Coastguard Worker   (void)plane_bsize;
453*fb1b10abSAndroid Build Coastguard Worker   (void)row;
454*fb1b10abSAndroid Build Coastguard Worker   (void)col;
455*fb1b10abSAndroid Build Coastguard Worker   *(args->skippable) |= (args->eobs[block] > eobs);
456*fb1b10abSAndroid Build Coastguard Worker }
457*fb1b10abSAndroid Build Coastguard Worker 
vp9_has_high_freq_in_plane(MACROBLOCK * x,BLOCK_SIZE bsize,int plane)458*fb1b10abSAndroid Build Coastguard Worker int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
459*fb1b10abSAndroid Build Coastguard Worker   int result = 0;
460*fb1b10abSAndroid Build Coastguard Worker   struct is_skippable_args args = { x->plane[plane].eobs, &result };
461*fb1b10abSAndroid Build Coastguard Worker   vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane,
462*fb1b10abSAndroid Build Coastguard Worker                                          has_high_freq_coeff, &args);
463*fb1b10abSAndroid Build Coastguard Worker   return result;
464*fb1b10abSAndroid Build Coastguard Worker }
465*fb1b10abSAndroid Build Coastguard Worker 
vp9_tokenize_sb(VP9_COMP * cpi,ThreadData * td,TOKENEXTRA ** t,int dry_run,int seg_skip,BLOCK_SIZE bsize)466*fb1b10abSAndroid Build Coastguard Worker void vp9_tokenize_sb(VP9_COMP *cpi, ThreadData *td, TOKENEXTRA **t, int dry_run,
467*fb1b10abSAndroid Build Coastguard Worker                      int seg_skip, BLOCK_SIZE bsize) {
468*fb1b10abSAndroid Build Coastguard Worker   MACROBLOCK *const x = &td->mb;
469*fb1b10abSAndroid Build Coastguard Worker   MACROBLOCKD *const xd = &x->e_mbd;
470*fb1b10abSAndroid Build Coastguard Worker   MODE_INFO *const mi = xd->mi[0];
471*fb1b10abSAndroid Build Coastguard Worker   const int ctx = vp9_get_skip_context(xd);
472*fb1b10abSAndroid Build Coastguard Worker   struct tokenize_b_args arg = { cpi, td, t };
473*fb1b10abSAndroid Build Coastguard Worker 
474*fb1b10abSAndroid Build Coastguard Worker   if (seg_skip) {
475*fb1b10abSAndroid Build Coastguard Worker     assert(mi->skip);
476*fb1b10abSAndroid Build Coastguard Worker   }
477*fb1b10abSAndroid Build Coastguard Worker 
478*fb1b10abSAndroid Build Coastguard Worker   if (mi->skip) {
479*fb1b10abSAndroid Build Coastguard Worker     if (!dry_run && !seg_skip) ++td->counts->skip[ctx][1];
480*fb1b10abSAndroid Build Coastguard Worker     reset_skip_context(xd, bsize);
481*fb1b10abSAndroid Build Coastguard Worker     return;
482*fb1b10abSAndroid Build Coastguard Worker   }
483*fb1b10abSAndroid Build Coastguard Worker 
484*fb1b10abSAndroid Build Coastguard Worker   if (!dry_run) {
485*fb1b10abSAndroid Build Coastguard Worker     ++td->counts->skip[ctx][0];
486*fb1b10abSAndroid Build Coastguard Worker     vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg);
487*fb1b10abSAndroid Build Coastguard Worker   } else {
488*fb1b10abSAndroid Build Coastguard Worker     vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg);
489*fb1b10abSAndroid Build Coastguard Worker   }
490*fb1b10abSAndroid Build Coastguard Worker }
491