| OLD | NEW |
| 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 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 rc = vp8_default_zig_zag1d[i]; | 43 rc = vp8_default_zig_zag1d[i]; |
| 44 z = coeff_ptr[rc]; | 44 z = coeff_ptr[rc]; |
| 45 zbin = zbin_ptr[rc] ; | 45 zbin = zbin_ptr[rc] ; |
| 46 | 46 |
| 47 sz = (z >> 31); /* sign of z */ | 47 sz = (z >> 31); /* sign of z */ |
| 48 x = (z ^ sz) - sz; /* x = abs(z) */ | 48 x = (z ^ sz) - sz; /* x = abs(z) */ |
| 49 | 49 |
| 50 if (x >= zbin) | 50 if (x >= zbin) |
| 51 { | 51 { |
| 52 x += round_ptr[rc]; | 52 x += round_ptr[rc]; |
| 53 y = (((x * quant_ptr[rc]) >> 16) + x) | 53 y = ((((x * quant_ptr[rc]) >> 16) + x) |
| 54 >> quant_shift_ptr[rc]; /* quantize (x) */ | 54 * quant_shift_ptr[rc]) >> 16; /* quantize (x) */ |
| 55 x = (y ^ sz) - sz; /* get the sign back */ | 55 x = (y ^ sz) - sz; /* get the sign back */ |
| 56 qcoeff_ptr[rc] = x; /* write to destination */ | 56 qcoeff_ptr[rc] = x; /* write to destination */ |
| 57 dqcoeff_ptr[rc] = x * dequant_ptr[rc]; /* dequantized value */ | 57 dqcoeff_ptr[rc] = x * dequant_ptr[rc]; /* dequantized value */ |
| 58 | 58 |
| 59 if (y) | 59 if (y) |
| 60 { | 60 { |
| 61 eob = i; /* last nonzero coeffs */ | 61 eob = i; /* last nonzero coeffs */ |
| 62 } | 62 } |
| 63 } | 63 } |
| 64 } | 64 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 void vp8_regular_quantize_b_c(BLOCK *b, BLOCKD *d) | 106 void vp8_regular_quantize_b_c(BLOCK *b, BLOCKD *d) |
| 107 { | 107 { |
| 108 int i, rc, eob; | 108 int i, rc, eob; |
| 109 int zbin; | 109 int zbin; |
| 110 int x, y, z, sz; | 110 int x, y, z, sz; |
| 111 short *zbin_boost_ptr = b->zrun_zbin_boost; | 111 short *zbin_boost_ptr = b->zrun_zbin_boost; |
| 112 short *coeff_ptr = b->coeff; | 112 short *coeff_ptr = b->coeff; |
| 113 short *zbin_ptr = b->zbin; | 113 short *zbin_ptr = b->zbin; |
| 114 short *round_ptr = b->round; | 114 short *round_ptr = b->round; |
| 115 short *quant_ptr = b->quant; | 115 short *quant_ptr = b->quant; |
| 116 unsigned char *quant_shift_ptr = b->quant_shift; | 116 short *quant_shift_ptr = b->quant_shift; |
| 117 short *qcoeff_ptr = d->qcoeff; | 117 short *qcoeff_ptr = d->qcoeff; |
| 118 short *dqcoeff_ptr = d->dqcoeff; | 118 short *dqcoeff_ptr = d->dqcoeff; |
| 119 short *dequant_ptr = d->dequant; | 119 short *dequant_ptr = d->dequant; |
| 120 short zbin_oq_value = b->zbin_extra; | 120 short zbin_oq_value = b->zbin_extra; |
| 121 | 121 |
| 122 vpx_memset(qcoeff_ptr, 0, 32); | 122 vpx_memset(qcoeff_ptr, 0, 32); |
| 123 vpx_memset(dqcoeff_ptr, 0, 32); | 123 vpx_memset(dqcoeff_ptr, 0, 32); |
| 124 | 124 |
| 125 eob = -1; | 125 eob = -1; |
| 126 | 126 |
| 127 for (i = 0; i < 16; i++) | 127 for (i = 0; i < 16; i++) |
| 128 { | 128 { |
| 129 rc = vp8_default_zig_zag1d[i]; | 129 rc = vp8_default_zig_zag1d[i]; |
| 130 z = coeff_ptr[rc]; | 130 z = coeff_ptr[rc]; |
| 131 | 131 |
| 132 zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value; | 132 zbin = zbin_ptr[rc] + *zbin_boost_ptr + zbin_oq_value; |
| 133 | 133 |
| 134 zbin_boost_ptr ++; | 134 zbin_boost_ptr ++; |
| 135 sz = (z >> 31); /* sign of z */ | 135 sz = (z >> 31); /* sign of z */ |
| 136 x = (z ^ sz) - sz; /* x = abs(z) */ | 136 x = (z ^ sz) - sz; /* x = abs(z) */ |
| 137 | 137 |
| 138 if (x >= zbin) | 138 if (x >= zbin) |
| 139 { | 139 { |
| 140 x += round_ptr[rc]; | 140 x += round_ptr[rc]; |
| 141 y = (((x * quant_ptr[rc]) >> 16) + x) | 141 y = ((((x * quant_ptr[rc]) >> 16) + x) |
| 142 >> quant_shift_ptr[rc]; /* quantize (x) */ | 142 * quant_shift_ptr[rc]) >> 16; /* quantize (x) */ |
| 143 x = (y ^ sz) - sz; /* get the sign back */ | 143 x = (y ^ sz) - sz; /* get the sign back */ |
| 144 qcoeff_ptr[rc] = x; /* write to destination */ | 144 qcoeff_ptr[rc] = x; /* write to destination */ |
| 145 dqcoeff_ptr[rc] = x * dequant_ptr[rc]; /* dequantized value */ | 145 dqcoeff_ptr[rc] = x * dequant_ptr[rc]; /* dequantized value */ |
| 146 | 146 |
| 147 if (y) | 147 if (y) |
| 148 { | 148 { |
| 149 eob = i; /* last nonzero coeffs */ | 149 eob = i; /* last nonzero coeffs */ |
| 150 zbin_boost_ptr = b->zrun_zbin_boost; /* reset zero runlength */ | 150 zbin_boost_ptr = b->zrun_zbin_boost; /* reset zero runlength */ |
| 151 } | 151 } |
| 152 } | 152 } |
| 153 } | 153 } |
| 154 | 154 |
| 155 *d->eob = (char)(eob + 1); | 155 *d->eob = (char)(eob + 1); |
| 156 } | 156 } |
| 157 | 157 |
| 158 /* Perform regular quantization, with unbiased rounding and no zero bin. */ | 158 /* Perform regular quantization, with unbiased rounding and no zero bin. */ |
| 159 void vp8_strict_quantize_b_c(BLOCK *b, BLOCKD *d) | 159 void vp8_strict_quantize_b_c(BLOCK *b, BLOCKD *d) |
| 160 { | 160 { |
| 161 int i; | 161 int i; |
| 162 int rc; | 162 int rc; |
| 163 int eob; | 163 int eob; |
| 164 int x; | 164 int x; |
| 165 int y; | 165 int y; |
| 166 int z; | 166 int z; |
| 167 int sz; | 167 int sz; |
| 168 short *coeff_ptr; | 168 short *coeff_ptr; |
| 169 short *quant_ptr; | 169 short *quant_ptr; |
| 170 unsigned char *quant_shift_ptr; | 170 short *quant_shift_ptr; |
| 171 short *qcoeff_ptr; | 171 short *qcoeff_ptr; |
| 172 short *dqcoeff_ptr; | 172 short *dqcoeff_ptr; |
| 173 short *dequant_ptr; | 173 short *dequant_ptr; |
| 174 | 174 |
| 175 coeff_ptr = b->coeff; | 175 coeff_ptr = b->coeff; |
| 176 quant_ptr = b->quant; | 176 quant_ptr = b->quant; |
| 177 quant_shift_ptr = b->quant_shift; | 177 quant_shift_ptr = b->quant_shift; |
| 178 qcoeff_ptr = d->qcoeff; | 178 qcoeff_ptr = d->qcoeff; |
| 179 dqcoeff_ptr = d->dqcoeff; | 179 dqcoeff_ptr = d->dqcoeff; |
| 180 dequant_ptr = d->dequant; | 180 dequant_ptr = d->dequant; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 191 z = coeff_ptr[rc]; | 191 z = coeff_ptr[rc]; |
| 192 dq = dequant_ptr[rc]; | 192 dq = dequant_ptr[rc]; |
| 193 round = dq >> 1; | 193 round = dq >> 1; |
| 194 /* Sign of z. */ | 194 /* Sign of z. */ |
| 195 sz = -(z < 0); | 195 sz = -(z < 0); |
| 196 x = (z + sz) ^ sz; | 196 x = (z + sz) ^ sz; |
| 197 x += round; | 197 x += round; |
| 198 if (x >= dq) | 198 if (x >= dq) |
| 199 { | 199 { |
| 200 /* Quantize x. */ | 200 /* Quantize x. */ |
| 201 y = (((x * quant_ptr[rc]) >> 16) + x) >> quant_shift_ptr[rc]; | 201 y = ((((x * quant_ptr[rc]) >> 16) + x) * quant_shift_ptr[rc]) >> 16
; |
| 202 /* Put the sign back. */ | 202 /* Put the sign back. */ |
| 203 x = (y + sz) ^ sz; | 203 x = (y + sz) ^ sz; |
| 204 /* Save the coefficient and its dequantized value. */ | 204 /* Save the coefficient and its dequantized value. */ |
| 205 qcoeff_ptr[rc] = x; | 205 qcoeff_ptr[rc] = x; |
| 206 dqcoeff_ptr[rc] = x * dq; | 206 dqcoeff_ptr[rc] = x * dq; |
| 207 /* Remember the last non-zero coefficient. */ | 207 /* Remember the last non-zero coefficient. */ |
| 208 if (y) | 208 if (y) |
| 209 eob = i; | 209 eob = i; |
| 210 } | 210 } |
| 211 } | 211 } |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 80, 80, 80, 80, 80, 80, 80, 80, | 399 80, 80, 80, 80, 80, 80, 80, 80, |
| 400 80, 80, 80, 80, 80, 80, 80, 80, | 400 80, 80, 80, 80, 80, 80, 80, 80, |
| 401 80, 80, 80, 80, 80, 80, 80, 80, | 401 80, 80, 80, 80, 80, 80, 80, 80, |
| 402 80 | 402 80 |
| 403 }; | 403 }; |
| 404 | 404 |
| 405 | 405 |
| 406 #define EXACT_QUANT | 406 #define EXACT_QUANT |
| 407 #ifdef EXACT_QUANT | 407 #ifdef EXACT_QUANT |
| 408 static void invert_quant(int improved_quant, short *quant, | 408 static void invert_quant(int improved_quant, short *quant, |
| 409 unsigned char *shift, short d) | 409 short *shift, short d) |
| 410 { | 410 { |
| 411 if(improved_quant) | 411 if(improved_quant) |
| 412 { | 412 { |
| 413 unsigned t; | 413 unsigned t; |
| 414 int l; | 414 int l; |
| 415 t = d; | 415 t = d; |
| 416 for(l = 0; t > 1; l++) | 416 for(l = 0; t > 1; l++) |
| 417 t>>=1; | 417 t>>=1; |
| 418 t = 1 + (1<<(16+l))/d; | 418 t = 1 + (1<<(16+l))/d; |
| 419 *quant = (short)(t - (1<<16)); | 419 *quant = (short)(t - (1<<16)); |
| 420 *shift = l; | 420 *shift = l; |
| 421 /* use multiplication and constant shift by 16 */ |
| 422 *shift = 1 << (16 - *shift); |
| 421 } | 423 } |
| 422 else | 424 else |
| 423 { | 425 { |
| 424 *quant = (1 << 16) / d; | 426 *quant = (1 << 16) / d; |
| 425 *shift = 0; | 427 *shift = 0; |
| 428 /* use multiplication and constant shift by 16 */ |
| 429 *shift = 1 << (16 - *shift); |
| 426 } | 430 } |
| 427 } | 431 } |
| 428 | 432 |
| 429 | 433 |
| 430 void vp8cx_init_quantizer(VP8_COMP *cpi) | 434 void vp8cx_init_quantizer(VP8_COMP *cpi) |
| 431 { | 435 { |
| 432 int i; | 436 int i; |
| 433 int quant_val; | 437 int quant_val; |
| 434 int Q; | 438 int Q; |
| 435 | 439 |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 mbd->segment_feature_data[MB_LVL_ALT_Q][0] = cpi->segment_feature_data[MB_LV
L_ALT_Q][0]; | 806 mbd->segment_feature_data[MB_LVL_ALT_Q][0] = cpi->segment_feature_data[MB_LV
L_ALT_Q][0]; |
| 803 mbd->segment_feature_data[MB_LVL_ALT_Q][1] = cpi->segment_feature_data[MB_LV
L_ALT_Q][1]; | 807 mbd->segment_feature_data[MB_LVL_ALT_Q][1] = cpi->segment_feature_data[MB_LV
L_ALT_Q][1]; |
| 804 mbd->segment_feature_data[MB_LVL_ALT_Q][2] = cpi->segment_feature_data[MB_LV
L_ALT_Q][2]; | 808 mbd->segment_feature_data[MB_LVL_ALT_Q][2] = cpi->segment_feature_data[MB_LV
L_ALT_Q][2]; |
| 805 mbd->segment_feature_data[MB_LVL_ALT_Q][3] = cpi->segment_feature_data[MB_LV
L_ALT_Q][3]; | 809 mbd->segment_feature_data[MB_LVL_ALT_Q][3] = cpi->segment_feature_data[MB_LV
L_ALT_Q][3]; |
| 806 | 810 |
| 807 /* quantizer has to be reinitialized for any delta_q changes */ | 811 /* quantizer has to be reinitialized for any delta_q changes */ |
| 808 if(update) | 812 if(update) |
| 809 vp8cx_init_quantizer(cpi); | 813 vp8cx_init_quantizer(cpi); |
| 810 | 814 |
| 811 } | 815 } |
| OLD | NEW |