/src/libjxl/lib/jxl/passes_state.cc
Line | Count | Source (jump to first uncovered line) |
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 <jxl/memory_manager.h> |
9 | | |
10 | | #include "lib/jxl/ac_strategy.h" |
11 | | #include "lib/jxl/base/compiler_specific.h" |
12 | | #include "lib/jxl/base/status.h" |
13 | | #include "lib/jxl/chroma_from_luma.h" |
14 | | #include "lib/jxl/coeff_order.h" |
15 | | #include "lib/jxl/frame_dimensions.h" |
16 | | #include "lib/jxl/frame_header.h" |
17 | | #include "lib/jxl/image.h" |
18 | | #include "lib/jxl/image_ops.h" |
19 | | |
20 | | namespace jxl { |
21 | | |
22 | | Status InitializePassesSharedState(const FrameHeader& frame_header, |
23 | | PassesSharedState* JXL_RESTRICT shared, |
24 | 25.9k | bool encoder) { |
25 | 25.9k | JXL_ENSURE(frame_header.nonserialized_metadata != nullptr); |
26 | 25.9k | shared->metadata = frame_header.nonserialized_metadata; |
27 | 25.9k | shared->frame_dim = frame_header.ToFrameDimensions(); |
28 | 25.9k | shared->image_features.patches.SetShared(&shared->reference_frames); |
29 | | |
30 | 25.9k | const FrameDimensions& frame_dim = shared->frame_dim; |
31 | 25.9k | JxlMemoryManager* memory_manager = shared->memory_manager; |
32 | | |
33 | 25.9k | JXL_ASSIGN_OR_RETURN( |
34 | 25.9k | shared->ac_strategy, |
35 | 25.9k | AcStrategyImage::Create(memory_manager, frame_dim.xsize_blocks, |
36 | 25.9k | frame_dim.ysize_blocks)); |
37 | 25.9k | JXL_ASSIGN_OR_RETURN(shared->raw_quant_field, |
38 | 25.9k | ImageI::Create(memory_manager, frame_dim.xsize_blocks, |
39 | 25.9k | frame_dim.ysize_blocks)); |
40 | 25.9k | JXL_ASSIGN_OR_RETURN(shared->epf_sharpness, |
41 | 25.9k | ImageB::Create(memory_manager, frame_dim.xsize_blocks, |
42 | 25.9k | frame_dim.ysize_blocks)); |
43 | 25.9k | JXL_ASSIGN_OR_RETURN( |
44 | 25.9k | shared->cmap, ColorCorrelationMap::Create(memory_manager, frame_dim.xsize, |
45 | 25.9k | frame_dim.ysize)); |
46 | | |
47 | | // In the decoder, we allocate coeff orders afterwards, when we know how many |
48 | | // we will actually need. |
49 | 25.9k | shared->coeff_order_size = kCoeffOrderMaxSize; |
50 | 25.9k | if (encoder && |
51 | 25.9k | shared->coeff_orders.size() < |
52 | 0 | frame_header.passes.num_passes * kCoeffOrderMaxSize && |
53 | 25.9k | frame_header.encoding == FrameEncoding::kVarDCT) { |
54 | 0 | shared->coeff_orders.resize(frame_header.passes.num_passes * |
55 | 0 | kCoeffOrderMaxSize); |
56 | 0 | } |
57 | | |
58 | 25.9k | JXL_ASSIGN_OR_RETURN(shared->quant_dc, |
59 | 25.9k | ImageB::Create(memory_manager, frame_dim.xsize_blocks, |
60 | 25.9k | frame_dim.ysize_blocks)); |
61 | | |
62 | 25.9k | bool use_dc_frame = ((frame_header.flags & FrameHeader::kUseDcFrame) != 0u); |
63 | 25.9k | if (!encoder && use_dc_frame) { |
64 | 65 | if (frame_header.dc_level == 4) { |
65 | 1 | return JXL_FAILURE("Invalid DC level for kUseDcFrame: %u", |
66 | 1 | frame_header.dc_level); |
67 | 1 | } |
68 | 64 | shared->dc_storage = Image3F(); |
69 | 64 | shared->dc = &shared->dc_frames[frame_header.dc_level]; |
70 | 64 | if (shared->dc->xsize() == 0) { |
71 | 3 | return JXL_FAILURE( |
72 | 3 | "kUseDcFrame specified for dc_level %u, but no frame was decoded " |
73 | 3 | "with level %u", |
74 | 3 | frame_header.dc_level, frame_header.dc_level + 1); |
75 | 3 | } |
76 | 61 | ZeroFillImage(&shared->quant_dc); |
77 | 25.8k | } else { |
78 | 25.8k | JXL_ASSIGN_OR_RETURN(shared->dc_storage, |
79 | 25.8k | Image3F::Create(memory_manager, frame_dim.xsize_blocks, |
80 | 25.8k | frame_dim.ysize_blocks)); |
81 | 25.8k | shared->dc = &shared->dc_storage; |
82 | 25.8k | } |
83 | | |
84 | 25.9k | return true; |
85 | 25.9k | } |
86 | | |
87 | | } // namespace jxl |