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
InitializePassesSharedState(const FrameHeader & frame_header,PassesSharedState * JXL_RESTRICT shared,bool encoder)14 Status InitializePassesSharedState(const FrameHeader& frame_header,
15 PassesSharedState* JXL_RESTRICT shared,
16 bool encoder) {
17 JXL_ASSERT(frame_header.nonserialized_metadata != nullptr);
18 shared->frame_header = frame_header;
19 shared->metadata = frame_header.nonserialized_metadata;
20 shared->frame_dim = frame_header.ToFrameDimensions();
21 shared->image_features.patches.SetPassesSharedState(shared);
22
23 const FrameDimensions& frame_dim = shared->frame_dim;
24
25 shared->ac_strategy =
26 AcStrategyImage(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
27 shared->raw_quant_field =
28 ImageI(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
29 shared->epf_sharpness =
30 ImageB(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
31 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 shared->coeff_order_size = kCoeffOrderMaxSize;
36 if (encoder &&
37 shared->coeff_orders.size() <
38 frame_header.passes.num_passes * kCoeffOrderMaxSize &&
39 frame_header.encoding == FrameEncoding::kVarDCT) {
40 shared->coeff_orders.resize(frame_header.passes.num_passes *
41 kCoeffOrderMaxSize);
42 }
43
44 shared->quant_dc = ImageB(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
45 if (!(frame_header.flags & FrameHeader::kUseDcFrame) || encoder) {
46 shared->dc_storage =
47 Image3F(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
48 } else {
49 if (frame_header.dc_level == 4) {
50 return JXL_FAILURE("Invalid DC level for kUseDcFrame: %u",
51 frame_header.dc_level);
52 }
53 shared->dc = &shared->dc_frames[frame_header.dc_level];
54 if (shared->dc->xsize() == 0) {
55 return JXL_FAILURE(
56 "kUseDcFrame specified for dc_level %u, but no frame was decoded "
57 "with level %u",
58 frame_header.dc_level, frame_header.dc_level + 1);
59 }
60 ZeroFillImage(&shared->quant_dc);
61 }
62
63 shared->dc_storage = Image3F(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
64
65 return true;
66 }
67
68 } // namespace jxl
69