| /* | |
| * 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" | |
| /*************************************************************************************************** | |
| Allocate Memory | |
| ***************************************************************************************************/ | |
| static LDAC_RESULT alloc_encode_ldac( | |
| SFINFO *p_sfinfo) | |
| { | |
| LDAC_RESULT result = LDAC_S_OK; | |
| CFG *p_cfg = &p_sfinfo->cfg; | |
| int ich; | |
| int nchs = p_cfg->ch; | |
| int nbks = gaa_block_setting_ldac[p_cfg->chconfig_id][1]; | |
| /* Allocate AC */ | |
| for (ich = 0; ich < nchs; ich++) { | |
| p_sfinfo->ap_ac[ich] = (AC *)calloc_ldac(p_sfinfo, 1, sizeof(AC)); | |
| if (p_sfinfo->ap_ac[ich] != (AC *)NULL) { | |
| p_sfinfo->ap_ac[ich]->p_acsub = (ACSUB *)calloc_ldac(p_sfinfo, 1, sizeof(ACSUB)); | |
| if (p_sfinfo->ap_ac[ich]->p_acsub == (ACSUB *)NULL) { | |
| result = LDAC_E_FAIL; | |
| break; | |
| } | |
| } | |
| else { | |
| result = LDAC_E_FAIL; | |
| break; | |
| } | |
| } | |
| if (result != LDAC_S_OK) { | |
| return result; | |
| } | |
| /* Allocate AB */ | |
| p_sfinfo->p_ab = (AB *)calloc_ldac(p_sfinfo, nbks, sizeof(AB)); | |
| if (p_sfinfo->p_ab == (AB *)NULL) { | |
| result = LDAC_E_FAIL; | |
| } | |
| return result; | |
| } | |
| /*************************************************************************************************** | |
| Initialize Memory | |
| ***************************************************************************************************/ | |
| DECLFUNC LDAC_RESULT init_encode_ldac( | |
| SFINFO *p_sfinfo) | |
| { | |
| LDAC_RESULT result = LDAC_S_OK; | |
| CFG *p_cfg = &p_sfinfo->cfg; | |
| AB *p_ab; | |
| int ibk, ich; | |
| int blk_type, blk_nchs; | |
| int ch_offset = 0; | |
| int chconfig_id = p_cfg->chconfig_id; | |
| int nbks = gaa_block_setting_ldac[chconfig_id][1]; | |
| if (alloc_encode_ldac(p_sfinfo) == LDAC_E_FAIL) { | |
| p_sfinfo->error_code = LDAC_ERR_ALLOC_MEMORY; | |
| return LDAC_E_FAIL; | |
| } | |
| p_sfinfo->error_code = LDAC_ERR_NONE; | |
| p_cfg->frame_status = LDAC_FRMSTAT_LEV_0; | |
| /* Set AB information */ | |
| p_ab = p_sfinfo->p_ab; | |
| for (ibk = 0; ibk < nbks; ibk++){ | |
| p_ab->blk_type = blk_type = gaa_block_setting_ldac[chconfig_id][ibk+2]; | |
| p_ab->blk_nchs = blk_nchs = get_block_nchs_ldac(blk_type); | |
| p_ab->p_smplrate_id = &p_cfg->smplrate_id; | |
| p_ab->p_error_code = &p_sfinfo->error_code; | |
| /* Set AC Information */ | |
| for (ich = 0; ich < blk_nchs; ich++) { | |
| p_ab->ap_ac[ich] = p_sfinfo->ap_ac[ch_offset++]; | |
| p_ab->ap_ac[ich]->p_ab = p_ab; | |
| p_ab->ap_ac[ich]->ich = ich; | |
| p_ab->ap_ac[ich]->frmana_cnt = 0; | |
| } | |
| p_ab++; | |
| } | |
| calc_initial_bits_ldac(p_sfinfo); | |
| return result; | |
| } | |
| /*************************************************************************************************** | |
| Calculate Initial Bits | |
| ***************************************************************************************************/ | |
| DECLFUNC void calc_initial_bits_ldac( | |
| SFINFO *p_sfinfo) | |
| { | |
| CFG *p_cfg = &p_sfinfo->cfg; | |
| AB *p_ab = p_sfinfo->p_ab; | |
| int ibk; | |
| int blk_type; | |
| int nbits_ab, nbits_ac; | |
| int chconfig_id = p_cfg->chconfig_id; | |
| int nbks = gaa_block_setting_ldac[chconfig_id][1]; | |
| nbits_ac = p_cfg->frame_length * LDAC_BYTESIZE / p_cfg->ch; | |
| for (ibk = 0; ibk < nbks; ibk++){ | |
| blk_type = gaa_block_setting_ldac[chconfig_id][ibk+2]; | |
| if (blk_type == LDAC_BLKID_STEREO){ | |
| nbits_ab = (nbits_ac * 2 / LDAC_BYTESIZE) * LDAC_BYTESIZE; | |
| } | |
| else{ | |
| nbits_ab = (nbits_ac / LDAC_BYTESIZE) * LDAC_BYTESIZE; | |
| } | |
| p_ab->nbits_ab = nbits_ab; | |
| p_ab++; | |
| } | |
| return; | |
| } | |
| /*************************************************************************************************** | |
| Free Memory | |
| ***************************************************************************************************/ | |
| DECLFUNC void free_encode_ldac( | |
| SFINFO *p_sfinfo) | |
| { | |
| int ich; | |
| int nchs = p_sfinfo->cfg.ch; | |
| /* Free AB */ | |
| if (p_sfinfo->p_ab != (AB *)NULL) { | |
| free(p_sfinfo->p_ab); | |
| p_sfinfo->p_ab = (AB *)NULL; | |
| } | |
| /* Free AC */ | |
| for (ich = 0; ich < nchs; ich++) { | |
| if (p_sfinfo->ap_ac[ich] != (AC *)NULL) { | |
| if (p_sfinfo->ap_ac[ich]->p_acsub != (ACSUB *)NULL) { | |
| free(p_sfinfo->ap_ac[ich]->p_acsub); | |
| p_sfinfo->ap_ac[ich]->p_acsub = (ACSUB *)NULL; | |
| } | |
| free(p_sfinfo->ap_ac[ich]); | |
| p_sfinfo->ap_ac[ich] = (AC *)NULL; | |
| } | |
| } | |
| return; | |
| } | |
| /*************************************************************************************************** | |
| Encode Audio Block | |
| ***************************************************************************************************/ | |
| static int encode_audio_block_ldac( | |
| AB *p_ab) | |
| { | |
| AC *p_ac; | |
| int ich; | |
| int nchs = p_ab->blk_nchs; | |
| for (ich = 0; ich < nchs; ich++) { | |
| p_ac = p_ab->ap_ac[ich]; | |
| norm_spectrum_ldac(p_ac); | |
| } | |
| if (!alloc_bits_ldac(p_ab)) { | |
| return LDAC_FALSE; | |
| } | |
| for (ich = 0; ich < nchs; ich++) { | |
| p_ac = p_ab->ap_ac[ich]; | |
| quant_spectrum_ldac(p_ac); | |
| quant_residual_ldac(p_ac); | |
| } | |
| return LDAC_TRUE; | |
| } | |
| /*************************************************************************************************** | |
| Encode | |
| ***************************************************************************************************/ | |
| DECLFUNC int encode_ldac( | |
| SFINFO *p_sfinfo, | |
| int nbands, | |
| int grad_mode, | |
| int grad_qu_l, | |
| int grad_qu_h, | |
| int grad_os_l, | |
| int grad_os_h, | |
| int abc_status) | |
| { | |
| AB *p_ab = p_sfinfo->p_ab; | |
| int ibk; | |
| int nbks = gaa_block_setting_ldac[p_sfinfo->cfg.chconfig_id][1]; | |
| for (ibk = 0; ibk < nbks; ibk++){ | |
| p_ab->nbands = nbands; | |
| p_ab->nqus = ga_nqus_ldac[nbands]; | |
| p_ab->grad_mode = grad_mode; | |
| p_ab->grad_qu_l = grad_qu_l; | |
| p_ab->grad_qu_h = grad_qu_h; | |
| p_ab->grad_os_l = grad_os_l; | |
| p_ab->grad_os_h = grad_os_h; | |
| p_ab->abc_status = abc_status; | |
| if (!encode_audio_block_ldac(p_ab)) { | |
| return LDAC_ERR_NON_FATAL_ENCODE; | |
| } | |
| p_ab++; | |
| } | |
| return LDAC_ERR_NONE; | |
| } | |