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