/* * Copyright (C) 2003 - 2017 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( __attribute__((unused)) 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; }