libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

enc_ans_params.h (2567B)


      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_ANS_PARAMS_H_
      7 #define LIB_JXL_ENC_ANS_PARAMS_H_
      8 
      9 // Encoder-only parameter needed for ANS entropy encoding methods.
     10 
     11 #include <stdint.h>
     12 #include <stdlib.h>
     13 
     14 #include <vector>
     15 
     16 #include "lib/jxl/common.h"
     17 
     18 namespace jxl {
     19 
     20 // Forward declaration to break include cycle.
     21 struct CompressParams;
     22 
     23 // RebalanceHistogram requires a signed type.
     24 using ANSHistBin = int32_t;
     25 
     26 struct HistogramParams {
     27   enum class ClusteringType {
     28     kFastest,  // Only 4 clusters.
     29     kFast,
     30     kBest,
     31   };
     32 
     33   enum class HybridUintMethod {
     34     kNone,        // just use kHybridUint420Config.
     35     k000,         // force the fastest option.
     36     kFast,        // just try a couple of options.
     37     kContextMap,  // fast choice for ctx map.
     38     kBest,
     39   };
     40 
     41   enum class LZ77Method {
     42     kNone,     // do not try lz77.
     43     kRLE,      // only try doing RLE.
     44     kLZ77,     // try lz77 with backward references.
     45     kOptimal,  // optimal-matching LZ77 parsing.
     46   };
     47 
     48   enum class ANSHistogramStrategy {
     49     kFast,         // Only try some methods, early exit.
     50     kApproximate,  // Only try some methods.
     51     kPrecise,      // Try all methods.
     52   };
     53 
     54   HistogramParams() = default;
     55 
     56   HistogramParams(SpeedTier tier, size_t num_ctx) {
     57     if (tier > SpeedTier::kFalcon) {
     58       clustering = ClusteringType::kFastest;
     59       lz77_method = LZ77Method::kNone;
     60     } else if (tier > SpeedTier::kTortoise) {
     61       clustering = ClusteringType::kFast;
     62     } else {
     63       clustering = ClusteringType::kBest;
     64     }
     65     if (tier > SpeedTier::kTortoise) {
     66       uint_method = HybridUintMethod::kNone;
     67     }
     68     if (tier >= SpeedTier::kSquirrel) {
     69       ans_histogram_strategy = ANSHistogramStrategy::kApproximate;
     70     }
     71   }
     72 
     73   static HistogramParams ForModular(
     74       const CompressParams& cparams,
     75       const std::vector<uint8_t>& extra_dc_precision, bool streaming_mode);
     76 
     77   ClusteringType clustering = ClusteringType::kBest;
     78   HybridUintMethod uint_method = HybridUintMethod::kBest;
     79   LZ77Method lz77_method = LZ77Method::kRLE;
     80   ANSHistogramStrategy ans_histogram_strategy = ANSHistogramStrategy::kPrecise;
     81   std::vector<size_t> image_widths;
     82   size_t max_histograms = ~0;
     83   bool force_huffman = false;
     84   bool initialize_global_state = true;
     85   bool streaming_mode = false;
     86   bool add_missing_symbols = false;
     87   bool add_fixed_histograms = false;
     88 };
     89 
     90 }  // namespace jxl
     91 
     92 #endif  // LIB_JXL_ENC_ANS_PARAMS_H_