diff options
Diffstat (limited to 'vp9/common/quant_common.c')
-rw-r--r-- | vp9/common/quant_common.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/vp9/common/quant_common.c b/vp9/common/quant_common.c new file mode 100644 index 000000000..8c3f42732 --- /dev/null +++ b/vp9/common/quant_common.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2010 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +#include "quant_common.h" + +static int dc_qlookup[QINDEX_RANGE]; +static int ac_qlookup[QINDEX_RANGE]; + +#define ACDC_MIN 4 + +void vp9_init_quant_tables() { + int i; + int current_val = 4; + int last_val = 4; + int ac_val; + + for (i = 0; i < QINDEX_RANGE; i++) { + ac_qlookup[i] = current_val; + current_val = (int)((double)current_val * 1.02); + if (current_val == last_val) + current_val++; + last_val = current_val; + + ac_val = ac_qlookup[i]; + dc_qlookup[i] = (0.000000305 * ac_val * ac_val * ac_val) + + (-0.00065 * ac_val * ac_val) + + (0.9 * ac_val) + 0.5; + if (dc_qlookup[i] < ACDC_MIN) + dc_qlookup[i] = ACDC_MIN; + } +} + +int vp9_dc_quant(int QIndex, int Delta) { + int retval; + + QIndex = QIndex + Delta; + + if (QIndex > MAXQ) + QIndex = MAXQ; + else if (QIndex < 0) + QIndex = 0; + + retval = dc_qlookup[ QIndex ]; + return retval; +} + +int vp9_dc2quant(int QIndex, int Delta) { + int retval; + + QIndex = QIndex + Delta; + + if (QIndex > MAXQ) + QIndex = MAXQ; + else if (QIndex < 0) + QIndex = 0; + + retval = dc_qlookup[ QIndex ]; + + return retval; + +} +int vp9_dc_uv_quant(int QIndex, int Delta) { + int retval; + + QIndex = QIndex + Delta; + + if (QIndex > MAXQ) + QIndex = MAXQ; + else if (QIndex < 0) + QIndex = 0; + + retval = dc_qlookup[ QIndex ]; + + return retval; +} + +int vp9_ac_yquant(int QIndex) { + int retval; + + if (QIndex > MAXQ) + QIndex = MAXQ; + else if (QIndex < 0) + QIndex = 0; + + retval = ac_qlookup[ QIndex ]; + return retval; +} + +int vp9_ac2quant(int QIndex, int Delta) { + int retval; + + QIndex = QIndex + Delta; + + if (QIndex > MAXQ) + QIndex = MAXQ; + else if (QIndex < 0) + QIndex = 0; + + retval = (ac_qlookup[ QIndex ] * 775) / 1000; + if (retval < 4) + retval = 4; + + return retval; +} +int vp9_ac_uv_quant(int QIndex, int Delta) { + int retval; + + QIndex = QIndex + Delta; + + if (QIndex > MAXQ) + QIndex = MAXQ; + else if (QIndex < 0) + QIndex = 0; + + retval = ac_qlookup[ QIndex ]; + return retval; +} |