Coverage Report

Created: 2024-09-06 07:53

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