Coverage Report

Created: 2026-03-31 06:56

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