/src/libjxl/lib/jxl/passes_state.cc
Line | Count | Source |
1 | | // Copyright (c) the JPEG XL Project Authors. All rights reserved. |
2 | | // |
3 | | // Use of this source code is governed by a BSD-style |
4 | | // license that can be found in the LICENSE file. |
5 | | |
6 | | #include "lib/jxl/passes_state.h" |
7 | | |
8 | | #include "lib/jxl/chroma_from_luma.h" |
9 | | #include "lib/jxl/coeff_order.h" |
10 | | #include "lib/jxl/common.h" |
11 | | |
12 | | namespace jxl { |
13 | | |
14 | | Status InitializePassesSharedState(const FrameHeader& frame_header, |
15 | | PassesSharedState* JXL_RESTRICT shared, |
16 | 24.1k | bool encoder) { |
17 | 24.1k | JXL_ASSERT(frame_header.nonserialized_metadata != nullptr); |
18 | 24.1k | shared->frame_header = frame_header; |
19 | 24.1k | shared->metadata = frame_header.nonserialized_metadata; |
20 | 24.1k | shared->frame_dim = frame_header.ToFrameDimensions(); |
21 | 24.1k | shared->image_features.patches.SetPassesSharedState(shared); |
22 | | |
23 | 24.1k | const FrameDimensions& frame_dim = shared->frame_dim; |
24 | | |
25 | 24.1k | shared->ac_strategy = |
26 | 24.1k | AcStrategyImage(frame_dim.xsize_blocks, frame_dim.ysize_blocks); |
27 | 24.1k | shared->raw_quant_field = |
28 | 24.1k | ImageI(frame_dim.xsize_blocks, frame_dim.ysize_blocks); |
29 | 24.1k | shared->epf_sharpness = |
30 | 24.1k | ImageB(frame_dim.xsize_blocks, frame_dim.ysize_blocks); |
31 | 24.1k | shared->cmap = ColorCorrelationMap(frame_dim.xsize, frame_dim.ysize); |
32 | | |
33 | | // In the decoder, we allocate coeff orders afterwards, when we know how many |
34 | | // we will actually need. |
35 | 24.1k | shared->coeff_order_size = kCoeffOrderMaxSize; |
36 | 24.1k | if (encoder && |
37 | 24.1k | shared->coeff_orders.size() < |
38 | 92 | frame_header.passes.num_passes * kCoeffOrderMaxSize && |
39 | 24.1k | frame_header.encoding == FrameEncoding::kVarDCT) { |
40 | 92 | shared->coeff_orders.resize(frame_header.passes.num_passes * |
41 | 92 | kCoeffOrderMaxSize); |
42 | 92 | } |
43 | | |
44 | 24.1k | shared->quant_dc = ImageB(frame_dim.xsize_blocks, frame_dim.ysize_blocks); |
45 | | |
46 | 24.1k | bool use_dc_frame = !!(frame_header.flags & FrameHeader::kUseDcFrame); |
47 | 24.1k | if (!encoder && use_dc_frame) { |
48 | 87 | if (frame_header.dc_level == 4) { |
49 | 1 | return JXL_FAILURE("Invalid DC level for kUseDcFrame: %u", |
50 | 1 | frame_header.dc_level); |
51 | 1 | } |
52 | 86 | shared->dc_storage = Image3F(); |
53 | 86 | shared->dc = &shared->dc_frames[frame_header.dc_level]; |
54 | 86 | if (shared->dc->xsize() == 0) { |
55 | 11 | return JXL_FAILURE( |
56 | 11 | "kUseDcFrame specified for dc_level %u, but no frame was decoded " |
57 | 11 | "with level %u", |
58 | 11 | frame_header.dc_level, frame_header.dc_level + 1); |
59 | 11 | } |
60 | 75 | ZeroFillImage(&shared->quant_dc); |
61 | 24.0k | } else { |
62 | 24.0k | shared->dc_storage = |
63 | 24.0k | Image3F(frame_dim.xsize_blocks, frame_dim.ysize_blocks); |
64 | 24.0k | shared->dc = &shared->dc_storage; |
65 | 24.0k | } |
66 | | |
67 | 24.1k | return true; |
68 | 24.1k | } |
69 | | |
70 | | } // namespace jxl |