| /* |
| * 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; |
| } |
| |
| |