Coverage Report

Created: 2026-01-16 07:48

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