/*
 *  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 vp8_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 vp8_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 vp8_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 vp8_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 vp8_ac_yquant(int QIndex)
{
    int retval;

    if (QIndex > MAXQ)
        QIndex = MAXQ;
    else if (QIndex < 0)
        QIndex = 0;

    retval = ac_qlookup[ QIndex ];
    return retval;
}

int vp8_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 vp8_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;
}
