Coverage Report

Created: 2025-12-03 07:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjxl/lib/jxl/compressed_dc.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/compressed_dc.h"
7
8
#include <jxl/memory_manager.h>
9
10
#include <algorithm>
11
#include <cstdint>
12
#include <cstdlib>
13
#include <cstring>
14
#include <vector>
15
16
#include "lib/jxl/ac_context.h"
17
#include "lib/jxl/frame_header.h"
18
#include "lib/jxl/modular/modular_image.h"
19
20
#undef HWY_TARGET_INCLUDE
21
#define HWY_TARGET_INCLUDE "lib/jxl/compressed_dc.cc"
22
#include <hwy/foreach_target.h>
23
#include <hwy/highway.h>
24
25
#include "lib/jxl/base/compiler_specific.h"
26
#include "lib/jxl/base/data_parallel.h"
27
#include "lib/jxl/base/rect.h"
28
#include "lib/jxl/base/status.h"
29
#include "lib/jxl/image.h"
30
HWY_BEFORE_NAMESPACE();
31
namespace jxl {
32
namespace HWY_NAMESPACE {
33
34
using D = HWY_FULL(float);
35
using DScalar = HWY_CAPPED(float, 1);
36
37
// These templates are not found via ADL.
38
using hwy::HWY_NAMESPACE::Abs;
39
using hwy::HWY_NAMESPACE::Add;
40
using hwy::HWY_NAMESPACE::Div;
41
using hwy::HWY_NAMESPACE::Max;
42
using hwy::HWY_NAMESPACE::Mul;
43
using hwy::HWY_NAMESPACE::MulAdd;
44
using hwy::HWY_NAMESPACE::Rebind;
45
using hwy::HWY_NAMESPACE::Sub;
46
using hwy::HWY_NAMESPACE::Vec;
47
using hwy::HWY_NAMESPACE::ZeroIfNegative;
48
49
// TODO(veluca): optimize constants.
50
const float w1 = 0.20345139757231578f;
51
const float w2 = 0.0334829185968739f;
52
const float w0 = 1.0f - 4.0f * (w1 + w2);
53
54
template <class V>
55
6.84M
V MaxWorkaround(V a, V b) {
56
#if (HWY_TARGET == HWY_AVX3) && HWY_COMPILER_CLANG <= 800
57
  // Prevents "Do not know how to split the result of this operator" error
58
  return IfThenElse(a > b, a, b);
59
#else
60
6.84M
  return Max(a, b);
61
6.84M
#endif
62
6.84M
}
Unexecuted instantiation: hwy::N_SSE4::Vec128<float, 1ul> jxl::N_SSE4::MaxWorkaround<hwy::N_SSE4::Vec128<float, 1ul> >(hwy::N_SSE4::Vec128<float, 1ul>, hwy::N_SSE4::Vec128<float, 1ul>)
Unexecuted instantiation: hwy::N_SSE4::Vec128<float, 4ul> jxl::N_SSE4::MaxWorkaround<hwy::N_SSE4::Vec128<float, 4ul> >(hwy::N_SSE4::Vec128<float, 4ul>, hwy::N_SSE4::Vec128<float, 4ul>)
hwy::N_AVX2::Vec128<float, 1ul> jxl::N_AVX2::MaxWorkaround<hwy::N_AVX2::Vec128<float, 1ul> >(hwy::N_AVX2::Vec128<float, 1ul>, hwy::N_AVX2::Vec128<float, 1ul>)
Line
Count
Source
55
5.04M
V MaxWorkaround(V a, V b) {
56
#if (HWY_TARGET == HWY_AVX3) && HWY_COMPILER_CLANG <= 800
57
  // Prevents "Do not know how to split the result of this operator" error
58
  return IfThenElse(a > b, a, b);
59
#else
60
5.04M
  return Max(a, b);
61
5.04M
#endif
62
5.04M
}
hwy::N_AVX2::Vec256<float> jxl::N_AVX2::MaxWorkaround<hwy::N_AVX2::Vec256<float> >(hwy::N_AVX2::Vec256<float>, hwy::N_AVX2::Vec256<float>)
Line
Count
Source
55
1.79M
V MaxWorkaround(V a, V b) {
56
#if (HWY_TARGET == HWY_AVX3) && HWY_COMPILER_CLANG <= 800
57
  // Prevents "Do not know how to split the result of this operator" error
58
  return IfThenElse(a > b, a, b);
59
#else
60
1.79M
  return Max(a, b);
61
1.79M
#endif
62
1.79M
}
Unexecuted instantiation: hwy::N_AVX3::Vec128<float, 1ul> jxl::N_AVX3::MaxWorkaround<hwy::N_AVX3::Vec128<float, 1ul> >(hwy::N_AVX3::Vec128<float, 1ul>, hwy::N_AVX3::Vec128<float, 1ul>)
Unexecuted instantiation: hwy::N_AVX3::Vec512<float> jxl::N_AVX3::MaxWorkaround<hwy::N_AVX3::Vec512<float> >(hwy::N_AVX3::Vec512<float>, hwy::N_AVX3::Vec512<float>)
Unexecuted instantiation: hwy::N_AVX3_ZEN4::Vec128<float, 1ul> jxl::N_AVX3_ZEN4::MaxWorkaround<hwy::N_AVX3_ZEN4::Vec128<float, 1ul> >(hwy::N_AVX3_ZEN4::Vec128<float, 1ul>, hwy::N_AVX3_ZEN4::Vec128<float, 1ul>)
Unexecuted instantiation: hwy::N_AVX3_ZEN4::Vec512<float> jxl::N_AVX3_ZEN4::MaxWorkaround<hwy::N_AVX3_ZEN4::Vec512<float> >(hwy::N_AVX3_ZEN4::Vec512<float>, hwy::N_AVX3_ZEN4::Vec512<float>)
Unexecuted instantiation: hwy::N_AVX3_SPR::Vec128<float, 1ul> jxl::N_AVX3_SPR::MaxWorkaround<hwy::N_AVX3_SPR::Vec128<float, 1ul> >(hwy::N_AVX3_SPR::Vec128<float, 1ul>, hwy::N_AVX3_SPR::Vec128<float, 1ul>)
Unexecuted instantiation: hwy::N_AVX3_SPR::Vec512<float> jxl::N_AVX3_SPR::MaxWorkaround<hwy::N_AVX3_SPR::Vec512<float> >(hwy::N_AVX3_SPR::Vec512<float>, hwy::N_AVX3_SPR::Vec512<float>)
Unexecuted instantiation: hwy::N_SSE2::Vec128<float, 1ul> jxl::N_SSE2::MaxWorkaround<hwy::N_SSE2::Vec128<float, 1ul> >(hwy::N_SSE2::Vec128<float, 1ul>, hwy::N_SSE2::Vec128<float, 1ul>)
Unexecuted instantiation: hwy::N_SSE2::Vec128<float, 4ul> jxl::N_SSE2::MaxWorkaround<hwy::N_SSE2::Vec128<float, 4ul> >(hwy::N_SSE2::Vec128<float, 4ul>, hwy::N_SSE2::Vec128<float, 4ul>)
63
64
template <typename D>
65
JXL_INLINE void ComputePixelChannel(const D d, const float dc_factor,
66
                                    const float* JXL_RESTRICT row_top,
67
                                    const float* JXL_RESTRICT row,
68
                                    const float* JXL_RESTRICT row_bottom,
69
                                    Vec<D>* JXL_RESTRICT mc,
70
                                    Vec<D>* JXL_RESTRICT sm,
71
6.84M
                                    Vec<D>* JXL_RESTRICT gap, size_t x) {
72
6.84M
  const auto tl = LoadU(d, row_top + x - 1);
73
6.84M
  const auto tc = Load(d, row_top + x);
74
6.84M
  const auto tr = LoadU(d, row_top + x + 1);
75
76
6.84M
  const auto ml = LoadU(d, row + x - 1);
77
6.84M
  *mc = Load(d, row + x);
78
6.84M
  const auto mr = LoadU(d, row + x + 1);
79
80
6.84M
  const auto bl = LoadU(d, row_bottom + x - 1);
81
6.84M
  const auto bc = Load(d, row_bottom + x);
82
6.84M
  const auto br = LoadU(d, row_bottom + x + 1);
83
84
6.84M
  const auto w_center = Set(d, w0);
85
6.84M
  const auto w_side = Set(d, w1);
86
6.84M
  const auto w_corner = Set(d, w2);
87
88
6.84M
  const auto corner = Add(Add(tl, tr), Add(bl, br));
89
6.84M
  const auto side = Add(Add(ml, mr), Add(tc, bc));
90
6.84M
  *sm = MulAdd(corner, w_corner, MulAdd(side, w_side, Mul(*mc, w_center)));
91
92
6.84M
  const auto dc_quant = Set(d, dc_factor);
93
6.84M
  *gap = MaxWorkaround(*gap, Abs(Div(Sub(*mc, *sm), dc_quant)));
94
6.84M
}
Unexecuted instantiation: void jxl::N_SSE4::ComputePixelChannel<hwy::N_SSE4::Simd<float, 1ul, 0> >(hwy::N_SSE4::Simd<float, 1ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_SSE4::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_SSE4::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_SSE4::Simd<float, 1ul, 0>)()))*, unsigned long)
Unexecuted instantiation: void jxl::N_SSE4::ComputePixelChannel<hwy::N_SSE4::Simd<float, 4ul, 0> >(hwy::N_SSE4::Simd<float, 4ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_SSE4::Simd<float, 4ul, 0>)()))*, decltype (Zero((hwy::N_SSE4::Simd<float, 4ul, 0>)()))*, decltype (Zero((hwy::N_SSE4::Simd<float, 4ul, 0>)()))*, unsigned long)
void jxl::N_AVX2::ComputePixelChannel<hwy::N_AVX2::Simd<float, 1ul, 0> >(hwy::N_AVX2::Simd<float, 1ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_AVX2::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_AVX2::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_AVX2::Simd<float, 1ul, 0>)()))*, unsigned long)
Line
Count
Source
71
5.04M
                                    Vec<D>* JXL_RESTRICT gap, size_t x) {
72
5.04M
  const auto tl = LoadU(d, row_top + x - 1);
73
5.04M
  const auto tc = Load(d, row_top + x);
74
5.04M
  const auto tr = LoadU(d, row_top + x + 1);
75
76
5.04M
  const auto ml = LoadU(d, row + x - 1);
77
5.04M
  *mc = Load(d, row + x);
78
5.04M
  const auto mr = LoadU(d, row + x + 1);
79
80
5.04M
  const auto bl = LoadU(d, row_bottom + x - 1);
81
5.04M
  const auto bc = Load(d, row_bottom + x);
82
5.04M
  const auto br = LoadU(d, row_bottom + x + 1);
83
84
5.04M
  const auto w_center = Set(d, w0);
85
5.04M
  const auto w_side = Set(d, w1);
86
5.04M
  const auto w_corner = Set(d, w2);
87
88
5.04M
  const auto corner = Add(Add(tl, tr), Add(bl, br));
89
5.04M
  const auto side = Add(Add(ml, mr), Add(tc, bc));
90
5.04M
  *sm = MulAdd(corner, w_corner, MulAdd(side, w_side, Mul(*mc, w_center)));
91
92
5.04M
  const auto dc_quant = Set(d, dc_factor);
93
5.04M
  *gap = MaxWorkaround(*gap, Abs(Div(Sub(*mc, *sm), dc_quant)));
94
5.04M
}
void jxl::N_AVX2::ComputePixelChannel<hwy::N_AVX2::Simd<float, 8ul, 0> >(hwy::N_AVX2::Simd<float, 8ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_AVX2::Simd<float, 8ul, 0>)()))*, decltype (Zero((hwy::N_AVX2::Simd<float, 8ul, 0>)()))*, decltype (Zero((hwy::N_AVX2::Simd<float, 8ul, 0>)()))*, unsigned long)
Line
Count
Source
71
1.79M
                                    Vec<D>* JXL_RESTRICT gap, size_t x) {
72
1.79M
  const auto tl = LoadU(d, row_top + x - 1);
73
1.79M
  const auto tc = Load(d, row_top + x);
74
1.79M
  const auto tr = LoadU(d, row_top + x + 1);
75
76
1.79M
  const auto ml = LoadU(d, row + x - 1);
77
1.79M
  *mc = Load(d, row + x);
78
1.79M
  const auto mr = LoadU(d, row + x + 1);
79
80
1.79M
  const auto bl = LoadU(d, row_bottom + x - 1);
81
1.79M
  const auto bc = Load(d, row_bottom + x);
82
1.79M
  const auto br = LoadU(d, row_bottom + x + 1);
83
84
1.79M
  const auto w_center = Set(d, w0);
85
1.79M
  const auto w_side = Set(d, w1);
86
1.79M
  const auto w_corner = Set(d, w2);
87
88
1.79M
  const auto corner = Add(Add(tl, tr), Add(bl, br));
89
1.79M
  const auto side = Add(Add(ml, mr), Add(tc, bc));
90
1.79M
  *sm = MulAdd(corner, w_corner, MulAdd(side, w_side, Mul(*mc, w_center)));
91
92
1.79M
  const auto dc_quant = Set(d, dc_factor);
93
1.79M
  *gap = MaxWorkaround(*gap, Abs(Div(Sub(*mc, *sm), dc_quant)));
94
1.79M
}
Unexecuted instantiation: void jxl::N_AVX3::ComputePixelChannel<hwy::N_AVX3::Simd<float, 1ul, 0> >(hwy::N_AVX3::Simd<float, 1ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_AVX3::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_AVX3::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_AVX3::Simd<float, 1ul, 0>)()))*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3::ComputePixelChannel<hwy::N_AVX3::Simd<float, 16ul, 0> >(hwy::N_AVX3::Simd<float, 16ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_AVX3::Simd<float, 16ul, 0>)()))*, decltype (Zero((hwy::N_AVX3::Simd<float, 16ul, 0>)()))*, decltype (Zero((hwy::N_AVX3::Simd<float, 16ul, 0>)()))*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3_ZEN4::ComputePixelChannel<hwy::N_AVX3_ZEN4::Simd<float, 1ul, 0> >(hwy::N_AVX3_ZEN4::Simd<float, 1ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_AVX3_ZEN4::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_AVX3_ZEN4::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_AVX3_ZEN4::Simd<float, 1ul, 0>)()))*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3_ZEN4::ComputePixelChannel<hwy::N_AVX3_ZEN4::Simd<float, 16ul, 0> >(hwy::N_AVX3_ZEN4::Simd<float, 16ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_AVX3_ZEN4::Simd<float, 16ul, 0>)()))*, decltype (Zero((hwy::N_AVX3_ZEN4::Simd<float, 16ul, 0>)()))*, decltype (Zero((hwy::N_AVX3_ZEN4::Simd<float, 16ul, 0>)()))*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3_SPR::ComputePixelChannel<hwy::N_AVX3_SPR::Simd<float, 1ul, 0> >(hwy::N_AVX3_SPR::Simd<float, 1ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_AVX3_SPR::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_AVX3_SPR::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_AVX3_SPR::Simd<float, 1ul, 0>)()))*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3_SPR::ComputePixelChannel<hwy::N_AVX3_SPR::Simd<float, 16ul, 0> >(hwy::N_AVX3_SPR::Simd<float, 16ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_AVX3_SPR::Simd<float, 16ul, 0>)()))*, decltype (Zero((hwy::N_AVX3_SPR::Simd<float, 16ul, 0>)()))*, decltype (Zero((hwy::N_AVX3_SPR::Simd<float, 16ul, 0>)()))*, unsigned long)
Unexecuted instantiation: void jxl::N_SSE2::ComputePixelChannel<hwy::N_SSE2::Simd<float, 1ul, 0> >(hwy::N_SSE2::Simd<float, 1ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_SSE2::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_SSE2::Simd<float, 1ul, 0>)()))*, decltype (Zero((hwy::N_SSE2::Simd<float, 1ul, 0>)()))*, unsigned long)
Unexecuted instantiation: void jxl::N_SSE2::ComputePixelChannel<hwy::N_SSE2::Simd<float, 4ul, 0> >(hwy::N_SSE2::Simd<float, 4ul, 0>, float, float const*, float const*, float const*, decltype (Zero((hwy::N_SSE2::Simd<float, 4ul, 0>)()))*, decltype (Zero((hwy::N_SSE2::Simd<float, 4ul, 0>)()))*, decltype (Zero((hwy::N_SSE2::Simd<float, 4ul, 0>)()))*, unsigned long)
95
96
template <typename D>
97
JXL_INLINE void ComputePixel(
98
    const float* JXL_RESTRICT dc_factors,
99
    const float* JXL_RESTRICT* JXL_RESTRICT rows_top,
100
    const float* JXL_RESTRICT* JXL_RESTRICT rows,
101
    const float* JXL_RESTRICT* JXL_RESTRICT rows_bottom,
102
2.28M
    float* JXL_RESTRICT* JXL_RESTRICT out_rows, size_t x) {
103
2.28M
  const D d;
104
2.28M
  auto mc_x = Undefined(d);
105
2.28M
  auto mc_y = Undefined(d);
106
2.28M
  auto mc_b = Undefined(d);
107
2.28M
  auto sm_x = Undefined(d);
108
2.28M
  auto sm_y = Undefined(d);
109
2.28M
  auto sm_b = Undefined(d);
110
2.28M
  auto gap = Set(d, 0.5f);
111
2.28M
  ComputePixelChannel(d, dc_factors[0], rows_top[0], rows[0], rows_bottom[0],
112
2.28M
                      &mc_x, &sm_x, &gap, x);
113
2.28M
  ComputePixelChannel(d, dc_factors[1], rows_top[1], rows[1], rows_bottom[1],
114
2.28M
                      &mc_y, &sm_y, &gap, x);
115
2.28M
  ComputePixelChannel(d, dc_factors[2], rows_top[2], rows[2], rows_bottom[2],
116
2.28M
                      &mc_b, &sm_b, &gap, x);
117
2.28M
  auto factor = MulAdd(Set(d, -4.0f), gap, Set(d, 3.0f));
118
2.28M
  factor = ZeroIfNegative(factor);
119
120
2.28M
  auto out = MulAdd(Sub(sm_x, mc_x), factor, mc_x);
121
2.28M
  Store(out, d, out_rows[0] + x);
122
2.28M
  out = MulAdd(Sub(sm_y, mc_y), factor, mc_y);
123
2.28M
  Store(out, d, out_rows[1] + x);
124
2.28M
  out = MulAdd(Sub(sm_b, mc_b), factor, mc_b);
125
2.28M
  Store(out, d, out_rows[2] + x);
126
2.28M
}
Unexecuted instantiation: void jxl::N_SSE4::ComputePixel<hwy::N_SSE4::Simd<float, 1ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Unexecuted instantiation: void jxl::N_SSE4::ComputePixel<hwy::N_SSE4::Simd<float, 4ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
void jxl::N_AVX2::ComputePixel<hwy::N_AVX2::Simd<float, 1ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Line
Count
Source
102
1.68M
    float* JXL_RESTRICT* JXL_RESTRICT out_rows, size_t x) {
103
1.68M
  const D d;
104
1.68M
  auto mc_x = Undefined(d);
105
1.68M
  auto mc_y = Undefined(d);
106
1.68M
  auto mc_b = Undefined(d);
107
1.68M
  auto sm_x = Undefined(d);
108
1.68M
  auto sm_y = Undefined(d);
109
1.68M
  auto sm_b = Undefined(d);
110
1.68M
  auto gap = Set(d, 0.5f);
111
1.68M
  ComputePixelChannel(d, dc_factors[0], rows_top[0], rows[0], rows_bottom[0],
112
1.68M
                      &mc_x, &sm_x, &gap, x);
113
1.68M
  ComputePixelChannel(d, dc_factors[1], rows_top[1], rows[1], rows_bottom[1],
114
1.68M
                      &mc_y, &sm_y, &gap, x);
115
1.68M
  ComputePixelChannel(d, dc_factors[2], rows_top[2], rows[2], rows_bottom[2],
116
1.68M
                      &mc_b, &sm_b, &gap, x);
117
1.68M
  auto factor = MulAdd(Set(d, -4.0f), gap, Set(d, 3.0f));
118
1.68M
  factor = ZeroIfNegative(factor);
119
120
1.68M
  auto out = MulAdd(Sub(sm_x, mc_x), factor, mc_x);
121
1.68M
  Store(out, d, out_rows[0] + x);
122
1.68M
  out = MulAdd(Sub(sm_y, mc_y), factor, mc_y);
123
1.68M
  Store(out, d, out_rows[1] + x);
124
1.68M
  out = MulAdd(Sub(sm_b, mc_b), factor, mc_b);
125
1.68M
  Store(out, d, out_rows[2] + x);
126
1.68M
}
void jxl::N_AVX2::ComputePixel<hwy::N_AVX2::Simd<float, 8ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Line
Count
Source
102
598k
    float* JXL_RESTRICT* JXL_RESTRICT out_rows, size_t x) {
103
598k
  const D d;
104
598k
  auto mc_x = Undefined(d);
105
598k
  auto mc_y = Undefined(d);
106
598k
  auto mc_b = Undefined(d);
107
598k
  auto sm_x = Undefined(d);
108
598k
  auto sm_y = Undefined(d);
109
598k
  auto sm_b = Undefined(d);
110
598k
  auto gap = Set(d, 0.5f);
111
598k
  ComputePixelChannel(d, dc_factors[0], rows_top[0], rows[0], rows_bottom[0],
112
598k
                      &mc_x, &sm_x, &gap, x);
113
598k
  ComputePixelChannel(d, dc_factors[1], rows_top[1], rows[1], rows_bottom[1],
114
598k
                      &mc_y, &sm_y, &gap, x);
115
598k
  ComputePixelChannel(d, dc_factors[2], rows_top[2], rows[2], rows_bottom[2],
116
598k
                      &mc_b, &sm_b, &gap, x);
117
598k
  auto factor = MulAdd(Set(d, -4.0f), gap, Set(d, 3.0f));
118
598k
  factor = ZeroIfNegative(factor);
119
120
598k
  auto out = MulAdd(Sub(sm_x, mc_x), factor, mc_x);
121
598k
  Store(out, d, out_rows[0] + x);
122
598k
  out = MulAdd(Sub(sm_y, mc_y), factor, mc_y);
123
598k
  Store(out, d, out_rows[1] + x);
124
598k
  out = MulAdd(Sub(sm_b, mc_b), factor, mc_b);
125
598k
  Store(out, d, out_rows[2] + x);
126
598k
}
Unexecuted instantiation: void jxl::N_AVX3::ComputePixel<hwy::N_AVX3::Simd<float, 1ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3::ComputePixel<hwy::N_AVX3::Simd<float, 16ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3_ZEN4::ComputePixel<hwy::N_AVX3_ZEN4::Simd<float, 1ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3_ZEN4::ComputePixel<hwy::N_AVX3_ZEN4::Simd<float, 16ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3_SPR::ComputePixel<hwy::N_AVX3_SPR::Simd<float, 1ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Unexecuted instantiation: void jxl::N_AVX3_SPR::ComputePixel<hwy::N_AVX3_SPR::Simd<float, 16ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Unexecuted instantiation: void jxl::N_SSE2::ComputePixel<hwy::N_SSE2::Simd<float, 1ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
Unexecuted instantiation: void jxl::N_SSE2::ComputePixel<hwy::N_SSE2::Simd<float, 4ul, 0> >(float const*, float const* restrict*, float const* restrict*, float const* restrict*, float* restrict*, unsigned long)
127
128
Status AdaptiveDCSmoothing(JxlMemoryManager* memory_manager,
129
                           const float* dc_factors, Image3F* dc,
130
8.24k
                           ThreadPool* pool) {
131
8.24k
  const size_t xsize = dc->xsize();
132
8.24k
  const size_t ysize = dc->ysize();
133
8.24k
  if (ysize <= 2 || xsize <= 2) return true;
134
135
  // TODO(veluca): use tile-based processing?
136
  // TODO(veluca): decide if changes to the y channel should be propagated to
137
  // the x and b channels through color correlation.
138
5.71k
  JXL_ENSURE(w1 + w2 < 0.25f);
139
140
11.4k
  JXL_ASSIGN_OR_RETURN(Image3F smoothed,
141
11.4k
                       Image3F::Create(memory_manager, xsize, ysize));
142
  // Fill in borders that the loop below will not. First and last are unused.
143
22.8k
  for (size_t c = 0; c < 3; c++) {
144
34.2k
    for (size_t y : {static_cast<size_t>(0), ysize - 1}) {
145
34.2k
      memcpy(smoothed.PlaneRow(c, y), dc->PlaneRow(c, y),
146
34.2k
             xsize * sizeof(float));
147
34.2k
    }
148
17.1k
  }
149
163k
  auto process_row = [&](const uint32_t y, size_t /*thread*/) -> Status {
150
163k
    const float* JXL_RESTRICT rows_top[3]{
151
163k
        dc->ConstPlaneRow(0, y - 1),
152
163k
        dc->ConstPlaneRow(1, y - 1),
153
163k
        dc->ConstPlaneRow(2, y - 1),
154
163k
    };
155
163k
    const float* JXL_RESTRICT rows[3] = {
156
163k
        dc->ConstPlaneRow(0, y),
157
163k
        dc->ConstPlaneRow(1, y),
158
163k
        dc->ConstPlaneRow(2, y),
159
163k
    };
160
163k
    const float* JXL_RESTRICT rows_bottom[3] = {
161
163k
        dc->ConstPlaneRow(0, y + 1),
162
163k
        dc->ConstPlaneRow(1, y + 1),
163
163k
        dc->ConstPlaneRow(2, y + 1),
164
163k
    };
165
163k
    float* JXL_RESTRICT rows_out[3] = {
166
163k
        smoothed.PlaneRow(0, y),
167
163k
        smoothed.PlaneRow(1, y),
168
163k
        smoothed.PlaneRow(2, y),
169
163k
    };
170
326k
    for (size_t x : {static_cast<size_t>(0), xsize - 1}) {
171
1.30M
      for (size_t c = 0; c < 3; c++) {
172
979k
        rows_out[c][x] = rows[c][x];
173
979k
      }
174
326k
    }
175
176
163k
    size_t x = 1;
177
    // First pixels
178
163k
    const size_t N = Lanes(D());
179
1.28M
    for (; x < std::min(N, xsize - 1); x++) {
180
1.12M
      ComputePixel<DScalar>(dc_factors, rows_top, rows, rows_bottom, rows_out,
181
1.12M
                            x);
182
1.12M
    }
183
    // Full vectors.
184
762k
    for (; x + N <= xsize - 1; x += N) {
185
598k
      ComputePixel<D>(dc_factors, rows_top, rows, rows_bottom, rows_out, x);
186
598k
    }
187
    // Last pixels.
188
719k
    for (; x < xsize - 1; x++) {
189
556k
      ComputePixel<DScalar>(dc_factors, rows_top, rows, rows_bottom, rows_out,
190
556k
                            x);
191
556k
    }
192
163k
    return true;
193
163k
  };
Unexecuted instantiation: compressed_dc.cc:jxl::N_SSE4::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)::$_0::operator()(unsigned int, unsigned long) const
compressed_dc.cc:jxl::N_AVX2::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)::$_0::operator()(unsigned int, unsigned long) const
Line
Count
Source
149
163k
  auto process_row = [&](const uint32_t y, size_t /*thread*/) -> Status {
150
163k
    const float* JXL_RESTRICT rows_top[3]{
151
163k
        dc->ConstPlaneRow(0, y - 1),
152
163k
        dc->ConstPlaneRow(1, y - 1),
153
163k
        dc->ConstPlaneRow(2, y - 1),
154
163k
    };
155
163k
    const float* JXL_RESTRICT rows[3] = {
156
163k
        dc->ConstPlaneRow(0, y),
157
163k
        dc->ConstPlaneRow(1, y),
158
163k
        dc->ConstPlaneRow(2, y),
159
163k
    };
160
163k
    const float* JXL_RESTRICT rows_bottom[3] = {
161
163k
        dc->ConstPlaneRow(0, y + 1),
162
163k
        dc->ConstPlaneRow(1, y + 1),
163
163k
        dc->ConstPlaneRow(2, y + 1),
164
163k
    };
165
163k
    float* JXL_RESTRICT rows_out[3] = {
166
163k
        smoothed.PlaneRow(0, y),
167
163k
        smoothed.PlaneRow(1, y),
168
163k
        smoothed.PlaneRow(2, y),
169
163k
    };
170
326k
    for (size_t x : {static_cast<size_t>(0), xsize - 1}) {
171
1.30M
      for (size_t c = 0; c < 3; c++) {
172
979k
        rows_out[c][x] = rows[c][x];
173
979k
      }
174
326k
    }
175
176
163k
    size_t x = 1;
177
    // First pixels
178
163k
    const size_t N = Lanes(D());
179
1.28M
    for (; x < std::min(N, xsize - 1); x++) {
180
1.12M
      ComputePixel<DScalar>(dc_factors, rows_top, rows, rows_bottom, rows_out,
181
1.12M
                            x);
182
1.12M
    }
183
    // Full vectors.
184
762k
    for (; x + N <= xsize - 1; x += N) {
185
598k
      ComputePixel<D>(dc_factors, rows_top, rows, rows_bottom, rows_out, x);
186
598k
    }
187
    // Last pixels.
188
719k
    for (; x < xsize - 1; x++) {
189
556k
      ComputePixel<DScalar>(dc_factors, rows_top, rows, rows_bottom, rows_out,
190
556k
                            x);
191
556k
    }
192
163k
    return true;
193
163k
  };
Unexecuted instantiation: compressed_dc.cc:jxl::N_AVX3::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)::$_0::operator()(unsigned int, unsigned long) const
Unexecuted instantiation: compressed_dc.cc:jxl::N_AVX3_ZEN4::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)::$_0::operator()(unsigned int, unsigned long) const
Unexecuted instantiation: compressed_dc.cc:jxl::N_AVX3_SPR::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)::$_0::operator()(unsigned int, unsigned long) const
Unexecuted instantiation: compressed_dc.cc:jxl::N_SSE2::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)::$_0::operator()(unsigned int, unsigned long) const
194
11.4k
  JXL_RETURN_IF_ERROR(RunOnPool(pool, 1, ysize - 1, ThreadPool::NoInit,
195
11.4k
                                process_row, "DCSmoothingRow"));
196
5.71k
  dc->Swap(smoothed);
197
5.71k
  return true;
198
11.4k
}
Unexecuted instantiation: jxl::N_SSE4::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)
jxl::N_AVX2::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)
Line
Count
Source
130
8.24k
                           ThreadPool* pool) {
131
8.24k
  const size_t xsize = dc->xsize();
132
8.24k
  const size_t ysize = dc->ysize();
133
8.24k
  if (ysize <= 2 || xsize <= 2) return true;
134
135
  // TODO(veluca): use tile-based processing?
136
  // TODO(veluca): decide if changes to the y channel should be propagated to
137
  // the x and b channels through color correlation.
138
5.71k
  JXL_ENSURE(w1 + w2 < 0.25f);
139
140
11.4k
  JXL_ASSIGN_OR_RETURN(Image3F smoothed,
141
11.4k
                       Image3F::Create(memory_manager, xsize, ysize));
142
  // Fill in borders that the loop below will not. First and last are unused.
143
22.8k
  for (size_t c = 0; c < 3; c++) {
144
34.2k
    for (size_t y : {static_cast<size_t>(0), ysize - 1}) {
145
34.2k
      memcpy(smoothed.PlaneRow(c, y), dc->PlaneRow(c, y),
146
34.2k
             xsize * sizeof(float));
147
34.2k
    }
148
17.1k
  }
149
11.4k
  auto process_row = [&](const uint32_t y, size_t /*thread*/) -> Status {
150
11.4k
    const float* JXL_RESTRICT rows_top[3]{
151
11.4k
        dc->ConstPlaneRow(0, y - 1),
152
11.4k
        dc->ConstPlaneRow(1, y - 1),
153
11.4k
        dc->ConstPlaneRow(2, y - 1),
154
11.4k
    };
155
11.4k
    const float* JXL_RESTRICT rows[3] = {
156
11.4k
        dc->ConstPlaneRow(0, y),
157
11.4k
        dc->ConstPlaneRow(1, y),
158
11.4k
        dc->ConstPlaneRow(2, y),
159
11.4k
    };
160
11.4k
    const float* JXL_RESTRICT rows_bottom[3] = {
161
11.4k
        dc->ConstPlaneRow(0, y + 1),
162
11.4k
        dc->ConstPlaneRow(1, y + 1),
163
11.4k
        dc->ConstPlaneRow(2, y + 1),
164
11.4k
    };
165
11.4k
    float* JXL_RESTRICT rows_out[3] = {
166
11.4k
        smoothed.PlaneRow(0, y),
167
11.4k
        smoothed.PlaneRow(1, y),
168
11.4k
        smoothed.PlaneRow(2, y),
169
11.4k
    };
170
11.4k
    for (size_t x : {static_cast<size_t>(0), xsize - 1}) {
171
11.4k
      for (size_t c = 0; c < 3; c++) {
172
11.4k
        rows_out[c][x] = rows[c][x];
173
11.4k
      }
174
11.4k
    }
175
176
11.4k
    size_t x = 1;
177
    // First pixels
178
11.4k
    const size_t N = Lanes(D());
179
11.4k
    for (; x < std::min(N, xsize - 1); x++) {
180
11.4k
      ComputePixel<DScalar>(dc_factors, rows_top, rows, rows_bottom, rows_out,
181
11.4k
                            x);
182
11.4k
    }
183
    // Full vectors.
184
11.4k
    for (; x + N <= xsize - 1; x += N) {
185
11.4k
      ComputePixel<D>(dc_factors, rows_top, rows, rows_bottom, rows_out, x);
186
11.4k
    }
187
    // Last pixels.
188
11.4k
    for (; x < xsize - 1; x++) {
189
11.4k
      ComputePixel<DScalar>(dc_factors, rows_top, rows, rows_bottom, rows_out,
190
11.4k
                            x);
191
11.4k
    }
192
11.4k
    return true;
193
11.4k
  };
194
11.4k
  JXL_RETURN_IF_ERROR(RunOnPool(pool, 1, ysize - 1, ThreadPool::NoInit,
195
11.4k
                                process_row, "DCSmoothingRow"));
196
5.71k
  dc->Swap(smoothed);
197
5.71k
  return true;
198
11.4k
}
Unexecuted instantiation: jxl::N_AVX3::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)
Unexecuted instantiation: jxl::N_AVX3_ZEN4::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)
Unexecuted instantiation: jxl::N_AVX3_SPR::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)
Unexecuted instantiation: jxl::N_SSE2::AdaptiveDCSmoothing(JxlMemoryManagerStruct*, float const*, jxl::Image3<float>*, jxl::ThreadPool*)
199
200
// DC dequantization.
201
void DequantDC(const Rect& r, Image3F* dc, ImageB* quant_dc, const Image& in,
202
               const float* dc_factors, float mul, const float* cfl_factors,
203
               const YCbCrChromaSubsampling& chroma_subsampling,
204
12.6k
               const BlockCtxMap& bctx) {
205
12.6k
  const HWY_FULL(float) df;
206
12.6k
  const Rebind<pixel_type, HWY_FULL(float)> di;  // assumes pixel_type <= float
207
12.6k
  if (chroma_subsampling.Is444()) {
208
12.3k
    const auto fac_x = Set(df, dc_factors[0] * mul);
209
12.3k
    const auto fac_y = Set(df, dc_factors[1] * mul);
210
12.3k
    const auto fac_b = Set(df, dc_factors[2] * mul);
211
12.3k
    const auto cfl_fac_x = Set(df, cfl_factors[0]);
212
12.3k
    const auto cfl_fac_b = Set(df, cfl_factors[2]);
213
317k
    for (size_t y = 0; y < r.ysize(); y++) {
214
305k
      float* dec_row_x = r.PlaneRow(dc, 0, y);
215
305k
      float* dec_row_y = r.PlaneRow(dc, 1, y);
216
305k
      float* dec_row_b = r.PlaneRow(dc, 2, y);
217
305k
      const int32_t* quant_row_x = in.channel[1].plane.Row(y);
218
305k
      const int32_t* quant_row_y = in.channel[0].plane.Row(y);
219
305k
      const int32_t* quant_row_b = in.channel[2].plane.Row(y);
220
1.48M
      for (size_t x = 0; x < r.xsize(); x += Lanes(di)) {
221
1.18M
        const auto in_q_x = Load(di, quant_row_x + x);
222
1.18M
        const auto in_q_y = Load(di, quant_row_y + x);
223
1.18M
        const auto in_q_b = Load(di, quant_row_b + x);
224
1.18M
        const auto in_x = Mul(ConvertTo(df, in_q_x), fac_x);
225
1.18M
        const auto in_y = Mul(ConvertTo(df, in_q_y), fac_y);
226
1.18M
        const auto in_b = Mul(ConvertTo(df, in_q_b), fac_b);
227
1.18M
        Store(in_y, df, dec_row_y + x);
228
1.18M
        Store(MulAdd(in_y, cfl_fac_x, in_x), df, dec_row_x + x);
229
1.18M
        Store(MulAdd(in_y, cfl_fac_b, in_b), df, dec_row_b + x);
230
1.18M
      }
231
305k
    }
232
12.3k
  } else {
233
813
    for (size_t c : {1, 0, 2}) {
234
813
      Rect rect(r.x0() >> chroma_subsampling.HShift(c),
235
813
                r.y0() >> chroma_subsampling.VShift(c),
236
813
                r.xsize() >> chroma_subsampling.HShift(c),
237
813
                r.ysize() >> chroma_subsampling.VShift(c));
238
813
      const auto fac = Set(df, dc_factors[c] * mul);
239
813
      const Channel& ch = in.channel[c < 2 ? c ^ 1 : c];
240
39.9k
      for (size_t y = 0; y < rect.ysize(); y++) {
241
39.1k
        const int32_t* quant_row = ch.plane.Row(y);
242
39.1k
        float* row = rect.PlaneRow(dc, c, y);
243
316k
        for (size_t x = 0; x < rect.xsize(); x += Lanes(di)) {
244
277k
          const auto in_q = Load(di, quant_row + x);
245
277k
          const auto out = Mul(ConvertTo(df, in_q), fac);
246
277k
          Store(out, df, row + x);
247
277k
        }
248
39.1k
      }
249
813
    }
250
271
  }
251
12.6k
  if (bctx.num_dc_ctxs <= 1) {
252
321k
    for (size_t y = 0; y < r.ysize(); y++) {
253
309k
      uint8_t* qdc_row = r.Row(quant_dc, y);
254
309k
      memset(qdc_row, 0, sizeof(*qdc_row) * r.xsize());
255
309k
    }
256
11.7k
  } else {
257
10.3k
    for (size_t y = 0; y < r.ysize(); y++) {
258
9.44k
      uint8_t* qdc_row_val = r.Row(quant_dc, y);
259
9.44k
      const int32_t* quant_row_x =
260
9.44k
          in.channel[1].plane.Row(y >> chroma_subsampling.VShift(0));
261
9.44k
      const int32_t* quant_row_y =
262
9.44k
          in.channel[0].plane.Row(y >> chroma_subsampling.VShift(1));
263
9.44k
      const int32_t* quant_row_b =
264
9.44k
          in.channel[2].plane.Row(y >> chroma_subsampling.VShift(2));
265
945k
      for (size_t x = 0; x < r.xsize(); x++) {
266
936k
        int bucket_x = 0;
267
936k
        int bucket_y = 0;
268
936k
        int bucket_b = 0;
269
8.19M
        for (int t : bctx.dc_thresholds[0]) {
270
8.19M
          if (quant_row_x[x >> chroma_subsampling.HShift(0)] > t) bucket_x++;
271
8.19M
        }
272
936k
        for (int t : bctx.dc_thresholds[1]) {
273
103k
          if (quant_row_y[x >> chroma_subsampling.HShift(1)] > t) bucket_y++;
274
103k
        }
275
936k
        for (int t : bctx.dc_thresholds[2]) {
276
153k
          if (quant_row_b[x >> chroma_subsampling.HShift(2)] > t) bucket_b++;
277
153k
        }
278
936k
        int bucket = bucket_x;
279
936k
        bucket *= bctx.dc_thresholds[2].size() + 1;
280
936k
        bucket += bucket_b;
281
936k
        bucket *= bctx.dc_thresholds[1].size() + 1;
282
936k
        bucket += bucket_y;
283
936k
        qdc_row_val[x] = bucket;
284
936k
      }
285
9.44k
    }
286
864
  }
287
12.6k
}
Unexecuted instantiation: jxl::N_SSE4::DequantDC(jxl::RectT<unsigned long> const&, jxl::Image3<float>*, jxl::Plane<unsigned char>*, jxl::Image const&, float const*, float, float const*, jxl::YCbCrChromaSubsampling const&, jxl::BlockCtxMap const&)
jxl::N_AVX2::DequantDC(jxl::RectT<unsigned long> const&, jxl::Image3<float>*, jxl::Plane<unsigned char>*, jxl::Image const&, float const*, float, float const*, jxl::YCbCrChromaSubsampling const&, jxl::BlockCtxMap const&)
Line
Count
Source
204
12.6k
               const BlockCtxMap& bctx) {
205
12.6k
  const HWY_FULL(float) df;
206
12.6k
  const Rebind<pixel_type, HWY_FULL(float)> di;  // assumes pixel_type <= float
207
12.6k
  if (chroma_subsampling.Is444()) {
208
12.3k
    const auto fac_x = Set(df, dc_factors[0] * mul);
209
12.3k
    const auto fac_y = Set(df, dc_factors[1] * mul);
210
12.3k
    const auto fac_b = Set(df, dc_factors[2] * mul);
211
12.3k
    const auto cfl_fac_x = Set(df, cfl_factors[0]);
212
12.3k
    const auto cfl_fac_b = Set(df, cfl_factors[2]);
213
317k
    for (size_t y = 0; y < r.ysize(); y++) {
214
305k
      float* dec_row_x = r.PlaneRow(dc, 0, y);
215
305k
      float* dec_row_y = r.PlaneRow(dc, 1, y);
216
305k
      float* dec_row_b = r.PlaneRow(dc, 2, y);
217
305k
      const int32_t* quant_row_x = in.channel[1].plane.Row(y);
218
305k
      const int32_t* quant_row_y = in.channel[0].plane.Row(y);
219
305k
      const int32_t* quant_row_b = in.channel[2].plane.Row(y);
220
1.48M
      for (size_t x = 0; x < r.xsize(); x += Lanes(di)) {
221
1.18M
        const auto in_q_x = Load(di, quant_row_x + x);
222
1.18M
        const auto in_q_y = Load(di, quant_row_y + x);
223
1.18M
        const auto in_q_b = Load(di, quant_row_b + x);
224
1.18M
        const auto in_x = Mul(ConvertTo(df, in_q_x), fac_x);
225
1.18M
        const auto in_y = Mul(ConvertTo(df, in_q_y), fac_y);
226
1.18M
        const auto in_b = Mul(ConvertTo(df, in_q_b), fac_b);
227
1.18M
        Store(in_y, df, dec_row_y + x);
228
1.18M
        Store(MulAdd(in_y, cfl_fac_x, in_x), df, dec_row_x + x);
229
1.18M
        Store(MulAdd(in_y, cfl_fac_b, in_b), df, dec_row_b + x);
230
1.18M
      }
231
305k
    }
232
12.3k
  } else {
233
813
    for (size_t c : {1, 0, 2}) {
234
813
      Rect rect(r.x0() >> chroma_subsampling.HShift(c),
235
813
                r.y0() >> chroma_subsampling.VShift(c),
236
813
                r.xsize() >> chroma_subsampling.HShift(c),
237
813
                r.ysize() >> chroma_subsampling.VShift(c));
238
813
      const auto fac = Set(df, dc_factors[c] * mul);
239
813
      const Channel& ch = in.channel[c < 2 ? c ^ 1 : c];
240
39.9k
      for (size_t y = 0; y < rect.ysize(); y++) {
241
39.1k
        const int32_t* quant_row = ch.plane.Row(y);
242
39.1k
        float* row = rect.PlaneRow(dc, c, y);
243
316k
        for (size_t x = 0; x < rect.xsize(); x += Lanes(di)) {
244
277k
          const auto in_q = Load(di, quant_row + x);
245
277k
          const auto out = Mul(ConvertTo(df, in_q), fac);
246
277k
          Store(out, df, row + x);
247
277k
        }
248
39.1k
      }
249
813
    }
250
271
  }
251
12.6k
  if (bctx.num_dc_ctxs <= 1) {
252
321k
    for (size_t y = 0; y < r.ysize(); y++) {
253
309k
      uint8_t* qdc_row = r.Row(quant_dc, y);
254
309k
      memset(qdc_row, 0, sizeof(*qdc_row) * r.xsize());
255
309k
    }
256
11.7k
  } else {
257
10.3k
    for (size_t y = 0; y < r.ysize(); y++) {
258
9.44k
      uint8_t* qdc_row_val = r.Row(quant_dc, y);
259
9.44k
      const int32_t* quant_row_x =
260
9.44k
          in.channel[1].plane.Row(y >> chroma_subsampling.VShift(0));
261
9.44k
      const int32_t* quant_row_y =
262
9.44k
          in.channel[0].plane.Row(y >> chroma_subsampling.VShift(1));
263
9.44k
      const int32_t* quant_row_b =
264
9.44k
          in.channel[2].plane.Row(y >> chroma_subsampling.VShift(2));
265
945k
      for (size_t x = 0; x < r.xsize(); x++) {
266
936k
        int bucket_x = 0;
267
936k
        int bucket_y = 0;
268
936k
        int bucket_b = 0;
269
8.19M
        for (int t : bctx.dc_thresholds[0]) {
270
8.19M
          if (quant_row_x[x >> chroma_subsampling.HShift(0)] > t) bucket_x++;
271
8.19M
        }
272
936k
        for (int t : bctx.dc_thresholds[1]) {
273
103k
          if (quant_row_y[x >> chroma_subsampling.HShift(1)] > t) bucket_y++;
274
103k
        }
275
936k
        for (int t : bctx.dc_thresholds[2]) {
276
153k
          if (quant_row_b[x >> chroma_subsampling.HShift(2)] > t) bucket_b++;
277
153k
        }
278
936k
        int bucket = bucket_x;
279
936k
        bucket *= bctx.dc_thresholds[2].size() + 1;
280
936k
        bucket += bucket_b;
281
936k
        bucket *= bctx.dc_thresholds[1].size() + 1;
282
936k
        bucket += bucket_y;
283
936k
        qdc_row_val[x] = bucket;
284
936k
      }
285
9.44k
    }
286
864
  }
287
12.6k
}
Unexecuted instantiation: jxl::N_AVX3::DequantDC(jxl::RectT<unsigned long> const&, jxl::Image3<float>*, jxl::Plane<unsigned char>*, jxl::Image const&, float const*, float, float const*, jxl::YCbCrChromaSubsampling const&, jxl::BlockCtxMap const&)
Unexecuted instantiation: jxl::N_AVX3_ZEN4::DequantDC(jxl::RectT<unsigned long> const&, jxl::Image3<float>*, jxl::Plane<unsigned char>*, jxl::Image const&, float const*, float, float const*, jxl::YCbCrChromaSubsampling const&, jxl::BlockCtxMap const&)
Unexecuted instantiation: jxl::N_AVX3_SPR::DequantDC(jxl::RectT<unsigned long> const&, jxl::Image3<float>*, jxl::Plane<unsigned char>*, jxl::Image const&, float const*, float, float const*, jxl::YCbCrChromaSubsampling const&, jxl::BlockCtxMap const&)
Unexecuted instantiation: jxl::N_SSE2::DequantDC(jxl::RectT<unsigned long> const&, jxl::Image3<float>*, jxl::Plane<unsigned char>*, jxl::Image const&, float const*, float, float const*, jxl::YCbCrChromaSubsampling const&, jxl::BlockCtxMap const&)
288
289
// NOLINTNEXTLINE(google-readability-namespace-comments)
290
}  // namespace HWY_NAMESPACE
291
}  // namespace jxl
292
HWY_AFTER_NAMESPACE();
293
294
#if HWY_ONCE
295
namespace jxl {
296
297
HWY_EXPORT(DequantDC);
298
HWY_EXPORT(AdaptiveDCSmoothing);
299
Status AdaptiveDCSmoothing(JxlMemoryManager* memory_manager,
300
                           const float* dc_factors, Image3F* dc,
301
8.24k
                           ThreadPool* pool) {
302
8.24k
  return HWY_DYNAMIC_DISPATCH(AdaptiveDCSmoothing)(memory_manager, dc_factors,
303
8.24k
                                                   dc, pool);
304
8.24k
}
305
306
void DequantDC(const Rect& r, Image3F* dc, ImageB* quant_dc, const Image& in,
307
               const float* dc_factors, float mul, const float* cfl_factors,
308
               const YCbCrChromaSubsampling& chroma_subsampling,
309
12.6k
               const BlockCtxMap& bctx) {
310
12.6k
  HWY_DYNAMIC_DISPATCH(DequantDC)
311
12.6k
  (r, dc, quant_dc, in, dc_factors, mul, cfl_factors, chroma_subsampling, bctx);
312
12.6k
}
313
314
}  // namespace jxl
315
#endif  // HWY_ONCE