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