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