Coverage Report

Created: 2025-07-16 07:53

/src/libjxl/lib/jxl/dct_block-inl.h
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
// Adapters for DCT input/output: from/to contiguous blocks or image rows.
7
8
#if defined(LIB_JXL_DCT_BLOCK_INL_H_) == defined(HWY_TARGET_TOGGLE)
9
#ifdef LIB_JXL_DCT_BLOCK_INL_H_
10
#undef LIB_JXL_DCT_BLOCK_INL_H_
11
#else
12
#define LIB_JXL_DCT_BLOCK_INL_H_
13
#endif
14
15
#include <stddef.h>
16
17
#include <hwy/highway.h>
18
19
#include "lib/jxl/base/status.h"
20
HWY_BEFORE_NAMESPACE();
21
namespace jxl {
22
namespace HWY_NAMESPACE {
23
namespace {
24
25
// These templates are not found via ADL.
26
using hwy::HWY_NAMESPACE::Vec;
27
28
// Block: (x, y) <-> (N * y + x)
29
// Lines: (x, y) <-> (stride * y + x)
30
//
31
// I.e. Block is a specialization of Lines with fixed stride.
32
//
33
// FromXXX should implement Read and Load (Read vector).
34
// ToXXX should implement Write and Store (Write vector).
35
36
template <size_t N>
37
using BlockDesc = HWY_CAPPED(float, N);
38
39
// Here and in the following, the SZ template parameter specifies the number of
40
// values to load/store. Needed because we want to handle 4x4 sub-blocks of
41
// 16x16 blocks.
42
class DCTFrom {
43
 public:
44
489k
  DCTFrom(const float* data, size_t stride) : stride_(stride), data_(data) {}
Unexecuted instantiation: enc_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::DCTFrom(float const*, unsigned long)
dec_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::DCTFrom(float const*, unsigned long)
Line
Count
Source
44
489k
  DCTFrom(const float* data, size_t stride) : stride_(stride), data_(data) {}
Unexecuted instantiation: enc_ac_strategy.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::DCTFrom(float const*, unsigned long)
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::DCTFrom(float const*, unsigned long)
45
46
  template <typename D>
47
181k
  HWY_INLINE Vec<D> LoadPart(D /* tag */, const size_t row, size_t i) const {
48
181k
    JXL_DASSERT(Lanes(D()) <= stride_);
49
    // Since these functions are used also for DC, no alignment at all is
50
    // guaranteed in the case of floating blocks.
51
    // TODO(veluca): consider using a different class for DC-to-LF and
52
    // DC-from-LF, or copying DC values to/from a temporary aligned location.
53
181k
    return LoadU(D(), Address(row, i));
54
181k
  }
Unexecuted instantiation: enc_group.cc:decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) jxl::N_SCALAR::(anonymous namespace)::DCTFrom::LoadPart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, unsigned long, unsigned long) const
dec_group.cc:decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) jxl::N_SCALAR::(anonymous namespace)::DCTFrom::LoadPart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, unsigned long, unsigned long) const
Line
Count
Source
47
181k
  HWY_INLINE Vec<D> LoadPart(D /* tag */, const size_t row, size_t i) const {
48
181k
    JXL_DASSERT(Lanes(D()) <= stride_);
49
    // Since these functions are used also for DC, no alignment at all is
50
    // guaranteed in the case of floating blocks.
51
    // TODO(veluca): consider using a different class for DC-to-LF and
52
    // DC-from-LF, or copying DC values to/from a temporary aligned location.
53
181k
    return LoadU(D(), Address(row, i));
54
181k
  }
Unexecuted instantiation: enc_ac_strategy.cc:decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) jxl::N_SCALAR::(anonymous namespace)::DCTFrom::LoadPart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, unsigned long, unsigned long) const
Unexecuted instantiation: enc_adaptive_quantization.cc:decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) jxl::N_SCALAR::(anonymous namespace)::DCTFrom::LoadPart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, unsigned long, unsigned long) const
Unexecuted instantiation: enc_chroma_from_luma.cc:decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) jxl::N_SCALAR::(anonymous namespace)::DCTFrom::LoadPart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, unsigned long, unsigned long) const
55
56
13.8M
  HWY_INLINE float Read(const size_t row, const size_t i) const {
57
13.8M
    return *Address(row, i);
58
13.8M
  }
Unexecuted instantiation: enc_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Read(unsigned long, unsigned long) const
dec_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Read(unsigned long, unsigned long) const
Line
Count
Source
56
13.8M
  HWY_INLINE float Read(const size_t row, const size_t i) const {
57
13.8M
    return *Address(row, i);
58
13.8M
  }
Unexecuted instantiation: enc_ac_strategy.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Read(unsigned long, unsigned long) const
Unexecuted instantiation: enc_adaptive_quantization.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Read(unsigned long, unsigned long) const
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Read(unsigned long, unsigned long) const
59
60
  constexpr HWY_INLINE const float* Address(const size_t row,
61
15.6M
                                            const size_t i) const {
62
15.6M
    return data_ + row * stride_ + i;
63
15.6M
  }
Unexecuted instantiation: enc_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Address(unsigned long, unsigned long) const
dec_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Address(unsigned long, unsigned long) const
Line
Count
Source
61
15.6M
                                            const size_t i) const {
62
15.6M
    return data_ + row * stride_ + i;
63
15.6M
  }
Unexecuted instantiation: enc_ac_strategy.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Address(unsigned long, unsigned long) const
Unexecuted instantiation: enc_adaptive_quantization.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Address(unsigned long, unsigned long) const
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Address(unsigned long, unsigned long) const
64
65
1.60M
  size_t Stride() const { return stride_; }
Unexecuted instantiation: enc_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Stride() const
dec_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Stride() const
Line
Count
Source
65
1.60M
  size_t Stride() const { return stride_; }
Unexecuted instantiation: enc_ac_strategy.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Stride() const
Unexecuted instantiation: enc_adaptive_quantization.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Stride() const
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::N_SCALAR::(anonymous namespace)::DCTFrom::Stride() const
66
67
 private:
68
  size_t stride_;
69
  const float* JXL_RESTRICT data_;
70
};
71
72
class DCTTo {
73
 public:
74
489k
  DCTTo(float* data, size_t stride) : stride_(stride), data_(data) {}
Unexecuted instantiation: enc_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::DCTTo(float*, unsigned long)
dec_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::DCTTo(float*, unsigned long)
Line
Count
Source
74
489k
  DCTTo(float* data, size_t stride) : stride_(stride), data_(data) {}
Unexecuted instantiation: enc_ac_strategy.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::DCTTo(float*, unsigned long)
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::DCTTo(float*, unsigned long)
75
76
  template <typename D>
77
  HWY_INLINE void StorePart(D /* tag */, const Vec<D>& v, const size_t row,
78
181k
                            size_t i) const {
79
181k
    JXL_DASSERT(Lanes(D()) <= stride_);
80
    // Since these functions are used also for DC, no alignment at all is
81
    // guaranteed in the case of floating blocks.
82
    // TODO(veluca): consider using a different class for DC-to-LF and
83
    // DC-from-LF, or copying DC values to/from a temporary aligned location.
84
181k
    StoreU(v, D(), Address(row, i));
85
181k
  }
Unexecuted instantiation: enc_group.cc:void jxl::N_SCALAR::(anonymous namespace)::DCTTo::StorePart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) const&, unsigned long, unsigned long) const
dec_group.cc:void jxl::N_SCALAR::(anonymous namespace)::DCTTo::StorePart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) const&, unsigned long, unsigned long) const
Line
Count
Source
78
181k
                            size_t i) const {
79
181k
    JXL_DASSERT(Lanes(D()) <= stride_);
80
    // Since these functions are used also for DC, no alignment at all is
81
    // guaranteed in the case of floating blocks.
82
    // TODO(veluca): consider using a different class for DC-to-LF and
83
    // DC-from-LF, or copying DC values to/from a temporary aligned location.
84
181k
    StoreU(v, D(), Address(row, i));
85
181k
  }
Unexecuted instantiation: enc_ac_strategy.cc:void jxl::N_SCALAR::(anonymous namespace)::DCTTo::StorePart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) const&, unsigned long, unsigned long) const
Unexecuted instantiation: enc_adaptive_quantization.cc:void jxl::N_SCALAR::(anonymous namespace)::DCTTo::StorePart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) const&, unsigned long, unsigned long) const
Unexecuted instantiation: enc_chroma_from_luma.cc:void jxl::N_SCALAR::(anonymous namespace)::DCTTo::StorePart<hwy::N_SCALAR::Simd<float, 1ul, 0> >(hwy::N_SCALAR::Simd<float, 1ul, 0>, decltype (Zero((hwy::N_SCALAR::Simd<float, 1ul, 0>)())) const&, unsigned long, unsigned long) const
86
87
13.8M
  HWY_INLINE void Write(float v, const size_t row, const size_t i) const {
88
13.8M
    *Address(row, i) = v;
89
13.8M
  }
Unexecuted instantiation: enc_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Write(float, unsigned long, unsigned long) const
dec_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Write(float, unsigned long, unsigned long) const
Line
Count
Source
87
13.8M
  HWY_INLINE void Write(float v, const size_t row, const size_t i) const {
88
13.8M
    *Address(row, i) = v;
89
13.8M
  }
Unexecuted instantiation: enc_ac_strategy.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Write(float, unsigned long, unsigned long) const
Unexecuted instantiation: enc_adaptive_quantization.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Write(float, unsigned long, unsigned long) const
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Write(float, unsigned long, unsigned long) const
90
91
15.6M
  constexpr HWY_INLINE float* Address(const size_t row, const size_t i) const {
92
15.6M
    return data_ + row * stride_ + i;
93
15.6M
  }
Unexecuted instantiation: enc_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Address(unsigned long, unsigned long) const
dec_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Address(unsigned long, unsigned long) const
Line
Count
Source
91
15.6M
  constexpr HWY_INLINE float* Address(const size_t row, const size_t i) const {
92
15.6M
    return data_ + row * stride_ + i;
93
15.6M
  }
Unexecuted instantiation: enc_ac_strategy.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Address(unsigned long, unsigned long) const
Unexecuted instantiation: enc_adaptive_quantization.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Address(unsigned long, unsigned long) const
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Address(unsigned long, unsigned long) const
94
95
1.60M
  size_t Stride() const { return stride_; }
Unexecuted instantiation: enc_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Stride() const
dec_group.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Stride() const
Line
Count
Source
95
1.60M
  size_t Stride() const { return stride_; }
Unexecuted instantiation: enc_ac_strategy.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Stride() const
Unexecuted instantiation: enc_adaptive_quantization.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Stride() const
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::N_SCALAR::(anonymous namespace)::DCTTo::Stride() const
96
97
 private:
98
  size_t stride_;
99
  float* JXL_RESTRICT data_;
100
};
101
102
}  // namespace
103
// NOLINTNEXTLINE(google-readability-namespace-comments)
104
}  // namespace HWY_NAMESPACE
105
}  // namespace jxl
106
HWY_AFTER_NAMESPACE();
107
108
#endif  // LIB_JXL_DCT_BLOCK_INL_H_