Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_quantize.c

Issue 168343002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: libvpx: Pull from upstream Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_pickmode.c ('k') | source/libvpx/vp9/encoder/vp9_ratectrl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <math.h> 11 #include <math.h>
12 #include "vpx_mem/vpx_mem.h" 12 #include "vpx_mem/vpx_mem.h"
13 13
14 #include "vp9/encoder/vp9_onyx_int.h" 14 #include "vp9/encoder/vp9_onyx_int.h"
15 #include "vp9/encoder/vp9_rdopt.h" 15 #include "vp9/encoder/vp9_rdopt.h"
16 #include "vp9/encoder/vp9_quantize.h" 16 #include "vp9/encoder/vp9_quantize.h"
17 #include "vp9/common/vp9_quant_common.h" 17 #include "vp9/common/vp9_quant_common.h"
18 18
19 #include "vp9/common/vp9_seg_common.h" 19 #include "vp9/common/vp9_seg_common.h"
20 20
21 #ifdef ENC_DEBUG
22 extern int enc_debug;
23 #endif
24
25 void vp9_quantize_b_c(const int16_t *coeff_ptr, intptr_t count, 21 void vp9_quantize_b_c(const int16_t *coeff_ptr, intptr_t count,
26 int skip_block, 22 int skip_block,
27 const int16_t *zbin_ptr, const int16_t *round_ptr, 23 const int16_t *zbin_ptr, const int16_t *round_ptr,
28 const int16_t *quant_ptr, const int16_t *quant_shift_ptr, 24 const int16_t *quant_ptr, const int16_t *quant_shift_ptr,
29 int16_t *qcoeff_ptr, int16_t *dqcoeff_ptr, 25 int16_t *qcoeff_ptr, int16_t *dqcoeff_ptr,
30 const int16_t *dequant_ptr, 26 const int16_t *dequant_ptr,
31 int zbin_oq_value, uint16_t *eob_ptr, 27 int zbin_oq_value, uint16_t *eob_ptr,
32 const int16_t *scan, const int16_t *iscan) { 28 const int16_t *scan, const int16_t *iscan) {
33 int i, non_zero_count = count, eob = -1; 29 int i, non_zero_count = count, eob = -1;
34 const int zbins[2] = { zbin_ptr[0] + zbin_oq_value, 30 const int zbins[2] = { zbin_ptr[0] + zbin_oq_value,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 72
77 void vp9_quantize_b_32x32_c(const int16_t *coeff_ptr, intptr_t n_coeffs, 73 void vp9_quantize_b_32x32_c(const int16_t *coeff_ptr, intptr_t n_coeffs,
78 int skip_block, 74 int skip_block,
79 const int16_t *zbin_ptr, const int16_t *round_ptr, 75 const int16_t *zbin_ptr, const int16_t *round_ptr,
80 const int16_t *quant_ptr, 76 const int16_t *quant_ptr,
81 const int16_t *quant_shift_ptr, 77 const int16_t *quant_shift_ptr,
82 int16_t *qcoeff_ptr, int16_t *dqcoeff_ptr, 78 int16_t *qcoeff_ptr, int16_t *dqcoeff_ptr,
83 const int16_t *dequant_ptr, 79 const int16_t *dequant_ptr,
84 int zbin_oq_value, uint16_t *eob_ptr, 80 int zbin_oq_value, uint16_t *eob_ptr,
85 const int16_t *scan, const int16_t *iscan) { 81 const int16_t *scan, const int16_t *iscan) {
86 int i, rc, eob; 82 const int zbins[2] = { ROUND_POWER_OF_TWO(zbin_ptr[0] + zbin_oq_value, 1),
87 int zbins[2], nzbins[2]; 83 ROUND_POWER_OF_TWO(zbin_ptr[1] + zbin_oq_value, 1) };
88 int x, y, z, sz; 84 const int nzbins[2] = {zbins[0] * -1, zbins[1] * -1};
85
89 int idx = 0; 86 int idx = 0;
90 int idx_arr[1024]; 87 int idx_arr[1024];
88 int i, eob = -1;
91 89
92 vpx_memset(qcoeff_ptr, 0, n_coeffs*sizeof(int16_t)); 90 vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(int16_t));
93 vpx_memset(dqcoeff_ptr, 0, n_coeffs*sizeof(int16_t)); 91 vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(int16_t));
94
95 eob = -1;
96
97 // Base ZBIN
98 zbins[0] = ROUND_POWER_OF_TWO(zbin_ptr[0] + zbin_oq_value, 1);
99 zbins[1] = ROUND_POWER_OF_TWO(zbin_ptr[1] + zbin_oq_value, 1);
100 nzbins[0] = zbins[0] * -1;
101 nzbins[1] = zbins[1] * -1;
102 92
103 if (!skip_block) { 93 if (!skip_block) {
104 // Pre-scan pass 94 // Pre-scan pass
105 for (i = 0; i < n_coeffs; i++) { 95 for (i = 0; i < n_coeffs; i++) {
106 rc = scan[i]; 96 const int rc = scan[i];
107 z = coeff_ptr[rc]; 97 const int coeff = coeff_ptr[rc];
108 98
109 // If the coefficient is out of the base ZBIN range, keep it for 99 // If the coefficient is out of the base ZBIN range, keep it for
110 // quantization. 100 // quantization.
111 if (z >= zbins[rc != 0] || z <= nzbins[rc != 0]) 101 if (coeff >= zbins[rc != 0] || coeff <= nzbins[rc != 0])
112 idx_arr[idx++] = i; 102 idx_arr[idx++] = i;
113 } 103 }
114 104
115 // Quantization pass: only process the coefficients selected in 105 // Quantization pass: only process the coefficients selected in
116 // pre-scan pass. Note: idx can be zero. 106 // pre-scan pass. Note: idx can be zero.
117 for (i = 0; i < idx; i++) { 107 for (i = 0; i < idx; i++) {
118 rc = scan[idx_arr[i]]; 108 const int rc = scan[idx_arr[i]];
109 const int coeff = coeff_ptr[rc];
110 const int coeff_sign = (coeff >> 31);
111 int tmp;
112 int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
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]) >> 16) + abs_coeff) *
116 quant_shift_ptr[rc != 0]) >> 15;
119 117
120 z = coeff_ptr[rc]; 118 qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign;
121 sz = (z >> 31); // sign of z 119 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr[rc != 0] / 2;
122 x = (z ^ sz) - sz; // x = abs(z)
123 120
124 x += ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1); 121 if (tmp)
125 x = clamp(x, INT16_MIN, INT16_MAX); 122 eob = idx_arr[i];
126 y = ((((x * quant_ptr[rc != 0]) >> 16) + x) *
127 quant_shift_ptr[rc != 0]) >> 15; // quantize (x)
128
129 x = (y ^ sz) - sz; // get the sign back
130 qcoeff_ptr[rc] = x; // write to destination
131 dqcoeff_ptr[rc] = x * dequant_ptr[rc != 0] / 2; // dequantized value
132
133 if (y)
134 eob = idx_arr[i]; // last nonzero coeffs
135 } 123 }
136 } 124 }
137 *eob_ptr = eob + 1; 125 *eob_ptr = eob + 1;
138 } 126 }
139 127
140 void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block, 128 void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block,
141 const int16_t *scan, const int16_t *iscan) { 129 const int16_t *scan, const int16_t *iscan) {
142 MACROBLOCKD *const xd = &x->e_mbd; 130 MACROBLOCKD *const xd = &x->e_mbd;
143 struct macroblock_plane* p = &x->plane[plane]; 131 struct macroblock_plane *p = &x->plane[plane];
144 struct macroblockd_plane* pd = &xd->plane[plane]; 132 struct macroblockd_plane *pd = &xd->plane[plane];
145 133
146 vp9_quantize_b(BLOCK_OFFSET(p->coeff, block), 134 vp9_quantize_b(BLOCK_OFFSET(p->coeff, block),
147 16, x->skip_block, 135 16, x->skip_block,
148 p->zbin, p->round, p->quant, p->quant_shift, 136 p->zbin, p->round, p->quant, p->quant_shift,
149 BLOCK_OFFSET(p->qcoeff, block), 137 BLOCK_OFFSET(p->qcoeff, block),
150 BLOCK_OFFSET(pd->dqcoeff, block), 138 BLOCK_OFFSET(pd->dqcoeff, block),
151 pd->dequant, p->zbin_extra, &p->eobs[block], scan, iscan); 139 pd->dequant, p->zbin_extra, &p->eobs[block], scan, iscan);
152 } 140 }
153 141
154 static void invert_quant(int16_t *quant, int16_t *shift, int d) { 142 static void invert_quant(int16_t *quant, int16_t *shift, int d) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 cpi->a_quant_shift[q][i] = cpi->a_quant_shift[q][1]; 208 cpi->a_quant_shift[q][i] = cpi->a_quant_shift[q][1];
221 cpi->a_zbin[q][i] = cpi->a_zbin[q][1]; 209 cpi->a_zbin[q][i] = cpi->a_zbin[q][1];
222 cpi->a_round[q][i] = cpi->a_round[q][1]; 210 cpi->a_round[q][i] = cpi->a_round[q][1];
223 cm->a_dequant[q][i] = cm->a_dequant[q][1]; 211 cm->a_dequant[q][i] = cm->a_dequant[q][1];
224 #endif 212 #endif
225 } 213 }
226 } 214 }
227 } 215 }
228 216
229 void vp9_mb_init_quantizer(VP9_COMP *cpi, MACROBLOCK *x) { 217 void vp9_mb_init_quantizer(VP9_COMP *cpi, MACROBLOCK *x) {
218 const VP9_COMMON *const cm = &cpi->common;
219 MACROBLOCKD *xd = &x->e_mbd;
220 const int segment_id = xd->mi_8x8[0]->mbmi.segment_id;
221 const int qindex = vp9_get_qindex(&cm->seg, segment_id, cm->base_qindex);
222 const int rdmult = vp9_compute_rd_mult(cpi, qindex + cm->y_dc_delta_q);
223 const int zbin = cpi->zbin_mode_boost + x->act_zbin_adj;
230 int i; 224 int i;
231 VP9_COMMON *const cm = &cpi->common;
232 MACROBLOCKD *xd = &x->e_mbd;
233 int zbin_extra;
234 int segment_id = xd->mi_8x8[0]->mbmi.segment_id;
235 const int qindex = vp9_get_qindex(&cpi->common.seg, segment_id,
236 cpi->common.base_qindex);
237
238 int rdmult = vp9_compute_rd_mult(cpi, qindex + cm->y_dc_delta_q);
239 225
240 // Y 226 // Y
241 zbin_extra = (cpi->common.y_dequant[qindex][1] *
242 (cpi->zbin_mode_boost + x->act_zbin_adj)) >> 7;
243
244 x->plane[0].quant = cpi->y_quant[qindex]; 227 x->plane[0].quant = cpi->y_quant[qindex];
245 x->plane[0].quant_shift = cpi->y_quant_shift[qindex]; 228 x->plane[0].quant_shift = cpi->y_quant_shift[qindex];
246 x->plane[0].zbin = cpi->y_zbin[qindex]; 229 x->plane[0].zbin = cpi->y_zbin[qindex];
247 x->plane[0].round = cpi->y_round[qindex]; 230 x->plane[0].round = cpi->y_round[qindex];
248 x->plane[0].zbin_extra = (int16_t)zbin_extra; 231 x->plane[0].zbin_extra = (int16_t)((cm->y_dequant[qindex][1] * zbin) >> 7);
249 x->e_mbd.plane[0].dequant = cpi->common.y_dequant[qindex]; 232 xd->plane[0].dequant = cm->y_dequant[qindex];
250 233
251 // UV 234 // UV
252 zbin_extra = (cpi->common.uv_dequant[qindex][1] *
253 (cpi->zbin_mode_boost + x->act_zbin_adj)) >> 7;
254
255 for (i = 1; i < 3; i++) { 235 for (i = 1; i < 3; i++) {
256 x->plane[i].quant = cpi->uv_quant[qindex]; 236 x->plane[i].quant = cpi->uv_quant[qindex];
257 x->plane[i].quant_shift = cpi->uv_quant_shift[qindex]; 237 x->plane[i].quant_shift = cpi->uv_quant_shift[qindex];
258 x->plane[i].zbin = cpi->uv_zbin[qindex]; 238 x->plane[i].zbin = cpi->uv_zbin[qindex];
259 x->plane[i].round = cpi->uv_round[qindex]; 239 x->plane[i].round = cpi->uv_round[qindex];
260 x->plane[i].zbin_extra = (int16_t)zbin_extra; 240 x->plane[i].zbin_extra = (int16_t)((cm->uv_dequant[qindex][1] * zbin) >> 7);
261 x->e_mbd.plane[i].dequant = cpi->common.uv_dequant[qindex]; 241 xd->plane[i].dequant = cm->uv_dequant[qindex];
262 } 242 }
263 243
264 #if CONFIG_ALPHA 244 #if CONFIG_ALPHA
265 x->plane[3].quant = cpi->a_quant[qindex]; 245 x->plane[3].quant = cpi->a_quant[qindex];
266 x->plane[3].quant_shift = cpi->a_quant_shift[qindex]; 246 x->plane[3].quant_shift = cpi->a_quant_shift[qindex];
267 x->plane[3].zbin = cpi->a_zbin[qindex]; 247 x->plane[3].zbin = cpi->a_zbin[qindex];
268 x->plane[3].round = cpi->a_round[qindex]; 248 x->plane[3].round = cpi->a_round[qindex];
269 x->plane[3].zbin_extra = (int16_t)zbin_extra; 249 x->plane[3].zbin_extra = (int16_t)zbin_extra;
270 x->e_mbd.plane[3].dequant = cpi->common.a_dequant[qindex]; 250 xd->plane[3].dequant = cm->a_dequant[qindex];
271 #endif 251 #endif
272 252
273 x->skip_block = vp9_segfeature_active(&cpi->common.seg, segment_id, 253 x->skip_block = vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP);
274 SEG_LVL_SKIP);
275
276 /* save this macroblock QIndex for vp9_update_zbin_extra() */
277 x->q_index = qindex; 254 x->q_index = qindex;
278 255
279 /* R/D setup */ 256 x->errorperbit = rdmult >> 6;
280 cpi->mb.errorperbit = rdmult >> 6; 257 x->errorperbit += (x->errorperbit == 0);
281 cpi->mb.errorperbit += (cpi->mb.errorperbit == 0);
282 258
283 vp9_initialize_me_consts(cpi, x->q_index); 259 vp9_initialize_me_consts(cpi, x->q_index);
284 } 260 }
285 261
286 void vp9_update_zbin_extra(VP9_COMP *cpi, MACROBLOCK *x) { 262 void vp9_update_zbin_extra(VP9_COMP *cpi, MACROBLOCK *x) {
287 const int qindex = x->q_index; 263 const int qindex = x->q_index;
288 const int y_zbin_extra = (cpi->common.y_dequant[qindex][1] * 264 const int y_zbin_extra = (cpi->common.y_dequant[qindex][1] *
289 (cpi->zbin_mode_boost + x->act_zbin_adj)) >> 7; 265 (cpi->zbin_mode_boost + x->act_zbin_adj)) >> 7;
290 const int uv_zbin_extra = (cpi->common.uv_dequant[qindex][1] * 266 const int uv_zbin_extra = (cpi->common.uv_dequant[qindex][1] *
291 (cpi->zbin_mode_boost + x->act_zbin_adj)) >> 7; 267 (cpi->zbin_mode_boost + x->act_zbin_adj)) >> 7;
(...skipping 20 matching lines...) Expand all
312 // have to be set. 288 // have to be set.
313 cm->y_dc_delta_q = 0; 289 cm->y_dc_delta_q = 0;
314 cm->uv_dc_delta_q = 0; 290 cm->uv_dc_delta_q = 0;
315 cm->uv_ac_delta_q = 0; 291 cm->uv_ac_delta_q = 0;
316 292
317 // quantizer has to be reinitialized if any delta_q changes. 293 // quantizer has to be reinitialized if any delta_q changes.
318 // As there are not any here for now this is inactive code. 294 // As there are not any here for now this is inactive code.
319 // if(update) 295 // if(update)
320 // vp9_init_quantizer(cpi); 296 // vp9_init_quantizer(cpi);
321 } 297 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_pickmode.c ('k') | source/libvpx/vp9/encoder/vp9_ratectrl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698