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