Coverage Report

Created: 2025-08-28 07:12

/src/libvpx/vp9/encoder/vp9_tokenize.c
Line
Count
Source (jump to first uncovered line)
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
31.8M
                                  void *arg) {
320
31.8M
  struct tokenize_b_args *const args = arg;
321
31.8M
  ThreadData *const td = args->td;
322
31.8M
  MACROBLOCK *const x = &td->mb;
323
31.8M
  MACROBLOCKD *const xd = &x->e_mbd;
324
31.8M
  struct macroblock_plane *p = &x->plane[plane];
325
31.8M
  struct macroblockd_plane *pd = &xd->plane[plane];
326
31.8M
  vp9_set_contexts(xd, pd, plane_bsize, tx_size, p->eobs[block] > 0, col, row);
327
31.8M
}
328
329
static INLINE void add_token(TOKENEXTRA **t, const vpx_prob *context_tree,
330
                             int16_t token, EXTRABIT extra,
331
95.8M
                             unsigned int *counts) {
332
95.8M
  (*t)->context_tree = context_tree;
333
95.8M
  (*t)->token = token;
334
95.8M
  (*t)->extra = extra;
335
95.8M
  (*t)++;
336
95.8M
  ++counts[token];
337
95.8M
}
338
339
static INLINE void add_token_no_extra(TOKENEXTRA **t,
340
                                      const vpx_prob *context_tree,
341
35.0M
                                      int16_t token, unsigned int *counts) {
342
35.0M
  (*t)->context_tree = context_tree;
343
35.0M
  (*t)->token = token;
344
35.0M
  (*t)++;
345
35.0M
  ++counts[token];
346
35.0M
}
347
348
static void tokenize_b(int plane, int block, int row, int col,
349
9.56M
                       BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg) {
350
9.56M
  struct tokenize_b_args *const args = arg;
351
9.56M
  VP9_COMP *cpi = args->cpi;
352
9.56M
  ThreadData *const td = args->td;
353
9.56M
  MACROBLOCK *const x = &td->mb;
354
9.56M
  MACROBLOCKD *const xd = &x->e_mbd;
355
9.56M
  TOKENEXTRA **tp = args->tp;
356
9.56M
  uint8_t token_cache[32 * 32];
357
9.56M
  struct macroblock_plane *p = &x->plane[plane];
358
9.56M
  struct macroblockd_plane *pd = &xd->plane[plane];
359
9.56M
  MODE_INFO *mi = xd->mi[0];
360
9.56M
  int pt; /* near block/prev token context index */
361
9.56M
  int c;
362
9.56M
  TOKENEXTRA *t = *tp; /* store tokens starting here */
363
9.56M
  int eob = p->eobs[block];
364
9.56M
  const PLANE_TYPE type = get_plane_type(plane);
365
9.56M
  const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block);
366
9.56M
  const int16_t *scan, *nb;
367
9.56M
  const ScanOrder *so;
368
9.56M
  const int ref = is_inter_block(mi);
369
9.56M
  unsigned int(*const counts)[COEFF_CONTEXTS][ENTROPY_TOKENS] =
370
9.56M
      td->rd_counts.coef_counts[tx_size][type][ref];
371
9.56M
  vpx_prob(*const coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
372
9.56M
      cpi->common.fc->coef_probs[tx_size][type][ref];
373
9.56M
  unsigned int(*const eob_branch)[COEFF_CONTEXTS] =
374
9.56M
      td->counts->eob_branch[tx_size][type][ref];
375
9.56M
  const uint8_t *const band = get_band_translate(tx_size);
376
9.56M
  const int tx_eob = 16 << (tx_size << 1);
377
9.56M
  int16_t token;
378
9.56M
  EXTRABIT extra;
379
9.56M
  pt = get_entropy_context(tx_size, pd->above_context + col,
380
9.56M
                           pd->left_context + row);
381
9.56M
  so = get_scan(xd, tx_size, type, block);
382
9.56M
  scan = so->scan;
383
9.56M
  nb = so->neighbors;
384
9.56M
  c = 0;
385
386
105M
  while (c < eob) {
387
95.8M
    int v = 0;
388
95.8M
    v = qcoeff[scan[c]];
389
95.8M
    ++eob_branch[band[c]][pt];
390
391
125M
    while (!v) {
392
29.9M
      add_token_no_extra(&t, coef_probs[band[c]][pt], ZERO_TOKEN,
393
29.9M
                         counts[band[c]][pt]);
394
395
29.9M
      token_cache[scan[c]] = 0;
396
29.9M
      ++c;
397
29.9M
      pt = get_coef_context(nb, token_cache, c);
398
29.9M
      v = qcoeff[scan[c]];
399
29.9M
    }
400
401
95.8M
    vp9_get_token_extra(v, &token, &extra);
402
403
95.8M
    add_token(&t, coef_probs[band[c]][pt], token, extra, counts[band[c]][pt]);
404
405
95.8M
    token_cache[scan[c]] = vp9_pt_energy_class[token];
406
95.8M
    ++c;
407
95.8M
    pt = get_coef_context(nb, token_cache, c);
408
95.8M
  }
409
9.56M
  if (c < tx_eob) {
410
5.10M
    ++eob_branch[band[c]][pt];
411
5.10M
    add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN,
412
5.10M
                       counts[band[c]][pt]);
413
5.10M
  }
414
415
9.56M
  *tp = t;
416
417
9.56M
  vp9_set_contexts(xd, pd, plane_bsize, tx_size, c > 0, col, row);
418
9.56M
}
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.6M
                         BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *argv) {
427
15.6M
  struct is_skippable_args *args = argv;
428
15.6M
  (void)plane;
429
15.6M
  (void)plane_bsize;
430
15.6M
  (void)tx_size;
431
15.6M
  (void)row;
432
15.6M
  (void)col;
433
15.6M
  args->skippable[0] &= (!args->eobs[block]);
434
15.6M
}
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.91M
int vp9_is_skippable_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
439
3.91M
  int result = 1;
440
3.91M
  struct is_skippable_args args = { x->plane[plane].eobs, &result };
441
3.91M
  vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane, is_skippable,
442
3.91M
                                         &args);
443
3.91M
  return result;
444
3.91M
}
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.72M
                                void *argv) {
449
7.72M
  struct is_skippable_args *args = argv;
450
7.72M
  int eobs = (tx_size == TX_4X4) ? 3 : 10;
451
7.72M
  (void)plane;
452
7.72M
  (void)plane_bsize;
453
7.72M
  (void)row;
454
7.72M
  (void)col;
455
7.72M
  *(args->skippable) |= (args->eobs[block] > eobs);
456
7.72M
}
457
458
4.37M
int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
459
4.37M
  int result = 0;
460
4.37M
  struct is_skippable_args args = { x->plane[plane].eobs, &result };
461
4.37M
  vp9_foreach_transformed_block_in_plane(&x->e_mbd, bsize, plane,
462
4.37M
                                         has_high_freq_coeff, &args);
463
4.37M
  return result;
464
4.37M
}
465
466
void vp9_tokenize_sb(VP9_COMP *cpi, ThreadData *td, TOKENEXTRA **t, int dry_run,
467
8.26M
                     int seg_skip, BLOCK_SIZE bsize) {
468
8.26M
  MACROBLOCK *const x = &td->mb;
469
8.26M
  MACROBLOCKD *const xd = &x->e_mbd;
470
8.26M
  MODE_INFO *const mi = xd->mi[0];
471
8.26M
  const int ctx = vp9_get_skip_context(xd);
472
8.26M
  struct tokenize_b_args arg = { cpi, td, t };
473
474
8.26M
  if (seg_skip) {
475
0
    assert(mi->skip);
476
0
  }
477
478
8.26M
  if (mi->skip) {
479
1.42M
    if (!dry_run && !seg_skip) ++td->counts->skip[ctx][1];
480
1.42M
    reset_skip_context(xd, bsize);
481
1.42M
    return;
482
1.42M
  }
483
484
6.83M
  if (!dry_run) {
485
1.67M
    ++td->counts->skip[ctx][0];
486
1.67M
    vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg);
487
5.16M
  } else {
488
5.16M
    vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg);
489
5.16M
  }
490
6.83M
}