Coverage Report

Created: 2026-04-12 06:07

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