190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "quant_common.h" 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const int dc_qlookup[QINDEX_RANGE] = 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157, 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic const int ac_qlookup[QINDEX_RANGE] = 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284, 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}; 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_dc_quant(int QIndex, int Delta) 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int retval; 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = QIndex + Delta; 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (QIndex > 127) 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 127; 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (QIndex < 0) 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 0; 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retval = dc_qlookup[ QIndex ]; 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retval; 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_dc2quant(int QIndex, int Delta) 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int retval; 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = QIndex + Delta; 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (QIndex > 127) 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 127; 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (QIndex < 0) 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 0; 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retval = dc_qlookup[ QIndex ] * 2; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retval; 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_dc_uv_quant(int QIndex, int Delta) 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int retval; 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = QIndex + Delta; 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (QIndex > 127) 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 127; 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (QIndex < 0) 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 0; 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retval = dc_qlookup[ QIndex ]; 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (retval > 132) 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retval = 132; 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retval; 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_ac_yquant(int QIndex) 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int retval; 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (QIndex > 127) 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 127; 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (QIndex < 0) 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 0; 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retval = ac_qlookup[ QIndex ]; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retval; 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_ac2quant(int QIndex, int Delta) 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int retval; 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = QIndex + Delta; 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (QIndex > 127) 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 127; 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (QIndex < 0) 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 0; 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1121b362b15af34006e6a11974088a46d42b903418eJohann /* For all x in [0..284], x*155/100 is bitwise equal to (x*101581) >> 16. 1131b362b15af34006e6a11974088a46d42b903418eJohann * The smallest precision for that is '(x*6349) >> 12' but 16 is a good 1141b362b15af34006e6a11974088a46d42b903418eJohann * word size. */ 1151b362b15af34006e6a11974088a46d42b903418eJohann retval = (ac_qlookup[ QIndex ] * 101581) >> 16; 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (retval < 8) 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retval = 8; 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retval; 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_ac_uv_quant(int QIndex, int Delta) 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int retval; 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = QIndex + Delta; 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (QIndex > 127) 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 127; 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else if (QIndex < 0) 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber QIndex = 0; 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retval = ac_qlookup[ QIndex ]; 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retval; 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 136