Coverage Report

Created: 2024-09-08 06:07

/src/brunsli/c/common/context.cc
Line
Count
Source
1
// Copyright (c) Google LLC 2019
2
//
3
// Use of this source code is governed by an MIT-style
4
// license that can be found in the LICENSE file or at
5
// https://opensource.org/licenses/MIT.
6
7
#include "./context.h"
8
9
#include "./platform.h"
10
#include <brunsli/types.h>
11
12
namespace brunsli {
13
14
static const double kSqrt2 = 1.414213562;
15
static const int kSqrt2FixedPoint =
16
    static_cast<int>(kSqrt2 * kACPredictPrecision);
17
18
void ComputeACPredictMultipliers(const int* quant,
19
                                 int* mult_row,
20
3.77k
                                 int* mult_col) {
21
34.0k
  for (size_t y = 0; y < 8; ++y) {
22
272k
    for (size_t x = 0; x < 8; ++x) {
23
241k
      mult_row[x + 8 * y] =
24
241k
          (quant[x + 8 * y] * kSqrt2FixedPoint) / quant[y * 8];
25
      // mult_col is transposed i.e. destination rows and columns are swapped.
26
241k
      mult_col[x * 8 + y] = (quant[x + 8 * y] * kSqrt2FixedPoint) / quant[x];
27
241k
    }
28
30.2k
  }
29
3.77k
}
30
31
// ComponentStateDC
32
33
4.40k
void ComponentStateDC::InitAll() {
34
4.40k
  is_zero_prob.Init(135);
35
44.0k
  for (size_t i = 0; i < sign_prob.size(); ++i) {
36
39.6k
    sign_prob[i].Init(128);
37
39.6k
  }
38
17.6k
  for (size_t i = 0; i < is_empty_block_prob.size(); ++i) {
39
13.2k
    is_empty_block_prob[i].Init(74);
40
13.2k
  }
41
48.4k
  for (size_t i = 0; i < first_extra_bit_prob.size(); ++i) {
42
44.0k
    first_extra_bit_prob[i].Init(150);
43
44.0k
  }
44
4.40k
}
45
46
// ComponentState
47
48
static const uint8_t kInitProb[64] = {
49
  // First probability (dc) and last of this table are unused.
50
  228, 216, 216, 195, 192, 189, 182, 184,
51
  179, 176, 171, 168, 166, 159, 156, 151,
52
  151, 150, 150, 146, 144, 138, 138, 137,
53
  135, 131, 127, 126, 124, 123, 124, 123,
54
  122, 121, 118, 117, 114, 115, 116, 116,
55
  115, 115, 114, 111, 111, 111, 112, 111,
56
  110, 110, 110, 111, 111, 114, 110, 111,
57
  112, 113, 116, 120, 126, 131, 147, 160,
58
};
59
60
static const uint8_t
61
    kInitProbNonzero[kNumNonZeroContextCount][kNumNonZeroTreeSize] = {
62
        {251, 252, 117, 249, 161, 136, 83,  238, 184, 126, 137, 129, 140,
63
         119, 70,  213, 160, 175, 174, 130, 166, 134, 122, 125, 131, 144,
64
         136, 133, 139, 123, 79,  216, 128, 128, 128, 128, 128, 128, 128,
65
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
66
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
67
        {254, 252, 174, 232, 189, 155, 122, 177, 204, 173, 146, 149, 141,
68
         133, 103, 109, 167, 187, 168, 142, 154, 147, 125, 139, 144, 138,
69
         138, 153, 141, 133, 90,  121, 128, 128, 128, 128, 128, 128, 128,
70
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
71
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
72
        {251, 240, 197, 176, 184, 177, 114, 89,  194, 165, 153, 161, 158,
73
         136, 92,  95,  123, 171, 160, 140, 148, 136, 129, 139, 145, 136,
74
         143, 134, 138, 124, 92,  154, 128, 128, 128, 128, 128, 128, 128,
75
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
76
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
77
        {247, 220, 201, 110, 194, 176, 147, 59,  175, 171, 156, 157, 152,
78
         146, 115, 114, 88,  151, 164, 141, 153, 135, 141, 131, 146, 139,
79
         140, 145, 138, 137, 112, 184, 128, 128, 128, 128, 128, 128, 128,
80
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
81
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
82
        {238, 179, 203, 63,  194, 173, 149, 71,  139, 169, 154, 159, 150,
83
         146, 117, 143, 78,  122, 152, 137, 149, 138, 138, 133, 134, 142,
84
         142, 142, 148, 128, 118, 199, 128, 128, 128, 128, 128, 128, 128,
85
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
86
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
87
        {227, 127, 200, 44,  192, 170, 148, 100, 102, 161, 156, 153, 148,
88
         149, 124, 160, 88,  101, 134, 132, 149, 145, 134, 134, 136, 141,
89
         138, 142, 144, 137, 116, 208, 128, 128, 128, 128, 128, 128, 128,
90
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
91
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
92
        {214, 86,  195, 44,  187, 163, 148, 126, 81,  147, 156, 152, 150,
93
         144, 121, 172, 96,  95,  117, 122, 145, 152, 136, 133, 135, 135,
94
         131, 142, 141, 135, 114, 217, 128, 128, 128, 128, 128, 128, 128,
95
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
96
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
97
        {198, 56,  191, 54,  171, 162, 147, 144, 74,  128, 152, 149, 150,
98
         142, 119, 177, 101, 100, 106, 111, 135, 154, 136, 137, 136, 132,
99
         133, 142, 144, 130, 117, 222, 128, 128, 128, 128, 128, 128, 128,
100
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
101
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
102
        {176, 40,  189, 73,  147, 159, 148, 152, 79,  106, 147, 149, 151,
103
         139, 123, 188, 108, 110, 106, 97,  125, 151, 137, 138, 135, 135,
104
         134, 136, 140, 131, 116, 221, 128, 128, 128, 128, 128, 128, 128,
105
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
106
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
107
        {148, 33,  185, 88,  117, 158, 145, 163, 95,  91,  137, 146, 150,
108
         140, 120, 197, 115, 116, 114, 92,  114, 144, 130, 133, 132, 133,
109
         129, 140, 138, 130, 111, 224, 128, 128, 128, 128, 128, 128, 128,
110
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
111
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
112
        {117, 31,  180, 104, 93,  150, 143, 166, 99,  85,  124, 139, 148,
113
         142, 118, 201, 105, 120, 120, 90,  107, 135, 127, 130, 131, 131,
114
         132, 140, 142, 133, 114, 229, 128, 128, 128, 128, 128, 128, 128,
115
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
116
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
117
        {87,  35,  170, 110, 78,  141, 144, 176, 106, 90,  112, 132, 143,
118
         138, 119, 204, 111, 121, 125, 90,  105, 131, 124, 122, 129, 128,
119
         129, 137, 138, 133, 114, 227, 128, 128, 128, 128, 128, 128, 128,
120
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
121
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
122
        {63,  42,  159, 123, 73,  127, 142, 191, 105, 91,  105, 123, 139,
123
         137, 120, 209, 117, 110, 122, 98,  110, 125, 115, 123, 122, 126,
124
         128, 134, 141, 129, 113, 229, 128, 128, 128, 128, 128, 128, 128,
125
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
126
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
127
        {45,  53,  146, 135, 71,  114, 138, 193, 100, 98,  98,  113, 133,
128
         135, 118, 222, 113, 111, 139, 103, 107, 126, 111, 119, 121, 122,
129
         127, 135, 141, 128, 114, 242, 128, 128, 128, 128, 128, 128, 128,
130
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
131
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
132
        {33,  60,  132, 138, 75,  100, 134, 203, 112, 99,  98,  105, 126,
133
         131, 115, 229, 107, 93,  121, 106, 108, 122, 106, 109, 114, 116,
134
         127, 133, 143, 128, 110, 242, 128, 128, 128, 128, 128, 128, 128,
135
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
136
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
137
        {24,  70,  118, 134, 76,  87,  130, 201, 110, 96,  99,  97,  119,
138
         130, 111, 229, 97,  104, 125, 102, 112, 125, 101, 109, 113, 114,
139
         125, 129, 142, 127, 112, 241, 128, 128, 128, 128, 128, 128, 128,
140
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
141
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
142
        {17,  65,  100, 121, 80,  75,  124, 174, 117, 100, 94,  93,  114,
143
         128, 110, 216, 103, 94,  113, 122, 118, 126, 113, 108, 105, 108,
144
         122, 128, 141, 125, 113, 238, 128, 128, 128, 128, 128, 128, 128,
145
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
146
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
147
        {12,  70,  82,  132, 78,  65,  118, 155, 136, 103, 97,  89,  106,
148
         124, 111, 215, 115, 123, 129, 99,  104, 127, 110, 108, 101, 109,
149
         118, 126, 136, 123, 110, 233, 128, 128, 128, 128, 128, 128, 128,
150
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
151
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
152
        {8,   66,  61,  117, 91,  59,  108, 195, 101, 112, 99,  99,  99,
153
         116, 106, 230, 127, 99,  144, 101, 118, 137, 117, 111, 106, 104,
154
         116, 121, 134, 122, 110, 223, 128, 128, 128, 128, 128, 128, 128,
155
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
156
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
157
        {6,   78,  42,  146, 101, 54,  94,  201, 116, 102, 110, 94,  92,
158
         108, 103, 214, 108, 111, 127, 102, 121, 132, 120, 121, 95,  98,
159
         110, 121, 129, 117, 107, 235, 128, 128, 128, 128, 128, 128, 128,
160
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
161
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
162
        {5,   93,  29,  145, 102, 52,  77,  216, 108, 115, 108, 102, 89,
163
         97,  94,  229, 89,  103, 139, 120, 103, 151, 102, 100, 97,  96,
164
         99,  111, 125, 116, 104, 242, 128, 128, 128, 128, 128, 128, 128,
165
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
166
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
167
        {4,   105, 21,  145, 100, 54,  64,  217, 100, 122, 128, 87,  88,
168
         91,  87,  230, 112, 80,  148, 95,  146, 123, 96,  140, 90,  91,
169
         98,  106, 122, 111, 100, 249, 128, 128, 128, 128, 128, 128, 128,
170
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
171
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
172
        {4,   130, 14,  142, 104, 56,  51,  208, 116, 135, 100, 89,  82,
173
         84,  75,  239, 85,  85,  122, 125, 94,  144, 151, 136, 92,  97,
174
         104, 109, 113, 110, 91,  246, 128, 128, 128, 128, 128, 128, 128,
175
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
176
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
177
        {3,   126, 9,   172, 105, 57,  39,  219, 95,  120, 118, 96,  93,
178
         75,  66,  241, 102, 134, 96,  156, 146, 162, 130, 112, 82,  89,
179
         97,  101, 116, 103, 82,  254, 128, 128, 128, 128, 128, 128, 128,
180
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
181
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
182
        {3,   149, 7,   182, 122, 54,  29,  224, 103, 100, 113, 96,  90,
183
         74,  55,  250, 127, 94,  118, 93,  135, 160, 113, 130, 95,  117,
184
         106, 96,  111, 97,  77,  242, 128, 128, 128, 128, 128, 128, 128,
185
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
186
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
187
        {3,   150, 4,   170, 138, 59,  20,  229, 91,  150, 107, 98,  92,
188
         68,  48,  245, 113, 64,  114, 111, 134, 127, 102, 104, 85,  118,
189
         103, 107, 102, 91,  72,  245, 128, 128, 128, 128, 128, 128, 128,
190
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
191
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
192
        {3,   171, 3,   165, 137, 62,  14,  211, 96,  127, 132, 121, 95,
193
         62,  37,  248, 102, 57,  144, 85,  127, 191, 102, 97,  127, 104,
194
         91,  102, 107, 81,  64,  254, 128, 128, 128, 128, 128, 128, 128,
195
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
196
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
197
        {2,   166, 2,   196, 122, 65,  10,  243, 102, 93,  117, 92,  96,
198
         63,  29,  251, 169, 159, 149, 96,  91,  139, 157, 40,  100, 89,
199
         120, 92,  109, 79,  58,  247, 128, 128, 128, 128, 128, 128, 128,
200
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
201
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
202
        {2,   176, 2,   189, 118, 48,  7,   219, 68,  43,  109, 96,  129,
203
         75,  19,  254, 2,   3,   185, 6,   102, 127, 127, 127, 1,   131,
204
         83,  99,  107, 80,  45,  254, 128, 128, 128, 128, 128, 128, 128,
205
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
206
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
207
        {1,   205, 2,   208, 64,  89,  4,   223, 29,  169, 29,  123, 118,
208
         76,  11,  240, 202, 243, 65,  6,   12,  243, 96,  55,  102, 102,
209
         114, 102, 107, 74,  31,  247, 128, 128, 128, 128, 128, 128, 128,
210
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
211
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
212
        {1,   216, 1,   214, 127, 94,  2,   234, 145, 3,   127, 106, 155,
213
         80,  4,   247, 4,   65,  86,  127, 127, 127, 127, 102, 127, 143,
214
         143, 108, 113, 80,  16,  216, 128, 128, 128, 128, 128, 128, 128,
215
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
216
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
217
        {2,   199, 1,   222, 93,  94,  1,   232, 2,   65,  74,  139, 201,
218
         48,  2,   254, 169, 127, 52,  243, 251, 249, 102, 86,  202, 153,
219
         65,  65,  146, 69,  8,   238, 128, 128, 128, 128, 128, 128, 128,
220
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
221
         128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}};
222
223
3.77k
void ComponentState::InitAll() {
224
45.3k
  for (int i = 0; i < kNumNonzeroBuckets; ++i) {
225
2.70M
    for (int k = 0; k < kDCTBlockSize; ++k) {
226
2.66M
      const int v = kInitProb[k] + 9 * (i - 7);
227
2.66M
      BRUNSLI_DCHECK(v <= 255);
228
2.66M
      is_zero_prob[i * kDCTBlockSize + k].Init(v);
229
2.66M
    }
230
41.5k
  }
231
4.11M
  for (size_t i = 0; i < sign_prob.size(); ++i) {
232
4.11M
    if (i < kMaxAverageContext * kDCTBlockSize) {
233
1.93M
      sign_prob[i].Init(108);
234
2.17M
    } else if (i < (kMaxAverageContext + 1) * kDCTBlockSize) {
235
241k
      sign_prob[i].Init(128);
236
1.93M
    } else {
237
1.93M
      sign_prob[i].Init(148);
238
1.93M
    }
239
4.11M
  }
240
2.42M
  for (size_t i = 0; i < first_extra_bit_prob.size(); ++i) {
241
2.41M
    first_extra_bit_prob[i].Init(158);
242
2.41M
  }
243
244
124k
  for (size_t i = 0; i < kNumNonZeroContextCount; ++i) {
245
120k
    Prob* non_zero_probs = num_nonzero_prob + i * kNumNonZeroTreeSize;
246
7.73M
    for (size_t j = 0; j < kNumNonZeroTreeSize; ++j) {
247
7.61M
      non_zero_probs[j].Init(kInitProbNonzero[i][j]);
248
7.61M
    }
249
120k
  }
250
3.77k
}
251
252
}  // namespace brunsli