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