xref: /aosp_15_r20/external/libvpx/vp9/encoder/vp9_quantize.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1 /*
2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include <assert.h>
12 #include <math.h>
13 #include "./vpx_dsp_rtcd.h"
14 #include "vpx_mem/vpx_mem.h"
15 #include "vpx_ports/bitops.h"
16 #include "vpx_ports/mem.h"
17 
18 #include "vp9/common/vp9_quant_common.h"
19 #include "vp9/common/vp9_scan.h"
20 #include "vp9/common/vp9_seg_common.h"
21 
22 #include "vp9/encoder/vp9_encoder.h"
23 #include "vp9/encoder/vp9_quantize.h"
24 #include "vp9/encoder/vp9_rd.h"
25 
vp9_quantize_fp_c(const tran_low_t * coeff_ptr,intptr_t n_coeffs,const struct macroblock_plane * const mb_plane,tran_low_t * qcoeff_ptr,tran_low_t * dqcoeff_ptr,const int16_t * dequant_ptr,uint16_t * eob_ptr,const struct ScanOrder * const scan_order)26 void vp9_quantize_fp_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
27                        const struct macroblock_plane *const mb_plane,
28                        tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
29                        const int16_t *dequant_ptr, uint16_t *eob_ptr,
30                        const struct ScanOrder *const scan_order) {
31   int i, eob = -1;
32   const int16_t *round_ptr = mb_plane->round_fp;
33   const int16_t *quant_ptr = mb_plane->quant_fp;
34   const int16_t *scan = scan_order->scan;
35 
36   memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
37   memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
38 
39   // Quantization pass: All coefficients with index >= zero_flag are
40   // skippable. Note: zero_flag can be zero.
41   for (i = 0; i < n_coeffs; i++) {
42     const int rc = scan[i];
43     const int coeff = coeff_ptr[rc];
44     const int coeff_sign = (coeff >> 31);
45     const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
46 
47     int tmp = clamp(abs_coeff + round_ptr[rc != 0], INT16_MIN, INT16_MAX);
48     tmp = (tmp * quant_ptr[rc != 0]) >> 16;
49 
50     qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign;
51     dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0];
52 
53     if (tmp) eob = i;
54   }
55   *eob_ptr = eob + 1;
56 }
57 
58 #if CONFIG_VP9_HIGHBITDEPTH
vp9_highbd_quantize_fp_c(const tran_low_t * coeff_ptr,intptr_t n_coeffs,const struct macroblock_plane * const mb_plane,tran_low_t * qcoeff_ptr,tran_low_t * dqcoeff_ptr,const int16_t * dequant_ptr,uint16_t * eob_ptr,const struct ScanOrder * const scan_order)59 void vp9_highbd_quantize_fp_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
60                               const struct macroblock_plane *const mb_plane,
61                               tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
62                               const int16_t *dequant_ptr, uint16_t *eob_ptr,
63                               const struct ScanOrder *const scan_order) {
64   int i;
65   int eob = -1;
66   const int16_t *round_ptr = mb_plane->round_fp;
67   const int16_t *quant_ptr = mb_plane->quant_fp;
68   const int16_t *scan = scan_order->scan;
69 
70   memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
71   memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
72 
73   // Quantization pass: All coefficients with index >= zero_flag are
74   // skippable. Note: zero_flag can be zero.
75   for (i = 0; i < n_coeffs; i++) {
76     const int rc = scan[i];
77     const int coeff = coeff_ptr[rc];
78     const int coeff_sign = (coeff >> 31);
79     const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
80     const int64_t tmp = abs_coeff + round_ptr[rc != 0];
81     const int abs_qcoeff = (int)((tmp * quant_ptr[rc != 0]) >> 16);
82     qcoeff_ptr[rc] = (tran_low_t)(abs_qcoeff ^ coeff_sign) - coeff_sign;
83     dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0];
84     if (abs_qcoeff) eob = i;
85   }
86   *eob_ptr = eob + 1;
87 }
88 #endif
89 
90 // TODO(jingning) Refactor this file and combine functions with similar
91 // operations.
vp9_quantize_fp_32x32_c(const tran_low_t * coeff_ptr,intptr_t n_coeffs,const struct macroblock_plane * const mb_plane,tran_low_t * qcoeff_ptr,tran_low_t * dqcoeff_ptr,const int16_t * dequant_ptr,uint16_t * eob_ptr,const struct ScanOrder * const scan_order)92 void vp9_quantize_fp_32x32_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
93                              const struct macroblock_plane *const mb_plane,
94                              tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
95                              const int16_t *dequant_ptr, uint16_t *eob_ptr,
96                              const struct ScanOrder *const scan_order) {
97   int i, eob = -1;
98   const int16_t *round_ptr = mb_plane->round_fp;
99   const int16_t *quant_ptr = mb_plane->quant_fp;
100   const int16_t *scan = scan_order->scan;
101 
102   memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
103   memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
104 
105   for (i = 0; i < n_coeffs; i++) {
106     const int rc = scan[i];
107     const int coeff = coeff_ptr[rc];
108     const int coeff_sign = (coeff >> 31);
109     int tmp = 0;
110     int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
111 
112     if (abs_coeff >= (dequant_ptr[rc != 0] >> 2)) {
113       abs_coeff += ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1);
114       abs_coeff = clamp(abs_coeff, INT16_MIN, INT16_MAX);
115       tmp = (abs_coeff * quant_ptr[rc != 0]) >> 15;
116       qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign;
117       dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0] / 2;
118     }
119 
120     if (tmp) eob = i;
121   }
122   *eob_ptr = eob + 1;
123 }
124 
125 #if CONFIG_VP9_HIGHBITDEPTH
vp9_highbd_quantize_fp_32x32_c(const tran_low_t * coeff_ptr,intptr_t n_coeffs,const struct macroblock_plane * const mb_plane,tran_low_t * qcoeff_ptr,tran_low_t * dqcoeff_ptr,const int16_t * dequant_ptr,uint16_t * eob_ptr,const struct ScanOrder * const scan_order)126 void vp9_highbd_quantize_fp_32x32_c(
127     const tran_low_t *coeff_ptr, intptr_t n_coeffs,
128     const struct macroblock_plane *const mb_plane, tran_low_t *qcoeff_ptr,
129     tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr,
130     const struct ScanOrder *const scan_order) {
131   int i, eob = -1;
132   const int16_t *round_ptr = mb_plane->round_fp;
133   const int16_t *quant_ptr = mb_plane->quant_fp;
134   const int16_t *scan = scan_order->scan;
135 
136   memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
137   memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
138 
139   for (i = 0; i < n_coeffs; i++) {
140     int abs_qcoeff = 0;
141     const int rc = scan[i];
142     const int coeff = coeff_ptr[rc];
143     const int coeff_sign = (coeff >> 31);
144     const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
145 
146     if (abs_coeff >= (dequant_ptr[rc != 0] >> 2)) {
147       const int64_t tmp = abs_coeff + ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1);
148       abs_qcoeff = (int)((tmp * quant_ptr[rc != 0]) >> 15);
149       qcoeff_ptr[rc] = (tran_low_t)((abs_qcoeff ^ coeff_sign) - coeff_sign);
150       dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0] / 2;
151     }
152 
153     if (abs_qcoeff) eob = i;
154   }
155   *eob_ptr = eob + 1;
156 }
157 #endif
158 
invert_quant(int16_t * quant,int16_t * shift,int d)159 static void invert_quant(int16_t *quant, int16_t *shift, int d) {
160   unsigned int t;
161   int l, m;
162   t = (unsigned int)d;
163   l = get_msb(t);
164   m = 1 + (1 << (16 + l)) / d;
165   *quant = (int16_t)(m - (1 << 16));
166   *shift = 1 << (16 - l);
167 }
168 
get_qzbin_factor(int q,vpx_bit_depth_t bit_depth)169 static int get_qzbin_factor(int q, vpx_bit_depth_t bit_depth) {
170   const int quant = vp9_dc_quant(q, 0, bit_depth);
171 #if CONFIG_VP9_HIGHBITDEPTH
172   switch (bit_depth) {
173     case VPX_BITS_8: return q == 0 ? 64 : (quant < 148 ? 84 : 80);
174     case VPX_BITS_10: return q == 0 ? 64 : (quant < 592 ? 84 : 80);
175     default:
176       assert(bit_depth == VPX_BITS_12);
177       return q == 0 ? 64 : (quant < 2368 ? 84 : 80);
178   }
179 #else
180   (void)bit_depth;
181   return q == 0 ? 64 : (quant < 148 ? 84 : 80);
182 #endif
183 }
184 
vp9_init_quantizer(VP9_COMP * cpi)185 void vp9_init_quantizer(VP9_COMP *cpi) {
186   VP9_COMMON *const cm = &cpi->common;
187   QUANTS *const quants = &cpi->quants;
188   int i, q, quant;
189 
190   for (q = 0; q < QINDEX_RANGE; q++) {
191     int qzbin_factor = get_qzbin_factor(q, cm->bit_depth);
192     int qrounding_factor = q == 0 ? 64 : 48;
193     const int sharpness_adjustment = 16 * (7 - cpi->oxcf.sharpness) / 7;
194 
195     if (cpi->oxcf.sharpness > 0 && q > 0) {
196       qzbin_factor = 64 + sharpness_adjustment;
197       qrounding_factor = 64 - sharpness_adjustment;
198     }
199 
200     for (i = 0; i < 2; ++i) {
201       int qrounding_factor_fp = i == 0 ? 48 : 42;
202       if (q == 0) qrounding_factor_fp = 64;
203       if (cpi->oxcf.sharpness > 0)
204         qrounding_factor_fp = 64 - sharpness_adjustment;
205       // y
206       quant = i == 0 ? vp9_dc_quant(q, cm->y_dc_delta_q, cm->bit_depth)
207                      : vp9_ac_quant(q, 0, cm->bit_depth);
208       invert_quant(&quants->y_quant[q][i], &quants->y_quant_shift[q][i], quant);
209       quants->y_quant_fp[q][i] = (1 << 16) / quant;
210       quants->y_round_fp[q][i] = (qrounding_factor_fp * quant) >> 7;
211       quants->y_zbin[q][i] = ROUND_POWER_OF_TWO(qzbin_factor * quant, 7);
212       quants->y_round[q][i] = (qrounding_factor * quant) >> 7;
213       cpi->y_dequant[q][i] = quant;
214 
215       // uv
216       quant = i == 0 ? vp9_dc_quant(q, cm->uv_dc_delta_q, cm->bit_depth)
217                      : vp9_ac_quant(q, cm->uv_ac_delta_q, cm->bit_depth);
218       invert_quant(&quants->uv_quant[q][i], &quants->uv_quant_shift[q][i],
219                    quant);
220       quants->uv_quant_fp[q][i] = (1 << 16) / quant;
221       quants->uv_round_fp[q][i] = (qrounding_factor_fp * quant) >> 7;
222       quants->uv_zbin[q][i] = ROUND_POWER_OF_TWO(qzbin_factor * quant, 7);
223       quants->uv_round[q][i] = (qrounding_factor * quant) >> 7;
224       cpi->uv_dequant[q][i] = quant;
225     }
226 
227     for (i = 2; i < 8; i++) {
228       quants->y_quant[q][i] = quants->y_quant[q][1];
229       quants->y_quant_fp[q][i] = quants->y_quant_fp[q][1];
230       quants->y_round_fp[q][i] = quants->y_round_fp[q][1];
231       quants->y_quant_shift[q][i] = quants->y_quant_shift[q][1];
232       quants->y_zbin[q][i] = quants->y_zbin[q][1];
233       quants->y_round[q][i] = quants->y_round[q][1];
234       cpi->y_dequant[q][i] = cpi->y_dequant[q][1];
235 
236       quants->uv_quant[q][i] = quants->uv_quant[q][1];
237       quants->uv_quant_fp[q][i] = quants->uv_quant_fp[q][1];
238       quants->uv_round_fp[q][i] = quants->uv_round_fp[q][1];
239       quants->uv_quant_shift[q][i] = quants->uv_quant_shift[q][1];
240       quants->uv_zbin[q][i] = quants->uv_zbin[q][1];
241       quants->uv_round[q][i] = quants->uv_round[q][1];
242       cpi->uv_dequant[q][i] = cpi->uv_dequant[q][1];
243     }
244   }
245 }
246 
vp9_init_plane_quantizers(VP9_COMP * cpi,MACROBLOCK * x)247 void vp9_init_plane_quantizers(VP9_COMP *cpi, MACROBLOCK *x) {
248   const VP9_COMMON *const cm = &cpi->common;
249   MACROBLOCKD *const xd = &x->e_mbd;
250   QUANTS *const quants = &cpi->quants;
251   const int segment_id = xd->mi[0]->segment_id;
252   const int qindex = vp9_get_qindex(&cm->seg, segment_id, cm->base_qindex);
253   const int rdmult = vp9_compute_rd_mult(cpi, qindex + cm->y_dc_delta_q);
254   int i;
255 
256   // Y
257   x->plane[0].quant = quants->y_quant[qindex];
258   x->plane[0].quant_fp = quants->y_quant_fp[qindex];
259   x->plane[0].round_fp = quants->y_round_fp[qindex];
260   x->plane[0].quant_shift = quants->y_quant_shift[qindex];
261   x->plane[0].zbin = quants->y_zbin[qindex];
262   x->plane[0].round = quants->y_round[qindex];
263   xd->plane[0].dequant = cpi->y_dequant[qindex];
264   x->plane[0].quant_thred[0] = x->plane[0].zbin[0] * x->plane[0].zbin[0];
265   x->plane[0].quant_thred[1] = x->plane[0].zbin[1] * x->plane[0].zbin[1];
266 
267   // UV
268   for (i = 1; i < 3; i++) {
269     x->plane[i].quant = quants->uv_quant[qindex];
270     x->plane[i].quant_fp = quants->uv_quant_fp[qindex];
271     x->plane[i].round_fp = quants->uv_round_fp[qindex];
272     x->plane[i].quant_shift = quants->uv_quant_shift[qindex];
273     x->plane[i].zbin = quants->uv_zbin[qindex];
274     x->plane[i].round = quants->uv_round[qindex];
275     xd->plane[i].dequant = cpi->uv_dequant[qindex];
276     x->plane[i].quant_thred[0] = x->plane[i].zbin[0] * x->plane[i].zbin[0];
277     x->plane[i].quant_thred[1] = x->plane[i].zbin[1] * x->plane[i].zbin[1];
278   }
279 
280   x->skip_block = segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP);
281   x->q_index = qindex;
282 
283   set_error_per_bit(x, rdmult);
284 
285   vp9_initialize_me_consts(cpi, x, x->q_index);
286 }
287 
vp9_frame_init_quantizer(VP9_COMP * cpi)288 void vp9_frame_init_quantizer(VP9_COMP *cpi) {
289   vp9_init_plane_quantizers(cpi, &cpi->td.mb);
290 }
291 
vp9_set_quantizer(VP9_COMP * cpi,int q)292 void vp9_set_quantizer(VP9_COMP *cpi, int q) {
293   VP9_COMMON *cm = &cpi->common;
294   // quantizer has to be reinitialized with vp9_init_quantizer() if any
295   // delta_q changes.
296   cm->base_qindex = q;
297   cm->y_dc_delta_q = 0;
298   cm->uv_dc_delta_q = 0;
299   cm->uv_ac_delta_q = 0;
300   if (cpi->oxcf.delta_q_uv != 0) {
301     cm->uv_dc_delta_q = cm->uv_ac_delta_q = cpi->oxcf.delta_q_uv;
302     vp9_init_quantizer(cpi);
303   }
304 }
305 
306 // Table that converts 0-63 Q-range values passed in outside to the Qindex
307 // range used internally.
308 static const int quantizer_to_qindex[] = {
309   0,   4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
310   52,  56,  60,  64,  68,  72,  76,  80,  84,  88,  92,  96,  100,
311   104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152,
312   156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200, 204,
313   208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 249, 255,
314 };
315 
vp9_quantizer_to_qindex(int quantizer)316 int vp9_quantizer_to_qindex(int quantizer) {
317   return quantizer_to_qindex[quantizer];
318 }
319 
vp9_qindex_to_quantizer(int qindex)320 int vp9_qindex_to_quantizer(int qindex) {
321   int quantizer;
322 
323   for (quantizer = 0; quantizer < 64; ++quantizer)
324     if (quantizer_to_qindex[quantizer] >= qindex) return quantizer;
325 
326   return 63;
327 }
328