1 /****************************************************************************** 2 * * 3 * Copyright (C) 2018 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 #include <string.h> 21 #include <stdio.h> 22 #include <stdarg.h> 23 #include <assert.h> 24 25 #include <ixheaacd_type_def.h> 26 27 #include "ixheaacd_bitbuffer.h" 28 29 #include "ixheaacd_defines.h" 30 #include "ixheaacd_memory_standards.h" 31 #include "ixheaacd_sbrdecsettings.h" 32 #include "ixheaacd_env_extr_part.h" 33 #include "ixheaacd_aac_rom.h" 34 #include "ixheaacd_common_rom.h" 35 #include <ixheaacd_sbr_rom.h> 36 #include "ixheaacd_pulsedata.h" 37 #include "ixheaacd_pns.h" 38 39 #include "ixheaacd_sbr_common.h" 40 #include "ixheaacd_drc_data_struct.h" 41 #include "ixheaacd_drc_dec.h" 42 43 #include "ixheaacd_lt_predict.h" 44 45 #include "ixheaacd_channelinfo.h" 46 #include "ixheaacd_channel.h" 47 #include "ixheaacd_channelinfo.h" 48 #include "ixheaacd_sbrdecoder.h" 49 #include "ixheaacd_audioobjtypes.h" 50 #include "ixheaacd_latmdemux.h" 51 #include "ixheaacd_aacdec.h" 52 #include "ixheaacd_sbr_common.h" 53 54 #include "ixheaacd_mps_polyphase.h" 55 #include "ixheaacd_config.h" 56 #include "ixheaacd_mps_dec.h" 57 58 #include "ixheaacd_struct_def.h" 59 60 #include "ixheaacd_config.h" 61 #include "ixheaacd_interface.h" 62 #include "ixheaacd_info.h" 63 #include "ixheaacd_struct.h" 64 #include "ixheaacd_constants.h" 65 66 UWORD32 ixheaacd_sbr_ratio(UWORD32 core_sbr_framelength_idx) { 67 UWORD32 sbr_ratio_index = 0x0FF; 68 69 switch (core_sbr_framelength_idx) { 70 case 0: 71 case 1: 72 sbr_ratio_index = USAC_SBR_RATIO_NO_SBR; 73 break; 74 case 2: 75 sbr_ratio_index = USAC_SBR_RATIO_INDEX_8_3; 76 break; 77 case 3: 78 sbr_ratio_index = USAC_SBR_RATIO_INDEX_2_1; 79 break; 80 case 4: 81 sbr_ratio_index = USAC_SBR_RATIO_INDEX_4_1; 82 break; 83 } 84 85 return sbr_ratio_index; 86 } 87 88 WORD32 ixheaacd_get_sample_freq_indx(WORD32 sampling_freq) { 89 WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000, 90 24000, 22050, 16000, 12000, 11025, 8000, 91 7350, 0, 0, 0}; 92 93 WORD32 index; 94 WORD32 tbl_size = sizeof(sampling_rate_tbl) / sizeof(WORD32) - 1; 95 96 for (index = 0; index < tbl_size; index++) { 97 if (sampling_rate_tbl[index] == sampling_freq) break; 98 } 99 100 if (index > tbl_size) { 101 return tbl_size - 1; 102 } 103 104 return index; 105 } 106 UWORD32 ixheaacd_sbr_params(UWORD32 core_sbr_framelength_idx, 107 WORD32 *output_framelength, WORD32 *block_size, 108 WORD32 *output_samples, WORD32 *sample_rate_layer, 109 UWORD32 *sample_freq_indx) { 110 UWORD32 sbr_ratio_index = 0x0FF; 111 112 *output_framelength = -1; 113 114 switch (core_sbr_framelength_idx) { 115 case 0: 116 sbr_ratio_index = USAC_SBR_RATIO_NO_SBR; 117 *output_framelength = USAC_OUT_FRAMELENGTH_768; 118 *block_size = 768; 119 *output_samples = *block_size; 120 break; 121 case 1: 122 sbr_ratio_index = USAC_SBR_RATIO_NO_SBR; 123 *output_framelength = USAC_OUT_FRAMELENGTH_1024; 124 *block_size = 1024; 125 *output_samples = *block_size; 126 break; 127 case 2: 128 sbr_ratio_index = USAC_SBR_RATIO_INDEX_8_3; 129 *output_framelength = USAC_OUT_FRAMELENGTH_2048; 130 *block_size = 768; 131 *output_samples = (*block_size * 8) / 3; 132 *sample_rate_layer = (*sample_rate_layer * 3) >> 3; 133 break; 134 case 3: 135 sbr_ratio_index = USAC_SBR_RATIO_INDEX_2_1; 136 *output_framelength = USAC_OUT_FRAMELENGTH_2048; 137 *block_size = 1024; 138 *output_samples = *block_size * 2; 139 *sample_rate_layer = *sample_rate_layer >> 1; 140 break; 141 case 4: 142 sbr_ratio_index = USAC_SBR_RATIO_INDEX_4_1; 143 *output_framelength = USAC_OUT_FRAMELENGTH_4096; 144 *block_size = 1024; 145 *output_samples = *block_size * 4; 146 *sample_rate_layer = *sample_rate_layer >> 2; 147 break; 148 } 149 150 *sample_freq_indx = ixheaacd_get_sample_freq_indx(*sample_rate_layer); 151 152 return sbr_ratio_index; 153 } 154 155 VOID ixheaacd_read_escape_value(ia_bit_buf_struct *it_bit_buff, 156 UWORD32 *ext_ele_value, UWORD32 no_bits1, 157 UWORD32 no_bits2, UWORD32 no_bits3) { 158 UWORD32 value = 0; 159 UWORD32 val_add = 0; 160 UWORD32 max_val1 = (1 << no_bits1) - 1; 161 UWORD32 max_val2 = (1 << no_bits2) - 1; 162 163 value = ixheaacd_read_bits_buf(it_bit_buff, no_bits1); 164 165 if (value == max_val1) { 166 val_add = ixheaacd_read_bits_buf(it_bit_buff, no_bits2); 167 168 value += val_add; 169 170 if (val_add == max_val2) { 171 val_add = ixheaacd_read_bits_buf(it_bit_buff, no_bits3); 172 173 value += val_add; 174 } 175 } 176 177 *ext_ele_value = value; 178 } 179 180 static VOID ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config, 181 UWORD32 ch_config_index) { 182 switch (ch_config_index) { 183 case 1: 184 pstr_usac_config->num_out_channels = 1; 185 pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_C; 186 break; 187 case 2: 188 pstr_usac_config->num_out_channels = 2; 189 pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_L; 190 pstr_usac_config->output_channel_pos[1] = BS_OUTPUT_CHANNEL_POS_R; 191 break; 192 193 default: 194 assert(0); 195 break; 196 } 197 } 198 199 VOID ixheaacd_sbr_config(ia_bit_buf_struct *it_bit_buff, 200 ia_usac_dec_sbr_config_struct *pstr_usac_sbr_config) { 201 pstr_usac_sbr_config->harmonic_sbr = ixheaacd_read_bits_buf(it_bit_buff, 1); 202 pstr_usac_sbr_config->bs_inter_tes = ixheaacd_read_bits_buf(it_bit_buff, 1); 203 pstr_usac_sbr_config->bs_pvc = ixheaacd_read_bits_buf(it_bit_buff, 1); 204 pstr_usac_sbr_config->dflt_start_freq = 205 ixheaacd_read_bits_buf(it_bit_buff, 4); 206 207 pstr_usac_sbr_config->dflt_stop_freq = ixheaacd_read_bits_buf(it_bit_buff, 4); 208 pstr_usac_sbr_config->dflt_header_extra1 = 209 ixheaacd_read_bits_buf(it_bit_buff, 1); 210 pstr_usac_sbr_config->dflt_header_extra2 = 211 ixheaacd_read_bits_buf(it_bit_buff, 1); 212 213 if (pstr_usac_sbr_config->dflt_header_extra1) { 214 pstr_usac_sbr_config->dflt_freq_scale = 215 ixheaacd_read_bits_buf(it_bit_buff, 2); 216 pstr_usac_sbr_config->dflt_alter_scale = 217 ixheaacd_read_bits_buf(it_bit_buff, 1); 218 pstr_usac_sbr_config->dflt_noise_bands = 219 ixheaacd_read_bits_buf(it_bit_buff, 2); 220 } 221 222 if (pstr_usac_sbr_config->dflt_header_extra2) { 223 pstr_usac_sbr_config->dflt_limiter_bands = 224 ixheaacd_read_bits_buf(it_bit_buff, 2); 225 pstr_usac_sbr_config->dflt_limiter_gains = 226 ixheaacd_read_bits_buf(it_bit_buff, 2); 227 pstr_usac_sbr_config->dflt_interpol_freq = 228 ixheaacd_read_bits_buf(it_bit_buff, 1); 229 pstr_usac_sbr_config->dflt_smoothing_mode = 230 ixheaacd_read_bits_buf(it_bit_buff, 1); 231 } 232 } 233 234 WORD32 ixheaacd_ext_element_config( 235 ia_bit_buf_struct *it_bit_buff, 236 ia_usac_dec_element_config_struct *pstr_usac_element_config, 237 UWORD8 *ptr_usac_ext_ele_payload, WORD32 *ptr_usac_ext_ele_payload_len, 238 WORD32 *preroll_flag) { 239 UWORD32 usac_ext_element_type, usac_ext_element_config_length, flag; 240 241 UWORD32 i; 242 243 ixheaacd_read_escape_value(it_bit_buff, &(usac_ext_element_type), 4, 8, 16); 244 245 ixheaacd_read_escape_value(it_bit_buff, &(usac_ext_element_config_length), 4, 246 8, 16); 247 if (usac_ext_element_config_length >= 768) return -1; 248 249 flag = ixheaacd_read_bits_buf(it_bit_buff, 1); 250 251 *ptr_usac_ext_ele_payload_len = 0; 252 253 if (flag) { 254 ixheaacd_read_escape_value( 255 it_bit_buff, 256 (UWORD32 *)(&(pstr_usac_element_config->usac_ext_eleme_def_len)), 8, 16, 257 0); 258 pstr_usac_element_config->usac_ext_eleme_def_len += 1; 259 260 } else { 261 pstr_usac_element_config->usac_ext_eleme_def_len = 0; 262 } 263 264 pstr_usac_element_config->usac_ext_elem_pld_frag = 265 ixheaacd_read_bits_buf(it_bit_buff, 1); 266 267 switch (usac_ext_element_type) { 268 case ID_EXT_ELE_FILL: 269 break; 270 case ID_EXT_ELE_AUDIOPREROLL: 271 *preroll_flag = 1; 272 break; 273 case ID_EXT_ELE_UNI_DRC: 274 for (i = 0; i < usac_ext_element_config_length; i++) { 275 ptr_usac_ext_ele_payload[i] = ixheaacd_read_bits_buf(it_bit_buff, 8); 276 } 277 *ptr_usac_ext_ele_payload_len = usac_ext_element_config_length; 278 break; 279 280 default: 281 if ((it_bit_buff->cnt_bits >> 3) < (WORD32)usac_ext_element_config_length) 282 return -1; 283 it_bit_buff->ptr_read_next += usac_ext_element_config_length; 284 it_bit_buff->cnt_bits -= (usac_ext_element_config_length << 3); 285 286 break; 287 } 288 289 return 0; 290 } 291 292 VOID ixheaacd_mps212_config( 293 ia_bit_buf_struct *it_bit_buff, 294 ia_usac_dec_mps_config_struct *pstr_usac_mps212_config, 295 WORD32 stereo_config_index) { 296 pstr_usac_mps212_config->bs_freq_res = ixheaacd_read_bits_buf(it_bit_buff, 3); 297 298 pstr_usac_mps212_config->bs_fixed_gain_dmx = 299 ixheaacd_read_bits_buf(it_bit_buff, 3); 300 301 pstr_usac_mps212_config->bs_temp_shape_config = 302 ixheaacd_read_bits_buf(it_bit_buff, 2); 303 304 pstr_usac_mps212_config->bs_decorr_config = 305 ixheaacd_read_bits_buf(it_bit_buff, 2); 306 307 pstr_usac_mps212_config->bs_high_rate_mode = 308 ixheaacd_read_bits_buf(it_bit_buff, 1); 309 310 pstr_usac_mps212_config->bs_phase_coding = 311 ixheaacd_read_bits_buf(it_bit_buff, 1); 312 313 pstr_usac_mps212_config->bs_ott_bands_phase_present = 314 ixheaacd_read_bits_buf(it_bit_buff, 1); 315 316 if (pstr_usac_mps212_config->bs_ott_bands_phase_present) { 317 pstr_usac_mps212_config->bs_ott_bands_phase = 318 ixheaacd_read_bits_buf(it_bit_buff, 5); 319 } 320 321 if (stereo_config_index > 1) { 322 pstr_usac_mps212_config->bs_residual_bands = 323 ixheaacd_read_bits_buf(it_bit_buff, 5); 324 325 pstr_usac_mps212_config->bs_ott_bands_phase = 326 max(pstr_usac_mps212_config->bs_ott_bands_phase, 327 pstr_usac_mps212_config->bs_residual_bands); 328 329 pstr_usac_mps212_config->bs_pseudo_lr = 330 ixheaacd_read_bits_buf(it_bit_buff, 1); 331 } 332 333 if (pstr_usac_mps212_config->bs_temp_shape_config == 2) 334 pstr_usac_mps212_config->bs_env_quant_mode = 335 ixheaacd_read_bits_buf(it_bit_buff, 1); 336 } 337 338 VOID ixheaacd_cpe_config( 339 ia_bit_buf_struct *it_bit_buff, 340 ia_usac_dec_element_config_struct *pstr_usac_element_config, 341 WORD32 sbr_ratio_index) { 342 pstr_usac_element_config->tw_mdct = ixheaacd_read_bits_buf(it_bit_buff, 1); 343 pstr_usac_element_config->noise_filling = 344 ixheaacd_read_bits_buf(it_bit_buff, 1); 345 346 if (sbr_ratio_index > 0) { 347 ixheaacd_sbr_config(it_bit_buff, 348 &(pstr_usac_element_config->str_usac_sbr_config)); 349 pstr_usac_element_config->stereo_config_index = 350 ixheaacd_read_bits_buf(it_bit_buff, 2); 351 352 } else { 353 pstr_usac_element_config->stereo_config_index = 0; 354 } 355 356 if (pstr_usac_element_config->stereo_config_index > 0) 357 ixheaacd_mps212_config(it_bit_buff, 358 &(pstr_usac_element_config->str_usac_mps212_config), 359 pstr_usac_element_config->stereo_config_index); 360 } 361 362 WORD32 ixheaacd_decoder_config( 363 ia_bit_buf_struct *it_bit_buff, 364 ia_usac_decoder_config_struct *pstr_usac_decoder_config, 365 WORD32 sbr_ratio_index, UINT32 *chan) { 366 UWORD32 elem_idx = 0; 367 UWORD32 err = 0; 368 369 ixheaacd_read_escape_value( 370 it_bit_buff, &(pstr_usac_decoder_config->num_elements), 4, 8, 16); 371 pstr_usac_decoder_config->num_elements += 1; 372 pstr_usac_decoder_config->preroll_flag = 0; 373 374 if (pstr_usac_decoder_config->num_elements > USAC_MAX_ELEMENTS) { 375 return -1; 376 } 377 378 for (elem_idx = 0; elem_idx < pstr_usac_decoder_config->num_elements; 379 elem_idx++) { 380 ia_usac_dec_element_config_struct *pstr_usac_element_config = 381 &(pstr_usac_decoder_config->str_usac_element_config[elem_idx]); 382 383 pstr_usac_decoder_config->usac_element_type[elem_idx] = 384 ixheaacd_read_bits_buf(it_bit_buff, 2); 385 386 switch (pstr_usac_decoder_config->usac_element_type[elem_idx]) { 387 case ID_USAC_SCE: 388 389 pstr_usac_element_config->tw_mdct = 390 ixheaacd_read_bits_buf(it_bit_buff, 1); 391 pstr_usac_element_config->noise_filling = 392 ixheaacd_read_bits_buf(it_bit_buff, 1); 393 394 if (sbr_ratio_index > 0) 395 ixheaacd_sbr_config(it_bit_buff, 396 &(pstr_usac_element_config->str_usac_sbr_config)); 397 398 break; 399 400 case ID_USAC_CPE: 401 ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config, 402 sbr_ratio_index); 403 if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2) 404 return -1; 405 406 break; 407 408 case ID_USAC_LFE: 409 410 pstr_usac_element_config->tw_mdct = 0; 411 pstr_usac_element_config->noise_filling = 0; 412 break; 413 414 case ID_USAC_EXT: 415 err = ixheaacd_ext_element_config( 416 it_bit_buff, pstr_usac_element_config, 417 &pstr_usac_decoder_config->usac_ext_ele_payload_buf[elem_idx][0], 418 &pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx], 419 &(pstr_usac_decoder_config->preroll_flag)); 420 421 if (pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx] > 0) { 422 pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 1; 423 } else { 424 pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 0; 425 } 426 if (err != 0) return -1; 427 break; 428 default: 429 return -1; 430 break; 431 } 432 } 433 return err; 434 } 435 436 WORD32 ixheaacd_config_extension( 437 ia_bit_buf_struct *it_bit_buff, 438 ia_usac_decoder_config_struct *pstr_usac_decoder_config) { 439 UWORD32 i, j; 440 UWORD32 num_config_extensions; 441 UWORD32 usac_config_ext_type, usac_config_ext_len; 442 443 ixheaacd_read_escape_value(it_bit_buff, &(num_config_extensions), 2, 4, 8); 444 num_config_extensions += 1; 445 if (USAC_MAX_CONFIG_EXTENSIONS < num_config_extensions) { 446 return -1; 447 } 448 449 pstr_usac_decoder_config->num_config_extensions = num_config_extensions; 450 memset(pstr_usac_decoder_config->usac_cfg_ext_info_len, 0, 451 USAC_MAX_CONFIG_EXTENSIONS * sizeof(WORD32)); 452 memset(pstr_usac_decoder_config->usac_cfg_ext_info_present, 0, 453 USAC_MAX_CONFIG_EXTENSIONS * sizeof(WORD32)); 454 455 for (j = 0; j < num_config_extensions; j++) { 456 UWORD32 tmp; 457 UWORD32 fill_byte_val = 0xa5; 458 459 ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_type), 4, 8, 16); 460 ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_len), 4, 8, 16); 461 462 switch (usac_config_ext_type) { 463 case ID_CONFIG_EXT_FILL: 464 for (i = 0; i < usac_config_ext_len; i++) { 465 fill_byte_val = ixheaacd_read_bits_buf(it_bit_buff, 8); 466 if (fill_byte_val != 0xa5) return -1; 467 } 468 break; 469 default: 470 if ((WORD32)usac_config_ext_len > (it_bit_buff->cnt_bits >> 3)) { 471 return -1; 472 } 473 if (ID_CONFIG_EXT_LOUDNESS_INFO == usac_config_ext_type) { 474 for (i = 0; i < usac_config_ext_len; i++) { 475 UWORD8 byte_val = ixheaacd_read_bits_buf(it_bit_buff, 8); 476 pstr_usac_decoder_config->usac_cfg_ext_info_buf[j][i] = byte_val; 477 } 478 pstr_usac_decoder_config->usac_cfg_ext_info_len[j] = 479 usac_config_ext_len; 480 pstr_usac_decoder_config->usac_cfg_ext_info_present[j] = 1; 481 } else { 482 for (i = 0; i < usac_config_ext_len; i++) 483 tmp = ixheaacd_read_bits_buf(it_bit_buff, 8); 484 } 485 break; 486 } 487 } 488 489 return 0; 490 } 491 492 WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff, 493 ia_usac_config_struct *pstr_usac_conf, UINT32 *chan) { 494 WORD32 tmp, err; 495 err = 0; 496 497 pstr_usac_conf->usac_sampling_frequency_index = 498 ixheaacd_read_bits_buf(it_bit_buff, 5); 499 500 if (pstr_usac_conf->usac_sampling_frequency_index == 0x1f) 501 pstr_usac_conf->usac_sampling_frequency = 502 ixheaacd_read_bits_buf(it_bit_buff, 24); 503 504 pstr_usac_conf->core_sbr_framelength_index = 505 ixheaacd_read_bits_buf(it_bit_buff, 3); 506 507 if (pstr_usac_conf->core_sbr_framelength_index > 4) return -1; 508 509 pstr_usac_conf->channel_configuration_index = 510 ixheaacd_read_bits_buf(it_bit_buff, 5); 511 if (pstr_usac_conf->channel_configuration_index >= 3) return -1; 512 513 if (pstr_usac_conf->channel_configuration_index == 0) { 514 UWORD32 i; 515 516 ixheaacd_read_escape_value(it_bit_buff, 517 (UWORD32 *)(&(pstr_usac_conf->num_out_channels)), 518 5, 8, 16); 519 if (BS_MAX_NUM_OUT_CHANNELS < pstr_usac_conf->num_out_channels) { 520 return -1; 521 } 522 for (i = 0; i < pstr_usac_conf->num_out_channels; i++) 523 pstr_usac_conf->output_channel_pos[i] = 524 ixheaacd_read_bits_buf(it_bit_buff, 5); 525 526 } else { 527 ixheaacd_get_usac_chan_conf(pstr_usac_conf, 528 pstr_usac_conf->channel_configuration_index); 529 } 530 531 err = ixheaacd_decoder_config( 532 it_bit_buff, &(pstr_usac_conf->str_usac_dec_config), 533 ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index), chan); 534 if (err != 0) return -1; 535 536 tmp = ixheaacd_read_bits_buf(it_bit_buff, 1); 537 538 if (tmp) { 539 err = ixheaacd_config_extension(it_bit_buff, 540 &pstr_usac_conf->str_usac_dec_config); 541 if (err != 0) return -1; 542 } 543 544 return err; 545 } 546 547 VOID ixheaacd_conf_default(ia_usac_config_struct *pstr_usac_conf) { 548 WORD32 i; 549 550 pstr_usac_conf->num_out_channels = 0; 551 552 for (i = 0; i < BS_MAX_NUM_OUT_CHANNELS; i++) 553 pstr_usac_conf->output_channel_pos[i] = BS_OUTPUT_CHANNEL_POS_NA; 554 555 pstr_usac_conf->str_usac_dec_config.num_elements = 0; 556 557 for (i = 0; i < USAC_MAX_ELEMENTS; i++) 558 pstr_usac_conf->str_usac_dec_config.usac_element_type[i] = ID_USAC_INVALID; 559 560 return; 561 } 562