xref: /aosp_15_r20/external/libldac/src/encode_ldac.c (revision aef9bcd9217ad2365ebc8e70efaf94b64e04df14)
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