/*
 * Copyright (C) 2003 - 2016 Sony Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "ldac.h"

/***************************************************************************************************
    Calculate Bits for Band Info
***************************************************************************************************/
static int encode_band_info_ldac(
AB *p_ab)
{
    int	nbits;

    nbits = LDAC_NBANDBITS + LDAC_FLAGBITS;

    return nbits;
}

/***************************************************************************************************
    Calculate Bits for Gradient Data
***************************************************************************************************/
static int encode_gradient_ldac(
AB *p_ab)
{
    int	nbits;

    if (p_ab->grad_mode == LDAC_MODE_0) {
        nbits = LDAC_GRADMODEBITS + LDAC_GRADQU0BITS*2 + LDAC_GRADOSBITS*2 + LDAC_NADJQUBITS;
    }
    else {
        nbits = LDAC_GRADMODEBITS + LDAC_GRADQU1BITS + LDAC_GRADOSBITS + LDAC_NADJQUBITS;
    }

    return nbits;
}

/***************************************************************************************************
    Subfunction: Get Index of Minimum Value
***************************************************************************************************/
__inline static int get_minimum_id_ldac(
int *p_nbits,
int n)
{
    int i;
    int id, nbits;

    id = 0;
    nbits = p_nbits[0];

    for (i = 1; i < n; i++) {
        if (nbits > p_nbits[i]) {
            id = i;
            nbits = p_nbits[i];
        }
    }

    return id;
}

typedef struct {
    int bitlen;
    int offset;
    int weight;
} SFCINF;

/***************************************************************************************************
    Subfunction: Calculate Bits for Scale Factor Data - Mode 0
***************************************************************************************************/
static const unsigned char sa_bitlen_maxdif_0_ldac[LDAC_NIDSF] = {
    3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
};

static int encode_scale_factor_0_ldac(
AC *p_ac,
SFCINF *p_sfcinf)
{
    HCENC *p_hcsf;
    int iqu, iwt;
    int nqus = p_ac->p_ab->nqus;
    int nbits = LDAC_MAXBITNUM;
    int bitlen, vmin, vmax, val0, val1;
    int *p_idsf = p_ac->a_idsf;
    int *p_idsf_dif = p_ac->a_tmp;
    const unsigned char *p_tbl;

    for (iwt = 0; iwt < LDAC_NSFCWTBL; iwt++) {
        p_tbl = gaa_sfcwgt_ldac[iwt];
        vmin = vmax = val0 = p_idsf[0] + p_tbl[0];
        for (iqu = 1; iqu < nqus; iqu++) {
            val1 = p_idsf[iqu] + p_tbl[iqu];
            if (vmin > val1) {
                vmin = val1;
            }
            if (vmax < val1) {
                vmax = val1;
            }
            p_idsf_dif[iqu] = val1 - val0;
            val0 = val1;
        }

        val1 = bitlen = sa_bitlen_maxdif_0_ldac[(vmax-vmin)>>1];
        p_hcsf = ga_hcenc_sf0_ldac + (bitlen-LDAC_MINSFCBLEN_0);
        for (iqu = 1; iqu < nqus; iqu++) {
            val0 = p_idsf_dif[iqu] & p_hcsf->mask;
            val1 += hc_len_ldac(p_hcsf->p_tbl+val0);
        }

        if (nbits > val1) {
            p_sfcinf->bitlen = bitlen;
            p_sfcinf->offset = vmin;
            p_sfcinf->weight = iwt;
            nbits = val1;
        }
    }
    nbits += LDAC_SFCBLENBITS + LDAC_IDSFBITS + LDAC_SFCWTBLBITS;

    return nbits;
}

/***************************************************************************************************
    Subfunction: Calculate Bits for Scale Factor Data - Mode 1
***************************************************************************************************/
static const unsigned char sa_bitlen_maxdif_1_ldac[LDAC_NIDSF] = {
    2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
};

static int encode_scale_factor_1_ldac(
AC *p_ac,
SFCINF *p_sfcinf)
{
    int iqu, iwt;
    int nqus = p_ac->p_ab->nqus;
    int nbits = LDAC_MAXBITNUM;
    int bitlen, vmin, vmax, val;
    int *p_idsf = p_ac->a_idsf;
    const unsigned char *p_tbl;

    for (iwt = 0; iwt < LDAC_NSFCWTBL; iwt++) {
        p_tbl = gaa_sfcwgt_ldac[iwt];
        vmin = vmax = p_idsf[0] + p_tbl[0];
        for (iqu = 1; iqu < nqus; iqu++) {
            val = p_idsf[iqu] + p_tbl[iqu];
            if (vmin > val) {
                vmin = val;
            }
            if (vmax < val) {
                vmax = val;
            }
        }

        bitlen = sa_bitlen_maxdif_1_ldac[(vmax-vmin)>>1];
        if (bitlen > 4) {
            val = LDAC_SFCBLENBITS;
        }
        else {
            val = LDAC_SFCBLENBITS + LDAC_IDSFBITS + LDAC_SFCWTBLBITS;
        }
        val += bitlen * nqus;

        if (nbits > val) {
            p_sfcinf->bitlen = bitlen;
            p_sfcinf->offset = vmin;
            p_sfcinf->weight = iwt;
            nbits = val;
        }
    }

    return nbits;
}

/***************************************************************************************************
    Subfunction: Calculate Bits for Scale Factor Data - Mode 2
***************************************************************************************************/
static const unsigned char sa_bitlen_absmax_2_ldac[LDAC_NIDSF>>1] = {
    2, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
};

static int encode_scale_factor_2_ldac(
AC *p_ac,
SFCINF *p_sfcinf)
{
    HCENC *p_hcsf;
    int iqu;
    int nqus = p_ac->p_ab->nqus;
    int nbits, bitlen, vmax, val;
    int *p_idsf_dif = p_ac->a_tmp;

    p_idsf_dif[0] = p_ac->a_idsf[0] - p_ac->p_ab->ap_ac[0]->a_idsf[0];
    vmax = abs(p_idsf_dif[0]);
    for (iqu = 1; iqu < nqus; iqu++) {
        p_idsf_dif[iqu] = p_ac->a_idsf[iqu] - p_ac->p_ab->ap_ac[0]->a_idsf[iqu];
        val = abs(p_idsf_dif[iqu]);
        if (vmax < val) {
            vmax = val;
        }
    }

    nbits = LDAC_SFCBLENBITS;
    bitlen = sa_bitlen_absmax_2_ldac[vmax>>1];
    p_hcsf = ga_hcenc_sf1_ldac + (bitlen-LDAC_MINSFCBLEN_2);
    for (iqu = 0; iqu < nqus; iqu++) {
        val = p_idsf_dif[iqu] & p_hcsf->mask;
        nbits += hc_len_ldac(p_hcsf->p_tbl+val);
    }

    p_sfcinf->bitlen = bitlen;
    p_sfcinf->offset = 0;
    p_sfcinf->weight = 0;

    return nbits;
}

/***************************************************************************************************
    Calculate Bits for Scale Factor Data
***************************************************************************************************/
static int encode_scale_factor_ldac(
AC *p_ac)
{
    SFCINF a_sfcinf[LDAC_NSFCMODE];
    SFCINF *p_sfcinf;
    int nbits, sfc_mode;
    int a_nbits[LDAC_NSFCMODE];

    if (p_ac->ich == 0) {
        a_nbits[LDAC_MODE_0] = encode_scale_factor_0_ldac(p_ac, a_sfcinf+LDAC_MODE_0);
        a_nbits[LDAC_MODE_1] = encode_scale_factor_1_ldac(p_ac, a_sfcinf+LDAC_MODE_1);
    }
    else {
        a_nbits[LDAC_MODE_0] = encode_scale_factor_0_ldac(p_ac, a_sfcinf+LDAC_MODE_0);
        a_nbits[LDAC_MODE_1] = encode_scale_factor_2_ldac(p_ac, a_sfcinf+LDAC_MODE_1);
    }

    p_ac->sfc_mode = sfc_mode = get_minimum_id_ldac(a_nbits, LDAC_MODE_1+1);
    p_sfcinf = a_sfcinf + sfc_mode;
    p_ac->sfc_bitlen = p_sfcinf->bitlen;
    p_ac->sfc_offset = p_sfcinf->offset;
    p_ac->sfc_weight = p_sfcinf->weight;
    nbits = a_nbits[sfc_mode] + LDAC_SFCMODEBITS;

    return nbits;
}

/***************************************************************************************************
    Calculate Bits for Side Information (Band Info, Gradient Data & Scale Factor Data)
***************************************************************************************************/
DECLFUNC int encode_side_info_ldac(
AB *p_ab)
{
    AC *p_ac;
    int ich;
    int nchs = p_ab->blk_nchs;
    int nbits, nbits_band, nbits_grad, nbits_scfc = 0;

    p_ab->nbits_band = nbits_band = encode_band_info_ldac(p_ab);
    p_ab->nbits_grad = nbits_grad = encode_gradient_ldac(p_ab);
    for (ich = 0; ich < nchs; ich++) {
        p_ac = p_ab->ap_ac[ich];
        nbits_scfc += encode_scale_factor_ldac(p_ac);
        calc_add_word_length_ldac(p_ac);
    }
    p_ab->nbits_scfc = nbits_scfc;

    nbits = nbits_band + nbits_grad + nbits_scfc;

    return nbits;
}

/***************************************************************************************************
    Calculate Additional Word Length Data
***************************************************************************************************/
DECLFUNC void calc_add_word_length_ldac(
AC *p_ac)
{
    int iqu;
    int nqus = p_ac->p_ab->nqus;
    int dif;
    int *p_idsf = p_ac->a_idsf;
    int *p_addwl = p_ac->a_addwl;

    clear_data_ldac(p_addwl, LDAC_MAXNQUS*sizeof(int));

    if (p_ac->p_ab->grad_mode != LDAC_MODE_0) {
        for (iqu = 1; iqu < nqus; iqu++) {
            dif = p_idsf[iqu] - p_idsf[iqu-1];

            if (dif > 0) {
                if (dif > 5) {
                    p_addwl[iqu] += 5;
                }
                else if (dif > 4) {
                    p_addwl[iqu] += 4;
                }
                else if (dif > 3) {
                    p_addwl[iqu] += 3;
                }
                else if (dif > 2) {
                    p_addwl[iqu] += 2;
                }
                else if (dif > 1) {
                    p_addwl[iqu] += 1;
                }
            }
            else {
                if (dif < -5) {
                    p_addwl[iqu-1] += 5;
                }
                else if (dif < -4) {
                    p_addwl[iqu-1] += 4;
                }
                else if (dif < -3) {
                    p_addwl[iqu-1] += 3;
                }
                else if (dif < -2) {
                    p_addwl[iqu-1] += 2;
                }
                else if (dif < -1) {
                    p_addwl[iqu-1] += 1;
                }
            }
        }
    }

    return;
}


