Coverage Report

Created: 2026-10-17 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/brunsli/c/dec/brunsli_decode.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 <brotli/decode.h>
8
#include <brunsli/brunsli_decode.h>
9
#include <brunsli/jpeg_data.h>
10
#include <brunsli/status.h>
11
#include <brunsli/types.h>
12
13
#include <algorithm>
14
#include <cstdlib>
15
#include <cstring>
16
#include <iterator>
17
#include <string>
18
#include <vector>
19
20
#include "../common/ans_params.h"
21
#include "../common/constants.h"
22
#include "../common/context.h"
23
#include "../common/distributions.h"
24
#include "../common/lehmer_code.h"
25
#include "../common/platform.h"
26
#include "../common/predict.h"
27
#include "../common/quant_matrix.h"
28
#include "./ans_decode.h"
29
#include "./arith_decode.h"
30
#include "./bit_reader.h"
31
#include "./brunsli_input.h"
32
#include "./context_map_decode.h"
33
#include "./histogram_decode.h"
34
#include "./state.h"
35
#include "./state_internal.h"
36
37
namespace brunsli {
38
39
using ::brunsli::internal::dec::AcDcState;
40
using ::brunsli::internal::dec::BlockI32;
41
using ::brunsli::internal::dec::Buffer;
42
using ::brunsli::internal::dec::ComponentMeta;
43
using ::brunsli::internal::dec::FallbackState;
44
using ::brunsli::internal::dec::HeaderState;
45
using ::brunsli::internal::dec::HistogramDataState;
46
using ::brunsli::internal::dec::InternalState;
47
using ::brunsli::internal::dec::JpegInternalsState;
48
using ::brunsli::internal::dec::MetadataDecompressionStage;
49
using ::brunsli::internal::dec::MetadataState;
50
using ::brunsli::internal::dec::PrepareMeta;
51
using ::brunsli::internal::dec::QuantDataState;
52
using ::brunsli::internal::dec::SectionHeaderState;
53
using ::brunsli::internal::dec::SectionState;
54
using ::brunsli::internal::dec::SerializationStatus;
55
using ::brunsli::internal::dec::Stage;
56
using ::brunsli::internal::dec::State;
57
using ::brunsli::internal::dec::UpdateSubsamplingDerivatives;
58
using ::brunsli::internal::dec::VarintState;
59
60
static const int kNumDirectCodes = 8;
61
static const int kCoeffAlphabetSize = kNumDirectCodes + 10;
62
63
static const uint32_t kKnownSectionTags =
64
    (1u << kBrunsliSignatureTag) | (1u << kBrunsliHeaderTag) |
65
    (1u << kBrunsliMetaDataTag) | (1u << kBrunsliJPEGInternalsTag) |
66
    (1u << kBrunsliQuantDataTag) | (1u << kBrunsliHistogramDataTag) |
67
    (1u << kBrunsliDCDataTag) | (1u << kBrunsliACDataTag) |
68
    (1u << kBrunsliOriginalJpgTag);
69
70
static const uint32_t kKnownHeaderVarintTags =
71
    (1u << kBrunsliHeaderWidthTag) | (1u << kBrunsliHeaderHeightTag) |
72
    (1u << kBrunsliHeaderVersionCompTag) | (1u << kBrunsliHeaderSubsamplingTag);
73
74
0
bool IsBrunsli(const uint8_t* data, const size_t len) {
75
0
  static const uint8_t kSignature[6] = {
76
0
      /* marker */ 0x0A,
77
0
      /* length */ 0x04, 0x42, 0xD2, 0xD5, 0x4E};
78
0
  static const size_t kSignatureLen = sizeof(kSignature);
79
0
  if (len < kSignatureLen) return false;
80
0
  return (memcmp(kSignature, data, kSignatureLen) == 0);
81
0
}
82
83
// Returns ceil(a/b).
84
31.2k
inline int DivCeil(int a, int b) { return (a + b - 1) / b; }
85
86
// Decodes a number in the range [0..255], by reading 1 - 11 bits.
87
6.63k
inline uint32_t DecodeVarLenUint8(BrunsliBitReader* br) {
88
6.63k
  if (BrunsliBitReaderRead(br, 1)) {
89
1.11k
    uint32_t nbits = BrunsliBitReaderRead(br, 3);
90
1.11k
    if (nbits == 0) {
91
431
      return 1u;
92
687
    } else {
93
687
      return BrunsliBitReaderRead(br, nbits) + (1u << nbits);
94
687
    }
95
1.11k
  }
96
5.52k
  return 0;
97
6.63k
}
98
99
1.31M
bool DecodeVarint(VarintState* s, BrunsliBitReader* br, size_t max_bits) {
100
1.31M
  if (s->stage == VarintState::INIT) {
101
1.31M
    s->value = 0;
102
1.31M
    s->i = 0;
103
1.31M
    s->stage = VarintState::READ_CONTINUATION;
104
1.31M
  }
105
106
7.43M
  while (true) {
107
7.43M
    switch (s->stage) {
108
4.37M
      case VarintState::READ_CONTINUATION: {
109
4.37M
        if (s->i >= max_bits) {
110
478
          s->stage = VarintState::INIT;
111
478
          return true;
112
478
        }
113
4.37M
        if (s->i + 1 != max_bits) {
114
4.37M
          if (!BrunsliBitReaderCanRead(br, 1)) return false;
115
4.37M
          if (!BrunsliBitReaderRead(br, 1)) {
116
1.31M
            s->stage = VarintState::INIT;
117
1.31M
            return true;
118
1.31M
          }
119
4.37M
        }
120
3.06M
        s->stage = VarintState::READ_DATA;
121
3.06M
        continue;
122
4.37M
      }
123
3.06M
      case VarintState::READ_DATA: {
124
3.06M
        if (!BrunsliBitReaderCanRead(br, 1)) return false;
125
3.06M
        size_t next_bit = BrunsliBitReaderRead(br, 1);
126
3.06M
        s->value |= next_bit << s->i;
127
3.06M
        ++s->i;
128
3.06M
        s->stage = VarintState::READ_CONTINUATION;
129
3.06M
        continue;
130
3.06M
      }
131
0
      default: {
132
0
        BRUNSLI_CHECK(false);
133
0
        return false;
134
3.06M
      }
135
7.43M
    }
136
7.43M
  }
137
1.31M
}
138
139
template <size_t kChunkSize>
140
bool DecodeLimitedVarint(VarintState* s, BrunsliBitReader* br,
141
85.4k
                         size_t max_symbols) {
142
85.4k
  if (s->stage == VarintState::INIT) {
143
85.4k
    s->value = 0;
144
85.4k
    s->i = 0;
145
85.4k
    s->stage = VarintState::READ_CONTINUATION;
146
85.4k
  }
147
125k
  while (true) {
148
125k
    switch (s->stage) {
149
105k
      case VarintState::READ_CONTINUATION: {
150
105k
        if (s->i < max_symbols) {
151
103k
          if (!BrunsliBitReaderCanRead(br, 1)) return false;
152
103k
          if (BrunsliBitReaderRead(br, 1)) {
153
19.9k
            s->stage = VarintState::READ_DATA;
154
19.9k
            continue;
155
19.9k
          }
156
103k
        }
157
85.2k
        s->stage = VarintState::INIT;
158
85.2k
        return true;
159
105k
      }
160
19.9k
      case VarintState::READ_DATA: {
161
19.9k
        if (!BrunsliBitReaderCanRead(br, kChunkSize)) return false;
162
19.8k
        size_t next_bits = BrunsliBitReaderRead(br, kChunkSize);
163
19.8k
        s->value |= next_bits << (s->i * kChunkSize);
164
19.8k
        ++s->i;
165
19.8k
        s->stage = VarintState::READ_CONTINUATION;
166
19.8k
        continue;
167
19.9k
      }
168
0
      default: {
169
0
        BRUNSLI_CHECK(false);
170
0
        return false;
171
19.9k
      }
172
125k
    }
173
125k
  }
174
85.4k
}
bool brunsli::DecodeLimitedVarint<2ul>(brunsli::internal::dec::VarintState*, brunsli::BrunsliBitReader*, unsigned long)
Line
Count
Source
141
76.1k
                         size_t max_symbols) {
142
76.1k
  if (s->stage == VarintState::INIT) {
143
76.1k
    s->value = 0;
144
76.1k
    s->i = 0;
145
76.1k
    s->stage = VarintState::READ_CONTINUATION;
146
76.1k
  }
147
114k
  while (true) {
148
114k
    switch (s->stage) {
149
95.1k
      case VarintState::READ_CONTINUATION: {
150
95.1k
        if (s->i < max_symbols) {
151
93.0k
          if (!BrunsliBitReaderCanRead(br, 1)) return false;
152
93.0k
          if (BrunsliBitReaderRead(br, 1)) {
153
19.0k
            s->stage = VarintState::READ_DATA;
154
19.0k
            continue;
155
19.0k
          }
156
93.0k
        }
157
76.0k
        s->stage = VarintState::INIT;
158
76.0k
        return true;
159
95.1k
      }
160
19.0k
      case VarintState::READ_DATA: {
161
19.0k
        if (!BrunsliBitReaderCanRead(br, kChunkSize)) return false;
162
19.0k
        size_t next_bits = BrunsliBitReaderRead(br, kChunkSize);
163
19.0k
        s->value |= next_bits << (s->i * kChunkSize);
164
19.0k
        ++s->i;
165
19.0k
        s->stage = VarintState::READ_CONTINUATION;
166
19.0k
        continue;
167
19.0k
      }
168
0
      default: {
169
0
        BRUNSLI_CHECK(false);
170
0
        return false;
171
19.0k
      }
172
114k
    }
173
114k
  }
174
76.1k
}
bool brunsli::DecodeLimitedVarint<8ul>(brunsli::internal::dec::VarintState*, brunsli::BrunsliBitReader*, unsigned long)
Line
Count
Source
141
9.29k
                         size_t max_symbols) {
142
9.29k
  if (s->stage == VarintState::INIT) {
143
9.29k
    s->value = 0;
144
9.29k
    s->i = 0;
145
9.29k
    s->stage = VarintState::READ_CONTINUATION;
146
9.29k
  }
147
11.0k
  while (true) {
148
11.0k
    switch (s->stage) {
149
10.1k
      case VarintState::READ_CONTINUATION: {
150
10.1k
        if (s->i < max_symbols) {
151
10.1k
          if (!BrunsliBitReaderCanRead(br, 1)) return false;
152
10.0k
          if (BrunsliBitReaderRead(br, 1)) {
153
880
            s->stage = VarintState::READ_DATA;
154
880
            continue;
155
880
          }
156
10.0k
        }
157
9.20k
        s->stage = VarintState::INIT;
158
9.20k
        return true;
159
10.1k
      }
160
880
      case VarintState::READ_DATA: {
161
880
        if (!BrunsliBitReaderCanRead(br, kChunkSize)) return false;
162
831
        size_t next_bits = BrunsliBitReaderRead(br, kChunkSize);
163
831
        s->value |= next_bits << (s->i * kChunkSize);
164
831
        ++s->i;
165
831
        s->stage = VarintState::READ_CONTINUATION;
166
831
        continue;
167
880
      }
168
0
      default: {
169
0
        BRUNSLI_CHECK(false);
170
0
        return false;
171
880
      }
172
11.0k
    }
173
11.0k
  }
174
9.29k
}
175
176
15.5k
std::vector<uint8_t> GenerateApp0Marker(uint8_t app0_status) {
177
15.5k
  std::vector<uint8_t> app0_marker(AppData_0xe0, AppData_0xe0 + 17);
178
15.5k
  app0_marker[9] = app0_status & 1u ? 2 : 1;
179
15.5k
  app0_status >>= 1u;
180
15.5k
  app0_marker[10] = app0_status & 0x3u;
181
15.5k
  app0_status >>= 2u;
182
15.5k
  uint16_t x_dens = kApp0Densities[app0_status];
183
15.5k
  app0_marker[11] = app0_marker[13] = x_dens >> 8u;
184
15.5k
  app0_marker[12] = app0_marker[14] = x_dens & 0xFFu;
185
15.5k
  return app0_marker;
186
15.5k
}
187
188
5.76k
std::vector<uint8_t> GenerateAppMarker(uint8_t marker, uint8_t code) {
189
5.76k
  std::vector<uint8_t> s;
190
5.76k
  if (marker == 0x80) {
191
1.22k
    s = std::vector<uint8_t>(AppData_0xe2, AppData_0xe2 + 3161);
192
1.22k
    s[84] = code;
193
4.54k
  } else if (marker == 0x81) {
194
2.14k
    s = std::vector<uint8_t>(AppData_0xec, AppData_0xec + 18);
195
2.14k
    s[15] = code;
196
2.39k
  } else {
197
2.39k
    BRUNSLI_DCHECK(marker == 0x82);
198
2.39k
    s = std::vector<uint8_t>(AppData_0xee, AppData_0xee + 15);
199
2.39k
    s[10] = code;
200
2.39k
  }
201
5.76k
  return s;
202
5.76k
}
203
204
bool ProcessMetaData(const uint8_t* data, size_t len, MetadataState* state,
205
196k
                     JPEGData* jpg) {
206
196k
  size_t pos = 0;
207
507k
  while (pos < len) {
208
310k
    switch (state->stage) {
209
44.2k
      case MetadataState::READ_MARKER: {
210
44.2k
        state->marker = static_cast<uint8_t>(data[pos++]);
211
44.2k
        if (state->marker == 0xD9) {
212
154
          jpg->tail_data = std::vector<uint8_t>();
213
154
          state->stage = MetadataState::READ_TAIL;
214
154
          continue;
215
44.1k
        } else if (state->marker < 0x40) {
216
15.5k
          state->short_marker_count++;
217
15.5k
          if (state->short_marker_count > kBrunsliShortMarkerLimit) {
218
11
            return false;
219
11
          }
220
15.5k
          jpg->app_data.push_back(GenerateApp0Marker(state->marker));
221
15.5k
          continue;
222
28.6k
        } else if (state->marker >= 0x80 && state->marker <= 0x82) {
223
5.77k
          state->short_marker_count++;
224
5.77k
          if (state->short_marker_count > kBrunsliShortMarkerLimit) {
225
3
            return false;
226
3
          }
227
5.77k
          state->stage = MetadataState::READ_CODE;
228
5.77k
          continue;
229
5.77k
        }
230
        // Otherwise - multibyte sequence.
231
22.8k
        if ((state->marker != 0xFE) && ((state->marker >> 4u) != 0x0E)) {
232
183
          return false;
233
183
        }
234
22.6k
        state->stage = MetadataState::READ_LENGTH_HI;
235
22.6k
        continue;
236
22.8k
      }
237
238
29.9k
      case MetadataState::READ_TAIL: {
239
29.9k
        Append(&jpg->tail_data, data + pos, data + len);
240
29.9k
        pos = len;
241
29.9k
        continue;
242
22.8k
      }
243
244
5.76k
      case MetadataState::READ_CODE: {
245
5.76k
        const uint8_t code = data[pos++];
246
5.76k
        jpg->app_data.push_back(GenerateAppMarker(state->marker, code));
247
5.76k
        state->stage = MetadataState::READ_MARKER;
248
5.76k
        continue;
249
22.8k
      }
250
251
22.6k
      case MetadataState::READ_LENGTH_HI: {
252
22.6k
        state->length_hi = data[pos++];
253
22.6k
        state->stage = MetadataState::READ_LENGTH_LO;
254
22.6k
        continue;
255
22.8k
      }
256
257
22.6k
      case MetadataState::READ_LENGTH_LO: {
258
22.6k
        const uint8_t lo = data[pos++];
259
22.6k
        size_t marker_len = (state->length_hi << 8u) + lo;
260
22.6k
        if (marker_len < 2) return false;
261
22.6k
        state->remaining_multibyte_length = marker_len - 2;
262
22.6k
        uint8_t head[3] = {state->marker, state->length_hi, lo};
263
22.6k
        auto* dest = (state->marker == 0xFE) ? &jpg->com_data : &jpg->app_data;
264
22.6k
        size_t delta = (state->marker == 0xFE) ? 0 : state->short_marker_count;
265
22.6k
        if (dest->size() - delta >= kBrunsliMultibyteMarkerLimit) {
266
1
          return false;
267
1
        }
268
22.6k
        dest->emplace_back(head, head + 3);
269
22.6k
        state->multibyte_sink = &dest->back();
270
        // Turn state machine to default state in case there is no payload in
271
        // multibyte sequence. This is important when such a sequence concludes
272
        // the input.
273
22.6k
        state->stage = (state->remaining_multibyte_length > 0)
274
22.6k
                           ? MetadataState::READ_MULTIBYTE
275
22.6k
                           : MetadataState::READ_MARKER;
276
22.6k
        continue;
277
22.6k
      }
278
279
185k
      case MetadataState::READ_MULTIBYTE: {
280
185k
        size_t chunk_size =
281
185k
            std::min(state->remaining_multibyte_length, len - pos);
282
185k
        Append(state->multibyte_sink, data + pos, chunk_size);
283
185k
        state->remaining_multibyte_length -= chunk_size;
284
185k
        pos += chunk_size;
285
185k
        if (state->remaining_multibyte_length == 0) {
286
21.4k
          state->stage = MetadataState::READ_MARKER;
287
21.4k
        }
288
185k
        continue;
289
22.6k
      }
290
291
0
      default:
292
0
        return false;
293
310k
    }
294
310k
  }
295
196k
  return true;
296
196k
}
297
298
10.7k
static BrunsliStatus DecodeHuffmanCode(State* state, JPEGData* jpg) {
299
10.7k
  InternalState& s = *state->internal;
300
10.7k
  JpegInternalsState& js = s.internals;
301
10.7k
  BrunsliBitReader* br = &js.br;
302
303
229k
  while (true) {
304
229k
    switch (js.stage) {
305
27.6k
      case JpegInternalsState::READ_HUFFMAN_LAST: {
306
27.6k
        if (!BrunsliBitReaderCanRead(br, 1)) return BRUNSLI_NOT_ENOUGH_DATA;
307
27.6k
        js.is_known_last_huffman_code = BrunsliBitReaderRead(br, 1);
308
27.6k
        jpg->huffman_code.emplace_back();
309
27.6k
        js.stage = JpegInternalsState::READ_HUFFMAN_SIMPLE;
310
27.6k
        continue;
311
27.6k
      }
312
27.6k
      case JpegInternalsState::READ_HUFFMAN_SIMPLE: {
313
27.6k
        if (!BrunsliBitReaderCanRead(br, 5 + !js.is_known_last_huffman_code)) {
314
188
          return BRUNSLI_NOT_ENOUGH_DATA;
315
188
        }
316
27.4k
        JPEGHuffmanCode* huff = &jpg->huffman_code.back();
317
318
27.4k
        huff->slot_id = BrunsliBitReaderRead(br, 2);
319
27.4k
        js.is_dc_table = (BrunsliBitReaderRead(br, 1) == 0);
320
27.4k
        huff->slot_id += js.is_dc_table ? 0 : 0x10;
321
27.4k
        huff->is_last =
322
27.4k
            js.is_known_last_huffman_code || BrunsliBitReaderRead(br, 1);
323
27.4k
        huff->counts[0] = 0;
324
27.4k
        int found_match = BrunsliBitReaderRead(br, 1);
325
27.4k
        if (found_match) {
326
16.1k
          if (js.is_dc_table) {
327
8.88k
            int huff_table_idx = BrunsliBitReaderRead(br, 1);
328
8.88k
            memcpy(&huff->counts[1], kStockDCHuffmanCodeCounts[huff_table_idx],
329
8.88k
                   sizeof(kStockDCHuffmanCodeCounts[0]));
330
8.88k
            memcpy(&huff->values[0], kStockDCHuffmanCodeValues[huff_table_idx],
331
8.88k
                   sizeof(kStockDCHuffmanCodeValues[0]));
332
8.88k
          } else {
333
7.30k
            int huff_table_idx = BrunsliBitReaderRead(br, 1);
334
7.30k
            memcpy(&huff->counts[1], kStockACHuffmanCodeCounts[huff_table_idx],
335
7.30k
                   sizeof(kStockACHuffmanCodeCounts[0]));
336
7.30k
            memcpy(&huff->values[0], kStockACHuffmanCodeValues[huff_table_idx],
337
7.30k
                   sizeof(kStockACHuffmanCodeValues[0]));
338
7.30k
          }
339
16.1k
          js.stage = JpegInternalsState::HUFFMAN_UPDATE;
340
16.1k
        } else {
341
          // One less bit is used than requested, but it is guaranteed to be
342
          // consumed in complex Huffman code case.
343
11.2k
          js.p.Init(js.is_dc_table
344
11.2k
                        ? std::vector<uint8_t>(kDefaultDCValues,
345
8.07k
                                               std::end(kDefaultDCValues))
346
11.2k
                        : std::vector<uint8_t>(kDefaultACValues,
347
3.14k
                                               std::end(kDefaultACValues)));
348
11.2k
          js.stage = JpegInternalsState::READ_HUFFMAN_MAX_LEN;
349
11.2k
        }
350
27.4k
        continue;
351
27.6k
      }
352
11.2k
      case JpegInternalsState::READ_HUFFMAN_MAX_LEN: {
353
11.2k
        if (!BrunsliBitReaderCanRead(br, 4)) return BRUNSLI_NOT_ENOUGH_DATA;
354
11.1k
        js.max_len = BrunsliBitReaderRead(br, 4) + 1;
355
11.1k
        js.total_count = 0;
356
11.1k
        js.max_count =
357
11.1k
            js.is_dc_table ? kJpegDCAlphabetSize : kJpegHuffmanAlphabetSize;
358
11.1k
        js.space = (1u << kJpegHuffmanMaxBitLength) -
359
11.1k
                   (1u << (kJpegHuffmanMaxBitLength - js.max_len));
360
11.1k
        js.i = 1;
361
11.1k
        js.stage = JpegInternalsState::READ_HUFFMAN_COUNT;
362
11.1k
        continue;
363
11.2k
      }
364
48.9k
      case JpegInternalsState::READ_HUFFMAN_COUNT: {
365
48.9k
        JPEGHuffmanCode* huff = &jpg->huffman_code.back();
366
48.9k
        if (js.i <= js.max_len) {
367
37.7k
          size_t shift = kJpegHuffmanMaxBitLength - js.i;
368
37.7k
          size_t count_limit =
369
37.7k
              std::min(js.max_count - js.total_count, js.space >> shift);
370
37.7k
          if (count_limit > 0) {
371
36.2k
            int nbits =
372
36.2k
                Log2FloorNonZero(static_cast<uint32_t>(count_limit)) + 1;
373
36.2k
            if (!BrunsliBitReaderCanRead(br, nbits)) {
374
61
              return BRUNSLI_NOT_ENOUGH_DATA;
375
61
            }
376
36.2k
            size_t count = BrunsliBitReaderRead(br, nbits);
377
36.2k
            if (count > count_limit) {
378
7
              return BRUNSLI_INVALID_BRN;
379
7
            }
380
36.2k
            huff->counts[js.i] = static_cast<int>(count);
381
36.2k
            js.total_count += count;
382
36.2k
            js.space -= count * (static_cast<size_t>(1) << shift);
383
36.2k
          }
384
37.7k
          ++js.i;
385
37.7k
          continue;
386
37.7k
        }
387
11.1k
        ++huff->counts[js.max_len];
388
11.1k
        js.i = 0;
389
11.1k
        js.stage = JpegInternalsState::READ_HUFFMAN_PERMUTATION;
390
11.1k
        continue;
391
48.9k
      }
392
87.1k
      case JpegInternalsState::READ_HUFFMAN_PERMUTATION: {
393
87.1k
        JPEGHuffmanCode* huff = &jpg->huffman_code.back();
394
87.1k
        if (js.i < js.total_count) {
395
76.1k
          const int nbits = js.p.num_bits();
396
76.1k
          if (!DecodeLimitedVarint<2>(&js.varint, br, (nbits + 1) >> 1u)) {
397
60
            return BRUNSLI_NOT_ENOUGH_DATA;
398
60
          }
399
76.0k
          uint8_t value;
400
76.0k
          if (!js.p.Remove(js.varint.value, &value)) {
401
11
            return BRUNSLI_INVALID_BRN;
402
11
          }
403
76.0k
          huff->values[js.i] = value;
404
76.0k
          ++js.i;
405
76.0k
          continue;
406
76.0k
        }
407
11.0k
        huff->values[js.total_count] = kJpegHuffmanAlphabetSize;
408
11.0k
        js.stage = JpegInternalsState::HUFFMAN_UPDATE;
409
11.0k
        continue;
410
87.1k
      }
411
27.2k
      case JpegInternalsState::HUFFMAN_UPDATE: {
412
        // This stage does not perform reading -> transient.
413
27.2k
        if (jpg->huffman_code.back().is_last) {
414
12.6k
          js.terminal_huffman_code_count++;
415
12.6k
        }
416
27.2k
        if (js.is_known_last_huffman_code) {
417
10.4k
          js.p.Clear();
418
10.4k
          return BRUNSLI_OK;
419
10.4k
        }
420
16.8k
        if (jpg->huffman_code.size() >= kMaxDHTMarkers) {
421
          // Too many Huffman codes for a valid bit-stream. Normally, a jpeg
422
          // file can have any arbitrary number of DHT, DQT, etc. But i prefer
423
          // we force a reasonable lower bound instead of open door to likely
424
          // forged BRN input.
425
1
          return BRUNSLI_INVALID_BRN;
426
1
        }
427
16.8k
        js.stage = JpegInternalsState::READ_HUFFMAN_LAST;
428
16.8k
        continue;
429
16.8k
      }
430
0
      default:
431
0
        return BRUNSLI_DECOMPRESSION_ERROR;
432
229k
    }
433
229k
  }
434
0
  return BRUNSLI_OK;
435
10.7k
}
436
437
4.53k
BrunsliStatus DecodeScanInfo(State* state, JPEGData* jpg) {
438
4.53k
  InternalState& s = *state->internal;
439
4.53k
  JpegInternalsState& js = s.internals;
440
4.53k
  BrunsliBitReader* br = &js.br;
441
442
1.08M
  const auto maybe_add_zero_run = [&js, jpg]() {
443
1.08M
    if (js.last_num > 0) {
444
1.07M
      JPEGScanInfo::ExtraZeroRunInfo info;
445
1.07M
      info.block_idx = js.last_block_idx;
446
1.07M
      info.num_extra_zero_runs = js.last_num;
447
1.07M
      jpg->scan_info[js.i].extra_zero_runs.push_back(info);
448
1.07M
      js.last_num = 0;
449
1.07M
    }
450
1.08M
  };
451
452
2.67M
  while (true) {
453
2.67M
    switch (js.stage) {
454
7.91k
      case JpegInternalsState::READ_SCAN_COMMON: {
455
7.91k
        JPEGScanInfo* si = &jpg->scan_info[js.i];
456
7.91k
        if (!BrunsliBitReaderCanRead(br, 22)) return BRUNSLI_NOT_ENOUGH_DATA;
457
7.75k
        si->Ss = BrunsliBitReaderRead(br, 6);
458
7.75k
        si->Se = BrunsliBitReaderRead(br, 6);
459
7.75k
        si->Ah = BrunsliBitReaderRead(br, 4);
460
7.75k
        si->Al = BrunsliBitReaderRead(br, 4);
461
7.75k
        si->num_components = BrunsliBitReaderRead(br, 2) + 1;
462
7.75k
        js.j = 0;
463
7.75k
        js.stage = JpegInternalsState::READ_SCAN_COMPONENT;
464
7.75k
        continue;
465
7.91k
      }
466
26.0k
      case JpegInternalsState::READ_SCAN_COMPONENT: {
467
26.0k
        JPEGScanInfo* si = &jpg->scan_info[js.i];
468
26.0k
        if (js.j < si->num_components) {
469
18.3k
          if (!BrunsliBitReaderCanRead(br, 6)) return BRUNSLI_NOT_ENOUGH_DATA;
470
18.2k
          si->components[js.j].comp_idx = BrunsliBitReaderRead(br, 2);
471
18.2k
          si->components[js.j].dc_tbl_idx = BrunsliBitReaderRead(br, 2);
472
18.2k
          si->components[js.j].ac_tbl_idx = BrunsliBitReaderRead(br, 2);
473
18.2k
          js.j++;
474
18.2k
        } else {
475
7.70k
          js.last_block_idx = -1;
476
7.70k
          js.stage = JpegInternalsState::READ_SCAN_RESET_POINT_CONTINUATION;
477
7.70k
        }
478
25.9k
        continue;
479
26.0k
      }
480
61.5k
      case JpegInternalsState::READ_SCAN_RESET_POINT_CONTINUATION: {
481
61.5k
        if (!BrunsliBitReaderCanRead(br, 1)) return BRUNSLI_NOT_ENOUGH_DATA;
482
61.4k
        if (BrunsliBitReaderRead(br, 1)) {
483
53.8k
          js.stage = JpegInternalsState::READ_SCAN_RESET_POINT_DATA;
484
53.8k
        } else {
485
7.65k
          js.last_block_idx = 0;
486
7.65k
          js.last_num = 0;
487
7.65k
          js.stage = JpegInternalsState::READ_SCAN_ZERO_RUN_CONTINUATION;
488
7.65k
        }
489
61.4k
        continue;
490
61.5k
      }
491
53.8k
      case JpegInternalsState::READ_SCAN_RESET_POINT_DATA: {
492
53.8k
        JPEGScanInfo* si = &jpg->scan_info[js.i];
493
53.8k
        if (!DecodeVarint(&js.varint, br, 28)) return BRUNSLI_NOT_ENOUGH_DATA;
494
53.8k
        int block_idx =
495
53.8k
            js.last_block_idx + static_cast<int>(js.varint.value) + 1;
496
53.8k
        si->reset_points.emplace_back(block_idx);
497
53.8k
        js.last_block_idx = block_idx;
498
        // TODO(eustas): limit to exact number of blocks.
499
53.8k
        if (js.last_block_idx > (1 << 30)) {
500
          // At most 8K x 8K x num_channels blocks are expected. That is,
501
          // typically, 1.5 * 2^27. 2^30 should be sufficient for any sane
502
          // image.
503
1
          return BRUNSLI_INVALID_BRN;
504
1
        }
505
53.8k
        js.stage = JpegInternalsState::READ_SCAN_RESET_POINT_CONTINUATION;
506
53.8k
        continue;
507
53.8k
      }
508
1.26M
      case JpegInternalsState::READ_SCAN_ZERO_RUN_CONTINUATION: {
509
1.26M
        if (!BrunsliBitReaderCanRead(br, 1)) return BRUNSLI_NOT_ENOUGH_DATA;
510
1.26M
        if (BrunsliBitReaderRead(br, 1)) {
511
1.25M
          js.stage = JpegInternalsState::READ_SCAN_ZERO_RUN_DATA;
512
1.25M
        } else {
513
7.58k
          maybe_add_zero_run();
514
7.58k
          ++js.i;
515
7.58k
          if (js.i < js.num_scans) {
516
3.38k
            js.stage = JpegInternalsState::READ_SCAN_COMMON;
517
3.38k
            continue;
518
3.38k
          }
519
4.19k
          return BRUNSLI_OK;
520
7.58k
        }
521
1.25M
        continue;
522
1.26M
      }
523
1.25M
      case JpegInternalsState::READ_SCAN_ZERO_RUN_DATA: {
524
1.25M
        if (!DecodeVarint(&js.varint, br, 28)) return BRUNSLI_NOT_ENOUGH_DATA;
525
1.25M
        int block_idx = js.last_block_idx + static_cast<int>(js.varint.value);
526
1.25M
        if (block_idx > js.last_block_idx) maybe_add_zero_run();
527
1.25M
        ++js.last_num;
528
1.25M
        js.last_block_idx = block_idx;
529
        // TODO(eustas): limit to exact number of blocks.
530
1.25M
        if (js.last_block_idx > (1 << 30)) {
531
          // At most 8K x 8K x num_channels blocks are expected. That is,
532
          // typically, 1.5 * 2^27. 2^30 should be sufficient for any sane
533
          // image.
534
1
          return BRUNSLI_INVALID_BRN;
535
1
        }
536
1.25M
        js.stage = JpegInternalsState::READ_SCAN_ZERO_RUN_CONTINUATION;
537
1.25M
        continue;
538
1.25M
      }
539
0
      default:
540
0
        return BRUNSLI_DECOMPRESSION_ERROR;
541
2.67M
    }
542
2.67M
  }
543
4.53k
}
544
545
static bool BRUNSLI_NOINLINE DecodeCoeffOrder(uint32_t* order, BitSource* br,
546
5.27k
                                              WordSource* in) {
547
5.27k
  uint32_t lehmer[kDCTBlockSize] = {0};
548
5.27k
  static const int kSpan = 16;
549
26.3k
  for (int i = 0; i < kDCTBlockSize; i += kSpan) {
550
21.0k
    if (!br->ReadBits(1, in)) continue;  // span is all-zero
551
2.59k
    const int start = (i > 0) ? i : 1;
552
2.59k
    const int end = i + kSpan;
553
42.2k
    for (int j = start; j < end; ++j) {
554
39.6k
      uint32_t v = 0;
555
50.5k
      while (v <= kDCTBlockSize) {
556
50.5k
        const uint32_t bits = br->ReadBits(3, in);
557
50.5k
        v += bits;
558
50.5k
        if (bits < 7) break;
559
50.5k
      }
560
39.6k
      if (v > kDCTBlockSize) return false;
561
39.6k
      lehmer[j] = v;
562
39.6k
    }
563
2.59k
  }
564
5.25k
  int end = kDCTBlockSize - 1;
565
303k
  while (end >= 1 && lehmer[end] == 0) {
566
298k
    --end;
567
298k
  }
568
5.25k
  if (lehmer[end] == 1) return false;
569
30.4k
  for (int i = 1; i <= end; ++i) {
570
25.3k
    if (lehmer[i] == 0) return false;
571
25.2k
    --lehmer[i];
572
25.2k
  }
573
5.00k
  if (!DecodeLehmerCode(lehmer, kDCTBlockSize, order)) return false;
574
324k
  for (int k = 0; k < kDCTBlockSize; ++k) {
575
319k
    order[k] = kJPEGNaturalOrder[order[k]];
576
319k
  }
577
4.99k
  return true;
578
5.00k
}
579
580
/** Reads 0..6 words from |in| and returns the value in the range 0..63. */
581
static size_t DecodeNumNonzeros(Prob* p, BinaryArithmeticDecoder* ac,
582
1.69M
                                WordSource* in) {
583
  // To simplify BST navigation, we use 1-based indexing.
584
1.69M
  Prob* bst = p - 1;
585
1.69M
  size_t ctx = 1;
586
587
11.8M
  for (size_t b = 0; b < kNumNonZeroBits; ++b) {
588
10.1M
    const int bit = ac->ReadBit(bst[ctx].get_proba(), in);
589
10.1M
    bst[ctx].Add(bit);
590
10.1M
    ctx = 2 * ctx + bit;
591
10.1M
  }
592
593
  // Leaf index in the level corresponds to the resulting value.
594
1.69M
  size_t val = ctx - (1u << kNumNonZeroBits);
595
1.69M
  BRUNSLI_DCHECK(val <= kNumNonZeroTreeSize);
596
1.69M
  return val;
597
1.69M
}
598
599
10.1k
void EnsureSubdecodersInitialized(State* state, WordSource* in) {
600
10.1k
  InternalState& s = *state->internal;
601
10.1k
  if (!s.subdecoders_initialized) {
602
10.1k
    s.ans_decoder.Init(in);
603
10.1k
    s.bit_reader.Init(in);
604
10.1k
    s.arith_decoder.Init(in);
605
10.1k
    s.subdecoders_initialized = true;
606
10.1k
  }
607
10.1k
}
608
609
9.68k
bool FinalizeSubdecoders(State* state) {
610
9.68k
  InternalState& s = *state->internal;
611
9.68k
  if (!s.ans_decoder.CheckCRC()) return false;
612
8.96k
  if (!s.bit_reader.Finish()) return false;
613
8.94k
  s.subdecoders_initialized = false;
614
8.94k
  return true;
615
8.96k
}
616
617
5.43k
BrunsliStatus DecodeDC(State* state, WordSource* in) {
618
5.43k
  const std::vector<ComponentMeta>& meta = state->meta;
619
5.43k
  const size_t num_components = meta.size();
620
5.43k
  const int mcu_rows = meta[0].height_in_blocks / meta[0].v_samp;
621
5.43k
  InternalState& s = *state->internal;
622
5.43k
  AcDcState& ac_dc_state = s.ac_dc;
623
624
5.43k
  std::vector<ComponentStateDC>& comps = ac_dc_state.dc;
625
5.43k
  if (comps.empty()) {
626
5.43k
    comps.resize(num_components);
627
11.5k
    for (size_t c = 0; c < num_components; ++c) {
628
6.08k
      comps[c].SetWidth(meta[c].width_in_blocks);
629
6.08k
    }
630
5.43k
  }
631
632
5.43k
  if (!in->CanRead(5)) return BRUNSLI_NOT_ENOUGH_DATA;
633
5.32k
  EnsureSubdecodersInitialized(state, in);
634
5.32k
  ANSDecoder ans = s.ans_decoder;
635
5.32k
  BitSource br = s.bit_reader;
636
5.32k
  BinaryArithmeticDecoder ac = s.arith_decoder;
637
638
  // We decode DC components in the following interleaved manner:
639
  //   v_samp[0] rows from component 0
640
  //   v_samp[1] rows from component 1
641
  //   v_samp[2] rows from component 2
642
  //   v_samp[3] rows from component 3 (if present)
643
  //
644
  // E.g. in a YUV420 image, we decode 2 rows of DC components from Y and then
645
  // 1 row of DC components from U and 1 row of DC components from V.
646
145k
  for (int mcu_y = ac_dc_state.next_mcu_y; mcu_y < mcu_rows; ++mcu_y) {
647
285k
    for (size_t i = ac_dc_state.next_component; i < num_components; ++i) {
648
145k
      ComponentStateDC* c = &comps[i];
649
145k
      const ComponentMeta& m = meta[i];
650
145k
      const uint8_t* context_map = state->context_map + i * kNumAvrgContexts;
651
145k
      const int ac_stride = static_cast<int>(m.ac_stride);
652
145k
      const size_t b_stride = m.b_stride;
653
145k
      const int width = m.width_in_blocks;
654
145k
      int y = mcu_y * m.v_samp + ac_dc_state.next_iy;
655
145k
      int* const prev_sgn = &c->prev_sign[1];
656
145k
      int* const prev_abs = &c->prev_abs_coeff[2];
657
469k
      for (int iy = ac_dc_state.next_iy; iy < m.v_samp; ++iy, ++y) {
658
324k
        coeff_t* coeffs =
659
324k
            m.ac_coeffs + y * ac_stride + ac_dc_state.next_x * kDCTBlockSize;
660
324k
        uint8_t* block_state =
661
324k
            m.block_state + y * b_stride + ac_dc_state.next_x;
662
57.1M
        for (int x = ac_dc_state.next_x; x < width; ++x) {
663
56.8M
          if (BRUNSLI_PREDICT_FALSE(!in->CanRead(6))) {
664
103
            ac_dc_state.next_mcu_y = mcu_y;
665
103
            ac_dc_state.next_component = i;
666
103
            ac_dc_state.next_iy = iy;
667
103
            ac_dc_state.next_x = x;
668
103
            s.ans_decoder = ans;
669
103
            s.bit_reader = br;
670
103
            s.arith_decoder = ac;
671
103
            return BRUNSLI_NOT_ENOUGH_DATA;
672
103
          }
673
56.8M
          const int is_empty_ctx =
674
56.8M
              IsEmptyBlockContext(&c->prev_is_nonempty[1], x);
675
56.8M
          Prob* BRUNSLI_RESTRICT is_empty_p =
676
56.8M
              &c->is_empty_block_prob[is_empty_ctx];
677
56.8M
          const bool is_empty_block = !ac.ReadBit(is_empty_p->get_proba(), in);
678
56.8M
          is_empty_p->Add(!is_empty_block);
679
56.8M
          c->prev_is_nonempty[x + 1] = !is_empty_block;
680
56.8M
          *block_state = is_empty_block;
681
56.8M
          int abs_val = 0;
682
56.8M
          int sign = 0;
683
56.8M
          if (!is_empty_block) {
684
15.7M
            Prob* BRUNSLI_RESTRICT p_is_zero = &c->is_zero_prob;
685
15.7M
            int is_zero = ac.ReadBit(p_is_zero->get_proba(), in);
686
15.7M
            p_is_zero->Add(is_zero);
687
15.7M
            if (!is_zero) {
688
4.26M
              const int avg_ctx = WeightedAverageContextDC(prev_abs, x);
689
4.26M
              const int sign_ctx = prev_sgn[x] * 3 + prev_sgn[x - 1];
690
4.26M
              Prob* BRUNSLI_RESTRICT sign_p = &c->sign_prob[sign_ctx];
691
4.26M
              sign = ac.ReadBit(sign_p->get_proba(), in);
692
4.26M
              sign_p->Add(sign);
693
4.26M
              const int entropy_ix = context_map[avg_ctx];
694
4.26M
              int code = ans.ReadSymbol(state->entropy_codes[entropy_ix], in);
695
4.26M
              if (code < kNumDirectCodes) {
696
641k
                abs_val = code + 1;
697
3.62M
              } else {
698
3.62M
                int nbits = code - kNumDirectCodes;
699
3.62M
                Prob* BRUNSLI_RESTRICT p_first_extra_bit =
700
3.62M
                    &c->first_extra_bit_prob[nbits];
701
3.62M
                int first_extra_bit =
702
3.62M
                    ac.ReadBit(p_first_extra_bit->get_proba(), in);
703
3.62M
                p_first_extra_bit->Add(first_extra_bit);
704
3.62M
                int extra_bits_val = first_extra_bit << nbits;
705
3.62M
                if (nbits > 0) {
706
3.55M
                  extra_bits_val |= static_cast<int>(br.ReadBits(nbits, in));
707
3.55M
                }
708
3.62M
                abs_val = kNumDirectCodes - 1 + (2 << nbits) + extra_bits_val;
709
3.62M
              }
710
4.26M
            }
711
15.7M
          }
712
56.8M
          prev_abs[x] = abs_val;
713
56.8M
          prev_sgn[x] = abs_val ? sign + 1 : 0;
714
56.8M
          coeffs[0] = ((1 - 2 * sign) * abs_val +
715
56.8M
                       PredictWithAdaptiveMedian(coeffs, x, y, ac_stride));
716
56.8M
          block_state++;
717
56.8M
          coeffs += kDCTBlockSize;
718
56.8M
        }
719
324k
        ac_dc_state.next_x = 0;
720
324k
      }
721
144k
      ac_dc_state.next_iy = 0;
722
144k
    }
723
140k
    ac_dc_state.next_component = 0;
724
140k
  }
725
726
  // Prepare for AC decoding.
727
5.22k
  ac_dc_state.next_mcu_y = 0;
728
5.22k
  ac_dc_state.next_component = 0;
729
5.22k
  ac_dc_state.next_iy = 0;
730
5.22k
  ac_dc_state.next_x = 0;
731
732
5.22k
  comps.clear();
733
5.22k
  comps.shrink_to_fit();
734
735
5.22k
  s.ans_decoder = ans;
736
5.22k
  s.bit_reader = br;
737
5.22k
  s.arith_decoder = ac;
738
5.22k
  if (!FinalizeSubdecoders(state)) return BRUNSLI_INVALID_BRN;
739
740
4.91k
  return BRUNSLI_OK;
741
5.22k
}
742
743
static void BRUNSLI_NOINLINE DecodeEmptyAcBlock(
744
6.75M
    int* BRUNSLI_RESTRICT prev_sgn, int* BRUNSLI_RESTRICT prev_abs) {
745
432M
  for (int k = 1; k < kDCTBlockSize; ++k) {
746
425M
    prev_sgn[k] = 0;
747
425M
    prev_abs[k] = 0;
748
425M
  }
749
6.75M
}
750
751
/** All the necessary things for decoding AC block. */
752
struct AcBlockCookie {
753
  int x;
754
  int y;
755
  uint8_t* BRUNSLI_RESTRICT prev_num_nonzeros;
756
  int* BRUNSLI_RESTRICT prev_sgn;
757
  int* BRUNSLI_RESTRICT prev_abs;
758
  Prob* BRUNSLI_RESTRICT num_nonzero_prob;
759
760
  BinaryArithmeticDecoder* BRUNSLI_RESTRICT ac;
761
  WordSource* BRUNSLI_RESTRICT in;
762
  ANSDecoder* BRUNSLI_RESTRICT ans;
763
  BitSource* BRUNSLI_RESTRICT br;
764
765
  coeff_t* BRUNSLI_RESTRICT coeffs;
766
  const coeff_t* BRUNSLI_RESTRICT prev_row_coeffs;
767
  const coeff_t* BRUNSLI_RESTRICT prev_col_coeffs;
768
  Prob* BRUNSLI_RESTRICT is_zero_prob;
769
  const uint32_t* BRUNSLI_RESTRICT order;
770
  const uint8_t* BRUNSLI_RESTRICT context_modes;
771
  const int* BRUNSLI_RESTRICT mult_col;
772
  const int* BRUNSLI_RESTRICT mult_row;
773
  int prev_row_delta;
774
  Prob* BRUNSLI_RESTRICT sign_prob;
775
  size_t context_bits;
776
  const uint8_t* BRUNSLI_RESTRICT context_map;
777
  const ANSDecodingData* BRUNSLI_RESTRICT entropy_codes;
778
  Prob* BRUNSLI_RESTRICT first_extra_bit_prob;
779
};
780
781
1.69M
static size_t BRUNSLI_NOINLINE DecodeAcBlock(const AcBlockCookie& cookie) {
782
1.69M
  AcBlockCookie c = cookie;
783
784
1.69M
  BinaryArithmeticDecoder ac = *c.ac;
785
1.69M
  WordSource* in = c.in;
786
1.69M
  ANSDecoder ans = *c.ans;
787
1.69M
  BitSource br = *c.br;
788
789
1.69M
  size_t num_nonzeros = 0;
790
791
1.69M
  const uint8_t nonzero_ctx = NumNonzerosContext(c.prev_num_nonzeros, c.x, c.y);
792
1.69M
  size_t last_nz = DecodeNumNonzeros(
793
1.69M
      c.num_nonzero_prob + kNumNonZeroTreeSize * nonzero_ctx, &ac, in);
794
81.2M
  for (size_t k = last_nz + 1; k < kDCTBlockSize; ++k) {
795
79.6M
    c.prev_sgn[k] = 0;
796
79.6M
    c.prev_abs[k] = 0;
797
79.6M
  }
798
28.6M
  for (size_t k = last_nz; k > 0; --k) {
799
26.9M
    int is_zero = 0;
800
26.9M
    if (k < last_nz) {
801
26.2M
      size_t bucket = kNonzeroBuckets[num_nonzeros - 1];
802
26.2M
      size_t is_zero_ctx = bucket * kDCTBlockSize + k;
803
26.2M
      Prob& p = c.is_zero_prob[is_zero_ctx];
804
26.2M
      is_zero = ac.ReadBit(p.get_proba(), in);
805
26.2M
      p.Add(is_zero);
806
26.2M
    }
807
26.9M
    int abs_val = 0;
808
26.9M
    int sign = 1;
809
26.9M
    const int k_nat = c.order[k];
810
26.9M
    if (!is_zero) {
811
3.52M
      size_t context_type = c.context_modes[k_nat];
812
3.52M
      size_t avg_ctx = 0;
813
3.52M
      size_t sign_ctx = kMaxAverageContext;
814
3.52M
      if ((context_type & 1) && (c.y > 0)) {
815
620k
        size_t offset = k_nat & 7;
816
620k
        ACPredictContextRow(c.prev_row_coeffs + offset, c.coeffs + offset,
817
620k
                            c.mult_col + offset * 8, &avg_ctx, &sign_ctx);
818
2.90M
      } else if ((context_type & 2) && (c.x > 0)) {
819
655k
        size_t offset = k_nat & ~7;
820
655k
        ACPredictContextCol(c.prev_col_coeffs + offset, c.coeffs + offset,
821
655k
                            c.mult_row + offset, &avg_ctx, &sign_ctx);
822
2.25M
      } else if (!context_type) {
823
2.16M
        avg_ctx = WeightedAverageContext(c.prev_abs + k, c.prev_row_delta);
824
2.16M
        sign_ctx =
825
2.16M
            c.prev_sgn[k] * 3 + c.prev_sgn[static_cast<int>(k) - kDCTBlockSize];
826
2.16M
      }
827
3.52M
      sign_ctx = sign_ctx * kDCTBlockSize + k;
828
3.52M
      Prob& sign_p = c.sign_prob[sign_ctx];
829
3.52M
      sign = ac.ReadBit(sign_p.get_proba(), in);
830
3.52M
      sign_p.Add(sign);
831
3.52M
      c.prev_sgn[k] = sign + 1;
832
3.52M
      sign = 1 - 2 * sign;
833
3.52M
      const size_t z_dens_ctx =
834
3.52M
          ZeroDensityContext(num_nonzeros, k, c.context_bits);
835
3.52M
      size_t histo_ix = z_dens_ctx * kNumAvrgContexts + avg_ctx;
836
3.52M
      size_t entropy_ix = c.context_map[histo_ix];
837
3.52M
      int code = ans.ReadSymbol(c.entropy_codes[entropy_ix], in);
838
3.52M
      if (code < kNumDirectCodes) {
839
596k
        abs_val = code + 1;
840
2.93M
      } else {
841
2.93M
        int nbits = code - kNumDirectCodes;
842
2.93M
        Prob& p = c.first_extra_bit_prob[k * 10 + nbits];
843
2.93M
        int first_extra_bit = ac.ReadBit(p.get_proba(), in);
844
2.93M
        p.Add(first_extra_bit);
845
2.93M
        int extra_bits_val = first_extra_bit << nbits;
846
2.93M
        if (nbits > 0) {
847
2.83M
          extra_bits_val |= br.ReadBits(nbits, in);
848
2.83M
        }
849
2.93M
        abs_val = kNumDirectCodes - 1 + (2u << nbits) + extra_bits_val;
850
2.93M
      }
851
3.52M
      ++num_nonzeros;
852
23.4M
    } else {
853
23.4M
      c.prev_sgn[k] = 0;
854
23.4M
    }
855
26.9M
    int coeff = sign * abs_val;
856
26.9M
    c.coeffs[k_nat] = coeff;
857
26.9M
    c.prev_abs[k] = abs_val;
858
26.9M
  }
859
860
1.69M
  *c.ans = ans;
861
1.69M
  *c.br = br;
862
1.69M
  *c.ac = ac;
863
864
1.69M
  return num_nonzeros;
865
1.69M
}
866
867
4.89k
BrunsliStatus DecodeAC(State* state, WordSource* in) {
868
4.89k
  const std::vector<ComponentMeta>& meta = state->meta;
869
4.89k
  const size_t num_components = meta.size();
870
4.89k
  const int mcu_rows = meta[0].height_in_blocks / meta[0].v_samp;
871
4.89k
  InternalState& s = *state->internal;
872
4.89k
  AcDcState& ac_dc_state = s.ac_dc;
873
874
4.89k
  std::vector<ComponentState>& comps = ac_dc_state.ac;
875
4.89k
  if (comps.empty()) {
876
4.89k
    comps.resize(num_components);
877
10.4k
    for (size_t c = 0; c < num_components; ++c) {
878
5.50k
      comps[c].SetWidth(meta[c].width_in_blocks);
879
5.50k
      ComputeACPredictMultipliers(&meta[c].quant[0], comps[c].mult_row,
880
5.50k
                                  comps[c].mult_col);
881
5.50k
    }
882
4.89k
  }
883
884
4.89k
  if (!in->CanRead(5)) return BRUNSLI_NOT_ENOUGH_DATA;
885
4.80k
  EnsureSubdecodersInitialized(state, in);
886
887
4.80k
  if (!ac_dc_state.ac_coeffs_order_decoded) {
888
9.79k
    while (ac_dc_state.next_component < num_components) {
889
5.27k
      if (!in->CanRead(121)) return BRUNSLI_NOT_ENOUGH_DATA;
890
5.27k
      if (!DecodeCoeffOrder(comps[ac_dc_state.next_component].order,
891
5.27k
                            &s.bit_reader, in)) {
892
280
        return BRUNSLI_INVALID_BRN;
893
280
      }
894
4.99k
      ac_dc_state.next_component++;
895
4.99k
    }
896
4.51k
    ac_dc_state.next_component = 0;
897
4.51k
    ac_dc_state.ac_coeffs_order_decoded = true;
898
4.51k
  }
899
900
4.51k
  AcBlockCookie c;
901
4.51k
  c.ac = &s.arith_decoder;
902
4.51k
  c.in = in;
903
4.51k
  c.ans = &s.ans_decoder;
904
4.51k
  c.br = &s.bit_reader;
905
4.51k
  c.entropy_codes = state->entropy_codes;
906
4.51k
  c.context_modes =
907
4.51k
      kContextAlgorithm + (state->use_legacy_context_model ? 64 : 0);
908
909
106k
  for (int mcu_y = ac_dc_state.next_mcu_y; mcu_y < mcu_rows; ++mcu_y) {
910
205k
    for (size_t i = ac_dc_state.next_component; i < num_components; ++i) {
911
102k
      ComponentState& cst = comps[i];
912
102k
      c.prev_num_nonzeros = cst.prev_num_nonzeros.data();
913
102k
      c.num_nonzero_prob = cst.num_nonzero_prob;
914
102k
      c.is_zero_prob = cst.is_zero_prob.data();
915
102k
      c.order = cst.order;
916
102k
      c.mult_col = cst.mult_col;
917
102k
      c.mult_row = cst.mult_row;
918
102k
      c.sign_prob = cst.sign_prob.data();
919
102k
      c.first_extra_bit_prob = cst.first_extra_bit_prob.data();
920
102k
      const ComponentMeta& m = meta[i];
921
102k
      c.context_map = state->context_map + m.context_offset * kNumAvrgContexts;
922
102k
      c.context_bits = m.context_bits;
923
102k
      const int width = m.width_in_blocks;
924
102k
      const size_t ac_stride = m.ac_stride;
925
102k
      const size_t b_stride = m.b_stride;
926
102k
      const int next_iy = ac_dc_state.next_iy;
927
102k
      c.y = mcu_y * m.v_samp + next_iy;
928
102k
      c.prev_row_delta = (1 - 2 * (c.y & 1u)) * (width + 3) * kDCTBlockSize;
929
363k
      for (int iy = next_iy; iy < m.v_samp; ++iy, ++c.y) {
930
260k
        const int next_x = ac_dc_state.next_x;
931
260k
        const size_t block_offset = next_x * kDCTBlockSize;
932
260k
        c.coeffs = m.ac_coeffs + c.y * ac_stride + block_offset;
933
260k
        c.prev_row_coeffs = c.coeffs - ac_stride;
934
260k
        c.prev_col_coeffs = c.coeffs - kDCTBlockSize;
935
260k
        const uint8_t* block_state = m.block_state + c.y * b_stride + next_x;
936
260k
        c.prev_sgn = &cst.prev_sign[kDCTBlockSize] + block_offset;
937
260k
        c.prev_abs = &cst.prev_abs_coeff[((c.y & 1u) * (width + 3) + 2) *
938
260k
                                         kDCTBlockSize] +
939
260k
                     block_offset;
940
8.70M
        for (c.x = next_x; c.x < width; ++c.x) {
941
8.44M
          bool is_empty = *(block_state++);
942
8.44M
          if (!is_empty) {
943
1.69M
            if (BRUNSLI_PREDICT_FALSE(!in->CanRead(297))) {
944
53
              ac_dc_state.next_mcu_y = mcu_y;
945
53
              ac_dc_state.next_component = i;
946
53
              ac_dc_state.next_iy = iy;
947
53
              ac_dc_state.next_x = c.x;
948
53
              return BRUNSLI_NOT_ENOUGH_DATA;
949
53
            }
950
1.69M
            size_t num_nonzeros = DecodeAcBlock(c);
951
1.69M
            BRUNSLI_DCHECK(num_nonzeros <= kNumNonZeroTreeSize);
952
1.69M
            c.prev_num_nonzeros[c.x] = static_cast<uint8_t>(num_nonzeros);
953
6.75M
          } else {
954
6.75M
            DecodeEmptyAcBlock(c.prev_sgn, c.prev_abs);
955
6.75M
            c.prev_num_nonzeros[c.x] = 0;
956
6.75M
          }
957
8.44M
          c.coeffs += kDCTBlockSize;
958
8.44M
          c.prev_sgn += kDCTBlockSize;
959
8.44M
          c.prev_abs += kDCTBlockSize;
960
8.44M
          c.prev_row_coeffs += kDCTBlockSize;
961
8.44M
          c.prev_col_coeffs += kDCTBlockSize;
962
8.44M
        }
963
260k
        c.prev_row_delta *= -1;
964
260k
        ac_dc_state.next_x = 0;
965
260k
      }
966
102k
      ac_dc_state.next_iy = 0;
967
102k
    }
968
102k
    ac_dc_state.next_component = 0;
969
102k
  }
970
4.45k
  ac_dc_state.next_mcu_y = 0;
971
972
4.45k
  comps.clear();
973
4.45k
  comps.shrink_to_fit();
974
975
4.45k
  if (!FinalizeSubdecoders(state)) return BRUNSLI_INVALID_BRN;
976
977
4.03k
  return BRUNSLI_OK;
978
4.45k
}
979
980
361k
static bool CheckCanRead(State* state, size_t required) {
981
  // TODO(eustas): dcheck len > pos
982
361k
  size_t available = state->len - state->pos;
983
361k
  return required <= available;
984
361k
}
985
986
120k
static bool CheckCanReadByte(State* state) {
987
  // TODO(eustas): dcheck len > pos
988
120k
  return state->pos != state->len;
989
120k
}
990
991
120k
static uint8_t ReadByte(State* state) {
992
  // TODO(eustas): dcheck len > pos
993
120k
  return state->data[state->pos++];
994
120k
}
995
996
344k
static uint8_t PeekByte(State* state, size_t offset) {
997
  // TODO(eustas): dcheck overflow.
998
344k
  return state->data[state->pos + offset];
999
344k
}
1000
1001
730k
static void SkipBytes(State* state, size_t len) {
1002
  // TODO(eustas): dcheck overflow.
1003
730k
  state->pos += len;
1004
730k
}
1005
1006
457k
static size_t GetBytesAvailable(State* state) {
1007
  // TODO(eustas): dcheck len > pos
1008
457k
  return state->len - state->pos;
1009
457k
}
1010
1011
162
static size_t SkipAvailableBytes(State* state, size_t len) {
1012
162
  size_t available = GetBytesAvailable(state);
1013
162
  size_t skip_bytes = std::min(available, len);
1014
162
  state->pos += skip_bytes;
1015
162
  return skip_bytes;
1016
162
}
1017
1018
312k
static BrunsliStatus DecodeBase128(State* state, size_t* val) {
1019
312k
  *val = 0;
1020
312k
  uint64_t b = 0x80;
1021
312k
  uint64_t v = 0;
1022
312k
  size_t i = 0;
1023
657k
  while ((i < 9) && (b & 0x80u)) {
1024
345k
    if (!CheckCanRead(state, i + 1)) return BRUNSLI_NOT_ENOUGH_DATA;
1025
344k
    b = PeekByte(state, i);
1026
344k
    v |= (b & 0x7Fu) << (i * 7);
1027
344k
    ++i;
1028
344k
  }
1029
312k
  SkipBytes(state, i);
1030
312k
  *val = v;
1031
312k
  bool terminated = ((b & 0x80u) == 0);
1032
312k
  bool fit = (v == *val);
1033
312k
  return (terminated && fit) ? BRUNSLI_OK : BRUNSLI_INVALID_BRN;
1034
312k
}
1035
1036
12.5k
static Stage Fail(State* state, BrunsliStatus result) {
1037
12.5k
  InternalState& s = *state->internal;
1038
12.5k
  s.result = result;
1039
  // Preserve current stage for continuation / error reporting.
1040
12.5k
  s.last_stage = state->stage;
1041
12.5k
  return Stage::ERROR;
1042
12.5k
}
1043
1044
120k
static BrunsliStatus ReadTag(State* state, SectionState* section) {
1045
120k
  if (!CheckCanReadByte(state)) return BRUNSLI_NOT_ENOUGH_DATA;
1046
120k
  const uint8_t marker = ReadByte(state);
1047
1048
120k
  const size_t tag = marker >> 3u;
1049
120k
  if (tag == 0 || tag > 15) return BRUNSLI_INVALID_BRN;
1050
120k
  section->tag = tag;
1051
1052
120k
  const size_t wiring_type = marker & 0x7u;
1053
120k
  if (wiring_type != kBrunsliWiringTypeVarint &&
1054
56.9k
      wiring_type != kBrunsliWiringTypeLengthDelimited) {
1055
13
    return BRUNSLI_INVALID_BRN;
1056
13
  }
1057
120k
  section->is_section = (wiring_type == kBrunsliWiringTypeLengthDelimited);
1058
1059
120k
  const uint32_t tag_bit = 1u << tag;
1060
120k
  if (section->tags_met & tag_bit) {
1061
4
    BRUNSLI_LOG_ERROR() << "Duplicate marker " << ToHexString(marker)
1062
4
                        << BRUNSLI_ENDL();
1063
4
    return BRUNSLI_INVALID_BRN;
1064
4
  }
1065
120k
  section->tags_met |= tag_bit;
1066
1067
120k
  return BRUNSLI_OK;
1068
120k
}
1069
1070
56.7k
static BrunsliStatus EnterSection(State* state, SectionState* section) {
1071
56.7k
  size_t section_size;
1072
56.7k
  BrunsliStatus status = DecodeBase128(state, &section_size);
1073
56.7k
  if (status != BRUNSLI_OK) return status;
1074
56.6k
  section->is_active = true;
1075
56.6k
  section->remaining = section_size;
1076
56.6k
  section->milestone = state->pos;
1077
56.6k
  section->projected_end = state->pos + section->remaining;
1078
56.6k
  return BRUNSLI_OK;
1079
56.7k
}
1080
1081
15.8k
static void LeaveSection(SectionState* section) { section->is_active = false; }
1082
1083
482k
static bool IsOutOfSectionBounds(State* state) {
1084
482k
  return state->pos > state->internal->section.projected_end;
1085
482k
}
1086
1087
478k
static size_t RemainingSectionLength(State* state) {
1088
  // TODO(eustas): remove this check?
1089
478k
  if (IsOutOfSectionBounds(state)) return 0;
1090
439k
  return state->internal->section.projected_end - state->pos;
1091
478k
}
1092
1093
141k
static bool IsAtSectionBoundary(State* state) {
1094
141k
  return state->pos == state->internal->section.projected_end;
1095
141k
}
1096
1097
16.5k
Stage VerifySignature(State* state) {
1098
16.5k
  InternalState& s = *state->internal;
1099
1100
16.5k
  if (!CheckCanRead(state, kBrunsliSignatureSize)) {
1101
5
    return Fail(state, BRUNSLI_NOT_ENOUGH_DATA);
1102
5
  }
1103
16.5k
  const bool is_signature_ok =
1104
16.5k
      (memcmp(state->data + state->pos, kBrunsliSignature,
1105
16.5k
              kBrunsliSignatureSize) != 0);
1106
16.5k
  state->pos += kBrunsliSignatureSize;
1107
16.5k
  s.section.tags_met |= 1u << kBrunsliSignatureTag;
1108
16.5k
  if (is_signature_ok) return Fail(state, BRUNSLI_INVALID_BRN);
1109
16.5k
  return Stage::HEADER;
1110
16.5k
}
1111
1112
// Parses the brunsli header starting at data[*pos] and fills in *jpg.
1113
// Sets *pos to the position after the header.
1114
// Returns BRUNSLI_OK, unless the data is not valid brunsli byte stream
1115
// or is truncated.
1116
16.5k
Stage DecodeHeader(State* state, JPEGData* jpg) {
1117
16.5k
  InternalState& s = *state->internal;
1118
16.5k
  HeaderState& hs = s.header;
1119
1120
209k
  while (hs.stage != HeaderState::DONE) {
1121
193k
    switch (hs.stage) {
1122
16.5k
      case HeaderState::READ_TAG: {
1123
16.5k
        BrunsliStatus status = ReadTag(state, &s.section);
1124
16.5k
        if (status != BRUNSLI_OK) return Fail(state, status);
1125
16.4k
        if (s.section.tag != kBrunsliHeaderTag || !s.section.is_section) {
1126
5
          return Fail(state, BRUNSLI_INVALID_BRN);
1127
5
        }
1128
16.4k
        hs.stage = HeaderState::ENTER_SECTION;
1129
16.4k
        break;
1130
16.4k
      }
1131
1132
16.4k
      case HeaderState::ENTER_SECTION: {
1133
16.4k
        BrunsliStatus status = EnterSection(state, &s.section);
1134
16.4k
        if (status != BRUNSLI_OK) return Fail(state, status);
1135
16.4k
        hs.stage = HeaderState::ITEM_READ_TAG;
1136
16.4k
        break;
1137
16.4k
      }
1138
1139
80.1k
      case HeaderState::ITEM_READ_TAG: {
1140
80.1k
        if (IsAtSectionBoundary(state)) {
1141
16.1k
          hs.stage = HeaderState::FINALE;
1142
16.1k
          break;
1143
16.1k
        }
1144
63.9k
        BrunsliStatus status = ReadTag(state, &hs.section);
1145
63.9k
        if (status != BRUNSLI_OK) return Fail(state, status);
1146
63.8k
        const uint32_t tag_bit = 1u << hs.section.tag;
1147
63.8k
        if (hs.section.is_section) {
1148
172
          if (kKnownHeaderVarintTags & tag_bit) {
1149
5
            return Fail(state, BRUNSLI_INVALID_BRN);
1150
5
          }
1151
167
          hs.stage = HeaderState::ITEM_ENTER_SECTION;
1152
167
          break;
1153
172
        }
1154
63.6k
        hs.stage = HeaderState::ITEM_READ_VALUE;
1155
63.6k
        break;
1156
63.8k
      }
1157
1158
167
      case HeaderState::ITEM_ENTER_SECTION: {
1159
167
        BrunsliStatus status = DecodeBase128(state, &hs.remaining_skip_length);
1160
167
        if (status != BRUNSLI_OK) return Fail(state, status);
1161
162
        hs.stage = HeaderState::ITEM_SKIP_CONTENTS;
1162
162
        break;
1163
167
      }
1164
1165
162
      case HeaderState::ITEM_SKIP_CONTENTS: {
1166
162
        size_t bytes_skipped =
1167
162
            SkipAvailableBytes(state, hs.remaining_skip_length);
1168
162
        hs.remaining_skip_length -= bytes_skipped;
1169
162
        if (hs.remaining_skip_length > 0) {
1170
103
          return Fail(state, BRUNSLI_NOT_ENOUGH_DATA);
1171
103
        }
1172
59
        hs.stage = HeaderState::ITEM_READ_TAG;
1173
59
        break;
1174
162
      }
1175
1176
63.6k
      case HeaderState::ITEM_READ_VALUE: {
1177
63.6k
        size_t value;
1178
63.6k
        BrunsliStatus status = DecodeBase128(state, &value);
1179
63.6k
        if (status != BRUNSLI_OK) return Fail(state, status);
1180
63.6k
        hs.varint_values[hs.section.tag] = value;
1181
63.6k
        hs.stage = HeaderState::ITEM_READ_TAG;
1182
63.6k
        break;
1183
63.6k
      }
1184
1185
16.1k
      case HeaderState::FINALE: {
1186
16.1k
        const bool has_version =
1187
16.1k
            hs.section.tags_met & (1u << kBrunsliHeaderVersionCompTag);
1188
16.1k
        if (!has_version) return Fail(state, BRUNSLI_INVALID_BRN);
1189
16.1k
        const size_t version_and_comp_count =
1190
16.1k
            hs.varint_values[kBrunsliHeaderVersionCompTag];
1191
1192
16.1k
        const size_t version = version_and_comp_count >> 2u;
1193
16.1k
        jpg->version = static_cast<int>(version);
1194
1195
16.1k
        if (version == 1) {  // fallback mode
1196
          // TODO(eustas): do we need this?
1197
239
          jpg->width = 0;
1198
239
          jpg->height = 0;
1199
239
          hs.stage = HeaderState::DONE;
1200
239
          break;
1201
239
        }
1202
1203
        // Wrong mode = fallback + something.
1204
15.9k
        if ((version & 1u) != 0) {
1205
13
          return Fail(state, BRUNSLI_INVALID_BRN);
1206
13
        }
1207
        // Unknown mode - only 3 bits are defined.
1208
15.9k
        if ((version & ~0x7u) != 0) {
1209
48
          return Fail(state, BRUNSLI_INVALID_BRN);
1210
48
        }
1211
1212
        // Otherwise regular brunsli.
1213
15.8k
        state->use_legacy_context_model = !(version & 2);
1214
1215
        // Do not allow "original_jpg" for regular Brunsli files.
1216
15.8k
        s.section.tags_met |= 1u << kBrunsliOriginalJpgTag;
1217
1218
15.8k
        const bool has_width =
1219
15.8k
            hs.section.tags_met & (1u << kBrunsliHeaderWidthTag);
1220
15.8k
        if (!has_width) return Fail(state, BRUNSLI_INVALID_BRN);
1221
15.8k
        const size_t width = hs.varint_values[kBrunsliHeaderWidthTag];
1222
15.8k
        const bool has_height =
1223
15.8k
            hs.section.tags_met & (1u << kBrunsliHeaderHeightTag);
1224
15.8k
        if (!has_height) return Fail(state, BRUNSLI_INVALID_BRN);
1225
15.8k
        const size_t height = hs.varint_values[kBrunsliHeaderHeightTag];
1226
1227
15.8k
        if (width == 0 || height == 0) return Fail(state, BRUNSLI_INVALID_BRN);
1228
15.8k
        if (width > kMaxDimPixels || height > kMaxDimPixels) {
1229
189
          return Fail(state, BRUNSLI_INVALID_BRN);
1230
189
        }
1231
15.6k
        jpg->width = static_cast<int>(width);
1232
15.6k
        jpg->height = static_cast<int>(height);
1233
1234
15.6k
        const size_t num_components = (version_and_comp_count & 3u) + 1u;
1235
15.6k
        jpg->components.resize(num_components);
1236
1237
15.6k
        const bool has_subsampling =
1238
15.6k
            hs.section.tags_met & (1u << kBrunsliHeaderSubsamplingTag);
1239
15.6k
        if (!has_subsampling) return Fail(state, BRUNSLI_INVALID_BRN);
1240
15.6k
        size_t subsampling_code =
1241
15.6k
            hs.varint_values[kBrunsliHeaderSubsamplingTag];
1242
1243
43.7k
        for (size_t i = 0; i < jpg->components.size(); ++i) {
1244
28.0k
          JPEGComponent* c = &jpg->components[i];
1245
28.0k
          c->v_samp_factor = (subsampling_code & 0xFu) + 1;
1246
28.0k
          subsampling_code >>= 4u;
1247
28.0k
          c->h_samp_factor = (subsampling_code & 0xFu) + 1;
1248
28.0k
          subsampling_code >>= 4u;
1249
28.0k
          if (c->v_samp_factor > kBrunsliMaxSampling) {
1250
1
            return Fail(state, BRUNSLI_INVALID_BRN);
1251
1
          }
1252
28.0k
          if (c->h_samp_factor > kBrunsliMaxSampling) {
1253
1
            return Fail(state, BRUNSLI_INVALID_BRN);
1254
1
          }
1255
28.0k
        }
1256
15.6k
        if (!UpdateSubsamplingDerivatives(jpg)) {
1257
1
          return Fail(state, BRUNSLI_INVALID_BRN);
1258
1
        }
1259
1260
15.6k
        PrepareMeta(jpg, state);
1261
1262
15.6k
        hs.stage = HeaderState::DONE;
1263
15.6k
        break;
1264
15.6k
      }
1265
1266
0
      default:
1267
0
        return Fail(state, BRUNSLI_DECOMPRESSION_ERROR);
1268
193k
    }
1269
193k
  }
1270
1271
15.8k
  LeaveSection(&s.section);
1272
15.8k
  return (jpg->version == kFallbackVersion) ? Stage::FALLBACK : Stage::SECTION;
1273
16.5k
}
1274
1275
0
int8_t DecodeBrotliWindowBits(uint8_t header) {
1276
0
  uint8_t a = header & 1;
1277
0
  uint8_t b = (header >> 1) & 7;
1278
0
  uint8_t c = (header >> 4) & 7;
1279
0
  if (a == 0) return 16;
1280
0
  if (b != 0) return 17 + b;
1281
0
  if (c == 0) return 17;
1282
0
  if (c == 1) return -1;
1283
0
  return 8 + c;
1284
0
}
1285
1286
4.36k
static BrunsliStatus DecodeMetaDataSection(State* state, JPEGData* jpg) {
1287
4.36k
  InternalState& s = *state->internal;
1288
4.36k
  MetadataState& ms = s.metadata;
1289
1290
4.36k
  if (ms.decompression_stage == MetadataDecompressionStage::DONE) {
1291
0
    return BRUNSLI_INVALID_BRN;
1292
0
  }
1293
1294
4.36k
  if (ms.decompression_stage == MetadataDecompressionStage::INITIAL) {
1295
4.36k
    if (IsAtSectionBoundary(state)) {
1296
5
      ms.decompression_stage = MetadataDecompressionStage::DONE;
1297
5
      return BRUNSLI_OK;
1298
5
    }
1299
4.36k
    if (RemainingSectionLength(state) == 1) {
1300
54
      if (!CheckCanReadByte(state)) {
1301
1
        return BRUNSLI_NOT_ENOUGH_DATA;
1302
1
      }
1303
53
      uint8_t data[1];
1304
53
      data[0] = ReadByte(state);
1305
53
      bool ok = ProcessMetaData(data, 1, &ms, jpg) && ms.CanFinish();
1306
53
      ms.decompression_stage = MetadataDecompressionStage::DONE;
1307
53
      return ok ? BRUNSLI_OK : BRUNSLI_INVALID_BRN;
1308
54
    }
1309
4.30k
    ms.decompression_stage = MetadataDecompressionStage::READ_LENGTH;
1310
4.30k
  }
1311
1312
4.30k
  if (ms.decompression_stage == MetadataDecompressionStage::READ_LENGTH) {
1313
4.30k
    BrunsliStatus status = DecodeBase128(state, &ms.metadata_size);
1314
4.30k
    if (status != BRUNSLI_OK) return status;
1315
4.21k
    if (IsOutOfSectionBounds(state)) return BRUNSLI_INVALID_BRN;
1316
4.21k
    if (RemainingSectionLength(state) == 0) return BRUNSLI_INVALID_BRN;
1317
4.21k
    if (ms.metadata_size > ms.metadata_size_limit) {
1318
72
      return BRUNSLI_NON_REPRESENTABLE;
1319
72
    }
1320
4.14k
    if (!s.shallow_metadata) {
1321
4.14k
      ms.brotli = BrotliDecoderCreateInstance(nullptr, nullptr, nullptr);
1322
4.14k
      if (ms.brotli == nullptr) return BRUNSLI_DECOMPRESSION_ERROR;
1323
4.14k
    }
1324
4.14k
    ms.decompression_stage = MetadataDecompressionStage::DECOMPRESSING;
1325
4.14k
  }
1326
1327
4.14k
  if (ms.decompression_stage == MetadataDecompressionStage::DECOMPRESSING) {
1328
4.14k
    if (s.shallow_metadata) {
1329
0
      if (!CheckCanReadByte(state)) {
1330
0
        return BRUNSLI_NOT_ENOUGH_DATA;
1331
0
      }
1332
0
      uint8_t data[1];
1333
0
      data[0] = ReadByte(state);
1334
0
      s.metadata_brotli_lgwin = DecodeBrotliWindowBits(data[0]);
1335
0
      BRUNSLI_DCHECK(ms.brotli == nullptr);
1336
0
      ms.decompression_stage = MetadataDecompressionStage::DONE;
1337
0
      return (s.metadata_brotli_lgwin < 0) ? BRUNSLI_INVALID_BRN : BRUNSLI_OK;
1338
0
    }
1339
1340
    // Free Brotli decoder and return result
1341
4.14k
    const auto finish_decompression = [&ms](BrunsliStatus result) {
1342
2.61k
      BRUNSLI_DCHECK(ms.brotli != nullptr);
1343
2.61k
      BrotliDecoderDestroyInstance(ms.brotli);
1344
2.61k
      ms.brotli = nullptr;
1345
2.61k
      ms.decompression_stage = MetadataDecompressionStage::DONE;
1346
2.61k
      return result;
1347
2.61k
    };
1348
1349
198k
    while (true) {
1350
198k
      size_t available_bytes =
1351
198k
          std::min(GetBytesAvailable(state), RemainingSectionLength(state));
1352
198k
      size_t available_in = available_bytes;
1353
198k
      const uint8_t* next_in = state->data + state->pos;
1354
198k
      size_t available_out = 0;
1355
198k
      BrotliDecoderResult result = BrotliDecoderDecompressStream(
1356
198k
          ms.brotli, &available_in, &next_in, &available_out, nullptr, nullptr);
1357
198k
      if (result == BROTLI_DECODER_RESULT_ERROR) {
1358
1.08k
        return finish_decompression(BRUNSLI_INVALID_BRN);
1359
1.08k
      }
1360
197k
      size_t chunk_size = 0;
1361
197k
      const uint8_t* chunk_data =
1362
197k
          BrotliDecoderTakeOutput(ms.brotli, &chunk_size);
1363
197k
      ms.decompressed_size += chunk_size;
1364
197k
      if (ms.decompressed_size > ms.metadata_size) {
1365
1.18k
        return finish_decompression(BRUNSLI_INVALID_BRN);
1366
1.18k
      }
1367
196k
      size_t consumed_bytes = available_bytes - available_in;
1368
196k
      SkipBytes(state, consumed_bytes);
1369
196k
      bool chunk_ok = ProcessMetaData(chunk_data, chunk_size, &ms, jpg);
1370
196k
      if (!chunk_ok) return finish_decompression(BRUNSLI_INVALID_BRN);
1371
196k
      if (result == BROTLI_DECODER_RESULT_SUCCESS) {
1372
139
        if (RemainingSectionLength(state) != 0) {
1373
104
          return finish_decompression(BRUNSLI_INVALID_BRN);
1374
104
        }
1375
35
        if (ms.decompressed_size != ms.metadata_size) {
1376
31
          return finish_decompression(BRUNSLI_INVALID_BRN);
1377
31
        }
1378
4
        if (!ms.CanFinish()) return finish_decompression(BRUNSLI_INVALID_BRN);
1379
3
        return finish_decompression(BRUNSLI_OK);
1380
4
      }
1381
196k
      if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) continue;
1382
1.55k
      BRUNSLI_DCHECK(result == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT);
1383
1.55k
      if (RemainingSectionLength(state) == 0) {
1384
31
        return finish_decompression(BRUNSLI_INVALID_BRN);
1385
31
      }
1386
1.52k
      return BRUNSLI_NOT_ENOUGH_DATA;
1387
1.55k
    }
1388
4.14k
  }
1389
1390
  // Unreachable.
1391
0
  BRUNSLI_DCHECK(false);
1392
0
  return BRUNSLI_DECOMPRESSION_ERROR;
1393
4.14k
}
1394
1395
/**
1396
 * Wraps result, depending on the state of input.
1397
 *
1398
 * If parser needs more data, but section data is depleted,
1399
 * then input is corrupted.
1400
 */
1401
25.2k
static BrunsliStatus CheckBoundary(State* state, BrunsliStatus result) {
1402
25.2k
  if (result == BRUNSLI_NOT_ENOUGH_DATA) {
1403
3.38k
    bool last = (RemainingSectionLength(state) <= GetBytesAvailable(state));
1404
3.38k
    return last ? BRUNSLI_INVALID_BRN : BRUNSLI_NOT_ENOUGH_DATA;
1405
21.9k
  } else {
1406
21.9k
    return result;
1407
21.9k
  }
1408
25.2k
}
1409
1410
25.1k
static void PrepareBitReader(BrunsliBitReader* br, State* state) {
1411
25.1k
  size_t chunk_len =
1412
25.1k
      std::min(GetBytesAvailable(state), RemainingSectionLength(state));
1413
25.1k
  BrunsliBitReaderResume(br, state->data + state->pos, chunk_len);
1414
25.1k
  BRUNSLI_DCHECK(BrunsliBitReaderIsHealthy(br));
1415
25.1k
}
1416
1417
/**
1418
 * Marks data used by bit-reader as consumed.
1419
 */
1420
static BrunsliStatus SuspendBitReader(BrunsliBitReader* br, State* state,
1421
25.1k
                                      BrunsliStatus result) {
1422
25.1k
  size_t chunk_len =
1423
25.1k
      std::min(GetBytesAvailable(state), RemainingSectionLength(state));
1424
25.1k
  size_t unused_bytes = BrunsliBitReaderSuspend(br);
1425
25.1k
  size_t consumed_bytes = chunk_len - unused_bytes;
1426
25.1k
  SkipBytes(state, consumed_bytes);
1427
25.1k
  result = CheckBoundary(state, result);
1428
  // Once BitReader becomes unhealthy, further decoding should be impossible.
1429
25.1k
  BRUNSLI_DCHECK(
1430
25.1k
      BrunsliBitReaderIsHealthy(br) ||
1431
25.1k
      ((result != BRUNSLI_OK) && (result != BRUNSLI_NOT_ENOUGH_DATA)));
1432
25.1k
  return result;
1433
25.1k
}
1434
1435
11.0k
static BrunsliStatus DecodeJPEGInternalsSection(State* state, JPEGData* jpg) {
1436
11.0k
  InternalState& s = *state->internal;
1437
11.0k
  JpegInternalsState& js = s.internals;
1438
11.0k
  BrunsliBitReader* br = &js.br;
1439
1440
11.0k
  if (js.stage == JpegInternalsState::INIT) {
1441
11.0k
    BrunsliBitReaderInit(br);
1442
11.0k
    js.stage = JpegInternalsState::READ_MARKERS;
1443
11.0k
  }
1444
11.0k
  PrepareBitReader(br, state);
1445
1446
11.0k
  const auto suspend_bit_reader = [&](BrunsliStatus result) -> BrunsliStatus {
1447
11.0k
    return SuspendBitReader(br, state, result);
1448
11.0k
  };
1449
1450
11.0k
  if (js.stage == JpegInternalsState::READ_MARKERS) {
1451
5.59M
    while (true) {
1452
5.59M
      if (!BrunsliBitReaderCanRead(br, 6)) {
1453
196
        return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1454
196
      }
1455
5.59M
      uint8_t marker = 0xc0 + BrunsliBitReaderRead(br, 6);
1456
5.59M
      jpg->marker_order.push_back(marker);
1457
5.59M
      if (marker == 0xc4) ++js.dht_count;
1458
5.59M
      if (marker == 0xdd) js.have_dri = true;
1459
5.59M
      if (marker == 0xda) ++js.num_scans;
1460
5.59M
      if (marker == 0xd9) break;
1461
5.59M
    }
1462
10.9k
    js.stage = JpegInternalsState::READ_DRI;
1463
10.9k
  }
1464
1465
10.9k
  if (js.stage == JpegInternalsState::READ_DRI) {
1466
10.9k
    if (js.have_dri) {
1467
1.39k
      if (!BrunsliBitReaderCanRead(br, 16)) {
1468
126
        return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1469
126
      }
1470
1.26k
      jpg->restart_interval = BrunsliBitReaderRead(br, 16);
1471
1.26k
    }
1472
10.7k
    js.stage = JpegInternalsState::READ_HUFFMAN_LAST;
1473
10.7k
  }
1474
1475
10.7k
  if (js.stage & JpegInternalsState::DECODE_HUFFMAN_MASK) {
1476
10.7k
    BrunsliStatus status = DecodeHuffmanCode(state, jpg);
1477
10.7k
    if (status != BRUNSLI_OK) return suspend_bit_reader(status);
1478
10.4k
    js.stage = JpegInternalsState::PREPARE_READ_SCANS;
1479
10.4k
  }
1480
1481
10.4k
  if (js.stage == JpegInternalsState::PREPARE_READ_SCANS) {
1482
10.4k
    if (js.dht_count != js.terminal_huffman_code_count) {
1483
145
      BRUNSLI_LOG_ERROR() << "Invalid number of DHT markers" << BRUNSLI_ENDL();
1484
145
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1485
145
    }
1486
10.2k
    if (js.num_scans > 0) {
1487
4.53k
      jpg->scan_info.resize(js.num_scans);
1488
4.53k
      js.i = 0;
1489
4.53k
      js.stage = JpegInternalsState::READ_SCAN_COMMON;
1490
5.72k
    } else {
1491
5.72k
      js.stage = JpegInternalsState::READ_NUM_QUANT;
1492
5.72k
    }
1493
10.2k
  }
1494
1495
10.2k
  if (js.stage & JpegInternalsState::DECODE_SCAN_MASK) {
1496
4.53k
    BrunsliStatus status = DecodeScanInfo(state, jpg);
1497
4.53k
    if (status != BRUNSLI_OK) return suspend_bit_reader(status);
1498
4.19k
    js.stage = JpegInternalsState::READ_NUM_QUANT;
1499
4.19k
  }
1500
1501
9.92k
  if (js.stage == JpegInternalsState::READ_NUM_QUANT) {
1502
9.92k
    if (!BrunsliBitReaderCanRead(br, 2)) {
1503
179
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1504
179
    }
1505
9.74k
    int num_quant_tables = BrunsliBitReaderRead(br, 2) + 1;
1506
9.74k
    jpg->quant.resize(num_quant_tables);
1507
9.74k
    js.i = 0;
1508
9.74k
    js.stage = JpegInternalsState::READ_QUANT;
1509
9.74k
  }
1510
1511
19.3k
  while (js.stage == JpegInternalsState::READ_QUANT) {
1512
19.3k
    if (js.i >= jpg->quant.size()) {
1513
9.46k
      js.stage = JpegInternalsState::READ_COMP_ID_SCHEME;
1514
9.46k
      break;
1515
9.46k
    }
1516
    // 6 or 7 bits are used, but we know that at least one more bit is
1517
    // guaranteed to be used by varint out of the loop.
1518
9.90k
    if (!BrunsliBitReaderCanRead(br, 7)) {
1519
158
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1520
158
    }
1521
9.74k
    JPEGQuantTable* q = &jpg->quant[js.i];
1522
9.74k
    q->index = BrunsliBitReaderRead(br, 2);
1523
9.74k
    q->is_last = (js.i == jpg->quant.size() - 1) || BrunsliBitReaderRead(br, 1);
1524
9.74k
    q->precision = BrunsliBitReaderRead(br, 4);
1525
9.74k
    if (q->precision > 1) {
1526
121
      BRUNSLI_LOG_ERROR() << "Invalid quantization table precision: "
1527
121
                          << q->precision << BRUNSLI_ENDL();
1528
121
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1529
121
    }
1530
    // note that q->values[] are initialized to invalid 0 values.
1531
9.62k
    ++js.i;
1532
9.62k
  }
1533
1534
9.46k
  if (js.stage == JpegInternalsState::READ_COMP_ID_SCHEME) {
1535
9.46k
    if (!BrunsliBitReaderCanRead(br, 2)) {
1536
130
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1537
130
    }
1538
9.33k
    int comp_ids = BrunsliBitReaderRead(br, 2);
1539
9.33k
    static const size_t kMinRequiredComponents[4] = {
1540
9.33k
        3 /* Ids123*/, 1 /* IdsGray */, 3 /* IdsRGB */, 0 /* IdsCustom */
1541
9.33k
    };
1542
9.33k
    if (jpg->components.size() < kMinRequiredComponents[comp_ids]) {
1543
2
      BRUNSLI_LOG_ERROR() << "Insufficient number of components for ColorId #"
1544
2
                          << comp_ids << BRUNSLI_ENDL();
1545
2
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1546
2
    }
1547
9.33k
    js.stage = JpegInternalsState::READ_NUM_PADDING_BITS;
1548
9.33k
    if (comp_ids == kComponentIds123) {
1549
558
      jpg->components[0].id = 1;
1550
558
      jpg->components[1].id = 2;
1551
558
      jpg->components[2].id = 3;
1552
8.77k
    } else if (comp_ids == kComponentIdsGray) {
1553
8.24k
      jpg->components[0].id = 1;
1554
8.24k
    } else if (comp_ids == kComponentIdsRGB) {
1555
57
      jpg->components[0].id = 'R';
1556
57
      jpg->components[1].id = 'G';
1557
57
      jpg->components[2].id = 'B';
1558
473
    } else {
1559
473
      BRUNSLI_DCHECK(comp_ids == kComponentIdsCustom);
1560
473
      js.i = 0;
1561
473
      js.stage = JpegInternalsState::READ_COMP_ID;
1562
473
    }
1563
9.33k
  }
1564
1565
9.33k
  if (js.stage == JpegInternalsState::READ_COMP_ID) {
1566
924
    while (js.i < jpg->components.size()) {
1567
484
      if (!BrunsliBitReaderCanRead(br, 8)) {
1568
33
        return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1569
33
      }
1570
451
      jpg->components[js.i].id = BrunsliBitReaderRead(br, 8);
1571
451
      ++js.i;
1572
451
    }
1573
440
    js.stage = JpegInternalsState::READ_NUM_PADDING_BITS;
1574
440
  }
1575
1576
9.29k
  if (js.stage == JpegInternalsState::READ_NUM_PADDING_BITS) {
1577
    // TODO(eustas): sanitize: should not be bigger than
1578
    //               7 x (num_scans + num_blocks / dri)
1579
    // security: limit is 32b for n_size
1580
9.29k
    if (!DecodeLimitedVarint<8>(&js.varint, br, 4)) {
1581
97
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1582
97
    }
1583
9.20k
    js.num_padding_bits = js.varint.value;
1584
9.20k
    jpg->has_zero_padding_bit = (js.num_padding_bits > 0);
1585
9.20k
    if (js.num_padding_bits > PaddingBitsLimit(*jpg)) {
1586
45
      BRUNSLI_LOG_ERROR() << "Suspicious number of padding bits "
1587
45
                          << js.num_padding_bits << BRUNSLI_ENDL();
1588
45
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1589
45
    }
1590
9.15k
    js.i = 0;
1591
9.15k
    js.stage = JpegInternalsState::READ_PADDING_BITS;
1592
9.15k
  }
1593
1594
9.15k
  if (js.stage == JpegInternalsState::READ_PADDING_BITS) {
1595
71.4k
    while (js.i < js.num_padding_bits) {
1596
62.3k
      if (!BrunsliBitReaderCanRead(br, 1)) {
1597
42
        return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1598
42
      }
1599
62.3k
      jpg->padding_bits.emplace_back(BrunsliBitReaderRead(br, 1));
1600
62.3k
      ++js.i;
1601
62.3k
    }
1602
9.11k
    suspend_bit_reader(BRUNSLI_OK);
1603
9.11k
    BrunsliBitReaderFinish(br);
1604
9.11k
    if (!BrunsliBitReaderIsHealthy(br)) return BRUNSLI_INVALID_BRN;
1605
9.10k
    js.i = 0;
1606
9.10k
    js.stage = JpegInternalsState::ITERATE_MARKERS;
1607
9.10k
  } else {
1608
    // no-op
1609
0
    suspend_bit_reader(BRUNSLI_OK);
1610
0
  }
1611
1612
2.74M
  while (true) {
1613
2.74M
    switch (js.stage) {
1614
2.35M
      case JpegInternalsState::ITERATE_MARKERS: {
1615
2.35M
        if (js.i >= jpg->marker_order.size()) {
1616
8.77k
          js.stage = JpegInternalsState::DONE;
1617
2.34M
        } else if (jpg->marker_order[js.i] == 0xFF) {
1618
187k
          js.stage = JpegInternalsState::READ_INTERMARKER_LENGTH;
1619
2.16M
        } else {
1620
2.16M
          ++js.i;
1621
2.16M
        }
1622
2.35M
        continue;
1623
0
      }
1624
1625
187k
      case JpegInternalsState::READ_INTERMARKER_LENGTH: {
1626
187k
        BrunsliStatus status = DecodeBase128(state, &js.intermarker_length);
1627
187k
        if (status != BRUNSLI_OK) return CheckBoundary(state, status);
1628
187k
        if (js.intermarker_length > RemainingSectionLength(state)) {
1629
82
          return BRUNSLI_INVALID_BRN;
1630
82
        }
1631
187k
        jpg->inter_marker_data.emplace_back();
1632
187k
        js.stage = JpegInternalsState::READ_INTERMARKER_DATA;
1633
187k
        continue;
1634
187k
      }
1635
1636
187k
      case JpegInternalsState::READ_INTERMARKER_DATA: {
1637
187k
        auto& dest = jpg->inter_marker_data.back();
1638
187k
        size_t piece_limit = js.intermarker_length - dest.size();
1639
187k
        size_t piece_size = std::min(piece_limit, GetBytesAvailable(state));
1640
187k
        Append(&dest, state->data + state->pos, piece_size);
1641
187k
        SkipBytes(state, piece_size);
1642
187k
        if (dest.size() < js.intermarker_length) {
1643
113
          BRUNSLI_DCHECK(GetBytesAvailable(state) == 0);
1644
113
          BRUNSLI_DCHECK(RemainingSectionLength(state) > 0);
1645
113
          return BRUNSLI_NOT_ENOUGH_DATA;
1646
113
        }
1647
187k
        ++js.i;
1648
187k
        js.stage = JpegInternalsState::ITERATE_MARKERS;
1649
187k
        continue;
1650
187k
      }
1651
1652
8.77k
      default: { /* no-op */
1653
8.77k
      }
1654
2.74M
    }
1655
8.77k
    break;  // no matching stage has been found; exit the loop.
1656
2.74M
  }
1657
1658
8.77k
  if (!IsAtSectionBoundary(state)) return BRUNSLI_INVALID_BRN;
1659
1660
8.60k
  return BRUNSLI_OK;
1661
8.77k
}
1662
1663
7.01k
static BrunsliStatus DecodeQuantDataSection(State* state, JPEGData* jpg) {
1664
7.01k
  InternalState& s = *state->internal;
1665
7.01k
  QuantDataState& qs = s.quant;
1666
7.01k
  BrunsliBitReader* br = &qs.br;
1667
1668
7.01k
  if (qs.stage == QuantDataState::INIT) {
1669
7.01k
    BrunsliBitReaderInit(br);
1670
7.01k
    qs.stage = QuantDataState::READ_NUM_QUANT;
1671
7.01k
  }
1672
7.01k
  PrepareBitReader(br, state);
1673
1674
7.01k
  const auto suspend_bit_reader = [&](BrunsliStatus result) -> BrunsliStatus {
1675
7.01k
    return SuspendBitReader(br, state, result);
1676
7.01k
  };
1677
1678
7.01k
  if (qs.stage == QuantDataState::READ_NUM_QUANT) {
1679
7.01k
    if (!BrunsliBitReaderCanRead(br, 2)) {
1680
141
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1681
141
    }
1682
6.87k
    size_t num_quant_tables = BrunsliBitReaderRead(br, 2) + 1;
1683
6.87k
    if (jpg->quant.size() != num_quant_tables) {
1684
125
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1685
125
    }
1686
6.75k
    qs.predictor.resize(kDCTBlockSize);
1687
6.75k
    qs.i = 0;
1688
6.75k
    qs.stage = QuantDataState::READ_STOCK;
1689
6.75k
  }
1690
1691
56.1k
  while (true) {
1692
56.1k
    switch (qs.stage) {
1693
12.6k
      case QuantDataState::READ_STOCK: {
1694
12.6k
        if (qs.i >= jpg->quant.size()) {
1695
5.80k
          std::vector<uint8_t>().swap(qs.predictor);
1696
5.80k
          qs.i = 0;
1697
5.80k
          qs.stage = QuantDataState::READ_QUANT_IDX;
1698
5.80k
          continue;
1699
5.80k
        }
1700
        // Depending on еру 1-st bit, it is guaranteed that we will need to read
1701
        // at least 3 or 6 more bits.
1702
6.88k
        if (!BrunsliBitReaderCanRead(br, 4)) {
1703
94
          return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1704
94
        }
1705
6.79k
        qs.data_precision = 0;
1706
6.79k
        bool is_short = !BrunsliBitReaderRead(br, 1);
1707
6.79k
        if (is_short) {
1708
5.86k
          const size_t short_code = BrunsliBitReaderRead(br, 3);
1709
5.86k
          int32_t* table = jpg->quant[qs.i].values.data();
1710
5.86k
          size_t selector = (qs.i > 0) ? 1 : 0;
1711
381k
          for (size_t k = 0; k < kDCTBlockSize; ++k) {
1712
375k
            table[k] = kStockQuantizationTables[selector][short_code][k];
1713
375k
          }
1714
5.86k
          qs.stage = QuantDataState::UPDATE;
1715
5.86k
        } else {
1716
928
          qs.stage = QuantDataState::READ_Q_FACTOR;
1717
928
        }
1718
6.79k
        continue;
1719
6.88k
      }
1720
1721
928
      case QuantDataState::READ_Q_FACTOR: {
1722
928
        if (!BrunsliBitReaderCanRead(br, 6)) {
1723
132
          return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1724
132
        }
1725
796
        const uint32_t q_factor = BrunsliBitReaderRead(br, 6);
1726
796
        FillQuantMatrix(qs.i > 0, q_factor, qs.predictor.data());
1727
796
        qs.j = 0;
1728
796
        qs.delta = 0;
1729
796
        qs.stage = QuantDataState::READ_DIFF_IS_ZERO;
1730
796
        continue;
1731
928
      }
1732
1733
13.2k
      case QuantDataState::READ_DIFF_IS_ZERO: {
1734
13.2k
        if (qs.j >= kDCTBlockSize) {
1735
162
          qs.stage = QuantDataState::UPDATE;
1736
162
          continue;
1737
162
        }
1738
13.1k
        if (!BrunsliBitReaderCanRead(br, 1)) {
1739
160
          return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1740
160
        }
1741
12.9k
        if (BrunsliBitReaderRead(br, 1)) {
1742
2.43k
          qs.stage = QuantDataState::READ_DIFF_SIGN;
1743
10.5k
        } else {
1744
10.5k
          qs.stage = QuantDataState::APPLY_DIFF;
1745
10.5k
        }
1746
12.9k
        continue;
1747
13.1k
      }
1748
1749
2.43k
      case QuantDataState::READ_DIFF_SIGN: {
1750
2.43k
        if (!BrunsliBitReaderCanRead(br, 1)) {
1751
127
          return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1752
127
        }
1753
2.30k
        qs.sign = BrunsliBitReaderRead(br, 1) ? -1 : 1;
1754
2.30k
        qs.stage = QuantDataState::READ_DIFF;
1755
2.30k
        continue;
1756
2.43k
      }
1757
1758
2.30k
      case QuantDataState::READ_DIFF: {
1759
2.30k
        if (!DecodeVarint(&qs.vs, br, 16)) {
1760
137
          return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1761
137
        }
1762
2.16k
        int diff = static_cast<int>(qs.vs.value) + 1;
1763
2.16k
        qs.delta += qs.sign * diff;
1764
2.16k
        qs.stage = QuantDataState::APPLY_DIFF;
1765
2.16k
        continue;
1766
2.30k
      }
1767
1768
12.7k
      case QuantDataState::APPLY_DIFF: {
1769
12.7k
        const int k = kJPEGNaturalOrder[qs.j];
1770
12.7k
        const int quant_value = qs.predictor[k] + qs.delta;
1771
12.7k
        jpg->quant[qs.i].values[k] = quant_value;
1772
12.7k
        if (quant_value <= 0) {
1773
119
          return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1774
119
        }
1775
12.5k
        if (quant_value >= 256) {
1776
7.41k
          qs.data_precision = 1;
1777
7.41k
        }
1778
12.5k
        if (quant_value >= 65536) {
1779
91
          return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1780
91
        }
1781
12.4k
        ++qs.j;
1782
12.4k
        qs.stage = QuantDataState::READ_DIFF_IS_ZERO;
1783
12.4k
        continue;
1784
12.5k
      }
1785
1786
6.02k
      case QuantDataState::UPDATE: {
1787
6.02k
        if (jpg->quant[qs.i].precision < qs.data_precision) {
1788
91
          return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1789
91
        }
1790
        // jpg->quant[qs.i].precision > qs.data_precision means that original
1791
        // JPEG1 was inefficiently encoded.
1792
5.93k
        ++qs.i;
1793
5.93k
        qs.stage = QuantDataState::READ_STOCK;
1794
5.93k
        continue;
1795
6.02k
      }
1796
1797
5.80k
      default: { /* no-op */
1798
5.80k
      }
1799
56.1k
    }
1800
5.80k
    break;  // no matching stage has been found; exit the loop.
1801
56.1k
  }
1802
1803
17.7k
  while (qs.stage == QuantDataState::READ_QUANT_IDX) {
1804
12.1k
    if (qs.i >= jpg->components.size()) {
1805
5.59k
      qs.stage = QuantDataState::FINISH;
1806
5.59k
      continue;
1807
5.59k
    }
1808
6.57k
    JPEGComponent* c = &jpg->components[qs.i];
1809
6.57k
    if (!BrunsliBitReaderCanRead(br, 2)) {
1810
113
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1811
113
    }
1812
6.45k
    c->quant_idx = BrunsliBitReaderRead(br, 2);
1813
6.45k
    if (c->quant_idx >= jpg->quant.size()) {
1814
92
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1815
92
    }
1816
6.36k
    ++qs.i;
1817
6.36k
  }
1818
1819
5.59k
  BRUNSLI_DCHECK(qs.stage == QuantDataState::FINISH);
1820
5.59k
  suspend_bit_reader(BRUNSLI_OK);
1821
5.59k
  BrunsliBitReaderFinish(br);
1822
5.59k
  if (!BrunsliBitReaderIsHealthy(br)) return BRUNSLI_INVALID_BRN;
1823
5.59k
  if (!IsAtSectionBoundary(state)) return BRUNSLI_INVALID_BRN;
1824
5.47k
  return BRUNSLI_OK;
1825
5.59k
}
1826
1827
7.03k
static BrunsliStatus DecodeHistogramDataSection(State* state, JPEGData* jpg) {
1828
7.03k
  InternalState& s = *state->internal;
1829
7.03k
  HistogramDataState& hs = s.histogram;
1830
7.03k
  BrunsliBitReader* br = &hs.br;
1831
1832
7.03k
  if (hs.stage == HistogramDataState::INIT) {
1833
7.03k
    BrunsliBitReaderInit(br);
1834
7.03k
    BRUNSLI_DCHECK(!jpg->components.empty());
1835
7.03k
    s.num_contexts = jpg->components.size();
1836
7.03k
    hs.stage = HistogramDataState::READ_SCHEME;
1837
    /* Optimization: hint arena about maximal used alphabet size: 272.
1838
     * 648 = 272 + 376, where 376 is a "universal" overhead for max-15-bit
1839
     * root-8-bit 2-level Huffman tables. */
1840
7.03k
    hs.arena.reserve(648);
1841
7.03k
  }
1842
7.03k
  PrepareBitReader(br, state);
1843
7.03k
  if (RemainingSectionLength(state) <= GetBytesAvailable(state)) {
1844
    // If end of section is reachable, then we could parse the remains in
1845
    // non-streaming mode.
1846
6.12k
    BrunsliBitReaderSetOptimistic(br);
1847
6.12k
  }
1848
7.03k
  const auto suspend_bit_reader = [&](BrunsliStatus result) -> BrunsliStatus {
1849
7.03k
    return SuspendBitReader(br, state, result);
1850
7.03k
  };
1851
1852
7.03k
  if (hs.stage == HistogramDataState::READ_SCHEME) {
1853
7.03k
    const size_t num_components = jpg->components.size();
1854
7.03k
    BRUNSLI_DCHECK(num_components <= 4);
1855
7.03k
    if (!BrunsliBitReaderCanRead(br, 3 * num_components)) {
1856
134
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1857
134
    }
1858
14.7k
    for (size_t i = 0; i < num_components; ++i) {
1859
7.94k
      size_t scheme = BrunsliBitReaderRead(br, 3);
1860
7.94k
      if (scheme >= kNumSchemes) return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1861
7.83k
      ComponentMeta& m = state->meta[i];
1862
7.83k
      m.context_bits = scheme;
1863
7.83k
      m.context_offset = s.num_contexts;
1864
7.83k
      s.num_contexts += kNumNonzeroContextSkip[scheme];
1865
7.83k
    }
1866
6.79k
    if (!BrunsliBitReaderIsHealthy(br)) {
1867
18
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1868
18
    }
1869
6.77k
    hs.stage = HistogramDataState::READ_NUM_HISTOGRAMS;
1870
6.77k
  }
1871
1872
6.77k
  if (hs.stage == HistogramDataState::READ_NUM_HISTOGRAMS) {
1873
6.77k
    if (!BrunsliBitReaderCanRead(br, 11)) {
1874
137
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1875
137
    }
1876
6.63k
    s.num_histograms = DecodeVarLenUint8(br) + 1;
1877
6.63k
    if (!BrunsliBitReaderIsHealthy(br)) {
1878
4
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1879
4
    }
1880
6.63k
    if (s.shallow_histograms) {
1881
0
      hs.stage = HistogramDataState::SKIP_CONTENT;
1882
6.63k
    } else {
1883
6.63k
      s.context_map_.resize(s.num_contexts * kNumAvrgContexts);
1884
6.63k
      state->context_map = s.context_map_.data();
1885
6.63k
      s.entropy_codes_.resize(s.num_histograms);
1886
6.63k
      state->entropy_codes = s.entropy_codes_.data();
1887
6.63k
      if (s.num_histograms > 1) {
1888
1.11k
        hs.stage = HistogramDataState::READ_CONTEXT_MAP_CODE;
1889
5.52k
      } else {
1890
5.52k
        hs.i = 0;
1891
5.52k
        hs.counts.resize(kCoeffAlphabetSize);
1892
5.52k
        hs.stage = HistogramDataState::READ_HISTOGRAMS;
1893
5.52k
      }
1894
6.63k
    }
1895
6.63k
  }
1896
1897
6.63k
  if (hs.stage == HistogramDataState::SKIP_CONTENT) {
1898
0
    suspend_bit_reader(BRUNSLI_OK);
1899
0
    if (!BrunsliBitReaderIsHealthy(br)) {
1900
0
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1901
0
    }
1902
0
    SkipAvailableBytes(state, RemainingSectionLength(state));
1903
0
    if (!IsAtSectionBoundary(state)) return BRUNSLI_NOT_ENOUGH_DATA;
1904
0
    hs.stage = HistogramDataState::DONE;
1905
0
  }
1906
1907
6.63k
  if (hs.stage == HistogramDataState::READ_CONTEXT_MAP_CODE) {
1908
1.11k
    if (!BrunsliBitReaderCanRead(br, 207 + s.num_histograms * 8)) {
1909
133
      return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1910
133
    }
1911
981
    hs.max_run_length_prefix = 0;
1912
981
    bool use_rle_for_zeros = !!BrunsliBitReaderRead(br, 1);
1913
981
    if (use_rle_for_zeros) {
1914
359
      hs.max_run_length_prefix = BrunsliBitReaderRead(br, 4) + 1;
1915
359
    }
1916
981
    size_t alphabet_size = s.num_histograms + hs.max_run_length_prefix;
1917
981
    hs.entropy.reset(new HuffmanDecodingData);
1918
981
    if (!hs.entropy->ReadFromBitStream(alphabet_size, br, &hs.arena)) {
1919
326
      return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1920
326
    }
1921
655
    hs.i = 0;
1922
655
    hs.stage = HistogramDataState::READ_CONTEXT_MAP;
1923
655
  }
1924
1925
6.17k
  if (hs.stage == HistogramDataState::READ_CONTEXT_MAP) {
1926
655
    BrunsliStatus status = DecodeContextMap(
1927
655
        *hs.entropy, hs.max_run_length_prefix, &hs.i, &s.context_map_, br);
1928
655
    if (status != BRUNSLI_OK) return suspend_bit_reader(status);
1929
349
    hs.i = 0;
1930
349
    hs.counts.resize(kCoeffAlphabetSize);
1931
349
    hs.stage = HistogramDataState::READ_HISTOGRAMS;
1932
349
  }
1933
1934
5.87k
  if (hs.stage == HistogramDataState::READ_HISTOGRAMS) {
1935
16.3k
    while (hs.i < s.num_histograms) {
1936
10.8k
      if (!BrunsliBitReaderCanRead(br, 9 + kCoeffAlphabetSize * 11)) {
1937
168
        return suspend_bit_reader(BRUNSLI_NOT_ENOUGH_DATA);
1938
168
      }
1939
10.7k
      if (!ReadHistogram(BRUNSLI_ANS_LOG_TAB_SIZE, &hs.counts, br)) {
1940
229
        return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1941
229
      }
1942
10.5k
      if (!s.entropy_codes_[hs.i].Init(hs.counts)) {
1943
0
        return suspend_bit_reader(BRUNSLI_INVALID_BRN);
1944
0
      }
1945
10.5k
      ++hs.i;
1946
10.5k
    }
1947
5.47k
    hs.entropy.reset();
1948
5.47k
    std::vector<uint32_t>().swap(hs.counts);
1949
5.47k
    suspend_bit_reader(BRUNSLI_OK);
1950
5.47k
    BrunsliBitReaderFinish(br);
1951
5.47k
    if (!BrunsliBitReaderIsHealthy(br)) return BRUNSLI_INVALID_BRN;
1952
5.46k
    if (!IsAtSectionBoundary(state)) return BRUNSLI_INVALID_BRN;
1953
5.45k
    hs.stage = HistogramDataState::DONE;
1954
5.45k
  }
1955
1956
5.45k
  hs.arena.reset();
1957
5.45k
  BRUNSLI_DCHECK(hs.stage == HistogramDataState::DONE);
1958
5.45k
  return BRUNSLI_OK;
1959
5.87k
}
1960
1961
5.43k
static BrunsliStatus DecodeDCDataSection(State* state) {
1962
5.43k
  size_t available = GetBytesAvailable(state) & ~1;
1963
5.43k
  size_t limit = RemainingSectionLength(state);
1964
5.43k
  BRUNSLI_DCHECK((limit & 1) == 0);
1965
5.43k
  size_t chunk_len = std::min(available, limit);
1966
  // If end of section is reachable, then we could parse the remains in
1967
  // non-streaming mode.
1968
5.43k
  bool is_last_chunk = (chunk_len == limit);
1969
5.43k
  WordSource in(state->data + state->pos, chunk_len, is_last_chunk);
1970
1971
5.43k
  BrunsliStatus status = DecodeDC(state, &in);
1972
1973
5.43k
  BRUNSLI_DCHECK((in.pos_ & 1) == 0);
1974
5.43k
  if (in.error_) return BRUNSLI_INVALID_BRN;
1975
5.15k
  BRUNSLI_DCHECK(in.pos_ <= chunk_len);
1976
5.15k
  SkipBytes(state, in.pos_);
1977
5.15k
  if (is_last_chunk) {
1978
4.91k
    BRUNSLI_DCHECK(status != BRUNSLI_NOT_ENOUGH_DATA);
1979
4.91k
    if (!IsAtSectionBoundary(state)) return BRUNSLI_INVALID_BRN;
1980
4.91k
  }
1981
5.15k
  return status;
1982
5.15k
}
1983
1984
4.89k
static BrunsliStatus DecodeACDataSection(State* state) {
1985
4.89k
  size_t available = GetBytesAvailable(state) & ~1;
1986
4.89k
  size_t limit = RemainingSectionLength(state);
1987
4.89k
  BRUNSLI_DCHECK((limit & 1) == 0);
1988
4.89k
  size_t chunk_len = std::min(available, limit);
1989
  // If end of section is reachable, then we could parse the remains in
1990
  // non-streaming mode.
1991
4.89k
  bool is_last_chunk = (chunk_len == limit);
1992
4.89k
  WordSource in(state->data + state->pos, chunk_len, is_last_chunk);
1993
1994
4.89k
  BrunsliStatus status = DecodeAC(state, &in);
1995
1996
4.89k
  BRUNSLI_DCHECK((in.pos_ & 1) == 0);
1997
4.89k
  if (in.error_) return BRUNSLI_INVALID_BRN;
1998
4.32k
  BRUNSLI_DCHECK(in.pos_ <= chunk_len);
1999
4.32k
  SkipBytes(state, in.pos_);
2000
4.32k
  if (is_last_chunk) {
2001
4.11k
    BRUNSLI_DCHECK(status != BRUNSLI_NOT_ENOUGH_DATA);
2002
4.11k
    if (!IsAtSectionBoundary(state)) return BRUNSLI_INVALID_BRN;
2003
4.11k
  }
2004
4.26k
  return status;
2005
4.32k
}
2006
2007
239
static Stage DecodeOriginalJpg(State* state, JPEGData* jpg) {
2008
239
  InternalState& s = *state->internal;
2009
239
  FallbackState& fs = s.fallback;
2010
2011
698
  while (fs.stage != FallbackState::DONE) {
2012
663
    switch (fs.stage) {
2013
239
      case FallbackState::READ_TAG: {
2014
239
        BrunsliStatus status = ReadTag(state, &s.section);
2015
239
        if (status != BRUNSLI_OK) return Fail(state, status);
2016
237
        if (s.section.tag != kBrunsliOriginalJpgTag || !s.section.is_section) {
2017
5
          return Fail(state, BRUNSLI_INVALID_BRN);
2018
5
        }
2019
232
        fs.stage = FallbackState::ENTER_SECTION;
2020
232
        break;
2021
237
      }
2022
2023
232
      case FallbackState::ENTER_SECTION: {
2024
232
        BrunsliStatus status = EnterSection(state, &s.section);
2025
232
        if (status != BRUNSLI_OK) return Fail(state, status);
2026
195
        jpg->original_jpg_size = s.section.remaining;
2027
        // Edge case - empty payload.
2028
195
        if (jpg->original_jpg_size == 0) {
2029
3
          jpg->original_jpg = nullptr;
2030
3
          fs.stage = FallbackState::DONE;
2031
3
          break;
2032
3
        }
2033
192
        fs.stage = FallbackState::READ_CONTENTS;
2034
192
        break;
2035
195
      }
2036
2037
192
      case FallbackState::READ_CONTENTS: {
2038
192
        size_t chunk_size = GetBytesAvailable(state);
2039
192
        if (chunk_size == 0) {
2040
          // TODO(eustas): dcheck s.section.remaining != 0
2041
79
          return Fail(state, BRUNSLI_NOT_ENOUGH_DATA);
2042
79
        }
2043
113
        const uint8_t* src = state->data + state->pos;
2044
113
        if (fs.policy == FallbackState::Policy::BORROW) {
2045
          // In BORROW mode, we require input to be complete.
2046
113
          if (chunk_size < jpg->original_jpg_size) {
2047
81
            return Fail(state, BRUNSLI_INVALID_BRN);
2048
81
          }
2049
32
          jpg->original_jpg = src;
2050
32
          SkipBytes(state, jpg->original_jpg_size);
2051
32
          fs.stage = FallbackState::DONE;
2052
32
          break;
2053
113
        } else {  // FallbackState::Policy::COPY
2054
0
          size_t remaining = jpg->original_jpg_size - fs.storage.size();
2055
0
          size_t to_copy = std::min(chunk_size, remaining);
2056
0
          fs.storage.insert(fs.storage.cend(), src, src + to_copy);
2057
0
          SkipBytes(state, to_copy);
2058
0
          if (fs.storage.size() == jpg->original_jpg_size) {
2059
0
            jpg->original_jpg = fs.storage.data();
2060
0
            fs.stage = FallbackState::DONE;
2061
0
            break;
2062
0
          }
2063
          // TODO(eustas): dcheck GetBytesAvailable(state) == 0
2064
0
          return Fail(state, BRUNSLI_NOT_ENOUGH_DATA);
2065
0
        }
2066
113
      }
2067
2068
0
      default:
2069
0
        return Fail(state, BRUNSLI_DECOMPRESSION_ERROR);
2070
663
    }
2071
663
  }
2072
2073
35
  LeaveSection(&s.section);
2074
35
  return Stage::DONE;
2075
239
}
2076
2077
40.1k
static Stage ParseSection(State* state) {
2078
40.1k
  InternalState& s = *state->internal;
2079
40.1k
  SectionHeaderState& sh = s.section_header;
2080
2081
40.1k
  Stage result = Stage::ERROR;
2082
2083
120k
  while (sh.stage != SectionHeaderState::DONE) {
2084
80.2k
    switch (sh.stage) {
2085
40.1k
      case SectionHeaderState::READ_TAG: {
2086
40.1k
        BrunsliStatus status = ReadTag(state, &s.section);
2087
40.1k
        if (status == BRUNSLI_NOT_ENOUGH_DATA) {
2088
86
          if (HasSection(state, kBrunsliACDataTag)) return Stage::DONE;
2089
86
        }
2090
40.1k
        if (status != BRUNSLI_OK) return Fail(state, status);
2091
40.0k
        if (s.section.is_section) {
2092
40.0k
          sh.stage = SectionHeaderState::ENTER_SECTION;
2093
40.0k
          continue;
2094
40.0k
        }
2095
25
        const uint32_t tag_bit = 1u << s.section.tag;
2096
25
        const bool is_known_section_tag = kKnownSectionTags & tag_bit;
2097
25
        if (is_known_section_tag) return Fail(state, BRUNSLI_INVALID_BRN);
2098
23
        sh.stage = SectionHeaderState::READ_VALUE;
2099
23
        continue;
2100
25
      }
2101
2102
23
      case SectionHeaderState::READ_VALUE: {
2103
        // No known varint tags on top level.
2104
23
        size_t sink;
2105
23
        BrunsliStatus status = DecodeBase128(state, &sink);
2106
23
        if (status != BRUNSLI_OK) return Fail(state, status);
2107
18
        result = Stage::SECTION;
2108
18
        sh.stage = SectionHeaderState::DONE;
2109
18
        continue;
2110
23
      }
2111
2112
40.0k
      case SectionHeaderState::ENTER_SECTION: {
2113
40.0k
        BrunsliStatus status = EnterSection(state, &s.section);
2114
40.0k
        if (status != BRUNSLI_OK) return Fail(state, status);
2115
40.0k
        result = Stage::SECTION_BODY;
2116
40.0k
        sh.stage = SectionHeaderState::DONE;
2117
40.0k
        continue;
2118
40.0k
      }
2119
2120
0
      default:
2121
0
        return Fail(state, BRUNSLI_DECOMPRESSION_ERROR);
2122
80.2k
    }
2123
80.2k
  }
2124
2125
40.0k
  sh.stage = SectionHeaderState::READ_TAG;
2126
40.0k
  BRUNSLI_DCHECK(result != Stage::ERROR);
2127
40.0k
  return result;
2128
40.1k
}
2129
2130
40.0k
static Stage ProcessSection(State* state, JPEGData* jpg) {
2131
40.0k
  InternalState& s = *state->internal;
2132
2133
40.0k
  const int32_t tag_bit = 1u << s.section.tag;
2134
40.0k
  const bool is_known_section_tag = kKnownSectionTags & tag_bit;
2135
2136
40.0k
  const bool skip_section =
2137
40.0k
      !is_known_section_tag || (state->skip_tags & tag_bit);
2138
2139
40.0k
  if (skip_section) {
2140
    // Skip section content.
2141
186
    size_t to_skip =
2142
186
        std::min(GetBytesAvailable(state), RemainingSectionLength(state));
2143
186
    state->pos += to_skip;
2144
186
    if (RemainingSectionLength(state) != 0) {
2145
123
      BRUNSLI_DCHECK(GetBytesAvailable(state) == 0);
2146
123
      return Fail(state, BRUNSLI_NOT_ENOUGH_DATA);
2147
123
    }
2148
63
    return Stage::SECTION;
2149
186
  }
2150
2151
39.8k
  switch (s.section.tag) {
2152
4.36k
    case kBrunsliMetaDataTag: {
2153
4.36k
      BrunsliStatus status = DecodeMetaDataSection(state, jpg);
2154
4.36k
      if (status != BRUNSLI_OK) return Fail(state, status);
2155
43
      break;
2156
4.36k
    }
2157
2158
11.0k
    case kBrunsliJPEGInternalsTag: {
2159
11.0k
      BrunsliStatus status = DecodeJPEGInternalsSection(state, jpg);
2160
11.0k
      if (status != BRUNSLI_OK) return Fail(state, status);
2161
8.60k
      break;
2162
11.0k
    }
2163
2164
8.60k
    case kBrunsliQuantDataTag: {
2165
7.01k
      if (!HasSection(state, kBrunsliJPEGInternalsTag)) {
2166
1
        return Fail(state, BRUNSLI_INVALID_BRN);
2167
1
      }
2168
7.01k
      BrunsliStatus status = DecodeQuantDataSection(state, jpg);
2169
7.01k
      if (status != BRUNSLI_OK) return Fail(state, status);
2170
5.47k
      break;
2171
7.01k
    }
2172
2173
7.03k
    case kBrunsliHistogramDataTag: {
2174
7.03k
      if (!HasSection(state, kBrunsliJPEGInternalsTag)) {
2175
2
        return Fail(state, BRUNSLI_INVALID_BRN);
2176
2
      }
2177
7.03k
      BrunsliStatus status = DecodeHistogramDataSection(state, jpg);
2178
7.03k
      if (status != BRUNSLI_OK) return Fail(state, status);
2179
5.45k
      break;
2180
7.03k
    }
2181
2182
5.45k
    case kBrunsliDCDataTag: {
2183
5.44k
      if (!HasSection(state, kBrunsliHistogramDataTag)) {
2184
1
        return Fail(state, BRUNSLI_INVALID_BRN);
2185
1
      }
2186
5.44k
      if (!HasSection(state, kBrunsliQuantDataTag)) {
2187
2
        return Fail(state, BRUNSLI_INVALID_BRN);
2188
2
      }
2189
      // This section reads input word by word.
2190
5.44k
      if ((RemainingSectionLength(state) & 1) != 0) {
2191
4
        return Fail(state, BRUNSLI_INVALID_BRN);
2192
4
      }
2193
5.43k
      internal::dec::WarmupMeta(jpg, state);
2194
5.43k
      BrunsliStatus status = DecodeDCDataSection(state);
2195
5.43k
      if (status != BRUNSLI_OK) return Fail(state, status);
2196
4.90k
      break;
2197
5.43k
    }
2198
2199
4.90k
    case kBrunsliACDataTag: {
2200
4.90k
      if (!HasSection(state, kBrunsliDCDataTag)) {
2201
1
        return Fail(state, BRUNSLI_INVALID_BRN);
2202
1
      }
2203
      // This section reads input word by word.
2204
4.90k
      if ((RemainingSectionLength(state) & 1) != 0) {
2205
2
        return Fail(state, BRUNSLI_INVALID_BRN);
2206
2
      }
2207
4.89k
      internal::dec::WarmupMeta(jpg, state);
2208
4.89k
      BrunsliStatus status = DecodeACDataSection(state);
2209
4.89k
      if (status != BRUNSLI_OK) return Fail(state, status);
2210
4.01k
      break;
2211
4.89k
    }
2212
2213
4.01k
    default:
2214
      /* Unreachable */
2215
0
      return Fail(state, BRUNSLI_INVALID_BRN);
2216
39.8k
  }
2217
2218
28.5k
  if (!IsAtSectionBoundary(state)) {
2219
1
    return Fail(state, BRUNSLI_INVALID_BRN);
2220
1
  }
2221
2222
  // Nothing is expected after the AC data.
2223
28.5k
  if (s.section.tag == kBrunsliACDataTag) {
2224
4.01k
    return Stage::DONE;
2225
4.01k
  }
2226
2227
24.4k
  return Stage::SECTION;
2228
28.5k
}
2229
2230
namespace internal {
2231
namespace dec {
2232
2233
15.6k
bool UpdateSubsamplingDerivatives(JPEGData* jpg) {
2234
43.7k
  for (size_t i = 0; i < jpg->components.size(); ++i) {
2235
28.0k
    JPEGComponent* c = &jpg->components[i];
2236
28.0k
    jpg->max_h_samp_factor = std::max(jpg->max_h_samp_factor, c->h_samp_factor);
2237
28.0k
    jpg->max_v_samp_factor = std::max(jpg->max_v_samp_factor, c->v_samp_factor);
2238
28.0k
  }
2239
15.6k
  jpg->MCU_rows = DivCeil(jpg->height, jpg->max_v_samp_factor * 8);
2240
15.6k
  jpg->MCU_cols = DivCeil(jpg->width, jpg->max_h_samp_factor * 8);
2241
43.7k
  for (size_t i = 0; i < jpg->components.size(); ++i) {
2242
28.0k
    JPEGComponent* c = &jpg->components[i];
2243
28.0k
    c->width_in_blocks = jpg->MCU_cols * c->h_samp_factor;
2244
28.0k
    c->height_in_blocks = jpg->MCU_rows * c->v_samp_factor;
2245
    // 8205 == max[ceil((65535 / (i * 8)) * i) for i in range(1, 16 + 1)]
2246
28.0k
    BRUNSLI_DCHECK(c->width_in_blocks <= 8205);
2247
28.0k
    BRUNSLI_DCHECK(c->height_in_blocks <= 8205);
2248
28.0k
    uint32_t num_blocks = c->width_in_blocks * c->height_in_blocks;
2249
28.0k
    if (num_blocks > kBrunsliMaxNumBlocks) {
2250
1
      return false;
2251
1
    }
2252
28.0k
    c->num_blocks = num_blocks;
2253
28.0k
  }
2254
15.6k
  return true;
2255
15.6k
}
2256
2257
15.6k
void PrepareMeta(const JPEGData* jpg, State* state) {
2258
15.6k
  InternalState& s = *state->internal;
2259
2260
15.6k
  size_t num_components = jpg->components.size();
2261
15.6k
  s.block_state_.resize(num_components);
2262
15.6k
  std::vector<ComponentMeta>& meta = state->meta;
2263
15.6k
  meta.resize(num_components);
2264
43.7k
  for (size_t i = 0; i < num_components; ++i) {
2265
28.0k
    const JPEGComponent& c = jpg->components[i];
2266
28.0k
    ComponentMeta& m = meta[i];
2267
28.0k
    m.h_samp = c.h_samp_factor;
2268
28.0k
    m.v_samp = c.v_samp_factor;
2269
28.0k
    m.width_in_blocks = jpg->MCU_cols * m.h_samp;
2270
28.0k
    m.height_in_blocks = jpg->MCU_rows * m.v_samp;
2271
28.0k
  }
2272
15.6k
}
2273
2274
10.3k
void WarmupMeta(JPEGData* jpg, State* state) {
2275
10.3k
  InternalState& s = *state->internal;
2276
10.3k
  std::vector<ComponentMeta>& meta = state->meta;
2277
10.3k
  const size_t num_components = meta.size();
2278
2279
10.3k
  if (!state->is_storage_allocated) {
2280
5.43k
    state->is_storage_allocated = true;
2281
11.5k
    for (size_t i = 0; i < num_components; ++i) {
2282
6.08k
      size_t num_blocks = meta[i].width_in_blocks * meta[i].height_in_blocks;
2283
6.08k
      jpg->components[i].coeffs.resize(num_blocks * kDCTBlockSize);
2284
6.08k
      s.block_state_[i].resize(num_blocks);
2285
6.08k
      meta[i].block_state = s.block_state_[i].data();
2286
6.08k
    }
2287
5.43k
  }
2288
2289
10.3k
  if (!s.is_meta_warm) {
2290
5.43k
    s.is_meta_warm = true;
2291
11.5k
    for (size_t c = 0; c < num_components; ++c) {
2292
6.08k
      ComponentMeta& m = meta[c];
2293
6.08k
      const JPEGQuantTable& q = jpg->quant[jpg->components[c].quant_idx];
2294
6.08k
      m.ac_coeffs = jpg->components[c].coeffs.data();
2295
6.08k
      m.ac_stride = m.width_in_blocks * kDCTBlockSize;
2296
6.08k
      m.b_stride = m.width_in_blocks;
2297
6.08k
      memcpy(m.quant.data(), q.values.data(),
2298
6.08k
             kDCTBlockSize * sizeof(m.quant[0]));
2299
6.08k
    }
2300
5.43k
  }
2301
10.3k
}
2302
2303
16.5k
BrunsliStatus DoProcessJpeg(State* state, JPEGData* jpg) {
2304
130k
  while (true) {
2305
130k
    switch (state->stage) {
2306
16.5k
      case Stage::SIGNATURE:
2307
16.5k
        state->stage = VerifySignature(state);
2308
16.5k
        break;
2309
2310
16.5k
      case Stage::HEADER:
2311
16.5k
        state->stage = DecodeHeader(state, jpg);
2312
16.5k
        break;
2313
2314
239
      case Stage::FALLBACK:
2315
239
        state->stage = DecodeOriginalJpg(state, jpg);
2316
239
        break;
2317
2318
40.1k
      case Stage::SECTION:
2319
40.1k
        state->stage = ParseSection(state);
2320
40.1k
        break;
2321
2322
40.0k
      case Stage::SECTION_BODY:
2323
40.0k
        state->stage = ProcessSection(state, jpg);
2324
40.0k
        break;
2325
2326
4.05k
      case Stage::DONE:
2327
        // It is expected that there is no garbage after the valid brunsli
2328
        // stream.
2329
4.05k
        if (state->pos != state->len) {
2330
28
          state->stage = Fail(state, BRUNSLI_INVALID_BRN);
2331
28
          break;
2332
28
        }
2333
4.02k
        return BRUNSLI_OK;
2334
2335
12.5k
      case Stage::ERROR:
2336
12.5k
        return state->internal->result;
2337
2338
0
      default:
2339
        /* Unreachable */
2340
0
        state->stage = Fail(state, BRUNSLI_DECOMPRESSION_ERROR);
2341
0
        break;
2342
130k
    }
2343
130k
  }
2344
16.5k
}
2345
2346
/** Adds new input to buffer. */
2347
16.5k
void ChargeBuffer(State* state) {
2348
16.5k
  InternalState& s = *state->internal;
2349
16.5k
  Buffer& b = s.buffer;
2350
2351
16.5k
  b.borrowed_len = 0;
2352
16.5k
  b.external_data = state->data;
2353
16.5k
  b.external_pos = state->pos;
2354
16.5k
  b.external_len = state->len;
2355
16.5k
}
2356
2357
constexpr size_t kBufferMaxReadAhead = 600;
2358
2359
/** Sets input source either to buffered, or to external data. */
2360
16.5k
void LoadInput(State* state) {
2361
16.5k
  InternalState& s = *state->internal;
2362
16.5k
  Buffer& b = s.buffer;
2363
2364
  // No data buffered. Just pass external data as is.
2365
16.5k
  if (b.data_len == 0) {
2366
16.5k
    state->data = b.external_data;
2367
16.5k
    state->pos = b.external_pos;
2368
16.5k
    state->len = b.external_len;
2369
16.5k
    return;
2370
16.5k
  }
2371
2372
0
  BRUNSLI_DCHECK(b.data_len <= kBufferMaxReadAhead);
2373
2374
  // Otherwise use buffered data.
2375
0
  size_t available = b.external_len - b.external_pos;
2376
  // Always try to borrow as much as parser could require. This way, when
2377
  // buffer is unable to provide enough input, we could switch to unbuffered
2378
  // input.
2379
0
  b.borrowed_len = std::min(kBufferMaxReadAhead, available);
2380
0
  memcpy(b.data.data() + b.data_len, b.external_data + b.external_pos,
2381
0
         b.borrowed_len);
2382
0
  state->data = b.data.data();
2383
0
  state->pos = 0;
2384
0
  state->len = b.data_len + b.borrowed_len;
2385
0
}
2386
2387
/**
2388
 * Cancel borrowed bytes, if any.
2389
 *
2390
 * Returns false, if it is impossible to continue parsing.
2391
 */
2392
16.5k
bool UnloadInput(State* state, BrunsliStatus result) {
2393
16.5k
  InternalState& s = *state->internal;
2394
16.5k
  Buffer& b = s.buffer;
2395
2396
  // Non-buffered input; put tail to buffer.
2397
16.5k
  if (state->data == b.external_data) {
2398
16.5k
    b.external_pos = state->pos;
2399
16.5k
    BRUNSLI_DCHECK(b.external_pos <= b.external_len);
2400
16.5k
    if (result != BRUNSLI_NOT_ENOUGH_DATA) return true;
2401
6.00k
    BRUNSLI_DCHECK(b.data_len == 0);
2402
6.00k
    size_t available = b.external_len - b.external_pos;
2403
6.00k
    BRUNSLI_DCHECK(available < kBufferMaxReadAhead);
2404
6.00k
    if (b.data.empty()) b.data.resize(2 * kBufferMaxReadAhead);
2405
6.00k
    b.data_len = available;
2406
6.00k
    memcpy(b.data.data(), b.external_data + b.external_pos, b.data_len);
2407
6.00k
    b.external_pos += available;
2408
6.00k
    return false;
2409
16.5k
  }
2410
2411
  // Buffer depleted; switch to non-buffered input.
2412
0
  if (state->pos >= b.data_len) {
2413
0
    size_t used_borrowed_bytes = state->pos - b.data_len;
2414
0
    b.data_len = 0;
2415
0
    b.external_pos += used_borrowed_bytes;
2416
0
    return true;
2417
0
  }
2418
2419
  // Buffer not depleted; either problem discovered was already buffered data,
2420
  // or extra input was too-short.
2421
0
  b.data_len -= state->pos;
2422
0
  if (result == BRUNSLI_NOT_ENOUGH_DATA) {
2423
    // We couldn't have taken more bytes.
2424
0
    BRUNSLI_DCHECK(b.external_pos + b.borrowed_len == b.external_len);
2425
    // Remaining piece is not too large.
2426
0
    BRUNSLI_DCHECK(b.data_len + b.borrowed_len < kBufferMaxReadAhead);
2427
0
    b.data_len += b.borrowed_len;
2428
0
    b.external_pos += b.borrowed_len;
2429
0
  }
2430
0
  BRUNSLI_DCHECK(!b.data.empty());
2431
0
  if (state->pos > 0 && b.data_len > 0) {
2432
0
    memmove(b.data.data(), b.data.data() + state->pos, b.data_len);
2433
0
  }
2434
0
  BRUNSLI_DCHECK(b.data_len <= kBufferMaxReadAhead);
2435
2436
0
  return (result != BRUNSLI_NOT_ENOUGH_DATA);
2437
0
}
2438
2439
/** Sets back user-provided input. */
2440
16.5k
void UnchargeBuffer(State* state) {
2441
16.5k
  InternalState& s = *state->internal;
2442
16.5k
  Buffer& b = s.buffer;
2443
2444
16.5k
  state->data = b.external_data;
2445
16.5k
  state->pos = b.external_pos;
2446
16.5k
  state->len = b.external_len;
2447
16.5k
}
2448
2449
16.5k
BrunsliStatus ProcessJpeg(State* state, JPEGData* jpg) {
2450
16.5k
  InternalState& s = *state->internal;
2451
2452
16.5k
  if (state->pos > state->len) return BRUNSLI_INVALID_PARAM;
2453
16.5k
  ChargeBuffer(state);
2454
2455
16.5k
  BrunsliStatus result = BRUNSLI_NOT_ENOUGH_DATA;
2456
27.1k
  while (result == BRUNSLI_NOT_ENOUGH_DATA) {
2457
16.5k
    if (state->stage == Stage::ERROR) {
2458
      // General error -> no recovery.
2459
0
      if (s.result != BRUNSLI_NOT_ENOUGH_DATA) return s.result;
2460
      // Continue parsing.
2461
0
      s.result = BRUNSLI_OK;
2462
0
      state->stage = s.last_stage;
2463
0
      s.last_stage = Stage::ERROR;
2464
0
    }
2465
2466
16.5k
    LoadInput(state);
2467
16.5k
    if (s.section.is_active) {
2468
0
      s.section.milestone = state->pos;
2469
0
      s.section.projected_end = s.section.milestone + s.section.remaining;
2470
0
    }
2471
2472
16.5k
    s.section.tags_met |= state->tags_met;
2473
16.5k
    result = DoProcessJpeg(state, jpg);
2474
2475
16.5k
    if (s.section.is_active) {
2476
      // TODO(eustas): dcheck state->pos > s.section.milestone
2477
16.3k
      size_t processed_len = state->pos - s.section.milestone;
2478
      // TODO(eustas): dcheck processed_len < s.section.remaining
2479
16.3k
      s.section.remaining -= processed_len;
2480
16.3k
    }
2481
2482
16.5k
    if (!UnloadInput(state, result)) break;
2483
16.5k
  }
2484
16.5k
  UnchargeBuffer(state);
2485
16.5k
  return result;
2486
16.5k
}
2487
2488
}  // namespace dec
2489
}  // namespace internal
2490
2491
BrunsliStatus BrunsliDecodeJpeg(const uint8_t* data, const size_t len,
2492
16.5k
                                JPEGData* jpg, BrunsliDecodeOptions options) {
2493
16.5k
  if (!data) return BRUNSLI_INVALID_PARAM;
2494
2495
16.5k
  State state;
2496
16.5k
  state.ApplyOptions(options);
2497
16.5k
  state.data = data;
2498
16.5k
  state.len = len;
2499
16.5k
  state.internal->fallback.policy =
2500
16.5k
      internal::dec::FallbackState::Policy::BORROW;
2501
2502
16.5k
  return internal::dec::ProcessJpeg(&state, jpg);
2503
16.5k
}
2504
2505
BrunsliStatus BrunsliDecodeJpeg(const uint8_t* data, size_t len,
2506
16.5k
                                JPEGData* jpg) {
2507
16.5k
  return BrunsliDecodeJpeg(data, len, jpg, BrunsliDecodeOptions());
2508
16.5k
}
2509
2510
size_t BrunsliEstimateDecoderPeakMemoryUsage(const uint8_t* data,
2511
0
                                             const size_t len) {
2512
0
  if (!data) return BRUNSLI_INVALID_PARAM;
2513
2514
0
  State state;
2515
0
  state.data = data;
2516
0
  state.len = len;
2517
  // Only (shallowly) parse these sections.
2518
0
  uint8_t shallow_sections =
2519
0
      (1u << kBrunsliHistogramDataTag) | (1u << kBrunsliMetaDataTag);
2520
  // Skip all other sections.
2521
0
  state.skip_tags = ~shallow_sections;
2522
0
  InternalState& s = *state.internal;
2523
0
  s.shallow_histograms = true;
2524
0
  s.shallow_metadata = true;
2525
0
  s.fallback.policy = internal::dec::FallbackState::Policy::BORROW;
2526
2527
0
  JPEGData jpg;
2528
0
  BrunsliStatus status = internal::dec::ProcessJpeg(&state, &jpg);
2529
2530
0
  if (status != BRUNSLI_OK) return 0;
2531
2532
0
  size_t out_size = 2 * len;
2533
0
  size_t total_num_blocks = 0;
2534
0
  size_t component_state_size = 0;
2535
0
  for (size_t i = 0; i < jpg.components.size(); ++i) {
2536
0
    const JPEGComponent& c = jpg.components[i];
2537
0
    total_num_blocks += c.num_blocks;
2538
0
    component_state_size += ComponentState::SizeInBytes(c.width_in_blocks);
2539
0
  }
2540
0
  size_t jpeg_data_size = total_num_blocks * kDCTBlockSize * sizeof(coeff_t);
2541
0
  size_t context_map_size = s.num_contexts * kNumAvrgContexts * sizeof(int32_t);
2542
0
  size_t histogram_size = s.num_histograms * sizeof(ANSDecodingData);
2543
0
  size_t decode_peak = context_map_size + histogram_size + component_state_size;
2544
0
  size_t jpeg_writer_size = (1u << 17u) + (1u << 16u) * sizeof(int32_t);
2545
0
  size_t metadata_size = s.metadata.metadata_size;
2546
0
  int8_t brotli_lgwin = s.metadata_brotli_lgwin;
2547
0
  size_t brotli_log_window_size =
2548
0
      std::max<size_t>(10, std::min<size_t>(24, brotli_lgwin));
2549
0
  out_size += metadata_size;
2550
  // TODO(eustas): at the time of serialization there are two copies of
2551
  // metadata; it is possible to avoid this, if that becomes a problem.
2552
0
  jpeg_data_size += metadata_size;
2553
  // TODO(eustas): also account for other brotli decoder memory usage
2554
  //               (~1.5MiB in worst case, so not a big deal).
2555
0
  decode_peak += (1 << brotli_log_window_size);
2556
0
  return (out_size + jpeg_data_size + std::max(decode_peak, jpeg_writer_size));
2557
0
}
2558
2559
0
BrunsliDecoder::BrunsliDecoder(BrunsliDecodeOptions options) {
2560
0
  jpg_.reset(new JPEGData);
2561
0
  state_.reset(new State);
2562
0
  state_->ApplyOptions(options);
2563
0
}
2564
2565
0
BrunsliDecoder::~BrunsliDecoder() {}
2566
2567
BrunsliDecoder::Status BrunsliDecoder::Decode(size_t* available_in,
2568
                                              const uint8_t** next_in,
2569
                                              size_t* available_out,
2570
0
                                              uint8_t** next_out) {
2571
0
  JPEGData* jpg = jpg_.get();
2572
0
  BRUNSLI_DCHECK(jpg);
2573
0
  State* state = state_.get();
2574
0
  BRUNSLI_DCHECK(state);
2575
2576
0
  state->data = *next_in;
2577
0
  state->pos = 0;
2578
0
  state->len = *available_in;
2579
0
  BrunsliStatus parse_status = internal::dec::ProcessJpeg(state, jpg);
2580
0
  size_t consumed_bytes = state->pos;
2581
0
  *available_in -= consumed_bytes;
2582
0
  *next_in += consumed_bytes;
2583
2584
0
  if ((parse_status != BRUNSLI_OK) &&
2585
0
      (parse_status != BRUNSLI_NOT_ENOUGH_DATA)) {
2586
0
    return BrunsliDecoder::ERROR;
2587
0
  }
2588
2589
  // All the input given input should be consumed.
2590
0
  BRUNSLI_DCHECK(*available_in == 0);
2591
2592
0
  SerializationStatus serialization_status =
2593
0
      SerializeJpeg(state, *jpg, available_out, next_out);
2594
0
  if (serialization_status == SerializationStatus::ERROR) {
2595
0
    return BrunsliDecoder::ERROR;
2596
0
  }
2597
2598
0
  switch (serialization_status) {
2599
0
    case SerializationStatus::DONE:
2600
      // Should be impossible to finish serialization without finishing parsing.
2601
0
      BRUNSLI_DCHECK(parse_status == BRUNSLI_OK);
2602
0
      return BrunsliDecoder::DONE;
2603
2604
0
    case SerializationStatus::NEEDS_MORE_INPUT:
2605
      // If serializer says that data is incomplete, parser should say the same.
2606
0
      BRUNSLI_DCHECK(parse_status == BRUNSLI_NOT_ENOUGH_DATA);
2607
0
      return BrunsliDecoder::NEEDS_MORE_INPUT;
2608
2609
0
    case SerializationStatus::NEEDS_MORE_OUTPUT:
2610
      // TODO(eustas): make sure that serializer could produce more bytes
2611
      //               without providing more bytes to parser
2612
0
      BRUNSLI_DCHECK(*available_out == 0);
2613
0
      return BrunsliDecoder::NEEDS_MORE_OUTPUT;
2614
2615
0
    case SerializationStatus::ERROR:
2616
0
      return BrunsliDecoder::ERROR;
2617
2618
0
    default:
2619
      /* Unreachable */
2620
0
      BRUNSLI_DCHECK(false);
2621
0
      return BrunsliDecoder::ERROR;
2622
0
  }
2623
0
}
2624
2625
}  // namespace brunsli