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 21 #include <stdlib.h> 22 #include <stdio.h> 23 #include <string.h> 24 25 #include <ixheaacd_type_def.h> 26 #include "ixheaacd_constants.h" 27 #include <ixheaacd_basic_ops32.h> 28 #include <ixheaacd_basic_ops16.h> 29 #include <ixheaacd_basic_ops40.h> 30 31 #include "ixheaacd_defines.h" 32 #include <ixheaacd_aac_rom.h> 33 #include "ixheaacd_audioobjtypes.h" 34 35 #include "ixheaacd_bitbuffer.h" 36 #include "ixheaacd_pulsedata.h" 37 #include "ixheaacd_pns.h" 38 #include "ixheaacd_lt_predict.h" 39 #include "ixheaacd_channelinfo.h" 40 #include "ixheaacd_cnst.h" 41 #include "ixheaacd_tns.h" 42 #include "ixheaacd_aac_imdct.h" 43 44 static const WORD32 ixheaacd_codebook_Q30[8] = { 45 612922971, 747985734, 872956397, 978505219, 46 1057528322, 1146642451, 1282693056, 1470524861}; 47 48 #define SHIFT_VAL 8 49 #define SHIFT_VAL1 (15 - SHIFT_VAL) 50 51 VOID ixheaacd_lt_prediction( 52 ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, ltp_info *ltp, 53 WORD32 *spec, ia_aac_dec_tables_struct *aac_tables_ptr, 54 UWORD16 win_shape_prev, UWORD32 sr_index, UWORD32 object_type, 55 UWORD32 frame_len, WORD32 *in_data, WORD32 *out_data) { 56 ia_ics_info_struct *ptr_ics_info = &ptr_aac_dec_channel_info->str_ics_info; 57 WORD16 *lt_pred_stat = ptr_aac_dec_channel_info->ltp_buf; 58 UWORD16 win_shape = ptr_aac_dec_channel_info->str_ics_info.window_shape; 59 WORD16 sfb; 60 WORD16 bin, i, num_samples; 61 const WORD8 *swb_offset = aac_tables_ptr->scale_factor_bands_long[sr_index]; 62 WORD32 *ptr_spec = &spec[0]; 63 WORD32 *ptr_x_est = &out_data[0]; 64 65 if (512 == ptr_ics_info->frame_length) { 66 swb_offset = aac_tables_ptr->scale_fac_bands_512[sr_index]; 67 } else if (480 == ptr_ics_info->frame_length) { 68 swb_offset = aac_tables_ptr->scale_fac_bands_480[sr_index]; 69 } 70 71 if (ptr_ics_info->window_sequence != EIGHT_SHORT_SEQUENCE) { 72 if (ltp->data_present) { 73 num_samples = frame_len << 1; 74 75 for (i = 0; i < num_samples; i++) { 76 in_data[i] = 77 ixheaacd_shr32(ixheaacd_mult32x16in32_shl_sat( 78 ixheaacd_codebook_Q30[ltp->coef], 79 lt_pred_stat[num_samples + i - ltp->lag]), 80 SHIFT_VAL); 81 } 82 83 ixheaacd_filter_bank_ltp(aac_tables_ptr, ptr_ics_info->window_sequence, 84 win_shape, win_shape_prev, in_data, out_data, 85 object_type, frame_len); 86 87 if (ptr_aac_dec_channel_info->str_tns_info.tns_data_present == 1) 88 ixheaacd_aac_tns_process(ptr_aac_dec_channel_info, 1, aac_tables_ptr, 89 object_type, 0, out_data); 90 91 for (sfb = 0; sfb < ltp->last_band; sfb++) { 92 WORD8 sfb_width = swb_offset[sfb]; 93 if (ltp->long_used[sfb]) { 94 for (bin = sfb_width - 1; bin >= 0; bin--) { 95 WORD32 temp = *ptr_spec; 96 temp = ixheaacd_add32_sat(temp, 97 ixheaacd_shr32(*ptr_x_est++, SHIFT_VAL1)); 98 *ptr_spec++ = temp; 99 } 100 } else { 101 ptr_spec += sfb_width; 102 ptr_x_est += sfb_width; 103 } 104 } 105 } 106 } 107 } 108 109 VOID ixheaacd_filter_bank_ltp(ia_aac_dec_tables_struct *aac_tables_ptr, 110 WORD16 window_sequence, WORD16 window_shape, 111 WORD16 window_shape_prev, WORD32 *in_data, 112 WORD32 *out_mdct, UWORD32 object_type, 113 UWORD32 frame_len) { 114 WORD32 i; 115 116 const WORD16 *window_long = NULL; 117 const WORD16 *window_long_prev = NULL; 118 const WORD16 *window_short = NULL; 119 const WORD16 *window_short_prev = NULL; 120 121 UWORD16 nlong = frame_len; 122 UWORD16 nlong2 = frame_len << 1; 123 UWORD16 nshort = frame_len / 8; 124 UWORD16 nflat_ls = (nlong - nshort) / 2; 125 WORD32 imdct_scale = 0; 126 WORD32 expo = 0; 127 128 if (object_type == AOT_ER_AAC_LD) { 129 if (!window_shape) { 130 if (512 == frame_len) { 131 window_long = 132 (WORD16 *)aac_tables_ptr->pstr_imdct_tables->window_sine_512; 133 } else { 134 window_long = 135 (WORD16 *)aac_tables_ptr->pstr_imdct_tables->window_sine_480; 136 } 137 } else { 138 if (512 == frame_len) { 139 window_long = 140 (WORD16 *)aac_tables_ptr->pstr_imdct_tables->low_overlap_win; 141 } else { 142 window_long = 143 (WORD16 *)aac_tables_ptr->pstr_imdct_tables->low_overlap_win_480; 144 } 145 } 146 147 if (!window_shape_prev) { 148 if (512 == frame_len) { 149 window_long_prev = 150 (WORD16 *)aac_tables_ptr->pstr_imdct_tables->window_sine_512; 151 } else { 152 window_long_prev = 153 (WORD16 *)aac_tables_ptr->pstr_imdct_tables->window_sine_480; 154 } 155 } else { 156 if (512 == frame_len) { 157 window_long_prev = 158 (WORD16 *)aac_tables_ptr->pstr_imdct_tables->low_overlap_win; 159 } else { 160 window_long_prev = 161 (WORD16 *)aac_tables_ptr->pstr_imdct_tables->low_overlap_win_480; 162 } 163 } 164 165 if (!window_shape) 166 window_short = aac_tables_ptr->pstr_imdct_tables->only_short_window_sine; 167 else 168 window_short = aac_tables_ptr->pstr_imdct_tables->only_short_window_kbd; 169 if (!window_shape_prev) 170 window_short_prev = 171 aac_tables_ptr->pstr_imdct_tables->only_short_window_sine; 172 else 173 window_short_prev = 174 aac_tables_ptr->pstr_imdct_tables->only_short_window_kbd; 175 176 } else { 177 if (!window_shape) 178 window_long = aac_tables_ptr->pstr_imdct_tables->only_long_window_sine; 179 else 180 window_long = aac_tables_ptr->pstr_imdct_tables->only_long_window_kbd; 181 if (!window_shape_prev) 182 window_long_prev = 183 aac_tables_ptr->pstr_imdct_tables->only_long_window_sine; 184 else 185 window_long_prev = 186 aac_tables_ptr->pstr_imdct_tables->only_long_window_kbd; 187 188 if (!window_shape) 189 window_short = aac_tables_ptr->pstr_imdct_tables->only_short_window_sine; 190 else 191 window_short = aac_tables_ptr->pstr_imdct_tables->only_short_window_kbd; 192 if (!window_shape_prev) 193 window_short_prev = 194 aac_tables_ptr->pstr_imdct_tables->only_short_window_sine; 195 else 196 window_short_prev = 197 aac_tables_ptr->pstr_imdct_tables->only_short_window_kbd; 198 } 199 200 switch (window_sequence) { 201 case ONLY_LONG_SEQUENCE: 202 203 if ((512 != nlong) && (480 != nlong)) { 204 for (i = 0; i<nlong>> 1; i++) { 205 in_data[i] = 206 ixheaacd_mult32x16in32_shl(in_data[i], window_long_prev[2 * i]); 207 208 in_data[i + nlong] = ixheaacd_mult32x16in32_shl( 209 in_data[i + nlong], window_long[2 * i + 1]); 210 } 211 for (i = 0; i<nlong>> 1; i++) { 212 in_data[i + (nlong >> 1)] = ixheaacd_mult32x16in32_shl( 213 in_data[i + (nlong >> 1)], window_long_prev[nlong - 1 - 2 * i]); 214 215 in_data[i + nlong + (nlong >> 1)] = 216 ixheaacd_mult32x16in32_shl(in_data[i + nlong + (nlong >> 1)], 217 window_long[nlong - 1 - 2 * i - 1]); 218 } 219 220 } else { 221 WORD32 *win1, *win2, *win3; 222 WORD32 *ptr_in1, *ptr_in2; 223 win1 = (WORD32 *)window_long_prev; 224 win2 = (WORD32 *)window_long; 225 ptr_in1 = &in_data[0]; 226 ptr_in2 = &in_data[nlong]; 227 win3 = win2 + nlong - 1; 228 229 for (i = nlong - 1; i >= 0; i--) { 230 WORD32 temp1 = ixheaacd_mult32_shl(*ptr_in1, *win1++); 231 WORD32 temp2 = ixheaacd_mult32_shl(*ptr_in2, win2[i]); 232 233 *ptr_in1++ = temp1; 234 *ptr_in2++ = temp2; 235 } 236 } 237 238 for (i = 0; i < nlong / 2; i++) { 239 out_mdct[nlong / 2 + i] = 240 ixheaacd_sub32(in_data[i], in_data[nlong - 1 - i]); 241 out_mdct[i] = (-ixheaacd_add32(in_data[nlong + i + nlong / 2], 242 in_data[nlong2 - nlong / 2 - 1 - i])); 243 } 244 245 if (512 == nlong || (480 == nlong)) { 246 if (512 == nlong) 247 ixheaacd_inverse_transform_512( 248 out_mdct, in_data, &imdct_scale, 249 aac_tables_ptr->pstr_imdct_tables->cosine_array_1024, 250 aac_tables_ptr->pstr_imdct_tables, object_type); 251 252 else 253 ixheaacd_mdct_480_ld(out_mdct, in_data, &imdct_scale, 1, 254 aac_tables_ptr->pstr_imdct_tables, object_type); 255 256 imdct_scale += 1; 257 258 if (imdct_scale > 0) { 259 WORD32 *ptr_out_mdct = &out_mdct[0]; 260 261 for (i = nlong - 1; i >= 0; i -= 4) { 262 *ptr_out_mdct = ixheaacd_shl32(*ptr_out_mdct, imdct_scale); 263 ptr_out_mdct++; 264 *ptr_out_mdct = ixheaacd_shl32(*ptr_out_mdct, imdct_scale); 265 ptr_out_mdct++; 266 *ptr_out_mdct = ixheaacd_shl32(*ptr_out_mdct, imdct_scale); 267 ptr_out_mdct++; 268 *ptr_out_mdct = ixheaacd_shl32(*ptr_out_mdct, imdct_scale); 269 ptr_out_mdct++; 270 } 271 } else if (imdct_scale < 0) { 272 WORD32 *ptr_out_mdct = &out_mdct[0]; 273 imdct_scale = -imdct_scale; 274 for (i = nlong - 1; i >= 0; i -= 4) { 275 *ptr_out_mdct = ixheaacd_shr32(*ptr_out_mdct, imdct_scale); 276 ptr_out_mdct++; 277 *ptr_out_mdct = ixheaacd_shr32(*ptr_out_mdct, imdct_scale); 278 ptr_out_mdct++; 279 *ptr_out_mdct = ixheaacd_shr32(*ptr_out_mdct, imdct_scale); 280 ptr_out_mdct++; 281 *ptr_out_mdct = ixheaacd_shr32(*ptr_out_mdct, imdct_scale); 282 ptr_out_mdct++; 283 } 284 } 285 } 286 287 else if (1024 == nlong) { 288 expo = ixheaacd_calc_max_spectral_line_dec(out_mdct, 1024) - 1; 289 290 expo = 8 - expo; 291 292 imdct_scale = ixheaacd_inverse_transform( 293 out_mdct, in_data, aac_tables_ptr->pstr_imdct_tables, expo, 1024); 294 295 ixheaacd_post_twiddle_dec(in_data, out_mdct, 296 aac_tables_ptr->pstr_imdct_tables, 1024); 297 298 imdct_scale += 1; 299 300 for (i = 0; i < nlong; i++) { 301 out_mdct[i] = ixheaacd_shl32_dir(in_data[i], imdct_scale); 302 } 303 } 304 305 break; 306 307 case LONG_START_SEQUENCE: 308 309 for (i = 0; i<nlong>> 1; i++) 310 in_data[i] = 311 ixheaacd_mult32x16in32_shl(in_data[i], window_long_prev[2 * i]); 312 313 for (i = 0; i<nlong>> 1; i++) 314 in_data[i + (nlong >> 1)] = ixheaacd_mult32x16in32_shl( 315 in_data[i + (nlong >> 1)], window_long_prev[nlong - 1 - 2 * i - 1]); 316 317 for (i = 0; i<nshort>> 1; i++) 318 in_data[i + nlong + nflat_ls + (nshort >> 1)] = 319 ixheaacd_mult32x16in32_shl( 320 in_data[i + nlong + nflat_ls + (nshort >> 1)], 321 window_short[nshort - 1 - 2 * i - 1]); 322 323 for (i = 0; i < nflat_ls; i++) in_data[i + nlong + nflat_ls + nshort] = 0; 324 325 for (i = 0; i < nlong / 2; i++) { 326 out_mdct[nlong / 2 + i] = 327 ixheaacd_sub32(in_data[i], in_data[nlong - 1 - i]); 328 out_mdct[nlong / 2 - 1 - i] = 329 -ixheaacd_add32(in_data[nlong + i], in_data[nlong2 - 1 - i]); 330 } 331 332 { 333 expo = ixheaacd_calc_max_spectral_line_dec(out_mdct, 1024) - 1; 334 335 expo = 8 - expo; 336 imdct_scale = ixheaacd_inverse_transform( 337 out_mdct, in_data, aac_tables_ptr->pstr_imdct_tables, expo, 1024); 338 339 ixheaacd_post_twiddle_dec(in_data, out_mdct, 340 aac_tables_ptr->pstr_imdct_tables, 1024); 341 } 342 343 imdct_scale += 1; 344 345 for (i = 0; i < nlong; i++) { 346 out_mdct[i] = ixheaacd_shl32_dir(in_data[i], imdct_scale); 347 } 348 break; 349 350 case LONG_STOP_SEQUENCE: 351 for (i = 0; i < nflat_ls; i++) in_data[i] = 0; 352 353 for (i = 0; i<nshort>> 1; i++) 354 in_data[i + nflat_ls] = ixheaacd_mult32x16in32_shl( 355 in_data[i + nflat_ls], window_short_prev[2 * i]); 356 357 for (i = 0; i<nshort>> 1; i++) 358 in_data[i + nflat_ls + (nshort >> 1)] = 359 ixheaacd_mult32x16in32_shl(in_data[i + nflat_ls + (nshort >> 1)], 360 window_short_prev[127 - 2 * i]); 361 362 for (i = 0; i<nlong>> 1; i++) 363 in_data[i + nlong] = ixheaacd_mult32x16in32_shl(in_data[i + nlong], 364 window_long[2 * i + 1]); 365 366 for (i = 0; i<nlong>> 1; i++) 367 in_data[i + nlong + (nlong >> 1)] = 368 ixheaacd_mult32x16in32_shl(in_data[i + nlong + (nlong >> 1)], 369 window_long[nlong - 1 - 2 * i - 1]); 370 371 for (i = 0; i < nlong / 2; i++) { 372 out_mdct[nlong / 2 + i] = 373 ixheaacd_sub32(in_data[i], in_data[nlong - 1 - i]); 374 out_mdct[nlong / 2 - 1 - i] = 375 -ixheaacd_add32(in_data[nlong + i], in_data[nlong2 - 1 - i]); 376 } 377 378 { 379 expo = ixheaacd_calc_max_spectral_line_dec(out_mdct, 1024) - 1; 380 381 expo = 8 - expo; 382 imdct_scale = ixheaacd_inverse_transform( 383 out_mdct, in_data, aac_tables_ptr->pstr_imdct_tables, expo, 1024); 384 385 ixheaacd_post_twiddle_dec(in_data, out_mdct, 386 aac_tables_ptr->pstr_imdct_tables, 1024); 387 } 388 389 imdct_scale += 1; 390 391 for (i = 0; i < nlong; i++) { 392 out_mdct[i] = ixheaacd_shl32_dir(in_data[i], imdct_scale); 393 } 394 395 break; 396 } 397 } 398 399 VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, WORD16 *time, 400 WORD32 *overlap, WORD32 frame_len, 401 WORD32 object_type, WORD32 stride, 402 WORD16 window_sequence, WORD16 *p_window_next) { 403 WORD32 i; 404 if (object_type == AOT_ER_AAC_LD) { 405 WORD16 *ptr_ltp_state0 = <_pred_stat[0]; 406 WORD16 *ptr_ltp_state_fl = <_pred_stat[frame_len + 0]; 407 WORD16 *ptr_ltp_state_2fl = <_pred_stat[(frame_len * 2) + 0]; 408 WORD16 *ptr_time_in = &time[0 * stride]; 409 410 for (i = 0; i < frame_len; i++) { 411 *ptr_ltp_state0++ = *ptr_ltp_state_fl; 412 *ptr_ltp_state_fl++ = *ptr_ltp_state_2fl; 413 *ptr_ltp_state_2fl++ = *ptr_time_in; 414 ptr_time_in += stride; 415 } 416 417 } else { 418 WORD16 *ptr_ltp_state0 = <_pred_stat[0]; 419 WORD16 *ptr_ltp_state_fl = <_pred_stat[frame_len + 0]; 420 WORD16 *ptr_time_in = &time[0 * stride]; 421 422 for (i = 0; i < frame_len; i++) { 423 *ptr_ltp_state0++ = *ptr_ltp_state_fl; 424 *ptr_ltp_state_fl++ = *ptr_time_in; 425 ptr_time_in += stride; 426 } 427 } 428 429 if ((window_sequence == ONLY_LONG_SEQUENCE) || 430 (window_sequence == LONG_STOP_SEQUENCE)) { 431 if (512 == frame_len) { 432 WORD32 *window = (WORD32 *)p_window_next; 433 434 for (i = 0; i < 256; i++) { 435 lt_pred_stat[(frame_len * 3) + i] = 436 ixheaacd_round16(ixheaacd_mult16x16in32_shl( 437 (WORD16)ixheaacd_shl16( 438 (WORD16)-ixheaacd_sat16(overlap[255 - i]), 1), 439 (WORD16)ixheaacd_shr32(window[511 - i], 15))); 440 441 lt_pred_stat[(frame_len * 3) + 256 + i] = 442 ixheaacd_round16(ixheaacd_mult16x16in32_shl( 443 (WORD16)ixheaacd_shl16((WORD16)-ixheaacd_sat16(overlap[i]), 1), 444 (WORD16)ixheaacd_shr32(window[255 - i], 15))); 445 } 446 } else if (480 == frame_len) { 447 WORD32 *window = (WORD32 *)p_window_next; 448 449 for (i = 0; i < 240; i++) { 450 lt_pred_stat[(frame_len * 3) + i] = 451 ixheaacd_round16(ixheaacd_mult16x16in32_shl( 452 (WORD16)ixheaacd_shl16( 453 (WORD16)-ixheaacd_sat16(overlap[239 - i]), 1), 454 (WORD16)ixheaacd_shr32(window[479 - i], 15))); 455 456 lt_pred_stat[(frame_len * 3) + 240 + i] = 457 ixheaacd_round16(ixheaacd_mult16x16in32_shl( 458 (WORD16)ixheaacd_shl16((WORD16)-ixheaacd_sat16(overlap[i]), 1), 459 (WORD16)ixheaacd_shr32(window[239 - i], 15))); 460 } 461 } else { 462 for (i = 0; i < 512; i++) { 463 lt_pred_stat[(frame_len * 2) + i] = ixheaacd_round16( 464 ixheaacd_shl32_sat(ixheaacd_mult16x16in32_shl( 465 (WORD16)-ixheaacd_sat16(overlap[511 - i]), 466 p_window_next[2 * i + 1]), 467 1)); 468 469 lt_pred_stat[(frame_len * 2) + 512 + i] = 470 ixheaacd_round16(ixheaacd_shl32_sat( 471 ixheaacd_mult16x16in32_shl((WORD16)-ixheaacd_sat16(overlap[i]), 472 p_window_next[1023 - 2 * i - 1]), 473 1)); 474 } 475 } 476 477 } else if (window_sequence == LONG_START_SEQUENCE) { 478 for (i = 0; i < 448; i++) { 479 lt_pred_stat[(frame_len * 2) + i] = 480 ixheaacd_shl16((WORD16)-ixheaacd_sat16(overlap[511 - i]), 1); 481 } 482 for (i = 0; i < 64; i++) { 483 lt_pred_stat[(frame_len * 2) + 448 + i] = 484 ixheaacd_round16(ixheaacd_shl32_sat( 485 ixheaacd_mult16x16in32_shl( 486 (WORD16)-ixheaacd_sat16(overlap[511 - 448 - i]), 487 p_window_next[2 * i + 1]), 488 1)); 489 } 490 for (i = 0; i < 64; i++) { 491 lt_pred_stat[(frame_len * 2) + 512 + i] = 492 ixheaacd_round16(ixheaacd_shl32_sat( 493 ixheaacd_mult16x16in32_shl((WORD16)-ixheaacd_sat16(overlap[i]), 494 p_window_next[127 - 2 * i - 1]), 495 1)); 496 } 497 for (i = 576; i < 1024; i++) { 498 lt_pred_stat[(frame_len * 2) + i] = 0; 499 } 500 } else { 501 for (i = 0; i < 448; i++) { 502 lt_pred_stat[(frame_len * 2) + i] = 503 ixheaacd_shl16(ixheaacd_sat16(overlap[i]), 1); 504 } 505 for (i = 0; i < 64; i++) { 506 lt_pred_stat[(frame_len * 2) + 448 + i] = ixheaacd_round16( 507 ixheaacd_shl32_sat(ixheaacd_mult16x16in32_shl( 508 (WORD16)-ixheaacd_sat16(overlap[511 - i]), 509 p_window_next[2 * i + 1]), 510 1)); 511 } 512 for (i = 0; i < 64; i++) { 513 lt_pred_stat[(frame_len * 2) + 512 + i] = ixheaacd_round16( 514 ixheaacd_shl32_sat(ixheaacd_mult16x16in32_shl( 515 (WORD16)-ixheaacd_sat16(overlap[448 + i]), 516 p_window_next[127 - 2 * i - 1]), 517 1)); 518 } 519 for (i = 576; i < 1024; i++) { 520 lt_pred_stat[(frame_len * 2) + i] = 0; 521 } 522 } 523 } 524