151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick/******************************************************************************
251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *                                                                            *
351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Copyright (C) 2018 The Android Open Source Project
451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *
551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Licensed under the Apache License, Version 2.0 (the "License");
651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * you may not use this file except in compliance with the License.
751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * You may obtain a copy of the License at:
851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *
951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * http://www.apache.org/licenses/LICENSE-2.0
1051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *
1151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Unless required by applicable law or agreed to in writing, software
1251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * distributed under the License is distributed on an "AS IS" BASIS,
1351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * See the License for the specific language governing permissions and
1551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * limitations under the License.
1651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *
1751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *****************************************************************************
1851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
1951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick*/
2051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <stdio.h>
2151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <stdlib.h>
2251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <string.h>
2351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <assert.h>
2451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_type_def.h>
2651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_cnst.h"
2851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
2951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_bitbuffer.h"
3051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_config.h"
3151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_interface.h"
3251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_acelp_info.h"
3351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
3451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_tns_usac.h"
3551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbrdecsettings.h"
3651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_info.h"
3751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_struct.h"
3851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbr_common.h"
3951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_drc_data_struct.h"
4051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_drc_dec.h"
4151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
4251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbrdecoder.h"
4351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_mps_polyphase.h"
4451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbr_const.h"
4551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
4651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_main.h"
4751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
4851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_arith_dec.h"
4951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
5051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_type_def.h>
5151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_memory_standards.h"
5251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbrdecsettings.h"
5351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_env_extr_part.h"
5451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_defines.h"
5551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_aac_rom.h>
5651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_common_rom.h"
5751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_sbr_rom.h>
5851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_bitbuffer.h"
5951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_pulsedata.h"
6051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_pns.h"
6151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
6251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_lt_predict.h"
6351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
6451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_channelinfo.h"
6551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_channel.h"
6651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_channelinfo.h"
6751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbrdecoder.h"
6851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_audioobjtypes.h"
6951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_latmdemux.h"
7051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_aacdec.h"
7151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbr_common.h"
7251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
7351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_mps_polyphase.h"
7451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_config.h"
7551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_mps_dec.h"
7651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_struct_def.h"
7751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
7851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_create.h"
7951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_process.h"
8151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbrdecoder.h"
8351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_mps_interface.h"
8551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
8651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_bit_extract.h"
8751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_func_def.h"
8851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_interface.h"
8951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
9051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern ia_huff_code_word_struct ixheaacd_huff_book_scl[];
9151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
9251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern WORD32 ixheaacd_book_scl_index[];
9351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern WORD16 ixheaacd_book_scl_code_book[];
9451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
9551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern ia_usac_samp_rate_info ixheaacd_samp_rate_info[];
9651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_sampling_boundaries[(1 << LEN_SAMP_IDX)];
9751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
9851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickconst WORD32 ixheaacd_sampl_freq_idx_table[17] = {
9951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000,
10051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    12000, 11025, 8000,  7350,  -1,    -1,    -1,    -1};
10151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
10251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic VOID ixheaacd_info_init(ia_usac_samp_rate_info *ptr_samp_info,
10351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               WORD32 block_size_samples,
10451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               ia_sfb_info_struct *pstr_sfb_info_long,
10551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               ia_sfb_info_struct *pstr_sfb_info_short,
10651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               WORD16 *sfb_width_short,
10751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                               WORD16 *sfb_width_long) {
10851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 i, j, k, n, ws;
10951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  const WORD16 *sfbands;
11051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_sfb_info_struct *pstr_sfb_info_ip;
11151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
11251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_long->islong = 1;
11351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_long->max_win_len = 1;
11451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_long->samp_per_bk = block_size_samples;
11551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
11651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  switch (block_size_samples) {
11751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    case 480:
11851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_480;
11951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_480;
12051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      break;
12151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    case 512:
12251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_512;
12351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_512;
12451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      break;
12551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    case 768:
12651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_768;
12751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_768;
12851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      break;
12951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    case 960:
13051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_960;
13151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_960;
13251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      break;
13351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    case 1024:
13451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_1024;
13551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_1024;
13651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      break;
13751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    default:
13851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      assert(0);
13951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      break;
14051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
14151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
14251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_long->sfb_width = sfb_width_long;
14351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_long->num_groups = 1;
14451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_long->group_len[0] = 1;
14551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
14651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0, j = 0, n = pstr_sfb_info_long->sfb_per_sbk; i < n; i++) {
14751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    k = pstr_sfb_info_long->ptr_sfb_tbl[i];
14851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    pstr_sfb_info_long->sfb_width[i] = k - j;
14951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    j = k;
15051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
15151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
15251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_short->islong = 0;
15351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_short->max_win_len = NSHORT;
15451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_short->samp_per_bk = block_size_samples;
15551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
15651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < pstr_sfb_info_short->max_win_len; i++) {
15751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    switch (block_size_samples) {
15851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      case 768:
15951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_96;
16051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_96;
16151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
16251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      case 960:
16351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_120;
16451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_120;
16551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
16651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      case 1024:
16751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_128;
16851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_128;
16951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
17051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      default:
17151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        assert(0);
17251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
17351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
17451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
17551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
17651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_short->sfb_width = sfb_width_short;
17751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0, j = 0, n = pstr_sfb_info_short->sfb_per_sbk; i < n; i++) {
17851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    k = pstr_sfb_info_short->ptr_sfb_tbl[i];
17951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    pstr_sfb_info_short->sfb_width[i] = k - j;
18051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    j = k;
18151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
18251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
18351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_sfb_info_ip = pstr_sfb_info_long;
18451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (ws = 0; ws < 2; ws++) {
18551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    pstr_sfb_info_ip->sfb_per_bk = 0;
18651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    k = 0;
18751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    n = 0;
18851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (i = 0; i < pstr_sfb_info_ip->max_win_len; i++) {
18951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_ip->bins_per_sbk =
19051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          pstr_sfb_info_ip->samp_per_bk / pstr_sfb_info_ip->max_win_len;
19151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
19251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_sfb_info_ip->sfb_per_bk += pstr_sfb_info_ip->sfb_per_sbk;
19351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
19451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      sfbands = pstr_sfb_info_ip->ptr_sfb_tbl;
19551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (j = 0; j < pstr_sfb_info_ip->sfb_per_sbk; j++)
19651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        pstr_sfb_info_ip->sfb_idx_tbl[j + k] = sfbands[j] + n;
19751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
19851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      n += pstr_sfb_info_ip->bins_per_sbk;
19951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      k += pstr_sfb_info_ip->sfb_per_sbk;
20051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
20151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    pstr_sfb_info_ip = pstr_sfb_info_short;
20251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
20351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
20451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
20551aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickWORD32 ixheaacd_decode_init(
20651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    VOID *handle, WORD32 sample_rate, ia_usac_data_struct *usac_data,
20751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ia_audio_specific_config_struct *pstr_stream_config) {
20851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 i;
20951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_exhaacplus_dec_api_struct *codec_handle =
21051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      (ia_exhaacplus_dec_api_struct *)handle;
21151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_aac_dec_state_struct *aac_dec_handle = codec_handle->p_state_aac;
21251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 fscale;
21351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
21451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 ele_id = 0;
21551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
21651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_usac_config_struct *ptr_usac_config =
21751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      &(pstr_stream_config->str_usac_config);
21851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_usac_decoder_config_struct *ptr_usac_dec_config =
21951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      &(pstr_stream_config->str_usac_config.str_usac_dec_config);
22051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 num_elements = ptr_usac_dec_config->num_elements;
22151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 chan = 0;
22251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
22351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->huffman_code_book_scl = aac_dec_handle->huffman_code_book_scl;
22451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->huffman_code_book_scl_index =
22551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      aac_dec_handle->huffman_code_book_scl_index;
22651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
22751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->tns_coeff3_32 =
22851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      aac_dec_handle->pstr_aac_tables->pstr_block_tables->tns_coeff3_32;
22951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->tns_coeff4_32 =
23051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      aac_dec_handle->pstr_aac_tables->pstr_block_tables->tns_coeff4_32;
23151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->tns_max_bands_tbl_usac =
23251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      &aac_dec_handle->pstr_aac_tables->pstr_block_tables
23351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick           ->tns_max_bands_tbl_usac;
23451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
235b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri  for (i = 0; i < 11; i++) {
23651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if (ixheaacd_sampling_boundaries[i] <= sample_rate) break;
23751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
23851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
23951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (i == (1 << LEN_SAMP_IDX)) return -1;
24051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->sampling_rate_idx = i;
24151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
24251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  fscale = (WORD32)((double)sample_rate * (double)FSCALE_DENOM / 12800.0f);
24351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
24451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < MAX_NUM_CHANNELS; i++) {
24551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->window_shape_prev[i] = 0;
24651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->window_shape[i] = 0;
24751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
24851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
24951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ixheaacd_hufftab(&ixheaacd_book, ixheaacd_huff_book_scl,
25051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                   ixheaacd_book_scl_code_book, ixheaacd_book_scl_index, 1, 60,
25151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                   60, 1, 19);
25251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
25351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->pstr_usac_winmap[0] = &usac_data->str_only_long_info;
25451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->pstr_usac_winmap[1] = &usac_data->str_only_long_info;
25551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->pstr_usac_winmap[2] = &usac_data->str_eight_short_info;
25651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->pstr_usac_winmap[3] = &usac_data->str_only_long_info;
25751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->pstr_usac_winmap[4] = &usac_data->str_only_long_info;
2588eb646f89b94cf6d0aa26e5bca39ba083a554965Harish Mahendrakar
259b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri  if ((usac_data->ccfl != 480) && (usac_data->ccfl != 512) &&
260b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      (usac_data->ccfl != 768) && (usac_data->ccfl != 960) &&
261b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      (usac_data->ccfl != 1024))
262b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri    return -1;
26351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ixheaacd_info_init(&ixheaacd_samp_rate_info[usac_data->sampling_rate_idx],
26451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     usac_data->ccfl, usac_data->pstr_usac_winmap[0],
26551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     usac_data->pstr_usac_winmap[2], usac_data->sfb_width_short,
26651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                     usac_data->sfb_width_long);
26751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
26851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < MAX_NUM_CHANNELS; i++) {
26951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->str_tddec[i] = &usac_data->arr_str_tddec[i];
27051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->str_tddec[i]->fscale =
27151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        ((fscale)*usac_data->ccfl) / LEN_SUPERFRAME;
27251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->len_subfrm = usac_data->ccfl / 4;
27351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->num_subfrm = (MAX_NUM_SUBFR * usac_data->ccfl) / LEN_SUPERFRAME;
27451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
27551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ixheaacd_init_acelp_data(usac_data, usac_data->str_tddec[i]);
27651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
27751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->str_tddec[i]->fd_synth =
27851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        &usac_data->str_tddec[i]->fd_synth_buf[LEN_FRAME];
27951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
28051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
28151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (ele_id = 0; ele_id < num_elements; ele_id++) {
28251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    UWORD32 ele_type;
28351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 stereo_config_index;
28451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
28551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ia_usac_dec_element_config_struct *ptr_usac_ele_config =
28651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        &ptr_usac_config->str_usac_dec_config.str_usac_element_config[ele_id];
28751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
28851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if (ptr_usac_ele_config) {
28951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      if (usac_data->tw_mdct[ele_id]) {
29051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        return -1;
29151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
29251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
29351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      usac_data->noise_filling_config[ele_id] =
29451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          ptr_usac_ele_config->noise_filling;
29551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
29651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
29751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ele_type = ptr_usac_config->str_usac_dec_config.usac_element_type[ele_id];
29851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
29951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    stereo_config_index = ptr_usac_ele_config->stereo_config_index;
30051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
30151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    switch (ele_type) {
30251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      case ID_USAC_SCE:
30351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      case ID_USAC_LFE:
30451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
30551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        usac_data->seed_value[chan] = 0x3039;
30651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
30751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
30851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
30951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      case ID_USAC_CPE: {
31051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        WORD32 frame_len_tbl[] = {-1, -1, 32, 32, 64};
31151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
31251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        usac_data->seed_value[chan] = 0x3039;
31351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        chan++;
31451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
31551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        usac_data->seed_value[chan] = 0x10932;
31651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
31751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        if (stereo_config_index > 0) {
31851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 bs_frame_length =
31951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick              frame_len_tbl[ptr_usac_config->core_sbr_framelength_index] - 1;
32051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          WORD32 bs_residual_coding = (stereo_config_index > 1) ? 1 : 0;
32151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
32251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          ia_usac_dec_mps_config_struct *ptr_usac_mps212_config =
32351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick              &(ptr_usac_config->str_usac_dec_config
32451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                    .str_usac_element_config[ele_id]
32551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                    .str_usac_mps212_config);
32651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
327b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri          ixheaacd_mps_create(&aac_dec_handle->mps_dec_handle, bs_frame_length,
328b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri                              bs_residual_coding, ptr_usac_mps212_config);
32951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        }
33051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
33151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
33251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
33351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      break;
33451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      case ID_USAC_EXT:
33551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
33651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      default:
33751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        return -1;
33851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
33951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
34051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
34151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
34251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return 0;
34351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
34451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
34551aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickWORD32 ixheaacd_dec_data_init(VOID *handle,
34651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                              ia_frame_data_struct *pstr_frame_data,
34751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                              ia_usac_data_struct *usac_data) {
34851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_audio_specific_config_struct *pstr_stream_config, *layer_config;
34951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 err_code = 0;
35051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
35151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 num_out_chan = 0;
35251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
35351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 i_ch, i, ele_id;
35451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 num_elements;
35551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
35651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 out_frame_len, sbr_ratio_idx;
35751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
35851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_usac_config_struct *ptr_usac_config =
35951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      &(pstr_frame_data->str_audio_specific_config.str_usac_config);
36051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
36151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->window_shape_prev[0] = WIN_SEL_0;
36251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->window_shape_prev[1] = WIN_SEL_0;
36351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
36451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_frame_data->str_layer.bit_rate =
36551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_frame_data->str_audio_specific_config.avg_bit_rate;
36651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_stream_config = &pstr_frame_data->str_audio_specific_config;
36751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  layer_config = &pstr_frame_data->str_audio_specific_config;
36851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
36951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  sbr_ratio_idx = ixheaacd_sbr_params(
37051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      ptr_usac_config->core_sbr_framelength_index, &out_frame_len,
3714908247643e9e97852e847c00bfe7c4259279538Ray Essick      &usac_data->ccfl, &usac_data->output_samples,
3724908247643e9e97852e847c00bfe7c4259279538Ray Essick      &pstr_frame_data->str_layer.sample_rate_layer,
3734908247643e9e97852e847c00bfe7c4259279538Ray Essick      &layer_config->samp_frequency_index);
3744908247643e9e97852e847c00bfe7c4259279538Ray Essick
375b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri  pstr_stream_config->sampling_frequency =
376b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      pstr_frame_data->str_layer.sample_rate_layer;
3774908247643e9e97852e847c00bfe7c4259279538Ray Essick  pstr_stream_config->samp_frequency_index = layer_config->samp_frequency_index;
37851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
37951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  num_elements = ptr_usac_config->str_usac_dec_config.num_elements;
38051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
38151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (ele_id = 0; ele_id < num_elements; ele_id++) {
38251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ia_usac_dec_element_config_struct *ptr_usac_ele_config =
38351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        &(ptr_usac_config->str_usac_dec_config.str_usac_element_config[ele_id]);
38451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
38551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if (ptr_usac_ele_config) {
38651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      usac_data->tw_mdct[ele_id] = ptr_usac_ele_config->tw_mdct;
38751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
38851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
38951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    {
39051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      ia_usac_dec_mps_config_struct *ptr_usac_mps212_config =
39151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          &ptr_usac_ele_config->str_usac_mps212_config;
39251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 stereo_config_index = ptr_usac_ele_config->stereo_config_index;
39351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
39451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      usac_data->mps_pseudo_lr[ele_id] =
39551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          (stereo_config_index > 1) ? ptr_usac_mps212_config->bs_pseudo_lr : 0;
39651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
39751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
39851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
39951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->sbr_ratio_idx = sbr_ratio_idx;
40051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->esbr_bit_str[0].no_elements = 0;
40151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  usac_data->esbr_bit_str[1].no_elements = 0;
40251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
40351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  num_out_chan = ptr_usac_config->num_out_channels;
40451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
4054908247643e9e97852e847c00bfe7c4259279538Ray Essick  if (usac_data->ccfl == 768)
40651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    pstr_frame_data->str_layer.sample_rate_layer =
40751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        4 * pstr_frame_data->str_layer.sample_rate_layer / 3;
40851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
40951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i = 0; i < MAX_NUM_CHANNELS; i++) {
41051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->coef_fix[i] = &usac_data->arr_coef_fix[i][0];
41151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->coef[i] = &usac_data->arr_coef[i][0];
41251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->coef_save[i] = &usac_data->arr_coef_save[i][0];
41351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->factors[i] = &usac_data->arr_factors[i][0];
41451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->group_dis[i] = &usac_data->arr_group_dis[i][0];
41551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->pstr_tns[i] = &usac_data->arr_str_tns[i];
41651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->tw_ratio[i] = &usac_data->arr_tw_ratio[i][0];
41751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->ms_used[i] = &usac_data->arr_ms_used[i][0];
41851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->window_shape_prev[i] = WIN_SEL_0;
41951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
42051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->seed_value[i] = 0x0;
42151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
42251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    usac_data->fac_data_present[i] = 0;
42351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
42451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
42551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  err_code =
42651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      ixheaacd_decode_init(handle, pstr_frame_data->str_layer.sample_rate_layer,
42751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                           usac_data, pstr_stream_config);
42851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (err_code == -1) return -1;
42951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
43051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (i_ch = 0; i_ch < MAX_NUM_CHANNELS; i_ch++) {
43151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if (usac_data->tw_mdct[0] == 1) {
43251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      WORD32 i;
43351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      for (i = 0; i < 2 * usac_data->ccfl; i++) {
43451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        usac_data->warp_cont_mem[i_ch][i] = 1.0;
43551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
43651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      usac_data->warp_sum[i_ch][0] = usac_data->warp_sum[i_ch][1] =
43751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          (FLOAT32)usac_data->ccfl;
43851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
43951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
44051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return err_code;
44151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
44251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
44351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic VOID ixheaacd_count_tracks_per_layer(int *max_layer, int *stream_count,
44451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                            int *tracks_in_layer) {
44551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 stream;
44651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 num_layer;
44751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 num_streams;
44851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 layer = 0;
44951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
45051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (stream_count == NULL)
45151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    num_streams = 0;
45251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  else
45351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    num_streams = *stream_count;
45451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (max_layer == NULL)
45551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    num_layer = num_streams;
45651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  else
45751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    num_layer = *max_layer;
45851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (num_layer < 0) num_layer = num_streams;
45951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
46051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (stream = 0; (layer <= num_layer) && (stream < num_streams);) {
46151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    *tracks_in_layer = 1;
46251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    stream += 1;
46351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    layer++;
46451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    if (layer <= num_layer) *tracks_in_layer = 0;
46551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
46651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
46751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (max_layer) *max_layer = (layer - 1);
46851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (stream_count) *stream_count = stream;
46951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
47051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
47151aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickWORD32 ixheaacd_frm_data_init(ia_audio_specific_config_struct *pstr_audio_conf,
47251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                              ia_dec_data_struct *pstr_dec_data)
47351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
47451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick{
47551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 layer;
47651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 track;
47751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 num_dec_streams;
47851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_frame_data_struct *pstr_frame_data;
47951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
48051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 stream_count = 1;
48151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 max_layer = -1;
48251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
48351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  memset(pstr_dec_data, 0, sizeof(ia_dec_data_struct));
4844908247643e9e97852e847c00bfe7c4259279538Ray Essick  memset(&(pstr_dec_data->str_frame_data), 0,
48551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick         sizeof(pstr_dec_data->str_frame_data));
48651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
4874908247643e9e97852e847c00bfe7c4259279538Ray Essick  pstr_frame_data = &(pstr_dec_data->str_frame_data);
48851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
48951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  if (max_layer < 0) max_layer = stream_count - 1;
49051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
49151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ixheaacd_count_tracks_per_layer(&max_layer, &stream_count,
49251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                                  &pstr_frame_data->tracks_in_layer);
49351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
49451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_frame_data->scal_out_select = max_layer;
49551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
49651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_frame_data->stream_count = 0;
49751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
49851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  num_dec_streams = track = 0;
49951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (layer = 0; layer < (signed)pstr_frame_data->scal_out_select + 1;
50051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick       layer++) {
50151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 j;
50251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (j = 0; j < 1; j++, num_dec_streams++) {
50351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_frame_data->str_audio_specific_config = *pstr_audio_conf;
50451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_frame_data->str_layer.sample_rate_layer =
50551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          pstr_frame_data->str_audio_specific_config.sampling_frequency;
50651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_frame_data->str_layer.bit_rate =
50751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          pstr_frame_data->str_audio_specific_config.avg_bit_rate;
50851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
50951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
51051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    track += pstr_frame_data->tracks_in_layer;
51151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
51251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
51351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_frame_data->stream_count = num_dec_streams;
51451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
51551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return num_dec_streams;
51651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
51751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
51851aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickWORD32 ixheaacd_decode_create(ia_exhaacplus_dec_api_struct *handle,
51951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                              ia_dec_data_struct *pstr_dec_data,
52051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                              WORD32 tracks_for_decoder) {
52151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 stream;
52251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
52351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 num_delay_samp = 0;
52451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 err = 0;
52551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_frame_data_struct *pstr_frame_data;
52651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  WORD32 stream_count;
52751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  ia_aac_dec_state_struct *aac_dec_handle = handle->p_state_aac;
5284908247643e9e97852e847c00bfe7c4259279538Ray Essick  pstr_frame_data = &(pstr_dec_data->str_frame_data);
52951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  stream_count = pstr_frame_data->stream_count;
53051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_frame_data->stream_count = tracks_for_decoder;
53151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
53251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  for (stream = 0; stream < stream_count; stream++) {
53351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    UWORD32 aot = pstr_frame_data->str_audio_specific_config.audio_object_type;
53451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
53551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    switch (aot) {
53651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      case AOT_USAC:
5374908247643e9e97852e847c00bfe7c4259279538Ray Essick
538b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        err = ixheaacd_dec_data_init(handle, pstr_frame_data,
539b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri                                     &(pstr_dec_data->str_usac_data));
540b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri
541b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) {
542b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri          case 0:
543b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            handle->aac_config.ui_sbr_mode = 0;
544b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            break;
545b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri          case 1:
546b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            handle->aac_config.ui_sbr_mode = 1;
547b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            break;
548b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri          case 2:
549b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            handle->aac_config.ui_sbr_mode = 1;
550b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            break;
551b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri          case 3:
552b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            handle->aac_config.ui_sbr_mode = 3;
553b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            break;
554b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri
555b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri          default:
556b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            handle->aac_config.ui_sbr_mode = 0;
557b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        }
558b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri
559b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        if (err == -1) return -1;
5604908247643e9e97852e847c00bfe7c4259279538Ray Essick
56151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
56251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
56351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      default:
56451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
56551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        break;
56651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
56751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
56851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
56951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_frame_data->scal_out_object_type =
57051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_frame_data->str_audio_specific_config.audio_object_type;
57151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_frame_data->scal_out_num_channels =
57251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_frame_data->str_audio_specific_config.channel_configuration;
57351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  pstr_frame_data->scal_out_sampling_frequency =
57451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      pstr_frame_data->str_audio_specific_config.sampling_frequency;
57551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
5764908247643e9e97852e847c00bfe7c4259279538Ray Essick  if (&(pstr_dec_data->str_usac_data) != NULL) {
5774908247643e9e97852e847c00bfe7c4259279538Ray Essick    ia_sbr_header_data_struct usac_def_header;
57851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ia_audio_specific_config_struct *pstr_aud_spec_config =
57951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        &pstr_frame_data->str_audio_specific_config;
58051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ia_usac_config_struct *ptr_usac_config =
58151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        &(pstr_frame_data->str_audio_specific_config.str_usac_config);
58251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
58351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 inter_tes[MAX_NUM_ELEMENTS] = {0};
58451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 bs_pvc[MAX_NUM_ELEMENTS] = {0};
58551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 harmonic_sbr[MAX_NUM_ELEMENTS] = {0};
5864908247643e9e97852e847c00bfe7c4259279538Ray Essick    WORD32 inter_test_flag = 0;
5874908247643e9e97852e847c00bfe7c4259279538Ray Essick    WORD32 bs_pvc_flag = 0;
5884908247643e9e97852e847c00bfe7c4259279538Ray Essick    WORD32 harmonic_Sbr_flag = 0;
58951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
59051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    ia_usac_decoder_config_struct *ptr_usac_dec_config =
59151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        &ptr_usac_config->str_usac_dec_config;
59251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 const num_ele = ptr_usac_dec_config->num_elements;
59351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    WORD32 elem_idx = 0;
59451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
5954908247643e9e97852e847c00bfe7c4259279538Ray Essick    memset(&usac_def_header, 0, sizeof(ia_sbr_header_data_struct));
5964908247643e9e97852e847c00bfe7c4259279538Ray Essick
59751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    for (elem_idx = 0; elem_idx < num_ele; elem_idx++) {
598b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      UWORD32 usac_ele_type =
599b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri          ptr_usac_config->str_usac_dec_config.usac_element_type[elem_idx];
600b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      ia_usac_dec_element_config_struct *ptr_usac_ele_config =
601b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri          &ptr_usac_config->str_usac_dec_config
602b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri               .str_usac_element_config[elem_idx];
6034908247643e9e97852e847c00bfe7c4259279538Ray Essick
60451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config =
60551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          &(ptr_usac_dec_config->str_usac_element_config[elem_idx]
60651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick                .str_usac_sbr_config);
60751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      inter_tes[elem_idx] =
60851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->bs_inter_tes : 0;
60951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      bs_pvc[elem_idx] =
61051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->bs_pvc : 0;
61151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      harmonic_sbr[elem_idx] =
61251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick          (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->harmonic_sbr : 0;
61351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
614b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      if (ptr_usac_sbr_config->bs_inter_tes) inter_test_flag = 1;
615b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      if (ptr_usac_sbr_config->bs_pvc) bs_pvc_flag = 1;
616b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      if (ptr_usac_sbr_config->harmonic_sbr) harmonic_Sbr_flag = 1;
617b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri
618b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      if ((usac_ele_type != ID_USAC_LFE) && (usac_ele_type != ID_USAC_EXT)) {
619b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config =
620b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            &(ptr_usac_ele_config->str_usac_sbr_config);
621b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri
622b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.start_freq = ptr_usac_sbr_config->dflt_start_freq;
623b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.stop_freq = ptr_usac_sbr_config->dflt_stop_freq;
624b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.header_extra_1 =
625b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            ptr_usac_sbr_config->dflt_header_extra1;
626b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.header_extra_2 =
627b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            ptr_usac_sbr_config->dflt_header_extra2;
628b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.freq_scale = ptr_usac_sbr_config->dflt_freq_scale;
629b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.alter_scale = ptr_usac_sbr_config->dflt_alter_scale;
630b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.noise_bands = ptr_usac_sbr_config->dflt_noise_bands;
631b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.limiter_bands = ptr_usac_sbr_config->dflt_limiter_bands;
632b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.limiter_gains = ptr_usac_sbr_config->dflt_limiter_gains;
633b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.interpol_freq = ptr_usac_sbr_config->dflt_interpol_freq;
634b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri        usac_def_header.smoothing_mode =
635b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri            ptr_usac_sbr_config->dflt_smoothing_mode;
636b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri      }
6374908247643e9e97852e847c00bfe7c4259279538Ray Essick    }
6384908247643e9e97852e847c00bfe7c4259279538Ray Essick
6394908247643e9e97852e847c00bfe7c4259279538Ray Essick    pstr_dec_data->str_usac_data.down_samp_sbr = 0;
6404908247643e9e97852e847c00bfe7c4259279538Ray Essick
6414908247643e9e97852e847c00bfe7c4259279538Ray Essick    if (pstr_dec_data->str_usac_data.sbr_ratio_idx > 0) {
6424908247643e9e97852e847c00bfe7c4259279538Ray Essick      if (pstr_aud_spec_config->ext_sampling_frequency ==
6434908247643e9e97852e847c00bfe7c4259279538Ray Essick          pstr_aud_spec_config->sampling_frequency) {
6444908247643e9e97852e847c00bfe7c4259279538Ray Essick        pstr_dec_data->str_usac_data.down_samp_sbr = 1;
6454908247643e9e97852e847c00bfe7c4259279538Ray Essick      }
6464908247643e9e97852e847c00bfe7c4259279538Ray Essick      if (pstr_dec_data->str_usac_data.down_samp_sbr == 0) {
6474908247643e9e97852e847c00bfe7c4259279538Ray Essick        if (pstr_dec_data->str_usac_data.sbr_ratio_idx == 3) {
6484908247643e9e97852e847c00bfe7c4259279538Ray Essick          pstr_frame_data->scal_out_sampling_frequency =
6494908247643e9e97852e847c00bfe7c4259279538Ray Essick              4 * pstr_frame_data->scal_out_sampling_frequency;
6504908247643e9e97852e847c00bfe7c4259279538Ray Essick        } else {
6514908247643e9e97852e847c00bfe7c4259279538Ray Essick          pstr_frame_data->scal_out_sampling_frequency =
6524908247643e9e97852e847c00bfe7c4259279538Ray Essick              2 * pstr_frame_data->scal_out_sampling_frequency;
6534908247643e9e97852e847c00bfe7c4259279538Ray Essick        }
6544908247643e9e97852e847c00bfe7c4259279538Ray Essick      }
6554908247643e9e97852e847c00bfe7c4259279538Ray Essick
6564908247643e9e97852e847c00bfe7c4259279538Ray Essick      {
6574908247643e9e97852e847c00bfe7c4259279538Ray Essick        void *sbr_persistent_mem_v = aac_dec_handle->sbr_persistent_mem_u;
6584908247643e9e97852e847c00bfe7c4259279538Ray Essick
6594908247643e9e97852e847c00bfe7c4259279538Ray Essick        pstr_dec_data->str_usac_data.pstr_esbr_dec = ixheaacd_init_sbr(
66051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            pstr_frame_data->str_layer.sample_rate_layer,
6614908247643e9e97852e847c00bfe7c4259279538Ray Essick            pstr_dec_data->str_usac_data.ccfl,
6624908247643e9e97852e847c00bfe7c4259279538Ray Essick            &pstr_dec_data->str_usac_data.down_samp_sbr, sbr_persistent_mem_v,
66351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            NULL, pstr_frame_data->scal_out_num_channels, 0,
6644908247643e9e97852e847c00bfe7c4259279538Ray Essick            pstr_dec_data->str_usac_data.sbr_ratio_idx,
6654908247643e9e97852e847c00bfe7c4259279538Ray Essick            pstr_dec_data->str_usac_data.output_samples, &harmonic_Sbr_flag,
66651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            (void *)&usac_def_header, aac_dec_handle->str_sbr_config,
6674908247643e9e97852e847c00bfe7c4259279538Ray Essick            pstr_dec_data->str_usac_data.audio_object_type);
6684908247643e9e97852e847c00bfe7c4259279538Ray Essick        pstr_dec_data->str_usac_data.sbr_scratch_mem_base =
66951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick            aac_dec_handle->sbr_scratch_mem_u;
67051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        if (num_ele)
6714908247643e9e97852e847c00bfe7c4259279538Ray Essick          ixheaacd_setesbr_flags(sbr_persistent_mem_v, bs_pvc_flag,
6724908247643e9e97852e847c00bfe7c4259279538Ray Essick                                 harmonic_Sbr_flag, inter_test_flag);
67351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
67451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
6754908247643e9e97852e847c00bfe7c4259279538Ray Essick      if (pstr_dec_data->str_usac_data.pstr_esbr_dec == NULL) {
67651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick        return -1;
67751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick      }
67851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick    }
67951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  }
68051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick
68151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick  return (num_delay_samp);
68251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}
683