xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_channel_map.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1 /******************************************************************************
2  *                                                                            *
3  * Copyright (C) 2023 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19  */
20 
21 #include <stddef.h>
22 #include <string.h>
23 #include "ixheaac_type_def.h"
24 #include "ixheaac_constants.h"
25 #include "impd_drc_common_enc.h"
26 #include "impd_drc_uni_drc.h"
27 #include "impd_drc_tables.h"
28 #include "impd_drc_api.h"
29 #include "ixheaace_api.h"
30 #include "ixheaac_error_standards.h"
31 #include "ixheaace_error_codes.h"
32 #include "ixheaace_aac_constants.h"
33 #include "ixheaace_adjust_threshold_data.h"
34 #include "ixheaace_psy_const.h"
35 #include "ixheaace_tns.h"
36 #include "ixheaace_tns_params.h"
37 #include "ixheaace_rom.h"
38 #include "ixheaace_common_rom.h"
39 #include "ixheaace_bitbuffer.h"
40 
41 #include "ixheaace_dynamic_bits.h"
42 #include "ixheaace_qc_data.h"
43 #include "ixheaace_channel_map.h"
44 #include "ixheaace_block_switch.h"
45 #include "ixheaace_psy_data.h"
46 #include "ixheaace_interface.h"
47 #include "ixheaace_write_bitstream.h"
48 
ia_enhaacplus_enc_init_element(ixheaace_element_info * pstr_element_info,ixheaace_element_type el_type,WORD32 element_instance_tag)49 static IA_ERRORCODE ia_enhaacplus_enc_init_element(ixheaace_element_info *pstr_element_info,
50                                                    ixheaace_element_type el_type,
51                                                    WORD32 element_instance_tag) {
52   IA_ERRORCODE error = IA_NO_ERROR;
53 
54   pstr_element_info->el_type = el_type;
55 
56   switch (pstr_element_info->el_type) {
57     case ID_SCE:
58     case ID_CCE:
59       pstr_element_info->n_channels_in_el = NUM_CHANS_MONO;
60 
61       pstr_element_info->channel_index[0] = 0;
62 
63       pstr_element_info->instance_tag = element_instance_tag;
64       break;
65 
66     case ID_LFE:
67       pstr_element_info->n_channels_in_el = NUM_CHANS_MONO;
68 
69       pstr_element_info->channel_index[0] = 0;
70 
71       pstr_element_info->instance_tag = element_instance_tag;
72       break;
73 
74     case ID_CPE:
75 
76       pstr_element_info->n_channels_in_el = NUM_CHANS_STEREO;
77 
78       pstr_element_info->channel_index[0] = 0;
79       pstr_element_info->channel_index[1] = 1;
80 
81       pstr_element_info->instance_tag = element_instance_tag;
82       break;
83 
84     default:
85       return IA_EXHEAACE_INIT_FATAL_INVALID_ELEMENT_TYPE;
86   }
87 
88   return error;
89 }
90 
ia_enhaacplus_enc_init_element_info(WORD32 num_channels,ixheaace_element_info * pstr_element_info,WORD32 ele_type,WORD32 element_instance_tag)91 IA_ERRORCODE ia_enhaacplus_enc_init_element_info(WORD32 num_channels,
92                                                  ixheaace_element_info *pstr_element_info,
93                                                  WORD32 ele_type, WORD32 element_instance_tag) {
94   IA_ERRORCODE error = IA_NO_ERROR;
95 
96   if (ele_type != ID_LFE) {
97     switch (num_channels) {
98       case NUM_CHANS_MONO:
99         if (ele_type == -1) {
100           error = ia_enhaacplus_enc_init_element(pstr_element_info, ID_SCE, element_instance_tag);
101         } else {
102           error =
103               ia_enhaacplus_enc_init_element(pstr_element_info, ele_type, element_instance_tag);
104         }
105         break;
106 
107       case NUM_CHANS_STEREO:
108         error = ia_enhaacplus_enc_init_element(pstr_element_info, ID_CPE, element_instance_tag);
109         break;
110 
111       default:
112         return IA_EXHEAACE_INIT_FATAL_NUM_CHANNELS_NOT_SUPPORTED;
113     }
114   } else {
115     error = ia_enhaacplus_enc_init_element(pstr_element_info, ID_LFE, element_instance_tag);
116   }
117 
118   return error;
119 }
120 
ia_enhaacplus_enc_init_element_bits(ixheaace_element_bits * element_bits,ixheaace_element_info pstr_element_info,WORD32 bitrate_tot,WORD32 average_bits_tot,WORD32 aot,WORD32 static_bits_tot,WORD32 bit_res,FLAG flag_framelength_small)121 IA_ERRORCODE ia_enhaacplus_enc_init_element_bits(ixheaace_element_bits *element_bits,
122                                                  ixheaace_element_info pstr_element_info,
123                                                  WORD32 bitrate_tot, WORD32 average_bits_tot,
124                                                  WORD32 aot, WORD32 static_bits_tot,
125                                                  WORD32 bit_res, FLAG flag_framelength_small) {
126   IA_ERRORCODE error = IA_NO_ERROR;
127 
128   switch (pstr_element_info.n_channels_in_el) {
129     case NUM_CHANS_MONO:
130       element_bits->ch_bitrate = bitrate_tot;
131 
132       element_bits->average_bits = (average_bits_tot - static_bits_tot);
133       switch (aot) {
134         case AOT_AAC_LC:
135         case AOT_SBR:
136         case AOT_PS:
137           if (flag_framelength_small) {
138             element_bits->max_bits = MAXIMUM_CHANNEL_BITS_960;
139 
140             element_bits->max_bit_res_bits = MAXIMUM_CHANNEL_BITS_960 - average_bits_tot;
141           } else {
142             element_bits->max_bits = MAXIMUM_CHANNEL_BITS_1024;
143 
144             element_bits->max_bit_res_bits = MAXIMUM_CHANNEL_BITS_1024 - average_bits_tot;
145           }
146           break;
147 
148         case AOT_AAC_LD:
149         case AOT_AAC_ELD:
150           if (bit_res) {
151             element_bits->max_bits = bit_res;
152             element_bits->max_bit_res_bits = bit_res - average_bits_tot;
153           } else {
154             element_bits->max_bits = average_bits_tot;
155             element_bits->max_bit_res_bits = 0;
156           }
157           break;
158       }
159 
160       element_bits->max_bit_res_bits -= (element_bits[0].max_bit_res_bits % 8);
161       element_bits->bit_res_level = element_bits[0].max_bit_res_bits;
162       element_bits->relative_bits = 1;
163       break;
164 
165     case NUM_CHANS_STEREO:
166       element_bits->ch_bitrate = bitrate_tot >> 1;
167 
168       element_bits->average_bits = (average_bits_tot - static_bits_tot);
169       switch (aot) {
170         case AOT_AAC_LC:
171         case AOT_SBR:
172         case AOT_PS:
173           if (flag_framelength_small) {
174             element_bits->max_bits = NUM_CHANS_STEREO * MAXIMUM_CHANNEL_BITS_960;
175 
176             element_bits->max_bit_res_bits =
177                 NUM_CHANS_STEREO * MAXIMUM_CHANNEL_BITS_960 - average_bits_tot;
178           } else {
179             element_bits->max_bits = NUM_CHANS_STEREO * MAXIMUM_CHANNEL_BITS_1024;
180 
181             element_bits->max_bit_res_bits =
182                 NUM_CHANS_STEREO * MAXIMUM_CHANNEL_BITS_1024 - average_bits_tot;
183           }
184           break;
185 
186         case AOT_AAC_LD:
187         case AOT_AAC_ELD:
188           if (bit_res) {
189             element_bits->max_bits = bit_res;
190             element_bits->max_bit_res_bits = bit_res - average_bits_tot;
191           } else {
192             element_bits->max_bits = average_bits_tot;
193             element_bits->max_bit_res_bits = 0;
194           }
195           break;
196       }
197 
198       element_bits->max_bit_res_bits -= (element_bits[0].max_bit_res_bits % 8);
199 
200       element_bits->bit_res_level = element_bits[0].max_bit_res_bits;
201       element_bits->relative_bits = 1;
202       break;
203 
204     default:
205       return IA_EXHEAACE_INIT_FATAL_INVALID_NUM_CHANNELS_IN_ELE;
206   }
207   /* Bits carried over from previous frame */
208   element_bits->carry_bits = 0;
209 
210   return error;
211 }
212