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 <math.h> 21 #include <ixheaacd_type_def.h> 22 #include "ixheaacd_bitbuffer.h" 23 #include "ixheaacd_config.h" 24 25 #include "ixheaacd_mps_polyphase.h" 26 27 #include "ixheaacd_mps_dec.h" 28 #include "ixheaacd_mps_interface.h" 29 #include "ixheaacd_mps_nlc_dec.h" 30 #include "ixheaacd_mps_hybfilter.h" 31 32 #include <assert.h> 33 #include <stdio.h> 34 35 #define min(a, b) ((a) < (b) ? (a) : (b)) 36 37 #define max(a, b) ((a) > (b) ? (a) : (b)) 38 39 static int ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4}; 40 41 static int 42 ixheaacd_hybrid_band_71_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] = { 43 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 44 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}; 46 47 static int 48 ixheaacd_hybrid_band_71_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] = { 49 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 50 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 51 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; 52 53 static int 54 ixheaacd_hybrid_band_71_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] = { 55 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 56 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 57 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}; 58 59 static int 60 ixheaacd_hybrid_band_71_to_processing_band_10_map[MAX_HYBRID_BANDS_MPS] = { 61 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 62 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 63 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; 64 65 static int 66 ixheaacd_hybrid_band_71_to_processing_band_14_map[MAX_HYBRID_BANDS_MPS] = { 67 0, 0, 0, 0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 68 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 69 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 70 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}; 71 72 int ixheaacd_hybrid_band_71_to_processing_band_20_map[MAX_HYBRID_BANDS_MPS] = { 73 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 74 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 75 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 76 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}; 77 78 int ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS] = { 79 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 80 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 81 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 82 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}; 83 84 static float ixheaacd_mps_clip_gain_table[] = {1.000000f, 1.189207f, 1.414213f, 85 1.681792f, 2.000000f, 2.378414f, 86 2.828427f, 4.000000f}; 87 88 static int ixheaacd_mps_stride_table[] = {1, 2, 5, 28}; 89 90 static float ixheaacd_cld_de_quant_table[] = { 91 -150.0, -45.0, -40.0, -35.0, -30.0, -25.0, -22.0, -19.0, 92 -16.0, -13.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0, 93 2.0, 4.0, 6.0, 8.0, 10.0, 13.0, 16.0, 19.0, 94 22.0, 25.0, 30.0, 35.0, 40.0, 45.0, 150.0}; 95 96 static float ixheaacd_icc_de_quant_table[] = { 97 1.0000f, 0.9370f, 0.84118f, 0.60092f, 0.36764f, 0.0f, -0.5890f, -0.9900f}; 98 99 float ixheaacd_ipd_de_quant_table[] = { 100 0.f, 0.392699082f, 0.785398163f, 1.178097245f, 101 1.570796327f, 1.963495408f, 2.35619449f, 2.748893572f, 102 3.141592654f, 3.534291735f, 3.926990817f, 4.319689899f, 103 4.71238898f, 5.105088062f, 5.497787144f, 5.890486225f}; 104 int ixheaacd_ipd_de_quant_table_q28[] = { 105 0, 105414360, 210828720, 316243072, 421657440, 527071776, 106 632486144, 737900480, 843314880, 948729216, 1054143552, 1159557888, 107 1264972288, 1370386688, 1475800960, 1581215360}; 108 static int ixheaacd_smoothing_time_table[] = {64, 128, 256, 512}; 109 110 static int ixheaacd_inverse_smoothing_time_table_q30[] = {16777216, 8388608, 111 4194304, 2097152}; 112 113 static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) { 114 var = min(var, upper_bound); 115 var = max(var, lower_bound); 116 return var; 117 } 118 119 static VOID ixheaacd_longmult1(unsigned short a[], unsigned short b, 120 unsigned short d[], int len) { 121 int k; 122 UWORD32 tmp; 123 UWORD32 b0 = (UWORD32)b; 124 125 tmp = ((UWORD32)a[0]) * b0; 126 d[0] = (unsigned short)tmp; 127 128 for (k = 1; k < len; k++) { 129 tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0; 130 d[k] = (unsigned short)tmp; 131 } 132 } 133 134 static VOID ixheaacd_longdiv(unsigned short b[], unsigned short a, 135 unsigned short d[], unsigned short *pr, int len) { 136 UWORD32 r; 137 UWORD32 tmp; 138 UWORD32 temp; 139 int k; 140 141 assert(a != 0); 142 143 r = 0; 144 145 for (k = len - 1; k >= 0; k--) { 146 tmp = ((UWORD32)b[k]) + (r << 16); 147 148 if (tmp) { 149 d[k] = (unsigned short)(tmp / a); 150 temp = d[k] * a; 151 r = tmp - temp; 152 } else { 153 d[k] = 0; 154 } 155 } 156 *pr = (unsigned short)r; 157 } 158 159 static VOID ixheaacd_longsub(unsigned short a[], unsigned short b[], int lena, 160 int lenb) { 161 int h; 162 WORD32 carry = 0; 163 164 assert(lena >= lenb); 165 for (h = 0; h < lenb; h++) { 166 carry = carry + (WORD32)(a[h] - b[h]); 167 a[h] = (unsigned short)carry; 168 carry = carry >> 16; 169 } 170 171 for (; h < lena; h++) { 172 carry = ((UWORD32)a[h]) + carry; 173 a[h] = (unsigned short)carry; 174 carry = carry >> 16; 175 } 176 177 assert(carry == 0); 178 return; 179 } 180 181 static int ixheaacd_longcompare(unsigned short a[], unsigned short b[], 182 int len) { 183 int i; 184 185 for (i = len - 1; i > 0; i--) { 186 if (a[i] != b[i]) break; 187 } 188 return (a[i] >= b[i]) ? 1 : 0; 189 } 190 191 static VOID ixheaacd_mps_coarse2fine(int *data, WORD32 data_type, 192 int band_start, int ixheaacd_num_bands) { 193 int i; 194 195 for (i = band_start; i < band_start + ixheaacd_num_bands; i++) { 196 data[i] <<= 1; 197 } 198 199 if (data_type == CLD) { 200 for (i = band_start; i < band_start + ixheaacd_num_bands; i++) { 201 if (data[i] == -14) 202 data[i] = -15; 203 else if (data[i] == 14) 204 data[i] = 15; 205 } 206 } 207 } 208 209 static VOID ixheaacd_mps_fine2coarse(int *data, int ixheaacd_num_bands) { 210 int i; 211 212 for (i = 0; i < ixheaacd_num_bands; i++) { 213 data[i] /= 2; 214 } 215 } 216 217 static int ixheaacd_mps_getstridemap(int freq_res_stride, int band_start, 218 int band_stop, int *strides) { 219 int i, pb, ch_fac, data_bands, start_offset; 220 221 ch_fac = ixheaacd_mps_stride_table[freq_res_stride]; 222 data_bands = (band_stop - band_start - 1) / ch_fac + 1; 223 224 strides[0] = band_start; 225 for (pb = 1; pb <= data_bands; pb++) { 226 strides[pb] = strides[pb - 1] + ch_fac; 227 } 228 start_offset = 0; 229 while (strides[data_bands] > band_stop) { 230 if (start_offset < data_bands) 231 start_offset++; 232 else 233 start_offset = 1; 234 235 for (i = start_offset; i <= data_bands; i++) { 236 strides[i]--; 237 } 238 } 239 240 return data_bands; 241 } 242 243 static VOID ixheaacd_mps_ecdata_decoding( 244 ia_mps_dec_state_struct *self, ia_handle_bit_buf_struct bitstream, 245 int data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], int datatype) { 246 int i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx; 247 int strides[MAX_PARAMETER_BANDS + 1] = {0}; 248 int band_stop = 0; 249 250 int *lastdata = NULL; 251 ia_mps_data_struct *frame_xxx_data = NULL; 252 int default_val = 0; 253 254 ia_mps_bs_frame *frame = &(self->bs_frame); 255 256 if (datatype == 0) { 257 frame_xxx_data = &frame->cld_data; 258 lastdata = frame->cmp_cld_idx_prev; 259 band_stop = self->bs_param_bands; 260 } else if (datatype == 1) { 261 frame_xxx_data = &frame->icc_data; 262 lastdata = frame->cmp_icc_idx_prev; 263 band_stop = self->bs_param_bands; 264 } else if (datatype == 2) { 265 frame_xxx_data = &frame->ipd_data; 266 lastdata = frame->ipd_idx_data_prev; 267 band_stop = self->num_bands_ipd; 268 } else { 269 frame_xxx_data = &frame->cld_data; 270 lastdata = frame->cmp_cld_idx_prev; 271 band_stop = self->bs_param_bands; 272 } 273 274 for (i = 0; i < self->num_parameter_sets; i++) { 275 frame_xxx_data->bs_xxx_data_mode[i] = ixheaacd_read_bits_buf(bitstream, 2); 276 } 277 278 set_index = 0; 279 bs_data_pair = 0; 280 old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev; 281 282 for (i = 0; i < self->num_parameter_sets; i++) { 283 if (frame_xxx_data->bs_xxx_data_mode[i] == 0) { 284 for (pb = 0; pb < band_stop; pb++) { 285 lastdata[pb] = default_val; 286 } 287 288 old_quant_coarse_xxx = 0; 289 } 290 291 if (frame_xxx_data->bs_xxx_data_mode[i] == 3) { 292 if (bs_data_pair) { 293 bs_data_pair = 0; 294 } else { 295 bs_data_pair = ixheaacd_read_bits_buf(bitstream, 1); 296 frame_xxx_data->bs_quant_coarse_xxx[set_index] = 297 ixheaacd_read_bits_buf(bitstream, 1); 298 frame_xxx_data->bs_freq_res_stride_xxx[set_index] = 299 ixheaacd_read_bits_buf(bitstream, 2); 300 301 if (frame_xxx_data->bs_quant_coarse_xxx[set_index] != 302 old_quant_coarse_xxx) { 303 if (old_quant_coarse_xxx) { 304 ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0); 305 } else { 306 ixheaacd_mps_fine2coarse(lastdata, band_stop); 307 } 308 } 309 310 data_bands = ixheaacd_mps_getstridemap( 311 frame_xxx_data->bs_freq_res_stride_xxx[set_index], 0, band_stop, 312 strides); 313 314 for (pb = 0; pb < data_bands; pb++) { 315 lastdata[pb] = lastdata[strides[pb]]; 316 } 317 318 ixheaacd_mps_ecdatapairdec( 319 bitstream, data, lastdata, datatype, set_index, data_bands, 320 bs_data_pair, frame_xxx_data->bs_quant_coarse_xxx[set_index], 321 frame->independency_flag && (i == 0)); 322 323 for (pb = 0; pb < data_bands; pb++) { 324 for (j = strides[pb]; j < strides[pb + 1]; j++) { 325 if (datatype == IPD) { 326 if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) { 327 lastdata[j] = data[set_index + bs_data_pair][pb] & 7; 328 } else { 329 lastdata[j] = data[set_index + bs_data_pair][pb] & 15; 330 } 331 } else { 332 lastdata[j] = data[set_index + bs_data_pair][pb]; 333 } 334 } 335 } 336 337 old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index]; 338 339 if (bs_data_pair) { 340 frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] = 341 frame_xxx_data->bs_quant_coarse_xxx[set_index]; 342 frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] = 343 frame_xxx_data->bs_freq_res_stride_xxx[set_index]; 344 } 345 set_index += bs_data_pair + 1; 346 } 347 } 348 } 349 } 350 351 VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, 352 int usac_independency_flag, 353 ia_handle_bit_buf_struct bitstream) { 354 int i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch; 355 int ps, pg, ts, pb; 356 int env_shape_data[MAX_TIME_SLOTS]; 357 358 int bits_param_slot = 0; 359 360 ia_mps_bs_frame *frame = &(self->bs_frame); 361 362 if (self->parse_nxt_frame == 0) return; 363 364 self->num_parameter_sets_prev = self->num_parameter_sets; 365 366 if (self->bs_high_rate_mode) { 367 bs_frame_type = ixheaacd_read_bits_buf(bitstream, 1); 368 self->num_parameter_sets = ixheaacd_read_bits_buf(bitstream, 3) + 1; 369 } else { 370 bs_frame_type = 0; 371 self->num_parameter_sets = 1; 372 } 373 374 if (self->time_slots == 32) 375 bits_param_slot = 5; 376 else if (self->time_slots == 64) 377 bits_param_slot = 6; 378 379 if (bs_frame_type) { 380 for (i = 0; i < self->num_parameter_sets; i++) { 381 self->param_slots[i] = ixheaacd_read_bits_buf(bitstream, bits_param_slot); 382 } 383 } else { 384 self->param_slots[0] = self->time_slots - 1; 385 } 386 387 if (!usac_independency_flag) { 388 frame->independency_flag = ixheaacd_read_bits_buf(bitstream, 1); 389 } else { 390 frame->independency_flag = 1; 391 } 392 393 ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD); 394 ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC); 395 396 if (self->config->bs_phase_coding) { 397 self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1); 398 399 if (!self->bs_phase_mode) { 400 for (pb = 0; pb < self->num_bands_ipd; pb++) { 401 frame->ipd_idx_data_prev[pb] = 0; 402 for (i = 0; i < self->num_parameter_sets; i++) { 403 frame->ipd_idx_data[i][pb] = 0; 404 self->bs_frame.ipd_idx[i][pb] = 0; 405 } 406 self->bs_frame.ipd_idx_prev[pb] = 0; 407 } 408 self->opd_smoothing_mode = 0; 409 } else { 410 self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1); 411 ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data, IPD); 412 } 413 } 414 415 else { 416 self->bs_phase_mode = 0; 417 for (pb = 0; pb < self->num_bands_ipd; pb++) { 418 frame->ipd_idx_data_prev[pb] = 0; 419 for (i = 0; i < self->num_parameter_sets; i++) { 420 frame->ipd_idx_data[i][pb] = 0; 421 self->bs_frame.ipd_idx[i][pb] = 0; 422 } 423 self->bs_frame.ipd_idx_prev[pb] = 0; 424 } 425 self->opd_smoothing_mode = 0; 426 } 427 428 if (self->bs_high_rate_mode) { 429 for (ps = 0; ps < self->num_parameter_sets; ps++) { 430 frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(bitstream, 2); 431 if (frame->bs_smooth_mode[ps] >= 2) { 432 frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(bitstream, 2); 433 } 434 if (frame->bs_smooth_mode[ps] == 3) { 435 frame->bs_freq_res_stride_smg[ps] = 436 ixheaacd_read_bits_buf(bitstream, 2); 437 data_bands = 438 (self->bs_param_bands - 1) / 439 ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] + 440 1; 441 for (pg = 0; pg < data_bands; pg++) { 442 frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(bitstream, 1); 443 } 444 } 445 } 446 } else { 447 for (ps = 0; ps < self->num_parameter_sets; ps++) { 448 frame->bs_smooth_mode[ps] = 0; 449 } 450 } 451 452 for (i = 0; i < 2; i++) { 453 self->temp_shape_enable_ch_stp[i] = 0; 454 self->temp_shape_enable_ch_ges[i] = 0; 455 } 456 457 self->bs_tsd_enable = 0; 458 if (self->config->bs_temp_shape_config == 3) { 459 self->bs_tsd_enable = ixheaacd_read_bits_buf(bitstream, 1); 460 } else if (self->config->bs_temp_shape_config != 0) { 461 bs_temp_shape_enable = ixheaacd_read_bits_buf(bitstream, 1); 462 if (bs_temp_shape_enable) { 463 num_of_temp_shape_ch = 2; 464 switch (self->config->bs_temp_shape_config) { 465 case 1: 466 for (i = 0; i < num_of_temp_shape_ch; i++) { 467 self->temp_shape_enable_ch_stp[i] = 468 ixheaacd_read_bits_buf(bitstream, 1); 469 } 470 break; 471 case 2: 472 for (i = 0; i < num_of_temp_shape_ch; i++) { 473 self->temp_shape_enable_ch_ges[i] = 474 ixheaacd_read_bits_buf(bitstream, 1); 475 } 476 for (i = 0; i < num_of_temp_shape_ch; i++) { 477 if (self->temp_shape_enable_ch_ges[i]) { 478 ixheaacd_mps_huff_decode(bitstream, env_shape_data, 479 self->time_slots); 480 for (ts = 0; ts < self->time_slots; ts++) { 481 self->env_shape_data[i][ts] = (float)pow( 482 2, (float)env_shape_data[ts] / 483 (self->config->bs_env_quant_mode + 2) - 484 1); 485 } 486 } 487 } 488 break; 489 default: 490 assert(0); 491 } 492 } 493 } 494 495 if (self->bs_tsd_enable) { 496 unsigned short s[4]; 497 UWORD64 s_64; 498 unsigned short c[5]; 499 UWORD64 c_64; 500 unsigned short b; 501 unsigned short r[1]; 502 unsigned short table_64[] = {6, 11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 503 42, 44, 46, 48, 49, 51, 52, 53, 55, 56, 57, 504 58, 58, 59, 60, 60, 60, 61, 61, 61, 61}; 505 unsigned short table_32[] = {5, 9, 13, 16, 18, 20, 22, 24, 506 25, 26, 27, 28, 29, 29, 30, 30}; 507 unsigned short *tab = NULL; 508 int k; 509 unsigned short h; 510 WORD32 nbits_tr_slots = 0; 511 512 if (self->time_slots == 32) { 513 nbits_tr_slots = 4; 514 tab = table_32; 515 } else if (self->time_slots == 64) { 516 nbits_tr_slots = 5; 517 tab = table_64; 518 } 519 520 self->tsd_num_tr_slots = ixheaacd_read_bits_buf(bitstream, nbits_tr_slots); 521 self->tsd_num_tr_slots++; 522 self->tsd_codeword_len = tab[self->tsd_num_tr_slots - 1]; 523 524 if (self->tsd_codeword_len > 48) { 525 s[3] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 48); 526 s_64 = s[3]; 527 s[2] = ixheaacd_read_bits_buf(bitstream, 16); 528 s_64 = (s_64 << 16) | s[2]; 529 s[1] = ixheaacd_read_bits_buf(bitstream, 16); 530 s_64 = (s_64 << 16) | s[1]; 531 s[0] = ixheaacd_read_bits_buf(bitstream, 16); 532 s_64 = (s_64 << 16) | s[0]; 533 } else if (self->tsd_codeword_len > 32) { 534 s[3] = 0; 535 s_64 = s[3]; 536 s[2] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 32); 537 s_64 = (s_64 << 16) | s[2]; 538 s[1] = ixheaacd_read_bits_buf(bitstream, 16); 539 s_64 = (s_64 << 16) | s[1]; 540 s[0] = ixheaacd_read_bits_buf(bitstream, 16); 541 s_64 = (s_64 << 16) | s[0]; 542 } else if (self->tsd_codeword_len > 16) { 543 s[3] = 0; 544 s_64 = s[3]; 545 s[2] = 0; 546 s_64 = (s_64 << 16) | s[2]; 547 s[1] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len - 16); 548 s_64 = (s_64 << 16) | s[1]; 549 s[0] = ixheaacd_read_bits_buf(bitstream, 16); 550 s_64 = (s_64 << 16) | s[0]; 551 } else { 552 s[3] = 0; 553 s_64 = s[3]; 554 s[2] = 0; 555 s_64 = (s_64 << 16) | s[2]; 556 s[1] = 0; 557 s_64 = (s_64 << 16) | s[1]; 558 s[0] = ixheaacd_read_bits_buf(bitstream, self->tsd_codeword_len); 559 s_64 = (s_64 << 16) | s[0]; 560 } 561 562 { 563 int p = self->tsd_num_tr_slots; 564 565 for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0; 566 567 for (k = self->time_slots - 1; k >= 0; k--) { 568 if (p > k) { 569 for (; k >= 0; k--) self->bs_tsd_sep_data[k] = 1; 570 break; 571 } 572 573 c[0] = k - p + 1; 574 c_64 = c[0]; 575 for (i = 1; i < 5; i++) c[i] = 0; 576 577 for (h = 2; h <= p; h++) { 578 b = k - p + h; 579 c_64 = c_64 * (b / h); 580 ixheaacd_longmult1(c, b, c, 5); 581 b = h; 582 ixheaacd_longdiv(c, b, c, r, 5); 583 } 584 585 if (ixheaacd_longcompare(s, c, 4)) { 586 ixheaacd_longsub(s, c, 4, 4); 587 self->bs_tsd_sep_data[k] = 1; 588 p--; 589 if (p == 0) break; 590 } 591 } 592 } 593 594 for (i = 0; i < self->time_slots; i++) { 595 if (self->bs_tsd_sep_data[i]) 596 self->bs_tsd_tr_phase_data[i] = ixheaacd_read_bits_buf(bitstream, 3); 597 } 598 } 599 600 self->parse_nxt_frame = 0; 601 } 602 603 static VOID ixheaacd_mps_createmapping(int map[MAX_PARAMETER_BANDS + 1], 604 int band_start, int band_stop, 605 int ch_fac) { 606 int input_bands, out_bands, bands_achived, bands_diff, incr, k, i; 607 int vdk[MAX_PARAMETER_BANDS + 1]; 608 input_bands = band_stop - band_start; 609 out_bands = (input_bands - 1) / ch_fac + 1; 610 if (out_bands < 1) { 611 out_bands = 1; 612 } 613 614 bands_achived = out_bands * ch_fac; 615 bands_diff = input_bands - bands_achived; 616 for (i = 0; i < out_bands; i++) { 617 vdk[i] = ch_fac; 618 } 619 620 if (bands_diff > 0) { 621 incr = -1; 622 k = out_bands - 1; 623 } else { 624 incr = 1; 625 k = 0; 626 } 627 628 while (bands_diff != 0) { 629 vdk[k] = vdk[k] - incr; 630 k = k + incr; 631 bands_diff = bands_diff + incr; 632 if (k >= out_bands) { 633 if (bands_diff > 0) { 634 k = out_bands - 1; 635 } else if (bands_diff < 0) { 636 k = 0; 637 } 638 } 639 } 640 map[0] = band_start; 641 for (i = 0; i < out_bands; i++) { 642 map[i + 1] = map[i] + vdk[i]; 643 } 644 } 645 646 static VOID ixheaacd_mps_mapfrequency(int *in, int *out, int *map, 647 int data_bands) { 648 int i, j, band_start, band_stop, value; 649 int start_band_0 = map[0]; 650 651 for (i = 0; i < data_bands; i++) { 652 value = in[i + start_band_0]; 653 654 band_start = map[i]; 655 band_stop = map[i + 1]; 656 for (j = band_start; j < band_stop; j++) { 657 out[j] = value; 658 } 659 } 660 } 661 662 static float ixheaacd_mps_de_quantize(int value, int param_type) { 663 switch (param_type) { 664 case CLD: 665 return ixheaacd_cld_de_quant_table[value + 15]; 666 667 case ICC: 668 return ixheaacd_icc_de_quant_table[value]; 669 670 case IPD: 671 return ixheaacd_ipd_de_quant_table[(value & 15)]; 672 673 default: 674 assert(0); 675 return 0.0; 676 } 677 } 678 679 static WORD32 ixheaacd_mps_mapindexdata( 680 ia_mps_dec_state_struct *self, ia_mps_data_struct *frame_xxx_data, 681 float out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], 682 int out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], 683 int cmp_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], 684 int idx_prev[MAX_PARAMETER_BANDS], int param_type) { 685 int interpolate_local[MAX_PARAMETER_SETS_MPS] = {0}; 686 int map[MAX_PARAMETER_BANDS + 1]; 687 688 int set_index, i, band, parm_slot; 689 int data_bands, ch_fac; 690 int ps; 691 692 int i1, i2, x1, xi, x2; 693 int band_start = 0; 694 int ext_frame_flag = self->ext_frame_flag; 695 int *param_slots = self->param_slots; 696 int num_parameter_sets = self->num_parameter_sets; 697 int band_stop = self->bs_param_bands; 698 int default_val = 0; 699 700 set_index = 0; 701 702 for (i = 0; i < num_parameter_sets; i++) { 703 if (frame_xxx_data->bs_xxx_data_mode[i] == 0) { 704 frame_xxx_data->quant_coarse_xxx_flag[i] = 0; 705 for (band = band_start; band < band_stop; band++) { 706 out_idx_data[i][band] = default_val; 707 } 708 for (band = band_start; band < band_stop; band++) { 709 idx_prev[band] = out_idx_data[i][band]; 710 } 711 712 frame_xxx_data->bs_quant_coarse_xxx_prev = 0; 713 } 714 715 if (frame_xxx_data->bs_xxx_data_mode[i] == 1) { 716 for (band = band_start; band < band_stop; band++) { 717 out_idx_data[i][band] = idx_prev[band]; 718 } 719 frame_xxx_data->quant_coarse_xxx_flag[i] = 720 frame_xxx_data->bs_quant_coarse_xxx_prev; 721 } 722 723 if (frame_xxx_data->bs_xxx_data_mode[i] == 2) { 724 for (band = band_start; band < band_stop; band++) { 725 out_idx_data[i][band] = idx_prev[band]; 726 } 727 frame_xxx_data->quant_coarse_xxx_flag[i] = 728 frame_xxx_data->bs_quant_coarse_xxx_prev; 729 interpolate_local[i] = 1; 730 } else { 731 interpolate_local[i] = 0; 732 } 733 734 if (frame_xxx_data->bs_xxx_data_mode[i] == 3) { 735 parm_slot = i; 736 ch_fac = 737 ixheaacd_mps_stride_table[frame_xxx_data 738 ->bs_freq_res_stride_xxx[set_index]]; 739 data_bands = (band_stop - band_start - 1) / ch_fac + 1; 740 ixheaacd_mps_createmapping(map, band_start, band_stop, ch_fac); 741 ixheaacd_mps_mapfrequency(&cmp_idx_data[set_index][0], 742 &out_idx_data[parm_slot][0], map, data_bands); 743 744 for (band = band_start; band < band_stop; band++) { 745 idx_prev[band] = out_idx_data[parm_slot][band]; 746 } 747 748 frame_xxx_data->bs_quant_coarse_xxx_prev = 749 frame_xxx_data->bs_quant_coarse_xxx[set_index]; 750 frame_xxx_data->quant_coarse_xxx_flag[i] = 751 frame_xxx_data->bs_quant_coarse_xxx[set_index]; 752 753 set_index++; 754 } 755 } 756 757 for (i = 0; i < num_parameter_sets; i++) { 758 if (frame_xxx_data->quant_coarse_xxx_flag[i] == 1) { 759 ixheaacd_mps_coarse2fine(out_idx_data[i], param_type, band_start, 760 band_stop - band_start); 761 frame_xxx_data->quant_coarse_xxx_flag[i] = 0; 762 } 763 } 764 765 i1 = -1; 766 x1 = 0; 767 i2 = 0; 768 for (i = 0; i < num_parameter_sets; i++) { 769 if (interpolate_local[i] != 1) { 770 i1 = i; 771 } 772 i2 = i; 773 while (interpolate_local[i2] == 1) { 774 i2++; 775 } 776 if (i1 == -1) { 777 x1 = 0; 778 i1 = 0; 779 } else { 780 x1 = param_slots[i1]; 781 } 782 xi = param_slots[i]; 783 x2 = param_slots[i2]; 784 785 if (interpolate_local[i] == 1) { 786 if (i2 < num_parameter_sets) { 787 return -1; 788 } 789 for (band = band_start; band < band_stop; band++) { 790 int yi, y1, y2; 791 yi = 0; 792 y1 = out_idx_data[i1][band]; 793 y2 = out_idx_data[i2][band]; 794 if (param_type == IPD) { 795 if (y2 - y1 > 8) y1 += 16; 796 if (y1 - y2 > 8) y2 += 16; 797 798 if (x2 != x1) { 799 yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16; 800 } 801 } else { 802 if (x2 != x1) { 803 yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1); 804 } 805 } 806 out_idx_data[i][band] = yi; 807 } 808 } 809 } 810 811 for (ps = 0; ps < num_parameter_sets; ps++) { 812 for (band = band_start; band < band_stop; band++) { 813 if (param_type == CLD) { 814 out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15); 815 } else if (param_type == ICC) // param_type is ICC 816 { 817 out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7); 818 } 819 out_data[ps][band] = 820 ixheaacd_mps_de_quantize(out_idx_data[ps][band], param_type); 821 } 822 } 823 824 if (ext_frame_flag) { 825 for (band = band_start; band < band_stop; band++) { 826 out_data[num_parameter_sets][band] = 827 out_data[num_parameter_sets - 1][band]; 828 out_idx_data[num_parameter_sets][band] = 829 out_idx_data[num_parameter_sets - 1][band]; 830 } 831 } 832 833 return 0; 834 } 835 836 static WORD32 ixheaacd_mps_dec_and_mapframeott(ia_mps_dec_state_struct *self) { 837 ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame); 838 WORD32 err_code = 0; 839 840 err_code = ixheaacd_mps_mapindexdata( 841 self, &cur_bit_stream_ptr->cld_data, self->cld_data, 842 cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx, 843 cur_bit_stream_ptr->cld_idx_pre, CLD); 844 if (err_code != 0) return err_code; 845 846 err_code = ixheaacd_mps_mapindexdata( 847 self, &cur_bit_stream_ptr->icc_data, self->icc_data, 848 cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx, 849 cur_bit_stream_ptr->icc_idx_pre, ICC); 850 if (err_code != 0) return err_code; 851 if ((self->config->bs_phase_coding)) { 852 err_code = ixheaacd_mps_mapindexdata( 853 self, &cur_bit_stream_ptr->ipd_data, self->ipd_data, 854 cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data, 855 cur_bit_stream_ptr->ipd_idx_prev, IPD); 856 857 if (err_code != 0) return err_code; 858 } 859 860 return 0; 861 } 862 863 static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) { 864 int ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop, 865 group_to_band[MAX_PARAMETER_BANDS + 1]; 866 ia_mps_bs_frame *frame = &(self->bs_frame); 867 for (ps = 0; ps < self->num_parameter_sets; ps++) { 868 switch (frame->bs_smooth_mode[ps]) { 869 case 0: 870 self->smoothing_time[ps] = 256; 871 self->inv_smoothing_time[ps] = 4194304; 872 873 for (pb = 0; pb < self->bs_param_bands; pb++) { 874 self->smoothing_data[ps][pb] = 0; 875 } 876 break; 877 878 case 1: 879 if (ps > 0) { 880 self->smoothing_time[ps] = self->smoothing_time[ps - 1]; 881 self->inv_smoothing_time[ps] = self->inv_smoothing_time[ps - 1]; 882 } else { 883 self->smoothing_time[ps] = self->smoothing_filt_state.prev_smg_time; 884 self->inv_smoothing_time[ps] = 885 self->smoothing_filt_state.inv_prev_smg_time; 886 } 887 888 for (pb = 0; pb < self->bs_param_bands; pb++) { 889 if (ps > 0) 890 self->smoothing_data[ps][pb] = self->smoothing_data[ps - 1][pb]; 891 else 892 self->smoothing_data[ps][pb] = 893 self->smoothing_filt_state.prev_smg_data[pb]; 894 } 895 break; 896 897 case 2: 898 self->smoothing_time[ps] = 899 ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]]; 900 self->inv_smoothing_time[ps] = 901 ixheaacd_inverse_smoothing_time_table_q30[frame 902 ->bs_smooth_time[ps]]; 903 for (pb = 0; pb < self->bs_param_bands; pb++) { 904 self->smoothing_data[ps][pb] = 1; 905 } 906 break; 907 908 case 3: 909 self->smoothing_time[ps] = 910 ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]]; 911 self->inv_smoothing_time[ps] = 912 ixheaacd_inverse_smoothing_time_table_q30[frame 913 ->bs_smooth_time[ps]]; 914 915 ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]]; 916 data_bands = (self->bs_param_bands - 1) / ch_fac + 1; 917 ixheaacd_mps_createmapping(group_to_band, 0, self->bs_param_bands, 918 ch_fac); 919 for (pg = 0; pg < data_bands; pg++) { 920 param_band_start = group_to_band[pg]; 921 param_band_stop = group_to_band[pg + 1]; 922 for (pb = param_band_start; pb < param_band_stop; pb++) { 923 self->smoothing_data[ps][pb] = frame->bs_smg_data[ps][pg]; 924 } 925 } 926 break; 927 } 928 } 929 930 self->smoothing_filt_state.prev_smg_time = 931 self->smoothing_time[self->num_parameter_sets - 1]; 932 self->smoothing_filt_state.inv_prev_smg_time = 933 self->inv_smoothing_time[self->num_parameter_sets - 1]; 934 for (pb = 0; pb < self->bs_param_bands; pb++) { 935 self->smoothing_filt_state.prev_smg_data[pb] = 936 self->smoothing_data[self->num_parameter_sets - 1][pb]; 937 } 938 939 if (self->ext_frame_flag) { 940 self->smoothing_time[self->num_parameter_sets] = 941 self->smoothing_time[self->num_parameter_sets - 1]; 942 self->inv_smoothing_time[self->num_parameter_sets] = 943 self->inv_smoothing_time[self->num_parameter_sets - 1]; 944 for (pb = 0; pb < self->bs_param_bands; pb++) { 945 self->smoothing_data[self->num_parameter_sets][pb] = 946 self->smoothing_data[self->num_parameter_sets - 1][pb]; 947 } 948 } 949 } 950 951 WORD32 ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) { 952 int i; 953 WORD32 err_code = 0; 954 if (self->parse_nxt_frame == 1) return 0; 955 956 self->ext_frame_flag = 0; 957 if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) { 958 self->ext_frame_flag = 1; 959 } 960 961 err_code = ixheaacd_mps_dec_and_mapframeott(self); 962 963 if (err_code != 0) return err_code; 964 965 ixheaacd_mps_dec_and_mapframesmg(self); 966 967 if (self->ext_frame_flag) { 968 self->num_parameter_sets++; 969 self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1; 970 } 971 self->param_slot_diff[0] = self->param_slots[0] + 1; 972 self->inv_param_slot_diff[0] = (float)1 / self->param_slot_diff[0]; 973 self->inv_param_slot_diff_Q30[0] = 974 (int)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5); 975 for (i = 1; i < self->num_parameter_sets; i++) { 976 self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1]; 977 self->inv_param_slot_diff[i] = (float)1 / self->param_slot_diff[i]; 978 self->inv_param_slot_diff_Q30[i] = 979 (int)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5); 980 } 981 982 return 0; 983 } 984 985 WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) { 986 self->time_slots = self->frame_length; 987 self->frame_len = self->time_slots * self->qmf_band_count; 988 self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res]; 989 990 self->hyb_band_count = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10; 991 992 switch (self->bs_param_bands) { 993 case 4: 994 995 self->hyb_band_to_processing_band_table = 996 ixheaacd_hybrid_band_71_to_processing_band_4_map; 997 break; 998 case 5: 999 1000 self->hyb_band_to_processing_band_table = 1001 ixheaacd_hybrid_band_71_to_processing_band_5_map; 1002 break; 1003 case 7: 1004 1005 self->hyb_band_to_processing_band_table = 1006 ixheaacd_hybrid_band_71_to_processing_band_7_map; 1007 break; 1008 case 10: 1009 1010 self->hyb_band_to_processing_band_table = 1011 ixheaacd_hybrid_band_71_to_processing_band_10_map; 1012 break; 1013 case 14: 1014 1015 self->hyb_band_to_processing_band_table = 1016 ixheaacd_hybrid_band_71_to_processing_band_14_map; 1017 break; 1018 case 20: 1019 1020 self->hyb_band_to_processing_band_table = 1021 ixheaacd_hybrid_band_71_to_processing_band_20_map; 1022 break; 1023 case 28: 1024 1025 self->hyb_band_to_processing_band_table = 1026 ixheaacd_hybrid_band_71_to_processing_band_28_map; 1027 break; 1028 default: 1029 self->hyb_band_to_processing_band_table = NULL; 1030 return -1; 1031 break; 1032 }; 1033 1034 self->in_ch_count = 1; 1035 self->out_ch_count = 2; 1036 1037 self->input_gain = 1038 ixheaacd_mps_clip_gain_table[self->config->bs_fixed_gain_dmx]; 1039 1040 if (self->config->bs_ott_bands_phase_present) { 1041 self->num_bands_ipd = self->config->bs_ott_bands_phase; 1042 } else { 1043 switch (self->bs_param_bands) { 1044 case 4: 1045 case 5: 1046 self->num_bands_ipd = 2; 1047 break; 1048 case 7: 1049 self->num_bands_ipd = 3; 1050 break; 1051 case 10: 1052 self->num_bands_ipd = 5; 1053 break; 1054 case 14: 1055 self->num_bands_ipd = 7; 1056 break; 1057 case 20: 1058 case 28: 1059 self->num_bands_ipd = 10; 1060 break; 1061 default: 1062 assert(0); 1063 break; 1064 } 1065 } 1066 1067 if (self->residual_coding) { 1068 self->num_bands_ipd = max(self->bs_residual_bands, self->num_bands_ipd); 1069 self->max_res_bands = 0; 1070 if (self->bs_residual_present) { 1071 self->res_bands = self->bs_residual_bands; 1072 if (self->res_bands > self->max_res_bands) { 1073 self->max_res_bands = self->res_bands; 1074 } 1075 } else { 1076 self->res_bands = 0; 1077 } 1078 } 1079 1080 if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1; 1081 1082 self->dir_sig_count = 1; 1083 self->decor_sig_count = 1; 1084 1085 self->bs_high_rate_mode = self->config->bs_high_rate_mode; 1086 1087 return 0; 1088 } 1089