1 /* 2 * Copyright (C) 2003 - 2016 Sony Corporation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "ldac.h" 18 19 /*************************************************************************************************** 20 Allocate Memory 21 ***************************************************************************************************/ 22 static LDAC_RESULT alloc_encode_ldac( 23 SFINFO *p_sfinfo) 24 { 25 LDAC_RESULT result = LDAC_S_OK; 26 CFG *p_cfg = &p_sfinfo->cfg; 27 int ich; 28 int nchs = p_cfg->ch; 29 int nbks = gaa_block_setting_ldac[p_cfg->chconfig_id][1]; 30 31 /* Allocate AC */ 32 for (ich = 0; ich < nchs; ich++) { 33 p_sfinfo->ap_ac[ich] = (AC *)calloc_ldac(p_sfinfo, 1, sizeof(AC)); 34 if (p_sfinfo->ap_ac[ich] != (AC *)NULL) { 35 p_sfinfo->ap_ac[ich]->p_acsub = (ACSUB *)calloc_ldac(p_sfinfo, 1, sizeof(ACSUB)); 36 if (p_sfinfo->ap_ac[ich]->p_acsub == (ACSUB *)NULL) { 37 result = LDAC_E_FAIL; 38 break; 39 } 40 } 41 else { 42 result = LDAC_E_FAIL; 43 break; 44 } 45 } 46 47 if (result != LDAC_S_OK) { 48 return result; 49 } 50 51 /* Allocate AB */ 52 p_sfinfo->p_ab = (AB *)calloc_ldac(p_sfinfo, nbks, sizeof(AB)); 53 if (p_sfinfo->p_ab == (AB *)NULL) { 54 result = LDAC_E_FAIL; 55 } 56 57 return result; 58 } 59 60 /*************************************************************************************************** 61 Initialize Memory 62 ***************************************************************************************************/ 63 DECLFUNC LDAC_RESULT init_encode_ldac( 64 SFINFO *p_sfinfo) 65 { 66 LDAC_RESULT result = LDAC_S_OK; 67 CFG *p_cfg = &p_sfinfo->cfg; 68 AB *p_ab; 69 int ibk, ich; 70 int blk_type, blk_nchs; 71 int ch_offset = 0; 72 int chconfig_id = p_cfg->chconfig_id; 73 int nbks = gaa_block_setting_ldac[chconfig_id][1]; 74 75 if (alloc_encode_ldac(p_sfinfo) == LDAC_E_FAIL) { 76 p_sfinfo->error_code = LDAC_ERR_ALLOC_MEMORY; 77 return LDAC_E_FAIL; 78 } 79 80 p_sfinfo->error_code = LDAC_ERR_NONE; 81 p_cfg->frame_status = LDAC_FRMSTAT_LEV_0; 82 83 /* Set AB information */ 84 p_ab = p_sfinfo->p_ab; 85 for (ibk = 0; ibk < nbks; ibk++){ 86 p_ab->blk_type = blk_type = gaa_block_setting_ldac[chconfig_id][ibk+2]; 87 p_ab->blk_nchs = blk_nchs = get_block_nchs_ldac(blk_type); 88 p_ab->p_smplrate_id = &p_cfg->smplrate_id; 89 p_ab->p_error_code = &p_sfinfo->error_code; 90 91 /* Set AC Information */ 92 for (ich = 0; ich < blk_nchs; ich++) { 93 p_ab->ap_ac[ich] = p_sfinfo->ap_ac[ch_offset++]; 94 p_ab->ap_ac[ich]->p_ab = p_ab; 95 p_ab->ap_ac[ich]->ich = ich; 96 p_ab->ap_ac[ich]->frmana_cnt = 0; 97 } 98 99 p_ab++; 100 } 101 102 calc_initial_bits_ldac(p_sfinfo); 103 104 return result; 105 } 106 107 /*************************************************************************************************** 108 Calculate Initial Bits 109 ***************************************************************************************************/ 110 DECLFUNC void calc_initial_bits_ldac( 111 SFINFO *p_sfinfo) 112 { 113 CFG *p_cfg = &p_sfinfo->cfg; 114 AB *p_ab = p_sfinfo->p_ab; 115 int ibk; 116 int blk_type; 117 int nbits_ab, nbits_ac; 118 int chconfig_id = p_cfg->chconfig_id; 119 int nbks = gaa_block_setting_ldac[chconfig_id][1]; 120 121 nbits_ac = p_cfg->frame_length * LDAC_BYTESIZE / p_cfg->ch; 122 123 for (ibk = 0; ibk < nbks; ibk++){ 124 blk_type = gaa_block_setting_ldac[chconfig_id][ibk+2]; 125 126 if (blk_type == LDAC_BLKID_STEREO){ 127 nbits_ab = (nbits_ac * 2 / LDAC_BYTESIZE) * LDAC_BYTESIZE; 128 } 129 else{ 130 nbits_ab = (nbits_ac / LDAC_BYTESIZE) * LDAC_BYTESIZE; 131 } 132 p_ab->nbits_ab = nbits_ab; 133 134 p_ab++; 135 } 136 137 return; 138 } 139 140 /*************************************************************************************************** 141 Free Memory 142 ***************************************************************************************************/ 143 DECLFUNC void free_encode_ldac( 144 SFINFO *p_sfinfo) 145 { 146 int ich; 147 int nchs = p_sfinfo->cfg.ch; 148 149 /* Free AB */ 150 if (p_sfinfo->p_ab != (AB *)NULL) { 151 free(p_sfinfo->p_ab); 152 p_sfinfo->p_ab = (AB *)NULL; 153 } 154 155 /* Free AC */ 156 for (ich = 0; ich < nchs; ich++) { 157 if (p_sfinfo->ap_ac[ich] != (AC *)NULL) { 158 if (p_sfinfo->ap_ac[ich]->p_acsub != (ACSUB *)NULL) { 159 free(p_sfinfo->ap_ac[ich]->p_acsub); 160 p_sfinfo->ap_ac[ich]->p_acsub = (ACSUB *)NULL; 161 } 162 free(p_sfinfo->ap_ac[ich]); 163 p_sfinfo->ap_ac[ich] = (AC *)NULL; 164 } 165 } 166 167 return; 168 } 169 170 /*************************************************************************************************** 171 Encode Audio Block 172 ***************************************************************************************************/ 173 static int encode_audio_block_ldac( 174 AB *p_ab) 175 { 176 AC *p_ac; 177 int ich; 178 int nchs = p_ab->blk_nchs; 179 180 for (ich = 0; ich < nchs; ich++) { 181 p_ac = p_ab->ap_ac[ich]; 182 183 norm_spectrum_ldac(p_ac); 184 } 185 186 if (!alloc_bits_ldac(p_ab)) { 187 return LDAC_FALSE; 188 } 189 190 for (ich = 0; ich < nchs; ich++) { 191 p_ac = p_ab->ap_ac[ich]; 192 193 quant_spectrum_ldac(p_ac); 194 195 quant_residual_ldac(p_ac); 196 } 197 198 return LDAC_TRUE; 199 } 200 201 /*************************************************************************************************** 202 Encode 203 ***************************************************************************************************/ 204 DECLFUNC int encode_ldac( 205 SFINFO *p_sfinfo, 206 int nbands, 207 int grad_mode, 208 int grad_qu_l, 209 int grad_qu_h, 210 int grad_os_l, 211 int grad_os_h, 212 int abc_status) 213 { 214 AB *p_ab = p_sfinfo->p_ab; 215 int ibk; 216 int nbks = gaa_block_setting_ldac[p_sfinfo->cfg.chconfig_id][1]; 217 218 for (ibk = 0; ibk < nbks; ibk++){ 219 p_ab->nbands = nbands; 220 p_ab->nqus = ga_nqus_ldac[nbands]; 221 p_ab->grad_mode = grad_mode; 222 p_ab->grad_qu_l = grad_qu_l; 223 p_ab->grad_qu_h = grad_qu_h; 224 p_ab->grad_os_l = grad_os_l; 225 p_ab->grad_os_h = grad_os_h; 226 p_ab->abc_status = abc_status; 227 228 if (!encode_audio_block_ldac(p_ab)) { 229 return LDAC_ERR_NON_FATAL_ENCODE; 230 } 231 232 p_ab++; 233 } 234 235 return LDAC_ERR_NONE; 236 } 237 238