xref: /aosp_15_r20/external/libaom/av1/encoder/av1_quantize.h (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1 /*
2  * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3  *
4  * This source code is subject to the terms of the BSD 2 Clause License and
5  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6  * was not distributed with this source code in the LICENSE file, you can
7  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8  * Media Patent License 1.0 was not distributed with this source code in the
9  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10  */
11 
12 #ifndef AOM_AV1_ENCODER_AV1_QUANTIZE_H_
13 #define AOM_AV1_ENCODER_AV1_QUANTIZE_H_
14 
15 #include "config/aom_config.h"
16 
17 #include "av1/common/quant_common.h"
18 #include "av1/common/scan.h"
19 #include "av1/encoder/block.h"
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 typedef struct QUANT_PARAM {
26   int log_scale;
27   TX_SIZE tx_size;
28   const qm_val_t *qmatrix;
29   const qm_val_t *iqmatrix;
30   int use_quant_b_adapt;
31   int use_optimize_b;
32   int xform_quant_idx;
33 } QUANT_PARAM;
34 
35 typedef void (*AV1_QUANT_FACADE)(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
36                                  const MACROBLOCK_PLANE *p,
37                                  tran_low_t *qcoeff_ptr,
38                                  tran_low_t *dqcoeff_ptr, uint16_t *eob_ptr,
39                                  const SCAN_ORDER *sc,
40                                  const QUANT_PARAM *qparam);
41 
42 // The QUANTS structure is used only for internal quantizer setup in
43 // av1_quantize.c.
44 // All of its fields use the same coefficient shift/scaling at TX.
45 typedef struct {
46   // 0: dc 1: ac 2-8: ac repeated to SIMD width
47   DECLARE_ALIGNED(16, int16_t, y_quant[QINDEX_RANGE][8]);
48   DECLARE_ALIGNED(16, int16_t, y_quant_shift[QINDEX_RANGE][8]);
49   DECLARE_ALIGNED(16, int16_t, y_zbin[QINDEX_RANGE][8]);
50   DECLARE_ALIGNED(16, int16_t, y_round[QINDEX_RANGE][8]);
51 
52   // TODO(jingning): in progress of re-working the quantization. will decide
53   // if we want to deprecate the current use of y_quant.
54   DECLARE_ALIGNED(16, int16_t, y_quant_fp[QINDEX_RANGE][8]);
55   DECLARE_ALIGNED(16, int16_t, u_quant_fp[QINDEX_RANGE][8]);
56   DECLARE_ALIGNED(16, int16_t, v_quant_fp[QINDEX_RANGE][8]);
57   DECLARE_ALIGNED(16, int16_t, y_round_fp[QINDEX_RANGE][8]);
58   DECLARE_ALIGNED(16, int16_t, u_round_fp[QINDEX_RANGE][8]);
59   DECLARE_ALIGNED(16, int16_t, v_round_fp[QINDEX_RANGE][8]);
60 
61   DECLARE_ALIGNED(16, int16_t, u_quant[QINDEX_RANGE][8]);
62   DECLARE_ALIGNED(16, int16_t, v_quant[QINDEX_RANGE][8]);
63   DECLARE_ALIGNED(16, int16_t, u_quant_shift[QINDEX_RANGE][8]);
64   DECLARE_ALIGNED(16, int16_t, v_quant_shift[QINDEX_RANGE][8]);
65   DECLARE_ALIGNED(16, int16_t, u_zbin[QINDEX_RANGE][8]);
66   DECLARE_ALIGNED(16, int16_t, v_zbin[QINDEX_RANGE][8]);
67   DECLARE_ALIGNED(16, int16_t, u_round[QINDEX_RANGE][8]);
68   DECLARE_ALIGNED(16, int16_t, v_round[QINDEX_RANGE][8]);
69 } QUANTS;
70 
71 // The Dequants structure is used only for internal quantizer setup in
72 // av1_quantize.c.
73 // Fields are suffixed according to whether or not they're expressed in
74 // the same coefficient shift/precision as TX or a fixed Q3 format.
75 typedef struct {
76   DECLARE_ALIGNED(16, int16_t,
77                   y_dequant_QTX[QINDEX_RANGE][8]);  // 8: SIMD width
78   DECLARE_ALIGNED(16, int16_t,
79                   u_dequant_QTX[QINDEX_RANGE][8]);  // 8: SIMD width
80   DECLARE_ALIGNED(16, int16_t,
81                   v_dequant_QTX[QINDEX_RANGE][8]);  // 8: SIMD width
82 } Dequants;
83 
84 // The DeltaQuantParams structure holds the dc/ac deltaq parameters.
85 typedef struct {
86   int y_dc_delta_q;
87   int u_dc_delta_q;
88   int u_ac_delta_q;
89   int v_dc_delta_q;
90   int v_ac_delta_q;
91 } DeltaQuantParams;
92 
93 typedef struct {
94   // Quantization parameters for internal quantizer setup.
95   QUANTS quants;
96   // Dequantization parameters for internal quantizer setup.
97   Dequants dequants;
98   // Deltaq parameters to track the state of the dc/ac deltaq parameters in
99   // cm->quant_params. It is used to decide whether the quantizer tables need
100   // to be re-initialized.
101   DeltaQuantParams prev_deltaq_params;
102 } EncQuantDequantParams;
103 
104 struct AV1_COMP;
105 struct AV1Common;
106 
107 void av1_frame_init_quantizer(struct AV1_COMP *cpi);
108 
109 void av1_init_plane_quantizers(const struct AV1_COMP *cpi, MACROBLOCK *x,
110                                int segment_id, const int do_update);
111 
112 void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q,
113                          int u_dc_delta_q, int u_ac_delta_q, int v_dc_delta_q,
114                          int v_ac_delta_q, QUANTS *const quants,
115                          Dequants *const deq);
116 
117 void av1_init_quantizer(EncQuantDequantParams *const enc_quant_dequant_params,
118                         const CommonQuantParams *quant_params,
119                         aom_bit_depth_t bit_depth);
120 
121 void av1_set_quantizer(struct AV1Common *const cm, int min_qmlevel,
122                        int max_qmlevel, int q, int enable_chroma_deltaq,
123                        int enable_hdr_deltaq);
124 
125 int av1_quantizer_to_qindex(int quantizer);
126 
127 int av1_qindex_to_quantizer(int qindex);
128 
129 void av1_quantize_skip(intptr_t n_coeffs, tran_low_t *qcoeff_ptr,
130                        tran_low_t *dqcoeff_ptr, uint16_t *eob_ptr);
131 
132 /*!\brief Quantize transform coefficients without using qmatrix
133  *
134  * quant_ptr, dequant_ptr and round_ptr are size 2 arrays,
135  * where index 0 corresponds to dc coeff and index 1 corresponds to ac coeffs.
136  *
137  * \param[in]  quant_ptr    16-bit fixed point representation of inverse
138  *                          quantize step size, i.e. 2^16/dequant
139  * \param[in]  dequant_ptr  quantize step size
140  * \param[in]  round_ptr    rounding
141  * \param[in]  log_scale    the relative log scale of the transform
142  *                          coefficients
143  * \param[in]  scan         scan[i] indicates the position of ith to-be-coded
144  *                          coefficient
145  * \param[in]  coeff_count  number of coefficients
146  * \param[out] qcoeff_ptr   quantized coefficients
147  * \param[out] dqcoeff_ptr  dequantized coefficients
148  *
149  * \return The last non-zero coefficient's scan index plus 1
150  */
151 int av1_quantize_fp_no_qmatrix(const int16_t quant_ptr[2],
152                                const int16_t dequant_ptr[2],
153                                const int16_t round_ptr[2], int log_scale,
154                                const int16_t *scan, int coeff_count,
155                                const tran_low_t *coeff_ptr,
156                                tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr);
157 
158 void av1_quantize_fp_facade(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
159                             const MACROBLOCK_PLANE *p, tran_low_t *qcoeff_ptr,
160                             tran_low_t *dqcoeff_ptr, uint16_t *eob_ptr,
161                             const SCAN_ORDER *sc, const QUANT_PARAM *qparam);
162 
163 void av1_quantize_b_facade(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
164                            const MACROBLOCK_PLANE *p, tran_low_t *qcoeff_ptr,
165                            tran_low_t *dqcoeff_ptr, uint16_t *eob_ptr,
166                            const SCAN_ORDER *sc, const QUANT_PARAM *qparam);
167 
168 void av1_quantize_dc_facade(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
169                             const MACROBLOCK_PLANE *p, tran_low_t *qcoeff_ptr,
170                             tran_low_t *dqcoeff_ptr, uint16_t *eob_ptr,
171                             const SCAN_ORDER *sc, const QUANT_PARAM *qparam);
172 
173 #if CONFIG_AV1_HIGHBITDEPTH
174 void av1_highbd_quantize_fp_facade(const tran_low_t *coeff_ptr,
175                                    intptr_t n_coeffs, const MACROBLOCK_PLANE *p,
176                                    tran_low_t *qcoeff_ptr,
177                                    tran_low_t *dqcoeff_ptr, uint16_t *eob_ptr,
178                                    const SCAN_ORDER *sc,
179                                    const QUANT_PARAM *qparam);
180 
181 void av1_highbd_quantize_b_facade(const tran_low_t *coeff_ptr,
182                                   intptr_t n_coeffs, const MACROBLOCK_PLANE *p,
183                                   tran_low_t *qcoeff_ptr,
184                                   tran_low_t *dqcoeff_ptr, uint16_t *eob_ptr,
185                                   const SCAN_ORDER *sc,
186                                   const QUANT_PARAM *qparam);
187 
188 void av1_highbd_quantize_dc_facade(const tran_low_t *coeff_ptr,
189                                    intptr_t n_coeffs, const MACROBLOCK_PLANE *p,
190                                    tran_low_t *qcoeff_ptr,
191                                    tran_low_t *dqcoeff_ptr, uint16_t *eob_ptr,
192                                    const SCAN_ORDER *sc,
193                                    const QUANT_PARAM *qparam);
194 
195 #endif
196 
197 #ifdef __cplusplus
198 }  // extern "C"
199 #endif
200 
201 #endif  // AOM_AV1_ENCODER_AV1_QUANTIZE_H_
202