enc_ac_strategy.h (3064B)
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_ENC_AC_STRATEGY_H_ 7 #define LIB_JXL_ENC_AC_STRATEGY_H_ 8 9 #include <jxl/memory_manager.h> 10 11 #include <cstddef> 12 13 #include "lib/jxl/base/compiler_specific.h" 14 #include "lib/jxl/base/rect.h" 15 #include "lib/jxl/base/status.h" 16 #include "lib/jxl/chroma_from_luma.h" 17 #include "lib/jxl/enc_cache.h" 18 #include "lib/jxl/enc_params.h" 19 #include "lib/jxl/frame_dimensions.h" 20 #include "lib/jxl/image.h" 21 #include "lib/jxl/memory_manager_internal.h" 22 #include "lib/jxl/quant_weights.h" 23 24 // `FindBestAcStrategy` uses heuristics to choose which AC strategy should be 25 // used in each block, as well as the initial quantization field. 26 27 namespace jxl { 28 29 struct AuxOut; 30 class AcStrategyImage; 31 32 // AC strategy selection: utility struct. 33 34 struct ACSConfig { 35 const DequantMatrices* JXL_RESTRICT dequant; 36 const float* JXL_RESTRICT quant_field_row; 37 size_t quant_field_stride; 38 const float* JXL_RESTRICT masking_field_row; 39 size_t masking_field_stride; 40 const float* JXL_RESTRICT masking1x1_field_row; 41 size_t masking1x1_field_stride; 42 size_t mask1x1_xsize; 43 const float* JXL_RESTRICT src_rows[3]; 44 size_t src_stride; 45 float info_loss_multiplier; 46 float cost_delta; 47 float zeros_mul; 48 const float& Pixel(size_t c, size_t x, size_t y) const { 49 return src_rows[c][y * src_stride + x]; 50 } 51 float Masking(size_t bx, size_t by) const { 52 JXL_DASSERT(masking_field_row[by * masking_field_stride + bx] > 0); 53 return masking_field_row[by * masking_field_stride + bx]; 54 } 55 const float* MaskingPtr1x1(size_t bx, size_t by) const { 56 JXL_DASSERT(masking1x1_field_row[by * masking1x1_field_stride + bx] > 0); 57 return &masking1x1_field_row[by * masking1x1_field_stride + bx]; 58 } 59 float Quant(size_t bx, size_t by) const { 60 JXL_DASSERT(quant_field_row[by * quant_field_stride + bx] > 0); 61 return quant_field_row[by * quant_field_stride + bx]; 62 } 63 }; 64 65 struct AcStrategyHeuristics { 66 explicit AcStrategyHeuristics(JxlMemoryManager* memory_manager, 67 const CompressParams& cparams) 68 : memory_manager(memory_manager), 69 cparams(cparams), 70 mem_per_thread(0), 71 qmem_per_thread(0) {} 72 Status Init(const Image3F& src, const Rect& rect_in, 73 const ImageF& quant_field, const ImageF& mask, 74 const ImageF& mask1x1, DequantMatrices* matrices); 75 Status PrepareForThreads(std::size_t num_threads); 76 Status ProcessRect(const Rect& rect, const ColorCorrelationMap& cmap, 77 AcStrategyImage* ac_strategy, size_t thread); 78 Status Finalize(const FrameDimensions& frame_dim, 79 const AcStrategyImage& ac_strategy, AuxOut* aux_out); 80 JxlMemoryManager* memory_manager; 81 const CompressParams& cparams; 82 ACSConfig config = {}; 83 size_t mem_per_thread; 84 AlignedMemory mem; 85 size_t qmem_per_thread; 86 AlignedMemory qmem; 87 }; 88 89 } // namespace jxl 90 91 #endif // LIB_JXL_ENC_AC_STRATEGY_H_