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

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

Issue 996503002: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_quantize.h ('k') | source/libvpx/vp9/encoder/vp9_rd.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 12
13 #include "vpx_mem/vpx_mem.h" 13 #include "vpx_mem/vpx_mem.h"
14 14
15 #include "vp9/common/vp9_quant_common.h" 15 #include "vp9/common/vp9_quant_common.h"
16 #include "vp9/common/vp9_seg_common.h" 16 #include "vp9/common/vp9_seg_common.h"
17 17
18 #include "vp9/encoder/vp9_encoder.h" 18 #include "vp9/encoder/vp9_encoder.h"
19 #include "vp9/encoder/vp9_quantize.h" 19 #include "vp9/encoder/vp9_quantize.h"
20 #include "vp9/encoder/vp9_rd.h" 20 #include "vp9/encoder/vp9_rd.h"
21 21
22 void vp9_quantize_dc(const tran_low_t *coeff_ptr, int skip_block, 22 void vp9_quantize_dc(const tran_low_t *coeff_ptr,
23 int n_coeffs, int skip_block,
23 const int16_t *round_ptr, const int16_t quant, 24 const int16_t *round_ptr, const int16_t quant,
24 tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, 25 tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
25 const int16_t dequant_ptr, uint16_t *eob_ptr) { 26 const int16_t dequant_ptr, uint16_t *eob_ptr) {
26 const int rc = 0; 27 const int rc = 0;
27 const int coeff = coeff_ptr[rc]; 28 const int coeff = coeff_ptr[rc];
28 const int coeff_sign = (coeff >> 31); 29 const int coeff_sign = (coeff >> 31);
29 const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign; 30 const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
30 int tmp, eob = -1; 31 int tmp, eob = -1;
31 32
33 vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
34 vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
35
32 if (!skip_block) { 36 if (!skip_block) {
33 tmp = clamp(abs_coeff + round_ptr[rc != 0], INT16_MIN, INT16_MAX); 37 tmp = clamp(abs_coeff + round_ptr[rc != 0], INT16_MIN, INT16_MAX);
34 tmp = (tmp * quant) >> 16; 38 tmp = (tmp * quant) >> 16;
35 qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign; 39 qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign;
36 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr; 40 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr;
37 if (tmp) 41 if (tmp)
38 eob = 0; 42 eob = 0;
39 } 43 }
40 *eob_ptr = eob + 1; 44 *eob_ptr = eob + 1;
41 } 45 }
42 46
43 #if CONFIG_VP9_HIGHBITDEPTH 47 #if CONFIG_VP9_HIGHBITDEPTH
44 void vp9_highbd_quantize_dc(const tran_low_t *coeff_ptr, int skip_block, 48 void vp9_highbd_quantize_dc(const tran_low_t *coeff_ptr,
49 int n_coeffs, int skip_block,
45 const int16_t *round_ptr, const int16_t quant, 50 const int16_t *round_ptr, const int16_t quant,
46 tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, 51 tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
47 const int16_t dequant_ptr, uint16_t *eob_ptr) { 52 const int16_t dequant_ptr, uint16_t *eob_ptr) {
48 int eob = -1; 53 int eob = -1;
49 54
55 vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
56 vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
57
50 if (!skip_block) { 58 if (!skip_block) {
51 const int rc = 0; 59 const int rc = 0;
52 const int coeff = coeff_ptr[rc]; 60 const int coeff = coeff_ptr[rc];
53 const int coeff_sign = (coeff >> 31); 61 const int coeff_sign = (coeff >> 31);
54 const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign; 62 const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
55 63
56 const int64_t tmp = 64 const int64_t tmp =
57 (clamp(abs_coeff + round_ptr[rc != 0], INT32_MIN, INT32_MAX) * 65 (clamp(abs_coeff + round_ptr[rc != 0], INT32_MIN, INT32_MAX) *
58 quant) >> 16; 66 quant) >> 16;
59 qcoeff_ptr[rc] = (tran_low_t)((tmp ^ coeff_sign) - coeff_sign); 67 qcoeff_ptr[rc] = (tran_low_t)((tmp ^ coeff_sign) - coeff_sign);
60 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr; 68 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr;
61 if (tmp) 69 if (tmp)
62 eob = 0; 70 eob = 0;
63 } 71 }
64 *eob_ptr = eob + 1; 72 *eob_ptr = eob + 1;
65 } 73 }
66 #endif 74 #endif
67 75
68 void vp9_quantize_dc_32x32(const tran_low_t *coeff_ptr, int skip_block, 76 void vp9_quantize_dc_32x32(const tran_low_t *coeff_ptr, int skip_block,
69 const int16_t *round_ptr, const int16_t quant, 77 const int16_t *round_ptr, const int16_t quant,
70 tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, 78 tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr,
71 const int16_t dequant_ptr, uint16_t *eob_ptr) { 79 const int16_t dequant_ptr, uint16_t *eob_ptr) {
80 const int n_coeffs = 1024;
72 const int rc = 0; 81 const int rc = 0;
73 const int coeff = coeff_ptr[rc]; 82 const int coeff = coeff_ptr[rc];
74 const int coeff_sign = (coeff >> 31); 83 const int coeff_sign = (coeff >> 31);
75 const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign; 84 const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
76 int tmp, eob = -1; 85 int tmp, eob = -1;
77 86
87 vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
88 vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
89
78 if (!skip_block) { 90 if (!skip_block) {
79 91
80 tmp = clamp(abs_coeff + round_ptr[rc != 0], INT16_MIN, INT16_MAX); 92 tmp = clamp(abs_coeff + ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1),
93 INT16_MIN, INT16_MAX);
81 tmp = (tmp * quant) >> 15; 94 tmp = (tmp * quant) >> 15;
82 qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign; 95 qcoeff_ptr[rc] = (tmp ^ coeff_sign) - coeff_sign;
83 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr / 2; 96 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr / 2;
84 if (tmp) 97 if (tmp)
85 eob = 0; 98 eob = 0;
86 } 99 }
87 *eob_ptr = eob + 1; 100 *eob_ptr = eob + 1;
88 } 101 }
89 102
90 #if CONFIG_VP9_HIGHBITDEPTH 103 #if CONFIG_VP9_HIGHBITDEPTH
91 void vp9_highbd_quantize_dc_32x32(const tran_low_t *coeff_ptr, 104 void vp9_highbd_quantize_dc_32x32(const tran_low_t *coeff_ptr,
92 int skip_block, 105 int skip_block,
93 const int16_t *round_ptr, 106 const int16_t *round_ptr,
94 const int16_t quant, 107 const int16_t quant,
95 tran_low_t *qcoeff_ptr, 108 tran_low_t *qcoeff_ptr,
96 tran_low_t *dqcoeff_ptr, 109 tran_low_t *dqcoeff_ptr,
97 const int16_t dequant_ptr, 110 const int16_t dequant_ptr,
98 uint16_t *eob_ptr) { 111 uint16_t *eob_ptr) {
112 const int n_coeffs = 1024;
99 int eob = -1; 113 int eob = -1;
100 114
115 vpx_memset(qcoeff_ptr, 0, n_coeffs * sizeof(*qcoeff_ptr));
116 vpx_memset(dqcoeff_ptr, 0, n_coeffs * sizeof(*dqcoeff_ptr));
117
101 if (!skip_block) { 118 if (!skip_block) {
102 const int rc = 0; 119 const int rc = 0;
103 const int coeff = coeff_ptr[rc]; 120 const int coeff = coeff_ptr[rc];
104 const int coeff_sign = (coeff >> 31); 121 const int coeff_sign = (coeff >> 31);
105 const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign; 122 const int abs_coeff = (coeff ^ coeff_sign) - coeff_sign;
106 123
107 const int64_t tmp = 124 const int64_t tmp =
108 (clamp(abs_coeff + round_ptr[rc != 0], INT32_MIN, INT32_MAX) * 125 (clamp(abs_coeff + ROUND_POWER_OF_TWO(round_ptr[rc != 0], 1),
109 quant) >> 15; 126 INT32_MIN, INT32_MAX) * quant) >> 15;
110 qcoeff_ptr[rc] = (tran_low_t)((tmp ^ coeff_sign) - coeff_sign); 127 qcoeff_ptr[rc] = (tran_low_t)((tmp ^ coeff_sign) - coeff_sign);
111 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr / 2; 128 dqcoeff_ptr[rc] = qcoeff_ptr[rc] * dequant_ptr / 2;
112 if (tmp) 129 if (tmp)
113 eob = 0; 130 eob = 0;
114 } 131 }
115 *eob_ptr = eob + 1; 132 *eob_ptr = eob + 1;
116 } 133 }
117 #endif 134 #endif
118 135
119 void vp9_quantize_fp_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, 136 void vp9_quantize_fp_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs,
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 531
515 void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block, 532 void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block,
516 const int16_t *scan, const int16_t *iscan) { 533 const int16_t *scan, const int16_t *iscan) {
517 MACROBLOCKD *const xd = &x->e_mbd; 534 MACROBLOCKD *const xd = &x->e_mbd;
518 struct macroblock_plane *p = &x->plane[plane]; 535 struct macroblock_plane *p = &x->plane[plane];
519 struct macroblockd_plane *pd = &xd->plane[plane]; 536 struct macroblockd_plane *pd = &xd->plane[plane];
520 537
521 #if CONFIG_VP9_HIGHBITDEPTH 538 #if CONFIG_VP9_HIGHBITDEPTH
522 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 539 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
523 vp9_highbd_quantize_b(BLOCK_OFFSET(p->coeff, block), 540 vp9_highbd_quantize_b(BLOCK_OFFSET(p->coeff, block),
524 16, x->skip_block, 541 16, x->skip_block,
525 p->zbin, p->round, p->quant, p->quant_shift, 542 p->zbin, p->round, p->quant, p->quant_shift,
526 BLOCK_OFFSET(p->qcoeff, block), 543 BLOCK_OFFSET(p->qcoeff, block),
527 BLOCK_OFFSET(pd->dqcoeff, block), 544 BLOCK_OFFSET(pd->dqcoeff, block),
528 pd->dequant, &p->eobs[block], 545 pd->dequant, &p->eobs[block],
529 scan, iscan); 546 scan, iscan);
530 return; 547 return;
531 } 548 }
532 #endif 549 #endif
533 vp9_quantize_b(BLOCK_OFFSET(p->coeff, block), 550 vp9_quantize_b(BLOCK_OFFSET(p->coeff, block),
534 16, x->skip_block, 551 16, x->skip_block,
535 p->zbin, p->round, p->quant, p->quant_shift, 552 p->zbin, p->round, p->quant, p->quant_shift,
536 BLOCK_OFFSET(p->qcoeff, block), 553 BLOCK_OFFSET(p->qcoeff, block),
537 BLOCK_OFFSET(pd->dqcoeff, block), 554 BLOCK_OFFSET(pd->dqcoeff, block),
538 pd->dequant, &p->eobs[block], scan, iscan); 555 pd->dequant, &p->eobs[block], scan, iscan);
539 } 556 }
540 557
541 static void invert_quant(int16_t *quant, int16_t *shift, int d) { 558 static void invert_quant(int16_t *quant, int16_t *shift, int d) {
542 unsigned t; 559 unsigned t;
543 int l; 560 int l;
544 t = d; 561 t = d;
545 for (l = 0; t > 1; l++) 562 for (l = 0; t > 1; l++)
546 t >>= 1; 563 t >>= 1;
547 t = 1 + (1 << (16 + l)) / d; 564 t = 1 + (1 << (16 + l)) / d;
548 *quant = (int16_t)(t - (1 << 16)); 565 *quant = (int16_t)(t - (1 << 16));
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 718
702 int vp9_qindex_to_quantizer(int qindex) { 719 int vp9_qindex_to_quantizer(int qindex) {
703 int quantizer; 720 int quantizer;
704 721
705 for (quantizer = 0; quantizer < 64; ++quantizer) 722 for (quantizer = 0; quantizer < 64; ++quantizer)
706 if (quantizer_to_qindex[quantizer] >= qindex) 723 if (quantizer_to_qindex[quantizer] >= qindex)
707 return quantizer; 724 return quantizer;
708 725
709 return 63; 726 return 63;
710 } 727 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_quantize.h ('k') | source/libvpx/vp9/encoder/vp9_rd.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698