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