/src/libjxl/lib/jxl/enc_aux_out.h
Line | Count | Source (jump to first uncovered line) |
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 | | #ifndef LIB_JXL_AUX_OUT_H_ |
7 | | #define LIB_JXL_AUX_OUT_H_ |
8 | | |
9 | | // Optional output information for debugging and analyzing size usage. |
10 | | |
11 | | #include <array> |
12 | | #include <cstddef> |
13 | | #include <cstdint> |
14 | | |
15 | | namespace jxl { |
16 | | |
17 | | struct ColorEncoding; |
18 | | |
19 | | // For LayerName and AuxOut::layers[] index. Order does not matter. |
20 | | enum class LayerType : uint8_t { |
21 | | Header = 0, |
22 | | Toc, |
23 | | Dictionary, |
24 | | Splines, |
25 | | Noise, |
26 | | Quant, |
27 | | ModularTree, |
28 | | ModularGlobal, |
29 | | Dc, |
30 | | ModularDcGroup, |
31 | | ControlFields, |
32 | | Order, |
33 | | Ac, |
34 | | AcTokens, |
35 | | ModularAcGroup, |
36 | | }; |
37 | | |
38 | | constexpr uint8_t kNumImageLayers = |
39 | | static_cast<uint8_t>(LayerType::ModularAcGroup) + 1; |
40 | | |
41 | | const char* LayerName(LayerType layer); |
42 | | |
43 | | // Statistics gathered during compression or decompression. |
44 | | struct AuxOut { |
45 | | private: |
46 | | struct LayerTotals { |
47 | 0 | void Assimilate(const LayerTotals& victim) { |
48 | 0 | num_clustered_histograms += victim.num_clustered_histograms; |
49 | 0 | histogram_bits += victim.histogram_bits; |
50 | 0 | extra_bits += victim.extra_bits; |
51 | 0 | total_bits += victim.total_bits; |
52 | 0 | clustered_entropy += victim.clustered_entropy; |
53 | 0 | } |
54 | | void Print(size_t num_inputs) const; |
55 | | |
56 | | size_t num_clustered_histograms = 0; |
57 | | size_t extra_bits = 0; |
58 | | |
59 | | // Set via BitsWritten below |
60 | | size_t histogram_bits = 0; |
61 | | size_t total_bits = 0; |
62 | | |
63 | | double clustered_entropy = 0.0; |
64 | | }; |
65 | | |
66 | | public: |
67 | 97 | AuxOut() = default; |
68 | | AuxOut(const AuxOut&) = default; |
69 | | |
70 | | void Assimilate(const AuxOut& victim); |
71 | | |
72 | | void Print(size_t num_inputs) const; |
73 | | |
74 | 0 | size_t TotalBits() const { |
75 | 0 | size_t total = 0; |
76 | 0 | for (const auto& layer : layers) { |
77 | 0 | total += layer.total_bits; |
78 | 0 | } |
79 | 0 | return total; |
80 | 0 | } |
81 | | |
82 | | std::array<LayerTotals, kNumImageLayers> layers; |
83 | | |
84 | 0 | const LayerTotals& layer(LayerType idx) const { |
85 | 0 | return layers[static_cast<uint8_t>(idx)]; |
86 | 0 | } |
87 | 0 | LayerTotals& layer(LayerType idx) { |
88 | 0 | return layers[static_cast<uint8_t>(idx)]; |
89 | 0 | } |
90 | | |
91 | | size_t num_blocks = 0; |
92 | | |
93 | | // Number of blocks that use larger DCT (set by ac_strategy). |
94 | | size_t num_small_blocks = 0; |
95 | | size_t num_dct4x8_blocks = 0; |
96 | | size_t num_afv_blocks = 0; |
97 | | size_t num_dct8_blocks = 0; |
98 | | size_t num_dct8x16_blocks = 0; |
99 | | size_t num_dct8x32_blocks = 0; |
100 | | size_t num_dct16_blocks = 0; |
101 | | size_t num_dct16x32_blocks = 0; |
102 | | size_t num_dct32_blocks = 0; |
103 | | size_t num_dct32x64_blocks = 0; |
104 | | size_t num_dct64_blocks = 0; |
105 | | |
106 | | int num_butteraugli_iters = 0; |
107 | | }; |
108 | | } // namespace jxl |
109 | | |
110 | | #endif // LIB_JXL_AUX_OUT_H_ |