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 <stdlib.h> 21 #include <ixheaacd_type_def.h> 22 #include "ixheaacd_error_standards.h" 23 #include "ixheaacd_constants.h" 24 #include <ixheaacd_basic_ops32.h> 25 #include <ixheaacd_basic_ops16.h> 26 #include <ixheaacd_basic_ops40.h> 27 #include "ixheaacd_sbr_common.h" 28 29 #include "ixheaacd_bitbuffer.h" 30 #include "ixheaacd_defines.h" 31 #include <ixheaacd_aac_rom.h> 32 33 #include "ixheaacd_sbrdecsettings.h" 34 #include "ixheaacd_sbr_scale.h" 35 #include "ixheaacd_env_extr_part.h" 36 #include <ixheaacd_sbr_rom.h> 37 38 #include "ixheaacd_lpp_tran.h" 39 #include "ixheaacd_hybrid.h" 40 #include "ixheaacd_ps_dec.h" 41 42 #include "ixheaacd_env_extr.h" 43 #include "ixheaacd_common_rom.h" 44 45 #include "ixheaacd_pulsedata.h" 46 47 #include "ixheaacd_pns.h" 48 #include "ixheaacd_drc_data_struct.h" 49 50 #include "ixheaacd_lt_predict.h" 51 52 #include "ixheaacd_channelinfo.h" 53 #include "ixheaacd_drc_dec.h" 54 #include "ixheaacd_sbrdecoder.h" 55 #include "ixheaacd_block.h" 56 #include "ixheaacd_channel.h" 57 58 #include "ixheaacd_adts.h" 59 #include "ixheaacd_audioobjtypes.h" 60 #include "ixheaacd_sbrdecoder.h" 61 #include "ixheaacd_memory_standards.h" 62 63 #include "ixheaacd_latmdemux.h" 64 65 #include "ixheaacd_aacdec.h" 66 #include "ixheaacd_mps_polyphase.h" 67 #include "ixheaacd_config.h" 68 #include "ixheaacd_mps_dec.h" 69 70 #include "ixheaacd_struct_def.h" 71 #include "ixheaacd_error_codes.h" 72 #include "ixheaacd_definitions.h" 73 #include "ixheaacd_adts_crc_check.h" 74 75 #include "ixheaacd_headerdecode.h" 76 77 #include "ixheaacd_interface.h" 78 #include "ixheaacd_info.h" 79 80 #include "ixheaacd_config.h" 81 82 #include "ixheaacd_struct.h" 83 #include "ixheaacd_function_selector.h" 84 85 #include "ixheaacd_error_standards.h" 86 87 #undef ALLOW_SMALL_FRAMELENGTH 88 89 #define ALLOW_SMALL_FRAMELENGTH 90 #ifdef ALLOW_SMALL_FRAMELENGTH 91 #undef FRAME_SIZE_SMALL 92 #define FRAME_SIZE_SMALL 960 93 #endif 94 95 extern const WORD32 ixheaacd_sampl_freq_idx_table[17]; 96 97 #define AAC_LC_PROFILE (2) 98 99 #define ADTS_HEADER_LENGTH 7 100 101 #undef ALLOW_SMALL_FRAMELENGTH 102 103 #define ALLOW_SMALL_FRAMELENGTH 104 105 static PLATFORM_INLINE VOID 106 ixheaacd_aac_bytealign(struct ia_bit_buf_struct *it_bit_buff) { 107 WORD16 num_bit; 108 num_bit = (it_bit_buff->bit_pos + 1); 109 if (num_bit != 8) { 110 it_bit_buff->bit_pos = 7; 111 it_bit_buff->cnt_bits -= num_bit; 112 it_bit_buff->ptr_read_next += 1; 113 } 114 } 115 116 WORD32 ixheaacd_read_pce_channel_info(WORD32 ch, WORD8 *ptr_is_cpe, 117 WORD8 *ptr_tag_select, 118 struct ia_bit_buf_struct *it_bit_buff) { 119 WORD32 num_ch = 0, i, tmp; 120 for (i = 0; i < ch; i++) { 121 tmp = ixheaacd_read_bits_buf(it_bit_buff, 5); 122 ptr_is_cpe[i] = (tmp & 0x10) >> 4; 123 124 if (ptr_is_cpe[i]) { 125 num_ch += 2; 126 } else { 127 num_ch++; 128 } 129 130 ptr_tag_select[i] = (tmp & 0xF); 131 } 132 return num_ch; 133 } 134 135 VOID ixheaacd_read_pce_mixdown_data(struct ia_bit_buf_struct *it_bit_buff, 136 WORD32 mix_down_present, 137 WORD32 mix_down_element_no) { 138 WORD32 mix_down_flag = ixheaacd_read_bits_buf(it_bit_buff, mix_down_present); 139 if (mix_down_flag == 1) { 140 ixheaacd_read_bits_buf(it_bit_buff, mix_down_element_no); 141 } 142 } 143 144 VOID ixheaacd_skip_bits(struct ia_bit_buf_struct *it_bit_buff, WORD32 bits, 145 WORD32 num_element) { 146 WORD32 i; 147 for (i = 0; i < num_element; i++) { 148 ixheaacd_read_bits_buf(it_bit_buff, bits); 149 } 150 } 151 152 WORD32 ixheaacd_read_prog_config_element( 153 ia_program_config_struct *ptr_config_element, 154 struct ia_bit_buf_struct *it_bit_buff) { 155 WORD32 i, tmp; 156 WORD count = 0, num_ch = 0; 157 158 tmp = ixheaacd_read_bits_buf(it_bit_buff, 6); 159 160 ptr_config_element->element_instance_tag = (tmp >> 2); 161 ptr_config_element->object_type = tmp & 0x3; 162 163 if ((ptr_config_element->object_type + 1) != 2 164 165 && (ptr_config_element->object_type + 1) != 4 166 167 ) { 168 return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL; 169 } 170 171 ptr_config_element->samp_freq_index = ixheaacd_read_bits_buf(it_bit_buff, 4); 172 if (ptr_config_element->samp_freq_index > 11) { 173 return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR; 174 } 175 176 tmp = ixheaacd_read_bits_buf(it_bit_buff, 21); 177 178 count += ptr_config_element->num_front_channel_elements = (tmp >> 17); 179 count += ptr_config_element->num_side_channel_elements = 180 (tmp & 0x1E000) >> 13; 181 count += ptr_config_element->num_back_channel_elements = (tmp & 0x1E00) >> 9; 182 count += ptr_config_element->num_lfe_channel_elements = (tmp & 0x180) >> 7; 183 ptr_config_element->num_assoc_data_elements = (tmp & 0x70) >> 4; 184 count += ptr_config_element->num_valid_cc_elements = tmp & 0xF; 185 186 if (count > MAX_BS_ELEMENT) { 187 return IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX; 188 } 189 190 ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 4); 191 ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 4); 192 ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 3); 193 194 num_ch += ixheaacd_read_pce_channel_info( 195 ptr_config_element->num_front_channel_elements, 196 ptr_config_element->front_element_is_cpe, 197 ptr_config_element->front_element_tag_select, it_bit_buff); 198 199 num_ch += ixheaacd_read_pce_channel_info( 200 ptr_config_element->num_side_channel_elements, 201 ptr_config_element->side_element_is_cpe, 202 ptr_config_element->side_element_tag_select, it_bit_buff); 203 204 num_ch += ixheaacd_read_pce_channel_info( 205 ptr_config_element->num_back_channel_elements, 206 ptr_config_element->back_element_is_cpe, 207 ptr_config_element->back_element_tag_select, it_bit_buff); 208 209 num_ch += ptr_config_element->num_lfe_channel_elements; 210 211 for (i = 0; i < (ptr_config_element->num_lfe_channel_elements); i++) { 212 ptr_config_element->lfe_element_tag_select[i] = 213 ixheaacd_read_bits_buf(it_bit_buff, 4); 214 } 215 216 ptr_config_element->channels = num_ch; 217 218 for (i = 0; i < (ptr_config_element->num_assoc_data_elements); i++) { 219 ixheaacd_read_bits_buf(it_bit_buff, 4); 220 } 221 222 ixheaacd_skip_bits(it_bit_buff, 5, ptr_config_element->num_valid_cc_elements); 223 224 { 225 WORD32 bits_to_read = ptr_config_element->alignment_bits; 226 if (bits_to_read <= it_bit_buff->bit_pos) { 227 bits_to_read = it_bit_buff->bit_pos - bits_to_read; 228 } else { 229 bits_to_read = 8 - (bits_to_read) + it_bit_buff->bit_pos; 230 } 231 tmp = ixheaacd_read_bits_buf(it_bit_buff, bits_to_read); 232 } 233 tmp = ixheaacd_read_bits_buf(it_bit_buff, 8); 234 235 ixheaacd_skip_bits(it_bit_buff, 8, tmp); 236 237 return 0; 238 } 239 240 WORD ixheaacd_decode_pce(struct ia_bit_buf_struct *it_bit_buff, 241 UWORD32 *ui_pce_found_in_hdr, 242 ia_program_config_struct *ptr_prog_config) { 243 WORD32 error_code = 0; 244 245 if (*ui_pce_found_in_hdr == 1 || *ui_pce_found_in_hdr == 3) { 246 ia_program_config_struct ptr_config_element = {0}; 247 ptr_config_element.alignment_bits = ptr_prog_config->alignment_bits; 248 error_code = 249 ixheaacd_read_prog_config_element(&ptr_config_element, it_bit_buff); 250 *ui_pce_found_in_hdr = 3; 251 } else { 252 error_code = 253 ixheaacd_read_prog_config_element(ptr_prog_config, it_bit_buff); 254 *ui_pce_found_in_hdr = 2; 255 } 256 return error_code; 257 } 258 259 static PLATFORM_INLINE WORD32 ixheaacd_get_adif_header( 260 ia_adif_header_struct *adif, struct ia_bit_buf_struct *it_bit_buff) { 261 WORD32 i; 262 WORD32 ret_val = 0, tmp; 263 264 ixheaacd_read_bits_buf(it_bit_buff, 16); 265 tmp = ixheaacd_read_bits_buf(it_bit_buff, 17); 266 267 if (tmp & 0x1) { 268 ixheaacd_skip_bits(it_bit_buff, 8, 9); 269 } 270 271 tmp = ixheaacd_read_bits_buf(it_bit_buff, 3); 272 273 adif->bit_stream_type = (tmp & 0x1); 274 275 ixheaacd_read_bits_buf(it_bit_buff, 23); 276 277 tmp = ixheaacd_read_bits_buf(it_bit_buff, 4); 278 279 for (i = 0; i <= tmp; i++) { 280 if (adif->bit_stream_type == 0) { 281 ixheaacd_read_bits_buf(it_bit_buff, 20); 282 } 283 284 adif->prog_config_present = 1; 285 adif->str_prog_config.alignment_bits = 7; 286 ret_val = 287 ixheaacd_read_prog_config_element(&adif->str_prog_config, it_bit_buff); 288 if (ret_val) { 289 return ret_val; 290 } 291 } 292 293 return 0; 294 } 295 296 WORD32 ixheaacd_find_syncword(ia_adts_header_struct *adts, 297 struct ia_bit_buf_struct *it_bit_buff) { 298 adts->sync_word = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 12); 299 if (adts->sync_word == 0xFFF) { 300 return 0; 301 } 302 303 while (1) { 304 ixheaacd_read_bidirection(it_bit_buff, -4); 305 if (it_bit_buff->cnt_bits < 12) { 306 return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL; 307 } 308 adts->sync_word = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 12); 309 if (adts->sync_word == 0xFFF) { 310 ixheaacd_read_bidirection(it_bit_buff, -12); 311 return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL; 312 } 313 } 314 } 315 316 WORD32 ixheaacd_adtsframe(ia_adts_header_struct *adts, 317 struct ia_bit_buf_struct *it_bit_buff) { 318 WORD32 tmp; 319 320 WORD32 crc_reg; 321 ia_adts_crc_info_struct *ptr_adts_crc_info = it_bit_buff->pstr_adts_crc_info; 322 ptr_adts_crc_info->crc_active = 1; 323 ptr_adts_crc_info->no_reg = 0; 324 ixheaacd_read_bidirection(it_bit_buff, -12); 325 crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff, 326 CRC_ADTS_HEADER_LEN); 327 ixheaacd_find_syncword(adts, it_bit_buff); 328 329 tmp = ixheaacd_read_bits_buf(it_bit_buff, 10); 330 331 adts->id = (tmp & 0x200) >> 9; 332 adts->layer = (tmp & 0x180) >> 7; 333 adts->protection_absent = (tmp & 0x40) >> 6; 334 adts->profile = (tmp & 0x30) >> 4; 335 { adts->profile++; } 336 adts->samp_freq_index = (tmp & 0xF); 337 338 if (((adts->profile != AAC_LC_PROFILE)) || (adts->samp_freq_index > 11)) 339 340 { 341 return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL; 342 } 343 344 tmp = ixheaacd_read_bits_buf(it_bit_buff, 21); 345 346 adts->channel_configuration = (WORD32)(tmp & 0xE0000) >> 17; 347 348 adts->aac_frame_length = (tmp & 0x1FFF); 349 350 tmp = ixheaacd_read_bits_buf(it_bit_buff, 13); 351 352 adts->no_raw_data_blocks = (tmp & 0x3); 353 354 ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg); 355 356 if (adts->protection_absent == 0) { 357 ixheaacd_skip_bits(it_bit_buff, 16, adts->no_raw_data_blocks); 358 adts->crc_check = ixheaacd_read_bits_buf(it_bit_buff, 16); 359 360 ptr_adts_crc_info->crc_active = 1; 361 ptr_adts_crc_info->file_value = adts->crc_check; 362 } else 363 ptr_adts_crc_info->crc_active = 0; 364 365 ixheaacd_aac_bytealign(it_bit_buff); 366 return 0; 367 } 368 369 WORD32 ixheaacd_get_samp_rate( 370 struct ia_bit_buf_struct *it_bit_buff, 371 ia_sampling_rate_info_struct *pstr_samp_rate_info, 372 ia_audio_specific_config_struct *pstr_audio_specific_config) { 373 WORD32 index; 374 WORD32 sampling_rate; 375 index = ixheaacd_read_bits_buf(it_bit_buff, 4); 376 pstr_audio_specific_config->samp_frequency_index = index; 377 378 if (index == 0x0F) { 379 sampling_rate = ixheaacd_read_bits_buf(it_bit_buff, 24); 380 381 if (pstr_audio_specific_config->audio_object_type != AOT_USAC) { 382 if (sampling_rate < 9391) 383 sampling_rate = 8000; 384 else if ((sampling_rate >= 9391) && (sampling_rate < 11502)) 385 sampling_rate = 11025; 386 else if ((sampling_rate >= 11502) && (sampling_rate < 13856)) 387 sampling_rate = 12000; 388 else if ((sampling_rate >= 13856) && (sampling_rate < 18783)) 389 sampling_rate = 16000; 390 else if ((sampling_rate >= 18783) && (sampling_rate < 23004)) 391 sampling_rate = 22050; 392 else if ((sampling_rate >= 23004) && (sampling_rate < 27713)) 393 sampling_rate = 24000; 394 else if ((sampling_rate >= 27713) && (sampling_rate < 37566)) 395 sampling_rate = 32000; 396 else if ((sampling_rate >= 37566) && (sampling_rate < 46009)) 397 sampling_rate = 44100; 398 else if ((sampling_rate >= 46009) && (sampling_rate < 55426)) 399 sampling_rate = 48000; 400 else if ((sampling_rate >= 55426) && (sampling_rate < 75132)) 401 sampling_rate = 64000; 402 else if ((sampling_rate >= 75132) && (sampling_rate < 92017)) 403 sampling_rate = 88200; 404 else if (sampling_rate >= 92017) 405 sampling_rate = 96000; 406 } 407 return sampling_rate; 408 } else if ((index > 12) && (index < 15)) { 409 return -1; 410 } else { 411 return ((pstr_samp_rate_info[index].sampling_frequency)); 412 } 413 } 414 static int ixheaacd_get_ld_sbr_header( 415 ia_bit_buf_struct *it_bit_buff, 416 ia_sbr_header_data_struct *sbr_header_data) { 417 WORD32 header_extra_1, header_extra_2; 418 UWORD32 tmp, bit_cnt = 0; 419 420 tmp = ixheaacd_read_bits_buf(it_bit_buff, 16); 421 bit_cnt += 16; 422 423 sbr_header_data->amp_res = (tmp & 0x8000) >> 15; 424 sbr_header_data->start_freq = (tmp & 0x7800) >> 11; 425 sbr_header_data->stop_freq = (tmp & 0x780) >> 7; 426 sbr_header_data->xover_band = (tmp & 0x70) >> 4; 427 header_extra_1 = (tmp & 0x0002) >> 1; 428 header_extra_2 = (tmp & 0x0001); 429 430 if (header_extra_1) { 431 sbr_header_data->freq_scale = ixheaacd_read_bits_buf(it_bit_buff, 2); 432 sbr_header_data->alter_scale = ixheaacd_read_bits_buf(it_bit_buff, 1); 433 sbr_header_data->noise_bands = ixheaacd_read_bits_buf(it_bit_buff, 2); 434 } else { 435 sbr_header_data->freq_scale = 2; 436 sbr_header_data->alter_scale = 1; 437 sbr_header_data->noise_bands = 2; 438 } 439 440 if (header_extra_2) { 441 sbr_header_data->limiter_bands = ixheaacd_read_bits_buf(it_bit_buff, 2); 442 sbr_header_data->limiter_gains = ixheaacd_read_bits_buf(it_bit_buff, 2); 443 sbr_header_data->interpol_freq = ixheaacd_read_bits_buf(it_bit_buff, 1); 444 sbr_header_data->smoothing_mode = ixheaacd_read_bits_buf(it_bit_buff, 1); 445 } else { 446 sbr_header_data->limiter_bands = 2; 447 sbr_header_data->limiter_gains = 2; 448 sbr_header_data->interpol_freq = 1; 449 sbr_header_data->smoothing_mode = 1; 450 } 451 452 return (bit_cnt); 453 } 454 455 WORD32 ixheaacd_eld_sbr_header(ia_bit_buf_struct *it_bit_buff, WORD32 channels, 456 ia_sbr_header_data_struct *pstr_sbr_config) { 457 int num_sbr_header, el, bit_cnt = 0; 458 switch (channels) { 459 default: 460 num_sbr_header = 0; 461 break; 462 case 1: 463 case 2: 464 num_sbr_header = 1; 465 break; 466 case 3: 467 num_sbr_header = 2; 468 break; 469 case 4: 470 case 5: 471 case 6: 472 num_sbr_header = 3; 473 break; 474 case 7: 475 num_sbr_header = 4; 476 break; 477 } 478 for (el = 0; el < num_sbr_header; el++) { 479 bit_cnt = ixheaacd_get_ld_sbr_header(it_bit_buff, pstr_sbr_config); 480 } 481 return (bit_cnt); 482 } 483 484 WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct, 485 WORD32 header_len, WORD32 *bytes_consumed, 486 ia_sampling_rate_info_struct *pstr_samp_rate_info, 487 struct ia_bit_buf_struct *it_bit_buff) { 488 WORD32 tmp; 489 WORD32 cnt_bits = it_bit_buff->cnt_bits; 490 WORD32 dummy = 0; 491 ia_audio_specific_config_struct *pstr_audio_specific_config; 492 493 memset(aac_state_struct->ia_audio_specific_config, 0, 494 sizeof(ia_audio_specific_config_struct)); 495 496 memset(&(aac_state_struct->eld_specific_config), 0, 497 sizeof(ia_eld_specific_config_struct)); 498 499 pstr_audio_specific_config = aac_state_struct->ia_audio_specific_config; 500 501 aac_state_struct->p_config->str_prog_config.alignment_bits = 502 it_bit_buff->bit_pos; 503 504 aac_state_struct->audio_object_type = ixheaacd_read_bits_buf(it_bit_buff, 5); 505 506 if (aac_state_struct->audio_object_type == 31) { 507 tmp = ixheaacd_read_bits_buf(it_bit_buff, 6); 508 aac_state_struct->audio_object_type = 32 + tmp; 509 } 510 pstr_audio_specific_config->audio_object_type = 511 aac_state_struct->audio_object_type; 512 513 tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info, 514 pstr_audio_specific_config); 515 pstr_audio_specific_config->sampling_frequency = tmp; 516 517 if (tmp == -1) { 518 *bytes_consumed = 1; 519 return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL; 520 } else 521 aac_state_struct->sampling_rate = tmp; 522 aac_state_struct->p_config->ui_samp_freq = tmp; 523 524 aac_state_struct->ch_config = ixheaacd_read_bits_buf(it_bit_buff, 4); 525 526 pstr_audio_specific_config->channel_configuration = 527 aac_state_struct->ch_config; 528 529 if (aac_state_struct->audio_object_type == AOT_SBR || 530 aac_state_struct->audio_object_type == AOT_PS) { 531 tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info, 532 pstr_audio_specific_config); 533 aac_state_struct->sbr_present_flag = 1; 534 if (tmp == -1) { 535 *bytes_consumed = 1; 536 return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL; 537 } else 538 aac_state_struct->extension_samp_rate = tmp; 539 540 aac_state_struct->audio_object_type = 541 ixheaacd_read_bits_buf(it_bit_buff, 5); 542 } 543 544 if (((aac_state_struct->audio_object_type >= AOT_AAC_MAIN && 545 aac_state_struct->audio_object_type <= AOT_AAC_LTP) || 546 aac_state_struct->audio_object_type == AOT_AAC_SCAL || 547 aac_state_struct->audio_object_type == AOT_TWIN_VQ || 548 aac_state_struct->audio_object_type == AOT_ER_AAC_LD || 549 aac_state_struct->audio_object_type == AOT_ER_AAC_ELD || 550 aac_state_struct->audio_object_type == AOT_ER_AAC_LC) && 551 aac_state_struct->audio_object_type != AOT_USAC) 552 553 { 554 aac_state_struct->usac_flag = 0; 555 556 aac_state_struct->frame_len_flag = ixheaacd_read_bits_buf(it_bit_buff, 1); 557 if (aac_state_struct->audio_object_type != AOT_ER_AAC_ELD) { 558 aac_state_struct->depends_on_core_coder = 559 ixheaacd_read_bits_buf(it_bit_buff, 1); 560 aac_state_struct->extension_flag = ixheaacd_read_bits_buf(it_bit_buff, 1); 561 562 if (aac_state_struct->ch_config == 0) { 563 WORD32 error_code; 564 error_code = ixheaacd_read_prog_config_element( 565 &aac_state_struct->p_config->str_prog_config, it_bit_buff); 566 if (error_code != 0) { 567 *bytes_consumed = 1; 568 return error_code; 569 } 570 aac_state_struct->p_config->ui_pce_found_in_hdr = 1; 571 } 572 } 573 if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD || 574 aac_state_struct->audio_object_type == AOT_ER_AAC_LD) { 575 aac_state_struct->eld_specific_config.aac_sect_data_resil_flag = 0; 576 aac_state_struct->eld_specific_config.aac_sf_data_resil_flag = 0; 577 aac_state_struct->eld_specific_config.aac_spect_data_resil_flag = 0; 578 aac_state_struct->eld_specific_config.ep_config = 0; 579 if ((aac_state_struct->extension_flag == 1) || 580 aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) { 581 if (aac_state_struct->audio_object_type >= ER_OBJECT_START) { 582 aac_state_struct->eld_specific_config.aac_sect_data_resil_flag = 583 ixheaacd_read_bits_buf(it_bit_buff, 1); 584 aac_state_struct->eld_specific_config.aac_sf_data_resil_flag = 585 ixheaacd_read_bits_buf(it_bit_buff, 1); 586 aac_state_struct->eld_specific_config.aac_spect_data_resil_flag = 587 ixheaacd_read_bits_buf(it_bit_buff, 1); 588 if (aac_state_struct->audio_object_type != AOT_ER_AAC_ELD) 589 aac_state_struct->eld_specific_config.ep_config = 590 ixheaacd_read_bits_buf(it_bit_buff, 2); 591 else 592 aac_state_struct->eld_specific_config.ld_sbr_flag_present = 593 ixheaacd_read_bits_buf(it_bit_buff, 1); 594 } 595 } 596 } 597 } 598 if (pstr_audio_specific_config->audio_object_type == AOT_USAC) { 599 { 600 pstr_audio_specific_config->sbr_present_flag = 0; 601 pstr_audio_specific_config->ext_audio_object_type = 0; 602 } 603 604 {{size_t tmp = 0xf; 605 UWORD32 i; 606 WORD32 err = 0; 607 608 aac_state_struct->usac_flag = 1; 609 610 ixheaacd_conf_default(&(pstr_audio_specific_config->str_usac_config)); 611 err = ixheaacd_config(it_bit_buff, 612 &(pstr_audio_specific_config->str_usac_config), 613 &(pstr_audio_specific_config->channel_configuration)); 614 if (err != 0) return err; 615 616 pstr_audio_specific_config->sampling_frequency = 617 pstr_audio_specific_config->str_usac_config.usac_sampling_frequency; 618 619 if (pstr_audio_specific_config->audio_object_type == AOT_USAC) { 620 pstr_audio_specific_config->sbr_present_flag = 1; 621 pstr_audio_specific_config->ext_audio_object_type = AOT_SBR; 622 pstr_audio_specific_config->ext_sampling_frequency = 623 pstr_audio_specific_config->sampling_frequency; 624 pstr_audio_specific_config->ext_samp_frequency_index = 625 pstr_audio_specific_config->samp_frequency_index; 626 627 for (i = 0; i < sizeof(ixheaacd_sampl_freq_idx_table) / 628 sizeof(ixheaacd_sampl_freq_idx_table[0]); 629 i++) { 630 if (ixheaacd_sampl_freq_idx_table[i] == 631 (int)(pstr_audio_specific_config->sampling_frequency)) { 632 tmp = i; 633 break; 634 } 635 } 636 pstr_audio_specific_config->samp_frequency_index = (UINT32)tmp; 637 } else { 638 pstr_audio_specific_config->sbr_present_flag = 0; 639 } 640 } 641 } 642 643 { 644 dummy = ixheaacd_skip_bits_buf(it_bit_buff, it_bit_buff->cnt_bits); 645 646 if ((SIZE_T)it_bit_buff->ptr_read_next == 647 (SIZE_T)it_bit_buff->ptr_bit_buf_base) { 648 *bytes_consumed = ((WORD32)it_bit_buff->size) >> 3; 649 } else { 650 *bytes_consumed = (((((SIZE_T)it_bit_buff->ptr_read_next - 651 (SIZE_T)it_bit_buff->ptr_bit_buf_base)) 652 << 3) + 653 7 - it_bit_buff->bit_pos + 7) >> 654 3; 655 } 656 } 657 return 0; 658 } 659 660 aac_state_struct->frame_length = FRAME_SIZE; 661 if (aac_state_struct->frame_len_flag) 662 #ifdef ALLOW_SMALL_FRAMELENGTH 663 aac_state_struct->frame_length = FRAME_SIZE_SMALL; 664 #else 665 return -1; 666 #endif 667 668 if (aac_state_struct->extension_flag) 669 aac_state_struct->extension_flag_3 = ixheaacd_read_bits_buf(it_bit_buff, 1); 670 671 if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD) 672 aac_state_struct->frame_length >>= 1; 673 674 if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) { 675 aac_state_struct->frame_length >>= 1; 676 if (aac_state_struct->eld_specific_config.ld_sbr_flag_present) { 677 aac_state_struct->eld_specific_config.ld_sbr_samp_rate = 678 ixheaacd_read_bits_buf(it_bit_buff, 1); 679 aac_state_struct->eld_specific_config.ld_sbr_crc_flag = 680 ixheaacd_read_bits_buf(it_bit_buff, 1); 681 682 ixheaacd_eld_sbr_header(it_bit_buff, aac_state_struct->ch_config, 683 &aac_state_struct->str_sbr_config); 684 685 aac_state_struct->dwnsmp_signal = 686 !aac_state_struct->eld_specific_config.ld_sbr_samp_rate; 687 } 688 689 ixheaacd_read_bits_buf(it_bit_buff, 1); 690 } 691 if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) { 692 int ep_config = ixheaacd_read_bits_buf(it_bit_buff, 2); 693 if (ep_config == 2 || ep_config == 3) { 694 } 695 if (ep_config == 3) { 696 int direct_map = ixheaacd_read_bits_buf(it_bit_buff, 1); 697 if (!direct_map) { 698 } 699 } 700 } 701 702 tmp = (header_len * 8) - it_bit_buff->cnt_bits; 703 704 if (aac_state_struct->audio_object_type != AOT_SBR && 705 (it_bit_buff->cnt_bits >= 16)) { 706 tmp = ixheaacd_read_bits_buf(it_bit_buff, 11); 707 708 if (tmp == 0x2b7) { 709 tmp = ixheaacd_read_bits_buf(it_bit_buff, 5); 710 711 if (tmp == AOT_SBR) { 712 WORD32 sbr_present_flag = ixheaacd_read_bits_buf(it_bit_buff, 1); 713 if (sbr_present_flag) { 714 tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info, 715 pstr_audio_specific_config); 716 if (tmp == -1) { 717 *bytes_consumed = 1; 718 return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL; 719 } else 720 aac_state_struct->extension_samp_rate = tmp; 721 722 if (it_bit_buff->cnt_bits >= 12) { 723 tmp = ixheaacd_read_bits_buf(it_bit_buff, 11); 724 if (tmp == 0x548) { 725 tmp = ixheaacd_read_bits_buf(it_bit_buff, 1); 726 } 727 } 728 } 729 } 730 } else if (aac_state_struct->bs_format == LOAS_BSFORMAT) { 731 ixheaacd_read_bidirection(it_bit_buff, -11); 732 } 733 } 734 735 if (aac_state_struct->audio_object_type != AOT_AAC_LC && 736 aac_state_struct->audio_object_type != AOT_SBR && 737 aac_state_struct->audio_object_type != AOT_PS && 738 aac_state_struct->audio_object_type != AOT_ER_AAC_LC && 739 aac_state_struct->audio_object_type != AOT_ER_AAC_LD && 740 aac_state_struct->audio_object_type != AOT_ER_AAC_ELD && 741 aac_state_struct->audio_object_type != AOT_AAC_LTP) { 742 *bytes_consumed = 1; 743 return IA_ENHAACPLUS_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED; 744 } else { 745 if (aac_state_struct->bs_format == LOAS_BSFORMAT) { 746 *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) >> 3; 747 if (it_bit_buff->bit_pos < 7) *bytes_consumed += 1; 748 749 } else 750 *bytes_consumed = header_len; 751 752 return 0; 753 } 754 } 755 756 WORD32 ixheaacd_check_if_adts(ia_adts_header_struct *adts, 757 struct ia_bit_buf_struct *it_bit_buff, 758 WORD32 usr_max_ch) { 759 WORD32 max_frm_len_per_ch, result = 0; 760 761 result = ixheaacd_adtsframe(adts, it_bit_buff); 762 763 max_frm_len_per_ch = ixheaacd_mult32(768, (adts->no_raw_data_blocks + 1)); 764 765 if (adts->channel_configuration != 0) 766 max_frm_len_per_ch = 767 ixheaacd_mult32(max_frm_len_per_ch, adts->channel_configuration); 768 else 769 max_frm_len_per_ch = max_frm_len_per_ch * usr_max_ch; 770 771 return ((result != 0) || (adts->aac_frame_length < 8) || (adts->layer != 0) || 772 (adts->profile != AAC_LC_PROFILE)); 773 } 774 775 IA_ERRORCODE ixheaacd_latm_header_decode( 776 ia_aac_dec_state_struct *aac_state_struct, 777 struct ia_bit_buf_struct *it_bit_buff, WORD32 *bytes_consumed, 778 ia_sampling_rate_info_struct *pstr_samp_rate_info) { 779 WORD32 sync; 780 IA_ERRORCODE result; 781 WORD32 next_sync, audio_mux_len_bytes_last; 782 WORD32 audio_mux_len_bits_last; 783 WORD32 sync_status = aac_state_struct->sync_status; 784 WORD32 bit_count = aac_state_struct->bit_count; 785 WORD32 cnt_bits = it_bit_buff->cnt_bits; 786 787 *bytes_consumed = 0; 788 789 aac_state_struct->bs_format = LOAS_BSFORMAT; 790 791 if (sync_status == 0) { 792 do { 793 sync = ixheaacd_read_bits_buf(it_bit_buff, 11); 794 bit_count += 11; 795 while (sync != 0x2B7) { 796 sync = ((sync & 0x3ff) << 1) | ixheaacd_read_bits_buf(it_bit_buff, 1); 797 bit_count += 1; 798 if (it_bit_buff->cnt_bits < 13) { 799 ixheaacd_read_bidirection(it_bit_buff, -11); 800 *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8; 801 return (IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START); 802 } 803 } 804 805 audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13); 806 bit_count += 13; 807 audio_mux_len_bits_last = audio_mux_len_bytes_last << 3; 808 if (it_bit_buff->cnt_bits >= (audio_mux_len_bits_last + 11)) { 809 ixheaacd_read_bidirection(it_bit_buff, audio_mux_len_bits_last); 810 bit_count += audio_mux_len_bits_last; 811 812 next_sync = ixheaacd_read_bits_buf(it_bit_buff, 11); 813 bit_count += 11; 814 815 if (next_sync == 0x2B7) { 816 ixheaacd_read_bidirection(it_bit_buff, 817 -(11 + audio_mux_len_bits_last + 13 + 11)); 818 bit_count -= 11 + audio_mux_len_bits_last + 13 + 11; 819 break; 820 } else { 821 ixheaacd_read_bidirection(it_bit_buff, 822 -(audio_mux_len_bits_last + 24 + 11 - 1)); 823 bit_count -= audio_mux_len_bits_last + 24 + 11 - 1; 824 } 825 826 } else { 827 ixheaacd_read_bidirection(it_bit_buff, -(13 + 11)); 828 bit_count -= (13 + 11); 829 *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8; 830 return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES; 831 } 832 } while (1); 833 834 do { 835 WORD32 audio_mux_len_bytes_last; 836 WORD32 use_same_stream_mux; 837 838 sync = ixheaacd_read_bits_buf(it_bit_buff, 11); 839 bit_count += 11; 840 841 if (sync != 0x2b7) { 842 ixheaacd_read_bidirection(it_bit_buff, -25); 843 bit_count -= 11; 844 *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8; 845 return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START; 846 } 847 848 audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13); 849 bit_count += 13; 850 851 use_same_stream_mux = ixheaacd_read_bits_buf(it_bit_buff, 1); 852 bit_count += 1; 853 854 if (it_bit_buff->cnt_bits - (audio_mux_len_bytes_last * 8 - 1 + 11) < 0) { 855 ixheaacd_read_bidirection(it_bit_buff, -25); 856 bit_count -= 25; 857 aac_state_struct->bit_count = bit_count; 858 *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8; 859 return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START; 860 } 861 862 if (!use_same_stream_mux) { 863 ixheaacd_read_bidirection(it_bit_buff, -25); 864 bit_count -= 25; 865 sync_status = 1; 866 aac_state_struct->sync_status = sync_status; 867 break; 868 } 869 870 ixheaacd_read_bidirection(it_bit_buff, audio_mux_len_bytes_last * 8 - 1); 871 bit_count += audio_mux_len_bytes_last * 8 - 1; 872 873 } while (sync_status == 0); 874 875 *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8; 876 { 877 ixheaacd_latm_struct latm_struct_element; 878 WORD32 sync; 879 memset(&latm_struct_element, 0, sizeof(ixheaacd_latm_struct)); 880 881 sync = ixheaacd_read_bits_buf(it_bit_buff, 11); 882 if (sync == 0x2b7) { 883 result = ixheaacd_latm_audio_mux_element( 884 it_bit_buff, &latm_struct_element, aac_state_struct, 885 pstr_samp_rate_info); 886 if (result != 0) { 887 sync_status = 0; 888 aac_state_struct->sync_status = sync_status; 889 890 *bytes_consumed += 1; 891 return result; 892 } 893 } 894 } 895 } 896 return IA_NO_ERROR; 897 } 898 899 WORD32 ixheaacd_aac_headerdecode( 900 ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, UWORD8 *buffer, 901 WORD32 *bytes_consumed, 902 const ia_aac_dec_huffman_tables_struct *pstr_huffmann_tables) { 903 struct ia_bit_buf_struct it_bit_buff = {0}, *handle_bit_buff; 904 ia_adif_header_struct adif = {0}; 905 ia_adts_header_struct adts = {0}; 906 WORD32 result; 907 WORD32 header_len; 908 WORD32 sync = 0; 909 910 WORD32 disable_sync = p_obj_exhaacplus_dec->aac_config.ui_disable_sync; 911 WORD32 is_ga_header = p_obj_exhaacplus_dec->aac_config.ui_mp4_flag; 912 913 WORD32 loas_present = p_obj_exhaacplus_dec->aac_config.loas_present; 914 915 ia_aac_dec_state_struct *aac_state_struct = 916 p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX]; 917 WORD32 usr_max_ch = aac_state_struct->p_config->ui_max_channels; 918 919 ia_sampling_rate_info_struct *pstr_samp_rate_info = 920 (ia_sampling_rate_info_struct *)&pstr_huffmann_tables 921 ->str_sample_rate_info[0]; 922 923 if (buffer == 0) { 924 return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL; 925 } 926 927 header_len = aac_state_struct->ui_in_bytes; 928 929 handle_bit_buff = ixheaacd_create_bit_buf(&it_bit_buff, (UWORD8 *)buffer, 930 (WORD16)header_len); 931 handle_bit_buff->cnt_bits += (header_len << 3); 932 handle_bit_buff->xaac_jmp_buf = &aac_state_struct->xaac_jmp_buf; 933 934 if (is_ga_header == 1) { 935 return ixheaacd_ga_hdr_dec(aac_state_struct, header_len, bytes_consumed, 936 pstr_samp_rate_info, handle_bit_buff); 937 } else if (loas_present) { 938 return ixheaacd_latm_header_decode(aac_state_struct, &it_bit_buff, 939 bytes_consumed, pstr_samp_rate_info); 940 } 941 942 else { 943 WORD32 header_found = 0; 944 WORD32 bytes_taken = -1; 945 WORD32 prev_offset = 0; 946 WORD32 run_once = 1; 947 if (disable_sync == 0) run_once = 0; 948 949 do { 950 bytes_taken++; 951 buffer += (bytes_taken - prev_offset); 952 953 prev_offset = bytes_taken; 954 955 handle_bit_buff = ixheaacd_create_bit_buf( 956 &it_bit_buff, (UWORD8 *)buffer, (WORD16)(header_len - bytes_taken)); 957 handle_bit_buff->cnt_bits += (8 * (header_len - bytes_taken)); 958 959 handle_bit_buff->pstr_adts_crc_info = &handle_bit_buff->str_adts_crc_info; 960 ixheaacd_adts_crc_open(handle_bit_buff->pstr_adts_crc_info); 961 962 if ((buffer[0] == 'A') && (buffer[1] == 'D') && (buffer[2] == 'I') && 963 (buffer[3] == 'F')) { 964 adif.prog_config_present = 0; 965 result = ixheaacd_get_adif_header(&adif, handle_bit_buff); 966 if (result == 0) { 967 if (adif.prog_config_present == 1) { 968 aac_state_struct->p_config->ui_pce_found_in_hdr = 1; 969 aac_state_struct->p_config->str_prog_config = adif.str_prog_config; 970 } 971 aac_state_struct->s_adif_hdr_present = 1; 972 aac_state_struct->audio_object_type = 973 adif.str_prog_config.object_type; 974 aac_state_struct->sampling_rate = 975 pstr_samp_rate_info[adif.str_prog_config.samp_freq_index] 976 .sampling_frequency; 977 aac_state_struct->ch_config = adif.str_prog_config.channels; 978 bytes_taken += 979 ((handle_bit_buff->size - handle_bit_buff->cnt_bits) >> 3); 980 981 header_found = 1; 982 aac_state_struct->frame_length = FRAME_SIZE; 983 if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD) 984 aac_state_struct->frame_length >>= 1; 985 } 986 } 987 988 else if ((sync = ixheaacd_read_bits_buf(&it_bit_buff, 12)) == 0xfff) { 989 result = ixheaacd_check_if_adts(&adts, handle_bit_buff, usr_max_ch); 990 if (result != 0) { 991 continue; 992 } 993 994 if ((adts.aac_frame_length + ADTS_HEADER_LENGTH) < 995 (header_len - bytes_taken)) { 996 ia_adts_header_struct adts_loc = {0}; 997 998 handle_bit_buff = ixheaacd_create_init_bit_buf( 999 &it_bit_buff, (UWORD8 *)(buffer + adts.aac_frame_length), 1000 (WORD16)(header_len - adts.aac_frame_length)); 1001 1002 adts_loc.sync_word = 1003 (WORD16)ixheaacd_read_bits_buf(handle_bit_buff, 12); 1004 1005 if (adts_loc.sync_word != 0xFFF) { 1006 continue; 1007 } 1008 1009 result = 1010 ixheaacd_check_if_adts(&adts_loc, handle_bit_buff, usr_max_ch); 1011 if ((result != 0) || 1012 (adts.samp_freq_index != adts_loc.samp_freq_index) || 1013 (adts.channel_configuration != adts_loc.channel_configuration)) { 1014 continue; 1015 } 1016 } 1017 1018 { 1019 WORD32 obj_type; 1020 obj_type = adts.profile; 1021 1022 aac_state_struct->audio_object_type = obj_type; 1023 aac_state_struct->sampling_rate = 1024 ((pstr_samp_rate_info[adts.samp_freq_index].sampling_frequency)); 1025 aac_state_struct->ch_config = adts.channel_configuration; 1026 aac_state_struct->s_adts_hdr_present = 1; 1027 header_found = 1; 1028 aac_state_struct->bs_format = ADTS_BSFORMAT; 1029 aac_state_struct->frame_length = FRAME_SIZE; 1030 if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD) 1031 aac_state_struct->frame_length >>= 1; 1032 } 1033 } else if (0x2b7 == (sync >> 1)) { 1034 ixheaacd_read_bidirection(&it_bit_buff, -12); 1035 result = 1036 ixheaacd_latm_header_decode(aac_state_struct, &it_bit_buff, 1037 bytes_consumed, pstr_samp_rate_info); 1038 if (result != 0) { 1039 if ((result == 1040 (WORD32) 1041 IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) || 1042 (result == 1043 (WORD32)IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX)) { 1044 bytes_taken += *bytes_consumed; 1045 *bytes_consumed = bytes_taken; 1046 return result; 1047 } else if (result == -1) 1048 return -1; 1049 else if (result == (WORD32)IA_FATAL_ERROR) 1050 return IA_FATAL_ERROR; 1051 else 1052 bytes_taken += *bytes_consumed - 1; 1053 continue; 1054 } 1055 header_found = 1; 1056 aac_state_struct->bs_format = LOAS_BSFORMAT; 1057 bytes_taken += *bytes_consumed; 1058 } 1059 1060 } while ((header_found == 0 && ((bytes_taken + 1) < (header_len - 68))) && 1061 run_once != 1); 1062 1063 if (header_found == 0 && disable_sync == 1) { 1064 WORD32 err_code; 1065 ixheaacd_read_bidirection(&it_bit_buff, -12); 1066 err_code = 1067 ixheaacd_ga_hdr_dec(aac_state_struct, header_len, bytes_consumed, 1068 pstr_samp_rate_info, handle_bit_buff); 1069 1070 if (err_code == 0) p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = 1; 1071 return err_code; 1072 } 1073 1074 switch (aac_state_struct->audio_object_type) { 1075 case AOT_AAC_MAIN: 1076 case AOT_AAC_LC: 1077 case AOT_AAC_SSR: 1078 case AOT_AAC_LTP: 1079 case AOT_AAC_SCAL: 1080 case AOT_TWIN_VQ: 1081 case AOT_ER_AAC_LD: 1082 case AOT_ER_AAC_ELD: 1083 case AOT_ER_AAC_LC: 1084 case AOT_USAC: 1085 break; 1086 default: 1087 return IA_ENHAACPLUS_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED; 1088 } 1089 1090 if (aac_state_struct->audio_object_type != AOT_USAC) 1091 aac_state_struct->usac_flag = 0; 1092 *bytes_consumed = bytes_taken; 1093 1094 if ((handle_bit_buff->cnt_bits < 0) && 1095 (handle_bit_buff->size < 1096 (usr_max_ch * (IA_ENHAACPLUS_DEC_INP_BUF_SIZE << 3)))) { 1097 return (WORD16)( 1098 (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES); 1099 } 1100 1101 if (header_found == 0) { 1102 *bytes_consumed = bytes_taken + 1; 1103 return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START; 1104 } else { 1105 return 0; 1106 } 1107 } 1108 } 1109