Coverage Report

Created: 2022-08-24 06:33

/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