Snap for 10447354 from 052dba24c86e8b284ef91ba8962d81f925423233 to mainline-cellbroadcast-release

Change-Id: I4e5132e6779099730c693a1a7bf4fee708ffac2c
diff --git a/Android.bp b/Android.bp
index f10e600..4558978 100644
--- a/Android.bp
+++ b/Android.bp
@@ -38,6 +38,7 @@
     srcs: [
         "decoder/ixheaacd_aacdecoder.c",
         "decoder/ixheaacd_aacpluscheck.c",
+        "decoder/ixheaacd_aac_ec.c",
         "decoder/ixheaacd_aac_imdct.c",
         "decoder/ixheaacd_aac_rom.c",
         "decoder/ixheaacd_aac_tns.c",
@@ -50,6 +51,7 @@
         "decoder/ixheaacd_arith_dec.c",
         "decoder/ixheaacd_avq_dec.c",
         "decoder/ixheaacd_avq_rom.c",
+        "decoder/ixheaacd_basic_funcs.c",
         "decoder/ixheaacd_basic_ops.c",
         "decoder/ixheaacd_bitbuffer.c",
         "decoder/ixheaacd_block.c",
@@ -59,47 +61,89 @@
         "decoder/ixheaacd_common_rom.c",
         "decoder/ixheaacd_create.c",
         "decoder/ixheaacd_decode_main.c",
+        "decoder/ixheaacd_drc_freq_dec.c",
         "decoder/ixheaacd_dsp_fft32x32s.c",
+        "decoder/ixheaacd_ec_rom.c",
         "decoder/ixheaacd_env_calc.c",
         "decoder/ixheaacd_env_dec.c",
         "decoder/ixheaacd_env_extr.c",
         "decoder/ixheaacd_esbr_envcal.c",
+        "decoder/ixheaacd_esbr_fft.c",
         "decoder/ixheaacd_esbr_polyphase.c",
         "decoder/ixheaacd_esbr_rom.c",
-        "decoder/ixheaacd_esbr_fft.c",
         "decoder/ixheaacd_ext_ch_ele.c",
         "decoder/ixheaacd_fft.c",
+        "decoder/ixheaacd_fft_ifft_32x32.c",
+        "decoder/ixheaacd_fft_ifft_32x32_rom.c",
         "decoder/ixheaacd_freq_sca.c",
         "decoder/ixheaacd_fwd_alias_cnx.c",
+        "decoder/ixheaacd_hbe_dft_trans.c",
         "decoder/ixheaacd_hbe_trans.c",
         "decoder/ixheaacd_headerdecode.c",
         "decoder/ixheaacd_hufftables.c",
+        "decoder/ixheaacd_huff_code_reorder.c",
         "decoder/ixheaacd_huff_tools.c",
         "decoder/ixheaacd_hybrid.c",
         "decoder/ixheaacd_imdct.c",
         "decoder/ixheaacd_initfuncs.c",
         "decoder/ixheaacd_init_config.c",
+        "decoder/ixheaacd_latmdemux.c",
+        "decoder/ixheaacd_ld_mps_config.c",
+        "decoder/ixheaacd_ld_mps_dec.c",
         "decoder/ixheaacd_longblock.c",
         "decoder/ixheaacd_lpc.c",
         "decoder/ixheaacd_lpc_dec.c",
         "decoder/ixheaacd_lpfuncs.c",
         "decoder/ixheaacd_lpp_tran.c",
         "decoder/ixheaacd_lt_predict.c",
+        "decoder/ixheaacd_mps_apply_common.c",
+        "decoder/ixheaacd_mps_apply_m1.c",
+        "decoder/ixheaacd_mps_apply_m2.c",
+        "decoder/ixheaacd_mps_bitdec.c",
+        "decoder/ixheaacd_mps_blind.c",
+        "decoder/ixheaacd_mps_calc_m1m2_common.c",
+        "decoder/ixheaacd_mps_calc_m1m2_emm.c",
+        "decoder/ixheaacd_mps_calc_m1m2_tree_515x.c",
+        "decoder/ixheaacd_mps_calc_m1m2_tree_51sx.c",
+        "decoder/ixheaacd_mps_calc_m1m2_tree_52xx.c",
+        "decoder/ixheaacd_mps_calc_m1m2_tree_727x.c",
+        "decoder/ixheaacd_mps_calc_m1m2_tree_757x.c",
         "decoder/ixheaacd_mps_dec.c",
         "decoder/ixheaacd_mps_decorr.c",
+        "decoder/ixheaacd_mps_get_index.c",
         "decoder/ixheaacd_mps_hybrid_filt.c",
+        "decoder/ixheaacd_mps_initfuncs.c",
+        "decoder/ixheaacd_mps_m1m2_common.c",
+        "decoder/ixheaacd_mps_mdct_2_qmf.c",
         "decoder/ixheaacd_mps_parse.c",
+        "decoder/ixheaacd_mps_polyphase.c",
+        "decoder/ixheaacd_mps_poly_filt.c",
         "decoder/ixheaacd_mps_pre_mix.c",
+        "decoder/ixheaacd_mps_process.c",
+        "decoder/ixheaacd_mps_reshape_bb_env.c",
+        "decoder/ixheaacd_mps_res_block.c",
+        "decoder/ixheaacd_mps_res_channel.c",
+        "decoder/ixheaacd_mps_res_channel_info.c",
+        "decoder/ixheaacd_mps_res_longblock.c",
+        "decoder/ixheaacd_mps_res_pns_js_thumb.c",
+        "decoder/ixheaacd_mps_res_pulsedata.c",
+        "decoder/ixheaacd_mps_res_tns.c",
         "decoder/ixheaacd_mps_rom.c",
         "decoder/ixheaacd_mps_smoothing.c",
         "decoder/ixheaacd_mps_temp_process.c",
         "decoder/ixheaacd_mps_temp_reshape.c",
+        "decoder/ixheaacd_mps_tonality.c",
+        "decoder/ixheaacd_multichannel.c",
+        "decoder/ixheaacd_peak_limiter.c",
         "decoder/ixheaacd_pns_js_thumb.c",
         "decoder/ixheaacd_pred_vec_block.c",
         "decoder/ixheaacd_process.c",
         "decoder/ixheaacd_ps_bitdec.c",
         "decoder/ixheaacd_ps_dec.c",
+        "decoder/ixheaacd_ps_dec_flt.c",
         "decoder/ixheaacd_pvc_rom.c",
+        "decoder/ixheaacd_qmf_dec.c",
+        "decoder/ixheaacd_rev_vlc.c",
         "decoder/ixheaacd_rom.c",
         "decoder/ixheaacd_sbrdecoder.c",
         "decoder/ixheaacd_sbrdec_initfuncs.c",
@@ -113,15 +157,8 @@
         "decoder/ixheaacd_tcx_fwd_mdct.c",
         "decoder/ixheaacd_thumb_ps_dec.c",
         "decoder/ixheaacd_tns.c",
-        "decoder/ixheaacd_basic_funcs.c",
+        "decoder/ixheaacd_usac_ec.c",
         "decoder/ixheaacd_Windowing.c",
-        "decoder/ixheaacd_latmdemux.c",
-        "decoder/ixheaacd_multichannel.c",
-        "decoder/ixheaacd_drc_freq_dec.c",
-        "decoder/ixheaacd_mps_poly_filt.c",
-        "decoder/ixheaacd_huff_code_reorder.c",
-        "decoder/ixheaacd_rev_vlc.c",
-        "decoder/ixheaacd_qmf_dec.c",
         "decoder/drc_src/impd_drc_api.c",
         "decoder/drc_src/impd_drc_bitbuffer.c",
         "decoder/drc_src/impd_drc_dec.c",
@@ -177,67 +214,67 @@
                 ],
 
                 srcs: [
-                    "decoder/armv7/ixheaacd_qmf_dec_armv7.c",
                     "decoder/armv7/ixheaacd_fft_armv7.c",
                     "decoder/armv7/ixheaacd_function_selector_armv7.c",
-                    "decoder/armv7/ixheaacd_overlap_add1.s",
-                    "decoder/armv7/ixheaacd_overlap_add2.s",
-                    "decoder/armv7/ixheaacd_lap1.s",
-                    "decoder/armv7/ixheaacd_dec_DCT2_64_asm.s",
+                    "decoder/armv7/ixheaacd_qmf_dec_armv7.c",
+                    "decoder/armv7/ixheaacd_aac_ld_dec_rearrange.s",
                     "decoder/armv7/ixheaacd_apply_rot.s",
+                    "decoder/armv7/ixheaacd_apply_scale_fac.s",
                     "decoder/armv7/ixheaacd_autocorr_st2.s",
                     "decoder/armv7/ixheaacd_auto_corr.s",
                     "decoder/armv7/ixheaacd_calcmaxspectralline.s",
+                    "decoder/armv7/ixheaacd_calc_post_twid.s",
+                    "decoder/armv7/ixheaacd_calc_pre_twid.s",
+                    "decoder/armv7/ixheaacd_complex_fft_p2.s",
+                    "decoder/armv7/ixheaacd_complex_ifft_p2.s",
                     "decoder/armv7/ixheaacd_conv_ergtoamplitude.s",
                     "decoder/armv7/ixheaacd_conv_ergtoamplitudelp.s",
                     "decoder/armv7/ixheaacd_cos_sin_mod.s",
                     "decoder/armv7/ixheaacd_dct3_32.s",
                     "decoder/armv7/ixheaacd_decorr_filter2.s",
+                    "decoder/armv7/ixheaacd_dec_DCT2_64_asm.s",
+                    "decoder/armv7/ixheaacd_eld_decoder_sbr_pre_twiddle.s",
                     "decoder/armv7/ixheaacd_enery_calc_per_subband.s",
+                    "decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop1.s",
+                    "decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop2.s",
+                    "decoder/armv7/ixheaacd_esbr_fwd_modulation.s",
+                    "decoder/armv7/ixheaacd_esbr_qmfsyn64_winadd.s",
+                    "decoder/armv7/ixheaacd_esbr_radix4bfly.s",
                     "decoder/armv7/ixheaacd_expsubbandsamples.s",
                     "decoder/armv7/ixheaacd_ffr_divide16.s",
+                    "decoder/armv7/ixheaacd_fft32x32_ld2_armv7.s",
+                    "decoder/armv7/ixheaacd_fft_15_ld.s",
                     "decoder/armv7/ixheaacd_fwd_modulation.s",
                     "decoder/armv7/ixheaacd_harm_idx_zerotwolp.s",
                     "decoder/armv7/ixheaacd_imdct_using_fft.s",
                     "decoder/armv7/ixheaacd_inv_dit_fft_8pt.s",
+                    "decoder/armv7/ixheaacd_lap1.s",
+                    "decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s",
+                    "decoder/armv7/ixheaacd_mps_synt_out_calc.s",
+                    "decoder/armv7/ixheaacd_mps_synt_post_fft_twiddle.s",
+                    "decoder/armv7/ixheaacd_mps_synt_post_twiddle.s",
+                    "decoder/armv7/ixheaacd_mps_synt_pre_twiddle.s",
                     "decoder/armv7/ixheaacd_no_lap1.s",
+                    "decoder/armv7/ixheaacd_overlap_add1.s",
+                    "decoder/armv7/ixheaacd_overlap_add2.s",
                     "decoder/armv7/ixheaacd_post_radix_compute2.s",
                     "decoder/armv7/ixheaacd_post_radix_compute4.s",
                     "decoder/armv7/ixheaacd_post_twiddle.s",
-                    "decoder/armv7/ixheaacd_pre_twiddle_compute.s",
                     "decoder/armv7/ixheaacd_post_twiddle_overlap.s",
+                    "decoder/armv7/ixheaacd_pre_twiddle_compute.s",
                     "decoder/armv7/ixheaacd_radix4_bfly.s",
                     "decoder/armv7/ixheaacd_rescale_subbandsamples.s",
                     "decoder/armv7/ixheaacd_sbr_imdct_using_fft.s",
                     "decoder/armv7/ixheaacd_sbr_qmfanal32_winadds.s",
+                    "decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s",
                     "decoder/armv7/ixheaacd_sbr_qmfsyn64_winadd.s",
                     "decoder/armv7/ixheaacd_shiftrountine.s",
+                    "decoder/armv7/ixheaacd_shiftrountine_with_rnd_eld.s",
                     "decoder/armv7/ixheaacd_shiftrountine_with_round.s",
+                    "decoder/armv7/ixheaacd_shiftrountine_with_round_hq.s",
+                    "decoder/armv7/ixheaacd_tns_ar_filter_fixed.s",
                     "decoder/armv7/ixheaacd_tns_ar_filter_fixed_32x16.s",
                     "decoder/armv7/ixheaacd_tns_parcor2lpc_32x16.s",
-                    "decoder/armv7/ixheaacd_esbr_radix4bfly.s",
-                    "decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop1.s",
-                    "decoder/armv7/ixheaacd_esbr_qmfsyn64_winadd.s",
-                    "decoder/armv7/ixheaacd_complex_ifft_p2.s",
-                    "decoder/armv7/ixheaacd_complex_fft_p2.s",
-                    "decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop2.s",
-                    "decoder/armv7/ixheaacd_shiftrountine_with_round_hq.s",
-                    "decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s",
-                    "decoder/armv7/ixheaacd_esbr_fwd_modulation.s",
-                    "decoder/armv7/ixheaacd_mps_synt_pre_twiddle.s",
-                    "decoder/armv7/ixheaacd_mps_synt_post_twiddle.s",
-                    "decoder/armv7/ixheaacd_calc_pre_twid.s",
-                    "decoder/armv7/ixheaacd_calc_post_twid.s",
-                    "decoder/armv7/ixheaacd_mps_synt_out_calc.s",
-                    "decoder/armv7/ixheaacd_mps_synt_post_fft_twiddle.s",
-                    "decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s",
-                    "decoder/armv7/ixheaacd_shiftrountine_with_rnd_eld.s",
-                    "decoder/armv7/ixheaacd_eld_decoder_sbr_pre_twiddle.s",
-                    "decoder/armv7/ixheaacd_fft_15_ld.s",
-                    "decoder/armv7/ixheaacd_aac_ld_dec_rearrange.s",
-                    "decoder/armv7/ixheaacd_fft32x32_ld2_armv7.s",
-                    "decoder/armv7/ixheaacd_apply_scale_fac.s",
-                    "decoder/armv7/ixheaacd_tns_ar_filter_fixed.s",
                 ],
             },
         },
@@ -251,27 +288,27 @@
             ],
 
             srcs: [
-                "decoder/armv8/ixheaacd_qmf_dec_armv8.c",
                 "decoder/armv8/ixheaacd_function_selector_armv8.c",
-                "decoder/armv8/ixheaacd_calcmaxspectralline.s",
-                "decoder/armv8/ixheaacd_sbr_imdct_using_fft.s",
-                "decoder/armv8/ixheaacd_imdct_using_fft.s",
-                "decoder/armv8/ixheaacd_no_lap1.s",
-                "decoder/armv8/ixheaacd_post_twiddle.s",
-                "decoder/armv8/ixheaacd_pre_twiddle.s",
-                "decoder/armv8/ixheaacd_sbr_qmfsyn64_winadd.s",
-                "decoder/armv8/ixheaacd_overlap_add1.s",
-                "decoder/armv8/ixheaacd_overlap_add2.s",
-                "decoder/armv8/ixheaacd_shiftrountine_with_round_eld.s",
-                "decoder/armv8/ixheaacd_fft32x32_ld2_armv8.s",
-                "decoder/armv8/ixheaacd_inv_dit_fft_8pt.s",
-                "decoder/armv8/ixheaacd_shiftrountine_with_round.s",
-                "decoder/armv8/ixheaacd_sbr_qmf_analysis32_neon.s",
-                "decoder/armv8/ixheaacd_postradixcompute4.s",
+                "decoder/armv8/ixheaacd_qmf_dec_armv8.c",
                 "decoder/armv8/ixheaacd_apply_scale_factors.s",
+                "decoder/armv8/ixheaacd_calcmaxspectralline.s",
                 "decoder/armv8/ixheaacd_cos_sin_mod_loop1.s",
                 "decoder/armv8/ixheaacd_cos_sin_mod_loop2.s",
+                "decoder/armv8/ixheaacd_fft32x32_ld2_armv8.s",
+                "decoder/armv8/ixheaacd_imdct_using_fft.s",
+                "decoder/armv8/ixheaacd_inv_dit_fft_8pt.s",
+                "decoder/armv8/ixheaacd_no_lap1.s",
+                "decoder/armv8/ixheaacd_overlap_add1.s",
+                "decoder/armv8/ixheaacd_overlap_add2.s",
+                "decoder/armv8/ixheaacd_postradixcompute4.s",
+                "decoder/armv8/ixheaacd_post_twiddle.s",
                 "decoder/armv8/ixheaacd_post_twiddle_overlap.s",
+                "decoder/armv8/ixheaacd_pre_twiddle.s",
+                "decoder/armv8/ixheaacd_sbr_imdct_using_fft.s",
+                "decoder/armv8/ixheaacd_sbr_qmfsyn64_winadd.s",
+                "decoder/armv8/ixheaacd_sbr_qmf_analysis32_neon.s",
+                "decoder/armv8/ixheaacd_shiftrountine_with_round.s",
+                "decoder/armv8/ixheaacd_shiftrountine_with_round_eld.s",
             ],
         },
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 471681e..a06195d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,166 +1,29 @@
-cmake_minimum_required(VERSION 3.5)
+cmake_minimum_required(VERSION 3.5.1)
+project(libxaac C CXX)
+enable_language(ASM)
 
 set(XAAC_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
 set(XAAC_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}")
-
-if("${XAAC_ROOT}" STREQUAL "${XAAC_CONFIG_DIR}")
-  message(
-    FATAL_ERROR
-      "Building from within the libxaac source tree is not supported.\n"
-      "Hint: Run these commands\n"
-      "$ rm -rf CMakeCache.txt CMakeFiles\n"
-      "$ mkdir -p ./build\n"
-      "$ cd ./build\n"
-      "And re-run CMake from the build directory.")
-endif()
+find_package(Threads REQUIRED)
 
 set(CMAKE_STATIC_LIBRARY_PREFIX "")
 
-if(SANITIZE)
-  string(TOLOWER ${SANITIZE} SANITIZE)
+include("${XAAC_ROOT}/cmake/utils.cmake")
 
-  set(CMAKE_SANITIZER_C_FLAGS "-fno-omit-frame-pointer -fsanitize=${SANITIZE}")
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_SANITIZER_C_FLAGS}")
+libxaac_add_compile_options()
+libxaac_add_definitions()
+
+if(NOT COMPILER_HAS_SANITIZER)
+  libxaac_set_link_libraries()
+else()
+  libxaac_fuzzer_set_link_libraries()
 endif()
 
-list(
-  APPEND
-    LIBXAACDEC_SRCS
-    "${XAAC_ROOT}/decoder/ixheaacd_aacdecoder.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_aacpluscheck.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_aac_imdct.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_aac_rom.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_aac_tns.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_acelp_bitparse.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_acelp_decode.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_acelp_mdct.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_acelp_tools.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_adts_crc_check.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_api.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_arith_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_avq_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_avq_rom.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_basic_ops.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_bitbuffer.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_block.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_channel.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_common_initfuncs.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_common_lpfuncs.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_common_rom.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_create.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_decode_main.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_dsp_fft32x32s.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_env_calc.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_env_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_env_extr.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_esbr_envcal.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_esbr_polyphase.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_esbr_rom.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_esbr_fft.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_ext_ch_ele.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_fft.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_freq_sca.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_fwd_alias_cnx.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_hbe_trans.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_headerdecode.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_hufftables.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_huff_tools.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_hybrid.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_imdct.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_initfuncs.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_init_config.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_longblock.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_lpc.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_lpc_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_lpfuncs.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_lpp_tran.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_lt_predict.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_decorr.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_hybrid_filt.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_parse.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_pre_mix.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_rom.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_smoothing.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_temp_process.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_temp_reshape.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_pns_js_thumb.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_pred_vec_block.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_process.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_ps_bitdec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_ps_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_pvc_rom.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_rom.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_sbrdecoder.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_sbrdec_initfuncs.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_sbrdec_lpfuncs.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_sbr_crc.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_sbr_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_sbr_rom.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_spectrum_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_stereo.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_tcx_fwd_alcnx.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_tcx_fwd_mdct.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_thumb_ps_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_tns.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_basic_funcs.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_Windowing.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_latmdemux.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_multichannel.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_drc_freq_dec.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_mps_poly_filt.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_huff_code_reorder.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_rev_vlc.c"
-    "${XAAC_ROOT}/decoder/ixheaacd_qmf_dec.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_api.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_bitbuffer.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_dec.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_dynamic_payload.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_eq.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_extr_delta_coded_info.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_filter_bank.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_gain_dec.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_gain_decoder.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_init.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_interface_decoder.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_loudness_control.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_main_td_process.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_multiband.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_parametric_dec.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_peak_limiter.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_process.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_rom.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_selection_process.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_selection_process_drcset_selection.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_selection_process_init.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_shape_filter.c"
-    "${XAAC_ROOT}/decoder/drc_src/impd_drc_static_payload.c")
+add_subdirectory(decoder)
 
-list(APPEND LIBXAACDEC_X86_SRCS
-            "${XAAC_ROOT}/decoder/generic/ixheaacd_qmf_dec_generic.c"
-            "${XAAC_ROOT}/decoder/x86/ixheaacd_function_selector_x86.c")
+if(NOT COMPILER_HAS_SANITIZER)
+  add_subdirectory(test)
+else()
+  add_subdirectory(fuzzer)
+endif()
 
-set(LIBXAACDEC_INCLUDES ${XAAC_ROOT}/decoder ${XAAC_ROOT}/decoder/drc_src)
-
-set(LIBXAACDEC_C_FLAGS "${LIBXAACDEC_X86_C_FLAGS}")
-
-include_directories(${LIBXAACDEC_INCLUDES} ${LIBXAACDEC_X86_INCLUDES})
-add_library(libxaacdec ${LIBXAACDEC_SRCS} ${LIBXAACDEC_X86_SRCS})
-set_target_properties(libxaacdec
-                      PROPERTIES COMPILE_FLAGS "${LIBXAACDEC_C_FLAGS}")
-
-list(APPEND XAACDEC_SRCS
-            "${XAAC_ROOT}/test/ixheaacd_error.c"
-            "${XAAC_ROOT}/test/ixheaacd_fileifc.c"
-            "${XAAC_ROOT}/test/ixheaacd_main.c"
-            "${XAAC_ROOT}/test/ixheaacd_metadata_read.c")
-
-add_executable(xaacdec ${XAACDEC_SRCS})
-
-target_link_libraries(xaacdec libxaacdec m)
-set_target_properties(
-  xaacdec
-  PROPERTIES
-    COMPILE_FLAGS
-    "-UARM_PROFILE_HW -UARM_PROFILE_BOARD -DECLIPSE -DDRC_ENABLE -DMULTICHANNEL_ENABLE -DENABLE_DRC"
-  )
diff --git a/LICENSE b/LICENSE
index 6245b2d..edcd8c2 100644
--- a/LICENSE
+++ b/LICENSE
@@ -176,18 +176,7 @@
 
    END OF TERMS AND CONDITIONS
 
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
+   Copyright (c) 2018, The Android Open Source Project
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -200,4 +189,3 @@
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-Create Short LinkX
\ No newline at end of file
diff --git a/METADATA b/METADATA
index d97975c..8a913f8 100644
--- a/METADATA
+++ b/METADATA
@@ -1,3 +1,15 @@
+name: "libxaac"
+description: "Android fork of the xaac library."
 third_party {
+  url {
+    type: GIT
+    value: "https://github.com/ittiam-systems/libxaac.git"
+  }
+  version: "v0.1.5"
   license_type: NOTICE
+  last_upgrade_date {
+    year: 2023
+    month: 3
+    day: 13
+  }
 }
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..75069a5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,252 @@
+# Introduction of the Ex-HEAAC Decoder
+
+
+Ex-HEAAC (Extended HE AAC), the latest upgrade to the MPEG AAC codec family,
+is the audio codec of choice for digital radio and low bit rate
+streaming applications. Selected as the mandatory audio codec for DRM
+(Digital Radio Mondiale), Ex-HEAAC bridges the gap between speech and
+audio coding, and provides consistent high quality audio for all signal 
+types, such as speech, music or mixed content.
+
+Another important feature is the codec’s coding efficiency. The audio 
+codec produces excellent sound for both music and speech, delivering 
+high quality performance at bit rates starting as low as 6 kbit/s for 
+mono and 12 kbit/s for stereo services. Thus Ex-HEAAC streaming apps and
+streaming radio players may switch to very low bit rate streams and 
+offer a continuous playback even while the network is congested. Once 
+more bandwidth becomes available on the network again, the Ex-HEAAC
+client can request a higher bitrate version and seamless switch over 
+the full range of bitrates. Audio bitrate that’s being saved due to the 
+improved coding efficiency can be used to improve video quality. Ex-HEAAC
+supports AAC and HEAAC v2 as well.
+
+AAC is a popular audio coding technique recommended by MPEG committee. 
+The codec handles audio signals sampled in the range of 8 kHz to 96 
+kHz. It operates on a frame of 1024 samples. The bit-rates supported 
+are in the range of 8 kbps to 576 kbps per channel.
+
+SBR and PS are the tools used in combination with the AAC general audio 
+codec resulting in HEAAC v2 (also known as Enhanced AAC Plus). It
+provides significant increase in coding gain. In SBR, the high-band, 
+i.e. the high frequency part of the spectrum is replicated using the 
+low-band. In PS, channel redundancy is exploited and parameters are 
+extracted from a down-mixed channel.The bit-rate is by far below the 
+bit-rate required when using conventional AAC coding. This translates 
+into better quality at lower bit-rates.
+
+
+# Introduction to Ex-HEAAC Decoder APIs
+
+## Files to be included are
+* [`ixheaacd_apicmd_standards.h`](decoder/ixheaacd_apicmd_standards.h)
+* [`ixheaacd_type_def.h`](decoder/ixheaacd_type_def.h)
+* [`ixheaacd_memory_standards.h`](decoder/ixheaacd_memory_standards.h)
+* [`ixheaacd_error_standards.h`](decoder/ixheaacd_error_standards.h)
+* [`ixheaacd_error_handler.h`](decoder/ixheaacd_error_handler.h)
+* [`ixheaacd_aac_config.h`](decoder/ixheaacd_aac_config.h)
+
+## Decoder APIs
+
+A single API is used to get and set configurations and execute the decode thread, based on command index passed.
+* ia_xheaacd_dec_api
+
+| **API Command** | **API Sub Command** | **Description** |
+|------|------|------|
+|IA_API_CMD_GET_LIB_ID_STRINGS | IA_CMD_TYPE_LIB_NAME | Gets the decoder library name |
+|IA_API_CMD_GET_LIB_ID_STRINGS | IA_CMD_TYPE_LIB_VERSION | Gets the decoder version |
+|IA_API_CMD_GET_API_SIZE | 0 | Gets the memory requirements size of the API |
+|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS | Sets the configuration parameters of the Ex-HEAAC v2 Decoder to default values |
+|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS | Sets the attributes(size, priority, alignment) of all memory types required by the application onto the memory structure |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ	| Sets the core AAC sampling frequency for RAW header decoding | 
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PCM_WDSZ | Sets the bit width of the output pcm samples.The value has to be 16 |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX | Sets the parameter whether the output needs to be down-mix to mono(1) or not(0) |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_TOSTEREO	| Sets the flag to disable interleave mono to stereo |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DSAMPLE	| Sets the parameter whether the output needs to be downsampled(1) or not(0).This is valid only for Ex-HEAAC v2 build | 
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_FRAMEOK	| Sets the flag to 0 or 1 to indicate whether the current frame is valid(1) or not(0) |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_ISMP4	| Sets the flag to 0 or 1 to indicate whether given test vector is an mp4 file or not |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DISABLE_SYNC	| Sets the flag of ADTS syncing or not ADTS syncing as 0 or 1 |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE	| Sets the parameter auto SBR upsample to 0 or 1.Used in case of stream changing from SBR present to SBR not present.This is valid only for Ex-HEAAC v2 build |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_MAX_CHANNEL	| Sets the maximum number of channels present.Its maximum value is 2 for stereo library and 8 for multichannel library |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_COUP_CHANNEL	| Sets the number of coupling channels to be used for coupling.It can take values from 0 to 16.This command is supported only if the library has multichannel support |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX_STEREO	| Sets the flag of downmixing n number of channels to stereo.Can be 0 or 1. This command is supported only if the library has multichannel support |
+|IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISLOAS	| Sets the flag indicating that the input file is a .loas file.Can be 0 or 1 |
+|IA_API_CMD_GET_N_MEMTABS	| 0 | Gets the number of memory types |
+|IA_API_CMD_GET_N_TABLES	| 0 | Gets the number of tables |
+|IA_API_CMD_GET_MEM_INFO_SIZE	| 0 | Gets the size of the memory type being referred to by the index |
+|IA_API_CMD_GET_MEM_INFO_ALIGNMENT	| 0 | Gets the alignment information of the memory-type being referred to by the index |
+|IA_API_CMD_GET_MEM_INFO_TYPE	| 0 | Gets the type of memory being referred to by the index |
+|IA_API_CMD_SET_MEM_PTR	| 0 | Sets the pointer to the memory being referred to by the index to the input value |
+|IA_API_CMD_GET_TABLE_INFO_SIZE	| 0 | Gets the size of the memory type being referred to by the index |
+|IA_API_CMD_GET_TABLE_INFO_ALIGNMENT	| 0 | Gets the alignment information of the memory-type being referred to by the index |
+|IA_API_CMD_GET_TABLE_PTR	| 0 | Gets the address of the current location of the table |
+|IA_API_CMD_SET_TABLE_PTR	| 0 | Sets the relocated table address |
+|IA_API_CMD_INPUT_OVER	| 0 | Signals the end of bit-stream to the library |
+|IA_API_CMD_SET_INPUT_BYTES	| 0 | Sets the number of bytes available in the input buffer for initialization |
+|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_PROCESS	| Search for the valid header, does header decode to get the parameters and initializes state and configuration structure |
+|IA_API_CMD_INIT | IA_CMD_TYPE_INIT_DONE_QUERY	| Checks if the initialization process has completed |
+|IA_API_CMD_GET_CURIDX_INPUT_BUF | 0 | Gets the number of input buffer bytes consumed by the last initialization |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ | Gets the sampling frequency | 
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS | Gets the output number of channels |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ | Gets the output PCM word size |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE | Gets the channel mode. (Mono or PS/Stereo/Dual-mono) |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK	| Gets the channel mask |
+|IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE | Gets the SBR mode (Present/ Not Present).This is valid only for Ex-HEAAC v2 build |
+|IA_API_CMD_EXECUTE | IA_CMD_TYPE_DO_EXECUTE	| Executes the decode thread |
+|IA_API_CMD_EXECUTE | IA_CMD_TYPE_DONE_QUERY	| Checks if the end of decode has been reached |
+|IA_API_CMD_GET_OUTPUT_BYTES | 0 | Gets the number of bytes output by the decoder in the last frame |
+
+## Flowchart of calling sequence
+
+![API Flowchart](docs/Api_flowchart.png)
+
+#  Building the Ex-HEAAC Decoder
+
+## Building for AOSP
+* Makefiles for building the Ex-HEAAC decoder library is provided in root(`libxaac/`) folder.
+* Makefiles for building the Ex-HEAAC decoder testbench is provided in `test` folder.
+* Build the library followed by the application using the below commands:
+Go to root directory
+```
+$ mm
+```
+
+## Using CMake
+Users can also use cmake to build for `x86`, `x86_64`, and Windows (MSVS project) platforms.
+
+### Creating MSVS project files
+To create MSVS project files for the Ex-HEAAC decoder from cmake, run the following commands:
+```
+Go to the root directory(libxaac/) of the Ex-HEAAC Decoder.
+Create a new folder in the project root directory and move to the newly created folder.
+
+$ cd <path to libxaac>
+$ mkdir bin
+$ cd bin
+$ cmake -G "Visual Studio 15 2017" ..
+```
+
+The above command creates MSVS 2017 project files. If the version is different, modify the generator name accordingly.
+The Ex-HEAAC decoder can be built using these project files.
+
+### Building for native platforms
+Run the following commands to build the Ex-HEAAC Decoder for native platform:
+```
+Go to the root directory(libxaac/) of the Ex-HEAAC Decoder.
+Create a new folder in the project root directory and move to the newly created folder.
+
+$ cd <path to libxaac>
+$ mkdir bin
+$ cd bin
+$ cmake ..
+$ cmake --build .
+```
+
+### Cross-compiler based builds
+### Building for x86_32 on a x86_64 Linux machine
+```
+$ cd <path to libxaac>
+$ mkdir build
+$ cd build
+$ CFLAGS="-m32" CXXFLAGS="-m32" LDFLAGS="-m32" cmake ..
+$ make
+```
+
+### Building for aarch32/aarch64
+Update 'CMAKE_C_COMPILER', 'CMAKE_CXX_COMPILER', 'CMAKE_C_COMPILER_AR', and 'CMAKE_CXX_COMPILER_AR' in CMAKE_TOOLCHAIN_FILE passed below
+```
+$ cd <path to libxaac>
+$ mkdir build
+$ cd build
+```
+
+### For aarch64
+```
+$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/aarch64_toolchain.cmake
+$ make
+```
+
+### For aarch32
+```
+$ cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/aarch32_toolchain.cmake
+$ make
+```
+
+# Running the Ex-HEAAC Decoder
+
+The Ex-HEAAC Decoder can be run by providing command-line parameters(CLI options) directly or by providing a parameter file as a command line argument.
+
+Command line usage : 
+```
+<executable> -ifile:<input_file> -imeta:<meta_data_file> -ofile:<output_file> [options]
+
+[options] can be,
+[-mp4:<mp4_flag>]
+[-pcmsz:<pcmwordsize>]
+[-dmix:<down_mix>]
+[-esbr_hq:<esbr_hq_flag>]
+[-esbr_ps:<esbr_ps_flag>]
+[-tostereo:<interleave_to_stereo>]
+[-dsample:<down_sample_sbr>]
+[-drc_cut_fac:<drc_cut_factor>]
+[-drc_boost_fac:<drc_boost_factor>]
+[-drc_target_level:<drc_target_level>]
+[-drc_heavy_comp:<drc_heavy_compression>]
+[-effect:<effect_type>]
+[-target_loudness:<target_loudness>]
+[-nosync:<disable_sync>]
+[-sbrup:<auto_sbr_upsample>]
+[-flflag:<framelength_flag>}
+[-fs:<RAW_sample_rate>]
+[-maxchannel:<maximum_num_channels>]
+[-coupchannel:<coupling_channel>]
+[-downmix:<down_mix_stereo>]
+[-fs480:<ld_frame_size>]
+[-ld_testing:<ld_testing_flag>]
+[-peak_limiter_off:<peak_limiter_off_flag>]
+[-err_conceal:<error_concealment_flag>]
+
+where,
+  <input_file>             is the input AAC/HEAACv1/HEAACv2/USAC file name.
+  <meta_data_file>         is a text file which contains metadata. To be given when -mp4:1 is enabled.
+  <output_file>            is the output file name.
+  <mp4_flag>               is a flag that should be set to 1 when passing raw stream along with meta data text file.
+  <pcmwordsize>            is the bits per sample info. value can be 16 or 24.
+  <down_mix>               is to enable/disable always mono output. Default 1.
+  <esbr_hq_flag>           is to enable/disable high quality eSBR. Default 0.
+  <esbr_ps_flag>           is to indicate eSBR with PS. Default 0.
+  <interleave_to_stereo>   is to enable/disable always interleaved to stereo output. Default 1.
+  <down_sample_sbr>        is to enable/disable down-sampled SBR output. Default auto identification from header.
+  <drc_cut_factor>         is to set DRC cut factor value. Default value is 0.
+  <drc_boost_factor>       is to set DRC boost factor. Default value is 0.
+  <drc_target_level>       is to set DRC target reference level. Default value is 108.
+  <drc_heavy_compression>  is to enable/disable DRC heavy compression. Default value is 0.
+  <effect_type>            is to set DRC effect type. Default value is 0.
+  <target_loudness>        is to set target loudness level. Default value is -24.
+  <disable_sync>           is to disable the ADTS/ADIF sync search i.e when enabled the decoder expects the header to be at the start of input buffer. Default 0.
+  <auto_sbr_upsample>      is to enable(1) or disable(0) auto SBR upsample in case of stream changing from SBR present to SBR not present. Default 1.
+  <framelength_flag>       is flag for decoding framelength of 1024 or 960. 1 to decode 960 frame length, 0 to decode 1024 frame length.
+                           Frame length value in the GA header will override this option. Default 0.
+  <RAW_sample_rate>        is to indicate the core AAC sample rate for a RAW stream. If this is specified no other file format headers are searched for.
+  <maximum_num_channels>   is the number of maxiumum channels the input may have. Default is 6 for multichannel libraries and 2 for stereo libraries.
+  <coupling_channel>       is element instance tag of independent coupling channel to be mixed. Default is 0.
+  <down_mix_stereo>        is flag for Downmix. Give 1 to get stereo (downmix) output. Default is 0.
+  <ld_frame_size>          is to indicate ld frame size. 0 is for 512 frame length, 1 is for 480 frame length. Default value is 512 (0).
+  <ld_testing_flag>        is to enable/disable ld decoder testing. Default value is 0.
+  <peak_limiter_off_flag>  is to enable/disable peak limiter. Default value is 0.
+  <error_concealment_flag> is to enable/disable error concealment. Default value is 0.
+
+```
+Sample CLI:
+```
+<xaac_dec_exe> -ifile:in_file.aac -ofile:out_file.wav -pcmsz:16
+```
+
+# Validating the Ex-HEAAC Decoder
+
+Conformance testing for AAC/HEAAC v1/HEAAC v2 mainly involves comparing 
+decoder under test output with the ISO and 3GPP reference decoded output.
+
+Testing for USAC is done using encoded streams generated using ISO USAC 
+reference encoder. The output generated by ITTIAM USAC decoder is 
+compared against the output generated by ISO USAC decoder for 16-bit 
+conformance on the respective(ARMv7, ARMv8, X86_32, X86_64) platforms.
diff --git a/cmake/toolchains/aarch32_toolchain.cmake b/cmake/toolchains/aarch32_toolchain.cmake
new file mode 100644
index 0000000..69c4c36
--- /dev/null
+++ b/cmake/toolchains/aarch32_toolchain.cmake
@@ -0,0 +1,11 @@
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR aarch32)
+
+# Modify these variables with paths to appropriate compilers that can produce
+# armv7 targets
+
+# Specify the cross compiler
+set(CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc)
+set(CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++)
+set(CMAKE_C_COMPILER_AR arm-none-linux-gnueabi-ar)
+set(CMAKE_CXX_COMPILER_AR arm-none-linux-gnueabi-ar)
diff --git a/cmake/toolchains/aarch64_toolchain.cmake b/cmake/toolchains/aarch64_toolchain.cmake
new file mode 100644
index 0000000..ddeb998
--- /dev/null
+++ b/cmake/toolchains/aarch64_toolchain.cmake
@@ -0,0 +1,19 @@
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_PROCESSOR aarch64)
+
+# Modify these variables with paths to appropriate compilers that can produce
+# armv7 targets
+
+# Specify the cross compiler
+SET(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
+SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
+
+# Where is the target environment
+SET(CMAKE_FIND_ROOT_PATH  aarch64-linux-gnu-gnueabihf)
+
+# Search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# For libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
new file mode 100644
index 0000000..6edf2f6
--- /dev/null
+++ b/cmake/utils.cmake
@@ -0,0 +1,54 @@
+include(CheckCXXCompilerFlag)
+set(CMAKE_C_STANDARD 99)
+# Adds compiler options for all targets
+function(libxaac_add_compile_options)
+  if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
+    add_compile_options(-std=gnu99 -march=armv8-a)
+  elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32")
+    add_compile_options(-O3 -Wall -std=c99 -mcpu=cortex-a8 -march=armv7-a -mfloat-abi=softfp -mfpu=neon)
+  elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
+    add_compile_options(-O3 -Wall -Wsequence-point -fwrapv)
+  endif()
+
+  set(CMAKE_REQUIRED_FLAGS -fsanitize=fuzzer-no-link)
+  check_cxx_compiler_flag(-fsanitize=fuzzer-no-link
+                          COMPILER_HAS_SANITIZE_FUZZER)
+  unset(CMAKE_REQUIRED_FLAGS)
+
+  if(DEFINED SANITIZE)
+    set(CMAKE_REQUIRED_FLAGS -fsanitize=${SANITIZE})
+    check_cxx_compiler_flag(-fsanitize=${SANITIZE} COMPILER_HAS_SANITIZER)
+    unset(CMAKE_REQUIRED_FLAGS)
+
+    if(NOT COMPILER_HAS_SANITIZER)
+      message(
+        FATAL_ERROR "ERROR: Compiler doesn't support -fsanitize=${SANITIZE}")
+      return()
+    endif()
+    add_compile_options(-fno-omit-frame-pointer -fsanitize=${SANITIZE})
+  endif()
+
+endfunction()
+
+# Adds defintions for all targets
+function(libxaac_add_definitions)
+  if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
+    add_definitions(-DARMV8 -DDEFAULT_ARCH=D_ARCH_ARMV8_GENERIC)
+  elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch32")
+    add_definitions(-DARMV7 -DDEFAULT_ARCH=D_ARCH_ARM_A9Q)
+  elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
+    add_definitions(-DX86 -DX86_LINUX=1 -DDISABLE_AVX2 -DDEFAULT_ARCH=D_ARCH_X86_SSE42)
+  endif()
+endfunction()
+
+# Adds libraries needed for executables
+function(libxaac_set_link_libraries)
+  if(NOT MSVC)
+    link_libraries(Threads::Threads --static)
+  endif()
+endfunction()
+
+#Adds libraries for fuzzer
+function(libxaac_fuzzer_set_link_libraries)
+  link_libraries(Threads::Threads m)
+endfunction()
\ No newline at end of file
diff --git a/decoder/CMakeLists.txt b/decoder/CMakeLists.txt
new file mode 100644
index 0000000..dca2bff
--- /dev/null
+++ b/decoder/CMakeLists.txt
@@ -0,0 +1,145 @@
+#src files
+add_library(libxaacdec "")
+
+if(ARG_FUZZER)
+  target_link_libraries(libxaacdec PRIVATE -fsanitize=address)
+endif()
+
+target_sources(libxaacdec
+               PRIVATE
+               "${XAAC_ROOT}/decoder/ixheaacd_aacdecoder.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_aacpluscheck.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_aac_ec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_aac_imdct.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_aac_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_aac_tns.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_acelp_bitparse.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_acelp_decode.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_acelp_mdct.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_acelp_tools.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_adts_crc_check.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_api.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_arith_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_avq_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_avq_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_basic_funcs.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_basic_ops.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_bitbuffer.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_block.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_channel.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_common_initfuncs.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_common_lpfuncs.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_common_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_create.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_decode_main.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_drc_freq_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_dsp_fft32x32s.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_ec_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_env_calc.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_env_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_env_extr.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_esbr_envcal.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_esbr_fft.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_esbr_polyphase.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_esbr_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_ext_ch_ele.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_fft.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_fft_ifft_32x32.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_fft_ifft_32x32_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_freq_sca.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_fwd_alias_cnx.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_hbe_dft_trans.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_hbe_trans.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_headerdecode.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_hufftables.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_huff_code_reorder.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_huff_tools.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_hybrid.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_imdct.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_initfuncs.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_init_config.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_latmdemux.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_ld_mps_config.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_ld_mps_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_longblock.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_lpc.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_lpc_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_lpfuncs.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_lpp_tran.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_lt_predict.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_apply_common.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_apply_m1.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_apply_m2.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_bitdec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_blind.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_calc_m1m2_common.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_calc_m1m2_emm.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_calc_m1m2_tree_515x.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_calc_m1m2_tree_51sx.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_calc_m1m2_tree_52xx.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_calc_m1m2_tree_727x.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_calc_m1m2_tree_757x.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_decorr.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_get_index.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_hybrid_filt.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_initfuncs.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_m1m2_common.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_mdct_2_qmf.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_parse.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_polyphase.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_poly_filt.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_pre_mix.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_process.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_reshape_bb_env.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_res_block.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_res_channel.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_res_channel_info.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_res_longblock.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_res_pns_js_thumb.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_res_pulsedata.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_res_tns.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_smoothing.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_temp_process.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_temp_reshape.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_mps_tonality.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_multichannel.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_peak_limiter.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_pns_js_thumb.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_pred_vec_block.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_process.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_ps_bitdec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_ps_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_ps_dec_flt.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_pvc_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_qmf_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_rev_vlc.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_sbrdecoder.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_sbrdec_initfuncs.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_sbrdec_lpfuncs.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_sbr_crc.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_sbr_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_sbr_rom.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_spectrum_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_stereo.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_tcx_fwd_alcnx.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_tcx_fwd_mdct.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_thumb_ps_dec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_tns.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_usac_ec.c"
+               "${XAAC_ROOT}/decoder/ixheaacd_Windowing.c")
+
+set(LIBXAACDEC_INCLUDES ${XAAC_ROOT}/decoder ${XAAC_ROOT}/decoder/drc_src)
+include_directories(${LIBXAACDEC_INCLUDES})
+
+add_subdirectory(drc_src)
+
+if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch32")
+  add_subdirectory(armv7)
+elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
+  add_subdirectory(armv8)
+else()
+  add_subdirectory(x86)
+endif()
diff --git a/decoder/armv7/CMakeLists.txt b/decoder/armv7/CMakeLists.txt
new file mode 100644
index 0000000..148cfc2
--- /dev/null
+++ b/decoder/armv7/CMakeLists.txt
@@ -0,0 +1,66 @@
+#src files
+target_sources(libxaacdec
+               PRIVATE
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_fft_armv7.c"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_function_selector_armv7.c"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_qmf_dec_armv7.c"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_aac_ld_dec_rearrange.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_auto_corr.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_autocorr_st2.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_apply_rot.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_apply_scale_fac.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_calcmaxspectralline.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_conv_ergtoamplitude.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_conv_ergtoamplitudelp.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_cos_sin_mod.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_calc_pre_twid.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_calc_post_twid.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_complex_ifft_p2.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_complex_fft_p2.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_dct3_32.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_decorr_filter2.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_dec_DCT2_64_asm.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_enery_calc_per_subband.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_expsubbandsamples.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop1.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop2.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_esbr_fwd_modulation.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_esbr_radix4bfly.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_esbr_qmfsyn64_winadd.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_eld_decoder_sbr_pre_twiddle.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_ffr_divide16.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_fft_15_ld.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_fft32x32_ld2_armv7.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_fwd_modulation.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_harm_idx_zerotwolp.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_imdct_using_fft.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_inv_dit_fft_8pt.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_lap1.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_mps_synt_pre_twiddle.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_mps_synt_post_twiddle.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_mps_synt_out_calc.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_mps_synt_post_fft_twiddle.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_no_lap1.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_overlap_add1.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_overlap_add2.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_post_radix_compute2.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_post_radix_compute4.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_post_twiddle.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_pre_twiddle_compute.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_post_twiddle_overlap.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_radix4_bfly.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_rescale_subbandsamples.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_sbr_imdct_using_fft.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_sbr_qmfsyn64_winadd.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_shiftrountine.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_shiftrountine_with_rnd_eld.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_shiftrountine_with_round.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_shiftrountine_with_round_hq.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_tns_ar_filter_fixed_32x16.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_tns_parcor2lpc_32x16.s"
+               "${XAAC_ROOT}/decoder/armv7/ixheaacd_tns_ar_filter_fixed.s")
+
+include_directories(${XAAC_ROOT}/decoder/armv7)
diff --git a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c
index 75ca6b3..ac633bf 100644
--- a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c
+++ b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c
@@ -61,15 +61,15 @@
 WORD32 (*ixheaacd_fix_div)(WORD32, WORD32) = &ixheaacd_fix_div_armv7;
 
 VOID(*ixheaacd_covariance_matrix_calc)
-(WORD32 *, ixheaacd_lpp_trans_cov_matrix *,
+(WORD32 *, ia_lpp_trans_cov_matrix *,
  WORD32) = &ixheaacd_covariance_matrix_calc_armv7;
 
 VOID(*ixheaacd_covariance_matrix_calc_2)
-(ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32,
+(ia_lpp_trans_cov_matrix *, WORD32 *, WORD32,
  WORD16) = &ixheaacd_covariance_matrix_calc_2_armv7;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_dec;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -155,13 +155,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_dec;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec;
 
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -169,7 +169,7 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_armv7;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_armv7;
 
 VOID(*ixheaacd_overlap_out_copy)
diff --git a/decoder/armv7/ixheaacd_function_selector_armv7.c b/decoder/armv7/ixheaacd_function_selector_armv7.c
index c9f41f9..08691ab 100644
--- a/decoder/armv7/ixheaacd_function_selector_armv7.c
+++ b/decoder/armv7/ixheaacd_function_selector_armv7.c
@@ -45,6 +45,10 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -68,15 +72,15 @@
 WORD32 (*ixheaacd_fix_div)(WORD32, WORD32) = &ixheaacd_fix_div_armv7;
 
 VOID(*ixheaacd_covariance_matrix_calc)
-(WORD32 *, ixheaacd_lpp_trans_cov_matrix *,
+(WORD32 *, ia_lpp_trans_cov_matrix *,
  WORD32) = &ixheaacd_covariance_matrix_calc_armv7;
 
 VOID(*ixheaacd_covariance_matrix_calc_2)
-(ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32,
+(ia_lpp_trans_cov_matrix *, WORD32 *, WORD32,
  WORD16) = &ixheaacd_covariance_matrix_calc_2_armv7;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_armv7;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -161,12 +165,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_armv7;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_armv7;
+
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_armv7;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -174,11 +179,11 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_armv7;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_armv7;
 
 VOID(*ixheaacd_overlap_out_copy)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
  const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_armv7;
 
 VOID(*ixheaacd_pretwiddle_compute)
@@ -194,18 +199,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_armv7;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_armv7;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_armv7;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_armv7;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_armv7;
@@ -214,14 +207,9 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_armv7;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_armv7;
-
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_armv7;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
@@ -248,3 +236,16 @@
 (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width,
  WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type,
  WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv7;
+
+VOID(*ixheaacd_covariance_matrix_calc_960)
+(WORD32 *, ia_lpp_trans_cov_matrix *,
+ WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec_960;
+
+VOID(*ixheaacd_aac_ld_dec_rearrange_960)
+(WORD32 *ip, WORD32 *op, WORD32 mdct_len_2,
+ WORD16 *re_arr_tab) = &ixheaacd_dec_rearrange_short;
+
+VOID(*ixheaacd_pretwiddle_compute_960)
+(WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
+ ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
+ WORD32 neg_expo) = &ixheaacd_pretwiddle_compute_960_dec;
diff --git a/decoder/armv7/ixheaacd_fwd_modulation.s b/decoder/armv7/ixheaacd_fwd_modulation.s
index d1f599a..727b719 100644
--- a/decoder/armv7/ixheaacd_fwd_modulation.s
+++ b/decoder/armv7/ixheaacd_fwd_modulation.s
@@ -32,9 +32,12 @@
     LDR             r2, [sp, #0x24]
     MOV             lr, r1
     MOV             r4, r1
-    MOV             r1, #0x1f
+    LDR             r1, [r3]
+    SUB             r1, r1, #1
+    CMP             r1, #0x3f
     MOV             r7, r5
     ADD             r8, r0, #0xfc
+    ADDEQ           r8, r8, #0x100
     MOV             r6, r3
 LOOP1:
     LDR             r3, [r0], #4
@@ -70,12 +73,16 @@
 
     BL              ixheaacd_cos_sin_mod
 
+    LDR             r1, [sp, #0x28]
+    LDRSH           r2, [r6]
+    CMP             r1, #1
+    BEQ             LOOP3
     LDRSH           r1, [r6, #0x2c]
     LDRSH           r2, [r6, #0x2a]
     LDR             r0, [r6, #0x18]
     SUBS            r2, r1, r2
 
-@    LDMLEFD     sp!, {r3-r9, r12, pc}
+@   LDMLEFD         sp!, {r3-r9, r12, pc}
     LDMFDLE         sp!, {r3-r9, r12, pc}
 LOOP2:
     LDR             r1, [r0], #4
@@ -99,5 +106,29 @@
     SUBS            r2, r2, #1
     STR             r1, [r5], #4
     BGT             LOOP2
+    B               END
+LOOP3:
+    LDR             r12, [r5, #0]
+    LDR             r3, [r4, #0]
 
+    MOV             r1, r3
+    MOV             r3, #0
+    SUB             r3, r3, r12
+
+    STR             r3, [r4], #4
+    STR             r1, [r5], #4
+
+    LDR             r12, [r5, #0]
+    LDR             r3, [r4, #0]
+
+    MOV             r1, r12
+    MOV             r12, #0
+    SUB             r12, r12, r3
+
+    STR             r12, [r5], #4
+    STR             r1, [r4], #4
+
+    SUBS            r2, r2, #2
+    BGT             LOOP3
+END:
     LDMFD           sp!, {r3-r9, r12, pc}
diff --git a/decoder/armv7/ixheaacd_lap1.s b/decoder/armv7/ixheaacd_lap1.s
index 999dd35..2f2ced3 100644
--- a/decoder/armv7/ixheaacd_lap1.s
+++ b/decoder/armv7/ixheaacd_lap1.s
@@ -29,7 +29,7 @@
 ixheaacd_overlap_buf_out_armv7:
 
     STMFD           sp!, {r4-r5}
-    MOV             r3, r3, lsl #1
+    MOV             r3, r3, lsl #2
 
 OUTSAMPLE_LOOP:
 
@@ -37,11 +37,11 @@
     LDR             r5, [r1], #4
     SUBS            r2, r2, #2
 
-    QADD16          r4, r4, r4
-    QADD16          r5, r5, r5
+    LSL             r4,r4,#15
+    LSL             r5,r5,#15
 
-    STRH            r4, [r0], r3
-    STRH            r5, [r0], r3
+    STR            r4, [r0], r3
+    STR            r5, [r0], r3
 
     BGT             OUTSAMPLE_LOOP
 
@@ -54,7 +54,7 @@
     STMFD           sp!, {r4-r9, r14}
     MOV             r9, #32
     MOV             r8, r1
-    MOV             r3, r3, LSL #1
+    MOV             r3, r3, LSL #2
 
 
 OUT_OVERLAP_LOOP:
@@ -62,14 +62,14 @@
     LDR             r5, [r1], #4
     SUBS            r9, r9, #1
 
-    QADD16          r4, r4, r4
-    QADD16          r5, r5, r5
+    LSL             r4,r4,#15
+    LSL             r5,r5,#15
 
     LDR             r6, [r2], #4
     LDR             r7, [r2], #4
 
-    STRH            r4, [r0], r3
-    STRH            r5, [r0], r3
+    STR            r4, [r0], r3
+    STR            r5, [r0], r3
 
     STR             r6, [r8], #4
     STR             r7, [r8], #4
diff --git a/decoder/armv7/ixheaacd_no_lap1.s b/decoder/armv7/ixheaacd_no_lap1.s
index 2884191..944e32b 100644
--- a/decoder/armv7/ixheaacd_no_lap1.s
+++ b/decoder/armv7/ixheaacd_no_lap1.s
@@ -32,79 +32,60 @@
     ADD             R6, R6, R0
     MOV             R8, #-16
     SUB             R6, R6, #12
-    MOV             R7, R3, LSL #1
+    MOV             R7, R3, LSL #2
     VDUP.32         Q1, R2
-    MOV             R4, #0x8000
-    VDUP.32         Q2, R4
-
     VLD1.32         {D0, D1}, [R6], R8
     VQNEG.S32       Q0, Q0
 
 
     VLD1.32         {D6, D7}, [R6], R8
     VQSHL.S32       Q15, Q0, Q1
-    VQADD.S32       Q14, Q15, Q2
-    VSHR.S32        Q13, Q14, #16
-    VREV64.32       Q13, Q13
+    VMOV            Q13, Q15
     SUB             R5, R5, #8
 
-    VUZP.16         D27, D26
     VQNEG.S32       Q3, Q3
-
+    VREV64.32       Q13,Q13
 
 LOOP_1:
 
-
-    VST1.16         D27[0], [R1], R7
-    VQSHL.S32       Q12, Q3, Q1
-    VLD1.32         {D0, D1}, [R6], R8
-    VST1.16         D27[1], [R1], R7
-    VQADD.S32       Q11, Q12, Q2
-    VST1.16         D27[2], [R1], R7
-    VQNEG.S32       Q0, Q0
-    VST1.16         D27[3], [R1], R7
-    VSHR.S32        Q10, Q11, #16
-    VREV64.32       Q10, Q10
-    SUBS            R5, R5, #8
+   VST1.32         {D27[0]},[R1], R7
+   VQSHL.S32       Q12, Q3, Q1
+   VLD1.32         {D0, D1}, [R6], R8
+   VST1.32         {D27[1]}, [R1], R7
+   VST1.32         {D26[0]}, [R1], R7
+   VQNEG.S32       Q0, Q0
+   VST1.32         {D26[1]}, [R1], R7
+   VMOV            Q10 , Q12
+   SUBS            R5, R5, #8
 
 
-    VUZP.16         D21, D20
-    VQSHL.S32       Q15, Q0, Q1
-    VST1.16         D21[0], [R1], R7
-    VLD1.32         {D6, D7}, [R6], R8
-    VQADD.S32       Q14, Q15, Q2
-    VST1.16         D21[1], [R1], R7
-    VSHR.S32        Q13, Q14, #16
-    VST1.16         D21[2], [R1], R7
-    VREV64.32       Q13, Q13
-    VST1.16         D21[3], [R1], R7
+   VREV64.32       Q10,Q10
+   VQSHL.S32       Q15, Q0, Q1
+   VST1.32         {D21[0]},[R1], R7
+   VLD1.32         {D6, D7}, [R6],R8
+   VST1.32         {D21[1]}, [R1],R7
+   VMOV            Q13,Q15
+   VST1.32         {D20[0]}, [R1],R7
+   VST1.32         {D20[1]}, [R1],R7
 
+   VREV64.32       Q13,Q13
+   VQNEG.S32       Q3, Q3
 
-    VUZP.16         D27, D26
-    VQNEG.S32       Q3, Q3
+   BGT             LOOP_1
 
+   VST1.32         {D27[0]},[R1],R7
+   VQSHL.S32       Q12, Q3, Q1
+   VST1.32         {D27[1]}, [R1],R7
+   VST1.32         {D26[0]}, [R1],R7
+   VST1.32         {D26[1]}, [R1],R7
+   VMOV             Q10, Q12
 
-
-    BGT             LOOP_1
-
-    VST1.16         D27[0], [R1], R7
-    VQSHL.S32       Q12, Q3, Q1
-    VST1.16         D27[1], [R1], R7
-    VST1.16         D27[2], [R1], R7
-    VQADD.S32       Q11, Q12, Q2
-    VST1.16         D27[3], [R1], R7
-    VSHR.S32        Q10, Q11, #16
-
-
-    VREV64.32       Q10, Q10
-
-    VUZP.16         D21, D20
-
-    VST1.16         D21[0], [R1], R7
-    VST1.16         D21[1], [R1], R7
-    VST1.16         D21[2], [R1], R7
-    VST1.16         D21[3], [R1], R7
-    VPOP            {D8 - D15}
-    LDMFD           sp!, {R4-R12, R15}
+   VREV64.32       Q10,Q10
+   VST1.32         {D21[0]}, [R1], R7
+   VST1.32         {D21[1]}, [R1], R7
+   VST1.32         {D20[0]}, [R1], R7
+   VST1.32         {D20[1]}, [R1], R7
+   VPOP            {D8 - D15}
+   LDMFD           sp!, {R4-R12, R15}
 .end
 
diff --git a/decoder/armv7/ixheaacd_overlap_add1.s b/decoder/armv7/ixheaacd_overlap_add1.s
index b376470..5c8f3c4 100644
--- a/decoder/armv7/ixheaacd_overlap_add1.s
+++ b/decoder/armv7/ixheaacd_overlap_add1.s
@@ -32,6 +32,8 @@
     LDR             R4, [SP, #104]
     LDR             R5, [SP, #108]
     LDR             R6, [SP, #112]
+
+    LSL             R6 , R6 , #1
     MOV             R10, R5, LSL #1
     SUB             R11, R10, #1
     MOV             R10, R11, LSL #2
@@ -45,11 +47,10 @@
     MOV             R12, #-16
     VDUP.16         Q11, R4
     VLD1.32         {D6, D7}, [R10], R12
-    MOV             R7, #0x2000
+    MOV             R7, #0x0
     VREV64.32       Q3, Q3
     RSB             R7, R7, #0
     VQNEG.S32       Q0, Q3
-    VDUP.32         Q10, R7
     VUZP.16         D1, D0
     SUB             R11, R5, #1
     VUZP.16         D7, D6
@@ -66,7 +67,6 @@
     ADD             R6, R6, R2
 
 
-
     VMULL.U16       Q15, D7, D2
     VLD1.32         {D4, D5}, [R1]!
     VSHR.U32        Q15, Q15, #16
@@ -81,12 +81,7 @@
     VQMOVN.S64      D28, Q13
     VMULL.S32       Q13, D5, D15
     VQMOVN.S64      D29, Q13
-
-    VQADD.S32       Q14, Q14, Q10
     VQSUB.S32       Q13, Q15, Q14
-    VQSHL.S32       Q13, Q13, #2
-    VSHR.S32        Q13, Q13, #16
-    VUZP.16         D26, D27
 
 
     VMULL.U16       Q12, D1, D3
@@ -104,16 +99,12 @@
     VQMOVN.S64      D17, Q0
 
     VREV64.32       Q3, Q3
-    VQADD.S32       Q8, Q8, Q10
     VQNEG.S32       Q0, Q3
     VUZP.16         D1, D0
     VQSUB.S32       Q9, Q12, Q8
     VUZP.16         D7, D6
-    VQSHL.S32       Q9, Q9, #2
     VLD2.16         {D2, D3}, [R8], R12
-    VSHR.S32        Q9, Q9, #16
     VREV64.16       Q1, Q1
-    VUZP.16         D18, D19
 
     VLD1.32         {D4, D5}, [R1]!
     SUB             R5, R5, #8
@@ -121,25 +112,25 @@
 
 LOOP_1:
 
-    VST1.16         D26[0], [R11], R4
+
+    VST1.32         D26[0], [R11], R4
     VMULL.U16       Q15, D7, D2
-    VST1.16         D26[1], [R11], R4
+    VST1.32         D26[1], [R11], R4
     VMULL.U16       Q12, D1, D3
-    VST1.16         D26[2], [R11], R4
+    VST1.32         D27[0], [R11] ,R4
     VSHR.U32        Q15, Q15, #16
-    VST1.16         D26[3], [R11], R4
+    VST1.32         D27[1], [R11] ,R4
     VSHR.U32        Q12, Q12, #16
-    VST1.16         D18[0], [R6], R9
+    VST1.32         D18[0], [R6], R9
     VMLAL.S16       Q15, D6, D2
-    VST1.16         D18[1], [R6], R9
+    VST1.32         D18[1], [R6], R9
     VMLAL.S16       Q12, D0, D3
-    VST1.16         D18[2], [R6], R9
+    VST1.32         D19[0], [R6], R9
     VQSHL.S32       Q15, Q15, Q11
-    VST1.16         D18[3], [R6], R9
+    VST1.32         D19[1], [R6], R9
     VQSHL.S32       Q12, Q12, Q11
     VLD1.32         {D6, D7}, [R10], R12
 
-
     VADDL.S16       Q7, D3, D12
 
     VMULL.S32       Q8, D4, D14
@@ -148,8 +139,6 @@
     VQMOVN.S64      D29, Q8
     VREV64.32       Q3, Q3
 
-
-
     VADDL.S16       Q7, D2, D12
 
     VMULL.S32       Q0, D4, D14
@@ -160,34 +149,27 @@
     VLD2.16         {D2, D3}, [R8], R12
     VQNEG.S32       Q0, Q3
     VLD1.32         {D4, D5}, [R1]!
-    VQADD.S32       Q14, Q14, Q10
     VUZP.16         D1, D0
-    VQADD.S32       Q8, Q8, Q10
     VUZP.16         D7, D6
     VQSUB.S32       Q13, Q15, Q14
     VREV64.16       Q1, Q1
     VQSUB.S32       Q9, Q12, Q8
-    VQSHL.S32       Q13, Q13, #2
-    VQSHL.S32       Q9, Q9, #2
     VMULL.U16       Q15, D7, D2
-    VSHR.S32        Q13, Q13, #16
-    VUZP.16         D26, D27
-    VSHR.S32        Q9, Q9, #16
-    VST1.16         D26[0], [R11], R4
+    VST1.32         D26[0], [R11], R4
     VMULL.U16       Q12, D1, D3
-    VUZP.16         D18, D19
+
     VSHR.U32        Q15, Q15, #16
-    VST1.16         D26[1], [R11], R4
+    VST1.32       {D26[1]}, [R11], R4
     VMLAL.S16       Q15, D6, D2         @MLA
-    VST1.16         D26[2], [R11], R4
+    VST1.32       {D27[0]}, [R11], R4
     VSHR.U32        Q12, Q12, #16
-    VST1.16         D26[3], [R11], R4
+    VST1.32       {D27[1]}, [R11], R4
     VMLAL.S16       Q12, D0, D3         @MLA
-    VST1.16         D18[0], [R6], R9
+    VST1.32       {D18[0]}, [R6], R9
     VQSHL.S32       Q15, Q15, Q11
-    VST1.16         D18[1], [R6], R9
+    VST1.32       {D18[1]}, [R6], R9
     VQSHL.S32       Q12, Q12, Q11
-    VST1.16         D18[2], [R6], R9
+    VST1.32       {D19[0]}, [R6], R9
 
 
     VADDL.S16       Q7, D3, D12
@@ -197,7 +179,7 @@
     VMULL.S32       Q8, D5, D15
     VQMOVN.S64      D29, Q8
 
-    VST1.16         D18[3], [R6], R9
+    VST1.32         {D19[1]}, [R6], R9
 
 
     VADDL.S16       Q7, D2, D12
@@ -208,45 +190,40 @@
     VQMOVN.S64      D17, Q0
 
     VLD1.32         {D6, D7}, [R10], R12
-    VQADD.S32       Q14, Q14, Q10
     VREV64.32       Q3, Q3
     VQNEG.S32       Q0, Q3
     VUZP.16         D1, D0
     VQSUB.S32       Q13, Q15, Q14
     VUZP.16         D7, D6
-    VQADD.S32       Q8, Q8, Q10
     VLD2.16         {D2, D3}, [R8], R12
     VQSUB.S32       Q9, Q12, Q8
     VREV64.16       Q1, Q1
-    VQSHL.S32       Q13, Q13, #2
+
     VLD1.32         {D4, D5}, [R1]!
-    VQSHL.S32       Q9, Q9, #2
-    VSHR.S32        Q13, Q13, #16
+
     SUBS            R5, R5, #8
-    VSHR.S32        Q9, Q9, #16
-    VUZP.16         D26, D27
-    VUZP.16         D18, D19
+
 
 
 
     BGT             LOOP_1
 
-    VST1.16         D26[0], [R11], R4
+    VST1.32         {D26[0]}, [R11], R4
     VMULL.U16       Q15, D7, D2
-    VST1.16         D26[1], [R11], R4
+    VST1.32         {D26[1]}, [R11], R4
     VMULL.U16       Q12, D1, D3
-    VST1.16         D26[2], [R11], R4
+    VST1.32         {D27[0]}, [R11], R4
     VSHR.U32        Q15, Q15, #16
-    VST1.16         D26[3], [R11], R4
+    VST1.32         {D27[1]}, [R11], R4
     VSHR.U32        Q12, Q12, #16
 
-    VST1.16         D18[0], [R6], R9
+    VST1.32         {D18[0]}, [R6], R9
     VMLAL.S16       Q15, D6, D2
-    VST1.16         D18[1], [R6], R9
+    VST1.32         {D18[1]}, [R6], R9
     VMLAL.S16       Q12, D0, D3
-    VST1.16         D18[2], [R6], R9
+    VST1.32         {D19[0]}, [R6], R9
     VQSHL.S32       Q15, Q15, Q11
-    VST1.16         D18[3], [R6], R9
+    VST1.32         {D19[1]}, [R6], R9
     VQSHL.S32       Q12, Q12, Q11
 
 
@@ -268,29 +245,19 @@
     VMULL.S32       Q13, D5, D15
     VQMOVN.S64      D17, Q13
 
-    VQADD.S32       Q14, Q14, Q10
-    VQADD.S32       Q8, Q8, Q10
+
     VQSUB.S32       Q13, Q15, Q14
     VQSUB.S32       Q9, Q12, Q8
-    VQSHL.S32       Q13, Q13, #2
-    VQSHL.S32       Q9, Q9, #2
-    VSHR.S32        Q13, Q13, #16
-    VSHR.S32        Q9, Q9, #16
-    VUZP.16         D26, D27
 
-    VUZP.16         D18, D19
+    VST1.32         D26[0], [R11], R4
+    VST1.32         D26[1], [R11], R4
+    VST1.32         D27[0], [R11], R4
+    VST1.32         D27[1], [R11], R4
 
-
-
-    VST1.16         D26[0], [R11], R4
-    VST1.16         D26[1], [R11], R4
-    VST1.16         D26[2], [R11], R4
-    VST1.16         D26[3], [R11], R4
-
-    VST1.16         D18[0], [R6], R9
-    VST1.16         D18[1], [R6], R9
-    VST1.16         D18[2], [R6], R9
-    VST1.16         D18[3], [R6], R9
+    VST1.32         D18[0], [R6], R9
+    VST1.32         D18[1], [R6], R9
+    VST1.32         D19[0], [R6], R9
+    VST1.32         D19[1], [R6], R9
 
     VPOP            {d8 - d15}
     LDMFD           sp!, {R4-R12, R15}
diff --git a/decoder/armv7/ixheaacd_post_twiddle_overlap.s b/decoder/armv7/ixheaacd_post_twiddle_overlap.s
index 24a5ba3..57d20cd 100644
--- a/decoder/armv7/ixheaacd_post_twiddle_overlap.s
+++ b/decoder/armv7/ixheaacd_post_twiddle_overlap.s
@@ -44,7 +44,7 @@
 
     VMOV.S16        D18, #50
     RSB             R9, R5, #15
-    VMOV.S32        Q10, #0x00008000
+    VMOV.S32        Q10, #0x0000000
     VDUP.32         Q8, R5
     SUB             R5, R5, #16
     STR             R5, [sp, #116]
@@ -149,14 +149,12 @@
     VQSUB.S32       D8, D0, D8
 
 
-    VQSHL.S32       D8, D8, #2
     VDUP.32         D0, R8
-    VQADD.S32       D8, D8, D0
-    VSHR.S32        D8, D8, #16
 
 
 
     LDR             R7, [sp, #112]
+    LSL             R7 , R7 , #1
     LSL             R10, R7, #1
 
     ASR             R5, R3, #1
@@ -166,8 +164,8 @@
     MVN             R9, R10
     ADD             R9, R9, #1
 
-    VST1.16         D8[2], [R0], R9
-    VST1.16         D8[0], [R5], R10
+    VST1.32         D8[1], [R0], R9
+    VST1.32         D8[0], [R5], R10
 
 
     MOV             R8, R1
@@ -397,28 +395,19 @@
     VMLAL.S16       Q15, D15, D10
 
     VLD2.32         {Q5, Q6}, [R6], R12
-    VQSHL.S32       Q2, Q2, #2
 
     VUZP.16         D10, D11
-    VQSHL.S32       Q3, Q3, #2
 
     VUZP.16         D12, D13
-    VQADD.S32       Q7, Q2, Q10
+    VMOV            Q7,Q2
 
     VREV64.16       Q5, Q5
-    VQADD.S32       Q3, Q3, Q10
 
     VREV64.16       Q6, Q6
-    VSHR.S32        Q7, Q7, #16
-
-    VUZP.16         D14, D15
-    VSHR.S32        Q3, Q3, #16
-
-    VUZP.16         D6, D7
-
-    VMOV            D15, D6
     VQSHL.S32       Q4, Q4, Q8
 
+    VMOV             Q9,Q3
+
     VLD2.32         {Q2, Q3}, [R8]!
     VQSHL.S32       Q15, Q15, Q8
 
@@ -428,72 +417,61 @@
     VUZP.16         D6, D7
     VQSUB.S32       Q11, Q15, Q11
 
-    VQSHL.S32       Q15, Q4, #2
+     VMOV            Q15,Q4
 
     VLD2.16         {D8, D9}, [R2]!
-    VQSHL.S32       Q11, Q11, #2
-
-    VQADD.S32       Q15, Q15, Q10
-    VQADD.S32       Q11, Q11, Q10
-
-    VSHR.S32        Q15, Q15, #16
-
-    VUZP.16         D30, D31
-    VSHR.S32        Q11, Q11, #16
-
-
-    VUZP.16         D22, D23
-    VMOV            D23, D30
 
 CORE_LOOP_PTO:
-    VST1.16         D14[0], [R0, : 16], R9
+
+    VST1.32         D14[0], [R0, :32], R9
+
+    VST1.32         D22[0], [R0, :32], R9
+
+    VST1.32         D14[1], [R0, :32], R9
+
+    VST1.32         D22[1], [R0, :32], R9
+
+    VST1.32         D15[0], [R0, :32], R9
+
+    VST1.32         D23[0], [R0, :32], R9
+
+    VST1.32         D15[1], [R0, :32], R9
+
+    VST1.32         D23[1], [R0, :32], R9
+
+    VST1.32         D18[0], [R5, :32], R10
+
+    VST1.32         D30[0], [R5, :32] ,R10
+
+    VST1.32         D18[1], [R5, :32], R10
+
+    VST1.32         D30[1], [R5, :32], R10
+
+    VST1.32         D19[0], [R5, :32], R10
+
+    VST1.32         D31[0], [R5, :32], R10
+
+    VST1.32         D19[1], [R5, :32], R10
+
+    VST1.32         D31[1], [R5, :32], R10
+
     VMULL.U16       Q15, D0, D9
-
-    VST1.16         D22[0], [R0, : 16], R9
     VMULL.U16       Q14, D2, D8
-
-    VST1.16         D14[1], [R0, : 16], R9
     VMULL.U16       Q13, D0, D8
-
-    VST1.16         D22[1], [R0, : 16], R9
     VMULL.U16       Q12, D2, D9
-
-    VST1.16         D14[2], [R0, : 16], R9
     VSHR.U32        Q15, Q15, #16
-
-    VST1.16         D22[2], [R0, : 16], R9
     VSHR.U32        Q14, Q14, #16
-
-    VST1.16         D14[3], [R0, : 16], R9
     VMLAL.S16       Q15, D1, D9
-
-    VST1.16         D22[3], [R0, : 16], R9
     VMLAL.S16       Q14, D3, D8
-
-    VST1.16         D15[0], [R5, : 16], R10
     VSHR.U32        Q13, Q13, #16
-
-    VST1.16         D23[0], [R5, : 16], R10
     VSHR.U32        Q12, Q12, #16
-
-    VST1.16         D15[1], [R5, : 16], R10
     VMLAL.S16       Q13, D1, D8
-
-    VST1.16         D23[1], [R5, : 16], R10
     VMLAL.S16       Q12, D3, D9
 
-    VST1.16         D15[2], [R5, : 16], R10
     VADD.I32        Q15, Q15, Q14
-
-    VST1.16         D23[2], [R5, : 16], R10
     VNEG.S32        Q15, Q15
-
-    VST1.16         D15[3], [R5, : 16], R10
-
-    VST1.16         D23[3], [R5, : 16], R10
     VSUB.I32        Q14, Q12, Q13
 
-
     VMOV            Q13, Q15
     VMULL.U16       Q11, D4, D8
 
@@ -501,6 +479,7 @@
 
     VUZP.16         D24, D25
 
+    VMOV.S16        D18, #50
 
     VUZP.16         D26, D27
     VMULL.U16       Q1, D24, D18
@@ -660,28 +639,21 @@
     VMLAL.S16       Q15, D15, D10
 
     VLD2.32         {Q5, Q6}, [R6], R12
-    VQSHL.S32       Q2, Q2, #2
 
     VUZP.16         D10, D11
-    VQSHL.S32       Q3, Q3, #2
 
     VUZP.16         D12, D13
-    VQADD.S32       Q7, Q2, Q10
+    VMOV             Q7 , Q2
 
     VREV64.16       Q5, Q5
-    VQADD.S32       Q3, Q3, Q10
 
     VREV64.16       Q6, Q6
-    VSHR.S32        Q7, Q7, #16
 
-    VUZP.16         D14, D15
-    VSHR.S32        Q3, Q3, #16
 
-    VUZP.16         D6, D7
-
-    VMOV            D15, D6
     VQSHL.S32       Q4, Q4, Q8
 
+    VMOV            Q9,Q3
+
     VLD2.32         {Q2, Q3}, [R8]!
     VQSHL.S32       Q15, Q15, Q8
 
@@ -691,22 +663,9 @@
     VUZP.16         D6, D7
     VQSUB.S32       Q11, Q15, Q11
 
-    VQSHL.S32       Q15, Q4, #2
+     VMOV            Q15,Q4
 
     VLD2.16         {D8, D9}, [R2]!
-    VQSHL.S32       Q11, Q11, #2
-
-    VQADD.S32       Q15, Q15, Q10
-    VQADD.S32       Q11, Q11, Q10
-
-    VSHR.S32        Q15, Q15, #16
-
-    VUZP.16         D30, D31
-    VSHR.S32        Q11, Q11, #16
-
-
-    VUZP.16         D22, D23
-    VMOV            D23, D30
 
     SUBS            R3, R3, #1
     BNE             CORE_LOOP_PTO
@@ -717,54 +676,57 @@
 
 EPILOGUE:
 
-    VST1.16         D14[0], [R0], R9
+    VST1.32         D14[0], [R0], R9
+
+    VST1.32         D22[0], [R0], R9
+
+    VST1.32         D14[1], [R0], R9
+
+    VST1.32         D22[1], [R0], R9
+
+    VST1.32         D15[0], [R0], R9
+
+    VST1.32         D23[0], [R0], R9
+
+    VST1.32         D15[1], [R0], R9
+
+    VST1.32         D23[1], [R0], R9
+
+    VST1.32         D18[0], [R5], R10
+
+    VST1.32         D30[0], [R5], R10
+
+    VST1.32         D18[1], [R5], R10
+
+    VST1.32         D30[1], [R5], R10
+
+    VST1.32         D19[0], [R5], R10
+
+    VST1.32         D31[0], [R5], R10
+
+    VST1.32         D19[1], [R5], R10
+
+    VST1.32         D31[1], [R5], R10
+
     VMULL.U16       Q15, D0, D9
-
-    VST1.16         D22[0], [R0], R9
     VMULL.U16       Q14, D2, D8
-
-    VST1.16         D14[1], [R0], R9
     VMULL.U16       Q13, D0, D8
-
-    VST1.16         D22[1], [R0], R9
     VMULL.U16       Q12, D2, D9
-
-    VST1.16         D14[2], [R0], R9
     VSHR.U32        Q15, Q15, #16
-
-    VST1.16         D22[2], [R0], R9
     VSHR.U32        Q14, Q14, #16
-
-    VST1.16         D14[3], [R0], R9
     VMLAL.S16       Q15, D1, D9
-
-    VST1.16         D22[3], [R0], R9
     VMLAL.S16       Q14, D3, D8
-
-    VST1.16         D15[0], [R5], R10
     VSHR.U32        Q13, Q13, #16
-
-    VST1.16         D23[0], [R5], R10
     VSHR.U32        Q12, Q12, #16
-
-    VST1.16         D15[1], [R5], R10
     VMLAL.S16       Q13, D1, D8
-
-    VST1.16         D23[1], [R5], R10
-    VMLAL.S16       Q12, D3, D9
-
-    VST1.16         D15[2], [R5], R10
+	VMLAL.S16       Q12, D3, D9
     VADD.I32        Q15, Q15, Q14
-
-    VST1.16         D23[2], [R5], R10
-    VNEG.S32        Q15, Q15
-
-    VST1.16         D15[3], [R5], R10
+	VNEG.S32        Q15, Q15
 
 
-    VST1.16         D23[3], [R5], R10
     VSUB.I32        Q14, Q12, Q13
 
+    VMOV.S16        D18, #50
 
     VMULL.U16       Q11, D4, D8
     VMOV            Q13, Q15
@@ -925,22 +887,10 @@
 
     VMLAL.S16       Q15, D15, D10
 
-    VQSHL.S32       Q2, Q2, #2
 
-    VQSHL.S32       Q3, Q3, #2
 
     VQADD.S32       Q7, Q2, Q10
 
-    VQADD.S32       Q3, Q3, Q10
-
-    VSHR.S32        Q7, Q7, #16
-
-    VUZP.16         D14, D15
-    VSHR.S32        Q3, Q3, #16
-
-    VUZP.16         D6, D7
-
-    VMOV            D15, D6
     VQSHL.S32       Q4, Q4, Q8
 
     VQSHL.S32       Q15, Q15, Q8
@@ -949,40 +899,24 @@
 
     VQSUB.S32       Q11, Q15, Q11
 
-    VQSHL.S32       Q15, Q4, #2
+    VMOV             Q15 , Q4
 
-    VQSHL.S32       Q11, Q11, #2
-
-    VQADD.S32       Q15, Q15, Q10
-    VQADD.S32       Q11, Q11, Q10
-
-    VSHR.S32        Q15, Q15, #16
-
-    VUZP.16         D30, D31
-    VSHR.S32        Q11, Q11, #16
-
-    VUZP.16         D22, D23
-    VMOV            D23, D30
-
-
-
-
-    VST1.16         D14[0], [R0], R9
-    VST1.16         D22[0], [R0], R9
-    VST1.16         D14[1], [R0], R9
-    VST1.16         D22[1], [R0], R9
-    VST1.16         D14[2], [R0], R9
-    VST1.16         D22[2], [R0], R9
-    VST1.16         D14[3], [R0], R9
-    VST1.16         D22[3], [R0], R9
-    VST1.16         D15[0], [R5], R10
-    VST1.16         D23[0], [R5], R10
-    VST1.16         D15[1], [R5], R10
-    VST1.16         D23[1], [R5], R10
-    VST1.16         D15[2], [R5], R10
-    VST1.16         D23[2], [R5], R10
-    VST1.16         D15[3], [R5], R10
-    VST1.16         D23[3], [R5], R10
+    VST1.32         D14[0], [R0], R9
+    VST1.32         D22[0], [R0], R9
+    VST1.32         D14[1], [R0], R9
+    VST1.32         D22[1], [R0], R9
+    VST1.32         D15[0], [R0], R9
+    VST1.32         D23[0], [R0], R9
+    VST1.32         D15[1], [R0], R9
+    VST1.32         D23[1], [R0], R9
+    VST1.32         D6[0], [R5], R10
+    VST1.32         D30[0], [R5], R10
+    VST1.32         D6[1], [R5], R10
+    VST1.32         D30[1], [R5], R10
+    VST1.32         D7[0], [R5], R10
+    VST1.32         D31[0], [R5], R10
+    VST1.32         D7[1], [R5], R10
+    VST1.32         D31[1], [R5], R10
 
 ARM_EPILOGUE:
 
@@ -1212,22 +1146,10 @@
 
     VMLAL.S16       Q15, D15, D10
 
-    VQSHL.S32       Q2, Q2, #2
 
-    VQSHL.S32       Q3, Q3, #2
 
-    VQADD.S32       Q7, Q2, Q10
+    VMOV           Q7 , Q2
 
-    VQADD.S32       Q3, Q3, Q10
-
-    VSHR.S32        Q7, Q7, #16
-
-    VUZP.16         D14, D15
-    VSHR.S32        Q3, Q3, #16
-
-    VUZP.16         D6, D7
-
-    VMOV            D15, D6
     VQSHL.S32       Q4, Q4, Q8
 
     VQSHL.S32       Q15, Q15, Q8
@@ -1236,39 +1158,26 @@
 
     VQSUB.S32       Q11, Q15, Q11
 
-    VQSHL.S32       Q15, Q4, #2
-
-    VQSHL.S32       Q11, Q11, #2
-
-    VQADD.S32       Q15, Q15, Q10
-    VQADD.S32       Q11, Q11, Q10
-
-    VSHR.S32        Q15, Q15, #16
-
-    VUZP.16         D30, D31
-    VSHR.S32        Q11, Q11, #16
-
-    VUZP.16         D22, D23
-    VMOV            D23, D30
+     VMOV            Q15, Q4
 
 
 
 
-    VST1.16         D14[0], [R0], R9
-    VST1.16         D22[0], [R0], R9
-    VST1.16         D14[1], [R0], R9
-    VST1.16         D22[1], [R0], R9
-    VST1.16         D14[2], [R0], R9
-    VST1.16         D22[2], [R0], R9
-    VST1.16         D14[3], [R0], R9
+    VST1.32         D14[0], [R0], R9
+    VST1.32         D22[0], [R0], R9
+    VST1.32         D14[1], [R0], R9
+    VST1.32         D22[1], [R0], R9
+    VST1.32         D15[0], [R0], R9
+    VST1.32         D23[0], [R0], R9
+    VST1.32         D15[1], [R0], R9
 
-    VST1.16         D15[0], [R5], R10
-    VST1.16         D23[0], [R5], R10
-    VST1.16         D15[1], [R5], R10
-    VST1.16         D23[1], [R5], R10
-    VST1.16         D15[2], [R5], R10
-    VST1.16         D23[2], [R5], R10
-    VST1.16         D15[3], [R5], R10
+    VST1.32         D6[0], [R5], R10
+    VST1.32         D30[0], [R5], R10
+    VST1.32         D6[1], [R5], R10
+    VST1.32         D30[1], [R5], R10
+    VST1.32         D7[0], [R5], R10
+    VST1.32         D31[0], [R5], R10
+    VST1.32         D7[1], [R5], R10
 
     VPOP            {d8 - d15}
     LDMFD           sp!, {R4-R12}
diff --git a/decoder/armv7/ixheaacd_qmf_dec_armv7.c b/decoder/armv7/ixheaacd_qmf_dec_armv7.c
index e87ab36..d249fd7 100644
--- a/decoder/armv7/ixheaacd_qmf_dec_armv7.c
+++ b/decoder/armv7/ixheaacd_qmf_dec_armv7.c
@@ -49,14 +49,6 @@
 #include "ixheaacd_function_selector.h"
 #include "ixheaacd_audioobjtypes.h"
 
-#define mult16x16_16(a, b) ixheaacd_mult16((a), (b))
-#define mac16x16(a, b, c) ixheaacd_mac16x16in32_sat((a), (b), (c))
-#define mpy_32x16(a, b) fixmuldiv2_32x16b((a), (b))
-#define mpy_16x16(a, b) ixheaacd_mult16x16in32((a), (b))
-#define mpy_32x32(a, b) ixheaacd_mult32((a), (b))
-#define mpy_32x16H_n(a, b) ixheaacd_mult32x16hin32((a), (b))
-#define msu16x16(a, b, c) msu16x16in32((a), (b), (c))
-
 #define DCT3_LEN (32)
 #define DCT2_LEN (64)
 
@@ -66,6 +58,8 @@
 #define ROUNDING_SPECTRA 1
 #define HQ_SHIFT_VAL 4
 
+extern const WORD32 ixheaacd_ldmps_polyphase_filter_coeff_fix[1280];
+
 VOID ixheaacd_dct2_64(WORD32 *x, WORD32 *X,
                       ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
                       WORD16 *filter_states) {
@@ -206,7 +200,7 @@
 
     if (!low_pow_flag) {
       ixheaacd_fwd_modulation(analysis_buffer, qmf_real[i], qmf_imag[i],
-                              qmf_bank, qmf_dec_tables_ptr);
+                              qmf_bank, qmf_dec_tables_ptr, 0);
     } else {
       ixheaacd_dct3_32(
           (WORD32 *)analysis_buffer, qmf_real[i], qmf_dec_tables_ptr->dct23_tw,
@@ -227,6 +221,115 @@
   }
 }
 
+VOID ixheaacd_cplx_anal_qmffilt_32(const WORD32 *time_sample_buf,
+                                   ia_sbr_scale_fact_struct *sbr_scale_factor,
+                                   WORD32 **qmf_real, WORD32 **qmf_imag,
+                                   ia_sbr_qmf_filter_bank_struct *qmf_bank,
+                                   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
+                                   WORD32 ch_fac, WORD32 ldsbr_present) {
+  WORD32 i, k;
+  WORD32 num_time_slots = qmf_bank->num_time_slots;
+
+  WORD32 analysis_buffer[4 * NO_ANALYSIS_CHANNELS];
+  WORD32 *filter_states = qmf_bank->core_samples_buffer_32;
+
+  WORD32 *fp1, *fp2, *tmp;
+
+  WORD32 *filter_1;
+  WORD32 *filter_2;
+  WORD32 *filt_ptr;
+  WORD32 start_slot = 2;
+
+  if (ldsbr_present) {
+    qmf_bank->filter_pos_32 +=
+        (qmf_dec_tables_ptr->qmf_c_ldsbr_mps - qmf_bank->analy_win_coeff_32);
+    qmf_bank->analy_win_coeff_32 = qmf_dec_tables_ptr->qmf_c_ldsbr_mps;
+  } else {
+    qmf_bank->filter_pos_32 += (ixheaacd_ldmps_polyphase_filter_coeff_fix -
+                                qmf_bank->analy_win_coeff_32);
+    qmf_bank->analy_win_coeff_32 =
+        (WORD32 *)ixheaacd_ldmps_polyphase_filter_coeff_fix;
+  }
+
+  filter_1 = qmf_bank->filter_pos_32;
+  filter_2 = filter_1 + qmf_bank->no_channels;
+
+  sbr_scale_factor->st_lb_scale = 0;
+  sbr_scale_factor->lb_scale = -10;
+
+  sbr_scale_factor->lb_scale = -9;
+  if (qmf_bank->no_channels != 64) {
+    qmf_bank->cos_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l32;
+    qmf_bank->alt_sin_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l32;
+  } else {
+    qmf_bank->cos_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l64;
+    qmf_bank->alt_sin_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l64;
+  }
+  qmf_bank->t_cos =
+      (WORD16 *)qmf_dec_tables_ptr->ixheaacd_sbr_t_cos_sin_l32_eld;
+
+  fp1 = qmf_bank->anal_filter_states_32;
+  fp2 = qmf_bank->anal_filter_states_32 + qmf_bank->no_channels;
+
+  filter_2 = qmf_bank->filter_2_32;
+  fp1 = qmf_bank->fp1_anal_32;
+  fp2 = qmf_bank->fp2_anal_32;
+
+  for (i = start_slot; i < num_time_slots + start_slot; i++) {
+    for (k = 0; k < qmf_bank->no_channels; k++)
+      filter_states[qmf_bank->no_channels - 1 - k] =
+          time_sample_buf[ch_fac * k];
+
+    if (ldsbr_present) {
+      ixheaacd_sbr_qmfanal32_winadd_eld_32(fp1, fp2, filter_1, filter_2,
+                                           analysis_buffer);
+    } else {
+      ixheaacd_sbr_qmfanal32_winadd_eld_mps(fp1, fp2, filter_1, filter_2,
+                                            analysis_buffer);
+    }
+
+    time_sample_buf += qmf_bank->no_channels * ch_fac;
+
+    filter_states -= qmf_bank->no_channels;
+
+    if (filter_states < qmf_bank->anal_filter_states_32) {
+      filter_states = qmf_bank->anal_filter_states_32 +
+                      ((qmf_bank->no_channels * 10) - qmf_bank->no_channels);
+    }
+
+    tmp = fp1;
+    fp1 = fp2;
+    fp2 = tmp;
+
+    filter_1 += qmf_bank->no_channels;
+    filter_2 += qmf_bank->no_channels;
+
+    filt_ptr = filter_1;
+    filter_1 = filter_2;
+    filter_2 = filt_ptr;
+
+    if (filter_2 >
+        (qmf_bank->analy_win_coeff_32 + (qmf_bank->no_channels * 10))) {
+      filter_1 = (WORD32 *)qmf_bank->analy_win_coeff_32;
+      filter_2 = (WORD32 *)qmf_bank->analy_win_coeff_32 + qmf_bank->no_channels;
+    }
+
+    ixheaacd_fwd_modulation(analysis_buffer, qmf_real[i], qmf_imag[i], qmf_bank,
+                            qmf_dec_tables_ptr, 1);
+  }
+
+  qmf_bank->filter_pos_32 = filter_1;
+  qmf_bank->core_samples_buffer_32 = filter_states;
+
+  qmf_bank->fp1_anal_32 = fp1;
+  qmf_bank->fp2_anal_32 = fp2;
+  qmf_bank->filter_2_32 = filter_2;
+}
+
 VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states,
                                 ia_sbr_qmf_filter_bank_struct *syn_qmf,
                                 ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
@@ -351,4 +454,37 @@
   }
   p_sin = qmf_bank->esbr_alt_sin_twiddle;
   ixheaacd_esbr_cos_sin_mod_loop2(subband, p_sin, M);
-}
\ No newline at end of file
+}
+
+VOID ixheaacd_esbr_qmfsyn32_winadd(WORD32 *tmp1, WORD32 *tmp2, WORD32 *inp1,
+                                   WORD32 *sample_buffer, WORD32 ch_fac) {
+  WORD32 k;
+
+  for (k = 0; k < 32; k++) {
+    WORD64 syn_out = 0;
+
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[0 + k], inp1[2 * (k + 0)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[128 + k], inp1[2 * (k + 64)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[256 + k], inp1[2 * (k + 128)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[384 + k], inp1[2 * (k + 192)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[512 + k], inp1[2 * (k + 256)]));
+
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[64 + k], inp1[2 * (k + 32)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[192 + k], inp1[2 * (k + 96)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[320 + k], inp1[2 * (k + 160)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[448 + k], inp1[2 * (k + 224)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[576 + k], inp1[2 * (k + 288)]));
+
+    sample_buffer[ch_fac * k] = (WORD32)(syn_out >> 31);
+  }
+}
diff --git a/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s b/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s
index 78686c3..4f53f59 100644
--- a/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s
+++ b/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s
@@ -6,10 +6,9 @@
 ixheaacd_sbr_qmfanal32_winadds_eld:
 
     STMFD           sp!, {R4-R12, R14}
-    VPUSH           {D8 - D15}
-    LDR             R5, [SP, #108]      @filterStates
-    LDR             R6, [SP, #112]      @timeIn
-    LDR             R7, [SP, #116]      @stride
+    LDR             R5, [SP, #44]       @filterStates
+    LDR             R6, [SP, #48]       @timeIn
+    LDR             R7, [SP, #52]       @stride
 
     MOV             R9, R7, LSL #1
 
@@ -44,7 +43,7 @@
 
     BPL             LOOP
 
-    LDR             R4, [SP, #104]      @winAdd
+    LDR             R4, [SP, #40]      @winAdd
 
     MOV             R5, #8
     VLD1.16         D0, [R0]!           @tmpQ1[n +   0] load and incremented R0 by 8
@@ -243,5 +242,4 @@
     VMLAL.S16       Q15, D18, D19
 
     VST1.32         {Q15}, [R11]!
-    VPOP            {D8 - D15}
     LDMFD           sp!, {R4-R12, R15}
diff --git a/decoder/armv8/CMakeLists.txt b/decoder/armv8/CMakeLists.txt
new file mode 100644
index 0000000..6216c4c
--- /dev/null
+++ b/decoder/armv8/CMakeLists.txt
@@ -0,0 +1,27 @@
+#src files
+target_sources(libxaacdec
+               PRIVATE
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_function_selector_armv8.c"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_qmf_dec_armv8.c"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_apply_scale_factors.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_calcmaxspectralline.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_cos_sin_mod_loop1.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_cos_sin_mod_loop2.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_fft32x32_ld2_armv8.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_inv_dit_fft_8pt.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_imdct_using_fft.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_no_lap1.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_overlap_add1.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_overlap_add2.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_post_twiddle.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_post_twiddle_overlap.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_postradixcompute4.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_pre_twiddle.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_postradixcompute4.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_sbr_imdct_using_fft.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_sbr_qmf_analysis32_neon.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_sbr_qmfsyn64_winadd.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_shiftrountine_with_round.s"
+               "${XAAC_ROOT}/decoder/armv8/ixheaacd_shiftrountine_with_round_eld.s")
+
+include_directories(${XAAC_ROOT}/decoder/armv8})
\ No newline at end of file
diff --git a/decoder/armv8/ixheaacd_function_selector_armv8.c b/decoder/armv8/ixheaacd_function_selector_armv8.c
index 351e472..4454579 100644
--- a/decoder/armv8/ixheaacd_function_selector_armv8.c
+++ b/decoder/armv8/ixheaacd_function_selector_armv8.c
@@ -45,6 +45,10 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -66,15 +70,15 @@
 WORD32 (*ixheaacd_fix_div)(WORD32, WORD32) = &ixheaacd_fix_div_dec;
 
 VOID(*ixheaacd_covariance_matrix_calc)
-(WORD32 *, ixheaacd_lpp_trans_cov_matrix *,
- WORD32) = &ixheaacd_covariance_matrix_calc_dec;
+(WORD32 *, ia_lpp_trans_cov_matrix *,
+ WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec;
 
 VOID(*ixheaacd_covariance_matrix_calc_2)
-(ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32,
+(ia_lpp_trans_cov_matrix *, WORD32 *, WORD32,
  WORD16) = &ixheaacd_covariance_matrix_calc_2_dec;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_armv8;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -159,13 +163,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_armv8;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_armv8;
 
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_armv8;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -173,12 +177,12 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec;
 
 VOID(*ixheaacd_overlap_out_copy)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
- const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec;
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
+ const WORD16 ch_fac, WORD16 size_01) = &ixheaacd_overlap_out_copy_dec;
 
 VOID(*ixheaacd_pretwiddle_compute)
 (WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
@@ -193,18 +197,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec;
@@ -213,14 +205,9 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec;
-
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
@@ -246,4 +233,18 @@
 VOID(*ixheaacd_scale_factor_process)
 (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width,
  WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type,
- WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv8;
\ No newline at end of file
+ WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv8;
+
+VOID(*ixheaacd_covariance_matrix_calc_960)
+(WORD32 *, ia_lpp_trans_cov_matrix *,
+ WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec_960;
+
+VOID(*ixheaacd_aac_ld_dec_rearrange_960)
+(WORD32 *ip, WORD32 *op, WORD32 mdct_len_2,
+ WORD16 *re_arr_tab) = &ixheaacd_dec_rearrange_short;
+
+VOID(*ixheaacd_pretwiddle_compute_960)
+(WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
+ ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
+ WORD32 neg_expo) = &ixheaacd_pretwiddle_compute_960_dec;
+
diff --git a/decoder/armv8/ixheaacd_no_lap1.s b/decoder/armv8/ixheaacd_no_lap1.s
index d339879..1c71f42 100644
--- a/decoder/armv8/ixheaacd_no_lap1.s
+++ b/decoder/armv8/ixheaacd_no_lap1.s
@@ -53,71 +53,60 @@
     ADD             X6, X6, X0
     MOV             X8, #-16
     SUB             X6, X6, #12
-    LSL             X7, X3, #1
+    LSL             X7, X3, #2
     DUP             V31.4S, W2
-    MOV             W4, #0x8000
-    DUP             V30.4S, W4
+
 
     LD1             {V0.4S}, [X6], X8
     SQNEG           V0.4S, V0.4S
 
     LD1             {V6.4S}, [X6], X8
     SQSHL           V25.4S, V0.4S, V31.4S
-    SQADD           V24.4S, V25.4S, V30.4S
-    SSHR            V23.4S, V24.4S, #16
-    REV64           V23.4S, V23.4S
+
+    REV64           V25.4S, V25.4S
     SUB             X5, X5, #8
 
-    UZP1            V27.8H, V23.8H, V23.8H
     SQNEG           V29.4S, V6.4S
 
 LOOP_1:
 
-    ST1             {V27.H}[2], [X1], X7
+    ST1             {V25.S}[2], [X1], X7
     SQSHL           V22.4S, V29.4S, V31.4S
     LD1             {V0.4S}, [X6], X8
-    ST1             {V27.H}[3], [X1], X7
-    SQADD           V21.4S, V22.4S, V30.4S
-    ST1             {V27.H}[0], [X1], X7
+    ST1             {V25.S}[3], [X1], X7
+    ST1             {V25.S}[0], [X1], X7
     SQNEG           V0.4S, V0.4S
-    ST1             {V27.H}[1], [X1], X7
-    SSHR            V20.4S, V21.4S, #16
-    REV64           V20.4S, V20.4S
+    ST1             {V25.S}[1], [X1], X7
+    REV64           V22.4S, V22.4S
     SUBS            X5, X5, #8
 
 
-    UZP1            V27.8H, V20.8H, V20.8H
     SQSHL           V25.4S, V0.4S, V31.4S
-    ST1             {V27.H}[2], [X1], X7
+    ST1             {V22.S}[2], [X1], X7
     LD1             {V6.4S}, [X6], X8
-    SQADD           V24.4S, V25.4S, V30.4S
-    ST1             {V27.H}[3], [X1], X7
-    SSHR            V23.4S, V24.4S, #16
-    ST1             {V27.H}[0], [X1], X7
-    REV64           V23.4S, V23.4S
-    ST1             {V27.H}[1], [X1], X7
+    ST1             {V22.S}[3], [X1], X7
+    ST1             {V22.S}[0], [X1], X7
+    REV64           V25.4S, V25.4S
+    ST1             {V22.S}[1], [X1], X7
 
 
-    UZP1            V27.8H, V23.8H, V23.8H
     SQNEG           V29.4S, V6.4S
 
     BGT             LOOP_1
 
-    ST1             {V27.H}[2], [X1], X7
+    ST1             {V25.S}[2], [X1], X7
     SQSHL           V22.4S, V29.4S, V31.4S
-    ST1             {V27.H}[3], [X1], X7
-    ST1             {V27.H}[0], [X1], X7
-    SQADD           V21.4S, V22.4S, V30.4S
-    ST1             {V27.H}[1], [X1], X7
-    SSHR            V20.4S, V21.4S, #16
+    ST1             {V25.S}[3], [X1], X7
+    ST1             {V25.S}[0], [X1], X7
 
-    REV64           V20.4S, V20.4S
+    ST1             {V25.S}[1], [X1], X7
 
-    UZP1            V27.8H, V20.8H, V20.8H
+    REV64            V22.4S, V22.4S
 
-    ST1             {V27.H}[2], [X1], X7
-    ST1             {V27.H}[3], [X1], X7
-    ST1             {V27.H}[0], [X1], X7
-    ST1             {V27.H}[1], [X1], X7
+
+    ST1             {V22.S}[2], [X1], X7
+    ST1             {V22.S}[3], [X1], X7
+    ST1             {V22.S}[0], [X1], X7
+    ST1             {V22.S}[1], [X1], X7
     pop_v_regs
     RET
diff --git a/decoder/armv8/ixheaacd_overlap_add1.s b/decoder/armv8/ixheaacd_overlap_add1.s
index 14f5402..844effc 100644
--- a/decoder/armv8/ixheaacd_overlap_add1.s
+++ b/decoder/armv8/ixheaacd_overlap_add1.s
@@ -47,6 +47,7 @@
 .global ixheaacd_over_lap_add1_armv8
 ixheaacd_over_lap_add1_armv8:
     push_v_regs
+    LSL             X6 , X6 , #1
     LSL             X10, X5, #1
     SUB             X11, X10, #1
     LSL             X10, X11, #2
@@ -58,11 +59,9 @@
     MOV             X12, #-16
     DUP             V11.8H, W4
     LD1             {V3.4S}, [X10], X12
-    MOV             W7, #0x2000
 
     NEG             W7, W7
     SQNEG           V0.4S, V3.4S
-    DUP             V10.4S, W7
     UZP1            V31.8H, V0.8H, V0.8H
     UZP2            V30.8H, V0.8H, V0.8H
     REV64           V31.8h, V31.8h
@@ -105,12 +104,7 @@
     SQXTN2          V28.4S, V29.2D
     MOV             V14.16B, V28.16B
 
-    SQADD           V14.4S, V14.4S, V10.4S
     SQSUB           V13.4S, V15.4S, V14.4S
-    SQSHL           V13.4S, V13.4S, #2
-    SSHR            V13.4S, V13.4S, #16
-    UZP1            V26.8H, V13.8H, V13.8H
-
     UMULL           V12.4S, V31.4H, V3.4H
     USHR            V12.4S, V12.4S, #16
     SMLAL           V12.4S, V30.4H, V3.4H
@@ -124,8 +118,6 @@
     SQXTN2          V28.4S, V29.2D
     MOV             V8.16B, V28.16B
 
-    SQADD           V8.4S, V8.4S, V10.4S
-
     SQNEG           V0.4S, V3.4S
     UZP1            V1.8H, V0.8H, V0.8H
     UZP2            V0.8H, V0.8H, V0.8H
@@ -136,12 +128,9 @@
     UZP2            V6.8H, V3.8H, V3.8H
     REV64           V7.8h, V7.8h
     REV64           V6.8h, V6.8h
-    SQSHL           V9.4S, V9.4S, #2
     LD2             {V2.4H, V3.4H}, [X8], X12
-    SSHR            V9.4S, V9.4S, #16
     REV64           V2.4H, V2.4H
     REV64           V3.4H, V3.4H
-    UZP1            V18.8H, V9.8H, V9.8H
 
     LD1             {V4.4S}, [X1], #16
     SUB             W5, W5, #8
@@ -149,21 +138,21 @@
 
 LOOP_1:
 
-    ST1             {V26.H}[0], [X11], X4
+    ST1             {V13.S}[0], [X11], X4
     UMULL           V15.4S, V7.4H, V2.4H
-    ST1             {V26.H}[1], [X11], X4
+    ST1             {V13.S}[1], [X11], X4
     UMULL           V12.4S, V1.4H, V3.4H
-    ST1             {V26.H}[2], [X11], X4
+    ST1             {V13.S}[2], [X11], X4
     USHR            V15.4S, V15.4S, #16
-    ST1             {V26.H}[3], [X11], X4
+    ST1             {V13.S}[3], [X11], X4
     USHR            V12.4S, V12.4S, #16
-    ST1             {V18.H}[0], [X6], X9
+    ST1             {V9.S}[0], [X6], X9
     SMLAL           V15.4S, V6.4H, V2.4H
-    ST1             {V18.H}[1], [X6], X9
+    ST1             {V9.S}[1], [X6], X9
     SMLAL           V12.4S, V0.4H, V3.4H
-    ST1             {V18.H}[2], [X6], X9
+    ST1             {V9.S}[2], [X6], X9
     SQSHL           V15.4S, V15.4S, V11.4S
-    ST1             {V18.H}[3], [X6], X9
+    ST1             {V9.S}[3], [X6], X9
     SQSHL           V12.4S, V12.4S, V11.4S
     LD1             {V6.4S}, [X10], X12
 
@@ -187,12 +176,10 @@
 
     LD1             {V4.4S}, [X1], #16
 
-    SQADD           V14.4S, V14.4S, V10.4S
     UZP1            V1.8H, V0.8H, V0.8H
     UZP2            V0.8H, V0.8H, V0.8H
     REV64           V1.8h, V1.8h
     REV64           V0.8h, V0.8h
-    SQADD           V8.4S, V8.4S, V10.4S
     UZP1            V7.8H, V6.8H, V6.8H
     UZP2            V6.8H, V6.8H, V6.8H
     REV64           V7.8h, V7.8h
@@ -201,27 +188,21 @@
     REV64           V2.4H, V2.4H
     REV64           V3.4H, V3.4H
     SQSUB           V9.4S, V12.4S, V8.4S
-    SQSHL           V13.4S, V13.4S, #2
-    SQSHL           V9.4S, V9.4S, #2
     UMULL           V15.4S, V7.4H, V2.4H
-    SSHR            V13.4S, V13.4S, #16
-    UZP1            V26.8H, V13.8H, V13.8H
-    SSHR            V9.4S, V9.4S, #16
-    ST1             {V26.H}[0], [X11], X4
+    ST1             {V13.S}[0], [X11], X4
     UMULL           V12.4S, V1.4H, V3.4H
-    UZP1            V18.8H, V9.8H, V9.8H
     USHR            V15.4S, V15.4S, #16
-    ST1             {V26.H}[1], [X11], X4
+    ST1             {V13.S}[1], [X11], X4
     SMLAL           V15.4S, V6.4H, V2.4H
-    ST1             {V26.H}[2], [X11], X4
+    ST1             {V13.S}[2], [X11], X4
     USHR            V12.4S, V12.4S, #16
-    ST1             {V26.H}[3], [X11], X4
+    ST1             {V13.S}[3], [X11], X4
     SMLAL           V12.4S, V0.4H, V3.4H
-    ST1             {V18.H}[0], [X6], X9
+    ST1             {V9.S}[0], [X6], X9
     SQSHL           V15.4S, V15.4S, V11.4S
-    ST1             {V18.H}[1], [X6], X9
+    ST1             {V9.S}[1], [X6], X9
     SQSHL           V12.4S, V12.4S, V11.4S
-    ST1             {V18.H}[2], [X6], X9
+    ST1             {V9.S}[2], [X6], X9
 
     SSHLL           V27.4S, V3.4H, #0
     SMULL           V28.2D, V27.2S, V4.2S
@@ -230,7 +211,7 @@
     SQXTN2          V28.4S, V29.2D
     MOV             V14.16B, V28.16B
 
-    ST1             {V18.H}[3], [X6], X9
+    ST1             {V9.S}[3], [X6], X9
 
 
     SSHLL           V27.4S, V2.4H, #0
@@ -241,7 +222,6 @@
     MOV             V8.16B, V28.16B
 
     LD1             {V3.4S}, [X10], X12
-    SQADD           V14.4S, V14.4S, V10.4S
 
     SQNEG           V0.4S, V3.4S
     UZP1            V1.8H, V0.8H, V0.8H
@@ -253,39 +233,35 @@
     UZP2            V6.8H, V3.8H, V3.8H
     REV64           V7.8H, V7.8H
     REV64           V6.8H, V6.8H
-    SQADD           V8.4S, V8.4S, V10.4S
+
     LD2             {V2.4H, V3.4H}, [X8], X12
     SQSUB           V9.4S, V12.4S, V8.4S
     REV64           V2.4H, V2.4H
     REV64           V3.4H, V3.4H
-    SQSHL           V13.4S, V13.4S, #2
+
     LD1             {V4.4S}, [X1], #16
 
-    SQSHL           V9.4S, V9.4S, #2
-    SSHR            V13.4S, V13.4S, #16
+
     SUBS            X5, X5, #8
-    SSHR            V9.4S, V9.4S, #16
-    UZP1            V26.8H, V13.8H, V13.8H
-    UZP1            V18.8H, V9.8H, V9.8H
 
     BGT             LOOP_1
 
-    ST1             {V26.H}[0], [X11], X4
+    ST1             {V13.S}[0], [X11], X4
     UMULL           V15.4S, V7.4H, V2.4H
-    ST1             {V26.H}[1], [X11], X4
+    ST1             {V13.S}[1], [X11], X4
     UMULL           V12.4s, V1.4H, V3.4H
-    ST1             {V26.H}[2], [X11], X4
+    ST1             {V13.S}[2], [X11], X4
     USHR            V15.4S, V15.4S, #16
-    ST1             {V26.H}[3], [X11], X4
+    ST1             {V13.S}[3], [X11], X4
     USHR            V12.4S, V12.4S, #16
 
-    ST1             {V18.H}[0], [X6], X9
+    ST1             {V9.S}[0], [X6], X9
     SMLAL           V15.4S, V6.4H, V2.4H
-    ST1             {V18.H}[1], [X6], X9
+    ST1             {V9.S}[1], [X6], X9
     SMLAL           V12.4S, V0.4H, V3.4H
-    ST1             {V18.H}[2], [X6], X9
+    ST1             {V9.S}[2], [X6], X9
     SQSHL           V15.4S, V15.4S, V11.4S
-    ST1             {V18.H}[3], [X6], X9
+    ST1             {V9.S}[3], [X6], X9
     SQSHL           V12.4S, V12.4S, V11.4S
 
 
@@ -303,28 +279,20 @@
     SQXTN2          V28.4S, V29.2D
     MOV             V8.16B, V28.16B
 
-    SQADD           V14.4S, V14.4S, V10.4S
-    SQADD           V8.4S, V8.4S, V10.4S
+
     SQSUB           V13.4S, V15.4S, V14.4S
     SQSUB           V9.4S, V12.4S, V8.4S
-    SQSHL           V13.4S, V13.4S, #2
-    SQSHL           V9.4S, V9.4S, #2
-    SSHR            V13.4S, V13.4S, #16
-    SSHR            V9.4S, V9.4S, #16
-    UZP1            V26.8H, V13.8H, V13.8H
-
-    UZP1            V18.8H, V9.8H, V9.8H
 
 
-    ST1             {V26.H}[0], [X11], X4
-    ST1             {V26.H}[1], [X11], X4
-    ST1             {V26.H}[2], [X11], X4
-    ST1             {V26.H}[3], [X11], X4
+    ST1             {V13.S}[0], [X11], X4
+    ST1             {V13.S}[1], [X11], X4
+    ST1             {V13.S}[2], [X11], X4
+    ST1             {V13.S}[3], [X11], X4
 
-    ST1             {V18.H}[0], [X6], X9
-    ST1             {V18.H}[1], [X6], X9
-    ST1             {V18.H}[2], [X6], X9
-    ST1             {V18.H}[3], [X6], X9
+    ST1             {V9.S}[0], [X6], X9
+    ST1             {V9.S}[1], [X6], X9
+    ST1             {V9.S}[2], [X6], X9
+    ST1             {V9.S}[3], [X6], X9
     pop_v_regs
     RET
 
diff --git a/decoder/armv8/ixheaacd_post_twiddle_overlap.s b/decoder/armv8/ixheaacd_post_twiddle_overlap.s
index b8ee331..f05e6e4 100644
--- a/decoder/armv8/ixheaacd_post_twiddle_overlap.s
+++ b/decoder/armv8/ixheaacd_post_twiddle_overlap.s
@@ -1,43 +1,43 @@
 .macro push_v_regs
-    stp             q8, q9, [sp, #-32]!
-    stp             q10, q11, [sp, #-32]!
-    stp             q12, q13, [sp, #-32]!
-    stp             q14, q15, [sp, #-32]!
+    stp       q8, q9, [sp, #-32]!
+    stp       q10, q11, [sp, #-32]!
+    stp       q12, q13, [sp, #-32]!
+    stp       q14, q15, [sp, #-32]!
 //st1 { v8.2d,  v9.2d, v10.2d, v11.2d}, [sp, #-64]!
 //st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp, #-64]!
-    stp             X8, X9, [sp, #-16]!
-    stp             X10, X11, [sp, #-16]!
-    stp             X12, X13, [sp, #-16]!
-    stp             X14, X15, [sp, #-16]!
-    stp             X16, X17, [sp, #-16]!
-    stp             X18, X19, [sp, #-16]!
-    stp             X20, X21, [sp, #-16]!
-    stp             X22, X23, [sp, #-16]!
-    stp             X24, X25, [sp, #-16]!
-    stp             X26, X27, [sp, #-16]!
-    stp             X28, X29, [sp, #-16]!
-    stp             X30, X29, [sp, #-16]!
+    stp       X8, X9, [sp, #-16]!
+    stp       X10, X11, [sp, #-16]!
+    stp       X12, X13, [sp, #-16]!
+    stp       X14, X15, [sp, #-16]!
+  stp       X16, X17, [sp, #-16]!
+  stp       X18, X19, [sp, #-16]!
+  stp       X20, X21, [sp, #-16]!
+  stp       X22, X23, [sp, #-16]!
+  stp       X24, X25, [sp, #-16]!
+  stp       X26, X27, [sp, #-16]!
+  stp       X28, X29, [sp, #-16]!
+  stp       X30, X29, [sp, #-16]!
 .endm
 
 .macro pop_v_regs
-    ldp             X30, X29, [sp], #16
-    ldp             X28, X29, [sp], #16
-    ldp             X26, X27, [sp], #16
-    ldp             X24, X25, [sp], #16
-    ldp             X22, X23, [sp], #16
-    ldp             X20, X21, [sp], #16
-    ldp             X18, X19, [sp], #16
-    ldp             X16, X17, [sp], #16
-    ldp             X14, X15, [sp], #16
-    ldp             X12, X13, [sp], #16
-    ldp             X10, X11, [sp], #16
-    ldp             X8, X9, [sp], #16
+    ldp       X30, X29, [sp], #16
+    ldp       X28, X29, [sp], #16
+    ldp       X26, X27, [sp], #16
+    ldp       X24, X25, [sp], #16
+    ldp       X22, X23, [sp], #16
+    ldp       X20, X21, [sp], #16
+    ldp       X18, X19, [sp], #16
+    ldp       X16, X17, [sp], #16
+    ldp       X14, X15, [sp], #16
+    ldp       X12, X13, [sp], #16
+    ldp       X10, X11, [sp], #16
+    ldp       X8, X9, [sp], #16
 //ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp], #64
 //ld1 { v8.2d,  v9.2d, v10.2d, v11.2d}, [sp], #64
-    ldp             q14, q15, [sp], #32
-    ldp             q12, q13, [sp], #32
-    ldp             q10, q11, [sp], #32
-    ldp             q8, q9, [sp], #32
+    ldp       q14, q15, [sp], #32
+    ldp       q12, q13, [sp], #32
+    ldp       q10, q11, [sp], #32
+    ldp       q8, q9, [sp], #32
 .endm
 
 
@@ -48,18 +48,18 @@
 ixheaacd_post_twid_overlap_add_armv8:
 
     // STMFD sp!, {x4-x12}
-    push_v_regs
-    //stp x19, x20,[sp,#-16]!
+  push_v_regs
+  //stp x19, x20,[sp,#-16]!
     //VPUSH           {d8 - d15}
 
     //LDR w4,  [sp, #100]
-    //sxtw x4,w4
+  //sxtw x4,w4
     //LDR w5,  [sp, #104]
-    //sxtw x5,w5
+  //sxtw x5,w5
     //LDR w6,  [sp, #108]
-    //sxtw x6,w6
-    MOV             x16, x5
-    MOV             x17, x7
+  //sxtw x6,w6
+  MOV        x16, x5
+  MOV        x17, x7
     LSL             x9, x3, #2
     ASR             x9, x9, #1
     ADD             x6, x6, x9
@@ -71,141 +71,141 @@
 
 
 
-    movi            v18.4h, #50
-    sub             x20, x5, #15
-    neg             x9, x20
-    movi            v20.4s, #0x80, LSL #8
-    dup             v16.4s, w5
+    movi  v18.4h, #50
+  sub x20, x5, #15
+  neg x9, x20
+    movi  v20.4s, #0x00, LSL #8
+    dup  v16.4s,w5
     SUB             x5, x5, #16
     //STR w5,  [sp, #116]
-    MOV             w25, w5
-    sxtw            x25, w25
+  MOV        w25, w5
+  sxtw x25,w25
     MOV             x8, #1
     LSL             x8, x8, x9
     //STR w8,  [sp, #120]
-    MOV             w26, w8
+  MOV        w26, w8
 
-    //sxtw x8,w8
+  //sxtw x8,w8
 
 
 ARM_PROLOGUE:
 
 
-    LDR             w8, [x1], #4
-    sxtw            x8, w8
-    LDR             w9, [x1], #4
-    sxtw            x9, w9
+    LDR w8,  [x1], #4
+  sxtw x8,w8
+    LDR w9,  [x1], #4
+  sxtw x9,w9
 
-    LDR             w10, [x2], #4
-    sxtw            x10, w10
+    LDR w10,  [x2], #4
+  sxtw x10,w10
 
-    AND             w19, w10, 0xFFFF
-    sxth            x19, w19
-    ASR             w10, w10, #16
+  AND        w19,w10,0xFFFF
+  sxth      x19,w19
+  ASR        w10,w10,#16
 //    SMULWT          x11, x8, x10
 //
-//    SMULWB          x12, x9, x10
+//  SMULWB          x12, x9, x10
 //    SMULWB          x5, x8, x10
 //    SMLAWT          x7, x9, x10, x5
 
-    SMULL           x11, w8, w10
-    ASR             x11, x11, #16
-    SMULL           x12, w9, w19
-    ASR             x12, x12, #16
-    SMULL           x5, w8, w19
-    ASR             x5, x5, #16
-    SMULL           x7, w9, w10
-    ASR             x7, x7, #16
-    ADD             x7, x7, x5
+  SMULL          x11, w8, w10
+  ASR        x11,x11,#16
+  SMULL          x12, w9, w19
+  ASR        x12,x12,#16
+    SMULL          x5, w8, w19
+  ASR        x5,x5,#16
+    SMULL      x7, w9, w10
+  ASR        x7, x7, #16
+  ADD        x7, x7, x5
 
-    SUB             x8, x12, x11
+  SUB             x8, x12, x11
     MVN             x5, x7
     ADD             x5, x5, #1
 
 
     MOV             x9, #50
     MOV             x12, #-50
-    AND             w19, w9, 0xFFFF
-    sxth            x19, w19
-    SMULL           x10, w5, w19
-    ASR             x10, x10, #16
-    AND             w19, w12, 0xFFFF
-    sxth            x19, w19
-    SMULL           x11, w8, w19
-    ASR             x11, x11, #16
+    AND        w19,w9,0xFFFF
+  sxth      x19,w19
+  SMULL          x10, w5, w19
+    ASR        x10,x10,#16
+  AND        w19,w12,0xFFFF
+  sxth      x19,w19
+  SMULL          x11, w8, w19
+  ASR        x11,x11,#16
 
-    ADD             x8, x8, x10
+  ADD             x8, x8, x10
     ADD             x5, x5, x11
 
     //LDR w11,  [sp, #104]
-    MOV             w11, w16
-    sxth            x11, w11
-    LDR             w10, [x6], #-32
-    sxtw            x10, w10
+  MOV    w11, w16
+  sxth x11,w11
+    LDR w10,  [x6], #-32
+  sxtw x10,w10
 
-    AND             w19, w10, 0xFFFF
-    sxth            x19, w19
-    ASR             w20, w10, #16
+  AND        w19,w10,0xFFFF
+  sxth      x19,w19
+  ASR        w20,w10,#16
 
     //SMULWB          x7, x8, x10
-    SMULL           x7, w8, w19
-    ASR             x7, x7, #16
-    MVN             x8, x8
+    SMULL      x7, w8, w19
+  ASR        x7, x7, #16
+  MVN             x8, x8
     ADD             x8, x8, #1
     //SMULWT          x12, x8, x10
-    SMULL           x12, w8, w20
-    ASR             x12, x12, #16
+  SMULL      x12, w8, w20
+  ASR        x12, x12, #16
 
     CMP             x11, #0
     BLT             NEXT
 
-    SUB             x9, x11, #16
-    negs            x9, x9
+    SUB            x9, x11, #16
+  negs      x9,x9
 
 
 
 
-    // LDR w8,  [sp, #120]
-    //sxtw x8,w8
-    MOV             v1.s[0], w26
-    MOV             v2.s[0], w5
+   // LDR w8,  [sp, #120]
+  //sxtw x8,w8
+  MOV      v1.s[0], w26
+  MOV      v2.s[0], w5
 
     //sQADD            w5, w5, w8
     //ASR             w5, w5, w9
 
-    SQADD           v2.2s, v2.2s, v1.2s
-    MOV             w5, v2.s[0]
-    ASR             w5, w5, w9
+  SQADD      v2.2s, v2.2s, v1.2s
+  MOV        w5, v2.s[0]
+  ASR             w5, w5, w9
 
-    SUB             x9, x11, #31
-    negs            x9, x9
-    ASR             x20, x7, x9
+    SUB            x9, x11, #31
+  negs      x9,x9
+  ASR        x20, x7, x9
     //MOV            x8, x20
-    ADDS            x8, x20, #0
-    BGE             NEXT2
-    CMN             x8, #1
+  ADDS      x8, x20, #0
+  BGE        NEXT2
+    CMN           x8, #1
 NEXT2:
     MOV             x20, #0x80000000
-    csel            x7, x20, x7, LT
+   csel x7, x20, x7,LT
     MOV             x20, #0x7fffffff
-    csel            x7, x20, x7, GT
-    LSL             x20, x7, x11
-    csel            x7, x20, x7, EQ
+   csel x7, x20, x7,GT
+    LSL x20, x7,  x11
+  csel x7,x20,x7,EQ
 
-    SUB             x9, x11, #31
-    negs            x9, x9
-    ASR             x20, x12, x9
+    SUB            x9, x11, #31
+  negs      x9,x9
+  ASR        x20, x12, x9
     //MOV            x8, x20
-    ADDS            x8, x20, #0
-    BGE             NEXT3
-    CMN             x8, #1
+  ADDS      x8, x20, #0
+  BGE        NEXT3
+  CMN           x8, #1
 NEXT3:
     MOV             x20, #0x80000000
-    csel            x12, x20, x12, LT
+   csel x12, x20, x12,LT
     MOV             x20, #0x7fffffff
-    csel            x12, x20, x12, GT
-    LSL             x20, x12, x11
-    csel            x12, x20, x12, EQ
+   csel x12, x20, x12,GT
+    LSL x20, x12,  x11
+  csel x12,x20,x12,EQ
 
     B               NEXT1
 NEXT:
@@ -214,83 +214,83 @@
     ASR             w5, w5, w11
     MOV             w8, #0x8000
 
-    MOV             v1.s[0], w8
-    MOV             v2.s[0], w5
+  MOV      v1.s[0], w8
+  MOV      v2.s[0], w5
 
     //QADD            x5, x5, x8
 
-    SQADD           v2.2s, v2.2s, v1.2s
-    MOV             w5, v2.s[0]
+  SQADD      v2.2s, v2.2s, v1.2s
+  MOV        w5, v2.s[0]
 
-    ASR             w5, w5, #16
+  ASR             w5, w5, #16
     ASR             w7, w7, w11
     ASR             w12, w12, w11
 
 NEXT1:
-    LDR             w9, [x4]
-    sxtw            x9, w9
+    LDR w9,  [x4]
+  sxtw x9,w9
     MOV             w8, #0x8000
-    //sxtw x8,w8
+  //sxtw x8,w8
 
-    STR             w5, [x4], #4
-    sxtw            x5, w5
+    STR w5,  [x4], #4
+  sxtw x5,w5
 
 
-    ROR             w20, w10, #16
+  ROR        w20, w10, #16
     //UXTH            x5, x10, ROR #16
-    UXTH            w5, w20
-    UXTH            w10, w10
+    UXTH      w5, w20
+  UXTH            w10, w10
 
 
-    dup             v0.2s, w9
-    dup             v2.2s, w10
-    dup             v3.2s, w5
+    dup  v0.2s,w9
+    dup  v2.2s,w10
+    dup  v3.2s,w5
     //VZIP.32         D2, D3
-    ZIP1            v28.2s, v2.2s, v3.2s
-    ZIP2            v3.2s, v2.2s, v3.2s
-    MOV             v2.8b, v28.8b
-    sMULL           v0.2d, v2.2s, v0.2s
-    Sqxtn           v8.2s, v0.2d
+    ZIP1    v28.2s, v2.2s, v3.2s
+  ZIP2    v3.2s, v2.2s, v3.2s
+  MOV      v2.8b, v28.8b
+  sMULL v0.2d, v2.2s, v0.2s
+    Sqxtn v8.2s,  v0.2d
 
 
-    dup             v0.2s, w12
-    dup             v1.2s, w7
+    dup  v0.2s,w12
+    dup  v1.2s,w7
 
     //VZIP.32         D0, D1
 
-    ZIP1            v28.2s, v0.2s, v1.2s
-    ZIP2            v1.2s, v0.2s, v1.2s
-    MOV             v0.8b, v28.8b
+    ZIP1    v28.2s, v0.2s, v1.2s
+  ZIP2    v1.2s, v0.2s, v1.2s
+  MOV      v0.8b, v28.8b
 
-    SQSUB           v8.2s, v0.2s , v8.2s
+    SQSUB  v8.2s,  v0.2s ,  v8.2s
 
 
-    sQshL           v8.2s, v8.2s, #2
-    dup             v0.2s, w8
-    SQADD           v8.2s, v8.2s , v0.2s
-    sshR            v8.2s, v8.2s, #16
+    //sQshL v8.2s, v8.2s,#2
+    dup  v0.2s,w8
+    //SQADD  v8.2s,  v8.2s ,  v0.2s
+    //sshR v8.2s, v8.2s,#16
 
 
 
-    MOV             x7, x17
-    //sxtw x7,w7
-    LSL             x10, x7, #1
+    MOV x7,  x17
+  //sxtw x7,w7
+    LSL             x10, x7, #2
 
     ASR             x5, x3, #1
     //SMULBB          x5, x10, x5
-    AND             w5, w5, 0xFFFF
-    sxth            x5, w5
-    AND             w19, w10, 0xFFFF
-    sxth            x19, w19
-    SMULL           x5, w19, w5
+    AND        w5,w5,0xFFFF
+    sxth      x5,w5
+  AND        w19,w10,0xFFFF
+  sxth      x19,w19
+  SMULL      x5, w19, w5
 
     ADD             x5, x5, x0
     SUB             x0, x5, x10
     MVN             x9, x10
     ADD             x9, x9, #1
 
-    ST1             {v8.h}[2], [x0], x9
-    ST1             {v8.h}[0], [x5], x10
+    ST1 {V8.S}[1],[x0], x9
+    ST1 {V8.S}[0],[x5], x10
 
 
     MOV             x8, x1
@@ -311,875 +311,799 @@
     ASR             x3, x3, #2
     SUB             x3, x3, #2
 
-    LD2             { v0.4s, v1.4s}, [x1]
-    MOV             v2.16b, v1.16b
-    ADD             x1, x1, x12
+    LD2 { v0.4s, v1.4s}, [x1]
+  MOV        v2.16b, v1.16b
+  ADD       x1, x1, x12
 
     //VUZP.16         D0, D1
-    UZP1            v28.8h, v0.8h, v0.8h
-    UZP2            v29.8h, v0.8h, v0.8h
-    MOV             v0.d[0], v28.d[0]
-    MOV             v0.d[1], v29.d[0]
+    UZP1      v28.8h, v0.8h, v0.8h
+  UZP2      v29.8h, v0.8h, v0.8h
+  MOV        v0.d[0], v28.d[0]
+  MOV        v0.d[1], v29.d[0]
 
-    //VUZP.16         D2, D3
+  //VUZP.16         D2, D3
 
-    UZP1            v28.8h, v2.8h, v2.8h
-    UZP2            v29.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v28.d[0]
-    MOV             v2.d[1], v29.d[0]
+  UZP1      v28.8h, v2.8h, v2.8h
+  UZP2      v29.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v28.d[0]
+  MOV        v2.d[1], v29.d[0]
 
 
     //rev64  v0.8h,  v0.8h
-    rev64           v0.8h, v0.8h
-    MOV             v1.d[0], v0.d[1]
-    rev64           v2.8h, v2.8h
-    MOV             v3.d[0], v2.d[1]
-    LD2             {v8.4h, v9.4h}, [x2]
-    ADD             x2, x2, #16
+  rev64  v0.8h,  v0.8h
+  MOV        v1.d[0], v0.d[1]
+    rev64  v2.8h,  v2.8h
+  MOV        v3.d[0], v2.d[1]
+    LD2 {v8.4h, v9.4h}, [x2]
+  ADD      x2, x2, #16
 
-    LD2             { v4.4s, v5.4s}, [x8]
-    MOV             v6.16b, v5.16b
-    ADD             x8, x8, #32
-    uMULL           v30.4s, v0.4h, v9.4h
+    LD2 { v4.4s, v5.4s}, [x8]
+  MOV      v6.16b, v5.16b
+  ADD x8, x8,#32
+    uMULL v30.4s, v0.4h, v9.4h
 
 //    VUZP.16         D4, D5
 
-    UZP1            v28.8h, v4.8h, v4.8h
-    UZP2            v29.8h, v4.8h, v4.8h
-    MOV             v4.d[0], v28.d[0]
-    MOV             v5.d[0], v29.d[0]
+  UZP1      v28.8h, v4.8h, v4.8h
+  UZP2      v29.8h, v4.8h, v4.8h
+  MOV        v4.d[0], v28.d[0]
+  MOV        v5.d[0], v29.d[0]
 
-    uMULL           v28.4s, v2.4h, v8.4h
+    uMULL v28.4s, v2.4h, v8.4h
 
 //    VUZP.16         D6, D7
-    UZP1            v26.8h, v6.8h, v6.8h
-    UZP2            v27.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v26.d[0]
-    MOV             v7.d[0], v27.d[0]
+  UZP1      v26.8h, v6.8h, v6.8h
+  UZP2      v27.8h, v6.8h, v6.8h
+  MOV        v6.d[0], v26.d[0]
+  MOV        v7.d[0], v27.d[0]
 
-    uMULL           v26.4s, v0.4h, v8.4h
+  uMULL v26.4s, v0.4h, v8.4h
 
 
-    uMULL           v24.4s, v2.4h, v9.4h
+    uMULL v24.4s, v2.4h, v9.4h
 
-    LD2             { v10.4s, v11.4s}, [x6]
-    MOV             v12.16b, v11.16b
-    ADD             x6, x6, x12
-    ushR            v30.4s, v30.4s, #16
+    LD2 { v10.4s, v11.4s}, [x6]
+    MOV      v12.16b, v11.16b
+  ADD  x6, x6, x12
+    ushR v30.4s, v30.4s,#16
 
     //VUZP.16         D10, D11
 
-    UZP1            v22.8h, v10.8h, v10.8h
-    UZP2            v23.8h, v10.8h, v10.8h
-    MOV             v10.d[0], v22.d[0]
-    MOV             v10.d[1], v23.d[0]
+  UZP1      v22.8h, v10.8h, v10.8h
+  UZP2      v23.8h, v10.8h, v10.8h
+  MOV        v10.d[0], v22.d[0]
+  MOV        v10.d[1], v23.d[0]
 
-    ushR            v28.4s, v28.4s, #16
+  ushR v28.4s, v28.4s,#16
 
     //VUZP.16         D12, D13
 
-    UZP1            v22.8h, v12.8h, v12.8h
-    UZP2            v23.8h, v12.8h, v12.8h
-    MOV             v12.d[0], v22.d[0]
-    MOV             v12.d[1], v23.d[0]
+  UZP1      v22.8h, v12.8h, v12.8h
+  UZP2      v23.8h, v12.8h, v12.8h
+  MOV        v12.d[0], v22.d[0]
+  MOV        v12.d[1], v23.d[0]
 
-    sMLAL           v30.4s, v1.4h, v9.4h
+  sMLAL v30.4s, v1.4h, v9.4h
 
-    rev64           v10.8h, v10.8h
-    MOV             v11.d[0], v10.d[1]
-    sMLAL           v28.4s, v3.4h, v8.4h
+    rev64  v10.8h,  v10.8h
+  MOV    v11.d[0], v10.d[1]
+    sMLAL v28.4s, v3.4h, v8.4h
 
-    rev64           v12.8h, v12.8h
-    MOV             v13.d[0], v12.d[1]
-    ushR            v26.4s, v26.4s, #16
+    rev64  v12.8h,  v12.8h
+  MOV    v13.d[0], v12.d[1]
+    ushR v26.4s, v26.4s,#16
 
 
-    ushR            v24.4s, v24.4s, #16
+    ushR v24.4s, v24.4s,#16
 
-    sMLAL           v26.4s, v1.4h, v8.4h
-    sMLAL           v24.4s, v3.4h, v9.4h
+    sMLAL v26.4s, v1.4h, v8.4h
+    sMLAL v24.4s, v3.4h, v9.4h
 
 
 
-    ADD             v30.4s, v30.4s , v28.4s
-    NEG             v30.4s, v30.4s
+    ADD  v30.4s,  v30.4s ,  v28.4s
+    NEG  v30.4s, v30.4s
 
-    uMULL           v22.4s, v4.4h, v8.4h
+    uMULL v22.4s, v4.4h, v8.4h
 
-    SUB             v28.4s, v24.4s , v26.4s
+    SUB  v28.4s,  v24.4s ,  v26.4s
 
 
-    mov             v26.16b, v30.16b
-    mov             v24.16b, v28.16b
+    mov  v26.16b, v30.16b
+    mov  v24.16b, v28.16b
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
 
 //    VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
-    uMULL           v2.4s, v24.4h, v18.4h
+    uMULL v2.4s, v24.4h, v18.4h
 
-    uMULL           v0.4s, v26.4h, v18.4h
+    uMULL v0.4s, v26.4h, v18.4h
 
-    ushR            v22.4s, v22.4s, #16
-    sMLAL           v22.4s, v5.4h, v8.4h
+    ushR v22.4s, v22.4s,#16
+    sMLAL v22.4s, v5.4h, v8.4h
 
-    ushR            v2.4s, v2.4s, #16
-    ushR            v0.4s, v0.4s, #16
-    sMLAL           v2.4s, v25.4h, v18.4h
-    sMLAL           v0.4s, v27.4h, v18.4h
+    ushR v2.4s, v2.4s,#16
+    ushR v0.4s, v0.4s,#16
+    sMLAL v2.4s, v25.4h, v18.4h
+    sMLAL v0.4s, v27.4h, v18.4h
 
-    uMULL           v24.4s, v4.4h, v9.4h
-    uMULL           v26.4s, v6.4h, v8.4h
+    uMULL v24.4s, v4.4h, v9.4h
+    uMULL v26.4s, v6.4h, v8.4h
 
-    NEG             v2.4s, v2.4s
-    ADD             v28.4s, v28.4s , v0.4s
-    ADD             v30.4s, v30.4s , v2.4s
+    NEG  v2.4s, v2.4s
+    ADD  v28.4s,  v28.4s ,  v0.4s
+    ADD  v30.4s,  v30.4s ,  v2.4s
 
-    uMULL           v0.4s, v6.4h, v9.4h
-    sshR            v24.4s, v24.4s, #16
-    sMLAL           v24.4s, v5.4h, v9.4h
-    sshR            v26.4s, v26.4s, #16
-    sshR            v0.4s, v0.4s, #16
-    sMLAL           v26.4s, v7.4h, v8.4h
-    sMLAL           v0.4s, v7.4h, v9.4h
+    uMULL v0.4s, v6.4h, v9.4h
+    sshR v24.4s, v24.4s,#16
+    sMLAL v24.4s, v5.4h, v9.4h
+    sshR v26.4s, v26.4s,#16
+    sshR v0.4s, v0.4s,#16
+    sMLAL v26.4s, v7.4h, v8.4h
+    sMLAL v0.4s, v7.4h, v9.4h
 
 
 
 
-    ADD             v22.4s, v22.4s , v0.4s
-    NEG             v22.4s, v22.4s
-    SUB             v24.4s, v26.4s , v24.4s
+    ADD  v22.4s,  v22.4s ,  v0.4s
+    NEG  v22.4s, v22.4s
+    SUB  v24.4s,  v26.4s ,  v24.4s
 
 
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v14.4s, w11
-    SQADD           v28.4s, v28.4s , v14.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v14.4s,w11
+    SQADD  v28.4s,  v28.4s ,  v14.4s
     //LDR w11,  [sp, #116]
-    MOV             w11, w25
-    //sxtw x11,w11
-    dup             v0.4s, w11
-    sQshL           v28.4s, v28.4s, v0.4s
+  MOV    w11, w25
+  //sxtw x11,w11
+    dup  v0.4s,w11
+    sQshL v28.4s, v28.4s, v0.4s
 
-    mov             v0.16b, v22.16b
-    mov             v14.16b, v24.16b
+    mov  v0.16b, v22.16b
+    mov  v14.16b, v24.16b
 
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
 
 //    VUZP.16         D22, D23
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+  UZP1      v19.8h, v22.8h, v22.8h
+  UZP2      v21.8h, v22.8h, v22.8h
+  MOV        v22.d[0], v19.d[0]
+  MOV        v23.d[0], v21.d[0]
 
-    uMULL           v8.4s, v24.4h, v18.4h
-    uMULL           v26.4s, v22.4h, v18.4h
+  uMULL v8.4s, v24.4h, v18.4h
+    uMULL v26.4s, v22.4h, v18.4h
 
-    NEG             v2.4s, v30.4s
+    NEG  v2.4s, v30.4s
 //    VUZP.16         D30, D31
 
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
+  UZP1      v19.8h, v30.8h, v30.8h
+  UZP2      v21.8h, v30.8h, v30.8h
+  MOV        v30.d[0], v19.d[0]
+  MOV        v30.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v3.d[0], v21.d[0]
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v3.d[0], v21.d[0]
 
-    uMULL           v4.4s, v30.4h, v12.4h
+    uMULL v4.4s, v30.4h, v12.4h
 
-    uMULL           v6.4s, v2.4h, v13.4h
+    uMULL v6.4s, v2.4h, v13.4h
 
-    ushR            v8.4s, v8.4s, #16
-    ushR            v26.4s, v26.4s, #16
+    ushR v8.4s, v8.4s,#16
+    ushR v26.4s, v26.4s,#16
 
-    sMLAL           v8.4s, v25.4h, v18.4h
-    sMLAL           v26.4s, v23.4h, v18.4h
+    sMLAL v8.4s, v25.4h, v18.4h
+    sMLAL v26.4s, v23.4h, v18.4h
 
-    ushR            v4.4s, v4.4s, #16
-    ushR            v6.4s, v6.4s, #16
+    ushR v4.4s, v4.4s,#16
+    ushR v6.4s, v6.4s,#16
 
-    MOV             v19.d[0], v30.d[1]
+  MOV  v19.d[0], v30.d[1]
 
-    sMLAL           v4.4s, v19.4h, v12.4h
-    sMLAL           v6.4s, v3.4h, v13.4h
+    sMLAL v4.4s, v19.4h, v12.4h
+    sMLAL v6.4s, v3.4h, v13.4h
 
-    NEG             v8.4s, v8.4s
-    ADD             v14.4s, v14.4s , v26.4s
-    ADD             v0.4s, v0.4s , v8.4s
+    NEG  v8.4s, v8.4s
+    ADD  v14.4s,  v14.4s ,  v26.4s
+    ADD  v0.4s,  v0.4s ,  v8.4s
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v8.4s, w11
-    SQADD           v0.4s, v0.4s , v8.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v8.4s,w11
+    SQADD  v0.4s,  v0.4s ,  v8.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v26.4s, w11
-    sQshL           v0.4s, v0.4s, v26.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v26.4s,w11
+    sQshL v0.4s, v0.4s, v26.4s
 
-    mov             v26.16b, v28.16b
+    mov  v26.16b, v28.16b
 
-    LD2             { v28.4s, v29.4s}, [x4]
-    MOV             v30.16b, v29.16b
-    MOV             v29.d[0], v28.d[1]
-//   VZIP.32         Q13, Q0
+    LD2 { v28.4s, v29.4s}, [x4]
+    MOV      v30.16b, v29.16b
+    MOV      v29.d[0], v28.d[1]
+ //   VZIP.32         Q13, Q0
 
-    ZIP1            v19.4s, v26.4s, v0.4s
-    ZIP2            v0.4s, v26.4s, v0.4s
-    MOV             v26.16b, v19.16b
+    ZIP1    v19.4s, v26.4s, v0.4s
+  ZIP2    v0.4s, v26.4s, v0.4s
+  MOV      v26.16b, v19.16b
 
-    ST1             { v26.4s}, [x4], #16
-    ST1             { v0.4s}, [x4], #16
+    ST1 { v26.4s}, [x4],#16
+    ST1 { v0.4s}, [x4],#16
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D13, D1
 
-    SADDL           v0.4s, v13.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
-    sMULL           v26.2d, v28.2s, v0.2s
-    Sqxtn           v8.2s, v26.2d
-    sMULL           v26.2d, v29.2s, v1.2s
-    Sqxtn           v9.2s, v26.2d
-    MOV             v8.d[1], v9.d[0]
-    movi            v1.2s, #0
+  SADDL       v0.4s, v13.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
+    sMULL v26.2d, v28.2s, v0.2s
+    Sqxtn v8.2s,  v26.2d
+    sMULL v26.2d, v29.2s, v1.2s
+    Sqxtn v9.2s,  v26.2d
+  MOV    v8.d[1], v9.d[0]
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D12, D1
-    SADDL           v0.4s, v12.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
-    sMULL           v24.2d, v28.2s, v0.2s
-    Sqxtn           v26.2s, v24.2d
-    sMULL           v24.2d, v29.2s, v1.2s
-    Sqxtn           v27.2s, v24.2d
-    MOV             v26.d[1], v27.d[0]
+  SADDL       v0.4s, v12.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
+    sMULL v24.2d, v28.2s, v0.2s
+    Sqxtn v26.2s,  v24.2d
+    sMULL v24.2d, v29.2s, v1.2s
+    Sqxtn v27.2s,  v24.2d
+  MOV    v26.d[1], v27.d[0]
 
-    sQshL           v4.4s, v4.4s, v16.4s
-    sQshL           v6.4s, v6.4s, v16.4s
+    sQshL v4.4s, v4.4s, v16.4s
+    sQshL v6.4s, v6.4s, v16.4s
 
-    SQSUB           v4.4s, v4.4s , v8.4s
-    SQSUB           v6.4s, v6.4s , v26.4s
+    SQSUB  v4.4s,  v4.4s ,  v8.4s
+    SQSUB  v6.4s,  v6.4s ,  v26.4s
 
-    NEG             v26.4s, v14.4s
+    NEG  v26.4s, v14.4s
 //    VUZP.16         D14, D15
 
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+  UZP1      v19.8h, v14.8h, v14.8h
+  UZP2      v21.8h, v14.8h, v14.8h
+  MOV        v14.d[0], v19.d[0]
+  MOV        v15.d[0], v21.d[0]
 
 //    VUZP.16         D26, D27
 
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D10, D1
-    SADDL           v0.4s, v10.4h, v1.4h
-    MOV             v1.d[0], v0.d[0]
-    sMULL           v22.2d, v30.2s, v0.2s
-    Sqxtn           v24.2s, v22.2d
-    sMULL2          v22.2d, v30.4s, v0.4s
-    Sqxtn           v25.2s, v22.2d
-    MOV             v24.d[1], v25.d[0]
-    movi            v1.2s, #0
+   SADDL       v0.4s, v10.4h, v1.4h
+  MOV      v1.d[0], v0.d[0]
+  sMULL v22.2d, v30.2s, v0.2s
+    Sqxtn v24.2s,  v22.2d
+    sMULL2 v22.2d, v30.4s, v0.4s
+    Sqxtn v25.2s,  v22.2d
+  MOV    v24.d[1], v25.d[0]
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D11, D1
-    SADDL           v0.4s, v11.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v11.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v8.2d, v30.2s, v0.2s
-    Sqxtn           v22.2s, v8.2d
-    sMULL2          v8.2d, v30.4s, v0.4s
-    Sqxtn           v23.2s, v8.2d
-    MOV             v22.d[1], v23.d[0]
-    uMULL           v8.4s, v26.4h, v11.4h
-    uMULL           v30.4s, v14.4h, v10.4h
+  sMULL v8.2d, v30.2s, v0.2s
+    Sqxtn v22.2s,  v8.2d
+    sMULL2 v8.2d, v30.4s, v0.4s
+    Sqxtn v23.2s,  v8.2d
+  MOV    v22.d[1], v23.d[0]
+    uMULL v8.4s, v26.4h, v11.4h
+    uMULL v30.4s, v14.4h, v10.4h
 
-    LD2             { v0.4s, v1.4s}, [x1]
-    MOV             v2.16b, v1.16b
-    ADD             x1, x1, x12
+    LD2 { v0.4s, v1.4s}, [x1]
+  MOV  v2.16b, v1.16b
+  ADD x1, x1, x12
 
 //    VUZP.16         D0, D1
 
-    UZP1            v19.8h, v0.8h, v0.8h
-    UZP2            v21.8h, v0.8h, v0.8h
-    MOV             v0.d[0], v19.d[0]
-    MOV             v0.d[1], v21.d[0]
+  UZP1      v19.8h, v0.8h, v0.8h
+  UZP2      v21.8h, v0.8h, v0.8h
+  MOV        v0.d[0], v19.d[0]
+  MOV        v0.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v2.d[1], v21.d[0]
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v2.d[1], v21.d[0]
 
-    ushR            v8.4s, v8.4s, #16
+    ushR v8.4s, v8.4s,#16
 
-    rev64           v0.8h, v0.8h
-    MOV             v1.d[0], v0.d[1]
-    ushR            v30.4s, v30.4s, #16
+    rev64  v0.8h,  v0.8h
+  MOV    v1.d[0], v0.d[1]
+    ushR v30.4s, v30.4s,#16
 
-    rev64           v2.8h, v2.8h
-    MOV             v3.d[0], v2.d[1]
-    sMLAL           v8.4s, v27.4h, v11.4h
+    rev64  v2.8h,  v2.8h
+  MOV    v3.d[0], v2.d[1]
+    sMLAL v8.4s, v27.4h, v11.4h
 
-    sMLAL           v30.4s, v15.4h, v10.4h
+    sMLAL v30.4s, v15.4h, v10.4h
 
-    LD2             { v10.4s, v11.4s}, [x6]
-    ADD             x6, x6, x12
-    MOV             v12.16b, v11.16b
-    sQshL           v4.4s, v4.4s, #2
+    LD2 { v10.4s, v11.4s}, [x6]
+  ADD  x6, x6, x12
+  MOV  v12.16b, v11.16b
 
-//   VUZP.16         D10, D11
+  UZP1      v19.8h, v10.8h, v10.8h
+  UZP2      v21.8h, v10.8h, v10.8h
+  MOV        v10.d[0], v19.d[0]
+  MOV        v10.d[1], v21.d[0]
 
-    UZP1            v19.8h, v10.8h, v10.8h
-    UZP2            v21.8h, v10.8h, v10.8h
-    MOV             v10.d[0], v19.d[0]
-    MOV             v10.d[1], v21.d[0]
 
-    sQshL           v6.4s, v6.4s, #2
+ UZP1   v19.8h, v12.8h, v12.8h
+ UZP2   v21.8h, v12.8h, v12.8h
+ MOV    v12.d[0], v19.d[0]
+ MOV    v12.d[1], v21.d[0]
+  MOV V14.16B , V4.16B
 
-//    VUZP.16         D12, D13
+    rev64  v10.8h,  v10.8h
+  MOV    v11.d[0], v10.d[1]
 
-    UZP1            v19.8h, v12.8h, v12.8h
-    UZP2            v21.8h, v12.8h, v12.8h
-    MOV             v12.d[0], v19.d[0]
-    MOV             v12.d[1], v21.d[0]
 
-    SQADD           v14.4s, v4.4s , v20.4s
+    rev64  v12.8h,  v12.8h
+  MOV   v13.d[0], v12.d[1]
 
-    rev64           v10.8h, v10.8h
-    MOV             v11.d[0], v10.d[1]
-    SQADD           v6.4s, v6.4s , v20.4s
+    sQshL v8.4s, v8.4s, v16.4s
 
-    rev64           v12.8h, v12.8h
-    MOV             v13.d[0], v12.d[1]
-    sshR            v14.4s, v14.4s, #16
+    MOV V31.16B, V6.16B
+    LD2 { v4.4s, v5.4s}, [x8]
+  ADD  x8, x8,#32
 
-//    VUZP.16         D14, D15
-
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
-
-    sshR            v6.4s, v6.4s, #16
-
-//    VUZP.16         D6, D7
-
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
-
-    mov             v15.8b, v6.8b
-    sQshL           v8.4s, v8.4s, v16.4s
-
-    LD2             { v4.4s, v5.4s}, [x8]
-    ADD             x8, x8, #32
-    MOV             v6.16b, v5.16b
-    sQshL           v30.4s, v30.4s, v16.4s
+  MOV  v6.16b, v5.16b
+    sQshL v30.4s, v30.4s, v16.4s
 
 //    VUZP.16         D4, D5
 
-    UZP1            v19.8h, v4.8h, v4.8h
-    UZP2            v21.8h, v4.8h, v4.8h
-    MOV             v4.d[0], v19.d[0]
-    MOV             v5.d[0], v21.d[0]
+  UZP1      v19.8h, v4.8h, v4.8h
+  UZP2      v21.8h, v4.8h, v4.8h
+  MOV        v4.d[0], v19.d[0]
+  MOV        v5.d[0], v21.d[0]
 
-    SQSUB           v8.4s, v8.4s , v24.4s
+    SQSUB  v8.4s,  v8.4s ,  v24.4s
 
 //    VUZP.16         D6, D7
 
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
+    UZP1      v19.8h, v6.8h, v6.8h
+  UZP2      v21.8h, v6.8h, v6.8h
+  MOV        v6.d[0], v19.d[0]
+  MOV        v7.d[0], v21.d[0]
 
-    SQSUB           v22.4s, v30.4s , v22.4s
-
-    sQshL           v30.4s, v8.4s, #2
-
-    LD2             {v8.4h, v9.4h}, [x2]
-    ADD             x2, x2, #16
-    sQshL           v22.4s, v22.4s, #2
-
-    SQADD           v30.4s, v30.4s , v20.4s
-    SQADD           v22.4s, v22.4s , v20.4s
-
-    sshR            v30.4s, v30.4s, #16
-
-//    VUZP.16         D30, D31
-
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
-
-    sshR            v22.4s, v22.4s, #16
+  SQSUB  v22.4s,  v30.4s ,  v22.4s
 
 
-//    VUZP.16         D22, D23
+     MOV V30.16B, V8.16B
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+    LD2 {v8.4h, v9.4h}, [x2]
+  ADD  x2, x2, #16
 
 
-    mov             v23.8b, v30.8b
-
 CORE_LOOP:
-    ST1             {v14.h}[0], [x0]
-    ADD             x0, x0, x9
-    uMULL           v30.4s, v0.4h, v9.4h
-
-    ST1             {v22.h}[0], [x0]
-    ADD             x0, x0, x9
-    uMULL           v28.4s, v2.4h, v8.4h
-
-    ST1             {v14.h}[1], [x0]
-    ADD             x0, x0, x9
-    uMULL           v26.4s, v0.4h, v8.4h
-
-    ST1             {v22.h}[1], [x0]
-    ADD             x0, x0, x9
-    uMULL           v24.4s, v2.4h, v9.4h
-
-    ST1             {v14.h}[2], [x0]
-    ADD             x0, x0, x9
-    ushR            v30.4s, v30.4s, #16
-
-    ST1             {v22.h}[2], [x0]
-    ADD             x0, x0, x9
-    ushR            v28.4s, v28.4s, #16
-
-    ST1             {v14.h}[3], [x0]
-    ADD             x0, x0, x9
-    sMLAL           v30.4s, v1.4h, v9.4h
-
-    ST1             {v22.h}[3], [x0]
-    ADD             x0, x0, x9
-    sMLAL           v28.4s, v3.4h, v8.4h
-
-    ST1             {v15.h}[0], [x5]
-    ADD             x5, x5, x10
-    ushR            v26.4s, v26.4s, #16
-
-    ST1             {v23.h}[0], [x5]
-    ADD             x5, x5, x10
-    ushR            v24.4s, v24.4s, #16
-
-    ST1             {v15.h}[1], [x5]
-    ADD             x5, x5, x10
-    sMLAL           v26.4s, v1.4h, v8.4h
-
-    ST1             {v23.h}[1], [x5]
-    ADD             x5, x5, x10
-    sMLAL           v24.4s, v3.4h, v9.4h
-
-    ST1             {v15.h}[2], [x5]
-    ADD             x5, x5, x10
-    ADD             v30.4s, v30.4s , v28.4s
-
-    ST1             {v23.h}[2], [x5]
-    ADD             x5, x5, x10
-    NEG             v30.4s, v30.4s
-
-    ST1             {v15.h}[3], [x5]
-    ADD             x5, x5, x10
-
-    ST1             {v23.h}[3], [x5]
-    ADD             x5, x5, x10
-    SUB             v28.4s, v24.4s , v26.4s
+    ST1 {V14.S}[0], [x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[0], [x0]
+  ADD  x0, x0,  x9
 
 
-    mov             v26.16b, v30.16b
-    uMULL           v22.4s, v4.4h, v8.4h
+    ST1 {V14.S}[1], [x0]
+  ADD  x0, x0, x9
 
-    mov             v24.16b, v28.16b
+
+    ST1 {V22.S}[1], [x0]
+  ADD  x0, x0,  x9
+
+
+    ST1 {V14.S}[2], [x0]
+    ADD  x0, x0,  x9
+
+
+    ST1 {V22.S}[2], [x0]
+    ADD  x0, x0,  x9
+
+
+    ST1 {V14.S}[3], [x0]
+    ADD  x0, x0,  x9
+
+
+    ST1 {V22.S}[3], [x0]
+    ADD  x0, x0,  x9
+
+
+    ST1 {V31.S}[0], [x5]
+    ADD  x5, x5,  x10
+
+
+    ST1 {V30.S}[0], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V31.S}[1], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V30.S}[1], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V31.S}[2], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V30.S}[2], [x5]
+  ADD  x5, x5,  x10
+
+
+    ST1 {V31.S}[3], [x5]
+  ADD  x5, x5,  x10
+
+    ST1 {V30.S}[3], [x5]
+  ADD  x5, x5,  x10
+
+
+    uMULL v30.4s, v0.4h, v9.4h
+    uMULL v28.4s, v2.4h, v8.4h
+    uMULL v26.4s, v0.4h, v8.4h
+    uMULL v24.4s, v2.4h, v9.4h
+    ushR v30.4s, v30.4s,#16
+    ushR v28.4s, v28.4s,#16
+    sMLAL v30.4s, v1.4h, v9.4h
+    sMLAL v28.4s, v3.4h, v8.4h
+    ushR v26.4s, v26.4s,#16
+    ushR v24.4s, v24.4s,#16
+    sMLAL v26.4s, v1.4h, v8.4h
+    sMLAL v24.4s, v3.4h, v9.4h
+    ADD  v30.4s,  v30.4s ,  v28.4s
+    NEG  v30.4s, v30.4s
+    SUB  v28.4s,  v24.4s ,  v26.4s
+
+    mov  v26.16b, v30.16b
+    uMULL v22.4s, v4.4h, v8.4h
+
+    mov  v24.16b, v28.16b
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
 
 //    VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
-    uMULL           v2.4s, v24.4h, v18.4h
-    uMULL           v0.4s, v26.4h, v18.4h
+  uMULL v2.4s, v24.4h, v18.4h
+    uMULL v0.4s, v26.4h, v18.4h
 
-    ushR            v22.4s, v22.4s, #16
-    sMLAL           v22.4s, v5.4h, v8.4h
+    ushR v22.4s, v22.4s,#16
+    sMLAL v22.4s, v5.4h, v8.4h
 
-    ushR            v2.4s, v2.4s, #16
-    ushR            v0.4s, v0.4s, #16
-    sMLAL           v2.4s, v25.4h, v18.4h
-    sMLAL           v0.4s, v27.4h, v18.4h
+    ushR v2.4s, v2.4s,#16
+    ushR v0.4s, v0.4s,#16
+    sMLAL v2.4s, v25.4h, v18.4h
+    sMLAL v0.4s, v27.4h, v18.4h
 
-    uMULL           v24.4s, v4.4h, v9.4h
-    uMULL           v26.4s, v6.4h, v8.4h
+    uMULL v24.4s, v4.4h, v9.4h
+    uMULL v26.4s, v6.4h, v8.4h
 
-    NEG             v2.4s, v2.4s
-    ADD             v28.4s, v28.4s , v0.4s
-    ADD             v30.4s, v30.4s , v2.4s
+    NEG  v2.4s, v2.4s
+    ADD  v28.4s,  v28.4s ,  v0.4s
+    ADD  v30.4s,  v30.4s ,  v2.4s
 
-    uMULL           v0.4s, v6.4h, v9.4h
-    sshR            v24.4s, v24.4s, #16
-    sMLAL           v24.4s, v5.4h, v9.4h
-    sshR            v26.4s, v26.4s, #16
-    sshR            v0.4s, v0.4s, #16
-    sMLAL           v26.4s, v7.4h, v8.4h
-    sMLAL           v0.4s, v7.4h, v9.4h
+    uMULL v0.4s, v6.4h, v9.4h
+    sshR v24.4s, v24.4s,#16
+    sMLAL v24.4s, v5.4h, v9.4h
+    sshR v26.4s, v26.4s,#16
+    sshR v0.4s, v0.4s,#16
+    sMLAL v26.4s, v7.4h, v8.4h
+    sMLAL v0.4s, v7.4h, v9.4h
 
 
 
-    ADD             v22.4s, v22.4s , v0.4s
+    ADD  v22.4s,  v22.4s ,  v0.4s
 
-    NEG             v22.4s, v22.4s
-    SUB             v24.4s, v26.4s , v24.4s
+    NEG  v22.4s, v22.4s
+    SUB  v24.4s,  v26.4s ,  v24.4s
 
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v14.4s, w11
-    SQADD           v28.4s, v28.4s , v14.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v14.4s,w11
+    SQADD  v28.4s,  v28.4s ,  v14.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v0.4s, w11
-    sQshL           v28.4s, v28.4s, v0.4s
+  //sxtw x11,w11
+  MOV    w11, w25
+    dup  v0.4s,w11
+    sQshL v28.4s, v28.4s, v0.4s
 
 
-    mov             v0.16b, v22.16b
-    mov             v14.16b, v24.16b
+    mov  v0.16b, v22.16b
+    mov  v14.16b, v24.16b
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
 
 //    VUZP.16         D22, D23
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+  UZP1      v19.8h, v22.8h, v22.8h
+  UZP2      v21.8h, v22.8h, v22.8h
+  MOV        v22.d[0], v19.d[0]
+  MOV        v23.d[0], v21.d[0]
 
-    uMULL           v8.4s, v24.4h, v18.4h
-    uMULL           v26.4s, v22.4h, v18.4h
+  uMULL v8.4s, v24.4h, v18.4h
+    uMULL v26.4s, v22.4h, v18.4h
 
-    NEG             v2.4s, v30.4s
+    NEG  v2.4s, v30.4s
 
 //    VUZP.16         D30, D31
 
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
+  UZP1      v19.8h, v30.8h, v30.8h
+  UZP2      v21.8h, v30.8h, v30.8h
+  MOV        v30.d[0], v19.d[0]
+  MOV        v30.d[1], v21.d[0]
 
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v3.d[0], v21.d[0]
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v3.d[0], v21.d[0]
 
-    uMULL           v4.4s, v30.4h, v12.4h
-    uMULL           v6.4s, v2.4h, v13.4h
+  uMULL v4.4s, v30.4h, v12.4h
+    uMULL v6.4s, v2.4h, v13.4h
 
-    ushR            v8.4s, v8.4s, #16
-    ushR            v26.4s, v26.4s, #16
+    ushR v8.4s, v8.4s,#16
+    ushR v26.4s, v26.4s,#16
 
-    sMLAL           v8.4s, v25.4h, v18.4h
-    sMLAL           v26.4s, v23.4h, v18.4h
+    sMLAL v8.4s, v25.4h, v18.4h
+    sMLAL v26.4s, v23.4h, v18.4h
 
-    ushR            v4.4s, v4.4s, #16
-    ushR            v6.4s, v6.4s, #16
+    ushR v4.4s, v4.4s,#16
+    ushR v6.4s, v6.4s,#16
 
-    MOV             v19.d[0], v30.d[1]
+  MOV  v19.d[0], v30.d[1]
 
-    sMLAL           v4.4s, v19.4h, v12.4h
-    sMLAL           v6.4s, v3.4h, v13.4h
+    sMLAL v4.4s, v19.4h, v12.4h
+    sMLAL v6.4s, v3.4h, v13.4h
 
-    NEG             v8.4s, v8.4s
-    ADD             v14.4s, v14.4s , v26.4s
-    ADD             v0.4s, v0.4s , v8.4s
+    NEG  v8.4s, v8.4s
+    ADD  v14.4s,  v14.4s ,  v26.4s
+    ADD  v0.4s,  v0.4s ,  v8.4s
 
 
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v8.4s, w11
-    SQADD           v0.4s, v0.4s , v8.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v8.4s,w11
+    SQADD  v0.4s,  v0.4s ,  v8.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v26.4s, w11
-    sQshL           v0.4s, v0.4s, v26.4s
-    mov             v26.16b, v28.16b
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v26.4s,w11
+    sQshL v0.4s, v0.4s, v26.4s
+    mov  v26.16b, v28.16b
 
-    LD2             { v28.4s, v29.4s}, [x4]
-    MOV             v30.16b, v29.16b
-    MOV             v29.d[0], v28.d[1]
+    LD2 { v28.4s, v29.4s}, [x4]
+  MOV  v30.16b, v29.16b
+  MOV  v29.d[0], v28.d[1]
 //    VZIP.32         Q13, Q0
 
-    ZIP1            v19.4s, v26.4s, v0.4s
-    ZIP2            v0.4s, v26.4s, v0.4s
-    MOV             v26.16b, v19.16b
+    ZIP1    v19.4s, v26.4s, v0.4s
+  ZIP2    v0.4s, v26.4s, v0.4s
+  MOV      v26.16b, v19.16b
 
-    ST1             { v26.4s}, [x4]
-    ADD             x4, x4, #16
-    ST1             { v0.4s}, [x4]
-    ADD             x4, x4, #16
+    ST1 { v26.4s}, [x4]
+  ADD x4, x4,#16
+    ST1 { v0.4s}, [x4]
+  ADD  x4, x4,#16
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D13, D1
-    SADDL           v0.4s, v13.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v13.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v26.2d, v28.2s, v0.2s
-    Sqxtn           v8.2s, v26.2d
-    sMULL           v26.2d, v29.2s, v1.2s
-    Sqxtn           v9.2s, v26.2d
-    MOV             v8.d[1], v9.d[0]
-    movi            v1.2s, #0
+    sMULL v26.2d, v28.2s, v0.2s
+    Sqxtn v8.2s,  v26.2d
+    sMULL v26.2d, v29.2s, v1.2s
+    Sqxtn v9.2s,  v26.2d
+  MOV    v8.d[1], v9.d[0]
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D12, D1
-    SADDL           v0.4s, v12.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v12.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v24.2d, v28.2s, v0.2s
-    Sqxtn           v26.2s, v24.2d
-    sMULL           v24.2d, v29.2s, v1.2s
-    Sqxtn           v27.2s, v24.2d
-    MOV             v26.d[1], v27.d[0]
-    sQshL           v4.4s, v4.4s, v16.4s
-    sQshL           v6.4s, v6.4s, v16.4s
+    sMULL v24.2d, v28.2s, v0.2s
+    Sqxtn v26.2s,  v24.2d
+    sMULL v24.2d, v29.2s, v1.2s
+    Sqxtn v27.2s,  v24.2d
+  MOV    v26.d[1], v27.d[0]
+    sQshL v4.4s, v4.4s, v16.4s
+    sQshL v6.4s, v6.4s, v16.4s
 
 
 
-    SQSUB           v4.4s, v4.4s , v8.4s
-    SQSUB           v6.4s, v6.4s , v26.4s
+    SQSUB  v4.4s,  v4.4s ,  v8.4s
+    SQSUB  v6.4s,  v6.4s ,  v26.4s
 
-    NEG             v26.4s, v14.4s
+    NEG  v26.4s, v14.4s
 //    VUZP.16         D26, D27
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
-    movi            v1.2s, #0
-    //VADDL.S16       Q0, D10, D1
-    SADDL           v0.4s, v10.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+    movi  v1.2s, #0
+   //VADDL.S16       Q0, D10, D1
+      SADDL       v0.4s, v10.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v22.2d, v30.2s, v0.2s
-    Sqxtn           v24.2s, v22.2d
-    sMULL2          v22.2d, v30.4s, v0.4s
-    Sqxtn           v25.2s, v22.2d
-    MOV             v24.d[1], v25.d[0]
-    movi            v1.2s, #0
+  sMULL v22.2d, v30.2s, v0.2s
+    Sqxtn v24.2s,  v22.2d
+    sMULL2 v22.2d, v30.4s, v0.4s
+    Sqxtn v25.2s,  v22.2d
+  MOV    v24.d[1], v25.d[0]
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D11, D1
-    SADDL           v0.4s, v11.4h, v1.4h
+  SADDL       v0.4s, v11.4h, v1.4h
 
-    sMULL           v8.2d, v30.2s, v0.2s
-    Sqxtn           v22.2s, v8.2d
-    sMULL2          v8.2d, v30.4s, v0.4s
-    Sqxtn           v23.2s, v8.2d
-    MOV             v22.d[1], v23.d[0]
+    sMULL v8.2d, v30.2s, v0.2s
+    Sqxtn v22.2s,  v8.2d
+    sMULL2 v8.2d, v30.4s, v0.4s
+    Sqxtn v23.2s,  v8.2d
+  MOV    v22.d[1], v23.d[0]
 
 //    VUZP.16         D14, D15
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+   UZP1      v19.8h, v14.8h, v14.8h
+  UZP2      v21.8h, v14.8h, v14.8h
+  MOV        v14.d[0], v19.d[0]
+  MOV        v15.d[0], v21.d[0]
 
-    uMULL           v8.4s, v26.4h, v11.4h
-    uMULL           v30.4s, v14.4h, v10.4h
+  uMULL v8.4s, v26.4h, v11.4h
+    uMULL v30.4s, v14.4h, v10.4h
 
 
-    LD2             { v0.4s, v1.4s}, [x1]
-    MOV             v2.16b, v1.16b
-    ADD             X1, X1, x12
+    LD2 { v0.4s, v1.4s}, [x1]
+  MOV v2.16b, v1.16b
+  ADD  X1, X1, x12
 
 //    VUZP.16         D0, D1
-    UZP1            v19.8h, v0.8h, v0.8h
-    UZP2            v21.8h, v0.8h, v0.8h
-    MOV             v0.d[0], v19.d[0]
-    MOV             v0.d[1], v21.d[0]
+  UZP1      v19.8h, v0.8h, v0.8h
+  UZP2      v21.8h, v0.8h, v0.8h
+  MOV        v0.d[0], v19.d[0]
+  MOV        v0.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v2.d[1], v21.d[0]
+   UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v2.d[1], v21.d[0]
 
-    ushR            v8.4s, v8.4s, #16
+  ushR v8.4s, v8.4s,#16
 
-    rev64           v0.8h, v0.8h
-    MOV             v1.d[0], v0.d[1]
-    ushR            v30.4s, v30.4s, #16
+    rev64  v0.8h,  v0.8h
+  MOV  v1.d[0], v0.d[1]
+    ushR v30.4s, v30.4s,#16
 
-    rev64           v2.8h, v2.8h
-    MOV             v3.d[0], v2.d[1]
-    sMLAL           v8.4s, v27.4h, v11.4h
+    rev64  v2.8h,  v2.8h
+  MOV  v3.d[0], v2.d[1]
+    sMLAL v8.4s, v27.4h, v11.4h
 
-    sMLAL           v30.4s, v15.4h, v10.4h
+    sMLAL v30.4s, v15.4h, v10.4h
 
-    LD2             { v10.4s, v11.4s}, [x6]
-    add             X6, x6, x12
-    MOV             v12.16b, v11.16b
-    sQshL           v4.4s, v4.4s, #2
+    LD2 { v10.4s, v11.4s}, [x6]
+  add  X6, x6, x12
+  MOV  v12.16b, v11.16b
+
 
     //VUZP.16         D10, D11
 
-    UZP1            v19.8h, v10.8h, v10.8h
-    UZP2            v21.8h, v10.8h, v10.8h
-    MOV             v10.d[0], v19.d[0]
-    MOV             v10.d[1], v21.d[0]
+     UZP1      v19.8h, v10.8h, v10.8h
+  UZP2      v21.8h, v10.8h, v10.8h
+  MOV        v10.d[0], v19.d[0]
+  MOV        v10.d[1], v21.d[0]
 
-    sQshL           v6.4s, v6.4s, #2
+
 
 //    VUZP.16         D12, D13
 
-    UZP1            v19.8h, v12.8h, v12.8h
-    UZP2            v21.8h, v12.8h, v12.8h
-    MOV             v12.d[0], v19.d[0]
-    MOV             v12.d[1], v21.d[0]
+   UZP1      v19.8h, v12.8h, v12.8h
+  UZP2      v21.8h, v12.8h, v12.8h
+        MOV        v12.d[0], v19.d[0]
+  MOV        v12.d[1], v21.d[0]
 
 
-    SQADD           v14.4s, v4.4s , v20.4s
 
-    rev64           v10.8h, v10.8h
-    MOV             v11.d[0], v10.d[1]
-    SQADD           v6.4s, v6.4s , v20.4s
+      MOV  V14.16B, V4.16B
 
-    rev64           v12.8h, v12.8h
-    MOV             v13.d[0], v12.d[1]
-    sshR            v14.4s, v14.4s, #16
-
-//    VUZP.16         D14, D15
-
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+    rev64  v10.8h,  v10.8h
+  MOV        v11.d[0], v10.d[1]
 
 
-    sshR            v6.4s, v6.4s, #16
+    rev64  v12.8h,  v12.8h
+  MOV        v13.d[0], v12.d[1]
+
+    sQshL v8.4s, v8.4s, v16.4s
+
+    LD2 { v4.4s, v5.4s}, [x8]
+  ADD  x8, x8, #32
+
+    MOV V31.16B, V6.16B
+    MOV  v6.16b, v5.16b
+
+  sQshL v30.4s, v30.4s, v16.4s
+
+
+   UZP1      v19.8h, v4.8h, v4.8h
+  UZP2      v21.8h, v4.8h, v4.8h
+  MOV        v4.d[0], v19.d[0]
+  MOV        v5.d[0], v21.d[0]
+
+
+  SQSUB  v8.4s,  v8.4s ,  v24.4s
 
 //    VUZP.16         D6, D7
 
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
+     UZP1      v19.8h, v6.8h, v6.8h
+  UZP2      v21.8h, v6.8h, v6.8h
+  MOV        v6.d[0], v19.d[0]
+  MOV        v7.d[0], v21.d[0]
+
+  SQSUB  v22.4s,  v30.4s ,  v22.4s
+
+    MOV V30.16B , V8.16B
+
+    LD2 {v8.4h, v9.4h}, [x2]
+  ADD x2, x2,#16
 
 
-    mov             v15.8b, v6.8b
-    sQshL           v8.4s, v8.4s, v16.4s
 
-    LD2             { v4.4s, v5.4s}, [x8]
-    ADD             x8, x8, #32
-    MOV             v6.16b, v5.16b
-
-    sQshL           v30.4s, v30.4s, v16.4s
-
-//    VUZP.16         D4, D5
-
-    UZP1            v19.8h, v4.8h, v4.8h
-    UZP2            v21.8h, v4.8h, v4.8h
-    MOV             v4.d[0], v19.d[0]
-    MOV             v5.d[0], v21.d[0]
-
-
-    SQSUB           v8.4s, v8.4s , v24.4s
-
-//    VUZP.16         D6, D7
-
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
-
-
-    SQSUB           v22.4s, v30.4s , v22.4s
-
-    sQshL           v30.4s, v8.4s, #2
-
-    LD2             {v8.4h, v9.4h}, [x2]
-    ADD             x2, x2, #16
-    sQshL           v22.4s, v22.4s, #2
-
-    SQADD           v30.4s, v30.4s , v20.4s
-    SQADD           v22.4s, v22.4s , v20.4s
-
-    sshR            v30.4s, v30.4s, #16
-
-//   VUZP.16         D30, D31
-
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
-
-
-    sshR            v22.4s, v22.4s, #16
-
-
-//    VUZP.16         D22, D23
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
-
-
-    mov             v23.8b, v30.8b
 
     SUBS            x3, x3, #1
     BNE             CORE_LOOP
@@ -1190,844 +1114,765 @@
 
 EPILOGUE:
 
-    ST1             {v14.h}[0], [x0]
-    ADD             x0, x0, x9
-    uMULL           v30.4s, v0.4h, v9.4h
-
-    ST1             {v22.h}[0], [x0]
-    ADD             x0, x0, x9
-    uMULL           v28.4s, v2.4h, v8.4h
-
-    ST1             {v14.h}[1], [x0]
-    ADD             x0, x0, x9
-    uMULL           v26.4s, v0.4h, v8.4h
-
-    ST1             {v22.h}[1], [x0]
-    ADD             x0, x0, x9
-    uMULL           v24.4s, v2.4h, v9.4h
-
-    ST1             {v14.h}[2], [x0]
-    ADD             x0, x0, x9
-    ushR            v30.4s, v30.4s, #16
-
-    ST1             {v22.h}[2], [x0]
-    ADD             x0, x0, x9
-    ushR            v28.4s, v28.4s, #16
-
-    ST1             {v14.h}[3], [x0]
-    ADD             x0, x0, x9
-    sMLAL           v30.4s, v1.4h, v9.4h
-
-    ST1             {v22.h}[3], [x0]
-    ADD             x0, x0, x9
-    sMLAL           v28.4s, v3.4h, v8.4h
-
-    ST1             {v15.h}[0], [x5]
-    ADD             x5, x5, x10
-    ushR            v26.4s, v26.4s, #16
-
-    ST1             {v23.h}[0], [x5]
-    ADD             x5, x5, x10
-    ushR            v24.4s, v24.4s, #16
-
-    ST1             {v15.h}[1], [x5]
-    ADD             x5, x5, x10
-    sMLAL           v26.4s, v1.4h, v8.4h
-
-    ST1             {v23.h}[1], [x5]
-    ADD             x5, x5, x10
-    sMLAL           v24.4s, v3.4h, v9.4h
-
-    ST1             {v15.h}[2], [x5]
-    ADD             x5, x5, x10
-    ADD             v30.4s, v30.4s , v28.4s
-
-    ST1             {v23.h}[2], [x5]
-    ADD             x5, x5, x10
-    NEG             v30.4s, v30.4s
-
-    ST1             {v15.h}[3], [x5]
-    ADD             x5, x5, x10
+    ST1 {V14.S}[0],[x0]
+  ADD  x0, x0, x9
 
 
-    ST1             {v23.h}[3], [x5]
-    ADD             x5, x5, x10
-    SUB             v28.4s, v24.4s , v26.4s
+    ST1 {V22.S}[0],[x0]
+  ADD  x0, x0, x9
 
 
-    uMULL           v22.4s, v4.4h, v8.4h
-    mov             v26.16b, v30.16b
-    mov             v24.16b, v28.16b
+    ST1 {V14.S}[1],[x0]
+  ADD  x0, x0, x9
 
-    mov             v26.16b, v30.16b
-    mov             v24.16b, v28.16b
+
+    ST1 {V22.S}[1],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V14.S}[2],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V22.S}[2],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V14.S}[3],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V22.S}[3],[x0]
+  ADD  x0, x0, x9
+
+
+    ST1 {V31.S}[0],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V30.S}[0],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V31.S}[1],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V30.S}[1],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V31.S}[2],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V30.S}[2],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V31.S}[3],[x5]
+  ADD  x5, x5, x10
+
+
+    ST1 {V30.S}[3],[x5]
+  ADD  x5, x5, x10
+
+
+    uMULL v30.4s, v0.4h, v9.4h
+    uMULL v28.4s, v2.4h, v8.4h
+    uMULL v26.4s, v0.4h, v8.4h
+    uMULL v24.4s, v2.4h, v9.4h
+    ushR v30.4s, v30.4s,#16
+    ushR v28.4s, v28.4s,#16
+    sMLAL v30.4s, v1.4h, v9.4h
+    sMLAL v28.4s, v3.4h, v8.4h
+    ushR v26.4s, v26.4s,#16
+    ushR v24.4s, v24.4s,#16
+    sMLAL v26.4s, v1.4h, v8.4h
+    sMLAL v24.4s, v3.4h, v9.4h
+    ADD  v30.4s,  v30.4s ,  v28.4s
+    NEG  v30.4s, v30.4s
+    SUB  v28.4s,  v24.4s ,  v26.4s
+
+
+    uMULL v22.4s, v4.4h, v8.4h
+    mov  v26.16b, v30.16b
+    mov  v24.16b, v28.16b
+
+    mov  v26.16b, v30.16b
+    mov  v24.16b, v28.16b
 
     //VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+     UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
-    uMULL           v2.4s, v24.4h, v18.4h
-    uMULL           v0.4s, v26.4h, v18.4h
+    uMULL v2.4s, v24.4h, v18.4h
+    uMULL v0.4s, v26.4h, v18.4h
 
-    ushR            v22.4s, v22.4s, #16
-    sMLAL           v22.4s, v5.4h, v8.4h
+    ushR v22.4s, v22.4s,#16
+    sMLAL v22.4s, v5.4h, v8.4h
 
-    ushR            v2.4s, v2.4s, #16
-    ushR            v0.4s, v0.4s, #16
-    sMLAL           v2.4s, v25.4h, v18.4h
-    sMLAL           v0.4s, v27.4h, v18.4h
+    ushR v2.4s, v2.4s,#16
+    ushR v0.4s, v0.4s,#16
+    sMLAL v2.4s, v25.4h, v18.4h
+    sMLAL v0.4s, v27.4h, v18.4h
 
-    uMULL           v24.4s, v4.4h, v9.4h
-    uMULL           v26.4s, v6.4h, v8.4h
+    uMULL v24.4s, v4.4h, v9.4h
+    uMULL v26.4s, v6.4h, v8.4h
 
-    NEG             v2.4s, v2.4s
-    ADD             v28.4s, v28.4s , v0.4s
-    ADD             v30.4s, v30.4s , v2.4s
+    NEG  v2.4s, v2.4s
+    ADD  v28.4s,  v28.4s ,  v0.4s
+    ADD  v30.4s,  v30.4s ,  v2.4s
 
-    uMULL           v0.4s, v6.4h, v9.4h
-    sshR            v24.4s, v24.4s, #16
-    sMLAL           v24.4s, v5.4h, v9.4h
-    sshR            v26.4s, v26.4s, #16
-    sshR            v0.4s, v0.4s, #16
-    sMLAL           v26.4s, v7.4h, v8.4h
-    sMLAL           v0.4s, v7.4h, v9.4h
+    uMULL v0.4s, v6.4h, v9.4h
+    sshR v24.4s, v24.4s,#16
+    sMLAL v24.4s, v5.4h, v9.4h
+    sshR v26.4s, v26.4s,#16
+    sshR v0.4s, v0.4s,#16
+    sMLAL v26.4s, v7.4h, v8.4h
+    sMLAL v0.4s, v7.4h, v9.4h
 
 
 
 
 
-    ADD             v22.4s, v22.4s , v0.4s
-    NEG             v22.4s, v22.4s
-    SUB             v24.4s, v26.4s , v24.4s
+    ADD  v22.4s,  v22.4s ,  v0.4s
+    NEG  v22.4s, v22.4s
+    SUB  v24.4s,  v26.4s ,  v24.4s
 
 
 
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v14.4s, w11
-    SQADD           v28.4s, v28.4s , v14.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v14.4s,w11
+    SQADD  v28.4s,  v28.4s ,  v14.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v0.4s, w11
-    sQshL           v28.4s, v28.4s, v0.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v0.4s,w11
+    sQshL v28.4s, v28.4s, v0.4s
 
 
-    mov             v0.16b, v22.16b
-    mov             v14.16b, v24.16b
+    mov  v0.16b, v22.16b
+    mov  v14.16b, v24.16b
 
 
 //    VUZP.16         D22, D23
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+  UZP1      v19.8h, v22.8h, v22.8h
+  UZP2      v21.8h, v22.8h, v22.8h
+  MOV        v22.d[0], v19.d[0]
+  MOV        v23.d[0], v21.d[0]
 
 //    VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+     UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
-    uMULL           v8.4s, v24.4h, v18.4h
-    uMULL           v26.4s, v22.4h, v18.4h
+    uMULL v8.4s, v24.4h, v18.4h
+    uMULL v26.4s, v22.4h, v18.4h
 
-    NEG             v2.4s, v30.4s
+    NEG  v2.4s, v30.4s
 
 //    VUZP.16         D30, D31
 
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
+  UZP1      v19.8h, v30.8h, v30.8h
+  UZP2      v21.8h, v30.8h, v30.8h
+  MOV        v30.d[0], v19.d[0]
+  MOV        v30.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v3.d[0], v21.d[0]
+   UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v3.d[0], v21.d[0]
 
-    uMULL           v4.4s, v30.4h, v12.4h
-    uMULL           v6.4s, v2.4h, v13.4h
+    uMULL v4.4s, v30.4h, v12.4h
+    uMULL v6.4s, v2.4h, v13.4h
 
-    ushR            v8.4s, v8.4s, #16
-    ushR            v26.4s, v26.4s, #16
+    ushR v8.4s, v8.4s,#16
+    ushR v26.4s, v26.4s,#16
 
-    sMLAL           v8.4s, v25.4h, v18.4h
-    sMLAL           v26.4s, v23.4h, v18.4h
+    sMLAL v8.4s, v25.4h, v18.4h
+    sMLAL v26.4s, v23.4h, v18.4h
 
-    ushR            v4.4s, v4.4s, #16
-    ushR            v6.4s, v6.4s, #16
+    ushR v4.4s, v4.4s,#16
+    ushR v6.4s, v6.4s,#16
 
-    MOV             v19.d[0], v30.d[1]
+  MOV  v19.d[0], v30.d[1]
 
-    sMLAL           v4.4s, v19.4h, v12.4h
-    sMLAL           v6.4s, v3.4h, v13.4h
+    sMLAL v4.4s, v19.4h, v12.4h
+    sMLAL v6.4s, v3.4h, v13.4h
 
-    NEG             v8.4s, v8.4s
-    ADD             v14.4s, v14.4s , v26.4s
-    ADD             v0.4s, v0.4s , v8.4s
+    NEG  v8.4s, v8.4s
+    ADD  v14.4s,  v14.4s ,  v26.4s
+    ADD  v0.4s,  v0.4s ,  v8.4s
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v8.4s, w11
-    SQADD           v0.4s, v0.4s , v8.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v8.4s,w11
+    SQADD  v0.4s,  v0.4s ,  v8.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v26.4s, w11
-    sQshL           v0.4s, v0.4s, v26.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v26.4s,w11
+    sQshL v0.4s, v0.4s, v26.4s
 
 
-    mov             v26.16b, v28.16b
+    mov  v26.16b, v28.16b
 
-    LD2             { v28.4s, v29.4s}, [x4]
-    MOV             v30.16b, v29.16b
-    MOV             v29.d[0], v28.d[1]
+    LD2 { v28.4s, v29.4s}, [x4]
+  MOV  v30.16b, v29.16b
+  MOV  v29.d[0], v28.d[1]
 //    VZIP.32         Q13, Q0
 
-    ZIP1            v19.4s, v26.4s, v0.4s
-    ZIP2            v0.4s, v26.4s, v0.4s
-    MOV             v26.16b, v19.16b
+    ZIP1    v19.4s, v26.4s, v0.4s
+  ZIP2    v0.4s, v26.4s, v0.4s
+  MOV      v26.16b, v19.16b
 
-    ST1             { v26.4s}, [x4], #16
-    ST1             { v0.4s}, [x4], #16
+  ST1 { v26.4s}, [x4],#16
+    ST1 { v0.4s}, [x4],#16
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D13, D1
-    SADDL           v0.4s, v13.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v13.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v26.2d, v28.2s, v0.2s
-    Sqxtn           v8.2s, v26.2d
-    sMULL           v26.2d, v29.2s, v1.2s
-    Sqxtn           v9.2s, v26.2d
-    MOV             v8.d[1], v9.d[0]
-    movi            v1.2s, #0
+    sMULL v26.2d, v28.2s, v0.2s
+    Sqxtn v8.2s,  v26.2d
+    sMULL v26.2d, v29.2s, v1.2s
+    Sqxtn v9.2s,  v26.2d
+  MOV    v8.d[1], v9.d[0]
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D12, D1
-    SADDL           v0.4s, v12.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v12.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v24.2d, v28.2s, v0.2s
-    Sqxtn           v26.2s, v24.2d
-    sMULL           v24.2d, v29.2s, v1.2s
-    Sqxtn           v27.2s, v24.2d
-    MOV             v26.d[1], v27.d[0]
+    sMULL v24.2d, v28.2s, v0.2s
+    Sqxtn v26.2s,  v24.2d
+    sMULL v24.2d, v29.2s, v1.2s
+    Sqxtn v27.2s,  v24.2d
+  MOV    v26.d[1], v27.d[0]
 
-    sQshL           v4.4s, v4.4s, v16.4s
-    sQshL           v6.4s, v6.4s, v16.4s
+    sQshL v4.4s, v4.4s, v16.4s
+    sQshL v6.4s, v6.4s, v16.4s
 
-    SQSUB           v4.4s, v4.4s , v8.4s
-    SQSUB           v6.4s, v6.4s , v26.4s
+    SQSUB  v4.4s,  v4.4s ,  v8.4s
+    SQSUB  v6.4s,  v6.4s ,  v26.4s
 
-    NEG             v26.4s, v14.4s
+    NEG  v26.4s, v14.4s
 //    VUZP.16         D14, D15
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+  UZP1      v19.8h, v14.8h, v14.8h
+  UZP2      v21.8h, v14.8h, v14.8h
+  MOV        v14.d[0], v19.d[0]
+  MOV        v15.d[0], v21.d[0]
 
 
-//   VUZP.16         D26, D27
+ //   VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D10, D1
-    SADDL           v0.4s, v10.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v10.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v22.2d, v30.2s, v0.2s
-    Sqxtn           v24.2s, v22.2d
-    sMULL2          v22.2d, v30.4s, v0.4s
-    Sqxtn           v25.2s, v22.2d
-    MOV             v24.d[1], v25.d[0]
-    movi            v1.2s, #0
+    sMULL v22.2d, v30.2s, v0.2s
+    Sqxtn v24.2s,  v22.2d
+    sMULL2 v22.2d, v30.4s, v0.4s
+    Sqxtn v25.2s,  v22.2d
+  MOV    v24.d[1], v25.d[0]
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D11, D1
-    SADDL           v0.4s, v11.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v11.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v8.2d, v30.2s, v0.2s
-    Sqxtn           v22.2s, v8.2d
-    sMULL2          v8.2d, v30.4s, v0.4s
-    Sqxtn           v23.2s, v8.2d
-    MOV             v22.d[1], v23.d[0]
+    sMULL v8.2d, v30.2s, v0.2s
+    Sqxtn v22.2s,  v8.2d
+    sMULL2 v8.2d, v30.4s, v0.4s
+    Sqxtn v23.2s,  v8.2d
+  MOV    v22.d[1], v23.d[0]
 
-    uMULL           v8.4s, v26.4h, v11.4h
-    uMULL           v30.4s, v14.4h, v10.4h
+    uMULL v8.4s, v26.4h, v11.4h
+    uMULL v30.4s, v14.4h, v10.4h
 
-    ushR            v8.4s, v8.4s, #16
+    ushR v8.4s, v8.4s,#16
 
-    ushR            v30.4s, v30.4s, #16
+    ushR v30.4s, v30.4s,#16
 
-    sMLAL           v8.4s, v27.4h, v11.4h
+    sMLAL v8.4s, v27.4h, v11.4h
 
-    sMLAL           v30.4s, v15.4h, v10.4h
+    sMLAL v30.4s, v15.4h, v10.4h
 
-    sQshL           v4.4s, v4.4s, #2
 
-    sQshL           v6.4s, v6.4s, #2
+    MOV V14.16B, V4.16B
 
-    SQADD           v14.4s, v4.4s , v20.4s
 
-    SQADD           v6.4s, v6.4s , v20.4s
+    sQshL v8.4s, v8.4s, v16.4s
 
-    sshR            v14.4s, v14.4s, #16
+    sQshL v30.4s, v30.4s, v16.4s
 
-//    VUZP.16         D14, D15
+    SQSUB  v8.4s,  v8.4s ,  v24.4s
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+    SQSUB  v22.4s,  v30.4s ,  v22.4s
 
-    sshR            v6.4s, v6.4s, #16
-
-//    VUZP.16         D6, D7
-
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
-
-    mov             v15.8b, v6.8b
-    sQshL           v8.4s, v8.4s, v16.4s
-
-    sQshL           v30.4s, v30.4s, v16.4s
-
-    SQSUB           v8.4s, v8.4s , v24.4s
-
-    SQSUB           v22.4s, v30.4s , v22.4s
-
-    sQshL           v30.4s, v8.4s, #2
-
-    sQshL           v22.4s, v22.4s, #2
-
-    SQADD           v30.4s, v30.4s , v20.4s
-    SQADD           v22.4s, v22.4s , v20.4s
-
-    sshR            v30.4s, v30.4s, #16
-
-    //VUZP.16         D30, D31
-
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
-
-    sshR            v22.4s, v22.4s, #16
-
-//    VUZP.16         D22, D23
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
-
-    mov             v23.8b, v30.8b
+    MOV V30.16B , V8.16B
 
 
 
 
-    ST1             {v14.h}[0], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[0], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[1], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[1], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[2], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[2], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[3], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[3], [x0]
-    ADD             x0, x0, x9
-    ST1             {v15.h}[0], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[0], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[1], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[1], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[2], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[2], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[3], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[3], [x5]
-    ADD             x5, x5, x10
+    ST1 {V14.S}[0],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[0],[x0]
+       ADD  x0, x0, x9
+    ST1 {V14.S}[1],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[1],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[2],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[2],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[3],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[3],[x0]
+  ADD  x0, x0, x9
+    ST1 {V6.S}[0],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[0],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[1],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[1],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[2],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[2],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[3],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[3],[x5]
+  ADD  x5, x5, x10
 
 ARM_EPILOGUE:
 
 ARM_LOOP:
 
-    LD2             { v0.4s, v1.4s}, [x1]
-    MOV             v2.16b, v1.16b
+    LD2 { v0.4s, v1.4s}, [x1]
+  MOV  v2.16b, v1.16b
 
     //VUZP.16         D0, D1
-    UZP1            v19.8h, v0.8h, v0.8h
-    UZP2            v21.8h, v0.8h, v0.8h
-    MOV             v0.d[0], v19.d[0]
-    MOV             v0.d[1], v21.d[0]
+      UZP1      v19.8h, v0.8h, v0.8h
+  UZP2      v21.8h, v0.8h, v0.8h
+  MOV        v0.d[0], v19.d[0]
+  MOV        v0.d[1], v21.d[0]
 
-    //VUZP.16         D2, D3
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v2.d[1], v21.d[0]
+  //VUZP.16         D2, D3
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v2.d[1], v21.d[0]
 
 
-    rev64           v0.8h, v0.8h
-    MOV             v1.d[0], v0.d[1]
-    rev64           v2.8h, v2.8h
-    MOV             v3.d[0], v2.d[1]
+    rev64  v0.8h,  v0.8h
+  MOV        v1.d[0], v0.d[1]
+    rev64  v2.8h,  v2.8h
+  MOV        v3.d[0], v2.d[1]
 
-    LD2             {v8.4h, v9.4h}, [x2]
-    ADD             x2, x2, #16
+    LD2 {v8.4h, v9.4h}, [x2]
+  ADD x2, x2,#16
 
-    LD2             {v4.2s, v5.2s}, [x8]
-    ADD             x8, x8, #16
-    MOV             v6.16b, v5.16b
-    movi            v5.2s, #0x00000000
-    movi            v7.2s, #0x00000000
+    LD2 {v4.2s, v5.2s}, [x8]
+  ADD x8, x8,#16
+    MOV  v6.16b, v5.16b
+  movi  v5.2s, #0x00000000
+    movi  v7.2s, #0x00000000
 
-    LD1             {v5.s}[0], [x8], #4
-    LD1             {v7.s}[0], [x8]
+    LD1 {v5.s}[0],[x8],#4
+    LD1 {v7.s}[0],[x8]
 
     MOV             x12, #16
-    MOV             v4.d[1], v5.d[0]
-    MOV             v6.d[1], v7.d[0]
+  MOV        v4.d[1], v5.d[0]
+  MOV        v6.d[1], v7.d[0]
 //    VUZP.16         D4, D5
 
-    UZP1            v19.8h, v4.8h, v4.8h
-    UZP2            v21.8h, v4.8h, v4.8h
-    MOV             v4.d[0], v19.d[0]
-    MOV             v5.d[0], v21.d[0]
+  UZP1      v19.8h, v4.8h, v4.8h
+  UZP2      v21.8h, v4.8h, v4.8h
+  MOV        v4.d[0], v19.d[0]
+  MOV        v5.d[0], v21.d[0]
 
 //    VUZP.16         D6, D7
 
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
+  UZP1      v19.8h, v6.8h, v6.8h
+  UZP2      v21.8h, v6.8h, v6.8h
+  MOV        v6.d[0], v19.d[0]
+  MOV        v7.d[0], v21.d[0]
 
     ADD             x6, x6, #16
 
     MOV             x12, #-4
-    LD2             {v11.2s, v12.2s}, [x6]
-    ADD             x6, x6, x12
-    MOV             v13.16b, v12.16b
+    LD2 {v11.2s, v12.2s}, [x6]
+  ADD x6, x6, x12
+  MOV v13.16b, v12.16b
 
 
-    movi            v10.2s, #0x00000000
+    movi  v10.2s, #0x00000000
 
-    LD1             {v12.s}[1], [x6]
-    ADD             x6, x6, x12
-    LD1             {v10.s}[1], [x6]
-    ADD             x6, x6, x12
-    LD1             {v12.s}[0], [x6]
-    ADD             x6, x6, x12
+    LD1 {v12.s}[1],[x6]
+  ADD  x6, x6, x12
+    LD1 {v10.s}[1],[x6]
+    ADD  x6, x6, x12
+  LD1 {v12.s}[0],[x6]
+    ADD  x6, x6, x12
 
-    MOV             v10.d[1], v11.d[0]
-    MOV             v12.d[1], v13.d[0]
+  MOV        v10.d[1], v11.d[0]
+  MOV        v12.d[1], v13.d[0]
 
     //VUZP.16         D10, D11
 
-    UZP1            v19.8h, v10.8h, v10.8h
-    UZP2            v21.8h, v10.8h, v10.8h
-    MOV             v10.d[0], v19.d[0]
-    MOV             v10.d[1], v21.d[0]
+  UZP1      v19.8h, v10.8h, v10.8h
+  UZP2      v21.8h, v10.8h, v10.8h
+  MOV        v10.d[0], v19.d[0]
+  MOV        v10.d[1], v21.d[0]
 
-    //VUZP.16         D12, D13
+  //VUZP.16         D12, D13
 
-    UZP1            v19.8h, v12.8h, v12.8h
-    UZP2            v21.8h, v12.8h, v12.8h
-    MOV             v12.d[0], v19.d[0]
-    MOV             v12.d[1], v21.d[0]
+  UZP1      v19.8h, v12.8h, v12.8h
+  UZP2      v21.8h, v12.8h, v12.8h
+  MOV        v12.d[0], v19.d[0]
+  MOV        v12.d[1], v21.d[0]
 
 
-    rev64           v10.8h, v10.8h
-    MOV             v11.d[0], v10.d[1]
-    rev64           v12.8h, v12.8h
-    MOV             v13.d[0], v12.d[1]
+    rev64  v10.8h,  v10.8h
+  MOV        v11.d[0], v10.d[1]
+    rev64  v12.8h,  v12.8h
+  MOV        v13.d[0], v12.d[1]
 
-    uMULL           v30.4s, v0.4h, v9.4h
-    uMULL           v28.4s, v2.4h, v8.4h
-    uMULL           v26.4s, v0.4h, v8.4h
-    uMULL           v24.4s, v2.4h, v9.4h
+    uMULL v30.4s, v0.4h, v9.4h
+    uMULL v28.4s, v2.4h, v8.4h
+    uMULL v26.4s, v0.4h, v8.4h
+    uMULL v24.4s, v2.4h, v9.4h
 
-    ushR            v30.4s, v30.4s, #16
-    ushR            v28.4s, v28.4s, #16
+    ushR v30.4s, v30.4s,#16
+    ushR v28.4s, v28.4s,#16
 
-    sMLAL           v30.4s, v1.4h, v9.4h
-    sMLAL           v28.4s, v3.4h, v8.4h
+    sMLAL v30.4s, v1.4h, v9.4h
+    sMLAL v28.4s, v3.4h, v8.4h
 
-    ushR            v26.4s, v26.4s, #16
-    ushR            v24.4s, v24.4s, #16
+    ushR v26.4s, v26.4s,#16
+    ushR v24.4s, v24.4s,#16
 
-    sMLAL           v26.4s, v1.4h, v8.4h
-    sMLAL           v24.4s, v3.4h, v9.4h
+    sMLAL v26.4s, v1.4h, v8.4h
+    sMLAL v24.4s, v3.4h, v9.4h
 
-    ADD             v30.4s, v30.4s , v28.4s
-    NEG             v30.4s, v30.4s
+    ADD  v30.4s,  v30.4s ,  v28.4s
+    NEG  v30.4s, v30.4s
 
-    uMULL           v22.4s, v4.4h, v8.4h
+    uMULL v22.4s, v4.4h, v8.4h
 
-    SUB             v28.4s, v24.4s , v26.4s
+    SUB  v28.4s,  v24.4s ,  v26.4s
 
 
-    mov             v26.16b, v30.16b
-    mov             v24.16b, v28.16b
+    mov  v26.16b, v30.16b
+    mov  v24.16b, v28.16b
 
 //    VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
     //VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+  UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
-    uMULL           v2.4s, v24.4h, v18.4h
-    uMULL           v0.4s, v26.4h, v18.4h
+    uMULL v2.4s, v24.4h, v18.4h
+    uMULL v0.4s, v26.4h, v18.4h
 
-    ushR            v22.4s, v22.4s, #16
-    sMLAL           v22.4s, v5.4h, v8.4h
+    ushR v22.4s, v22.4s,#16
+    sMLAL v22.4s, v5.4h, v8.4h
 
-    ushR            v2.4s, v2.4s, #16
-    ushR            v0.4s, v0.4s, #16
-    sMLAL           v2.4s, v25.4h, v18.4h
-    sMLAL           v0.4s, v27.4h, v18.4h
+    ushR v2.4s, v2.4s,#16
+    ushR v0.4s, v0.4s,#16
+    sMLAL v2.4s, v25.4h, v18.4h
+    sMLAL v0.4s, v27.4h, v18.4h
 
-    uMULL           v24.4s, v4.4h, v9.4h
-    uMULL           v26.4s, v6.4h, v8.4h
+    uMULL v24.4s, v4.4h, v9.4h
+    uMULL v26.4s, v6.4h, v8.4h
 
-    NEG             v2.4s, v2.4s
-    ADD             v28.4s, v28.4s , v0.4s
-    ADD             v30.4s, v30.4s , v2.4s
+    NEG  v2.4s, v2.4s
+    ADD  v28.4s,  v28.4s ,  v0.4s
+    ADD  v30.4s,  v30.4s ,  v2.4s
 
-    uMULL           v0.4s, v6.4h, v9.4h
-    sshR            v24.4s, v24.4s, #16
-    sMLAL           v24.4s, v5.4h, v9.4h
-    sshR            v26.4s, v26.4s, #16
-    sshR            v0.4s, v0.4s, #16
-    sMLAL           v26.4s, v7.4h, v8.4h
-    sMLAL           v0.4s, v7.4h, v9.4h
+    uMULL v0.4s, v6.4h, v9.4h
+    sshR v24.4s, v24.4s,#16
+    sMLAL v24.4s, v5.4h, v9.4h
+    sshR v26.4s, v26.4s,#16
+    sshR v0.4s, v0.4s,#16
+    sMLAL v26.4s, v7.4h, v8.4h
+    sMLAL v0.4s, v7.4h, v9.4h
 
-    ADD             v22.4s, v22.4s , v0.4s
-    NEG             v22.4s, v22.4s
-    SUB             v24.4s, v26.4s , v24.4s
+    ADD  v22.4s,  v22.4s ,  v0.4s
+    NEG  v22.4s, v22.4s
+    SUB  v24.4s,  v26.4s ,  v24.4s
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v14.4s, w11
-    SQADD           v28.4s, v28.4s , v14.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v14.4s,w11
+    SQADD  v28.4s,  v28.4s ,  v14.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v0.4s, w11
-    sQshL           v28.4s, v28.4s, v0.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v0.4s,w11
+    sQshL v28.4s, v28.4s, v0.4s
 
-    mov             v0.16b, v22.16b
-    mov             v14.16b, v24.16b
+    mov  v0.16b, v22.16b
+    mov  v14.16b, v24.16b
 
 //    VUZP.16         D22, D23
 
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
+   UZP1      v19.8h, v22.8h, v22.8h
+  UZP2      v21.8h, v22.8h, v22.8h
+  MOV        v22.d[0], v19.d[0]
+  MOV        v23.d[0], v21.d[0]
 
-//   VUZP.16         D24, D25
+ //   VUZP.16         D24, D25
 
-    UZP1            v19.8h, v24.8h, v24.8h
-    UZP2            v21.8h, v24.8h, v24.8h
-    MOV             v24.d[0], v19.d[0]
-    MOV             v25.d[0], v21.d[0]
+   UZP1      v19.8h, v24.8h, v24.8h
+  UZP2      v21.8h, v24.8h, v24.8h
+  MOV        v24.d[0], v19.d[0]
+  MOV        v25.d[0], v21.d[0]
 
-    uMULL           v8.4s, v24.4h, v18.4h
-    uMULL           v26.4s, v22.4h, v18.4h
+    uMULL v8.4s, v24.4h, v18.4h
+    uMULL v26.4s, v22.4h, v18.4h
 
-    NEG             v2.4s, v30.4s
+    NEG  v2.4s, v30.4s
 //    VUZP.16         D30, D31
 
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
+  UZP1      v19.8h, v30.8h, v30.8h
+  UZP2      v21.8h, v30.8h, v30.8h
+  MOV        v30.d[0], v19.d[0]
+  MOV        v30.d[1], v21.d[0]
 
 //    VUZP.16         D2, D3
 
-    UZP1            v19.8h, v2.8h, v2.8h
-    UZP2            v21.8h, v2.8h, v2.8h
-    MOV             v2.d[0], v19.d[0]
-    MOV             v3.d[0], v21.d[0]
+  UZP1      v19.8h, v2.8h, v2.8h
+  UZP2      v21.8h, v2.8h, v2.8h
+  MOV        v2.d[0], v19.d[0]
+  MOV        v3.d[0], v21.d[0]
 
-    uMULL           v4.4s, v30.4h, v12.4h
-    uMULL           v6.4s, v2.4h, v13.4h
+    uMULL v4.4s, v30.4h, v12.4h
+    uMULL v6.4s, v2.4h, v13.4h
 
-    ushR            v8.4s, v8.4s, #16
-    ushR            v26.4s, v26.4s, #16
+    ushR v8.4s, v8.4s,#16
+    ushR v26.4s, v26.4s,#16
 
-    sMLAL           v8.4s, v25.4h, v18.4h
-    sMLAL           v26.4s, v23.4h, v18.4h
+    sMLAL v8.4s, v25.4h, v18.4h
+    sMLAL v26.4s, v23.4h, v18.4h
 
-    ushR            v4.4s, v4.4s, #16
-    ushR            v6.4s, v6.4s, #16
+    ushR v4.4s, v4.4s,#16
+    ushR v6.4s, v6.4s,#16
 
-    MOV             v19.d[0], v30.d[1]
+  MOV  v19.d[0], v30.d[1]
 
-    sMLAL           v4.4s, v19.4h, v12.4h
-    sMLAL           v6.4s, v3.4h, v13.4h
+    sMLAL v4.4s, v19.4h, v12.4h
+    sMLAL v6.4s, v3.4h, v13.4h
 
-    NEG             v8.4s, v8.4s
-    ADD             v14.4s, v14.4s , v26.4s
-    ADD             v0.4s, v0.4s , v8.4s
+    NEG  v8.4s, v8.4s
+    ADD  v14.4s,  v14.4s ,  v26.4s
+    ADD  v0.4s,  v0.4s ,  v8.4s
 
     //LDR w11,  [sp, #120]
-    //sxtw x11,w11
-    MOV             w11, w26
-    dup             v8.4s, w11
-    SQADD           v0.4s, v0.4s , v8.4s
+  //sxtw x11,w11
+  MOV      w11, w26
+    dup  v8.4s,w11
+    SQADD  v0.4s,  v0.4s ,  v8.4s
     //LDR w11,  [sp, #116]
-    //sxtw x11,w11
-    MOV             w11, w25
-    dup             v26.4s, w11
-    sQshL           v0.4s, v0.4s, v26.4s
+  //sxtw x11,w11
+    MOV    w11, w25
+  dup  v26.4s,w11
+    sQshL v0.4s, v0.4s, v26.4s
 
-    mov             v26.16b, v28.16b
+    mov  v26.16b, v28.16b
 
     MOV             x6, x4
 
-    LD1             {v28.2s, v29.2s}, [x4], #16
-    movi            v19.2s, #0x00000000
-    LD1             {v30.s}[0], [x4], #4
-    LD1             {v30.s}[1], [x4], #4
-    LD1             {v19.s}[0], [x4], #4
+    LD1 {v28.2s, v29.2s}, [x4],#16
+    movi  v19.2s, #0x00000000
+    LD1 {v30.s}[0],[x4],#4
+    LD1 {v30.s}[1],[x4],#4
+    LD1 {v19.s}[0],[x4],#4
 
-    MOV             v28.d[1], v29.d[0]
-    MOV             v30.d[1], v19.d[0]
+  MOV        v28.d[1], v29.d[0]
+  MOV        v30.d[1], v19.d[0]
 
     //VUZP.32         Q14, Q15
 
-    UZP1            v19.4s, v28.4s, v30.4s
-    UZP2            v30.4s, v28.4s, v30.4s
-    MOV             v28.16b, v19.16b
-    MOV             v29.d[0], v28.d[1]
+  UZP1      v19.4s, v28.4s, v30.4s
+  UZP2      v30.4s, v28.4s, v30.4s
+  MOV        v28.16b, v19.16b
+  MOV        v29.d[0], v28.d[1]
 
-    ST1             {v26.s}[0], [x6], #4
-    ST1             {v0.s}[0], [x6], #4
-    ST1             {v26.s}[1], [x6], #4
-    ST1             {v0.s}[1], [x6], #4
-    ST1             {v26.s}[2], [x6], #4
-    ST1             {v0.s}[2], [x6], #4
-    ST1             {v26.s}[3], [x6], #4
+    ST1 {v26.s}[0],[x6],#4
+    ST1 {v0.s}[0],[x6],#4
+    ST1 {v26.s}[1],[x6],#4
+    ST1 {v0.s}[1],[x6],#4
+    ST1 {v26.s}[2],[x6],#4
+    ST1 {v0.s}[2],[x6],#4
+    ST1 {v26.s}[3],[x6],#4
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D13, D1
-    SADDL           v0.4s, v13.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v13.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v26.2d, v28.2s, v0.2s
-    Sqxtn           v8.2s, v26.2d
-    sMULL           v26.2d, v29.2s, v1.2s
-    Sqxtn           v9.2s, v26.2d
-    MOV             v8.d[1], v9.d[0]
-    movi            v1.2s, #0
+    sMULL v26.2d, v28.2s, v0.2s
+    Sqxtn v8.2s,  v26.2d
+    sMULL v26.2d, v29.2s, v1.2s
+    Sqxtn v9.2s,  v26.2d
+  MOV    v8.d[1], v9.d[0]
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D12, D1
-    SADDL           v0.4s, v12.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v12.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v24.2d, v28.2s, v0.2s
-    Sqxtn           v26.2s, v24.2d
-    sMULL           v24.2d, v29.2s, v1.2s
-    Sqxtn           v27.2s, v24.2d
-    MOV             v26.d[1], v27.d[0]
+    sMULL v24.2d, v28.2s, v0.2s
+    Sqxtn v26.2s,  v24.2d
+    sMULL v24.2d, v29.2s, v1.2s
+    Sqxtn v27.2s,  v24.2d
+  MOV    v26.d[1], v27.d[0]
 
-    sQshL           v4.4s, v4.4s, v16.4s
-    sQshL           v6.4s, v6.4s, v16.4s
+    sQshL v4.4s, v4.4s, v16.4s
+    sQshL v6.4s, v6.4s, v16.4s
 
-    SQSUB           v4.4s, v4.4s , v8.4s
-    SQSUB           v6.4s, v6.4s , v26.4s
+    SQSUB  v4.4s,  v4.4s ,  v8.4s
+    SQSUB  v6.4s,  v6.4s ,  v26.4s
 
-    NEG             v26.4s, v14.4s
+    NEG  v26.4s, v14.4s
     //VUZP.16         D14, D15
 
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
+     UZP1      v19.8h, v14.8h, v14.8h
+  UZP2      v21.8h, v14.8h, v14.8h
+  MOV        v14.d[0], v19.d[0]
+  MOV        v15.d[0], v21.d[0]
 
-//    VUZP.16         D26, D27
+//  VUZP.16         D26, D27
 
-    UZP1            v19.8h, v26.8h, v26.8h
-    UZP2            v21.8h, v26.8h, v26.8h
-    MOV             v26.d[0], v19.d[0]
-    MOV             v27.d[0], v21.d[0]
+  UZP1      v19.8h, v26.8h, v26.8h
+  UZP2      v21.8h, v26.8h, v26.8h
+  MOV        v26.d[0], v19.d[0]
+  MOV        v27.d[0], v21.d[0]
 
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
     //VADDL.S16       Q0, D10, D1
-    SADDL           v0.4s, v10.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v10.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v22.2d, v30.2s, v0.2s
-    Sqxtn           v24.2s, v22.2d
-    sMULL2          v22.2d, v30.4s, v0.4s
-    Sqxtn           v25.2s, v22.2d
-    MOV             v24.d[1], v25.d[0]
+    sMULL v22.2d, v30.2s, v0.2s
+    Sqxtn v24.2s,  v22.2d
+    sMULL2 v22.2d, v30.4s, v0.4s
+    Sqxtn v25.2s,  v22.2d
+  MOV    v24.d[1], v25.d[0]
 
-    movi            v1.2s, #0
+    movi  v1.2s, #0
 //    VADDL.S16       Q0, D11, D1
-    SADDL           v0.4s, v11.4h, v1.4h
-    MOV             v1.d[0], v0.d[1]
+  SADDL       v0.4s, v11.4h, v1.4h
+  MOV      v1.d[0], v0.d[1]
 
-    sMULL           v8.2d, v30.2s, v0.2s
-    Sqxtn           v22.2s, v8.2d
-    sMULL2          v8.2d, v30.4s, v0.4s
-    Sqxtn           v23.2s, v8.2d
-    MOV             v22.d[1], v23.d[0]
+    sMULL v8.2d, v30.2s, v0.2s
+    Sqxtn v22.2s,  v8.2d
+    sMULL2 v8.2d, v30.4s, v0.4s
+    Sqxtn v23.2s,  v8.2d
+  MOV    v22.d[1], v23.d[0]
 
-    uMULL           v8.4s, v26.4h, v11.4h
-    uMULL           v30.4s, v14.4h, v10.4h
+    uMULL v8.4s, v26.4h, v11.4h
+    uMULL v30.4s, v14.4h, v10.4h
 
-    ushR            v8.4s, v8.4s, #16
+    ushR v8.4s, v8.4s,#16
 
-    ushR            v30.4s, v30.4s, #16
+    ushR v30.4s, v30.4s,#16
 
-    sMLAL           v8.4s, v27.4h, v11.4h
+    sMLAL v8.4s, v27.4h, v11.4h
 
-    sMLAL           v30.4s, v15.4h, v10.4h
+    sMLAL v30.4s, v15.4h, v10.4h
 
-    sQshL           v4.4s, v4.4s, #2
+    MOV V14.16B , V4.16B
 
-    sQshL           v6.4s, v6.4s, #2
+    //mov  v15.8b, v6.8b
+    sQshL v8.4s, v8.4s, v16.4s
 
-    SQADD           v14.4s, v4.4s , v20.4s
+    sQshL v30.4s, v30.4s, v16.4s
 
-    SQADD           v6.4s, v6.4s , v20.4s
+    SQSUB  v8.4s,  v8.4s ,  v24.4s
 
-    sshR            v14.4s, v14.4s, #16
+    SQSUB  v22.4s,  v30.4s ,  v22.4s
 
-//    VUZP.16         D14, D15
-
-    UZP1            v19.8h, v14.8h, v14.8h
-    UZP2            v21.8h, v14.8h, v14.8h
-    MOV             v14.d[0], v19.d[0]
-    MOV             v15.d[0], v21.d[0]
-
-    sshR            v6.4s, v6.4s, #16
-
-    //VUZP.16         D6, D7
-
-    UZP1            v19.8h, v6.8h, v6.8h
-    UZP2            v21.8h, v6.8h, v6.8h
-    MOV             v6.d[0], v19.d[0]
-    MOV             v7.d[0], v21.d[0]
-
-    mov             v15.8b, v6.8b
-    sQshL           v8.4s, v8.4s, v16.4s
-
-    sQshL           v30.4s, v30.4s, v16.4s
-
-    SQSUB           v8.4s, v8.4s , v24.4s
-
-    SQSUB           v22.4s, v30.4s , v22.4s
-
-    sQshL           v30.4s, v8.4s, #2
-
-    sQshL           v22.4s, v22.4s, #2
-
-    SQADD           v30.4s, v30.4s , v20.4s
-    SQADD           v22.4s, v22.4s , v20.4s
-
-    sshR            v30.4s, v30.4s, #16
-
-//    VUZP.16         D30, D31
-
-    UZP1            v19.8h, v30.8h, v30.8h
-    UZP2            v21.8h, v30.8h, v30.8h
-    MOV             v30.d[0], v19.d[0]
-    MOV             v30.d[1], v21.d[0]
-
-    sshR            v22.4s, v22.4s, #16
-
-//    VUZP.16         D22, D23
-
-    UZP1            v19.8h, v22.8h, v22.8h
-    UZP2            v21.8h, v22.8h, v22.8h
-    MOV             v22.d[0], v19.d[0]
-    MOV             v23.d[0], v21.d[0]
-
-    mov             v23.8b, v30.8b
+     MOV  V30.16B, V8.16B
 
 
 
 
-    ST1             {v14.h}[0], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[0], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[1], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[1], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[2], [x0]
-    ADD             x0, x0, x9
-    ST1             {v22.h}[2], [x0]
-    ADD             x0, x0, x9
-    ST1             {v14.h}[3], [x0]
-    ADD             x0, x0, x9
 
-    ST1             {v15.h}[0], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[0], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[1], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[1], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[2], [x5]
-    ADD             x5, x5, x10
-    ST1             {v23.h}[2], [x5]
-    ADD             x5, x5, x10
-    ST1             {v15.h}[3], [x5]
-    ADD             x5, x5, x10
 
-    // VPOP            {d8 - d15}
-    // LDMFD sp!, {x4-x12}
-    //ldp x19, x20,[sp],#16
-    pop_v_regs
-    ret
-    //BX              x14
+
+    ST1 {V14.S}[0],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[0],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[1],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[1],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[2],[x0]
+  ADD  x0, x0, x9
+    ST1 {V22.S}[2],[x0]
+  ADD  x0, x0, x9
+    ST1 {V14.S}[3],[x0]
+  ADD  x0, x0, x9
+
+    ST1 {V6.S}[0],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[0],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[1],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[1],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[2],[x5]
+  ADD  x5, x5, x10
+    ST1 {V30.S}[2],[x5]
+  ADD  x5, x5, x10
+    ST1 {V6.S}[3],[x5]
+  ADD  x5, x5, x10
+
+   pop_v_regs
+   ret
+
+
diff --git a/decoder/armv8/ixheaacd_qmf_dec_armv8.c b/decoder/armv8/ixheaacd_qmf_dec_armv8.c
index 2ba9e9f..16c19da 100644
--- a/decoder/armv8/ixheaacd_qmf_dec_armv8.c
+++ b/decoder/armv8/ixheaacd_qmf_dec_armv8.c
@@ -47,14 +47,6 @@
 #include "ixheaacd_function_selector.h"
 #include "ixheaacd_audioobjtypes.h"
 
-#define mult16x16_16(a, b) ixheaacd_mult16((a), (b))
-#define mac16x16(a, b, c) ixheaacd_mac16x16in32_sat((a), (b), (c))
-#define mpy_32x16(a, b) fixmuldiv2_32x16b((a), (b))
-#define mpy_16x16(a, b) ixheaacd_mult16x16in32((a), (b))
-#define mpy_32x32(a, b) ixheaacd_mult32((a), (b))
-#define mpy_32x16H_n(a, b) ixheaacd_mult32x16hin32((a), (b))
-#define msu16x16(a, b, c) msu16x16in32((a), (b), (c))
-
 #define DCT3_LEN (32)
 #define DCT2_LEN (64)
 
@@ -64,6 +56,8 @@
 #define ROUNDING_SPECTRA 1
 #define HQ_SHIFT_VAL 4
 
+extern const WORD32 ixheaacd_ldmps_polyphase_filter_coeff_fix[1280];
+
 VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output,
                       const WORD16 *main_twidle_fwd, const WORD16 *post_tbl,
                       const WORD16 *w_16, const WORD32 *p_table) {
@@ -302,15 +296,16 @@
 VOID ixheaacd_fwd_modulation(const WORD32 *p_time_in1, WORD32 *real_subband,
                              WORD32 *imag_subband,
                              ia_sbr_qmf_filter_bank_struct *qmf_bank,
-                             ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
+                             ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
+                             WORD32 ld_mps_flag) {
   WORD32 i;
-  const WORD32 *p_time_in2 = &p_time_in1[2 * NO_ANALYSIS_CHANNELS - 1];
+  const WORD32 *p_time_in2 = &p_time_in1[2 * qmf_bank->no_channels - 1];
   WORD32 temp1, temp2;
   WORD32 *t_real_subband = real_subband;
   WORD32 *t_imag_subband = imag_subband;
   const WORD16 *tcos;
 
-  for (i = NO_ANALYSIS_CHANNELS - 1; i >= 0; i--) {
+  for (i = qmf_bank->no_channels - 1; i >= 0; i--) {
     temp1 = ixheaacd_shr32(*p_time_in1++, HQ_SHIFT_VAL);
     temp2 = ixheaacd_shr32(*p_time_in2--, HQ_SHIFT_VAL);
 
@@ -326,28 +321,41 @@
 
   tcos = qmf_bank->t_cos;
 
-  for (i = (qmf_bank->usb - qmf_bank->lsb - 1); i >= 0; i--) {
-    WORD16 cosh, sinh;
-    WORD32 re, im;
+  if (ld_mps_flag == 0) {
+    for (i = (qmf_bank->usb - qmf_bank->lsb - 1); i >= 0; i--) {
+      WORD16 cosh, sinh;
+      WORD32 re, im;
 
-    re = *real_subband;
-    im = *imag_subband;
-    cosh = *tcos++;
-    sinh = *tcos++;
-    *real_subband++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32_shl(re, cosh),
-                                         ixheaacd_mult32x16in32_shl(im, sinh));
-    *imag_subband++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(im, cosh),
-                                         ixheaacd_mult32x16in32_shl(re, sinh));
+      re = *real_subband;
+      im = *imag_subband;
+      cosh = *tcos++;
+      sinh = *tcos++;
+      *real_subband++ =
+          ixheaacd_add32_sat(ixheaacd_mult32x16in32_shl(re, cosh),
+                             ixheaacd_mult32x16in32_shl(im, sinh));
+      *imag_subband++ =
+          ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(im, cosh),
+                             ixheaacd_mult32x16in32_shl(re, sinh));
+    }
+  } else {
+    WORD32 i_band;
+    for (i = 0; i < min(64, qmf_bank->no_channels); i += 2) {
+      i_band = real_subband[i];
+      real_subband[i] = -imag_subband[i];
+      imag_subband[i] = i_band;
+
+      i_band = -real_subband[i + 1];
+      real_subband[i + 1] = imag_subband[i + 1];
+      imag_subband[i + 1] = i_band;
+    }
   }
 }
 
 VOID ixheaacd_cplx_anal_qmffilt(const WORD16 *time_sample_buf,
-                                ia_sbr_scale_fact_struct *sbr_scale_factor,
-                                WORD32 **qmf_real, WORD32 **qmf_imag,
-                                ia_sbr_qmf_filter_bank_struct *qmf_bank,
-                                ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
-                                WORD32 ch_fac, WORD32 low_pow_flag,
-                                WORD audio_object_type) {
+                                ia_sbr_scale_fact_struct *sbr_scale_factor, WORD32 **qmf_real,
+                                WORD32 **qmf_imag, ia_sbr_qmf_filter_bank_struct *qmf_bank,
+                                ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 ch_fac,
+                                WORD32 low_pow_flag, WORD audio_object_type) {
   WORD32 i, k;
   WORD32 num_time_slots = qmf_bank->num_time_slots;
 
@@ -463,8 +471,8 @@
     }
 
     if (!low_pow_flag) {
-      ixheaacd_fwd_modulation(analysis_buffer, qmf_real[i], qmf_imag[i],
-                              qmf_bank, qmf_dec_tables_ptr);
+      ixheaacd_fwd_modulation(analysis_buffer, qmf_real[i], qmf_imag[i], qmf_bank,
+                              qmf_dec_tables_ptr, 0);
     } else {
       ixheaacd_dct3_32(
           (WORD32 *)analysis_buffer, qmf_real[i], qmf_dec_tables_ptr->dct23_tw,
@@ -485,6 +493,115 @@
   }
 }
 
+VOID ixheaacd_cplx_anal_qmffilt_32(const WORD32 *time_sample_buf,
+                                   ia_sbr_scale_fact_struct *sbr_scale_factor,
+                                   WORD32 **qmf_real, WORD32 **qmf_imag,
+                                   ia_sbr_qmf_filter_bank_struct *qmf_bank,
+                                   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
+                                   WORD32 ch_fac, WORD32 ldsbr_present) {
+  WORD32 i, k;
+  WORD32 num_time_slots = qmf_bank->num_time_slots;
+
+  WORD32 analysis_buffer[4 * NO_ANALYSIS_CHANNELS];
+  WORD32 *filter_states = qmf_bank->core_samples_buffer_32;
+
+  WORD32 *fp1, *fp2, *tmp;
+
+  WORD32 *filter_1;
+  WORD32 *filter_2;
+  WORD32 *filt_ptr;
+  WORD32 start_slot = 2;
+
+  if (ldsbr_present) {
+    qmf_bank->filter_pos_32 +=
+        (qmf_dec_tables_ptr->qmf_c_ldsbr_mps - qmf_bank->analy_win_coeff_32);
+    qmf_bank->analy_win_coeff_32 = qmf_dec_tables_ptr->qmf_c_ldsbr_mps;
+  } else {
+    qmf_bank->filter_pos_32 += (ixheaacd_ldmps_polyphase_filter_coeff_fix -
+                                qmf_bank->analy_win_coeff_32);
+    qmf_bank->analy_win_coeff_32 =
+        (WORD32 *)ixheaacd_ldmps_polyphase_filter_coeff_fix;
+  }
+
+  filter_1 = qmf_bank->filter_pos_32;
+  filter_2 = filter_1 + qmf_bank->no_channels;
+
+  sbr_scale_factor->st_lb_scale = 0;
+  sbr_scale_factor->lb_scale = -10;
+
+  sbr_scale_factor->lb_scale = -9;
+  if (qmf_bank->no_channels != 64) {
+    qmf_bank->cos_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l32;
+    qmf_bank->alt_sin_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l32;
+  } else {
+    qmf_bank->cos_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l64;
+    qmf_bank->alt_sin_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l64;
+  }
+  qmf_bank->t_cos =
+      (WORD16 *)qmf_dec_tables_ptr->ixheaacd_sbr_t_cos_sin_l32_eld;
+
+  fp1 = qmf_bank->anal_filter_states_32;
+  fp2 = qmf_bank->anal_filter_states_32 + qmf_bank->no_channels;
+
+  filter_2 = qmf_bank->filter_2_32;
+  fp1 = qmf_bank->fp1_anal_32;
+  fp2 = qmf_bank->fp2_anal_32;
+
+  for (i = start_slot; i < num_time_slots + start_slot; i++) {
+    for (k = 0; k < qmf_bank->no_channels; k++)
+      filter_states[qmf_bank->no_channels - 1 - k] =
+          time_sample_buf[ch_fac * k];
+
+    if (ldsbr_present) {
+      ixheaacd_sbr_qmfanal32_winadd_eld_32(fp1, fp2, filter_1, filter_2,
+                                           analysis_buffer);
+    } else {
+      ixheaacd_sbr_qmfanal32_winadd_eld_mps(fp1, fp2, filter_1, filter_2,
+                                            analysis_buffer);
+    }
+
+    time_sample_buf += qmf_bank->no_channels * ch_fac;
+
+    filter_states -= qmf_bank->no_channels;
+
+    if (filter_states < qmf_bank->anal_filter_states_32) {
+      filter_states = qmf_bank->anal_filter_states_32 +
+                      ((qmf_bank->no_channels * 10) - qmf_bank->no_channels);
+    }
+
+    tmp = fp1;
+    fp1 = fp2;
+    fp2 = tmp;
+
+    filter_1 += qmf_bank->no_channels;
+    filter_2 += qmf_bank->no_channels;
+
+    filt_ptr = filter_1;
+    filter_1 = filter_2;
+    filter_2 = filt_ptr;
+
+    if (filter_2 >
+        (qmf_bank->analy_win_coeff_32 + (qmf_bank->no_channels * 10))) {
+      filter_1 = (WORD32 *)qmf_bank->analy_win_coeff_32;
+      filter_2 = (WORD32 *)qmf_bank->analy_win_coeff_32 + qmf_bank->no_channels;
+    }
+
+    ixheaacd_fwd_modulation(analysis_buffer, qmf_real[i], qmf_imag[i], qmf_bank,
+                            qmf_dec_tables_ptr, 1);
+  }
+
+  qmf_bank->filter_pos_32 = filter_1;
+  qmf_bank->core_samples_buffer_32 = filter_states;
+
+  qmf_bank->fp1_anal_32 = fp1;
+  qmf_bank->fp2_anal_32 = fp2;
+  qmf_bank->filter_2_32 = filter_2;
+}
+
 VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states,
                                 ia_sbr_qmf_filter_bank_struct *syn_qmf,
                                 ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
@@ -1177,6 +1294,39 @@
   }
 }
 
+VOID ixheaacd_esbr_qmfsyn32_winadd(WORD32 *tmp1, WORD32 *tmp2, WORD32 *inp1,
+                                   WORD32 *sample_buffer, WORD32 ch_fac) {
+  WORD32 k;
+
+  for (k = 0; k < 32; k++) {
+    WORD64 syn_out = 0;
+
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[0 + k], inp1[2 * (k + 0)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[128 + k], inp1[2 * (k + 64)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[256 + k], inp1[2 * (k + 128)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[384 + k], inp1[2 * (k + 192)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[512 + k], inp1[2 * (k + 256)]));
+
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[64 + k], inp1[2 * (k + 32)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[192 + k], inp1[2 * (k + 96)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[320 + k], inp1[2 * (k + 160)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[448 + k], inp1[2 * (k + 224)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[576 + k], inp1[2 * (k + 288)]));
+
+    sample_buffer[ch_fac * k] = (WORD32)(syn_out >> 31);
+  }
+}
+
 VOID ixheaacd_shiftrountine(WORD32 *qmf_real, WORD32 *qmf_imag, WORD32 len,
                             WORD32 common_shift) {
   WORD32 treal, timag;
@@ -1337,4 +1487,4 @@
     x += fft_jmp;
     w_ptr = w_ptr - fft_jmp;
   }
-}
\ No newline at end of file
+}
diff --git a/decoder/drc_src/CMakeLists.txt b/decoder/drc_src/CMakeLists.txt
new file mode 100644
index 0000000..7d0d702
--- /dev/null
+++ b/decoder/drc_src/CMakeLists.txt
@@ -0,0 +1,30 @@
+#src files
+target_sources(libxaacdec
+               PRIVATE
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_api.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_bitbuffer.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_dec.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_dynamic_payload.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_eq.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_extr_delta_coded_info.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_filter_bank.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_gain_dec.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_gain_decoder.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_init.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_interface_decoder.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_loudness_control.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_main_td_process.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_multiband.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_parametric_dec.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_peak_limiter.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_process.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_rom.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_selection_process.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_selection_process_drcset_selection.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_selection_process_init.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_shape_filter.c"
+               "${XAAC_ROOT}/decoder/drc_src/impd_drc_static_payload.c")
+
+set(LIBXAACDEC_INCLUDES ${XAAC_ROOT}/decoder/drc_src)
+
+include_directories(${LIBXAACDEC_INCLUDES})
diff --git a/decoder/drc_src/impd_drc_api.c b/decoder/drc_src/impd_drc_api.c
index 62df69b..d31c93f 100644
--- a/decoder/drc_src/impd_drc_api.c
+++ b/decoder/drc_src/impd_drc_api.c
@@ -19,7 +19,6 @@
 */
 #include <string.h>
 #include <stdlib.h>
-
 #include "impd_type_def.h"
 #include "impd_error_standards.h"
 #include "impd_apicmd_standards.h"
@@ -108,6 +107,8 @@
   pUWORD32 pus_value = pv_value;
   pWORD8 pb_value = pv_value;
   SIZE_T *ps_value = pv_value;
+  pWORD32 pi_value = pv_value;
+  float *pf_value = pv_value;
 
   switch (i_cmd) {
     case IA_API_CMD_GET_MEM_INFO_SIZE:
@@ -221,32 +222,26 @@
           break;
         }
         case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: {
-          memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config +
-                     p_obj_drc->str_bit_handler.num_bytes_bs_drc_config,
+          memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config,
                  p_obj_drc->pp_mem[2],
                  p_obj_drc->str_bit_handler.num_byts_cur_ic);
           p_obj_drc->str_bit_handler.num_bytes_bs_drc_config =
-              p_obj_drc->str_bit_handler.num_bytes_bs_drc_config +
               p_obj_drc->str_bit_handler.num_byts_cur_ic;
           break;
         }
         case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: {
-          memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info +
-                     p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info,
+          memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info,
                  p_obj_drc->pp_mem[2],
                  p_obj_drc->str_bit_handler.num_byts_cur_il);
           p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info =
-              p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info +
               p_obj_drc->str_bit_handler.num_byts_cur_il;
           break;
         }
         case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: {
-          memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface +
-                     p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface,
+          memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface,
                  p_obj_drc->pp_mem[2],
                  p_obj_drc->str_bit_handler.num_byts_cur_in);
           p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface =
-              p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface +
               p_obj_drc->str_bit_handler.num_byts_cur_in;
           break;
         }
@@ -269,6 +264,15 @@
           *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output;
           break;
         }
+        case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: {
+          *pi_value = (WORD32)p_obj_drc->str_payload.pstr_loudness_info->loudness_info
+                          ->loudness_measure->method_val;
+          if (*pi_value < -1)
+            *pi_value = *pi_value * -4;
+          else
+            *pi_value = -1;
+          break;
+        }
       }
       break;
     }
@@ -281,6 +285,14 @@
           p_obj_drc->str_config.sampling_rate = *pus_value;
           break;
         }
+        case IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE: {
+          p_obj_drc->str_config.apply_crossfade = *pus_value;
+          break;
+        }
+        case IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED: {
+          p_obj_drc->str_config.is_config_changed = *pus_value;
+          break;
+        }
         case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: {
           p_obj_drc->str_config.num_ch_in = *pus_value;
           if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) {
@@ -335,7 +347,20 @@
           p_obj_drc->str_config.loud_norm_flag = *pus_value;
           break;
         }
-
+        case IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE: {
+          p_obj_drc->str_config.album_mode = *pus_value;
+          break;
+        }
+        case IA_DRC_DEC_CONFIG_DRC_BOOST: {
+          p_obj_drc->str_config.boost = (*pf_value);
+          p_obj_drc->str_config.boost_set = 1;
+          break;
+        }
+        case IA_DRC_DEC_CONFIG_DRC_COMPRESS: {
+          p_obj_drc->str_config.compress = (*pf_value);
+          p_obj_drc->str_config.compress_set = 1;
+          break;
+        }
         default: { return -1; }
       }
       break;
diff --git a/decoder/drc_src/impd_drc_api_struct_def.h b/decoder/drc_src/impd_drc_api_struct_def.h
index 6c2734a..a753465 100644
--- a/decoder/drc_src/impd_drc_api_struct_def.h
+++ b/decoder/drc_src/impd_drc_api_struct_def.h
@@ -55,7 +55,14 @@
   WORD32 effect_type;
   WORD32 target_loudness;
   WORD32 loud_norm_flag;
-
+  WORD32 album_mode;
+  FLOAT32 boost;
+  FLOAT32 compress;
+  UWORD8 boost_set;
+  UWORD8 compress_set;
+  WORD32 apply_crossfade;
+  WORD32 is_config_changed;
+  WORD32 ln_dbgain_prev;
 } ia_drc_config_struct;
 
 /* DRC bitsteam handler */
@@ -125,7 +132,7 @@
   ia_mem_info_struct *p_mem_info;
   pVOID *pp_mem;
   struct ia_bit_buf_struct str_bit_buf, *pstr_bit_buf;
-
+  WORD32 frame_count;
 } ia_drc_api_struct;
 
 #endif
diff --git a/decoder/drc_src/impd_drc_bitbuffer.c b/decoder/drc_src/impd_drc_bitbuffer.c
index de9d020..91188c8 100644
--- a/decoder/drc_src/impd_drc_bitbuffer.c
+++ b/decoder/drc_src/impd_drc_bitbuffer.c
@@ -185,11 +185,9 @@
     WORD32* num_bits_read) {
   WORD32 err_code = 0;
 
-  WORD32 dummy;
-
   impd_create_init_bit_buf(it_bit_buff, bitstream_gain, num_bytes);
 
-  dummy = impd_read_bits_buf(it_bit_buff, num_bits_offset);
+  impd_read_bits_buf(it_bit_buff, num_bits_offset);
   if (it_bit_buff->error) return it_bit_buff->error;
 
   err_code = impd_drc_uni_gain_read(it_bit_buff, p_drc_bs_dec_struct,
diff --git a/decoder/drc_src/impd_drc_common.h b/decoder/drc_src/impd_drc_common.h
index 3dbbd2c..324e830 100644
--- a/decoder/drc_src/impd_drc_common.h
+++ b/decoder/drc_src/impd_drc_common.h
@@ -170,7 +170,7 @@
 #define MAX_NUM_DRC_EFFECT_TYPE_REQUESTS 15
 #define MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE 256
 
-#define EXT_COUNT_MAX 2
+#define EXT_COUNT_MAX 8
 #define UNIDRCGAINEXT_TERM 0x0
 #define UNIDRCLOUDEXT_TERM 0x0
 #define UNIDRCCONFEXT_TERM 0x0
diff --git a/decoder/drc_src/impd_drc_config_params.h b/decoder/drc_src/impd_drc_config_params.h
index e83385a..b0d19c5 100644
--- a/decoder/drc_src/impd_drc_config_params.h
+++ b/decoder/drc_src/impd_drc_config_params.h
@@ -41,4 +41,9 @@
 #define IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE 0x0011
 #define IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS 0x0012
 #define IA_DRC_DEC_CONFIG_DRC_LOUD_NORM 0x0013
+#define IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE 0x0014
+#define IA_DRC_DEC_CONFIG_DRC_BOOST 0x0015
+#define IA_DRC_DEC_CONFIG_DRC_COMPRESS 0x0016
+#define IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE 0x0017
+#define IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED 0x0018
 #endif
diff --git a/decoder/drc_src/impd_drc_dynamic_payload.c b/decoder/drc_src/impd_drc_dynamic_payload.c
index f8a1aa9..3c0cbb8 100644
--- a/decoder/drc_src/impd_drc_dynamic_payload.c
+++ b/decoder/drc_src/impd_drc_dynamic_payload.c
@@ -353,7 +353,7 @@
     ia_bit_buf_struct* it_bit_buff,
     ia_uni_drc_gain_ext_struct* uni_drc_gain_ext) {
   WORD32 k;
-  WORD32 bit_size_len, ext_size_bits, bit_size, other_bit;
+  WORD32 bit_size_len, ext_size_bits, bit_size;
 
   k = 0;
   uni_drc_gain_ext->uni_drc_gain_ext_type[k] =
@@ -369,7 +369,6 @@
     if (it_bit_buff->error) return it_bit_buff->error;
     uni_drc_gain_ext->ext_bit_size[k] = bit_size + 1;
 
-    other_bit =
         impd_skip_bits_buf(it_bit_buff, uni_drc_gain_ext->ext_bit_size[k]);
     if (it_bit_buff->error) return it_bit_buff->error;
     k++;
diff --git a/decoder/drc_src/impd_drc_gain_dec.c b/decoder/drc_src/impd_drc_gain_dec.c
index dc7430f..6b3f40b 100644
--- a/decoder/drc_src/impd_drc_gain_dec.c
+++ b/decoder/drc_src/impd_drc_gain_dec.c
@@ -244,22 +244,22 @@
     ia_split_drc_characteristic_struct* split_drc_characteristic_source,
     ia_split_drc_characteristic_struct* split_drc_characteristic_target,
     FLOAT32 gain_in_db, FLOAT32* gain_out_db) {
-  FLOAT32 inLevel;
+  FLOAT32 in_level=0;
   WORD32 err = 0;
 
   switch (split_drc_characteristic_source->characteristic_format) {
     case CHARACTERISTIC_SIGMOID:
       err = impd_compressor_io_sigmoid_inv(split_drc_characteristic_source,
-                                           gain_in_db, &inLevel);
+                                           gain_in_db, &in_level);
       if (err) return (err);
       break;
     case CHARACTERISTIC_NODES:
       impd_compressor_io_nodes_inverse(split_drc_characteristic_source,
-                                       gain_in_db, &inLevel);
+                                       gain_in_db, &in_level);
 
       break;
     case CHARACTERISTIC_PASS_THRU:
-      inLevel = gain_in_db;
+      in_level = gain_in_db;
       break;
     default:
       return (UNEXPECTED_ERROR);
@@ -267,23 +267,23 @@
   }
   switch (split_drc_characteristic_target->characteristic_format) {
     case CHARACTERISTIC_SIGMOID:
-      err = impd_compressor_io_sigmoid(split_drc_characteristic_target, inLevel,
+      err = impd_compressor_io_sigmoid(split_drc_characteristic_target, in_level,
                                        gain_out_db);
       if (err) return (err);
       break;
     case CHARACTERISTIC_NODES:
-      if (inLevel < DRC_INPUT_LOUDNESS_TARGET) {
+      if (in_level < DRC_INPUT_LOUDNESS_TARGET) {
         err = impd_compressor_io_nodes_lt(split_drc_characteristic_target,
-                                          inLevel, gain_out_db);
+                                          in_level, gain_out_db);
         if (err) return (err);
       } else {
         err = impd_compressor_io_nodes_rt(split_drc_characteristic_target,
-                                          inLevel, gain_out_db);
+                                          in_level, gain_out_db);
         if (err) return (err);
       }
       break;
     case CHARACTERISTIC_PASS_THRU:
-      *gain_out_db = inLevel;
+      *gain_out_db = in_level;
       break;
     default:
       break;
@@ -551,32 +551,44 @@
 impd_concatenate_segments(WORD32 drc_frame_size, WORD32 drc_band,
                           ia_interp_params_struct* interp_params_str,
                           ia_spline_nodes_struct* str_spline_nodes,
-                          ia_interp_buf_struct* buf_interpolation) {
-  WORD32 timePrev, duration, n, err = 0;
-  FLOAT32 loc_db_gain = 0.0f, prev_db_gain, slope = 0.0f, slopePrev;
+                          ia_interp_buf_struct* buf_interpolation,
+                          WORD32 sel_drc_index, WORD32 is_config_changed,
+                          WORD32 loudness_changed) {
+  WORD32 time_prev, duration, n, err = 0;
+  FLOAT32 loc_db_gain = 0.0f, prev_db_gain, slope = 0.0f, slope_prev;
 
-  timePrev = buf_interpolation->prev_node.time;
+  time_prev = buf_interpolation->prev_node.time;
   prev_db_gain = buf_interpolation->prev_node.loc_db_gain;
-  slopePrev = buf_interpolation->prev_node.slope;
+  slope_prev = buf_interpolation->prev_node.slope;
   for (n = 0; n < str_spline_nodes->num_nodes; n++) {
-    duration = str_spline_nodes->str_node[n].time - timePrev;
+    duration = str_spline_nodes->str_node[n].time - time_prev;
     loc_db_gain = str_spline_nodes->str_node[n].loc_db_gain;
+    if (loudness_changed) {
+      if (sel_drc_index == 0 && is_config_changed == 1) {
+        loc_db_gain = str_spline_nodes->str_node[n].loc_db_gain +
+                      interp_params_str->loudness_normalization_gain_db;
+        if (prev_db_gain == 0) {
+          prev_db_gain = buf_interpolation->prev_node.loc_db_gain +
+                         interp_params_str->loudness_normalization_gain_db;
+        }
+      }
+    }
     slope = str_spline_nodes->str_node[n].slope;
 
     err = impd_interpolate_drc_gain(
         interp_params_str, drc_band, duration, prev_db_gain, loc_db_gain,
-        slopePrev, slope, buf_interpolation->lpcm_gains + MAX_SIGNAL_DELAY +
-                              drc_frame_size + timePrev);
+        slope_prev, slope, buf_interpolation->lpcm_gains + MAX_SIGNAL_DELAY +
+                              drc_frame_size + time_prev);
     if (err) return (err);
 
-    timePrev = str_spline_nodes->str_node[n].time;
+    time_prev = str_spline_nodes->str_node[n].time;
     prev_db_gain = loc_db_gain;
-    slopePrev = slope;
+    slope_prev = slope;
   }
 
   buf_interpolation->str_node.loc_db_gain = loc_db_gain;
   buf_interpolation->str_node.slope = slope;
-  buf_interpolation->str_node.time = timePrev;
+  buf_interpolation->str_node.time = time_prev;
 
   return (0);
 }
@@ -593,8 +605,8 @@
   WORD32 drc_instructions_index =
       ia_drc_params_struct->sel_drc_array[sel_drc_index].drc_instructions_index;
   if (drc_instructions_index >= 0) {
-    WORD32 b, g, gainElementIndex, err = 0;
-    WORD32 parametricDrcInstanceIndex = 0;
+    WORD32 b, g, gain_element_index, err = 0;
+    WORD32 parametric_drc_instance_index = 0;
     ia_interp_params_struct interp_params_str = {0};
 
     ia_drc_instructions_struct* str_drc_instruction_str =
@@ -644,7 +656,7 @@
     impd_advance_buf(ia_drc_params_struct->drc_frame_size,
                      &(drc_gain_buffers->pstr_gain_buf[sel_drc_index]));
 
-    gainElementIndex = 0;
+    gain_element_index = 0;
     for (g = 0; g < num_drc_ch_groups; g++) {
       WORD32 gainSet = 0;
       WORD32 num_drc_bands = 0;
@@ -688,42 +700,46 @@
               ia_drc_params_struct->drc_frame_size, b, &interp_params_str,
               &(pstr_drc_gain->drc_gain_sequence[seq].str_spline_nodes[0]),
               &(drc_gain_buffers->pstr_gain_buf[sel_drc_index]
-                    .buf_interpolation[gainElementIndex]));
+                    .buf_interpolation[gain_element_index]),
+              sel_drc_index, pstr_drc_config->is_config_changed,
+              pstr_drc_config->ln_gain_changed);
           if (err) return (err);
-          gainElementIndex++;
+          gain_element_index++;
         }
       } else {
         if (ia_drc_params_struct->sub_band_domain_mode ==
                 SUBBAND_DOMAIN_MODE_OFF &&
             !(p_drc_gain_dec_structs->parametricdrc_params
                   .str_parametric_drc_instance_params
-                      [parametricDrcInstanceIndex]
+                      [parametric_drc_instance_index]
                   .parametric_drc_type == PARAM_DRC_TYPE_LIM)) {
           err = impd_parametric_drc_instance_process(
               p_drc_gain_dec_structs->audio_in_out_buf.audio_in_out_buf, NULL,
               NULL, &p_drc_gain_dec_structs->parametricdrc_params,
               &p_drc_gain_dec_structs->parametricdrc_params
                    .str_parametric_drc_instance_params
-                       [parametricDrcInstanceIndex]);
+                       [parametric_drc_instance_index]);
           if (err) return (err);
 
           err = impd_concatenate_segments(
               ia_drc_params_struct->drc_frame_size, 0, &interp_params_str,
               &p_drc_gain_dec_structs->parametricdrc_params
                    .str_parametric_drc_instance_params
-                       [parametricDrcInstanceIndex]
+                       [parametric_drc_instance_index]
                    .str_spline_nodes,
               &(drc_gain_buffers->pstr_gain_buf[sel_drc_index]
-                    .buf_interpolation[gainElementIndex]));
+                    .buf_interpolation[gain_element_index]),
+              sel_drc_index, pstr_drc_config->is_config_changed,
+              pstr_drc_config->ln_gain_changed);
           if (err) return (err);
         } else if (ia_drc_params_struct->sub_band_domain_mode ==
                        SUBBAND_DOMAIN_MODE_OFF &&
                    p_drc_gain_dec_structs->parametricdrc_params
                            .str_parametric_drc_instance_params
-                               [parametricDrcInstanceIndex]
+                               [parametric_drc_instance_index]
                            .parametric_drc_type == PARAM_DRC_TYPE_LIM) {
           FLOAT32* lpcm_gains = (drc_gain_buffers->pstr_gain_buf[sel_drc_index]
-                                     .buf_interpolation[gainElementIndex])
+                                     .buf_interpolation[gain_element_index])
                                     .lpcm_gains +
                                 MAX_SIGNAL_DELAY;
           impd_parametric_lim_type_drc_process(
@@ -731,7 +747,7 @@
               loudness_normalization_gain_db,
               &p_drc_gain_dec_structs->parametricdrc_params
                    .str_parametric_drc_instance_params
-                       [parametricDrcInstanceIndex]
+                       [parametric_drc_instance_index]
                    .str_parametric_drc_type_lim_params,
               lpcm_gains);
 
@@ -739,7 +755,7 @@
                        SUBBAND_DOMAIN_MODE_OFF &&
                    !(p_drc_gain_dec_structs->parametricdrc_params
                          .str_parametric_drc_instance_params
-                             [parametricDrcInstanceIndex]
+                             [parametric_drc_instance_index]
                          .parametric_drc_type == PARAM_DRC_TYPE_LIM)) {
           err = impd_parametric_drc_instance_process(
               NULL, p_drc_gain_dec_structs->audio_in_out_buf.audio_real_buff,
@@ -747,24 +763,26 @@
               &p_drc_gain_dec_structs->parametricdrc_params,
               &p_drc_gain_dec_structs->parametricdrc_params
                    .str_parametric_drc_instance_params
-                       [parametricDrcInstanceIndex]);
+                       [parametric_drc_instance_index]);
           if (err) return (err);
 
           err = impd_concatenate_segments(
               ia_drc_params_struct->drc_frame_size, 0, &interp_params_str,
               &p_drc_gain_dec_structs->parametricdrc_params
                    .str_parametric_drc_instance_params
-                       [parametricDrcInstanceIndex]
+                       [parametric_drc_instance_index]
                    .str_spline_nodes,
               &(drc_gain_buffers->pstr_gain_buf[sel_drc_index]
-                    .buf_interpolation[gainElementIndex]));
+                    .buf_interpolation[gain_element_index]),
+                    sel_drc_index, pstr_drc_config->is_config_changed,
+                    pstr_drc_config->ln_gain_changed);
           if (err) return (err);
 
         } else {
           return (UNEXPECTED_ERROR);
         }
-        gainElementIndex++;
-        parametricDrcInstanceIndex++;
+        gain_element_index++;
+        parametric_drc_instance_index++;
       }
     }
   }
diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c
index 6a41fc0..cf232e8 100644
--- a/decoder/drc_src/impd_drc_init.c
+++ b/decoder/drc_src/impd_drc_init.c
@@ -59,7 +59,8 @@
 WORD32
 impd_drc_dec_interface_add_effect_type(
     ia_drc_interface_struct *pstr_drc_interface, WORD32 drc_effect_type,
-    WORD32 target_loudness, WORD32 loud_norm);
+    WORD32 target_loudness, WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost,
+    FLOAT32 compress);
 
 #define BITSTREAM_FILE_FORMAT_SPLIT 1
 #define LIM_DEFAULT_THRESHOLD (0.89125094f)
@@ -111,6 +112,9 @@
   p_obj_drc->str_config.effect_type = 0;
   p_obj_drc->str_config.target_loudness = -24;
   p_obj_drc->str_config.loud_norm_flag = 0;
+  p_obj_drc->str_config.album_mode = 0;
+  p_obj_drc->str_config.boost = 1.0f;
+  p_obj_drc->str_config.compress = 1.0f;
   memset(&p_obj_drc->str_bit_handler, 0, sizeof(p_obj_drc->str_bit_handler));
 
   return IA_NO_ERROR;
@@ -408,10 +412,16 @@
     if (err_code != IA_NO_ERROR) return err_code;
   }
 
+  if (!p_obj_drc->str_config.boost_set) p_obj_drc->str_config.boost = 1.0f;
+
+  if (!p_obj_drc->str_config.compress_set)
+    p_obj_drc->str_config.compress = 1.0f;
+
   err_code = impd_drc_dec_interface_add_effect_type(
       p_obj_drc->str_payload.pstr_drc_interface,
       p_obj_drc->str_config.effect_type, p_obj_drc->str_config.target_loudness,
-      p_obj_drc->str_config.loud_norm_flag);
+      p_obj_drc->str_config.loud_norm_flag, p_obj_drc->str_config.album_mode,
+      p_obj_drc->str_config.boost, p_obj_drc->str_config.compress);
 
   if (err_code != IA_NO_ERROR) return err_code;
 
@@ -454,6 +464,16 @@
       p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info);
   if (err_code != IA_NO_ERROR) return err_code;
 
+  if (p_obj_drc->str_payload.pstr_loudness_info->loudness_info
+          ->anchor_loudness_present)
+    p_obj_drc->str_payload.pstr_selection_proc->uni_drc_sel_proc_params
+        .loudness_measurement_method = METHOD_DEFINITION_ANCHOR_LOUDNESS;
+
+  if (p_obj_drc->str_payload.pstr_loudness_info->loudness_info
+          ->expert_loudness_present)
+    p_obj_drc->str_payload.pstr_selection_proc->uni_drc_sel_proc_params
+        .loudness_measurement_system = USER_MEASUREMENT_SYSTEM_EXPERT_PANEL;
+
   err_code = impd_drc_uni_sel_proc_process(
       p_obj_drc->str_payload.pstr_selection_proc,
       p_obj_drc->str_payload.pstr_drc_config,
diff --git a/decoder/drc_src/impd_drc_interface_decoder.c b/decoder/drc_src/impd_drc_interface_decoder.c
index 4e0301c..557ea2f 100644
--- a/decoder/drc_src/impd_drc_interface_decoder.c
+++ b/decoder/drc_src/impd_drc_interface_decoder.c
@@ -23,7 +23,6 @@
 #include <assert.h>
 #include <string.h>
 #include "impd_type_def.h"
-
 #include "impd_drc_bitbuffer.h"
 #include "impd_drc_common.h"
 #include "impd_drc_interface.h"
@@ -32,7 +31,8 @@
 WORD32
 impd_drc_dec_interface_add_effect_type(
     ia_drc_interface_struct* pstr_drc_interface, WORD32 drc_effect_type,
-    WORD32 target_loudness, WORD32 loud_norm) {
+    WORD32 target_loudness, WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost,
+    FLOAT32 compress) {
   WORD32 err = 0;
   WORD32 i = 0;
 
@@ -67,7 +67,7 @@
         (FLOAT32)target_loudness;
 
     pstr_drc_interface->loudness_norm_parameter_interface_flag = 1;
-    pstr_drc_interface->loudness_norm_param_interface.album_mode = 0;
+    pstr_drc_interface->loudness_norm_param_interface.album_mode = album_mode;
     pstr_drc_interface->loudness_norm_param_interface.peak_limiter = 0;
     pstr_drc_interface->loudness_norm_param_interface
         .change_loudness_deviation_max = 1;
@@ -138,8 +138,8 @@
     pstr_drc_interface->drc_parameter_interface_flag = 1;
     pstr_drc_interface->drc_parameter_interface.change_compress = 1;
     pstr_drc_interface->drc_parameter_interface.change_boost = 1;
-    pstr_drc_interface->drc_parameter_interface.compress = 1.0f;
-    pstr_drc_interface->drc_parameter_interface.boost = 1.0f;
+    pstr_drc_interface->drc_parameter_interface.compress = compress;
+    pstr_drc_interface->drc_parameter_interface.boost = boost;
     pstr_drc_interface->drc_parameter_interface
         .change_drc_characteristic_target = 1;
     pstr_drc_interface->drc_parameter_interface.drc_characteristic_target = 0;
diff --git a/decoder/drc_src/impd_drc_loudness_control.c b/decoder/drc_src/impd_drc_loudness_control.c
index c377a24..e478fc4 100644
--- a/decoder/drc_src/impd_drc_loudness_control.c
+++ b/decoder/drc_src/impd_drc_loudness_control.c
@@ -734,7 +734,6 @@
     if (overall_loudness_info_present == 1) {
       WORD32 requested_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS;
       WORD32 other_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS;
-      WORD32 requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4;
       WORD32 requested_preprocessing = 0;
 
       const WORD32* system_bonus = measurement_system_default_tbl;
@@ -761,35 +760,27 @@
       switch (pstr_drc_sel_proc_params_struct->loudness_measurement_system) {
         case USER_MEASUREMENT_SYSTEM_DEFAULT:
         case USER_MEASUREMENT_SYSTEM_BS_1770_4:
-          requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4;
           system_bonus = measurement_system_bs1770_3_tbl;
           break;
         case USER_MEASUREMENT_SYSTEM_USER:
-          requested_measurement_system = MEASUREMENT_SYSTEM_USER;
           system_bonus = measurement_system_user_tbl;
           break;
         case USER_MEASUREMENT_SYSTEM_EXPERT_PANEL:
-          requested_measurement_system = MEASUREMENT_SYSTEM_EXPERT_PANEL;
           system_bonus = measurement_system_expert_tbl;
           break;
         case USER_MEASUREMENT_SYSTEM_RESERVED_A:
-          requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_A;
           system_bonus = measurement_system_rms_a_tbl;
           break;
         case USER_MEASUREMENT_SYSTEM_RESERVED_B:
-          requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_B;
           system_bonus = measurement_system_rms_b_tbl;
           break;
         case USER_MEASUREMENT_SYSTEM_RESERVED_C:
-          requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_C;
           system_bonus = measurement_system_rms_c_tbl;
           break;
         case USER_MEASUREMENT_SYSTEM_RESERVED_D:
-          requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_D;
           system_bonus = measurement_system_rms_d_tbl;
           break;
         case USER_MEASUREMENT_SYSTEM_RESERVED_E:
-          requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_E;
           system_bonus = measurement_system_rms_e_tbl;
           break;
 
diff --git a/decoder/drc_src/impd_drc_main_td_process.c b/decoder/drc_src/impd_drc_main_td_process.c
index 4354365..407983c 100644
--- a/decoder/drc_src/impd_drc_main_td_process.c
+++ b/decoder/drc_src/impd_drc_main_td_process.c
@@ -40,6 +40,8 @@
 #include "impd_drc_api_struct_def.h"
 #include "impd_drc_hashdefines.h"
 #include "impd_drc_peak_limiter.h"
+IA_ERRORCODE impd_drc_set_default_bitstream_config(
+    ia_drc_config *pstr_drc_config);
 
 static IA_ERRORCODE impd_down_mix(
     ia_drc_sel_proc_output_struct *uni_drc_sel_proc_output,
@@ -84,12 +86,61 @@
     return IA_NO_ERROR;
   }
 
+  p_obj_drc->str_payload.pstr_loudness_info->loudness_info_album_count = 0;
+  p_obj_drc->str_payload.pstr_loudness_info->loudness_info_count = 0;
+  p_obj_drc->str_payload.pstr_loudness_info->loudness_info_set_ext_present = 0;
+  p_obj_drc->str_payload.pstr_drc_config->is_config_changed =
+      p_obj_drc->str_config.is_config_changed;
+
+  if (p_obj_drc->str_config.is_config_changed == 1) {
+    err_code = impd_process_drc_bitstream_dec_loudness_info_set(
+        p_obj_drc->pstr_bit_buf, p_obj_drc->str_payload.pstr_loudness_info,
+        &p_obj_drc->str_bit_handler.bitstream_loudness_info[0],
+        p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info);
+    if (err_code != IA_NO_ERROR) return err_code;
+
+    err_code = impd_drc_uni_sel_proc_process(
+        p_obj_drc->str_payload.pstr_selection_proc,
+        p_obj_drc->str_payload.pstr_drc_config,
+        p_obj_drc->str_payload.pstr_loudness_info,
+        p_obj_drc->str_payload.pstr_drc_sel_proc_output);
+    if (err_code != IA_NO_ERROR) return err_code;
+
+    err_code = impd_process_drc_bitstream_dec_config(
+        p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf,
+        p_obj_drc->str_payload.pstr_drc_config,
+        &p_obj_drc->str_bit_handler.bitstream_drc_config[0],
+        p_obj_drc->str_bit_handler.num_bytes_bs_drc_config);
+    if (err_code == 1) {
+      memset(p_obj_drc->str_payload.pstr_drc_config, 0, sizeof(ia_drc_config));
+      err_code = impd_drc_set_default_bitstream_config(
+          p_obj_drc->str_payload.pstr_drc_config);
+      p_obj_drc->str_payload.pstr_drc_config->channel_layout
+          .base_channel_count = p_obj_drc->str_config.num_ch_in;
+    }
+
+    if (err_code != IA_NO_ERROR) return err_code;
+  }
+
+  if (p_obj_drc->frame_count == 0) {
+    p_obj_drc->str_config.ln_dbgain_prev =
+        (WORD32)p_obj_drc->str_payload.pstr_drc_sel_proc_output
+            ->loudness_normalization_gain_db;
+  }
+
+  if (!p_obj_drc->str_payload.pstr_drc_config->ln_gain_changed) {
+    if (p_obj_drc->str_payload.pstr_drc_sel_proc_output
+            ->loudness_normalization_gain_db !=
+        p_obj_drc->str_config.ln_dbgain_prev) {
+      p_obj_drc->str_payload.pstr_drc_config->ln_gain_changed = 1;
+    }
+  }
+
   err_code = impd_process_drc_bitstream_dec_gain(
       p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf,
       p_obj_drc->str_payload.pstr_drc_config,
       p_obj_drc->str_payload.pstr_drc_gain,
-      &p_obj_drc->str_bit_handler
-           .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs],
+      p_obj_drc->str_bit_handler.it_bit_buf,
       p_obj_drc->str_bit_handler.num_bytes_bs,
       p_obj_drc->str_bit_handler.num_bits_offset_bs,
       &p_obj_drc->str_bit_handler.num_bits_read_bs);
@@ -202,15 +253,19 @@
 
   if (err_code != IA_NO_ERROR) return err_code;
 
-  if (p_obj_drc->str_payload.pstr_drc_sel_proc_output
+  if (p_obj_drc->str_payload.pstr_drc_config->apply_drc == 0 ||
+      p_obj_drc->str_payload.pstr_drc_config->is_config_changed == 0 ||
+      p_obj_drc->str_payload.pstr_drc_config->ln_gain_changed == 0) {
+    if (p_obj_drc->str_payload.pstr_drc_sel_proc_output
           ->loudness_normalization_gain_db != 0.0f) {
-    FLOAT32 gain_value =
-        (FLOAT32)pow(10.0, p_obj_drc->str_payload.pstr_drc_sel_proc_output
+      FLOAT32 gain_value =
+          (FLOAT32)pow(10.0, p_obj_drc->str_payload.pstr_drc_sel_proc_output
                                    ->loudness_normalization_gain_db /
                                20.0);
-    for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) {
-      for (j = 0; j < p_obj_drc->str_config.frame_size; j++) {
-        audio_buff[i][j] *= gain_value;
+      for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) {
+        for (j = 0; j < p_obj_drc->str_config.frame_size; j++) {
+          audio_buff[i][j] *= gain_value;
+        }
       }
     }
   }
@@ -320,5 +375,6 @@
                                          p_obj_drc->str_config.num_ch_out *
                                          (p_obj_drc->str_config.pcm_size >> 3);
   }
+  p_obj_drc->frame_count++;
   return err_code;
 }
diff --git a/decoder/drc_src/impd_drc_process.c b/decoder/drc_src/impd_drc_process.c
index e4b5147..2dd97d1 100644
--- a/decoder/drc_src/impd_drc_process.c
+++ b/decoder/drc_src/impd_drc_process.c
@@ -40,13 +40,13 @@
 
     FLOAT32* channel_audio[], WORD32 impd_apply_gains) {
   WORD32 c, b, g, i;
-  WORD32 offset = 0, signalIndex = 0;
-  WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX];
-  WORD32 signalIndexForChannel[MAX_CHANNEL_COUNT];
+  WORD32 offset = 0, signal_index = 0;
+  WORD32 gain_index_for_group[CHANNEL_GROUP_COUNT_MAX];
+  WORD32 signal_index_for_channel[MAX_CHANNEL_COUNT];
   FLOAT32* lpcm_gains;
   FLOAT32 sum;
-  FLOAT32 drc_gain_last, gainThr;
-  WORD32 iEnd, iStart;
+  FLOAT32 drc_gain_last = 0, gain_thr;
+  WORD32 i_end, i_start;
   ia_drc_instructions_struct* str_drc_instruction_str =
       &(pstr_drc_instruction_arr[drc_instructions_index]);
 
@@ -58,21 +58,21 @@
         if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) {
           offset = ia_drc_params_struct->drc_frame_size;
         }
-        gainIndexForGroup[0] = 0;
+        gain_index_for_group[0] = 0;
         for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups - 1; g++) {
-          gainIndexForGroup[g + 1] =
-              gainIndexForGroup[g] +
+          gain_index_for_group[g + 1] =
+              gain_index_for_group[g] +
               str_drc_instruction_str->band_count_of_ch_group[g];
         }
-        signalIndexForChannel[0] = 0;
+        signal_index_for_channel[0] = 0;
         for (c = 0; c < str_drc_instruction_str->audio_num_chan - 1; c++) {
           if (str_drc_instruction_str->channel_group_of_ch[c] >= 0) {
-            signalIndexForChannel[c + 1] =
-                signalIndexForChannel[c] +
+            signal_index_for_channel[c + 1] =
+                signal_index_for_channel[c] +
                 str_drc_instruction_str->band_count_of_ch_group
                     [str_drc_instruction_str->channel_group_of_ch[c]];
           } else {
-            signalIndexForChannel[c + 1] = signalIndexForChannel[c] + 1;
+            signal_index_for_channel[c + 1] = signal_index_for_channel[c] + 1;
           }
         }
 
@@ -81,59 +81,59 @@
                b++) {
             if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) {
               lpcm_gains =
-                  pstr_gain_buf->buf_interpolation[gainIndexForGroup[g] + b]
+                  pstr_gain_buf->buf_interpolation[gain_index_for_group[g] + b]
                       .lpcm_gains +
                   MAX_SIGNAL_DELAY - ia_drc_params_struct->gain_delay_samples -
                   ia_drc_params_struct->audio_delay_samples + offset;
             } else {
               lpcm_gains =
-                  pstr_gain_buf->buf_interpolation[gainIndexForGroup[g] + b]
+                  pstr_gain_buf->buf_interpolation[gain_index_for_group[g] + b]
                       .lpcm_gains +
                   MAX_SIGNAL_DELAY +
                   str_drc_instruction_str
                       ->parametric_drc_look_ahead_samples[g] -
                   ia_drc_params_struct->audio_delay_samples;
             }
-            iEnd = 0;
-            iStart = 0;
-            while (iEnd < ia_drc_params_struct->drc_frame_size) {
+            i_end = 0;
+            i_start = 0;
+            while (i_end < ia_drc_params_struct->drc_frame_size) {
               if (shape_filter_block[g].shape_flter_block_flag) {
                 drc_gain_last = shape_filter_block[g].drc_gain_last;
-                gainThr = 0.0001f * drc_gain_last;
-                while ((iEnd < ia_drc_params_struct->drc_frame_size) &&
-                       (fabs(lpcm_gains[iEnd] - drc_gain_last) <= gainThr))
-                  iEnd++;
+                gain_thr = 0.0001f * drc_gain_last;
+                while ((i_end < ia_drc_params_struct->drc_frame_size) &&
+                       (fabs(lpcm_gains[i_end] - drc_gain_last) <= gain_thr))
+                  i_end++;
               } else {
-                iEnd = ia_drc_params_struct->drc_frame_size;
+                i_end = ia_drc_params_struct->drc_frame_size;
               }
 
               for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
 
               {
                 if (g == str_drc_instruction_str->channel_group_of_ch[c]) {
-                  signalIndex = signalIndexForChannel[c] + b;
+                  signal_index = signal_index_for_channel[c] + b;
 
                   if (impd_apply_gains == 1) {
                     impd_shape_filt_block_time_process(
-                        &shape_filter_block[g], &lpcm_gains[0], signalIndex,
-                        &deinterleaved_audio[signalIndex][0], iStart, iEnd);
+                        &shape_filter_block[g], &lpcm_gains[0], signal_index,
+                        &deinterleaved_audio[signal_index][0], i_start, i_end);
 
                   } else {
-                    for (i = iStart; i < iEnd; i++) {
-                      deinterleaved_audio[signalIndex][i] = lpcm_gains[i];
+                    for (i = i_start; i < i_end; i++) {
+                      deinterleaved_audio[signal_index][i] = lpcm_gains[i];
                     }
                   }
                 }
               }
-              if ((iEnd < ia_drc_params_struct->drc_frame_size) &&
+              if ((i_end < ia_drc_params_struct->drc_frame_size) &&
                   (shape_filter_block[g].shape_flter_block_flag)) {
-                impd_shape_filt_block_adapt(lpcm_gains[iEnd],
+                impd_shape_filt_block_adapt(lpcm_gains[i_end],
                                             &shape_filter_block[g]);
               }
-              if ((iEnd == iStart) &&
+              if ((i_end == i_start) &&
                   (drc_gain_last == shape_filter_block[g].drc_gain_last))
                 break;
-              iStart = iEnd;
+              i_start = i_end;
             }
           }
         }
@@ -141,7 +141,7 @@
     }
   }
 
-  signalIndex = 0;
+  signal_index = 0;
 
   if (str_drc_instruction_str->drc_set_id > 0) {
     for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
@@ -153,17 +153,17 @@
           sum = 0.0f;
           for (b = 0; b < str_drc_instruction_str->band_count_of_ch_group[g];
                b++) {
-            sum += deinterleaved_audio[signalIndex + b][i];
+            sum += deinterleaved_audio[signal_index + b][i];
           }
 
           channel_audio[c][i] = sum;
         }
-        signalIndex += str_drc_instruction_str->band_count_of_ch_group[g];
+        signal_index += str_drc_instruction_str->band_count_of_ch_group[g];
       } else {
         for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) {
-          channel_audio[c][i] = deinterleaved_audio[signalIndex][i];
+          channel_audio[c][i] = deinterleaved_audio[signal_index][i];
         }
-        signalIndex++;
+        signal_index++;
       }
     }
   } else {
diff --git a/decoder/drc_src/impd_drc_selection_process.c b/decoder/drc_src/impd_drc_selection_process.c
index 0917845..9b4fa8e 100644
--- a/decoder/drc_src/impd_drc_selection_process.c
+++ b/decoder/drc_src/impd_drc_selection_process.c
@@ -541,7 +541,6 @@
                          WORD32* matching_eq_set_idx) {
   ia_eq_instructions_struct* str_eq_instructions = NULL;
   WORD32 i, k, n;
-  WORD32 match = 0;
   *matching_eq_set_count = 0;
   for (i = 0; i < drc_config->str_drc_config_ext.eq_instructions_count; i++) {
     str_eq_instructions =
@@ -557,7 +556,6 @@
         for (n = 0; n < str_eq_instructions->drc_set_id_count; n++) {
           if ((str_eq_instructions->drc_set_id[n] == ID_FOR_ANY_DRC) ||
               (drc_set_id == str_eq_instructions->drc_set_id[n])) {
-            match = 1;
             matching_eq_set_idx[*matching_eq_set_count] = i;
             (*matching_eq_set_count)++;
           }
diff --git a/decoder/drc_src/impd_drc_selection_process_drcset_selection.c b/decoder/drc_src/impd_drc_selection_process_drcset_selection.c
index b80d71f..676878b 100644
--- a/decoder/drc_src/impd_drc_selection_process_drcset_selection.c
+++ b/decoder/drc_src/impd_drc_selection_process_drcset_selection.c
@@ -203,8 +203,6 @@
                                  WORD32 drc_set_id_selected) {
   WORD32 n;
 
-  ia_drc_instructions_struct* str_drc_instruction_str = NULL;
-
   for (n = 0; n < pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus;
        n++) {
     if (pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n]
@@ -215,9 +213,6 @@
     return (EXTERNAL_ERROR);
   }
   pstr_drc_uni_sel_proc->drc_inst_index_sel = n;
-  str_drc_instruction_str = &(
-      pstr_drc_uni_sel_proc->drc_config
-          .str_drc_instruction_str[pstr_drc_uni_sel_proc->drc_inst_index_sel]);
 
   pstr_drc_uni_sel_proc->drc_instructions_index[0] =
       pstr_drc_uni_sel_proc->drc_inst_index_sel;
@@ -431,10 +426,9 @@
   WORD32 k, err;
   WORD32 match_found_flag = 0;
   WORD32 state_requested;
-  WORD32 desired_effect_type_found, fallback_effect_type_found;
+  WORD32 desired_effect_type_found;
 
   desired_effect_type_found = 0;
-  fallback_effect_type_found = 0;
   k = 0;
   while (k < effect_type_requested_desired_count) {
     state_requested = 1;
@@ -453,7 +447,6 @@
           &match_found_flag, selection_candidate_count,
           selection_candidate_info);
       if (err) return (err);
-      if (match_found_flag) fallback_effect_type_found = 1;
       k++;
     }
   }
diff --git a/decoder/drc_src/impd_drc_shape_filter.c b/decoder/drc_src/impd_drc_shape_filter.c
index b8ca037..d2467c7 100644
--- a/decoder/drc_src/impd_drc_shape_filter.c
+++ b/decoder/drc_src/impd_drc_shape_filter.c
@@ -41,7 +41,7 @@
                                  shape_filter_block* shape_filter_block) {
   //    WORD32 err = 0;
   WORD32 i;
-  FLOAT32 warpedGain, x1, y1;
+  FLOAT32 warped_gain = 0, x1 = 0, y1;
   shape_filter_block->drc_gain_last = drc_gain;
   for (i = 0; i < 4; i++) {
     if (shape_filter_block->shape_filter[i].type == SHAPE_FILTER_TYPE_OFF)
@@ -51,9 +51,9 @@
              shape_filter_block->shape_filter[i].type ==
                  SHAPE_FILTER_TYPE_HF_CUT) {
       if (drc_gain < 1.0f)
-        warpedGain = -1.0f;
+        warped_gain = -1.0f;
       else
-        warpedGain =
+        warped_gain =
             (drc_gain - 1.0f) /
             (drc_gain - 1.0f + shape_filter_block->shape_filter[i].gain_offset);
       x1 = shape_filter_block->shape_filter[i].a1;
@@ -62,9 +62,9 @@
                shape_filter_block->shape_filter[i].type ==
                    SHAPE_FILTER_TYPE_HF_BOOST) {
       if (drc_gain >= 1.0f)
-        warpedGain = -1.0f;
+        warped_gain = -1.0f;
       else
-        warpedGain =
+        warped_gain =
             (1.0f - drc_gain) /
             (1.0f +
              drc_gain *
@@ -72,11 +72,11 @@
       x1 = shape_filter_block->shape_filter[i].b1;
     }
 
-    if (warpedGain <= 0.0f) {
+    if (warped_gain <= 0.0f) {
       y1 = x1;
-    } else if (warpedGain <
+    } else if (warped_gain <
                shape_filter_block->shape_filter[i].warped_gain_max) {
-      y1 = x1 + shape_filter_block->shape_filter[i].factor * warpedGain;
+      y1 = x1 + shape_filter_block->shape_filter[i].factor * warped_gain;
     } else {
       y1 = shape_filter_block->shape_filter[i].y1_bound;
     }
diff --git a/decoder/drc_src/impd_drc_static_payload.c b/decoder/drc_src/impd_drc_static_payload.c
index e389c24..3c08adb 100644
--- a/decoder/drc_src/impd_drc_static_payload.c
+++ b/decoder/drc_src/impd_drc_static_payload.c
@@ -574,7 +574,7 @@
     ia_bit_buf_struct* it_bit_buff, WORD32 parametric_drc_frame_size,
     ia_parametric_drc_instructions_struct* str_parametric_drc_instructions) {
   WORD32 i = 0, err = 0, temp;
-  WORD32 bit_size_len, bit_size, other_bit;
+  WORD32 bit_size_len, bit_size;
 
   str_parametric_drc_instructions->drc_characteristic = 0;
   str_parametric_drc_instructions->disable_paramteric_drc = 0;
@@ -678,7 +678,7 @@
         default:
           str_parametric_drc_instructions->disable_paramteric_drc = 1;
           for (i = 0; i < str_parametric_drc_instructions->len_bit_size; i++) {
-            other_bit = impd_read_bits_buf(it_bit_buff, 1);
+            impd_read_bits_buf(it_bit_buff, 1);
             if (it_bit_buff->error) return it_bit_buff->error;
           }
           break;
@@ -908,7 +908,7 @@
                           ia_drc_config* drc_config,
                           ia_drc_config_ext* str_drc_config_ext) {
   WORD32 err = 0, i, k;
-  WORD32 bit_size_len, ext_size_bits, bit_size, other_bit;
+  WORD32 bit_size_len, ext_size_bits, bit_size;
 
   k = 0;
   str_drc_config_ext->drc_config_ext_type[k] =
@@ -955,7 +955,7 @@
         break;
       default:
         for (i = 0; i < str_drc_config_ext->ext_bit_size[k]; i++) {
-          other_bit = impd_read_bits_buf(it_bit_buff, 1);
+          impd_read_bits_buf(it_bit_buff, 1);
           if (it_bit_buff->error) return it_bit_buff->error;
         }
         break;
@@ -1622,7 +1622,7 @@
     ia_bit_buf_struct* it_bit_buff,
     ia_drc_loudness_info_set_struct* loudness_info_set) {
   WORD32 err = 0, i, k;
-  WORD32 bit_size_len, ext_size_bits, bit_size, other_bit;
+  WORD32 bit_size_len, ext_size_bits, bit_size;
 
   k = 0;
   loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] =
@@ -1649,7 +1649,7 @@
         for (i = 0;
              i < loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k];
              i++) {
-          other_bit = impd_read_bits_buf(it_bit_buff, 1);
+          impd_read_bits_buf(it_bit_buff, 1);
           if (it_bit_buff->error) return it_bit_buff->error;
         }
         break;
@@ -2199,9 +2199,9 @@
         if (it_bit_buff->error) return it_bit_buff->error;
 
         repeat_parameters_cnt += 1;
-        if ((c + repeat_parameters_cnt) > MAX_CHANNEL_COUNT)
-          return (UNEXPECTED_ERROR);
         for (k = 0; k < repeat_parameters_cnt; k++) {
+          if (c > (MAX_CHANNEL_COUNT-1))
+            return (UNEXPECTED_ERROR);
           str_drc_instruction_str->gain_set_index[c] =
               str_drc_instruction_str->gain_set_index[c - 1];
           str_drc_instruction_str->str_ducking_modifiers_for_channel[c] =
@@ -2343,9 +2343,9 @@
         if (it_bit_buff->error) return it_bit_buff->error;
 
         repeat_gain_set_idx_cnt += 1;
-        if ((c + repeat_gain_set_idx_cnt) > MAX_CHANNEL_COUNT)
-          return (UNEXPECTED_ERROR);
         for (k = 0; k < repeat_gain_set_idx_cnt; k++) {
+          if (c > (MAX_CHANNEL_COUNT - 1))
+            return (UNEXPECTED_ERROR);
           str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1;
           c++;
         }
@@ -2477,6 +2477,15 @@
   for (i = 0; i < loudness_info->measurement_count; i++) {
     err = impd_parse_loudness_measure(it_bit_buff,
                                       &(loudness_info->loudness_measure[i]));
+
+    if (loudness_info->loudness_measure[i].method_def ==
+        METHOD_DEFINITION_ANCHOR_LOUDNESS)
+      loudness_info->anchor_loudness_present = 1;
+
+    if (loudness_info->loudness_measure[i].measurement_system ==
+        MEASUREMENT_SYSTEM_EXPERT_PANEL)
+      loudness_info->expert_loudness_present = 1;
+
     if (err) return (err);
   }
 
diff --git a/decoder/drc_src/impd_drc_struct.h b/decoder/drc_src/impd_drc_struct.h
index 16e2191..ea07644 100644
--- a/decoder/drc_src/impd_drc_struct.h
+++ b/decoder/drc_src/impd_drc_struct.h
@@ -444,6 +444,8 @@
   WORD32 true_peak_level_measurement_system; /* Parsed but unused */
   WORD32 true_peak_level_reliability;        /* Parsed but unused */
   WORD32 measurement_count;
+  WORD32 anchor_loudness_present;
+  WORD32 expert_loudness_present;
   ia_loudness_measure_struct loudness_measure[MEASUREMENT_COUNT_MAX];
 } ia_loudness_info_struct;
 
@@ -616,6 +618,8 @@
   ia_channel_layout_struct channel_layout;
   ia_downmix_instructions_struct
       dwnmix_instructions[DOWNMIX_INSTRUCTION_COUNT_MAX];
+  WORD32 is_config_changed;
+  WORD32 ln_gain_changed;
 } ia_drc_config;
 
 typedef struct {
diff --git a/decoder/generic/ixheaacd_function_selector_generic.c b/decoder/generic/ixheaacd_function_selector_generic.c
index b6c34a5..4a57944 100644
--- a/decoder/generic/ixheaacd_function_selector_generic.c
+++ b/decoder/generic/ixheaacd_function_selector_generic.c
@@ -45,6 +45,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -67,11 +70,15 @@
 WORD32 (*ixheaacd_fix_div)(WORD32, WORD32) = &ixheaacd_fix_div_dec;
 
 VOID(*ixheaacd_covariance_matrix_calc)
-(WORD32 *, ixheaacd_lpp_trans_cov_matrix *,
+(WORD32 *, ia_lpp_trans_cov_matrix *,
  WORD32) = &ixheaacd_covariance_matrix_calc_dec;
 
+VOID(*ixheaacd_covariance_matrix_calc_960)
+(WORD32 *, ia_lpp_trans_cov_matrix *,
+ WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec_960;
+
 VOID(*ixheaacd_covariance_matrix_calc_2)
-(ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32,
+(ia_lpp_trans_cov_matrix *, WORD32 *, WORD32,
  WORD16) = &ixheaacd_covariance_matrix_calc_2_dec;
 
 VOID(*ixheaacd_over_lap_add1)
@@ -186,6 +193,11 @@
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
  WORD32 neg_expo) = &ixheaacd_pretwiddle_compute_dec;
 
+VOID(*ixheaacd_pretwiddle_compute_960)
+(WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
+ ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
+ WORD32 neg_expo) = &ixheaacd_pretwiddle_compute_960_dec;
+
 VOID(*ixheaacd_imdct_using_fft)
 (ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 npoints,
  WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_imdct_using_fft_dec;
@@ -194,18 +206,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec;
@@ -214,14 +214,10 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec;
 
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
diff --git a/decoder/generic/ixheaacd_qmf_dec_generic.c b/decoder/generic/ixheaacd_qmf_dec_generic.c
index 85e7a5b..a92aad9 100644
--- a/decoder/generic/ixheaacd_qmf_dec_generic.c
+++ b/decoder/generic/ixheaacd_qmf_dec_generic.c
@@ -58,6 +58,8 @@
 #define RADIXSHIFT 1
 #define HQ_SHIFT_VAL 4
 
+extern const WORD32 ixheaacd_ldmps_polyphase_filter_coeff_fix[1280];
+
 VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output,
                       const WORD16 *main_twidle_fwd, const WORD16 *post_tbl,
                       const WORD16 *w_16, const WORD32 *p_table) {
@@ -83,12 +85,12 @@
     temp1[0] = *ptr_forward++;
     temp1[1] = *ptr_reverse--;
     temp1[0] = ixheaacd_add32_sat(ixheaacd_shr32(temp1[0], LP_SHIFT_VAL),
-                              ixheaacd_shr32(temp1[1], LP_SHIFT_VAL));
+                                  ixheaacd_shr32(temp1[1], LP_SHIFT_VAL));
 
     temp1[2] = *(ptr_forward - 33);
     temp1[3] = *(ptr_reverse - 31);
     temp1[1] = ixheaacd_sub32_sat(ixheaacd_shr32(temp1[2], LP_SHIFT_VAL),
-                              ixheaacd_shr32(temp1[3], LP_SHIFT_VAL));
+                                  ixheaacd_shr32(temp1[3], LP_SHIFT_VAL));
     twid_re = *twidle_fwd++;
 
     twid_im = *twidle_fwd;
@@ -108,7 +110,7 @@
   temp1[1] = *ptr_reverse--;
   temp1[0] = *(ptr_reverse - 31);
   temp1[1] = ixheaacd_sub32_sat(ixheaacd_shr32(temp1[1], LP_SHIFT_VAL),
-                            ixheaacd_shr32(temp1[0], LP_SHIFT_VAL));
+                                ixheaacd_shr32(temp1[0], LP_SHIFT_VAL));
 
   temp1[0] = temp1[1];
 
@@ -293,7 +295,7 @@
     wre = *p_sin_cos++;
 
     *psubband_t++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre),
-                                   ixheaacd_mult32x16in32(im, wim));
+                                       ixheaacd_mult32x16in32(im, wim));
     *psubband_t++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre),
                                        ixheaacd_mult32x16in32(re, wim));
 
@@ -303,7 +305,7 @@
     *psubband_t2++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim),
                                         ixheaacd_mult32x16in32(re, wre));
     *psubband_t2++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim),
-                                    ixheaacd_mult32x16in32(im, wre));
+                                        ixheaacd_mult32x16in32(im, wre));
 
     re = *psubband1--;
     im = *psubband++;
@@ -314,13 +316,13 @@
     *psubband1_t-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre),
                                         ixheaacd_mult32x16in32(re, wim));
     *psubband1_t-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre),
-                                    ixheaacd_mult32x16in32(im, wim));
+                                        ixheaacd_mult32x16in32(im, wim));
 
     re = *psubband12--;
     im = *psubband2++;
 
     *psubband1_t2-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim),
-                                     ixheaacd_mult32x16in32(im, wre));
+                                         ixheaacd_mult32x16in32(im, wre));
     *psubband1_t2-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim),
                                          ixheaacd_mult32x16in32(re, wre));
 
@@ -331,7 +333,7 @@
     wre = *p_sin_cos++;
 
     *psubband_t++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre),
-                                   ixheaacd_mult32x16in32(im, wim));
+                                       ixheaacd_mult32x16in32(im, wim));
     *psubband_t++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre),
                                        ixheaacd_mult32x16in32(re, wim));
 
@@ -341,7 +343,7 @@
     *psubband_t2++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim),
                                         ixheaacd_mult32x16in32(re, wre));
     *psubband_t2++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim),
-                                    ixheaacd_mult32x16in32(im, wre));
+                                        ixheaacd_mult32x16in32(im, wre));
 
     re = *psubband1--;
     im = *psubband++;
@@ -352,14 +354,14 @@
     *psubband1_t-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre),
                                         ixheaacd_mult32x16in32(re, wim));
     *psubband1_t-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre),
-                                    ixheaacd_mult32x16in32(im, wim));
+                                        ixheaacd_mult32x16in32(im, wim));
 
     re = *psubband12--;
     im = *psubband2++;
     ;
 
     *psubband1_t2-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim),
-                                     ixheaacd_mult32x16in32(im, wre));
+                                         ixheaacd_mult32x16in32(im, wre));
     *psubband1_t2-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim),
                                          ixheaacd_mult32x16in32(re, wre));
   }
@@ -390,7 +392,7 @@
 
   *psubband = *psubband >> 1;
   psubband++;
-  *psubband1 = ixheaacd_negate32(*psubband >> 1);
+  *psubband1 = ixheaacd_negate32_sat(*psubband >> 1);
   psubband1--;
 
   p_sin = &qmf_bank->alt_sin_twiddle[0];
@@ -400,7 +402,7 @@
   im = *psubband1;
 
   *psubband1-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wre),
-                                ixheaacd_mult32x16in32(im, wim));
+                                    ixheaacd_mult32x16in32(im, wim));
   *psubband++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre),
                                    ixheaacd_mult32x16in32(re, wim));
 
@@ -430,7 +432,7 @@
     re2 = *psubband1;
 
     *psubband++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re, wim),
-                                 ixheaacd_mult32x16in32(im, wre));
+                                     ixheaacd_mult32x16in32(im, wre));
     *psubband1-- = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wim),
                                       ixheaacd_mult32x16in32(re, wre));
 
@@ -450,7 +452,7 @@
     im = psubband1[0];
 
     *psubband1-- = ixheaacd_add32_sat(ixheaacd_mult32x16in32(re2, wre),
-                                  ixheaacd_mult32x16in32(im, wim));
+                                      ixheaacd_mult32x16in32(im, wim));
     *psubband++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(im, wre),
                                      ixheaacd_mult32x16in32(re2, wim));
 
@@ -466,15 +468,16 @@
 VOID ixheaacd_fwd_modulation(const WORD32 *p_time_in1, WORD32 *real_subband,
                              WORD32 *imag_subband,
                              ia_sbr_qmf_filter_bank_struct *qmf_bank,
-                             ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
+                             ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
+                             WORD32 ld_mps_flag) {
   WORD32 i;
-  const WORD32 *p_time_in2 = &p_time_in1[2 * NO_ANALYSIS_CHANNELS - 1];
+  const WORD32 *p_time_in2 = &p_time_in1[2 * qmf_bank->no_channels - 1];
   WORD32 temp1, temp2;
   WORD32 *t_real_subband = real_subband;
   WORD32 *t_imag_subband = imag_subband;
   const WORD16 *tcos;
 
-  for (i = NO_ANALYSIS_CHANNELS - 1; i >= 0; i--) {
+  for (i = qmf_bank->no_channels - 1; i >= 0; i--) {
     temp1 = ixheaacd_shr32(*p_time_in1++, HQ_SHIFT_VAL);
     temp2 = ixheaacd_shr32(*p_time_in2--, HQ_SHIFT_VAL);
 
@@ -483,28 +486,48 @@
     *t_imag_subband++ = ixheaacd_add32_sat(temp1, temp2);
   }
 
-  ixheaacd_cos_sin_mod(real_subband, qmf_bank, qmf_dec_tables_ptr->w_16,
-                       qmf_dec_tables_ptr->dig_rev_table4_16);
+  if (qmf_bank->no_channels != 64)
+    ixheaacd_cos_sin_mod(real_subband, qmf_bank, qmf_dec_tables_ptr->w_16,
+                         qmf_dec_tables_ptr->dig_rev_table4_16);
+  else
+    ixheaacd_cos_sin_mod(real_subband, qmf_bank, qmf_dec_tables_ptr->w_32,
+                         qmf_dec_tables_ptr->dig_rev_table2_32);
 
-  tcos = qmf_bank->t_cos;
+  if (ld_mps_flag == 0) {
+    tcos = qmf_bank->t_cos;
 
-  for (i = (qmf_bank->usb - qmf_bank->lsb - 1); i >= 0; i--) {
-    WORD16 cosh, sinh;
-    WORD32 re, im;
+    for (i = (qmf_bank->usb - qmf_bank->lsb - 1); i >= 0; i--) {
+      WORD16 cosh, sinh;
+      WORD32 re, im;
 
-    re = *real_subband;
-    im = *imag_subband;
-    cosh = *tcos++;
-    sinh = *tcos++;
-    *real_subband++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32_shl(re, cosh),
-                                     ixheaacd_mult32x16in32_shl(im, sinh));
-    *imag_subband++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(im, cosh),
-                                         ixheaacd_mult32x16in32_shl(re, sinh));
+      re = *real_subband;
+      im = *imag_subband;
+      cosh = *tcos++;
+      sinh = *tcos++;
+      *real_subband++ =
+          ixheaacd_add32_sat(ixheaacd_mult32x16in32_shl(re, cosh),
+                             ixheaacd_mult32x16in32_shl(im, sinh));
+      *imag_subband++ =
+          ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(im, cosh),
+                             ixheaacd_mult32x16in32_shl(re, sinh));
+    }
+  } else {
+    WORD32 i_band;
+    for (i = 0; i < min(64, qmf_bank->no_channels); i += 2) {
+      i_band = real_subband[i];
+      real_subband[i] = -imag_subband[i];
+      imag_subband[i] = i_band;
+
+      i_band = -real_subband[i + 1];
+      real_subband[i + 1] = imag_subband[i + 1];
+      imag_subband[i + 1] = i_band;
+    }
   }
 }
 
-VOID ixheaacd_sbr_qmfanal32_winadd(WORD16 *inp1, WORD16 *inp2, WORD16 *p_qmf1,
-                                   WORD16 *p_qmf2, WORD32 *p_out) {
+VOID ixheaacd_sbr_qmfanal32_winadd(WORD16 *inp1, WORD16 *inp2,
+                                   const WORD16 *p_qmf1, const WORD16 *p_qmf2,
+                                   WORD32 *p_out) {
   WORD32 n;
 
   for (n = 0; n < 32; n += 2) {
@@ -582,6 +605,8 @@
   WORD16 *filter_1;
   WORD16 *filter_2;
   WORD16 *filt_ptr;
+  WORD32 start_slot = 0;
+
   if (audio_object_type != AOT_ER_AAC_ELD &&
       audio_object_type != AOT_ER_AAC_LD) {
     qmf_bank->filter_pos +=
@@ -599,7 +624,7 @@
       audio_object_type != AOT_ER_AAC_LD) {
     filter_2 = filter_1 + 64;
   } else {
-    filter_2 = filter_1 + 32;
+    filter_2 = filter_1 + qmf_bank->no_channels;
   }
 
   sbr_scale_factor->st_lb_scale = 0;
@@ -611,10 +636,17 @@
     } else {
       sbr_scale_factor->lb_scale = -9;
     }
-    qmf_bank->cos_twiddle =
-        (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l32;
-    qmf_bank->alt_sin_twiddle =
-        (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l32;
+    if (qmf_bank->no_channels != 64) {
+      qmf_bank->cos_twiddle =
+          (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l32;
+      qmf_bank->alt_sin_twiddle =
+          (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l32;
+    } else {
+      qmf_bank->cos_twiddle =
+          (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l64;
+      qmf_bank->alt_sin_twiddle =
+          (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l64;
+    }
     if (audio_object_type != AOT_ER_AAC_ELD &&
         audio_object_type != AOT_ER_AAC_LD) {
       qmf_bank->t_cos = (WORD16 *)qmf_dec_tables_ptr->sbr_t_cos_sin_l32;
@@ -625,7 +657,7 @@
   }
 
   fp1 = qmf_bank->anal_filter_states;
-  fp2 = qmf_bank->anal_filter_states + NO_ANALYSIS_CHANNELS;
+  fp2 = qmf_bank->anal_filter_states + qmf_bank->no_channels;
 
   if (audio_object_type == AOT_ER_AAC_ELD ||
       audio_object_type == AOT_ER_AAC_LD) {
@@ -634,9 +666,10 @@
     fp2 = qmf_bank->fp2_anal;
   }
 
-  for (i = 0; i < num_time_slots; i++) {
-    for (k = 0; k < NO_ANALYSIS_CHANNELS; k++)
-      filter_states[NO_ANALYSIS_CHANNELS - 1 - k] = time_sample_buf[ch_fac * k];
+  for (i = start_slot; i < num_time_slots + start_slot; i++) {
+    for (k = 0; k < qmf_bank->no_channels; k++)
+      filter_states[qmf_bank->no_channels - 1 - k] =
+          time_sample_buf[ch_fac * k];
 
     if (audio_object_type != AOT_ER_AAC_ELD &&
         audio_object_type != AOT_ER_AAC_LD) {
@@ -647,11 +680,12 @@
                                         analysis_buffer);
     }
 
-    time_sample_buf += NO_ANALYSIS_CHANNELS * ch_fac;
+    time_sample_buf += qmf_bank->no_channels * ch_fac;
 
-    filter_states -= NO_ANALYSIS_CHANNELS;
+    filter_states -= qmf_bank->no_channels;
     if (filter_states < qmf_bank->anal_filter_states) {
-      filter_states = qmf_bank->anal_filter_states + 288;
+      filter_states = qmf_bank->anal_filter_states +
+                      ((qmf_bank->no_channels * 10) - qmf_bank->no_channels);
     }
 
     tmp = fp1;
@@ -662,8 +696,8 @@
       filter_1 += 64;
       filter_2 += 64;
     } else {
-      filter_1 += 32;
-      filter_2 += 32;
+      filter_1 += qmf_bank->no_channels;
+      filter_2 += qmf_bank->no_channels;
     }
 
     filt_ptr = filter_1;
@@ -676,15 +710,16 @@
         filter_2 = (WORD16 *)qmf_bank->analy_win_coeff + 64;
       }
     } else {
-      if (filter_2 > (qmf_bank->analy_win_coeff + 320)) {
+      if (filter_2 >
+          (qmf_bank->analy_win_coeff + (qmf_bank->no_channels * 10))) {
         filter_1 = (WORD16 *)qmf_bank->analy_win_coeff;
-        filter_2 = (WORD16 *)qmf_bank->analy_win_coeff + 32;
+        filter_2 = (WORD16 *)qmf_bank->analy_win_coeff + qmf_bank->no_channels;
       }
     }
 
     if (!low_pow_flag) {
       ixheaacd_fwd_modulation(analysis_buffer, qmf_real[i], qmf_imag[i],
-                              qmf_bank, qmf_dec_tables_ptr);
+                              qmf_bank, qmf_dec_tables_ptr, 0);
     } else {
       ixheaacd_dct3_32(
           (WORD32 *)analysis_buffer, qmf_real[i], qmf_dec_tables_ptr->dct23_tw,
@@ -705,6 +740,114 @@
   }
 }
 
+VOID ixheaacd_cplx_anal_qmffilt_32(const WORD32 *time_sample_buf,
+                                   ia_sbr_scale_fact_struct *sbr_scale_factor,
+                                   WORD32 **qmf_real, WORD32 **qmf_imag,
+                                   ia_sbr_qmf_filter_bank_struct *qmf_bank,
+                                   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
+                                   WORD32 ch_fac, WORD32 ldsbr_present) {
+  WORD32 i, k;
+  WORD32 num_time_slots = qmf_bank->num_time_slots;
+
+  WORD32 analysis_buffer[4 * NO_ANALYSIS_CHANNELS];
+  WORD32 *filter_states = qmf_bank->core_samples_buffer_32;
+
+  WORD32 *fp1, *fp2, *tmp;
+
+  WORD32 *filter_1;
+  WORD32 *filter_2;
+  WORD32 *filt_ptr;
+  WORD32 start_slot = 2;
+
+  if (ldsbr_present) {
+    qmf_bank->filter_pos_32 +=
+        (qmf_dec_tables_ptr->qmf_c_ldsbr_mps - qmf_bank->analy_win_coeff_32);
+    qmf_bank->analy_win_coeff_32 = qmf_dec_tables_ptr->qmf_c_ldsbr_mps;
+  } else {
+    qmf_bank->filter_pos_32 += (ixheaacd_ldmps_polyphase_filter_coeff_fix -
+                                qmf_bank->analy_win_coeff_32);
+    qmf_bank->analy_win_coeff_32 =
+        (WORD32 *)ixheaacd_ldmps_polyphase_filter_coeff_fix;
+  }
+
+  filter_1 = qmf_bank->filter_pos_32;
+  filter_2 = filter_1 + qmf_bank->no_channels;
+
+  sbr_scale_factor->st_lb_scale = 0;
+  sbr_scale_factor->lb_scale = -10;
+
+  sbr_scale_factor->lb_scale = -9;
+  if (qmf_bank->no_channels != 64) {
+    qmf_bank->cos_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l32;
+    qmf_bank->alt_sin_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l32;
+  } else {
+    qmf_bank->cos_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l64;
+    qmf_bank->alt_sin_twiddle =
+        (WORD16 *)qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l64;
+  }
+  qmf_bank->t_cos =
+      (WORD16 *)qmf_dec_tables_ptr->ixheaacd_sbr_t_cos_sin_l32_eld;
+
+  fp1 = qmf_bank->anal_filter_states_32;
+  fp2 = qmf_bank->anal_filter_states_32 + qmf_bank->no_channels;
+
+  filter_2 = qmf_bank->filter_2_32;
+  fp1 = qmf_bank->fp1_anal_32;
+  fp2 = qmf_bank->fp2_anal_32;
+
+  for (i = start_slot; i < num_time_slots + start_slot; i++) {
+    for (k = 0; k < qmf_bank->no_channels; k++)
+      filter_states[qmf_bank->no_channels - 1 - k] =
+          time_sample_buf[ch_fac * k];
+
+    if (ldsbr_present) {
+      ixheaacd_sbr_qmfanal32_winadd_eld_32(fp1, fp2, filter_1, filter_2,
+                                           analysis_buffer);
+    } else {
+      ixheaacd_sbr_qmfanal32_winadd_eld_mps(fp1, fp2, filter_1, filter_2,
+                                            analysis_buffer);
+    }
+
+    time_sample_buf += qmf_bank->no_channels * ch_fac;
+
+    filter_states -= qmf_bank->no_channels;
+
+    if (filter_states < qmf_bank->anal_filter_states_32) {
+      filter_states = qmf_bank->anal_filter_states_32 +
+                      ((qmf_bank->no_channels * 10) - qmf_bank->no_channels);
+    }
+
+    tmp = fp1;
+    fp1 = fp2;
+    fp2 = tmp;
+
+    filter_1 += qmf_bank->no_channels;
+    filter_2 += qmf_bank->no_channels;
+
+    filt_ptr = filter_1;
+    filter_1 = filter_2;
+    filter_2 = filt_ptr;
+
+    if (filter_2 >
+        (qmf_bank->analy_win_coeff_32 + (qmf_bank->no_channels * 10))) {
+      filter_1 = (WORD32 *)qmf_bank->analy_win_coeff_32;
+      filter_2 = (WORD32 *)qmf_bank->analy_win_coeff_32 + qmf_bank->no_channels;
+    }
+
+    ixheaacd_fwd_modulation(analysis_buffer, qmf_real[i], qmf_imag[i], qmf_bank,
+                            qmf_dec_tables_ptr, 1);
+  }
+
+  qmf_bank->filter_pos_32 = filter_1;
+  qmf_bank->core_samples_buffer_32 = filter_states;
+
+  qmf_bank->fp1_anal_32 = fp1;
+  qmf_bank->fp2_anal_32 = fp2;
+  qmf_bank->filter_2_32 = filter_2;
+}
 VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states,
                                 ia_sbr_qmf_filter_bank_struct *syn_qmf,
                                 ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
@@ -746,9 +889,6 @@
 
   WORD64 mul_1, mul_2, mul_3, mul_4, mul_5, mul_6;
   WORD64 mul_7, mul_8, mul_9, mul_10, mul_11, mul_12;
-  WORD32 *x_l1;
-  WORD32 *x_l2;
-  WORD32 *x_h2;
   const WORD32 *w_ptr = w;
   WORD32 i1;
 
@@ -756,10 +896,6 @@
   l1 = index << 2;
   l2 = (index << 2) + (index << 1);
 
-  x_l1 = &(x[l1]);
-  x_l2 = &(x[l2]);
-  x_h2 = &(x[h2]);
-
   fft_jmp = 6 * (index);
 
   for (i1 = 0; i1 < index1; i1++) {
@@ -846,7 +982,6 @@
   WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
   WORD32 n00, n10, n20, n30, n01, n11, n21, n31;
   WORD32 n02, n12, n22, n32, n03, n13, n23, n33;
-  WORD32 n0, j0;
   WORD32 *x2, *x0;
   WORD32 *y0, *y1, *y2, *y3;
 
@@ -857,8 +992,6 @@
 
   y1 = y0 + (WORD32)(npoints >> 2);
   y3 = y2 + (WORD32)(npoints >> 2);
-  j0 = 8;
-  n0 = npoints >> 1;
 
   for (k = 0; k < 2; k++) {
     for (i = 0; i<npoints>> 1; i += 8) {
@@ -936,7 +1069,6 @@
   WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
   WORD32 n00, n10, n20, n30, n01, n11, n21, n31;
   WORD32 n02, n12, n22, n32, n03, n13, n23, n33;
-  WORD32 n0, j0;
   WORD32 *x2, *x0;
   WORD32 *y0, *y1, *y2, *y3;
 
@@ -948,9 +1080,6 @@
   y1 = y0 + (WORD32)(npoints >> 1);
   y3 = y2 + (WORD32)(npoints >> 1);
 
-  j0 = 4;
-  n0 = npoints >> 2;
-
   for (k = 0; k < 2; k++) {
     for (i = 0; i<npoints>> 1; i += 8) {
       h2 = *p_dig_rev_tbl++ >> 2;
@@ -1245,7 +1374,7 @@
 
   *psubband = *psubband >> 1;
   psubband++;
-  *psubband1 = ixheaacd_negate32(*psubband >> 1);
+  *psubband1 = ixheaacd_negate32_sat(*psubband >> 1);
   psubband1--;
 
   p_sin = qmf_bank->esbr_alt_sin_twiddle;
@@ -1386,8 +1515,8 @@
   for (k = 0; k < 64; k++) {
     WORD32 syn_out = rounding_fac;
 
-    syn_out = ixheaacd_add32_sat(syn_out,
-                             ixheaacd_mult16x16in32(tmp1[0 + k], inp1[k + 0]));
+    syn_out = ixheaacd_add32_sat(
+        syn_out, ixheaacd_mult16x16in32(tmp1[0 + k], inp1[k + 0]));
     syn_out = ixheaacd_add32_sat(
         syn_out, ixheaacd_mult16x16in32(tmp1[256 + k], inp1[k + 128]));
     syn_out = ixheaacd_add32_sat(
@@ -1445,6 +1574,39 @@
   }
 }
 
+VOID ixheaacd_esbr_qmfsyn32_winadd(WORD32 *tmp1, WORD32 *tmp2, WORD32 *inp1,
+                                   WORD32 *sample_buffer, WORD32 ch_fac) {
+  WORD32 k;
+
+  for (k = 0; k < 32; k++) {
+    WORD64 syn_out = 0;
+
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[0 + k], inp1[2 * (k + 0)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[128 + k], inp1[2 * (k + 64)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[256 + k], inp1[2 * (k + 128)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[384 + k], inp1[2 * (k + 192)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp1[512 + k], inp1[2 * (k + 256)]));
+
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[64 + k], inp1[2 * (k + 32)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[192 + k], inp1[2 * (k + 96)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[320 + k], inp1[2 * (k + 160)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[448 + k], inp1[2 * (k + 224)]));
+    syn_out =
+        ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[576 + k], inp1[2 * (k + 288)]));
+
+    sample_buffer[ch_fac * k] = (WORD32)(syn_out >> 31);
+  }
+}
+
 VOID ixheaacd_shiftrountine(WORD32 *qmf_real, WORD32 *qmf_imag, WORD32 len,
                             WORD32 common_shift) {
   WORD32 treal, timag;
@@ -1521,7 +1683,7 @@
     r1 = *qmf_real++;
     i1 = *qmf_imag++;
 
-    timag = ixheaacd_negate32(ixheaacd_add32_sat(i1, r1));
+    timag = ixheaacd_negate32_sat(ixheaacd_add32_sat(i1, r1));
     timag = (ixheaacd_shl32_sat(timag, shift));
     filter_states_rev[j] = ixheaacd_round16(timag);
 
@@ -1533,7 +1695,7 @@
     treal = (ixheaacd_shl32_sat(treal, shift));
     *filter_states++ = ixheaacd_round16(treal);
 
-    timag = ixheaacd_negate32(ixheaacd_add32_sat(i2, r2));
+    timag = ixheaacd_negate32_sat(ixheaacd_add32_sat(i2, r2));
     timag = (ixheaacd_shl32_sat(timag, shift));
     *filter_states_rev++ = ixheaacd_round16(timag);
   }
@@ -1583,9 +1745,6 @@
 
   WORD32 mul_1, mul_2, mul_3, mul_4, mul_5, mul_6;
   WORD32 mul_7, mul_8, mul_9, mul_10, mul_11, mul_12;
-  WORD32 *x_l1;
-  WORD32 *x_l2;
-  WORD32 *x_h2;
   const WORD16 *w_ptr = w;
   WORD32 i1;
 
@@ -1593,10 +1752,6 @@
   l1 = index << 2;
   l2 = (index << 2) + (index << 1);
 
-  x_l1 = &(x[l1]);
-  x_l2 = &(x[l2]);
-  x_h2 = &(x[h2]);
-
   fft_jmp = 6 * (index);
 
   for (i1 = 0; i1 < index1; i1++) {
@@ -1685,7 +1840,6 @@
   WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
   WORD32 n00, n10, n20, n30, n01, n11, n21, n31;
   WORD32 n02, n12, n22, n32, n03, n13, n23, n33;
-  WORD32 n0, j0;
   WORD32 *x2, *x0;
   WORD32 *y0, *y1, *y2, *y3;
 
@@ -1697,9 +1851,6 @@
   y1 = y0 + (WORD32)(npoints >> 1);
   y3 = y2 + (WORD32)(npoints >> 1);
 
-  j0 = 4;
-  n0 = npoints >> 2;
-
   for (k = 0; k < 2; k++) {
     for (i = 0; i<npoints>> 1; i += 8) {
       h2 = *p_dig_rev_tbl++ >> 2;
@@ -1789,7 +1940,6 @@
   WORD32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
   WORD32 n00, n10, n20, n30, n01, n11, n21, n31;
   WORD32 n02, n12, n22, n32, n03, n13, n23, n33;
-  WORD32 n0, j0;
   WORD32 *x2, *x0;
   WORD32 *y0, *y1, *y2, *y3;
 
@@ -1800,8 +1950,6 @@
 
   y1 = y0 + (WORD32)(npoints >> 2);
   y3 = y2 + (WORD32)(npoints >> 2);
-  j0 = 8;
-  n0 = npoints >> 1;
 
   for (k = 0; k < 2; k++) {
     for (i = 0; i<npoints>> 1; i += 8) {
diff --git a/decoder/ixheaacd_Windowing.c b/decoder/ixheaacd_Windowing.c
index bf384b4..806d93f 100644
--- a/decoder/ixheaacd_Windowing.c
+++ b/decoder/ixheaacd_Windowing.c
@@ -26,7 +26,7 @@
 
 #include "ixheaacd_windows.h"
 
-WORD32 ixheaacd_calc_window(WORD32 **win, WORD32 win_sz, WORD32 win_sel) {
+WORD32 ixheaacd_calc_window(WORD32 **win, WORD32 win_sz, WORD32 win_sel, WORD32 ec_flag) {
   switch (win_sel) {
     case WIN_SEL_0:
       switch (win_sz) {
@@ -51,7 +51,12 @@
         case WIN_LEN_256:
           *win = (WORD32 *)ixheaacd_sine_win_256;
           break;
-        default:;
+        default:
+          if (ec_flag)
+            *win = (WORD32 *)ixheaacd_sine_win_1024;
+          else
+            return -1;
+          break;
       }
       break;
 
@@ -91,7 +96,10 @@
           *win = (WORD32 *)ixheaacd_kbd_win48;
           break;
         default:
-          return -1;
+          if (ec_flag)
+            *win = (WORD32 *)ixheaacd_kbd_win1024;
+          else
+            return -1;
           break;
       }
       break;
diff --git a/decoder/ixheaacd_aac_config.h b/decoder/ixheaacd_aac_config.h
index c57db29..fd307cc 100644
--- a/decoder/ixheaacd_aac_config.h
+++ b/decoder/ixheaacd_aac_config.h
@@ -20,46 +20,88 @@
 #ifndef IXHEAACD_AAC_CONFIG_H
 #define IXHEAACD_AAC_CONFIG_H
 
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ 0x0000
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ 0x0001
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS 0x0002
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK 0x0003
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE 0x0004
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE 0x0005
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE 0x0006
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS 0x0007
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM 0x0008
+#define IA_XHEAAC_DEC_CONFIG_PARAM_PCM_WDSZ 0x0000
+#define IA_XHEAAC_DEC_CONFIG_PARAM_SAMP_FREQ 0x0001
+#define IA_XHEAAC_DEC_CONFIG_PARAM_NUM_CHANNELS 0x0002
+#define IA_XHEAAC_DEC_CONFIG_PARAM_CHANNEL_MASK 0x0003
+#define IA_XHEAAC_DEC_CONFIG_PARAM_CHANNEL_MODE 0x0004
+#define IA_XHEAAC_DEC_CONFIG_PARAM_SBR_MODE 0x0005
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE 0x0006
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS 0x0007
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUD_NORM 0x0008
 
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX 0x0009
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_OUT08KHZ 0x000A
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_OUT16KHZ 0x000B
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_TOSTEREO 0x000C
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DSAMPLE 0x000D
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_FRAMEOK 0x000E
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISMP4 0x000F
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_MAX_CHANNEL 0x0010
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_COUP_CHANNEL 0x0011
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX_STEREO 0x0012
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DISABLE_SYNC 0x0013
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE 0x0014
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISLOAS 0x0015
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_ENABLE 0x0016
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT 0x0017
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST 0x0018
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL 0x0019
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP 0x001A
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_FRAMESIZE 0x001B
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_ELD_SBR_PRESENT 0x001C
-#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_LD_TESTING 0x001D
-
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX 0x0009
+#define IA_XHEAAC_DEC_CONFIG_PARAM_TOSTEREO 0x000A
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DSAMPLE 0x000B
+#define IA_XHEAAC_DEC_CONFIG_PARAM_MP4FLAG 0x000C
+#define IA_XHEAAC_DEC_CONFIG_PARAM_MAX_CHANNEL 0x000D
+#define IA_XHEAAC_DEC_CONFIG_PARAM_COUP_CHANNEL 0x000E
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX_STEREO 0x000F
+#define IA_XHEAAC_DEC_CONFIG_DISABLE_SYNC 0x0010
+#define IA_XHEAAC_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE 0x0011
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DRC_CUT 0x0012
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DRC_BOOST 0x0013
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL 0x0014
+#define IA_XHEAAC_DEC_CONFIG_PARAM_DRC_HEAVY_COMP 0x0015
+#define IA_XHEAAC_DEC_CONFIG_PARAM_FRAMESIZE 0x0016
+#define IA_XHEAAC_DEC_CONFIG_PARAM_LD_TESTING 0x0017
+#define IA_XHEAAC_DEC_CONFIG_PARAM_HQ_ESBR 0x0018
+#define IA_XHEAAC_DEC_CONFIG_PARAM_PS_ENABLE 0x0019
+#define IA_XHEAAC_DEC_CONFIG_PARAM_AOT 0x001A
+#define IA_XHEAAC_DEC_CONFIG_PARAM_PEAK_LIMITER 0x001B
+#define IA_XHEAAC_DEC_CONFIG_PARAM_FRAMELENGTH_FLAG 0x001C
+#define IA_XHEAAC_DEC_CONFIG_ERROR_CONCEALMENT 0x001D
 #define IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR 0x001E
 #define IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_BUF_SIZES 0x001F
 #define IA_ENHAACPLUS_DEC_CONFIG_NUM_ELE 0x0020
 #define IA_ENHAACPLUS_DEC_CONFIG_NUM_CONFIG_EXT 0x0021
 #define IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_LEN 0x0022
 #define IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF 0x0023
-#define IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE 0x0024
-#define IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS 0x0025
-#define IA_ENHAACPLUS_DEC_CONFIG_GET_NUM_PRE_ROLL_FRAMES 0x0026
+
+#define IA_ENHAACPLUS_DEC_CONFIG_GET_NUM_PRE_ROLL_FRAMES 0x0024
+
+#define IA_ENHAACPLUS_DEC_DRC_IS_CONFIG_CHANGED 0x0025
+#define IA_ENHAACPLUS_DEC_DRC_APPLY_CROSSFADE 0x0026
+
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ IA_XHEAAC_DEC_CONFIG_PARAM_PCM_WDSZ
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ IA_XHEAAC_DEC_CONFIG_PARAM_SAMP_FREQ
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS IA_XHEAAC_DEC_CONFIG_PARAM_NUM_CHANNELS
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK IA_XHEAAC_DEC_CONFIG_PARAM_CHANNEL_MASK
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE IA_XHEAAC_DEC_CONFIG_PARAM_CHANNEL_MODE
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE IA_XHEAAC_DEC_CONFIG_PARAM_SBR_MODE
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE \
+        IA_XHEAAC_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS \
+        IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUD_NORM
+
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_TOSTEREO IA_XHEAAC_DEC_CONFIG_PARAM_TOSTEREO
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DSAMPLE IA_XHEAAC_DEC_CONFIG_PARAM_DSAMPLE
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISMP4 IA_XHEAAC_DEC_CONFIG_PARAM_MP4FLAG
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_MAX_CHANNEL IA_XHEAAC_DEC_CONFIG_PARAM_MAX_CHANNEL
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_COUP_CHANNEL IA_XHEAAC_DEC_CONFIG_PARAM_COUP_CHANNEL
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX_STEREO IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX_STEREO
+#define IA_ENHAACPLUS_DEC_CONFIG_DISABLE_SYNC IA_XHEAAC_DEC_CONFIG_DISABLE_SYNC
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE \
+        IA_XHEAAC_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT IA_XHEAAC_DEC_CONFIG_PARAM_DRC_CUT
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST IA_XHEAAC_DEC_CONFIG_PARAM_DRC_BOOST
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL \
+        IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP IA_XHEAAC_DEC_CONFIG_PARAM_DRC_HEAVY_COMP
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_FRAMESIZE IA_XHEAAC_DEC_CONFIG_PARAM_FRAMESIZE
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_LD_TESTING IA_XHEAAC_DEC_CONFIG_PARAM_LD_TESTING
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_HQ_ESBR IA_XHEAAC_DEC_CONFIG_PARAM_HQ_ESBR
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_PS_ENABLE IA_XHEAAC_DEC_CONFIG_PARAM_PS_ENABLE
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_AOT IA_XHEAAC_DEC_CONFIG_PARAM_AOT
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_PEAK_LIMITER IA_XHEAAC_DEC_CONFIG_PARAM_PEAK_LIMITER
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_FRAMELENGTH_FLAG \
+        IA_XHEAAC_DEC_CONFIG_PARAM_FRAMELENGTH_FLAG
+
+#define IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE IA_XHEAAC_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE
+#define IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS
+
+#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_ENABLE 0x0027
 
 #endif /* IXHEAACD_AAC_CONFIG_H */
diff --git a/decoder/ixheaacd_aac_ec.c b/decoder/ixheaacd_aac_ec.c
new file mode 100644
index 0000000..469d062
--- /dev/null
+++ b/decoder/ixheaacd_aac_ec.c
@@ -0,0 +1,457 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_basic_ops.h"
+#include "ixheaacd_sbr_common.h"
+#include "ixheaacd_error_standards.h"
+
+#include <ixheaacd_cnst.h>
+#include "ixheaacd_constants.h"
+#include "ixheaacd_intrinsics.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_defines.h"
+
+#include "ixheaacd_pns.h"
+
+#include <ixheaacd_aac_rom.h>
+#include "ixheaacd_pulsedata.h"
+
+#include "ixheaacd_drc_data_struct.h"
+
+#include "ixheaacd_interface.h"
+#include "ixheaacd_info.h"
+#include "ixheaacd_lt_predict.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_rom.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_error_standards.h"
+
+#include "ixheaacd_aac_rom.h"
+
+static WORD32 ixheaacd_aac_ec_get_win_seq(WORD32 prev_win_seq) {
+  WORD32 new_win_seq = ONLY_LONG_SEQUENCE;
+
+  if (prev_win_seq == LONG_START_SEQUENCE || prev_win_seq == EIGHT_SHORT_SEQUENCE) {
+    new_win_seq = LONG_STOP_SEQUENCE;
+  }
+
+  return new_win_seq;
+}
+
+static VOID ixheaacd_aac_ec_flip_spec_sign(WORD32 *ptr_spec_coeff, WORD32 num_samples) {
+  WORD32 idx;
+  WORD32 random_value;
+
+  for (idx = 0; idx < num_samples; idx++) {
+    random_value = ptr_spec_coeff[idx] ^ idx;
+    if ((random_value & 1) == 0) {
+      ptr_spec_coeff[idx] = ixheaacd_negate32_sat(ptr_spec_coeff[idx]);
+    }
+  }
+}
+
+static VOID ixheaacd_aac_ec_store(ia_ec_state_str *pstr_ec_state,
+                                  ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info,
+                                  ia_ics_info_struct *pstr_ics_info) {
+  WORD32 *ptr_spec_coeff = pstr_aac_dec_channel_info->ptr_spec_coeff;
+  WORD16 *ptr_spec_scale = pstr_aac_dec_channel_info->ptr_scale_factor;
+  UWORD8 win_shape = pstr_ec_state->win_shape;
+  WORD32 win_seq = pstr_ec_state->win_seq;
+  WORD16 q_spec_scale[MAX_SPEC_SCALE_LEN];
+  WORD32 *ptr_temp_spec_coeff = &pstr_ec_state->str_ec_scratch.spec_coeff[0];
+
+  memcpy(q_spec_scale, pstr_ec_state->q_spec_coeff, sizeof(q_spec_scale));
+
+  pstr_ec_state->win_seq = pstr_ics_info->window_sequence;
+  pstr_ec_state->win_shape = (UWORD8)pstr_ics_info->window_shape;
+  pstr_ec_state->prev_win_group_len =
+      *(pstr_ics_info->window_group_length + pstr_ics_info->num_window_groups - 1);
+
+  memcpy(pstr_ec_state->q_spec_coeff, ptr_spec_scale, sizeof(pstr_ec_state->q_spec_coeff));
+
+  memcpy(ptr_temp_spec_coeff, ptr_spec_coeff, LEN_SUPERFRAME * sizeof(ptr_temp_spec_coeff[0]));
+  memcpy(ptr_spec_coeff, pstr_ec_state->spectral_coeff,
+         LEN_SUPERFRAME * sizeof(ptr_spec_coeff[0]));
+  memcpy(pstr_ec_state->spectral_coeff, ptr_temp_spec_coeff,
+         sizeof(pstr_ec_state->spectral_coeff));
+  pstr_ics_info->window_sequence = win_seq;
+  pstr_ics_info->window_shape = win_shape;
+
+  memcpy(ptr_spec_scale, q_spec_scale, MAX_SPEC_SCALE_LEN * sizeof(ptr_spec_scale[0]));
+}
+
+static VOID ixheaacd_aac_ec_calc_sfb_nrg(WORD32 *ptr_spec_coeff,
+                                         const ia_usac_samp_rate_info *pstr_samp_rate_info,
+                                         const WORD32 win_seq, WORD32 win_trans,
+                                         WORD32 *ptr_sfb_energy) {
+  const WORD16 *ptr_sfb_offset;
+  WORD32 line = 0, sfb, total_scale_factor_bands = 0;
+
+  switch (win_seq) {
+    case EIGHT_SHORT_SEQUENCE:
+
+      if (win_trans == NO_TRANSITION) {
+        total_scale_factor_bands = pstr_samp_rate_info->num_sfb_128 - 1;
+        ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_128;
+
+        for (sfb = 0; sfb < total_scale_factor_bands; sfb++) {
+          WORD32 accu = 1;
+          WORD32 q_nrg;
+          if (sfb == 0) {
+            q_nrg = (sizeof(accu) << 3) - ixheaacd_norm32(ptr_sfb_offset[sfb] - 0);
+            for (; line < ptr_sfb_offset[sfb]; line++) {
+              accu += ixheaacd_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg;
+            }
+            ptr_sfb_energy[sfb] = ixheaacd_norm32(accu);
+          }
+          q_nrg = (sizeof(accu) << 3) -
+                  ixheaacd_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
+          for (; line < ptr_sfb_offset[sfb + 1]; line++) {
+            accu += ixheaacd_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg;
+          }
+          ptr_sfb_energy[sfb] = ixheaacd_norm32(accu);
+        }
+      } else {
+        total_scale_factor_bands = pstr_samp_rate_info->num_sfb_1024 - 1;
+        ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_1024;
+
+        for (sfb = 0; sfb < total_scale_factor_bands; sfb++) {
+          WORD32 accu = 1;
+          WORD32 q_nrg;
+          if (sfb == 0) {
+            q_nrg = (sizeof(accu) << 3) - ixheaacd_norm32(ptr_sfb_offset[sfb] - 0);
+            for (; line < ptr_sfb_offset[sfb]; line++) {
+              accu +=
+                  ixheaacd_mult32(ptr_spec_coeff[line >> 3], ptr_spec_coeff[line >> 3]) >> q_nrg;
+            }
+            ptr_sfb_energy[sfb] = ixheaacd_norm32(accu);
+          }
+          q_nrg = (sizeof(accu) << 3) -
+                  ixheaacd_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
+          for (; line < ptr_sfb_offset[sfb + 1]; line++) {
+            accu +=
+                ixheaacd_mult32(ptr_spec_coeff[line >> 3], ptr_spec_coeff[line >> 3]) >> q_nrg;
+          }
+          ptr_sfb_energy[sfb] = ixheaacd_norm32(accu);
+        }
+      }
+      break;
+
+    case ONLY_LONG_SEQUENCE:
+    case LONG_START_SEQUENCE:
+    case LONG_STOP_SEQUENCE:
+
+      if (win_trans == NO_TRANSITION) {
+        total_scale_factor_bands = pstr_samp_rate_info->num_sfb_1024 - 1;
+        ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_1024;
+
+        for (sfb = 0; sfb < total_scale_factor_bands; sfb++) {
+          WORD32 accu = 1;
+          WORD32 q_nrg;
+          if (sfb == 0) {
+            q_nrg = (sizeof(accu) << 3) - ixheaacd_norm32(ptr_sfb_offset[sfb] - 0);
+            for (; line < ptr_sfb_offset[sfb]; line++) {
+              accu += ixheaacd_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg;
+            }
+            ptr_sfb_energy[sfb] = ixheaacd_norm32(accu);
+          }
+          q_nrg = (sizeof(accu) << 3) -
+                  ixheaacd_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
+          for (; line < ptr_sfb_offset[sfb + 1]; line++) {
+            accu += ixheaacd_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg;
+          }
+          ptr_sfb_energy[sfb] = ixheaacd_norm32(accu);
+        }
+      } else {
+        total_scale_factor_bands = pstr_samp_rate_info->num_sfb_128 - 1;
+        ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_128;
+
+        for (sfb = 0; sfb < total_scale_factor_bands; sfb++) {
+          WORD32 accu = 1;
+          WORD32 q_nrg;
+          if (sfb == 0) {
+            q_nrg = (sizeof(accu) << 3) - ixheaacd_norm32(ptr_sfb_offset[sfb] - 0);
+            for (; line < ptr_sfb_offset[sfb] << 3; line++) {
+              accu += (accu +
+                       (ixheaacd_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg)) >>
+                      3;
+            }
+            ptr_sfb_energy[sfb] = ixheaacd_norm32(accu);
+          }
+          q_nrg = (sizeof(accu) << 3) -
+                  ixheaacd_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
+          for (; line < ptr_sfb_offset[sfb + 1] << 3; line++) {
+            accu +=
+                (accu + (ixheaacd_mult32(ptr_spec_coeff[line], ptr_spec_coeff[line]) >> q_nrg)) >>
+                3;
+          }
+          ptr_sfb_energy[sfb] = ixheaacd_norm32(accu);
+        }
+      }
+      break;
+  }
+}
+
+static VOID ixheaacd_aac_ec_interpolate(WORD32 *ptr_spec_coeff, WORD16 *ptr_spec_scale_prev,
+                                        WORD16 *ptr_spec_scale_act, WORD16 *ptr_spec_scale_out,
+                                        WORD32 *nrg_prev, WORD32 *nrg_act, WORD32 num_sfb,
+                                        const WORD16 *ptr_sfb_offset) {
+  WORD32 sfb, line = 0;
+  WORD32 fac_shift;
+  WORD32 fac_mod;
+
+  for (sfb = 0; sfb < num_sfb; sfb++) {
+    fac_shift =
+        nrg_prev[sfb] - nrg_act[sfb] + ((*ptr_spec_scale_act - *ptr_spec_scale_prev) << 1);
+    fac_mod = fac_shift & 3;
+    fac_shift = (fac_shift >> 2) + 1;
+    fac_shift += *ptr_spec_scale_prev - max(*ptr_spec_scale_prev, *ptr_spec_scale_act);
+    fac_shift = max(min(fac_shift, INT_BITS - 1), -(INT_BITS - 1));
+
+    for (; line < ptr_sfb_offset[sfb]; line++) {
+      WORD32 accu =
+          ixheaacd_mult32x16in32_shl(ptr_spec_coeff[line], ia_ec_interpolation_fac[fac_mod]);
+      ptr_spec_coeff[line] = ixheaacd_shl32_dir_sat(accu, fac_shift);
+    }
+  }
+  *ptr_spec_scale_out = max(*ptr_spec_scale_prev, *ptr_spec_scale_act);
+}
+
+static VOID ixheaacd_aac_ec_state(ia_ec_state_str *pstr_ec_state, WORD32 frame_status) {
+  WORD32 ec_state_val = (pstr_ec_state->prev_frame_ok[0] << 2) +
+                        (pstr_ec_state->prev_frame_ok[1] << 1) + (frame_status);
+
+  switch (ec_state_val) {
+    case 0:
+    case 4:
+      if (pstr_ec_state->fade_idx < MAX_FADE_FRAMES) {
+        pstr_ec_state->fade_idx++;
+      }
+      pstr_ec_state->conceal_state = FRAME_CONCEAL_SINGLE;
+      break;
+    case 1:
+    case 2:
+      if (pstr_ec_state->fade_idx > 0) {
+        pstr_ec_state->fade_idx--;
+      }
+      pstr_ec_state->conceal_state = FRAME_FADE;
+      break;
+    case 5:
+      if (pstr_ec_state->fade_idx > 0) {
+        pstr_ec_state->fade_idx--;
+      }
+      pstr_ec_state->conceal_state = FRAME_OKAY;
+      break;
+      break;
+    case 3:
+    case 6:
+    case 7:
+      if (pstr_ec_state->fade_idx > 0) {
+        pstr_ec_state->fade_idx--;
+      }
+      pstr_ec_state->conceal_state = FRAME_OKAY;
+      break;
+    default:
+      pstr_ec_state->conceal_state = FRAME_OKAY;
+  }
+  if (pstr_ec_state->fade_idx > MAX_FADE_FRAMES) {
+    pstr_ec_state->fade_idx = MAX_FADE_FRAMES;
+  }
+  if (pstr_ec_state->fade_idx == MAX_FADE_FRAMES) {
+    pstr_ec_state->conceal_state = FRAME_MUTE;
+  }
+  if (pstr_ec_state->fade_idx < 0) {
+    pstr_ec_state->fade_idx = 0;
+  }
+}
+
+static VOID ixheaacd_aac_ec_interpolate_frame(
+    ia_ec_state_str *pstr_ec_state, ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info,
+    const ia_usac_samp_rate_info *pstr_samp_rate_info, const WORD32 num_samples,
+    const WORD32 frame_status, ia_ics_info_struct *pstr_ics_info) {
+  WORD32 *ptr_spec_coeff = pstr_aac_dec_channel_info->ptr_spec_coeff;
+  WORD16 *ptr_spec_scale = pstr_aac_dec_channel_info->ptr_scale_factor;
+
+  WORD32 sfb_nrg_prev[WIN_LEN_64];
+  WORD32 sfb_nrg_act[WIN_LEN_64];
+
+  WORD32 idx;
+
+  memset(sfb_nrg_prev, 0, sizeof(sfb_nrg_prev));
+  memset(sfb_nrg_act, 0, sizeof(sfb_nrg_act));
+
+  if (!frame_status) {
+    pstr_ics_info->window_shape = pstr_ec_state->win_shape;
+    pstr_ics_info->window_sequence = pstr_ec_state->win_seq;
+
+    for (idx = 0; idx < num_samples; idx++) {
+      ptr_spec_coeff[idx] = pstr_ec_state->spectral_coeff[idx];
+    }
+
+    memcpy(ptr_spec_scale, pstr_ec_state->q_spec_coeff, 8 * sizeof(ptr_spec_scale[0]));
+  }
+
+  if (!pstr_ec_state->prev_frame_ok[1]) {
+    if (frame_status && pstr_ec_state->prev_frame_ok[0]) {
+      if (pstr_ics_info->window_sequence == EIGHT_SHORT_SEQUENCE) {
+        WORD32 window;
+        if (pstr_ec_state->win_seq == EIGHT_SHORT_SEQUENCE) {
+          WORD32 total_scale_factor_bands = pstr_samp_rate_info->num_sfb_128 - 1;
+          const WORD16 *ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_128;
+          pstr_ics_info->window_shape = 1;
+          pstr_ics_info->window_sequence = EIGHT_SHORT_SEQUENCE;
+
+          for (window = 0; window < 8; window++) {
+            ixheaacd_aac_ec_calc_sfb_nrg(&ptr_spec_coeff[window * (num_samples / 8)],
+                                         pstr_samp_rate_info, EIGHT_SHORT_SEQUENCE, NO_TRANSITION,
+                                         sfb_nrg_prev);
+
+            ixheaacd_aac_ec_calc_sfb_nrg(
+                &pstr_ec_state->spectral_coeff[window * (num_samples / 8)], pstr_samp_rate_info,
+                EIGHT_SHORT_SEQUENCE, NO_TRANSITION, sfb_nrg_act);
+
+            ixheaacd_aac_ec_interpolate(
+                &ptr_spec_coeff[window * (num_samples / 8)], &ptr_spec_scale[window],
+                &pstr_ec_state->q_spec_coeff[window], &ptr_spec_scale[window], sfb_nrg_prev,
+                sfb_nrg_act, total_scale_factor_bands, ptr_sfb_offset);
+          }
+        } else {
+          WORD32 total_scale_factor_bands = pstr_samp_rate_info->num_sfb_1024 - 1;
+          const WORD16 *ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_1024;
+          WORD16 spec_scale_out;
+
+          ixheaacd_aac_ec_calc_sfb_nrg(&ptr_spec_coeff[num_samples - (num_samples / 8)],
+                                       pstr_samp_rate_info, EIGHT_SHORT_SEQUENCE,
+                                       TRANS_SHORT_LONG, sfb_nrg_act);
+
+          ixheaacd_aac_ec_calc_sfb_nrg(pstr_ec_state->spectral_coeff, pstr_samp_rate_info,
+                                       ONLY_LONG_SEQUENCE, NO_TRANSITION, sfb_nrg_prev);
+
+          pstr_ics_info->window_shape = 0;
+          pstr_ics_info->window_sequence = LONG_STOP_SEQUENCE;
+
+          for (idx = 0; idx < num_samples; idx++) {
+            ptr_spec_coeff[idx] = pstr_ec_state->spectral_coeff[idx];
+          }
+
+          for (idx = 0; idx < 8; idx++) {
+            if (ptr_spec_scale[idx] > ptr_spec_scale[0]) {
+              ptr_spec_scale[0] = ptr_spec_scale[idx];
+            }
+          }
+
+          ixheaacd_aac_ec_interpolate(ptr_spec_coeff, &pstr_ec_state->q_spec_coeff[0],
+                                      &ptr_spec_scale[0], &spec_scale_out, sfb_nrg_prev,
+                                      sfb_nrg_act, total_scale_factor_bands, ptr_sfb_offset);
+
+          ptr_spec_scale[0] = spec_scale_out;
+        }
+      } else {
+        WORD32 total_scale_factor_bands = pstr_samp_rate_info->num_sfb_1024 - 1;
+        const WORD16 *ptr_sfb_offset = pstr_samp_rate_info->ptr_sfb_1024;
+        WORD16 spec_scale_act = pstr_ec_state->q_spec_coeff[0];
+
+        ixheaacd_aac_ec_calc_sfb_nrg(ptr_spec_coeff, pstr_samp_rate_info, ONLY_LONG_SEQUENCE,
+                                     NO_TRANSITION, sfb_nrg_prev);
+
+        if (pstr_ec_state->win_seq == EIGHT_SHORT_SEQUENCE) {
+          pstr_ics_info->window_shape = 1;
+          pstr_ics_info->window_sequence = LONG_START_SEQUENCE;
+
+          for (idx = 1; idx < 8; idx++) {
+            if (pstr_ec_state->q_spec_coeff[idx] > spec_scale_act) {
+              spec_scale_act = pstr_ec_state->q_spec_coeff[idx];
+            }
+          }
+
+          ixheaacd_aac_ec_calc_sfb_nrg(pstr_ec_state->spectral_coeff, pstr_samp_rate_info,
+                                       EIGHT_SHORT_SEQUENCE, TRANS_SHORT_LONG, sfb_nrg_act);
+        } else {
+          pstr_ics_info->window_shape = 0;
+          pstr_ics_info->window_sequence = ONLY_LONG_SEQUENCE;
+
+          ixheaacd_aac_ec_calc_sfb_nrg(pstr_ec_state->spectral_coeff, pstr_samp_rate_info,
+                                       ONLY_LONG_SEQUENCE, NO_TRANSITION, sfb_nrg_act);
+        }
+
+        ixheaacd_aac_ec_interpolate(ptr_spec_coeff, &ptr_spec_scale[0], &spec_scale_act,
+                                    &ptr_spec_scale[0], sfb_nrg_prev, sfb_nrg_act,
+                                    total_scale_factor_bands, ptr_sfb_offset);
+      }
+    }
+
+    ixheaacd_aac_ec_flip_spec_sign(ptr_spec_coeff, num_samples);
+  }
+
+  if (FRAME_MUTE == pstr_ec_state->conceal_state) {
+    pstr_ics_info->window_shape = pstr_ec_state->win_shape;
+    pstr_ics_info->window_sequence = ixheaacd_aac_ec_get_win_seq(pstr_ec_state->win_seq);
+    pstr_ec_state->win_seq = pstr_ics_info->window_sequence;
+    memset(ptr_spec_coeff, 0, num_samples * sizeof(ptr_spec_coeff[0]));
+  }
+}
+
+VOID ixheaacd_aac_ec_init(ia_ec_state_str *pstr_ec_state) {
+  pstr_ec_state->win_shape = CONCEAL_NOT_DEFINED;
+  pstr_ec_state->win_seq = ONLY_LONG_SEQUENCE;
+  pstr_ec_state->prev_win_group_len = 1;
+
+  pstr_ec_state->conceal_state = FRAME_OKAY;
+
+  memset(pstr_ec_state->spectral_coeff, 0, sizeof(pstr_ec_state->spectral_coeff));
+  memset(pstr_ec_state->q_spec_coeff, 0, sizeof(pstr_ec_state->q_spec_coeff));
+
+  pstr_ec_state->prev_frame_ok[0] = 1;
+  pstr_ec_state->prev_frame_ok[1] = 1;
+  pstr_ec_state->fade_idx = 0;
+}
+
+VOID ixheaacd_aac_apply_ec(ia_ec_state_str *pstr_ec_state,
+                           ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info,
+                           const ia_usac_samp_rate_info *pstr_samp_rate_info,
+                           const WORD32 num_samples, ia_ics_info_struct *pstr_ics_info,
+                           const WORD32 frame_status) {
+  if (pstr_ec_state->win_shape == CONCEAL_NOT_DEFINED) {
+    pstr_ec_state->win_shape = (UWORD8)pstr_ics_info->window_shape;
+  }
+
+  if (frame_status && pstr_ec_state->prev_frame_ok[1]) {
+    ixheaacd_aac_ec_store(pstr_ec_state, pstr_aac_dec_channel_info, pstr_ics_info);
+  }
+
+  ixheaacd_aac_ec_state(pstr_ec_state, frame_status);
+
+  ixheaacd_aac_ec_interpolate_frame(pstr_ec_state, pstr_aac_dec_channel_info, pstr_samp_rate_info,
+                                    num_samples, frame_status, pstr_ics_info);
+
+  pstr_ec_state->prev_frame_ok[0] = pstr_ec_state->prev_frame_ok[1];
+  pstr_ec_state->prev_frame_ok[1] = frame_status;
+}
diff --git a/decoder/ixheaacd_aac_imdct.c b/decoder/ixheaacd_aac_imdct.c
index 43f2025..b52e8c5 100644
--- a/decoder/ixheaacd_aac_imdct.c
+++ b/decoder/ixheaacd_aac_imdct.c
@@ -51,48 +51,32 @@
 
 #define MPYHIRC(x, y)                                                         \
                                                                               \
-  (((WORD32)((short)(x >> 16) * (unsigned short)(y & 0x0000FFFF) + 0x4000) >> \
+  (((WORD32)((WORD16)(x >> 16) * (UWORD16)(y & 0x0000FFFF) + 0x4000) >>       \
     15) +                                                                     \
-   ((WORD32)((short)(x >> 16) * (short)((y) >> 16)) << 1))
+   ((WORD32)((WORD16)(x >> 16) * (WORD16)((y) >> 16)) << 1))
 
 #define MPYLUHS(x, y) \
-  ((WORD32)((unsigned short)(x & 0x0000FFFF) * (short)(y >> 16)))
+  ((WORD32)((UWORD16)(x & 0x0000FFFF) * (WORD16)(y >> 16)))
+
+#define MPYLIRC(x, y) \
+  (((WORD32)((WORD16)(x) * (UWORD16)(y & 0x0000FFFF) + 0x4000) >> 15)+ \
+((WORD32)((WORD16)(x) * (WORD16)((y) >> 16)) << 1))
+
+WORD32 rev_dig[] = { 0, 8, 2, 10 };
 
 #define MDCT_LEN 480
 #define FFT15X2 30
 #define MDCT_LEN_BY2 240
 #define FFT5 5
 #define FFT16 16
+#define FFT4 4
+#define FFT3 3
 #define FFT15 15
 #define FFT16X2 32
+#define MDCT_LEN_960 960
 
 WORD32 ixheaacd_fft5out[FFT15X2];
 
-static PLATFORM_INLINE WORD32 ixheaacd_shr32_drc(WORD32 a, WORD32 b) {
-  WORD32 out_val;
-
-  b = ((UWORD32)(b << 24) >> 24);
-  if (b >= 31) {
-    if (a < 0)
-      out_val = -1;
-    else
-      out_val = 0;
-  } else {
-    a = ixheaacd_add32_sat(a, (1 << (b - 1)));
-    out_val = (WORD32)a >> b;
-  }
-
-  return out_val;
-}
-
-static PLATFORM_INLINE WORD32 ixheaacd_mult32x16hin32_drc(WORD32 a, WORD32 b) {
-  WORD32 result;
-  WORD64 temp_result;
-  temp_result = (WORD64)a * (WORD64)(b >> 16);
-  result = (WORD32)(temp_result >> 16);
-  return (result);
-}
-
 static PLATFORM_INLINE WORD32 ixheaacd_mult32x16lin32(WORD32 a, WORD32 b) {
   WORD32 result;
   WORD64 temp_result;
@@ -108,7 +92,7 @@
   return (result);
 }
 
-static PLATFORM_INLINE WORD32 ixheaacd_mult32x16lin32_drc(WORD32 a, WORD32 b) {
+static PLATFORM_INLINE WORD32 ixheaacd_mult32x16lin32_sat(WORD32 a, WORD32 b) {
   WORD32 result;
   WORD64 temp_result;
   temp_result = (WORD64)a * (WORD64)(((b & 0xFFFF) << 16) >> 16);
@@ -125,6 +109,59 @@
 
 WORD16 ixheaacd_neg_expo_inc_arm(WORD16 neg_expo) { return (neg_expo + 3); }
 
+VOID ixheaacd_pretwiddle_compute_960_dec(
+    WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
+    ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
+    WORD32 neg_expo) {
+
+  WORD32 i;
+  WORD32 tempr, tempi;
+
+  WORD16 c, c1, s, s1;
+  WORD32 *out_ptr1 = out_ptr + ((npoints4 << 2) - 1);
+  const WORD16 *cos_sin_ptr = ptr_imdct_tables->cosine_array_240;
+
+  for (i = 0; i < npoints4; i++) {
+    c = *cos_sin_ptr++;
+    s = *cos_sin_ptr++;
+
+    tempr = *spec_data1++;
+    tempi = *spec_data2--;
+
+    *out_ptr =
+        ixheaacd_mac32x16in32(ixheaacd_mult32x16in32(tempr, c), tempi, s);
+
+
+    *out_ptr = ixheaacd_shl32(*out_ptr, neg_expo);
+    out_ptr++;
+
+    *out_ptr = ixheaacd_sub32(ixheaacd_mult32x16in32(tempi, c),
+                              ixheaacd_mult32x16in32(tempr, s));
+
+    *out_ptr = ixheaacd_shl32(*out_ptr, neg_expo);
+    out_ptr++;
+
+    c1 = *cos_sin_ptr++;
+    s1 = *cos_sin_ptr++;
+
+    tempi = *spec_data1++;
+    tempr = *spec_data2--;
+
+
+    *out_ptr1 = ixheaacd_sub32(ixheaacd_mult32x16in32(tempi, c1),
+                               ixheaacd_mult32x16in32(tempr, s1));
+
+    *out_ptr1 = ixheaacd_shl32(*out_ptr1, neg_expo);
+    out_ptr1--;
+
+    *out_ptr1 =
+        ixheaacd_mac32x16in32(ixheaacd_mult32x16in32(tempr, c1), tempi, s1);
+
+    *out_ptr1 = ixheaacd_shl32(*out_ptr1, neg_expo);
+    out_ptr1--;
+  }
+}
+
 VOID ixheaacd_pretwiddle_compute_dec(
     WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
@@ -467,14 +504,14 @@
 }
 
 VOID ixheaacd_post_twid_overlap_add_dec(
-    WORD16 pcm_out[], WORD32 spec_data[],
+    WORD32 pcm_out[], WORD32 spec_data[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
     WORD16 ch_fac) {
   WORD i;
   WORD16 cos, cos1, sin, sin1;
   WORD32 size = npoints / 2;
-  WORD16 *pcmout1 = pcm_out + (ch_fac * size);
+  WORD32 *pcmout1 = pcm_out + (ch_fac * size);
   const WORD16 *cos_sin_ptr = ptr_imdct_tables->cosine_array_2048_256;
 
   pcm_out = pcmout1 - ch_fac;
@@ -504,23 +541,23 @@
     outr = outr + temp1;
     outi = outi + temp2;
 
-    *ptr_overlap_buf++ = ixheaacd_shr32_drc(outr, 16 - q_shift);
+    *ptr_overlap_buf++ = ixheaacd_shr32_sat(outr, 16 - q_shift);
 
     win1 = *((WORD32 *)window + size - 1);
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outi, win1), q_shift),
-        ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
+        ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
 
-    *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+    *pcm_out = accu;
 
     pcm_out -= ch_fac;
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_sat(
-            ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outi), win1),
+            ixheaacd_mult32x16hin32(ixheaacd_negate32_sat(outi), win1),
             q_shift),
-        ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1)));
+        ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1)));
 
-    *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+    *pcmout1 = accu;
 
     pcmout1 += ch_fac;
 
@@ -544,20 +581,22 @@
 
       overlap_data = *ptr_overlap_buf;
 
-      *ptr_overlap_buf++ = ixheaacd_shr32_drc(outi, 16 - q_shift);
+      *ptr_overlap_buf++ = ixheaacd_shr32_sat(outi, 16 - q_shift);
 
       win1 = *((WORD32 *)window + i);
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outr, win1), q_shift),
-          ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
-      *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+          ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
+
+      *pcm_out = accu;
       pcm_out -= ch_fac;
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_sat(
-              ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1),
+              ixheaacd_mult32x16hin32(ixheaacd_negate32_sat(outr), win1),
               q_shift),
-          ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1));
-      *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+          ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)win1));
+
+      *pcmout1 = accu;
       pcmout1 += ch_fac;
 
       tempr = *(spec_data - i);
@@ -579,20 +618,21 @@
       outr = outr + temp1;
       outi = outi + temp2;
 
-      *ptr_overlap_buf++ = ixheaacd_shr32_drc(outr, 16 - q_shift);
+      *ptr_overlap_buf++ = ixheaacd_shr32_sat(outr, 16 - q_shift);
 
       win1 = *((WORD32 *)window + i + 1);
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outi, win1), q_shift),
-          ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
-      *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+          ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
+
+      *pcm_out = accu;
       pcm_out -= ch_fac;
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_sat(
-              ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outi), win1),
+              ixheaacd_mult32x16hin32(ixheaacd_negate32_sat(outi), win1),
               q_shift),
-          ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1)));
-      *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+          ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1)));
+      *pcmout1 = accu;
       pcmout1 += ch_fac;
     }
     cos1 = *cos_sin_ptr++;
@@ -615,19 +655,21 @@
 
     overlap_data = *ptr_overlap_buf;
 
-    *ptr_overlap_buf++ = ixheaacd_shr32_drc(outi, 16 - q_shift);
+    *ptr_overlap_buf++ = ixheaacd_shr32_sat(outi, 16 - q_shift);
     win1 = *((WORD32 *)window + i);
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_sat(ixheaacd_mult32x16lin32(outr, win1), q_shift),
-        ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
-    *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+        ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
+
+    *pcm_out = accu;
     pcm_out -= ch_fac;
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_sat(
-            ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1),
+            ixheaacd_mult32x16hin32(ixheaacd_negate32_sat(outr), win1),
             q_shift),
-        ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1));
-    *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+        ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)win1));
+
+    *pcmout1 = accu;
     pcmout1 += ch_fac;
   } else {
     q_shift = -q_shift;
@@ -656,23 +698,23 @@
       outr = outr + temp1;
       outi = outi + temp2;
 
-      *ptr_overlap_buf++ = ixheaacd_shr32_drc(outr, 16 + q_shift);
+      *ptr_overlap_buf++ = ixheaacd_shr32_sat(outr, 16 + q_shift);
 
       win1 = *((WORD32 *)window + size - 1);
       accu = ixheaacd_sub32_sat(
           ixheaacd_shr32(ixheaacd_mult32x16lin32(outi, win1), q_shift),
-          ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
+          ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
 
-      *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+      *pcm_out = accu;
 
       pcm_out -= ch_fac;
       accu = ixheaacd_sub32_sat(
           ixheaacd_shr32(
-              ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outi), win1),
+              ixheaacd_mult32x16hin32(ixheaacd_negate32_sat(outi), win1),
               q_shift),
-          ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1)));
+          ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1)));
 
-      *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+      *pcmout1 = accu;
       pcmout1 += ch_fac;
 
       for (i = size - 2; i != 0;) {
@@ -694,21 +736,23 @@
         temp2 = ixheaacd_mult32x16in32(outr, adjust);
         outr = outr + temp1;
         outi = outi + temp2;
-        *ptr_overlap_buf++ = ixheaacd_shr32_drc(outi, 16 + q_shift);
+        *ptr_overlap_buf++ = ixheaacd_shr32_sat(outi, 16 + q_shift);
 
         win1 = *((WORD32 *)window + i);
         accu = ixheaacd_sub32_sat(
             ixheaacd_shr32(ixheaacd_mult32x16lin32(outr, win1), q_shift),
-            ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
+            ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
 
-        *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+        *pcm_out = accu;
         pcm_out -= ch_fac;
+
         accu = ixheaacd_sub32_sat(
             ixheaacd_shr32(
-                ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1),
+                ixheaacd_mult32x16hin32(ixheaacd_negate32_sat(outr), win1),
                 q_shift),
-            ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1));
-        *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+            ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)win1));
+
+        *pcmout1 = accu;
         pcmout1 += ch_fac;
 
         tempr = *(spec_data - i);
@@ -728,22 +772,23 @@
         outr = outr + temp1;
         outi = outi + temp2;
 
-        *ptr_overlap_buf++ = ixheaacd_shr32_drc(outr, 16 + q_shift);
+        *ptr_overlap_buf++ = ixheaacd_shr32_sat(outr, 16 + q_shift);
 
         win1 = *((WORD32 *)window + i + 1);
         accu = ixheaacd_sub32_sat(
             ixheaacd_shr32(ixheaacd_mult32x16lin32(outi, win1), q_shift),
-            ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
+            ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
 
-        *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+        *pcm_out = accu;
         pcm_out -= ch_fac;
+
         accu = ixheaacd_sub32_sat(
             ixheaacd_shr32(
-                ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outi), win1),
+                ixheaacd_mult32x16hin32(ixheaacd_negate32_sat(outi), win1),
                 q_shift),
-            ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1)));
+            ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1)));
 
-        *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+        *pcmout1 = accu;
         pcmout1 += ch_fac;
       }
       cos1 = *cos_sin_ptr++;
@@ -766,21 +811,21 @@
       outr = outr + temp1;
       outi = outi + temp2;
 
-      *ptr_overlap_buf++ = ixheaacd_shr32_drc(outi, 16 + q_shift);
+      *ptr_overlap_buf++ = ixheaacd_shr32_sat(outi, 16 + q_shift);
 
       win1 = *((WORD32 *)window + i);
       accu = ixheaacd_sub32_sat(
           ixheaacd_shr32(ixheaacd_mult32x16lin32(outr, win1), q_shift),
-          ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)(win1 >> 16)));
+          ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)(win1 >> 16)));
 
-      *pcm_out = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+      *pcm_out = accu;
       pcm_out -= ch_fac;
       accu = ixheaacd_sub32_sat(
           ixheaacd_shr32(
-              ixheaacd_mult32x16hin32_drc(ixheaacd_negate32(outr), win1),
+              ixheaacd_mult32x16hin32(ixheaacd_negate32_sat(outr), win1),
               q_shift),
-          ixheaacd_mult32x16lin32_drc(overlap_data, (WORD16)win1));
-      *pcmout1 = ixheaacd_round16(ixheaacd_shl32_sat(accu, 2));
+          ixheaacd_mult32x16lin32_sat(overlap_data, (WORD16)win1));
+      *pcmout1 = accu;
       pcmout1 += ch_fac;
     }
   }
@@ -1132,9 +1177,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x2r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x2i, twiddle_val));
+               ixheaacd_mult32x16hin32(x2i, twiddle_val));
         x2i = (ixheaacd_mac32x16lin32(
-                  ixheaacd_mult32x16hin32_drc(x2r, twiddle_val), x2i,
+                  ixheaacd_mult32x16hin32(x2r, twiddle_val), x2i,
                   twiddle_val))
               << 1;
         x2r = tmp << 1;
@@ -1143,9 +1188,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x4r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x4i, twiddle_val));
+               ixheaacd_mult32x16hin32(x4i, twiddle_val));
         x4i = (ixheaacd_mac32x16lin32(
-                  ixheaacd_mult32x16hin32_drc(x4r, twiddle_val), x4i,
+                  ixheaacd_mult32x16hin32(x4r, twiddle_val), x4i,
                   twiddle_val))
               << 1;
         x4r = tmp << 1;
@@ -1154,9 +1199,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x6r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x6i, twiddle_val));
+               ixheaacd_mult32x16hin32(x6i, twiddle_val));
         x6i = (ixheaacd_mac32x16lin32(
-                  ixheaacd_mult32x16hin32_drc(x6r, twiddle_val), x6i,
+                  ixheaacd_mult32x16hin32(x6r, twiddle_val), x6i,
                   twiddle_val))
               << 1;
         x6r = tmp << 1;
@@ -1194,9 +1239,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x1r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x1i, twiddle_val));
+               ixheaacd_mult32x16hin32(x1i, twiddle_val));
         x1i = (ixheaacd_mac32x16lin32(
-                  ixheaacd_mult32x16hin32_drc(x1r, twiddle_val), x1i,
+                  ixheaacd_mult32x16hin32(x1r, twiddle_val), x1i,
                   twiddle_val))
               << 1;
         x1r = tmp << 1;
@@ -1209,9 +1254,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x3r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x3i, twiddle_val));
+               ixheaacd_mult32x16hin32(x3i, twiddle_val));
         x3i = (ixheaacd_mac32x16lin32(
-            ixheaacd_mult32x16hin32_drc(x3r, twiddle_val), x3i, twiddle_val));
+            ixheaacd_mult32x16hin32(x3r, twiddle_val), x3i, twiddle_val));
         x3r = tmp;
 
         x5r = *data;
@@ -1222,9 +1267,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x5r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x5i, twiddle_val));
+               ixheaacd_mult32x16hin32(x5i, twiddle_val));
         x5i = (ixheaacd_mac32x16lin32(
-            ixheaacd_mult32x16hin32_drc(x5r, twiddle_val), x5i, twiddle_val));
+            ixheaacd_mult32x16hin32(x5r, twiddle_val), x5i, twiddle_val));
         x5r = tmp;
 
         x7r = *data;
@@ -1236,9 +1281,9 @@
         twiddles -= 7 * (j >> 3);
 
         tmp = (ixheaacd_mult32x16lin32(x7r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x7i, twiddle_val));
+               ixheaacd_mult32x16hin32(x7i, twiddle_val));
         x7i = (ixheaacd_mac32x16lin32(
-            ixheaacd_mult32x16hin32_drc(x7r, twiddle_val), x7i, twiddle_val));
+            ixheaacd_mult32x16hin32(x7r, twiddle_val), x7i, twiddle_val));
         x7r = tmp;
 
         x1r = x1r + (x5r << 1);
@@ -1368,9 +1413,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x2r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x2i, twiddle_val));
+               ixheaacd_mult32x16hin32(x2i, twiddle_val));
         x2i = (ixheaacd_mac32x16lin32(
-                  ixheaacd_mult32x16hin32_drc(x2r, twiddle_val), x2i,
+                  ixheaacd_mult32x16hin32(x2r, twiddle_val), x2i,
                   twiddle_val))
               << 1;
         x2r = tmp << 1;
@@ -1379,9 +1424,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x4r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x4i, twiddle_val));
+               ixheaacd_mult32x16hin32(x4i, twiddle_val));
         x4i = (ixheaacd_mac32x16lin32(
-                  ixheaacd_mult32x16hin32_drc(x4r, twiddle_val), x4i,
+                  ixheaacd_mult32x16hin32(x4r, twiddle_val), x4i,
                   twiddle_val))
               << 1;
         x4r = tmp << 1;
@@ -1390,9 +1435,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x6r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x6i, twiddle_val));
+               ixheaacd_mult32x16hin32(x6i, twiddle_val));
         x6i = (ixheaacd_mac32x16lin32(
-                  ixheaacd_mult32x16hin32_drc(x6r, twiddle_val), x6i,
+                  ixheaacd_mult32x16hin32(x6r, twiddle_val), x6i,
                   twiddle_val))
               << 1;
         x6r = tmp << 1;
@@ -1430,9 +1475,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x1r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x1i, twiddle_val));
+               ixheaacd_mult32x16hin32(x1i, twiddle_val));
         x1i = (ixheaacd_mac32x16lin32(
-                  ixheaacd_mult32x16hin32_drc(x1r, twiddle_val), x1i,
+                  ixheaacd_mult32x16hin32(x1r, twiddle_val), x1i,
                   twiddle_val))
               << 1;
         x1r = tmp << 1;
@@ -1445,9 +1490,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x3r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x3i, twiddle_val));
+               ixheaacd_mult32x16hin32(x3i, twiddle_val));
         x3i = (ixheaacd_mac32x16lin32(
-            ixheaacd_mult32x16hin32_drc(x3r, twiddle_val), x3i, twiddle_val));
+            ixheaacd_mult32x16hin32(x3r, twiddle_val), x3i, twiddle_val));
         x3r = tmp;
 
         x5r = *data;
@@ -1458,9 +1503,9 @@
         twiddle_val = *(twiddles);
 
         tmp = (ixheaacd_mult32x16lin32(x5r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x5i, twiddle_val));
+               ixheaacd_mult32x16hin32(x5i, twiddle_val));
         x5i = (ixheaacd_mac32x16lin32(
-            ixheaacd_mult32x16hin32_drc(x5r, twiddle_val), x5i, twiddle_val));
+            ixheaacd_mult32x16hin32(x5r, twiddle_val), x5i, twiddle_val));
         x5r = tmp;
 
         x7r = *data;
@@ -1472,9 +1517,9 @@
         twiddles -= 7 * (j >> 3);
 
         tmp = (ixheaacd_mult32x16lin32(x7r, twiddle_val) -
-               ixheaacd_mult32x16hin32_drc(x7i, twiddle_val));
+               ixheaacd_mult32x16hin32(x7i, twiddle_val));
         x7i = (ixheaacd_mac32x16lin32(
-            ixheaacd_mult32x16hin32_drc(x7r, twiddle_val), x7i, twiddle_val));
+            ixheaacd_mult32x16hin32(x7r, twiddle_val), x7i, twiddle_val));
         x7r = tmp;
 
         x1r = x1r + (x5r << 1);
@@ -1576,6 +1621,39 @@
   }
 }
 
+VOID ixheaacd_inverse_transform_960(
+    WORD32 spec_data[], WORD32 scratch[],
+    ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 expo,
+    WORD32 *imdct_scale) {
+
+  WORD32 n;
+  WORD32 Nd2;
+  WORD16 const_mltfac;
+  WORD32 neg_expo;
+
+  WORD32 i;
+
+  n = 120;
+  Nd2 = n >> 1;
+  neg_expo = 4;
+
+  ixheaacd_pre_twiddle_120(spec_data, scratch, n, ptr_imdct_tables->cosine_array_240,
+                           neg_expo - expo);
+
+  ixheaacd_fft_120(ptr_imdct_tables, Nd2, spec_data, scratch);
+
+  neg_expo += 2;
+  *imdct_scale = neg_expo + 1;
+
+  ixheaacd_post_twiddle_120(spec_data, scratch, ptr_imdct_tables->cosine_array_240,
+                            n);
+  const_mltfac = 17476;
+  for (i = 0; i < 120; i++)
+  {
+    spec_data[i] = ixheaacd_mult32x16in32_shl(spec_data[i], const_mltfac);
+  }
+}
+
 WORD32 ixheaacd_inverse_transform(
     WORD32 spec_data[], WORD32 scratch[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 expo,
@@ -1591,6 +1669,41 @@
   return expo;
 }
 
+VOID ixheaacd_mdct_960(WORD32 *inp, WORD32 *scratch, WORD32 *mdct_scale,
+                       WORD32 mdct_flag,
+                       ia_aac_dec_imdct_tables_struct *imdct_tables_ptr) {
+  WORD32 expo, neg_expo = 0, k;
+
+  WORD16 const_mltfac = 17476;
+
+  expo = (*ixheaacd_calc_max_spectral_line)(inp, MDCT_LEN_960) - 1;
+  ;
+
+  memcpy(scratch, inp, sizeof(WORD32) * MDCT_LEN_960);
+
+  neg_expo = 7 - expo;
+
+  ixheaacd_pre_twiddle_960(inp, scratch, MDCT_LEN_960, imdct_tables_ptr->cosine_array_1920,
+                           neg_expo);
+
+  ixheaacd_fft_960(inp, scratch, imdct_tables_ptr);
+
+  ixheaacd_post_twiddle_960(inp, scratch, imdct_tables_ptr->cosine_array_1920,
+                            MDCT_LEN_960);
+
+  if (0 == mdct_flag) {
+    WORD32 *data = inp;
+
+    for (k = MDCT_LEN_960 - 1; k >= 0; k -= 2) {
+      *data = ixheaacd_mult32x16in32_shl(*data, const_mltfac);
+      data++;
+      *data = ixheaacd_mult32x16in32_shl(*data, const_mltfac);
+      data++;
+    }
+  }
+  *mdct_scale = neg_expo + 1 + 1 + 1;
+}
+
 VOID ixheaacd_mdct_480_ld(WORD32 *inp, WORD32 *scratch, WORD32 *mdct_scale,
                           WORD32 mdct_flag,
                           ia_aac_dec_imdct_tables_struct *imdct_tables_ptr,
@@ -1676,6 +1789,675 @@
     ixheaacd_post_twiddle_ld((data), temp, cos_sin_ptr, n);
 }
 
+VOID ixheaacd_fft_960(WORD32 *inp, WORD32 *op,
+                      ia_aac_dec_imdct_tables_struct *imdct_tables_ptr) {
+  WORD32 i;
+  WORD32 *buf1, *buf2;
+  WORD16 *re_arr_tab_sml_480_ptr;
+
+  (*ixheaacd_aac_ld_dec_rearrange_960)(inp, op, 480,
+                                       imdct_tables_ptr->re_arr_tab_32);
+
+  buf1 = op;
+  buf2 = inp;
+
+  for (i = 0; i < FFT15; i++) {
+    ixheaacd_fft_32_points(imdct_tables_ptr->w_32,
+                           32, buf1, buf2);
+
+    buf1 += (FFT16X2 * 2);
+    buf2 += (FFT16X2 * 2);
+  }
+
+  re_arr_tab_sml_480_ptr = imdct_tables_ptr->re_arr_tab_sml_480;
+  buf1 = inp;
+
+  for (i = 0; i < FFT16 * 2; i++) {
+    ixheaacd_ld_dec_fft_15_opt(buf1, op,
+                               ixheaacd_fft5out, re_arr_tab_sml_480_ptr);
+    buf1 += 2;
+    re_arr_tab_sml_480_ptr += FFT15;
+  }
+}
+
+VOID ixheaacd_fft_32_points(WORD16 *ptr_w, WORD32 npoints,
+                            WORD32* ptr_x, WORD32* ptr_y) {
+  WORD32   i, j, l1, l2, h2, predj, tw_offset, stride, fft_jmp;
+  WORD32   xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0;
+  WORD32   xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0;
+  WORD32   x_0, x_1, x_l1_0, x_l1_1, x_l2_0, x_l2_1;
+  WORD32   x_h2_0, x_h2_1;
+  WORD16 si10, si20, si30, co10, co20, co30;
+  WORD16 *w;
+  WORD32   *x, *x2, *x0;
+  WORD32   *y0, *y1, *y2, *y3;
+  WORD32   n0, j0;
+  WORD32   radix;
+  WORD32   norm;
+
+  radix = 2;
+  norm = 25;
+
+  stride = 32;
+  tw_offset = 0;
+  fft_jmp = 192;
+
+  while (stride > radix) {
+    j = 0;
+    fft_jmp >>= 2;
+
+    h2 = stride >> 1;
+    l1 = stride;
+    l2 = stride + (stride >> 1);
+
+    x = ptr_x;
+    w = ptr_w + tw_offset;
+    tw_offset += fft_jmp;
+
+    for (i = 0; i < npoints; i += 4) {
+      co10 = w[j + 1];            si10 = w[j + 0];
+      co20 = w[j + 3];            si20 = w[j + 2];
+      co30 = w[j + 5];            si30 = w[j + 4];
+
+      x_0 = x[0];             x_1 = x[1];
+      x_l1_0 = x[l1];         x_l1_1 = x[l1 + 1];
+      x_l2_0 = x[l2];         x_l2_1 = x[l2 + 1];
+      x_h2_0 = x[h2];         x_h2_1 = x[h2 + 1];
+
+      xh0_0 = ixheaacd_add32_sat(x_0, x_l1_0);
+      xh1_0 = ixheaacd_add32_sat(x_1, x_l1_1);
+      xl0_0 = ixheaacd_sub32_sat(x_0, x_l1_0);
+      xl1_0 = ixheaacd_sub32_sat(x_1, x_l1_1);
+      xh20_0 = ixheaacd_add32_sat(x_h2_0, x_l2_0);
+      xh21_0 = ixheaacd_add32_sat(x_h2_1, x_l2_1);
+      xl20_0 = ixheaacd_sub32_sat(x_h2_0, x_l2_0);
+      xl21_0 = ixheaacd_sub32_sat(x_h2_1, x_l2_1);
+
+      x0 = x;
+      x2 = x0;
+
+      j += 6;
+      x += 2;
+      predj = (j - fft_jmp);
+      if (!predj) x += fft_jmp;
+      if (!predj) j = 0;
+
+      x0[0] = ixheaacd_add32_sat(xh0_0, xh20_0);
+      x0[1] = ixheaacd_add32_sat(xh1_0, xh21_0);
+      xt0_0 = ixheaacd_sub32_sat(xh0_0, xh20_0);
+      yt0_0 = ixheaacd_sub32_sat(xh1_0, xh21_0);
+      xt1_0 = ixheaacd_add32_sat(xl0_0, xl21_0);
+      yt2_0 = ixheaacd_add32_sat(xl1_0, xl20_0);
+      xt2_0 = ixheaacd_sub32_sat(xl0_0, xl21_0);
+      yt1_0 = ixheaacd_sub32_sat(xl1_0, xl20_0);
+
+      x2[h2] = ixheaacd_add32_sat(MPYLIRC(si10, yt1_0), MPYLIRC(co10, xt1_0));
+
+      x2[h2 + 1] = ixheaacd_sub32_sat(MPYLIRC(co10, yt1_0), MPYLIRC(si10, xt1_0));
+
+      x2[l1] = ixheaacd_add32_sat(MPYLIRC(si20, yt0_0), MPYLIRC(co20, xt0_0));
+
+      x2[l1 + 1] = ixheaacd_sub32_sat(MPYLIRC(co20, yt0_0), MPYLIRC(si20, xt0_0));
+      yt0_0 = MPYLIRC(si20, yt0_0);
+
+      x2[l2] = ixheaacd_add32_sat(MPYLIRC(si30, yt2_0), MPYLIRC(co30, xt2_0));
+
+      x2[l2 + 1] = ixheaacd_sub32_sat(MPYLIRC(co30, yt2_0), MPYLIRC(si30, xt2_0));
+      yt2_0 = MPYLIRC(si30, yt2_0);
+
+    }
+    stride >>= 2;
+  }
+
+  y0 = ptr_y;
+  y2 = ptr_y + (int)npoints;
+  x0 = ptr_x;
+  x2 = ptr_x + (int)(npoints >> 1);
+
+  y1 = y0 + (int)(npoints >> 2);
+  y3 = y2 + (int)(npoints >> 2);
+  l1 = norm + 1;
+  j0 = 8;
+  n0 = npoints >> 1;
+
+  j = 0;
+  for (i = 0; i < 4; i++) {
+    int t1, t2;
+    h2 = rev_dig[i];
+
+    t1 = h2 << 1;
+    t2 = t1 + 1;
+
+    y0[t1] = ixheaacd_add32_sat(x0[0], x0[2]);
+    y2[t1] = ixheaacd_sub32_sat(x0[0], x0[2]);
+    y0[t2] = ixheaacd_add32_sat(x0[1], x0[3]);
+    y2[t2] = ixheaacd_sub32_sat(x0[1], x0[3]);
+    y1[t1] = ixheaacd_add32_sat(x0[4], x0[6]);
+    y3[t1] = ixheaacd_sub32_sat(x0[4], x0[6]);
+    y1[t2] = ixheaacd_add32_sat(x0[5], x0[7]);
+    y3[t2] = ixheaacd_sub32_sat(x0[5], x0[7]);
+    x0 += 8;
+
+    t1 += 2;
+    t2 += 2;
+
+    y0[t1] = ixheaacd_add32_sat(x2[0], x2[2]);
+    y2[t1] = ixheaacd_sub32_sat(x2[0], x2[2]);
+    y0[t2] = ixheaacd_add32_sat(x2[1], x2[3]);
+    y2[t2] = ixheaacd_sub32_sat(x2[1], x2[3]);
+    y1[t1] = ixheaacd_add32_sat(x2[4], x2[6]);
+    y3[t1] = ixheaacd_sub32_sat(x2[4], x2[6]);
+    y1[t2] = ixheaacd_add32_sat(x2[5], x2[7]);
+    y3[t2] = ixheaacd_sub32_sat(x2[5], x2[7]);
+    x2 += 8;
+
+    j += j0;
+
+    if (j == n0)
+    {
+      j += n0;
+      x0 += (int)npoints >> 1;
+      x2 += (int)npoints >> 1;
+    }
+  }
+}
+
+VOID ixheaacd_dec_rearrange_short(WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, WORD16 *re_arr_tab) {
+  WORD32 n, i = 0;
+
+  for (n = 0; n < mdct_len_2; n++) {
+    WORD32 idx = re_arr_tab[n] << 1;
+    op[i++] = ip[idx];
+    op[i++] = ip[idx + 1];
+  }
+}
+
+VOID ixheaacd_ld_dec_fft_15_opt(WORD32 *inp, WORD32 *op, WORD32 *fft3out,
+                                WORD16 *ptr_re_arr_tab_sml_240) {
+  WORD32 i, n, idx;
+  WORD32 *buf1, *buf2, *buf1a;
+  WORD32 add_r, sub_r;
+  WORD32 add_i, sub_i;
+  WORD32 x_01_r, x_01_i, temp;
+  WORD32 p1, p2, p3, p4;
+
+  WORD32 sinmu = 1859775393;
+  WORD32 c_51 = 2042378317;
+  WORD32 c_52 = -1652318768;
+  WORD32 c_53 = -780119100;
+  WORD32 c_54 = 1200479854;
+  WORD32 c_55 = -1342177280;
+
+  WORD32 r1, r2, r3, r4;
+  WORD32 s1, s2, s3, s4, t, temp1, temp2;
+  WORD32 *fft3outptr = fft3out;
+
+  WORD32 xr_0, xr_1, xr_2;
+  WORD32 xi_0, xi_1, xi_2;
+
+  buf2 = fft3out;
+  buf1 = buf1a = fft3out;
+  n = 0;
+
+  {
+    *buf1++ = inp[0];
+    *buf1++ = inp[1];
+
+    *buf1++ = inp[192];
+    *buf1++ = inp[193];
+
+    *buf1++ = inp[384];
+    *buf1++ = inp[385];
+
+    *buf1++ = inp[576];
+    *buf1++ = inp[577];
+
+    *buf1++ = inp[768];
+    *buf1++ = inp[769];
+
+    r1 = ixheaacd_add32_sat(buf1a[2], buf1a[8]);
+    r4 = ixheaacd_sub32_sat(buf1a[2], buf1a[8]);
+    r3 = ixheaacd_add32_sat(buf1a[4], buf1a[6]);
+    r2 = ixheaacd_sub32_sat(buf1a[4], buf1a[6]);
+
+    t = ixheaacd_mult32_shl(ixheaacd_sub32_sat(r1, r3), c_54);
+
+    r1 = ixheaacd_add32_sat(r1, r3);
+
+    temp1 = ixheaacd_add32_sat(buf1a[0], r1);
+
+    r1 = ixheaacd_add32_sat(temp1, (ixheaacd_mult32_shl(r1, c_55) << 1));
+
+    r3 = ixheaacd_sub32_sat(r1, t);
+    r1 = ixheaacd_add32_sat(r1, t);
+
+    t = ixheaacd_mult32_shl(ixheaacd_add32_sat(r4, r2), c_51);
+    r4 = ixheaacd_add32_sat(t, (ixheaacd_mult32_shl(r4, c_52) << 1));
+    r2 = ixheaacd_add32_sat(t, ixheaacd_mult32_shl(r2, c_53));
+
+    s1 = ixheaacd_add32_sat(buf1a[3], buf1a[9]);
+    s4 = ixheaacd_sub32_sat(buf1a[3], buf1a[9]);
+    s3 = ixheaacd_add32_sat(buf1a[5], buf1a[7]);
+    s2 = ixheaacd_sub32_sat(buf1a[5], buf1a[7]);
+
+    t = ixheaacd_mult32_shl(ixheaacd_sub32_sat(s1, s3), c_54);
+
+    s1 = ixheaacd_add32_sat(s1, s3);
+
+    temp2 = ixheaacd_add32_sat(buf1a[1], s1);
+
+
+    s1 = ixheaacd_add32_sat(temp2, (ixheaacd_mult32_shl(s1, c_55) << 1));
+
+    s3 = ixheaacd_sub32_sat(s1, t);
+    s1 = ixheaacd_add32_sat(s1, t);
+
+    t = ixheaacd_mult32_shl(ixheaacd_add32_sat(s4, s2), c_51);
+    s4 = ixheaacd_add32_sat(t, (ixheaacd_mult32_shl(s4, c_52) << 1));
+    s2 = ixheaacd_add32_sat(t, (ixheaacd_mult32_shl(s2, c_53)));
+
+    *buf2++ = temp1;
+    *buf2++ = temp2;
+    *buf2++ = ixheaacd_add32_sat(r1, s2);
+    *buf2++ = ixheaacd_sub32_sat(s1, r2);
+    *buf2++ = ixheaacd_sub32_sat(r3, s4);
+    *buf2++ = ixheaacd_add32_sat(s3, r4);
+    *buf2++ = ixheaacd_add32_sat(r3, s4);
+    *buf2++ = ixheaacd_sub32_sat(s3, r4);
+    *buf2++ = ixheaacd_sub32_sat(r1, s2);
+    *buf2++ = ixheaacd_add32_sat(s1, r2);
+    buf1a = buf1;
+
+    *buf1++ = inp[320];
+    *buf1++ = inp[321];
+
+    *buf1++ = inp[512];
+    *buf1++ = inp[513];
+
+    *buf1++ = inp[704];
+    *buf1++ = inp[705];
+
+    *buf1++ = inp[896];
+    *buf1++ = inp[897];
+
+    *buf1++ = inp[128];
+    *buf1++ = inp[129];
+
+    r1 = ixheaacd_add32_sat(buf1a[2], buf1a[8]);
+    r4 = ixheaacd_sub32_sat(buf1a[2], buf1a[8]);
+    r3 = ixheaacd_add32_sat(buf1a[4], buf1a[6]);
+    r2 = ixheaacd_sub32_sat(buf1a[4], buf1a[6]);
+
+    t = ixheaacd_mult32_shl(ixheaacd_sub32_sat(r1, r3), c_54);
+
+    r1 = ixheaacd_add32_sat(r1, r3);
+
+    temp1 = ixheaacd_add32_sat(buf1a[0], r1);
+
+    r1 = ixheaacd_add32_sat(temp1, (ixheaacd_mult32_shl(r1, c_55) << 1));
+
+    r3 = ixheaacd_sub32_sat(r1, t);
+    r1 = ixheaacd_add32_sat(r1, t);
+
+    t = ixheaacd_mult32_shl(ixheaacd_add32_sat(r4, r2), c_51);
+    r4 = ixheaacd_add32_sat(t, (ixheaacd_mult32_shl(r4, c_52) << 1));
+    r2 = ixheaacd_add32_sat(t, ixheaacd_mult32_shl(r2, c_53));
+
+    s1 = ixheaacd_add32_sat(buf1a[3], buf1a[9]);
+    s4 = ixheaacd_sub32_sat(buf1a[3], buf1a[9]);
+    s3 = ixheaacd_add32_sat(buf1a[5], buf1a[7]);
+    s2 = ixheaacd_sub32_sat(buf1a[5], buf1a[7]);
+
+    t = ixheaacd_mult32_shl(ixheaacd_sub32_sat(s1, s3), c_54);
+
+    s1 = ixheaacd_add32_sat(s1, s3);
+
+    temp2 = ixheaacd_add32_sat(buf1a[1], s1);
+
+    s1 = ixheaacd_add32_sat(temp2, (ixheaacd_mult32_shl(s1, c_55) << 1));
+
+    s3 = ixheaacd_sub32_sat(s1, t);
+    s1 = ixheaacd_add32_sat(s1, t);
+
+    t = ixheaacd_mult32_shl(ixheaacd_add32_sat(s4, s2), c_51);
+    s4 = ixheaacd_add32_sat(t, (ixheaacd_mult32_shl(s4, c_52) << 1));
+    s2 = ixheaacd_add32_sat(t, ixheaacd_mult32_shl(s2, c_53));
+
+    *buf2++ = temp1;
+    *buf2++ = temp2;
+    *buf2++ = ixheaacd_add32_sat(r1, s2);
+    *buf2++ = ixheaacd_sub32_sat(s1, r2);
+    *buf2++ = ixheaacd_sub32_sat(r3, s4);
+    *buf2++ = ixheaacd_add32_sat(s3, r4);
+    *buf2++ = ixheaacd_add32_sat(r3, s4);
+    *buf2++ = ixheaacd_sub32_sat(s3, r4);
+    *buf2++ = ixheaacd_sub32_sat(r1, s2);
+    *buf2++ = ixheaacd_add32_sat(s1, r2);
+    buf1a = buf1;
+
+    *buf1++ = inp[640];
+    *buf1++ = inp[641];
+
+    *buf1++ = inp[832];
+    *buf1++ = inp[833];
+
+    *buf1++ = inp[64];
+    *buf1++ = inp[65];
+
+    *buf1++ = inp[256];
+    *buf1++ = inp[257];
+
+    *buf1++ = inp[448];
+    *buf1++ = inp[449];
+
+    r1 = ixheaacd_add32_sat(buf1a[2], buf1a[8]);
+    r4 = ixheaacd_sub32_sat(buf1a[2], buf1a[8]);
+    r3 = ixheaacd_add32_sat(buf1a[4], buf1a[6]);
+    r2 = ixheaacd_sub32_sat(buf1a[4], buf1a[6]);
+
+    t = ixheaacd_mult32_shl(ixheaacd_sub32_sat(r1, r3), c_54);
+
+    r1 = ixheaacd_add32_sat(r1, r3);
+
+    temp1 = ixheaacd_add32_sat(buf1a[0], r1);
+
+    r1 = ixheaacd_add32_sat(temp1, (ixheaacd_mult32_shl(r1, c_55) << 1));
+
+    r3 = ixheaacd_sub32_sat(r1, t);
+    r1 = ixheaacd_add32_sat(r1, t);
+
+    t = ixheaacd_mult32_shl(ixheaacd_add32_sat(r4, r2), c_51);
+    r4 = ixheaacd_add32_sat(t, ixheaacd_mult32_shl(r4, c_52) << 1);
+    r2 = ixheaacd_add32_sat(t, ixheaacd_mult32_shl(r2, c_53));
+
+    s1 = ixheaacd_add32_sat(buf1a[3], buf1a[9]);
+    s4 = ixheaacd_sub32_sat(buf1a[3], buf1a[9]);
+    s3 = ixheaacd_add32_sat(buf1a[5], buf1a[7]);
+    s2 = ixheaacd_sub32_sat(buf1a[5], buf1a[7]);
+
+    t = ixheaacd_mult32_shl(ixheaacd_sub32_sat(s1, s3), c_54);
+
+    s1 = ixheaacd_add32_sat(s1, s3);
+
+    temp2 = ixheaacd_add32_sat(buf1a[1], s1);
+
+    s1 = ixheaacd_add32_sat(temp2, (ixheaacd_mult32_shl(s1, c_55) << 1));
+
+    s3 = ixheaacd_sub32_sat(s1, t);
+    s1 = ixheaacd_add32_sat(s1, t);
+
+    t = ixheaacd_mult32_shl(ixheaacd_add32_sat(s4, s2), c_51);
+    s4 = ixheaacd_add32_sat(t, (ixheaacd_mult32_shl(s4, c_52) << 1));
+    s2 = ixheaacd_add32_sat(t, ixheaacd_mult32_shl(s2, c_53));
+
+    *buf2++ = temp1;
+    *buf2++ = temp2;
+    *buf2++ = ixheaacd_add32_sat(r1, s2);
+    *buf2++ = ixheaacd_sub32_sat(s1, r2);
+    *buf2++ = ixheaacd_sub32_sat(r3, s4);
+    *buf2++ = ixheaacd_add32_sat(s3, r4);
+    *buf2++ = ixheaacd_add32_sat(r3, s4);
+    *buf2++ = ixheaacd_sub32_sat(s3, r4);
+    *buf2++ = ixheaacd_sub32_sat(r1, s2);
+    *buf2++ = ixheaacd_add32_sat(s1, r2);
+    buf1a = buf1;
+  }
+
+  n = 0;
+  for (i = 0; i < FFT5; i++) {
+    xr_0 = fft3outptr[0];
+    xi_0 = fft3outptr[1];
+
+    xr_1 = fft3outptr[10];
+    xi_1 = fft3outptr[11];
+
+    xr_2 = fft3outptr[20];
+    xi_2 = fft3outptr[21];
+
+    x_01_r = ixheaacd_add32_sat(xr_0, xr_1);
+    x_01_i = ixheaacd_add32_sat(xi_0, xi_1);
+
+    add_r = ixheaacd_add32_sat(xr_1, xr_2);
+    add_i = ixheaacd_add32_sat(xi_1, xi_2);
+
+    sub_r = ixheaacd_sub32_sat(xr_1, xr_2);
+    sub_i = ixheaacd_sub32_sat(xi_1, xi_2);
+
+    p1 = add_r >> 1;
+
+    p2 = ixheaacd_mult32_shl(sub_i, sinmu);
+    p3 = ixheaacd_mult32_shl(sub_r, sinmu);
+
+    p4 = add_i >> 1;
+
+    temp = ixheaacd_sub32_sat(xr_0, p1);
+    temp1 = ixheaacd_add32_sat(xi_0, p3);
+    temp2 = ixheaacd_sub32_sat(xi_0, p3);
+
+    idx = ptr_re_arr_tab_sml_240[n++] << 1;
+    op[idx] = ixheaacd_add32_sat(x_01_r, xr_2);
+    op[idx + 1] = ixheaacd_add32_sat(x_01_i, xi_2);
+
+    idx = ptr_re_arr_tab_sml_240[n++] << 1;
+    op[idx] = ixheaacd_add32_sat(temp, p2);
+    op[idx + 1] = ixheaacd_sub32_sat(temp2, p4);
+
+    idx = ptr_re_arr_tab_sml_240[n++] << 1;
+    op[idx] = ixheaacd_sub32_sat(temp, p2);
+    op[idx + 1] = ixheaacd_sub32_sat(temp1, p4);
+    fft3outptr += 2;
+  }
+  return;
+}
+
+VOID ixheaacd_fft_120(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr,
+                      WORD32 npoints, WORD32* ptr_x, WORD32* ptr_y) {
+  WORD32 i;
+  WORD32 *buf1, *buf2;
+  WORD32 *inp, *op;
+
+  inp = ptr_x;
+  op = ptr_y;
+
+  ixheaacd_dec_rearrange_short(inp, op, 60, imdct_tables_ptr->re_arr_tab_4);
+  buf1 = op;
+  buf2 = inp;
+
+  for (i = 0; i < FFT15; i++) {
+    {
+      WORD32   x_0, x_1, x_2, x_3, x_4, x_5, x_6, x_7;
+      WORD32   *y0, *y1, *y2, *y3;
+      WORD32   *x0;
+      WORD32   xh0_0, xh1_0, xh0_1, xh1_1, xl0_0, xl1_0, xl0_1, xl1_1;
+      WORD32   h2;
+      WORD32   n00, n01, n10, n11, n20, n21, n30, n31;
+
+      ptr_x = buf1;
+      ptr_y = buf2;
+      npoints = 4;
+      h2 = 0;
+
+      y0 = ptr_y;
+      y2 = ptr_y + (WORD32)npoints;
+      x0 = ptr_x;
+
+      y1 = y0 + (WORD32)(npoints >> 1);
+      y3 = y2 + (WORD32)(npoints >> 1);
+
+      x_0 = x0[0];         x_1 = x0[1];
+      x_2 = x0[2];         x_3 = x0[3];
+      x_4 = x0[4];         x_5 = x0[5];
+      x_6 = x0[6];         x_7 = x0[7];
+      x0 += 8;
+
+      xh0_0 = ixheaacd_add32_sat(x_0, x_4);
+      xh1_0 = ixheaacd_add32_sat(x_1, x_5);
+      xl0_0 = ixheaacd_sub32_sat(x_0, x_4);
+      xl1_0 = ixheaacd_sub32_sat(x_1, x_5);
+      xh0_1 = ixheaacd_add32_sat(x_2, x_6);
+      xh1_1 = ixheaacd_add32_sat(x_3, x_7);
+      xl0_1 = ixheaacd_sub32_sat(x_2, x_6);
+      xl1_1 = ixheaacd_sub32_sat(x_3, x_7);
+
+      n00 = ixheaacd_add32_sat(xh0_0, xh0_1);
+      n01 = ixheaacd_add32_sat(xh1_0, xh1_1);
+      n10 = ixheaacd_add32_sat(xl0_0, xl1_1);
+      n11 = ixheaacd_sub32_sat(xl1_0, xl0_1);
+      n20 = ixheaacd_sub32_sat(xh0_0, xh0_1);
+      n21 = ixheaacd_sub32_sat(xh1_0, xh1_1);
+      n30 = ixheaacd_sub32_sat(xl0_0, xl1_1);
+      n31 = ixheaacd_add32_sat(xl1_0, xl0_1);
+
+      y0[2 * h2] = n00;            y0[2 * h2 + 1] = n01;
+      y1[2 * h2] = n10;            y1[2 * h2 + 1] = n11;
+      y2[2 * h2] = n20;            y2[2 * h2 + 1] = n21;
+      y3[2 * h2] = n30;            y3[2 * h2 + 1] = n31;
+    }
+    buf1 += (FFT4 * 2);
+    buf2 += (FFT4 * 2);
+  }
+
+  ixheaacd_dec_rearrange_short(inp, op, 60, imdct_tables_ptr->re_arr_tab_15_4);
+
+  buf1 = op;
+  buf2 = inp;
+
+  for (i = 0; i < FFT4; i++) {
+    ixheaacd_fft_960_15(buf1, buf2, imdct_tables_ptr);
+    buf1 += (FFT15 * 2);
+    buf2 += (FFT15 * 2);
+  }
+
+  ixheaacd_dec_rearrange_short(inp, op, 60, imdct_tables_ptr->re_arr_tab_120);
+}
+
+VOID ixheaacd_fft_960_15(WORD32 *inp, WORD32 *op,
+                         ia_aac_dec_imdct_tables_struct *imdct_tables_ptr) {
+  WORD32 i;
+  WORD32 *buf1, *buf2;
+
+  ixheaacd_dec_rearrange_short(inp, op, FFT15, imdct_tables_ptr->re_arr_tab_5);
+
+  buf1 = op;
+  buf2 = inp;
+
+  for (i = 0; i < FFT3; i++) {
+    ixheaacd_fft_5(buf1, buf2);
+
+    buf1 += (FFT5 * 2);
+    buf2 += (FFT5 * 2);
+  }
+
+  ixheaacd_dec_rearrange_short(inp, op, FFT15, imdct_tables_ptr->re_arr_tab_3);
+
+  buf1 = op;
+  buf2 = inp;
+
+  for (i = 0; i < FFT5; i++) {
+    ixheaacd_fft_3(buf1, buf2);
+
+    buf1 += (FFT3 * 2);
+    buf2 += (FFT3 * 2);
+  }
+
+  ixheaacd_dec_rearrange_short(inp, op, FFT15, imdct_tables_ptr->re_arr_tab_sml);
+}
+
+VOID ixheaacd_fft_3(WORD32 *inp, WORD32 *op) {
+  WORD32 add_r, sub_r;
+  WORD32 add_i, sub_i;
+  WORD32 x_01_r, x_01_i, temp;
+
+  WORD32 p1, p2, p3, p4;
+  WORD32 sinmu = 1859775393;
+
+  x_01_r = ixheaacd_add32_sat(inp[0], inp[2]);
+  x_01_i = ixheaacd_add32_sat(inp[1], inp[3]);
+
+  add_r = ixheaacd_add32_sat(inp[2], inp[4]);
+  add_i = ixheaacd_add32_sat(inp[3], inp[5]);
+
+  sub_r = ixheaacd_sub32_sat(inp[2], inp[4]);
+  sub_i = ixheaacd_sub32_sat(inp[3], inp[5]);
+
+  p1 = add_r >> 1;
+  p2 = ixheaacd_mult32_shl(sub_i, sinmu);
+  p3 = ixheaacd_mult32_shl(sub_r, sinmu);
+  p4 = add_i >> 1;
+
+  temp = ixheaacd_sub32_sat(inp[0], p1);
+
+  op[0] = ixheaacd_add32_sat(x_01_r, inp[4]);
+  op[1] = ixheaacd_add32_sat(x_01_i, inp[5]);
+  op[2] = ixheaacd_add32_sat(temp, p2);
+  op[3] = ixheaacd_sub32_sat(ixheaacd_sub32_sat(inp[1], p3), p4);
+  op[4] = ixheaacd_sub32_sat(temp, p2);
+  op[5] = ixheaacd_sub32_sat(ixheaacd_add32_sat(inp[1], p3), p4);
+}
+
+VOID ixheaacd_fft_5(WORD32 *inp, WORD32 *op) {
+  WORD32 c_51 = 2042378317;
+  WORD32 c_52 = -1652318768;
+  WORD32 c_53 = -780119100;
+  WORD32 c_54 = 1200479854;
+  WORD32 c_55 = -1342177280;
+
+  WORD32 r1, r2, r3, r4;
+  WORD32 s1, s2, s3, s4, t, temp1, temp2;
+
+  r1 = ixheaacd_add32_sat(inp[2], inp[8]);
+  r4 = ixheaacd_sub32_sat(inp[2], inp[8]);
+  r3 = ixheaacd_add32_sat(inp[4], inp[6]);
+  r2 = ixheaacd_sub32_sat(inp[4], inp[6]);
+
+  t = ixheaacd_mult32_shl(ixheaacd_sub32_sat(r1, r3), c_54);
+  r1 = ixheaacd_add32_sat(r1, r3);
+
+  temp1 = ixheaacd_add32_sat(inp[0], r1);
+  r1 = ixheaacd_add32_sat(
+      temp1, ixheaacd_shl32_sat((ixheaacd_mult32_shl(r1, c_55)), 1));
+
+  r3 = ixheaacd_sub32_sat(r1, t);
+  r1 = ixheaacd_add32_sat(r1, t);
+
+  t = ixheaacd_mult32_shl(ixheaacd_add32_sat(r4, r2), c_51);
+  r4 = ixheaacd_add32_sat(
+      t, ixheaacd_shl32_sat(ixheaacd_mult32_shl(r4, c_52), 1));
+  r2 = ixheaacd_add32_sat(t, ixheaacd_mult32_shl(r2, c_53));
+
+  s1 = ixheaacd_add32_sat(inp[3], inp[9]);
+  s4 = ixheaacd_sub32_sat(inp[3], inp[9]);
+  s3 = ixheaacd_add32_sat(inp[5], inp[7]);
+  s2 = ixheaacd_sub32_sat(inp[5], inp[7]);
+
+  t = ixheaacd_mult32_shl(ixheaacd_sub32_sat(s1, s3), c_54);
+  s1 = ixheaacd_add32_sat(s1, s3);
+
+  temp2 = ixheaacd_add32_sat(inp[1], s1);
+
+  s1 = ixheaacd_add32_sat(
+      temp2, ixheaacd_shl32_sat((ixheaacd_mult32_shl(s1, c_55)), 1));
+
+  s3 = ixheaacd_sub32_sat(s1, t);
+  s1 = ixheaacd_add32_sat(s1, t);
+
+  t = ixheaacd_mult32_shl(ixheaacd_add32_sat(s4, s2), c_51);
+  s4 = ixheaacd_add32_sat(
+      t, ixheaacd_shl32_sat((ixheaacd_mult32_shl(s4, c_52)), 1));
+  s2 = ixheaacd_add32_sat(t, (ixheaacd_mult32_shl(s2, c_53)));
+
+  op[0] = temp1;
+  op[1] = temp2;
+  op[2] = ixheaacd_add32_sat(r1, s2);
+  op[3] = ixheaacd_sub32_sat(s1, r2);
+  op[4] = ixheaacd_sub32_sat(r3, s4);
+  op[5] = ixheaacd_add32_sat(s3, r4);
+  op[6] = ixheaacd_add32_sat(r3, s4);
+  op[7] = ixheaacd_sub32_sat(s3, r4);
+  op[8] = ixheaacd_sub32_sat(r1, s2);
+  op[9] = ixheaacd_add32_sat(s1, r2);
+}
+
 VOID ixheaacd_fft_480_ld(WORD32 *inp, WORD32 *op,
                          ia_aac_dec_imdct_tables_struct *imdct_tables_ptr) {
   WORD32 i;
@@ -1704,6 +2486,94 @@
   }
 }
 
+VOID ixheaacd_pre_twiddle_960(WORD32 *xptr, WORD32 *data, WORD32 n,
+                              WORD32 *cos_sin_ptr, WORD32 neg_expo) {
+  WORD npoints_4, i;
+  WORD32 tempr, tempi, temp;
+  WORD32 c, c1, s, s1;
+  WORD32 *in_ptr1, *in_ptr2;
+  WORD32 *xprt1 = xptr + (n - 1);
+
+  npoints_4 = n >> 2;
+
+  in_ptr1 = data;
+  in_ptr2 = data + n - 1;
+
+  for (i = 0; i < npoints_4; i++) {
+    c = *cos_sin_ptr++;
+    s = *cos_sin_ptr++;
+
+    tempr = *in_ptr1++;
+    tempi = *in_ptr2--;
+
+    temp = -ixheaacd_add32(ixheaacd_mult32x32in32(tempr, c),
+                           ixheaacd_mult32x32in32(tempi, s));
+    *xptr++ = ixheaacd_shr32_dir_sat(temp, neg_expo);
+
+    temp = -ixheaacd_sub32(ixheaacd_mult32x32in32(tempi, c),
+                           ixheaacd_mult32x32in32(tempr, s));
+    *xptr++ = ixheaacd_shr32_dir_sat(temp, neg_expo);
+
+    c1 = *cos_sin_ptr++;
+    s1 = *cos_sin_ptr++;
+
+    tempi = *in_ptr1++;
+    tempr = *in_ptr2--;
+
+    temp = -ixheaacd_sub32(ixheaacd_mult32x32in32(tempi, c1),
+                           ixheaacd_mult32x32in32(tempr, s1));
+    *xprt1-- = ixheaacd_shr32_dir_sat(temp, neg_expo);
+
+    temp = -ixheaacd_add32(ixheaacd_mult32x32in32(tempr, c1),
+                           ixheaacd_mult32x32in32(tempi, s1));
+    *xprt1-- = ixheaacd_shr32_dir_sat(temp, neg_expo);
+  }
+}
+
+VOID ixheaacd_pre_twiddle_120(WORD32 *xptr, WORD32 *data, WORD32 n,
+                              WORD16 *cos_sin_ptr, WORD32 neg_expo) {
+  WORD npoints_4, i;
+  WORD32 tempr, tempi, temp;
+  WORD16 c, c1, s, s1;
+  WORD32 *in_ptr1, *in_ptr2;
+  WORD32 *xprt1 = xptr + (n - 1);
+
+  npoints_4 = n >> 2;
+
+  in_ptr1 = data;
+  in_ptr2 = data + n - 1;
+
+  for (i = 0; i < npoints_4; i++) {
+    c = *cos_sin_ptr++;
+    s = *cos_sin_ptr++;
+
+    tempr = *in_ptr1++;
+    tempi = *in_ptr2--;
+
+    temp = -ixheaacd_add32(ixheaacd_mult32x16in32(tempr, c),
+                           ixheaacd_mult32x16in32(tempi, s));
+    *xptr++ = ixheaacd_shr32_dir_sat(temp, neg_expo);
+
+    temp = -ixheaacd_sub32(ixheaacd_mult32x16in32(tempi, c),
+                           ixheaacd_mult32x16in32(tempr, s));
+    *xptr++ = ixheaacd_shr32_dir_sat(temp, neg_expo);
+
+    c1 = *cos_sin_ptr++;
+    s1 = *cos_sin_ptr++;
+
+    tempi = *in_ptr1++;
+    tempr = *in_ptr2--;
+
+    temp = -ixheaacd_sub32(ixheaacd_mult32x16in32(tempi, c1),
+                           ixheaacd_mult32x16in32(tempr, s1));
+    *xprt1-- = ixheaacd_shr32_dir_sat(temp, neg_expo);
+
+    temp = -ixheaacd_add32(ixheaacd_mult32x16in32(tempr, c1),
+                           ixheaacd_mult32x16in32(tempi, s1));
+    *xprt1-- = ixheaacd_shr32_dir_sat(temp, neg_expo);
+  }
+}
+
 VOID ixheaacd_pre_twiddle(WORD32 *xptr, WORD32 *data, WORD32 n,
                           WORD32 *cos_sin_ptr, WORD32 neg_expo) {
   WORD npoints_4, i;
@@ -1791,6 +2661,86 @@
   }
 }
 
+VOID ixheaacd_post_twiddle_120(WORD32 out[], WORD32 x[],
+                               const WORD16 *cos_sin_ptr, WORD m) {
+  WORD i;
+  WORD16 c, c1, s, s1;
+  WORD32 tempr, tempi, temp;
+  WORD32 *in_ptr2 = x + (m - 1);
+  WORD32 *in_ptr1 = x;
+  WORD32 *xptr = out;
+  WORD32 *xptr1 = out + (m - 1);
+
+  for (i = 0; i < m; i += 4) {
+    c = *cos_sin_ptr++;
+    s = *cos_sin_ptr++;
+    c1 = *cos_sin_ptr++;
+    s1 = *cos_sin_ptr++;
+
+    tempr = *in_ptr1++;
+    tempi = *in_ptr1++;
+
+    temp = -ixheaacd_sub32_sat(ixheaacd_mult32x16in32(tempr, s),
+                               ixheaacd_mult32x16in32(tempi, c));
+    *xptr1-- = temp;
+
+    temp = -ixheaacd_add32_sat(ixheaacd_mult32x16in32(tempr, c),
+                               ixheaacd_mult32x16in32(tempi, s));
+    *xptr++ = temp;
+
+    tempi = *in_ptr2--;
+    tempr = *in_ptr2--;
+
+    temp = -ixheaacd_sub32_sat(ixheaacd_mult32x16in32(tempr, s1),
+                               ixheaacd_mult32x16in32(tempi, c1));
+    *xptr++ = temp;
+
+    temp = -ixheaacd_add32_sat(ixheaacd_mult32x16in32(tempr, c1),
+                               ixheaacd_mult32x16in32(tempi, s1));
+    *xptr1-- = temp;
+  }
+}
+
+VOID ixheaacd_post_twiddle_960(WORD32 out[], WORD32 x[],
+                               const WORD32 *cos_sin_ptr, WORD m) {
+  WORD i;
+  WORD32 c, c1, s, s1;
+  WORD32 tempr, tempi, temp;
+  WORD32 *in_ptr2 = x + (m - 1);
+  WORD32 *in_ptr1 = x;
+  WORD32 *xptr = out;
+  WORD32 *xptr1 = out + (m - 1);
+
+  for (i = 0; i < m; i += 4) {
+    c = *cos_sin_ptr++;
+    s = *cos_sin_ptr++;
+    c1 = *cos_sin_ptr++;
+    s1 = *cos_sin_ptr++;
+
+    tempr = *in_ptr1++;
+    tempi = *in_ptr1++;
+
+    temp = -ixheaacd_sub32_sat(ixheaacd_mult32x32in32(tempr, s),
+                               ixheaacd_mult32x32in32(tempi, c));
+    *xptr1-- = temp;
+
+    temp = -ixheaacd_add32_sat(ixheaacd_mult32x32in32(tempr, c),
+                               ixheaacd_mult32x32in32(tempi, s));
+    *xptr++ = temp;
+
+    tempi = *in_ptr2--;
+    tempr = *in_ptr2--;
+
+    temp = -ixheaacd_sub32_sat(ixheaacd_mult32x32in32(tempr, s1),
+                               ixheaacd_mult32x32in32(tempi, c1));
+    *xptr++ = temp;
+
+    temp = -ixheaacd_add32_sat(ixheaacd_mult32x32in32(tempr, c1),
+                               ixheaacd_mult32x32in32(tempi, s1));
+    *xptr1-- = temp;
+  }
+}
+
 VOID ixheaacd_post_twiddle_ld(WORD32 out[], WORD32 x[],
                               const WORD32 *cos_sin_ptr, WORD m) {
   WORD i;
@@ -1943,7 +2893,7 @@
 
 VOID ixheaacd_fft32x32_ld_dec(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr,
                               WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) {
-  WORD32 i, j, l1, l2, h2, predj, tw_offset, stride, fft_jmp;
+  WORD32 i, j, l1, l2, h2, predj, tw_offset, stride, fft_jmp, k;
   WORD32 xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0;
   WORD32 xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0;
   WORD32 xh0_1, xh1_1, xl0_1, xl1_1;
@@ -1965,6 +2915,8 @@
 
   if (npoints == 256)
     ptr_w = imdct_tables_ptr->w_256;
+  else if (npoints == 32)
+    ptr_w = (WORD32*)imdct_tables_ptr->w_32;
   else
     ptr_w = imdct_tables_ptr->w_16;
 
@@ -2081,9 +3033,13 @@
   }
 
   j = 0;
+  k = 0;
 
   for (i = 0; i < npoints; i += 8) {
-    DIG_REV(j, l1, h2);
+    if (npoints == 32)
+      h2 = rev_dig[k++];
+    else
+      DIG_REV(j, l1, h2);
 
     x_0 = x0[0];
     x_1 = x0[1];
diff --git a/decoder/ixheaacd_aac_imdct.h b/decoder/ixheaacd_aac_imdct.h
index d6dc58f..f88322d 100644
--- a/decoder/ixheaacd_aac_imdct.h
+++ b/decoder/ixheaacd_aac_imdct.h
@@ -25,6 +25,11 @@
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 expo,
     WORD32 npoints);
 
+VOID ixheaacd_inverse_transform_960(
+    WORD32 spec_data[], WORD32 scratch[],
+    ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 expo,
+    WORD32 *imdct_scale);
+
 VOID ixheaacd_post_twiddle_dec(WORD32 out_ptr[], WORD32 spec_data[],
                                ia_aac_dec_imdct_tables_struct *ptr_imdct_tables,
                                WORD32 npoints);
@@ -38,19 +43,19 @@
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD32 npoints);
 
 VOID ixheaacd_post_twid_overlap_add_dec(
-    WORD16 pcm_out[], WORD32 spec_data[],
+    WORD32 pcm_out[], WORD32 spec_data[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
     WORD16 ch_fac);
 
 VOID ixheaacd_post_twid_overlap_add_armv7(
-    WORD16 pcm_out[], WORD32 spec_data[],
+    WORD32 pcm_out[], WORD32 spec_data[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
     WORD16 ch_fac);
 
 VOID ixheaacd_post_twid_overlap_add_armv8(
-    WORD16 pcm_out[], WORD32 spec_data[],
+    WORD32 pcm_out[], WORD32 spec_data[],
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
     WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
     WORD16 ch_fac);
@@ -60,6 +65,11 @@
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
     WORD32 neg_expo);
 
+VOID ixheaacd_pretwiddle_compute_960_dec(
+    WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
+    ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
+    WORD32 neg_expo);
+
 VOID ixheaacd_pretwiddle_compute_armv7(
     WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
     ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
@@ -85,12 +95,46 @@
 VOID ixheaacd_fft_480_ld(WORD32 *inp, WORD32 *op,
                          ia_aac_dec_imdct_tables_struct *imdct_tables_ptr);
 
+VOID ixheaacd_fft_5(WORD32 *inp, WORD32 *op);
+
+VOID ixheaacd_fft_3(WORD32 *inp, WORD32 *op);
+
+VOID ixheaacd_fft_960_15(WORD32 *inp, WORD32 *op,
+                         ia_aac_dec_imdct_tables_struct *imdct_tables_ptr);
+
+VOID ixheaacd_fft_960(WORD32 *inp, WORD32 *op,
+                      ia_aac_dec_imdct_tables_struct *imdct_tables_ptr);
+
+VOID ixheaacd_fft_120(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr,
+                      WORD32 npoints, WORD32* ptr_x, WORD32* ptr_y);
+
+VOID ixheaacd_fft_32_points(WORD16 *ptr_w, WORD32 npoints,
+                            WORD32* ptr_x, WORD32* ptr_y);
+
+VOID ixheaacd_ld_dec_fft_15_opt(WORD32 *inp, WORD32 *op, WORD32 *fft3out,
+                                WORD16 *re_arr_tab_sml_240_ptr);
+
+VOID ixheaacd_dec_rearrange_short(WORD32 *ip, WORD32 *op, WORD32 mdct_len_2,
+                                  WORD16 *re_arr_tab);
+
 VOID ixheaacd_pre_twiddle(WORD32 *xptr, WORD32 *data, WORD32 n,
                           WORD32 *cos_array_ptr, WORD32 neg_expo);
 
+VOID ixheaacd_pre_twiddle_960(WORD32 *xptr, WORD32 *data, WORD32 n,
+                              WORD32 *cos_array_ptr, WORD32 neg_expo);
+
+VOID ixheaacd_pre_twiddle_120(WORD32 *xptr, WORD32 *data, WORD32 n,
+                              WORD16 *cos_array_ptr, WORD32 neg_expo);
+
 VOID ixheaacd_post_twiddle_ld(WORD32 out[], WORD32 x[],
                               const WORD32 *cos_sin_ptr, WORD m);
 
+VOID ixheaacd_post_twiddle_960(WORD32 out[], WORD32 x[],
+                               const WORD32 *cos_sin_ptr, WORD m);
+
+VOID ixheaacd_post_twiddle_120(WORD32 out[], WORD32 x[],
+                               const WORD16 *cos_sin_ptr, WORD m);
+
 VOID ixheaacd_post_twiddle_eld(WORD32 out[], WORD32 x[],
                                const WORD32 *cos_sin_ptr, WORD m);
 
@@ -125,6 +169,10 @@
     WORD32 data[], WORD32 temp[], WORD32 *imdct_scale, WORD32 *cos_sin_ptr,
     ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 object_type);
 
+VOID ixheaacd_mdct_960(WORD32 *inp, WORD32 *scratch, WORD32 *mdct_scale,
+                       WORD32 mdct_flag,
+                       ia_aac_dec_imdct_tables_struct *imdct_tables_ptr);
+
 VOID ixheaacd_mdct_480_ld(WORD32 *inp, WORD32 *scratch, WORD32 *mdct_scale,
                           WORD32 mdct_flag,
                           ia_aac_dec_imdct_tables_struct *imdct_tables_ptr,
diff --git a/decoder/ixheaacd_aac_rom.c b/decoder/ixheaacd_aac_rom.c
index 8c3d426..4a3cc19 100644
--- a/decoder/ixheaacd_aac_rom.c
+++ b/decoder/ixheaacd_aac_rom.c
@@ -395,6 +395,121 @@
         12, 16, 20, 24, 28, 32, 32, 32, 32, 32, 32, 32, 32, 32, -1,
     },
 
+    // static const WORD16 sfb_96_960[41] =
+    {
+        4,    4,    4,    4,    4,    4,
+        4,    4,    4,    4,    4,    4,
+        4,    4,    8,    8,    8,    8,
+        8,   12,   12,   12,   12,   12,
+        16,   16,   24,   28,   36,   44,
+        64,   64,   64,   64,   64,   64,
+        64,   64,   64,   64,  -1
+    },
+
+    /* 13 scfbands */
+    // static const WORD16 sfb_96_120[13] =
+    {
+        4,    4,    4,    4,     4,   4,
+        8,    8,    8,   16,    28,  28,
+        -1
+    },
+
+    /* 47 scfbands*/
+    // static const WORD16 sfb_64_960[47] =
+    {
+        4,   4,   4,   4,   4,   4,   4,
+        4,   4,   4,   4,   4,   4,   4,
+        8,   8,   8,   8,  12,  12,  12,
+        16,  16,  16,  20,  24,  24,  28,
+        36,  40,  40,  40,  40,  40,  40,
+        40,  40,  40,  40,  40,  40,  40,
+        40,  40,  40,  16,  -1
+    },
+
+    /* 49 scfbands */
+    // static const WORD16 sfb_48_960[50] =
+    {
+        4,      4,      4,      4,      4,      4,
+        4,      4,      4,      4,      8,      8,
+        8,      8,      8,      8,      8,      12,
+        12,     12,     12,     16,     16,     20,
+        20,     24,     24,     28,     28,     32,
+        32,     32,     32,     32,     32,     32,
+        32,     32,     32,     32,     32,     32,
+        32,     32,     32,     32,     32,     32,
+        32,     -1
+    },
+
+    /* 14 scfbands */
+    // static const WORD16 sfb_48_120[15] =
+    {
+        4,      4,      4,      4,      4,      8,
+        8,      8,      12,     12,     12,     16,
+        16,     8,      -1
+    },
+
+
+    /* 47 scfbands */
+    // static const WORD16 sfb_24_960[47] =
+    {
+        4,      4,      4,      4,      4,      4,
+        4,      4,      4,      4,      4,      8,
+        8,      8,      8,      8,      8,      8,
+        8,      8,      8,      12,     12,     12,
+        12,     16,     16,     16,     20,     20,
+        24,     24,     28,     28,     32,     36,
+        36,     40,     44,     48,     52,     52,
+        64,     64,     64,     64,     -1
+    },
+
+    /* 15 scfbands */
+    // static const WORD16 sfb_24_120[16] =
+    {
+        4,      4,      4,      4,      4,      4,
+        4,      8,      8,      8,      12,     12,
+        16,     16,     12,     -1
+    },
+
+    /* 43 scfbands */
+    // static const WORD16 sfb_16_960[43] =
+    {
+        8,      8,      8,      8,      8,      8,
+        8,      8,      8,      8,      8,      12,
+        12,     12,     12,     12,     12,     12,
+        12,     12,     16,     16,     16,     16,
+        20,     20,     20,     24,     24,     28,
+        28,     32,     36,     40,     40,     44,
+        48,     52,     56,     60,     64,     64,
+        -1
+    },
+
+    /* 15 scfbands */
+    // static const WORD16 sfb_16_120[16] =
+    {
+        4,      4,      4,      4,      4,      4,
+        4,      4,      8,      8,      12,     12,
+        16,     20,     12,     -1
+    },
+
+    /* 40 scfbands */
+    // static const WORD16 sfb_8_960[41] =
+    {
+        12,     12,     12,     12,     12,     12,
+        12,     12,     12,     12,     12,     12,
+        12,     16,     16,     16,     16,     16,
+        16,     16,     20,     20,     20,     20,
+        24,     24,     24,     28,     28,     32,
+        36,     36,     40,     44,     48,     52,
+        56,     60,     64,     16,     -1
+    },
+
+    /* 15 scfbands */
+    // static const WORD16 sfb_8_120[16] =
+    {
+        4,      4,      4,      4,      4,      4,
+        4,      8,      8,      8,      8,      12,
+        16,     20,     12,     -1
+    },
 };  // end of ia_aac_dec_huffman_tables_struct
 
 const ia_aac_dec_block_tables_struct ixheaacd_aac_block_tables = {
@@ -539,7 +654,7 @@
             0, 0,
         }},
 
-    // const Word8 tns_max_bands_tbl_ld[12][4] =
+    // const WORD8 tns_max_bands_tbl_ld[12][4] =
     {
         /*{*/ 31, /* 96000 */
         /*{*/ 31, /* 88200 */
@@ -554,7 +669,7 @@
         /*{*/ 31, /* 11025 */
         /*{*/ 31, /*  8000 */
     },
-    // const Word8 tns_max_bands_tbl_480[12][4] =
+    // const WORD8 tns_max_bands_tbl_480[12][4] =
     {
         /*{*/ 31, /* 96000 */
         /*{*/ 31, /* 88200 */
@@ -568,8 +683,13 @@
         /*{*/ 30, /* 12000 */
         /*{*/ 30, /* 11025 */
         /*{*/ 30, /*  8000 */
-    }
-
+    },
+    // const WORD16 scale_table_960[4] =
+    {
+        /* Q14 format */
+        /* table of 2^(r/4) for r=0, 1, 2, 3 */
+        16385, 19486, 23172, 27557
+    },
 };  // end of ia_aac_dec_block_tables_struct */
 
 const ia_aac_dec_imdct_tables_struct ixheaacd_imdct_tables = {
@@ -2260,6 +2380,666 @@
      -23,   -23,   -23,   -23,   -23,   -23,   -23,   -23,   -23,   -22,
      -22,   -22,   -22,   -22,   -22,   -22,   -22,   -21,   -21,   -21,
      -21,   -21,   -21,   -20,   -20,   -20,   -20,   -20,   -20,   -19,
-     -19,   -19,   -19,   -18,   -18,   -18,   -18,   -18}
+     -19,   -19,   -19,   -18,   -18,   -18,   -18,   -18},
 
+    // const WORD16 only_long_window_sine_960[960] =
+    {
+        0x001B, 0x7FFF, 0x0050, 0x7FFF, 0x0086, 0x7FFF, 0x00BC, 0x7FFE, 0x00F1, 0x7FFE,
+        0x0127, 0x7FFE, 0x015C, 0x7FFD, 0x0192, 0x7FFD, 0x01C8, 0x7FFC, 0x01FD, 0x7FFB,
+        0x0233, 0x7FFA, 0x0269, 0x7FF9, 0x029E, 0x7FF8, 0x02D4, 0x7FF7, 0x0309, 0x7FF6,
+        0x033F, 0x7FF4, 0x0375, 0x7FF3, 0x03AA, 0x7FF2, 0x03E0, 0x7FF0, 0x0415, 0x7FEE,
+        0x044B, 0x7FED, 0x0480, 0x7FEB, 0x04B6, 0x7FE9, 0x04EC, 0x7FE7, 0x0521, 0x7FE5,
+        0x0557, 0x7FE2, 0x058C, 0x7FE0, 0x05C2, 0x7FDE, 0x05F7, 0x7FDB, 0x062D, 0x7FD9,
+        0x0663, 0x7FD6, 0x0698, 0x7FD3, 0x06CE, 0x7FD1, 0x0703, 0x7FCE, 0x0739, 0x7FCB,
+        0x076E, 0x7FC8, 0x07A4, 0x7FC5, 0x07D9, 0x7FC1, 0x080F, 0x7FBE, 0x0844, 0x7FBB,
+        0x087A, 0x7FB7, 0x08AF, 0x7FB3, 0x08E5, 0x7FB0, 0x091A, 0x7FAC, 0x0950, 0x7FA8,
+        0x0985, 0x7FA4, 0x09BB, 0x7FA0, 0x09F0, 0x7F9C, 0x0A26, 0x7F98, 0x0A5B, 0x7F94,
+        0x0A90, 0x7F8F, 0x0AC6, 0x7F8B, 0x0AFB, 0x7F86, 0x0B31, 0x7F82, 0x0B66, 0x7F7D,
+        0x0B9C, 0x7F78, 0x0BD1, 0x7F73, 0x0C06, 0x7F6E, 0x0C3C, 0x7F69, 0x0C71, 0x7F64,
+        0x0CA6, 0x7F5F, 0x0CDC, 0x7F59, 0x0D11, 0x7F54, 0x0D46, 0x7F4E, 0x0D7C, 0x7F49,
+        0x0DB1, 0x7F43, 0x0DE6, 0x7F3D, 0x0E1C, 0x7F37, 0x0E51, 0x7F31, 0x0E86, 0x7F2B,
+        0x0EBB, 0x7F25, 0x0EF1, 0x7F1F, 0x0F26, 0x7F19, 0x0F5B, 0x7F12, 0x0F90, 0x7F0C,
+        0x0FC6, 0x7F05, 0x0FFB, 0x7EFF, 0x1030, 0x7EF8, 0x1065, 0x7EF1, 0x109A, 0x7EEA,
+        0x10D0, 0x7EE3, 0x1105, 0x7EDC, 0x113A, 0x7ED5, 0x116F, 0x7ECE, 0x11A4, 0x7EC6,
+        0x11D9, 0x7EBF, 0x120E, 0x7EB7, 0x1243, 0x7EB0, 0x1278, 0x7EA8, 0x12AD, 0x7EA0,
+        0x12E2, 0x7E98, 0x1317, 0x7E90, 0x134C, 0x7E88, 0x1381, 0x7E80, 0x13B6, 0x7E78,
+        0x13EB, 0x7E70, 0x1420, 0x7E67, 0x1455, 0x7E5F, 0x148A, 0x7E56, 0x14BF, 0x7E4E,
+        0x14F4, 0x7E45, 0x1529, 0x7E3C, 0x155E, 0x7E33, 0x1593, 0x7E2A, 0x15C7, 0x7E21,
+        0x15FC, 0x7E18, 0x1631, 0x7E0F, 0x1666, 0x7E05, 0x169B, 0x7DFC, 0x16CF, 0x7DF2,
+        0x1704, 0x7DE9, 0x1739, 0x7DDF, 0x176E, 0x7DD5, 0x17A2, 0x7DCC, 0x17D7, 0x7DC2,
+        0x180C, 0x7DB8, 0x1840, 0x7DAD, 0x1875, 0x7DA3, 0x18AA, 0x7D99, 0x18DE, 0x7D8F,
+        0x1913, 0x7D84, 0x1947, 0x7D7A, 0x197C, 0x7D6F, 0x19B0, 0x7D64, 0x19E5, 0x7D59,
+        0x1A19, 0x7D4F, 0x1A4E, 0x7D44, 0x1A82, 0x7D39, 0x1AB7, 0x7D2D, 0x1AEB, 0x7D22,
+        0x1B20, 0x7D17, 0x1B54, 0x7D0B, 0x1B88, 0x7D00, 0x1BBD, 0x7CF4, 0x1BF1, 0x7CE9,
+        0x1C25, 0x7CDD, 0x1C5A, 0x7CD1, 0x1C8E, 0x7CC5, 0x1CC2, 0x7CB9, 0x1CF6, 0x7CAD,
+        0x1D2B, 0x7CA1, 0x1D5F, 0x7C95, 0x1D93, 0x7C88, 0x1DC7, 0x7C7C, 0x1DFB, 0x7C6F,
+        0x1E2F, 0x7C63, 0x1E64, 0x7C56, 0x1E98, 0x7C49, 0x1ECC, 0x7C3C, 0x1F00, 0x7C30,
+        0x1F34, 0x7C22, 0x1F68, 0x7C15, 0x1F9C, 0x7C08, 0x1FD0, 0x7BFB, 0x2004, 0x7BEE,
+        0x2037, 0x7BE0, 0x206B, 0x7BD3, 0x209F, 0x7BC5, 0x20D3, 0x7BB7, 0x2107, 0x7BA9,
+        0x213B, 0x7B9C, 0x216E, 0x7B8E, 0x21A2, 0x7B80, 0x21D6, 0x7B71, 0x220A, 0x7B63,
+        0x223D, 0x7B55, 0x2271, 0x7B47, 0x22A4, 0x7B38, 0x22D8, 0x7B29, 0x230C, 0x7B1B,
+        0x233F, 0x7B0C, 0x2373, 0x7AFD, 0x23A6, 0x7AEE, 0x23DA, 0x7ADF, 0x240D, 0x7AD0,
+        0x2441, 0x7AC1, 0x2474, 0x7AB2, 0x24A7, 0x7AA3, 0x24DB, 0x7A93, 0x250E, 0x7A84,
+        0x2541, 0x7A74, 0x2575, 0x7A65, 0x25A8, 0x7A55, 0x25DB, 0x7A45, 0x260E, 0x7A35,
+        0x2642, 0x7A25, 0x2675, 0x7A15, 0x26A8, 0x7A05, 0x26DB, 0x79F5, 0x270E, 0x79E4,
+        0x2741, 0x79D4, 0x2774, 0x79C4, 0x27A7, 0x79B3, 0x27DA, 0x79A2, 0x280D, 0x7992,
+        0x2840, 0x7981, 0x2873, 0x7970, 0x28A6, 0x795F, 0x28D8, 0x794E, 0x290B, 0x793D,
+        0x293E, 0x792B, 0x2971, 0x791A, 0x29A3, 0x7909, 0x29D6, 0x78F7, 0x2A09, 0x78E6,
+        0x2A3B, 0x78D4, 0x2A6E, 0x78C2, 0x2AA1, 0x78B0, 0x2AD3, 0x789F, 0x2B06, 0x788D,
+        0x2B38, 0x787B, 0x2B6B, 0x7868, 0x2B9D, 0x7856, 0x2BCF, 0x7844, 0x2C02, 0x7831,
+        0x2C34, 0x781F, 0x2C66, 0x780C, 0x2C99, 0x77FA, 0x2CCB, 0x77E7, 0x2CFD, 0x77D4,
+        0x2D2F, 0x77C1, 0x2D61, 0x77AE, 0x2D94, 0x779B, 0x2DC6, 0x7788, 0x2DF8, 0x7775,
+        0x2E2A, 0x7762, 0x2E5C, 0x774E, 0x2E8E, 0x773B, 0x2EC0, 0x7727, 0x2EF1, 0x7714,
+        0x2F23, 0x7700, 0x2F55, 0x76EC, 0x2F87, 0x76D8, 0x2FB9, 0x76C4, 0x2FEA, 0x76B0,
+        0x301C, 0x769C, 0x304E, 0x7688, 0x307F, 0x7674, 0x30B1, 0x765F, 0x30E3, 0x764B,
+        0x3114, 0x7636, 0x3146, 0x7622, 0x3177, 0x760D, 0x31A9, 0x75F8, 0x31DA, 0x75E4,
+        0x320B, 0x75CF, 0x323D, 0x75BA, 0x326E, 0x75A5, 0x329F, 0x758F, 0x32D0, 0x757A,
+        0x3302, 0x7565, 0x3333, 0x754F, 0x3364, 0x753A, 0x3395, 0x7524, 0x33C6, 0x750F,
+        0x33F7, 0x74F9, 0x3428, 0x74E3, 0x3459, 0x74CD, 0x348A, 0x74B7, 0x34BB, 0x74A1,
+        0x34EC, 0x748B, 0x351C, 0x7475, 0x354D, 0x745F, 0x357E, 0x7448, 0x35AF, 0x7432,
+        0x35DF, 0x741B, 0x3610, 0x7405, 0x3640, 0x73EE, 0x3671, 0x73D7, 0x36A1, 0x73C0,
+        0x36D2, 0x73AA, 0x3702, 0x7393, 0x3733, 0x737B, 0x3763, 0x7364, 0x3793, 0x734D,
+        0x37C4, 0x7336, 0x37F4, 0x731E, 0x3824, 0x7307, 0x3854, 0x72EF, 0x3884, 0x72D8,
+        0x38B5, 0x72C0, 0x38E5, 0x72A8, 0x3915, 0x7290, 0x3945, 0x7278, 0x3974, 0x7260,
+        0x39A4, 0x7248, 0x39D4, 0x7230, 0x3A04, 0x7218, 0x3A34, 0x71FF, 0x3A64, 0x71E7,
+        0x3A93, 0x71CF, 0x3AC3, 0x71B6, 0x3AF2, 0x719D, 0x3B22, 0x7185, 0x3B52, 0x716C,
+        0x3B81, 0x7153, 0x3BB1, 0x713A, 0x3BE0, 0x7121, 0x3C0F, 0x7108, 0x3C3F, 0x70EF,
+        0x3C6E, 0x70D5, 0x3C9D, 0x70BC, 0x3CCC, 0x70A2, 0x3CFB, 0x7089, 0x3D2B, 0x706F,
+        0x3D5A, 0x7056, 0x3D89, 0x703C, 0x3DB8, 0x7022, 0x3DE7, 0x7008, 0x3E16, 0x6FEE,
+        0x3E44, 0x6FD4, 0x3E73, 0x6FBA, 0x3EA2, 0x6FA0, 0x3ED1, 0x6F86, 0x3EFF, 0x6F6B,
+        0x3F2E, 0x6F51, 0x3F5D, 0x6F36, 0x3F8B, 0x6F1C, 0x3FBA, 0x6F01, 0x3FE8, 0x6EE6,
+        0x4017, 0x6ECC, 0x4045, 0x6EB1, 0x4073, 0x6E96, 0x40A2, 0x6E7B, 0x40D0, 0x6E60,
+        0x40FE, 0x6E44, 0x412C, 0x6E29, 0x415A, 0x6E0E, 0x4189, 0x6DF2, 0x41B7, 0x6DD7,
+        0x41E5, 0x6DBB, 0x4213, 0x6DA0, 0x4240, 0x6D84, 0x426E, 0x6D68, 0x429C, 0x6D4C,
+        0x42CA, 0x6D30, 0x42F8, 0x6D14, 0x4325, 0x6CF8, 0x4353, 0x6CDC, 0x4380, 0x6CC0,
+        0x43AE, 0x6CA4, 0x43DB, 0x6C87, 0x4409, 0x6C6B, 0x4436, 0x6C4E, 0x4464, 0x6C32,
+        0x4491, 0x6C15, 0x44BE, 0x6BF8, 0x44EB, 0x6BDB, 0x4519, 0x6BBE, 0x4546, 0x6BA1,
+        0x4573, 0x6B84, 0x45A0, 0x6B67, 0x45CD, 0x6B4A, 0x45FA, 0x6B2D, 0x4626, 0x6B0F,
+        0x4653, 0x6AF2, 0x4680, 0x6AD5, 0x46AD, 0x6AB7, 0x46D9, 0x6A99, 0x4706, 0x6A7C,
+        0x4733, 0x6A5E, 0x475F, 0x6A40, 0x478C, 0x6A22, 0x47B8, 0x6A04, 0x47E4, 0x69E6,
+        0x4811, 0x69C8, 0x483D, 0x69AA, 0x4869, 0x698B, 0x4896, 0x696D, 0x48C2, 0x694F,
+        0x48EE, 0x6930, 0x491A, 0x6911, 0x4946, 0x68F3, 0x4972, 0x68D4, 0x499E, 0x68B5,
+        0x49C9, 0x6896, 0x49F5, 0x6877, 0x4A21, 0x6858, 0x4A4D, 0x6839, 0x4A78, 0x681A,
+        0x4AA4, 0x67FB, 0x4ACF, 0x67DC, 0x4AFB, 0x67BC, 0x4B26, 0x679D, 0x4B52, 0x677D,
+        0x4B7D, 0x675E, 0x4BA8, 0x673E, 0x4BD3, 0x671E, 0x4BFF, 0x66FF, 0x4C2A, 0x66DF,
+        0x4C55, 0x66BF, 0x4C80, 0x669F, 0x4CAB, 0x667F, 0x4CD6, 0x665E, 0x4D01, 0x663E,
+        0x4D2B, 0x661E, 0x4D56, 0x65FE, 0x4D81, 0x65DD, 0x4DAB, 0x65BD, 0x4DD6, 0x659C,
+        0x4E01, 0x657B, 0x4E2B, 0x655B, 0x4E55, 0x653A, 0x4E80, 0x6519, 0x4EAA, 0x64F8,
+        0x4ED4, 0x64D7, 0x4EFF, 0x64B6, 0x4F29, 0x6495, 0x4F53, 0x6474, 0x4F7D, 0x6453,
+        0x4FA7, 0x6431, 0x4FD1, 0x6410, 0x4FFB, 0x63EE, 0x5025, 0x63CD, 0x504E, 0x63AB,
+        0x5078, 0x638A, 0x50A2, 0x6368, 0x50CB, 0x6346, 0x50F5, 0x6324, 0x511E, 0x6302,
+        0x5148, 0x62E0, 0x5171, 0x62BE, 0x519B, 0x629C, 0x51C4, 0x627A, 0x51ED, 0x6257,
+        0x5216, 0x6235, 0x523F, 0x6213, 0x5268, 0x61F0, 0x5291, 0x61CE, 0x52BA, 0x61AB,
+        0x52E3, 0x6188, 0x530C, 0x6166, 0x5335, 0x6143, 0x535E, 0x6120, 0x5386, 0x60FD,
+        0x53AF, 0x60DA, 0x53D7, 0x60B7, 0x5400, 0x6094, 0x5428, 0x6070, 0x5451, 0x604D,
+        0x5479, 0x602A, 0x54A1, 0x6006, 0x54C9, 0x5FE3, 0x54F2, 0x5FBF, 0x551A, 0x5F9C,
+        0x5542, 0x5F78, 0x556A, 0x5F54, 0x5591, 0x5F31, 0x55B9, 0x5F0D, 0x55E1, 0x5EE9,
+        0x5609, 0x5EC5, 0x5630, 0x5EA1, 0x5658, 0x5E7D, 0x5680, 0x5E58, 0x56A7, 0x5E34,
+        0x56CF, 0x5E10, 0x56F6, 0x5DEB, 0x571D, 0x5DC7, 0x5745, 0x5DA2, 0x576C, 0x5D7E,
+        0x5793, 0x5D59, 0x57BA, 0x5D34, 0x57E1, 0x5D10, 0x5808, 0x5CEB, 0x582F, 0x5CC6,
+        0x5856, 0x5CA1, 0x587C, 0x5C7C, 0x58A3, 0x5C57, 0x58CA, 0x5C32, 0x58F0, 0x5C0C,
+        0x5917, 0x5BE7, 0x593D, 0x5BC2, 0x5964, 0x5B9C, 0x598A, 0x5B77, 0x59B0, 0x5B51,
+        0x59D7, 0x5B2C, 0x59FD, 0x5B06, 0x5A23, 0x5AE0, 0x5A49, 0x5ABB, 0x5A6F, 0x5A95
+    },
+
+    // const WORD16 only_long_window_kbd_960[960] =
+    {
+        0x000A, 0x7FFF, 0x000F, 0x7FFF, 0x0013, 0x7FFF, 0x0016, 0x7FFF, 0x001A, 0x7FFF,
+        0x001D, 0x7FFF, 0x0021, 0x7FFF, 0x0025, 0x7FFF, 0x0028, 0x7FFF, 0x002C, 0x7FFF,
+        0x002F, 0x7FFF, 0x0033, 0x7FFF, 0x0037, 0x7FFF, 0x003B, 0x7FFF, 0x003F, 0x7FFF,
+        0x0043, 0x7FFF, 0x0047, 0x7FFF, 0x004B, 0x7FFF, 0x0050, 0x7FFF, 0x0054, 0x7FFF,
+        0x0059, 0x7FFF, 0x005D, 0x7FFF, 0x0062, 0x7FFF, 0x0067, 0x7FFF, 0x006C, 0x7FFF,
+        0x0071, 0x7FFF, 0x0076, 0x7FFF, 0x007B, 0x7FFF, 0x0080, 0x7FFF, 0x0086, 0x7FFF,
+        0x008C, 0x7FFF, 0x0091, 0x7FFF, 0x0097, 0x7FFF, 0x009D, 0x7FFF, 0x00A3, 0x7FFF,
+        0x00A9, 0x7FFF, 0x00B0, 0x7FFF, 0x00B6, 0x7FFE, 0x00BD, 0x7FFE, 0x00C3, 0x7FFE,
+        0x00CA, 0x7FFE, 0x00D1, 0x7FFE, 0x00D8, 0x7FFE, 0x00E0, 0x7FFE, 0x00E7, 0x7FFE,
+        0x00EF, 0x7FFE, 0x00F6, 0x7FFE, 0x00FE, 0x7FFE, 0x0106, 0x7FFE, 0x010E, 0x7FFE,
+        0x0116, 0x7FFE, 0x011F, 0x7FFE, 0x0127, 0x7FFE, 0x0130, 0x7FFE, 0x0139, 0x7FFE,
+        0x0142, 0x7FFD, 0x014B, 0x7FFD, 0x0154, 0x7FFD, 0x015E, 0x7FFD, 0x0167, 0x7FFD,
+        0x0171, 0x7FFD, 0x017B, 0x7FFD, 0x0185, 0x7FFD, 0x018F, 0x7FFD, 0x019A, 0x7FFC,
+        0x01A4, 0x7FFC, 0x01AF, 0x7FFC, 0x01BA, 0x7FFC, 0x01C5, 0x7FFC, 0x01D0, 0x7FFC,
+        0x01DC, 0x7FFC, 0x01E7, 0x7FFB, 0x01F3, 0x7FFB, 0x01FF, 0x7FFB, 0x020B, 0x7FFB,
+        0x0218, 0x7FFB, 0x0224, 0x7FFA, 0x0231, 0x7FFA, 0x023E, 0x7FFA, 0x024B, 0x7FFA,
+        0x0258, 0x7FFA, 0x0265, 0x7FF9, 0x0273, 0x7FF9, 0x0281, 0x7FF9, 0x028F, 0x7FF8,
+        0x029D, 0x7FF8, 0x02AC, 0x7FF8, 0x02BA, 0x7FF8, 0x02C9, 0x7FF7, 0x02D8, 0x7FF7,
+        0x02E7, 0x7FF7, 0x02F7, 0x7FF6, 0x0306, 0x7FF6, 0x0316, 0x7FF5, 0x0326, 0x7FF5,
+        0x0336, 0x7FF5, 0x0347, 0x7FF4, 0x0357, 0x7FF4, 0x0368, 0x7FF3, 0x0379, 0x7FF3,
+        0x038A, 0x7FF2, 0x039C, 0x7FF2, 0x03AE, 0x7FF1, 0x03BF, 0x7FF1, 0x03D2, 0x7FF0,
+        0x03E4, 0x7FF0, 0x03F7, 0x7FEF, 0x0409, 0x7FEF, 0x041C, 0x7FEE, 0x0430, 0x7FED,
+        0x0443, 0x7FED, 0x0457, 0x7FEC, 0x046B, 0x7FEB, 0x047F, 0x7FEB, 0x0493, 0x7FEA,
+        0x04A8, 0x7FE9, 0x04BD, 0x7FE9, 0x04D2, 0x7FE8, 0x04E7, 0x7FE7, 0x04FD, 0x7FE6,
+        0x0513, 0x7FE5, 0x0529, 0x7FE4, 0x053F, 0x7FE3, 0x0555, 0x7FE3, 0x056C, 0x7FE2,
+        0x0583, 0x7FE1, 0x059A, 0x7FE0, 0x05B2, 0x7FDF, 0x05CA, 0x7FDD, 0x05E2, 0x7FDC,
+        0x05FA, 0x7FDB, 0x0612, 0x7FDA, 0x062B, 0x7FD9, 0x0644, 0x7FD8, 0x065D, 0x7FD6,
+        0x0677, 0x7FD5, 0x0690, 0x7FD4, 0x06AA, 0x7FD3, 0x06C5, 0x7FD1, 0x06DF, 0x7FD0,
+        0x06FA, 0x7FCE, 0x0715, 0x7FCD, 0x0730, 0x7FCB, 0x074C, 0x7FCA, 0x0768, 0x7FC8,
+        0x0784, 0x7FC6, 0x07A0, 0x7FC5, 0x07BD, 0x7FC3, 0x07D9, 0x7FC1, 0x07F6, 0x7FC0,
+        0x0814, 0x7FBE, 0x0832, 0x7FBC, 0x084F, 0x7FBA, 0x086E, 0x7FB8, 0x088C, 0x7FB6,
+        0x08AB, 0x7FB4, 0x08CA, 0x7FB2, 0x08E9, 0x7FB0, 0x0909, 0x7FAD, 0x0928, 0x7FAB,
+        0x0949, 0x7FA9, 0x0969, 0x7FA6, 0x098A, 0x7FA4, 0x09AA, 0x7FA1, 0x09CC, 0x7F9F,
+        0x09ED, 0x7F9C, 0x0A0F, 0x7F9A, 0x0A31, 0x7F97, 0x0A53, 0x7F94, 0x0A76, 0x7F91,
+        0x0A99, 0x7F8F, 0x0ABC, 0x7F8C, 0x0ADF, 0x7F89, 0x0B03, 0x7F86, 0x0B27, 0x7F82,
+        0x0B4B, 0x7F7F, 0x0B70, 0x7F7C, 0x0B94, 0x7F79, 0x0BBA, 0x7F75, 0x0BDF, 0x7F72,
+        0x0C05, 0x7F6E, 0x0C2B, 0x7F6B, 0x0C51, 0x7F67, 0x0C77, 0x7F63, 0x0C9E, 0x7F5F,
+        0x0CC5, 0x7F5B, 0x0CED, 0x7F58, 0x0D14, 0x7F53, 0x0D3C, 0x7F4F, 0x0D65, 0x7F4B,
+        0x0D8D, 0x7F47, 0x0DB6, 0x7F42, 0x0DDF, 0x7F3E, 0x0E08, 0x7F39, 0x0E32, 0x7F35,
+        0x0E5C, 0x7F30, 0x0E86, 0x7F2B, 0x0EB1, 0x7F26, 0x0EDC, 0x7F21, 0x0F07, 0x7F1C,
+        0x0F32, 0x7F17, 0x0F5E, 0x7F12, 0x0F8A, 0x7F0D, 0x0FB6, 0x7F07, 0x0FE3, 0x7F02,
+        0x1010, 0x7EFC, 0x103D, 0x7EF6, 0x106A, 0x7EF0, 0x1098, 0x7EEA, 0x10C6, 0x7EE4,
+        0x10F4, 0x7EDE, 0x1123, 0x7ED8, 0x1152, 0x7ED2, 0x1181, 0x7ECB, 0x11B0, 0x7EC5,
+        0x11E0, 0x7EBE, 0x1210, 0x7EB7, 0x1240, 0x7EB0, 0x1271, 0x7EA9, 0x12A2, 0x7EA2,
+        0x12D3, 0x7E9B, 0x1304, 0x7E93, 0x1336, 0x7E8C, 0x1368, 0x7E84, 0x139A, 0x7E7C,
+        0x13CD, 0x7E75, 0x1400, 0x7E6D, 0x1433, 0x7E64, 0x1466, 0x7E5C, 0x149A, 0x7E54,
+        0x14CE, 0x7E4B, 0x1502, 0x7E43, 0x1537, 0x7E3A, 0x156C, 0x7E31, 0x15A1, 0x7E28,
+        0x15D6, 0x7E1F, 0x160C, 0x7E15, 0x1642, 0x7E0C, 0x1678, 0x7E02, 0x16AE, 0x7DF8,
+        0x16E5, 0x7DEF, 0x171C, 0x7DE4, 0x1754, 0x7DDA, 0x178B, 0x7DD0, 0x17C3, 0x7DC5,
+        0x17FB, 0x7DBB, 0x1833, 0x7DB0, 0x186C, 0x7DA5, 0x18A5, 0x7D9A, 0x18DE, 0x7D8F,
+        0x1918, 0x7D83, 0x1952, 0x7D78, 0x198C, 0x7D6C, 0x19C6, 0x7D60, 0x1A00, 0x7D54,
+        0x1A3B, 0x7D48, 0x1A76, 0x7D3B, 0x1AB1, 0x7D2F, 0x1AED, 0x7D22, 0x1B29, 0x7D15,
+        0x1B65, 0x7D08, 0x1BA1, 0x7CFA, 0x1BDE, 0x7CED, 0x1C1B, 0x7CDF, 0x1C58, 0x7CD2,
+        0x1C95, 0x7CC4, 0x1CD3, 0x7CB5, 0x1D11, 0x7CA7, 0x1D4F, 0x7C98, 0x1D8D, 0x7C8A,
+        0x1DCC, 0x7C7B, 0x1E0B, 0x7C6C, 0x1E4A, 0x7C5C, 0x1E89, 0x7C4D, 0x1EC9, 0x7C3D,
+        0x1F08, 0x7C2D, 0x1F48, 0x7C1D, 0x1F89, 0x7C0D, 0x1FC9, 0x7BFD, 0x200A, 0x7BEC,
+        0x204B, 0x7BDB, 0x208C, 0x7BCA, 0x20CE, 0x7BB9, 0x210F, 0x7BA7, 0x2151, 0x7B95,
+        0x2193, 0x7B84, 0x21D6, 0x7B71, 0x2218, 0x7B5F, 0x225B, 0x7B4D, 0x229E, 0x7B3A,
+        0x22E1, 0x7B27, 0x2325, 0x7B14, 0x2369, 0x7B00, 0x23AC, 0x7AED, 0x23F1, 0x7AD9,
+        0x2435, 0x7AC5, 0x2479, 0x7AB0, 0x24BE, 0x7A9C, 0x2503, 0x7A87, 0x2548, 0x7A72,
+        0x258D, 0x7A5D, 0x25D3, 0x7A48, 0x2619, 0x7A32, 0x265F, 0x7A1C, 0x26A5, 0x7A06,
+        0x26EB, 0x79F0, 0x2731, 0x79D9, 0x2778, 0x79C2, 0x27BF, 0x79AB, 0x2806, 0x7994,
+        0x284D, 0x797C, 0x2895, 0x7965, 0x28DC, 0x794C, 0x2924, 0x7934, 0x296C, 0x791C,
+        0x29B4, 0x7903, 0x29FC, 0x78EA, 0x2A45, 0x78D1, 0x2A8E, 0x78B7, 0x2AD6, 0x789D,
+        0x2B1F, 0x7883, 0x2B68, 0x7869, 0x2BB2, 0x784F, 0x2BFB, 0x7834, 0x2C45, 0x7819,
+        0x2C8E, 0x77FE, 0x2CD8, 0x77E2, 0x2D22, 0x77C6, 0x2D6D, 0x77AA, 0x2DB7, 0x778E,
+        0x2E01, 0x7771, 0x2E4C, 0x7754, 0x2E97, 0x7737, 0x2EE2, 0x771A, 0x2F2D, 0x76FC,
+        0x2F78, 0x76DE, 0x2FC3, 0x76C0, 0x300F, 0x76A2, 0x305A, 0x7683, 0x30A6, 0x7664,
+        0x30F2, 0x7645, 0x313D, 0x7625, 0x318A, 0x7606, 0x31D6, 0x75E5, 0x3222, 0x75C5,
+        0x326E, 0x75A4, 0x32BB, 0x7584, 0x3307, 0x7562, 0x3354, 0x7541, 0x33A1, 0x751F,
+        0x33EE, 0x74FD, 0x343B, 0x74DB, 0x3488, 0x74B8, 0x34D5, 0x7496, 0x3522, 0x7472,
+        0x356F, 0x744F, 0x35BD, 0x742B, 0x360A, 0x7407, 0x3658, 0x73E3, 0x36A5, 0x73BF,
+        0x36F3, 0x739A, 0x3741, 0x7375, 0x378F, 0x734F, 0x37DD, 0x732A, 0x382B, 0x7304,
+        0x3879, 0x72DD, 0x38C7, 0x72B7, 0x3915, 0x7290, 0x3963, 0x7269, 0x39B1, 0x7242,
+        0x3A00, 0x721A, 0x3A4E, 0x71F2, 0x3A9C, 0x71CA, 0x3AEB, 0x71A1, 0x3B39, 0x7178,
+        0x3B88, 0x714F, 0x3BD7, 0x7126, 0x3C25, 0x70FC, 0x3C74, 0x70D2, 0x3CC2, 0x70A8,
+        0x3D11, 0x707D, 0x3D60, 0x7052, 0x3DAE, 0x7027, 0x3DFD, 0x6FFC, 0x3E4C, 0x6FD0,
+        0x3E9B, 0x6FA4, 0x3EEA, 0x6F78, 0x3F38, 0x6F4B, 0x3F87, 0x6F1E, 0x3FD6, 0x6EF1,
+        0x4025, 0x6EC4, 0x4073, 0x6E96, 0x40C2, 0x6E68, 0x4111, 0x6E39, 0x4160, 0x6E0B,
+        0x41AF, 0x6DDC, 0x41FD, 0x6DAD, 0x424C, 0x6D7D, 0x429B, 0x6D4D, 0x42E9, 0x6D1D,
+        0x4338, 0x6CED, 0x4387, 0x6CBC, 0x43D5, 0x6C8B, 0x4424, 0x6C5A, 0x4472, 0x6C28,
+        0x44C1, 0x6BF7, 0x450F, 0x6BC4, 0x455E, 0x6B92, 0x45AC, 0x6B5F, 0x45FA, 0x6B2C,
+        0x4648, 0x6AF9, 0x4697, 0x6AC6, 0x46E5, 0x6A92, 0x4733, 0x6A5E, 0x4781, 0x6A29,
+        0x47CF, 0x69F5, 0x481D, 0x69C0, 0x486B, 0x698A, 0x48B8, 0x6955, 0x4906, 0x691F,
+        0x4954, 0x68E9, 0x49A1, 0x68B3, 0x49EF, 0x687C, 0x4A3C, 0x6845, 0x4A89, 0x680E,
+        0x4AD7, 0x67D6, 0x4B24, 0x679F, 0x4B71, 0x6767, 0x4BBE, 0x672E, 0x4C0B, 0x66F6,
+        0x4C57, 0x66BD, 0x4CA4, 0x6684, 0x4CF0, 0x664A, 0x4D3D, 0x6611, 0x4D89, 0x65D7,
+        0x4DD5, 0x659D, 0x4E21, 0x6562, 0x4E6D, 0x6527, 0x4EB9, 0x64EC, 0x4F05, 0x64B1,
+        0x4F51, 0x6476, 0x4F9C, 0x643A, 0x4FE8, 0x63FE, 0x5033, 0x63C1, 0x507E, 0x6385,
+        0x50C9, 0x6348, 0x5114, 0x630B, 0x515E, 0x62CE, 0x51A9, 0x6290, 0x51F3, 0x6252,
+        0x523E, 0x6214, 0x5288, 0x61D6, 0x52D2, 0x6197, 0x531C, 0x6158, 0x5365, 0x6119,
+        0x53AF, 0x60DA, 0x53F8, 0x609A, 0x5441, 0x605B, 0x548A, 0x601B, 0x54D3, 0x5FDA,
+        0x551C, 0x5F9A, 0x5564, 0x5F59, 0x55AD, 0x5F18, 0x55F5, 0x5ED7, 0x563D, 0x5E95,
+        0x5685, 0x5E53, 0x56CD, 0x5E12, 0x5714, 0x5DCF, 0x575B, 0x5D8D, 0x57A3, 0x5D4A,
+        0x57E9, 0x5D08, 0x5830, 0x5CC4, 0x5877, 0x5C81, 0x58BD, 0x5C3E, 0x5903, 0x5BFA,
+        0x5949, 0x5BB6, 0x598F, 0x5B72, 0x59D5, 0x5B2E, 0x5A1A, 0x5AE9, 0x5A5F, 0x5AA4
+    },
+
+    // const WORD16 only_short_window_sine_120[120] =
+    {
+        0x00D6, 0x7FFE, 0x0283, 0x7FF9, 0x0430, 0x7FED, 0x05DD, 0x7FDD, 0x0789, 0x7FC6,
+        0x0935, 0x7FAA, 0x0AE1, 0x7F88, 0x0C8C, 0x7F61, 0x0E36, 0x7F34, 0x0FE0, 0x7F02,
+        0x1189, 0x7ECA, 0x1332, 0x7E8C, 0x14DA, 0x7E49, 0x1680, 0x7E01, 0x1826, 0x7DB3,
+        0x19CB, 0x7D5F, 0x1B6E, 0x7D06, 0x1D11, 0x7CA7, 0x1EB2, 0x7C43, 0x2051, 0x7BD9,
+        0x21F0, 0x7B6A, 0x238D, 0x7AF6, 0x2528, 0x7A7C, 0x26C1, 0x79FD, 0x2859, 0x7978,
+        0x29EF, 0x78EE, 0x2B84, 0x785F, 0x2D16, 0x77CB, 0x2EA7, 0x7731, 0x3035, 0x7692,
+        0x31C1, 0x75EE, 0x334B, 0x7545, 0x34D3, 0x7496, 0x3659, 0x73E3, 0x37DC, 0x732A,
+        0x395D, 0x726C, 0x3ADB, 0x71AA, 0x3C56, 0x70E2, 0x3DCF, 0x7015, 0x3F45, 0x6F44,
+        0x40B9, 0x6E6D, 0x4229, 0x6D92, 0x4397, 0x6CB2, 0x4502, 0x6BCD, 0x466A, 0x6AE3,
+        0x47CE, 0x69F5, 0x4930, 0x6902, 0x4A8E, 0x680B, 0x4BE9, 0x670E, 0x4D41, 0x660E,
+        0x4E95, 0x6509, 0x4FE6, 0x63FF, 0x5133, 0x62F1, 0x527D, 0x61DF, 0x53C3, 0x60C8,
+        0x5506, 0x5FAE, 0x5644, 0x5E8F, 0x577F, 0x5D6B, 0x58B6, 0x5C44, 0x59EA, 0x5B19
+    },
+
+    // const WORD16 only_short_window_kbd_120[120] =
+    {
+        0x0001, 0x7FFF, 0x0004, 0x7FFF, 0x0008, 0x7FFF, 0x000E, 0x7FFF, 0x0016, 0x7FFF,
+        0x0021, 0x7FFF, 0x0030, 0x7FFF, 0x0042, 0x7FFF, 0x0059, 0x7FFF, 0x0075, 0x7FFF,
+        0x0097, 0x7FFF, 0x00C1, 0x7FFE, 0x00F2, 0x7FFE, 0x012D, 0x7FFE, 0x0171, 0x7FFD,
+        0x01C1, 0x7FFC, 0x021D, 0x7FFB, 0x0286, 0x7FF9, 0x02FE, 0x7FF6, 0x0385, 0x7FF3,
+        0x041E, 0x7FEE, 0x04C9, 0x7FE8, 0x0586, 0x7FE0, 0x0658, 0x7FD7, 0x0740, 0x7FCA,
+        0x083E, 0x7FBB, 0x0953, 0x7FA8, 0x0A80, 0x7F91, 0x0BC7, 0x7F74, 0x0D27, 0x7F52,
+        0x0EA0, 0x7F28, 0x1035, 0x7EF7, 0x11E3, 0x7EBD, 0x13AD, 0x7E7A, 0x1591, 0x7E2A,
+        0x1790, 0x7DCF, 0x19A8, 0x7D66, 0x1BDA, 0x7CEE, 0x1E25, 0x7C65, 0x2087, 0x7BCB,
+        0x2300, 0x7B1E, 0x258E, 0x7A5D, 0x2830, 0x7986, 0x2AE5, 0x7898, 0x2DA9, 0x7793,
+        0x307D, 0x7675, 0x335D, 0x753D, 0x3647, 0x73EB, 0x393A, 0x727E, 0x3C33, 0x70F5,
+        0x3F2F, 0x6F50, 0x422D, 0x6D90, 0x452A, 0x6BB4, 0x4823, 0x69BC, 0x4B16, 0x67A9,
+        0x4E01, 0x657B, 0x50E2, 0x6334, 0x53B5, 0x60D4, 0x567A, 0x5E5D, 0x592F, 0x5BD0
+    },
+
+    // WORD16 re_arr_tab_32[480];
+    {
+        0,      15,     30,     45,     60,     75,     90,     105,    120,    135,
+        150,    165,    180,    195,    210,    225,    240,    255,    270,    285,
+        300,    315,    330,    345,    360,    375,    390,    405,    420,    435,
+        450,    465,    32,     47,     62,     77,     92,     107,    122,    137,
+        152,    167,    182,    197,    212,    227,    242,    257,    272,    287,
+        302,    317,    332,    347,    362,    377,    392,    407,    422,    437,
+        452,    467,    2,      17,     64,     79,     94,     109,    124,    139,
+        154,    169,    184,    199,    214,    229,    244,    259,    274,    289,
+        304,    319,    334,    349,    364,    379,    394,    409,    424,    439,
+        454,    469,    4,      19,     34,     49,     96,     111,    126,    141,
+        156,    171,    186,    201,    216,    231,    246,    261,    276,    291,
+        306,    321,    336,    351,    366,    381,    396,    411,    426,    441,
+        456,    471,    6,      21,     36,     51,     66,     81,     128,    143,
+        158,    173,    188,    203,    218,    233,    248,    263,    278,    293,
+        308,    323,    338,    353,    368,    383,    398,    413,    428,    443,
+        458,    473,    8,      23,     38,     53,     68,     83,     98,     113,
+        160,    175,    190,    205,    220,    235,    250,    265,    280,    295,
+        310,    325,    340,    355,    370,    385,    400,    415,    430,    445,
+        460,    475,    10,     25,     40,     55,     70,     85,     100,    115,
+        130,    145,    192,    207,    222,    237,    252,    267,    282,    297,
+        312,    327,    342,    357,    372,    387,    402,    417,    432,    447,
+        462,    477,    12,     27,     42,     57,     72,     87,     102,    117,
+        132,    147,    162,    177,    224,    239,    254,    269,    284,    299,
+        314,    329,    344,    359,    374,    389,    404,    419,    434,    449,
+        464,    479,    14,     29,     44,     59,     74,     89,     104,    119,
+        134,    149,    164,    179,    194,    209,    256,    271,    286,    301,
+        316,    331,    346,    361,    376,    391,    406,    421,    436,    451,
+        466,    1,      16,     31,     46,     61,     76,     91,     106,    121,
+        136,    151,    166,    181,    196,    211,    226,    241,    288,    303,
+        318,    333,    348,    363,    378,    393,    408,    423,    438,    453,
+        468,    3,      18,     33,     48,     63,     78,     93,     108,    123,
+        138,    153,    168,    183,    198,    213,    228,    243,    258,    273,
+        320,    335,    350,    365,    380,    395,    410,    425,    440,    455,
+        470,    5,      20,     35,     50,     65,     80,     95,     110,    125,
+        140,    155,    170,    185,    200,    215,    230,    245,    260,    275,
+        290,    305,    352,    367,    382,    397,    412,    427,    442,    457,
+        472,    7,      22,     37,     52,     67,     82,     97,     112,    127,
+        142,    157,    172,    187,    202,    217,    232,    247,    262,    277,
+        292,    307,    322,    337,    384,    399,    414,    429,    444,    459,
+        474,    9,      24,     39,     54,     69,     84,     99,     114,    129,
+        144,    159,    174,    189,    204,    219,    234,    249,    264,    279,
+        294,    309,    324,    339,    354,    369,    416,    431,    446,    461,
+        476,    11,     26,     41,     56,     71,     86,     101,    116,    131,
+        146,    161,    176,    191,    206,    221,    236,    251,    266,    281,
+        296,    311,    326,    341,    356,    371,    386,    401,    448,    463,
+        478,    13,     28,     43,     58,     73,     88,     103,    118,    133,
+        148,    163,    178,    193,    208,    223,    238,    253,    268,    283,
+        298,    313,    328,    343,    358,    373,    388,    403,    418,    433
+    },
+
+    // const WORD16 re_arr_tab_sml[FFT15 + 1] =
+    {
+        0,      4,      8,      9,      13,     2,      3,      7,
+        11,     12,     1,      5,      6,      10,     14,     0
+    },
+
+    // const WORD16 re_arr_tab_4[60] =
+    {
+        0,      15,     30,     45,     4,      19,     34,     49,     8,      23,
+        38,     53,     12,     27,     42,     57,     16,     31,     46,     1,
+        20,     35,     50,     5,      24,     39,     54,     9,      28,     43,
+        58,     13,     32,     47,     2,      17,     36,     51,     6,      21,
+        40,     55,     10,     25,     44,     59,     14,     29,     48,     3,
+        18,     33,     52,     7,      22,     37,     56,     11,     26,     41
+    },
+
+    // const WORD16 re_arr_tab_15_4[60] =
+    {
+        0,      4,      8,      12,     16,     20,     24,     28,     32,     36,
+        40,     44,     48,     52,     56,     1,      5,      9,      13,     17,
+        21,     25,     29,     33,     37,     41,     45,     49,     53,     57,
+         2,     6,      10,     14,     18,     22,     26,     30,     34,     38,
+        42,     46,     50,     54,     58,     3,      7,      11,     15,     19,
+        23,     27,     31,     35,     39,     43,     47,     51,     55,     59
+    },
+
+    // const WORD16 re_arr_tab_120[60] =
+    {
+        0,      16,     32,     48,     4,      20,     36,     52,     8,      24,
+        40,     56,     12,     28,     44,     45,     1,      17,     33,     49,
+        5,      21,     37,     53,     9,      25,     41,     57,     13,     29,
+        30,     46,     2,      18,     34,     50,     6,      22,     38,     54,
+        10,     26,     42,     58,     14,     15,     31,     47,     3,      19,
+        35,     51,     7,      23,     39,     55,     11,     27,     43,     59
+    },
+
+    // WORD16 re_arr_tab_5[FFT15 + 1] =
+    {
+        0,      3,      6,      9,      12,     5,      8,      11,
+        14,     2,      10,     13,     1,      4,      7,      0
+    },
+
+    // WORD16 re_arr_tab_3[FFT15 + 1] =
+    {
+        0,      5,      10,     1,      6,      11,     2,      7,
+        12,     3,      8,      13,     4,      9,      14,     0
+    },
+
+    // WORD16 re_arr_tab_sml_480[480] =
+    {
+        0,      160,    320,    96,     256,    416,    192,    352,
+        32,     288,    448,    128,    384,    64,     224,    225,
+        385,    65,     321,    1,      161,    417,    97,     257,
+        33,     193,    353,    129,    289,    449,    450,    130,
+        290,    66,     226,    386,    162,    322,    2,      258,
+        418,    98,     354,    34,     194,    195,    355,    35,
+        291,    451,    131,    387,    67,     227,    3,      163,
+        323,    99,     259,    419,    420,    100,    260,    36,
+        196,    356,    132,    292,    452,    228,    388,    68,
+        324,    4,      164,    165,    325,    5,      261,    421,
+        101,    357,    37,     197,    453,    133,    293,    69,
+        229,    389,    390,    70,     230,    6,      166,    326,
+        102,    262,    422,    198,    358,    38,     294,    454,
+        134,    135,    295,    455,    231,    391,    71,     327,
+        7,      167,    423,    103,    263,    39,     199,    359,
+        360,    40,     200,    456,    136,    296,    72,     232,
+        392,    168,    328,    8,      264,    424,    104,    105,
+        265,    425,    201,    361,    41,     297,    457,    137,
+        393,    73,     233,    9,      169,    329,    330,    10,
+        170,    426,    106,    266,    42,     202,    362,    138,
+        298,    458,    234,    394,    74,     75,     235,    395,
+        171,    331,    11,     267,    427,    107,    363,    43,
+        203,    459,    139,    299,    300,    460,    140,    396,
+        76,     236,    12,     172,    332,    108,    268,    428,
+        204,    364,    44,     45,     205,    365,    141,    301,
+        461,    237,    397,    77,     333,    13,     173,    429,
+        109,    269,    270,    430,    110,    366,    46,     206,
+        462,    142,    302,    78,     238,    398,    174,    334,
+        14,     15,     175,    335,    111,    271,    431,    207,
+        367,    47,     303,    463,    143,    399,    79,     239,
+        240,    400,    80,     336,    16,     176,    432,    112,
+        272,    48,     208,    368,    144,    304,    464,    465,
+        145,    305,    81,     241,    401,    177,    337,    17,
+        273,    433,    113,    369,    49,     209,    210,    370,
+        50,     306,    466,    146,    402,    82,     242,    18,
+        178,    338,    114,    274,    434,    435,    115,    275,
+        51,     211,    371,    147,    307,    467,    243,    403,
+        83,     339,    19,     179,    180,    340,    20,     276,
+        436,    116,    372,    52,     212,    468,    148,    308,
+        84,     244,    404,    405,    85,     245,    21,     181,
+        341,    117,    277,    437,    213,    373,    53,     309,
+        469,    149,    150,    310,    470,    246,    406,    86,
+        342,    22,     182,    438,    118,    278,    54,     214,
+        374,    375,    55,     215,    471,    151,    311,    87,
+        247,    407,    183,    343,    23,     279,    439,    119,
+        120,    280,    440,    216,    376,    56,     312,    472,
+        152,    408,    88,     248,    24,     184,    344,    345,
+        25,     185,    441,    121,    281,    57,     217,    377,
+        153,    313,    473,    249,    409,    89,     90,     250,
+        410,    186,    346,    26,     282,    442,    122,    378,
+        58,     218,    474,    154,    314,    315,    475,    155,
+        411,    91,     251,    27,     187,    347,    123,    283,
+        443,    219,    379,    59,     60,     220,    380,    156,
+        316,    476,    252,    412,    92,     348,    28,     188,
+        444,    124,    284,    285,    445,    125,    381,    61,
+        221,    477,    157,    317,    93,     253,    413,    189,
+        349,    29,     30,     190,    350,    126,    286,    446,
+        222,    382,    62,     318,    478,    158,    414,    94,
+        254,    255,    415,    95,     351,    31,     191,    447,
+        127,    287,    63,     223,    383,    159,    319,    479
+    },
+
+    // WORD32 cosine_array_1920[960] =
+    {
+        32767,  13,     94,     32767,  32767,  121,    201,    32767,
+        32767,  228,    308,    32767,  32766,  335,    416,    32765,
+        32765,  442,    523,    32764,  32763,  550,    630,    32762,
+        32761,  657,    737,    32760,  32759,  764,    844,    32757,
+        32756,  871,    952,    32754,  32753,  978,    1059,   32751,
+        32750,  1086,   1166,   32747,  32746,  1193,   1273,   32743,
+        32742,  1300,   1380,   32739,  32738,  1407,   1487,   32734,
+        32733,  1514,   1594,   32729,  32728,  1621,   1702,   32724,
+        32722,  1728,   1809,   32718,  32717,  1835,   1916,   32712,
+        32710,  1942,   2023,   32706,  32704,  2049,   2130,   32699,
+        32697,  2157,   2237,   32692,  32690,  2263,   2344,   32684,
+        32682,  2370,   2451,   32676,  32674,  2477,   2558,   32668,
+        32666,  2584,   2664,   32659,  32657,  2691,   2771,   32651,
+        32648,  2798,   2878,   32641,  32639,  2905,   2985,   32632,
+        32629,  3012,   3092,   32622,  32619,  3118,   3198,   32612,
+        32609,  3225,   3305,   32601,  32598,  3332,   3412,   32590,
+        32587,  3439,   3518,   32579,  32576,  3545,   3625,   32567,
+        32564,  3652,   3732,   32555,  32552,  3758,   3838,   32542,
+        32539,  3865,   3945,   32530,  32526,  3971,   4051,   32517,
+        32513,  4078,   4157,   32503,  32500,  4184,   4264,   32489,
+        32486,  4290,   4370,   32475,  32472,  4397,   4476,   32461,
+        32457,  4503,   4583,   32446,  32442,  4609,   4689,   32431,
+        32427,  4715,   4795,   32415,  32411,  4821,   4901,   32399,
+        32395,  4927,   5007,   32383,  32379,  5033,   5113,   32367,
+        32362,  5139,   5219,   32350,  32345,  5245,   5325,   32333,
+        32328,  5351,   5430,   32315,  32310,  5457,   5536,   32297,
+        32292,  5562,   5642,   32279,  32274,  5668,   5747,   32260,
+        32255,  5774,   5853,   32241,  32236,  5879,   5958,   32222,
+        32217,  5985,   6064,   32202,  32197,  6090,   6169,   32182,
+        32177,  6195,   6274,   32162,  32157,  6301,   6380,   32141,
+        32136,  6406,   6485,   32120,  32115,  6511,   6590,   32099,
+        32093,  6616,   6695,   32077,  32071,  6721,   6800,   32055,
+        32049,  6826,   6905,   32032,  32027,  6931,   7009,   32010,
+        32004,  7036,   7114,   31986,  31981,  7140,   7219,   31963,
+        31957,  7245,   7323,   31939,  31933,  7349,   7428,   31915,
+        31909,  7454,   7532,   31891,  31884,  7558,   7637,   31866,
+        31859,  7663,   7741,   31841,  31834,  7767,   7845,   31815,
+        31809,  7871,   7949,   31789,  31783,  7975,   8053,   31763,
+        31756,  8079,   8157,   31737,  31730,  8183,   8261,   31710,
+        31703,  8287,   8364,   31682,  31676,  8390,   8468,   31655,
+        31648,  8494,   8572,   31627,  31620,  8597,   8675,   31599,
+        31592,  8701,   8778,   31570,  31563,  8804,   8882,   31541,
+        31534,  8907,   8985,   31512,  31505,  9011,   9088,   31483,
+        31475,  9114,   9191,   31453,  31445,  9217,   9294,   31422,
+        31415,  9319,   9397,   31392,  31384,  9422,   9499,   31361,
+        31353,  9525,   9602,   31330,  31322,  9627,   9704,   31298,
+        31290,  9730,   9807,   31266,  31258,  9832,   9909,   31234,
+        31226,  9934,   10011,  31201,  31193,  10037,  10113,  31168,
+        31160,  10139,  10215,  31135,  31127,  10241,  10317,  31102,
+        31093,  10342,  10419,  31068,  31059,  10444,  10520,  31033,
+        31025,  10546,  10622,  30999,  30990,  10647,  10723,  30964,
+        30955,  10748,  10824,  30929,  30920,  10850,  10926,  30893,
+        30884,  10951,  11027,  30857,  30848,  11052,  11128,  30821,
+        30812,  11153,  11228,  30784,  30775,  11253,  11329,  30747,
+        30738,  11354,  11430,  30710,  30701,  11455,  11530,  30672,
+        30663,  11555,  11630,  30635,  30625,  11655,  11730,  30596,
+        30587,  11756,  11831,  30558,  30548,  11856,  11930,  30519,
+        30509,  11955,  12030,  30480,  30470,  12055,  12130,  30440,
+        30430,  12155,  12230,  30400,  30390,  12254,  12329,  30360,
+        30350,  12354,  12428,  30320,  30309,  12453,  12527,  30279,
+        30269,  12552,  12626,  30238,  30227,  12651,  12725,  30196,
+        30186,  12750,  12824,  30154,  30144,  12849,  12923,  30112,
+        30102,  12947,  13021,  30070,  30059,  13046,  13119,  30027,
+        30016,  13144,  13218,  29984,  29973,  13242,  13316,  29941,
+        29930,  13340,  13414,  29897,  29886,  13438,  13511,  29853,
+        29842,  13536,  13609,  29808,  29797,  13633,  13706,  29764,
+        29752,  13731,  13804,  29719,  29707,  13828,  13901,  29673,
+        29662,  13925,  13998,  29628,  29616,  14022,  14095,  29582,
+        29570,  14119,  14192,  29535,  29524,  14216,  14288,  29489,
+        29477,  14312,  14385,  29442,  29430,  14409,  14481,  29395,
+        29383,  14505,  14577,  29347,  29335,  14601,  14673,  29299,
+        29287,  14697,  14769,  29251,  29239,  14793,  14864,  29203,
+        29190,  14888,  14960,  29154,  29142,  14984,  15055,  29105,
+        29092,  15079,  15150,  29055,  29043,  15174,  15245,  29006,
+        28993,  15269,  15340,  28955,  28943,  15364,  15435,  28905,
+        28892,  15459,  15529,  28854,  28842,  15553,  15624,  28803,
+        28791,  15647,  15718,  28752,  28739,  15741,  15812,  28701,
+        28688,  15835,  15906,  28649,  28636,  15929,  15999,  28596,
+        28583,  16023,  16093,  28544,  28531,  16116,  16186,  28491,
+        28478,  16210,  16279,  28438,  28425,  16303,  16372,  28385,
+        28371,  16396,  16465,  28331,  28317,  16488,  16558,  28277,
+        28263,  16581,  16650,  28223,  28209,  16673,  16743,  28168,
+        28154,  16766,  16835,  28113,  28099,  16858,  16927,  28058,
+        28044,  16949,  17018,  28002,  27988,  17041,  17110,  27946,
+        27932,  17133,  17201,  27890,  27876,  17224,  17292,  27834,
+        27820,  17315,  17383,  27777,  27763,  17406,  17474,  27720,
+        27706,  17497,  17565,  27663,  27648,  17587,  17655,  27605,
+        27591,  17678,  17745,  27547,  27533,  17768,  17835,  27489,
+        27474,  17858,  17925,  27430,  27416,  17948,  18015,  27372,
+        27357,  18037,  18104,  27312,  27298,  18127,  18194,  27253,
+        27238,  18216,  18283,  27193,  27178,  18305,  18372,  27133,
+        27118,  18394,  18460,  27073,  27058,  18483,  18549,  27013,
+        26997,  18571,  18637,  26952,  26936,  18659,  18725,  26891,
+        26875,  18747,  18813,  26829,  26814,  18835,  18901,  26767,
+        26752,  18923,  18988,  26705,  26690,  19010,  19076,  26643,
+        26628,  19098,  19163,  26581,  26565,  19185,  19250,  26518,
+        26502,  19271,  19336,  26455,  26439,  19358,  19423,  26391,
+        26375,  19444,  19509,  26327,  26312,  19531,  19595,  26264,
+        26247,  19617,  19681,  26199,  26183,  19702,  19767,  26135,
+        26119,  19788,  19852,  26070,  26054,  19873,  19937,  26005,
+        25988,  19959,  20022,  25939,  25923,  20043,  20107,  25874,
+        25857,  20128,  20192,  25808,  25791,  20213,  20276,  25742,
+        25725,  20297,  20360,  25675,  25658,  20381,  20444,  25608,
+        25592,  20465,  20528,  25541,  25524,  20549,  20611,  25474,
+        25457,  20632,  20694,  25406,  25389,  20715,  20777,  25339,
+        25322,  20798,  20860,  25270,  25253,  20881,  20943,  25202,
+        25185,  20963,  21025,  25133,  25116,  21046,  21107,  25064,
+        25047,  21128,  21189,  24995,  24978,  21210,  21271,  24926,
+        24908,  21291,  21352,  24856,  24838,  21373,  21434,  24786,
+        24768,  21454,  21515,  24716,  24698,  21535,  21595,  24645,
+        24627,  21616,  21676,  24574,  24557,  21696,  21756,  24503,
+        24485,  21776,  21836,  24432,  24414,  21856,  21916,  24360,
+        24342,  21936,  21996,  24288,  24270,  22016,  22075,  24216,
+        24198,  22095,  22154,  24144,  24126,  22174,  22233,  24071,
+        24053,  22253,  22312,  23998,  23980,  22331,  22390,  23925,
+        23907,  22410,  22468,  23852,  23834,  22488,  22546,  23778,
+        23760,  22566,  22624,  23704,  23686,  22643,  22701,  23630,
+        23612,  22721,  22779,  23556,  23537,  22798,  22856,  23481,
+        23462,  22875,  22932,  23406,  23387,  22951,  23009,  23331,
+        23312,  23028,  23085,  23256,  23237,  23104,  23161,  23180
+    },
+
+
+    // const WORD16 w_512[2 * 510] =
+    {
+        0,      32767,  0,      32767,  0,      32767,  402,    32766,  804,    32758,
+        1206,   32746,  804,    32758,  1608,   32729,  2411,   32679,  1206,   32746,
+        2411,   32679,  3612,   32568,  1608,   32729,  3212,   32610,  4808,   32413,
+        2009,   32706,  4011,   32522,  5998,   32214,  2411,   32679,  4808,   32413,
+        7180,   31972,  2811,   32647,  5602,   32286,  8351,   31686,  3212,   32610,
+        6393,   32138,  9512,   31357,  3612,   32568,  7180,   31972,  10660,  30986,
+        4011,   32522,  7962,   31786,  11793,  30572,  4410,   32470,  8740,   31581,
+        12910,  30118,  4808,   32413,  9512,   31357,  14010,  29622,  5205,   32352,
+        10279,  31114,  15091,  29086,  5602,   32286,  11039,  30853,  16151,  28511,
+        5998,   32214,  11793,  30572,  17190,  27897,  6393,   32138,  12540,  30274,
+        18205,  27246,  6787,   32058,  13279,  29957,  19195,  26557,  7180,   31972,
+        14010,  29622,  20160,  25833,  7571,   31881,  14733,  29269,  21097,  25073,
+        7962,   31786,  15447,  28899,  22006,  24279,  8351,   31686,  16151,  28511,
+        22884,  23453,  8740,   31581,  16846,  28106,  23732,  22595,  9127,   31471,
+        17531,  27684,  24548,  21706,  9512,   31357,  18205,  27246,  25330,  20788,
+        9896,   31238,  18868,  26791,  26078,  19841,  10279,  31114,  19520,  26320,
+        26791,  18868,  10660,  30986,  20160,  25833,  27467,  17869,  11039,  30853,
+        20788,  25330,  28106,  16846,  11417,  30715,  21403,  24812,  28707,  15800,
+        11793,  30572,  22006,  24279,  29269,  14733,  12167,  30425,  22595,  23732,
+        29792,  13646,  12540,  30274,  23170,  23170,  30274,  12540,  12910,  30118,
+        23732,  22595,  30715,  11417,  13279,  29957,  24279,  22006,  31114,  10279,
+        13646,  29792,  24812,  21403,  31471,  9127,   14010,  29622,  25330,  20788,
+        31786,  7962,   14373,  29448,  25833,  20160,  32058,  6787,   14733,  29269,
+        26320,  19520,  32286,  5602,   15091,  29086,  26791,  18868,  32470,  4410,
+        15447,  28899,  27246,  18205,  32610,  3212,   15800,  28707,  27684,  17531,
+        32706,  2009,   16151,  28511,  28106,  16846,  32758,  804,    16500,  28311,
+        28511,  16151,  32766,  -402,   16846,  28106,  28899,  15447,  32729,  -1608,
+        17190,  27897,  29269,  14733,  32647,  -2811,  17531,  27684,  29622,  14010,
+        32522,  -4011,  17869,  27467,  29957,  13279,  32352,  -5205,  18205,  27246,
+        30274,  12540,  32138,  -6393,  18538,  27020,  30572,  11793,  31881,  -7571,
+        18868,  26791,  30853,  11039,  31581,  -8740,  19195,  26557,  31114,  10279,
+        31238,  -9896,  19520,  26320,  31357,  9512,   30853,  -11039, 19841,  26078,
+        31581,  8740,   30425,  -12167, 20160,  25833,  31786,  7962,   29957,  -13279,
+        20475,  25583,  31972,  7180,   29448, -14373,  20788,  25330,  32138,  6393,
+        28899,  -15447, 21097,  25073,  32286,  5602,   28311,  -16500, 21403,  24812,
+        32413,  4808,   27684,  -17531, 21706,  24548,  32522,  4011,   27020,  -18538,
+        22006,  24279,  32610,  3212,   26320,  -19520, 22302,  24008,  32679,  2411,
+        25583,  -20475, 22595,  23732,  32729,  1608,   24812,  -21403, 22884,  23453,
+        32758,  804,    24008,  -22302, 23170,  23170,  32767,  0,      23170,  -23170,
+        23453,  22884,  32758,  -804,   22302,  -24008, 23732,  22595,  32729,  -1608,
+        21403,  -24812, 24008,  22302,  32679,  -2411,  20475,  -25583, 24279,  22006,
+        32610,  -3212,  19520,  -26320, 24548,  21706,  32522,  -4011,  18538,  -27020,
+        24812,  21403,  32413,  -4808,  17531,  -27684, 25073,  21097,  32286,  -5602,
+        16500,  -28311, 25330,  20788,  32138,  -6393,  15447,  -28899, 25583,  20475,
+        31972,  -7180,  14373,  -29448, 25833,  20160,  31786,  -7962,  13279,  -29957,
+        26078,  19841,  31581,  -8740,  12167,  -30425, 26320,  19520,  31357,  -9512,
+        11039,  -30853, 26557,  19195,  31114,  -10279, 9896,   -31238, 26791,  18868,
+        30853,  -11039, 8740,   -31581, 27020,  18538,  30572,  -11793, 7571,   -31881,
+        27246,  18205,  30274,  -12540, 6393,   -32138, 27467,  17869,  29957,  -13279,
+        5205,   -32352, 27684,  17531,  29622,  -14010, 4011,   -32522, 27897,  17190,
+        29269,  -14733, 2811,   -32647, 28106,  16846,  28899,  -15447, 1608,   -32729,
+        28311,  16500,  28511,  -16151, 402,    -32766, 28511,  16151,  28106,  -16846,
+   -    804,    -32758, 28707,  15800,  27684,  -17531, -2009,  -32706, 28899,  15447,
+        27246,  -18205, -3212,  -32610, 29086,  15091,  26791,  -18868, -4410,  -32470,
+        29269,  14733,  26320,  -19520, -5602,  -32286, 29448,  14373,  25833,  -20160,
+   -    6787,   -32058, 29622,  14010,  25330,  -20788, -7962,  -31786, 29792,  13646,
+        24812,  -21403, -9127,  -31471, 29957,  13279,  24279,  -22006, -10279, -31114,
+        30118,  12910,  23732,  -22595, -11417, -30715, 30274,  12540,  23170,  -23170,
+   -    12540,  -30274, 30425,  12167,  22595,  -23732, -13646, -29792, 30572,  11793,
+        22006,  -24279, -14733, -29269, 30715,  11417,  21403,  -24812, -15800, -28707,
+        30853,  11039,  20788,  -25330, -16846, -28106, 30986,  10660,  20160,  -25833,
+   -    17869,  -27467, 31114,  10279,  19520,  -26320, -18868, -26791, 31238,  9896,
+        18868,  -26791, -19841, -26078, 31357,  9512,   18205,  -27246, -20788, -25330,
+        31471,  9127,   17531,  -27684, -21706, -24548, 31581,  8740,   16846,  -28106,
+   -    22595,  -23732, 31686,  8351,   16151,  -28511, -23453, -22884, 31786,  7962,
+        15447,  -28899, -24279, -22006, 31881,  7571,   14733,  -29269, -25073, -21097,
+        31972,  7180,   14010,  -29622, -25833, -20160, 32058,  6787,   13279,  -29957,
+   -    26557,  -19195, 32138,  6393,   12540,  -30274, -27246, -18205, 32214,  5998,
+        11793,  -30572, -27897, -17190, 32286,  5602,   11039,  -30853, -28511, -16151,
+        32352,  5205,   10279,  -31114, -29086, -15091, 32413,  4808,   9512,   -31357,
+   -    29622,  -14010, 32470,  4410,   8740,   -31581, -30118, -12910, 32522,  4011,
+        7962,   -31786, -30572, -11793, 32568,  3612,   7180,   -31972, -30986, -10660,
+        32610,  3212,   6393,   -32138, -31357, -9512,  32647,  2811,   5602,   -32286,
+   -    31686,  -8351,  32679,  2411,   4808,   -32413, -31972, -7180,  32706,  2009,
+        4011,   -32522, -32214, -5998,  32729,  1608,   3212,   -32610, -32413, -4808,
+        32746,  1206,   2411,   -32679, -32568, -3612,  32758,  804,    1608,   -32729,
+   -    32679,  -2411,  32766,  402,    804,    -32758, -32746, -1206,  0,      32767,
+        0,      32767,  0,      32767,  1608,   32729,  3212,   32610,  4808,   32413,
+        3212,   32610,  6393,   32138,  9512,   31357,  4808,   32413,  9512,   31357,
+        14010,  29622,  6393,   32138,  12540,  30274,  18205,  27246,  7962,   31786,
+        15447,  28899,  22006,  24279,  9512,   31357,  18205,  27246,  25330,  20788,
+        11039,  30853,  20788,  25330,  28106,  16846,  12540,  30274,  23170,  23170,
+        30274,  12540,  14010,  29622,  25330,  20788,  31786,  7962,   15447,  28899,
+        27246,  18205,  32610,  3212,   16846,  28106,  28899,  15447,  32729,  -1608,
+        18205,  27246,  30274,  12540,  32138,  -6393,  19520,  26320,  31357,   9512,
+        30853, -11039,  20788,  25330,  32138,  6393,   28899,  -15447, 22006,  24279,
+        32610,  3212,   26320,  -19520, 23170,  23170,  32767,  0,      23170,  -23170,
+        24279,  22006,  32610,  -3212,  19520,  -26320, 25330,  20788,  32138,  -6393,
+        15447,  -28899, 26320,  19520,  31357,  -9512,  11039,  -30853, 27246,  18205,
+        30274,  -12540, 6393,   -32138, 28106,  16846,  28899,  -15447, 1608,   -32729,
+        28899,  15447,  27246,  -18205, -3212,  -32610, 29622,  14010,  25330,  -20788,
+   -    7962,   -31786, 30274,  12540,  23170,  -23170, -12540, -30274, 30853,  11039,
+        20788,  -25330, -16846, -28106, 31357,  9512,   18205,  -27246, -20788, -25330,
+        31786,  7962,   15447,  -28899, -24279, -22006, 32138,  6393,   12540,  -30274,
+   -    27246,  -18205, 32413,  4808,   9512,   -31357, -29622, -14010, 32610,  3212,
+        6393,   -32138, -31357, -9512,  32729,  1608,   3212,   -32610, -32413, -4808,
+        0,      32767,  0,      32767,  0,      32767,  6393,   32138,  12540,  30274,
+        18205,  27246,  12540,  30274,  23170,  23170,  30274,  12540,  18205,  27246,
+        30274,  12540,  32138,  -6393,  23170,  23170,  32767,  0,      23170,  -23170,
+        27246,  18205,  30274,  -12540, 6393,   -32138, 30274,  12540,  23170,  -23170,
+   -    12540,  -30274, 32138,  6393,   12540,  -30274, -27246, -18205, 0,      32767,
+        0,      32767,  0,      32767,  23170,  23170,  32767,  0,      23170,  -23170,
+    },
+
+
+    // WORD16 w_32[60]=
+    {
+        0,      32767,  0,      32767,  0,      32767,
+        6393,   32137,  12539,  30273,  18204,  27245,
+        12539,  30273,  23170,  23170,  30273,  12539,
+        18204,  27245,  30273,  12539,  32137,  -6392,
+        23170,  23170,  32767,  0,      23170,  -23169,
+        27245,  18204,  30273,  -12538, 6393,   -32136,
+        30273,  12539,  23170,  -23169, -12538, -30272,
+        32137,  6393,   12539,  -30272, -27244, -18203,
+        0,      32767,  0,      32767,  0,      32767,
+        23170,  23170,  32767,  0,      23170,  -23169
+    },
+
+    // const WORD16 cosine_array_240[120] =
+    {
+        32767,  107,    751,    32759,  32754,  965,    1608,   32729,
+        32717,  1822,   2464,   32675,  32658,  2678,   3319,   32600,
+        32577,  3532,   4171,   32501,  32473,  4383,   5020,   32381,
+        32348,  5232,   5866,   32239,  32200,  6077,   6708,   32074,
+        32029,  6918,   7545,   31887,  31837,  7754,   8377,   31679,
+        31624,  8585,   9204,   31449,  31388,  9409,   10024,  31197,
+        31131,  10228,  10837,  30924,  30853,  11039,  11643,  30630,
+        30553,  11843,  12441,  30315,  30232,  12639,  13230,  29979,
+        29891,  13426,  14010,  29622,  29530,  14204,  14781,  29245,
+        29148,  14972,  15541,  28848,  28746,  15730,  16291,  28431,
+        28324,  16477,  17030,  27995,  27883,  17213,  17757,  27540,
+        27423,  17937,  18472,  27066,  26944,  18648,  19174,  26573,
+        26447,  19347,  19863,  26062,  25931,  20033,  20538,  25533,
+        25398,  20705,  21199,  24986,  24847,  21363,  21846,  24423,
+        24279,  22006,  22478,  23843,  23695,  22634,  23095,  23246
+    },
 };
diff --git a/decoder/ixheaacd_aac_rom.h b/decoder/ixheaacd_aac_rom.h
index a6a8142..5891a0e 100644
--- a/decoder/ixheaacd_aac_rom.h
+++ b/decoder/ixheaacd_aac_rom.h
@@ -20,7 +20,6 @@
 #ifndef IXHEAACD_AAC_ROM_H
 #define IXHEAACD_AAC_ROM_H
 
-#define AAC_NF_NO_RANDOM_VAL 512
 #define MAX_CB_SIZE 13
 
 typedef struct {
@@ -40,7 +39,7 @@
 
   WORD8 tns_max_bands_tbl_ld[12];
   WORD8 tns_max_bands_tbl_480[12];
-
+  WORD32 scale_table_960[4];
 } ia_aac_dec_block_tables_struct;
 
 extern const ia_aac_dec_block_tables_struct ixheaacd_aac_block_tables;
@@ -95,6 +94,17 @@
   WORD8 ixheaacd_sfb_32_480[38];
   WORD8 ixheaacd_sfb_24_480[31];
 
+  WORD8 ixheaacd_sfb_96_960[41];
+  WORD8 ixheaacd_sfb_96_120[13];
+  WORD8 ixheaacd_sfb_64_960[47];
+  WORD8 ixheaacd_sfb_48_960[50];
+  WORD8 ixheaacd_sfb_48_120[15];
+  WORD8 ixheaacd_sfb_24_960[47];
+  WORD8 ixheaacd_sfb_24_120[16];
+  WORD8 ixheaacd_sfb_16_960[43];
+  WORD8 ixheaacd_sfb_16_120[16];
+  WORD8 ixheaacd_sfb_8_960[41];
+  WORD8 ixheaacd_sfb_8_120[16];
 } ia_aac_dec_huffman_tables_struct;
 
 extern const ia_aac_dec_huffman_tables_struct ixheaacd_aac_huffmann_tables;
@@ -133,6 +143,26 @@
   WORD16 window_sine_480_eld[1920];
   WORD16 window_sine_512_eld[2048];
 
+  WORD16 only_long_window_sine_960[960];
+  WORD16 only_long_window_kbd_960[960];
+  WORD16 only_short_window_sine_120[120];
+  WORD16 only_short_window_kbd_120[120];
+
+  WORD16 re_arr_tab_32[480];
+  WORD16 re_arr_tab_sml[16];
+  WORD16 re_arr_tab_4[60];
+  WORD16 re_arr_tab_15_4[60];
+  WORD16 re_arr_tab_120[60];
+  WORD16 re_arr_tab_5[16];
+  WORD16 re_arr_tab_3[16];
+
+  WORD16 re_arr_tab_sml_480[480];
+
+  WORD32 cosine_array_1920[960];
+
+  WORD16 w_512[2 * 510];
+  WORD16 w_32[60];
+  WORD16 cosine_array_240[120];
 } ia_aac_dec_imdct_tables_struct;
 
 extern const ia_aac_dec_imdct_tables_struct ixheaacd_imdct_tables;
@@ -149,8 +179,8 @@
   ia_aac_dec_imdct_tables_struct *pstr_imdct_tables;
 
   ia_aac_sfb_info str_aac_sfb_info[4];
-  WORD8 *scale_factor_bands_long[12];
-  WORD8 *scale_factor_bands_short[12];
+  WORD8 *scale_factor_bands_long[24];
+  WORD8 *scale_factor_bands_short[24];
   WORD16 sfb_long_table[52];
   WORD16 sfb_short_table[16];
 
diff --git a/decoder/ixheaacd_aac_tns.c b/decoder/ixheaacd_aac_tns.c
index 641fdc7..34aad73 100644
--- a/decoder/ixheaacd_aac_tns.c
+++ b/decoder/ixheaacd_aac_tns.c
@@ -38,6 +38,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
@@ -213,9 +216,9 @@
     }
     lpc[i] = 0;
     order = ((order & 0xfffffffc) + 4);
+    order = order & 31;
   }
   {
-    WORD32 temp_lo = 0;
     for (i = 0; i < order; i++) {
       y = ixheaacd_shl32_sat((*spectrum), scale_spec);
       acc = 0;
@@ -230,7 +233,6 @@
       *spectrum = y >> scale_spec;
       spectrum += inc;
     }
-    temp_lo = 0;
     for (i = order; i < size; i++) {
       y = ixheaacd_shl32_sat((*spectrum), scale_spec);
       acc = 0;
@@ -264,7 +266,6 @@
     order = ((order & 0xfffffffc) + 4);
   }
   {
-    WORD32 temp_lo = 0;
     for (i = 0; i < order; i++) {
       y = ixheaacd_shl32_sat((*spectrum), scale_spec);
       acc = 0;
@@ -279,7 +280,6 @@
       *spectrum = y >> scale_spec;
       spectrum += inc;
     }
-    temp_lo = 0;
     for (i = order; i < size; i++) {
       WORD64 acc = 0;
       WORD32 acc1;
@@ -314,7 +314,6 @@
     order = ((order & 0xfffffffc) + 4);
   }
   {
-    WORD32 temp_lo = 0;
     for (i = 0; i < order; i++) {
       y = ixheaacd_shl32_sat((*spectrum), scale_spec);
       acc = 0;
@@ -329,7 +328,6 @@
       *spectrum = y >> scale_spec;
       spectrum += inc;
     }
-    temp_lo = 0;
     for (i = order; i < size; i++) {
       WORD64 acc = 0;
       WORD32 acc1;
diff --git a/decoder/ixheaacd_aacdec.h b/decoder/ixheaacd_aacdec.h
index 8f161eb..07b6957 100644
--- a/decoder/ixheaacd_aacdec.h
+++ b/decoder/ixheaacd_aacdec.h
@@ -20,11 +20,10 @@
 #ifndef IXHEAACD_AACDEC_H
 #define IXHEAACD_AACDEC_H
 
-#define AAC_DEC_OK IA_ENHAACPLUS_DEC_API_NONFATAL_NO_ERROR
-
-#define IA_ENHAACPDEC_NUM_MEMTABS (4)
+#define AAC_DEC_OK IA_XHEAAC_DEC_API_NONFATAL_NO_ERROR
 
 #define FRAME_SIZE 1024
+#define FRAME_SIZE_SMALL 960
 
 #define ADTS_BSFORMAT 2
 #define LOAS_BSFORMAT 3
@@ -48,6 +47,9 @@
   WORD8 num_swb_window[2];
   ia_aac_dec_tables_struct *pstr_aac_tables;
   ixheaacd_misc_tables *pstr_common_tables;
+  WORD32 is_first;
+  WORD32 conceal_count;
+  WORD16 sbr_num_elements;
 } ia_aac_decoder_struct;
 
 struct ia_aac_persistent_struct {
@@ -59,6 +61,7 @@
 
   ia_aac_dec_channel_info *ptr_aac_dec_static_channel_info[CHANNELS];
   WORD16 *ltp_buf[CHANNELS];
+  WORD8 *prev_sbr_payload_buffer;
 };
 
 typedef struct {
diff --git a/decoder/ixheaacd_aacdecoder.c b/decoder/ixheaacd_aacdecoder.c
index 6c26d2d..e3e16dd 100644
--- a/decoder/ixheaacd_aacdecoder.c
+++ b/decoder/ixheaacd_aacdecoder.c
@@ -29,15 +29,10 @@
 #include "ixheaacd_basic_ops.h"
 #include "ixheaacd_bitbuffer.h"
 
-#include "ixheaacd_basic_op.h"
-#include "ixheaacd_intrinsics.h"
-
 #include "ixheaacd_defines.h"
 
 #include "ixheaacd_aac_rom.h"
 
-#include "ixheaacd_definitions.h"
-
 #include "ixheaacd_error_codes.h"
 
 #include "ixheaacd_pulsedata.h"
@@ -45,58 +40,76 @@
 #include "ixheaacd_pns.h"
 #include "ixheaacd_drc_data_struct.h"
 
-#include "ixheaacd_lt_predict.h"
-
-#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_interface.h"
+#include "ixheaacd_info.h"
 #include "ixheaacd_cnst.h"
-#include "ixheaacd_drc_dec.h"
-#include "ixheaacd_sbrdecoder.h"
-#include "ixheaacd_block.h"
-#include "ixheaacd_channel.h"
-
-#include "ixheaacd_sbr_payload.h"
-#include "ixheaacd_common_rom.h"
 #include "ixheaacd_sbrdecsettings.h"
 #include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_common_rom.h"
 #include "ixheaacd_env_extr_part.h"
 #include "ixheaacd_sbr_rom.h"
-#include "ixheaacd_stereo.h"
-#include "ixheaacd_lpp_tran.h"
 #include "ixheaacd_hybrid.h"
 #include "ixheaacd_ps_dec.h"
-#include "ixheaacd_env_extr.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_acelp_info.h"
+#include "ixheaacd_tns_usac.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_rom.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_main.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_ec.h"
+#include "ixheaacd_drc_dec.h"
+
+#include "ixheaacd_block.h"
+#include "ixheaacd_channel.h"
+#include "ixheaacd_sbr_payload.h"
+#include "ixheaacd_stereo.h"
 #include "ixheaacd_adts.h"
 #include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_memory_standards.h"
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
-#include "ixheaacd_mps_polyphase.h"
-#include "ixheaacd_config.h"
-#include "ixheaacd_mps_dec.h"
+
 #include "ixheaacd_struct_def.h"
 #include "ixheaacd_headerdecode.h"
 #include "ixheaacd_multichannel.h"
 #include "ixheaacd_adts_crc_check.h"
+#include "ixheaacd_ld_mps_dec.h"
 
 #include "ixheaacd_hcr.h"
+#include "ixheaacd_struct.h"
 
 #define SIZEOF_INT(x) ((sizeof(x) + sizeof(WORD32) - 1) / sizeof(WORD32))
 
 #define EXT_FILL_DATA 1
 #define EXT_FIL 0
+#define EXT_DATA_LENGTH 3
+#define EXT_LDSAC_DATA 9
+
+#define MIN(x, y) ((x) > (y) ? (y) : (x))
+
+extern const ia_usac_samp_rate_info ixheaacd_samp_rate_info[];
 
 WORD32 ixheaacd_aacdec_decodeframe(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
-    ia_aac_dec_scratch_struct *aac_scratch_ptrs, WORD16 *time_data,
+    ia_aac_dec_scratch_struct *aac_scratch_ptrs, VOID *time_data_tmp,
     FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel,
     WORD *element_index_order, WORD skip_full_decode, WORD ch_fac,
     WORD slot_element, WORD max_channels, WORD32 total_channels,
     WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec,
     WORD32 object_type, WORD32 ch_config,
     ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader,
-    ia_drc_dec_struct *drc_dummy)
-
-{
+    ia_drc_dec_struct *drc_dummy, WORD32 ldmps_present, UWORD8 *slot_pos, UWORD8 *mps_buffer,
+    WORD32 *mps_header, WORD32 *mps_bytes, WORD32 is_init, WORD32 first_frame) {
   WORD ch, ele_type;
   ia_aac_dec_state_struct *p_state_enhaacplus_dec;
   ia_aac_decoder_struct *aac_dec_handle;
@@ -129,6 +142,8 @@
   WORD32 *work_buffer_2 = aac_scratch_ptrs->extra_scr_4k[2];
   p_state_enhaacplus_dec = p_obj_exhaacplus_dec->p_state_aac;
 
+  WORD32 *time_data = (WORD32 *)time_data_tmp;
+
   aac_dec_handle = p_state_enhaacplus_dec->pstr_aac_dec_info[*ch_idx];
   it_bit_buff = p_state_enhaacplus_dec->ptr_bit_stream;
 
@@ -175,29 +190,47 @@
 
     pstr_imdct_tables = aac_dec_handle->pstr_aac_tables->pstr_imdct_tables;
 
-    aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
-        pstr_imdct_tables->only_long_window_sine;
-    aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[0] =
-        pstr_imdct_tables->only_short_window_sine;
-    aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
-        pstr_imdct_tables->only_long_window_kbd;
-    aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[1] =
-        pstr_imdct_tables->only_short_window_kbd;
+    if (960 != frame_length) {
+      aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
+          pstr_imdct_tables->only_long_window_sine;
+      aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[0] =
+          pstr_imdct_tables->only_short_window_sine;
+      aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
+          pstr_imdct_tables->only_long_window_kbd;
+      aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[1] =
+          pstr_imdct_tables->only_short_window_kbd;
 
-    aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[0] =
-        pstr_imdct_tables->only_long_window_sine;
-    aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[0] =
-        pstr_imdct_tables->only_short_window_sine;
-    aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[1] =
-        pstr_imdct_tables->only_long_window_kbd;
-    aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[1] =
-        pstr_imdct_tables->only_short_window_kbd;
+      aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[0] =
+          pstr_imdct_tables->only_long_window_sine;
+      aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[0] =
+          pstr_imdct_tables->only_short_window_sine;
+      aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[1] =
+          pstr_imdct_tables->only_long_window_kbd;
+      aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[1] =
+          pstr_imdct_tables->only_short_window_kbd;
+    } else {
+      aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[0] =
+          pstr_imdct_tables->only_long_window_sine_960;
+      aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[0] =
+          pstr_imdct_tables->only_short_window_sine_120;
+      aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
+          pstr_imdct_tables->only_long_window_kbd_960;
+      aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_short_window[1] =
+          pstr_imdct_tables->only_short_window_kbd_120;
 
+      aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[0] =
+          pstr_imdct_tables->only_long_window_sine_960;
+      aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[0] =
+          pstr_imdct_tables->only_short_window_sine_120;
+      aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_long_window[1] =
+          pstr_imdct_tables->only_long_window_kbd_960;
+      aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->ptr_short_window[1] =
+          pstr_imdct_tables->only_short_window_kbd_120;
+    }
+
+    aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.frame_length = frame_length;
     if (object_type == AOT_ER_AAC_ELD || object_type == AOT_ER_AAC_LD ||
         object_type == AOT_AAC_LTP) {
-      aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info.frame_length =
-          frame_length;
-
       if (512 == aac_dec_handle->samples_per_frame) {
         if (object_type != AOT_ER_AAC_ELD) {
           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_long_window[1] =
@@ -271,7 +304,7 @@
     memset(ptr_pns_info, 0, sizeof(ia_pns_info_struct));
   }
 
-  {
+  if (channel > 0) {
     ia_pns_correlation_info_struct *ptr_corr_info =
         aac_dec_handle->pstr_aac_dec_ch_info[0]->pstr_pns_corr_info;
     memset(ptr_corr_info->correlated, 0, sizeof(UWORD8) * PNS_BAND_FLAGS_SIZE);
@@ -290,6 +323,14 @@
         0;
   }
 
+  for (ch = 0; ch < channel; ch++) {
+    if (object_type == AOT_ER_AAC_ELD || object_type == AOT_ER_AAC_LD)
+      aac_dec_handle->pstr_aac_dec_ch_info[ch]->granule_len =
+          aac_dec_handle->samples_per_frame;
+    if (object_type == AOT_ER_AAC_LC)
+      aac_dec_handle->pstr_aac_dec_ch_info[ch]->granule_len =
+          aac_dec_handle->samples_per_frame / 8;
+  }
   previous_element = ID_END;
 
   aac_dec_handle->pstr_sbr_bitstream->no_elements = 0;
@@ -298,458 +339,546 @@
 
   cnt_bits = it_bit_buff->cnt_bits;
 
-  if (((object_type != AOT_ER_AAC_ELD) && (object_type != AOT_ER_AAC_LD)) ||
-      (object_type < ER_OBJECT_START)) {
-    while (ele_type != ID_END && aac_dec_handle->frame_status) {
-      ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
-      ixheaacd_read_bidirection(it_bit_buff, -3);
+  WORD32 err = 0;
+  jmp_buf local;
 
-      if (it_bit_buff->cnt_bits < 3) {
-        it_bit_buff->cnt_bits = -1;
-        error_code = (WORD16)(
-            (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
-        break;
-      }
+  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+    err = setjmp(local);
+  }
 
-      if ((ele_type == ID_FIL) || (ele_type == ID_DSE) || (new_element == 0)) {
+  if (!err && frame_status) {
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+      it_bit_buff->xaac_jmp_buf = &local;
+    }
+
+    if (((object_type != AOT_ER_AAC_ELD) && (object_type != AOT_ER_AAC_LD) &&
+         (object_type != AOT_ER_AAC_LC)) ||
+        (object_type < ER_OBJECT_START)) {
+      while (ele_type != ID_END && aac_dec_handle->frame_status) {
         ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
-        new_element = 1;
-      } else if ((ele_type != ID_END)) {
-        ele_type = -1;
-        break;
-      } else {
-        ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
-      }
+        ixheaacd_read_bidirection(it_bit_buff, -3);
 
-      if (it_bit_buff->cnt_bits < 0) {
-        aac_dec_handle->frame_status = 0;
-      }
+        if (it_bit_buff->cnt_bits < 3) {
+          it_bit_buff->cnt_bits = -1;
+          error_code = (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          break;
+        }
 
-      switch (ele_type) {
-        case ID_SCE:
-        case ID_CPE:
-        case ID_LFE:
+        if ((ele_type == ID_FIL) || (ele_type == ID_DSE) || (new_element == 0)) {
+          ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
+          new_element = 1;
+        } else if ((ele_type != ID_END)) {
+          ele_type = -1;
+          break;
+        } else {
+          ele_type = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 3);
+        }
 
-          if (aac_dec_handle->frame_status) {
-            ia_aac_dec_channel_info_struct *pstr_aac_dec_ch_info =
-                aac_dec_handle->pstr_aac_dec_ch_info[LEFT];
-            ia_ics_info_struct *ptr_ics_info =
-                &pstr_aac_dec_ch_info->str_ics_info;
-            ele_ch = 1;
-            if (ele_type == ID_CPE) {
-              ele_ch = 2;
-            } else {
+        if (it_bit_buff->cnt_bits < 0) {
+          aac_dec_handle->frame_status = 0;
+        }
+
+        switch (ele_type) {
+          case ID_SCE:
+          case ID_CPE:
+          case ID_LFE:
+
+            if (aac_dec_handle->frame_status) {
+              ia_aac_dec_channel_info_struct *pstr_aac_dec_ch_info =
+                  aac_dec_handle->pstr_aac_dec_ch_info[LEFT];
+              ia_ics_info_struct *ptr_ics_info = &pstr_aac_dec_ch_info->str_ics_info;
               ele_ch = 1;
-            }
+              if (ele_type == ID_CPE) {
+                ele_ch = 2;
+              } else {
+                ele_ch = 1;
+              }
 
-            prev_data_ele_present = 1;
+              prev_data_ele_present = 1;
 
-            if (ptr_adts_crc_info->crc_active == 1 &&
-                ptr_adts_crc_info->no_reg < 7) {
-              crc_reg = ixheaacd_adts_crc_start_reg(
-                  ptr_adts_crc_info, it_bit_buff, CRC_ADTS_RAW_DATA_BLK_LEN);
-            }
+              if (ptr_adts_crc_info->crc_active == 1 && ptr_adts_crc_info->no_reg < 7) {
+                crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff,
+                                                      CRC_ADTS_RAW_DATA_BLK_LEN);
+              }
 
-            pstr_aac_dec_ch_info->element_instance_tag =
-                (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
+              pstr_aac_dec_ch_info->element_instance_tag =
+                  (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
 
-            element_index_order[*ch_idx] =
-                pstr_aac_dec_ch_info->element_instance_tag;
-            pstr_aac_dec_ch_info->common_window = 0;
+              element_index_order[*ch_idx] = pstr_aac_dec_ch_info->element_instance_tag;
+              pstr_aac_dec_ch_info->common_window = 0;
 
-            ptr_ics_info->num_swb_window = 0;
-            ptr_ics_info->sampling_rate_index =
-                aac_dec_handle->sampling_rate_index;
-            if ((object_type == AOT_ER_AAC_LD) ||
-                (object_type == AOT_AAC_LTP)) {
-              ptr_ics_info->ltp.data_present = 0;
-              ptr_ics_info->ltp2.data_present = 0;
-              ptr_ics_info->predictor_data_present = 0;
-            }
+              ptr_ics_info->num_swb_window = 0;
+              ptr_ics_info->sampling_rate_index = aac_dec_handle->sampling_rate_index;
+              if ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_AAC_LTP)) {
+                ptr_ics_info->ltp.data_present = 0;
+                ptr_ics_info->ltp2.data_present = 0;
+                ptr_ics_info->predictor_data_present = 0;
+              }
 
-            if (ele_ch > 1) {
-              aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]
-                  ->str_ics_info.num_swb_window = 0;
-              aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]
-                  ->str_ics_info.sampling_rate_index =
-                  aac_dec_handle->sampling_rate_index;
+              if (ele_ch > 1) {
+                aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info.num_swb_window = 0;
+                aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info.sampling_rate_index =
+                    aac_dec_handle->sampling_rate_index;
 
-              pstr_aac_dec_ch_info->common_window =
-                  (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
+                pstr_aac_dec_ch_info->common_window =
+                    (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
 
-              if (pstr_aac_dec_ch_info->common_window) {
-                error_code = ixheaacd_ics_read(
-                    it_bit_buff, ptr_ics_info, aac_dec_handle->num_swb_window,
-                    object_type, pstr_aac_dec_ch_info->common_window,
-                    aac_dec_handle->samples_per_frame);
-                if (error_code) {
-                  if (it_bit_buff->cnt_bits < 0) {
-                    error_code = (WORD16)(
-                        (WORD32)
-                            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+                if (pstr_aac_dec_ch_info->common_window) {
+                  error_code = ixheaacd_ics_read(
+                      it_bit_buff, ptr_ics_info, aac_dec_handle->num_swb_window, object_type,
+                      pstr_aac_dec_ch_info->common_window, aac_dec_handle->samples_per_frame);
+                  if (error_code) {
+                    aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
+                        aac_dec_handle->pstr_aac_dec_ch_info[LEFT]->str_ics_info;
+                    if (it_bit_buff->cnt_bits < 0) {
+                      error_code =
+                          (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+                    }
+
+                    goto _ia_handle_error;
                   }
 
-                  goto _ia_handle_error;
+                  aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
+                      pstr_aac_dec_ch_info->str_ics_info;
+
+                  ixheaacd_read_ms_data(it_bit_buff, pstr_aac_dec_ch_info);
                 }
+              }
 
-                aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
-                    pstr_aac_dec_ch_info->str_ics_info;
+              error_code = ixheaacd_individual_ch_stream(
+                  it_bit_buff, aac_dec_handle, ele_ch, frame_length, total_channels, object_type,
+                  eld_specific_config, ele_type);
 
-                ixheaacd_read_ms_data(it_bit_buff, pstr_aac_dec_ch_info);
+              if (error_code) {
+                if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                  aac_dec_handle->frame_status = 0;
+                } else {
+                  return error_code;
+                }
+              }
+
+              if (ptr_adts_crc_info->crc_active == 1) {
+                ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
+              }
+
+              if (it_bit_buff->cnt_bits < 0) {
+                error_code =
+                    (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+              }
+
+              if (error_code) {
+                goto _ia_handle_error;
+              }
+
+            _ia_handle_error:
+              if (error_code) {
+                aac_dec_handle->frame_status = 0;
+                if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE)) num_ch = num_ch + ele_ch;
+                break;
+              } else {
+                error_code = ixheaacd_channel_pair_process(
+                    aac_dec_handle->pstr_aac_dec_ch_info, ele_ch, aac_dec_handle->pstr_aac_tables,
+                    total_channels, object_type, aac_spect_data_resil_flag,
+                    eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data,
+                    aac_scratch_ptrs->out_data, (VOID *)aac_dec_handle);
+                if (error_code) {
+                  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                    aac_dec_handle->frame_status = 0;
+                  } else {
+                    return error_code;
+                  }
+                }
+                num_ch = num_ch + ele_ch;
               }
             }
 
-            error_code = ixheaacd_individual_ch_stream(
-                it_bit_buff, aac_dec_handle, ele_ch, frame_length,
-                total_channels, object_type, eld_specific_config, ele_type);
-            if (error_code) return error_code;
+            break;
+          case ID_CCE:
+            if (max_channels > 2) {
+              prev_data_ele_present = 1;
+              error_code = ixheaacd_dec_coupling_channel_element(
+                  it_bit_buff, aac_dec_handle, aac_dec_handle->sampling_rate_index,
+                  aac_dec_handle->pstr_aac_tables, aac_dec_handle->pstr_common_tables,
+                  &element_index_order[*ch_idx],
+                  (ia_enhaacplus_dec_ind_cc *)aac_dec_handle->p_ind_channel_info, total_channels,
+                  frame_length, object_type, eld_specific_config, ele_type);
 
-            if (ptr_adts_crc_info->crc_active == 1) {
-              ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff,
-                                        crc_reg);
+              num_ch = num_ch + 1;
+
+              if (error_code) {
+                aac_dec_handle->frame_status = 0;
+                if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                  aac_dec_handle->frame_status = 0;
+                } else {
+                  return error_code;
+                }
+              } else {
+                error_code = ixheaacd_channel_pair_process(
+                    aac_dec_handle->pstr_aac_dec_ch_info, 1, aac_dec_handle->pstr_aac_tables,
+                    total_channels, object_type, aac_spect_data_resil_flag,
+                    eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data,
+                    aac_scratch_ptrs->out_data, (VOID *)aac_dec_handle);
+                if (error_code) {
+                  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                    aac_dec_handle->frame_status = 0;
+                  } else {
+                    return error_code;
+                  }
+                }
+              }
+            } else {
+              error_code = (WORD32)((WORD32)IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE);
+            }
+            if (it_bit_buff->cnt_bits < 0) {
+              error_code = (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+              goto _ia_handle_error;
+            }
+            break;
+
+          case ID_DSE:
+          case ID_PCE:
+          case ID_FIL:
+
+          {
+            WORD32 flag = 1;
+
+            if ((ele_type != ID_FIL) && (ptr_adts_crc_info->crc_active == 1) &&
+                (ptr_adts_crc_info->no_reg < 7)) {
+              crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff, 0);
+            }
+            if (ele_type == ID_DSE) {
+              ixheaacd_read_data_stream_element(it_bit_buff, &aac_dec_handle->byte_align_bits,
+                                                p_obj_exhaacplus_dec->p_state_aac->pstr_drc_dec);
+            }
+
+            else if (ele_type == ID_PCE) {
+              error_code = ixheaacd_decode_pce(
+                  it_bit_buff, &p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr,
+                  &p_obj_exhaacplus_dec->aac_config.str_prog_config);
+              if (error_code != 0) {
+                if (it_bit_buff->cnt_bits < 0) {
+                  error_code =
+                      (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+                  goto _ia_handle_error;
+                }
+                aac_dec_handle->frame_status = 0;
+                if (error_code > 0) {
+                  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                    aac_dec_handle->frame_status = 0;
+                  } else {
+                    return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+                  }
+                } else {
+                  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                    aac_dec_handle->frame_status = 0;
+                  } else {
+                    return error_code;
+                  }
+                }
+              }
+            }
+
+            else if (ele_type == ID_FIL) {
+              WORD32 bits_decoded = 0;
+              if (object_type == AOT_ER_AAC_ELD) {
+                bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
+                cnt_bits = (frame_size * 8 - bits_decoded);
+                if (adtsheader == 1) {
+                  if (cnt_bits > it_bit_buff->cnt_bits) {
+                    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                      aac_dec_handle->frame_status = 0;
+                    } else {
+                      return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+                    }
+                  }
+                }
+              }
+
+              if (ixheaacd_check_for_sbr_payload(
+                      it_bit_buff, aac_dec_handle->pstr_sbr_bitstream, (WORD16)previous_element,
+                      pstr_drc_dec, object_type, adtsheader, cnt_bits, ld_sbr_crc_flag, drc_dummy,
+                      mps_buffer, mps_header, mps_bytes, is_init, &aac_dec_handle->is_first,
+                      p_obj_exhaacplus_dec->aac_config.ui_err_conceal)) {
+                flag = 0;
+              }
             }
 
             if (it_bit_buff->cnt_bits < 0) {
-              error_code = (WORD16)(
-                  (WORD32)
-                      IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
-            }
-
-            if (error_code) {
+              error_code = (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
               goto _ia_handle_error;
             }
 
-          _ia_handle_error:
-            if (error_code) {
-              aac_dec_handle->frame_status = 0;
-              if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE))
-                num_ch = num_ch + ele_ch;
-              break;
-            } else {
-              error_code = ixheaacd_channel_pair_process(
-                  aac_dec_handle->pstr_aac_dec_ch_info, ele_ch,
-                  aac_dec_handle->pstr_aac_tables, total_channels, object_type,
-                  aac_spect_data_resil_flag,
-                  eld_specific_config.aac_sf_data_resil_flag,
-                  aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data,
-                  (void *)aac_dec_handle);
-              if (error_code) return error_code;
-              num_ch = num_ch + ele_ch;
-            }
-          }
-
-          break;
-        case ID_CCE:
-          if (max_channels > 2) {
-            prev_data_ele_present = 1;
-            error_code = ixheaacd_dec_coupling_channel_element(
-                it_bit_buff, aac_dec_handle,
-                aac_dec_handle->sampling_rate_index,
-                aac_dec_handle->pstr_aac_tables,
-                aac_dec_handle->pstr_common_tables,
-                &element_index_order[*ch_idx],
-                (ia_enhaacplus_dec_ind_cc *)aac_dec_handle->p_ind_channel_info,
-                total_channels, frame_length, object_type, eld_specific_config,
-                ele_type);
-
-            num_ch = num_ch + 1;
-
-            if (error_code) {
-              aac_dec_handle->frame_status = 0;
-              return error_code;
-            } else {
-              error_code = ixheaacd_channel_pair_process(
-                  aac_dec_handle->pstr_aac_dec_ch_info, 1,
-                  aac_dec_handle->pstr_aac_tables, total_channels, object_type,
-                  aac_spect_data_resil_flag,
-                  eld_specific_config.aac_sf_data_resil_flag,
-                  aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data,
-                  (void *)aac_dec_handle);
-              if (error_code) return error_code;
-            }
-          } else {
-            error_code =
-                (WORD32)((WORD32)IA_ENHAACPLUS_DEC_EXE_FATAL_UNIMPLEMENTED_CCE);
-          }
-          if (it_bit_buff->cnt_bits < 0) {
-            error_code = (WORD16)((
-                WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
-            goto _ia_handle_error;
-          }
-          break;
-
-        case ID_DSE:
-        case ID_PCE:
-        case ID_FIL:
-
-        {
-          WORD32 flag = 1;
-
-          if ((ele_type != ID_FIL) && (ptr_adts_crc_info->crc_active == 1) &&
-              (ptr_adts_crc_info->no_reg < 7)) {
-            crc_reg =
-                ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff, 0);
-          }
-          if (ele_type == ID_DSE) {
-            ixheaacd_read_data_stream_element(
-                it_bit_buff, &aac_dec_handle->byte_align_bits,
-                p_obj_exhaacplus_dec->p_state_aac->pstr_drc_dec);
-          }
-
-          else if (ele_type == ID_PCE) {
-            error_code = ixheaacd_decode_pce(
-                it_bit_buff,
-                &p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr,
-                &p_obj_exhaacplus_dec->aac_config.str_prog_config);
-            if (error_code != 0) {
-              if (it_bit_buff->cnt_bits < 0) {
-                error_code = (WORD16)(
-                    (WORD32)
-                        IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
-                goto _ia_handle_error;
+            if (flag) {
+              if (prev_data_ele_present == 0) {
+                new_element = 0;
               }
-              aac_dec_handle->frame_status = 0;
-              if (error_code > 0) {
-                error_code = IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
-                return error_code;
+            }
+            if ((ele_type != ID_FIL) && (ptr_adts_crc_info->crc_active == 1)) {
+              ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
+            }
+
+            if (ele_type == ID_PCE) {
+              if (ptr_adts_crc_info->str_crc_reg_data[crc_reg].bit_buf_cnt) {
+                ptr_adts_crc_info->str_crc_reg_data[crc_reg].max_bits =
+                    ptr_adts_crc_info->str_crc_reg_data[crc_reg].bit_buf_cnt;
+              }
+            }
+          }
+
+          break;
+
+          case ID_END:
+            error_code = 0;
+            break;
+        }
+
+        previous_element = ele_type;
+
+        if (init_flag) {
+          if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE)) {
+            p_obj_exhaacplus_dec->aac_config.element_type[*ch_idx] = ele_type;
+          }
+        }
+      }
+    } else {
+      {
+        switch (ch_config) {
+          default:
+            if (aac_dec_handle->frame_status) {
+              ia_aac_dec_channel_info_struct *pstr_aac_dec_ch_info =
+                  aac_dec_handle->pstr_aac_dec_ch_info[LEFT];
+              ia_ics_info_struct *ptr_ics_info = &pstr_aac_dec_ch_info->str_ics_info;
+
+              if (ch_config == 2)
+                ele_ch = 2, ele_type = 1;
+              else
+                ele_ch = 1, ele_type = 0;
+
+              prev_data_ele_present = 1;
+
+              if ((ptr_adts_crc_info->crc_active == 1) && (ptr_adts_crc_info->no_reg < 7)) {
+                crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff,
+                                                      CRC_ADTS_RAW_DATA_BLK_LEN);
+              }
+
+              if (object_type != AOT_ER_AAC_ELD)
+                pstr_aac_dec_ch_info->element_instance_tag =
+                    (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
+
+              element_index_order[*ch_idx] = pstr_aac_dec_ch_info->element_instance_tag;
+              pstr_aac_dec_ch_info->common_window = 0;
+
+              ptr_ics_info->num_swb_window = 0;
+              ptr_ics_info->sampling_rate_index = aac_dec_handle->sampling_rate_index;
+
+              if (object_type == AOT_ER_AAC_LD) {
+                ptr_ics_info->ltp.data_present = 0;
+                ptr_ics_info->ltp2.data_present = 0;
+                ptr_ics_info->predictor_data_present = 0;
+              }
+              if (ele_ch > 1) {
+                aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info.num_swb_window = 0;
+                aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info.sampling_rate_index =
+                    aac_dec_handle->sampling_rate_index;
+
+                if (object_type != 39)
+                  pstr_aac_dec_ch_info->common_window =
+                      (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
+                else
+                  pstr_aac_dec_ch_info->common_window = 1;
+
+                if (pstr_aac_dec_ch_info->common_window) {
+                  error_code = ixheaacd_ics_read(
+                      it_bit_buff, ptr_ics_info, aac_dec_handle->num_swb_window, object_type,
+                      pstr_aac_dec_ch_info->common_window, aac_dec_handle->samples_per_frame);
+                  if (error_code) {
+                    aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
+                        aac_dec_handle->pstr_aac_dec_ch_info[LEFT]->str_ics_info;
+                    if (it_bit_buff->cnt_bits < 0) {
+                      error_code =
+                          (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+                    }
+
+                    goto _ia_handle_error1;
+                  }
+
+                  aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
+                      pstr_aac_dec_ch_info->str_ics_info;
+
+                  ixheaacd_read_ms_data(it_bit_buff, pstr_aac_dec_ch_info);
+
+                  {
+                    if (object_type == AOT_ER_AAC_LD) {
+                      IA_ERRORCODE temp =
+                          ixheaacd_ltp_decode(it_bit_buff, ptr_ics_info, object_type,
+                                              aac_dec_handle->samples_per_frame, LEFT);
+
+                      if (temp != 0) {
+                        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                          p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+                        } else {
+                          return temp;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+
+              error_code = ixheaacd_individual_ch_stream(
+                  it_bit_buff, aac_dec_handle, ele_ch, frame_length, total_channels, object_type,
+                  eld_specific_config, ele_type);
+              if (error_code) {
+                if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                  aac_dec_handle->frame_status = 0;
+                } else {
+                  return error_code;
+                }
+              }
+
+              if (ptr_adts_crc_info->crc_active == 1) {
+                ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
+              }
+
+              if (it_bit_buff->cnt_bits < 0) {
+                error_code =
+                    (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+              }
+
+              if (error_code) {
+                goto _ia_handle_error1;
+              }
+
+            _ia_handle_error1:
+              if (error_code) {
+                aac_dec_handle->frame_status = 0;
+                if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE)) num_ch = num_ch + ele_ch;
+                break;
+              } else {
+                error_code = ixheaacd_channel_pair_process(
+                    aac_dec_handle->pstr_aac_dec_ch_info, ele_ch, aac_dec_handle->pstr_aac_tables,
+                    total_channels, object_type, aac_spect_data_resil_flag,
+                    eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data,
+                    aac_scratch_ptrs->out_data, (VOID *)aac_dec_handle);
+                if (error_code) {
+                  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                    aac_dec_handle->frame_status = 0;
+                  } else {
+                    return error_code;
+                  }
+                }
+                num_ch = num_ch + ele_ch;
+              }
+            }
+
+            p_obj_exhaacplus_dec->aac_config.element_type[*ch_idx] = ele_ch - 1;
+            break;
+        }
+
+        if ((object_type == AOT_ER_AAC_LC) || (!eld_sbr_flag)) {
+          WORD32 cnt_bits;
+          cnt_bits = it_bit_buff->cnt_bits;
+          p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.ldmps_config.no_ldsbr_present = 1;
+
+          if (cnt_bits >= 8) {
+            error_code = ixheaacd_extension_payload(
+                it_bit_buff, &cnt_bits, &p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle);
+            if (error_code) {
+              if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                aac_dec_handle->frame_status = 0;
               } else {
                 return error_code;
               }
             }
           }
 
-          else if (ele_type == ID_FIL) {
-            WORD32 bits_decoded = 0;
-            if (object_type == AOT_ER_AAC_ELD) {
-              bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
-              cnt_bits = (frame_size * 8 - bits_decoded);
-              if (adtsheader == 1) {
-                if (cnt_bits > it_bit_buff->cnt_bits)
-                  return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
-              }
-            }
-
-            if (ixheaacd_check_for_sbr_payload(
-                    it_bit_buff, aac_dec_handle->pstr_sbr_bitstream,
-                    (WORD16)previous_element, pstr_drc_dec, object_type,
-                    adtsheader, cnt_bits, ld_sbr_crc_flag, drc_dummy)) {
-              flag = 0;
-            }
-          }
-
-          if (it_bit_buff->cnt_bits < 0) {
-            error_code = (WORD16)((
-                WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
-            goto _ia_handle_error;
-          }
-
-          if (flag) {
-            if (prev_data_ele_present == 0) {
-              new_element = 0;
-            }
-          }
-          if ((ele_type != ID_FIL) && (ptr_adts_crc_info->crc_active == 1)) {
-            ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, crc_reg);
-          }
-
-          if (ele_type == ID_PCE) {
-            if (ptr_adts_crc_info->str_crc_reg_data[crc_reg].bit_buf_cnt) {
-              ptr_adts_crc_info->str_crc_reg_data[crc_reg].max_bits =
-                  ptr_adts_crc_info->str_crc_reg_data[crc_reg].bit_buf_cnt;
-            }
-          }
-        }
-
-        break;
-
-        case ID_END:
-          error_code = 0;
-          break;
-      }
-
-      previous_element = ele_type;
-
-      if (init_flag) {
-        if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE)) {
-          p_obj_exhaacplus_dec->aac_config.element_type[*ch_idx] = ele_type;
-        }
-      }
-    }
-  } else {
-    {
-      switch (ch_config) {
-        default:
-          if (aac_dec_handle->frame_status) {
-            ia_aac_dec_channel_info_struct *pstr_aac_dec_ch_info =
-                aac_dec_handle->pstr_aac_dec_ch_info[LEFT];
-            ia_ics_info_struct *ptr_ics_info =
-                &pstr_aac_dec_ch_info->str_ics_info;
-
-            if (ch_config == 2)
-              ele_ch = 2, ele_type = 1;
-            else
-              ele_ch = 1, ele_type = 0;
-
-            prev_data_ele_present = 1;
-
-            if ((ptr_adts_crc_info->crc_active == 1) &&
-                (ptr_adts_crc_info->no_reg < 7)) {
-              crc_reg = ixheaacd_adts_crc_start_reg(
-                  ptr_adts_crc_info, it_bit_buff, CRC_ADTS_RAW_DATA_BLK_LEN);
-            }
-
-            if (object_type != AOT_ER_AAC_ELD)
-              pstr_aac_dec_ch_info->element_instance_tag =
-                  (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 4);
-
-            element_index_order[*ch_idx] =
-                pstr_aac_dec_ch_info->element_instance_tag;
-            pstr_aac_dec_ch_info->common_window = 0;
-
-            ptr_ics_info->num_swb_window = 0;
-            ptr_ics_info->sampling_rate_index =
-                aac_dec_handle->sampling_rate_index;
-
-            if (object_type == AOT_ER_AAC_LD) {
-              ptr_ics_info->ltp.data_present = 0;
-              ptr_ics_info->ltp2.data_present = 0;
-              ptr_ics_info->predictor_data_present = 0;
-            }
-            if (ele_ch > 1) {
-              aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]
-                  ->str_ics_info.num_swb_window = 0;
-              aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]
-                  ->str_ics_info.sampling_rate_index =
-                  aac_dec_handle->sampling_rate_index;
-
-              if (object_type != 39)
-                pstr_aac_dec_ch_info->common_window =
-                    (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
-              else
-                pstr_aac_dec_ch_info->common_window = 1;
-
-              if (pstr_aac_dec_ch_info->common_window) {
-                error_code = ixheaacd_ics_read(
-                    it_bit_buff, ptr_ics_info, aac_dec_handle->num_swb_window,
-                    object_type, pstr_aac_dec_ch_info->common_window,
-                    aac_dec_handle->samples_per_frame);
-                if (error_code) {
-                  if (it_bit_buff->cnt_bits < 0) {
-                    error_code = (WORD16)(
-                        (WORD32)
-                            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
-                  }
-
-                  goto _ia_handle_error1;
-                }
-
-                aac_dec_handle->pstr_aac_dec_ch_info[RIGHT]->str_ics_info =
-                    pstr_aac_dec_ch_info->str_ics_info;
-
-                ixheaacd_read_ms_data(it_bit_buff, pstr_aac_dec_ch_info);
-
-                {
-                  if (object_type == AOT_ER_AAC_LD) {
-                    IA_ERRORCODE temp = ixheaacd_ltp_decode(
-                        it_bit_buff, ptr_ics_info, object_type,
-                        aac_dec_handle->samples_per_frame, LEFT);
-
-                    if (temp != 0) {
-                      return temp;
-                    }
-                  }
-                }
-              }
-            }
-
-            error_code = ixheaacd_individual_ch_stream(
-                it_bit_buff, aac_dec_handle, ele_ch, frame_length,
-                total_channels, object_type, eld_specific_config, ele_type);
-            if (error_code) return error_code;
-
-            if (ptr_adts_crc_info->crc_active == 1) {
-              ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff,
-                                        crc_reg);
-            }
-
-            if (it_bit_buff->cnt_bits < 0) {
-              error_code = (WORD16)(
-                  (WORD32)
-                      IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
-            }
-
-            if (error_code) {
-              goto _ia_handle_error1;
-            }
-
-          _ia_handle_error1:
-            if (error_code) {
-              aac_dec_handle->frame_status = 0;
-              if ((ele_type >= ID_SCE) && (ele_type <= ID_LFE))
-                num_ch = num_ch + ele_ch;
-              break;
-            } else {
-              error_code = ixheaacd_channel_pair_process(
-                  aac_dec_handle->pstr_aac_dec_ch_info, ele_ch,
-                  aac_dec_handle->pstr_aac_tables, total_channels, object_type,
-                  aac_spect_data_resil_flag,
-                  eld_specific_config.aac_sf_data_resil_flag,
-                  aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data,
-                  (void *)aac_dec_handle);
-              if (error_code) return error_code;
-              num_ch = num_ch + ele_ch;
-            }
-          }
-
-          p_obj_exhaacplus_dec->aac_config.element_type[*ch_idx] = ele_ch - 1;
-          break;
-      }
-
-      if ((object_type != AOT_ER_AAC_ELD) || (!eld_sbr_flag)) {
-        WORD32 bits_decoded, cnt_bits;
-        bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
-
-        cnt_bits = (frame_size * 8 - bits_decoded);
-        if (cnt_bits >= 8) {
-          error_code = ixheaacd_extension_payload(it_bit_buff, cnt_bits);
-          if (error_code) return error_code;
-        }
-
-        if (((object_type == AOT_ER_AAC_ELD) ||
-             (object_type == AOT_ER_AAC_LD)) &&
-            (p_obj_exhaacplus_dec->aac_config.ld_decoder != 1)) {
           if (it_bit_buff->cnt_bits) {
             WORD32 alignment = it_bit_buff->bit_pos & 0x07;
             it_bit_buff->cnt_bits = (it_bit_buff->cnt_bits + alignment) & 7;
             it_bit_buff->bit_pos = 7;
             it_bit_buff->ptr_read_next++;
           }
-        } else {
-          if (it_bit_buff->bit_pos != 7) {
-            WORD32 alignment = it_bit_buff->bit_pos & 0x07;
-            it_bit_buff->cnt_bits -= alignment + 1;
-            it_bit_buff->bit_pos += 7 - alignment;
-            it_bit_buff->ptr_read_next++;
+        }
+
+        else if ((object_type != AOT_ER_AAC_ELD) || (!eld_sbr_flag)) {
+          WORD32 bits_decoded, cnt_bits;
+          bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
+
+          cnt_bits = (frame_size * 8 - bits_decoded);
+
+          if (object_type == AOT_ER_AAC_LC) cnt_bits = it_bit_buff->cnt_bits;
+
+          p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.ldmps_config.no_ldsbr_present = 1;
+
+          if (cnt_bits >= 8) {
+            error_code = ixheaacd_extension_payload(
+                it_bit_buff, &cnt_bits, &p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle);
+            if (error_code) {
+              if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                aac_dec_handle->frame_status = 0;
+              } else {
+                return error_code;
+              }
+            }
           }
+
+          if (((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD)) &&
+              (p_obj_exhaacplus_dec->aac_config.ld_decoder != 1)) {
+            if (it_bit_buff->cnt_bits) {
+              WORD32 alignment = it_bit_buff->bit_pos & 0x07;
+              it_bit_buff->cnt_bits = (it_bit_buff->cnt_bits + alignment) & 7;
+              it_bit_buff->bit_pos = 7;
+              it_bit_buff->ptr_read_next++;
+            }
+          } else {
+            if (it_bit_buff->bit_pos != 7) {
+              WORD32 alignment = it_bit_buff->bit_pos & 0x07;
+              it_bit_buff->cnt_bits -= alignment + 1;
+              it_bit_buff->bit_pos += 7 - alignment;
+              it_bit_buff->ptr_read_next++;
+            }
+          }
+        } else {
+          WORD32 bits_decoded, cnt_bits;
+          bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
+          cnt_bits = (frame_size * 8 - bits_decoded);
+          if (adtsheader == 1) {
+            if (cnt_bits > it_bit_buff->cnt_bits) {
+              if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+                aac_dec_handle->frame_status = 0;
+              } else {
+                return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+              }
+            }
+          }
+          ixheaacd_check_for_sbr_payload(
+              it_bit_buff, aac_dec_handle->pstr_sbr_bitstream, (WORD16)(ch_config - 1),
+              pstr_drc_dec, object_type, adtsheader, cnt_bits, ld_sbr_crc_flag, drc_dummy,
+              mps_buffer, mps_header, mps_bytes, is_init, &aac_dec_handle->is_first,
+              p_obj_exhaacplus_dec->aac_config.ui_err_conceal);
         }
-      } else {
-        WORD32 bits_decoded, cnt_bits;
-        bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
-        cnt_bits = (frame_size * 8 - bits_decoded);
-        if (adtsheader == 1) {
-          if (cnt_bits > it_bit_buff->cnt_bits)
-            return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
-        }
-        ixheaacd_check_for_sbr_payload(
-            it_bit_buff, aac_dec_handle->pstr_sbr_bitstream,
-            (WORD16)(ch_config - 1), pstr_drc_dec, object_type, adtsheader,
-            cnt_bits, ld_sbr_crc_flag, drc_dummy);
       }
     }
   }
+  if ((err || (aac_dec_handle->frame_status == 0) || (frame_status == 0)) && (!is_init)) {
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+      aac_dec_handle->frame_status = 0;
+      error_code = 0;
+      num_ch = channel;
+      ele_type = ID_END;
+      p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+      it_bit_buff->cnt_bits = 0;
+    } else {
+      return err;
+    }
+  }
+  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && aac_dec_handle->conceal_count == 0) {
+    for (ch = 0; ch < channel; ch++) {
+      ixheaacd_aac_ec_init(&aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->str_ec_state);
+    }
+  }
 
-  if (ele_type == ID_END &&
-      p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
+  if (ele_type == ID_END && p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
     WORD32 tmp;
     tmp = ((WORD32)latm_element->layer_info[0][0].frame_len_bits) -
           (it_bit_buff->initial_cnt_bits - it_bit_buff->cnt_bits);
@@ -779,10 +908,8 @@
       WORD32 *scratch[2];
 
       for (ch = 0; ch < channel; ch++) {
-        str_ics_info[ch] =
-            aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info;
-        spec_coef[ch] =
-            aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_spec_coeff;
+        str_ics_info[ch] = aac_dec_handle->pstr_aac_dec_ch_info[ch]->str_ics_info;
+        spec_coef[ch] = aac_dec_handle->pstr_aac_dec_ch_info[ch]->ptr_spec_coeff;
       }
 
       scratch[0] = (WORD32 *)aac_scratch_ptrs->extra_scr_4k[2];
@@ -791,27 +918,78 @@
       error_code = ixheaacd_drc_map_channels(
           pstr_drc_dec, aac_dec_handle->channels,
           aac_dec_handle->pstr_aac_dec_ch_info[0]->str_ics_info.frame_length);
-      if (error_code) return error_code;
+      if (error_code) {
+        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+          error_code = 0;
+          aac_dec_handle->frame_status = 0;
+        } else {
+          return error_code;
+        }
+      }
 
       for (ch = 0; ch < aac_dec_handle->channels; ch++) {
-        WORD32 *overlap1 = aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
-                               ->overlap_add_data.ptr_overlap_buf;
+        WORD32 *overlap1 =
+            aac_dec_handle->ptr_aac_dec_static_channel_info[ch]->overlap_add_data.ptr_overlap_buf;
         const WORD16 *ptr_long_window_next =
             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
                 ->ptr_long_window[(int)str_ics_info[ch].window_shape];
         const WORD16 *ptr_short_window_next =
             aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
                 ->ptr_short_window[(int)str_ics_info[ch].window_shape];
+        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+          ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info =
+              aac_dec_handle->pstr_aac_dec_ch_info[ch];
+          ia_aac_dec_channel_info *pstr_aac_dec_static_channel_info =
+              aac_dec_handle->ptr_aac_dec_static_channel_info[ch];
+
+          ia_aac_dec_channel_info_struct **ppstr_aac_dec_channel_info =
+              &pstr_aac_dec_channel_info;
+          ia_aac_dec_channel_info **ppstr_aac_dec_static_channel_info =
+              &pstr_aac_dec_static_channel_info;
+          ia_audio_specific_config_struct *pstr_audio_specific_config;
+          pstr_audio_specific_config = p_state_enhaacplus_dec->ia_audio_specific_config;
+
+          if (str_ics_info[ch].max_sfb > str_ics_info[ch].num_swb_window) {
+            aac_dec_handle->frame_status = 0;
+          }
+
+          ixheaacd_aac_apply_ec(
+              &(*ppstr_aac_dec_static_channel_info)->str_ec_state, *ppstr_aac_dec_channel_info,
+              &ixheaacd_samp_rate_info[pstr_audio_specific_config->samp_frequency_index],
+              aac_dec_handle->samples_per_frame, &str_ics_info[ch], aac_dec_handle->frame_status);
+
+          aac_dec_handle->conceal_count = aac_dec_handle->conceal_count + 1;
+          if (aac_dec_handle->frame_status) {
+            aac_dec_handle->sbr_num_elements = aac_dec_handle->pstr_sbr_bitstream->no_elements;
+          } else {
+            aac_dec_handle->pstr_sbr_bitstream->no_elements = aac_dec_handle->sbr_num_elements;
+          }
+          if (first_frame == 1)
+            skip_full_decode = 1;
+          else
+            skip_full_decode = 0;
+        }
         if (pstr_drc_dec->drc_on) {
           ixheaacd_drc_apply(pstr_drc_dec, spec_coef[ch],
                              str_ics_info[ch].window_sequence, ch,
-                             str_ics_info[ch].frame_length);
+                             str_ics_info[ch].frame_length,
+                             object_type);
         }
         if (skip_full_decode == 0) {
-          ixheaacd_imdct_process(
-              aac_dec_handle->pstr_aac_dec_overlap_info[ch], spec_coef[ch],
-              &str_ics_info[ch], time_data + slot_element, (WORD16)ch_fac,
-              scratch[ch], aac_dec_handle->pstr_aac_tables, object_type);
+          ixheaacd_imdct_process(aac_dec_handle->pstr_aac_dec_overlap_info[ch],
+                                 spec_coef[ch], &str_ics_info[ch],
+                                 time_data + slot_element, ch_fac, scratch[ch],
+                                 aac_dec_handle->pstr_aac_tables, object_type,
+                                 ldmps_present, slot_element);
+
+          if (slot_pos != NULL) *slot_pos = slot_element;
+          if (p_obj_exhaacplus_dec->p_state_aac->qshift_cnt > 15) {
+            return IA_FATAL_ERROR;
+          }
+
+          p_obj_exhaacplus_dec->p_state_aac
+              ->qshift_adj[p_obj_exhaacplus_dec->p_state_aac->qshift_cnt++] =
+              str_ics_info[ch].qshift_adj;
 
           aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
               ->overlap_add_data.win_shape = str_ics_info[ch].window_shape;
@@ -827,7 +1005,7 @@
                     time_data + slot_element, overlap1,
                     aac_dec_handle->samples_per_frame, object_type,
                     (WORD16)ch_fac, str_ics_info[ch].window_sequence,
-                    (WORD16 *)ptr_long_window_next);
+                    (WORD16 *)ptr_long_window_next, slot_element);
               } else {
                 ixheaacd_lt_update_state(
                     aac_dec_handle->ptr_aac_dec_static_channel_info[ch]
@@ -835,30 +1013,63 @@
                     time_data + slot_element, overlap1,
                     aac_dec_handle->samples_per_frame, object_type,
                     (WORD16)ch_fac, str_ics_info[ch].window_sequence,
-                    (WORD16 *)ptr_short_window_next);
+                    (WORD16 *)ptr_short_window_next, slot_element);
               }
             }
           }
+          if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+            ia_aac_dec_channel_info *pstr_aac_dec_static_channel_info =
+                aac_dec_handle->ptr_aac_dec_static_channel_info[ch];
+            ia_ec_state_str *pstr_ec_state = &pstr_aac_dec_static_channel_info->str_ec_state;
+            WORD32 k;
+
+            if (pstr_ec_state->fade_idx < MAX_FADE_FRAMES) {
+              WORD32 fade_fac = ia_ec_fade_factors_fix[pstr_ec_state->fade_idx];
+              for (k = 0; k < str_ics_info[ch].frame_length; k++) {
+                time_data[k] = ixheaacd_mul32_sh(time_data[k], fade_fac, 30);
+              }
+            } else {
+              memset(time_data, 0, str_ics_info[ch].frame_length * sizeof(time_data[0]));
+            }
+          }
           slot_element++;
         }
       }
     }
 
   if (ele_type == ID_END) {
-    ixheaacd_byte_align(it_bit_buff, &aac_dec_handle->byte_align_bits);
-    if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
-      ixheaacd_byte_align(it_bit_buff, &it_bit_buff->audio_mux_align);
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+      if (err && !is_init) {
+        aac_dec_handle->frame_status = 0;
+      } else {
+        ixheaacd_byte_align(it_bit_buff, &aac_dec_handle->byte_align_bits);
+        if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
+          ixheaacd_byte_align(it_bit_buff, &it_bit_buff->audio_mux_align);
+        }
+      }
+    } else {
+      ixheaacd_byte_align(it_bit_buff, &aac_dec_handle->byte_align_bits);
+      if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT) {
+        ixheaacd_byte_align(it_bit_buff, &it_bit_buff->audio_mux_align);
+      }
     }
   }
   *type = ele_type;
 
   aac_dec_handle->block_number =
       ixheaacd_add32(aac_dec_handle->block_number, 1);
-  return error_code;
+  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && !is_init) {
+    p_obj_exhaacplus_dec->aac_config.frame_status = aac_dec_handle->frame_status;
+    return IA_NO_ERROR;
+  } else {
+    return error_code;
+  }
 }
 
-WORD32 ixheaacd_extension_payload(ia_bit_buf_struct *it_bit_buff, WORD32 cnt) {
-  WORD16 extension_type, discard;
+WORD32 ixheaacd_extension_payload(ia_bit_buf_struct *it_bit_buff, WORD32 *cnt,
+                                  ia_mps_dec_state_struct *self) {
+  WORD16 extension_type;
+  WORD32 len, add_len;
   WORD32 i;
   WORD32 fill_nibble;
 
@@ -870,18 +1081,55 @@
       fill_nibble = ixheaacd_read_bits_buf(it_bit_buff, 4);
 
       if (fill_nibble == 0) {
-        for (i = 0; i < (cnt >> 3) - 1; i++) {
-          ixheaacd_read_bits_buf(it_bit_buff, 8);
+        for (i = 0; i < (*cnt >> 3) - 1; i++) {
+          if (it_bit_buff->cnt_bits >= 8)
+            ixheaacd_read_bits_buf(it_bit_buff, 8);
+          else
+            ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
         }
 
       } else
-        err = -1;
+          err = -1;
+      *cnt = it_bit_buff->cnt_bits;
+      break;
+
+    case EXT_DATA_LENGTH:
+
+      len = ixheaacd_read_bits_buf(it_bit_buff, 4);
+
+      if (len == 15) {
+        add_len = ixheaacd_read_bits_buf(it_bit_buff, 8);
+        len += add_len;
+
+        if (add_len == 255) {
+          len += ixheaacd_read_bits_buf(it_bit_buff, 16);
+        }
+      }
+      len <<= 3;
+
+      ixheaacd_extension_payload(it_bit_buff, cnt, self);
+      break;
+
+    case EXT_LDSAC_DATA:
+
+      self->parse_nxt_frame = 1;
+      ixheaacd_read_bits_buf(it_bit_buff, 2);/*anc_type*/
+      ixheaacd_read_bits_buf(it_bit_buff, 2);/*anc_start_stop*/
+
+      err = ixheaacd_ld_mps_frame_parsing(self, it_bit_buff);
+      if (err) return err;
+
+      *cnt = it_bit_buff->cnt_bits;
       break;
     case EXT_FIL:
     default:
-      for (i = 0; i < ((cnt)-8) + 4; i++) {
-        discard = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+      for (i = 0; i < (*cnt) - 4; i++) {
+         ixheaacd_skip_bits_buf(it_bit_buff, 1);/*discard*/
       }
+
+      *cnt = it_bit_buff->cnt_bits;
+      break;
   }
 
   return err;
diff --git a/decoder/ixheaacd_aacpluscheck.c b/decoder/ixheaacd_aacpluscheck.c
index 8c7266e..821790e 100644
--- a/decoder/ixheaacd_aacpluscheck.c
+++ b/decoder/ixheaacd_aacpluscheck.c
@@ -40,6 +40,9 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
@@ -53,11 +56,13 @@
 
 #define SBR_EXTENSION_CRC_MPEG SBR_EXTENSION_CRC
 
-FLAG ixheaacd_check_for_sbr_payload(
-    ia_bit_buf_struct *it_bit_buff,
-    ia_aac_dec_sbr_bitstream_struct *pstr_stream_sbr, WORD16 prev_element,
-    ia_drc_dec_struct *pstr_drc_dec, WORD32 object_type, WORD32 adtsheader,
-    WORD32 cnt_bits, WORD32 ld_sbr_crc_flag, ia_drc_dec_struct *drc_dummy) {
+FLAG ixheaacd_check_for_sbr_payload(ia_bit_buf_struct *it_bit_buff,
+                                    ia_aac_dec_sbr_bitstream_struct *pstr_stream_sbr,
+                                    WORD16 prev_element, ia_drc_dec_struct *pstr_drc_dec,
+                                    WORD32 object_type, WORD32 adtsheader, WORD32 cnt_bits,
+                                    WORD32 ld_sbr_crc_flag, ia_drc_dec_struct *drc_dummy,
+                                    UWORD8 *mps_buffer, WORD32 *mps_header, WORD32 *mps_bytes,
+                                    WORD32 is_init, WORD32 *is_first, WORD32 ec_flag) {
   FLAG ret = 0;
   WORD32 count;
 
@@ -82,8 +87,8 @@
     else
       extension_type = ixheaacd_read_bits_buf(it_bit_buff, 4);
 
-    if (((count < MAXSBRBYTES)) && (((extension_type == SBR_EXTENSION)) ||
-                                    ((extension_type == SBR_EXTENSION_CRC))) &&
+    if (((count < MAXSBRBYTES)) &&
+        (((extension_type == SBR_EXTENSION)) || ((extension_type == SBR_EXTENSION_CRC))) &&
         ((prev_element == SBR_ID_SCE) || (prev_element == SBR_ID_CPE) ||
          sub_d(prev_element, SBR_ID_CCE) == 0)
 
@@ -95,24 +100,52 @@
       ret = 1;
 
       ptr_stream_sbr = &pstr_stream_sbr->str_sbr_ele[no_elements];
-      ptr_stream_sbr->size_payload = count;
-      byte_count = ptr_stream_sbr->size_payload;
-      ptr_stream_sbr->extension_type = extension_type;
-      ptr_stream_sbr->sbr_ele_id = prev_element;
+
+      if (ec_flag) {
+        ptr_stream_sbr->size_payload = ptr_stream_sbr->size_payload_old;
+        byte_count = ptr_stream_sbr->size_payload;
+        ptr_stream_sbr->extension_type = ptr_stream_sbr->prev_extension_type;
+        ptr_stream_sbr->sbr_ele_id = ptr_stream_sbr->prev_sbr_ele_id;
+      }
+
+      if (ec_flag) {
+        ptr_stream_sbr->size_payload_old = count;
+        byte_count = ptr_stream_sbr->size_payload_old;
+        ptr_stream_sbr->prev_extension_type = extension_type;
+        ptr_stream_sbr->prev_sbr_ele_id = prev_element;
+      } else {
+        ptr_stream_sbr->size_payload = count;
+        byte_count = ptr_stream_sbr->size_payload;
+        ptr_stream_sbr->extension_type = extension_type;
+        ptr_stream_sbr->sbr_ele_id = prev_element;
+      }
       pstr_stream_sbr->no_elements = no_elements + 1;
 
       if (pstr_drc_dec) pstr_drc_dec->sbr_found = 1;
 
+      if (ec_flag) {
+        memcpy(ptr_stream_sbr->ptr_sbr_data, ptr_stream_sbr->sbr_prev_data,
+               sizeof(ptr_stream_sbr->sbr_prev_data));
+      }
+
       if (byte_count > 0 && sub_d(byte_count, MAXSBRBYTES) <= 0) {
         WORD32 i;
         WORD8 *ptr_sbr_data;
         if (object_type != AOT_ER_AAC_ELD) {
-          ptr_sbr_data = &ptr_stream_sbr->ptr_sbr_data[1];
-          ptr_stream_sbr->ptr_sbr_data[0] =
-              (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
-        } else
-          ptr_sbr_data = ptr_stream_sbr->ptr_sbr_data;
-
+          if (ec_flag) {
+            ptr_sbr_data = &ptr_stream_sbr->sbr_prev_data[1];
+            ptr_stream_sbr->sbr_prev_data[0] = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
+          } else {
+            ptr_sbr_data = &ptr_stream_sbr->ptr_sbr_data[1];
+            ptr_stream_sbr->ptr_sbr_data[0] = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
+          }
+        } else {
+          if (ec_flag) {
+            ptr_sbr_data = ptr_stream_sbr->sbr_prev_data;
+          } else {
+            ptr_sbr_data = ptr_stream_sbr->ptr_sbr_data;
+          }
+        }
         for (i = byte_count - 2; i >= 0; i--) {
           *ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
           if (object_type == AOT_ER_AAC_ELD) {
@@ -128,18 +161,22 @@
             cnt_bits = cnt_bits - 8;
             if (cnt_bits > 0) {
               WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
-              *ptr_sbr_data =
-                  (WORD8)ixheaacd_read_bits_buf(it_bit_buff, cnt_bits);
+              *ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, cnt_bits);
               *ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
-              ptr_stream_sbr->size_payload++;
+              if (!ec_flag)
+                ptr_stream_sbr->size_payload++;
+              else
+                ptr_stream_sbr->size_payload_old++;
             }
           } else {
             if (it_bit_buff->cnt_bits > 0) {
               WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
-              *ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(
-                  it_bit_buff, it_bit_buff->cnt_bits);
+              *ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
               *ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
-              ptr_stream_sbr->size_payload++;
+              if (!ec_flag)
+                ptr_stream_sbr->size_payload++;
+              else
+                ptr_stream_sbr->size_payload_old++;
             }
           }
         }
@@ -147,14 +184,49 @@
 
     } else if (extension_type == EXT_DYNAMIC_RANGE) {
       pstr_drc_dec->drc_element_found = 1;
-      count -=
-          ixheaacd_dec_drc_read_element(pstr_drc_dec, drc_dummy, it_bit_buff);
+      count -= ixheaacd_dec_drc_read_element(pstr_drc_dec, drc_dummy, it_bit_buff);
+    } else if (extension_type == EXT_SAC_DATA) {
+      WORD32 anc_type, anc_start, i, len = 0;
+      anc_type = ixheaacd_read_bits_buf(it_bit_buff, 2);
+      *mps_header = anc_type;
+
+      anc_start = ixheaacd_read_bits_buf(it_bit_buff, 1);
+      if (anc_start == 1) {
+        *mps_bytes = 0;
+      }
+      ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+      if (anc_type == 1 && is_init == 0 && *is_first == 1) {
+        len = ixheaacd_read_bits_buf(it_bit_buff, 1);
+        len = ixheaacd_read_bits_buf(it_bit_buff, 7) + 1;
+        ixheaacd_read_bidirection(it_bit_buff, -8);
+      }
+
+      for (i = 0; i < count - 1; i++) {
+        mps_buffer[i + *mps_bytes] = ixheaacd_read_bits_buf(it_bit_buff, 8);
+      }
+
+      *mps_bytes += (count - 1);
+      if (anc_type == 1 && is_init == 0 && *is_first == 1) {
+        if (*mps_bytes < len) {
+          if (ec_flag) {
+            *mps_bytes = 0;
+          }
+          longjmp(*(it_bit_buff->xaac_jmp_buf),
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+        }
+        for (i = 0; i < count - 1; i++) {
+          mps_buffer[i] = mps_buffer[i + len];
+        }
+        *mps_bytes = *mps_bytes - len;
+      }
+      *is_first = 1;
     } else {
       ixheaacd_read_bits_buf(it_bit_buff, 4);
 
       if (it_bit_buff->cnt_bits < ((count - 1) << 3)) {
         longjmp(*(it_bit_buff->xaac_jmp_buf),
-                IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
       }
       it_bit_buff->ptr_read_next += count - 1;
       it_bit_buff->cnt_bits -= ((count - 1) << 3);
diff --git a/decoder/ixheaacd_acelp_bitparse.c b/decoder/ixheaacd_acelp_bitparse.c
index c5afc8c..b71ac7f 100644
--- a/decoder/ixheaacd_acelp_bitparse.c
+++ b/decoder/ixheaacd_acelp_bitparse.c
@@ -17,43 +17,40 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
-#include <math.h>
-#include <stdio.h>
 #include <string.h>
 #include "ixheaacd_type_def.h"
 
 #include "ixheaacd_acelp_com.h"
-#include "ixheaacd_windows.h"
-#include "ixheaacd_vec_baisc_ops.h"
 #include "ixheaacd_bitbuffer.h"
 
 #include "ixheaacd_interface.h"
-
-#include "ixheaacd_tns_usac.h"
 #include "ixheaacd_cnst.h"
-
-#include "ixheaacd_acelp_info.h"
-
-#include "ixheaacd_sbrdecsettings.h"
 #include "ixheaacd_info.h"
 #include "ixheaacd_sbr_common.h"
 #include "ixheaacd_drc_data_struct.h"
-#include "ixheaacd_drc_dec.h"
-#include "ixheaacd_sbrdecoder.h"
-#include "ixheaacd_mps_polyphase.h"
-#include "ixheaacd_sbr_const.h"
-#include "ixheaacd_main.h"
-#include "ixheaacd_arith_dec.h"
-#include "ixheaacd_bit_extract.h"
-#include "ixheaacd_main.h"
-#include "ixheaacd_func_def.h"
+#include "ixheaacd_defines.h"
+#include "ixheaacd_aac_rom.h"
+#include "ixheaacd_pulsedata.h"
+#include "ixheaacd_pns.h"
 #include "ixheaacd_constants.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_acelp_info.h"
+#include "ixheaacd_tns_usac.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_main.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_ec.h"
+#include "ixheaacd_arith_dec.h"
+#include "ixheaacd_func_def.h"
 #include "ixheaacd_basic_ops32.h"
-#include "ixheaacd_basic_ops40.h"
 #include "ixheaacd_error_standards.h"
+#include "ixheaacd_error_codes.h"
 
-WORD32 ixheaacd_get_mode_lpc(WORD32 lpc_set, ia_bit_buf_struct *it_bit_buff,
-                             WORD32 *nk_mode) {
+extern const ia_usac_samp_rate_info ixheaacd_samp_rate_info[];
+
+WORD32 ixheaacd_get_mode_lpc(WORD32 lpc_set, ia_bit_buf_struct *it_bit_buff, WORD32 *nk_mode) {
   WORD32 mode_lpc = 0;
   switch (lpc_set) {
     case 4:
@@ -93,8 +90,7 @@
   return mode_lpc;
 }
 
-VOID ixheaacd_qn_data(WORD32 nk_mode, WORD32 *qn,
-                      ia_bit_buf_struct *it_bit_buff) {
+VOID ixheaacd_qn_data(WORD32 nk_mode, WORD32 *qn, ia_bit_buf_struct *it_bit_buff) {
   WORD32 k;
   switch (nk_mode) {
     case 1:
@@ -108,8 +104,7 @@
     case 0:
     case 2:
     case 3:
-      for (k = 0; k < 2; k++)
-        qn[k] = 2 + ixheaacd_read_bits_buf(it_bit_buff, 2);
+      for (k = 0; k < 2; k++) qn[k] = 2 + ixheaacd_read_bits_buf(it_bit_buff, 2);
 
       if (nk_mode == 2) {
         for (k = 0; k < 2; k++) {
@@ -149,9 +144,8 @@
   return;
 }
 
-VOID ixheaacd_code_book_indices(ia_td_frame_data_struct *pstr_td_frame_data,
-                                WORD32 nk_mode, WORD32 *pos,
-                                ia_bit_buf_struct *it_bit_buff) {
+VOID ixheaacd_code_book_indices(ia_td_frame_data_struct *pstr_td_frame_data, WORD32 nk_mode,
+                                WORD32 *pos, ia_bit_buf_struct *it_bit_buff) {
   WORD32 k, qn[2] = {0, 0}, nk, n, i;
 
   ixheaacd_qn_data(nk_mode, &qn[0], it_bit_buff);
@@ -186,8 +180,7 @@
 
   mode_lpc = ixheaacd_get_mode_lpc(4, it_bit_buff, &nk_mode);
 
-  pstr_td_frame_data->lpc_first_approx_idx[j++] =
-      ixheaacd_read_bits_buf(it_bit_buff, 8);
+  pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
 
   ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
   if (first_lpd_flag) {
@@ -195,8 +188,7 @@
     pstr_td_frame_data->lpc_first_approx_idx[j++] = mode_lpc;
 
     if (mode_lpc == 0)
-      pstr_td_frame_data->lpc_first_approx_idx[j++] =
-          ixheaacd_read_bits_buf(it_bit_buff, 8);
+      pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
 
     ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
   }
@@ -205,8 +197,7 @@
     pstr_td_frame_data->lpc_first_approx_idx[j++] = mode_lpc;
 
     if (mode_lpc == 0)
-      pstr_td_frame_data->lpc_first_approx_idx[j++] =
-          ixheaacd_read_bits_buf(it_bit_buff, 8);
+      pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
 
     ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
   }
@@ -215,19 +206,16 @@
     pstr_td_frame_data->lpc_first_approx_idx[j++] = mode_lpc;
 
     if (mode_lpc == 0)
-      pstr_td_frame_data->lpc_first_approx_idx[j++] =
-          ixheaacd_read_bits_buf(it_bit_buff, 8);
+      pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
 
-    if (mode_lpc != 1)
-      ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
+    if (mode_lpc != 1) ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
   }
   if (mod[2] < 2) {
     mode_lpc = ixheaacd_get_mode_lpc(3, it_bit_buff, &nk_mode);
     pstr_td_frame_data->lpc_first_approx_idx[j++] = mode_lpc;
 
     if (mode_lpc == 0)
-      pstr_td_frame_data->lpc_first_approx_idx[j++] =
-          ixheaacd_read_bits_buf(it_bit_buff, 8);
+      pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
 
     ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
   }
@@ -259,8 +247,7 @@
       kv[j] = ixheaacd_read_bits_buf(it_bit_buff, nk);
     }
 
-    ixheaacd_rotated_gosset_mtx_dec(qn, code_book_index, kv,
-                                    &fac_prm[k * FAC_LENGTH + i]);
+    ixheaacd_rotated_gosset_mtx_dec(qn, code_book_index, kv, &fac_prm[k * FAC_LENGTH + i]);
   }
 }
 
@@ -283,15 +270,12 @@
     kk = k * 4 + sfr;
 
     if ((sfr == 0) || ((nb_subfr == 4) && (sfr == 2)))
-      pstr_td_frame_data->acb_index[kk] =
-          ixheaacd_read_bits_buf(it_bit_buff, 9);
+      pstr_td_frame_data->acb_index[kk] = ixheaacd_read_bits_buf(it_bit_buff, 9);
 
     else
-      pstr_td_frame_data->acb_index[kk] =
-          ixheaacd_read_bits_buf(it_bit_buff, 6);
+      pstr_td_frame_data->acb_index[kk] = ixheaacd_read_bits_buf(it_bit_buff, 6);
 
-    pstr_td_frame_data->ltp_filtering_flag[kk] =
-        ixheaacd_read_bits_buf(it_bit_buff, 1);
+    pstr_td_frame_data->ltp_filtering_flag[kk] = ixheaacd_read_bits_buf(it_bit_buff, 1);
 
     if (pstr_td_frame_data->acelp_core_mode == 5) {
       pstr_td_frame_data->icb_index[kk][0] =
@@ -325,14 +309,9 @@
   }
 }
 
-IA_ERRORCODE ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, pWORD32 quant,
-                                 WORD32 k, WORD32 first_tcx_flag,
-                                 ia_td_frame_data_struct *pstr_td_frame_data,
-                                 ia_bit_buf_struct *it_bit_buff
-
-                                 ) {
-  IA_ERRORCODE err = IA_NO_ERROR;
-
+VOID ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, pWORD32 quant, WORD32 k,
+                         WORD32 first_tcx_flag, ia_td_frame_data_struct *pstr_td_frame_data,
+                         ia_bit_buf_struct *it_bit_buff) {
   pstr_td_frame_data->noise_factor[k] = ixheaacd_read_bits_buf(it_bit_buff, 3);
 
   pstr_td_frame_data->global_gain[k] = ixheaacd_read_bits_buf(it_bit_buff, 7);
@@ -353,131 +332,179 @@
     if (usac_data->usac_independency_flg) {
       pstr_td_frame_data->arith_reset_flag = 1;
     } else {
-      pstr_td_frame_data->arith_reset_flag =
-          ixheaacd_read_bits_buf(it_bit_buff, 1);
+      pstr_td_frame_data->arith_reset_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
     }
   }
 
-  err = ixheaacd_arith_data(pstr_td_frame_data, quant, usac_data, it_bit_buff,
-                            (first_tcx_flag), k);
-  if (err) return err;
+  ixheaacd_arith_data(pstr_td_frame_data, quant, usac_data, it_bit_buff, (first_tcx_flag), k);
 
-  return IA_NO_ERROR;
+  return;
 }
 
 WORD32 ixheaacd_lpd_channel_stream(ia_usac_data_struct *usac_data,
                                    ia_td_frame_data_struct *pstr_td_frame_data,
-                                   ia_bit_buf_struct *it_bit_buff,
-                                   FLOAT32 *synth
-
-                                   )
-
-{
+                                   ia_bit_buf_struct *it_bit_buff, FLOAT32 *synth) {
   WORD32 lpd_mode, k, cnt, ii;
   WORD32 first_tcx_flag;
   WORD32 *quant;
-  WORD32 core_mode_last, fac_data_present;
+  WORD32 core_mode_last = 0, fac_data_present;
   WORD32 *fac_data;
-  WORD32 first_lpd_flag;
+  WORD32 first_lpd_flag = 0;
   WORD32 short_fac_flag;
-  WORD32 bpf_control_info;
+  WORD32 bpf_control_info = 0;
   WORD32 chan = usac_data->present_chan;
   WORD32 last_lpd_mode = usac_data->str_tddec[chan]->mode_prev;
   WORD32 err = 0;
   short_fac_flag = 0;
 
-  pstr_td_frame_data->acelp_core_mode = ixheaacd_read_bits_buf(it_bit_buff, 3);
+  jmp_buf local;
 
-  lpd_mode = ixheaacd_read_bits_buf(it_bit_buff, 5);
+  if (usac_data->ec_flag) {
+    err = setjmp(local);
+  }
 
-  if (lpd_mode == 25) {
-    pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] =
-        pstr_td_frame_data->mod[2] = pstr_td_frame_data->mod[3] = 3;
-  } else if (lpd_mode == 24) {
-    pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] =
+  if (usac_data->sampling_rate_idx <= 5 && usac_data->ec_flag) {
+    usac_data->frame_ok = 0;
+  }
+
+  if (err == 0 && usac_data->frame_ok == 1) {
+    if (usac_data->ec_flag) {
+      it_bit_buff->xaac_jmp_buf = &local;
+    }
+    pstr_td_frame_data->acelp_core_mode = ixheaacd_read_bits_buf(it_bit_buff, 3);
+
+    lpd_mode = ixheaacd_read_bits_buf(it_bit_buff, 5);
+
+    if ((lpd_mode > 25 || lpd_mode < 0)) {
+      if (usac_data->ec_flag) {
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+      } else {
+        return IA_FATAL_ERROR;
+      }
+    }
+
+    if (lpd_mode == 25) {
+      pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] = pstr_td_frame_data->mod[2] =
+          pstr_td_frame_data->mod[3] = 3;
+    } else if (lpd_mode == 24) {
+      pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] = pstr_td_frame_data->mod[2] =
+          pstr_td_frame_data->mod[3] = 2;
+    } else {
+      if (lpd_mode >= 20) {
+        pstr_td_frame_data->mod[0] = lpd_mode & 1;
+        pstr_td_frame_data->mod[1] = (lpd_mode >> 1) & 1;
         pstr_td_frame_data->mod[2] = pstr_td_frame_data->mod[3] = 2;
+      } else if (lpd_mode >= 16) {
+        pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] = 2;
+        pstr_td_frame_data->mod[2] = lpd_mode & 1;
+        pstr_td_frame_data->mod[3] = (lpd_mode >> 1) & 1;
+      } else {
+        pstr_td_frame_data->mod[0] = lpd_mode & 1;
+        pstr_td_frame_data->mod[1] = (lpd_mode >> 1) & 1;
+        pstr_td_frame_data->mod[2] = (lpd_mode >> 2) & 1;
+        pstr_td_frame_data->mod[3] = (lpd_mode >> 3) & 1;
+      }
+    }
+
+    bpf_control_info = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+    core_mode_last = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+    fac_data_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+    first_lpd_flag = (core_mode_last == 0) ? 1 : 0;
+
+    quant = pstr_td_frame_data->x_tcx_invquant;
+    first_tcx_flag = 1;
+    k = 0;
+    while (k < 4) {
+      if (k == 0) {
+        if ((core_mode_last == 1) && (fac_data_present == 1))
+          ixheaacd_fac_decoding((usac_data->len_subfrm) / 2, k, pstr_td_frame_data->fac,
+                                it_bit_buff);
+      } else {
+        if (((last_lpd_mode == 0) && (pstr_td_frame_data->mod[k] > 0)) ||
+            ((last_lpd_mode > 0) && (pstr_td_frame_data->mod[k] == 0)))
+          ixheaacd_fac_decoding((usac_data->len_subfrm) / 2, k, pstr_td_frame_data->fac,
+                                it_bit_buff);
+      }
+
+      if (pstr_td_frame_data->mod[k] == 0) {
+        ixheaacd_acelp_decoding(k, usac_data, pstr_td_frame_data, it_bit_buff, chan);
+        last_lpd_mode = 0;
+        pstr_td_frame_data->tcx_lg[k] = 0;
+        k += 1;
+      } else {
+        ixheaacd_tcx_coding(usac_data, quant, k, first_tcx_flag, pstr_td_frame_data, it_bit_buff);
+        last_lpd_mode = pstr_td_frame_data->mod[k];
+        quant += pstr_td_frame_data->tcx_lg[k];
+
+        cnt = 1 << (pstr_td_frame_data->mod[k] - 1);
+
+        for (ii = 0; ii < cnt - 1; ii++) pstr_td_frame_data->tcx_lg[k + 1 + ii] = 0;
+
+        k += cnt;
+        first_tcx_flag = 0;
+      }
+    }
+
+    ixheaacd_lpc_data(first_lpd_flag, pstr_td_frame_data->mod, pstr_td_frame_data, it_bit_buff);
+
+    if ((core_mode_last == 0) && (fac_data_present == 1)) {
+      WORD32 fac_length;
+      short_fac_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+      fac_length = (short_fac_flag) ? ((usac_data->ccfl) / 16) : ((usac_data->ccfl) / 8);
+
+      fac_data = pstr_td_frame_data->fac_data;
+      fac_data[0] = ixheaacd_read_bits_buf(it_bit_buff, 7);
+      if ((pstr_td_frame_data->fac_data[0] < 0) || (pstr_td_frame_data->fac_data[0] > 128)) {
+        if (usac_data->ec_flag) {
+          longjmp(*(it_bit_buff->xaac_jmp_buf),
+                  IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+        } else {
+          return IA_FATAL_ERROR;
+        }
+      }
+      ixheaacd_fac_decoding(fac_length, 0, &fac_data[1], it_bit_buff);
+    }
+    if (fac_data_present == 0) {
+      memset(&pstr_td_frame_data->fac_data[0], 0, sizeof(pstr_td_frame_data->fac_data));
+    }
+    if (usac_data->ec_flag && usac_data->frame_ok) {
+      usac_data->bpf_control_info = bpf_control_info;
+      usac_data->core_mode_last = core_mode_last;
+      usac_data->first_lpd_flag = first_lpd_flag;
+    }
   } else {
-    if (lpd_mode >= 20) {
-      pstr_td_frame_data->mod[0] = lpd_mode & 1;
-      pstr_td_frame_data->mod[1] = (lpd_mode >> 1) & 1;
-      pstr_td_frame_data->mod[2] = pstr_td_frame_data->mod[3] = 2;
-    } else if (lpd_mode >= 16) {
-      pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] = 2;
-      pstr_td_frame_data->mod[2] = lpd_mode & 1;
-      pstr_td_frame_data->mod[3] = (lpd_mode >> 1) & 1;
-    } else {
-      pstr_td_frame_data->mod[0] = lpd_mode & 1;
-      pstr_td_frame_data->mod[1] = (lpd_mode >> 1) & 1;
-      pstr_td_frame_data->mod[2] = (lpd_mode >> 2) & 1;
-      pstr_td_frame_data->mod[3] = (lpd_mode >> 3) & 1;
-    }
+    usac_data->frame_ok = 0;
   }
 
-  bpf_control_info = ixheaacd_read_bits_buf(it_bit_buff, 1);
+  if (usac_data->ec_flag) {
+    usac_data->str_error_concealment[chan].pstr_ec_scratch =
+        (ia_ec_scratch_str *)&usac_data->str_error_concealment[chan].str_ec_scratch;
 
-  core_mode_last = ixheaacd_read_bits_buf(it_bit_buff, 1);
+    ixheaacd_usac_apply_ec(usac_data, &ixheaacd_samp_rate_info[0], chan);
 
-  fac_data_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
-
-  first_lpd_flag = (core_mode_last == 0) ? 1 : 0;
-
-  quant = pstr_td_frame_data->x_tcx_invquant;
-  first_tcx_flag = 1;
-  k = 0;
-  while (k < 4) {
-    if (k == 0) {
-      if ((core_mode_last == 1) && (fac_data_present == 1))
-        ixheaacd_fac_decoding((usac_data->len_subfrm) / 2, k,
-                              pstr_td_frame_data->fac, it_bit_buff);
-    } else {
-      if (((last_lpd_mode == 0) && (pstr_td_frame_data->mod[k] > 0)) ||
-          ((last_lpd_mode > 0) && (pstr_td_frame_data->mod[k] == 0)))
-        ixheaacd_fac_decoding((usac_data->len_subfrm) / 2, k,
-                              pstr_td_frame_data->fac, it_bit_buff);
-    }
-
-    if (pstr_td_frame_data->mod[k] == 0) {
-      ixheaacd_acelp_decoding(k, usac_data, pstr_td_frame_data, it_bit_buff,
-                              chan);
-      last_lpd_mode = 0;
-      pstr_td_frame_data->tcx_lg[k] = 0;
-      k += 1;
-    } else {
-      err = ixheaacd_tcx_coding(usac_data, quant, k, first_tcx_flag,
-                                pstr_td_frame_data, it_bit_buff);
-      if (err) return err;
-      last_lpd_mode = pstr_td_frame_data->mod[k];
-      quant += pstr_td_frame_data->tcx_lg[k];
-
-      cnt = 1 << (pstr_td_frame_data->mod[k] - 1);
-
-      for (ii = 0; ii < cnt - 1; ii++)
-        pstr_td_frame_data->tcx_lg[k + 1 + ii] = 0;
-
-      k += cnt;
-      first_tcx_flag = 0;
+    if (usac_data->frame_ok == 0) {
+      bpf_control_info = usac_data->bpf_control_info;
+      core_mode_last = usac_data->core_mode_last;
+      first_lpd_flag = usac_data->first_lpd_flag;
     }
   }
-
-  ixheaacd_lpc_data(first_lpd_flag, pstr_td_frame_data->mod, pstr_td_frame_data,
-                    it_bit_buff);
-
-  if ((core_mode_last == 0) && (fac_data_present == 1)) {
-    WORD32 fac_length;
-    short_fac_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
-
-    fac_length =
-        (short_fac_flag) ? ((usac_data->ccfl) / 16) : ((usac_data->ccfl) / 8);
-
-    fac_data = pstr_td_frame_data->fac_data;
-    fac_data[0] = ixheaacd_read_bits_buf(it_bit_buff, 7);
-    ixheaacd_fac_decoding(fac_length, 0, &fac_data[1], it_bit_buff);
+  if (usac_data->frame_ok) {
+    err = ixheaacd_lpd_dec(usac_data, usac_data->str_tddec[chan], pstr_td_frame_data, synth,
+                           first_lpd_flag, short_fac_flag, bpf_control_info);
+  } else {
+    if (usac_data->ec_flag) {
+      usac_data->fac_data_present[chan] = 0;
+      err = ixheaacd_lpd_dec(usac_data, usac_data->str_tddec[chan],
+                             &usac_data->td_frame_data_prev[chan], synth, first_lpd_flag,
+                             short_fac_flag, bpf_control_info);
+    }
   }
 
-  err = ixheaacd_lpd_dec(usac_data, usac_data->str_tddec[chan],
-                         pstr_td_frame_data, synth, first_lpd_flag,
-                         short_fac_flag, bpf_control_info);
-
   return (err);
 }
 
@@ -490,18 +517,20 @@
 
   if (!td_frame_prev) {
     if (tw_mdct) {
-      return -1;
+      if (usac_data->ec_flag == 0) {
+        return -1;
+      } else {
+        tw_mdct = 0;
+      }
     } else {
-      ixheaacd_reset_acelp_data_fix(
-          usac_data, st, p_ioverlap,
-          (window_sequence_last == EIGHT_SHORT_SEQUENCE), 0);
+      ixheaacd_reset_acelp_data_fix(usac_data, st, p_ioverlap,
+                                    (window_sequence_last == EIGHT_SHORT_SEQUENCE), 0);
     }
   }
   return 0;
 }
 
-VOID ixheaacd_td_frm_dec(ia_usac_data_struct *usac_data, WORD32 k,
-                         WORD32 mod0) {
+VOID ixheaacd_td_frm_dec(ia_usac_data_struct *usac_data, WORD32 k, WORD32 mod0) {
   WORD32 i;
   WORD32 lfac = 0;
 
@@ -542,8 +571,7 @@
       p_out_idata[i] = p_ioverlap[i] << 1;
       p_out_idata[i + nlong / 2] =
           ixheaacd_add32_sat(p_ioverlap[i + nlong / 2] << 1, p_in_idata[i]);
-      p_ioverlap[i] = ixheaacd_add32_sat(p_in_idata[i + (nlong / 2)] >> 1,
-                                         p_ioverlap[i + nlong]);
+      p_ioverlap[i] = ixheaacd_add32_sat(p_in_idata[i + (nlong / 2)] >> 1, p_ioverlap[i + nlong]);
       p_ioverlap[i + (nlong / 2)] = 0;
       p_ioverlap[i + nlong] = 0;
       p_ioverlap[i + nlong + (nlong / 2)] = 0;
diff --git a/decoder/ixheaacd_acelp_decode.c b/decoder/ixheaacd_acelp_decode.c
index e209a33..0d656ff 100644
--- a/decoder/ixheaacd_acelp_decode.c
+++ b/decoder/ixheaacd_acelp_decode.c
@@ -44,6 +44,8 @@
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_func_def.h"
@@ -313,6 +315,57 @@
   return;
 }
 
+static VOID ixheaacd_acelp_decode_gains_with_ec(WORD32 index, FLOAT32 code_vec[],
+                                                FLOAT32 *pitch_gain, FLOAT32 *codebook_gain,
+                                                FLOAT32 mean_exc_energy, FLOAT32 *energy,
+                                                FLOAT32 *past_pitch_gain, FLOAT32 *past_gain_code,
+                                                WORD32 bfi) {
+  WORD32 i;
+  FLOAT32 avg_innov_energy, est_gain, gain_inov;
+  const FLOAT32 *gain_table = ixheaacd_int_leave_gain_table;
+
+  avg_innov_energy = 0.01f;
+  for (i = 0; i < LEN_SUBFR; i++) {
+    avg_innov_energy += code_vec[i] * code_vec[i];
+  }
+  *energy = avg_innov_energy;
+  gain_inov = (FLOAT32)(1 / sqrt(avg_innov_energy / LEN_SUBFR));
+
+  if (bfi) {
+    FLOAT32 tgpit = (*past_pitch_gain);
+
+    if (tgpit > 0.95f) {
+      tgpit = 0.95f;
+    } else if (tgpit < 0.5f) {
+      tgpit = 0.5f;
+    }
+    *pitch_gain = (FLOAT32)tgpit;
+    tgpit = tgpit * 0.95f;
+    *past_pitch_gain = (FLOAT32)tgpit;
+
+    tgpit = 1.4f - tgpit;
+    tgpit = *past_gain_code * tgpit;
+    *codebook_gain = tgpit * gain_inov;
+
+    *past_gain_code = tgpit;
+    return;
+  }
+
+  avg_innov_energy = (FLOAT32)(10.0 * log10(avg_innov_energy / (FLOAT32)LEN_SUBFR));
+  est_gain = mean_exc_energy - avg_innov_energy;
+
+  est_gain = (FLOAT32)pow(10.0, 0.05 * est_gain);
+  if (!bfi) {
+    *pitch_gain = gain_table[index * 2];
+    *past_pitch_gain = *pitch_gain;
+  }
+
+  *codebook_gain = gain_table[index * 2 + 1] * est_gain;
+  *past_gain_code = (*codebook_gain) / gain_inov;
+
+  return;
+}
+
 static VOID ixheaacd_cb_exc_calc(FLOAT32 xcitation_curr[], WORD32 pitch_lag,
                                  WORD32 frac) {
   WORD32 i, j;
@@ -339,13 +392,12 @@
   return;
 }
 
-WORD32 ixheaacd_acelp_alias_cnx(ia_usac_data_struct *usac_data,
-                                ia_td_frame_data_struct *pstr_td_frame_data,
-                                WORD32 k, FLOAT32 lp_filt_coeff[],
-                                FLOAT32 stability_factor,
-                                ia_usac_lpd_decoder_handle st) {
+VOID ixheaacd_acelp_alias_cnx(ia_usac_data_struct *usac_data,
+                              ia_td_frame_data_struct *pstr_td_frame_data, WORD32 k,
+                              FLOAT32 lp_filt_coeff[], FLOAT32 stability_factor,
+                              ia_usac_lpd_decoder_handle st) {
   WORD32 i, subfr_idx;
-  WORD32 pitch_lag, pitch_lag_frac, index, pitch_flag, pitch_lag_max;
+  WORD32 pitch_lag = 0, pitch_lag_frac = 0, index, pitch_flag, pitch_lag_max;
   WORD32 pitch_lag_min = 0;
   FLOAT32 tmp, pitch_gain, gain_code, voicing_factor, r_v, innov_energy,
       pitch_energy, mean_ener_code;
@@ -359,7 +411,7 @@
   WORD32 pitch_fr1;
   WORD32 pitch_max;
   WORD32 subfr_nb = 0;
-  static const WORD16 num_codebits_table[8] = {20, 28, 36, 44, 52, 64, 12, 16};
+  const WORD16 num_codebits_table[8] = {20, 28, 36, 44, 52, 64, 12, 16};
   FLOAT32 x[FAC_LENGTH] = {0}, xn2[2 * FAC_LENGTH + 16] = {0};
   WORD32 int_x[FAC_LENGTH] = {0};
   WORD32 TTT;
@@ -383,9 +435,16 @@
   WORD32 *ptr_pitch =
       &usac_data->pitch[k * usac_data->num_subfrm +
                         (((NUM_FRAMES * usac_data->num_subfrm) / 2) - 1)];
-  WORD32 err = 0;
   fac_length = len_subfr / 2;
 
+  WORD32 bfi = (usac_data->num_lost_lpd_frames[usac_data->present_chan] > 0) ? 1 : 0;
+  WORD32 i_offset =
+      (usac_data->str_tddec[usac_data->present_chan]->fscale * TMIN + (FSCALE_DENOM / 2)) /
+          FSCALE_DENOM -
+      TMIN;
+  const WORD32 pitch_max_val = TMAX + (6 * i_offset);
+  WORD16 code_t[LEN_SUBFR];
+
   if (st->mode_prev > 0) {
     for (i = 0; i < fac_length / 2; i++) {
       x[i] = st->fac_gain * pstr_td_frame_data->fac[k * FAC_LENGTH + 2 * i];
@@ -401,9 +460,8 @@
     preshift = 0;
     shiftp = ixheaacd_float2fix(x, int_x, fac_length);
 
-    err =
-        ixheaacd_acelp_mdct(int_x, int_xn2, &preshift, fac_length, ptr_scratch);
-    if (err == -1) return err;
+    ixheaacd_acelp_mdct(int_x, int_xn2, &preshift, fac_length, ptr_scratch);
+
     ixheaacd_fix2float(int_xn2, xn2 + fac_length, fac_length, &shiftp,
                        &preshift);
 
@@ -485,6 +543,15 @@
       pitch_lag_frac = index - (pitch_lag - pitch_lag_min) * 4;
     }
 
+    if (usac_data->ec_flag) {
+      if (bfi) {
+        if (usac_data->pitch_lag_old >= pitch_max_val) {
+          usac_data->pitch_lag_old = (pitch_max_val - 5);
+        }
+        pitch_lag = usac_data->pitch_lag_old;
+        pitch_lag_frac = usac_data->pitch_lag_frac_old;
+      }
+    }
     ixheaacd_cb_exc_calc(&xcitation_curr[subfr_idx], pitch_lag, pitch_lag_frac);
 
     mean_ener_code =
@@ -498,10 +565,22 @@
 
       ixheaacd_mem_cpy(code, &xcitation_curr[subfr_idx], LEN_SUBFR);
     }
-
-    ixheaacd_acelp_decode_pulses_per_track(
-        &(pstr_td_frame_data->icb_index[k * 4 + subfr_nb][0]),
-        num_codebits_table[core_mode], code);
+    if (usac_data->frame_ok == 1) {
+      ixheaacd_acelp_decode_pulses_per_track(
+          &(pstr_td_frame_data->icb_index[k * 4 + subfr_nb][0]), num_codebits_table[core_mode],
+          code);
+    } else {
+      if (usac_data->ec_flag) {
+        WORD32 idx;
+        if (bfi) {
+          for (idx = 0; idx < LEN_SUBFR; idx++) {
+            usac_data->seed_ace = ((((WORD32)usac_data->seed_ace * 31821) >> 1) + 13849);
+            code_t[idx] = (WORD16)((usac_data->seed_ace) >> 4);
+            code[idx] = ((FLOAT32)code_t[idx] / 512);
+          }
+        }
+      }
+    }
 
     tmp = 0.0;
     ixheaacd_preemphsis_tool_float(code, TILT_CODE, LEN_SUBFR, tmp);
@@ -510,9 +589,14 @@
     if (i >= 0) ixheaacd_acelp_pitch_sharpening(code, i);
 
     index = pstr_td_frame_data->gains[k * 4 + subfr_nb];
-
-    ixheaacd_acelp_decode_gains(index, code, &pitch_gain, &gain_code,
-                                mean_ener_code, &innov_energy);
+    if (usac_data->ec_flag) {
+      ixheaacd_acelp_decode_gains_with_ec(index, code, &pitch_gain, &gain_code, mean_ener_code,
+                                          &innov_energy, &usac_data->past_pitch_gain,
+                                          &usac_data->past_gain_code, bfi);
+    } else {
+      ixheaacd_acelp_decode_gains(index, code, &pitch_gain, &gain_code, mean_ener_code,
+                                  &innov_energy);
+    }
 
     pitch_energy = 0.0;
     for (i = 0; i < LEN_SUBFR; i++)
@@ -593,5 +677,9 @@
   ixheaacd_deemphsis_tool(st->exc_prev + 1 + fac_length, fac_length,
                           synth_signal[len_subfr - 1]);
 
-  return err;
+  if (usac_data->ec_flag) {
+    usac_data->pitch_lag_old = pitch_lag;
+    usac_data->pitch_lag_frac_old = pitch_lag_frac;
+  }
+  return;
 }
diff --git a/decoder/ixheaacd_acelp_info.h b/decoder/ixheaacd_acelp_info.h
index b6b45e4..d12977d 100644
--- a/decoder/ixheaacd_acelp_info.h
+++ b/decoder/ixheaacd_acelp_info.h
@@ -38,6 +38,10 @@
   WORD32 gains[NUM_SUBFR_SUPERFRAME];
   WORD32 mode_lpc[NUM_FRAMES];
   WORD32 lpc_first_approx_idx[110];
+  FLOAT32 lsp_coeff[5][ORDER];
+  FLOAT32 lsf_adaptive_mean_cand[ORDER];
+  FLOAT32 lsf_adaptive_mean[ORDER];
+  FLOAT32 lpc4_lsf[ORDER];
 } ia_td_frame_data_struct;
 
 typedef struct {
diff --git a/decoder/ixheaacd_acelp_mdct.c b/decoder/ixheaacd_acelp_mdct.c
index e6de7e6..d92ed25 100644
--- a/decoder/ixheaacd_acelp_mdct.c
+++ b/decoder/ixheaacd_acelp_mdct.c
@@ -41,6 +41,8 @@
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
 
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 
@@ -161,12 +163,11 @@
   }
 }
 
-WORD32 ixheaacd_acelp_mdct(WORD32 *ptr_in, WORD32 *ptr_out, WORD32 *preshift,
-                           WORD32 length, WORD32 *ptr_scratch) {
+VOID ixheaacd_acelp_mdct(WORD32 *ptr_in, WORD32 *ptr_out, WORD32 *preshift, WORD32 length,
+                         WORD32 *ptr_scratch) {
   WORD32 *ptr_data_r = ptr_scratch;
   WORD32 *ptr_data_i = ptr_scratch + 512;
   const WORD32 *ptr_pre_post_twid;
-  WORD32 err = 0;
 
   switch (length) {
     case 1024:
@@ -207,26 +208,22 @@
   ixheaacd_pre_twid(ptr_in, ptr_data_r, ptr_data_i, length / 2,
                     ptr_pre_post_twid);
 
-  err = ixheaacd_complex_fft(ptr_data_r, ptr_data_i, length / 2, -1, preshift);
-  if (err) return err;
+  ixheaacd_complex_fft(ptr_data_r, ptr_data_i, length / 2, -1, preshift);
   *preshift += 1;
 
   ixheaacd_post_twid(ptr_data_r, ptr_data_i, ptr_out, length / 2,
                      ptr_pre_post_twid);
   *preshift += 1;
-  return err;
+  return;
 }
 
-WORD32 ixheaacd_acelp_mdct_main(ia_usac_data_struct *usac_data, WORD32 *in,
-                                WORD32 *out, WORD32 l, WORD32 m,
-                                WORD32 *preshift) {
+VOID ixheaacd_acelp_mdct_main(ia_usac_data_struct *usac_data, WORD32 *in, WORD32 *out, WORD32 l,
+                              WORD32 m, WORD32 *preshift) {
   WORD32 i;
   WORD32 *ptr_scratch = &usac_data->scratch_buffer[0];
   WORD32 *output_buffer = &usac_data->x_ac_dec[0];
-  WORD32 err = 0;
 
-  err = ixheaacd_acelp_mdct(in, output_buffer, preshift, l + m, ptr_scratch);
-  if (err == -1) return err;
+  ixheaacd_acelp_mdct(in, output_buffer, preshift, l + m, ptr_scratch);
 
   for (i = 0; i < m / 2; i++) {
     out[l + m / 2 - 1 - i] = -output_buffer[m / 2 + l / 2 + i];
@@ -242,5 +239,5 @@
     out[l + m + i] = -output_buffer[l / 2 - 1 - i];
     out[2 * l + m - 1 - i] = -output_buffer[l / 2 - 1 - i];
   }
-  return err;
+  return;
 }
diff --git a/decoder/ixheaacd_acelp_tools.c b/decoder/ixheaacd_acelp_tools.c
index b3d752f..a7cf83e 100644
--- a/decoder/ixheaacd_acelp_tools.c
+++ b/decoder/ixheaacd_acelp_tools.c
@@ -26,7 +26,7 @@
 #include "ixheaacd_basic_ops32.h"
 #include "ixheaacd_basic_ops40.h"
 
-static const FLOAT32 ixheaacd_gamma_table[17] = {
+const FLOAT32 ixheaacd_gamma_table[17] = {
     1.0f,      0.92f,     0.8464f,   0.778688f, 0.716393f, 0.659082f,
     0.606355f, 0.557847f, 0.513219f, 0.472161f, 0.434389f, 0.399637f,
     0.367666f, 0.338253f, 0.311193f, 0.286298f, 0.263394f};
@@ -39,9 +39,6 @@
 VOID ixheaacd_preemphsis_tool(WORD32 *signal, WORD32 mu, WORD32 len,
                               WORD32 mem) {
   WORD32 i;
-  WORD32 temp;
-
-  temp = signal[len - 1];
   for (i = len - 1; i > 0; i--) {
     signal[i] -= (WORD32)ixheaacd_mul32_sh(mu, signal[i - 1], 16);
   }
@@ -52,8 +49,6 @@
 VOID ixheaacd_preemphsis_tool_float(FLOAT32 *signal, FLOAT32 mu, WORD32 len,
                                     FLOAT32 mem) {
   WORD32 i;
-  FLOAT32 temp;
-  temp = signal[len - 1];
   for (i = len - 1; i > 0; i--) {
     signal[i] = signal[i] - mu * signal[i - 1];
   }
diff --git a/decoder/ixheaacd_adts_crc_check.c b/decoder/ixheaacd_adts_crc_check.c
index b908332..5799d37 100644
--- a/decoder/ixheaacd_adts_crc_check.c
+++ b/decoder/ixheaacd_adts_crc_check.c
@@ -18,12 +18,20 @@
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
 #include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_memory_standards.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_defines.h"
+#include "ixheaacd_mps_aac_struct.h"
+
 #include "ixheaacd_sbr_common.h"
 #include "ixheaacd_bitbuffer.h"
 #include "ixheaacd_defines.h"
 #include "ixheaacd_aac_rom.h"
 
 #include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
 #include "ixheaacd_env_extr_part.h"
 #include "ixheaacd_sbr_rom.h"
 
@@ -34,6 +42,9 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
@@ -48,8 +59,12 @@
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
 
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_mps_dec.h"
 
 #include "ixheaacd_struct_def.h"
@@ -156,7 +171,7 @@
 
   for (reg = 0; reg < ptr_adts_crc_info->no_reg; reg++) {
     UWORD8 bits;
-    UWORD32 bits_remaining;
+    WORD32 bits_remaining;
 
     ptr_reg_data = &ptr_adts_crc_info->str_crc_reg_data[reg];
 
@@ -171,6 +186,9 @@
     }
 
     while (bits_remaining >= 8) {
+      if (ptr_reg_data->str_bit_buf.cnt_bits < 8) {
+        return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+      }
       bits = (UWORD8)ixheaacd_read_bits_buf(
           (ia_bit_buf_struct *)(&ptr_adts_crc_info->str_crc_reg_data[reg]
                                      .str_bit_buf),
@@ -179,6 +197,9 @@
       bits_remaining -= 8;
     }
 
+    if (ptr_reg_data->str_bit_buf.cnt_bits < bits_remaining) {
+      return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+    }
     bits = (UWORD8)ixheaacd_read_bits_buf(
         (ia_bit_buf_struct *)(&ptr_adts_crc_info->str_crc_reg_data[reg]
                                    .str_bit_buf),
@@ -202,7 +223,7 @@
   ptr_adts_crc_info->no_reg = 0;
 
   if (crc != ptr_adts_crc_info->file_value) {
-    return (IA_ENHAACPLUS_DEC_EXE_NONFATAL_ADTS_HDR_CRC_FAIL);
+    return (IA_XHEAAC_DEC_EXE_NONFATAL_ADTS_HDR_CRC_FAIL);
   }
 
   return (error_code);
diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c
index 3a17d1d..d586c54 100644
--- a/decoder/ixheaacd_api.c
+++ b/decoder/ixheaacd_api.c
@@ -20,9 +20,12 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <assert.h>
 #include "ixheaacd_sbr_common.h"
 #include "ixheaacd_type_def.h"
+#include "ixheaacd_memory_standards.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_constants.h"
 #include "ixheaacd_basic_ops32.h"
 #include "ixheaacd_basic_ops16.h"
@@ -45,7 +48,10 @@
 #include "ixheaacd_bitbuffer.h"
 #include "ixheaacd_adts.h"
 #include "ixheaacd_defines.h"
+#include "ixheaacd_cnst.h"
 #include "ixheaacd_aac_rom.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 
 #include "ixheaacd_sbr_scale.h"
 #include "ixheaacd_lpp_tran.h"
@@ -98,7 +104,6 @@
 #include "ixheaacd_config.h"
 
 #include "ixheaacd_struct.h"
-#include "ixheaacd_cnst.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_tns_usac.h"
 #include "ixheaacd_acelp_info.h"
@@ -107,7 +112,8 @@
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_create.h"
 #include "ixheaacd_function_selector.h"
-
+#include "ixheaacd_ld_mps_dec.h"
+#include "ixheaacd_mps_tables.h"
 #define MAX_TRACKS_PER_LAYER 50
 
 #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
@@ -119,22 +125,25 @@
 #define IXHEAACD_CCE_DEC_INFO_MEM_SIZE (610)
 #define IXHEAACD_CCE_DEC_INFO_MEM_SIZE_8 (IXHEAACD_CCE_DEC_INFO_MEM_SIZE + 8)
 
-IA_ERRORCODE ixheaacd_dec_mem_api(
-    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 i_cmd,
-    WORD32 i_idx, VOID *pv_value) {
+#define LD_OBJ -2
+
+#define MIN(x, y) ((x) > (y) ? (y) : (x))
+
+IA_ERRORCODE ixheaacd_dec_mem_api(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
+                                  WORD32 i_cmd, WORD32 i_idx, VOID *pv_value) {
   pUWORD32 pui_value = pv_value;
 
   if (i_idx < 0 || i_idx >= IA_ENHAACPDEC_NUM_MEMTABS) {
-    return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_MEMTAB_INDEX;
+    return IA_XHEAAC_DEC_API_FATAL_INVALID_MEMTAB_INDEX;
   }
 
   if (i_cmd == IA_API_CMD_SET_MEM_PTR) {
     if (pv_value == 0) {
-      return (IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALLOC);
+      return (IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC);
     }
     if (((SIZE_T)pv_value %
          p_obj_exhaacplus_dec->p_mem_info_aac[i_idx].ui_alignment) != 0) {
-      return (IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALIGN);
+      return (IA_XHEAAC_DEC_API_FATAL_MEM_ALIGN);
     }
     p_obj_exhaacplus_dec->pp_mem_aac[i_idx] = pv_value;
     memset(p_obj_exhaacplus_dec->pp_mem_aac[i_idx], 0,
@@ -149,7 +158,8 @@
                (sizeof(ia_dec_data_struct) +
                 sizeof(ia_audio_specific_config_struct) + (8300));
       p_obj_exhaacplus_dec->p_state_aac = pv_value;
-
+      memset(p_obj_exhaacplus_dec->p_state_aac, 0,
+             sizeof(ia_aac_dec_state_struct));
       p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data = p_temp;
       p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config =
           p_temp + sizeof(ia_dec_data_struct);
@@ -183,7 +193,7 @@
     ia_aac_dec_state_struct *p_state_enhaacplus_dec,
     struct ia_bit_buf_struct *it_bit_buff) {
   p_state_enhaacplus_dec->i_bytes_consumed =
-      (it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base);
+      (WORD32)(it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base);
   if ((p_state_enhaacplus_dec->i_bytes_consumed == 0) &&
       (it_bit_buff->cnt_bits == 0)) {
     p_state_enhaacplus_dec->i_bytes_consumed =
@@ -192,10 +202,29 @@
   if (it_bit_buff->cnt_bits < 0) {
     p_state_enhaacplus_dec->i_bytes_consumed = 0;
     p_state_enhaacplus_dec->ui_out_bytes = 0;
+    p_state_enhaacplus_dec->ui_mps_out_bytes = 0;
     p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
   }
 }
 
+static VOID copy_qmf_to_ldmps(ia_mps_dec_state_struct *mps_dec_handle,
+                              VOID *sbr_persistent_mem_v) {
+  ia_sbr_pers_struct *sbr_persistent_mem =
+      (ia_sbr_pers_struct *)sbr_persistent_mem_v;
+  memcpy(&mps_dec_handle->str_mps_qmf_bank,
+         &sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[0]
+              ->str_sbr_dec.str_codec_qmf_bank,
+         sizeof(ia_sbr_qmf_filter_bank_struct));
+
+  mps_dec_handle->sbr_tables_ptr =
+      sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables;
+  mps_dec_handle->qmf_dec_tables_ptr =
+      sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr;
+  mps_dec_handle->str_sbr_scale_fact =
+      &sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[0]
+           ->str_sbr_dec.str_sbr_scale_fact;
+}
+
 WORD32 ixheaacd_readifadts(ia_aac_dec_state_struct *p_state_enhaacplus_dec,
                            struct ia_bit_buf_struct *it_bit_buff,
                            ia_adts_header_struct *adts) {
@@ -203,7 +232,7 @@
 
   if ((error = ixheaacd_find_syncword(adts, it_bit_buff)) != 0) {
     ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_ADTS_SYNC_LOST;
+    return IA_XHEAAC_DEC_EXE_NONFATAL_ADTS_SYNC_LOST;
   }
   if ((error = ixheaacd_check_if_adts(
            adts, it_bit_buff,
@@ -213,10 +242,11 @@
     if (it_bit_buff->cnt_bits < 0) {
       p_state_enhaacplus_dec->i_bytes_consumed = 0;
       p_state_enhaacplus_dec->ui_out_bytes = 0;
-      error = IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+      p_state_enhaacplus_dec->ui_mps_out_bytes = 0;
+      error = IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
       return error;
     }
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_ADTS_SYNC_LOST;
+    return IA_XHEAAC_DEC_EXE_NONFATAL_ADTS_SYNC_LOST;
   }
   p_state_enhaacplus_dec->b_n_raw_data_blk =
       (WORD8)(adts->no_raw_data_blocks + 1);
@@ -277,11 +307,41 @@
 VOID ixheaacd_allocate_sbr_scr(ia_sbr_scr_struct *sbr_scratch_struct,
                                VOID *base_scratch_ptr, VOID *output_ptr,
                                WORD total_elements, WORD ch_fac,
-                               WORD32 audio_object_type) {
+                               WORD32 audio_object_type, WORD32 total_channels,
+                               WORD8 *p_qshift_arr, UWORD8 slot_pos,
+                               UWORD8 num_ch) {
   WORD32 temp = 0;
+  WORD32 j, i;
   sbr_scratch_struct->ptr_work_buf_core = base_scratch_ptr;
   sbr_scratch_struct->ptr_work_buf = (WORD8 *)base_scratch_ptr + (18 * 1024);
 
+  if (p_qshift_arr != NULL && *p_qshift_arr != LD_OBJ) {
+    WORD32 *tmp_buf = (WORD32 *)output_ptr;
+
+    for (j = 1; j < num_ch; j++) {
+      if ((*p_qshift_arr + j) == 0)
+        *(p_qshift_arr + j) = *(p_qshift_arr + j - 1);
+    }
+
+    if (total_channels > 2) {
+      for (j = 0; j < num_ch; j++) {
+        for (i = 0; i < 1024; i++) {
+          *((WORD16 *)tmp_buf + slot_pos + total_channels * i + j) =
+              ixheaacd_round16(ixheaacd_shl32_sat(
+                  *(tmp_buf + slot_pos + total_channels * i + j),
+                  *(p_qshift_arr + j)));
+        }
+      }
+    } else {
+      for (j = 0; j < num_ch; j++) {
+        for (i = 0; i < 1024; i++) {
+          *((WORD16 *)tmp_buf + total_channels * i + j) =
+              ixheaacd_round16(ixheaacd_shl32_sat(
+                  *(tmp_buf + total_channels * i + j), *(p_qshift_arr + j)));
+        }
+      }
+    }
+  }
   if (total_elements > 1) {
     sbr_scratch_struct->extra_scr_1k[0] =
         (WORD8 *)base_scratch_ptr + (18 * 1024);
@@ -312,21 +372,31 @@
   }
 }
 
-IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd,
+VOID ixheaacd_get_lib_id_strings(pVOID pv_output) {
+  ia_lib_info_struct *pstr_lib_info = (ia_lib_info_struct *)pv_output;
+
+  pstr_lib_info->p_lib_name = (WORD8 *)LIBNAME;
+  pstr_lib_info->p_version_num = (WORD8 *)xHE_AAC_DEC_ITTIAM_VER;
+
+  return;
+}
+
+IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_xheaac_dec_obj, WORD32 i_cmd,
                               WORD32 i_idx, pVOID pv_value) {
-  ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec = p_ia_enhaacplus_dec_obj;
+  ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec = p_ia_xheaac_dec_obj;
   pUWORD32 pui_value = pv_value;
   pWORD32 pui_value_signed = pv_value;
   pWORD8 pb_value = pv_value;
   pVOID *pp_value = (pVOID *)pv_value;
+  float *pf_value = pv_value;
 
   if ((i_cmd != IA_API_CMD_GET_API_SIZE) &&
       (i_cmd != IA_API_CMD_GET_LIB_ID_STRINGS)) {
-    if (p_ia_enhaacplus_dec_obj == 0) {
-      return (IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALLOC);
+    if (p_ia_xheaac_dec_obj == 0) {
+      return (IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC);
     }
-    if (((SIZE_T)p_ia_enhaacplus_dec_obj & 3) != 0) {
-      return (IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALIGN);
+    if (((SIZE_T)p_ia_xheaac_dec_obj & 3) != 0) {
+      return (IA_XHEAAC_DEC_API_FATAL_MEM_ALIGN);
     }
   }
 
@@ -335,7 +405,7 @@
     case IA_API_CMD_GET_MEM_INFO_ALIGNMENT:
     case IA_API_CMD_GET_MEM_INFO_TYPE:
     case IA_API_CMD_SET_MEM_PTR: {
-      return ixheaacd_dec_mem_api(p_ia_enhaacplus_dec_obj, i_cmd, i_idx,
+      return ixheaacd_dec_mem_api(p_ia_xheaac_dec_obj, i_cmd, i_idx,
                                   pv_value);
     }
 
@@ -343,7 +413,7 @@
     case IA_API_CMD_GET_TABLE_INFO_ALIGNMENT:
     case IA_API_CMD_SET_TABLE_PTR:
     case IA_API_CMD_GET_TABLE_PTR: {
-      return ixheaacd_dec_table_api(p_ia_enhaacplus_dec_obj, i_cmd, i_idx,
+      return ixheaacd_dec_table_api(p_ia_xheaac_dec_obj, i_cmd, i_idx,
                                     pv_value);
     }
   };
@@ -358,7 +428,7 @@
       else if (i_idx == IA_CMD_TYPE_LIB_VERSION)
         i1_ver = (WORD8 *)xHE_AAC_DEC_ITTIAM_VER;
       else
-        return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_LIB_ID_STRINGS_IDX;
+        return IA_XHEAAC_DEC_API_FATAL_INVALID_LIB_ID_STRINGS_IDX;
 
       ver_char = *i1_ver++;
 
@@ -392,27 +462,34 @@
           p_obj_exhaacplus_dec->aac_config.ui_disable_sync = 0;
           p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample = 1;
           p_obj_exhaacplus_dec->aac_config.ui_samp_freq = 0;
+          p_obj_exhaacplus_dec->aac_config.ui_frame_size = 0;
+
+          p_obj_exhaacplus_dec->aac_config.ui_n_channels = 2;
+          p_obj_exhaacplus_dec->aac_config.i_channel_mask = 3;
           p_obj_exhaacplus_dec->aac_config.ui_channel_mode = 3;
           p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 0;
           p_obj_exhaacplus_dec->aac_config.ui_effect_type = 0;
           p_obj_exhaacplus_dec->aac_config.ui_target_loudness = -24;
           p_obj_exhaacplus_dec->aac_config.ui_loud_norm_flag = 0;
+          p_obj_exhaacplus_dec->aac_config.ui_hq_esbr = 0;
+          p_obj_exhaacplus_dec->aac_config.ui_enh_sbr = 1;
+          p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps = 0;
           p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr = 0;
           p_obj_exhaacplus_dec->aac_config.loas_present = 0;
           p_obj_exhaacplus_dec->aac_config.ld_decoder = 0;
-          p_obj_exhaacplus_dec->aac_config.ui_drc_enable = 1;
           p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
           p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
           p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 0;
           p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0;
+          p_obj_exhaacplus_dec->aac_config.output_level = -1;
 
           p_obj_exhaacplus_dec->aac_config.ui_max_channels = 6;
 
           p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 0;
           p_obj_exhaacplus_dec->aac_config.downmix = 0;
-          p_obj_exhaacplus_dec->aac_config.ui_n_channels = 2;
-          p_obj_exhaacplus_dec->aac_config.i_channel_mask = 3;
+
+          p_obj_exhaacplus_dec->aac_config.ui_err_conceal = 0;
 
           {
             ia_aac_dec_tables_struct *pstr_aac_tables =
@@ -444,6 +521,13 @@
             err_code = IA_FATAL_ERROR;
           } else {
             err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
+            if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && err_code) {
+              if (err_code & IA_FATAL_ERROR) {
+                err_code = IA_XHEAAC_DEC_INIT_FATAL_EC_INIT_FAIL;
+              } else {
+                err_code = IA_XHEAAC_DEC_INIT_NONFATAL_EC_INIT_FAIL;
+              }
+            }
           }
           if (err_code != 0) {
             if (err_code < 0)
@@ -474,228 +558,233 @@
         }
 
         default: {
-          return IA_ENHAACPLUS_DEC_API_NONFATAL_CMD_TYPE_NOT_SUPPORTED;
+          return IA_XHEAAC_DEC_API_NONFATAL_CMD_TYPE_NOT_SUPPORTED;
         }
       };
       break;
     }
     case IA_API_CMD_SET_CONFIG_PARAM: {
       switch (i_idx) {
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_SAMP_FREQ: {
           if ((*pui_value < 8000) || (*pui_value > 96000)) {
-            return (IA_ENHAACPLUS_DEC_CONFIG_FATAL_INVALID_SAMPLE_RATE);
+            return (IA_XHEAAC_DEC_CONFIG_FATAL_INVALID_SAMPLE_RATE);
           }
           p_obj_exhaacplus_dec->aac_config.ui_samp_freq = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_FRAMELENGTH_FLAG: {
+          if ((*pui_value != 1) && (*pui_value != 0)) {
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_FRAMELENGTHFLAG);
+          }
+          p_obj_exhaacplus_dec->aac_config.ui_frame_size = *pui_value;
+          break;
+        }
+        case IA_XHEAAC_DEC_CONFIG_PARAM_PCM_WDSZ: {
           if ((*pui_value != 16) && (*pui_value != 24)) {
             p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = 16;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_PCM_WDSZ);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_PCM_WDSZ);
           }
           p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX: {
           if ((*pui_value != 1) && (*pui_value != 0)) {
             p_obj_exhaacplus_dec->aac_config.flag_downmix = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX);
           }
           p_obj_exhaacplus_dec->aac_config.flag_downmix = *pui_value;
           p_obj_exhaacplus_dec->aac_config.downmix = *pui_value;
           break;
         }
 
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_TOSTEREO: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_TOSTEREO: {
           if ((*pui_value != 1) && (*pui_value != 0)) {
             p_obj_exhaacplus_dec->aac_config.flag_to_stereo = 1;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_TOSTEREO);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_TOSTEREO);
           }
           p_obj_exhaacplus_dec->aac_config.flag_to_stereo = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DSAMPLE: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DSAMPLE: {
           if ((*pui_value != 1) && (*pui_value != 0)) {
             p_obj_exhaacplus_dec->aac_config.down_sample_flag = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DSAMPLE);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DSAMPLE);
           }
           p_obj_exhaacplus_dec->aac_config.down_sample_flag = *pui_value;
           break;
         }
 
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_FRAMEOK: {
-          if ((*pui_value != 1) && (*pui_value != 0)) {
-            p_obj_exhaacplus_dec->aac_config.frame_status = 1;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_FRAMEOK);
-          }
-          p_obj_exhaacplus_dec->aac_config.frame_status = *pui_value;
-          break;
-        }
-
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISMP4: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_MP4FLAG: {
           if ((*pui_value != 1) && (*pui_value != 0)) {
             p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_MP4FLAG);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MP4FLAG);
           }
           p_obj_exhaacplus_dec->aac_config.ui_mp4_flag = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISLOAS: {
-          if ((*pui_value != 1) && (*pui_value != 0)) {
-            p_obj_exhaacplus_dec->aac_config.loas_present = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_LOASFLAG);
-          }
-          p_obj_exhaacplus_dec->aac_config.loas_present = *pui_value;
-          break;
-        }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_ENABLE: {
-          if ((*pui_value != 1) && (*pui_value != 0)) {
-            p_obj_exhaacplus_dec->aac_config.ui_drc_enable = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRCFLAG);
-          }
-          p_obj_exhaacplus_dec->aac_config.ui_drc_enable = *pui_value;
-          break;
-        }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_CUT: {
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
-          if (*pui_value > 127) {
+          if (*pf_value > 1) {
             p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_CUT);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_CUT);
           }
           p_obj_exhaacplus_dec->aac_config.ui_drc_cut =
-              (WORD32)((*pui_value / 127.0) * 100);
+              (WORD32)((*pf_value) * 100);
           break;
         }
 
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_BOOST: {
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
-          if (*pui_value > 127) {
+          if (*pf_value > 1) {
             p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_BOOST);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_BOOST);
           }
           p_obj_exhaacplus_dec->aac_config.ui_drc_boost =
-              (WORD32)((*pui_value / 127.0) * 100);
+              (WORD32)((*pf_value) * 100);
           break;
         }
 
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL: {
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
+          p_obj_exhaacplus_dec->aac_config.i_loud_ref_level = *pui_value_signed;
           if (*pui_value > 127) {
             p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_TARGET);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_TARGET);
           }
           p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_HEAVY_COMP: {
           p_obj_exhaacplus_dec->aac_config.ui_drc_set = 1;
           if ((*pui_value != 1) && (*pui_value != 0)) {
             p_obj_exhaacplus_dec->aac_config.ui_drc_heavy_comp = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRCFLAG);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRCFLAG);
           }
           p_obj_exhaacplus_dec->aac_config.ui_drc_heavy_comp = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DISABLE_SYNC: {
+        case IA_XHEAAC_DEC_CONFIG_DISABLE_SYNC: {
           if ((*pui_value != 1) && (*pui_value != 0)) {
             p_obj_exhaacplus_dec->aac_config.ui_disable_sync = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_SYNCFLAG);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_SYNCFLAG);
           }
           p_obj_exhaacplus_dec->aac_config.ui_disable_sync = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE: {
           if ((*pui_value != 1) && (*pui_value != 0)) {
             p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_SBRUPFLAG);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_SBRUPFLAG);
           }
           p_obj_exhaacplus_dec->aac_config.ui_auto_sbr_upsample = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_MAX_CHANNEL: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_MAX_CHANNEL: {
           if (*pui_value > 8) {
             p_obj_exhaacplus_dec->aac_config.ui_max_channels = 8;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL);
           }
           if (*pui_value < 2) {
             p_obj_exhaacplus_dec->aac_config.ui_max_channels = 2;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL);
           }
           p_obj_exhaacplus_dec->aac_config.ui_max_channels = *pui_value;
           break;
         }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_FRAMESIZE: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_FRAMESIZE: {
           if (*pui_value == 1) {
             p_obj_exhaacplus_dec->aac_config.framesize_480 = 1;
           } else if (*pui_value == 0) {
             p_obj_exhaacplus_dec->aac_config.framesize_480 = 0;
           } else {
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_FRAMSZ);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_FRAMSZ);
           }
           break;
         }
 
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_LD_TESTING: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_LD_TESTING: {
           if (*pui_value == 1) {
             p_obj_exhaacplus_dec->aac_config.ld_decoder = 1;
           } else if (*pui_value == 0) {
             p_obj_exhaacplus_dec->aac_config.ld_decoder = 0;
           } else {
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_LD_CONFIG);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_LD_CONFIG);
           }
           break;
         }
 
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_ELD_SBR_PRESENT: {
-          if (*pui_value == 1) {
-            p_obj_exhaacplus_dec->aac_config.eld_sbr_present = 1;
-          } else if (*pui_value == 0) {
-            p_obj_exhaacplus_dec->aac_config.eld_sbr_present = 0;
-          } else {
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_ELDSBR);
-          }
-          break;
-        }
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_COUP_CHANNEL: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_COUP_CHANNEL: {
           if (*pui_value > 16) {
             p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 1;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_COUP_CHANNEL);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_COUP_CHANNEL);
           }
           p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = *pui_value;
           break;
         }
 
-        case IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX_STEREO: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX_STEREO: {
           if ((*pui_value != 1) && (*pui_value != 0)) {
             p_obj_exhaacplus_dec->aac_config.downmix = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX_STEREO);
           }
           p_obj_exhaacplus_dec->aac_config.downmix = *pui_value;
           break;
         }
 
-        case IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE: {
           if (((*pui_value_signed) > 8) || ((*pui_value_signed) < -1)) {
             p_obj_exhaacplus_dec->aac_config.ui_effect_type = -1;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_EFFECT_TYPE);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_EFFECT_TYPE);
           }
           p_obj_exhaacplus_dec->aac_config.ui_effect_type = *pui_value_signed;
           break;
         }
-        case IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS: {
+        case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS: {
           if (*pui_value_signed >= 0) {
             p_obj_exhaacplus_dec->aac_config.ui_loud_norm_flag = 1;
           }
           *pui_value_signed = -(*pui_value_signed >> 2);
           if (((*pui_value_signed) > 0) || ((*pui_value_signed) < -63)) {
             p_obj_exhaacplus_dec->aac_config.ui_target_loudness = 0;
-            return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_TARGET_LOUDNESS);
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_TARGET_LOUDNESS);
           }
           p_obj_exhaacplus_dec->aac_config.ui_target_loudness =
               *pui_value_signed;
           break;
         }
-        default: { return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_CONFIG_PARAM; }
+        case IA_XHEAAC_DEC_CONFIG_PARAM_HQ_ESBR: {
+          if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
+            p_obj_exhaacplus_dec->aac_config.ui_hq_esbr = 0;
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_HQ_FLAG);
+          }
+          p_obj_exhaacplus_dec->aac_config.ui_hq_esbr = *pui_value_signed;
+          break;
+        }
+        case IA_XHEAAC_DEC_CONFIG_PARAM_PS_ENABLE: {
+          if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
+            p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps = 0;
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_PS_FLAG);
+          }
+          p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps = *pui_value_signed;
+          break;
+        }
+        case IA_XHEAAC_DEC_CONFIG_PARAM_PEAK_LIMITER: {
+          if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
+            p_obj_exhaacplus_dec->aac_config.peak_limiter_off = 0;
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_PEAK_LIM_FLAG_TYPE);
+          }
+          p_obj_exhaacplus_dec->aac_config.peak_limiter_off = *pui_value_signed;
+          break;
+        }
+        case IA_XHEAAC_DEC_CONFIG_ERROR_CONCEALMENT: {
+          if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) {
+            p_obj_exhaacplus_dec->aac_config.ui_err_conceal = 0;
+            return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ERR_CONCEAL_FLAG_TYPE);
+          }
+          p_obj_exhaacplus_dec->aac_config.ui_err_conceal = *pui_value_signed;
+          break;
+        }
+        default: { return IA_XHEAAC_DEC_API_FATAL_INVALID_CONFIG_PARAM; }
       }
       break;
     }
@@ -704,7 +793,25 @@
       UWORD32 i;
       WORD32 *pvalue =
           (WORD32 *)(&p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz);
-
+      if (IA_XHEAAC_DEC_CONFIG_PARAM_NUM_CHANNELS == i_idx) {
+        if (p_obj_exhaacplus_dec->p_state_aac != NULL &&
+            p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle
+                    .heaac_mps_present == 1) {
+          *pui_value = p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle
+                           .num_output_channels_at;
+        } else {
+          *pui_value = pvalue[i_idx];
+        }
+      } else if (IA_XHEAAC_DEC_CONFIG_PARAM_CHANNEL_MASK == i_idx) {
+        if (p_obj_exhaacplus_dec->p_state_aac != NULL &&
+            p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle
+                    .heaac_mps_present == 1) {
+          *pui_value = p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle
+                           .bs_config.ui_channel_mask;
+        } else {
+          *pui_value = pvalue[i_idx];
+        }
+      } else
       if (i_idx >= 0 && i_idx <= 8) {
         *pui_value = pvalue[i_idx];
       } else if (IA_ENHAACPLUS_DEC_CONFIG_GET_NUM_PRE_ROLL_FRAMES == i_idx) {
@@ -724,7 +831,7 @@
       } else if (IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR == i_idx) {
         ia_audio_specific_config_struct *ptr_audio_specific_config =
             ((ia_audio_specific_config_struct *)
-                 p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
+                p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
 
         for (i = 0; i < ptr_audio_specific_config->str_usac_config
                             .str_usac_dec_config.num_config_extensions;
@@ -762,6 +869,10 @@
                   .usac_ext_ele_payload_len[i];
         }
 
+      } else if (IA_ENHAACPLUS_DEC_DRC_IS_CONFIG_CHANGED == i_idx) {
+        *pui_value = p_obj_exhaacplus_dec->p_state_aac->drc_config_changed;
+      } else if (IA_ENHAACPLUS_DEC_DRC_APPLY_CROSSFADE == i_idx) {
+        *pui_value = p_obj_exhaacplus_dec->p_state_aac->apply_crossfade;
       } else if (IA_ENHAACPLUS_DEC_CONFIG_NUM_ELE == i_idx) {
         UWORD32 *ptri_value = (UWORD32 *)pv_value;
         ia_audio_specific_config_struct *ptr_audio_specific_config =
@@ -802,10 +913,21 @@
         *pp_value = ptr_audio_specific_config->str_usac_config
                         .str_usac_dec_config.usac_ext_gain_payload_buf +
                     payload_buffer_offeset;
-      }
-
-      else {
-        return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_CONFIG_PARAM;
+      } else if (IA_XHEAAC_DEC_CONFIG_PARAM_AOT == i_idx) {
+        if (p_obj_exhaacplus_dec->p_state_aac != NULL) {
+          if (p_obj_exhaacplus_dec->aac_config.ui_mp4_flag == 1) {
+            ia_audio_specific_config_struct *ptr_audio_specific_config =
+                ((ia_audio_specific_config_struct *)
+                    p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config);
+            *pui_value = ptr_audio_specific_config->audio_object_type;
+          } else {
+            *pui_value = p_obj_exhaacplus_dec->p_state_aac->audio_object_type;
+          }
+        } else {
+          *pui_value = AOT_AAC_LC;
+        }
+      } else {
+        return IA_XHEAAC_DEC_API_FATAL_INVALID_CONFIG_PARAM;
       }
       break;
     }
@@ -815,8 +937,12 @@
                    (IA_ENHAACPDEC_NUM_MEMTABS);
       break;
     }
+    case IA_API_CMD_GET_LOUDNESS_VAL: {
+      *pui_value = p_obj_exhaacplus_dec->aac_config.output_level;
+      break;
+    }
     case IA_API_CMD_SET_MEMTABS_PTR: {
-      if (pv_value == NULL) return IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALLOC;
+      if (pv_value == NULL) return IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC;
       memset(pv_value, 0, (sizeof(ia_mem_info_struct) + sizeof(pVOID *)) *
                               (IA_ENHAACPDEC_NUM_MEMTABS));
 
@@ -833,7 +959,7 @@
     }
 
     case IA_API_CMD_GET_N_TABLES: {
-      *pui_value = NUM_AAC_TABLES;
+      *pui_value = NUM_AAC_TABLES + NUM_MPS_TABLES;
       break;
     }
     case IA_API_CMD_EXECUTE: {
@@ -844,11 +970,15 @@
               p_obj_exhaacplus_dec->p_state_aac->fatal_err_present) {
             err_code = IA_FATAL_ERROR;
           } else {
+            memset(p_obj_exhaacplus_dec->p_state_aac->qshift_adj, 0,
+                   sizeof(p_obj_exhaacplus_dec->p_state_aac->qshift_adj));
+            p_obj_exhaacplus_dec->p_state_aac->qshift_cnt = 0;
             err_code = ixheaacd_dec_execute(p_obj_exhaacplus_dec);
           }
           if (err_code != IA_NO_ERROR) {
-            if (err_code < 0)
+            if (err_code < 0) {
               p_obj_exhaacplus_dec->p_state_aac->fatal_err_present = 1;
+            }
             p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
                 p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
           }
@@ -864,7 +994,7 @@
 
           break;
         }
-        default: { return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_EXECUTE_TYPE; }
+        default: { return IA_XHEAAC_DEC_API_FATAL_INVALID_EXECUTE_TYPE; }
       };
       break;
     }
@@ -877,6 +1007,11 @@
       break;
     }
     case IA_API_CMD_GET_OUTPUT_BYTES: {
+      if (1 == i_idx) {
+        *pui_value = p_obj_exhaacplus_dec->p_state_aac->ui_mps_out_bytes;
+      } else {
+        *pui_value = p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes;
+      }
       if (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_USAC) {
         ia_audio_specific_config_struct *ptr_audio_specific_config =
             ((ia_audio_specific_config_struct *)
@@ -892,8 +1027,6 @@
         if (preroll_counter > (MAX_AUDIO_PREROLLS + 1)) return IA_FATAL_ERROR;
         ptr_audio_specific_config->str_usac_config.str_usac_dec_config
             .preroll_counter = preroll_counter;
-      } else {
-        *pui_value = p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes;
       }
       break;
     }
@@ -901,13 +1034,13 @@
       p_obj_exhaacplus_dec->p_state_aac->ui_input_over = 1;
       break;
     }
-    default: { return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_CMD; }
+    default: { return IA_XHEAAC_DEC_API_FATAL_INVALID_CMD; }
   };
   return IA_NO_ERROR;
 }
 
-IA_ERRORCODE ixheaacd_decoder_2_ga_hdr(
-    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
+IA_ERRORCODE ixheaacd_decoder_2_ga_hdr(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
+  IA_ERRORCODE err_code = IA_NO_ERROR;
   if (p_obj_exhaacplus_dec->aac_config.ui_flush_cmd == 0) {
     p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = 16;
     p_obj_exhaacplus_dec->aac_config.flag_downmix = 0;
@@ -925,8 +1058,6 @@
     p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 2;
     p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr = 0;
     p_obj_exhaacplus_dec->aac_config.loas_present = 0;
-
-    p_obj_exhaacplus_dec->aac_config.ui_drc_enable = 1;
     p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
     p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
     p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
@@ -956,15 +1087,24 @@
     p_obj_exhaacplus_dec->aac_config.ui_qmf_bands = 64;
     p_obj_exhaacplus_dec->p_state_aac->ui_init_done = 0;
 
-    return ixheaacd_dec_init(p_obj_exhaacplus_dec);
+    err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
   } else {
     p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0;
-    return ixheaacd_dec_init(p_obj_exhaacplus_dec);
+    err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
+  }
+  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && err_code) {
+    if (err_code & IA_FATAL_ERROR) {
+      return IA_XHEAAC_DEC_INIT_FATAL_EC_INIT_FAIL;
+    } else {
+      return IA_XHEAAC_DEC_INIT_NONFATAL_EC_INIT_FAIL;
+    }
+  } else {
+    return err_code;
   }
 }
 
-IA_ERRORCODE ixheaacd_decoder_flush_api(
-    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
+IA_ERRORCODE ixheaacd_decoder_flush_api(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
+  IA_ERRORCODE err_code = IA_NO_ERROR;
   UWORD8 *header_temp_ptr;
   WORD32 header_length;
   if (p_obj_exhaacplus_dec->aac_config.ui_flush_cmd == 0) {
@@ -1006,8 +1146,6 @@
     p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 2;
     p_obj_exhaacplus_dec->aac_config.ui_pce_found_in_hdr = 0;
     p_obj_exhaacplus_dec->aac_config.loas_present = 0;
-
-    p_obj_exhaacplus_dec->aac_config.ui_drc_enable = 1;
     p_obj_exhaacplus_dec->aac_config.ui_drc_boost = 0;
     p_obj_exhaacplus_dec->aac_config.ui_drc_cut = 0;
     p_obj_exhaacplus_dec->aac_config.ui_drc_target_level = 108;
@@ -1018,6 +1156,7 @@
 
     p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 0;
     p_obj_exhaacplus_dec->aac_config.downmix = 0;
+    p_obj_exhaacplus_dec->p_state_aac->peak_lim_init = 0;
 
     {
       ia_aac_dec_tables_struct *pstr_aac_tables =
@@ -1039,11 +1178,19 @@
     p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes = header_length;
     p_obj_exhaacplus_dec->p_state_aac->header_length = header_length;
 
-    return ixheaacd_dec_init(p_obj_exhaacplus_dec);
-
+    err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
   } else {
     p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0;
-    return ixheaacd_dec_init(p_obj_exhaacplus_dec);
+    err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec);
+  }
+  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && err_code) {
+    if (err_code & IA_FATAL_ERROR) {
+      return IA_XHEAAC_DEC_INIT_FATAL_EC_INIT_FAIL;
+    } else {
+      return IA_XHEAAC_DEC_INIT_NONFATAL_EC_INIT_FAIL;
+    }
+  } else {
+    return err_code;
   }
 }
 
@@ -1058,66 +1205,63 @@
 
   size_buffers += (ltp_buffer_size * num_channel * sizeof(WORD16));
 
+  size_buffers += num_channel * sizeof(ia_aac_dec_channel_info);
+
   if (num_channel > 2) {
     max_channels = MAX_BS_ELEMENT;
   } else {
     max_channels = 2;
   }
   size_buffers +=
-      (max_channels)*2 * ALIGN_SIZE64(sizeof(ia_aac_dec_sbr_bitstream_struct));
+      (max_channels) * 2 * ALIGN_SIZE64(sizeof(ia_aac_dec_sbr_bitstream_struct));
 
   size_buffers += ALIGN_SIZE64(MAXSBRBYTES) * num_channel * sizeof(WORD8);
 
-  size_buffers += num_channel *
+  size_buffers += ALIGN_SIZE64(MAXSBRBYTES) * num_channel * sizeof(WORD8);
+
+  size_buffers += 2 * num_channel *
                   (QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) *
                   sizeof(WORD16);
 
-  size_buffers += num_channel *
+  size_buffers += 2 * num_channel *
                   (QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) *
                   sizeof(WORD32);
 
-  size_buffers += num_channel *
+  size_buffers += 2 * num_channel *
                   (QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) *
                   sizeof(WORD16);
 
-  size_buffers += num_channel *
+  size_buffers += 2 * num_channel *
                   (QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) *
                   sizeof(WORD32);
 
-  if (num_channel <= 2) {
-    size_buffers +=
-        num_channel * 2 * MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32);
-  } else {
-    size_buffers +=
-        num_channel * MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32);
-  }
-
   size_buffers +=
-      LPC_ORDER * num_channel * NO_ANALYSIS_CHANNELS * sizeof(WORD32);
+      num_channel * 2 * MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32);
 
-  if (num_channel <= 2) {
-    size_buffers +=
-        LPC_ORDER * num_channel * NO_ANALYSIS_CHANNELS * sizeof(WORD32);
-  }
+  size_buffers +=
+      2 * LPC_ORDER * num_channel * NO_ANALYSIS_CHANNELS * sizeof(WORD32);
 
-  size_buffers += num_channel * 3 * MAX_FREQ_COEFFS * sizeof(WORD16);
+  size_buffers += LPC_ORDER * 2 * sizeof(WORD32 *);
+
+  size_buffers +=
+      2 * LPC_ORDER * num_channel * NO_ANALYSIS_CHANNELS * sizeof(WORD32);
+
+  size_buffers += num_channel * 3 * 2 * MAX_FREQ_COEFFS * sizeof(WORD16);
 
   temp = sizeof(ia_freq_band_data_struct) +
          sizeof(ia_sbr_prev_frame_data_struct) + sizeof(ia_sbr_channel_struct) +
          sizeof(ia_sbr_header_data_struct);
-  size_buffers += num_channel * ALIGN_SIZE64(temp);
+  size_buffers += 2 * num_channel * ALIGN_SIZE64(temp);
 
   size_buffers += MAX_BS_ELEMENT * sizeof(ixheaac_drc_bs_data_struct *);
 
-  if (num_channel <= 2) {
-    size_buffers += sizeof(ia_ps_dec_struct);
-  }
+  size_buffers += num_channel * sizeof(ia_ps_dec_struct);
 
   {
     WORD32 temp_size = 0;
     size_buffers +=
-        MAXNRSBRCHANNELS * (sizeof(ia_sbr_frame_info_data_struct) +
-                            MAX_FREQ_COEFFS * sizeof(WORD32) * 2 + 8);
+    (num_channel * (sizeof(ia_sbr_frame_info_data_struct) +
+                            MAX_FREQ_COEFFS * sizeof(WORD32) * 2 + 8) * 2);
     temp_size += sizeof(ia_pvc_data_struct);
     temp_size += sizeof(ia_esbr_hbe_txposer_struct) * 2;
     temp_size += (MAX_HBE_PERSISTENT_SIZE * 2);
@@ -1154,10 +1298,8 @@
     p_mem_info_aac->ui_size =
         sizeof(ia_aac_dec_state_struct) +
         channels * sizeof(struct ia_aac_persistent_struct) +
-
         buffer_size + channels * ixheaacd_getsize_sbr_persistent() +
-        channels * 16;
-
+        channels * 16 + ixheaacd_mps_persistent_buffer_sizes();
     p_mem_info_aac->ui_size += sizeof(ia_dec_data_struct);
     p_mem_info_aac->ui_size += sizeof(ia_audio_specific_config_struct);
     p_mem_info_aac->ui_size += 8300;
@@ -1220,7 +1362,7 @@
     p_mem_info_aac =
         &p_obj_exhaacplus_dec->p_mem_info_aac[IA_ENHAACPLUS_DEC_INPUT_IDX];
 
-    p_mem_info_aac->ui_size = 8 * 1024 + 11;
+    p_mem_info_aac->ui_size = IA_MAX_INP_BUFFER_SIZE;
 
     p_mem_info_aac->ui_alignment = 8;
     p_mem_info_aac->ui_type = IA_MEMTYPE_INPUT;
@@ -1238,20 +1380,35 @@
 IA_ERRORCODE ixheaacd_dec_table_api(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 i_cmd,
     WORD32 i_idx, pVOID pv_value) {
+  ia_heaac_mps_state_struct *pstr_mps_state =
+      &p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle;
   pUWORD32 pui_value = pv_value;
   pUWORD32 *p_pui_value = pv_value;
   SIZE_T ui_get_vals[5];
 
-  pVOID *table_ptrs[8];
-  UWORD32 table_sizes[8] = {sizeof(ixheaacd_aac_huffmann_tables),
-                            sizeof(ixheaacd_aac_block_tables),
-                            sizeof(ixheaacd_imdct_tables),
-                            sizeof(ixheaacd_str_fft_n_transcendent_tables),
-                            sizeof(ixheaacd_aac_dec_env_calc_tables),
-                            sizeof(ixheaacd_aac_qmf_dec_tables),
-                            sizeof(ixheaacd_aac_dec_env_extr_tables),
-                            sizeof(ixheaacd_aac_dec_ps_tables)};
-
+  pVOID *table_ptrs[8 + NUM_MPS_TABLES];
+  UWORD32 table_sizes[8 + NUM_MPS_TABLES] = {
+      sizeof(ixheaacd_aac_huffmann_tables),
+      sizeof(ixheaacd_aac_block_tables),
+      sizeof(ixheaacd_imdct_tables),
+      sizeof(ixheaacd_str_fft_n_transcendent_tables),
+      sizeof(ixheaacd_aac_dec_env_calc_tables),
+      sizeof(ixheaacd_aac_qmf_dec_tables),
+      sizeof(ixheaacd_aac_dec_env_extr_tables),
+      sizeof(ixheaacd_aac_dec_ps_tables),
+      sizeof(ixheaacd_mps_dec_qmf_tables),
+      sizeof(ixheaacd_mps_dec_common_tables),
+      sizeof(ixheaacd_mps_dec_hybrid_tables),
+      sizeof(ixheaacd_mps_dec_m1_m2_tables),
+      sizeof(ixheaacd_mps_dec_decorr_tables),
+      sizeof(ixheaacd_mps_dec_tp_process_tables),
+      sizeof(ixheaacd_mps_dec_mdct2qmf_table),
+      sizeof(ixheaacd_mps_dec_tonality_tables),
+      sizeof(ixheaacd_mps_dec_bitdec_tables),
+      sizeof(ixheaacd_mps_dec_blind_tables),
+      sizeof(ixheaacd_mps_dec_mdct2qmf_tables),
+      sizeof(ia_mps_dec_mdct2qmf_cos_table_struct),
+      sizeof(ia_mps_dec_residual_aac_tables_struct)};
   table_ptrs[0] =
       (pVOID *)&(p_obj_exhaacplus_dec->aac_tables.pstr_huffmann_tables);
   table_ptrs[1] =
@@ -1266,9 +1423,22 @@
   table_ptrs[6] =
       (pVOID *)&p_obj_exhaacplus_dec->str_sbr_tables.env_extr_tables_ptr;
   table_ptrs[7] = (pVOID *)&p_obj_exhaacplus_dec->str_sbr_tables.ps_tables_ptr;
+  table_ptrs[8] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr);
+  table_ptrs[9] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr);
+  table_ptrs[10] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.hybrid_table_ptr);
+  table_ptrs[11] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr);
+  table_ptrs[12] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.decor_table_ptr);
+  table_ptrs[13] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr);
+  table_ptrs[14] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.mdct2qmf_table_ptr);
+  table_ptrs[15] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr);
+  table_ptrs[16] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
+  table_ptrs[17] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.blind_table_ptr);
+  table_ptrs[18] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr);
+  table_ptrs[19] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_tab_ptr);
+  table_ptrs[20] = (pVOID *)&(pstr_mps_state->ia_mps_dec_mps_table.aac_tab);
 
-  if (i_idx < 0 || i_idx >= NUM_AAC_TABLES) {
-    return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_MEMTAB_INDEX;
+  if (i_idx < 0 || i_idx >= (NUM_AAC_TABLES + NUM_MPS_TABLES)) {
+    return IA_XHEAAC_DEC_API_FATAL_INVALID_MEMTAB_INDEX;
   }
 
   ui_get_vals[0] = table_sizes[i_idx];
@@ -1277,10 +1447,10 @@
 
   if (i_cmd == IA_API_CMD_SET_TABLE_PTR) {
     if (pv_value == 0) {
-      return (IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALLOC);
+      return (IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC);
     }
     if (((SIZE_T)pv_value) & 3) {
-      return IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALIGN;
+      return IA_XHEAAC_DEC_API_FATAL_MEM_ALIGN;
     }
 
     *table_ptrs[i_idx] = pv_value;
@@ -1301,6 +1471,30 @@
   return IA_NO_ERROR;
 }
 
+VOID ixheaacd_mps_payload(ia_handle_sbr_dec_inst_struct self,
+                          ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
+  struct ia_bit_buf_struct local_bit_buff;
+  struct ia_bit_buf_struct *it_bit_buff;
+  if (self->ptr_mps_data != NULL) {
+    ixheaacd_create_init_bit_buf(&local_bit_buff, (UWORD8 *)self->ptr_mps_data,
+                                 (self->left_mps_bits >> 3) + 1);
+  }
+
+  local_bit_buff.xaac_jmp_buf =
+      &p_obj_exhaacplus_dec->p_state_aac->xaac_jmp_buf;
+
+  it_bit_buff = &local_bit_buff;
+
+  it_bit_buff->bit_pos = self->mps_bits_pos;
+  it_bit_buff->cnt_bits = self->left_mps_bits;
+
+  while (self->left_mps_bits >= 8) {
+    ixheaacd_extension_payload(
+        it_bit_buff, &self->left_mps_bits,
+        &p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle);
+  }
+}
+
 IA_ERRORCODE ixheaacd_dec_init(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) {
   FLAG frame_status = 1;
@@ -1312,6 +1506,7 @@
   WORD16 *time_data;
   WORD ch_idx;
   WORD sbr_present_flag = 0;
+  UWORD8 *mps_buffer;
   ia_aac_dec_state_struct *p_state_enhaacplus_dec;
 
   WORD32 error_code = IA_NO_ERROR;
@@ -1324,6 +1519,13 @@
   p_obj_exhaacplus_dec->p_state_aac =
       p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_PERSIST_IDX];
 
+  if (p_obj_exhaacplus_dec->p_state_aac->ui_init_done)
+  {
+    return IA_NO_ERROR;
+  }
+
+  p_obj_exhaacplus_dec->p_state_aac->preroll_config_present = 0;
+
   if (p_obj_exhaacplus_dec->p_state_aac != NULL) {
     ret_val = setjmp(p_obj_exhaacplus_dec->p_state_aac->xaac_jmp_buf);
     if (ret_val != 0) {
@@ -1350,11 +1552,18 @@
   p_obj_exhaacplus_dec->p_state_aac->huffman_code_book_scl =
       p_obj_exhaacplus_dec->aac_tables.pstr_huffmann_tables
           ->huffman_code_book_scl;
+  mps_buffer = p_obj_exhaacplus_dec->p_state_aac->mps_buffer;
+  p_state_enhaacplus_dec->mps_header = -1;
   p_obj_exhaacplus_dec->p_state_aac->huffman_code_book_scl_index =
       p_obj_exhaacplus_dec->aac_tables.pstr_huffmann_tables
           ->huffman_code_book_scl_index;
 
   p_state_enhaacplus_dec->pstr_aac_tables = &p_obj_exhaacplus_dec->aac_tables;
+  if (p_obj_exhaacplus_dec->p_state_aac->header_dec_done == 0)
+  {
+    p_obj_exhaacplus_dec->aac_config.header_dec_done = 0;
+    p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.ldmps_present_flag = 0;
+  }
   if (p_obj_exhaacplus_dec->aac_config.header_dec_done == 0) {
     WORD32 channels;
 
@@ -1400,6 +1609,17 @@
         p_state_enhaacplus_dec->sbr_persistent_mem_v, &persistent_used,
         channels, 1);
 
+    p_state_enhaacplus_dec->heaac_mps_handle.mps_persistent_mem_v =
+        (pVOID)((SIZE_T)((pWORD8)p_state_enhaacplus_dec->sbr_persistent_mem_v +
+                         persistent_used + sizeof(SIZE_T) - 1) &
+                (SIZE_T)(~(sizeof(SIZE_T) - 1)));
+
+    persistent_used = ixheaacd_getsize_mps_persistent();
+
+    ixheaacd_set_mps_persistent_buffers(
+        &p_state_enhaacplus_dec->heaac_mps_handle, &persistent_used, channels,
+        p_state_enhaacplus_dec->heaac_mps_handle.mps_persistent_mem_v);
+
     aac_persistent_mem = (struct ia_aac_persistent_struct *)
                              p_state_enhaacplus_dec->aac_persistent_mem_v;
     if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
@@ -1411,6 +1631,7 @@
         aac_persistent_mem->overlap_buffer;
 
     p_state_enhaacplus_dec->bit_count = 0;
+    p_state_enhaacplus_dec->ec_enable = p_obj_exhaacplus_dec->aac_config.ui_err_conceal;
     p_state_enhaacplus_dec->sync_status = 0;
     p_state_enhaacplus_dec->bs_format = ADTS_BSFORMAT;
     p_state_enhaacplus_dec->latm_initialized = 0;
@@ -1447,10 +1668,13 @@
         p_obj_exhaacplus_dec->p_state_aac->sbr_persistent_mem_v,
         &p_obj_exhaacplus_dec->str_sbr_tables,
         p_obj_exhaacplus_dec->common_tables);
+    ixheaacd_set_scratch_buffers(
+        &p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle,
+        p_state_enhaacplus_dec->aac_scratch_mem_v);
   }
 
   if (p_obj_exhaacplus_dec->p_state_aac->ui_input_over == 1) {
-    return IA_ENHAACPLUS_DEC_INIT_FATAL_EO_INPUT_REACHED;
+    return IA_XHEAAC_DEC_INIT_FATAL_EO_INPUT_REACHED;
   }
 
   if (p_obj_exhaacplus_dec->p_state_aac->header_dec_done == 0) {
@@ -1463,6 +1687,9 @@
                              p_state_enhaacplus_dec->aac_persistent_mem_v;
     sbr_persistent_mem = (struct ia_sbr_pers_struct *)
                              p_state_enhaacplus_dec->sbr_persistent_mem_v;
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+      p_obj_exhaacplus_dec->p_state_aac->first_frame = 1;
+    }
 
     if (p_obj_exhaacplus_dec->aac_config.ui_samp_freq == 0) {
       WORD32 header_bytes_consumed, return_val;
@@ -1471,6 +1698,15 @@
         p_state_enhaacplus_dec->i_bytes_consumed = 0;
         return IA_NO_ERROR;
       }
+
+      if (1 == p_obj_exhaacplus_dec->aac_config.ui_frame_size) {
+        p_state_enhaacplus_dec->frame_len_flag = 1;
+        p_state_enhaacplus_dec->frame_length = 960;
+      } else {
+        p_state_enhaacplus_dec->frame_len_flag = 0;
+        p_state_enhaacplus_dec->frame_length = 1024;
+      }
+
       p_state_enhaacplus_dec->ui_init_done = 0;
       memset(&(p_state_enhaacplus_dec->eld_specific_config), 0,
              sizeof(ia_eld_specific_config_struct));
@@ -1479,7 +1715,8 @@
           aac_persistent_mem->str_aac_decoder.pstr_aac_tables
               ->pstr_huffmann_tables);
       if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
-          p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD) {
+          p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD ||
+          p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LC) {
         *sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[0] =
             p_obj_exhaacplus_dec->p_state_aac->str_sbr_config;
         *sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[1] =
@@ -1491,7 +1728,7 @@
 
       if (return_val < 0) {
         if (return_val ==
-            (WORD32)IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX) {
+            (WORD32)IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX) {
           p_state_enhaacplus_dec->i_bytes_consumed = header_bytes_consumed;
           return return_val;
         }
@@ -1501,7 +1738,7 @@
       }
 
       if (return_val ==
-          IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) {
+          IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) {
         p_state_enhaacplus_dec->i_bytes_consumed = header_bytes_consumed;
         return return_val;
       }
@@ -1518,6 +1755,7 @@
               p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_OUTPUT_IDX];
           WORD32 out_bytes = 0;
           WORD32 frames_done = p_obj_exhaacplus_dec->p_state_aac->frame_counter;
+          p_obj_exhaacplus_dec->p_state_aac->decode_create_done = 0;
 
           if (p_obj_exhaacplus_dec->p_state_aac->ui_input_over == 0) {
             error_code = ixheaacd_dec_main(
@@ -1548,7 +1786,7 @@
       }
 
       if (p_obj_exhaacplus_dec->p_state_aac->header_dec_done != 1)
-        return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
+        return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
 
       if (p_state_enhaacplus_dec->dwnsmp_signal == 1 &&
           p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD)
@@ -1565,6 +1803,14 @@
 
       p_state_enhaacplus_dec->sampling_rate =
           p_obj_exhaacplus_dec->aac_config.ui_samp_freq;
+
+      if (1 == p_obj_exhaacplus_dec->aac_config.ui_frame_size) {
+        p_state_enhaacplus_dec->frame_len_flag = 1;
+        p_state_enhaacplus_dec->frame_length = 960;
+      } else {
+        p_state_enhaacplus_dec->frame_len_flag = 0;
+        p_state_enhaacplus_dec->frame_length = 1024;
+      }
     }
 
     p_state_enhaacplus_dec->pstr_bit_buf = ixheaacd_create_bit_buf(
@@ -1577,7 +1823,7 @@
     p_state_enhaacplus_dec->ptr_bit_stream =
         p_state_enhaacplus_dec->pstr_bit_buf;
 
-    if (p_state_enhaacplus_dec->s_adts_hdr_present) {  // rajat
+    if (p_state_enhaacplus_dec->s_adts_hdr_present) {
       if (p_obj_exhaacplus_dec->aac_config.ld_decoder == 1)
         p_state_enhaacplus_dec->audio_object_type = 23;
     }
@@ -1615,7 +1861,7 @@
 
         if (!p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]) {
           p_state_enhaacplus_dec->i_bytes_consumed = 1;
-          return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+          return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
         }
       }
 
@@ -1677,7 +1923,7 @@
 
     p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 0;
     p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
-
+    p_state_enhaacplus_dec->ui_mps_out_bytes = 0;
     if (p_state_enhaacplus_dec->ui_in_bytes == 0) {
       p_state_enhaacplus_dec->i_bytes_consumed = 0;
       return IA_NO_ERROR;
@@ -1746,7 +1992,7 @@
       sync = ixheaacd_read_bits_buf(it_bit_buff, 11);
       cnt_bits = it_bit_buff->cnt_bits;
       if (it_bit_buff->cnt_bits <= 24) {
-        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+        return IA_XHEAAC_DEC_INIT_NONFATAL_INSUFFICIENT_INPUT_BYTES;
       }
 
       while (sync != 0x2b7) {
@@ -1755,7 +2001,7 @@
           ixheaacd_read_bidirection(it_bit_buff, -11);
           p_state_enhaacplus_dec->i_bytes_consumed =
               (cnt_bits - it_bit_buff->cnt_bits) / 8;
-          return (IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
+          return (IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
         }
       }
 
@@ -1785,7 +2031,7 @@
       if (ch_idx >= elements_number) {
         p_state_enhaacplus_dec->i_bytes_consumed = 1;
 
-        return IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
+        return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
       }
 
       ixheaacd_allocate_aac_scr(
@@ -1795,20 +2041,32 @@
 
       p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->p_ind_channel_info =
           &p_state_enhaacplus_dec->ind_cc_info;
+      if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+        p_obj_exhaacplus_dec->aac_config.first_frame = 1;
+      }
 
       error_code = ixheaacd_aacdec_decodeframe(
-          p_obj_exhaacplus_dec, &aac_scratch_struct, time_data, frame_status,
-          &type, &ch_idx, 1, 2,
-          p_obj_exhaacplus_dec->aac_config.element_instance_order, 0, 1, 0,
+          p_obj_exhaacplus_dec, &aac_scratch_struct, time_data, frame_status, &type, &ch_idx, 1,
+          2, p_obj_exhaacplus_dec->aac_config.element_instance_order, 0, 1, 0,
           p_obj_exhaacplus_dec->aac_config.ui_max_channels, 2,
           p_obj_exhaacplus_dec->p_state_aac->frame_length,
-          p_obj_exhaacplus_dec->p_state_aac->frame_size,
-          p_state_enhaacplus_dec->pstr_drc_dec,
-          p_state_enhaacplus_dec->audio_object_type,
-          p_state_enhaacplus_dec->ch_config,
-          p_state_enhaacplus_dec->eld_specific_config,
-          p_state_enhaacplus_dec->s_adts_hdr_present,
-          &p_state_enhaacplus_dec->drc_dummy);
+          p_obj_exhaacplus_dec->p_state_aac->frame_size, p_state_enhaacplus_dec->pstr_drc_dec,
+          p_state_enhaacplus_dec->audio_object_type, p_state_enhaacplus_dec->ch_config,
+          p_state_enhaacplus_dec->eld_specific_config, p_state_enhaacplus_dec->s_adts_hdr_present,
+          &p_state_enhaacplus_dec->drc_dummy, p_state_enhaacplus_dec->ldmps_present,
+          &p_state_enhaacplus_dec->slot_pos, mps_buffer, &p_state_enhaacplus_dec->mps_header,
+          &p_state_enhaacplus_dec->ui_mps_out_bytes, 1,
+          p_obj_exhaacplus_dec->aac_config.first_frame);
+
+      if (p_state_enhaacplus_dec->pstr_drc_dec->drc_element_found == 1) {
+        if (p_obj_exhaacplus_dec->aac_config.i_loud_ref_level < 0) {
+          p_obj_exhaacplus_dec->aac_config.output_level =
+              p_state_enhaacplus_dec->pstr_drc_dec->prog_ref_level;
+        } else {
+          p_obj_exhaacplus_dec->aac_config.output_level =
+              p_obj_exhaacplus_dec->aac_config.i_loud_ref_level;
+        }
+      }
 
       memset(&(p_obj_exhaacplus_dec->p_state_aac->pstr_aac_dec_info[ch_idx]
                    ->pstr_aac_dec_ch_info[0]
@@ -1828,11 +2086,8 @@
              0, sizeof(ltp_info));
 
       {
-        if ((p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LD) &&
-            (p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_ELD))
-          frame_size_1 = 1024;
-        else
-          frame_size_1 = p_state_enhaacplus_dec->frame_length;
+
+        frame_size_1 = p_state_enhaacplus_dec->frame_length;
         sample_rate_1 =
             p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->sampling_rate;
         num_channels_1 =
@@ -1842,7 +2097,7 @@
       if ((p_obj_exhaacplus_dec->aac_config.ui_max_channels <= 2) &&
           (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] == 2)) {
         p_state_enhaacplus_dec->i_bytes_consumed = 1;
-        return IA_ENHAACPLUS_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
+        return IA_XHEAAC_DEC_INIT_FATAL_UNIMPLEMENTED_CCE;
       }
 
       if (p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
@@ -1852,7 +2107,7 @@
 
       if (error_code) {
         if (p_state_enhaacplus_dec->ui_input_over) {
-          return IA_ENHAACPLUS_DEC_INIT_FATAL_EO_INPUT_REACHED;
+          return IA_XHEAAC_DEC_INIT_FATAL_EO_INPUT_REACHED;
         }
 
         ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
@@ -1861,7 +2116,7 @@
 
       if (p_state_enhaacplus_dec->s_adts_hdr_present) {
         if (adts.no_raw_data_blocks != 0) {
-          if (adts.protection_absent == 0) {
+          if (adts.protection_absent == 0 && it_bit_buff->cnt_bits >= 16) {
             adts.crc_check = ixheaacd_read_bits_buf(it_bit_buff, 16);
           }
         }
@@ -1873,6 +2128,7 @@
 
       if (!p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] &&
           p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
+        WORD32 harmonic_sbr_flag = 0;
         if ((p_obj_exhaacplus_dec->aac_config.flag_16khz_out == 1) &&
             (sample_rate_1 == 8000)) {
           p_obj_exhaacplus_dec->aac_config.flag_16khz_out = 0;
@@ -1883,9 +2139,13 @@
             (FLAG *)&p_obj_exhaacplus_dec->aac_config.down_sample_flag,
             p_state_enhaacplus_dec->sbr_persistent_mem_v,
             p_state_enhaacplus_dec->ptr_overlap_buf, MAXNRSBRCHANNELS, (WORD)1,
-            1, frame_size_1 * 2, NULL, NULL,
+            1, frame_size_1 * 2, &harmonic_sbr_flag, NULL,
             p_state_enhaacplus_dec->str_sbr_config,
-            p_state_enhaacplus_dec->audio_object_type);
+            p_state_enhaacplus_dec->audio_object_type,
+            p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                .ldmps_present_flag,
+            p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                .no_ldsbr_present);
         if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
               &(p_state_enhaacplus_dec->xaac_jmp_buf);
@@ -1899,28 +2159,95 @@
         WORD16 num_channels_1_t = num_channels_1;
         ixheaacd_allocate_sbr_scr(
             &sbr_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v,
-            time_data, 1, 1, p_state_enhaacplus_dec->audio_object_type);
+            time_data, 1, 1, p_state_enhaacplus_dec->audio_object_type, 0, NULL,
+            0, 0);
+        {
+          WORD32 audio_object_type = p_state_enhaacplus_dec->audio_object_type;
 
-        if (ixheaacd_applysbr(
-                p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
-                &p_state_enhaacplus_dec->pstr_stream_sbr[0][0], time_data,
-                &num_channels_1, frame_status,
-                p_obj_exhaacplus_dec->aac_config.down_sample_flag, 0,
-                &sbr_scratch_struct, 1, 1, 0, NULL, NULL,
-                p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present,
-                p_state_enhaacplus_dec->audio_object_type) != SBRDEC_OK) {
+          if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD) {
+            WORD32 i = 0;
+            ia_dec_data_struct *pstr_dec_data =
+                (ia_dec_data_struct *)p_state_enhaacplus_dec->pstr_dec_data;
+            if (num_channels_1 == 1) {
+              for (; i < 1024; i++) {
+                pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
+                    ((FLOAT32)time_data[i]);
+              }
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
+                  &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
+
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
+                  &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
+            } else if (num_channels_1 == 2) {
+              for (; i < 1024; i++) {
+                pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
+                    ((FLOAT32)time_data[2 * i + 0]);
+                pstr_dec_data->str_usac_data.time_sample_vector[1][i] =
+                    ((FLOAT32)time_data[2 * i + 1]);
+              }
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
+                  &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
+
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
+                  &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
+            }
+          }
+        }
+        p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->ec_flag =
+            p_obj_exhaacplus_dec->aac_config.ui_err_conceal;
+        p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->esbr_hq =
+            p_obj_exhaacplus_dec->aac_config.ui_hq_esbr;
+        p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->enh_sbr =
+            p_obj_exhaacplus_dec->aac_config.ui_enh_sbr;
+        p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->enh_sbr_ps =
+            p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps;
+
+        if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
+          p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
+              &(p_state_enhaacplus_dec->xaac_jmp_buf);
+        }
+
+        if (ixheaacd_applysbr(p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
+                              &p_state_enhaacplus_dec->pstr_stream_sbr[0][0], time_data,
+                              &num_channels_1, frame_status,
+                              p_obj_exhaacplus_dec->aac_config.down_sample_flag, 0,
+                              &sbr_scratch_struct, 1, 1, 0, NULL, NULL,
+                              p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present,
+                              p_state_enhaacplus_dec->audio_object_type, 1,
+                              p_state_enhaacplus_dec->ldmps_present, frame_size_1,
+                              p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present,
+                              p_obj_exhaacplus_dec->aac_config.ui_err_conceal,
+                              p_obj_exhaacplus_dec->aac_config.first_frame) != SBRDEC_OK) {
           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = 0;
           return -1;
         } else {
           if (!p_obj_exhaacplus_dec->aac_config.down_sample_flag) {
             sample_rate_1 *= 2;
           }
+          if (p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present == 1) {
+            p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.pre_mix_req = 1;
+            ixheaacd_mps_payload(
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
+              p_obj_exhaacplus_dec);
+          }
         }
+        {
+          WORD32 audio_object_type = p_state_enhaacplus_dec->audio_object_type;
 
+          if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD) {
+            WORD32 out_bytes = 0;
+            ia_dec_data_struct *pstr_dec_data =
+                (ia_dec_data_struct *)p_state_enhaacplus_dec->pstr_dec_data;
+            ixheaacd_samples_sat((WORD8 *)time_data, 2048, 16,
+                                 pstr_dec_data->str_usac_data.time_sample_vector, &out_bytes, 1);
+          }
+        }
         if (p_obj_exhaacplus_dec->aac_config.flag_downmix) {
           num_channels_1 = 1;
         }
         if (num_channels_1_t == 1 && num_channels_1 == 2) ps_detected = 1;
+      } else {
+        p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.no_ldsbr_present = 1;
       }
 
       p_state_enhaacplus_dec->i_bytes_consumed = 0;
@@ -1936,18 +2263,23 @@
 
         if (!p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]) {
           p_state_enhaacplus_dec->i_bytes_consumed = 1;
-          return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+          return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
         }
 
         if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
+          WORD32 harmonic_sbr_flag = 0;
           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = ixheaacd_init_sbr(
               sample_rate_2, frame_size_2,
               (FLAG *)&p_obj_exhaacplus_dec->aac_config.down_sample_flag,
               p_state_enhaacplus_dec->sbr_persistent_mem_v,
               p_state_enhaacplus_dec->ptr_overlap_buf, MAXNRSBRCHANNELS, 1, 1,
-              frame_size_2 * 2, NULL, NULL,
+              frame_size_2 * 2, &harmonic_sbr_flag, NULL,
               p_state_enhaacplus_dec->str_sbr_config,
-              p_state_enhaacplus_dec->audio_object_type);
+              p_state_enhaacplus_dec->audio_object_type,
+              p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                .ldmps_present_flag,
+              p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                .no_ldsbr_present);
         }
         if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
@@ -1961,7 +2293,8 @@
 
       if (p_state_enhaacplus_dec->audio_object_type >= ER_OBJECT_START &&
           (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD ||
-           p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD))
+          p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
+          p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LC))
         break;
     }
 
@@ -1985,6 +2318,7 @@
       WORD channel_check = 0;
       WORD cc_channel_check = 0;
       WORD max_ch_num = p_obj_exhaacplus_dec->aac_config.ui_max_channels;
+      WORD32 harmonic_sbr_flag = 0;
       i = 0;
 
       p_obj_exhaacplus_dec->aac_config.ui_n_channels = ch_idx;
@@ -1995,12 +2329,12 @@
 
       if (ch_idx_err == 0) {
         p_obj_exhaacplus_dec->p_state_aac->header_dec_done = 0;
-        p_state_enhaacplus_dec->i_bytes_consumed =
-            it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base;
-        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+        p_state_enhaacplus_dec->i_bytes_consumed = (WORD32)(
+            it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base);
+        return IA_XHEAAC_DEC_INIT_NONFATAL_DECODE_FRAME_ERROR;
       }
 
-      if (ch_idx == 1)
+      if (ch_idx_err == 1)
         ps_enable = 1;
       else
         ps_enable = 0;
@@ -2031,11 +2365,11 @@
             cc_channel_check++;
             break;
           default:
-            assert(0);
+            return -1;
         }
 
         if (cc_channel_check > MAX_CC_CHANNEL_NUM)
-          return IA_ENHAACPLUS_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
+          return IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
         if (ps_enable == 1) {
           channel = 2;
         }
@@ -2046,7 +2380,7 @@
 
         if (channel_check > max_ch_num) {
           p_state_enhaacplus_dec->i_bytes_consumed = 1;
-          return IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
+          return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
         }
 
         temp = p_state_enhaacplus_dec->aac_persistent_mem_v;
@@ -2078,7 +2412,7 @@
 
         if (!p_state_enhaacplus_dec->pstr_aac_dec_info[i]) {
           p_state_enhaacplus_dec->i_bytes_consumed = 1;
-          return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+          return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
         }
 
         p_state_enhaacplus_dec->str_sbr_dec_info[i] = ixheaacd_init_sbr(
@@ -2086,21 +2420,55 @@
             (FLAG *)&p_obj_exhaacplus_dec->aac_config.down_sample_flag,
             p_state_enhaacplus_dec->sbr_persistent_mem_v,
             p_state_enhaacplus_dec->ptr_overlap_buf, channel, ps_enable, 1,
-            frame_size_2 * 2, NULL, NULL,
+            frame_size_2 * 2, &harmonic_sbr_flag, NULL,
             p_state_enhaacplus_dec->str_sbr_config,
-            p_state_enhaacplus_dec->audio_object_type);
+            p_state_enhaacplus_dec->audio_object_type,
+            p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                .ldmps_present_flag,
+            p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                .no_ldsbr_present);
         if (p_state_enhaacplus_dec->str_sbr_dec_info[i]) {
           p_state_enhaacplus_dec->str_sbr_dec_info[i]->xaac_jmp_buf =
               &(p_state_enhaacplus_dec->xaac_jmp_buf);
         }
-        if (sbr_present_flag &&
+        if ((sbr_present_flag &&
             ((p_obj_exhaacplus_dec->p_state_aac->audio_object_type ==
               AOT_AAC_LC) ||
              (p_obj_exhaacplus_dec->p_state_aac->audio_object_type ==
               AOT_SBR) ||
-             (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_PS)))
+             (p_obj_exhaacplus_dec->p_state_aac->audio_object_type ==
+               AOT_PS))) ||
+            ((p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                  .ldmps_present_flag == 1) &&
+             (p_obj_exhaacplus_dec->p_state_aac->audio_object_type ==
+              AOT_ER_AAC_ELD)))
           p_obj_exhaacplus_dec->aac_config.flag_to_stereo = 1;
-
+        if (p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                .ldmps_present_flag == 1) {
+          copy_qmf_to_ldmps(&p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle,
+                            p_state_enhaacplus_dec->sbr_persistent_mem_v);
+        }
+        if (p_state_enhaacplus_dec->audio_object_type == AOT_AAC_LC &&
+            p_state_enhaacplus_dec->ui_mps_out_bytes != 0) {
+          p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present = 1;
+          if (p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
+            p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.mps_with_sbr = 1;
+          }
+          error_code =
+              ixheaacd_aac_mps_init(p_obj_exhaacplus_dec, mps_buffer,
+                                    p_state_enhaacplus_dec->ui_mps_out_bytes, sample_rate_1);
+          if (error_code) return error_code;
+          p_obj_exhaacplus_dec->aac_config.ui_n_channels =
+              p_state_enhaacplus_dec->heaac_mps_handle.num_output_channels_at;
+          if (p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.mps_with_sbr == 1) {
+            p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 1;
+          }
+          if (p_obj_exhaacplus_dec->aac_config.element_type[i + 1] >= 0 &&
+              p_obj_exhaacplus_dec->aac_config.element_type[i + 1] <= 3) {
+            return IA_FATAL_ERROR;
+          }
+          break;
+        }
         i++;
       }
       p_state_enhaacplus_dec->pers_mem_ptr =
@@ -2222,12 +2590,13 @@
   WORD32 sample_rate = 0;
   WORD16 num_ch = 0;
   struct ia_bit_buf_struct *it_bit_buff;
+  UWORD8 *mps_buffer;
   WORD32 error_code = IA_NO_ERROR;
   WORD ch_idx1;
   WORD type;
   WORD total_channels = 0;
   WORD total_elements = 0;
-  WORD16 *actual_out_buffer;
+  WORD16 *actual_out_buffer = NULL;
   WORD ps_enable;
   WORD esbr_mono_downmix = 0;
   WORD8 element_used[MAX_BS_ELEMENT];
@@ -2236,8 +2605,10 @@
   SIZE_T bytes_for_sync;
   WORD32 audio_mux_length_bytes_last = 0;
   WORD32 ret_val;
+  WORD32 mps_out_samples;
 
   p_obj_exhaacplus_dec->aac_config.ui_sbr_mode = 0;
+  p_obj_exhaacplus_dec->aac_config.frame_status = 1;
 
   if (p_obj_exhaacplus_dec->p_state_aac != NULL) {
     ret_val = setjmp(p_obj_exhaacplus_dec->p_state_aac->xaac_jmp_buf);
@@ -2245,6 +2616,7 @@
       p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
           p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
+      p_obj_exhaacplus_dec->aac_config.frame_status = 0;
       return IA_NO_ERROR;
     }
   }
@@ -2255,7 +2627,8 @@
   p_state_enhaacplus_dec = p_obj_exhaacplus_dec->p_state_aac;
   p_state_enhaacplus_dec->aac_scratch_mem_v =
       p_obj_exhaacplus_dec->pp_mem_aac[IA_ENHAACPLUS_DEC_SCRATCH_IDX];
-
+  p_state_enhaacplus_dec->mps_header = -1;
+  mps_buffer = p_state_enhaacplus_dec->mps_buffer;
   it_bit_buff = p_state_enhaacplus_dec->pstr_bit_buf;
 
   ch_idx1 = 0;
@@ -2306,17 +2679,52 @@
       error_code = ixheaacd_dec_main(
           p_obj_exhaacplus_dec, inbuffer, outbuffer, &out_bytes, frames_done,
           pcm_size, &p_obj_exhaacplus_dec->p_state_aac->num_of_output_ch);
-      if (error_code == -1) return error_code;
+      if (error_code) {
+        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+          p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+        } else {
+          return error_code;
+        }
+      }
       p_obj_exhaacplus_dec->p_state_aac->frame_counter++;
     } else {
       out_bytes = 0;
     }
 
-    p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
-        p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
+    if (pstr_dec_data->str_usac_data.ec_flag == 0) {
+      if (p_state_enhaacplus_dec->bs_format != LOAS_BSFORMAT) {
+        p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
+            p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
+      }
+    } else {
+      if (p_state_enhaacplus_dec->bs_format != LOAS_BSFORMAT) {
+        if (pstr_dec_data->str_usac_data.frame_ok == 0) {
+          p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
+              p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
+          pstr_dec_data->dec_bit_buf.cnt_bits = 0;
+        } else {
+          ia_dec_data_struct *pstr_dec_data =
+              (ia_dec_data_struct *)p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data;
+
+          if (pstr_dec_data->dec_bit_buf.cnt_bits & 7) {
+            pstr_dec_data->dec_bit_buf.cnt_bits -= (pstr_dec_data->dec_bit_buf.cnt_bits & 7);
+          }
+          if (pstr_dec_data->dec_bit_buf.cnt_bits == 0) {
+            p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
+                p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes;
+          } else {
+            p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed =
+                p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes -
+                (pstr_dec_data->dec_bit_buf.cnt_bits >> 3);
+          }
+        }
+      }
+    }
+
     p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = out_bytes;
     p_obj_exhaacplus_dec->aac_config.ui_n_channels =
         p_obj_exhaacplus_dec->p_state_aac->num_of_output_ch;
+    pstr_dec_data->str_usac_data.sbr_parse_err_flag = 0;
 
     return 0;
   }
@@ -2337,6 +2745,12 @@
     }
 
     ch_idx1++;
+    if (ch_idx1 > MAX_BS_ELEMENT) {
+      if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal)
+        break;
+      else
+        return IA_FATAL_ERROR;
+    }
   }
 
   if (ch_idx1 != 1) {
@@ -2347,7 +2761,7 @@
       scratch_pointer = 12 * 1024;
 
       p_state_enhaacplus_dec->coup_ch_output =
-          (WORD16 *)((WORD8 *)
+          (WORD32 *)((WORD8 *)
                          p_obj_exhaacplus_dec->p_state_aac->aac_scratch_mem_v +
                      scratch_pointer);
     }
@@ -2361,19 +2775,73 @@
   }
 
   p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
-
+  p_obj_exhaacplus_dec->p_state_aac->ui_mps_out_bytes = 0;
   if (p_state_enhaacplus_dec->ui_in_bytes == 0) {
+    UWORD32 i;
+    WORD32 j;
+    if (p_state_enhaacplus_dec->peak_lim_init == 1) {
+      p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
+          (p_state_enhaacplus_dec->peak_limiter.attack_time_samples) *
+          total_channels * sizeof(WORD16);
+
+      for (j = 0; j < total_channels; j++) {
+        for (i = 0;
+             i < (p_state_enhaacplus_dec->peak_limiter.attack_time_samples -
+                  p_state_enhaacplus_dec->peak_limiter.delayed_input_index);
+             i++) {
+          *(time_data + total_channels * i + j) = ixheaacd_round16(
+              (WORD32)*(p_state_enhaacplus_dec->peak_limiter.delayed_input +
+                (p_state_enhaacplus_dec->peak_limiter.delayed_input_index) *
+                    total_channels +
+                total_channels * i + j));
+        }
+      }
+
+      for (j = 0; j < total_channels; j++) {
+        for (i = 0;
+             i < p_state_enhaacplus_dec->peak_limiter.delayed_input_index;
+             i++) {
+          *(time_data +
+            (p_state_enhaacplus_dec->peak_limiter.attack_time_samples -
+             p_state_enhaacplus_dec->peak_limiter.delayed_input_index) *
+                total_channels +
+            total_channels * i + j) =
+              ixheaacd_round16(
+                  (WORD32)*(p_state_enhaacplus_dec->peak_limiter.delayed_input +
+                   total_channels * i + j));
+        }
+      }
+
+      if (p_obj_exhaacplus_dec->aac_config.dup_stereo_flag) {
+        for (i = 0;
+             i < (p_state_enhaacplus_dec->peak_limiter.attack_time_samples);
+             i++) {
+          time_data[2 * i + 1] = time_data[2 * i + 0];
+        }
+      }
+    } else {
+      p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = 0;
+    }
+
     p_state_enhaacplus_dec->i_bytes_consumed = 0;
     return IA_NO_ERROR;
   }
 
   if (ch_idx1 == 0) {
     p_state_enhaacplus_dec->i_bytes_consumed = 1;
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+      p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+    } else {
+      return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+    }
   }
   if (total_channels > (WORD)p_obj_exhaacplus_dec->aac_config.ui_max_channels) {
     p_state_enhaacplus_dec->i_bytes_consumed = 1;
-    return IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL;
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+      p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+    } else {
+      return IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL;
+    }
   }
 
   if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD ||
@@ -2382,6 +2850,11 @@
       p_state_enhaacplus_dec->frame_size = p_state_enhaacplus_dec->ui_in_bytes;
   }
 
+  if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LC) {
+    if (p_obj_exhaacplus_dec->aac_config.ui_mp4_flag)
+      p_state_enhaacplus_dec->frame_size = 1024;
+  }
+
   {
     ixheaacd_create_init_bit_buf(it_bit_buff, in_buffer,
                                  p_state_enhaacplus_dec->ui_in_bytes);
@@ -2398,15 +2871,27 @@
         WORD32 error;
 
         error = ixheaacd_readifadts(p_state_enhaacplus_dec, it_bit_buff, &adts);
-
-        if (error) return error;
+        if (error) {
+          if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+            p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+            if (adts.samp_freq_index > 11) {
+              adts.samp_freq_index = 11;
+            }
+          } else {
+            return error;
+          }
+        }
 
         if ((WORD32)p_state_enhaacplus_dec->sampling_rate !=
             (WORD32)((p_obj_exhaacplus_dec->aac_tables.pstr_huffmann_tables
                           ->str_sample_rate_info[adts.samp_freq_index]
                           .sampling_frequency))) {
           p_state_enhaacplus_dec->i_bytes_consumed = 0;
-          return IA_ENHAACPLUS_DEC_EXE_NONFATAL_CHANGED_ADTS_SF;
+          if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+            p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+          } else {
+            return IA_XHEAAC_DEC_EXE_NONFATAL_CHANGED_ADTS_SF;
+          }
         }
       }
     }
@@ -2433,8 +2918,11 @@
 
           if (p_state_enhaacplus_dec->i_bytes_consumed == 0)
             p_state_enhaacplus_dec->i_bytes_consumed = 1;
-
-          return (IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
+          if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+            p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+          } else {
+            return (IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
+          }
         }
       }
 
@@ -2448,9 +2936,12 @@
 
       if (it_bit_buff->cnt_bits < (audio_mux_len_bytes_last << 3)) {
         ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
-        p_state_enhaacplus_dec->i_bytes_consumed =
-            (cnt_bits - it_bit_buff->cnt_bits) / 8;
-        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+        p_state_enhaacplus_dec->i_bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
+        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+          p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+        } else {
+          return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+        }
       } else {
         ixheaacd_read_bidirection(it_bit_buff, -(13));
       }
@@ -2461,16 +2952,25 @@
             p_state_enhaacplus_dec,
             (ia_sampling_rate_info_struct *)&p_obj_exhaacplus_dec->aac_tables
                 .pstr_huffmann_tables->str_sample_rate_info[0]);
-        if (result) return result;
+        if (result < 0) {
+          if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+            p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+          } else {
+            return result;
+          }
+        }
         if (!p_state_enhaacplus_dec->latm_initialized) {
           p_state_enhaacplus_dec->sampling_rate =
-              p_state_enhaacplus_dec->latm_struct_element.layer_info[0][0]
-                  .asc.sampling_freq;
+              p_state_enhaacplus_dec->latm_struct_element.layer_info[0][0].asc.sampling_freq;
           p_state_enhaacplus_dec->latm_initialized = 1;
         } else {
           if (p_state_enhaacplus_dec->sampling_rate != curr_samp_rate) {
             p_state_enhaacplus_dec->i_bytes_consumed = 0;
-            return IA_ENHAACPLUS_DEC_EXE_NONFATAL_CHANGED_ADTS_SF;
+            if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+              p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+            } else {
+              return IA_XHEAAC_DEC_EXE_NONFATAL_CHANGED_ADTS_SF;
+            }
           }
         }
       }
@@ -2488,8 +2988,11 @@
   if (it_bit_buff->cnt_bits <= 0) {
     it_bit_buff->cnt_bits = -1;
     ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
-    return (WORD16)(
-        (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+      p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+    } else {
+      return (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    }
   }
 
   { it_bit_buff->initial_cnt_bits = it_bit_buff->cnt_bits; }
@@ -2499,33 +3002,66 @@
       p_state_enhaacplus_dec->frame_size = adts.aac_frame_length;
   }
 
+  if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LC) {
+    if (p_state_enhaacplus_dec->s_adts_hdr_present)
+      p_state_enhaacplus_dec->frame_size = 1024;
+  }
+
   if (p_state_enhaacplus_dec->pstr_drc_dec) {
     p_state_enhaacplus_dec->pstr_drc_dec->num_drc_elements = 0;
 
     p_state_enhaacplus_dec->pstr_drc_dec->state = 1;
   }
+  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+    if (total_elements > MAX_BS_ELEMENT) {
+      total_elements = MAX_BS_ELEMENT;
+    }
+  }
+
+  WORD16 *intermediate_scr =
+      (WORD16 *)(WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v +
+      (128 * 1024);
 
   for (ch_idx1 = 0; ch_idx1 < total_elements; ch_idx1++) {
     WORD32 skip_full_decode = 0;
     WORD32 ch_idx = ch_idx1;
-    WORD32 channel;
+    WORD32 channel = 0;
     WORD ch_fac, slot_ele;
 
     if (p_state_enhaacplus_dec->audio_object_type < ER_OBJECT_START ||
         (p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LD &&
-         p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_ELD)) {
-      error_code = ixheaacd_get_element_index_tag(
-          p_obj_exhaacplus_dec, ch_idx1, &ch_idx, &channel,
-          p_obj_exhaacplus_dec->aac_config.element_instance_order,
-          total_elements, element_used, total_channels,
-          p_state_enhaacplus_dec->pstr_drc_dec,
-          &p_state_enhaacplus_dec->drc_dummy);
+         p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_ELD &&
+         p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LC)) {
+      jmp_buf local;
+      ret_val = setjmp(local);
+      if (ret_val == 0) {
+        p_obj_exhaacplus_dec->p_state_aac->ptr_bit_stream->xaac_jmp_buf = &local;
+        error_code = ixheaacd_get_element_index_tag(
+            p_obj_exhaacplus_dec, ch_idx1, &ch_idx, &channel,
+            p_obj_exhaacplus_dec->aac_config.element_instance_order, total_elements, element_used,
+            total_channels, p_state_enhaacplus_dec->pstr_drc_dec,
+            &p_state_enhaacplus_dec->drc_dummy, mps_buffer, &p_state_enhaacplus_dec->mps_header,
+            &p_state_enhaacplus_dec->ui_mps_out_bytes);
+      }
 
-      if (error_code) {
+      if (error_code || ret_val) {
         ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
+        if (it_bit_buff->cnt_bits < 0) {
+          p_state_enhaacplus_dec->ui_out_bytes = 0;
+          p_state_enhaacplus_dec->ui_mps_out_bytes = 0;
+          p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
+        }
         p_state_enhaacplus_dec->i_bytes_consumed = 1;
         p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
-        return error_code;
+        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+          p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+          if (p_obj_exhaacplus_dec->aac_config.element_type[0] == ID_SCE)
+            channel = 1;
+          else
+            channel = 2;
+        } else {
+          return error_code;
+        }
       }
     } else {
       if (p_obj_exhaacplus_dec->aac_config.element_type[0] == ID_SCE)
@@ -2534,6 +3070,35 @@
         channel = 2;
     }
 
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal && (error_code || ret_val)) {
+      if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] == 0 ||
+          p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] == 3) {
+        if (channel > 1) {
+          channel = 1;
+        }
+      }
+      if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] == 1) {
+        if (channel > 2) {
+          channel = 2;
+        }
+      }
+      if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx1] == 2) {
+        if (p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) {
+          if (!(p_obj_exhaacplus_dec->aac_config.element_instance_order[ch_idx1] !=
+                p_obj_exhaacplus_dec->aac_config.ui_coupling_channel)) {
+            if (channel > 1) {
+              channel = 1;
+            }
+          }
+        }
+      }
+      if (ps_enable == 1) {
+        if (channel > 2) {
+          channel = 2;
+        }
+      }
+    }
+
     ch_fac = total_channels;
     slot_ele = p_obj_exhaacplus_dec->aac_config.slot_element[ch_idx];
     actual_out_buffer = time_data;
@@ -2573,7 +3138,11 @@
                 );
         if (!p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]) {
           p_state_enhaacplus_dec->i_bytes_consumed = 1;
-          return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+          if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+            p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+          } else {
+            return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
+          }
         }
         p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->p_ind_channel_info =
             (WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v + (8 * 1024) +
@@ -2582,7 +3151,8 @@
       if (p_obj_exhaacplus_dec->aac_config.element_type[1] < 3 &&
           p_obj_exhaacplus_dec->aac_config.element_type[1] > 0 &&
           p_obj_exhaacplus_dec->aac_config.ui_max_channels > 2) {
-        actual_out_buffer = p_state_enhaacplus_dec->coup_ch_output;
+        actual_out_buffer =
+            (WORD16 *)(VOID *)p_state_enhaacplus_dec->coup_ch_output;
       }
       ch_fac = 1;
       slot_ele = 0;
@@ -2599,33 +3169,56 @@
           time_data, channel, p_obj_exhaacplus_dec->aac_config.ui_max_channels,
           p_state_enhaacplus_dec->audio_object_type);
 
-      if(p_state_enhaacplus_dec->ch_config == 2 && channel == 1)
-          return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+      if (p_state_enhaacplus_dec->ch_config == 2 && channel == 1) {
+        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+          p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+        } else {
+          return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+        }
+      }
 
       error_code = ixheaacd_aacdec_decodeframe(
           p_obj_exhaacplus_dec, &aac_scratch_struct, actual_out_buffer,
-          p_obj_exhaacplus_dec->aac_config.frame_status, &type, &ch_idx, 0,
-          channel, element_index_order1, skip_full_decode, ch_fac, slot_ele,
+          p_obj_exhaacplus_dec->aac_config.frame_status, &type, &ch_idx, 0, channel,
+          element_index_order1, skip_full_decode, ch_fac, slot_ele,
           p_obj_exhaacplus_dec->aac_config.ui_max_channels, total_channels,
           p_obj_exhaacplus_dec->p_state_aac->frame_length,
-          p_obj_exhaacplus_dec->p_state_aac->frame_size,
-          p_state_enhaacplus_dec->pstr_drc_dec,
-          p_state_enhaacplus_dec->audio_object_type,
-          p_state_enhaacplus_dec->ch_config,
-          p_state_enhaacplus_dec->eld_specific_config,
-          p_state_enhaacplus_dec->s_adts_hdr_present,
-          &p_state_enhaacplus_dec->drc_dummy);
+          p_obj_exhaacplus_dec->p_state_aac->frame_size, p_state_enhaacplus_dec->pstr_drc_dec,
+          p_state_enhaacplus_dec->audio_object_type, p_state_enhaacplus_dec->ch_config,
+          p_state_enhaacplus_dec->eld_specific_config, p_state_enhaacplus_dec->s_adts_hdr_present,
+          &p_state_enhaacplus_dec->drc_dummy, p_state_enhaacplus_dec->ldmps_present,
+          &p_state_enhaacplus_dec->slot_pos, mps_buffer, &p_state_enhaacplus_dec->mps_header,
+          &p_state_enhaacplus_dec->ui_mps_out_bytes, 0,
+          p_obj_exhaacplus_dec->aac_config.first_frame);
+
+      p_state_enhaacplus_dec->slot_pos -= (channel - 1);
+      p_state_enhaacplus_dec->sbr_present = 0;
+
+      if (p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ &&
+          p_state_enhaacplus_dec->frame_counter == 0) {
+        ixheaacd_peak_limiter_init(
+            &p_state_enhaacplus_dec->peak_limiter, total_channels,
+            p_obj_exhaacplus_dec->p_state_aac->p_config->ui_samp_freq,
+            &p_state_enhaacplus_dec->peak_limiter.buffer[0],
+            &p_obj_exhaacplus_dec->p_state_aac->delay_in_samples);
+        p_obj_exhaacplus_dec->p_state_aac->peak_lim_init = 1;
+      }
 
       if (p_state_enhaacplus_dec->audio_object_type < ER_OBJECT_START ||
           (p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LD &&
-           p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_ELD)) {
+           p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_ELD &&
+           p_state_enhaacplus_dec->audio_object_type != AOT_ER_AAC_LC)) {
         if ((error_code == 0) && ((ch_idx1 + 1) == total_elements) &&
             (type != ID_END)) {
           {
-            p_state_enhaacplus_dec->i_bytes_consumed =
-                it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base;
+            p_state_enhaacplus_dec->i_bytes_consumed = (WORD32)(
+                it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base);
             p_state_enhaacplus_dec->b_n_raw_data_blk = 0;
-            return IA_ENHAACPLUS_DEC_EXE_NONFATAL_ELE_INSTANCE_TAG_NOT_FOUND;
+            if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+              p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+            } else {
+            return IA_XHEAAC_DEC_EXE_NONFATAL_ELE_INSTANCE_TAG_NOT_FOUND;
+          }
           }
         }
       }
@@ -2635,8 +3228,9 @@
         if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD ||
             p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD)
           frame_size = p_state_enhaacplus_dec->frame_length;
-        else
-          frame_size = 1024;
+        else {
+          frame_size = p_state_enhaacplus_dec->frame_length;
+        }
 
         sample_rate_dec =
             p_state_enhaacplus_dec->pstr_aac_dec_info[ch_idx]->sampling_rate;
@@ -2653,12 +3247,22 @@
 
     if (error_code) {
       if (p_state_enhaacplus_dec->ui_input_over) {
-        return IA_ENHAACPLUS_DEC_INIT_FATAL_EO_INPUT_REACHED;
+        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+          p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+        } else {
+          return IA_XHEAAC_DEC_INIT_FATAL_EO_INPUT_REACHED;
+        }
       }
       ixheaacd_updatebytesconsumed(p_state_enhaacplus_dec, it_bit_buff);
       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes +=
           p_state_enhaacplus_dec->num_of_out_samples * num_ch * sizeof(WORD16);
-      return error_code;
+      if (error_code) {
+        if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+          p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+        } else {
+          return error_code;
+        }
+      }
     }
 
     error_code = IA_NO_ERROR;
@@ -2667,21 +3271,24 @@
       if (p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0].no_elements == 0 &&
           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = 0;
-        error_code = IA_ENHAACPLUS_DEC_EXE_NONFATAL_SBR_TURNED_OFF;
+        error_code = IA_XHEAAC_DEC_EXE_NONFATAL_SBR_TURNED_OFF;
       }
     }
     if ((!p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) &&
         p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0].no_elements) {
-      error_code = IA_ENHAACPLUS_DEC_EXE_NONFATAL_SBR_TURNED_ON;
-
+      WORD32 harmonic_sbr_flag = 0;
+      error_code = IA_XHEAAC_DEC_EXE_NONFATAL_SBR_TURNED_ON;
       p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = ixheaacd_init_sbr(
           sample_rate_dec, frame_size,
           (FLAG *)&p_obj_exhaacplus_dec->aac_config.down_sample_flag,
           p_state_enhaacplus_dec->sbr_persistent_mem_v,
           p_state_enhaacplus_dec->ptr_overlap_buf, ps_enable ? 2 : channel,
-          ps_enable, 1, frame_size * 2, NULL, NULL,
+          ps_enable, 1, frame_size * 2, &harmonic_sbr_flag, NULL,
           p_state_enhaacplus_dec->str_sbr_config,
-          p_state_enhaacplus_dec->audio_object_type);
+          p_state_enhaacplus_dec->audio_object_type,
+          p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+              .ldmps_present_flag,
+          p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.no_ldsbr_present);
       if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
             &(p_state_enhaacplus_dec->xaac_jmp_buf);
@@ -2692,72 +3299,249 @@
       if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] &&
           p_state_enhaacplus_dec->pstr_stream_sbr[0][0].no_elements) {
         ia_sbr_scr_struct sbr_scratch_struct;
-        ixheaacd_allocate_sbr_scr(&sbr_scratch_struct,
-                                  p_state_enhaacplus_dec->aac_scratch_mem_v,
-                                  time_data, total_elements, ch_fac,
-                                  p_state_enhaacplus_dec->audio_object_type);
+        ixheaacd_allocate_sbr_scr(
+            &sbr_scratch_struct, p_state_enhaacplus_dec->aac_scratch_mem_v,
+            time_data, total_elements, ch_fac,
+            p_state_enhaacplus_dec->audio_object_type, total_channels,
+            p_obj_exhaacplus_dec->p_state_aac->qshift_adj,
+            p_state_enhaacplus_dec->slot_pos, channel);
 
-        if (ixheaacd_applysbr(
-                p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
-                &p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0],
-                actual_out_buffer, &num_ch,
-                p_obj_exhaacplus_dec->aac_config.frame_status,
-                p_obj_exhaacplus_dec->aac_config.down_sample_flag,
-                esbr_mono_downmix, &sbr_scratch_struct, ps_enable, ch_fac,
-                slot_ele, NULL, &p_state_enhaacplus_dec->str_drc_dec_info,
-                p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present,
-                p_state_enhaacplus_dec->audio_object_type) != SBRDEC_OK) {
+        p_state_enhaacplus_dec->sbr_present = 1;
+        p_state_enhaacplus_dec->peak_lim_init = 0;
+        {
+          WORD32 audio_object_type = p_state_enhaacplus_dec->audio_object_type;
+
+          if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD) {
+            WORD32 i = 0;
+            ia_dec_data_struct* pstr_dec_data =
+                (ia_dec_data_struct*)p_state_enhaacplus_dec->pstr_dec_data;
+            if (ch_fac == 1) {
+              for (; i < 1024; i++) {
+                pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
+                    (FLOAT32)time_data[i];
+              }
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
+                  &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
+
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
+                  &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
+            } else if (ch_fac == 2) {
+              for (; i < 1024; i++) {
+                pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
+                    (FLOAT32)time_data[2 * i + 0];
+                pstr_dec_data->str_usac_data.time_sample_vector[1][i] =
+                    (FLOAT32)time_data[2 * i + 1];
+              }
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
+                  &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
+
+              p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
+                  &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
+            } else if (ch_fac > 2) {
+              if (channel == 1) {
+                for (; i < 1024; i++) {
+                  pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
+                      (FLOAT32)(time_data + slot_ele)[i* ch_fac];
+                }
+                p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
+                    &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
+              } else if (channel == 2) {
+                for (; i < 1024; i++) {
+                  pstr_dec_data->str_usac_data.time_sample_vector[0][i] =
+                      (FLOAT32)(time_data + slot_ele)[ch_fac * i + 0];
+                  pstr_dec_data->str_usac_data.time_sample_vector[1][i] =
+                      (FLOAT32)(time_data + slot_ele)[ch_fac * i + 1];
+                }
+                p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[0] =
+                    &pstr_dec_data->str_usac_data.time_sample_vector[0][0];
+
+                p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->time_sample_buf[1] =
+                    &pstr_dec_data->str_usac_data.time_sample_vector[1][0];
+              }
+            }
+          }
+        }
+        p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->esbr_hq =
+            p_obj_exhaacplus_dec->aac_config.ui_hq_esbr;
+        p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->enh_sbr =
+            p_obj_exhaacplus_dec->aac_config.ui_enh_sbr;
+        p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->enh_sbr_ps =
+            p_obj_exhaacplus_dec->aac_config.ui_enh_sbr_ps;
+
+        if (p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
+          p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]->xaac_jmp_buf =
+              &(p_state_enhaacplus_dec->xaac_jmp_buf);
+        }
+
+        if (ixheaacd_applysbr(p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
+                              &p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx][0],
+                              actual_out_buffer, &num_ch,
+                              p_obj_exhaacplus_dec->aac_config.frame_status,
+                              p_obj_exhaacplus_dec->aac_config.down_sample_flag,
+                              esbr_mono_downmix, &sbr_scratch_struct, ps_enable, ch_fac, slot_ele,
+                              NULL, &p_state_enhaacplus_dec->str_drc_dec_info,
+                              p_state_enhaacplus_dec->eld_specific_config.ld_sbr_flag_present,
+                              p_state_enhaacplus_dec->audio_object_type, 0,
+                              p_state_enhaacplus_dec->ldmps_present, frame_size,
+                              p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present,
+                              p_obj_exhaacplus_dec->aac_config.ui_err_conceal,
+                              p_obj_exhaacplus_dec->aac_config.first_frame) != SBRDEC_OK) {
           p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] = 0;
-          return -1;
+          if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+            p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+          } else {
+            return -1;
+          }
         } else {
           if (!p_obj_exhaacplus_dec->aac_config.down_sample_flag) {
             frame_size = (WORD16)(frame_size * 2);
             sample_rate_dec *= 2;
           }
+          if (p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                  .ldmps_present_flag == 1) {
+            ixheaacd_mps_payload(
+                p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx],
+                p_obj_exhaacplus_dec);
+          }
         }
+        {
+          WORD32 audio_object_type = p_state_enhaacplus_dec->audio_object_type;
+
+          if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD) {
+            WORD32 out_bytes = 0;
+            ia_dec_data_struct *pstr_dec_data =
+                (ia_dec_data_struct *)p_state_enhaacplus_dec->pstr_dec_data;
+            if (ch_fac <= 2) {
+              ixheaacd_samples_sat((WORD8*)time_data, 2048, 16,
+                                   pstr_dec_data->str_usac_data.time_sample_vector,
+                                   &out_bytes, ch_fac);
+            } else {
+              ixheaacd_samples_sat_mc((WORD8*)(time_data + slot_ele), 2048,
+                                      pstr_dec_data->str_usac_data.time_sample_vector,
+                                      &out_bytes, channel, ch_fac);
+            }
+          }
+        }
+        p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.no_ldsbr_present =
+            0;
+        if (p_state_enhaacplus_dec->ui_mps_out_bytes > 0) {
+          p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present = 1;
+        }
+      } else {
+        p_state_enhaacplus_dec->mps_dec_handle.ldmps_config.no_ldsbr_present = 1;
+      }
+    }
+
+    if (p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+                .ldmps_present_flag == 1 &&
+         p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx] &&
+         p_state_enhaacplus_dec->mps_dec_handle.mps_init_done == 1) {
+      if (p_state_enhaacplus_dec->ec_enable) {
+        if (!p_obj_exhaacplus_dec->aac_config.first_frame) {
+          error_code = ixheaacd_ld_mps_apply(p_obj_exhaacplus_dec, actual_out_buffer);
+          if (error_code) p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+        }
+      } else {
+        error_code = ixheaacd_ld_mps_apply(p_obj_exhaacplus_dec, actual_out_buffer);
+
+        if (error_code)
+          return error_code;
       }
     }
     if (sample_rate < sample_rate_dec) {
       sample_rate = sample_rate_dec;
     }
 
+    if (p_state_enhaacplus_dec->sbr_present ||
+        p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] == LD_OBJ) {
+      num_of_out_samples = frame_size;
+
+    } else {
+      num_of_out_samples =
+          frame_size -
+          MIN((WORD16)p_obj_exhaacplus_dec->p_state_aac->delay_in_samples, frame_size);
+    }
+
+    if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal &&
+        p_obj_exhaacplus_dec->aac_config.first_frame &&
+        (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_ER_AAC_ELD ||
+         p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_ER_AAC_LD)) {
+      num_of_out_samples = frame_size;
+    }
+
     p_obj_exhaacplus_dec->aac_config.ui_samp_freq = sample_rate;
-    num_of_out_samples = frame_size;
 
     p_state_enhaacplus_dec->num_channel_last = num_ch;
     p_state_enhaacplus_dec->num_of_out_samples = num_of_out_samples;
 
-    if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] != 2)
-
-    {
-      if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 &&
-          channel == 1 && total_elements == 1 && num_ch == 1) {
-        WORD i;
-        num_ch = 2;
-
-        for (i = 0; i < frame_size; i++) {
-          actual_out_buffer[2 * i + 1] = actual_out_buffer[2 * i + 0];
+    if (p_state_enhaacplus_dec->mps_dec_handle.ldmps_config
+            .ldmps_present_flag == 1 &&
+        p_state_enhaacplus_dec->mps_dec_handle.mps_init_done == 1 &&
+        p_state_enhaacplus_dec->str_sbr_dec_info[ch_idx]) {
+      if (p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.output_buffer) {
+        ixheaacd_samples_sat((WORD8 *)actual_out_buffer, num_of_out_samples,
+                             p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz,
+                             p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.output_buffer,
+                             &mps_out_samples, 2);
+        p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = mps_out_samples;
+      }
+      num_ch = p_obj_exhaacplus_dec->p_state_aac->mps_dec_handle.out_ch_count;
+      if (p_state_enhaacplus_dec->ec_enable) {
+        if (p_obj_exhaacplus_dec->aac_config.first_frame) {
+          p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
+              p_state_enhaacplus_dec->num_of_out_samples * num_ch * sizeof(WORD16);
         }
       }
+    } else {
+      if (p_obj_exhaacplus_dec->aac_config.element_type[ch_idx] != 2) {
+        if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 &&
+          channel == 1 && total_elements == 1 && num_ch == 1) {
+        num_ch = 2;
+        p_obj_exhaacplus_dec->aac_config.dup_stereo_flag = 1;
 
-      p_obj_exhaacplus_dec->aac_config.ui_n_channels = num_ch;
+      } else {
+        p_obj_exhaacplus_dec->aac_config.dup_stereo_flag = 0;
+      }
+
+      p_obj_exhaacplus_dec->aac_config.ui_n_channels = 2;
 
       p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes +=
           p_state_enhaacplus_dec->num_of_out_samples * num_ch * sizeof(WORD16);
 
-    }
-
-    else {
+    } else {
       channel_coupling_flag = 1;
     }
   }
 
+    if (p_state_enhaacplus_dec->sbr_present && total_channels > 2) {
+      for (WORD32 j = 0; j < channel; j++) {
+        for (WORD32 i = 0; i < frame_size; i++) {
+          intermediate_scr[total_channels * i + j +
+                           p_state_enhaacplus_dec->slot_pos] =
+              actual_out_buffer[total_channels * i + j +
+                                p_state_enhaacplus_dec->slot_pos];
+        }
+      }
+    }
+  }
+
+  if (p_state_enhaacplus_dec->sbr_present && total_channels > 2) {
+    memcpy(time_data, intermediate_scr,
+           sizeof(WORD16) * frame_size * total_channels);
+  }
+
   {
     ia_adts_crc_info_struct *ptr_adts_crc_info =
         p_state_enhaacplus_dec->ptr_bit_stream->pstr_adts_crc_info;
     if (ptr_adts_crc_info->crc_active == 1) {
       if ((error_code = ixheaacd_adts_crc_check_crc(ptr_adts_crc_info))) {
-        return error_code;
+        if (error_code) {
+          if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+            p_obj_exhaacplus_dec->aac_config.frame_status = 0;
+          } else {
+            return error_code;
+          }
+        }
       }
     }
   }
@@ -2766,12 +3550,94 @@
 
   p_state_enhaacplus_dec->frame_counter++;
 
+  WORD32 i, j;
+
   if (channel_coupling_flag) {
     ixheaacd_dec_ind_coupling(p_obj_exhaacplus_dec,
                               p_state_enhaacplus_dec->coup_ch_output,
                               num_of_out_samples, total_channels, time_data);
   }
 
+  for (i = 0; i < total_channels; i++) {
+    if (p_obj_exhaacplus_dec->p_state_aac->qshift_adj[i + 1] == 0)
+      p_obj_exhaacplus_dec->p_state_aac->qshift_adj[i + 1] =
+          p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0];
+  }
+
+  if (p_obj_exhaacplus_dec->aac_config.flag_to_stereo == 1 &&
+      total_elements == 1 && num_ch == 2 &&
+      p_obj_exhaacplus_dec->aac_config.dup_stereo_flag == 1) {
+    WORD i;
+
+    if (!p_state_enhaacplus_dec->sbr_present &&
+        p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ) {
+      for (i = 0; i < frame_size; i++) {
+        *((WORD32 *)actual_out_buffer + 2 * i + 1) =
+            *((WORD32 *)actual_out_buffer + 2 * i);
+      }
+    } else {
+      for (i = 0; i < frame_size; i++) {
+        *(actual_out_buffer + 2 * i + 1) = *(actual_out_buffer + 2 * i);
+      }
+    }
+  }
+
+  if (!p_state_enhaacplus_dec->sbr_present &&
+      p_obj_exhaacplus_dec->p_state_aac->peak_lim_init == 1 &&
+      p_obj_exhaacplus_dec->p_state_aac->qshift_adj[0] != LD_OBJ) {
+    if (!p_obj_exhaacplus_dec->aac_config.peak_limiter_off) {
+      ixheaacd_peak_limiter_process(
+          &p_state_enhaacplus_dec->peak_limiter, time_data, frame_size,
+          p_obj_exhaacplus_dec->p_state_aac->qshift_adj);
+    } else {
+      ixheaacd_scale_adjust(time_data, frame_size,
+                            p_obj_exhaacplus_dec->p_state_aac->qshift_adj,
+                            total_channels);
+    }
+
+    for (i = 0; i < frame_size * 2; i++) {
+      for (j = 0; j < total_channels; j++) {
+        *((WORD16 *)time_data + total_channels * i + j) =
+            ixheaacd_round16(*((WORD32 *)time_data + total_channels * i + j));
+      }
+    }
+
+    memmove(
+        time_data,
+        (time_data +
+         total_channels * p_obj_exhaacplus_dec->p_state_aac->delay_in_samples),
+        sizeof(WORD16) * num_of_out_samples * total_channels);
+
+    p_obj_exhaacplus_dec->p_state_aac->delay_in_samples =
+        p_obj_exhaacplus_dec->p_state_aac->delay_in_samples -
+        MIN(p_obj_exhaacplus_dec->p_state_aac->delay_in_samples, (UWORD16)frame_size);
+  }
+  if (p_state_enhaacplus_dec->heaac_mps_handle.heaac_mps_present == 1) {
+    ia_heaac_mps_state_struct *pstr_mps_state =
+        &p_state_enhaacplus_dec->heaac_mps_handle;
+    if (p_state_enhaacplus_dec->sbr_present == 0) {
+      p_state_enhaacplus_dec->heaac_mps_handle.mps_decode = 1;
+    } else {
+      p_state_enhaacplus_dec->heaac_mps_handle.mps_with_sbr = 1;
+    }
+    if (p_state_enhaacplus_dec->heaac_mps_handle.mps_init_done == 1) {
+      p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.frame_ok =
+          p_obj_exhaacplus_dec->aac_config.frame_status;
+      p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.ec_flag =
+          p_obj_exhaacplus_dec->aac_config.ui_err_conceal;
+
+      ixheaacd_heaac_mps_apply(p_obj_exhaacplus_dec, actual_out_buffer,
+                               mps_buffer,
+                               p_state_enhaacplus_dec->ui_mps_out_bytes);
+
+      p_state_enhaacplus_dec->heaac_mps_handle.mps_decode = 1;
+      p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes =
+          (pstr_mps_state->num_output_channels_at *
+           pstr_mps_state->frame_length *
+           (p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz >> 3));
+      p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.first_frame = 0;
+    }
+  }
   if ((total_channels > 2) && (1 == p_obj_exhaacplus_dec->aac_config.downmix)) {
     ixheaacd_dec_downmix_to_stereo(p_obj_exhaacplus_dec, num_of_out_samples,
                                    total_elements, time_data, total_channels);
@@ -2808,7 +3674,7 @@
 
   if (p_state_enhaacplus_dec->s_adts_hdr_present) {
     if (adts.no_raw_data_blocks != 0) {
-      if (adts.protection_absent == 0) {
+      if (adts.protection_absent == 0 && it_bit_buff->cnt_bits >= 16) {
         adts.crc_check = ixheaacd_read_bits_buf(it_bit_buff, 16);
       }
     }
@@ -2819,7 +3685,19 @@
 
   if (p_state_enhaacplus_dec->bs_format == LOAS_BSFORMAT)
     p_state_enhaacplus_dec->i_bytes_consumed =
-        (audio_mux_length_bytes_last + (SIZE_T)bytes_for_sync);
+        (WORD32)(audio_mux_length_bytes_last + bytes_for_sync);
 
-  return error_code;
+  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal &&
+      p_obj_exhaacplus_dec->aac_config.first_frame) {
+    p_obj_exhaacplus_dec->aac_config.first_frame = 0;
+  }
+
+  if (p_obj_exhaacplus_dec->aac_config.ui_err_conceal) {
+    if (p_obj_exhaacplus_dec->aac_config.frame_status != 1) {
+      p_state_enhaacplus_dec->i_bytes_consumed = p_state_enhaacplus_dec->ui_in_bytes;
+    }
+    return IA_NO_ERROR;
+  } else {
+    return error_code;
+  }
 }
diff --git a/decoder/ixheaacd_apicmd_standards.h b/decoder/ixheaacd_apicmd_standards.h
index 802585d..baa8f40 100644
--- a/decoder/ixheaacd_apicmd_standards.h
+++ b/decoder/ixheaacd_apicmd_standards.h
@@ -60,6 +60,7 @@
 #define IA_API_CMD_GET_TABLE_INFO_PRIORITY 0x001C
 #define IA_API_CMD_SET_TABLE_PTR 0x001D
 #define IA_API_CMD_GET_TABLE_PTR 0x001E
+#define IA_API_CMD_GET_LOUDNESS_VAL 0x001F
 
 /*****************************************************************************/
 /* Ittiam standard API command indices                                       */
diff --git a/decoder/ixheaacd_arith_dec.c b/decoder/ixheaacd_arith_dec.c
index 6c6069c..b44ab64 100644
--- a/decoder/ixheaacd_arith_dec.c
+++ b/decoder/ixheaacd_arith_dec.c
@@ -40,6 +40,8 @@
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 
@@ -1742,8 +1744,9 @@
   cumulative = ((((WORD32)(value - low + 1)) << 14) - ((WORD32)1)) / ((WORD32)range);
 
   if (it_bit_buff->cnt_bits == 0)
-    if (cumulative <= 0) return -1;
-
+    if (cumulative <= 0) {
+       longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    }
   p = cum_freq - 1;
 
   do {
@@ -1756,7 +1759,7 @@
     cfl >>= 1;
   } while (cfl > 1);
 
-  symbol = p - cum_freq + 1;
+  symbol = (WORD32)(p - cum_freq + 1);
 
   if (symbol) high = low + ((range * cum_freq[symbol - 1]) >> 14) - 1;
 
@@ -1795,9 +1798,8 @@
   return bit_count;
 }
 
-WORD32 ixheaacd_arth_decoding_level2(ia_bit_buf_struct *it_bit_buff,
-                                     WORD8 *c_prev, WORD8 *c_pres, WORD32 n,
-                                     WORD32 pres_n, WORD32 *quant) {
+VOID ixheaacd_arth_decoding_level2(ia_bit_buf_struct *it_bit_buff, WORD8 *c_prev, WORD8 *c_pres,
+                                   WORD32 n, WORD32 pres_n, WORD32 *quant) {
   state_arith as;
   WORD32 a, b;
   WORD32 i, j, lev, pki, esc_nb;
@@ -1828,7 +1830,8 @@
       bit_count = ixheaacd_arith_decode(&it_bit_buff_temp, bit_count, &m, &as,
                                         ixheaacd_ari_cf_m[pki], 17);
       if (bit_count == -1) {
-        return -1;
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
       }
 
       if (m < ARITH_ESCAPE) {
@@ -1858,13 +1861,20 @@
         bit_count = ixheaacd_arith_decode(&it_bit_buff_temp, bit_count, &m, &as,
                                           ixheaacd_ari_cf_r[lsbidx], 4);
         if (bit_count == -1) {
-          return -1;
+          longjmp(*(it_bit_buff->xaac_jmp_buf),
+                  IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
         }
         a = (a << 1) | (m & 1);
         b = (b << 1) | ((m >> 1) & 1);
       }
-      if ((a > (8183)) || (b > (8183))) return -1;
-      if ((a < (-8183)) || (b < (-8183))) return -1;
+      if ((a > (8183)) || (b > (8183))) {
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+      }
+      if ((a < (-8183)) || (b < (-8183))) {
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+      }
       quant[2 * i + 0] = a;
       quant[2 * i + 1] = b;
       temp = a + b + 1;
@@ -1876,8 +1886,9 @@
   }
 
   bit_count -= 16 - 2;
-  if (bit_count > it_bit_buff->cnt_bits)
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+  if (bit_count > it_bit_buff->cnt_bits) {
+    longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+  }
 
   if (bit_count > 0) {
     bit_count_5 = bit_count >> 5;
@@ -1903,12 +1914,16 @@
       m = (m << 1) * temp1;
       temp1 = m - (temp1);
     }
-    if ((temp0 > (8183)) || (temp1 > (8183))) return -1;
-    if ((temp0 < (-8183)) || (temp1 < (-8183))) return -1;
+    if ((temp0 > (8183)) || (temp1 > (8183))) {
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    }
+    if ((temp0 < (-8183)) || (temp1 < (-8183))) {
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    }
     *quant++ = temp0;
     *quant++ = temp1;
   }
-  return 0;
+  return;
 }
 
 static WORD32 ixheaacd_randomsign_fix(UWORD32 *seed) {
@@ -2075,7 +2090,6 @@
 
   WORD32 *x_ac_dec = usac_data->x_ac_dec;
   WORD32 sbk;
-  WORD32 err_code = 0;
 
   const WORD32 max_win_len = usac_data->pstr_sfb_info[ch]->max_win_len;
   WORD8 *c_prev = &usac_data->c_prev[ch][0];
@@ -2092,12 +2106,9 @@
 
   if (max_spec_coefficients > 0) {
     for (sbk = 0; sbk < max_win_len; sbk++) {
-      err_code = ixheaacd_arth_decoding_level2(
-          it_bit_buff, c_prev + 2, c_pres + 2, max_spec_coefficients / 2,
-          arith_pres_n / 2, &x_ac_dec[sbk * arith_pres_n]);
-      if (err_code != 0) {
-        return err_code;
-      }
+      ixheaacd_arth_decoding_level2(it_bit_buff, c_prev + 2, c_pres + 2,
+                                    max_spec_coefficients / 2, arith_pres_n / 2,
+                                    &x_ac_dec[sbk * arith_pres_n]);
 
       for (i = max_spec_coefficients / 2; i < arith_pres_n / 2; i++) {
         x_ac_dec[sbk * arith_pres_n + 2 * i + 0] = 0;
@@ -2116,14 +2127,13 @@
   return 0;
 }
 
-WORD32 ixheaacd_arith_data(ia_td_frame_data_struct *pstr_td_frame_data,
+VOID ixheaacd_arith_data(ia_td_frame_data_struct *pstr_td_frame_data,
                            WORD32 *x_ac_dec, ia_usac_data_struct *usac_data,
                            ia_bit_buf_struct *it_bit_buff,
                            WORD32 first_tcx_flag, WORD32 k) {
   WORD32 *arith_prev_n = &usac_data->arith_prev_n[usac_data->present_chan];
   WORD32 arith_reset_flag =
       first_tcx_flag && pstr_td_frame_data->arith_reset_flag;
-  WORD32 err_code = 0;
   WORD32 tcx_size = pstr_td_frame_data->tcx_lg[k];
   WORD8 *c_prev = usac_data->c_prev[usac_data->present_chan];
   WORD8 *c_pres = usac_data->c[usac_data->present_chan];
@@ -2137,9 +2147,8 @@
 
   *arith_prev_n = tcx_size;
 
-  err_code =
-      ixheaacd_arth_decoding_level2(it_bit_buff, c_prev + 2, c_pres + 2,
-                                    tcx_size / 2, tcx_size / 2, x_ac_dec);
+  ixheaacd_arth_decoding_level2(it_bit_buff, c_prev + 2, c_pres + 2, tcx_size / 2, tcx_size / 2,
+                                x_ac_dec);
 
-  return err_code;
+  return;
 }
diff --git a/decoder/ixheaacd_arith_dec.h b/decoder/ixheaacd_arith_dec.h
index 9c58b06..36b01c8 100644
--- a/decoder/ixheaacd_arith_dec.h
+++ b/decoder/ixheaacd_arith_dec.h
@@ -27,7 +27,7 @@
                                  ia_bit_buf_struct *it_bit_buff, UWORD8 max_sfb,
                                  WORD32 reset, WORD32 noise_filling, WORD32 ch);
 
-WORD32 ixheaacd_arith_data(ia_td_frame_data_struct *pstr_td_frame_data,
+VOID ixheaacd_arith_data(ia_td_frame_data_struct *pstr_td_frame_data,
                            WORD32 *quant, ia_usac_data_struct *usac_data,
                            ia_bit_buf_struct *it_bit_buff,
                            WORD32 first_tcx_flag, WORD32 k);
diff --git a/decoder/ixheaacd_basic_op.h b/decoder/ixheaacd_basic_op.h
index d0e4720..7a6f0ff 100644
--- a/decoder/ixheaacd_basic_op.h
+++ b/decoder/ixheaacd_basic_op.h
@@ -24,56 +24,4 @@
 #define sub_d(a, b) ((a) - (b))
 #define ixheaacd_cbrt_calc(a) cbrt(1.0f / a)
 
-static PLATFORM_INLINE WORD32 msu32x16in32_dual(WORD32 a, WORD16 c1, WORD32 b,
-                                                WORD16 c2) {
-  WORD32 result;
-  WORD32 temp_result;
-  UWORD32 a_lsb;
-  WORD32 a_msb;
-  UWORD32 b_lsb;
-  WORD32 b_msb;
-
-  a_lsb = a & 65535;
-  a_msb = a >> 16;
-
-  b_lsb = b & 65535;
-  b_msb = b >> 16;
-  temp_result = ((UWORD32)a_lsb * (UWORD32)c1);
-  temp_result = temp_result - (UWORD32)b_lsb * (UWORD32)c2;
-  temp_result = ((WORD32)temp_result) >> 16;
-  result = temp_result + ((a_msb * (WORD32)c1) - (b_msb * (WORD32)c2));
-
-  return (result);
-}
-
-static PLATFORM_INLINE WORD32 mac32x16in32_dual(WORD32 a, WORD16 c1, WORD32 b,
-                                                WORD16 c2) {
-  WORD32 result;
-  WORD32 temp_result;
-  UWORD32 a_lsb;
-  WORD32 a_msb;
-  UWORD32 b_lsb;
-  WORD32 b_msb;
-
-  a_lsb = a & 65535;
-  a_msb = a >> 16;
-
-  b_lsb = b & 65535;
-  b_msb = b >> 16;
-  temp_result = (UWORD32)a_lsb * (UWORD32)c1;
-  temp_result = temp_result + (UWORD32)b_lsb * (UWORD32)c2;
-  temp_result = ((UWORD32)temp_result) >> 16;
-  result = temp_result + ((a_msb * (WORD32)c1)) + ((b_msb * (WORD32)c2));
-  return (result);
-}
-
-static PLATFORM_INLINE WORD64 mac32x32in64_dual(WORD32 a, WORD32 b, WORD64 c) {
-  WORD64 result;
-  WORD64 temp_result;
-
-  temp_result = (WORD64)a * (WORD64)b;
-  result = c + (temp_result);
-  return (result);
-}
-
 #endif
diff --git a/decoder/ixheaacd_basic_ops16.h b/decoder/ixheaacd_basic_ops16.h
index 4ccc336..1503d31 100644
--- a/decoder/ixheaacd_basic_ops16.h
+++ b/decoder/ixheaacd_basic_ops16.h
@@ -114,7 +114,7 @@
   return (var_out);
 }
 
-static PLATFORM_INLINE WORD16 shl16_dir(WORD16 op1, WORD16 shift) {
+static PLATFORM_INLINE WORD16 ixheaacd_shl16_dir(WORD16 op1, WORD16 shift) {
   WORD16 var_out;
   if (shift > 0) {
     var_out = ixheaacd_shl16(op1, shift);
@@ -124,7 +124,7 @@
   return (var_out);
 }
 
-static PLATFORM_INLINE WORD16 shr16_dir(WORD16 op1, WORD16 shift) {
+static PLATFORM_INLINE WORD16 ixheaacd_shr16_dir(WORD16 op1, WORD16 shift) {
   WORD16 var_out;
 
   if (shift < 0) {
@@ -135,7 +135,7 @@
   return (var_out);
 }
 
-static PLATFORM_INLINE WORD16 shl16_dir_sat(WORD16 op1, WORD16 shift) {
+static PLATFORM_INLINE WORD16 ixheaacd_shl16_dir_sat(WORD16 op1, WORD16 shift) {
   WORD16 var_out;
   if (shift > 0) {
     var_out = ixheaacd_shl16_sat(op1, shift);
@@ -156,7 +156,7 @@
   return (var_out);
 }
 
-static PLATFORM_INLINE WORD16 norm16(WORD16 op1) {
+static PLATFORM_INLINE WORD16 ixheaacd_norm16(WORD16 op1) {
   WORD16 var_out;
 
   if (0 == op1) {
@@ -177,13 +177,6 @@
   return (var_out);
 }
 
-static PLATFORM_INLINE WORD16 bin_expo16(WORD16 op1) {
-  WORD16 var_out;
-
-  var_out = ((WORD16)(15 - norm16(op1)));
-  return (var_out);
-}
-
 static PLATFORM_INLINE WORD16 ixheaacd_abs16(WORD16 op1) {
   WORD16 var_out;
 
@@ -235,93 +228,6 @@
   return (var_out);
 }
 
-static PLATFORM_INLINE WORD16 div16(WORD16 op1, WORD16 op2, WORD16 *q_format) {
-  WORD32 quotient;
-  UWORD16 mantissa_nr, mantissa_dr;
-  WORD16 sign = 0;
-
-  LOOPIDX i;
-  WORD16 q_nr, q_dr;
-
-  mantissa_nr = op1;
-  mantissa_dr = op2;
-  quotient = 0;
-
-  if (op1 < 0 && op2 != 0) {
-    op1 = -op1;
-    sign = (WORD16)(sign ^ -1);
-  }
-
-  if (op2 < 0) {
-    op2 = -op2;
-    sign = (WORD16)(sign ^ -1);
-  }
-
-  if (op2 == 0) {
-    *q_format = 0;
-    return (op1);
-  }
-
-  quotient = 0;
-
-  q_nr = norm16(op1);
-  mantissa_nr = (UWORD16)op1 << (q_nr);
-  q_dr = norm16(op2);
-  mantissa_dr = (UWORD16)op2 << (q_dr);
-  *q_format = (WORD16)(14 + q_nr - q_dr);
-
-  for (i = 0; i < 15; i++) {
-    quotient = quotient << 1;
-
-    if (mantissa_nr >= mantissa_dr) {
-      mantissa_nr = mantissa_nr - mantissa_dr;
-      quotient += 1;
-    }
-
-    mantissa_nr = (UWORD32)mantissa_nr << 1;
-  }
-
-  if (sign < 0) {
-    quotient = -quotient;
-  }
-
-  return (WORD16)quotient;
-}
-
-static PLATFORM_INLINE WORD16 mac16(WORD16 c, WORD16 op1, WORD16 op2) {
-  WORD16 var_out;
-
-  var_out = ixheaacd_mult16(op1, op2);
-  var_out = ixheaacd_add16(c, var_out);
-  return (var_out);
-}
-
-static PLATFORM_INLINE WORD16 mac16_sat(WORD16 c, WORD16 op1, WORD16 op2) {
-  WORD16 var_out;
-
-  var_out = ixheaacd_mult16(op1, op2);
-  var_out = ixheaacd_add16_sat(c, var_out);
-  return (var_out);
-}
-
-static PLATFORM_INLINE WORD16 mac16_shl(WORD16 c, WORD16 op1, WORD16 op2) {
-  WORD16 var_out;
-
-  var_out = ixheaacd_mult16_shl(op1, op2);
-  var_out = ixheaacd_add16(c, var_out);
-  return (var_out);
-}
-
-static PLATFORM_INLINE WORD16 mac16_shl_sat(WORD16 c, WORD16 op1, WORD16 op2) {
-  WORD16 var_out;
-  WORD32 temp;
-
-  temp = ((WORD32)op1 * (WORD32)op2) >> 15;
-  temp += c;
-  var_out = ixheaacd_sat16(temp);
-  return (var_out);
-}
-
 static PLATFORM_INLINE WORD16 ixheaacd_round16(WORD32 op1) {
   WORD16 var_out;
 
diff --git a/decoder/ixheaacd_basic_ops32.h b/decoder/ixheaacd_basic_ops32.h
index 365bfbe..af605f4 100644
--- a/decoder/ixheaacd_basic_ops32.h
+++ b/decoder/ixheaacd_basic_ops32.h
@@ -111,7 +111,7 @@
   return out_val;
 }
 
-static PLATFORM_INLINE WORD32 shr32_dir_sat(WORD32 a, WORD b) {
+static PLATFORM_INLINE WORD32 ixheaacd_shr32_dir_sat(WORD32 a, WORD b) {
   WORD32 out_val;
 
   if (b < 0) {
@@ -131,12 +131,32 @@
   return product;
 }
 
-static PLATFORM_INLINE WORD32 mult16x16in32_32(WORD32 a, WORD32 b) {
-  WORD32 product;
+static PLATFORM_INLINE WORD32 ixheaacd_mult32x16hin32(WORD32 a, WORD32 b) {
+  WORD32 result;
+  WORD64 temp_result;
 
-  product = (WORD32)a * (WORD32)b;
+  temp_result = (WORD64)(a) * (WORD64)(b >> 16);
+  result = (WORD32)(temp_result >> 16);
 
-  return product;
+  return (result);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_sat(WORD32 a, WORD16 b) {
+  WORD32 result;
+  WORD64 temp_result;
+
+  temp_result = (WORD64)a * (WORD64)b;
+
+  if (temp_result < (WORD64)MIN_32)
+    result = MIN_32;
+
+  else if (temp_result > (WORD64)MAX_32)
+    result = MAX_32;
+
+  else
+    result = (WORD32)(temp_result);
+
+  return(result);
 }
 
 static PLATFORM_INLINE WORD32 ixheaacd_mult16x16in32_shl(WORD16 a, WORD16 b) {
@@ -250,14 +270,6 @@
   return norm_val;
 }
 
-static PLATFORM_INLINE WORD bin_expo32(WORD32 a) {
-  WORD bin_expo_val;
-
-  bin_expo_val = 31 - ixheaacd_norm32(a);
-
-  return bin_expo_val;
-}
-
 static PLATFORM_INLINE WORD32 ixheaacd_abs32(WORD32 a) {
   WORD32 abs_val;
 
@@ -315,7 +327,8 @@
   return neg_val;
 }
 
-static PLATFORM_INLINE WORD32 div32(WORD32 a, WORD32 b, WORD *q_format) {
+static PLATFORM_INLINE WORD32 ixheaacd_div32(WORD32 a, WORD32 b,
+                                             WORD *q_format) {
   WORD32 quotient;
   UWORD32 mantissa_nr, mantissa_dr;
   WORD16 sign = 0;
@@ -368,6 +381,27 @@
   return quotient;
 }
 
+static PLATFORM_INLINE WORD32 ixheaacd_shr32_sat(WORD32 a, WORD32 b) {
+  WORD32 out_val;
+
+  b = ((UWORD32)(b << 24) >> 24);
+  if (b >= 31) {
+    if (a < 0)
+      out_val = -1;
+    else
+      out_val = 0;
+  }
+  else if (b <= 0) {
+    return a;
+  }
+  else {
+    a = ixheaacd_add32_sat(a, (1 << (b - 1)));
+    out_val = (WORD32)a >> b;
+  }
+
+  return out_val;
+}
+
 static PLATFORM_INLINE WORD32 ixheaacd_mac16x16in32_sat(WORD32 a, WORD16 b,
                                                         WORD16 c) {
   WORD32 acc;
@@ -379,16 +413,6 @@
   return acc;
 }
 
-static PLATFORM_INLINE WORD32 mac16x16hin32(WORD32 a, WORD32 b, WORD32 c) {
-  WORD32 acc;
-
-  acc = ixheaacd_mult16x16in32((WORD16)b, (WORD16)(c >> 16));
-
-  acc = ixheaacd_add32(a, acc);
-
-  return acc;
-}
-
 static PLATFORM_INLINE WORD32 ixheaacd_mac16x16in32_shl(WORD32 a, WORD16 b,
                                                         WORD16 c) {
   WORD32 acc;
@@ -411,7 +435,7 @@
   return acc;
 }
 
-static PLATFORM_INLINE WORD32 msu16x16in32(WORD32 a, WORD16 b, WORD16 c) {
+static PLATFORM_INLINE WORD32 ixheaacd_msu16x16in32(WORD32 a, WORD16 b, WORD16 c) {
   WORD32 acc;
 
   acc = ixheaacd_mult16x16in32(b, c);
@@ -421,46 +445,4 @@
   return acc;
 }
 
-static PLATFORM_INLINE WORD32 msu16x16in32_shl(WORD32 a, WORD16 b, WORD16 c) {
-  WORD32 acc;
-
-  acc = ixheaacd_mult16x16in32_shl(b, c);
-
-  acc = ixheaacd_sub32(a, acc);
-
-  return acc;
-}
-
-static PLATFORM_INLINE WORD32 msu16x16in32_shl_sat(WORD32 a, WORD16 b,
-                                                   WORD16 c) {
-  WORD32 acc;
-
-  acc = ixheaacd_mult16x16in32_shl_sat(b, c);
-
-  acc = ixheaacd_sub32_sat(a, acc);
-
-  return acc;
-}
-
-static PLATFORM_INLINE WORD32 add32_shr(WORD32 a, WORD32 b) {
-  WORD32 sum;
-
-  a = ixheaacd_shr32(a, 1);
-  b = ixheaacd_shr32(b, 1);
-
-  sum = ixheaacd_add32(a, b);
-
-  return sum;
-}
-
-static PLATFORM_INLINE WORD32 sub32_shr(WORD32 a, WORD32 b) {
-  WORD32 diff;
-
-  a = ixheaacd_shr32(a, 1);
-  b = ixheaacd_shr32(b, 1);
-
-  diff = ixheaacd_sub32(a, b);
-
-  return diff;
-}
-#endif
\ No newline at end of file
+#endif
diff --git a/decoder/ixheaacd_basic_ops40.h b/decoder/ixheaacd_basic_ops40.h
index c8a308c..e78b8e1 100644
--- a/decoder/ixheaacd_basic_ops40.h
+++ b/decoder/ixheaacd_basic_ops40.h
@@ -19,47 +19,6 @@
 */
 #ifndef IXHEAACD_BASIC_OPS40_H
 #define IXHEAACD_BASIC_OPS40_H
-#define lo64(a) (((unsigned *)&a)[0])
-#define hi64(a) (((WORD32 *)&a)[1])
-
-static PLATFORM_INLINE WORD16 norm40(WORD40 *in) {
-  WORD16 expo;
-  WORD32 tempo;
-
-  if (0 == (*in)) return 31;
-
-  if (((*in) <= 0x7fffffff) && ((WORD40)(*in) >= (WORD40)0xFFFFFFFF80000000)) {
-    tempo = (WORD32)(*in);
-    expo = ixheaacd_norm32(tempo);
-    *in = tempo << expo;
-
-    return (expo);
-  }
-
-  tempo = (WORD32)((*in) >> 31);
-  expo = 31 - (ixheaacd_norm32(tempo));
-  *in = (*in) >> expo;
-
-  return (-expo);
-}
-
-static PLATFORM_INLINE WORD32 add32_shr40(WORD32 a, WORD32 b) {
-  WORD40 sum;
-
-  sum = (WORD40)a + (WORD40)b;
-  sum = sum >> 1;
-
-  return ((WORD32)sum);
-}
-
-static PLATFORM_INLINE WORD32 sub32_shr40(WORD32 a, WORD32 b) {
-  WORD40 sum;
-
-  sum = (WORD40)a - (WORD40)b;
-  sum = sum >> 1;
-
-  return ((WORD32)sum);
-}
 
 static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_shl(WORD32 a, WORD16 b) {
   WORD32 result;
@@ -72,17 +31,18 @@
   return (result << 1);
 }
 
-static PLATFORM_INLINE WORD32 mult32x16hin32_shl(WORD32 a, WORD32 b) {
-  WORD32 product;
-  WORD64 temp_product;
+static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32(WORD32 a, WORD16 b) {
+  WORD32 result;
+  WORD64 temp_result;
 
-  temp_product = (WORD64)a * (WORD64)(b >> 16);
-  product = (WORD32)(temp_product >> 16);
+  temp_result = (WORD64)a * (WORD64)b;
 
-  return (product << 1);
+  result = (WORD32)(temp_result >> 16);
+
+  return (result);
 }
 
-static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32(WORD32 a, WORD16 b) {
+static PLATFORM_INLINE WORD32 ixheaacd_mult32x32in32(WORD32 a, WORD32 b) {
   WORD32 result;
   WORD64 temp_result;
 
@@ -156,9 +116,12 @@
   return (result);
 }
 
-static PLATFORM_INLINE WORD32 ixheaacd_mac32x16in32_shl_sat(WORD32 a, WORD32 b,
-                                                            WORD16 c) {
-  return (ixheaacd_add32_sat(a, ixheaacd_mult32x16in32_shl_sat(b, c)));
+static PLATFORM_INLINE WORD32 ixheaacd_mac32x16in32_shl_sat(WORD32 a, WORD32 b, WORD16 c) {
+  WORD32 result;
+
+  result = ixheaacd_add32_sat(a, ixheaacd_mult32x16in32_shl_sat(b, c));
+
+  return (result);
 }
 
 static PLATFORM_INLINE WORD32 ixheaacd_mac32(WORD32 a, WORD32 b, WORD32 c) {
@@ -169,115 +132,6 @@
   return (result);
 }
 
-static PLATFORM_INLINE WORD32 mac32_shl(WORD32 a, WORD32 b, WORD32 c) {
-  WORD32 result;
-
-  result = a + ixheaacd_mult32_shl(b, c);
-
-  return (result);
-}
-
-static PLATFORM_INLINE WORD32 mac32_shl_sat(WORD32 a, WORD32 b, WORD32 c) {
-  return (ixheaacd_add32_sat(a, ixheaacd_mult32_shl_sat(b, c)));
-}
-
-static PLATFORM_INLINE WORD32 msu32x16in32(WORD32 a, WORD32 b, WORD16 c) {
-  WORD32 result;
-
-  result = a - ixheaacd_mult32x16in32(b, c);
-
-  return (result);
-}
-
-static PLATFORM_INLINE WORD32 msu32x16in32_shl(WORD32 a, WORD32 b, WORD16 c) {
-  WORD32 result;
-
-  result = a - ixheaacd_mult32x16in32_shl(b, c);
-
-  return (result);
-}
-
-static PLATFORM_INLINE WORD32 msu32x16in32_shl_sat(WORD32 a, WORD32 b,
-                                                   WORD16 c) {
-  return (ixheaacd_sub32_sat(a, ixheaacd_mult32x16in32_shl_sat(b, c)));
-}
-
-static PLATFORM_INLINE WORD32 msu32(WORD32 a, WORD32 b, WORD32 c) {
-  WORD32 result;
-
-  result = a - ixheaacd_mult32(b, c);
-
-  return (result);
-}
-
-static PLATFORM_INLINE WORD32 msu32_shl(WORD32 a, WORD32 b, WORD32 c) {
-  WORD32 result;
-
-  result = a - ixheaacd_mult32_shl(b, c);
-
-  return (result);
-}
-
-static PLATFORM_INLINE WORD32 msu32_shl_sat(WORD32 a, WORD32 b, WORD32 c) {
-  return (ixheaacd_sub32_sat(a, ixheaacd_mult32_shl_sat(b, c)));
-}
-
-static PLATFORM_INLINE WORD32 mac3216_arr40(WORD32 *x, WORD16 *y,
-                                            LOOPINDEX length, WORD16 *q_val) {
-  LOOPINDEX i;
-  WORD40 sum = 0;
-
-  for (i = 0; i < length; i++) {
-    sum += (WORD40)(ixheaacd_mult32x16in32(x[i], y[i]));
-  }
-
-  *q_val = norm40(&sum);
-
-  return (WORD32)sum;
-}
-
-static PLATFORM_INLINE WORD32 mac32_arr40(WORD32 *x, WORD32 *y,
-                                          LOOPINDEX length, WORD16 *q_val) {
-  LOOPINDEX i;
-  WORD40 sum = 0;
-
-  for (i = 0; i < length; i++) {
-    sum += (WORD40)(ixheaacd_mult32(x[i], y[i]));
-  }
-
-  *q_val = norm40(&sum);
-
-  return ((WORD32)sum);
-}
-
-static PLATFORM_INLINE WORD32 mac16_arr40(WORD16 *x, WORD16 *y,
-                                          LOOPINDEX length, WORD16 *q_val) {
-  LOOPINDEX i;
-  WORD40 sum = 0;
-
-  for (i = 0; i < length; i++) {
-    sum += (WORD40)((WORD32)x[i] * (WORD32)y[i]);
-  }
-
-  *q_val = norm40(&sum);
-
-  return ((WORD32)sum);
-}
-
-static PLATFORM_INLINE WORD32 add32_arr40(WORD32 *in_arr, LOOPINDEX length,
-                                          WORD16 *q_val) {
-  LOOPINDEX i;
-  WORD40 sum = 0;
-
-  for (i = 0; i < length; i++) {
-    sum += (WORD40)in_arr[i];
-  }
-
-  *q_val = norm40(&sum);
-
-  return ((WORD32)sum);
-}
-
 static PLATFORM_INLINE WORD64 ixheaacd_mult32x32in64(WORD32 a, WORD32 b) {
   WORD64 result;
 
@@ -351,9 +205,9 @@
     result = MAX_32;
   } else if (a <= MIN_32) {
     result = MIN_32;
-  } else
+  } else {
     result = (WORD32)a;
-
+  }
   return (result);
 }
 
@@ -396,4 +250,14 @@
   return (result);
 }
 
+static PLATFORM_INLINE WORD32 ixheaacd_mult32x16hin32_shl(WORD32 a, WORD32 b) {
+  WORD32 product;
+  WORD64 temp_product;
+
+  temp_product = (WORD64)a * (WORD64)(b >> 16);
+  product = (WORD32)(temp_product >> 16);
+
+  return (product << 1);
+}
+
 #endif
diff --git a/decoder/ixheaacd_basic_ops_arr.h b/decoder/ixheaacd_basic_ops_arr.h
index 2002501..69108a8 100644
--- a/decoder/ixheaacd_basic_ops_arr.h
+++ b/decoder/ixheaacd_basic_ops_arr.h
@@ -39,7 +39,7 @@
     max_bits = max_bits | ixheaacd_abs16_sat(word16_arr[i]);
   }
 
-  return (norm16(max_bits));
+  return (ixheaacd_norm16(max_bits));
 }
 
 static PLATFORM_INLINE VOID shl32_arr(WORD32 *word32_arr, WORD16 shift,
@@ -103,7 +103,7 @@
   WORD32 i;
 
   for (i = 0; i < n; i++) {
-    word32_arr[i] = shr32_dir_sat(word32_arr[i], shift);
+    word32_arr[i] = ixheaacd_shr32_dir_sat(word32_arr[i], shift);
   }
 
   return;
@@ -149,7 +149,7 @@
   WORD32 i;
 
   for (i = 0; i < n; i++) {
-    word16_arr[i] = shl16_dir(word16_arr[i], shift);
+    word16_arr[i] = ixheaacd_shl16_dir(word16_arr[i], shift);
   }
 
   return;
@@ -160,7 +160,7 @@
   WORD32 i;
 
   for (i = 0; i < n; i++) {
-    word16_arr[i] = shr16_dir(word16_arr[i], shift);
+    word16_arr[i] = ixheaacd_shr16_dir(word16_arr[i], shift);
   }
 
   return;
@@ -171,7 +171,7 @@
   WORD32 i;
 
   for (i = 0; i < n; i++) {
-    word16_arr[i] = shl16_dir_sat(word16_arr[i], shift);
+    word16_arr[i] = ixheaacd_shl16_dir_sat(word16_arr[i], shift);
   }
 
   return;
diff --git a/decoder/ixheaacd_bit_extract.h b/decoder/ixheaacd_bit_extract.h
index 44fb4d2..7a7fd6e 100644
--- a/decoder/ixheaacd_bit_extract.h
+++ b/decoder/ixheaacd_bit_extract.h
@@ -54,12 +54,6 @@
                                 ia_bit_buf_struct *it_bit_buff,
                                 WORD32 nr_core_coder_channels);
 
-VOID usac_past_tw(ia_usac_data_struct *usac_data, WORD32 mod0, WORD32 i,
-                  ia_usac_lpd_decoder_handle st);
-
-VOID usac_td2buffer(FLOAT32 p_in_data[], ia_usac_data_struct *usac_data,
-                    WORD32 k, WORD32 mod0);
-
 WORD32 ixheaacd_lpd_channel_stream(ia_usac_data_struct *usac_data,
                                    ia_td_frame_data_struct *pstr_td_frame_data,
                                    ia_bit_buf_struct *it_bit_buff,
@@ -69,7 +63,7 @@
                              ia_td_frame_data_struct *pstr_td_frame_data,
                              ia_bit_buf_struct *it_bit_buff, WORD32 chan);
 
-IA_ERRORCODE ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, WORD32 *quant,
+VOID ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, WORD32 *quant,
                                  WORD32 k, WORD32 first_tcx_flag,
                                  ia_td_frame_data_struct *pstr_td_frame_data,
                                  ia_bit_buf_struct *it_bit_buff);
diff --git a/decoder/ixheaacd_bitbuffer.c b/decoder/ixheaacd_bitbuffer.c
index 8b203d4..d76317f 100644
--- a/decoder/ixheaacd_bitbuffer.c
+++ b/decoder/ixheaacd_bitbuffer.c
@@ -53,7 +53,7 @@
 
   if (it_bit_buff->cnt_bits < no_of_bits || it_bit_buff->cnt_bits < 0)
     longjmp(*(it_bit_buff->xaac_jmp_buf),
-            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
   it_bit_buff->cnt_bits -= no_of_bits;
 
   ptr_read_next += no_of_bits / 8;
@@ -81,7 +81,7 @@
   if (it_bit_buff->cnt_bits < no_of_bits || it_bit_buff->cnt_bits < 0 ||
       no_of_bits > 25) {
     longjmp(*(it_bit_buff->xaac_jmp_buf),
-            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
   }
 
   ret_val = (UWORD32)*ptr_read_next;
@@ -119,7 +119,7 @@
   if (it_bit_buff->cnt_bits < no_of_bits || it_bit_buff->cnt_bits < 0 ||
       no_of_bits > 25) {
     longjmp(*(it_bit_buff->xaac_jmp_buf),
-            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
   }
 
   it_bit_buff->cnt_bits -= no_of_bits;
@@ -217,7 +217,7 @@
 
   if (ptr_read_next < it_bit_buff->ptr_bit_buf_base) {
     longjmp(*(it_bit_buff->xaac_jmp_buf),
-            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
   }
 
   it_bit_buff->cnt_bits += no_of_bits;
@@ -240,7 +240,7 @@
 
   if (it_bit_buff->cnt_bits < no_of_bits || it_bit_buff->cnt_bits < 0) {
     longjmp(*(it_bit_buff->xaac_jmp_buf),
-            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
   }
 
   if (bit_pos >= 8) {
diff --git a/decoder/ixheaacd_bitbuffer.h b/decoder/ixheaacd_bitbuffer.h
index f3a23b6..089bed0 100644
--- a/decoder/ixheaacd_bitbuffer.h
+++ b/decoder/ixheaacd_bitbuffer.h
@@ -89,8 +89,6 @@
 
 } ia_bit_buf_struct;
 
-typedef struct ia_bit_buf_struct *ia_handle_bit_buf_struct;
-
 typedef struct ia_crc_bit_buf_struct *ia_crc_bit_buf_struct_handle;
 
 VOID ixheaacd_byte_align(ia_bit_buf_struct *it_bit_buff,
diff --git a/decoder/ixheaacd_block.c b/decoder/ixheaacd_block.c
index 2784edd..07aec63 100644
--- a/decoder/ixheaacd_block.c
+++ b/decoder/ixheaacd_block.c
@@ -17,6 +17,7 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
+#include <stdlib.h>
 #include "ixheaacd_sbr_common.h"
 #include "ixheaacd_type_def.h"
 
@@ -38,6 +39,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -55,47 +59,11 @@
 
 #include "ixheaacd_aacdec.h"
 
-static PLATFORM_INLINE WORD32 ixheaacd_shr32_drc(WORD32 a, WORD32 b) {
-  WORD32 out_val;
-
-  b = ((UWORD32)(b << 24) >> 24);
-  if (b == 0) {
-    out_val = a;
-  } else if (b >= 31) {
-    if (a < 0)
-      out_val = -1;
-    else
-      out_val = 0;
-  } else {
-    a += (1 << (b - 1));
-    out_val = (WORD32)a >> b;
-  }
-
-  return out_val;
-}
-
-static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_drc(WORD32 a, WORD16 b) {
-  WORD32 result;
-  WORD64 temp_result;
-
-  temp_result = (WORD64)a * (WORD64)b;
-
-  if (temp_result < (WORD64)MIN_32)
-    result = MIN_32;
-
-  else if (temp_result > (WORD64)MAX_32)
-    result = MAX_32;
-
-  else
-    result = (WORD32)(temp_result);
-
-  return (result);
-}
-static PLATFORM_INLINE WORD32 ixheaacd_mac32x16in32_drc(WORD32 a, WORD32 b,
+static PLATFORM_INLINE WORD32 ixheaacd_mac32x16in32_sat(WORD32 a, WORD32 b,
                                                         WORD16 c) {
   WORD32 acc;
 
-  acc = ixheaacd_mult32x16in32_drc(b, c);
+  acc = ixheaacd_mult32x16in32_sat(b, c);
 
   acc = ixheaacd_add32_sat(a, acc);
 
@@ -161,7 +129,7 @@
 static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word1(
     ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets,
     WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl,
-    WORD32 *ixheaacd_pow_table_Q13, const UWORD32 *idx_table) {
+    WORD32 *ixheaacd_pow_table_Q13, const UWORD32 *idx_table, WORD32 maximum_bins_short) {
   WORD32 sp1, sp2;
   WORD32 flush_cw;
   WORD32 i, value, norm_val, off;
@@ -317,12 +285,23 @@
         idx -= 2;
       } while (idx != 0);
 
-      spec_coef += (MAX_BINS_SHORT - offsets[1]);
+      if (maximum_bins_short == 120) {
+        spec_coef += (maximum_bins_short - offsets[1]);
+      } else {
+        spec_coef += (MAX_BINS_SHORT - offsets[1]);
+      }
+
       grp_idx--;
     } while (grp_idx != 0);
 
     offsets++;
-    spec_coef -= (MAX_BINS_SHORT * group_len);
+
+    if (maximum_bins_short == 120) {
+      spec_coef -= (maximum_bins_short * group_len);
+    } else {
+      spec_coef -= (MAX_BINS_SHORT * group_len);
+    }
+
     no_bands--;
   } while (no_bands >= 0);
 
@@ -500,7 +479,8 @@
 static PLATFORM_INLINE WORD ixheaacd_huffman_dec_quad(
     ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets,
     WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl,
-    WORD32 *ixheaacd_pow_table_Q13, WORD32 tbl_sign, const UWORD32 *idx_table) {
+    WORD32 *ixheaacd_pow_table_Q13, WORD32 tbl_sign, const UWORD32 *idx_table,
+    WORD32 maximum_bins_short) {
   WORD idx, grp_idx;
   WORD idx_len;
   WORD32 *spec_orig;
@@ -623,7 +603,12 @@
         idx -= 4;
       } while (idx != 0);
 
-      spec_coef += (MAX_BINS_SHORT - offsets[1]);
+      if (maximum_bins_short == 120) {
+        spec_coef += (maximum_bins_short - offsets[1]);
+      } else {
+        spec_coef += (MAX_BINS_SHORT - offsets[1]);
+      }
+
       grp_idx--;
     } while (grp_idx != 0);
     offsets++;
@@ -806,9 +791,7 @@
     ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets,
     WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl,
     WORD32 *ixheaacd_pow_table_Q13, WORD32 tbl_sign, const UWORD32 *idx_table,
-    WORD32 huff_mode)
-
-{
+    WORD32 huff_mode, WORD32 maximum_bins_short) {
   WORD idx, grp_idx;
   WORD len_idx;
   WORD16 index, length;
@@ -886,7 +869,11 @@
         idx -= 2;
       } while (idx != 0);
 
-      spec_coef += (MAX_BINS_SHORT - offsets[1]);
+      if (maximum_bins_short == 120)
+        spec_coef += (maximum_bins_short - offsets[1]);
+      else
+        spec_coef += (MAX_BINS_SHORT - offsets[1]);
+
       grp_idx--;
     } while (grp_idx != 0);
 
@@ -1011,7 +998,8 @@
 WORD ixheaacd_decode_huffman(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no,
                              WORD32 *spec_coef, WORD16 *sfb_offset, WORD start,
                              WORD sfb, WORD group_len,
-                             ia_aac_dec_tables_struct *ptr_aac_tables) {
+                             ia_aac_dec_tables_struct *ptr_aac_tables,
+                             WORD32 maximum_bins_short) {
   WORD ret_val = 0;
   WORD start_bit_pos = it_bit_buff->bit_pos;
   UWORD8 *start_read_pos = it_bit_buff->ptr_read_next;
@@ -1031,7 +1019,7 @@
 
     ret_val = ixheaacd_huffman_dec_word1(it_bit_buff, spec_coef, band_offset,
                                          no_bands, group_len, cb_table,
-                                         pow_table, idx_table);
+                                         pow_table, idx_table, maximum_bins_short);
 
   } else if (cb_no <= 4) {
     WORD32 tbl_sign = 0;
@@ -1041,7 +1029,7 @@
     }
     ret_val = ixheaacd_huffman_dec_quad(it_bit_buff, spec_coef, band_offset,
                                         no_bands, group_len, cb_table,
-                                        pow_table, tbl_sign, idx_table);
+                                        pow_table, tbl_sign, idx_table, maximum_bins_short);
   }
 
   else if (cb_no <= 10) {
@@ -1056,13 +1044,13 @@
     }
     ret_val = ixheaacd_huffman_dec_pair(
         it_bit_buff, spec_coef, band_offset, no_bands, group_len, cb_table,
-        pow_table, tbl_sign, idx_table, huff_mode);
+        pow_table, tbl_sign, idx_table, huff_mode, maximum_bins_short);
   }
 
   {
     WORD bits_cons;
-    bits_cons = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
-                (it_bit_buff->bit_pos - start_bit_pos);
+    bits_cons = (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
+                       (it_bit_buff->bit_pos - start_bit_pos));
     it_bit_buff->cnt_bits -= bits_cons;
   }
   return ret_val;
@@ -1116,24 +1104,42 @@
   {
     WORD bits_cons;
     if (it_bit_buff->bit_pos <= 7) {
-      bits_cons = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
-                  (it_bit_buff->bit_pos - start_bit_pos);
+      bits_cons = (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
+                         (it_bit_buff->bit_pos - start_bit_pos));
+      if (bits_cons > cnt_bits)
+      {
+        return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+      }
       it_bit_buff->cnt_bits = cnt_bits - bits_cons;
     } else {
       it_bit_buff->ptr_read_next += (it_bit_buff->bit_pos) >> 3;
       it_bit_buff->bit_pos = it_bit_buff->bit_pos & 0x7;
+      if ((SIZE_T)(it_bit_buff->ptr_read_next) > (SIZE_T)(it_bit_buff->ptr_bit_buf_end + 1))
+      {
+        it_bit_buff->ptr_read_next = it_bit_buff->ptr_bit_buf_end + 1;
+        return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+      }
 
-      bits_cons = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
-                  ((it_bit_buff->bit_pos - start_bit_pos));
+      bits_cons = (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
+                         (it_bit_buff->bit_pos - start_bit_pos));
       it_bit_buff->cnt_bits = cnt_bits - bits_cons;
     }
   }
   return ret_val;
 }
 
-void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_dec_copy_outsample(WORD32 *out_samples, WORD32 *p_overlap_buffer,
+                                 WORD32 size, WORD16 stride) {
+  WORD32 i;
+
+  for (i = 0; i < size; i++) {
+    out_samples[stride*i] = (ixheaacd_shl16_sat((WORD16)(p_overlap_buffer[i]), 1) << 14);
+  }
+}
+
+VOID ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, VOID *out_tmp,
                            const WORD16 *window, WORD16 q_shift, WORD16 size,
-                           WORD16 stride) {
+                           WORD16 stride , WORD slot_element) {
   WORD32 accu;
   WORD32 i;
   WORD16 rounding_fac = -0x2000;
@@ -1145,6 +1151,8 @@
   WORD32 *pwin1, *pwin2;
   WORD32 *pCoef = &coef[size * 2 - 1 - 0];
 
+  WORD16 * out  = (WORD16*)out_tmp - slot_element;
+
   pwin1 = &window_i[size - 1 - 0];
   pwin2 = &window_i[size + 0];
 
@@ -1171,7 +1179,7 @@
 
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_dir_sat_limit(
-            ixheaacd_mult32_shl(ixheaacd_negate32(coeff), win2), q_shift),
+            ixheaacd_mult32_shl(ixheaacd_negate32_sat(coeff), win2), q_shift),
         ixheaacd_mac32x16in32_shl(rounding_fac, win1, (WORD16)(prev_data)));
 
     accu = ixheaacd_add32_sat(accu, accu);
@@ -1182,12 +1190,12 @@
   }
 }
 
-VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                 const WORD16 *window, WORD16 q_shift,
                                 WORD16 size, WORD16 ch_fac) {
   WORD32 accu;
   WORD32 i;
-  WORD16 rounding_fac = -0x2000;
+  WORD16 rounding_fac = 0;
 
   for (i = 0; i < size; i++) {
     WORD16 window1, window2;
@@ -1197,17 +1205,15 @@
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_dir_sat_limit(
             ixheaacd_mult32x16in32(coef[size * 2 - 1 - i], window2), q_shift),
-        ixheaacd_mac32x16in32_drc(rounding_fac, prev[i], window1));
-    out[ch_fac * (size - i - 1)] =
-        ixheaacd_shr32(ixheaacd_shl32_dir_sat_limit(accu, 2), 16);
+        ixheaacd_mac32x16in32_sat(rounding_fac, prev[i], window1));
+    out[ch_fac * (size - i - 1)] = accu;
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_dir_sat_limit(
-            ixheaacd_mult32x16in32(ixheaacd_negate32(coef[size * 2 - 1 - i]),
+            ixheaacd_mult32x16in32(ixheaacd_negate32_sat(coef[size * 2 - 1 - i]),
                                    window1),
             q_shift),
-        ixheaacd_mac32x16in32_drc(rounding_fac, prev[i], window2));
-    out[ch_fac * (size + i)] =
-        ixheaacd_shr32(ixheaacd_shl32_dir_sat_limit(accu, 2), 16);
+        ixheaacd_mac32x16in32_sat(rounding_fac, prev[i], window2));
+    out[ch_fac * (size + i)] = accu;
   }
 }
 
@@ -1221,7 +1227,7 @@
     accu = ixheaacd_sub32_sat(
         ixheaacd_mult32x16in32(coef[size + i], window[2 * i]),
         ixheaacd_mult32x16in32(prev[size - 1 - i], window[2 * i + 1]));
-    out[ch_fac * i] = ixheaacd_shr32_drc(accu, 16 - (q_shift + 1));
+    out[ch_fac * i] = ixheaacd_shr32_sat(accu, 16 - (q_shift + 1));
   }
 
   for (i = 0; i < size; i++) {
@@ -1229,7 +1235,7 @@
         ixheaacd_mult32x16in32(ixheaacd_negate32_sat(coef[size * 2 - 1 - i]),
                                window[2 * size - 2 * i - 1]),
         ixheaacd_mult32x16in32(prev[i], window[2 * size - 2 * i - 2]));
-    out[ch_fac * (i + size)] = ixheaacd_shr32_drc(accu, 16 - (q_shift + 1));
+    out[ch_fac * (i + size)] = ixheaacd_shr32_sat(accu, 16 - (q_shift + 1));
   }
 }
 
@@ -1337,7 +1343,7 @@
   }
 }
 
-void ixheaacd_right_shift_block(WORD32 *p_spectrum, WORD32 length,
+VOID ixheaacd_right_shift_block(WORD32 *p_spectrum, WORD32 length,
                                 WORD32 shift_val) {
   WORD32 i;
   WORD32 temp1, temp2;
diff --git a/decoder/ixheaacd_block.h b/decoder/ixheaacd_block.h
index 739116c..cc7119e 100644
--- a/decoder/ixheaacd_block.h
+++ b/decoder/ixheaacd_block.h
@@ -47,13 +47,14 @@
                                          WORD32 object_type,
                                          WORD32 aac_sf_data_resil_flag);
 
-void ixheaacd_right_shift_block(WORD32 *p_spectrum, WORD length,
+VOID ixheaacd_right_shift_block(WORD32 *p_spectrum, WORD length,
                                 WORD shift_val);
 
 WORD ixheaacd_decode_huffman(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no,
                              WORD32 *spec_coef, WORD16 *sfb_offset, WORD start,
                              WORD sfb, WORD group_len,
-                             ia_aac_dec_tables_struct *ptr_aac_tables);
+                             ia_aac_dec_tables_struct *ptr_aac_tables,
+                             WORD32 maximum_bins_short);
 
 WORD ixheaacd_huffman_dec_word2(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no,
                                 WORD32 width,
@@ -78,15 +79,15 @@
     WORD32 aac_spect_data_resil_flag, WORD32 aac_sect_data_resil_flag,
     ia_aac_dec_tables_struct *ptr_aac_tables);
 
-VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                 const WORD16 *window, WORD16 q_shift,
                                 WORD16 size, WORD16 ch_fac);
 
-VOID ixheaacd_over_lap_add1_armv7(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_over_lap_add1_armv7(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                   const WORD16 *window, WORD16 q_shift,
                                   WORD16 size, WORD16 ch_fac);
 
-VOID ixheaacd_over_lap_add1_armv8(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_over_lap_add1_armv8(WORD32 *coef, WORD32 *prev, WORD32 *out,
                                   const WORD16 *window, WORD16 q_shift,
                                   WORD16 size, WORD16 ch_fac);
 
@@ -120,10 +121,10 @@
                                        WORD32 *ptr_spec_coeff, WORD32 q_shift,
                                        WORD32 size);
 
-VOID ixheaacd_overlap_buf_out_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf,
+VOID ixheaacd_overlap_buf_out_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
                                   WORD32 size, const WORD16 ch_fac);
 
-VOID ixheaacd_overlap_buf_out_armv7(WORD16 *out_samples,
+VOID ixheaacd_overlap_buf_out_armv7(WORD32 *out_samples,
                                     WORD32 *ptr_overlap_buf, WORD32 size,
                                     const WORD16 ch_fac);
 
@@ -131,38 +132,41 @@
 
 VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info,
                             WORD32 *ptr_spec_coeff,
-                            ia_ics_info_struct *ptr_ics_info,
-                            WORD16 out_samples[], const WORD16 ch_fac,
-                            WORD32 *scratch,
+                            ia_ics_info_struct *ptr_ics_info, VOID *out_samples,
+                            const WORD16 ch_fac, WORD32 *scratch,
                             ia_aac_dec_tables_struct *ptr_aac_tables,
-                            WORD32 object_type);
+                            WORD32 object_type, WORD32 ld_mps_present,
+                            WORD slot_element);
 
-VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift,
                                  WORD16 ch_fac);
 
-VOID ixheaacd_neg_shift_spec_armv7(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+VOID ixheaacd_nolap_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift,
+                        WORD16 ch_fac, WORD16 size_01);
+
+VOID ixheaacd_neg_shift_spec_armv7(WORD32 *coef, WORD32 *out, WORD16 q_shift,
                                    WORD16 ch_fac);
 
-VOID ixheaacd_neg_shift_spec_armv8(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+VOID ixheaacd_neg_shift_spec_armv8(WORD32 *coef, WORD32 *out, WORD16 q_shift,
                                    WORD16 ch_fac);
 
 VOID ixheaacd_nolap1_32(WORD32 *coef, WORD32 *out, WORD16 cu_scale,
-                        WORD16 stride);
+                        WORD16 stride, WORD16 size_01);
 
-VOID ixheaacd_overlap_out_copy_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf,
+VOID ixheaacd_overlap_out_copy_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
                                    WORD32 *ptr_overlap_buf1,
-                                   const WORD16 ch_fac);
+                                   const WORD16 ch_fac, WORD16 size_01);
 
-VOID ixheaacd_overlap_out_copy_armv7(WORD16 *out_samples,
+VOID ixheaacd_overlap_out_copy_armv7(WORD32 *out_samples,
                                      WORD32 *ptr_overlap_buf,
                                      WORD32 *ptr_overlap_buf1,
                                      const WORD16 ch_fac);
 
-VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD32 *out,
                                  const WORD16 *short_window,
                                  const WORD16 *short_window_prev,
                                  const WORD16 *long_window_prev, WORD16 q_shift,
-                                 WORD16 ch_fac);
+                                 WORD16 ch_fac, WORD16 size_01);
 
 WORD32 ixheaacd_cnt_leading_ones(WORD32 a);
 
@@ -170,20 +174,26 @@
                              WORD16 *len, const UWORD16 *input_table,
                              const UWORD32 *idx_table);
 
-void ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *ptr_win,
+VOID ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *ptr_win,
                                 WORD32 framesize, WORD16 q_shift,
                                 WORD32 *ptr_overlap_buf, const WORD16 stride,
-                                WORD16 *out_samples);
+                                VOID *out_samples, WORD slot_element);
 
-WORD32 ixheaacd_extension_payload(ia_bit_buf_struct *it_bit_buff, WORD32 cnt);
+VOID ixheaacd_eld_dec_windowing_32bit(WORD32 *ptr_spect_coeff,
+                                      const WORD16 *ptr_win, WORD32 framesize,
+                                      WORD16 q_shift, WORD32 *ptr_overlap_buf,
+                                      const WORD16 stride, WORD32 *out_samples);
 
 VOID ixheaacd_process_single_scf(WORD32 scale_factor, WORD32 *x_invquant,
                                  WORD32 width, WORD32 *ptr_scale_table,
                                  WORD32 total_channels, WORD32 object_type,
                                  WORD32 aac_sf_data_resil_flag);
 
-void ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, VOID *out_tmp,
                            const WORD16 *window, WORD16 q_shift, WORD16 size,
-                           WORD16 stride);
+                           WORD16 stride, WORD slot_element);
+
+VOID ixheaacd_dec_copy_outsample(WORD32 *out_samples, WORD32 *p_overlap_buffer,
+                                 WORD32 size, WORD16 stride);
 
 #endif /* #ifndef IXHEAACD_BLOCK_H */
diff --git a/decoder/ixheaacd_channel.c b/decoder/ixheaacd_channel.c
index ddbe43d..6f0a8df 100644
--- a/decoder/ixheaacd_channel.c
+++ b/decoder/ixheaacd_channel.c
@@ -37,9 +37,10 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
-
-#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
 
@@ -71,8 +72,15 @@
 #include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_memory_standards.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_struct_def.h"
 #include "ixheaacd_adts_crc_check.h"
@@ -122,6 +130,11 @@
         WORD8 *)(&ptr_aac_tables
                       ->scale_fac_bands_512[ptr_ics_info->sampling_rate_index]
                                            [0]);
+  } else if (ptr_ics_info->frame_length == 1024) {
+    return (
+        WORD8 *)(&ptr_aac_tables
+                      ->scale_factor_bands_long[ptr_ics_info->sampling_rate_index]
+                                               [0]);
   } else {
     return (
         WORD8 *)(&ptr_aac_tables
@@ -138,33 +151,33 @@
     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
     ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 total_channels,
     WORD32 object_type, WORD32 aac_sf_data_resil_flag) {
-  int grp_win, group = 0;
   WORD32 *ptr_spect_coeff = ptr_aac_dec_channel_info->ptr_spec_coeff;
   WORD8 *ptr_sfb_width = (WORD8 *)(ixheaacd_getscalefactorbandwidth(
       &(ptr_aac_dec_channel_info->str_ics_info), ptr_aac_tables));
-  int max_band;
   WORD16 *ptr_scale_fac = ptr_aac_dec_channel_info->ptr_scale_factor;
   WORD tot_bands = ptr_aac_dec_channel_info->str_ics_info.max_sfb;
-  WORD tot_groups = ptr_aac_dec_channel_info->str_ics_info.num_window_groups;
-  WORD32 *scale_table_ptr = ptr_aac_tables->pstr_block_tables->scale_table;
 
-  max_band = ptr_aac_dec_channel_info->str_ics_info.max_sfb;
+  WORD num_win_grp, group_len;
+  WORD32 *ptr_scale_table = ptr_aac_tables->pstr_block_tables->scale_table;
+  ia_ics_info_struct *ptr_ics_info = &ptr_aac_dec_channel_info->str_ics_info;
 
-  do {
-    grp_win =
-        ptr_aac_dec_channel_info->str_ics_info.window_group_length[group++];
-    do {
-      (*ixheaacd_scale_factor_process)(&ptr_spect_coeff[0], &ptr_scale_fac[0],
-                                       tot_bands, (WORD8 *)ptr_sfb_width,
-                                       scale_table_ptr, total_channels,
-                                       object_type, aac_sf_data_resil_flag);
-      ptr_spect_coeff += 128;
-      grp_win--;
-    } while (grp_win != 0);
+  if (object_type == AOT_ER_AAC_LC)
+    ptr_sfb_width = ptr_aac_tables->str_aac_sfb_info[ptr_ics_info->window_sequence]
+      .sfb_width;
+  for (num_win_grp = 0; num_win_grp < ptr_ics_info->num_window_groups;
+      num_win_grp++) {
+    for (group_len = 0;
+        group_len < ptr_ics_info->window_group_length[num_win_grp];
+        group_len++) {
+      (*ixheaacd_scale_factor_process)(
+          &ptr_spect_coeff[0], &ptr_scale_fac[0], tot_bands,
+          (WORD8 *)ptr_sfb_width, ptr_scale_table, total_channels,
+          object_type, aac_sf_data_resil_flag);
 
-    ptr_scale_fac += 16;
-    tot_groups--;
-  } while (tot_groups != 0);
+      ptr_spect_coeff += MAX_BINS_SHORT;
+    }
+    ptr_scale_fac += MAX_SCALE_FACTOR_BANDS_SHORT;
+  }
 }
 
 WORD32 ixheaacd_read_pulse_data(ia_bit_buf_struct *it_bit_buff,
@@ -178,7 +191,7 @@
   ptr_pulse_info->pulse_start_band = value & 0x3F;
 
   if (ptr_pulse_info->pulse_start_band >= 52) {
-    return (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_PULSEDATA_ERROR;
+    return (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_PULSEDATA_ERROR;
   }
 
   total_offset = ptr_aac_tables->str_aac_sfb_info[0]
@@ -191,7 +204,7 @@
     total_offset += ptr_pulse_info->pulse_offset[i];
 
     if (total_offset >= 1024) {
-      error_code = (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_PULSEDATA_ERROR;
+      error_code = (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_PULSEDATA_ERROR;
     }
   }
 
@@ -265,7 +278,7 @@
 
     if (gain_control_data_present) {
       return (WORD16)(
-          (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_GAIN_CONTROL_DATA_PRESENT);
+          (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_GAIN_CONTROL_DATA_PRESENT);
     }
   }
 
@@ -277,7 +290,8 @@
   }
 
   if (aac_spect_data_resil_flag &&
-      ((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD)))
+      ((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD)
+      || (object_type == AOT_ER_AAC_LC)))
     ixheaacd_hcr_read(it_bit_buff, ptr_aac_dec_channel_info, ele_type);
 
   if (aac_sf_data_resil_flag &&
@@ -289,7 +303,7 @@
     it_bit_buff->bit_pos = 7 - it_bit_buff->bit_pos;
   }
 
-  if (object_type == AOT_ER_AAC_LD) {
+  if (object_type == AOT_ER_AAC_LD || object_type == AOT_ER_AAC_LC) {
     if (ptr_aac_dec_channel_info->str_tns_info.tns_data_present)
       error_code =
           ixheaacd_read_tns_data(it_bit_buff, ptr_aac_dec_channel_info);
@@ -351,8 +365,12 @@
     ptr_ics_info->window_sequence = 0;
     ptr_ics_info->window_shape = 1;
   } else {
-    if (object_type != AOT_ER_AAC_LD) {
-      ptr_ics_info->frame_length = 1024;
+    if (object_type != AOT_ER_AAC_LD)
+    {
+      if (frame_size == 960)
+        ptr_ics_info->frame_length = 960;
+      else
+        ptr_ics_info->frame_length = 1024;
     }
     value = ixheaacd_read_bits_buf(it_bit_buff, 4);
     ptr_ics_info->window_sequence = (WORD16)((value & 0x6) >> 1);
@@ -376,7 +394,7 @@
     if ((object_type != AOT_ER_AAC_LD) && (object_type != AOT_AAC_LTP)) {
       if (value & 1) {
         return (WORD16)(
-            (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_PREDICTION_DATA_PRESENT);
+            (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_PREDICTION_DATA_PRESENT);
       }
 
     } else {
@@ -454,7 +472,7 @@
   }
 
   if (ptr_ics_info->max_sfb > ptr_ics_info->num_swb_window) {
-    return (WORD16)IA_ENHAACPLUS_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED;
+    return (WORD16)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED;
   }
 
   return AAC_DEC_OK;
@@ -497,7 +515,7 @@
       if (error_code) {
         if (it_bit_buff->cnt_bits < 0) {
           error_code = (WORD16)(
-              (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+              (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
         }
         return error_code;
       }
@@ -513,7 +531,7 @@
     if (error_code) {
       if (it_bit_buff->cnt_bits < 0) {
         error_code = (WORD16)(
-            (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
       }
 
       return error_code;
@@ -591,7 +609,8 @@
   IA_ERRORCODE err = IA_NO_ERROR;
   ia_aac_decoder_struct *self = self_ptr;
   if (aac_spect_data_resil_flag &&
-      ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_ER_AAC_ELD))) {
+      ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_ER_AAC_ELD) ||
+      (object_type == AOT_ER_AAC_LC))) {
     for (channel = 0; channel < num_ch; channel++) {
       err = ixheaacd_cblock_inv_quant_spect_data(
           ptr_aac_dec_channel_info[channel], ptr_aac_tables);
@@ -612,8 +631,10 @@
       ixheaacd_ms_stereo_process(ptr_aac_dec_channel_info, ptr_aac_tables);
     }
 
-    ixheaacd_intensity_stereo_process(ptr_aac_dec_channel_info, ptr_aac_tables,
-                                      object_type, aac_sf_data_resil_flag);
+    ixheaacd_intensity_stereo_process(
+        ptr_aac_dec_channel_info, ptr_aac_tables, object_type,
+        aac_sf_data_resil_flag,
+        ptr_aac_dec_channel_info[LEFT]->str_ics_info.frame_length);
   }
 
   for (channel = 0; channel < num_ch; channel++) {
@@ -736,12 +757,14 @@
   WORD num_win_grp, group_len, grp_offset;
 
   WORD index;
-  WORD8 *ptr_code_book, *ptr_code_book_no;
+  WORD8 *ptr_code_book;
   WORD16 *ptr_scale_factor;
   WORD32 *ptr_spec_coef;
   ia_ics_info_struct *ptr_ics_info = &ptr_aac_dec_channel_info->str_ics_info;
   WORD16 *swb_offset;
 
+  WORD32 maximum_bins_short = ptr_ics_info->frame_length >> 3;
+
   WORD32 *ptr_spec_coef_out;
 
   ptr_code_book = ptr_aac_dec_channel_info->ptr_code_book;
@@ -773,7 +796,8 @@
         WORD32 sfb_width;
         WORD32 sect_cb = ptr_code_book[sfb];
         WORD start = sfb;
-        if ((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD)) {
+        if ((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD)
+            || (object_type == AOT_ER_AAC_LC)) {
           if ((sect_cb >= 16) && (sect_cb <= 31)) {
             ptr_code_book[sfb] = sect_cb = 11;
           }
@@ -790,7 +814,7 @@
 
           if (ret_val != 0) {
             return (WORD16)(
-                (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL);
+                (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL);
           }
         }
 
@@ -822,28 +846,38 @@
       for (num_win_grp = 0; num_win_grp < ptr_ics_info->num_window_groups;
            num_win_grp++) {
         WORD grp_len = ptr_ics_info->window_group_length[num_win_grp];
-        ptr_code_book_no =
-            &ptr_code_book[num_win_grp * MAX_SCALE_FACTOR_BANDS_SHORT];
-        ptr_spec_coef_out = &ptr_spec_coef[grp_offset * MAX_BINS_SHORT];
 
+        if (maximum_bins_short == 120)
+          ptr_spec_coef_out = &ptr_spec_coef[grp_offset * maximum_bins_short];
+        else
+          ptr_spec_coef_out = &ptr_spec_coef[grp_offset * MAX_BINS_SHORT];
+
+        WORD bands = num_win_grp * MAX_SCALE_FACTOR_BANDS_SHORT;
         for (sfb = 0; sfb < max_sfb;) {
-          WORD sect_cb = *ptr_code_book_no;
+          WORD sect_cb = ptr_code_book[bands];
           WORD start = sfb;
           WORD ret_val;
 
-          for (; sfb < max_sfb && (*ptr_code_book_no == sect_cb);
-               sfb++, ptr_code_book_no++)
+          if ((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD)
+              || (object_type == AOT_ER_AAC_LC)) {
+            if ((sect_cb >= 16) && (sect_cb <= 31)) {
+              ptr_code_book[bands] = sect_cb = 11;
+            }
+          }
+
+          for (; sfb < max_sfb && (ptr_code_book[bands] == sect_cb);
+               sfb++, bands++)
             ;
 
           if (sect_cb > ZERO_HCB && (sect_cb < NOISE_HCB)) {
             ret_val = ixheaacd_decode_huffman(
                 it_bit_buff, sect_cb, ptr_spec_coef_out, (WORD16 *)swb_offset,
-                start, sfb, grp_len, ptr_aac_tables);
+                start, sfb, grp_len, ptr_aac_tables, maximum_bins_short);
 
             if (ret_val != 0) {
               return (WORD16)(
                   (WORD32)
-                      IA_ENHAACPLUS_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL);
+                      IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL);
             }
           }
         }
@@ -851,7 +885,13 @@
       }
     }
     {
-      WORD32 *ptr_scale_table = ptr_aac_tables->pstr_block_tables->scale_table;
+      WORD32 *ptr_scale_table;
+
+      if (maximum_bins_short != 120)
+        ptr_scale_table = ptr_aac_tables->pstr_block_tables->scale_table;
+      else
+        ptr_scale_table = ptr_aac_tables->pstr_block_tables->scale_table_960;
+
       WORD8 *ptr_sfb_width =
           ptr_aac_tables->str_aac_sfb_info[ptr_ics_info->window_sequence]
               .sfb_width;
@@ -866,7 +906,10 @@
               (WORD8 *)ptr_sfb_width, ptr_scale_table, total_channels,
               object_type, aac_sf_data_resil_flag);
 
-          ptr_spec_coef += MAX_BINS_SHORT;
+          if (maximum_bins_short == 120)
+            ptr_spec_coef += maximum_bins_short;
+          else
+            ptr_spec_coef += MAX_BINS_SHORT;
         }
 
         ptr_scale_factor += MAX_SCALE_FACTOR_BANDS_SHORT;
@@ -883,7 +926,7 @@
           pstr_hcr_info, ptr_aac_dec_channel_info, ptr_aac_tables, it_bit_buff);
 
       if (error != 0) {
-        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+        return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
       }
       error = ixheaacd_hcr_decoder(pstr_hcr_info, ptr_aac_dec_channel_info,
                                    ptr_aac_tables, it_bit_buff);
@@ -895,7 +938,7 @@
       if (it_bit_buff->cnt_bits <
           ptr_aac_dec_channel_info->reorder_spect_data_len) {
         longjmp(*(it_bit_buff->xaac_jmp_buf),
-                IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
       }
 
       it_bit_buff->cnt_bits +=
@@ -972,14 +1015,14 @@
 
         if (filter->start_band < 0) {
           filter->order = -1;
-          return (WORD16)((WORD32)IA_ENHAACPLUS_DEC_EXE_FATAL_TNS_RANGE_ERROR);
+          return (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_FATAL_TNS_RANGE_ERROR);
         }
 
         filter->order = order = ixheaacd_read_bits_buf(it_bit_buff, order_bits);
 
         if ((order - MAX_ORDER_LONG) > 0) {
           return (WORD16)(
-              (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_TNS_ORDER_ERROR);
+              (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_TNS_ORDER_ERROR);
         }
 
         if (order) {
@@ -1022,7 +1065,7 @@
   q_abs = *px_quant;
 
   if (q_abs > (8191 + 32))
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL;
+    return IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL;
 
   if (q_abs < 1024) {
     shift = 3;
@@ -1135,30 +1178,30 @@
 }
 
 WORD32 ixheaacd_ltp_data(WORD32 object_type, ia_ics_info_struct *ics,
-                         ltp_info *ltp, ia_handle_bit_buf_struct bs,
+                         ltp_info *ltp, ia_bit_buf_struct *it_bit_buf,
                          WORD32 frame_len) {
   UWORD8 sfb, w;
 
   if (object_type == AOT_ER_AAC_LD) {
-    ltp->lag_update = ixheaacd_read_bits_buf(bs, 1);
+    ltp->lag_update = ixheaacd_read_bits_buf(it_bit_buf, 1);
 
     if (ltp->lag_update) {
-      ltp->lag = (UWORD16)ixheaacd_read_bits_buf(bs, 10);
+      ltp->lag = (UWORD16)ixheaacd_read_bits_buf(it_bit_buf, 10);
     }
   } else {
-    ltp->lag = (UWORD16)ixheaacd_read_bits_buf(bs, 11);
+    ltp->lag = (UWORD16)ixheaacd_read_bits_buf(it_bit_buf, 11);
   }
 
   if (ltp->lag > (frame_len << 1)) return -1;
 
-  ltp->coef = (UWORD8)ixheaacd_read_bits_buf(bs, 3);
+  ltp->coef = (UWORD8)ixheaacd_read_bits_buf(it_bit_buf, 3);
 
   if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) {
     for (w = 0; w < 8; w++) {
-      if ((ltp->short_used[w] = ixheaacd_read_bits_buf(bs, 1)) & 1) {
-        ltp->short_lag_present[w] = ixheaacd_read_bits_buf(bs, 1);
+      if ((ltp->short_used[w] = ixheaacd_read_bits_buf(it_bit_buf, 1)) & 1) {
+        ltp->short_lag_present[w] = ixheaacd_read_bits_buf(it_bit_buf, 1);
         if (ltp->short_lag_present[w]) {
-          ltp->short_lag[w] = (UWORD8)ixheaacd_read_bits_buf(bs, 4);
+          ltp->short_lag[w] = (UWORD8)ixheaacd_read_bits_buf(it_bit_buf, 4);
         }
       }
     }
@@ -1166,7 +1209,7 @@
     ltp->last_band = (ics->max_sfb < MAX_LTP_SFB ? ics->max_sfb : MAX_LTP_SFB);
 
     for (sfb = 0; sfb < ltp->last_band; sfb++) {
-      ltp->long_used[sfb] = ixheaacd_read_bits_buf(bs, 1);
+      ltp->long_used[sfb] = ixheaacd_read_bits_buf(it_bit_buf, 1);
     }
   }
   if (ics->frame_length == 480) {
diff --git a/decoder/ixheaacd_channel.h b/decoder/ixheaacd_channel.h
index 47b740a..d223e09 100644
--- a/decoder/ixheaacd_channel.h
+++ b/decoder/ixheaacd_channel.h
@@ -52,7 +52,9 @@
 
 VOID ixheaacd_read_fill_element(ia_bit_buf_struct *it_bit_buff,
                                 ia_drc_dec_struct *drc_dummy,
-                                ia_drc_dec_struct *pstr_drc_dec);
+                                ia_drc_dec_struct *pstr_drc_dec,
+                                UWORD8 *mps_buffer, WORD32 *mps_header,
+                                WORD32 *mps_bytes);
 
 VOID ixheaacd_read_data_stream_element(ia_bit_buf_struct *it_bit_buff,
                                        WORD32 *byte_align_bits,
diff --git a/decoder/ixheaacd_channelinfo.h b/decoder/ixheaacd_channelinfo.h
index b582c0e..f17d26a 100644
--- a/decoder/ixheaacd_channelinfo.h
+++ b/decoder/ixheaacd_channelinfo.h
@@ -43,6 +43,7 @@
   WORD16 predictor_data_present;
   ltp_info ltp;
   ltp_info ltp2;
+  WORD8 qshift_adj;
 } ia_ics_info_struct;
 
 typedef struct {
@@ -292,7 +293,7 @@
 
   WORD16 *ltp_buf;
   UWORD16 ltp_lag;
-
+  ia_ec_state_str str_ec_state;
 } ia_aac_dec_channel_info;
 
 typedef struct {
diff --git a/decoder/ixheaacd_cnst.h b/decoder/ixheaacd_cnst.h
index cee0a58..a83f48e 100644
--- a/decoder/ixheaacd_cnst.h
+++ b/decoder/ixheaacd_cnst.h
@@ -95,6 +95,7 @@
 #define NUM_TW_NODES 16
 
 #define CORE_MODE_FD 0
+#define CORE_MODE_LPD 1
 
 #define ONLY_LONG_SEQUENCE 0
 #define LONG_START_SEQUENCE 1
diff --git a/decoder/ixheaacd_common_initfuncs.c b/decoder/ixheaacd_common_initfuncs.c
index d315f1c..f3d2ae6 100644
--- a/decoder/ixheaacd_common_initfuncs.c
+++ b/decoder/ixheaacd_common_initfuncs.c
@@ -35,6 +35,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
@@ -66,8 +69,15 @@
 #include "ixheaacd_latmdemux.h"
 
 #include "ixheaacd_aacdec.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_struct_def.h"
 #include "ixheaacd_headerdecode.h"
@@ -162,7 +172,7 @@
         (it_bit_buff->cnt_bits - ixheaacd_drc_offset < 0) ||
         (it_bit_buff->cnt_bits - ixheaacd_drc_offset > it_bit_buff->size)) {
       longjmp(*(it_bit_buff->xaac_jmp_buf),
-              IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+              IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
     }
     it_bit_buff->cnt_bits = it_bit_buff->cnt_bits - ixheaacd_drc_offset;
     it_bit_buff->bit_pos = it_bit_buff->bit_pos - ixheaacd_drc_offset;
diff --git a/decoder/ixheaacd_common_lpfuncs.c b/decoder/ixheaacd_common_lpfuncs.c
index c9ab2dd..80196b9 100644
--- a/decoder/ixheaacd_common_lpfuncs.c
+++ b/decoder/ixheaacd_common_lpfuncs.c
@@ -34,6 +34,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
@@ -67,8 +70,16 @@
 #include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_struct_def.h"
 #include "ixheaacd_headerdecode.h"
@@ -211,15 +222,16 @@
 
   if (it_bit_buff->cnt_bits < (cnt << 3)) {
     longjmp(*(it_bit_buff->xaac_jmp_buf),
-            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
   }
   it_bit_buff->ptr_read_next += cnt;
   it_bit_buff->cnt_bits -= ((cnt) << 3);
 }
 
-VOID ixheaacd_read_fill_element(ia_bit_buf_struct *it_bit_buff,
-                                ia_drc_dec_struct *drc_dummy,
-                                ia_drc_dec_struct *ptr_drc_dec) {
+VOID ixheaacd_read_fill_element(
+    ia_bit_buf_struct *it_bit_buff, ia_drc_dec_struct *drc_dummy,
+    ia_drc_dec_struct *ptr_drc_dec, UWORD8 *mps_buffer, WORD32 *mps_header,
+    WORD32 *mps_bytes) {
   WORD32 count;
   count = ixheaacd_read_bits_buf(it_bit_buff, 4);
 
@@ -237,13 +249,28 @@
       ptr_drc_dec->drc_element_found = 1;
       count -=
           ixheaacd_dec_drc_read_element(ptr_drc_dec, drc_dummy, it_bit_buff);
+    }
+    if (EXT_SAC_DATA == extension_type) {
+      WORD32 anc_type, i;
+      anc_type = ixheaacd_read_bits_buf(it_bit_buff, 2);
+      *mps_header = anc_type;
 
-    } else {
+      ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+      ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+      for (i = 0; i < count - 1; i++) {
+        mps_buffer[i] = ixheaacd_read_bits_buf(it_bit_buff, 8);
+      }
+
+      *mps_bytes = count - 1;
+    }
+    else {
       ixheaacd_read_bits_buf(it_bit_buff, 4);
 
       if (it_bit_buff->cnt_bits < ((count - 1) << 3)) {
         longjmp(*(it_bit_buff->xaac_jmp_buf),
-                IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
       }
       it_bit_buff->ptr_read_next += count - 1;
       it_bit_buff->cnt_bits -= ((count - 1) << 3);
@@ -255,7 +282,10 @@
     ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD ch_idx1,
     WORD *ch_idx, WORD *channel, WORD *ele_idx_order, WORD total_elements,
     WORD8 *element_used, WORD total_channels, ia_drc_dec_struct *pstr_drc_dec,
-    ia_drc_dec_struct *drc_dummy) {
+    ia_drc_dec_struct *drc_dummy
+    ,
+    UWORD8 *mps_buffer, WORD32 *mps_header, WORD32 *mps_bytes
+) {
   WORD element_tag, j;
   ia_aac_dec_state_struct *p_state_enhaacplus_dec =
       p_obj_enhaacplus_dec->p_state_aac;
@@ -283,7 +313,7 @@
   if (it_bit_buff->cnt_bits < 3) {
     it_bit_buff->cnt_bits = -1;
     return (WORD16)(
-        (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+        (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
   }
 
   element_tag = (WORD)ixheaacd_read_bits_buf(it_bit_buff, 7);
@@ -301,7 +331,7 @@
     if (it_bit_buff->cnt_bits < 3) {
       it_bit_buff->cnt_bits = -1;
       return (WORD16)(
-          (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
     }
 
     if (type == 4) {
@@ -315,17 +345,18 @@
           &p_obj_enhaacplus_dec->aac_config.str_prog_config);
       if (error_code != 0) {
         if (error_code < 0) return error_code;
-        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+        return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
       }
     }
     if (type == 6) {
-      ixheaacd_read_fill_element(it_bit_buff, drc_dummy, pstr_drc_dec);
+      ixheaacd_read_fill_element(it_bit_buff, drc_dummy, pstr_drc_dec,
+                                 mps_buffer, mps_header, mps_bytes);
     }
 
     if (it_bit_buff->cnt_bits < 7) {
       it_bit_buff->cnt_bits = -1;
       return (WORD16)(
-          (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
     }
 
     element_tag = (WORD)ixheaacd_aac_showbits_7(it_bit_buff);
@@ -356,12 +387,12 @@
   if (j == total_elements) {
     if (it_bit_buff->cnt_bits < 0) {
       return (WORD16)(
-          (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
     }
 
     ixheaacd_read_bidirection(
         it_bit_buff, (WORD16)(it_bit_buff->cnt_bits - it_bit_buff->size));
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_ELE_INSTANCE_TAG_NOT_FOUND;
+    return IA_XHEAAC_DEC_EXE_NONFATAL_ELE_INSTANCE_TAG_NOT_FOUND;
   } else
     return 0;
 }
diff --git a/decoder/ixheaacd_common_rom.c b/decoder/ixheaacd_common_rom.c
index 819d6f2..667b28a 100644
--- a/decoder/ixheaacd_common_rom.c
+++ b/decoder/ixheaacd_common_rom.c
@@ -35,6 +35,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecsettings.h"
diff --git a/decoder/ixheaacd_config.h b/decoder/ixheaacd_config.h
index c78ce8f..59bacf0 100644
--- a/decoder/ixheaacd_config.h
+++ b/decoder/ixheaacd_config.h
@@ -41,6 +41,7 @@
 #define USAC_OUT_FRAMELENGTH_4096 4096
 
 #define MAX_CORE_SBR_FRAME_LEN_IDX (4)
+#define IA_MAX_INP_BUFFER_SIZE (8 * 1024 + 11)
 
 #define ID_EXT_ELE_FILL 0
 #define ID_EXT_ELE_MPEGS 1
@@ -51,6 +52,22 @@
 #define ID_CONFIG_EXT_FILL 0
 #define ID_CONFIG_EXT_LOUDNESS_INFO (2)
 
+#define MAX_PARAMETER_BANDS (28)
+#define MAX_NUM_OTT (5)
+#define MAX_NUM_TTT (1)
+#define MAX_INPUT_CHANNELS (2)
+#define MAX_RESIDUAL_CHANNELS (3)
+#define MAX_OUTPUT_CHANNELS (7)
+#define MAX_NUM_EXT_TYPES (8)
+#define MAX_M_INPUT (2)
+#define MAX_M_OUTPUT (2)
+#define QMF_BANDS_TO_HYBRID (3)
+#define MAX_HYBRID_ONLY_BANDS_PER_QMF (8)
+#define MAX_ARBITRARY_TREE_LEVELS (2)
+#define MAX_OUTPUT_CHANNELS_AT \
+  (MAX_OUTPUT_CHANNELS * (1 << MAX_ARBITRARY_TREE_LEVELS))
+#define MAX_ARBITRARY_TREE_INDEX ((1 << (MAX_ARBITRARY_TREE_LEVELS + 1)) - 1)
+
 typedef UWORD8 UINT8;
 typedef UWORD32 UINT32;
 
@@ -83,6 +100,66 @@
   UINT32 bs_residual_bands;
   UINT32 bs_pseudo_lr;
   UINT32 bs_env_quant_mode;
+  UINT32 ldmps_present_flag;
+
+  UINT32 bs_sampling_freq_index;
+  UINT32 bs_fampling_frequency;
+  UINT32 bs_frame_length;
+  UINT32 bs_tree_config;
+  UINT32 bs_quant_mode;
+  UINT32 bs_one_icc;
+  UINT32 bs_arbitrary_downmix;
+  UINT32 bs_residual_coding;
+  UINT32 bs_fixed_gain_sur;
+  UINT32 bs_fixed_gain_LFE;
+  UINT32 bs_matrix_mode;
+  UINT32 bs_3D_audio_mode;
+  UINT32 bs_3D_audio_HRTF_set;
+  UINT32 bs_HRTF_freq_res;
+  UINT32 HRTF_num_band;
+  UINT32 HRTF_num_phase;  // new
+  UINT32 bs_HRTF_num_chan;
+  UINT32 bs_HRTF_asymmetric;
+  UINT32 bs_HRTF_level_left[MAX_OUTPUT_CHANNELS][MAX_PARAMETER_BANDS];
+  UINT32 bs_HRTF_level_right[MAX_OUTPUT_CHANNELS][MAX_PARAMETER_BANDS];
+  UINT32 bs_HRTF_phase[MAX_OUTPUT_CHANNELS];
+  UINT32 bs_HRTF_phase_LR[MAX_OUTPUT_CHANNELS][MAX_PARAMETER_BANDS];
+  UINT32 bs_HRTF_icc[MAX_OUTPUT_CHANNELS];
+  UINT32 bs_HRTF_icc_LR[MAX_OUTPUT_CHANNELS][MAX_PARAMETER_BANDS];
+  UINT32 bs_ott_bands[MAX_NUM_OTT];
+  UINT32 bs_ttt_dual_mode[MAX_NUM_TTT];
+  UINT32 bs_ttt_mode_low[MAX_NUM_TTT];
+  UINT32 bs_ttt_mode_high[MAX_NUM_TTT];
+  UINT32 bs_ttt_bands_low[MAX_NUM_TTT];
+  UINT32 bs_ttt_bands_high[MAX_NUM_TTT];
+
+  UINT32 bs_sac_ext_type[MAX_NUM_EXT_TYPES];
+  UINT32 sac_ext_cnt;
+
+  UINT32 bs_residual_present[MAX_RESIDUAL_CHANNELS];
+  UINT32 bs_residual_sampling_freq_index;
+  UINT32 bs_residual_frames_per_spatial_frame;
+
+  UINT32 bs_residual_bands_ld_mps[MAX_RESIDUAL_CHANNELS];
+
+  UINT32 bs_arbitrary_downmix_residual_sampling_freq_index;
+  UINT32 bs_arbitrary_downmix_residual_frames_per_spatial_frame;
+  UINT32 bs_arbitrary_downmix_residual_bands;
+
+  UINT32 num_out_chan_AT;
+  UINT32 num_ott_boxes_AT;
+  UINT32 bs_output_channel_pos_AT[MAX_OUTPUT_CHANNELS_AT];
+  UINT32 bs_ott_box_present_AT[MAX_OUTPUT_CHANNELS][MAX_ARBITRARY_TREE_INDEX];
+  UINT32 bs_ott_default_cld_AT[MAX_OUTPUT_CHANNELS * MAX_ARBITRARY_TREE_INDEX];
+  UINT32 bs_ott_mode_lfe_AT[MAX_OUTPUT_CHANNELS * MAX_ARBITRARY_TREE_INDEX];
+  UINT32 bs_ott_bands_AT[MAX_OUTPUT_CHANNELS * MAX_ARBITRARY_TREE_INDEX];
+
+  WORD32 num_ott_boxes;
+  WORD32 num_ttt_boxes;
+  WORD32 num_input_channels;
+  WORD32 num_output_channels;
+  WORD32 ott_mode_lfe[MAX_NUM_OTT];  // new
+  WORD32 no_ldsbr_present;
 } ia_usac_dec_mps_config_struct;
 
 #define BS_OUTPUT_CHANNEL_POS_NA -1   /* n/a                                */
@@ -634,6 +711,6 @@
                             UWORD32 *sample_freq_indx);
 
 WORD32 ixheaacd_config(ia_bit_buf_struct *bit_buff,
-                       ia_usac_config_struct *pstr_usac_conf, UINT32 *chan);
+                       ia_usac_config_struct *pstr_usac_conf, UINT32 *chan, WORD32 ec_flag);
 
 #endif /* IXHEAACD_CONFIG_H */
diff --git a/decoder/ixheaacd_constants.h b/decoder/ixheaacd_constants.h
index 3ac0065..931fb61 100644
--- a/decoder/ixheaacd_constants.h
+++ b/decoder/ixheaacd_constants.h
@@ -63,9 +63,6 @@
 #define MAX_16 (WORD16)0x7fff
 #define MIN_16 (WORD16)0x8000
 
-#define MAX_24 (WORD32)0x007fffff
-#define MIN_24 (WORD32)0xff800000
-
 #define NULLPTR ((VOID *)0)
 
 #define IT_NULL ((VOID *)0)
@@ -77,4 +74,13 @@
 #define max(a, b) (((a) > (b)) ? (a) : (b))
 #define min(a, b) (((a) < (b)) ? (a) : (b))
 
+#define C70 (-0.1666667014f)  //(cos(u) + cos(2 * u) + cos(3 * u)) / 3;
+#define C71 (0.7901564837f)   //(2 * cos(u) - cos(2 * u) - cos(3 * u)) / 3;
+#define C72 (0.0558542535f)   //(cos(u) - 2 * cos(2 * u) + cos(3 * u)) / 3;
+#define C73 (0.7343022227f)   //(cos(u) + cos(2 * u) - 2 * cos(3 * u)) / 3;
+#define C74 (-0.4409585893f)  //(sin(u) + sin(2 * u) - sin(3 * u)) / 3;
+#define C75 (-0.3408728838f)  //(2 * sin(u) - sin(2 * u) + sin(3 * u)) / 3;
+#define C76 (0.5339693427f)   //(sin(u) - 2 * sin(2 * u) - sin(3 * u)) / 3;
+#define C77 (-0.8748422265f)  //(sin(u) + sin(2 * u) + 2 * sin(3 * u)) / 3;
+
 #endif /* IXHEAACD_CONSTANTS_H */
diff --git a/decoder/ixheaacd_create.c b/decoder/ixheaacd_create.c
index 6990399..0aef571 100644
--- a/decoder/ixheaacd_create.c
+++ b/decoder/ixheaacd_create.c
@@ -23,7 +23,7 @@
 #include <assert.h>
 
 #include "ixheaacd_type_def.h"
-
+#include "ixheaacd_constants.h"
 #include "ixheaacd_cnst.h"
 
 #include "ixheaacd_bitbuffer.h"
@@ -54,49 +54,33 @@
 #include "ixheaacd_pvc_dec.h"
 #include "ixheaacd_sbr_dec.h"
 #include "ixheaacd_mps_polyphase.h"
-#include "ixheaacd_sbr_const.h"
-
-#include "ixheaacd_main.h"
-
-#include "ixheaacd_arith_dec.h"
 
 #include "ixheaacd_memory_standards.h"
-#include "ixheaacd_sbrdecsettings.h"
 #include "ixheaacd_defines.h"
 #include "ixheaacd_aac_rom.h"
-#include "ixheaacd_common_rom.h"
-#include "ixheaacd_sbr_rom.h"
 #include "ixheaacd_bitbuffer.h"
 #include "ixheaacd_pulsedata.h"
 #include "ixheaacd_pns.h"
 
-#include "ixheaacd_lt_predict.h"
-
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_main.h"
 #include "ixheaacd_channelinfo.h"
-#include "ixheaacd_channel.h"
-#include "ixheaacd_channelinfo.h"
-#include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_ec.h"
 #include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
-#include "ixheaacd_sbr_common.h"
-
-#include "ixheaacd_mps_polyphase.h"
-#include "ixheaacd_config.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_struct_def.h"
 
 #include "ixheaacd_create.h"
 
-#include "ixheaacd_process.h"
-
-#include "ixheaacd_sbrdecoder.h"
-
 #include "ixheaacd_mps_interface.h"
 
-#include "ixheaacd_bit_extract.h"
 #include "ixheaacd_func_def.h"
-#include "ixheaacd_interface.h"
 
 extern const ia_huff_code_word_struct ixheaacd_huff_book_scl[];
 
@@ -231,6 +215,7 @@
   WORD32 num_elements = ptr_usac_dec_config->num_elements;
   WORD32 chan = 0;
 
+  usac_data->ec_flag = codec_handle->aac_config.ui_err_conceal;
   usac_data->huffman_code_book_scl = aac_dec_handle->huffman_code_book_scl;
   usac_data->huffman_code_book_scl_index =
       aac_dec_handle->huffman_code_book_scl_index;
@@ -242,6 +227,10 @@
   usac_data->tns_max_bands_tbl_usac =
       &aac_dec_handle->pstr_aac_tables->pstr_block_tables
            ->tns_max_bands_tbl_usac;
+  for (WORD32 ch = 0; ch < MAX_NUM_CHANNELS; ch++) {
+    ixheaacd_usac_ec_init(&usac_data->str_error_concealment[ch], usac_data->core_mode);
+    memset(&usac_data->overlap_data_ptr[ch][0], 0, sizeof(usac_data->overlap_data_ptr[ch]));
+  }
 
   for (i = 0; i < 11; i++) {
     if (ixheaacd_sampling_boundaries[i] <= sample_rate) break;
@@ -284,6 +273,16 @@
       usac_data->str_tddec[i]->fscale =
           ((fscale)*usac_data->ccfl) / LEN_SUPERFRAME;
     usac_data->len_subfrm = usac_data->ccfl / 4;
+
+    {
+      WORD32 fac_length = usac_data->len_subfrm / 4;
+      if (fac_length & (fac_length - 1)) {
+        if ((fac_length != 48) && (fac_length != 96) && (fac_length != 192) &&
+            (fac_length != 384) && (fac_length != 768)) {
+          return -1;
+        }
+      }
+    }
     usac_data->num_subfrm = (MAX_NUM_SUBFR * usac_data->ccfl) / LEN_SUPERFRAME;
 
     ixheaacd_init_acelp_data(usac_data, usac_data->str_tddec[i]);
@@ -301,11 +300,13 @@
 
     if (ptr_usac_ele_config) {
       if (usac_data->tw_mdct[ele_id]) {
-        return -1;
+        if (usac_data->ec_flag) {
+          usac_data->tw_mdct[ele_id] = 0;
+        } else
+          return -1;
       }
 
-      usac_data->noise_filling_config[ele_id] =
-          ptr_usac_ele_config->noise_filling;
+      usac_data->noise_filling_config[ele_id] = ptr_usac_ele_config->noise_filling;
     }
 
     ele_type = ptr_usac_config->str_usac_dec_config.usac_element_type[ele_id];
@@ -342,6 +343,7 @@
               &(ptr_usac_config->str_usac_dec_config
                     .str_usac_element_config[ele_id]
                     .str_usac_mps212_config);
+          aac_dec_handle->mps_dec_handle.ec_flag = aac_dec_handle->ec_enable;
 
           if (ixheaacd_mps_create(&aac_dec_handle->mps_dec_handle,
                                   bs_frame_length, bs_residual_coding,
@@ -369,9 +371,6 @@
                               ia_usac_data_struct *usac_data) {
   ia_audio_specific_config_struct *pstr_stream_config, *layer_config;
   WORD32 err_code = 0;
-
-  WORD32 num_out_chan = 0;
-
   WORD32 i_ch, i, ele_id;
   WORD32 num_elements;
 
@@ -380,6 +379,8 @@
   ia_usac_config_struct *ptr_usac_config =
       &(pstr_frame_data->str_audio_specific_config.str_usac_config);
 
+  usac_data->last_frame_ok = 1;
+  usac_data->frame_ok = 1;
   usac_data->window_shape_prev[0] = WIN_SEL_0;
   usac_data->window_shape_prev[1] = WIN_SEL_0;
 
@@ -422,8 +423,6 @@
   usac_data->esbr_bit_str[0].no_elements = 0;
   usac_data->esbr_bit_str[1].no_elements = 0;
 
-  num_out_chan = ptr_usac_config->num_out_channels;
-
   if (usac_data->ccfl == 768)
     pstr_frame_data->str_layer.sample_rate_layer =
         4 * pstr_frame_data->str_layer.sample_rate_layer / 3;
@@ -559,7 +558,14 @@
         err = ixheaacd_dec_data_init(handle, pstr_frame_data,
                                      &(pstr_dec_data->str_usac_data));
 
-        if (err != 0) return err;
+        if (err != 0) {
+          if (handle->aac_config.ui_err_conceal) {
+            pstr_dec_data->str_usac_data.frame_ok = 0;
+          } else
+            return err;
+        }
+
+        pstr_dec_data->str_usac_data.sampling_rate = pstr_frame_data->str_layer.sample_rate_layer;
 
         switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) {
           case 0:
@@ -579,6 +585,15 @@
             handle->aac_config.ui_sbr_mode = 0;
         }
 
+        if (!aac_dec_handle->peak_lim_init && !handle->aac_config.peak_limiter_off &&
+            handle->aac_config.ui_err_conceal) {
+          memset(&aac_dec_handle->peak_limiter, 0, sizeof(ia_peak_limiter_struct));
+          ixheaacd_peak_limiter_init(&aac_dec_handle->peak_limiter, MAX_NUM_CHANNELS,
+                                     pstr_dec_data->str_usac_data.sampling_rate,
+                                     &aac_dec_handle->peak_limiter.buffer[0],
+                                     &aac_dec_handle->delay_in_samples);
+          aac_dec_handle->peak_lim_init++;
+        }
 
         break;
 
@@ -602,9 +617,6 @@
     ia_usac_config_struct *ptr_usac_config =
         &(pstr_frame_data->str_audio_specific_config.str_usac_config);
 
-    WORD32 inter_tes[MAX_NUM_ELEMENTS] = {0};
-    WORD32 bs_pvc[MAX_NUM_ELEMENTS] = {0};
-    WORD32 harmonic_sbr[MAX_NUM_ELEMENTS] = {0};
     WORD32 inter_test_flag = 0;
     WORD32 bs_pvc_flag = 0;
     WORD32 harmonic_Sbr_flag = 0;
@@ -626,12 +638,6 @@
       ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config =
           &(ptr_usac_dec_config->str_usac_element_config[elem_idx]
                 .str_usac_sbr_config);
-      inter_tes[elem_idx] =
-          (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->bs_inter_tes : 0;
-      bs_pvc[elem_idx] =
-          (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->bs_pvc : 0;
-      harmonic_sbr[elem_idx] =
-          (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->harmonic_sbr : 0;
 
       if (ptr_usac_sbr_config->bs_inter_tes) inter_test_flag = 1;
       if (ptr_usac_sbr_config->bs_pvc) bs_pvc_flag = 1;
@@ -686,7 +692,7 @@
             pstr_dec_data->str_usac_data.sbr_ratio_idx,
             pstr_dec_data->str_usac_data.output_samples, &harmonic_Sbr_flag,
             (void *)&usac_def_header, aac_dec_handle->str_sbr_config,
-            pstr_dec_data->str_usac_data.audio_object_type);
+            pstr_dec_data->str_usac_data.audio_object_type, 0, 0);
         pstr_dec_data->str_usac_data.sbr_scratch_mem_base =
             aac_dec_handle->sbr_scratch_mem_u;
         if (num_ele)
diff --git a/decoder/ixheaacd_create.h b/decoder/ixheaacd_create.h
index 05f125e..2a4ba5f 100644
--- a/decoder/ixheaacd_create.h
+++ b/decoder/ixheaacd_create.h
@@ -24,6 +24,7 @@
   struct ia_bit_buf_struct dec_bit_buf;
   ia_frame_data_struct str_frame_data;
   ia_usac_data_struct str_usac_data;
+  jmp_buf *xaac_jmp_buf;
 } ia_dec_data_struct;
 
 WORD32 ixheaacd_frm_data_init(ia_audio_specific_config_struct *pstr_audio_conf,
@@ -39,7 +40,7 @@
     VOID *sbr_persistent_mem_v, WORD32 *ptr_overlap_buf, WORD channel,
     WORD ps_enable, WORD sbr_ratio_idx, WORD output_frame_size, WORD *use_hbe,
     VOID *p_usac_dflt_header, ia_sbr_header_data_struct str_sbr_config,
-    WORD audio_object_type);
+    WORD audio_object_type, WORD32 ldmps_present, WORD32 ldsbr_present);
 
 VOID ixheaacd_setesbr_flags(VOID *sbr_persistent_mem_v, FLAG pvc_flag,
                             FLAG hbe_flag, FLAG inter_tes_flag);
diff --git a/decoder/ixheaacd_decode_main.c b/decoder/ixheaacd_decode_main.c
index 7ee1bcd..802f7fa 100644
--- a/decoder/ixheaacd_decode_main.c
+++ b/decoder/ixheaacd_decode_main.c
@@ -20,10 +20,10 @@
 #include <stdlib.h>
 #include <string.h>
 #include "ixheaacd_type_def.h"
-#include "ixheaacd_constants.h"
 #include "ixheaacd_error_standards.h"
 #include "ixheaacd_memory_standards.h"
 #include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
 #include "ixheaacd_env_extr_part.h"
 #include "ixheaacd_defines.h"
 #include "ixheaacd_aac_rom.h"
@@ -32,26 +32,38 @@
 #include "ixheaacd_bitbuffer.h"
 #include "ixheaacd_pulsedata.h"
 #include "ixheaacd_pns.h"
+#include "ixheaacd_interface.h"
+#include "ixheaacd_info.h"
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_sbr_common.h"
 #include "ixheaacd_drc_data_struct.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_channel.h"
-#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
 #include "ixheaacd_sbr_common.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_struct_def.h"
 #include "ixheaacd_bitbuffer.h"
 #include "ixheaacd_interface.h"
 #include "ixheaacd_tns_usac.h"
-#include "ixheaacd_cnst.h"
+
 #include "ixheaacd_acelp_info.h"
 #include "ixheaacd_sbrdecsettings.h"
 #include "ixheaacd_info.h"
@@ -65,12 +77,15 @@
 #include "ixheaacd_create.h"
 #include "ixheaacd_dec_main.h"
 #include "ixheaacd_error_standards.h"
+#include "ixheaacd_headerdecode.h"
+#include "ixheaacd_error_codes.h"
 VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out,
                           WORD32 pcmsize, FLOAT32 (*out_samples)[4096],
                           WORD32 *out_bytes, WORD32 num_channel_out) {
   WORD32 num;
   WORD32 i;
-  FLOAT32 sample;
+  WORD32 write_local;
+  FLOAT32 write_local_float;
 
   WORD16 *out_buf = (WORD16 *)outbuffer;
 
@@ -78,29 +93,30 @@
 
   if (pcmsize == 16) {
     for (i = 0; i < num; i++) {
-      sample = (out_samples[i % num_channel_out][i / num_channel_out]);
+      write_local_float =
+          (out_samples[i % num_channel_out][i / num_channel_out]);
 
-      if (sample > MAX_16) {
-        sample = MAX_16;
-      } else if (sample < MIN_16) {
-        sample = MIN_16;
+      if (write_local_float > 32767.0f) {
+        write_local_float = 32767.0f;
+      } else if (write_local_float < -32768.0f) {
+        write_local_float = -32768.0f;
       }
-      out_buf[i] = (WORD16)sample;
+      out_buf[i] = (WORD16)write_local_float;
     }
 
     *out_bytes = num * sizeof(WORD16);
   } else {
     WORD8 *out_24bit = (WORD8 *)out_buf;
     for (i = 0; i < num; i++) {
-      WORD32 write_local;
-      sample = (out_samples[i % num_channel_out][i / num_channel_out] * 256);
+      write_local_float =
+          (out_samples[i % num_channel_out][i / num_channel_out] * 256);
 
-      if (sample > MAX_24) {
-        sample = MAX_24;
-      } else if (sample < MIN_24) {
-        sample = MIN_24;
+      if (write_local_float > 8388607.0f) {
+        write_local_float = 8388607.0f;
+      } else if (write_local_float < -8388608.0f) {
+        write_local_float = -8388608.0f;
       }
-      write_local = (WORD32)sample;
+      write_local = (WORD32)write_local_float;
 
       *out_24bit++ = (WORD32)write_local & 0xff;
       *out_24bit++ = ((WORD32)write_local >> 8) & 0xff;
@@ -111,24 +127,68 @@
   }
 }
 
+VOID ixheaacd_samples_sat_mc(WORD8* outbuffer, WORD32 num_samples_out,
+    FLOAT32(*out_samples)[4096], WORD32* out_bytes,
+    WORD32 num_channel_out, WORD32 ch_fac) {
+  WORD32 num;
+  WORD32 i;
+  FLOAT32 write_local_float;
+
+  WORD16* out_buf = (WORD16*)outbuffer;
+
+  num = num_channel_out * num_samples_out;
+  if (num_channel_out == 1) {
+    for (i = 0; i < num; i++) {
+      write_local_float =
+          (out_samples[i % num_channel_out][i / num_channel_out]);
+
+      if (write_local_float > 32767.0f) {
+        write_local_float = 32767.0f;
+      } else if (write_local_float < -32768.0f) {
+        write_local_float = -32768.0f;
+      }
+      out_buf[i * ch_fac] = (WORD16)write_local_float;
+    }
+  } else if (num_channel_out == 2) {
+    for (i = 0; i < num_samples_out; i++) {
+      write_local_float =
+          (out_samples[(2*i) % num_channel_out][(2 * i) / num_channel_out]);
+
+      if (write_local_float > 32767.0f) {
+          write_local_float = 32767.0f;
+      } else if (write_local_float < -32768.0f) {
+          write_local_float = -32768.0f;
+      }
+      out_buf[i * ch_fac] = (WORD16)write_local_float;
+
+      write_local_float =
+          (out_samples[((2 * i) + 1) % num_channel_out][((2 * i) + 1) / num_channel_out]);
+
+      if (write_local_float > 32767.0f) {
+          write_local_float = 32767.0f;
+      } else if (write_local_float < -32768.0f) {
+          write_local_float = -32768.0f;
+      }
+      out_buf[i * ch_fac + 1] = (WORD16)write_local_float;
+    }
+  }
+  *out_bytes = num * sizeof(WORD16);
+}
+
 /* audio pre roll frame parsing*/
-static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data,
-                                             UWORD8 *conf_buf,
-                                             WORD32 *preroll_units,
-                                             WORD32 *preroll_frame_offset) {
+static WORD32 ixheaacd_audio_preroll_parsing(
+    ia_dec_data_struct *pstr_dec_data, UWORD8 *conf_buf, WORD32 *preroll_units,
+    WORD32 *preroll_frame_offset, ia_aac_dec_state_struct *aac_dec_handle,
+    WORD32 *config_changed, WORD32 *apply_crossfade) {
   ia_bit_buf_struct *temp_buff =
       (ia_bit_buf_struct *)&(pstr_dec_data->dec_bit_buf);
-  WORD32 independency_flag = 0;
+
   WORD32 ext_ele_present = 0;
   WORD32 ext_ele_use_dflt_len = 0;
   WORD32 ext_ele_payload_len = 0;
-
-  WORD32 apply_crossfade = 0;
-  WORD32 un_used_val = 0;
   WORD32 num_pre_roll_frames = 0;
 
   WORD32 frame_idx = 0;
-  WORD32 frame_len[MAX_AUDIO_PREROLLS] = {0};
   WORD32 temp = 0;
 
   WORD32 config_len = 0;
@@ -137,14 +197,13 @@
   if (pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config
           .str_usac_dec_config.usac_element_type[0] == ID_USAC_EXT) {
     temp = ixheaacd_show_bits_buf(temp_buff, 3);
-    independency_flag = (temp >> 2) & 0x1;
     ext_ele_present = (temp >> 1) & 0x1;
 
     if (ext_ele_present) {
-      ext_ele_use_dflt_len = temp & 0x1;  // ixheaacd_read_bit(&temp_buff, 1);
+      ext_ele_use_dflt_len = temp & 0x1;
       if (ext_ele_use_dflt_len != 0) return 0;
 
-      un_used_val = ixheaacd_read_bits_buf(temp_buff, 3);
+      ixheaacd_read_bits_buf(temp_buff, 3);
 
       ext_ele_payload_len = ixheaacd_read_bits_buf(temp_buff, 8);
 
@@ -155,7 +214,6 @@
             (UWORD32)((WORD32)ext_ele_payload_len + val_add - 2);
       }
 
-      // escapedValue(4, 4, 8);
       config_len = ixheaacd_read_bits_buf(temp_buff, 4);
       if (config_len == 15) {
         WORD32 val_add = 0;
@@ -171,10 +229,25 @@
       for (loop = 0; loop < config_len; loop++)
         conf_buf[loop] = ixheaacd_read_bits_buf(temp_buff, 8);
 
-      apply_crossfade = ixheaacd_read_bits_buf(temp_buff, 1);
-      un_used_val = ixheaacd_read_bits_buf(temp_buff, 1);  // reserverd
+      if (aac_dec_handle->preroll_config_present == 1) {
+        if (!(memcmp(aac_dec_handle->preroll_config_prev, conf_buf,
+                     sizeof(UWORD8) * config_len))) {
+          config_len = 0;
+        }
+        if (memcmp(aac_dec_handle->preroll_config_prev, conf_buf,
+                   sizeof(UWORD8) * config_len) != 0) {
+          *config_changed = 1;
+        } else {
+          *config_changed = 0;
+        }
+      }
+      aac_dec_handle->preroll_config_present = 1;
+      memcpy(aac_dec_handle->preroll_config_prev, conf_buf,
+             sizeof(UWORD8) * config_len);
 
-      // escapedValue(2, 4, 0);
+      *apply_crossfade = ixheaacd_read_bits_buf(temp_buff, 1);
+      ixheaacd_read_bits_buf(temp_buff, 1);
+
       num_pre_roll_frames = ixheaacd_read_bits_buf(temp_buff, 2);
       if (num_pre_roll_frames == 3) {
         WORD32 val_add = 0;
@@ -182,24 +255,46 @@
         num_pre_roll_frames += val_add;
       }
 
-      if (num_pre_roll_frames > MAX_AUDIO_PREROLLS) return IA_FATAL_ERROR;
+      if (num_pre_roll_frames > MAX_AUDIO_PREROLLS) {
+        if (pstr_dec_data->str_usac_data.ec_flag) {
+          num_pre_roll_frames = 0;
+          longjmp(*(pstr_dec_data->xaac_jmp_buf),
+                  IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+        } else {
+          return IA_FATAL_ERROR;
+        }
+      }
 
       for (frame_idx = 0; frame_idx < num_pre_roll_frames; frame_idx++) {
-        WORD32 au_len = 0;  // escapedValued(16,16,0)
+        WORD32 au_len = 0;
         au_len = ixheaacd_read_bits_buf(temp_buff, 16);
         if (au_len == 65535) {
           WORD32 val_add = ixheaacd_read_bits_buf(temp_buff, 16);
           au_len += val_add;
         }
-        preroll_frame_offset[frame_idx] = temp_buff->size - temp_buff->cnt_bits;
-        frame_len[frame_idx] =
-            (8 * au_len) + (temp_buff->size - temp_buff->cnt_bits);
+        if (config_len != 0) {
+          preroll_frame_offset[frame_idx] =
+              temp_buff->size - temp_buff->cnt_bits;
+        }
         temp_buff->ptr_read_next += au_len;
         temp_buff->cnt_bits -= au_len * 8;
+        if (temp_buff->cnt_bits < 0) {
+          if (pstr_dec_data->str_usac_data.ec_flag) {
+            temp_buff->cnt_bits = 0;
+            longjmp(*(pstr_dec_data->xaac_jmp_buf),
+                    IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          } else {
+            return IA_FATAL_ERROR;
+          }
+        }
       }
     }
   }
-  *preroll_units = num_pre_roll_frames;
+  if (config_len == 0)
+    *preroll_units = 0;
+  else
+    *preroll_units = num_pre_roll_frames;
+
   return config_len;
 }
 
@@ -218,13 +313,13 @@
   WORD32 suitable_tracks = 1;
   WORD32 num_samples_out;
   ia_dec_data_struct *pstr_dec_data;
-  UWORD8 config[285];  // max of escapedValue(4, 4, 8) i.e. 2^4 -1 + 2^4 -1 +
-                       // 2^8 -1;
+  UWORD8 config[MAX_PREROLL_SIZE];
   WORD32 config_len;
   WORD32 delay;
-  WORD preroll_frame_offset[4] = {0};
+  WORD preroll_frame_offset[MAX_PREROLL_FRAME_OFFSET] = {0};
   WORD preroll_units = -1;
   WORD32 access_units = 0;
+  WORD32 bits_consumed = 0;
 
   if (frames_done == 0) {
     if ((pstr_audio_specific_config->channel_configuration > 2) ||
@@ -248,10 +343,30 @@
 
   {
     WORD32 tot_out_bytes = 0;
+    jmp_buf local;
     pstr_dec_data = (ia_dec_data_struct *)aac_dec_handle->pstr_dec_data;
+    pstr_dec_data->str_usac_data.frame_ok = 1;
+    pstr_dec_data->str_usac_data.ec_flag = aac_dec_handle->p_config->ui_err_conceal;
+    if (pstr_dec_data->str_usac_data.ec_flag) {
+      err = setjmp(local);
+    }
+
+    if (aac_dec_handle->p_config->ui_err_conceal) {
+      if (err == 0) {
+        if (pstr_dec_data->dec_bit_buf.cnt_bits) {
+          aac_dec_handle->ui_in_bytes += (pstr_dec_data->dec_bit_buf.cnt_bits >> 3);
+          if (aac_dec_handle->ui_in_bytes > IA_MAX_INP_BUFFER_SIZE) {
+            aac_dec_handle->ui_in_bytes = 0;
+          }
+        }
+      } else {
+        pstr_dec_data->str_usac_data.frame_ok = 0;
+      }
+    }
 
     if (frames_done == 0) {
       WORD32 delay;
+      pstr_dec_data->str_usac_data.first_frame = 1;
       if (aac_dec_handle->decode_create_done == 0) {
         delay = ixheaacd_decode_create(
             handle, pstr_dec_data,
@@ -272,59 +387,102 @@
     pstr_dec_data->dec_bit_buf.bit_pos = 7;
     pstr_dec_data->dec_bit_buf.cnt_bits = pstr_dec_data->dec_bit_buf.size;
     pstr_dec_data->dec_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
-
+    if (pstr_dec_data->str_usac_data.ec_flag) {
+      pstr_dec_data->xaac_jmp_buf = &local;
+    }
     pstr_dec_data->str_usac_data.usac_flag = aac_dec_handle->usac_flag;
+    pstr_dec_data->str_usac_data.esbr_hq = handle->aac_config.ui_hq_esbr;
+    pstr_dec_data->str_usac_data.enh_sbr = handle->aac_config.ui_enh_sbr;
+    pstr_dec_data->str_usac_data.enh_sbr_ps = handle->aac_config.ui_enh_sbr_ps;
     if (pstr_dec_data->dec_bit_buf.size > pstr_dec_data->dec_bit_buf.max_size)
       pstr_dec_data->dec_bit_buf.max_size = pstr_dec_data->dec_bit_buf.size;
     /* audio pre roll frame parsing*/
 
+    if (aac_dec_handle->bs_format == LOAS_BSFORMAT && pstr_dec_data->str_usac_data.frame_ok) {
+      WORD32 sync = ixheaacd_read_bits_buf(&pstr_dec_data->dec_bit_buf, 11);
+      if (sync == 0x2b7) {
+        WORD32 result = ixheaacd_latm_audio_mux_element(
+          &pstr_dec_data->dec_bit_buf, &aac_dec_handle->latm_struct_element,
+          aac_dec_handle,
+          (ia_sampling_rate_info_struct *)&handle->aac_tables
+          .pstr_huffmann_tables->str_sample_rate_info[0]);
+        if (result < 0) {
+          if (aac_dec_handle->p_config->ui_err_conceal)
+            pstr_dec_data->str_usac_data.frame_ok = 0;
+          else
+            return result;
+        }
+      }
+      bits_consumed = pstr_dec_data->dec_bit_buf.size - pstr_dec_data->dec_bit_buf.cnt_bits;
+    }
+
     do {
       config_len = 0;
-      if (access_units == 0 &&
-          pstr_audio_specific_config->str_usac_config.str_usac_dec_config
-              .preroll_flag) {
-        config_len = ixheaacd_audio_preroll_parsing(pstr_dec_data, &config[0],
-                                                    &preroll_units,
-                                                    &preroll_frame_offset[0]);
+      if (err == 0 || aac_dec_handle->p_config->ui_err_conceal == 0) {
+        if (access_units == 0 &&
+            pstr_audio_specific_config->str_usac_config.str_usac_dec_config.preroll_flag) {
+          config_len = ixheaacd_audio_preroll_parsing(
+              pstr_dec_data, &config[0], &preroll_units, &preroll_frame_offset[0], aac_dec_handle,
+              &aac_dec_handle->drc_config_changed, &aac_dec_handle->apply_crossfade);
 
-        if (config_len == IA_FATAL_ERROR) return IA_FATAL_ERROR;
-      }
+          if (config_len == IA_FATAL_ERROR) return IA_FATAL_ERROR;
+        }
 
-      if (config_len != 0) {
-        /* updating the config parameters*/
-        ia_bit_buf_struct config_bit_buf = {0};
+        if (config_len != 0) {
+          ia_bit_buf_struct config_bit_buf = {0};
 
-        config_bit_buf.ptr_bit_buf_base = config;
-        config_bit_buf.size = config_len << 3;
-        config_bit_buf.ptr_read_next = config_bit_buf.ptr_bit_buf_base;
-        config_bit_buf.ptr_bit_buf_end = (UWORD8 *)config + config_len;
-        config_bit_buf.bit_pos = 7;
-        config_bit_buf.cnt_bits = config_bit_buf.size;
-        config_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
+          config_bit_buf.ptr_bit_buf_base = config;
+          config_bit_buf.size = config_len << 3;
+          config_bit_buf.ptr_read_next = config_bit_buf.ptr_bit_buf_base;
+          config_bit_buf.ptr_bit_buf_end = (UWORD8 *)config + config_len;
+          config_bit_buf.bit_pos = 7;
+          config_bit_buf.cnt_bits = config_bit_buf.size;
+          if (pstr_dec_data->str_usac_data.ec_flag) {
+            config_bit_buf.xaac_jmp_buf = &local;
+          } else {
+            config_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
+          }
 
-        suitable_tracks =
-            ixheaacd_frm_data_init(pstr_audio_specific_config, pstr_dec_data);
+          suitable_tracks = ixheaacd_frm_data_init(pstr_audio_specific_config, pstr_dec_data);
 
-        if (suitable_tracks <= 0) return -1;
+          if (suitable_tracks <= 0) return -1;
 
-        /* call codec re-configure*/
-        aac_dec_handle->decode_create_done = 0;
-        err = ixheaacd_config(
-            &config_bit_buf, &(pstr_dec_data->str_frame_data
-                                   .str_audio_specific_config.str_usac_config),
-            &(pstr_audio_specific_config
-                  ->channel_configuration) /*&pstr_audio_specific_config->str_usac_config*/);
-        if (err != 0) return -1;
+          aac_dec_handle->decode_create_done = 0;
+          if (aac_dec_handle->p_config->ui_err_conceal) {
+            if (pstr_dec_data->str_usac_data.frame_ok == 1 && err == 0) {
+              err = ixheaacd_config(
+                  &config_bit_buf,
+                  &(pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config),
+                  &(pstr_audio_specific_config->channel_configuration),
+                  aac_dec_handle->p_config->ui_err_conceal);
+              if (err != 0) {
+                if (frames_done == 0)
+                  return -1;
+                else
+                  pstr_dec_data->str_usac_data.frame_ok = 0;
+              }
+            }
+          } else {
+            err = ixheaacd_config(
+                &config_bit_buf,
+                &(pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config),
+                &(pstr_audio_specific_config->channel_configuration),
+                aac_dec_handle->p_config->ui_err_conceal);
+            if (err != 0) {
+              return err;
+            }
+          }
 
-        pstr_dec_data->str_frame_data.str_audio_specific_config
-            .sampling_frequency =
-            pstr_dec_data->str_frame_data.str_audio_specific_config
-                .str_usac_config.usac_sampling_frequency;
-        delay = ixheaacd_decode_create(
-            handle, pstr_dec_data,
-            pstr_dec_data->str_frame_data.scal_out_select + 1);
-        if (delay == -1) return -1;
-        *num_channel_out = pstr_dec_data->str_frame_data.scal_out_num_channels;
+          pstr_dec_data->str_frame_data.str_audio_specific_config.sampling_frequency =
+              pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config
+                  .usac_sampling_frequency;
+          delay = ixheaacd_decode_create(handle, pstr_dec_data,
+                                         pstr_dec_data->str_frame_data.scal_out_select + 1);
+          if (delay == -1) return -1;
+          *num_channel_out = pstr_dec_data->str_frame_data.scal_out_num_channels;
+        }
+      } else {
+        pstr_dec_data->str_usac_data.frame_ok = 0;
       }
 
       pstr_dec_data->dec_bit_buf.ptr_bit_buf_base = (UWORD8 *)inbuffer;
@@ -337,8 +495,13 @@
       pstr_dec_data->dec_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
 
       pstr_dec_data->str_usac_data.usac_flag = aac_dec_handle->usac_flag;
+      pstr_dec_data->str_usac_data.esbr_hq = handle->aac_config.ui_hq_esbr;
+      pstr_dec_data->str_usac_data.enh_sbr = handle->aac_config.ui_enh_sbr;
+      pstr_dec_data->str_usac_data.enh_sbr_ps = handle->aac_config.ui_enh_sbr_ps;
 
-      if (preroll_frame_offset[access_units]) {
+      if (preroll_frame_offset[access_units] &&
+          ((pstr_dec_data->str_usac_data.ec_flag && pstr_dec_data->str_usac_data.frame_ok == 1) ||
+           pstr_dec_data->str_usac_data.ec_flag == 0)) {
         pstr_dec_data->dec_bit_buf.cnt_bits =
             pstr_dec_data->dec_bit_buf.size -
             preroll_frame_offset[access_units];
@@ -347,10 +510,24 @@
         pstr_dec_data->dec_bit_buf.ptr_read_next =
             pstr_dec_data->dec_bit_buf.ptr_read_next +
             (preroll_frame_offset[access_units] / 8);
+      } else {
+        pstr_dec_data->dec_bit_buf.cnt_bits =
+          pstr_dec_data->dec_bit_buf.size -
+          (bits_consumed);
+        pstr_dec_data->dec_bit_buf.bit_pos =
+          7 - (bits_consumed) % 8;
+        pstr_dec_data->dec_bit_buf.ptr_read_next =
+          pstr_dec_data->dec_bit_buf.ptr_read_next +
+          (bits_consumed / 8);
       }
 
-      // temp_read=ixheaacd_show_bits_buf(pstr_dec_data->dec_bit_buf,preroll_frame_offset[access_unit]);
-      if (!aac_dec_handle->decode_create_done) return IA_FATAL_ERROR;
+      if (pstr_dec_data->str_usac_data.ec_flag) {
+        if (!aac_dec_handle->decode_create_done && pstr_dec_data->str_usac_data.frame_ok == 1 &&
+            config_len != 0)
+          return IA_FATAL_ERROR;
+      } else {
+        if (!aac_dec_handle->decode_create_done) return IA_FATAL_ERROR;
+      }
 
       err =
           ixheaacd_usac_process(pstr_dec_data, num_channel_out, aac_dec_handle);
@@ -376,6 +553,13 @@
       if (err == -1) return err;
 
       num_samples_out = pstr_dec_data->str_usac_data.output_samples;
+      if (!handle->aac_config.peak_limiter_off && pstr_dec_data->str_usac_data.ec_flag) {
+        aac_dec_handle->peak_limiter.num_channels = *num_channel_out;
+
+        ixheaacd_peak_limiter_process_float(&aac_dec_handle->peak_limiter,
+                                            pstr_dec_data->str_usac_data.time_sample_vector,
+                                            num_samples_out);
+      }
 
       ixheaacd_samples_sat((WORD8 *)outbuffer + tot_out_bytes, num_samples_out,
                            pcmsize,
@@ -425,6 +609,25 @@
 
         pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config
             .str_usac_dec_config.preroll_counter = preroll_counter;
+
+        ia_usac_decoder_config_struct *pstr_usac_dec_config_state =
+            &pstr_audio_specific_config->str_usac_config.str_usac_dec_config;
+        ia_usac_decoder_config_struct *pstr_usac_dec_config_dec_data =
+            &pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config
+            .str_usac_dec_config;
+        pstr_usac_dec_config_state->num_config_extensions =
+            pstr_usac_dec_config_dec_data->num_config_extensions;
+        pstr_usac_dec_config_state->num_elements =
+            pstr_usac_dec_config_dec_data->num_elements;
+        memcpy(pstr_usac_dec_config_state->usac_cfg_ext_info_buf,
+            pstr_usac_dec_config_dec_data->usac_cfg_ext_info_buf,
+            sizeof(pstr_usac_dec_config_state->usac_cfg_ext_info_buf));
+        memcpy(pstr_usac_dec_config_state->usac_ext_ele_payload_present,
+            pstr_usac_dec_config_dec_data->usac_ext_ele_payload_present,
+            sizeof(pstr_usac_dec_config_dec_data->usac_ext_ele_payload_present));
+        memcpy(pstr_usac_dec_config_state->usac_ext_ele_payload_buf,
+            pstr_usac_dec_config_dec_data->usac_ext_ele_payload_buf,
+            sizeof(pstr_usac_dec_config_state->usac_ext_ele_payload_buf));
       }
 
       access_units++;
@@ -434,5 +637,20 @@
     *out_bytes = tot_out_bytes;
   }
 
+  if (aac_dec_handle->bs_format == LOAS_BSFORMAT) {
+    pstr_dec_data->dec_bit_buf.ptr_bit_buf_base = (UWORD8 *)inbuffer;
+    pstr_dec_data->dec_bit_buf.size = aac_dec_handle->ui_in_bytes << 3;
+    pstr_dec_data->dec_bit_buf.ptr_bit_buf_end =
+      (UWORD8 *)inbuffer + aac_dec_handle->ui_in_bytes - 1;
+    pstr_dec_data->dec_bit_buf.ptr_read_next = (UWORD8 *)inbuffer;
+    pstr_dec_data->dec_bit_buf.bit_pos = 7;
+    pstr_dec_data->dec_bit_buf.cnt_bits = pstr_dec_data->dec_bit_buf.size;
+    pstr_dec_data->dec_bit_buf.xaac_jmp_buf = &(aac_dec_handle->xaac_jmp_buf);
+
+    ixheaacd_read_bits_buf(&pstr_dec_data->dec_bit_buf, 11);
+    aac_dec_handle->i_bytes_consumed =
+        ixheaacd_read_bits_buf(&pstr_dec_data->dec_bit_buf, 13) + 3;
+  }
+
   return err;
 }
diff --git a/decoder/ixheaacd_defines.h b/decoder/ixheaacd_defines.h
index ed85be2..2849ec5 100644
--- a/decoder/ixheaacd_defines.h
+++ b/decoder/ixheaacd_defines.h
@@ -38,25 +38,12 @@
 #define NOISE_HCB 13
 #define INTENSITY_HCB2 14
 #define INTENSITY_HCB 15
+#define BOOKSCL 12
 
 #define CHANNELS 2
 
 #define SIZE01 (MAX_BINS_LONG / 16)
-#define SIZE02 2 * SIZE01
-#define SIZE03 3 * SIZE01
-#define SIZE04 4 * SIZE01
-#define SIZE05 5 * SIZE01
-#define SIZE06 6 * SIZE01
 #define SIZE07 7 * SIZE01
-#define SIZE08 8 * SIZE01
-#define SIZE09 9 * SIZE01
-#define SIZE10 10 * SIZE01
-#define SIZE11 11 * SIZE01
-#define SIZE12 12 * SIZE01
-#define SIZE13 13 * SIZE01
-#define SIZE14 14 * SIZE01
-#define SIZE15 15 * SIZE01
-#define SIZE16 16 * SIZE01
 
 typedef struct { WORD32 sampling_frequency; } ia_sampling_rate_info_struct;
 
diff --git a/decoder/ixheaacd_definitions.h b/decoder/ixheaacd_definitions.h
index 78b9af0..f1b4570 100644
--- a/decoder/ixheaacd_definitions.h
+++ b/decoder/ixheaacd_definitions.h
@@ -34,11 +34,6 @@
 #define IA_ENHAACPLUS_DEC_INPUT_IDX (2)
 #define IA_ENHAACPLUS_DEC_OUTPUT_IDX (3)
 
-#define IA_MPS_DEC_PERSIST_IDX (0)
-#define IA_MPS_DEC_SCRATCH_IDX (1)
-#define IA_MPS_DEC_INPUT_IDX (2)
-#define IA_MPS_DEC_MPS_INPUT_IDX (3)
-#define IA_MPS_DEC_OUTPUT_IDX (4)
 #define IA_MAX_PREROLL_FRAMES (4)
 #define IA_MAX_OUTPUT_PCM_SIZE (3)
 #define IA_MAX_USAC_CH (2)
@@ -52,10 +47,7 @@
   (IA_MAX_USAC_CH * IA_MAX_PREROLL_FRAMES * IA_MAX_OUT_SAMPLES_PER_FRAME * \
    IA_MAX_OUTPUT_PCM_SIZE)
 
-#define IA_MPS_DEC_INP_BUF_SIZE (0)
-#define IA_MPS_DEC_OUT_BUF_SIZE (0)
-
 #define IA_ENHAACPLUS_DEC_MAX_CHANNEL (2)
 #define IA_ENHAACPLUS_DEC_FRAME_LENGTH (1024)
 
-#endif /* __DEFINITIONS_H__ */
+#endif /* IXHEAACD_DEFINITIONS_H */
diff --git a/decoder/ixheaacd_drc_data_struct.h b/decoder/ixheaacd_drc_data_struct.h
index faf9775..104104b 100644
--- a/decoder/ixheaacd_drc_data_struct.h
+++ b/decoder/ixheaacd_drc_data_struct.h
@@ -49,6 +49,7 @@
   UWORD8 new_drc_fac;
   UWORD8 prev_interp_scheme;
   WORD32 drc_factors_sbr[SBR_QMF_SUB_SAMPLES][SBR_QMF_SUB_BANDS];
+  WORD32 drc_factors_sbr_lat[SBR_QMF_SUB_SAMPLES][SBR_QMF_SUB_BANDS];
 } ixheaac_drc_data_struct;
 
 typedef struct {
diff --git a/decoder/ixheaacd_drc_dec.h b/decoder/ixheaacd_drc_dec.h
index 9990f3a..1d3393c 100644
--- a/decoder/ixheaacd_drc_dec.h
+++ b/decoder/ixheaacd_drc_dec.h
@@ -32,12 +32,13 @@
 
 WORD32 ixheaacd_dec_drc_read_element(ia_drc_dec_struct *pstr_drc_dec,
                                      ia_drc_dec_struct *drc_dummy,
-                                     ia_handle_bit_buf_struct bs);
+                                     ia_bit_buf_struct *it_bit_buf);
 
 WORD32 ixheaacd_drc_map_channels(ia_drc_dec_struct *drc_dec, WORD32 num_ch,
                                  WORD32 frame_size);
 
 VOID ixheaacd_drc_apply(ia_drc_dec_struct *pstr_drc_dec,
                         WORD32 *ptr_spectral_coef, WORD32 win_seq,
-                        WORD32 channel, WORD32 frame_size);
+                        WORD32 channel, WORD32 frame_size,
+                        WORD32 audio_object_type);
 #endif
diff --git a/decoder/ixheaacd_drc_freq_dec.c b/decoder/ixheaacd_drc_freq_dec.c
index cd6b81d..5525678 100644
--- a/decoder/ixheaacd_drc_freq_dec.c
+++ b/decoder/ixheaacd_drc_freq_dec.c
@@ -48,6 +48,8 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
@@ -76,6 +78,11 @@
 #include "ixheaacd_aacdec.h"
 #include "ixheaacd_config.h"
 #include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_struct_def.h"
 
@@ -499,7 +506,7 @@
       }
 
       if (drc_on > 1) {
-        return IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_DRC_DATA;
+        return IA_XHEAAC_DEC_EXE_FATAL_INVALID_DRC_DATA;
       }
     }
   }
@@ -552,9 +559,12 @@
     pstr_drc_dec->drc_channel_next_index[ch] = 0;
     pstr_drc_dec->state = 0;
 
-    for (j = 0; j < 64; j++)
-      for (k = 0; k < 64; k++)
+    for (j = 0; j < 64; j++) {
+      for (k = 0; k < 64; k++) {
         pstr_drc_data->drc_factors_sbr[j][k] = DRC_SBR_ONE_Q25;
+        pstr_drc_data->drc_factors_sbr_lat[j][k] = DRC_SBR_ONE_Q25;
+      }
+    }
     for (j = 0; j < MAX_DRC_BANDS; j++) pstr_drc_data->drc_fac[j] = 0;
 
     pstr_drc_data->n_mdct_bands[0] = FRAME_SIZE;
@@ -567,7 +577,7 @@
   }
 }
 
-static WORD32 ixheaacd_drc_excluded_channels(ia_handle_bit_buf_struct bs,
+static WORD32 ixheaacd_drc_excluded_channels(ia_bit_buf_struct *it_bit_buf,
                                              WORD32 nch, UWORD8 *b_channel_on) {
   WORD32 ich, nbyte = 0;
   WORD32 num_excl_chan;
@@ -575,16 +585,16 @@
 
   num_excl_chan = 7;
   for (ich = 0; ich < 7; ich++) {
-    exclude_mask = ixheaacd_read_bits_buf(bs, 1);
+    exclude_mask = ixheaacd_read_bits_buf(it_bit_buf, 1);
     if (ich < nch) {
       b_channel_on[ich] = !exclude_mask;
     }
   }
   nbyte++;
 
-  while (ixheaacd_read_bits_buf(bs, 1)) {
+  while (ixheaacd_read_bits_buf(it_bit_buf, 1)) {
     for (ich = num_excl_chan; ich < num_excl_chan + 7; ich++) {
-      exclude_mask = ixheaacd_read_bits_buf(bs, 1);
+      exclude_mask = ixheaacd_read_bits_buf(it_bit_buf, 1);
       if (ich < nch) {
         b_channel_on[ich] = !exclude_mask;
       }
@@ -597,21 +607,19 @@
 }
 
 static WORD32 ixheaacd_drc_element_read(
-    ia_handle_bit_buf_struct bs, ixheaac_drc_bs_data_struct *pstr_bs_data) {
+    ia_bit_buf_struct *it_bit_buf, ixheaac_drc_bs_data_struct *pstr_bs_data) {
   WORD32 ich, idrc, nbyte = 1;
   WORD32 pce_tag_present, drc_bands_present;
-  WORD32 pce_instance_tag, drc_tag_reserved_bits;
-  WORD32 prog_ref_level_reserved_bits;
   WORD32 excluded_chns_present;
   UWORD8 drc_band_incr;
   WORD8 max_dyn_rng_dlbl = -128;
 
   pstr_bs_data->drc_num_bands = 1;
 
-  pce_tag_present = ixheaacd_read_bits_buf(bs, 1);
+  pce_tag_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
   if (pce_tag_present) {
-    pce_instance_tag = ixheaacd_read_bits_buf(bs, 4);
-    drc_tag_reserved_bits = ixheaacd_read_bits_buf(bs, 4);
+    ixheaacd_read_bits_buf(it_bit_buf, 4);/*pce_instance_tag*/
+    ixheaacd_read_bits_buf(it_bit_buf, 4);/*drc_tag_reserved_bits*/
     nbyte++;
   }
 
@@ -619,21 +627,21 @@
     pstr_bs_data->b_channel_on[ich] = 1;
   }
 
-  excluded_chns_present = ixheaacd_read_bits_buf(bs, 1);
+  excluded_chns_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
   if (excluded_chns_present) {
-    nbyte += ixheaacd_drc_excluded_channels(bs, MAX_AUDIO_CHANNELS,
+    nbyte += ixheaacd_drc_excluded_channels(it_bit_buf, MAX_AUDIO_CHANNELS,
                                             pstr_bs_data->b_channel_on);
   }
 
-  drc_bands_present = ixheaacd_read_bits_buf(bs, 1);
+  drc_bands_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
   if (drc_bands_present) {
-    drc_band_incr = ixheaacd_read_bits_buf(bs, 4);
-    pstr_bs_data->drc_interpolation_scheme = ixheaacd_read_bits_buf(bs, 4);
+    drc_band_incr = ixheaacd_read_bits_buf(it_bit_buf, 4);
+    pstr_bs_data->drc_interpolation_scheme = ixheaacd_read_bits_buf(it_bit_buf, 4);
     nbyte++;
 
     pstr_bs_data->drc_num_bands += drc_band_incr;
     for (idrc = 0; idrc < pstr_bs_data->drc_num_bands; idrc++) {
-      pstr_bs_data->drc_band_top[idrc] = ixheaacd_read_bits_buf(bs, 8);
+      pstr_bs_data->drc_band_top[idrc] = ixheaacd_read_bits_buf(it_bit_buf, 8);
       nbyte++;
     }
   } else {
@@ -641,17 +649,17 @@
     pstr_bs_data->drc_interpolation_scheme = 0;
   }
 
-  pstr_bs_data->prog_ref_level_present = ixheaacd_read_bits_buf(bs, 1);
+  pstr_bs_data->prog_ref_level_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
   if (pstr_bs_data->prog_ref_level_present) {
-    pstr_bs_data->prog_ref_level = ixheaacd_read_bits_buf(bs, 7);
+    pstr_bs_data->prog_ref_level = ixheaacd_read_bits_buf(it_bit_buf, 7);
 
-    prog_ref_level_reserved_bits = ixheaacd_read_bits_buf(bs, 1);
+    ixheaacd_read_bits_buf(it_bit_buf, 1);/*prog_ref_level_reserved_bits*/
     nbyte++;
   }
 
   for (idrc = 0; idrc < pstr_bs_data->drc_num_bands; idrc++) {
-    WORD32 sign = ixheaacd_read_bits_buf(bs, 1);
-    pstr_bs_data->dyn_rng_dlbl[idrc] = ixheaacd_read_bits_buf(bs, 7);
+    WORD32 sign = ixheaacd_read_bits_buf(it_bit_buf, 1);
+    pstr_bs_data->dyn_rng_dlbl[idrc] = ixheaacd_read_bits_buf(it_bit_buf, 7);
     if (sign)
       pstr_bs_data->dyn_rng_dlbl[idrc] = -pstr_bs_data->dyn_rng_dlbl[idrc];
     max_dyn_rng_dlbl = max(max_dyn_rng_dlbl, pstr_bs_data->dyn_rng_dlbl[idrc]);
@@ -663,20 +671,20 @@
   return nbyte;
 }
 
-static int ixheaacd_drc_read_compression(ia_handle_bit_buf_struct bs,
+static WORD32 ixheaacd_drc_read_compression(ia_bit_buf_struct *it_bit_buf,
                                          ia_drc_dec_struct *pstr_drc_dec,
                                          WORD32 bs_pos) {
-  int bit_count = 0;
-  int dmx_lvl_present, ext_present, compression_present;
-  int coarse_gain_present, fine_grain_present;
+  WORD32 bit_count = 0;
+  WORD32 dmx_lvl_present, ext_present, compression_present;
+  WORD32 coarse_gain_present, fine_grain_present;
   ia_bit_buf_struct local_bs = {0};
   WORD32 bytes = 0, bits = 0;
 
-  memcpy(&local_bs, bs, sizeof(ia_bit_buf_struct));
+  memcpy(&local_bs, it_bit_buf, sizeof(ia_bit_buf_struct));
 
   if (local_bs.size < bs_pos) {
     longjmp(*(local_bs.xaac_jmp_buf),
-            IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
   }
   bytes = (local_bs.size - bs_pos) >> 3;
   bits = (local_bs.size - bs_pos) % 8;
@@ -746,7 +754,7 @@
   }
 
   if (ext_present) {
-    int ext_bits = 8;
+    WORD32 ext_bits = 8;
 
     ixheaacd_read_bits_buf(&local_bs, 1);
     if (ixheaacd_read_bits_buf(&local_bs, 1)) ext_bits += 8;
@@ -762,26 +770,25 @@
 
 WORD32 ixheaacd_dec_drc_read_element(ia_drc_dec_struct *pstr_drc_dec,
                                      ia_drc_dec_struct *drc_dummy,
-                                     ia_handle_bit_buf_struct bs) {
+                                     ia_bit_buf_struct *it_bit_buf) {
   WORD32 bits_read = 0;
-  WORD32 bits_parse = 0;
   if (pstr_drc_dec->num_drc_elements < pstr_drc_dec->max_audio_channels) {
     bits_read = ixheaacd_drc_element_read(
-        bs, &pstr_drc_dec->str_drc_bs_data[pstr_drc_dec->num_drc_elements]);
+        it_bit_buf, &pstr_drc_dec->str_drc_bs_data[pstr_drc_dec->num_drc_elements]);
 
     if (pstr_drc_dec->dvb_anc_data_present) {
-      bits_parse = ixheaacd_drc_read_compression(
-          bs, pstr_drc_dec, pstr_drc_dec->dvb_anc_data_pos);
+      ixheaacd_drc_read_compression(
+          it_bit_buf, pstr_drc_dec, pstr_drc_dec->dvb_anc_data_pos);
     }
     pstr_drc_dec->num_drc_elements++;
 
   } else {
     ixheaac_drc_bs_data_struct drc_ele_dummy;
 
-    bits_read = ixheaacd_drc_element_read(bs, &drc_ele_dummy);
+    bits_read = ixheaacd_drc_element_read(it_bit_buf, &drc_ele_dummy);
     if (pstr_drc_dec->dvb_anc_data_present) {
-      bits_parse = ixheaacd_drc_read_compression(
-          bs, drc_dummy, pstr_drc_dec->dvb_anc_data_pos);
+      ixheaacd_drc_read_compression(
+          it_bit_buf, drc_dummy, pstr_drc_dec->dvb_anc_data_pos);
     }
   }
 
@@ -871,7 +878,7 @@
 
 VOID ixheaacd_drc_apply(ia_drc_dec_struct *pstr_drc_dec,
                         WORD32 *ptr_spectral_coef, WORD32 win_seq,
-                        WORD32 channel, WORD32 frame_size) {
+                        WORD32 channel, WORD32 frame_size, WORD32 audio_object_type) {
   WORD32 drc_band, spec_pos, start_pos, end_pos;
   WORD32 low_hi, drc_norm, drc_freq_fac;
   WORD32 drc_fac, div_val, mod_val, ret_val, offset_value;
@@ -885,9 +892,29 @@
   WORD32 qmf_start_pos, qmf_stop_pos, qmf_start, i, j;
   WORD32 prev_frame_drc_sbr_factors[64];
   WORD32 *ptr_drc_fac;
-  ptr_drc_fac =
-      &pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr[0][0];
 
+  if ((audio_object_type != AOT_ER_AAC_ELD) && (audio_object_type != AOT_ER_AAC_LD))
+  {
+    for (i = 0; i < SBR_QMF_SUB_SAMPLES; i++)
+    {
+      for (j = 0; j < SBR_QMF_SUB_BANDS; j++)
+      {
+        pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr[i][j] =
+          pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr_lat[i][j];
+      }
+    }
+    for (j = 0; j < 32; j++)
+    {
+      memcpy(pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr_lat[j],
+             pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr_lat[j + 32],
+             SBR_QMF_SUB_BANDS * sizeof(WORD32));
+    }
+    ptr_drc_fac =
+      &pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr_lat[0][0];
+  } else {
+    ptr_drc_fac =
+      &pstr_drc_dec->str_drc_channel_data[channel].drc_factors_sbr[0][0];
+  }
   for (i = 0; i < 64; i++) {
     drc_sbr_factors[i] = ptr_drc_fac;
     ptr_drc_fac += 64;
@@ -929,7 +956,7 @@
   for (drc_band = 0; drc_band < pstr_drc_data->n_drc_bands; drc_band++) {
     if ((pstr_drc_dec->str_drc_bs_data[0].drc_data_type == DVB_DRC_ANC_DATA) &&
         (pstr_drc_dec->heavy_mode)) {
-      int val_x, val_y;
+      WORD32 val_x, val_y;
       float compression_factor;
       float temp;
       val_x = ((UWORD8)pstr_drc_data->drc_fac_dvb[drc_band]) >> 4;
@@ -938,7 +965,7 @@
       compression_factor = (FLOAT32)(48.164 - 6.0206 * val_x - 0.4014 * val_y);
 
       temp = (FLOAT32)(pow(10, (float)compression_factor / 20.0));
-      drc_freq_fac = (WORD32)(temp * 33554431);
+      drc_freq_fac = (WORD32)(temp * 33554431.0f);
 
     } else {
       if (pstr_drc_data->drc_fac[drc_band] < 0) {
diff --git a/decoder/ixheaacd_dsp_fft32x32s.h b/decoder/ixheaacd_dsp_fft32x32s.h
index 7e6fdc3..3dbd5b3 100644
--- a/decoder/ixheaacd_dsp_fft32x32s.h
+++ b/decoder/ixheaacd_dsp_fft32x32s.h
@@ -26,4 +26,16 @@
 
 VOID ixheaacd_inv_dit_fft_8pt_armv8(WORD32 *x, WORD32 *real, WORD32 *imag);
 
+#define CPLX_MPY_FFT(re, im, a, b, c, d) \
+  do {                                   \
+    re = ((a * c) - (b * d));            \
+    im = ((a * d) + (b * c));            \
+  } while (0)
+
+#define CPLX_MPY_IFFT(re, im, a, b, c, d) \
+  do {                                    \
+    re = ((a * c) + (b * d));             \
+    im = (-(a * d) + (b * c));            \
+  } while (0)
+
 #endif
diff --git a/decoder/ixheaacd_ec.h b/decoder/ixheaacd_ec.h
new file mode 100644
index 0000000..bc625af
--- /dev/null
+++ b/decoder/ixheaacd_ec.h
@@ -0,0 +1,45 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_EC_H
+#define IXHEAACD_EC_H
+
+VOID ixheaacd_aac_ec_init(ia_ec_state_str *pstr_ec_state);
+
+VOID ixheaacd_aac_apply_ec(ia_ec_state_str *pstr_ec_state,
+                           ia_aac_dec_channel_info_struct *pstr_aac_dec_channel_info,
+                           const ia_usac_samp_rate_info *pstr_samp_rate_info,
+                           const WORD32 num_samples, ia_ics_info_struct *pstr_ics_info,
+                           const WORD32 frame_status);
+
+VOID ixheaacd_usac_ec_init(ia_ec_state_str *pstr_ec_state, WORD32 core_coder_mode);
+
+VOID ixheaacd_usac_ec_save_states(ia_ec_state_str *pstr_ec_state,
+                                  ia_usac_data_struct *pstr_usac_data, WORD32 ch);
+
+VOID ixheaacd_usac_apply_ec(ia_usac_data_struct *pstr_usac_data,
+                            const ia_usac_samp_rate_info *pstr_samp_rate_info, WORD32 ch);
+
+VOID ixheaacd_usac_lpc_ec(FLOAT32 lsp[][ORDER], FLOAT32 *lpc4_lsf, FLOAT32 *lsf_adaptive_mean,
+                          const WORD32 first_lpd_flag);
+
+VOID ixheaacd_usac_tcx_ec(ia_usac_data_struct *pstr_usac_data, ia_usac_lpd_decoder_handle st,
+                          FLOAT32 *ptr_lsp_curr, WORD32 frame_idx, FLOAT32 *lp_flt_coff_a);
+
+#endif /* IXHEAACD_EC_H */
diff --git a/decoder/ixheaacd_ec_defines.h b/decoder/ixheaacd_ec_defines.h
new file mode 100644
index 0000000..cc8692a
--- /dev/null
+++ b/decoder/ixheaacd_ec_defines.h
@@ -0,0 +1,47 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_EC_DEFINES_H
+#define IXHEAACD_EC_DEFINES_H
+
+#define NO_TRANSITION (0)
+#define TRANS_SHORT_LONG (1)
+
+#define FRAME_OKAY (0)
+#define FRAME_CONCEAL_SINGLE (1)
+#define FRAME_FADE (2)
+#define FRAME_MUTE (3)
+#define MAX_FADE_FRAMES (8)
+
+#define MAX_SFB_EC (51)
+#define MAX_SPEC_SCALE_LEN (8)
+#define MAX_SPEC_SCALE_LEN_EC (128)
+
+#define BETA (0.25f)
+#define ONE_BETA (0.75f)
+#define BFI_FAC (0.90f)
+#define ONE_BFI_FAC (0.10f)
+
+#define FRAME_OK (0)
+#define FRAME_ERROR (1)
+#define FRAME_ERROR_ALLSLOTS (2)
+
+#define CONCEAL_NOT_DEFINED ((UWORD8)-1)
+
+#endif /* IXHEAACD_EC_DEFINES_H */
diff --git a/decoder/ixheaacd_ec_rom.c b/decoder/ixheaacd_ec_rom.c
new file mode 100644
index 0000000..cb95464
--- /dev/null
+++ b/decoder/ixheaacd_ec_rom.c
@@ -0,0 +1,32 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+
+#include <ixheaacd_type_def.h>
+#include "ixheaacd_ec_defines.h"
+
+const WORD16 ia_ec_interpolation_fac[4] = {(0x4000), (0x4c1b), (0x5a82), (0x6ba2)};
+
+const FLOAT32 ia_ec_fade_factors[MAX_FADE_FRAMES + 1] = {
+    1.00000f, 0.875f, 0.750f, 0.625f, 0.500f, 0.375f, 0.250f, 0.125f, 0.00000f};
+
+const WORD32 ia_ec_fade_factors_fix[MAX_FADE_FRAMES + 1] = {
+    1073741824, 939524096, 805306368, 671088640, 536870912, 402653184, 268435456, 134217728, 0};
+
+const FLOAT32 ixheaacd_exc_fade_fac[8] = { 0.8f, 0.7f, 0.6f, 0.5f, 0.4f, 0.3f, 0.2f, 0.1f };
diff --git a/decoder/ixheaacd_ec_rom.h b/decoder/ixheaacd_ec_rom.h
new file mode 100644
index 0000000..db2dc44
--- /dev/null
+++ b/decoder/ixheaacd_ec_rom.h
@@ -0,0 +1,28 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_EC_ROM_H
+#define IXHEAACD_EC_ROM_H
+extern const WORD16 ia_ec_interpolation_fac[4];
+extern const FLOAT32 ia_ec_fade_factors[MAX_FADE_FRAMES + 1];
+extern const WORD32 ia_ec_fade_factors_fix[MAX_FADE_FRAMES + 1];
+extern const FLOAT32 ixheaacd_exc_fade_fac[8];
+extern const FLOAT32 lsf_init[ORDER];
+extern const FLOAT32 ixheaacd_gamma_table[17];
+#endif /* IXHEAACD_EC_ROM_H */
diff --git a/decoder/ixheaacd_ec_struct_def.h b/decoder/ixheaacd_ec_struct_def.h
new file mode 100644
index 0000000..065fd93
--- /dev/null
+++ b/decoder/ixheaacd_ec_struct_def.h
@@ -0,0 +1,55 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_EC_STRUCT_DEF_H
+#define IXHEAACD_EC_STRUCT_DEF_H
+
+typedef struct {
+  WORD32 num_sfb_long;
+  WORD32 num_sfb_short;
+  WORD16 *ptr_sfb_long;
+  WORD16 *ptr_sfb_short;
+} ia_ec_sfb_str;
+
+typedef struct {
+  WORD32 prev_sfb_nrg[MAX_SFB_EC];
+  WORD32 pres_sfb_nrg[MAX_SFB_EC];
+  WORD32 spec_coeff[BLOCK_LEN_LONG];
+} ia_ec_scratch_str;
+
+typedef struct {
+  WORD32 spectral_coeff[BLOCK_LEN_LONG];
+  WORD16 q_spec_coeff[MAX_SPEC_SCALE_LEN_EC];
+  WORD32 prev_frame_ok[2];
+  UWORD8 win_shape;
+  UWORD8 win_shape_prev;
+  WORD32 win_seq;
+  WORD32 td_frame_prev;
+  WORD32 fac_data_present;
+  UWORD8 prev_win_group_len;
+  WORD32 conceal_state;
+  WORD32 prev_core_mode;
+  WORD32 fade_idx;
+  FLOAT32 lsf4[ORDER];
+  ia_ec_sfb_str str_ec_sfb;
+  ia_ec_scratch_str *pstr_ec_scratch;
+  ia_ec_scratch_str str_ec_scratch;
+} ia_ec_state_str;
+
+#endif /* IXHEAACD_EC_STRUCT_DEF_H */
diff --git a/decoder/ixheaacd_env_calc.c b/decoder/ixheaacd_env_calc.c
index dd873a8..d1b23dd 100644
--- a/decoder/ixheaacd_env_calc.c
+++ b/decoder/ixheaacd_env_calc.c
@@ -39,6 +39,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -474,7 +477,7 @@
     WORD32 sub_band_start, WORD32 lb_scale, FLAG noise_absc_flag,
     WORD32 smooth_length, WORD32 **anal_buf_real_mant,
     WORD32 **anal_buf_imag_mant, WORD32 low_pow_flag,
-    ia_sbr_tables_struct *ptr_sbr_tables) {
+    ia_sbr_tables_struct *ptr_sbr_tables, WORD16 max_cols) {
   WORD32 l, k;
   WORD32 scale_change;
   WORD32 bands = num_sub_bands - skip_bands;
@@ -506,15 +509,30 @@
   }
 
   for (l = start_pos; l < end_pos; l++) {
-    if ((l < MAX_COLS)) {
-      scale_change = (adj_e - input_e);
-    } else {
-      scale_change = (final_e - input_e);
 
-      if (((l == MAX_COLS)) && ((start_pos < MAX_COLS))) {
-        WORD32 diff = final_e - noise_e;
-        noise_e = final_e;
-        ixheaacd_noise_level_rescaling(noise_level_mant, diff, bands, 2);
+    if (max_cols != 30) {
+      if ((l < MAX_COLS)) {
+        scale_change = (adj_e - input_e);
+      } else {
+        scale_change = (final_e - input_e);
+
+        if (((l == MAX_COLS)) && ((start_pos < MAX_COLS))) {
+          WORD32 diff = final_e - noise_e;
+          noise_e = final_e;
+          ixheaacd_noise_level_rescaling(noise_level_mant, diff, bands, 2);
+        }
+      }
+    } else {
+      if ((l < max_cols)) {
+        scale_change = (adj_e - input_e);
+      } else {
+        scale_change = (final_e - input_e);
+
+        if (((l == max_cols)) && ((start_pos < max_cols))) {
+          WORD32 diff = final_e - noise_e;
+          noise_e = final_e;
+          ixheaacd_noise_level_rescaling(noise_level_mant, diff, bands, 2);
+        }
       }
     }
 
@@ -694,6 +712,10 @@
 
   WORD32 sub_band_start = pstr_freq_band_data->sub_band_start;
   WORD32 sub_band_end = pstr_freq_band_data->sub_band_end;
+
+  WORD16 num_timeslots = ptr_header_data->num_time_slots;
+  WORD16 max_cols = ptr_header_data->num_time_slots * 2;
+
   WORD32 num_sub_bands;
   WORD32 skip_bands;
   WORD32 bands;
@@ -783,15 +805,29 @@
 
       temp_val = ((max_sfb_nrg_exp + 13) >> 1);
 
-      if ((ptr_border_vec[i] < SBR_TIME_SLOTS)) {
-        if ((temp_val > adj_e)) {
-          adj_e = (WORD16)temp_val;
+      if (num_timeslots != 15) {
+        if ((ptr_border_vec[i] < SBR_TIME_SLOTS)) {
+          if ((temp_val > adj_e)) {
+            adj_e = (WORD16)temp_val;
+          }
         }
-      }
 
-      if ((ptr_border_vec[i + 1] > SBR_TIME_SLOTS)) {
-        if ((temp_val > final_e)) {
-          final_e = (WORD16)temp_val;
+        if ((ptr_border_vec[i + 1] > SBR_TIME_SLOTS)) {
+          if ((temp_val > final_e)) {
+            final_e = (WORD16)temp_val;
+          }
+        }
+      } else {
+        if ((ptr_border_vec[i] < num_timeslots)) {
+          if ((temp_val > adj_e)) {
+            adj_e = (WORD16)temp_val;
+          }
+        }
+
+        if ((ptr_border_vec[i + 1] > num_timeslots)) {
+          if ((temp_val > final_e)) {
+            final_e = (WORD16)temp_val;
+          }
         }
       }
     }
@@ -845,6 +881,11 @@
           ptr_sbr_tables);
     }
 
+    if (pstr_freq_band_data->freq_band_table[freq_res][0] < pstr_freq_band_data->sub_band_start) {
+      pstr_freq_band_data->sub_band_start = pstr_freq_band_data->freq_band_table[freq_res][0];
+      return IA_FATAL_ERROR;
+    }
+
     ixheaacd_calc_subband_gains(
         pstr_freq_band_data, ptr_frame_data, freq_res, ptr_noise_floor,
         num_sf_bands[freq_res], m, i, sine_mapped_matrix, alias_red_buf,
@@ -867,10 +908,18 @@
                                pstr_common_tables);
     }
 
-    if ((start_pos < MAX_COLS)) {
-      noise_e = adj_e;
+    if (max_cols != 30) {
+      if ((start_pos < MAX_COLS)) {
+        noise_e = adj_e;
+      } else {
+        noise_e = final_e;
+      }
     } else {
-      noise_e = final_e;
+      if ((start_pos < max_cols)) {
+        noise_e = adj_e;
+      } else {
+        noise_e = final_e;
+      }
     }
 
     bands = num_sub_bands - skip_bands;
@@ -894,7 +943,7 @@
         noise_level_mant, nrg_sine, start_pos, end_pos, input_e, adj_e, final_e,
         ptr_frame_data->max_qmf_subband_aac, lb_scale, noise_absc_flag,
         smooth_length, anal_buf_real_mant, anal_buf_imag_mant, low_pow_flag,
-        ptr_sbr_tables);
+        ptr_sbr_tables, max_cols);
   }
 
   first_start = ptr_border_vec[0] * SBR_TIME_STEP;
@@ -910,10 +959,17 @@
             ptr_frame_data->max_qmf_subband_aac, sub_band_end, 0, first_start,
             low_pow_flag);
 
-        reserve = (*ixheaacd_ixheaacd_expsubbandsamples)(
+        if (max_cols != 30) {
+          reserve = (*ixheaacd_ixheaacd_expsubbandsamples)(
             anal_buf_real_mant, anal_buf_imag_mant,
             ptr_frame_data->max_qmf_subband_aac, sub_band_end, first_start,
             MAX_COLS, low_pow_flag);
+        } else {
+          reserve = (*ixheaacd_ixheaacd_expsubbandsamples)(
+            anal_buf_real_mant, anal_buf_imag_mant,
+            ptr_frame_data->max_qmf_subband_aac, sub_band_end, first_start,
+            max_cols, low_pow_flag);
+        }
       }
     }
 
@@ -994,7 +1050,7 @@
   }
 }
 
-static PLATFORM_INLINE VOID ixheaacd_filt_buf_update(WORD16 *ptr_filt_buf,
+VOID ixheaacd_filt_buf_update(WORD16 *ptr_filt_buf,
                                                      WORD16 *ptr_filt_buf_noise,
                                                      WORD16 *nrg_gain,
                                                      WORD16 *noise_level_mant,
diff --git a/decoder/ixheaacd_env_calc.h b/decoder/ixheaacd_env_calc.h
index 139dae1..16e374c 100644
--- a/decoder/ixheaacd_env_calc.h
+++ b/decoder/ixheaacd_env_calc.h
@@ -50,15 +50,11 @@
     const ia_patch_param_struct *p_str_patch_param, WORD16 num_patches,
     ixheaacd_misc_tables *pstr_common_tables);
 
-PLATFORM_INLINE VOID ixheaacd_equalize_filt_buff_exp(WORD16 *ptr_filt_buf,
-                                                     WORD16 *nrg_gain_mant,
-                                                     WORD32 subbands);
-
-static PLATFORM_INLINE VOID ixheaacd_filt_buf_update(WORD16 *filt_buf_mant,
-                                                     WORD16 *ptr_filt_buf_noise,
-                                                     WORD16 *nrg_gain_mant,
-                                                     WORD16 *noise_level_mant,
-                                                     WORD32 num_sub_bands);
+VOID ixheaacd_filt_buf_update(WORD16 *filt_buf_mant,
+                              WORD16 *ptr_filt_buf_noise,
+                              WORD16 *nrg_gain_mant,
+                              WORD16 *noise_level_mant,
+                              WORD32 num_sub_bands);
 
 VOID ixheaacd_noise_level_rescaling(WORD16 *noise_level_mant, WORD32 diff,
                                     WORD32 num_sub_bands,
@@ -180,7 +176,7 @@
                                WORD16 *ptr_nrg_sine_m,
                                ixheaacd_misc_tables *pstr_common_tables);
 
-PLATFORM_INLINE VOID ixheaacd_equalize_filt_buff_exp(WORD16 *ptr_filt_buf,
+VOID ixheaacd_equalize_filt_buff_exp(WORD16 *ptr_filt_buf,
                                                      WORD16 *nrg_gain,
                                                      WORD32 subbands);
 
diff --git a/decoder/ixheaacd_env_dec.c b/decoder/ixheaacd_env_dec.c
index ac8b3c9..3249c79 100644
--- a/decoder/ixheaacd_env_dec.c
+++ b/decoder/ixheaacd_env_dec.c
@@ -42,6 +42,7 @@
 #include "ixheaacd_env_dec.h"
 #include "ixheaacd_sbr_const.h"
 #include "ixheaacd_basic_funcs.h"
+#include "ixheaacd_audioobjtypes.h"
 
 #define add16_m(a, b) ((a) + (b))
 #define sub16_m(a, b) ((a) - (b))
@@ -53,7 +54,7 @@
                                            WORD32 num_noise_fac, WORD32 amp_res,
                                            FLOAT32 *ptr_noise_floor) {
   WORD32 i;
-  static const FLOAT32 array[2] = {0.5f, 1.0f};
+  const FLOAT32 array[2] = {0.5f, 1.0f};
   FLOAT32 a_flt = array[amp_res];
 
   for (i = 0; i < num_env_sf; i++) {
@@ -275,6 +276,8 @@
     for (i = 0; i < num_env_sf; i++) {
       ptr_sbr_data->int_env_sf_arr[i] =
           add16_m(ptr_sbr_data->int_env_sf_arr[i], delta_exp);
+      ptr_sbr_data->flt_env_sf_arr[i] =
+          (FLOAT32)(ptr_sbr_data->int_env_sf_arr[i]);
     }
   }
 
@@ -285,6 +288,7 @@
                                ia_sbr_frame_info_data_struct *ptr_sbr_data,
                                ia_sbr_prev_frame_data_struct *ptr_prev_data) {
   WORD16 *ptr_evn_sf = ptr_sbr_data->int_env_sf_arr;
+  FLOAT32 *ptr_evn_sf_float = ptr_sbr_data->flt_env_sf_arr;
   WORD16 *ptr_prev_evn_sf = ptr_prev_data->sfb_nrg_prev;
   WORD32 i;
   FLAG error_code = 0;
@@ -299,6 +303,7 @@
     }
     if (ptr_evn_sf[i] < 0) {
       ptr_evn_sf[i] = 0;
+      ptr_evn_sf_float[i] = 0;
     }
   }
 
@@ -323,7 +328,7 @@
   WORD32 exponent;
   WORD32 exp_add = (7 + NRG_EXP_OFFSET);
   WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr;
-  static const WORD32 mant_arr[2] = {0x4000, 0x5a80};
+  const WORD32 mant_arr[2] = {0x4000, 0x5a80};
 
   amp_res_1 = (1 - amp_res);
 
@@ -343,6 +348,7 @@
   WORD32 value;
   WORD32 num_nf_bands;
   WORD16 *ptr_noise_floor;
+  FLOAT32 *ptr_noise_floor_flt;
 
   num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
 
@@ -351,16 +357,21 @@
 
   ptr_noise_floor = ptr_sbr_data->int_noise_floor;
 
+  ptr_noise_floor_flt = &ptr_sbr_data->flt_noise_floor[0];
+
   for (i = tot_nf_bands - 1; i >= 0; i--) {
     value = *ptr_noise_floor;
     if (value > MAX_NOISE_FLOOR_FAC_VAL) {
       *ptr_noise_floor = MAX_NOISE_FLOOR_FAC_VAL;
+      *ptr_noise_floor_flt = MAX_NOISE_FLOOR_FAC_VAL;
     } else {
       if (value < MIN_NOISE_FLOOR_FAC_VAL) {
         *ptr_noise_floor = MIN_NOISE_FLOOR_FAC_VAL;
+        *ptr_noise_floor_flt = MIN_NOISE_FLOOR_FAC_VAL;
       }
     }
     ptr_noise_floor++;
+    ptr_noise_floor_flt++;
   }
 }
 
@@ -373,10 +384,20 @@
   }
 }
 
+VOID ixheaacd_add_farr(FLOAT32 *ptr1, FLOAT32 *ptr2, WORD32 num) {
+  WORD32 i;
+  for (i = num - 1; i >= 0; i--) {
+    *ptr2 = (*ptr2 + *ptr1);
+    ptr2++;
+    ptr1++;
+  }
+}
+
 IA_ERRORCODE ixheaacd_calc_noise_floor(
     ia_sbr_header_data_struct *ptr_header_data,
     ia_sbr_frame_info_data_struct *ptr_sbr_data,
-    ia_sbr_prev_frame_data_struct *ptr_prev_data) {
+    ia_sbr_prev_frame_data_struct *ptr_prev_data,
+    WORD32 audio_object_type) {
   WORD32 i;
   WORD32 num_nf_bands;
   WORD32 num_noise_env;
@@ -385,6 +406,7 @@
 
   WORD16 *ptr_prev_noise_floor = ptr_prev_data->prev_noise_level;
   WORD16 *ptr1, *ptr2;
+  FLOAT32 *f_ptr1, *f_ptr2;
   WORD32 num;
   FLOAT32 *ptr_noise_floor_float = ptr_sbr_data->flt_noise_floor;
 
@@ -395,27 +417,35 @@
     ptr1 = ptr_noise_floor++;
     ptr2 = ptr_noise_floor;
     num = num_nf_bands - 1;
+    f_ptr1 = &ptr_noise_floor_float[0];
+    f_ptr2 = &ptr_noise_floor_float[1];
   } else {
     ptr1 = ptr_prev_noise_floor;
     ptr2 = ptr_sbr_data->int_noise_floor;
+    f_ptr1 = &ptr_sbr_data->prev_noise_level[0];
+    f_ptr2 = &ptr_noise_floor_float[0];
     num = num_nf_bands;
   }
 
   ixheaacd_add_arr(ptr1, ptr2, num);
+  ixheaacd_add_farr(f_ptr1, f_ptr2, num);
 
   if (num_noise_env > 1) {
     if (ptr_sbr_data->del_cod_dir_noise_arr[1] == DTDF_DIR_FREQ) {
       ptr1 = &ptr_sbr_data->int_noise_floor[num_nf_bands];
       ptr2 = &ptr_sbr_data->int_noise_floor[(num_nf_bands + 1)];
-
+      f_ptr1 = &ptr_sbr_data->flt_noise_floor[num_nf_bands];
+      f_ptr2 = &ptr_sbr_data->flt_noise_floor[(num_nf_bands + 1)];
       num = num_nf_bands - 1;
     } else {
       ptr1 = &ptr_sbr_data->int_noise_floor[0];
       ptr2 = &ptr_sbr_data->int_noise_floor[num_nf_bands];
-
+      f_ptr1 = &ptr_sbr_data->flt_noise_floor[0];
+      f_ptr2 = &ptr_sbr_data->flt_noise_floor[num_nf_bands];
       num = num_nf_bands;
     }
     ixheaacd_add_arr(ptr1, ptr2, num);
+    ixheaacd_add_farr(f_ptr1, f_ptr2, num);
   }
 
   ixheaacd_limit_noise_floor_fac(ptr_header_data, ptr_sbr_data);
@@ -427,9 +457,12 @@
   ptr2 = ptr_prev_noise_floor;
 
   memcpy(ptr2, ptr1, sizeof(WORD16) * (num_nf_bands));
-
-  if ((ptr_sbr_data->coupling_mode != COUPLING_BAL) ||
-      (ptr_header_data->usac_flag)) {
+  if (!ptr_header_data->usac_flag) {
+    for (i = 0; i < num_nf_bands; i++) {
+      ptr_sbr_data->prev_noise_level[i] = ptr_prev_noise_floor[i];
+    }
+  }
+  if (audio_object_type != AOT_ER_AAC_ELD) {
     WORD32 noise_floor_exp, tot_nf_bands;
 
     tot_nf_bands = (num_nf_bands * num_noise_env);
@@ -442,6 +475,20 @@
       *ptr_noise_floor_float++ = *ptr_noise_floor;
       *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP));
     }
+  } else {
+    if (ptr_sbr_data->coupling_mode != COUPLING_BAL) {
+      WORD32 noise_floor_exp, tot_nf_bands;
+
+      tot_nf_bands = (num_nf_bands * num_noise_env);
+      ptr_noise_floor = &ptr_sbr_data->int_noise_floor[0];
+
+      for (i = 0; i < tot_nf_bands; i++) {
+        noise_floor_exp =
+            (NOISE_FLOOR_OFFSET_INT + 1 + NOISE_EXP_OFFSET - *ptr_noise_floor);
+        *ptr_noise_floor_float++ = *ptr_noise_floor;
+        *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP));
+      }
+    }
   }
   return IA_NO_ERROR;
 }
@@ -449,9 +496,11 @@
 IA_ERRORCODE ixheaacd_dec_sbrdata_for_pvc(
     ia_sbr_header_data_struct *ptr_header_data,
     ia_sbr_frame_info_data_struct *ptr_sbr_data,
-    ia_sbr_prev_frame_data_struct *ptr_prev_data) {
+    ia_sbr_prev_frame_data_struct *ptr_prev_data,
+    WORD32 audio_object_type) {
   WORD32 err = 0;
-  err = ixheaacd_calc_noise_floor(ptr_header_data, ptr_sbr_data, ptr_prev_data);
+  err = ixheaacd_calc_noise_floor(ptr_header_data, ptr_sbr_data, ptr_prev_data,
+                                  audio_object_type);
   if (err) return err;
 
   if (!ptr_sbr_data->coupling_mode) {
@@ -547,8 +596,8 @@
 
   WORD32 i;
   FLOAT32 temp_l, temp_r;
-  static const FLOAT32 pan_offset[2] = {24.0f, 12.0f};
-  static const FLOAT32 a_arr[2] = {0.5f, 1.0f};
+  const FLOAT32 pan_offset[2] = {24.0f, 12.0f};
+  const FLOAT32 a_arr[2] = {0.5f, 1.0f};
 
   FLOAT32 a = a_arr[amp_res];
 
@@ -576,29 +625,34 @@
                   (1 + pow(2, temp_r - pan_offset[1])));
   }
 }
-WORD32 ixheaacd_dec_sbrdata(ia_sbr_header_data_struct *ptr_header_data_ch_0,
-                            ia_sbr_header_data_struct *ptr_header_data_ch_1,
-                            ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_0,
-                            ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
-                            ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_1,
-                            ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
-                            ixheaacd_misc_tables *ptr_common_tables) {
+IA_ERRORCODE ixheaacd_dec_sbrdata(ia_sbr_header_data_struct *ptr_header_data_ch_0,
+                                  ia_sbr_header_data_struct *ptr_header_data_ch_1,
+                                  ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_0,
+                                  ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
+                                  ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_1,
+                                  ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
+                                  ixheaacd_misc_tables *ptr_common_tables, WORD32 ldmps_present,
+                                  WORD32 audio_object_type, WORD32 ec_flag) {
   FLAG error_code;
   WORD32 err = 0;
-  WORD32 usac_flag = ptr_header_data_ch_0->usac_flag;
+  WORD16 temp_sfb_nrg_prev[MAX_FREQ_COEFFS];
+  WORD32 usac_flag = ptr_header_data_ch_0->usac_flag |
+                     ptr_header_data_ch_0->enh_sbr;
 
-  err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
-                              ptr_prev_data_ch_0, ptr_prev_data_ch_1,
-                              ptr_common_tables);
+  if (ec_flag) {
+    memcpy(temp_sfb_nrg_prev, ptr_prev_data_ch_0->sfb_nrg_prev, MAX_FREQ_COEFFS * sizeof(WORD16));
+  }
+
+  err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
+                              ptr_prev_data_ch_1, ptr_common_tables, audio_object_type, ec_flag);
 
   if (err) return err;
 
   err = ixheaacd_calc_noise_floor(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
-                                  ptr_prev_data_ch_0);
-
-  if (err == (WORD32)IA_FATAL_ERROR) return (WORD32)IA_FATAL_ERROR;
-
-  if (!ptr_sbr_data_ch_0->coupling_mode && usac_flag) {
+                                  ptr_prev_data_ch_0, audio_object_type);
+  if (err) return err;
+  if ((!ptr_sbr_data_ch_0->coupling_mode &&
+     ((usac_flag) && (audio_object_type != AOT_ER_AAC_ELD))) || ldmps_present) {
     ptr_sbr_data_ch_0->num_noise_sfac =
         ptr_header_data_ch_0->pstr_freq_band_data->num_nf_bands *
         ptr_sbr_data_ch_0->str_frame_info_details.num_noise_env;
@@ -611,18 +665,19 @@
 
   if (ptr_sbr_data_ch_1 != NULL) {
     error_code = ptr_header_data_ch_0->err_flag;
-    err = ixheaacd_dec_envelope(ptr_header_data_ch_1, ptr_sbr_data_ch_1,
-                                ptr_prev_data_ch_1, ptr_prev_data_ch_0,
-                                ptr_common_tables);
+    err =
+        ixheaacd_dec_envelope(ptr_header_data_ch_1, ptr_sbr_data_ch_1, ptr_prev_data_ch_1,
+                              ptr_prev_data_ch_0, ptr_common_tables, audio_object_type, ec_flag);
 
     if (err) return err;
 
     err = ixheaacd_calc_noise_floor(ptr_header_data_ch_1, ptr_sbr_data_ch_1,
-                                    ptr_prev_data_ch_1);
+                                    ptr_prev_data_ch_1, audio_object_type);
 
     if (err) return err;
 
-    if (!ptr_sbr_data_ch_1->coupling_mode && usac_flag) {
+    if (!ptr_sbr_data_ch_1->coupling_mode &&
+        ((usac_flag) && (audio_object_type != AOT_ER_AAC_ELD))) {
       ptr_sbr_data_ch_1->num_noise_sfac =
           ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands *
           ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env;
@@ -632,14 +687,27 @@
           ptr_sbr_data_ch_1->num_noise_sfac, ptr_sbr_data_ch_1->amp_res,
           ptr_sbr_data_ch_1->flt_noise_floor);
     }
+    if (ec_flag) {
+      if ((!ptr_header_data_ch_0->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
+        if (!error_code && ptr_header_data_ch_0->err_flag) {
+          memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, temp_sfb_nrg_prev,
+                 MAX_FREQ_COEFFS * sizeof(WORD16));
+          err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
+                                      ptr_prev_data_ch_1, ptr_common_tables, audio_object_type,
+                                      ec_flag);
 
-    if (!usac_flag) {
-      if (!error_code && ptr_header_data_ch_0->err_flag) {
-        err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
-                                    ptr_prev_data_ch_0, ptr_prev_data_ch_1,
-                                    ptr_common_tables);
+          if (err) return err;
+        }
+      }
+    } else {
+      if ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
+        if (!error_code && ptr_header_data_ch_0->err_flag) {
+          err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
+                                      ptr_prev_data_ch_1, ptr_common_tables, audio_object_type,
+                                      ec_flag);
 
-        if (err) return err;
+          if (err) return err;
+        }
       }
     }
 
@@ -656,18 +724,21 @@
 
   return 0;
 }
-WORD32 ixheaacd_dec_envelope(ia_sbr_header_data_struct *ptr_header_data,
-                             ia_sbr_frame_info_data_struct *ptr_sbr_data,
-                             ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
-                             ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
-                             ixheaacd_misc_tables *pstr_common_tables) {
+IA_ERRORCODE ixheaacd_dec_envelope(ia_sbr_header_data_struct *ptr_header_data,
+                                   ia_sbr_frame_info_data_struct *ptr_sbr_data,
+                                   ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
+                                   ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
+                                   ixheaacd_misc_tables *pstr_common_tables,
+                                   WORD32 audio_object_type, WORD32 ec_flag) {
   FLAG error_code;
   WORD32 err;
   WORD16 env_sf_local_arr[MAX_FREQ_COEFFS];
-  WORD32 usac_flag = ptr_header_data->usac_flag;
+  WORD32 enh_sbr = ptr_header_data->enh_sbr;
+  WORD32 usac_flag = enh_sbr | ptr_header_data->usac_flag;
   WORD32 temp_1 =
       ptr_prev_data_ch_0->end_position - ptr_header_data->num_time_slots;
-  if (temp_1 < 0) return -1;
+
+  if (temp_1 < 0) return IA_FATAL_ERROR;
   temp_1 = ptr_sbr_data->str_frame_info_details.border_vec[0] - temp_1;
 
   if ((!ptr_header_data->err_flag_prev) && (!ptr_header_data->err_flag) &&
@@ -678,16 +749,27 @@
       ptr_header_data->err_flag_prev = 1;
     }
   }
+  if (ec_flag) {
+    if (ptr_header_data->err_flag_prev && (!ptr_header_data->err_flag)) {
+      if (ptr_sbr_data->del_cod_dir_arr[0] != 0) {
+        ptr_header_data->err_flag = 1;
+      }
+    }
+  }
+  if (ec_flag && ptr_header_data->err_flag &&
+      ((!ptr_header_data->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD))) {
+    ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
 
-  if (ptr_header_data->err_flag && !usac_flag) {
-    ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data,
-                                 ptr_prev_data_ch_0);
+    ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
+  } else if (ptr_header_data->err_flag &&
+             ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD))) {
+    ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
 
-    ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data,
-                                      ptr_prev_data_ch_0);
+    ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
   } else {
     WORD32 num = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
-    if (ptr_header_data->err_flag_prev && !usac_flag) {
+    if (ptr_header_data->err_flag_prev && ((!usac_flag) ||
+        (audio_object_type == AOT_ER_AAC_ELD))) {
       WORD16 *ptr1, *ptr2;
       WORD32 i;
 
@@ -728,7 +810,7 @@
     ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data,
                                       ptr_prev_data_ch_0);
 
-    if (!usac_flag) {
+    if ((!usac_flag)||(audio_object_type == AOT_ER_AAC_ELD)) {
       error_code = ixheaacd_check_env_data(ptr_header_data, ptr_sbr_data,
                                            ptr_prev_data_ch_0);
 
@@ -738,17 +820,24 @@
         memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, env_sf_local_arr,
                sizeof(WORD16) * MAX_FREQ_COEFFS);
 
-        err = ixheaacd_dec_envelope(ptr_header_data, ptr_sbr_data,
-                                    ptr_prev_data_ch_0, ptr_prev_data_ch_1,
-                                    pstr_common_tables);
+        err = ixheaacd_dec_envelope(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0,
+                                    ptr_prev_data_ch_1, pstr_common_tables, audio_object_type,
+                                    ec_flag);
 
         if (err) return err;
         return 0;
       }
     }
   }
-  if (!usac_flag)
-    ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res);
+  if (ec_flag) {
+    if ((!ptr_header_data->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
+      ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res);
+    }
+  } else {
+    if ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
+      ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res);
+    }
+  }
 
   return 0;
 }
diff --git a/decoder/ixheaacd_env_dec.h b/decoder/ixheaacd_env_dec.h
index b0eaa7e..eee877a 100644
--- a/decoder/ixheaacd_env_dec.h
+++ b/decoder/ixheaacd_env_dec.h
@@ -20,18 +20,20 @@
 #ifndef IXHEAACD_ENV_DEC_H
 #define IXHEAACD_ENV_DEC_H
 
-WORD32 ixheaacd_dec_sbrdata(ia_sbr_header_data_struct *ptr_header_data_ch_0,
-                            ia_sbr_header_data_struct *ptr_header_data_ch_1,
-                            ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_0,
-                            ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
-                            ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_1,
-                            ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
-                            ixheaacd_misc_tables *ptr_common_tables);
+IA_ERRORCODE ixheaacd_dec_sbrdata(ia_sbr_header_data_struct *ptr_header_data_ch_0,
+                                  ia_sbr_header_data_struct *ptr_header_data_ch_1,
+                                  ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_0,
+                                  ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
+                                  ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_1,
+                                  ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
+                                  ixheaacd_misc_tables *ptr_common_tables, WORD32 ldmps_present,
+                                  WORD32 audio_object_type, WORD32 ec_flag);
 
 IA_ERRORCODE ixheaacd_dec_sbrdata_for_pvc(
     ia_sbr_header_data_struct *ptr_header_data,
     ia_sbr_frame_info_data_struct *ptr_sbr_data,
-    ia_sbr_prev_frame_data_struct *ptr_prev_data);
+    ia_sbr_prev_frame_data_struct *ptr_prev_data,
+    WORD32 audio_object_type);
 
 VOID ixheaacd_harm_idx_onethreelp(WORD32 *ptr_real_buf, WORD16 *ptr_gain_buf,
                                   WORD scale_change, WORD16 *ptr_sine_level_buf,
@@ -56,11 +58,12 @@
                                 WORD16 *ptr_sine_level_buf, WORD16 noise_e,
                                 WORD freq_inv_flag, WORD32 harm_index);
 
-WORD32 ixheaacd_dec_envelope(ia_sbr_header_data_struct *ptr_header_data,
-                             ia_sbr_frame_info_data_struct *ptr_sbr_data,
-                             ia_sbr_prev_frame_data_struct *ptr_prev_data,
-                             ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
-                             ixheaacd_misc_tables *pstr_common_tables);
+IA_ERRORCODE ixheaacd_dec_envelope(ia_sbr_header_data_struct *ptr_header_data,
+                                   ia_sbr_frame_info_data_struct *ptr_sbr_data,
+                                   ia_sbr_prev_frame_data_struct *ptr_prev_data,
+                                   ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
+                                   ixheaacd_misc_tables *pstr_common_tables,
+                                   WORD32 audio_object_type, WORD32 ec_flag);
 
 VOID ixheaacd_lean_sbrconcealment(ia_sbr_header_data_struct *ptr_header_data,
                                   ia_sbr_frame_info_data_struct *ptr_sbr_data,
diff --git a/decoder/ixheaacd_env_extr.c b/decoder/ixheaacd_env_extr.c
index 11d5660..642a18d 100644
--- a/decoder/ixheaacd_env_extr.c
+++ b/decoder/ixheaacd_env_extr.c
@@ -305,7 +305,7 @@
 }
 
 WORD32 ixheaacd_ssc_huff_dec(ia_huffman_data_type t_huff,
-                             ia_handle_bit_buf_struct it_bit_buff) {
+                             ia_bit_buf_struct *it_bit_buff) {
   WORD32 index;
   WORD32 value, bit;
   WORD16 cw;
@@ -337,6 +337,8 @@
     ia_sbr_header_data_struct *pstr_sbr_header, ia_bit_buf_struct *it_bit_buff,
     FLAG stereo_flag, ia_sbr_header_data_struct *pstr_sbr_dflt_header) {
   ia_sbr_header_data_struct prev_header_info;
+  prev_header_info.start_freq = 0;
+  prev_header_info.noise_bands = 0;
   FLAG header_extra_1 = 0, header_extra_2 = 0;
   WORD32 tmp;
   WORD32 usac_independency_flag = pstr_sbr_header->usac_independency_flag;
@@ -536,12 +538,20 @@
   if (start_pos > SBR_OV_SLOTS) return 0;
   if (audio_object_type != AOT_ER_AAC_ELD &&
       audio_object_type != AOT_ER_AAC_LD) {
-    if (end_pos < SBR_TIME_SLOTS) return 0;
+    if (num_time_slots != 15) {
+      if (end_pos < SBR_TIME_SLOTS) return 0;
+    } else {
+      if (end_pos < num_time_slots) return 0;
+    }
   } else {
     if (end_pos < num_time_slots) return 0;
   }
 
-  if (end_pos > add_d(SBR_TIME_SLOTS, SBR_OV_SLOTS)) return 0;
+  if (num_time_slots != 15) {
+    if (end_pos > add_d(SBR_TIME_SLOTS, SBR_OV_SLOTS)) return 0;
+  } else {
+    if (end_pos > add_d(num_time_slots, SBR_OV_SLOTS)) return 0;
+  }
 
   for (i = 0; i < num_env_sf; i++) {
     if (pstr_frame_info->border_vec[i] > pstr_frame_info->border_vec[i + 1])
@@ -564,10 +574,132 @@
   return 1;
 }
 
-static VOID ixheaacd_read_extn_data(ia_sbr_header_data_struct *ptr_header_data,
-                                    ia_ps_dec_struct *ptr_ps_dec,
-                                    ia_bit_buf_struct *it_bit_buff,
-                                    ia_ps_tables_struct *ps_tables_ptr) {
+static WORD16 ixheaacd_read_enh_sbr_data(
+    ia_sbr_header_data_struct *ptr_header_data,
+    ia_bit_buf_struct *it_bit_buff,
+    VOID *p_frame_data,
+    WORD32 ele_id) {
+  WORD32 tmp = 0;
+  WORD16 num_bits_read = 0;
+  tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PRE_FLAT_BITS);
+  ptr_header_data->pre_proc_flag = tmp;
+  num_bits_read += ESBR_PRE_FLAT_BITS;
+
+  if (ele_id == SBR_ID_SCE) {
+    ia_sbr_frame_info_data_struct *ptr_frame_data =
+        (ia_sbr_frame_info_data_struct *)p_frame_data;
+
+    tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
+    ptr_frame_data->sbr_patching_mode = tmp;
+    num_bits_read += ESBR_PATCHING_MODE_BITS;
+
+    if (tmp == 0) {
+      tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
+      ptr_frame_data->over_sampling_flag = tmp;
+      num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
+
+      tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS);
+      num_bits_read += ESBR_PITCHIN_FLAG_BITS;
+
+      if (tmp) {
+        tmp =
+           ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
+        ptr_frame_data->pitch_in_bins = tmp;
+        num_bits_read += ESBR_PITCHIN_BINS_BITS;
+      } else {
+        ptr_frame_data->pitch_in_bins = 0;
+      }
+    } else {
+      ptr_frame_data->over_sampling_flag = 0;
+      ptr_frame_data->pitch_in_bins = 0;
+    }
+  } else if (ele_id == SBR_ID_CPE) {
+    ia_sbr_frame_info_data_struct **ptr_frame_data =
+        (ia_sbr_frame_info_data_struct **)p_frame_data;
+    if (ptr_frame_data[0]->coupling_mode) {
+      ptr_frame_data[0]->sbr_patching_mode =
+          ptr_frame_data[1]->sbr_patching_mode =
+          ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
+      num_bits_read += ESBR_PATCHING_MODE_BITS;
+
+      if (ptr_frame_data[0]->sbr_patching_mode == 0) {
+        ptr_frame_data[0]->over_sampling_flag =
+            ptr_frame_data[1]->over_sampling_flag =
+            ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
+        num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
+        num_bits_read += ESBR_PITCHIN_FLAG_BITS;
+        if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
+          ptr_frame_data[0]->pitch_in_bins =
+          ptr_frame_data[1]->pitch_in_bins =
+              ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
+          num_bits_read += ESBR_PITCHIN_BINS_BITS;
+        } else {
+          ptr_frame_data[0]->pitch_in_bins = 0;
+          ptr_frame_data[1]->pitch_in_bins = 0;
+        }
+      } else {
+        ptr_frame_data[0]->over_sampling_flag = 0;
+        ptr_frame_data[0]->pitch_in_bins = 0;
+
+        ptr_frame_data[1]->over_sampling_flag = 0;
+        ptr_frame_data[1]->pitch_in_bins = 0;
+      }
+    } else {
+      ptr_frame_data[0]->sbr_patching_mode =
+          ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
+      num_bits_read += ESBR_PATCHING_MODE_BITS;
+
+      if (ptr_frame_data[0]->sbr_patching_mode == 0) {
+        ptr_frame_data[0]->over_sampling_flag =
+            ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
+        num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
+        num_bits_read += ESBR_PITCHIN_FLAG_BITS;
+        if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
+          ptr_frame_data[0]->pitch_in_bins =
+              ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
+          num_bits_read += ESBR_PITCHIN_BINS_BITS;
+        } else {
+          ptr_frame_data[0]->pitch_in_bins = 0;
+        }
+      } else {
+        ptr_frame_data[0]->over_sampling_flag = 0;
+        ptr_frame_data[0]->pitch_in_bins = 0;
+      }
+
+      ptr_frame_data[1]->sbr_patching_mode =
+          ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
+      num_bits_read += ESBR_PATCHING_MODE_BITS;
+
+      if (ptr_frame_data[1]->sbr_patching_mode == 0) {
+        ptr_frame_data[1]->over_sampling_flag =
+            ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
+        num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
+        num_bits_read += ESBR_PITCHIN_FLAG_BITS;
+        if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
+          ptr_frame_data[1]->pitch_in_bins =
+              ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
+          num_bits_read += ESBR_PITCHIN_BINS_BITS;
+        } else {
+          ptr_frame_data[1]->pitch_in_bins = 0;
+        }
+      } else {
+        ptr_frame_data[1]->over_sampling_flag =
+            ptr_frame_data[1]->pitch_in_bins = 0;
+      }
+    }
+  }
+  if (num_bits_read < 6) {
+    ixheaacd_read_bits_buf(it_bit_buff, 6 - num_bits_read);
+    num_bits_read = 6;
+  }
+  return num_bits_read;
+}
+
+static IA_ERRORCODE ixheaacd_read_extn_data(ia_sbr_header_data_struct *ptr_header_data,
+                                            ia_ps_dec_struct *ptr_ps_dec,
+                                            ia_bit_buf_struct *it_bit_buff,
+                                            ia_ps_tables_struct *ps_tables_ptr,
+                                            VOID *p_frame_data, WORD32 ele_id) {
   WORD i;
   WORD extended_data;
   WORD no_bits_left;
@@ -588,6 +720,9 @@
 
     no_bits_left = (cnt << 3);
 
+    ptr_header_data->hbe_flag = !ptr_header_data->usac_flag;
+    ptr_header_data->sbr_ratio_idx = SBR_UPSAMPLE_IDX_2_1;
+
     while (no_bits_left > 7) {
       WORD extension_id = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ID_BITS);
 
@@ -597,22 +732,33 @@
         case EXTENSION_ID_PS_CODING:
 
           if (ptr_ps_dec == NULL) {
-            return;
+            return 0;
           }
 
           if (!(ptr_ps_dec->force_mono || ps_read)) {
-            no_bits_left =
-                (no_bits_left - ixheaacd_read_ps_data(ptr_ps_dec, it_bit_buff,
-                                                      (WORD16)no_bits_left,
-                                                      ps_tables_ptr));
+            IA_ERRORCODE ret_val = ixheaacd_read_ps_data(ptr_ps_dec, it_bit_buff,
+                                                         (WORD16)no_bits_left, ps_tables_ptr);
+            if (ret_val == IA_FATAL_ERROR) {
+              return ret_val;
+            } else {
+              no_bits_left = no_bits_left - ret_val;
+            }
 
-            if (no_bits_left < 0) return;
-
+            if (no_bits_left < 0) return 0;
             ptr_header_data->channel_mode = PS_STEREO;
             ps_read = 1;
             break;
           }
+        case EXTENSION_ID_ENHSBR_CODING: {
+          ptr_header_data->enh_sbr = 1;
+          no_bits_left =
+              (no_bits_left - ixheaacd_read_enh_sbr_data(ptr_header_data, it_bit_buff,
+                  p_frame_data, ele_id));
 
+          ptr_header_data->hbe_flag = 1;
+          ptr_header_data->sbr_ratio_idx = SBR_UPSAMPLE_IDX_2_1;
+          break;
+        }
         default:
           cnt = (no_bits_left >> 3);
           for (i = cnt - 1; i >= 0; i--) ixheaacd_read_bits_buf(it_bit_buff, 8);
@@ -621,11 +767,10 @@
       }
     }
 
-    if (no_bits_left < 0) return;
-
+    if (no_bits_left < 0) return 0;
     ixheaacd_read_bits_buf(it_bit_buff, no_bits_left);
   }
-  return;
+  return 0;
 }
 
 WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data,
@@ -667,7 +812,7 @@
   for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_nf_bands; i++) {
     ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i];
     ptr_frame_data->sbr_invf_mode[i] =
-        (WORD32)ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
+        ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
   }
 
   ptr_pvc_data->pvc_mode = ptr_header_data->pvc_mode;
@@ -691,11 +836,11 @@
   return err_code;
 }
 
-IA_ERRORCODE ixheaacd_sbr_read_sce(
-    ia_sbr_header_data_struct *ptr_header_data,
-    ia_sbr_frame_info_data_struct *ptr_frame_data, ia_ps_dec_struct *ptr_ps_dec,
-    ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables,
-    WORD audio_object_type) {
+IA_ERRORCODE ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data,
+                                   ia_sbr_frame_info_data_struct *ptr_frame_data,
+                                   ia_ps_dec_struct *ptr_ps_dec, ia_bit_buf_struct *it_bit_buff,
+                                   ia_sbr_tables_struct *ptr_sbr_tables, WORD audio_object_type,
+                                   WORD32 ec_flag) {
   WORD32 bit;
   WORD32 i;
   WORD32 hbe_flag = ptr_header_data->hbe_flag;
@@ -719,7 +864,8 @@
       }
     } else {
       if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data,
-                                            env_extr_tables_ptr))
+                                            env_extr_tables_ptr,
+                                            ptr_header_data->num_time_slots))
 
         return 0;
     }
@@ -746,7 +892,8 @@
     }
     ptr_frame_data->num_time_slots = ptr_header_data->num_time_slots;
     if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data,
-                                          env_extr_tables_ptr))
+                                          env_extr_tables_ptr,
+                                          ptr_header_data->num_time_slots))
       return 0;
 
     if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details,
@@ -767,7 +914,7 @@
   for (i = 0; i < num_if_bands; i++) {
     ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i];
     ptr_frame_data->sbr_invf_mode[i] =
-        (WORD32)ixheaacd_read_bits_buf(it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
+        ixheaacd_read_bits_buf(it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
   }
 
   if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data, it_bit_buff,
@@ -792,8 +939,15 @@
   }
 
   if (!usac_flag) {
-    ixheaacd_read_extn_data(ptr_header_data, ptr_ps_dec, it_bit_buff,
-                            ptr_sbr_tables->ps_tables_ptr);
+    IA_ERRORCODE err =
+        ixheaacd_read_extn_data(ptr_header_data, ptr_ps_dec, it_bit_buff,
+                                ptr_sbr_tables->ps_tables_ptr, ptr_frame_data, SBR_ID_SCE);
+    if (err == IA_FATAL_ERROR) {
+      if (ec_flag)
+        return 0;
+      else
+        return err;
+    }
   }
 
   return 1;
@@ -906,7 +1060,8 @@
       }
     } else {
       if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data[i],
-                                            env_extr_tables_ptr))
+                                            env_extr_tables_ptr,
+                                            ptr_header_data->num_time_slots))
         return 0;
     }
 
@@ -940,7 +1095,7 @@
           ptr_frame_data[1]->sbr_invf_mode[i];
 
       ptr_frame_data[0]->sbr_invf_mode[i] =
-          (WORD32)ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
+          ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
       ptr_frame_data[1]->sbr_invf_mode[i] = ptr_frame_data[0]->sbr_invf_mode[i];
     }
 
@@ -982,12 +1137,14 @@
       for (i = 0; i < num_if_bands; i++) {
         ptr_frame_data[k]->sbr_invf_mode_prev[i] =
             ptr_frame_data[k]->sbr_invf_mode[i];
-        ptr_frame_data[k]->sbr_invf_mode[i] = (WORD32)ixheaacd_read_bits_buf(
+        ptr_frame_data[k]->sbr_invf_mode[i] = ixheaacd_read_bits_buf(
             it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
       }
     }
 
     if (ptr_frame_data[0]->coupling_mode) {
+      memcpy(ptr_frame_data[1]->sbr_invf_mode_prev, ptr_frame_data[1]->sbr_invf_mode,
+             sizeof(ptr_frame_data[1]->sbr_invf_mode_prev[0]) * num_if_bands);
       memcpy(ptr_frame_data[1]->sbr_invf_mode, ptr_frame_data[0]->sbr_invf_mode,
              sizeof(WORD32) * num_if_bands);
 
@@ -1040,8 +1197,12 @@
   }
 
   if (!usac_flag) {
-    ixheaacd_read_extn_data(ptr_header_data, NULL, it_bit_buff,
-                            ptr_sbr_tables->ps_tables_ptr);
+    IA_ERRORCODE err =
+        ixheaacd_read_extn_data(ptr_header_data, NULL, it_bit_buff, ptr_sbr_tables->ps_tables_ptr,
+                                (VOID *)ptr_frame_data, SBR_ID_CPE);
+    if (err == IA_FATAL_ERROR) {
+      return err;
+    }
   }
   return 1;
 }
@@ -1165,10 +1326,10 @@
     if (usac_flag && (num_noise_env == 0)) {
       ptr_frame_data->inter_temp_shape_mode[j] = 0;
       if (ptr_frame_data->inter_tes_flag) {
-        WORD32 flag = (WORD32)ixheaacd_read_bits_buf(it_bit_buff, 1);
+        WORD32 flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
         if (flag) {
           ptr_frame_data->inter_temp_shape_mode[j] =
-              (WORD32)ixheaacd_read_bits_buf(it_bit_buff, 2);
+              ixheaacd_read_bits_buf(it_bit_buff, 2);
         }
       }
     }
@@ -1242,14 +1403,12 @@
   WORD32 lav;
   WORD32 i;
   WORD16 no_band[MAX_ENVELOPES];
-  WORD32 delta;
   WORD32 amp_res, num_env, env_data_tbl_comp_factor, start_bits,
       start_bits_balance;
   WORD16 *p_freq_res = ptr_frame_data->str_frame_info_details.freq_res;
   WORD16 *p_num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands;
   ia_huffman_data_type hcb_t, hcb_f;
 
-  delta = 0;
   amp_res = ptr_header_data->amp_res;
   num_env = ptr_frame_data->str_frame_info_details.num_env;
 
@@ -1335,7 +1494,7 @@
 IA_ERRORCODE ixheaacd_extract_frame_info_ld(
     ia_bit_buf_struct *it_bit_buff,
     ia_sbr_frame_info_data_struct *h_frame_data) {
-  int abs_bord_lead = 0, num_rel_lead = 0, num_rel_trail = 0, bs_num_env = 0,
+  int abs_bord_lead = 0, num_rel_lead = 0, bs_num_env = 0,
       frame_class, temp, env, k, abs_bord_trail = 0, middle_bord = 0,
       bs_num_noise, transient_env_temp = 0, bs_transient_position = 0;
 
@@ -1387,7 +1546,6 @@
       abs_bord_lead = 0;
       abs_bord_trail = numTimeSlots;
       num_rel_lead = bs_num_env - 1;
-      num_rel_trail = 0;
 
       for (k = 0; k < num_rel_lead; k++) {
         rel_bord_lead[k] = ixheaacd_ld_env_table_time_slot[num_rel_lead - 1];
@@ -1554,7 +1712,7 @@
 WORD16 ixheaacd_sbr_time_freq_grid_info(
     ia_bit_buf_struct *it_bit_buff,
     ia_sbr_frame_info_data_struct *ptr_frame_data,
-    ia_env_extr_tables_struct *env_extr_tables_ptr) {
+    ia_env_extr_tables_struct *env_extr_tables_ptr, WORD16 number_of_time_slots) {
   WORD32 i, k, bs_num_rel = 0;
   WORD32 bs_pointer_bits = 0, bs_num_env = 0, border, bs_pointer,
          bs_var_bord = 0, temp = 0;
@@ -1572,7 +1730,14 @@
       temp =
           ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS + SBR_FRQ_RES_BITS);
       bs_num_env = (temp & 0x6) >> SBR_FRQ_RES_BITS;
-      p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env];
+
+      if (number_of_time_slots != 15) {
+        p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env];
+      } else {
+        if (bs_num_env > 2) return 0;
+        p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env + 4];
+      }
+
       memcpy(p_frame_info, p_fixfix_tab, sizeof(ia_frame_info_struct));
       bs_num_env = (1 << bs_num_env);
       freq_res_0 = temp & 0x1;
@@ -1588,7 +1753,13 @@
       bs_var_bord = bs_var_bord >> SBR_NUM_BITS;
       bs_num_env = bs_num_rel + 1;
       p_frame_info->border_vec[0] = 0;
-      border = bs_var_bord + SBR_TIME_SLOTS;
+
+      if (number_of_time_slots != 15) {
+        border = bs_var_bord + SBR_TIME_SLOTS;
+      } else {
+        border = bs_var_bord + number_of_time_slots;
+      }
+
       p_frame_info->border_vec[bs_num_env] = border;
       for (k = bs_num_rel; k > 0; k--) {
         temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
@@ -1632,10 +1803,21 @@
       for (k = 1; k <= bs_num_rel; k++) {
         temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
         border = border + ((temp << 1) + 2);
-        if (border > SBR_TIME_SLOTS) border = SBR_TIME_SLOTS;
+
+        if (number_of_time_slots != 15) {
+          if (border > SBR_TIME_SLOTS) border = SBR_TIME_SLOTS;
+        } else {
+          if (border > number_of_time_slots) border = number_of_time_slots;
+        }
+
         p_frame_info->border_vec[k] = border;
       }
-      p_frame_info->border_vec[k] = SBR_TIME_SLOTS;
+
+      if (number_of_time_slots != 15) {
+        p_frame_info->border_vec[k] = SBR_TIME_SLOTS;
+      } else {
+        p_frame_info->border_vec[k] = number_of_time_slots;
+      }
 
       bs_pointer_bits = pointer_bits_array[bs_num_rel];
 
@@ -1673,8 +1855,15 @@
     case VARVAR:
       abs_bord_lead = ixheaacd_read_bits_buf(
           it_bit_buff, 2 * SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS);
-      abs_bord_trail =
+
+      if (number_of_time_slots != 15) {
+        abs_bord_trail =
           (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + SBR_TIME_SLOTS);
+      } else {
+        abs_bord_trail =
+          (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + number_of_time_slots);
+      }
+
       num_rel_trail = ((abs_bord_lead & 0xc) >> SBR_NUM_BITS);
       num_rel_lead = (abs_bord_lead & 0x3);
       abs_bord_lead = abs_bord_lead >> (SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS);
diff --git a/decoder/ixheaacd_env_extr.h b/decoder/ixheaacd_env_extr.h
index 32b1421..b7b98f6 100644
--- a/decoder/ixheaacd_env_extr.h
+++ b/decoder/ixheaacd_env_extr.h
@@ -74,7 +74,7 @@
   WORD32 over_sampling_flag;
   WORD32 pitch_in_bins;
   WORD32 pvc_mode;
-
+  WORD32 cov_count;
   WORD32 sbr_invf_mode_prev[MAX_NUM_NOISE_VALUES];
   FLOAT32 flt_env_sf_arr[MAX_NUM_ENVELOPE_VALUES];
   FLOAT32 flt_noise_floor[MAX_NUM_NOISE_VALUES];
@@ -119,11 +119,11 @@
 
 } ia_sbr_frame_info_data_struct;
 
-IA_ERRORCODE ixheaacd_sbr_read_sce(
-    ia_sbr_header_data_struct *ptr_header_data,
-    ia_sbr_frame_info_data_struct *ptr_frame_data, ia_ps_dec_struct *ptr_ps_dec,
-    ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables,
-    WORD audio_object_type);
+IA_ERRORCODE ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data,
+                                   ia_sbr_frame_info_data_struct *ptr_frame_data,
+                                   ia_ps_dec_struct *ptr_ps_dec, ia_bit_buf_struct *it_bit_buff,
+                                   ia_sbr_tables_struct *ptr_sbr_tables, WORD audio_object_type,
+                                   WORD32 ec_flag);
 
 IA_ERRORCODE ixheaacd_sbr_read_cpe(
     ia_sbr_header_data_struct *ptr_header_data,
@@ -149,7 +149,7 @@
 WORD16 ixheaacd_sbr_time_freq_grid_info(
     ia_bit_buf_struct *it_bit_buff,
     ia_sbr_frame_info_data_struct *ptr_frame_data,
-    ia_env_extr_tables_struct *env_extr_tables_ptr);
+    ia_env_extr_tables_struct *env_extr_tables_ptr, WORD16 number_of_timeslots);
 
 WORD16 ixheaacd_read_sbr_env_data(
     ia_sbr_header_data_struct *ptr_header_data,
@@ -171,13 +171,14 @@
                              const UWORD16 *input_table,
                              const UWORD32 *idx_table);
 
-IA_ERRORCODE ixheaacd_createlimiterbands(
-    WORD32 lim_table[4][12 + 1], WORD32 gate_mode[4], WORD16 *freq_band_tbl,
-    WORD32 ixheaacd_num_bands, WORD32 x_over_qmf[MAX_NUM_PATCHES],
-    WORD32 b_patching_mode, WORD32 upsamp_4_flag,
-    struct ixheaacd_lpp_trans_patch *patch_param);
+IA_ERRORCODE ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1], WORD32 gate_mode[4],
+                                         WORD16 *freq_band_tbl, WORD32 ixheaacd_num_bands,
+                                         WORD32 x_over_qmf[MAX_NUM_PATCHES],
+                                         WORD32 b_patching_mode, WORD32 upsamp_4_flag,
+                                         struct ixheaacd_lpp_trans_patch *patch_param,
+                                         WORD32 ec_flag);
 
-VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
+WORD32 ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
                               FLOAT32 *qmf_real, FLOAT32 *qmf_imag,
                               WORD32 num_sample, WORD32 sub_band_start,
                               WORD32 num_subband, WORD32 gamma_idx);
diff --git a/decoder/ixheaacd_env_extr_part.h b/decoder/ixheaacd_env_extr_part.h
index fc38546..13d9605 100644
--- a/decoder/ixheaacd_env_extr_part.h
+++ b/decoder/ixheaacd_env_extr_part.h
@@ -92,6 +92,11 @@
   WORD32 usac_flag;
   UWORD8 pvc_mode;
 
+  FLAG enh_sbr;
+  FLAG esbr_hq;
+  FLAG enh_sbr_ps;
+  FLAG eld_sbr;
+
 } ia_sbr_header_data_struct;
 
 typedef struct {
diff --git a/decoder/ixheaacd_error_codes.h b/decoder/ixheaacd_error_codes.h
index 4820704..930db15 100644
--- a/decoder/ixheaacd_error_codes.h
+++ b/decoder/ixheaacd_error_codes.h
@@ -24,94 +24,112 @@
 /* Class 0: API Errors                                                       */
 /*****************************************************************************/
 /* Non Fatal Errors */
-#define IA_ENHAACPLUS_DEC_API_NONFATAL_NO_ERROR 0x00000000
-#define IA_ENHAACPLUS_DEC_API_NONFATAL_CMD_NOT_SUPPORTED 0x00000001
-#define IA_ENHAACPLUS_DEC_API_NONFATAL_CMD_TYPE_NOT_SUPPORTED 0x00000002
+#define IA_XHEAAC_DEC_API_NONFATAL_NO_ERROR 0x00000000
+#define IA_XHEAAC_DEC_API_NONFATAL_CMD_NOT_SUPPORTED 0x00000001
+#define IA_XHEAAC_DEC_API_NONFATAL_CMD_TYPE_NOT_SUPPORTED 0x00000002
 /* Fatal Errors */
-#define IA_ENHAACPLUS_DEC_API_FATAL_INVALID_MEMTAB_INDEX 0xFFFF8000
-#define IA_ENHAACPLUS_DEC_API_FATAL_INVALID_LIB_ID_STRINGS_IDX 0xFFFF8001
-#define IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALLOC 0xFFFF8002
-#define IA_ENHAACPLUS_DEC_API_FATAL_INVALID_CONFIG_PARAM 0xFFFF8003
-#define IA_ENHAACPLUS_DEC_API_FATAL_INVALID_EXECUTE_TYPE 0xFFFF8004
-#define IA_ENHAACPLUS_DEC_API_FATAL_INVALID_CMD 0xFFFF8005
-#define IA_ENHAACPLUS_DEC_API_FATAL_MEM_ALIGN 0xFFFF8006
+#define IA_XHEAAC_DEC_API_FATAL_INVALID_MEMTAB_INDEX 0xFFFF8000
+#define IA_XHEAAC_DEC_API_FATAL_INVALID_LIB_ID_STRINGS_IDX 0xFFFF8001
+#define IA_XHEAAC_DEC_API_FATAL_MEM_ALLOC 0xFFFF8002
+#define IA_XHEAAC_DEC_API_FATAL_INVALID_CONFIG_PARAM 0xFFFF8003
+#define IA_XHEAAC_DEC_API_FATAL_INVALID_EXECUTE_TYPE 0xFFFF8004
+#define IA_XHEAAC_DEC_API_FATAL_INVALID_CMD 0xFFFF8005
+#define IA_XHEAAC_DEC_API_FATAL_MEM_ALIGN 0xFFFF8006
 /*****************************************************************************/
 /* Class 1: Configuration Errors                                             */
 /*****************************************************************************/
 /* Non Fatal Errors */
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_PCM_WDSZ 0x00000800
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX 0x00000801
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_OUT08KHZ 0x00000802
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_OUT16KHZ 0x00000803
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_TOSTEREO 0x00000804
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DSAMPLE 0x00000805
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_FRAMEOK 0x00000806
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_MP4FLAG 0x00000807
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL 0x00000808
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_COUP_CHANNEL 0x00000809
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_FEATURE_NOT_SUPPORTED 0x0000080A
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_SYNCFLAG 0x0000080B
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_SBRUPFLAG 0x0000080C
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_PCM_WDSZ 0x00000800
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX 0x00000801
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_PS_FLAG 0x00000802
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DOWNMIX_STEREO 0x00000803
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_TOSTEREO 0x00000804
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DSAMPLE 0x00000805
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_PEAK_LIM_FLAG_TYPE 0x00000806
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MP4FLAG 0x00000807
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_MAX_CHANNEL 0x00000808
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_COUP_CHANNEL 0x00000809
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ERR_CONCEAL_FLAG_TYPE 0x0000080A
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_SYNCFLAG 0x0000080B
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_SBRUPFLAG 0x0000080C
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRCFLAG 0x0000080D
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_CUT 0x0000080E
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_BOOST 0x0000080F
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_DRC_TARGET 0x00000810
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_FRAMSZ 0x00000811
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_LD_CONFIG 0x00000812
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_EFFECT_TYPE 0x00000813
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_TARGET_LOUDNESS 0x00000814
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_HQ_FLAG 0x00000815
+#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_FRAMELENGTHFLAG 0x00000816
+/* Fatal Errors */
+#define IA_XHEAAC_DEC_CONFIG_FATAL_INVALID_SAMPLE_RATE 0xFFFF8800
 
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_LOASFLAG 0x0000080D
+/*****************************************************************************/
+/* Class 2: Initialization Errors                                            */
+/*****************************************************************************/
+/* Non Fatal Errors */
+#define IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START 0x00001000
+#define IA_XHEAAC_MPS_DEC_INIT_NONFATAL_INVALID_QMF_BAND 0x00001001
+#define IA_XHEAAC_DEC_INIT_NONFATAL_EC_INIT_FAIL 0x00001002
+#define IA_XHEAAC_DEC_INIT_NONFATAL_INSUFFICIENT_INPUT_BYTES 0x00001003
+#define IA_XHEAAC_DEC_INIT_NONFATAL_DECODE_FRAME_ERROR 0x00001004
 
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRCFLAG 0x0000080E
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_CUT 0x0000080F
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_BOOST 0x00000810
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_DRC_TARGET 0x00000811
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_FRAMSZ 0x00000812
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_ELDSBR 0x00000813
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_LD_CONFIG 0x00000814
-#define IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_DELAY_MODE 0x00000815
-#define IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_DECODE_TYPE 0x00000816
-#define IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_PEAK_LIM_FLAG 0x00000817
-#define IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_CTRL_PARAM_IDX 0x00000818
-#define IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_GAIN_DELAY 0x00000819
-#define IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_CONST_DELAY_MODE 0x0000081A
-#define IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_EFFECT_TYPE 0x0000081B
-#define IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_TARGET_LOUDNESS 0x0000081C
+/* Fatal Errors */
+#define IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL 0xFFFF9000
+#define IA_XHEAAC_DEC_INIT_FATAL_EO_INPUT_REACHED 0xFFFF9001
+#define IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX 0xFFFF9002
+#define IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED 0xFFFF9003
+#define IA_XHEAAC_DEC_INIT_FATAL_EC_INIT_FAIL 0xFFFF9004
+#define IA_XHEAAC_DEC_INIT_FATAL_UNIMPLEMENTED_CCE 0xFFFF9005
 
-// Fatal Errors
-#define IA_ENHAACPLUS_DEC_CONFIG_FATAL_INVALID_SAMPLE_RATE 0xFFFF8800
+/*****************************************************************************/
+/* Class 3: Execution Errors                                                 */
+/*****************************************************************************/
+/* Non Fatal Errors */
+#define IA_XHEAAC_DEC_EXE_NONFATAL_ADTS_SYNC_LOST 0x00001800
+#define IA_XHEAAC_DEC_EXE_NONFATAL_SBR_TURNED_OFF 0x00001801
+#define IA_XHEAAC_DEC_EXE_NONFATAL_SBR_TURNED_ON 0x00001802
+#define IA_XHEAAC_DEC_EXE_NONFATAL_ADTS_HDR_CRC_FAIL 0x00001803
+#define IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES 0x00001804
 
-// Class 2: Initialization Errors
-
-// Non Fatal Errors
-#define IA_ENHAACPLUS_DEC_INIT_NONFATAL_BOTH_16AND08OUT 0x00001000
-#define IA_ENHAACPLUS_DEC_INIT_NONFATAL_NO_UPSAMPLING 0x00001001
-#define IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START 0x00001002
-
-// Fatal Errors
-#define IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL 0xFFFF9000
-#define IA_ENHAACPLUS_DEC_INIT_FATAL_EO_INPUT_REACHED 0xFFFF9001
-#define IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX 0xFFFF9002
-#define IA_ENHAACPLUS_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED 0xFFFF9003
-
-// Class 3: Execution Errors
-
-// Non Fatal Errors
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_ADTS_SYNC_LOST 0x00001800
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_SBR_TURNED_OFF 0x00001801
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_SBR_TURNED_ON 0x00001802
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_ADTS_HDR_CRC_FAIL 0x00001803
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES 0x00001804
-
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_ELE_INSTANCE_TAG_NOT_FOUND 0x00001805
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL 0x00001806
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR 0x00001807
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED 0x00001808
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_GAIN_CONTROL_DATA_PRESENT 0x00001809
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_TNS_ORDER_ERROR 0x0000180A
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_PREDICTION_DATA_PRESENT 0x0000180B
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_CHANGED_ADTS_SF 0x0000180C
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_PULSEDATA_ERROR 0x0000180D
-#define IA_ENHAACPLUS_DEC_EXE_NONFATAL_INVALID_CODE_BOOK 0x0000180E
-
-// Fatal Errors
-#define IA_ENHAACPLUS_DEC_EXE_FATAL_UNIMPLEMENTED_CCE 0xFFFF9800
-#define IA_ENHAACPLUS_DEC_EXE_FATAL_TNS_RANGE_ERROR 0xFFFF9801
-#define IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER 0xFFFF9802
-#define IA_AACLD_DEC_EXE_FATAL_ER_PROFILE_UNSUPPORTED 0xFFFF9803
-#define IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_DRC_DATA 0xFFFF9804
+#define IA_XHEAAC_DEC_EXE_NONFATAL_ELE_INSTANCE_TAG_NOT_FOUND 0x00001805
+#define IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL 0x00001806
+#define IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR 0x00001807
+#define IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED 0x00001808
+#define IA_XHEAAC_DEC_EXE_NONFATAL_GAIN_CONTROL_DATA_PRESENT 0x00001809
+#define IA_XHEAAC_DEC_EXE_NONFATAL_TNS_ORDER_ERROR 0x0000180A
+#define IA_XHEAAC_DEC_EXE_NONFATAL_PREDICTION_DATA_PRESENT 0x0000180B
+#define IA_XHEAAC_DEC_EXE_NONFATAL_CHANGED_ADTS_SF 0x0000180C
+#define IA_XHEAAC_DEC_EXE_NONFATAL_PULSEDATA_ERROR 0x0000180D
+#define IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK 0x0000180E
+#define IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_CHANNEL_INDEX 0x0000180F
+#define IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_SMOOTH_MODE 0x00001810
+#define IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_SMGTIME 0x00001811
+#define IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_EXTENSION_TYPE 0x00001812
+#define IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_QMF_UPDATE 0x00001813
+#define IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_WINDOW_TYPE 0x00001814
+#define IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_SIN_PARAM 0x00001815
+#define IA_XHEAAC_DEC_EXE_NONFATAL_SBR_PARSE_ERROR 0x00001816
+/* Fatal Errors */
+#define IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE 0xFFFF9800
+#define IA_XHEAAC_DEC_EXE_FATAL_TNS_RANGE_ERROR 0xFFFF9801
+#define IA_XHEAAC_DEC_EXE_FATAL_INVALID_LOAS_HEADER 0xFFFF9802
+#define IA_XHEAAC_DEC_EXE_FATAL_INVALID_DRC_DATA 0xFFFF9803
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_RESHAPE_INPUT 0xFFFF9804
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG 0xFFFF9805
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TIMESLOTS 0xFFFF9806
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_DEQUANT_PARAM 0xFFFF9807
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_QUANT_MODE 0xFFFF9808
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_INPUT_CHANNEL 0xFFFF9809
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_NONZERO_BIT 0xFFFF980A
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_WINDOW_SEQUENCE 0xFFFF980B
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TEMPORAL_SHAPING_CONFIG 0xFFFF980C
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_HRTF_SET 0xFFFF980D
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TTT_MODE 0xFFFF980E
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_OTT_BOXES 0xFFFF980F
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_PARAMETER_SETS 0xFFFF9810
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_MPS_PARAM 0xFFFF9811
+#define IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_PARAMETER_BANDS 0xFFFF9812
 
 #endif /* IXHEAACD_ERROR_CODES_H */
diff --git a/decoder/ixheaacd_esbr_envcal.c b/decoder/ixheaacd_esbr_envcal.c
index 492287d..7b9c2c2 100644
--- a/decoder/ixheaacd_esbr_envcal.c
+++ b/decoder/ixheaacd_esbr_envcal.c
@@ -68,12 +68,12 @@
   } while (inc > 1);
 }
 
-WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
-                             FLOAT32 input_real[][64], FLOAT32 input_imag[][64],
-                             FLOAT32 input_real1[][64],
-                             FLOAT32 input_imag1[][64],
-                             WORD32 x_over_qmf[MAX_NUM_PATCHES],
-                             FLOAT32 *scratch_buff, FLOAT32 *env_out) {
+WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 input_real[][64],
+                             FLOAT32 input_imag[][64], FLOAT32 input_real1[][64],
+                             FLOAT32 input_imag1[][64], WORD32 x_over_qmf[MAX_NUM_PATCHES],
+                             FLOAT32 *scratch_buff, FLOAT32 *env_out, WORD32 ldmps_present,
+                             WORD32 ec_flag) {
+  IA_ERRORCODE err_code = IA_NO_ERROR;
   WORD8 harmonics[64];
   FLOAT32(*env_tmp)[48];
   FLOAT32(*noise_level_pvc)[48];
@@ -151,6 +151,8 @@
 
   WORD32 rate = upsamp_4_flag ? 4 : 2;
 
+  if (ldmps_present == 1) rate = 1;
+
   env_tmp = frame_data->env_tmp;
   noise_level_pvc = frame_data->noise_level_pvc;
   nrg_est_pvc = frame_data->nrg_est_pvc;
@@ -163,24 +165,24 @@
   freq_band_table[1] =
       frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[1];
 
-  if (reset) {
+  if (reset || (ldmps_present == 1)) {
     esbr_start_up = 1;
     esbr_start_up_pvc = 1;
-    phase_index = 0;
+    if (reset) phase_index = 0;
     if (ixheaacd_createlimiterbands(
             (*lim_table), (*gate_mode),
-            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo,
-            num_sf_bands[LOW], x_over_qmf, frame_data->sbr_patching_mode,
-            upsamp_4_flag, &frame_data->patch_param))
+            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, num_sf_bands[LOW],
+            x_over_qmf, frame_data->sbr_patching_mode, upsamp_4_flag, &frame_data->patch_param,
+            ec_flag))
       return IA_FATAL_ERROR;
   }
 
   if (frame_data->sbr_patching_mode != frame_data->prev_sbr_patching_mode) {
     if (ixheaacd_createlimiterbands(
             (*lim_table), (*gate_mode),
-            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo,
-            num_sf_bands[LOW], x_over_qmf, frame_data->sbr_patching_mode,
-            upsamp_4_flag, &frame_data->patch_param))
+            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, num_sf_bands[LOW],
+            x_over_qmf, frame_data->sbr_patching_mode, upsamp_4_flag, &frame_data->patch_param,
+            ec_flag))
       return IA_FATAL_ERROR;
 
     frame_data->prev_sbr_patching_mode = frame_data->sbr_patching_mode;
@@ -195,7 +197,13 @@
       ui = frame_data->pstr_sbr_header->pstr_freq_band_data
                ->freq_band_tbl_hi[i + 1];
       tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
-      if ((tmp >= 64) || (tmp < 0)) return -1;
+
+      if ((tmp >= 64) || (tmp < 0)) {
+        if (ec_flag)
+          tmp = 0;
+        else
+          return -1;
+      }
 
       harmonics[tmp] = add_harmonics[i];
     }
@@ -207,14 +215,24 @@
     }
 
     for (i = 0; i < bs_num_env; i++) {
-      if (kk > MAX_NOISE_ENVELOPES) return IA_FATAL_ERROR;
-      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk])
-        kk++, next++;
+      if (kk > MAX_NOISE_ENVELOPES) {
+        if (ec_flag)
+          kk = MAX_NOISE_ENVELOPES;
+        else
+          return IA_FATAL_ERROR;
+      }
+      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++;
 
       start_pos = p_frame_info->border_vec[i];
       end_pos = p_frame_info->border_vec[i + 1];
-      if ((start_pos < 0) || (end_pos > MAX_FREQ_COEFFS_SBR))
-        return IA_FATAL_ERROR;
+      if ((start_pos < 0) || (end_pos > MAX_FREQ_COEFFS_SBR)) {
+        if (ec_flag) {
+          start_pos = 0;
+          end_pos = MAX_FREQ_COEFFS_SBR;
+        } else
+          return IA_FATAL_ERROR;
+      }
+
       for (t = start_pos; t < end_pos; t++) {
         band_loop_end = num_sf_bands[p_frame_info->freq_res[i]];
 
@@ -226,7 +244,12 @@
 
           for (k = 0; k < ui - li; k++) {
             o = (k + li >= ui2) ? o + 1 : o;
-            if (o >= MAX_NOISE_COEFFS) return IA_FATAL_ERROR;
+            if (o >= MAX_NOISE_COEFFS) {
+              if (ec_flag)
+                o = MAX_NOISE_COEFFS - 1;
+              else
+                return IA_FATAL_ERROR;
+            }
             ui2 = freq_band_table_noise[o + 1];
 
             frame_data->qmapped_pvc[c][t] =
@@ -241,14 +264,23 @@
     next = -1;
 
     for (i = 0; i < bs_num_env; i++) {
-      if (kk > MAX_NOISE_ENVELOPES) return IA_FATAL_ERROR;
-      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk])
-        kk++, next++;
+      if (kk > MAX_NOISE_ENVELOPES) {
+        if (ec_flag)
+          kk = MAX_NOISE_ENVELOPES;
+        else
+          return IA_FATAL_ERROR;
+      }
+      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++;
 
       start_pos = pvc_frame_info->border_vec[i];
       end_pos = pvc_frame_info->border_vec[i + 1];
-      if ((start_pos < 0) || (end_pos > MAX_FREQ_COEFFS_SBR))
-        return IA_FATAL_ERROR;
+      if ((start_pos < 0) || (end_pos > MAX_FREQ_COEFFS_SBR)) {
+        if (ec_flag) {
+          start_pos = 0;
+          end_pos = MAX_FREQ_COEFFS_SBR;
+        } else
+          return IA_FATAL_ERROR;
+      }
       for (t = start_pos; t < end_pos; t++) {
         for (c = 0; c < 64; c++) {
           env_tmp[c][t] = env_out[64 * t + c];
@@ -306,7 +338,12 @@
 
           for (k = 0; k < ui - li; k++) {
             o = (k + li >= ui2) ? o + 1 : o;
-            if (o >= MAX_NOISE_COEFFS) return IA_FATAL_ERROR;
+            if (o >= MAX_NOISE_COEFFS) {
+              if (ec_flag)
+                o = MAX_NOISE_COEFFS - 1;
+              else
+                return IA_FATAL_ERROR;
+            }
             ui2 = freq_band_table_noise[o + 1];
             nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t];
             nrg_tone_pvc[c][t] = 0.0f;
@@ -425,7 +462,12 @@
 
           for (k = 0; k < ui - li; k++) {
             o = (k + li >= ui2) ? o + 1 : o;
-            if (o >= MAX_NOISE_COEFFS) return IA_FATAL_ERROR;
+            if (o >= MAX_NOISE_COEFFS) {
+              if (ec_flag)
+                o = MAX_NOISE_COEFFS - 1;
+              else
+                return IA_FATAL_ERROR;
+            }
             ui2 = freq_band_table_noise[o + 1];
             nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t];
             nrg_tone_pvc[c][t] = 0.0f;
@@ -519,6 +561,8 @@
         slot_idx = (WORD32)l / rate;
         if (sub_band_start & 1) {
           freq_inv = -1;
+        } else {
+          freq_inv = 1;
         }
 
         for (k = 0; k < num_subbands; k++) {
@@ -576,7 +620,12 @@
     }
 
     for (i = 0; i < bs_num_env; i++) {
-      if (kk > MAX_NOISE_ENVELOPES) return IA_FATAL_ERROR;
+      if (kk > MAX_NOISE_ENVELOPES) {
+        if (ec_flag)
+          kk = MAX_NOISE_ENVELOPES;
+        else
+          return IA_FATAL_ERROR;
+      }
 
       if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk])
         kk++, next++;
@@ -619,7 +668,12 @@
           for (k = 0; k < ui - li; k++) {
             FLOAT64 guard = 1e-17;
             o = (k + li >= ui2) ? o + 1 : o;
-            if (o >= MAX_NOISE_COEFFS) return IA_FATAL_ERROR;
+            if (o >= MAX_NOISE_COEFFS) {
+              if (ec_flag)
+                o = MAX_NOISE_COEFFS - 1;
+              else
+                return IA_FATAL_ERROR;
+            }
             ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
                       ->freq_band_tbl_noise[o + 1];
             nrg_ref[c] = sfb_nrg[m];
@@ -686,7 +740,7 @@
           }
         }
 
-        if (esbr_start_up) {
+        if (esbr_start_up && (ldmps_present != 1)) {
           for (n = 0; n < 4; n++) {
             memcpy((*e_gain)[n], nrg_gain, num_subbands * sizeof(FLOAT32));
             memcpy((*noise_buf)[n], noise_level,
@@ -701,6 +755,9 @@
           ptr_real_buf = *(input_real + l) + sub_band_start;
           ptr_imag_buf = *(input_imag + l) + sub_band_start;
 
+          freq_inv = 1;
+          if ((ldmps_present == 1) && (sub_band_start & 1)) freq_inv = -1;
+
           for (k = 0; k < num_subbands; k++) {
             (*e_gain)[4][k] = nrg_gain[k];
             (*noise_buf)[4][k] = noise_level[k];
@@ -713,14 +770,27 @@
             phase_index = (phase_index + 1) & 511;
             sb_noise = (nrg_tone[k] != 0 || noise_absc_flag) ? 0 : sb_noise;
 
-            *ptr_real_buf = *ptr_real_buf * sb_gain +
+            if (ldmps_present == 1) {
+              *ptr_real_buf = *ptr_real_buf * sb_gain +
+                              sb_noise * ixheaacd_random_phase[phase_index][0] +
+                              nrg_tone[k] * ixheaacd_hphase_tbl[0][harm_index];
+              *ptr_imag_buf =
+                  *ptr_imag_buf * sb_gain +
+                  sb_noise * ixheaacd_random_phase[phase_index][1] +
+                  nrg_tone[k] * freq_inv * ixheaacd_hphase_tbl[1][harm_index];
+
+              freq_inv = -freq_inv;
+            } else {
+                *ptr_real_buf = *ptr_real_buf * sb_gain +
                             sb_noise * ixheaacd_random_phase[phase_index][0];
-            *ptr_imag_buf = *ptr_imag_buf * sb_gain +
+                *ptr_imag_buf = *ptr_imag_buf * sb_gain +
                             sb_noise * ixheaacd_random_phase[phase_index][1];
+            }
 
             ptr_real_buf++;
             ptr_imag_buf++;
           }
+          if (ldmps_present == 1) harm_index = (harm_index + 1) & 3;
 
           memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32));
           for (n = 0; n < 4; n++)
@@ -732,14 +802,17 @@
           memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32));
         }
 
-        ixheaacd_apply_inter_tes(
-            *(input_real1 + rate * p_frame_info->border_vec[i]),
-            *(input_imag1 + rate * p_frame_info->border_vec[i]),
-            *(input_real + rate * p_frame_info->border_vec[i]),
-            *(input_imag + rate * p_frame_info->border_vec[i]),
-            rate * p_frame_info->border_vec[i + 1] -
-                rate * p_frame_info->border_vec[i],
-            sub_band_start, num_subbands, frame_data->inter_temp_shape_mode[i]);
+        if (ldmps_present != 1) {
+          err_code = ixheaacd_apply_inter_tes(
+              *(input_real1 + rate * p_frame_info->border_vec[i]),
+              *(input_imag1 + rate * p_frame_info->border_vec[i]),
+              *(input_real + rate * p_frame_info->border_vec[i]),
+              *(input_imag + rate * p_frame_info->border_vec[i]),
+              rate * p_frame_info->border_vec[i + 1] - rate * p_frame_info->border_vec[i],
+              sub_band_start, num_subbands, frame_data->inter_temp_shape_mode[i]);
+          if (err_code != 0) {
+            return err_code;
+          }
 
         for (l = rate * p_frame_info->border_vec[i];
              l < rate * p_frame_info->border_vec[i + 1]; l++) {
@@ -747,6 +820,8 @@
           ptr_imag_buf = *(input_imag + l) + sub_band_start;
           if (sub_band_start & 1) {
             freq_inv = -1;
+          } else {
+            freq_inv = 1;
           }
           for (k = 0; k < num_subbands; k++) {
             *ptr_real_buf += nrg_tone[k] * ixheaacd_hphase_tbl[0][harm_index];
@@ -762,6 +837,7 @@
       }
     }
   }
+}
 
   for (i = 0; i < 64; i++) {
     (*harm_flag_varlen_prev)[i] = (*harm_flag_prev)[i];
@@ -777,6 +853,7 @@
     frame_data->env_short_flag_prev = -1;
   }
 
+  if (ldmps_present != 1) {
   memcpy((VOID *)&frame_data->str_frame_info_prev,
          (VOID *)&frame_data->str_frame_info_details,
          sizeof(ia_frame_info_struct));
@@ -788,8 +865,12 @@
   }
 
   if ((frame_data->str_frame_info_details.num_noise_env < 1) ||
-      (frame_data->str_frame_info_details.num_noise_env > 2))
-    return IA_FATAL_ERROR;
+        (frame_data->str_frame_info_details.num_noise_env > 2)) {
+      if (ec_flag)
+        frame_data->str_frame_info_details.num_noise_env = 1;
+      else
+        return IA_FATAL_ERROR;
+    }
 
   for (i = 0; i < num_nf_bands; i++) {
     prev_env_noise_level[i] =
@@ -798,6 +879,7 @@
                  num_nf_bands +
              i];
   }
+}
 
   frame_data->harm_index = harm_index;
   frame_data->phase_index = phase_index;
@@ -806,11 +888,12 @@
   return 0;
 }
 
-IA_ERRORCODE ixheaacd_createlimiterbands(
-    WORD32 lim_table[4][12 + 1], WORD32 gate_mode[4], WORD16 *freq_band_tbl,
-    WORD32 ixheaacd_num_bands, WORD32 x_over_qmf[MAX_NUM_PATCHES],
-    WORD32 b_patching_mode, WORD32 upsamp_4_flag,
-    struct ixheaacd_lpp_trans_patch *patch_param) {
+IA_ERRORCODE ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1], WORD32 gate_mode[4],
+                                         WORD16 *freq_band_tbl, WORD32 ixheaacd_num_bands,
+                                         WORD32 x_over_qmf[MAX_NUM_PATCHES],
+                                         WORD32 b_patching_mode, WORD32 upsamp_4_flag,
+                                         struct ixheaacd_lpp_trans_patch *patch_param,
+                                         WORD32 ec_flag) {
   WORD32 i, j, k, is_patch_border[2];
   WORD32 patch_borders[MAX_NUM_PATCHES + 1];
   WORD32 temp_limiter_band_calc[32 + MAX_NUM_PATCHES + 1];
@@ -903,7 +986,12 @@
         }
       }
     }
-    if (gate_mode[i] > 12) return IA_FATAL_ERROR;
+    if (gate_mode[i] > 12) {
+      if (ec_flag)
+        gate_mode[i] = 12;
+      else
+        return IA_FATAL_ERROR;
+    }
     for (k = 0; k <= gate_mode[i]; k++) {
       lim_table[i][k] = temp_limiter_band_calc[k];
     }
@@ -911,10 +999,10 @@
   return IA_NO_ERROR;
 }
 
-VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
-                              FLOAT32 *qmf_real, FLOAT32 *qmf_imag,
-                              WORD32 num_sample, WORD32 sub_band_start,
-                              WORD32 num_subband, WORD32 gamma_idx) {
+WORD32 ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
+                                FLOAT32 *qmf_real, FLOAT32 *qmf_imag,
+                                WORD32 num_sample, WORD32 sub_band_start,
+                                WORD32 num_subband, WORD32 gamma_idx) {
   WORD32 sub_band_end = sub_band_start + num_subband;
   FLOAT32 subsample_power_high[TIMESLOT_BUFFER_SIZE],
       subsample_power_low[TIMESLOT_BUFFER_SIZE];
@@ -925,6 +1013,10 @@
   FLOAT32 gamma = ixheaacd_q_gamma_table[gamma_idx];
   WORD32 i, j;
 
+  if (num_sample > TIMESLOT_BUFFER_SIZE)
+  {
+    return IA_FATAL_ERROR;
+  }
   if (gamma > 0) {
     for (i = 0; i < num_sample; i++) {
       memcpy(&qmf_real[64 * i], &qmf_real1[64 * i],
@@ -978,4 +1070,5 @@
       }
     }
   }
+  return 0;
 }
diff --git a/decoder/ixheaacd_esbr_fft.c b/decoder/ixheaacd_esbr_fft.c
index 8a5b616..97a6eff 100644
--- a/decoder/ixheaacd_esbr_fft.c
+++ b/decoder/ixheaacd_esbr_fft.c
@@ -36,8 +36,8 @@
   } while (0)
 
 extern const FLOAT32 ixheaacd_twiddle_table_fft_float[514];
-const FLOAT32 ixheaacd_twidle_tbl_48[64];
-const FLOAT32 ixheaacd_twidle_tbl_24[32];
+extern const FLOAT32 ixheaacd_twidle_tbl_48[64];
+extern const FLOAT32 ixheaacd_twidle_tbl_24[32];
 
 void ixheaacd_real_synth_fft_p2(FLOAT32 *ptr_x, FLOAT32 *ptr_y,
                                 WORD32 npoints) {
@@ -522,7 +522,6 @@
 
       x1r = *ptr_y;
       x1i = *(ptr_y + 1);
-
       tmp = (FLOAT32)(((FLOAT32)x1r * W4) - ((FLOAT32)x1i * W1));
       x1i = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
       x1r = tmp;
diff --git a/decoder/ixheaacd_esbr_polyphase.c b/decoder/ixheaacd_esbr_polyphase.c
index 8da3c57..8a37ca7 100644
--- a/decoder/ixheaacd_esbr_polyphase.c
+++ b/decoder/ixheaacd_esbr_polyphase.c
@@ -49,8 +49,14 @@
   WORD32 idx;
   WORD32 anal_size = 2 * ptr_hbe_txposer->synth_size;
   WORD32 N = (10 * anal_size);
+  WORD32 no_bins = ptr_hbe_txposer->no_bins >> 1;
 
-  for (idx = 0; idx < (ptr_hbe_txposer->no_bins >> 1); idx++) {
+  if (ptr_hbe_txposer->esbr_hq != 0) {
+    anal_size = 2 * ptr_hbe_txposer->analy_size;
+    no_bins = ptr_hbe_txposer->no_bins;
+  }
+
+  for (idx = 0; idx < no_bins; idx++) {
     WORD32 i, j, k, l;
     FLOAT32 window_output[640];
     FLOAT32 u[128], u_in[256], u_out[256];
@@ -61,7 +67,14 @@
     FLOAT32 *analy_cos_sin_tab = ptr_hbe_txposer->analy_cos_sin_tab;
     const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->analy_wind_coeff;
     FLOAT32 *x = ptr_hbe_txposer->analy_buf;
-
+    if (ptr_hbe_txposer->esbr_hq != 0) {
+      memset(ptr_hbe_txposer->qmf_in_buf[idx], 0,
+          TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
+      inp_signal = ptr_hbe_txposer->ptr_output_buf +
+          idx * ptr_hbe_txposer->analy_size + 1;
+      anal_buf = &ptr_hbe_txposer->qmf_in_buf[idx]
+          [4 * ptr_hbe_txposer->a_start];
+    } else {
     memset(ptr_hbe_txposer->qmf_in_buf[idx + HBE_OPER_WIN_LEN - 1], 0,
            TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
 
@@ -69,6 +82,7 @@
                  idx * 2 * ptr_hbe_txposer->synth_size + 1;
     anal_buf = &ptr_hbe_txposer->qmf_in_buf[idx + HBE_OPER_WIN_LEN - 1]
                                            [4 * ptr_hbe_txposer->k_start];
+    }
 
     for (i = N - 1; i >= anal_size; i--) {
       x[i] = x[i - anal_size];
@@ -89,8 +103,7 @@
       }
       u[i] = accu_r;
     }
-
-    if (anal_size == 40) {
+    if (anal_size == 40 || anal_size == 56) {
       for (i = 1; i < anal_size; i++) {
         FLOAT32 temp1 = u[i] + u[2 * anal_size - i];
         FLOAT32 temp2 = u[i] - u[2 * anal_size - i];
@@ -154,12 +167,19 @@
       (FLOAT32 *)&ixheaacd_cos_table_trans_qmf[0][0] +
       ptr_hbe_txposer->k_start * 32;
   FLOAT32 *buffer = ptr_hbe_txposer->synth_buf;
+  FLOAT32 *ptr_inp_buf = ptr_hbe_txposer->ptr_input_buf + ptr_hbe_txposer->ana_fft_size[0];
 
   for (idx = 0; idx < num_columns; idx++) {
     FLOAT32 loc_qmf_buf[64];
     FLOAT32 *synth_buf_r = loc_qmf_buf;
-    FLOAT32 *out_buf = ptr_hbe_txposer->ptr_input_buf +
+    FLOAT32 *out_buf;
+    if (ptr_hbe_txposer->esbr_hq == 1) {
+        out_buf = ptr_inp_buf +
+                  (idx - 1) * ptr_hbe_txposer->synth_size;
+    } else {
+      out_buf = ptr_hbe_txposer->ptr_input_buf +
                        (idx + 1) * ptr_hbe_txposer->synth_size;
+    }
     FLOAT32 *synth_cos_tab = ptr_hbe_txposer->synth_cos_tab;
     const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->synth_wind_coeff;
     if (ptr_hbe_txposer->k_start < 0) return -1;
@@ -251,4 +271,68 @@
     }
   }
   return 0;
-}
\ No newline at end of file
+}
+
+WORD32 ixheaacd_dft_hbe_cplx_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+                                       FLOAT32 qmf_buf_real[][64],
+                                       FLOAT32 qmf_buf_imag[][64]) {
+  WORD32 idx;
+
+  WORD32 anal_size = ptr_hbe_txposer->analy_size;
+
+  WORD32 N = (10 * ptr_hbe_txposer->analy_size);
+
+  for (idx = 0; idx < ptr_hbe_txposer->no_bins; idx++) {
+    WORD32 i, j, k, l;
+    FLOAT32 window_output[640];
+    FLOAT32 u[128];
+    FLOAT32 accu_r, accu_i;
+    const FLOAT32 *inp_signal;
+    FLOAT32 *qmf_buf_r = &qmf_buf_real[idx][ptr_hbe_txposer->a_start];
+    FLOAT32 *qmf_buf_i = &qmf_buf_imag[idx][ptr_hbe_txposer->a_start];
+
+    const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->analy_wind_coeff;
+    FLOAT32 *x = ptr_hbe_txposer->analy_buf;
+
+    memset(&qmf_buf_real[idx][ptr_hbe_txposer->a_start], 0,
+        (NO_QMF_SYNTH_CHANNELS - ptr_hbe_txposer->a_start) *
+        sizeof(qmf_buf_real[idx][ptr_hbe_txposer->a_start]));
+    memset(&qmf_buf_imag[idx][ptr_hbe_txposer->a_start], 0,
+        TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(qmf_buf_imag[idx][ptr_hbe_txposer->a_start]));
+
+    inp_signal = ptr_hbe_txposer->ptr_output_buf +
+        idx * ptr_hbe_txposer->analy_size + 1;
+
+    for (i = N - 1; i >= anal_size; i--) {
+        x[i] = x[i - anal_size];
+    }
+
+    for (i = anal_size - 1; i >= 0; i--) {
+        x[i] = inp_signal[anal_size - 1 - i];
+    }
+
+    for (i = 0; i < N; i++) {
+        window_output[i] = x[i] * interp_window_coeff[i];
+    }
+
+    for (i = 0; i < 2 * anal_size; i++) {
+      accu_r = 0.0;
+      for (j = 0; j < 5; j++) {
+        accu_r = accu_r + window_output[i + j * 2 * anal_size];
+      }
+      u[i] = accu_r;
+    }
+
+    for (k = 0; k < anal_size; k++) {
+      accu_r = 0;
+      accu_i = 0;
+      for (l = 0; l < 2 * anal_size; l++) {
+        accu_r = accu_r + u[l] * ptr_hbe_txposer->str_dft_hbe_anal_coeff.real[k][l];
+        accu_i = accu_i + u[l] * ptr_hbe_txposer->str_dft_hbe_anal_coeff.imag[k][l];
+      }
+      qmf_buf_r[k] = (FLOAT32)accu_r;
+      qmf_buf_i[k] = (FLOAT32)accu_i;
+    }
+  }
+  return 0;
+}
diff --git a/decoder/ixheaacd_esbr_rom.c b/decoder/ixheaacd_esbr_rom.c
index 9a65972..fc0748e 100644
--- a/decoder/ixheaacd_esbr_rom.c
+++ b/decoder/ixheaacd_esbr_rom.c
@@ -22,7 +22,7 @@
 #include "ixheaacd_esbr_rom.h"
 
 const FLOAT32 ixheaacd_sub_samp_qmf_window_coeff[40 + 80 + 120 + 160 + 200 +
-                                                 240 + 320 + 400] = {
+                                                 240 + 320 + 400 + 440] = {
     0.000000000000f,  -0.000715773669f, -0.000665041502f, 0.000402654026f,
     0.002620175947f,  0.005039302167f,  0.005271575879f,  0.000027604519f,
     0.013271821663f,  0.034462094307f,  0.058591566980f,  0.075313732028f,
@@ -421,6 +421,117 @@
     -0.000649476249f, -0.000616869889f, -0.000579367450f, -0.000546656549f,
     -0.000511504768f, -0.000489007856f, -0.000493305910f, -0.000558072818f,
 
+    0.000000000000f, -0.000556728919f, -0.000500844268f, -0.000488197809f,
+    -0.000501400093f, -0.000529201934f, -0.000562019297f, -0.000591853342f,
+    -0.000624713139f, -0.000656191143f, -0.000686710351f, -0.000715773669f,
+    -0.000733954250f, -0.000748608378f, -0.000769718143f, -0.000781442621f,
+    -0.000778635906f, -0.000780205359f, -0.000773485284f, -0.000756665308f,
+    -0.000730990549f, -0.000705314334f, -0.000665041502f, -0.000616183213f,
+    -0.000559926149f, -0.000494948297f, -0.000418806652f, -0.000333639531f,
+    -0.000231614991f, -0.000129564374f, -0.000013860786f, 0.000118062519f,
+    0.000253748061f, 0.000402654026f, 0.000562193105f, 0.000734724104f,
+    0.000907300971f, 0.001100212801f, 0.001293914276f, 0.001502302708f,
+    0.001713720965f, 0.001929827733f, 0.002160301199f, 0.002389454516f,
+    0.002620175947f, 0.002859727247f, 0.003097488545f, 0.003335026093f,
+    0.003571928944f, 0.003804124426f, 0.004038002808f, 0.004253090825f,
+    0.004467199557f, 0.004672701936f, 0.004858986009f, 0.005039302167f,
+    0.005188636016f, 0.005337981973f, 0.005444378592f, 0.005536668468f,
+    0.005601509940f, 0.005639122799f, 0.005636681803f, 0.005604403093f,
+    0.005534522235f, 0.005425479729f, 0.005271575879f, 0.005068108905f,
+    0.004826675169f, 0.004522582516f, 0.004171531182f, 0.003762318054f,
+    0.003299441654f, 0.002773069544f, 0.002181392629f, 0.001534081879f,
+    0.000813683204f, 0.000027604519f, -0.000823879847f, -0.001745120040f,
+    -0.002741113305f, -0.003804343985f, -0.004943567794f, -0.006148642395f,
+    -0.007428539917f, -0.008786097169f, -0.010207436979f, -0.011706162244f,
+    0.013271821663f, 0.014913232997f, 0.016624111682f, 0.018395680934f,
+    0.020223021507f, 0.022107109427f, 0.024048449472f, 0.026041839272f,
+    0.028090396896f, 0.030182225630f, 0.032305572182f, 0.034462094307f,
+    0.036656811833f, 0.038866810501f, 0.041091293097f, 0.043328888714f,
+    0.045567616820f, 0.047798689455f, 0.050014410168f, 0.052214913070f,
+    0.054379109293f, 0.056505154818f, 0.058591566980f, 0.060602732003f,
+    0.062563933432f, 0.064427278936f, 0.066216394305f, 0.067906729877f,
+    0.069474309683f, 0.070933312178f, 0.072252631187f, 0.073429144919f,
+    0.074452124536f, 0.075313732028f, 0.075981929898f, 0.076471947134f,
+    0.076748646796f, 0.076821982861f, 0.076661735773f, 0.076264895499f,
+    0.075626403093f, 0.074717774987f, 0.073553040624f, 0.072080284357f,
+    0.070353306830f, 0.068278267980f, 0.065922088921f, 0.063222929835f,
+    0.060206387192f, 0.056841813028f, 0.053128439933f, 0.049058299512f,
+    0.044623576105f, 0.039827272296f, 0.034632667899f, 0.029082400724f,
+    0.023107493296f, 0.016772758216f, 0.010017349385f, 0.002883261768f,
+    -0.004671230447f, -0.012613182887f, -0.020963322371f, -0.029723916203f,
+    -0.038868859410f, -0.048435091972f, -0.058370534331f, -0.068738058209f,
+    -0.079460747540f, -0.090590693057f, -0.102082192898f, -0.113953240216f,
+    -0.126184210181f, -0.138759121299f, -0.151693820953f, -0.164939984679f,
+    -0.178527981043f, -0.192396670580f, -0.206601783633f, -0.221057057381f,
+    -0.235790148377f, -0.250766962767f, -0.265984892845f, -0.281414777040f,
+    -0.297042310238f, -0.312857747078f, -0.328816920519f, -0.344937264919f,
+    0.361158996820f, 0.377495825291f, 0.393895149231f, 0.410354763269f,
+    0.426849693060f, 0.443349361420f, 0.459840744734f, 0.476296275854f,
+    0.492681771517f, 0.508994698524f, 0.525178551674f, 0.541255354881f,
+    0.557147920132f, 0.572872996330f, 0.588384807110f, 0.603675365448f,
+    0.618696510792f, 0.633450806141f, 0.647904217243f, 0.662018775940f,
+    0.675809025764f, 0.689195275307f, 0.702238857746f, 0.714807152748f,
+    0.726990461349f, 0.738680064678f, 0.749926269054f, 0.760660707951f,
+    0.770893514156f, 0.780593633652f, 0.789741635323f, 0.798355877399f,
+    0.806351006031f, 0.813819110394f, 0.820606887341f, 0.826847016811f,
+    0.832409322262f, 0.837375700474f, 0.841682255268f, 0.845338821411f,
+    0.848349571228f, 0.850682020187f, 0.852377176285f, 0.853358447552f,
+    0.853738546371f, 0.853358447552f, 0.852377176285f, 0.850681960583f,
+    0.848349571228f, 0.845338702202f, 0.841682136059f, 0.837375700474f,
+    0.832409203053f, 0.826847016811f, 0.820606768131f, 0.813819110394f,
+    0.806350827217f, 0.798355877399f, 0.789741396904f, 0.780593454838f,
+    0.770893335342f, 0.760660469532f, 0.749926269054f, 0.738679826260f,
+    0.726990461349f, 0.714806914330f, 0.702238857746f, 0.689194977283f,
+    0.675809025764f, 0.662018477917f, 0.647903919220f, 0.633450508118f,
+    0.618696212769f, 0.603675365448f, 0.588384449482f, 0.572872996330f,
+    0.557147622108f, 0.541255354881f, 0.525178194046f, 0.508994698524f,
+    0.492681413889f, 0.476295948029f, 0.459840387106f, 0.443349003792f,
+    0.426849693060f, 0.410354435444f, 0.393895149231f, 0.377495467663f,
+    -0.361158996820f, -0.344937115908f, -0.328816920519f, -0.312857568264f,
+    -0.297041982412f, -0.281414598227f, -0.265984565020f, -0.250766813755f,
+    -0.235789835453f, -0.221056908369f, -0.206601470709f, -0.192396670580f,
+    -0.178527832031f, -0.164939984679f, -0.151693671942f, -0.138758853078f,
+    -0.126184076071f, -0.113952986896f, -0.102082073689f, -0.090590454638f,
+    -0.079460635781f, -0.068737842143f, -0.058370534331f, -0.048434991390f,
+    -0.038868658245f, -0.029723823071f, -0.020963139832f, -0.012613098137f,
+    -0.004671066534f, 0.002883337904f, 0.010017495602f, 0.016772827134f,
+    0.023107623681f, 0.029082400724f, 0.034632723778f, 0.039827380329f,
+    0.044623624533f, 0.049058388919f, 0.053128480911f, 0.056841887534f,
+    0.060206420720f, 0.063222989440f, 0.065922111273f, 0.068278290331f,
+    0.070353306830f, 0.072080299258f, 0.073553070426f, 0.074717789888f,
+    0.075626417994f, 0.076264902949f, 0.076661743224f, 0.076821982861f,
+    0.076748639345f, 0.076471947134f, 0.075981922448f, 0.075313732028f,
+    0.074452117085f, 0.073429122567f, 0.072252616286f, 0.070933282375f,
+    0.069474294782f, 0.067906692624f, 0.066216371953f, 0.064427241683f,
+    0.062563933432f, 0.060602713376f, 0.058591566980f, 0.056505132467f,
+    0.054379064590f, 0.052214890718f, 0.050014361739f, 0.047798667103f,
+    0.045567568392f, 0.043328862637f, 0.041091248393f, 0.038866810501f,
+    0.036656789482f, 0.034462094307f, 0.032305549830f, 0.030182180926f,
+    0.028090374544f, 0.026041796431f, 0.024048428982f, 0.022107070312f,
+    0.020223002881f, 0.018395643681f, 0.016624111682f, 0.014913215302f,
+    -0.013271821663f, -0.011706114747f, -0.010207405314f, -0.008786082268f,
+    -0.007428539917f, -0.006148603279f, -0.004943549167f, -0.003804338397f,
+    -0.002741118660f, -0.001745095360f, -0.000823865877f, 0.000027604519f,
+    0.000813706429f, 0.001534096780f, 0.002181399148f, 0.002773069544f,
+    0.003299456788f, 0.003762325039f, 0.004171533510f, 0.004522580653f,
+    0.004826682154f, 0.005068112630f, 0.005271575879f, 0.005425483920f,
+    0.005534524098f, 0.005604403559f, 0.005636681803f, 0.005639121868f,
+    0.005601509474f, 0.005536668003f, 0.005444379058f, 0.005337978248f,
+    0.005188634153f, 0.005039302167f, 0.004858980421f, 0.004672697745f,
+    0.004467197228f, 0.004253090825f, 0.004037996754f, 0.003804120934f,
+    0.003571927780f, 0.003335027257f, 0.003097482258f, 0.002859724686f,
+    0.002620175947f, 0.002389447298f, 0.002160296543f, 0.001929825987f,
+    0.001713721547f, 0.001502296189f, 0.001293911249f, 0.001100211754f,
+    0.000907301903f, 0.000734719913f, 0.000562190951f, 0.000402654026f,
+    0.000253743900f, 0.000118059623f, -0.000013861647f, -0.000129564054f,
+    -0.000231618033f, -0.000333640899f, -0.000418807031f, -0.000494947657f,
+    -0.000559927430f, -0.000616183970f, -0.000665041502f, -0.000705315731f,
+    -0.000730990898f, -0.000756665424f, -0.000773485284f, -0.000780205359f,
+    -0.000778635847f, -0.000781442563f, -0.000769718201f, -0.000748608203f,
+    -0.000733953959f, -0.000715773669f, -0.000686709653f, -0.000656190445f,
+    -0.000624712906f, -0.000591853517f, -0.000562018424f, -0.000529201352f,
+    -0.000501400034f, -0.000488197838f, -0.000500846538f, -0.000556728744f,
+
 };
 
 const FLOAT32 ixheaacd_random_phase[512][2] = {
@@ -942,16 +1053,16 @@
 
 const FLOAT32 ixheaacd_g_lim_gains[4] = {0.70795f, 1.0f, 1.41254f, 1e10f};
 
-const FIR_FILTER ixheaacd_fir_0 = {1.0f};
-const FIR_FILTER ixheaacd_fir_1 = {0.33333333333333f, 0.66666666666666f};
-const FIR_FILTER ixheaacd_fir_2 = {0.12500000000000f, 0.37500000000000f,
+const ia_fir_table_struct ixheaacd_fir_0 = {1.0f};
+const ia_fir_table_struct ixheaacd_fir_1 = {0.33333333333333f, 0.66666666666666f};
+const ia_fir_table_struct ixheaacd_fir_2 = {0.12500000000000f, 0.37500000000000f,
                                    0.50000000000000f};
-const FIR_FILTER ixheaacd_fir_3 = {0.05857864376269f, 0.20000000000000f,
+const ia_fir_table_struct ixheaacd_fir_3 = {0.05857864376269f, 0.20000000000000f,
                                    0.34142135623731f, 0.40000000000000f};
-const FIR_FILTER ixheaacd_fir_4 = {0.03183050093751f, 0.11516383427084f,
+const ia_fir_table_struct ixheaacd_fir_4 = {0.03183050093751f, 0.11516383427084f,
                                    0.21816949906249f, 0.30150283239582f,
                                    0.33333333333333f};
-const FIR_FILTER* const ixheaacd_fir_table[5] = {
+const ia_fir_table_struct* ixheaacd_fir_table[5] = {
     &ixheaacd_fir_0, &ixheaacd_fir_1, &ixheaacd_fir_2, &ixheaacd_fir_3,
     &ixheaacd_fir_4};
 const FLOAT32 ixheaacd_q_gamma_table[4] = {0.0f, 1.0f, 2.0f, 4.0f};
@@ -2315,6 +2426,1055 @@
     -0.999229f, -0.039260f,
 };
 
+const FLOAT32 ixheaacd_analy_cos_sin_table_kl_56[56 * 56 * 2] = {
+    0.000000000f,  -1.000000000f, 0.028046256f,  -0.999606609f, 0.056070447f,  -0.998426795f,
+    0.084050521f,  -0.996461511f, 0.111964479f,  -0.993712187f, 0.139790341f,  -0.990181148f,
+    0.167506218f,  -0.985871017f, 0.195090324f,  -0.980785251f, 0.222520933f,  -0.974927902f,
+    0.249776483f,  -0.968303502f, 0.276835501f,  -0.960917294f, 0.303676754f,  -0.952775121f,
+    0.330279052f,  -0.943883359f, 0.356621534f,  -0.934248924f, 0.382683426f,  -0.923879504f,
+    0.408444256f,  -0.912783265f, 0.433883727f,  -0.900968850f, 0.458981872f,  -0.888445616f,
+    0.483718902f,  -0.875223398f, 0.508075356f,  -0.861312628f, 0.532032073f,  -0.846724212f,
+    0.555570245f,  -0.831469595f, 0.578671277f,  -0.815560877f, 0.601317108f,  -0.799010456f,
+    0.623489797f,  -0.781831503f, 0.645172000f,  -0.764037371f, 0.666346550f,  -0.745642185f,
+    0.686996937f,  -0.726660311f, 0.707106769f,  -0.707106769f, 0.726660311f,  -0.686996937f,
+    0.745642185f,  -0.666346550f, 0.764037371f,  -0.645172000f, 0.781831503f,  -0.623489797f,
+    0.799010456f,  -0.601317108f, 0.815560877f,  -0.578671277f, 0.831469595f,  -0.555570245f,
+    0.846724212f,  -0.532032073f, 0.861312628f,  -0.508075356f, 0.875223398f,  -0.483718902f,
+    0.888445616f,  -0.458981872f, 0.900968850f,  -0.433883727f, 0.912783265f,  -0.408444256f,
+    0.923879504f,  -0.382683426f, 0.934248924f,  -0.356621534f, 0.943883359f,  -0.330279052f,
+    0.952775121f,  -0.303676754f, 0.960917294f,  -0.276835501f, 0.968303502f,  -0.249776483f,
+    0.974927902f,  -0.222520933f, 0.980785251f,  -0.195090324f, 0.985871017f,  -0.167506218f,
+    0.990181148f,  -0.139790341f, 0.993712187f,  -0.111964479f, 0.996461511f,  -0.084050521f,
+    0.998426795f,  -0.056070447f, 0.999606609f,  -0.028046256f, -0.000000000f, 1.000000000f,
+    -0.084050521f, 0.996461511f,  -0.167506218f, 0.985871017f,  -0.249776483f, 0.968303502f,
+    -0.330279052f, 0.943883359f,  -0.408444256f, 0.912783265f,  -0.483718902f, 0.875223398f,
+    -0.555570245f, 0.831469595f,  -0.623489797f, 0.781831503f,  -0.686996937f, 0.726660311f,
+    -0.745642185f, 0.666346550f,  -0.799010456f, 0.601317108f,  -0.846724212f, 0.532032073f,
+    -0.888445616f, 0.458981872f,  -0.923879504f, 0.382683426f,  -0.952775121f, 0.303676754f,
+    -0.974927902f, 0.222520933f,  -0.990181148f, 0.139790341f,  -0.998426795f, 0.056070447f,
+    -0.999606609f, -0.028046256f, -0.993712187f, -0.111964479f, -0.980785251f, -0.195090324f,
+    -0.960917294f, -0.276835501f, -0.934248924f, -0.356621534f, -0.900968850f, -0.433883727f,
+    -0.861312628f, -0.508075356f, -0.815560877f, -0.578671277f, -0.764037371f, -0.645172000f,
+    -0.707106769f, -0.707106769f, -0.645172000f, -0.764037371f, -0.578671277f, -0.815560877f,
+    -0.508075356f, -0.861312628f, -0.433883727f, -0.900968850f, -0.356621534f, -0.934248924f,
+    -0.276835501f, -0.960917294f, -0.195090324f, -0.980785251f, -0.111964479f, -0.993712187f,
+    -0.028046256f, -0.999606609f, 0.056070447f,  -0.998426795f, 0.139790341f,  -0.990181148f,
+    0.222520933f,  -0.974927902f, 0.303676754f,  -0.952775121f, 0.382683426f,  -0.923879504f,
+    0.458981872f,  -0.888445616f, 0.532032073f,  -0.846724212f, 0.601317108f,  -0.799010456f,
+    0.666346550f,  -0.745642185f, 0.726660311f,  -0.686996937f, 0.781831503f,  -0.623489797f,
+    0.831469595f,  -0.555570245f, 0.875223398f,  -0.483718902f, 0.912783265f,  -0.408444256f,
+    0.943883359f,  -0.330279052f, 0.968303502f,  -0.249776483f, 0.985871017f,  -0.167506218f,
+    0.996461511f,  -0.084050521f, 0.000000000f,  -1.000000000f, 0.139790341f,  -0.990181148f,
+    0.276835501f,  -0.960917294f, 0.408444256f,  -0.912783265f, 0.532032073f,  -0.846724212f,
+    0.645172000f,  -0.764037371f, 0.745642185f,  -0.666346550f, 0.831469595f,  -0.555570245f,
+    0.900968850f,  -0.433883727f, 0.952775121f,  -0.303676754f, 0.985871017f,  -0.167506218f,
+    0.999606609f,  -0.028046256f, 0.993712187f,  0.111964479f,  0.968303502f,  0.249776483f,
+    0.923879504f,  0.382683426f,  0.861312628f,  0.508075356f,  0.781831503f,  0.623489797f,
+    0.686996937f,  0.726660311f,  0.578671277f,  0.815560877f,  0.458981872f,  0.888445616f,
+    0.330279052f,  0.943883359f,  0.195090324f,  0.980785251f,  0.056070447f,  0.998426795f,
+    -0.084050521f, 0.996461511f,  -0.222520933f, 0.974927902f,  -0.356621534f, 0.934248924f,
+    -0.483718902f, 0.875223398f,  -0.601317108f, 0.799010456f,  -0.707106769f, 0.707106769f,
+    -0.799010456f, 0.601317108f,  -0.875223398f, 0.483718902f,  -0.934248924f, 0.356621534f,
+    -0.974927902f, 0.222520933f,  -0.996461511f, 0.084050521f,  -0.998426795f, -0.056070447f,
+    -0.980785251f, -0.195090324f, -0.943883359f, -0.330279052f, -0.888445616f, -0.458981872f,
+    -0.815560877f, -0.578671277f, -0.726660311f, -0.686996937f, -0.623489797f, -0.781831503f,
+    -0.508075356f, -0.861312628f, -0.382683426f, -0.923879504f, -0.249776483f, -0.968303502f,
+    -0.111964479f, -0.993712187f, 0.028046256f,  -0.999606609f, 0.167506218f,  -0.985871017f,
+    0.303676754f,  -0.952775121f, 0.433883727f,  -0.900968850f, 0.555570245f,  -0.831469595f,
+    0.666346550f,  -0.745642185f, 0.764037371f,  -0.645172000f, 0.846724212f,  -0.532032073f,
+    0.912783265f,  -0.408444256f, 0.960917294f,  -0.276835501f, 0.990181148f,  -0.139790341f,
+    -0.000000000f, 1.000000000f,  -0.195090324f, 0.980785251f,  -0.382683426f, 0.923879504f,
+    -0.555570245f, 0.831469595f,  -0.707106769f, 0.707106769f,  -0.831469595f, 0.555570245f,
+    -0.923879504f, 0.382683426f,  -0.980785251f, 0.195090324f,  -1.000000000f, -0.000000000f,
+    -0.980785251f, -0.195090324f, -0.923879504f, -0.382683426f, -0.831469595f, -0.555570245f,
+    -0.707106769f, -0.707106769f, -0.555570245f, -0.831469595f, -0.382683426f, -0.923879504f,
+    -0.195090324f, -0.980785251f, 0.000000000f,  -1.000000000f, 0.195090324f,  -0.980785251f,
+    0.382683426f,  -0.923879504f, 0.555570245f,  -0.831469595f, 0.707106769f,  -0.707106769f,
+    0.831469595f,  -0.555570245f, 0.923879504f,  -0.382683426f, 0.980785251f,  -0.195090324f,
+    1.000000000f,  0.000000000f,  0.980785251f,  0.195090324f,  0.923879504f,  0.382683426f,
+    0.831469595f,  0.555570245f,  0.707106769f,  0.707106769f,  0.555570245f,  0.831469595f,
+    0.382683426f,  0.923879504f,  0.195090324f,  0.980785251f,  -0.000000000f, 1.000000000f,
+    -0.195090324f, 0.980785251f,  -0.382683426f, 0.923879504f,  -0.555570245f, 0.831469595f,
+    -0.707106769f, 0.707106769f,  -0.831469595f, 0.555570245f,  -0.923879504f, 0.382683426f,
+    -0.980785251f, 0.195090324f,  -1.000000000f, -0.000000000f, -0.980785251f, -0.195090324f,
+    -0.923879504f, -0.382683426f, -0.831469595f, -0.555570245f, -0.707106769f, -0.707106769f,
+    -0.555570245f, -0.831469595f, -0.382683426f, -0.923879504f, -0.195090324f, -0.980785251f,
+    0.000000000f,  -1.000000000f, 0.195090324f,  -0.980785251f, 0.382683426f,  -0.923879504f,
+    0.555570245f,  -0.831469595f, 0.707106769f,  -0.707106769f, 0.831469595f,  -0.555570245f,
+    0.923879504f,  -0.382683426f, 0.980785251f,  -0.195090324f, 0.000000000f,  -1.000000000f,
+    0.249776483f,  -0.968303502f, 0.483718902f,  -0.875223398f, 0.686996937f,  -0.726660311f,
+    0.846724212f,  -0.532032073f, 0.952775121f,  -0.303676754f, 0.998426795f,  -0.056070447f,
+    0.980785251f,  0.195090324f,  0.900968850f,  0.433883727f,  0.764037371f,  0.645172000f,
+    0.578671277f,  0.815560877f,  0.356621534f,  0.934248924f,  0.111964479f,  0.993712187f,
+    -0.139790341f, 0.990181148f,  -0.382683426f, 0.923879504f,  -0.601317108f, 0.799010456f,
+    -0.781831503f, 0.623489797f,  -0.912783265f, 0.408444256f,  -0.985871017f, 0.167506218f,
+    -0.996461511f, -0.084050521f, -0.943883359f, -0.330279052f, -0.831469595f, -0.555570245f,
+    -0.666346550f, -0.745642185f, -0.458981872f, -0.888445616f, -0.222520933f, -0.974927902f,
+    0.028046256f,  -0.999606609f, 0.276835501f,  -0.960917294f, 0.508075356f,  -0.861312628f,
+    0.707106769f,  -0.707106769f, 0.861312628f,  -0.508075356f, 0.960917294f,  -0.276835501f,
+    0.999606609f,  -0.028046256f, 0.974927902f,  0.222520933f,  0.888445616f,  0.458981872f,
+    0.745642185f,  0.666346550f,  0.555570245f,  0.831469595f,  0.330279052f,  0.943883359f,
+    0.084050521f,  0.996461511f,  -0.167506218f, 0.985871017f,  -0.408444256f, 0.912783265f,
+    -0.623489797f, 0.781831503f,  -0.799010456f, 0.601317108f,  -0.923879504f, 0.382683426f,
+    -0.990181148f, 0.139790341f,  -0.993712187f, -0.111964479f, -0.934248924f, -0.356621534f,
+    -0.815560877f, -0.578671277f, -0.645172000f, -0.764037371f, -0.433883727f, -0.900968850f,
+    -0.195090324f, -0.980785251f, 0.056070447f,  -0.998426795f, 0.303676754f,  -0.952775121f,
+    0.532032073f,  -0.846724212f, 0.726660311f,  -0.686996937f, 0.875223398f,  -0.483718902f,
+    0.968303502f,  -0.249776483f, -0.000000000f, 1.000000000f,  -0.303676754f, 0.952775121f,
+    -0.578671277f, 0.815560877f,  -0.799010456f, 0.601317108f,  -0.943883359f, 0.330279052f,
+    -0.999606609f, 0.028046256f,  -0.960917294f, -0.276835501f, -0.831469595f, -0.555570245f,
+    -0.623489797f, -0.781831503f, -0.356621534f, -0.934248924f, -0.056070447f, -0.998426795f,
+    0.249776483f,  -0.968303502f, 0.532032073f,  -0.846724212f, 0.764037371f,  -0.645172000f,
+    0.923879504f,  -0.382683426f, 0.996461511f,  -0.084050521f, 0.974927902f,  0.222520933f,
+    0.861312628f,  0.508075356f,  0.666346550f,  0.745642185f,  0.408444256f,  0.912783265f,
+    0.111964479f,  0.993712187f,  -0.195090324f, 0.980785251f,  -0.483718902f, 0.875223398f,
+    -0.726660311f, 0.686996937f,  -0.900968850f, 0.433883727f,  -0.990181148f, 0.139790341f,
+    -0.985871017f, -0.167506218f, -0.888445616f, -0.458981872f, -0.707106769f, -0.707106769f,
+    -0.458981872f, -0.888445616f, -0.167506218f, -0.985871017f, 0.139790341f,  -0.990181148f,
+    0.433883727f,  -0.900968850f, 0.686996937f,  -0.726660311f, 0.875223398f,  -0.483718902f,
+    0.980785251f,  -0.195090324f, 0.993712187f,  0.111964479f,  0.912783265f,  0.408444256f,
+    0.745642185f,  0.666346550f,  0.508075356f,  0.861312628f,  0.222520933f,  0.974927902f,
+    -0.084050521f, 0.996461511f,  -0.382683426f, 0.923879504f,  -0.645172000f, 0.764037371f,
+    -0.846724212f, 0.532032073f,  -0.968303502f, 0.249776483f,  -0.998426795f, -0.056070447f,
+    -0.934248924f, -0.356621534f, -0.781831503f, -0.623489797f, -0.555570245f, -0.831469595f,
+    -0.276835501f, -0.960917294f, 0.028046256f,  -0.999606609f, 0.330279052f,  -0.943883359f,
+    0.601317108f,  -0.799010456f, 0.815560877f,  -0.578671277f, 0.952775121f,  -0.303676754f,
+    -0.000000000f, -1.000000000f, 0.356621534f,  -0.934248924f, 0.666346550f,  -0.745642185f,
+    0.888445616f,  -0.458981872f, 0.993712187f,  -0.111964479f, 0.968303502f,  0.249776483f,
+    0.815560877f,  0.578671277f,  0.555570245f,  0.831469595f,  0.222520933f,  0.974927902f,
+    -0.139790341f, 0.990181148f,  -0.483718902f, 0.875223398f,  -0.764037371f, 0.645172000f,
+    -0.943883359f, 0.330279052f,  -0.999606609f, -0.028046256f, -0.923879504f, -0.382683426f,
+    -0.726660311f, -0.686996937f, -0.433883727f, -0.900968850f, -0.084050521f, -0.996461511f,
+    0.276835501f,  -0.960917294f, 0.601317108f,  -0.799010456f, 0.846724212f,  -0.532032073f,
+    0.980785251f,  -0.195090324f, 0.985871017f,  0.167506218f,  0.861312628f,  0.508075356f,
+    0.623489797f,  0.781831503f,  0.303676754f,  0.952775121f,  -0.056070447f, 0.998426795f,
+    -0.408444256f, 0.912783265f,  -0.707106769f, 0.707106769f,  -0.912783265f, 0.408444256f,
+    -0.998426795f, 0.056070447f,  -0.952775121f, -0.303676754f, -0.781831503f, -0.623489797f,
+    -0.508075356f, -0.861312628f, -0.167506218f, -0.985871017f, 0.195090324f,  -0.980785251f,
+    0.532032073f,  -0.846724212f, 0.799010456f,  -0.601317108f, 0.960917294f,  -0.276835501f,
+    0.996461511f,  0.084050521f,  0.900968850f,  0.433883727f,  0.686996937f,  0.726660311f,
+    0.382683426f,  0.923879504f,  0.028046256f,  0.999606609f,  -0.330279052f, 0.943883359f,
+    -0.645172000f, 0.764037371f,  -0.875223398f, 0.483718902f,  -0.990181148f, 0.139790341f,
+    -0.974927902f, -0.222520933f, -0.831469595f, -0.555570245f, -0.578671277f, -0.815560877f,
+    -0.249776483f, -0.968303502f, 0.111964479f,  -0.993712187f, 0.458981872f,  -0.888445616f,
+    0.745642185f,  -0.666346550f, 0.934248924f,  -0.356621534f, -0.000000000f, 1.000000000f,
+    -0.408444256f, 0.912783265f,  -0.745642185f, 0.666346550f,  -0.952775121f, 0.303676754f,
+    -0.993712187f, -0.111964479f, -0.861312628f, -0.508075356f, -0.578671277f, -0.815560877f,
+    -0.195090324f, -0.980785251f, 0.222520933f,  -0.974927902f, 0.601317108f,  -0.799010456f,
+    0.875223398f,  -0.483718902f, 0.996461511f,  -0.084050521f, 0.943883359f,  0.330279052f,
+    0.726660311f,  0.686996937f,  0.382683426f,  0.923879504f,  -0.028046256f, 0.999606609f,
+    -0.433883727f, 0.900968850f,  -0.764037371f, 0.645172000f,  -0.960917294f, 0.276835501f,
+    -0.990181148f, -0.139790341f, -0.846724212f, -0.532032073f, -0.555570245f, -0.831469595f,
+    -0.167506218f, -0.985871017f, 0.249776483f,  -0.968303502f, 0.623489797f,  -0.781831503f,
+    0.888445616f,  -0.458981872f, 0.998426795f,  -0.056070447f, 0.934248924f,  0.356621534f,
+    0.707106769f,  0.707106769f,  0.356621534f,  0.934248924f,  -0.056070447f, 0.998426795f,
+    -0.458981872f, 0.888445616f,  -0.781831503f, 0.623489797f,  -0.968303502f, 0.249776483f,
+    -0.985871017f, -0.167506218f, -0.831469595f, -0.555570245f, -0.532032073f, -0.846724212f,
+    -0.139790341f, -0.990181148f, 0.276835501f,  -0.960917294f, 0.645172000f,  -0.764037371f,
+    0.900968850f,  -0.433883727f, 0.999606609f,  -0.028046256f, 0.923879504f,  0.382683426f,
+    0.686996937f,  0.726660311f,  0.330279052f,  0.943883359f,  -0.084050521f, 0.996461511f,
+    -0.483718902f, 0.875223398f,  -0.799010456f, 0.601317108f,  -0.974927902f, 0.222520933f,
+    -0.980785251f, -0.195090324f, -0.815560877f, -0.578671277f, -0.508075356f, -0.861312628f,
+    -0.111964479f, -0.993712187f, 0.303676754f,  -0.952775121f, 0.666346550f,  -0.745642185f,
+    0.912783265f,  -0.408444256f, -0.000000000f, -1.000000000f, 0.458981872f,  -0.888445616f,
+    0.815560877f,  -0.578671277f, 0.990181148f,  -0.139790341f, 0.943883359f,  0.330279052f,
+    0.686996937f,  0.726660311f,  0.276835501f,  0.960917294f,  -0.195090324f, 0.980785251f,
+    -0.623489797f, 0.781831503f,  -0.912783265f, 0.408444256f,  -0.998426795f, -0.056070447f,
+    -0.861312628f, -0.508075356f, -0.532032073f, -0.846724212f, -0.084050521f, -0.996461511f,
+    0.382683426f,  -0.923879504f, 0.764037371f,  -0.645172000f, 0.974927902f,  -0.222520933f,
+    0.968303502f,  0.249776483f,  0.745642185f,  0.666346550f,  0.356621534f,  0.934248924f,
+    -0.111964479f, 0.993712187f,  -0.555570245f, 0.831469595f,  -0.875223398f, 0.483718902f,
+    -0.999606609f, 0.028046256f,  -0.900968850f, -0.433883727f, -0.601317108f, -0.799010456f,
+    -0.167506218f, -0.985871017f, 0.303676754f,  -0.952775121f, 0.707106769f,  -0.707106769f,
+    0.952775121f,  -0.303676754f, 0.985871017f,  0.167506218f,  0.799010456f,  0.601317108f,
+    0.433883727f,  0.900968850f,  -0.028046256f, 0.999606609f,  -0.483718902f, 0.875223398f,
+    -0.831469595f, 0.555570245f,  -0.993712187f, 0.111964479f,  -0.934248924f, -0.356621534f,
+    -0.666346550f, -0.745642185f, -0.249776483f, -0.968303502f, 0.222520933f,  -0.974927902f,
+    0.645172000f,  -0.764037371f, 0.923879504f,  -0.382683426f, 0.996461511f,  0.084050521f,
+    0.846724212f,  0.532032073f,  0.508075356f,  0.861312628f,  0.056070447f,  0.998426795f,
+    -0.408444256f, 0.912783265f,  -0.781831503f, 0.623489797f,  -0.980785251f, 0.195090324f,
+    -0.960917294f, -0.276835501f, -0.726660311f, -0.686996937f, -0.330279052f, -0.943883359f,
+    0.139790341f,  -0.990181148f, 0.578671277f,  -0.815560877f, 0.888445616f,  -0.458981872f,
+    -0.000000000f, 1.000000000f,  -0.508075356f, 0.861312628f,  -0.875223398f, 0.483718902f,
+    -0.999606609f, -0.028046256f, -0.846724212f, -0.532032073f, -0.458981872f, -0.888445616f,
+    0.056070447f,  -0.998426795f, 0.555570245f,  -0.831469595f, 0.900968850f,  -0.433883727f,
+    0.996461511f,  0.084050521f,  0.815560877f,  0.578671277f,  0.408444256f,  0.912783265f,
+    -0.111964479f, 0.993712187f,  -0.601317108f, 0.799010456f,  -0.923879504f, 0.382683426f,
+    -0.990181148f, -0.139790341f, -0.781831503f, -0.623489797f, -0.356621534f, -0.934248924f,
+    0.167506218f,  -0.985871017f, 0.645172000f,  -0.764037371f, 0.943883359f,  -0.330279052f,
+    0.980785251f,  0.195090324f,  0.745642185f,  0.666346550f,  0.303676754f,  0.952775121f,
+    -0.222520933f, 0.974927902f,  -0.686996937f, 0.726660311f,  -0.960917294f, 0.276835501f,
+    -0.968303502f, -0.249776483f, -0.707106769f, -0.707106769f, -0.249776483f, -0.968303502f,
+    0.276835501f,  -0.960917294f, 0.726660311f,  -0.686996937f, 0.974927902f,  -0.222520933f,
+    0.952775121f,  0.303676754f,  0.666346550f,  0.745642185f,  0.195090324f,  0.980785251f,
+    -0.330279052f, 0.943883359f,  -0.764037371f, 0.645172000f,  -0.985871017f, 0.167506218f,
+    -0.934248924f, -0.356621534f, -0.623489797f, -0.781831503f, -0.139790341f, -0.990181148f,
+    0.382683426f,  -0.923879504f, 0.799010456f,  -0.601317108f, 0.993712187f,  -0.111964479f,
+    0.912783265f,  0.408444256f,  0.578671277f,  0.815560877f,  0.084050521f,  0.996461511f,
+    -0.433883727f, 0.900968850f,  -0.831469595f, 0.555570245f,  -0.998426795f, 0.056070447f,
+    -0.888445616f, -0.458981872f, -0.532032073f, -0.846724212f, -0.028046256f, -0.999606609f,
+    0.483718902f,  -0.875223398f, 0.861312628f,  -0.508075356f, -0.000000000f, -1.000000000f,
+    0.555570245f,  -0.831469595f, 0.923879504f,  -0.382683426f, 0.980785251f,  0.195090324f,
+    0.707106769f,  0.707106769f,  0.195090324f,  0.980785251f,  -0.382683426f, 0.923879504f,
+    -0.831469595f, 0.555570245f,  -1.000000000f, -0.000000000f, -0.831469595f, -0.555570245f,
+    -0.382683426f, -0.923879504f, 0.195090324f,  -0.980785251f, 0.707106769f,  -0.707106769f,
+    0.980785251f,  -0.195090324f, 0.923879504f,  0.382683426f,  0.555570245f,  0.831469595f,
+    -0.000000000f, 1.000000000f,  -0.555570245f, 0.831469595f,  -0.923879504f, 0.382683426f,
+    -0.980785251f, -0.195090324f, -0.707106769f, -0.707106769f, -0.195090324f, -0.980785251f,
+    0.382683426f,  -0.923879504f, 0.831469595f,  -0.555570245f, 1.000000000f,  0.000000000f,
+    0.831469595f,  0.555570245f,  0.382683426f,  0.923879504f,  -0.195090324f, 0.980785251f,
+    -0.707106769f, 0.707106769f,  -0.980785251f, 0.195090324f,  -0.923879504f, -0.382683426f,
+    -0.555570245f, -0.831469595f, 0.000000000f,  -1.000000000f, 0.555570245f,  -0.831469595f,
+    0.923879504f,  -0.382683426f, 0.980785251f,  0.195090324f,  0.707106769f,  0.707106769f,
+    0.195090324f,  0.980785251f,  -0.382683426f, 0.923879504f,  -0.831469595f, 0.555570245f,
+    -1.000000000f, -0.000000000f, -0.831469595f, -0.555570245f, -0.382683426f, -0.923879504f,
+    0.195090324f,  -0.980785251f, 0.707106769f,  -0.707106769f, 0.980785251f,  -0.195090324f,
+    0.923879504f,  0.382683426f,  0.555570245f,  0.831469595f,  -0.000000000f, 1.000000000f,
+    -0.555570245f, 0.831469595f,  -0.923879504f, 0.382683426f,  -0.980785251f, -0.195090324f,
+    -0.707106769f, -0.707106769f, -0.195090324f, -0.980785251f, 0.382683426f,  -0.923879504f,
+    0.831469595f,  -0.555570245f, -0.000000000f, 1.000000000f,  -0.601317108f, 0.799010456f,
+    -0.960917294f, 0.276835501f,  -0.934248924f, -0.356621534f, -0.532032073f, -0.846724212f,
+    0.084050521f,  -0.996461511f, 0.666346550f,  -0.745642185f, 0.980785251f,  -0.195090324f,
+    0.900968850f,  0.433883727f,  0.458981872f,  0.888445616f,  -0.167506218f, 0.985871017f,
+    -0.726660311f, 0.686996937f,  -0.993712187f, 0.111964479f,  -0.861312628f, -0.508075356f,
+    -0.382683426f, -0.923879504f, 0.249776483f,  -0.968303502f, 0.781831503f,  -0.623489797f,
+    0.999606609f,  -0.028046256f, 0.815560877f,  0.578671277f,  0.303676754f,  0.952775121f,
+    -0.330279052f, 0.943883359f,  -0.831469595f, 0.555570245f,  -0.998426795f, -0.056070447f,
+    -0.764037371f, -0.645172000f, -0.222520933f, -0.974927902f, 0.408444256f,  -0.912783265f,
+    0.875223398f,  -0.483718902f, 0.990181148f,  0.139790341f,  0.707106769f,  0.707106769f,
+    0.139790341f,  0.990181148f,  -0.483718902f, 0.875223398f,  -0.912783265f, 0.408444256f,
+    -0.974927902f, -0.222520933f, -0.645172000f, -0.764037371f, -0.056070447f, -0.998426795f,
+    0.555570245f,  -0.831469595f, 0.943883359f,  -0.330279052f, 0.952775121f,  0.303676754f,
+    0.578671277f,  0.815560877f,  -0.028046256f, 0.999606609f,  -0.623489797f, 0.781831503f,
+    -0.968303502f, 0.249776483f,  -0.923879504f, -0.382683426f, -0.508075356f, -0.861312628f,
+    0.111964479f,  -0.993712187f, 0.686996937f,  -0.726660311f, 0.985871017f,  -0.167506218f,
+    0.888445616f,  0.458981872f,  0.433883727f,  0.900968850f,  -0.195090324f, 0.980785251f,
+    -0.745642185f, 0.666346550f,  -0.996461511f, 0.084050521f,  -0.846724212f, -0.532032073f,
+    -0.356621534f, -0.934248924f, 0.276835501f,  -0.960917294f, 0.799010456f,  -0.601317108f,
+    -0.000000000f, -1.000000000f, 0.645172000f,  -0.764037371f, 0.985871017f,  -0.167506218f,
+    0.861312628f,  0.508075356f,  0.330279052f,  0.943883359f,  -0.356621534f, 0.934248924f,
+    -0.875223398f, 0.483718902f,  -0.980785251f, -0.195090324f, -0.623489797f, -0.781831503f,
+    0.028046256f,  -0.999606609f, 0.666346550f,  -0.745642185f, 0.990181148f,  -0.139790341f,
+    0.846724212f,  0.532032073f,  0.303676754f,  0.952775121f,  -0.382683426f, 0.923879504f,
+    -0.888445616f, 0.458981872f,  -0.974927902f, -0.222520933f, -0.601317108f, -0.799010456f,
+    0.056070447f,  -0.998426795f, 0.686996937f,  -0.726660311f, 0.993712187f,  -0.111964479f,
+    0.831469595f,  0.555570245f,  0.276835501f,  0.960917294f,  -0.408444256f, 0.912783265f,
+    -0.900968850f, 0.433883727f,  -0.968303502f, -0.249776483f, -0.578671277f, -0.815560877f,
+    0.084050521f,  -0.996461511f, 0.707106769f,  -0.707106769f, 0.996461511f,  -0.084050521f,
+    0.815560877f,  0.578671277f,  0.249776483f,  0.968303502f,  -0.433883727f, 0.900968850f,
+    -0.912783265f, 0.408444256f,  -0.960917294f, -0.276835501f, -0.555570245f, -0.831469595f,
+    0.111964479f,  -0.993712187f, 0.726660311f,  -0.686996937f, 0.998426795f,  -0.056070447f,
+    0.799010456f,  0.601317108f,  0.222520933f,  0.974927902f,  -0.458981872f, 0.888445616f,
+    -0.923879504f, 0.382683426f,  -0.952775121f, -0.303676754f, -0.532032073f, -0.846724212f,
+    0.139790341f,  -0.990181148f, 0.745642185f,  -0.666346550f, 0.999606609f,  -0.028046256f,
+    0.781831503f,  0.623489797f,  0.195090324f,  0.980785251f,  -0.483718902f, 0.875223398f,
+    -0.934248924f, 0.356621534f,  -0.943883359f, -0.330279052f, -0.508075356f, -0.861312628f,
+    0.167506218f,  -0.985871017f, 0.764037371f,  -0.645172000f, -0.000000000f, 1.000000000f,
+    -0.686996937f, 0.726660311f,  -0.998426795f, 0.056070447f,  -0.764037371f, -0.645172000f,
+    -0.111964479f, -0.993712187f, 0.601317108f,  -0.799010456f, 0.985871017f,  -0.167506218f,
+    0.831469595f,  0.555570245f,  0.222520933f,  0.974927902f,  -0.508075356f, 0.861312628f,
+    -0.960917294f, 0.276835501f,  -0.888445616f, -0.458981872f, -0.330279052f, -0.943883359f,
+    0.408444256f,  -0.912783265f, 0.923879504f,  -0.382683426f, 0.934248924f,  0.356621534f,
+    0.433883727f,  0.900968850f,  -0.303676754f, 0.952775121f,  -0.875223398f, 0.483718902f,
+    -0.968303502f, -0.249776483f, -0.532032073f, -0.846724212f, 0.195090324f,  -0.980785251f,
+    0.815560877f,  -0.578671277f, 0.990181148f,  0.139790341f,  0.623489797f,  0.781831503f,
+    -0.084050521f, 0.996461511f,  -0.745642185f, 0.666346550f,  -0.999606609f, -0.028046256f,
+    -0.707106769f, -0.707106769f, -0.028046256f, -0.999606609f, 0.666346550f,  -0.745642185f,
+    0.996461511f,  -0.084050521f, 0.781831503f,  0.623489797f,  0.139790341f,  0.990181148f,
+    -0.578671277f, 0.815560877f,  -0.980785251f, 0.195090324f,  -0.846724212f, -0.532032073f,
+    -0.249776483f, -0.968303502f, 0.483718902f,  -0.875223398f, 0.952775121f,  -0.303676754f,
+    0.900968850f,  0.433883727f,  0.356621534f,  0.934248924f,  -0.382683426f, 0.923879504f,
+    -0.912783265f, 0.408444256f,  -0.943883359f, -0.330279052f, -0.458981872f, -0.888445616f,
+    0.276835501f,  -0.960917294f, 0.861312628f,  -0.508075356f, 0.974927902f,  0.222520933f,
+    0.555570245f,  0.831469595f,  -0.167506218f, 0.985871017f,  -0.799010456f, 0.601317108f,
+    -0.993712187f, -0.111964479f, -0.645172000f, -0.764037371f, 0.056070447f,  -0.998426795f,
+    0.726660311f,  -0.686996937f, -0.000000000f, -1.000000000f, 0.726660311f,  -0.686996937f,
+    0.998426795f,  0.056070447f,  0.645172000f,  0.764037371f,  -0.111964479f, 0.993712187f,
+    -0.799010456f, 0.601317108f,  -0.985871017f, -0.167506218f, -0.555570245f, -0.831469595f,
+    0.222520933f,  -0.974927902f, 0.861312628f,  -0.508075356f, 0.960917294f,  0.276835501f,
+    0.458981872f,  0.888445616f,  -0.330279052f, 0.943883359f,  -0.912783265f, 0.408444256f,
+    -0.923879504f, -0.382683426f, -0.356621534f, -0.934248924f, 0.433883727f,  -0.900968850f,
+    0.952775121f,  -0.303676754f, 0.875223398f,  0.483718902f,  0.249776483f,  0.968303502f,
+    -0.532032073f, 0.846724212f,  -0.980785251f, 0.195090324f,  -0.815560877f, -0.578671277f,
+    -0.139790341f, -0.990181148f, 0.623489797f,  -0.781831503f, 0.996461511f,  -0.084050521f,
+    0.745642185f,  0.666346550f,  0.028046256f,  0.999606609f,  -0.707106769f, 0.707106769f,
+    -0.999606609f, -0.028046256f, -0.666346550f, -0.745642185f, 0.084050521f,  -0.996461511f,
+    0.781831503f,  -0.623489797f, 0.990181148f,  0.139790341f,  0.578671277f,  0.815560877f,
+    -0.195090324f, 0.980785251f,  -0.846724212f, 0.532032073f,  -0.968303502f, -0.249776483f,
+    -0.483718902f, -0.875223398f, 0.303676754f,  -0.952775121f, 0.900968850f,  -0.433883727f,
+    0.934248924f,  0.356621534f,  0.382683426f,  0.923879504f,  -0.408444256f, 0.912783265f,
+    -0.943883359f, 0.330279052f,  -0.888445616f, -0.458981872f, -0.276835501f, -0.960917294f,
+    0.508075356f,  -0.861312628f, 0.974927902f,  -0.222520933f, 0.831469595f,  0.555570245f,
+    0.167506218f,  0.985871017f,  -0.601317108f, 0.799010456f,  -0.993712187f, 0.111964479f,
+    -0.764037371f, -0.645172000f, -0.056070447f, -0.998426795f, 0.686996937f,  -0.726660311f,
+    -0.000000000f, 1.000000000f,  -0.764037371f, 0.645172000f,  -0.985871017f, -0.167506218f,
+    -0.508075356f, -0.861312628f, 0.330279052f,  -0.943883359f, 0.934248924f,  -0.356621534f,
+    0.875223398f,  0.483718902f,  0.195090324f,  0.980785251f,  -0.623489797f, 0.781831503f,
+    -0.999606609f, 0.028046256f,  -0.666346550f, -0.745642185f, 0.139790341f,  -0.990181148f,
+    0.846724212f,  -0.532032073f, 0.952775121f,  0.303676754f,  0.382683426f,  0.923879504f,
+    -0.458981872f, 0.888445616f,  -0.974927902f, 0.222520933f,  -0.799010456f, -0.601317108f,
+    -0.056070447f, -0.998426795f, 0.726660311f,  -0.686996937f, 0.993712187f,  0.111964479f,
+    0.555570245f,  0.831469595f,  -0.276835501f, 0.960917294f,  -0.912783265f, 0.408444256f,
+    -0.900968850f, -0.433883727f, -0.249776483f, -0.968303502f, 0.578671277f,  -0.815560877f,
+    0.996461511f,  -0.084050521f, 0.707106769f,  0.707106769f,  -0.084050521f, 0.996461511f,
+    -0.815560877f, 0.578671277f,  -0.968303502f, -0.249776483f, -0.433883727f, -0.900968850f,
+    0.408444256f,  -0.912783265f, 0.960917294f,  -0.276835501f, 0.831469595f,  0.555570245f,
+    0.111964479f,  0.993712187f,  -0.686996937f, 0.726660311f,  -0.998426795f, -0.056070447f,
+    -0.601317108f, -0.799010456f, 0.222520933f,  -0.974927902f, 0.888445616f,  -0.458981872f,
+    0.923879504f,  0.382683426f,  0.303676754f,  0.952775121f,  -0.532032073f, 0.846724212f,
+    -0.990181148f, 0.139790341f,  -0.745642185f, -0.666346550f, 0.028046256f,  -0.999606609f,
+    0.781831503f,  -0.623489797f, 0.980785251f,  0.195090324f,  0.483718902f,  0.875223398f,
+    -0.356621534f, 0.934248924f,  -0.943883359f, 0.330279052f,  -0.861312628f, -0.508075356f,
+    -0.167506218f, -0.985871017f, 0.645172000f,  -0.764037371f, 0.000000000f,  -1.000000000f,
+    0.799010456f,  -0.601317108f, 0.960917294f,  0.276835501f,  0.356621534f,  0.934248924f,
+    -0.532032073f, 0.846724212f,  -0.996461511f, 0.084050521f,  -0.666346550f, -0.745642185f,
+    0.195090324f,  -0.980785251f, 0.900968850f,  -0.433883727f, 0.888445616f,  0.458981872f,
+    0.167506218f,  0.985871017f,  -0.686996937f, 0.726660311f,  -0.993712187f, -0.111964479f,
+    -0.508075356f, -0.861312628f, 0.382683426f,  -0.923879504f, 0.968303502f,  -0.249776483f,
+    0.781831503f,  0.623489797f,  -0.028046256f, 0.999606609f,  -0.815560877f, 0.578671277f,
+    -0.952775121f, -0.303676754f, -0.330279052f, -0.943883359f, 0.555570245f,  -0.831469595f,
+    0.998426795f,  -0.056070447f, 0.645172000f,  0.764037371f,  -0.222520933f, 0.974927902f,
+    -0.912783265f, 0.408444256f,  -0.875223398f, -0.483718902f, -0.139790341f, -0.990181148f,
+    0.707106769f,  -0.707106769f, 0.990181148f,  0.139790341f,  0.483718902f,  0.875223398f,
+    -0.408444256f, 0.912783265f,  -0.974927902f, 0.222520933f,  -0.764037371f, -0.645172000f,
+    0.056070447f,  -0.998426795f, 0.831469595f,  -0.555570245f, 0.943883359f,  0.330279052f,
+    0.303676754f,  0.952775121f,  -0.578671277f, 0.815560877f,  -0.999606609f, 0.028046256f,
+    -0.623489797f, -0.781831503f, 0.249776483f,  -0.968303502f, 0.923879504f,  -0.382683426f,
+    0.861312628f,  0.508075356f,  0.111964479f,  0.993712187f,  -0.726660311f, 0.686996937f,
+    -0.985871017f, -0.167506218f, -0.458981872f, -0.888445616f, 0.433883727f,  -0.900968850f,
+    0.980785251f,  -0.195090324f, 0.745642185f,  0.666346550f,  -0.084050521f, 0.996461511f,
+    -0.846724212f, 0.532032073f,  -0.934248924f, -0.356621534f, -0.276835501f, -0.960917294f,
+    0.601317108f,  -0.799010456f, -0.000000000f, 1.000000000f,  -0.831469595f, 0.555570245f,
+    -0.923879504f, -0.382683426f, -0.195090324f, -0.980785251f, 0.707106769f,  -0.707106769f,
+    0.980785251f,  0.195090324f,  0.382683426f,  0.923879504f,  -0.555570245f, 0.831469595f,
+    -1.000000000f, -0.000000000f, -0.555570245f, -0.831469595f, 0.382683426f,  -0.923879504f,
+    0.980785251f,  -0.195090324f, 0.707106769f,  0.707106769f,  -0.195090324f, 0.980785251f,
+    -0.923879504f, 0.382683426f,  -0.831469595f, -0.555570245f, -0.000000000f, -1.000000000f,
+    0.831469595f,  -0.555570245f, 0.923879504f,  0.382683426f,  0.195090324f,  0.980785251f,
+    -0.707106769f, 0.707106769f,  -0.980785251f, -0.195090324f, -0.382683426f, -0.923879504f,
+    0.555570245f,  -0.831469595f, 1.000000000f,  0.000000000f,  0.555570245f,  0.831469595f,
+    -0.382683426f, 0.923879504f,  -0.980785251f, 0.195090324f,  -0.707106769f, -0.707106769f,
+    0.195090324f,  -0.980785251f, 0.923879504f,  -0.382683426f, 0.831469595f,  0.555570245f,
+    -0.000000000f, 1.000000000f,  -0.831469595f, 0.555570245f,  -0.923879504f, -0.382683426f,
+    -0.195090324f, -0.980785251f, 0.707106769f,  -0.707106769f, 0.980785251f,  0.195090324f,
+    0.382683426f,  0.923879504f,  -0.555570245f, 0.831469595f,  -1.000000000f, -0.000000000f,
+    -0.555570245f, -0.831469595f, 0.382683426f,  -0.923879504f, 0.980785251f,  -0.195090324f,
+    0.707106769f,  0.707106769f,  -0.195090324f, 0.980785251f,  -0.923879504f, 0.382683426f,
+    -0.831469595f, -0.555570245f, 0.000000000f,  -1.000000000f, 0.831469595f,  -0.555570245f,
+    0.923879504f,  0.382683426f,  0.195090324f,  0.980785251f,  -0.707106769f, 0.707106769f,
+    -0.980785251f, -0.195090324f, -0.382683426f, -0.923879504f, 0.555570245f,  -0.831469595f,
+    0.000000000f,  -1.000000000f, 0.861312628f,  -0.508075356f, 0.875223398f,  0.483718902f,
+    0.028046256f,  0.999606609f,  -0.846724212f, 0.532032073f,  -0.888445616f, -0.458981872f,
+    -0.056070447f, -0.998426795f, 0.831469595f,  -0.555570245f, 0.900968850f,  0.433883727f,
+    0.084050521f,  0.996461511f,  -0.815560877f, 0.578671277f,  -0.912783265f, -0.408444256f,
+    -0.111964479f, -0.993712187f, 0.799010456f,  -0.601317108f, 0.923879504f,  0.382683426f,
+    0.139790341f,  0.990181148f,  -0.781831503f, 0.623489797f,  -0.934248924f, -0.356621534f,
+    -0.167506218f, -0.985871017f, 0.764037371f,  -0.645172000f, 0.943883359f,  0.330279052f,
+    0.195090324f,  0.980785251f,  -0.745642185f, 0.666346550f,  -0.952775121f, -0.303676754f,
+    -0.222520933f, -0.974927902f, 0.726660311f,  -0.686996937f, 0.960917294f,  0.276835501f,
+    0.249776483f,  0.968303502f,  -0.707106769f, 0.707106769f,  -0.968303502f, -0.249776483f,
+    -0.276835501f, -0.960917294f, 0.686996937f,  -0.726660311f, 0.974927902f,  0.222520933f,
+    0.303676754f,  0.952775121f,  -0.666346550f, 0.745642185f,  -0.980785251f, -0.195090324f,
+    -0.330279052f, -0.943883359f, 0.645172000f,  -0.764037371f, 0.985871017f,  0.167506218f,
+    0.356621534f,  0.934248924f,  -0.623489797f, 0.781831503f,  -0.990181148f, -0.139790341f,
+    -0.382683426f, -0.923879504f, 0.601317108f,  -0.799010456f, 0.993712187f,  0.111964479f,
+    0.408444256f,  0.912783265f,  -0.578671277f, 0.815560877f,  -0.996461511f, -0.084050521f,
+    -0.433883727f, -0.900968850f, 0.555570245f,  -0.831469595f, 0.998426795f,  0.056070447f,
+    0.458981872f,  0.888445616f,  -0.532032073f, 0.846724212f,  -0.999606609f, -0.028046256f,
+    -0.483718902f, -0.875223398f, 0.508075356f,  -0.861312628f, -0.000000000f, 1.000000000f,
+    -0.888445616f, 0.458981872f,  -0.815560877f, -0.578671277f, 0.139790341f,  -0.990181148f,
+    0.943883359f,  -0.330279052f, 0.726660311f,  0.686996937f,  -0.276835501f, 0.960917294f,
+    -0.980785251f, 0.195090324f,  -0.623489797f, -0.781831503f, 0.408444256f,  -0.912783265f,
+    0.998426795f,  -0.056070447f, 0.508075356f,  0.861312628f,  -0.532032073f, 0.846724212f,
+    -0.996461511f, -0.084050521f, -0.382683426f, -0.923879504f, 0.645172000f,  -0.764037371f,
+    0.974927902f,  0.222520933f,  0.249776483f,  0.968303502f,  -0.745642185f, 0.666346550f,
+    -0.934248924f, -0.356621534f, -0.111964479f, -0.993712187f, 0.831469595f,  -0.555570245f,
+    0.875223398f,  0.483718902f,  -0.028046256f, 0.999606609f,  -0.900968850f, 0.433883727f,
+    -0.799010456f, -0.601317108f, 0.167506218f,  -0.985871017f, 0.952775121f,  -0.303676754f,
+    0.707106769f,  0.707106769f,  -0.303676754f, 0.952775121f,  -0.985871017f, 0.167506218f,
+    -0.601317108f, -0.799010456f, 0.433883727f,  -0.900968850f, 0.999606609f,  -0.028046256f,
+    0.483718902f,  0.875223398f,  -0.555570245f, 0.831469595f,  -0.993712187f, -0.111964479f,
+    -0.356621534f, -0.934248924f, 0.666346550f,  -0.745642185f, 0.968303502f,  0.249776483f,
+    0.222520933f,  0.974927902f,  -0.764037371f, 0.645172000f,  -0.923879504f, -0.382683426f,
+    -0.084050521f, -0.996461511f, 0.846724212f,  -0.532032073f, 0.861312628f,  0.508075356f,
+    -0.056070447f, 0.998426795f,  -0.912783265f, 0.408444256f,  -0.781831503f, -0.623489797f,
+    0.195090324f,  -0.980785251f, 0.960917294f,  -0.276835501f, 0.686996937f,  0.726660311f,
+    -0.330279052f, 0.943883359f,  -0.990181148f, 0.139790341f,  -0.578671277f, -0.815560877f,
+    0.458981872f,  -0.888445616f, 0.000000000f,  -1.000000000f, 0.912783265f,  -0.408444256f,
+    0.745642185f,  0.666346550f,  -0.303676754f, 0.952775121f,  -0.993712187f, 0.111964479f,
+    -0.508075356f, -0.861312628f, 0.578671277f,  -0.815560877f, 0.980785251f,  0.195090324f,
+    0.222520933f,  0.974927902f,  -0.799010456f, 0.601317108f,  -0.875223398f, -0.483718902f,
+    0.084050521f,  -0.996461511f, 0.943883359f,  -0.330279052f, 0.686996937f,  0.726660311f,
+    -0.382683426f, 0.923879504f,  -0.999606609f, 0.028046256f,  -0.433883727f, -0.900968850f,
+    0.645172000f,  -0.764037371f, 0.960917294f,  0.276835501f,  0.139790341f,  0.990181148f,
+    -0.846724212f, 0.532032073f,  -0.831469595f, -0.555570245f, 0.167506218f,  -0.985871017f,
+    0.968303502f,  -0.249776483f, 0.623489797f,  0.781831503f,  -0.458981872f, 0.888445616f,
+    -0.998426795f, -0.056070447f, -0.356621534f, -0.934248924f, 0.707106769f,  -0.707106769f,
+    0.934248924f,  0.356621534f,  0.056070447f,  0.998426795f,  -0.888445616f, 0.458981872f,
+    -0.781831503f, -0.623489797f, 0.249776483f,  -0.968303502f, 0.985871017f,  -0.167506218f,
+    0.555570245f,  0.831469595f,  -0.532032073f, 0.846724212f,  -0.990181148f, -0.139790341f,
+    -0.276835501f, -0.960917294f, 0.764037371f,  -0.645172000f, 0.900968850f,  0.433883727f,
+    -0.028046256f, 0.999606609f,  -0.923879504f, 0.382683426f,  -0.726660311f, -0.686996937f,
+    0.330279052f,  -0.943883359f, 0.996461511f,  -0.084050521f, 0.483718902f,  0.875223398f,
+    -0.601317108f, 0.799010456f,  -0.974927902f, -0.222520933f, -0.195090324f, -0.980785251f,
+    0.815560877f,  -0.578671277f, 0.861312628f,  0.508075356f,  -0.111964479f, 0.993712187f,
+    -0.952775121f, 0.303676754f,  -0.666346550f, -0.745642185f, 0.408444256f,  -0.912783265f,
+    -0.000000000f, 1.000000000f,  -0.934248924f, 0.356621534f,  -0.666346550f, -0.745642185f,
+    0.458981872f,  -0.888445616f, 0.993712187f,  0.111964479f,  0.249776483f,  0.968303502f,
+    -0.815560877f, 0.578671277f,  -0.831469595f, -0.555570245f, 0.222520933f,  -0.974927902f,
+    0.990181148f,  -0.139790341f, 0.483718902f,  0.875223398f,  -0.645172000f, 0.764037371f,
+    -0.943883359f, -0.330279052f, -0.028046256f, -0.999606609f, 0.923879504f,  -0.382683426f,
+    0.686996937f,  0.726660311f,  -0.433883727f, 0.900968850f,  -0.996461511f, -0.084050521f,
+    -0.276835501f, -0.960917294f, 0.799010456f,  -0.601317108f, 0.846724212f,  0.532032073f,
+    -0.195090324f, 0.980785251f,  -0.985871017f, 0.167506218f,  -0.508075356f, -0.861312628f,
+    0.623489797f,  -0.781831503f, 0.952775121f,  0.303676754f,  0.056070447f,  0.998426795f,
+    -0.912783265f, 0.408444256f,  -0.707106769f, -0.707106769f, 0.408444256f,  -0.912783265f,
+    0.998426795f,  0.056070447f,  0.303676754f,  0.952775121f,  -0.781831503f, 0.623489797f,
+    -0.861312628f, -0.508075356f, 0.167506218f,  -0.985871017f, 0.980785251f,  -0.195090324f,
+    0.532032073f,  0.846724212f,  -0.601317108f, 0.799010456f,  -0.960917294f, -0.276835501f,
+    -0.084050521f, -0.996461511f, 0.900968850f,  -0.433883727f, 0.726660311f,  0.686996937f,
+    -0.382683426f, 0.923879504f,  -0.999606609f, -0.028046256f, -0.330279052f, -0.943883359f,
+    0.764037371f,  -0.645172000f, 0.875223398f,  0.483718902f,  -0.139790341f, 0.990181148f,
+    -0.974927902f, 0.222520933f,  -0.555570245f, -0.831469595f, 0.578671277f,  -0.815560877f,
+    0.968303502f,  0.249776483f,  0.111964479f,  0.993712187f,  -0.888445616f, 0.458981872f,
+    -0.745642185f, -0.666346550f, 0.356621534f,  -0.934248924f, 0.000000000f,  -1.000000000f,
+    0.952775121f,  -0.303676754f, 0.578671277f,  0.815560877f,  -0.601317108f, 0.799010456f,
+    -0.943883359f, -0.330279052f, 0.028046256f,  -0.999606609f, 0.960917294f,  -0.276835501f,
+    0.555570245f,  0.831469595f,  -0.623489797f, 0.781831503f,  -0.934248924f, -0.356621534f,
+    0.056070447f,  -0.998426795f, 0.968303502f,  -0.249776483f, 0.532032073f,  0.846724212f,
+    -0.645172000f, 0.764037371f,  -0.923879504f, -0.382683426f, 0.084050521f,  -0.996461511f,
+    0.974927902f,  -0.222520933f, 0.508075356f,  0.861312628f,  -0.666346550f, 0.745642185f,
+    -0.912783265f, -0.408444256f, 0.111964479f,  -0.993712187f, 0.980785251f,  -0.195090324f,
+    0.483718902f,  0.875223398f,  -0.686996937f, 0.726660311f,  -0.900968850f, -0.433883727f,
+    0.139790341f,  -0.990181148f, 0.985871017f,  -0.167506218f, 0.458981872f,  0.888445616f,
+    -0.707106769f, 0.707106769f,  -0.888445616f, -0.458981872f, 0.167506218f,  -0.985871017f,
+    0.990181148f,  -0.139790341f, 0.433883727f,  0.900968850f,  -0.726660311f, 0.686996937f,
+    -0.875223398f, -0.483718902f, 0.195090324f,  -0.980785251f, 0.993712187f,  -0.111964479f,
+    0.408444256f,  0.912783265f,  -0.745642185f, 0.666346550f,  -0.861312628f, -0.508075356f,
+    0.222520933f,  -0.974927902f, 0.996461511f,  -0.084050521f, 0.382683426f,  0.923879504f,
+    -0.764037371f, 0.645172000f,  -0.846724212f, -0.532032073f, 0.249776483f,  -0.968303502f,
+    0.998426795f,  -0.056070447f, 0.356621534f,  0.934248924f,  -0.781831503f, 0.623489797f,
+    -0.831469595f, -0.555570245f, 0.276835501f,  -0.960917294f, 0.999606609f,  -0.028046256f,
+    0.330279052f,  0.943883359f,  -0.799010456f, 0.601317108f,  -0.815560877f, -0.578671277f,
+    0.303676754f,  -0.952775121f, 0.000000000f,  1.000000000f,  -0.968303502f, 0.249776483f,
+    -0.483718902f, -0.875223398f, 0.726660311f,  -0.686996937f, 0.846724212f,  0.532032073f,
+    -0.303676754f, 0.952775121f,  -0.998426795f, -0.056070447f, -0.195090324f, -0.980785251f,
+    0.900968850f,  -0.433883727f, 0.645172000f,  0.764037371f,  -0.578671277f, 0.815560877f,
+    -0.934248924f, -0.356621534f, 0.111964479f,  -0.993712187f, 0.990181148f,  -0.139790341f,
+    0.382683426f,  0.923879504f,  -0.799010456f, 0.601317108f,  -0.781831503f, -0.623489797f,
+    0.408444256f,  -0.912783265f, 0.985871017f,  0.167506218f,  0.084050521f,  0.996461511f,
+    -0.943883359f, 0.330279052f,  -0.555570245f, -0.831469595f, 0.666346550f,  -0.745642185f,
+    0.888445616f,  0.458981872f,  -0.222520933f, 0.974927902f,  -0.999606609f, 0.028046256f,
+    -0.276835501f, -0.960917294f, 0.861312628f,  -0.508075356f, 0.707106769f,  0.707106769f,
+    -0.508075356f, 0.861312628f,  -0.960917294f, -0.276835501f, 0.028046256f,  -0.999606609f,
+    0.974927902f,  -0.222520933f, 0.458981872f,  0.888445616f,  -0.745642185f, 0.666346550f,
+    -0.831469595f, -0.555570245f, 0.330279052f,  -0.943883359f, 0.996461511f,  0.084050521f,
+    0.167506218f,  0.985871017f,  -0.912783265f, 0.408444256f,  -0.623489797f, -0.781831503f,
+    0.601317108f,  -0.799010456f, 0.923879504f,  0.382683426f,  -0.139790341f, 0.990181148f,
+    -0.993712187f, 0.111964479f,  -0.356621534f, -0.934248924f, 0.815560877f,  -0.578671277f,
+    0.764037371f,  0.645172000f,  -0.433883727f, 0.900968850f,  -0.980785251f, -0.195090324f,
+    -0.056070447f, -0.998426795f, 0.952775121f,  -0.303676754f, 0.532032073f,  0.846724212f,
+    -0.686996937f, 0.726660311f,  -0.875223398f, -0.483718902f, 0.249776483f,  -0.968303502f,
+    0.000000000f,  -1.000000000f, 0.980785251f,  -0.195090324f, 0.382683426f,  0.923879504f,
+    -0.831469595f, 0.555570245f,  -0.707106769f, -0.707106769f, 0.555570245f,  -0.831469595f,
+    0.923879504f,  0.382683426f,  -0.195090324f, 0.980785251f,  -1.000000000f, 0.000000000f,
+    -0.195090324f, -0.980785251f, 0.923879504f,  -0.382683426f, 0.555570245f,  0.831469595f,
+    -0.707106769f, 0.707106769f,  -0.831469595f, -0.555570245f, 0.382683426f,  -0.923879504f,
+    0.980785251f,  0.195090324f,  -0.000000000f, 1.000000000f,  -0.980785251f, 0.195090324f,
+    -0.382683426f, -0.923879504f, 0.831469595f,  -0.555570245f, 0.707106769f,  0.707106769f,
+    -0.555570245f, 0.831469595f,  -0.923879504f, -0.382683426f, 0.195090324f,  -0.980785251f,
+    1.000000000f,  0.000000000f,  0.195090324f,  0.980785251f,  -0.923879504f, 0.382683426f,
+    -0.555570245f, -0.831469595f, 0.707106769f,  -0.707106769f, 0.831469595f,  0.555570245f,
+    -0.382683426f, 0.923879504f,  -0.980785251f, -0.195090324f, -0.000000000f, -1.000000000f,
+    0.980785251f,  -0.195090324f, 0.382683426f,  0.923879504f,  -0.831469595f, 0.555570245f,
+    -0.707106769f, -0.707106769f, 0.555570245f,  -0.831469595f, 0.923879504f,  0.382683426f,
+    -0.195090324f, 0.980785251f,  -1.000000000f, -0.000000000f, -0.195090324f, -0.980785251f,
+    0.923879504f,  -0.382683426f, 0.555570245f,  0.831469595f,  -0.707106769f, 0.707106769f,
+    -0.831469595f, -0.555570245f, 0.382683426f,  -0.923879504f, 0.980785251f,  0.195090324f,
+    -0.000000000f, 1.000000000f,  -0.980785251f, 0.195090324f,  -0.382683426f, -0.923879504f,
+    0.831469595f,  -0.555570245f, 0.707106769f,  0.707106769f,  -0.555570245f, 0.831469595f,
+    -0.923879504f, -0.382683426f, 0.195090324f,  -0.980785251f, -0.000000000f, 1.000000000f,
+    -0.990181148f, 0.139790341f,  -0.276835501f, -0.960917294f, 0.912783265f,  -0.408444256f,
+    0.532032073f,  0.846724212f,  -0.764037371f, 0.645172000f,  -0.745642185f, -0.666346550f,
+    0.555570245f,  -0.831469595f, 0.900968850f,  0.433883727f,  -0.303676754f, 0.952775121f,
+    -0.985871017f, -0.167506218f, 0.028046256f,  -0.999606609f, 0.993712187f,  -0.111964479f,
+    0.249776483f,  0.968303502f,  -0.923879504f, 0.382683426f,  -0.508075356f, -0.861312628f,
+    0.781831503f,  -0.623489797f, 0.726660311f,  0.686996937f,  -0.578671277f, 0.815560877f,
+    -0.888445616f, -0.458981872f, 0.330279052f,  -0.943883359f, 0.980785251f,  0.195090324f,
+    -0.056070447f, 0.998426795f,  -0.996461511f, 0.084050521f,  -0.222520933f, -0.974927902f,
+    0.934248924f,  -0.356621534f, 0.483718902f,  0.875223398f,  -0.799010456f, 0.601317108f,
+    -0.707106769f, -0.707106769f, 0.601317108f,  -0.799010456f, 0.875223398f,  0.483718902f,
+    -0.356621534f, 0.934248924f,  -0.974927902f, -0.222520933f, 0.084050521f,  -0.996461511f,
+    0.998426795f,  -0.056070447f, 0.195090324f,  0.980785251f,  -0.943883359f, 0.330279052f,
+    -0.458981872f, -0.888445616f, 0.815560877f,  -0.578671277f, 0.686996937f,  0.726660311f,
+    -0.623489797f, 0.781831503f,  -0.861312628f, -0.508075356f, 0.382683426f,  -0.923879504f,
+    0.968303502f,  0.249776483f,  -0.111964479f, 0.993712187f,  -0.999606609f, 0.028046256f,
+    -0.167506218f, -0.985871017f, 0.952775121f,  -0.303676754f, 0.433883727f,  0.900968850f,
+    -0.831469595f, 0.555570245f,  -0.666346550f, -0.745642185f, 0.645172000f,  -0.764037371f,
+    0.846724212f,  0.532032073f,  -0.408444256f, 0.912783265f,  -0.960917294f, -0.276835501f,
+    0.139790341f,  -0.990181148f, 0.000000000f,  -1.000000000f, 0.996461511f,  -0.084050521f,
+    0.167506218f,  0.985871017f,  -0.968303502f, 0.249776483f,  -0.330279052f, -0.943883359f,
+    0.912783265f,  -0.408444256f, 0.483718902f,  0.875223398f,  -0.831469595f, 0.555570245f,
+    -0.623489797f, -0.781831503f, 0.726660311f,  -0.686996937f, 0.745642185f,  0.666346550f,
+    -0.601317108f, 0.799010456f,  -0.846724212f, -0.532032073f, 0.458981872f,  -0.888445616f,
+    0.923879504f,  0.382683426f,  -0.303676754f, 0.952775121f,  -0.974927902f, -0.222520933f,
+    0.139790341f,  -0.990181148f, 0.998426795f,  0.056070447f,  0.028046256f,  0.999606609f,
+    -0.993712187f, 0.111964479f,  -0.195090324f, -0.980785251f, 0.960917294f,  -0.276835501f,
+    0.356621534f,  0.934248924f,  -0.900968850f, 0.433883727f,  -0.508075356f, -0.861312628f,
+    0.815560877f,  -0.578671277f, 0.645172000f,  0.764037371f,  -0.707106769f, 0.707106769f,
+    -0.764037371f, -0.645172000f, 0.578671277f,  -0.815560877f, 0.861312628f,  0.508075356f,
+    -0.433883727f, 0.900968850f,  -0.934248924f, -0.356621534f, 0.276835501f,  -0.960917294f,
+    0.980785251f,  0.195090324f,  -0.111964479f, 0.993712187f,  -0.999606609f, -0.028046256f,
+    -0.056070447f, -0.998426795f, 0.990181148f,  -0.139790341f, 0.222520933f,  0.974927902f,
+    -0.952775121f, 0.303676754f,  -0.382683426f, -0.923879504f, 0.888445616f,  -0.458981872f,
+    0.532032073f,  0.846724212f,  -0.799010456f, 0.601317108f,  -0.666346550f, -0.745642185f,
+    0.686996937f,  -0.726660311f, 0.781831503f,  0.623489797f,  -0.555570245f, 0.831469595f,
+    -0.875223398f, -0.483718902f, 0.408444256f,  -0.912783265f, 0.943883359f,  0.330279052f,
+    -0.249776483f, 0.968303502f,  -0.985871017f, -0.167506218f, 0.084050521f,  -0.996461511f,
+    0.000000000f,  1.000000000f,  -0.999606609f, 0.028046256f,  -0.056070447f, -0.998426795f,
+    0.996461511f,  -0.084050521f, 0.111964479f,  0.993712187f,  -0.990181148f, 0.139790341f,
+    -0.167506218f, -0.985871017f, 0.980785251f,  -0.195090324f, 0.222520933f,  0.974927902f,
+    -0.968303502f, 0.249776483f,  -0.276835501f, -0.960917294f, 0.952775121f,  -0.303676754f,
+    0.330279052f,  0.943883359f,  -0.934248924f, 0.356621534f,  -0.382683426f, -0.923879504f,
+    0.912783265f,  -0.408444256f, 0.433883727f,  0.900968850f,  -0.888445616f, 0.458981872f,
+    -0.483718902f, -0.875223398f, 0.861312628f,  -0.508075356f, 0.532032073f,  0.846724212f,
+    -0.831469595f, 0.555570245f,  -0.578671277f, -0.815560877f, 0.799010456f,  -0.601317108f,
+    0.623489797f,  0.781831503f,  -0.764037371f, 0.645172000f,  -0.666346550f, -0.745642185f,
+    0.726660311f,  -0.686996937f, 0.707106769f,  0.707106769f,  -0.686996937f, 0.726660311f,
+    -0.745642185f, -0.666346550f, 0.645172000f,  -0.764037371f, 0.781831503f,  0.623489797f,
+    -0.601317108f, 0.799010456f,  -0.815560877f, -0.578671277f, 0.555570245f,  -0.831469595f,
+    0.846724212f,  0.532032073f,  -0.508075356f, 0.861312628f,  -0.875223398f, -0.483718902f,
+    0.458981872f,  -0.888445616f, 0.900968850f,  0.433883727f,  -0.408444256f, 0.912783265f,
+    -0.923879504f, -0.382683426f, 0.356621534f,  -0.934248924f, 0.943883359f,  0.330279052f,
+    -0.303676754f, 0.952775121f,  -0.960917294f, -0.276835501f, 0.249776483f,  -0.968303502f,
+    0.974927902f,  0.222520933f,  -0.195090324f, 0.980785251f,  -0.985871017f, -0.167506218f,
+    0.139790341f,  -0.990181148f, 0.993712187f,  0.111964479f,  -0.084050521f, 0.996461511f,
+    -0.998426795f, -0.056070447f, 0.028046256f,  -0.999606609f, 0.000000000f,  -1.000000000f,
+    0.999606609f,  0.028046256f,  -0.056070447f, 0.998426795f,  -0.996461511f, -0.084050521f,
+    0.111964479f,  -0.993712187f, 0.990181148f,  0.139790341f,  -0.167506218f, 0.985871017f,
+    -0.980785251f, -0.195090324f, 0.222520933f,  -0.974927902f, 0.968303502f,  0.249776483f,
+    -0.276835501f, 0.960917294f,  -0.952775121f, -0.303676754f, 0.330279052f,  -0.943883359f,
+    0.934248924f,  0.356621534f,  -0.382683426f, 0.923879504f,  -0.912783265f, -0.408444256f,
+    0.433883727f,  -0.900968850f, 0.888445616f,  0.458981872f,  -0.483718902f, 0.875223398f,
+    -0.861312628f, -0.508075356f, 0.532032073f,  -0.846724212f, 0.831469595f,  0.555570245f,
+    -0.578671277f, 0.815560877f,  -0.799010456f, -0.601317108f, 0.623489797f,  -0.781831503f,
+    0.764037371f,  0.645172000f,  -0.666346550f, 0.745642185f,  -0.726660311f, -0.686996937f,
+    0.707106769f,  -0.707106769f, 0.686996937f,  0.726660311f,  -0.745642185f, 0.666346550f,
+    -0.645172000f, -0.764037371f, 0.781831503f,  -0.623489797f, 0.601317108f,  0.799010456f,
+    -0.815560877f, 0.578671277f,  -0.555570245f, -0.831469595f, 0.846724212f,  -0.532032073f,
+    0.508075356f,  0.861312628f,  -0.875223398f, 0.483718902f,  -0.458981872f, -0.888445616f,
+    0.900968850f,  -0.433883727f, 0.408444256f,  0.912783265f,  -0.923879504f, 0.382683426f,
+    -0.356621534f, -0.934248924f, 0.943883359f,  -0.330279052f, 0.303676754f,  0.952775121f,
+    -0.960917294f, 0.276835501f,  -0.249776483f, -0.968303502f, 0.974927902f,  -0.222520933f,
+    0.195090324f,  0.980785251f,  -0.985871017f, 0.167506218f,  -0.139790341f, -0.990181148f,
+    0.993712187f,  -0.111964479f, 0.084050521f,  0.996461511f,  -0.998426795f, 0.056070447f,
+    -0.028046256f, -0.999606609f, -0.000000000f, 1.000000000f,  -0.996461511f, -0.084050521f,
+    0.167506218f,  -0.985871017f, 0.968303502f,  0.249776483f,  -0.330279052f, 0.943883359f,
+    -0.912783265f, -0.408444256f, 0.483718902f,  -0.875223398f, 0.831469595f,  0.555570245f,
+    -0.623489797f, 0.781831503f,  -0.726660311f, -0.686996937f, 0.745642185f,  -0.666346550f,
+    0.601317108f,  0.799010456f,  -0.846724212f, 0.532032073f,  -0.458981872f, -0.888445616f,
+    0.923879504f,  -0.382683426f, 0.303676754f,  0.952775121f,  -0.974927902f, 0.222520933f,
+    -0.139790341f, -0.990181148f, 0.998426795f,  -0.056070447f, -0.028046256f, 0.999606609f,
+    -0.993712187f, -0.111964479f, 0.195090324f,  -0.980785251f, 0.960917294f,  0.276835501f,
+    -0.356621534f, 0.934248924f,  -0.900968850f, -0.433883727f, 0.508075356f,  -0.861312628f,
+    0.815560877f,  0.578671277f,  -0.645172000f, 0.764037371f,  -0.707106769f, -0.707106769f,
+    0.764037371f,  -0.645172000f, 0.578671277f,  0.815560877f,  -0.861312628f, 0.508075356f,
+    -0.433883727f, -0.900968850f, 0.934248924f,  -0.356621534f, 0.276835501f,  0.960917294f,
+    -0.980785251f, 0.195090324f,  -0.111964479f, -0.993712187f, 0.999606609f,  -0.028046256f,
+    -0.056070447f, 0.998426795f,  -0.990181148f, -0.139790341f, 0.222520933f,  -0.974927902f,
+    0.952775121f,  0.303676754f,  -0.382683426f, 0.923879504f,  -0.888445616f, -0.458981872f,
+    0.532032073f,  -0.846724212f, 0.799010456f,  0.601317108f,  -0.666346550f, 0.745642185f,
+    -0.686996937f, -0.726660311f, 0.781831503f,  -0.623489797f, 0.555570245f,  0.831469595f,
+    -0.875223398f, 0.483718902f,  -0.408444256f, -0.912783265f, 0.943883359f,  -0.330279052f,
+    0.249776483f,  0.968303502f,  -0.985871017f, 0.167506218f,  -0.084050521f, -0.996461511f,
+    0.000000000f,  -1.000000000f, 0.990181148f,  0.139790341f,  -0.276835501f, 0.960917294f,
+    -0.912783265f, -0.408444256f, 0.532032073f,  -0.846724212f, 0.764037371f,  0.645172000f,
+    -0.745642185f, 0.666346550f,  -0.555570245f, -0.831469595f, 0.900968850f,  -0.433883727f,
+    0.303676754f,  0.952775121f,  -0.985871017f, 0.167506218f,  -0.028046256f, -0.999606609f,
+    0.993712187f,  0.111964479f,  -0.249776483f, 0.968303502f,  -0.923879504f, -0.382683426f,
+    0.508075356f,  -0.861312628f, 0.781831503f,  0.623489797f,  -0.726660311f, 0.686996937f,
+    -0.578671277f, -0.815560877f, 0.888445616f,  -0.458981872f, 0.330279052f,  0.943883359f,
+    -0.980785251f, 0.195090324f,  -0.056070447f, -0.998426795f, 0.996461511f,  0.084050521f,
+    -0.222520933f, 0.974927902f,  -0.934248924f, -0.356621534f, 0.483718902f,  -0.875223398f,
+    0.799010456f,  0.601317108f,  -0.707106769f, 0.707106769f,  -0.601317108f, -0.799010456f,
+    0.875223398f,  -0.483718902f, 0.356621534f,  0.934248924f,  -0.974927902f, 0.222520933f,
+    -0.084050521f, -0.996461511f, 0.998426795f,  0.056070447f,  -0.195090324f, 0.980785251f,
+    -0.943883359f, -0.330279052f, 0.458981872f,  -0.888445616f, 0.815560877f,  0.578671277f,
+    -0.686996937f, 0.726660311f,  -0.623489797f, -0.781831503f, 0.861312628f,  -0.508075356f,
+    0.382683426f,  0.923879504f,  -0.968303502f, 0.249776483f,  -0.111964479f, -0.993712187f,
+    0.999606609f,  0.028046256f,  -0.167506218f, 0.985871017f,  -0.952775121f, -0.303676754f,
+    0.433883727f,  -0.900968850f, 0.831469595f,  0.555570245f,  -0.666346550f, 0.745642185f,
+    -0.645172000f, -0.764037371f, 0.846724212f,  -0.532032073f, 0.408444256f,  0.912783265f,
+    -0.960917294f, 0.276835501f,  -0.139790341f, -0.990181148f, 0.000000000f,  1.000000000f,
+    -0.980785251f, -0.195090324f, 0.382683426f,  -0.923879504f, 0.831469595f,  0.555570245f,
+    -0.707106769f, 0.707106769f,  -0.555570245f, -0.831469595f, 0.923879504f,  -0.382683426f,
+    0.195090324f,  0.980785251f,  -1.000000000f, -0.000000000f, 0.195090324f,  -0.980785251f,
+    0.923879504f,  0.382683426f,  -0.555570245f, 0.831469595f,  -0.707106769f, -0.707106769f,
+    0.831469595f,  -0.555570245f, 0.382683426f,  0.923879504f,  -0.980785251f, 0.195090324f,
+    0.000000000f,  -1.000000000f, 0.980785251f,  0.195090324f,  -0.382683426f, 0.923879504f,
+    -0.831469595f, -0.555570245f, 0.707106769f,  -0.707106769f, 0.555570245f,  0.831469595f,
+    -0.923879504f, 0.382683426f,  -0.195090324f, -0.980785251f, 1.000000000f,  0.000000000f,
+    -0.195090324f, 0.980785251f,  -0.923879504f, -0.382683426f, 0.555570245f,  -0.831469595f,
+    0.707106769f,  0.707106769f,  -0.831469595f, 0.555570245f,  -0.382683426f, -0.923879504f,
+    0.980785251f,  -0.195090324f, -0.000000000f, 1.000000000f,  -0.980785251f, -0.195090324f,
+    0.382683426f,  -0.923879504f, 0.831469595f,  0.555570245f,  -0.707106769f, 0.707106769f,
+    -0.555570245f, -0.831469595f, 0.923879504f,  -0.382683426f, 0.195090324f,  0.980785251f,
+    -1.000000000f, -0.000000000f, 0.195090324f,  -0.980785251f, 0.923879504f,  0.382683426f,
+    -0.555570245f, 0.831469595f,  -0.707106769f, -0.707106769f, 0.831469595f,  -0.555570245f,
+    0.382683426f,  0.923879504f,  -0.980785251f, 0.195090324f,  0.000000000f,  -1.000000000f,
+    0.980785251f,  0.195090324f,  -0.382683426f, 0.923879504f,  -0.831469595f, -0.555570245f,
+    0.707106769f,  -0.707106769f, 0.555570245f,  0.831469595f,  -0.923879504f, 0.382683426f,
+    -0.195090324f, -0.980785251f, 0.000000000f,  -1.000000000f, 0.968303502f,  0.249776483f,
+    -0.483718902f, 0.875223398f,  -0.726660311f, -0.686996937f, 0.846724212f,  -0.532032073f,
+    0.303676754f,  0.952775121f,  -0.998426795f, 0.056070447f,  0.195090324f,  -0.980785251f,
+    0.900968850f,  0.433883727f,  -0.645172000f, 0.764037371f,  -0.578671277f, -0.815560877f,
+    0.934248924f,  -0.356621534f, 0.111964479f,  0.993712187f,  -0.990181148f, -0.139790341f,
+    0.382683426f,  -0.923879504f, 0.799010456f,  0.601317108f,  -0.781831503f, 0.623489797f,
+    -0.408444256f, -0.912783265f, 0.985871017f,  -0.167506218f, -0.084050521f, 0.996461511f,
+    -0.943883359f, -0.330279052f, 0.555570245f,  -0.831469595f, 0.666346550f,  0.745642185f,
+    -0.888445616f, 0.458981872f,  -0.222520933f, -0.974927902f, 0.999606609f,  0.028046256f,
+    -0.276835501f, 0.960917294f,  -0.861312628f, -0.508075356f, 0.707106769f,  -0.707106769f,
+    0.508075356f,  0.861312628f,  -0.960917294f, 0.276835501f,  -0.028046256f, -0.999606609f,
+    0.974927902f,  0.222520933f,  -0.458981872f, 0.888445616f,  -0.745642185f, -0.666346550f,
+    0.831469595f,  -0.555570245f, 0.330279052f,  0.943883359f,  -0.996461511f, 0.084050521f,
+    0.167506218f,  -0.985871017f, 0.912783265f,  0.408444256f,  -0.623489797f, 0.781831503f,
+    -0.601317108f, -0.799010456f, 0.923879504f,  -0.382683426f, 0.139790341f,  0.990181148f,
+    -0.993712187f, -0.111964479f, 0.356621534f,  -0.934248924f, 0.815560877f,  0.578671277f,
+    -0.764037371f, 0.645172000f,  -0.433883727f, -0.900968850f, 0.980785251f,  -0.195090324f,
+    -0.056070447f, 0.998426795f,  -0.952775121f, -0.303676754f, 0.532032073f,  -0.846724212f,
+    0.686996937f,  0.726660311f,  -0.875223398f, 0.483718902f,  -0.249776483f, -0.968303502f,
+    -0.000000000f, 1.000000000f,  -0.952775121f, -0.303676754f, 0.578671277f,  -0.815560877f,
+    0.601317108f,  0.799010456f,  -0.943883359f, 0.330279052f,  -0.028046256f, -0.999606609f,
+    0.960917294f,  0.276835501f,  -0.555570245f, 0.831469595f,  -0.623489797f, -0.781831503f,
+    0.934248924f,  -0.356621534f, 0.056070447f,  0.998426795f,  -0.968303502f, -0.249776483f,
+    0.532032073f,  -0.846724212f, 0.645172000f,  0.764037371f,  -0.923879504f, 0.382683426f,
+    -0.084050521f, -0.996461511f, 0.974927902f,  0.222520933f,  -0.508075356f, 0.861312628f,
+    -0.666346550f, -0.745642185f, 0.912783265f,  -0.408444256f, 0.111964479f,  0.993712187f,
+    -0.980785251f, -0.195090324f, 0.483718902f,  -0.875223398f, 0.686996937f,  0.726660311f,
+    -0.900968850f, 0.433883727f,  -0.139790341f, -0.990181148f, 0.985871017f,  0.167506218f,
+    -0.458981872f, 0.888445616f,  -0.707106769f, -0.707106769f, 0.888445616f,  -0.458981872f,
+    0.167506218f,  0.985871017f,  -0.990181148f, -0.139790341f, 0.433883727f,  -0.900968850f,
+    0.726660311f,  0.686996937f,  -0.875223398f, 0.483718902f,  -0.195090324f, -0.980785251f,
+    0.993712187f,  0.111964479f,  -0.408444256f, 0.912783265f,  -0.745642185f, -0.666346550f,
+    0.861312628f,  -0.508075356f, 0.222520933f,  0.974927902f,  -0.996461511f, -0.084050521f,
+    0.382683426f,  -0.923879504f, 0.764037371f,  0.645172000f,  -0.846724212f, 0.532032073f,
+    -0.249776483f, -0.968303502f, 0.998426795f,  0.056070447f,  -0.356621534f, 0.934248924f,
+    -0.781831503f, -0.623489797f, 0.831469595f,  -0.555570245f, 0.276835501f,  0.960917294f,
+    -0.999606609f, -0.028046256f, 0.330279052f,  -0.943883359f, 0.799010456f,  0.601317108f,
+    -0.815560877f, 0.578671277f,  -0.303676754f, -0.952775121f, 0.000000000f,  -1.000000000f,
+    0.934248924f,  0.356621534f,  -0.666346550f, 0.745642185f,  -0.458981872f, -0.888445616f,
+    0.993712187f,  -0.111964479f, -0.249776483f, 0.968303502f,  -0.815560877f, -0.578671277f,
+    0.831469595f,  -0.555570245f, 0.222520933f,  0.974927902f,  -0.990181148f, -0.139790341f,
+    0.483718902f,  -0.875223398f, 0.645172000f,  0.764037371f,  -0.943883359f, 0.330279052f,
+    0.028046256f,  -0.999606609f, 0.923879504f,  0.382683426f,  -0.686996937f, 0.726660311f,
+    -0.433883727f, -0.900968850f, 0.996461511f,  -0.084050521f, -0.276835501f, 0.960917294f,
+    -0.799010456f, -0.601317108f, 0.846724212f,  -0.532032073f, 0.195090324f,  0.980785251f,
+    -0.985871017f, -0.167506218f, 0.508075356f,  -0.861312628f, 0.623489797f,  0.781831503f,
+    -0.952775121f, 0.303676754f,  0.056070447f,  -0.998426795f, 0.912783265f,  0.408444256f,
+    -0.707106769f, 0.707106769f,  -0.408444256f, -0.912783265f, 0.998426795f,  -0.056070447f,
+    -0.303676754f, 0.952775121f,  -0.781831503f, -0.623489797f, 0.861312628f,  -0.508075356f,
+    0.167506218f,  0.985871017f,  -0.980785251f, -0.195090324f, 0.532032073f,  -0.846724212f,
+    0.601317108f,  0.799010456f,  -0.960917294f, 0.276835501f,  0.084050521f,  -0.996461511f,
+    0.900968850f,  0.433883727f,  -0.726660311f, 0.686996937f,  -0.382683426f, -0.923879504f,
+    0.999606609f,  -0.028046256f, -0.330279052f, 0.943883359f,  -0.764037371f, -0.645172000f,
+    0.875223398f,  -0.483718902f, 0.139790341f,  0.990181148f,  -0.974927902f, -0.222520933f,
+    0.555570245f,  -0.831469595f, 0.578671277f,  0.815560877f,  -0.968303502f, 0.249776483f,
+    0.111964479f,  -0.993712187f, 0.888445616f,  0.458981872f,  -0.745642185f, 0.666346550f,
+    -0.356621534f, -0.934248924f, 0.000000000f,  1.000000000f,  -0.912783265f, -0.408444256f,
+    0.745642185f,  -0.666346550f, 0.303676754f,  0.952775121f,  -0.993712187f, -0.111964479f,
+    0.508075356f,  -0.861312628f, 0.578671277f,  0.815560877f,  -0.980785251f, 0.195090324f,
+    0.222520933f,  -0.974927902f, 0.799010456f,  0.601317108f,  -0.875223398f, 0.483718902f,
+    -0.084050521f, -0.996461511f, 0.943883359f,  0.330279052f,  -0.686996937f, 0.726660311f,
+    -0.382683426f, -0.923879504f, 0.999606609f,  0.028046256f,  -0.433883727f, 0.900968850f,
+    -0.645172000f, -0.764037371f, 0.960917294f,  -0.276835501f, -0.139790341f, 0.990181148f,
+    -0.846724212f, -0.532032073f, 0.831469595f,  -0.555570245f, 0.167506218f,  0.985871017f,
+    -0.968303502f, -0.249776483f, 0.623489797f,  -0.781831503f, 0.458981872f,  0.888445616f,
+    -0.998426795f, 0.056070447f,  0.356621534f,  -0.934248924f, 0.707106769f,  0.707106769f,
+    -0.934248924f, 0.356621534f,  0.056070447f,  -0.998426795f, 0.888445616f,  0.458981872f,
+    -0.781831503f, 0.623489797f,  -0.249776483f, -0.968303502f, 0.985871017f,  0.167506218f,
+    -0.555570245f, 0.831469595f,  -0.532032073f, -0.846724212f, 0.990181148f,  -0.139790341f,
+    -0.276835501f, 0.960917294f,  -0.764037371f, -0.645172000f, 0.900968850f,  -0.433883727f,
+    0.028046256f,  0.999606609f,  -0.923879504f, -0.382683426f, 0.726660311f,  -0.686996937f,
+    0.330279052f,  0.943883359f,  -0.996461511f, -0.084050521f, 0.483718902f,  -0.875223398f,
+    0.601317108f,  0.799010456f,  -0.974927902f, 0.222520933f,  0.195090324f,  -0.980785251f,
+    0.815560877f,  0.578671277f,  -0.861312628f, 0.508075356f,  -0.111964479f, -0.993712187f,
+    0.952775121f,  0.303676754f,  -0.666346550f, 0.745642185f,  -0.408444256f, -0.912783265f,
+    0.000000000f,  -1.000000000f, 0.888445616f,  0.458981872f,  -0.815560877f, 0.578671277f,
+    -0.139790341f, -0.990181148f, 0.943883359f,  0.330279052f,  -0.726660311f, 0.686996937f,
+    -0.276835501f, -0.960917294f, 0.980785251f,  0.195090324f,  -0.623489797f, 0.781831503f,
+    -0.408444256f, -0.912783265f, 0.998426795f,  0.056070447f,  -0.508075356f, 0.861312628f,
+    -0.532032073f, -0.846724212f, 0.996461511f,  -0.084050521f, -0.382683426f, 0.923879504f,
+    -0.645172000f, -0.764037371f, 0.974927902f,  -0.222520933f, -0.249776483f, 0.968303502f,
+    -0.745642185f, -0.666346550f, 0.934248924f,  -0.356621534f, -0.111964479f, 0.993712187f,
+    -0.831469595f, -0.555570245f, 0.875223398f,  -0.483718902f, 0.028046256f,  0.999606609f,
+    -0.900968850f, -0.433883727f, 0.799010456f,  -0.601317108f, 0.167506218f,  0.985871017f,
+    -0.952775121f, -0.303676754f, 0.707106769f,  -0.707106769f, 0.303676754f,  0.952775121f,
+    -0.985871017f, -0.167506218f, 0.601317108f,  -0.799010456f, 0.433883727f,  0.900968850f,
+    -0.999606609f, -0.028046256f, 0.483718902f,  -0.875223398f, 0.555570245f,  0.831469595f,
+    -0.993712187f, 0.111964479f,  0.356621534f,  -0.934248924f, 0.666346550f,  0.745642185f,
+    -0.968303502f, 0.249776483f,  0.222520933f,  -0.974927902f, 0.764037371f,  0.645172000f,
+    -0.923879504f, 0.382683426f,  0.084050521f,  -0.996461511f, 0.846724212f,  0.532032073f,
+    -0.861312628f, 0.508075356f,  -0.056070447f, -0.998426795f, 0.912783265f,  0.408444256f,
+    -0.781831503f, 0.623489797f,  -0.195090324f, -0.980785251f, 0.960917294f,  0.276835501f,
+    -0.686996937f, 0.726660311f,  -0.330279052f, -0.943883359f, 0.990181148f,  0.139790341f,
+    -0.578671277f, 0.815560877f,  -0.458981872f, -0.888445616f, -0.000000000f, 1.000000000f,
+    -0.861312628f, -0.508075356f, 0.875223398f,  -0.483718902f, -0.028046256f, 0.999606609f,
+    -0.846724212f, -0.532032073f, 0.888445616f,  -0.458981872f, -0.056070447f, 0.998426795f,
+    -0.831469595f, -0.555570245f, 0.900968850f,  -0.433883727f, -0.084050521f, 0.996461511f,
+    -0.815560877f, -0.578671277f, 0.912783265f,  -0.408444256f, -0.111964479f, 0.993712187f,
+    -0.799010456f, -0.601317108f, 0.923879504f,  -0.382683426f, -0.139790341f, 0.990181148f,
+    -0.781831503f, -0.623489797f, 0.934248924f,  -0.356621534f, -0.167506218f, 0.985871017f,
+    -0.764037371f, -0.645172000f, 0.943883359f,  -0.330279052f, -0.195090324f, 0.980785251f,
+    -0.745642185f, -0.666346550f, 0.952775121f,  -0.303676754f, -0.222520933f, 0.974927902f,
+    -0.726660311f, -0.686996937f, 0.960917294f,  -0.276835501f, -0.249776483f, 0.968303502f,
+    -0.707106769f, -0.707106769f, 0.968303502f,  -0.249776483f, -0.276835501f, 0.960917294f,
+    -0.686996937f, -0.726660311f, 0.974927902f,  -0.222520933f, -0.303676754f, 0.952775121f,
+    -0.666346550f, -0.745642185f, 0.980785251f,  -0.195090324f, -0.330279052f, 0.943883359f,
+    -0.645172000f, -0.764037371f, 0.985871017f,  -0.167506218f, -0.356621534f, 0.934248924f,
+    -0.623489797f, -0.781831503f, 0.990181148f,  -0.139790341f, -0.382683426f, 0.923879504f,
+    -0.601317108f, -0.799010456f, 0.993712187f,  -0.111964479f, -0.408444256f, 0.912783265f,
+    -0.578671277f, -0.815560877f, 0.996461511f,  -0.084050521f, -0.433883727f, 0.900968850f,
+    -0.555570245f, -0.831469595f, 0.998426795f,  -0.056070447f, -0.458981872f, 0.888445616f,
+    -0.532032073f, -0.846724212f, 0.999606609f,  -0.028046256f, -0.483718902f, 0.875223398f,
+    -0.508075356f, -0.861312628f, 0.000000000f,  -1.000000000f, 0.831469595f,  0.555570245f,
+    -0.923879504f, 0.382683426f,  0.195090324f,  -0.980785251f, 0.707106769f,  0.707106769f,
+    -0.980785251f, 0.195090324f,  0.382683426f,  -0.923879504f, 0.555570245f,  0.831469595f,
+    -1.000000000f, -0.000000000f, 0.555570245f,  -0.831469595f, 0.382683426f,  0.923879504f,
+    -0.980785251f, -0.195090324f, 0.707106769f,  -0.707106769f, 0.195090324f,  0.980785251f,
+    -0.923879504f, -0.382683426f, 0.831469595f,  -0.555570245f, 0.000000000f,  1.000000000f,
+    -0.831469595f, -0.555570245f, 0.923879504f,  -0.382683426f, -0.195090324f, 0.980785251f,
+    -0.707106769f, -0.707106769f, 0.980785251f,  -0.195090324f, -0.382683426f, 0.923879504f,
+    -0.555570245f, -0.831469595f, 1.000000000f,  0.000000000f,  -0.555570245f, 0.831469595f,
+    -0.382683426f, -0.923879504f, 0.980785251f,  0.195090324f,  -0.707106769f, 0.707106769f,
+    -0.195090324f, -0.980785251f, 0.923879504f,  0.382683426f,  -0.831469595f, 0.555570245f,
+    0.000000000f,  -1.000000000f, 0.831469595f,  0.555570245f,  -0.923879504f, 0.382683426f,
+    0.195090324f,  -0.980785251f, 0.707106769f,  0.707106769f,  -0.980785251f, 0.195090324f,
+    0.382683426f,  -0.923879504f, 0.555570245f,  0.831469595f,  -1.000000000f, -0.000000000f,
+    0.555570245f,  -0.831469595f, 0.382683426f,  0.923879504f,  -0.980785251f, -0.195090324f,
+    0.707106769f,  -0.707106769f, 0.195090324f,  0.980785251f,  -0.923879504f, -0.382683426f,
+    0.831469595f,  -0.555570245f, -0.000000000f, 1.000000000f,  -0.831469595f, -0.555570245f,
+    0.923879504f,  -0.382683426f, -0.195090324f, 0.980785251f,  -0.707106769f, -0.707106769f,
+    0.980785251f,  -0.195090324f, -0.382683426f, 0.923879504f,  -0.555570245f, -0.831469595f,
+    0.000000000f,  1.000000000f,  -0.799010456f, -0.601317108f, 0.960917294f,  -0.276835501f,
+    -0.356621534f, 0.934248924f,  -0.532032073f, -0.846724212f, 0.996461511f,  0.084050521f,
+    -0.666346550f, 0.745642185f,  -0.195090324f, -0.980785251f, 0.900968850f,  0.433883727f,
+    -0.888445616f, 0.458981872f,  0.167506218f,  -0.985871017f, 0.686996937f,  0.726660311f,
+    -0.993712187f, 0.111964479f,  0.508075356f,  -0.861312628f, 0.382683426f,  0.923879504f,
+    -0.968303502f, -0.249776483f, 0.781831503f,  -0.623489797f, 0.028046256f,  0.999606609f,
+    -0.815560877f, -0.578671277f, 0.952775121f,  -0.303676754f, -0.330279052f, 0.943883359f,
+    -0.555570245f, -0.831469595f, 0.998426795f,  0.056070447f,  -0.645172000f, 0.764037371f,
+    -0.222520933f, -0.974927902f, 0.912783265f,  0.408444256f,  -0.875223398f, 0.483718902f,
+    0.139790341f,  -0.990181148f, 0.707106769f,  0.707106769f,  -0.990181148f, 0.139790341f,
+    0.483718902f,  -0.875223398f, 0.408444256f,  0.912783265f,  -0.974927902f, -0.222520933f,
+    0.764037371f,  -0.645172000f, 0.056070447f,  0.998426795f,  -0.831469595f, -0.555570245f,
+    0.943883359f,  -0.330279052f, -0.303676754f, 0.952775121f,  -0.578671277f, -0.815560877f,
+    0.999606609f,  0.028046256f,  -0.623489797f, 0.781831503f,  -0.249776483f, -0.968303502f,
+    0.923879504f,  0.382683426f,  -0.861312628f, 0.508075356f,  0.111964479f,  -0.993712187f,
+    0.726660311f,  0.686996937f,  -0.985871017f, 0.167506218f,  0.458981872f,  -0.888445616f,
+    0.433883727f,  0.900968850f,  -0.980785251f, -0.195090324f, 0.745642185f,  -0.666346550f,
+    0.084050521f,  0.996461511f,  -0.846724212f, -0.532032073f, 0.934248924f,  -0.356621534f,
+    -0.276835501f, 0.960917294f,  -0.601317108f, -0.799010456f, 0.000000000f,  -1.000000000f,
+    0.764037371f,  0.645172000f,  -0.985871017f, 0.167506218f,  0.508075356f,  -0.861312628f,
+    0.330279052f,  0.943883359f,  -0.934248924f, -0.356621534f, 0.875223398f,  -0.483718902f,
+    -0.195090324f, 0.980785251f,  -0.623489797f, -0.781831503f, 0.999606609f,  0.028046256f,
+    -0.666346550f, 0.745642185f,  -0.139790341f, -0.990181148f, 0.846724212f,  0.532032073f,
+    -0.952775121f, 0.303676754f,  0.382683426f,  -0.923879504f, 0.458981872f,  0.888445616f,
+    -0.974927902f, -0.222520933f, 0.799010456f,  -0.601317108f, -0.056070447f, 0.998426795f,
+    -0.726660311f, -0.686996937f, 0.993712187f,  -0.111964479f, -0.555570245f, 0.831469595f,
+    -0.276835501f, -0.960917294f, 0.912783265f,  0.408444256f,  -0.900968850f, 0.433883727f,
+    0.249776483f,  -0.968303502f, 0.578671277f,  0.815560877f,  -0.996461511f, -0.084050521f,
+    0.707106769f,  -0.707106769f, 0.084050521f,  0.996461511f,  -0.815560877f, -0.578671277f,
+    0.968303502f,  -0.249776483f, -0.433883727f, 0.900968850f,  -0.408444256f, -0.912783265f,
+    0.960917294f,  0.276835501f,  -0.831469595f, 0.555570245f,  0.111964479f,  -0.993712187f,
+    0.686996937f,  0.726660311f,  -0.998426795f, 0.056070447f,  0.601317108f,  -0.799010456f,
+    0.222520933f,  0.974927902f,  -0.888445616f, -0.458981872f, 0.923879504f,  -0.382683426f,
+    -0.303676754f, 0.952775121f,  -0.532032073f, -0.846724212f, 0.990181148f,  0.139790341f,
+    -0.745642185f, 0.666346550f,  -0.028046256f, -0.999606609f, 0.781831503f,  0.623489797f,
+    -0.980785251f, 0.195090324f,  0.483718902f,  -0.875223398f, 0.356621534f,  0.934248924f,
+    -0.943883359f, -0.330279052f, 0.861312628f,  -0.508075356f, -0.167506218f, 0.985871017f,
+    -0.645172000f, -0.764037371f, 0.000000000f,  1.000000000f,  -0.726660311f, -0.686996937f,
+    0.998426795f,  -0.056070447f, -0.645172000f, 0.764037371f,  -0.111964479f, -0.993712187f,
+    0.799010456f,  0.601317108f,  -0.985871017f, 0.167506218f,  0.555570245f,  -0.831469595f,
+    0.222520933f,  0.974927902f,  -0.861312628f, -0.508075356f, 0.960917294f,  -0.276835501f,
+    -0.458981872f, 0.888445616f,  -0.330279052f, -0.943883359f, 0.912783265f,  0.408444256f,
+    -0.923879504f, 0.382683426f,  0.356621534f,  -0.934248924f, 0.433883727f,  0.900968850f,
+    -0.952775121f, -0.303676754f, 0.875223398f,  -0.483718902f, -0.249776483f, 0.968303502f,
+    -0.532032073f, -0.846724212f, 0.980785251f,  0.195090324f,  -0.815560877f, 0.578671277f,
+    0.139790341f,  -0.990181148f, 0.623489797f,  0.781831503f,  -0.996461511f, -0.084050521f,
+    0.745642185f,  -0.666346550f, -0.028046256f, 0.999606609f,  -0.707106769f, -0.707106769f,
+    0.999606609f,  -0.028046256f, -0.666346550f, 0.745642185f,  -0.084050521f, -0.996461511f,
+    0.781831503f,  0.623489797f,  -0.990181148f, 0.139790341f,  0.578671277f,  -0.815560877f,
+    0.195090324f,  0.980785251f,  -0.846724212f, -0.532032073f, 0.968303502f,  -0.249776483f,
+    -0.483718902f, 0.875223398f,  -0.303676754f, -0.952775121f, 0.900968850f,  0.433883727f,
+    -0.934248924f, 0.356621534f,  0.382683426f,  -0.923879504f, 0.408444256f,  0.912783265f,
+    -0.943883359f, -0.330279052f, 0.888445616f,  -0.458981872f, -0.276835501f, 0.960917294f,
+    -0.508075356f, -0.861312628f, 0.974927902f,  0.222520933f,  -0.831469595f, 0.555570245f,
+    0.167506218f,  -0.985871017f, 0.601317108f,  0.799010456f,  -0.993712187f, -0.111964479f,
+    0.764037371f,  -0.645172000f, -0.056070447f, 0.998426795f,  -0.686996937f, -0.726660311f,
+    0.000000000f,  -1.000000000f, 0.686996937f,  0.726660311f,  -0.998426795f, -0.056070447f,
+    0.764037371f,  -0.645172000f, -0.111964479f, 0.993712187f,  -0.601317108f, -0.799010456f,
+    0.985871017f,  0.167506218f,  -0.831469595f, 0.555570245f,  0.222520933f,  -0.974927902f,
+    0.508075356f,  0.861312628f,  -0.960917294f, -0.276835501f, 0.888445616f,  -0.458981872f,
+    -0.330279052f, 0.943883359f,  -0.408444256f, -0.912783265f, 0.923879504f,  0.382683426f,
+    -0.934248924f, 0.356621534f,  0.433883727f,  -0.900968850f, 0.303676754f,  0.952775121f,
+    -0.875223398f, -0.483718902f, 0.968303502f,  -0.249776483f, -0.532032073f, 0.846724212f,
+    -0.195090324f, -0.980785251f, 0.815560877f,  0.578671277f,  -0.990181148f, 0.139790341f,
+    0.623489797f,  -0.781831503f, 0.084050521f,  0.996461511f,  -0.745642185f, -0.666346550f,
+    0.999606609f,  -0.028046256f, -0.707106769f, 0.707106769f,  0.028046256f,  -0.999606609f,
+    0.666346550f,  0.745642185f,  -0.996461511f, -0.084050521f, 0.781831503f,  -0.623489797f,
+    -0.139790341f, 0.990181148f,  -0.578671277f, -0.815560877f, 0.980785251f,  0.195090324f,
+    -0.846724212f, 0.532032073f,  0.249776483f,  -0.968303502f, 0.483718902f,  0.875223398f,
+    -0.952775121f, -0.303676754f, 0.900968850f,  -0.433883727f, -0.356621534f, 0.934248924f,
+    -0.382683426f, -0.923879504f, 0.912783265f,  0.408444256f,  -0.943883359f, 0.330279052f,
+    0.458981872f,  -0.888445616f, 0.276835501f,  0.960917294f,  -0.861312628f, -0.508075356f,
+    0.974927902f,  -0.222520933f, -0.555570245f, 0.831469595f,  -0.167506218f, -0.985871017f,
+    0.799010456f,  0.601317108f,  -0.993712187f, 0.111964479f,  0.645172000f,  -0.764037371f,
+    0.056070447f,  0.998426795f,  -0.726660311f, -0.686996937f, -0.000000000f, 1.000000000f,
+    -0.645172000f, -0.764037371f, 0.985871017f,  0.167506218f,  -0.861312628f, 0.508075356f,
+    0.330279052f,  -0.943883359f, 0.356621534f,  0.934248924f,  -0.875223398f, -0.483718902f,
+    0.980785251f,  -0.195090324f, -0.623489797f, 0.781831503f,  -0.028046256f, -0.999606609f,
+    0.666346550f,  0.745642185f,  -0.990181148f, -0.139790341f, 0.846724212f,  -0.532032073f,
+    -0.303676754f, 0.952775121f,  -0.382683426f, -0.923879504f, 0.888445616f,  0.458981872f,
+    -0.974927902f, 0.222520933f,  0.601317108f,  -0.799010456f, 0.056070447f,  0.998426795f,
+    -0.686996937f, -0.726660311f, 0.993712187f,  0.111964479f,  -0.831469595f, 0.555570245f,
+    0.276835501f,  -0.960917294f, 0.408444256f,  0.912783265f,  -0.900968850f, -0.433883727f,
+    0.968303502f,  -0.249776483f, -0.578671277f, 0.815560877f,  -0.084050521f, -0.996461511f,
+    0.707106769f,  0.707106769f,  -0.996461511f, -0.084050521f, 0.815560877f,  -0.578671277f,
+    -0.249776483f, 0.968303502f,  -0.433883727f, -0.900968850f, 0.912783265f,  0.408444256f,
+    -0.960917294f, 0.276835501f,  0.555570245f,  -0.831469595f, 0.111964479f,  0.993712187f,
+    -0.726660311f, -0.686996937f, 0.998426795f,  0.056070447f,  -0.799010456f, 0.601317108f,
+    0.222520933f,  -0.974927902f, 0.458981872f,  0.888445616f,  -0.923879504f, -0.382683426f,
+    0.952775121f,  -0.303676754f, -0.532032073f, 0.846724212f,  -0.139790341f, -0.990181148f,
+    0.745642185f,  0.666346550f,  -0.999606609f, -0.028046256f, 0.781831503f,  -0.623489797f,
+    -0.195090324f, 0.980785251f,  -0.483718902f, -0.875223398f, 0.934248924f,  0.356621534f,
+    -0.943883359f, 0.330279052f,  0.508075356f,  -0.861312628f, 0.167506218f,  0.985871017f,
+    -0.764037371f, -0.645172000f, -0.000000000f, -1.000000000f, 0.601317108f,  0.799010456f,
+    -0.960917294f, -0.276835501f, 0.934248924f,  -0.356621534f, -0.532032073f, 0.846724212f,
+    -0.084050521f, -0.996461511f, 0.666346550f,  0.745642185f,  -0.980785251f, -0.195090324f,
+    0.900968850f,  -0.433883727f, -0.458981872f, 0.888445616f,  -0.167506218f, -0.985871017f,
+    0.726660311f,  0.686996937f,  -0.993712187f, -0.111964479f, 0.861312628f,  -0.508075356f,
+    -0.382683426f, 0.923879504f,  -0.249776483f, -0.968303502f, 0.781831503f,  0.623489797f,
+    -0.999606609f, -0.028046256f, 0.815560877f,  -0.578671277f, -0.303676754f, 0.952775121f,
+    -0.330279052f, -0.943883359f, 0.831469595f,  0.555570245f,  -0.998426795f, 0.056070447f,
+    0.764037371f,  -0.645172000f, -0.222520933f, 0.974927902f,  -0.408444256f, -0.912783265f,
+    0.875223398f,  0.483718902f,  -0.990181148f, 0.139790341f,  0.707106769f,  -0.707106769f,
+    -0.139790341f, 0.990181148f,  -0.483718902f, -0.875223398f, 0.912783265f,  0.408444256f,
+    -0.974927902f, 0.222520933f,  0.645172000f,  -0.764037371f, -0.056070447f, 0.998426795f,
+    -0.555570245f, -0.831469595f, 0.943883359f,  0.330279052f,  -0.952775121f, 0.303676754f,
+    0.578671277f,  -0.815560877f, 0.028046256f,  0.999606609f,  -0.623489797f, -0.781831503f,
+    0.968303502f,  0.249776483f,  -0.923879504f, 0.382683426f,  0.508075356f,  -0.861312628f,
+    0.111964479f,  0.993712187f,  -0.686996937f, -0.726660311f, 0.985871017f,  0.167506218f,
+    -0.888445616f, 0.458981872f,  0.433883727f,  -0.900968850f, 0.195090324f,  0.980785251f,
+    -0.745642185f, -0.666346550f, 0.996461511f,  0.084050521f,  -0.846724212f, 0.532032073f,
+    0.356621534f,  -0.934248924f, 0.276835501f,  0.960917294f,  -0.799010456f, -0.601317108f,
+    -0.000000000f, 1.000000000f,  -0.555570245f, -0.831469595f, 0.923879504f,  0.382683426f,
+    -0.980785251f, 0.195090324f,  0.707106769f,  -0.707106769f, -0.195090324f, 0.980785251f,
+    -0.382683426f, -0.923879504f, 0.831469595f,  0.555570245f,  -1.000000000f, -0.000000000f,
+    0.831469595f,  -0.555570245f, -0.382683426f, 0.923879504f,  -0.195090324f, -0.980785251f,
+    0.707106769f,  0.707106769f,  -0.980785251f, -0.195090324f, 0.923879504f,  -0.382683426f,
+    -0.555570245f, 0.831469595f,  0.000000000f,  -1.000000000f, 0.555570245f,  0.831469595f,
+    -0.923879504f, -0.382683426f, 0.980785251f,  -0.195090324f, -0.707106769f, 0.707106769f,
+    0.195090324f,  -0.980785251f, 0.382683426f,  0.923879504f,  -0.831469595f, -0.555570245f,
+    1.000000000f,  -0.000000000f, -0.831469595f, 0.555570245f,  0.382683426f,  -0.923879504f,
+    0.195090324f,  0.980785251f,  -0.707106769f, -0.707106769f, 0.980785251f,  0.195090324f,
+    -0.923879504f, 0.382683426f,  0.555570245f,  -0.831469595f, -0.000000000f, 1.000000000f,
+    -0.555570245f, -0.831469595f, 0.923879504f,  0.382683426f,  -0.980785251f, 0.195090324f,
+    0.707106769f,  -0.707106769f, -0.195090324f, 0.980785251f,  -0.382683426f, -0.923879504f,
+    0.831469595f,  0.555570245f,  -1.000000000f, 0.000000000f,  0.831469595f,  -0.555570245f,
+    -0.382683426f, 0.923879504f,  -0.195090324f, -0.980785251f, 0.707106769f,  0.707106769f,
+    -0.980785251f, -0.195090324f, 0.923879504f,  -0.382683426f, -0.555570245f, 0.831469595f,
+    -0.000000000f, -1.000000000f, 0.555570245f,  0.831469595f,  -0.923879504f, -0.382683426f,
+    0.980785251f,  -0.195090324f, -0.707106769f, 0.707106769f,  0.195090324f,  -0.980785251f,
+    0.382683426f,  0.923879504f,  -0.831469595f, -0.555570245f, 0.000000000f,  -1.000000000f,
+    0.508075356f,  0.861312628f,  -0.875223398f, -0.483718902f, 0.999606609f,  -0.028046256f,
+    -0.846724212f, 0.532032073f,  0.458981872f,  -0.888445616f, 0.056070447f,  0.998426795f,
+    -0.555570245f, -0.831469595f, 0.900968850f,  0.433883727f,  -0.996461511f, 0.084050521f,
+    0.815560877f,  -0.578671277f, -0.408444256f, 0.912783265f,  -0.111964479f, -0.993712187f,
+    0.601317108f,  0.799010456f,  -0.923879504f, -0.382683426f, 0.990181148f,  -0.139790341f,
+    -0.781831503f, 0.623489797f,  0.356621534f,  -0.934248924f, 0.167506218f,  0.985871017f,
+    -0.645172000f, -0.764037371f, 0.943883359f,  0.330279052f,  -0.980785251f, 0.195090324f,
+    0.745642185f,  -0.666346550f, -0.303676754f, 0.952775121f,  -0.222520933f, -0.974927902f,
+    0.686996937f,  0.726660311f,  -0.960917294f, -0.276835501f, 0.968303502f,  -0.249776483f,
+    -0.707106769f, 0.707106769f,  0.249776483f,  -0.968303502f, 0.276835501f,  0.960917294f,
+    -0.726660311f, -0.686996937f, 0.974927902f,  0.222520933f,  -0.952775121f, 0.303676754f,
+    0.666346550f,  -0.745642185f, -0.195090324f, 0.980785251f,  -0.330279052f, -0.943883359f,
+    0.764037371f,  0.645172000f,  -0.985871017f, -0.167506218f, 0.934248924f,  -0.356621534f,
+    -0.623489797f, 0.781831503f,  0.139790341f,  -0.990181148f, 0.382683426f,  0.923879504f,
+    -0.799010456f, -0.601317108f, 0.993712187f,  0.111964479f,  -0.912783265f, 0.408444256f,
+    0.578671277f,  -0.815560877f, -0.084050521f, 0.996461511f,  -0.433883727f, -0.900968850f,
+    0.831469595f,  0.555570245f,  -0.998426795f, -0.056070447f, 0.888445616f,  -0.458981872f,
+    -0.532032073f, 0.846724212f,  0.028046256f,  -0.999606609f, 0.483718902f,  0.875223398f,
+    -0.861312628f, -0.508075356f, -0.000000000f, 1.000000000f,  -0.458981872f, -0.888445616f,
+    0.815560877f,  0.578671277f,  -0.990181148f, -0.139790341f, 0.943883359f,  -0.330279052f,
+    -0.686996937f, 0.726660311f,  0.276835501f,  -0.960917294f, 0.195090324f,  0.980785251f,
+    -0.623489797f, -0.781831503f, 0.912783265f,  0.408444256f,  -0.998426795f, 0.056070447f,
+    0.861312628f,  -0.508075356f, -0.532032073f, 0.846724212f,  0.084050521f,  -0.996461511f,
+    0.382683426f,  0.923879504f,  -0.764037371f, -0.645172000f, 0.974927902f,  0.222520933f,
+    -0.968303502f, 0.249776483f,  0.745642185f,  -0.666346550f, -0.356621534f, 0.934248924f,
+    -0.111964479f, -0.993712187f, 0.555570245f,  0.831469595f,  -0.875223398f, -0.483718902f,
+    0.999606609f,  0.028046256f,  -0.900968850f, 0.433883727f,  0.601317108f,  -0.799010456f,
+    -0.167506218f, 0.985871017f,  -0.303676754f, -0.952775121f, 0.707106769f,  0.707106769f,
+    -0.952775121f, -0.303676754f, 0.985871017f,  -0.167506218f, -0.799010456f, 0.601317108f,
+    0.433883727f,  -0.900968850f, 0.028046256f,  0.999606609f,  -0.483718902f, -0.875223398f,
+    0.831469595f,  0.555570245f,  -0.993712187f, -0.111964479f, 0.934248924f,  -0.356621534f,
+    -0.666346550f, 0.745642185f,  0.249776483f,  -0.968303502f, 0.222520933f,  0.974927902f,
+    -0.645172000f, -0.764037371f, 0.923879504f,  0.382683426f,  -0.996461511f, 0.084050521f,
+    0.846724212f,  -0.532032073f, -0.508075356f, 0.861312628f,  0.056070447f,  -0.998426795f,
+    0.408444256f,  0.912783265f,  -0.781831503f, -0.623489797f, 0.980785251f,  0.195090324f,
+    -0.960917294f, 0.276835501f,  0.726660311f,  -0.686996937f, -0.330279052f, 0.943883359f,
+    -0.139790341f, -0.990181148f, 0.578671277f,  0.815560877f,  -0.888445616f, -0.458981872f,
+    0.000000000f,  -1.000000000f, 0.408444256f,  0.912783265f,  -0.745642185f, -0.666346550f,
+    0.952775121f,  0.303676754f,  -0.993712187f, 0.111964479f,  0.861312628f,  -0.508075356f,
+    -0.578671277f, 0.815560877f,  0.195090324f,  -0.980785251f, 0.222520933f,  0.974927902f,
+    -0.601317108f, -0.799010456f, 0.875223398f,  0.483718902f,  -0.996461511f, -0.084050521f,
+    0.943883359f,  -0.330279052f, -0.726660311f, 0.686996937f,  0.382683426f,  -0.923879504f,
+    0.028046256f,  0.999606609f,  -0.433883727f, -0.900968850f, 0.764037371f,  0.645172000f,
+    -0.960917294f, -0.276835501f, 0.990181148f,  -0.139790341f, -0.846724212f, 0.532032073f,
+    0.555570245f,  -0.831469595f, -0.167506218f, 0.985871017f,  -0.249776483f, -0.968303502f,
+    0.623489797f,  0.781831503f,  -0.888445616f, -0.458981872f, 0.998426795f,  0.056070447f,
+    -0.934248924f, 0.356621534f,  0.707106769f,  -0.707106769f, -0.356621534f, 0.934248924f,
+    -0.056070447f, -0.998426795f, 0.458981872f,  0.888445616f,  -0.781831503f, -0.623489797f,
+    0.968303502f,  0.249776483f,  -0.985871017f, 0.167506218f,  0.831469595f,  -0.555570245f,
+    -0.532032073f, 0.846724212f,  0.139790341f,  -0.990181148f, 0.276835501f,  0.960917294f,
+    -0.645172000f, -0.764037371f, 0.900968850f,  0.433883727f,  -0.999606609f, -0.028046256f,
+    0.923879504f,  -0.382683426f, -0.686996937f, 0.726660311f,  0.330279052f,  -0.943883359f,
+    0.084050521f,  0.996461511f,  -0.483718902f, -0.875223398f, 0.799010456f,  0.601317108f,
+    -0.974927902f, -0.222520933f, 0.980785251f,  -0.195090324f, -0.815560877f, 0.578671277f,
+    0.508075356f,  -0.861312628f, -0.111964479f, 0.993712187f,  -0.303676754f, -0.952775121f,
+    0.666346550f,  0.745642185f,  -0.912783265f, -0.408444256f, 0.000000000f,  1.000000000f,
+    -0.356621534f, -0.934248924f, 0.666346550f,  0.745642185f,  -0.888445616f, -0.458981872f,
+    0.993712187f,  0.111964479f,  -0.968303502f, 0.249776483f,  0.815560877f,  -0.578671277f,
+    -0.555570245f, 0.831469595f,  0.222520933f,  -0.974927902f, 0.139790341f,  0.990181148f,
+    -0.483718902f, -0.875223398f, 0.764037371f,  0.645172000f,  -0.943883359f, -0.330279052f,
+    0.999606609f,  -0.028046256f, -0.923879504f, 0.382683426f,  0.726660311f,  -0.686996937f,
+    -0.433883727f, 0.900968850f,  0.084050521f,  -0.996461511f, 0.276835501f,  0.960917294f,
+    -0.601317108f, -0.799010456f, 0.846724212f,  0.532032073f,  -0.980785251f, -0.195090324f,
+    0.985871017f,  -0.167506218f, -0.861312628f, 0.508075356f,  0.623489797f,  -0.781831503f,
+    -0.303676754f, 0.952775121f,  -0.056070447f, -0.998426795f, 0.408444256f,  0.912783265f,
+    -0.707106769f, -0.707106769f, 0.912783265f,  0.408444256f,  -0.998426795f, -0.056070447f,
+    0.952775121f,  -0.303676754f, -0.781831503f, 0.623489797f,  0.508075356f,  -0.861312628f,
+    -0.167506218f, 0.985871017f,  -0.195090324f, -0.980785251f, 0.532032073f,  0.846724212f,
+    -0.799010456f, -0.601317108f, 0.960917294f,  0.276835501f,  -0.996461511f, 0.084050521f,
+    0.900968850f,  -0.433883727f, -0.686996937f, 0.726660311f,  0.382683426f,  -0.923879504f,
+    -0.028046256f, 0.999606609f,  -0.330279052f, -0.943883359f, 0.645172000f,  0.764037371f,
+    -0.875223398f, -0.483718902f, 0.990181148f,  0.139790341f,  -0.974927902f, 0.222520933f,
+    0.831469595f,  -0.555570245f, -0.578671277f, 0.815560877f,  0.249776483f,  -0.968303502f,
+    0.111964479f,  0.993712187f,  -0.458981872f, -0.888445616f, 0.745642185f,  0.666346550f,
+    -0.934248924f, -0.356621534f, 0.000000000f,  -1.000000000f, 0.303676754f,  0.952775121f,
+    -0.578671277f, -0.815560877f, 0.799010456f,  0.601317108f,  -0.943883359f, -0.330279052f,
+    0.999606609f,  0.028046256f,  -0.960917294f, 0.276835501f,  0.831469595f,  -0.555570245f,
+    -0.623489797f, 0.781831503f,  0.356621534f,  -0.934248924f, -0.056070447f, 0.998426795f,
+    -0.249776483f, -0.968303502f, 0.532032073f,  0.846724212f,  -0.764037371f, -0.645172000f,
+    0.923879504f,  0.382683426f,  -0.996461511f, -0.084050521f, 0.974927902f,  -0.222520933f,
+    -0.861312628f, 0.508075356f,  0.666346550f,  -0.745642185f, -0.408444256f, 0.912783265f,
+    0.111964479f,  -0.993712187f, 0.195090324f,  0.980785251f,  -0.483718902f, -0.875223398f,
+    0.726660311f,  0.686996937f,  -0.900968850f, -0.433883727f, 0.990181148f,  0.139790341f,
+    -0.985871017f, 0.167506218f,  0.888445616f,  -0.458981872f, -0.707106769f, 0.707106769f,
+    0.458981872f,  -0.888445616f, -0.167506218f, 0.985871017f,  -0.139790341f, -0.990181148f,
+    0.433883727f,  0.900968850f,  -0.686996937f, -0.726660311f, 0.875223398f,  0.483718902f,
+    -0.980785251f, -0.195090324f, 0.993712187f,  -0.111964479f, -0.912783265f, 0.408444256f,
+    0.745642185f,  -0.666346550f, -0.508075356f, 0.861312628f,  0.222520933f,  -0.974927902f,
+    0.084050521f,  0.996461511f,  -0.382683426f, -0.923879504f, 0.645172000f,  0.764037371f,
+    -0.846724212f, -0.532032073f, 0.968303502f,  0.249776483f,  -0.998426795f, 0.056070447f,
+    0.934248924f,  -0.356621534f, -0.781831503f, 0.623489797f,  0.555570245f,  -0.831469595f,
+    -0.276835501f, 0.960917294f,  -0.028046256f, -0.999606609f, 0.330279052f,  0.943883359f,
+    -0.601317108f, -0.799010456f, 0.815560877f,  0.578671277f,  -0.952775121f, -0.303676754f,
+    -0.000000000f, 1.000000000f,  -0.249776483f, -0.968303502f, 0.483718902f,  0.875223398f,
+    -0.686996937f, -0.726660311f, 0.846724212f,  0.532032073f,  -0.952775121f, -0.303676754f,
+    0.998426795f,  0.056070447f,  -0.980785251f, 0.195090324f,  0.900968850f,  -0.433883727f,
+    -0.764037371f, 0.645172000f,  0.578671277f,  -0.815560877f, -0.356621534f, 0.934248924f,
+    0.111964479f,  -0.993712187f, 0.139790341f,  0.990181148f,  -0.382683426f, -0.923879504f,
+    0.601317108f,  0.799010456f,  -0.781831503f, -0.623489797f, 0.912783265f,  0.408444256f,
+    -0.985871017f, -0.167506218f, 0.996461511f,  -0.084050521f, -0.943883359f, 0.330279052f,
+    0.831469595f,  -0.555570245f, -0.666346550f, 0.745642185f,  0.458981872f,  -0.888445616f,
+    -0.222520933f, 0.974927902f,  -0.028046256f, -0.999606609f, 0.276835501f,  0.960917294f,
+    -0.508075356f, -0.861312628f, 0.707106769f,  0.707106769f,  -0.861312628f, -0.508075356f,
+    0.960917294f,  0.276835501f,  -0.999606609f, -0.028046256f, 0.974927902f,  -0.222520933f,
+    -0.888445616f, 0.458981872f,  0.745642185f,  -0.666346550f, -0.555570245f, 0.831469595f,
+    0.330279052f,  -0.943883359f, -0.084050521f, 0.996461511f,  -0.167506218f, -0.985871017f,
+    0.408444256f,  0.912783265f,  -0.623489797f, -0.781831503f, 0.799010456f,  0.601317108f,
+    -0.923879504f, -0.382683426f, 0.990181148f,  0.139790341f,  -0.993712187f, 0.111964479f,
+    0.934248924f,  -0.356621534f, -0.815560877f, 0.578671277f,  0.645172000f,  -0.764037371f,
+    -0.433883727f, 0.900968850f,  0.195090324f,  -0.980785251f, 0.056070447f,  0.998426795f,
+    -0.303676754f, -0.952775121f, 0.532032073f,  0.846724212f,  -0.726660311f, -0.686996937f,
+    0.875223398f,  0.483718902f,  -0.968303502f, -0.249776483f, -0.000000000f, -1.000000000f,
+    0.195090324f,  0.980785251f,  -0.382683426f, -0.923879504f, 0.555570245f,  0.831469595f,
+    -0.707106769f, -0.707106769f, 0.831469595f,  0.555570245f,  -0.923879504f, -0.382683426f,
+    0.980785251f,  0.195090324f,  -1.000000000f, -0.000000000f, 0.980785251f,  -0.195090324f,
+    -0.923879504f, 0.382683426f,  0.831469595f,  -0.555570245f, -0.707106769f, 0.707106769f,
+    0.555570245f,  -0.831469595f, -0.382683426f, 0.923879504f,  0.195090324f,  -0.980785251f,
+    -0.000000000f, 1.000000000f,  -0.195090324f, -0.980785251f, 0.382683426f,  0.923879504f,
+    -0.555570245f, -0.831469595f, 0.707106769f,  0.707106769f,  -0.831469595f, -0.555570245f,
+    0.923879504f,  0.382683426f,  -0.980785251f, -0.195090324f, 1.000000000f,  0.000000000f,
+    -0.980785251f, 0.195090324f,  0.923879504f,  -0.382683426f, -0.831469595f, 0.555570245f,
+    0.707106769f,  -0.707106769f, -0.555570245f, 0.831469595f,  0.382683426f,  -0.923879504f,
+    -0.195090324f, 0.980785251f,  0.000000000f,  -1.000000000f, 0.195090324f,  0.980785251f,
+    -0.382683426f, -0.923879504f, 0.555570245f,  0.831469595f,  -0.707106769f, -0.707106769f,
+    0.831469595f,  0.555570245f,  -0.923879504f, -0.382683426f, 0.980785251f,  0.195090324f,
+    -1.000000000f, -0.000000000f, 0.980785251f,  -0.195090324f, -0.923879504f, 0.382683426f,
+    0.831469595f,  -0.555570245f, -0.707106769f, 0.707106769f,  0.555570245f,  -0.831469595f,
+    -0.382683426f, 0.923879504f,  0.195090324f,  -0.980785251f, -0.000000000f, 1.000000000f,
+    -0.195090324f, -0.980785251f, 0.382683426f,  0.923879504f,  -0.555570245f, -0.831469595f,
+    0.707106769f,  0.707106769f,  -0.831469595f, -0.555570245f, 0.923879504f,  0.382683426f,
+    -0.980785251f, -0.195090324f, -0.000000000f, 1.000000000f,  -0.139790341f, -0.990181148f,
+    0.276835501f,  0.960917294f,  -0.408444256f, -0.912783265f, 0.532032073f,  0.846724212f,
+    -0.645172000f, -0.764037371f, 0.745642185f,  0.666346550f,  -0.831469595f, -0.555570245f,
+    0.900968850f,  0.433883727f,  -0.952775121f, -0.303676754f, 0.985871017f,  0.167506218f,
+    -0.999606609f, -0.028046256f, 0.993712187f,  -0.111964479f, -0.968303502f, 0.249776483f,
+    0.923879504f,  -0.382683426f, -0.861312628f, 0.508075356f,  0.781831503f,  -0.623489797f,
+    -0.686996937f, 0.726660311f,  0.578671277f,  -0.815560877f, -0.458981872f, 0.888445616f,
+    0.330279052f,  -0.943883359f, -0.195090324f, 0.980785251f,  0.056070447f,  -0.998426795f,
+    0.084050521f,  0.996461511f,  -0.222520933f, -0.974927902f, 0.356621534f,  0.934248924f,
+    -0.483718902f, -0.875223398f, 0.601317108f,  0.799010456f,  -0.707106769f, -0.707106769f,
+    0.799010456f,  0.601317108f,  -0.875223398f, -0.483718902f, 0.934248924f,  0.356621534f,
+    -0.974927902f, -0.222520933f, 0.996461511f,  0.084050521f,  -0.998426795f, 0.056070447f,
+    0.980785251f,  -0.195090324f, -0.943883359f, 0.330279052f,  0.888445616f,  -0.458981872f,
+    -0.815560877f, 0.578671277f,  0.726660311f,  -0.686996937f, -0.623489797f, 0.781831503f,
+    0.508075356f,  -0.861312628f, -0.382683426f, 0.923879504f,  0.249776483f,  -0.968303502f,
+    -0.111964479f, 0.993712187f,  -0.028046256f, -0.999606609f, 0.167506218f,  0.985871017f,
+    -0.303676754f, -0.952775121f, 0.433883727f,  0.900968850f,  -0.555570245f, -0.831469595f,
+    0.666346550f,  0.745642185f,  -0.764037371f, -0.645172000f, 0.846724212f,  0.532032073f,
+    -0.912783265f, -0.408444256f, 0.960917294f,  0.276835501f,  -0.990181148f, -0.139790341f,
+    0.000000000f,  -1.000000000f, 0.084050521f,  0.996461511f,  -0.167506218f, -0.985871017f,
+    0.249776483f,  0.968303502f,  -0.330279052f, -0.943883359f, 0.408444256f,  0.912783265f,
+    -0.483718902f, -0.875223398f, 0.555570245f,  0.831469595f,  -0.623489797f, -0.781831503f,
+    0.686996937f,  0.726660311f,  -0.745642185f, -0.666346550f, 0.799010456f,  0.601317108f,
+    -0.846724212f, -0.532032073f, 0.888445616f,  0.458981872f,  -0.923879504f, -0.382683426f,
+    0.952775121f,  0.303676754f,  -0.974927902f, -0.222520933f, 0.990181148f,  0.139790341f,
+    -0.998426795f, -0.056070447f, 0.999606609f,  -0.028046256f, -0.993712187f, 0.111964479f,
+    0.980785251f,  -0.195090324f, -0.960917294f, 0.276835501f,  0.934248924f,  -0.356621534f,
+    -0.900968850f, 0.433883727f,  0.861312628f,  -0.508075356f, -0.815560877f, 0.578671277f,
+    0.764037371f,  -0.645172000f, -0.707106769f, 0.707106769f,  0.645172000f,  -0.764037371f,
+    -0.578671277f, 0.815560877f,  0.508075356f,  -0.861312628f, -0.433883727f, 0.900968850f,
+    0.356621534f,  -0.934248924f, -0.276835501f, 0.960917294f,  0.195090324f,  -0.980785251f,
+    -0.111964479f, 0.993712187f,  0.028046256f,  -0.999606609f, 0.056070447f,  0.998426795f,
+    -0.139790341f, -0.990181148f, 0.222520933f,  0.974927902f,  -0.303676754f, -0.952775121f,
+    0.382683426f,  0.923879504f,  -0.458981872f, -0.888445616f, 0.532032073f,  0.846724212f,
+    -0.601317108f, -0.799010456f, 0.666346550f,  0.745642185f,  -0.726660311f, -0.686996937f,
+    0.781831503f,  0.623489797f,  -0.831469595f, -0.555570245f, 0.875223398f,  0.483718902f,
+    -0.912783265f, -0.408444256f, 0.943883359f,  0.330279052f,  -0.968303502f, -0.249776483f,
+    0.985871017f,  0.167506218f,  -0.996461511f, -0.084050521f, -0.000000000f, 1.000000000f,
+    -0.028046256f, -0.999606609f, 0.056070447f,  0.998426795f,  -0.084050521f, -0.996461511f,
+    0.111964479f,  0.993712187f,  -0.139790341f, -0.990181148f, 0.167506218f,  0.985871017f,
+    -0.195090324f, -0.980785251f, 0.222520933f,  0.974927902f,  -0.249776483f, -0.968303502f,
+    0.276835501f,  0.960917294f,  -0.303676754f, -0.952775121f, 0.330279052f,  0.943883359f,
+    -0.356621534f, -0.934248924f, 0.382683426f,  0.923879504f,  -0.408444256f, -0.912783265f,
+    0.433883727f,  0.900968850f,  -0.458981872f, -0.888445616f, 0.483718902f,  0.875223398f,
+    -0.508075356f, -0.861312628f, 0.532032073f,  0.846724212f,  -0.555570245f, -0.831469595f,
+    0.578671277f,  0.815560877f,  -0.601317108f, -0.799010456f, 0.623489797f,  0.781831503f,
+    -0.645172000f, -0.764037371f, 0.666346550f,  0.745642185f,  -0.686996937f, -0.726660311f,
+    0.707106769f,  0.707106769f,  -0.726660311f, -0.686996937f, 0.745642185f,  0.666346550f,
+    -0.764037371f, -0.645172000f, 0.781831503f,  0.623489797f,  -0.799010456f, -0.601317108f,
+    0.815560877f,  0.578671277f,  -0.831469595f, -0.555570245f, 0.846724212f,  0.532032073f,
+    -0.861312628f, -0.508075356f, 0.875223398f,  0.483718902f,  -0.888445616f, -0.458981872f,
+    0.900968850f,  0.433883727f,  -0.912783265f, -0.408444256f, 0.923879504f,  0.382683426f,
+    -0.934248924f, -0.356621534f, 0.943883359f,  0.330279052f,  -0.952775121f, -0.303676754f,
+    0.960917294f,  0.276835501f,  -0.968303502f, -0.249776483f, 0.974927902f,  0.222520933f,
+    -0.980785251f, -0.195090324f, 0.985871017f,  0.167506218f,  -0.990181148f, -0.139790341f,
+    0.993712187f,  0.111964479f,  -0.996461511f, -0.084050521f, 0.998426795f,  0.056070447f,
+    -0.999606609f, -0.028046256f,
+};
+
 const FLOAT32 ixheaacd_twiddle_table_fft_float[514] = {
     1.00000000000000000000f,  0.99998117528260111000f,
     0.99992470183914450000f,  0.99983058179582340000f,
@@ -2606,4 +3766,1585 @@
                                          {1, 1, -1, 1, 1, -1, 1, 1},
                                          {-1, 1, -1, -1, -1, -1, 1, -1},
                                          {-1, -1, 1, -1, -1, 1, -1, -1},
-                                         {1, -1, 1, 1, 1, 1, -1, 1}};
\ No newline at end of file
+                                         {1, -1, 1, 1, 1, 1, -1, 1}};
+
+const FLOAT32 ixheaacd_sub_samp_qmf_window_coeff_28_36[280 + 360] = {
+    0.000000000000f,  -0.000542621361f, -0.000488583522f, -0.000520001457f, -0.000570539269f,
+    -0.000620978128f, -0.000670987472f, -0.000715773669f, -0.000745512953f, -0.000770621584f,
+    -0.000778765010f, -0.000779523922f, -0.000758759677f, -0.000724509649f, -0.000665041502f,
+    -0.000583710556f, -0.000483743032f, -0.000358602498f, -0.000200519848f, -0.000029492525f,
+    0.000177197973f,  0.000402654434f,  0.000658756529f,  0.000933847099f,  0.001238821540f,
+    0.001564677688f,  0.001898807241f,  0.002257277956f,  0.002620175947f,  0.002994259354f,
+    0.003369919956f,  0.003737597959f,  0.004102611449f,  0.004436464049f,  0.004755367525f,
+    0.005039302167f,  0.005274989177f,  0.005458493251f,  0.005587198306f,  0.005644576624f,
+    0.005611654837f,  0.005493966397f,  0.005271574948f,  0.004934532568f,  0.004476084840f,
+    0.003885571612f,  0.003157114144f,  0.002269380260f,  0.001229724381f,  0.000027600139f,
+    -0.001341713127f, -0.002888793591f, -0.004610527772f, -0.006505282596f, -0.008588129655f,
+    -0.010841125622f, 0.013271821663f,  0.015881109983f,  0.018654156476f,  0.021561963484f,
+    0.024612039328f,  0.027795063332f,  0.031087061390f,  0.034462094307f,  0.037916749716f,
+    0.041409216821f,  0.044928979129f,  0.048434015363f,  0.051901672035f,  0.055296782404f,
+    0.058591566980f,  0.061728458852f,  0.064687669277f,  0.067440338433f,  0.069905869663f,
+    0.072072267532f,  0.073889419436f,  0.075313739479f,  0.076284952462f,  0.076771095395f,
+    0.076735138893f,  0.076111361384f,  0.074861399829f,  0.072952635586f,  0.070353284478f,
+    0.066971510649f,  0.062810622156f,  0.057844031602f,  0.052007704973f,  0.045278843492f,
+    0.037642929703f,  0.029082339257f,  0.019534083083f,  0.009020207450f,  -0.002467962215f,
+    -0.014951020479f, -0.028450148180f, -0.042922731489f, -0.058370642364f, -0.074820943177f,
+    -0.092211194336f, -0.110518477857f, -0.129736796021f, -0.149827122688f, -0.170728057623f,
+    -0.192396819592f, -0.214828416705f, -0.237916424870f, -0.261611491442f, -0.285857290030f,
+    -0.310589224100f, -0.335712105036f, 0.361158996820f,  0.386859893799f,  0.412710726261f,
+    0.438634932041f,  0.464547455311f,  0.490345001221f,  0.515940248966f,  0.541255354881f,
+    0.566157341003f,  0.590581595898f,  0.614434957504f,  0.637616693974f,  0.660021364689f,
+    0.681587100029f,  0.702238857746f,  0.721817433834f,  0.740313649178f,  0.757651746273f,
+    0.773728370667f,  0.788466095924f,  0.801848053932f,  0.813819110394f,  0.824237942696f,
+    0.833155274391f,  0.840528070927f,  0.846274733543f,  0.850387632847f,  0.852874279022f,
+    0.853738546371f,  0.852874219418f,  0.850387632847f,  0.846274673939f,  0.840528011322f,
+    0.833155155182f,  0.824237823486f,  0.813819110394f,  0.801847875118f,  0.788465917110f,
+    0.773728191853f,  0.757651507854f,  0.740313410759f,  0.721817195415f,  0.702238559723f,
+    0.681586861610f,  0.660021066666f,  0.637616395950f,  0.614434659481f,  0.590581297874f,
+    0.566156983376f,  0.541254997253f,  0.515939891338f,  0.490344673395f,  0.464547097683f,
+    0.438634604216f,  0.412710398436f,  0.386859536171f,  -0.361158668995f, -0.335711777210f,
+    -0.310588866472f, -0.285857141018f, -0.261611163616f, -0.237916111946f, -0.214828267694f,
+    -0.192396372557f, -0.170727774501f, -0.149826839566f, -0.129736661911f, -0.110518231988f,
+    -0.092210955918f, -0.074820823967f, -0.058370325714f, -0.042922534049f, -0.028449961916f,
+    -0.014950932935f, -0.002467804123f, 0.009020354599f,  0.019534152001f,  0.029082519934f,
+    0.037643034011f,  0.045278891921f,  0.052007835358f,  0.057844102383f,  0.062810681760f,
+    0.066971540451f,  0.070353344083f,  0.072952665389f,  0.074861414731f,  0.076111383736f,
+    0.076735138893f,  0.076771095395f,  0.076284952462f,  0.075313717127f,  0.073889397085f,
+    0.072072252631f,  0.069905824959f,  0.067440301180f,  0.064687632024f,  0.061728436500f,
+    0.058591522276f,  0.055296737701f,  0.051901649684f,  0.048433944583f,  0.044928930700f,
+    0.041409172118f,  0.037916723639f,  0.034462049603f,  0.031087018549f,  0.027795042843f,
+    0.024611977860f,  0.021561924368f,  0.018654119223f,  0.015881091356f,  -0.013271821663f,
+    -0.010841063224f, -0.008588085882f, -0.006505249068f, -0.004610503558f, -0.002888777293f,
+    -0.001341703231f, 0.000027604519f,  0.001229754183f,  0.002269399818f,  0.003157128114f,
+    0.003885580227f,  0.004476089962f,  0.004934535362f,  0.005271575879f,  0.005493969657f,
+    0.005611656234f,  0.005644577090f,  0.005587196909f,  0.005458491389f,  0.005274987780f,
+    0.005039302167f,  0.004755360540f,  0.004436457064f,  0.004102606326f,  0.003737593070f,
+    0.003369916230f,  0.002994256793f,  0.002620175947f,  0.002257269574f,  0.001898800372f,
+    0.001564672217f,  0.001238817465f,  0.000933844654f,  0.000658755132f,  0.000402654026f,
+    0.000177192909f,  -0.000029495970f, -0.000200522336f, -0.000358604098f, -0.000483744079f,
+    -0.000583711022f, -0.000665041502f, -0.000724510173f, -0.000758760143f, -0.000779524038f,
+    -0.000778765127f, -0.000770621467f, -0.000745512894f, -0.000715773669f, -0.000670986192f,
+    -0.000620977371f, -0.000570538570f, -0.000520000933f, -0.000488583522f, -0.000542622001f,
+
+    0.000000000000f,  -0.000559715787f, -0.000490735692f, -0.000494276523f, -0.000525323092f,
+    -0.000565433234f, -0.000604547502f, -0.000641375547f, -0.000681411824f, -0.000715773669f,
+    -0.000739963143f, -0.000759658345f, -0.000776134315f, -0.000778251328f, -0.000780169561f,
+    -0.000767318823f, -0.000743638200f, -0.000714929076f, -0.000665041502f, -0.000603400229f,
+    -0.000533179555f, -0.000443592493f, -0.000343404361f, -0.000218707515f, -0.000089368215f,
+    0.000056136661f,  0.000224446383f,  0.000402654026f,  0.000598782441f,  0.000809714838f,
+    0.001034070854f,  0.001272506313f,  0.001527202898f,  0.001785487286f,  0.002056134166f,
+    0.002337466693f,  0.002620175947f,  0.002911411924f,  0.003202219727f,  0.003494867589f,
+    0.003778209677f,  0.004064061213f,  0.004324190319f,  0.004583056550f,  0.004820034839f,
+    0.005039302167f,  0.005222698674f,  0.005387451034f,  0.005507593509f,  0.005596942734f,
+    0.005642913748f,  0.005630714353f,  0.005568923429f,  0.005455049220f,  0.005271575879f,
+    0.005018248223f,  0.004695950076f,  0.004295178223f,  0.003811693750f,  0.003245957894f,
+    0.002582128858f,  0.001827885280f,  0.000977565185f,  0.000027604519f,  -0.001021172851f,
+    -0.002181018004f, -0.003442291170f, -0.004812424537f, -0.006285287905f, -0.007873740047f,
+    -0.009569193237f, -0.011365653016f, 0.013271821663f,  0.015284989960f,  0.017405176535f,
+    0.019609216601f,  0.021893566474f,  0.024266306311f,  0.026719830930f,  0.029248571023f,
+    0.031829249114f,  0.034462094307f,  0.037145402282f,  0.039855118841f,  0.042579848319f,
+    0.045319452882f,  0.048046313226f,  0.050749942660f,  0.053421828896f,  0.056038323790f,
+    0.058591566980f,  0.061042912304f,  0.063400119543f,  0.065628714859f,  0.067729465663f,
+    0.069645397365f,  0.071387805045f,  0.072921045125f,  0.074243679643f,  0.075313732028f,
+    0.076110713184f,  0.076615959406f,  0.076819270849f,  0.076696552336f,  0.076211526990f,
+    0.075348608196f,  0.074099399149f,  0.072434164584f,  0.070353306830f,  0.067788913846f,
+    0.064755402505f,  0.061245746911f,  0.057240899652f,  0.052702348679f,  0.047619495541f,
+    0.041996419430f,  0.035823248327f,  0.029082400724f,  0.021739905700f,  0.013810261153f,
+    0.005301336292f,  -0.003804539563f, -0.013511340134f, -0.023842986673f, -0.034764017910f,
+    -0.046269558370f, -0.058370534331f, -0.071082539856f, -0.084369227290f, -0.098213173449f,
+    -0.112607732415f, -0.127556651831f, -0.143036201596f, -0.159020766616f, -0.175477877259f,
+    -0.192396670580f, -0.209785103798f, -0.227578520775f, -0.245750412345f, -0.264278501272f,
+    -0.283137172461f, -0.302297204733f, -0.321709424257f, -0.341343283653f, 0.361158996820f,
+    0.381133735180f,  0.401205033064f,  0.421350568533f,  0.441515892744f,  0.461671739817f,
+    0.481765180826f,  0.501753628254f,  0.521590352058f,  0.541255354881f,  0.560662448406f,
+    0.579790294170f,  0.598601102829f,  0.617045819759f,  0.635078668594f,  0.652643322945f,
+    0.669715166092f,  0.686256051064f,  0.702238857746f,  0.717556118965f,  0.732231855392f,
+    0.746226549149f,  0.759503602982f,  0.772010207176f,  0.783699750900f,  0.794583916664f,
+    0.804631054401f,  0.813819110394f,  0.822049856186f,  0.829381108284f,  0.835786461830f,
+    0.841250777245f,  0.845719814301f,  0.849197506905f,  0.851689398289f,  0.853206515312f,
+    0.853738546371f,  0.853206515312f,  0.851689338684f,  0.849197506905f,  0.845719814301f,
+    0.841250777245f,  0.835786461830f,  0.829380989075f,  0.822049856186f,  0.813819110394f,
+    0.804631054401f,  0.794583737850f,  0.783699750900f,  0.772010207176f,  0.759503602982f,
+    0.746226549149f,  0.732231616974f,  0.717556118965f,  0.702238857746f,  0.686256051064f,
+    0.669714868069f,  0.652643322945f,  0.635078668594f,  0.617045819759f,  0.598601102829f,
+    0.579789996147f,  0.560662448406f,  0.541255354881f,  0.521590352058f,  0.501753270626f,
+    0.481765180826f,  0.461671739817f,  0.441515892744f,  0.421350568533f,  0.401204675436f,
+    0.381133735180f,  -0.361158996820f, -0.341343283653f, -0.321709245443f, -0.302297025919f,
+    -0.283137172461f, -0.264278501272f, -0.245750576258f, -0.227578371763f, -0.209784954786f,
+    -0.192396670580f, -0.175477877259f, -0.159020632505f, -0.143036067486f, -0.127556651831f,
+    -0.112607732415f, -0.098213292658f, -0.084369115531f, -0.071082428098f, -0.058370534331f,
+    -0.046269558370f, -0.034763921052f, -0.023842897266f, -0.013511340134f, -0.003804539563f,
+    0.005301259924f,  0.013810331002f,  0.021739969030f,  0.029082400724f,  0.035823248327f,
+    0.041996467859f,  0.047619540244f,  0.052702348679f,  0.057240899652f,  0.061245713383f,
+    0.064755432308f,  0.067788936198f,  0.070353306830f,  0.072434164584f,  0.074099414051f,
+    0.075348615646f,  0.076211526990f,  0.076696552336f,  0.076819270849f,  0.076615959406f,
+    0.076110713184f,  0.075313732028f,  0.074243679643f,  0.072921030223f,  0.071387790143f,
+    0.069645397365f,  0.067729465663f,  0.065628737211f,  0.063400097191f,  0.061042893678f,
+    0.058591566980f,  0.056038323790f,  0.053421806544f,  0.050749920309f,  0.048046313226f,
+    0.045319452882f,  0.042579874396f,  0.039855096489f,  0.037145379931f,  0.034462094307f,
+    0.031829249114f,  0.029248548672f,  0.026719808578f,  0.024266306311f,  0.021893566474f,
+    0.019609235227f,  0.017405157909f,  0.015284972265f,  -0.013271821663f, -0.011365660466f,
+    -0.009569208138f, -0.007873761468f, -0.006285255309f, -0.004812399857f, -0.003442274174f,
+    -0.002181007527f, -0.001021168195f, 0.000027604519f,  0.000977561343f,  0.001827878412f,
+    0.002582120011f,  0.003245970467f,  0.003811703064f,  0.004295183811f,  0.004695953336f,
+    0.005018249620f,  0.005271575879f,  0.005455048289f,  0.005568922963f,  0.005630713888f,
+    0.005642912816f,  0.005596941803f,  0.005507592112f,  0.005387450103f,  0.005222697742f,
+    0.005039302167f,  0.004820035771f,  0.004583058413f,  0.004324193578f,  0.004064055160f,
+    0.003778204788f,  0.003494863864f,  0.003202217165f,  0.002911410527f,  0.002620175947f,
+    0.002337468090f,  0.002056136029f,  0.001785490196f,  0.001527197659f,  0.001272502821f,
+    0.001034068293f,  0.000809713092f,  0.000598781568f,  0.000402654026f,  0.000224447082f,
+    0.000056137760f,  -0.000089366637f, -0.000218710265f, -0.000343405962f, -0.000443593453f,
+    -0.000533180195f, -0.000603400520f, -0.000665041502f, -0.000714928901f, -0.000743637909f,
+    -0.000767318590f, -0.000780169561f, -0.000778251269f, -0.000776134082f, -0.000759658054f,
+    -0.000739962969f, -0.000715773669f, -0.000681411941f, -0.000641375838f, -0.000604548026f,
+    -0.000565432478f, -0.000525322452f, -0.000494276232f, -0.000490735809f, -0.000559715729f,
+};
+
+const FLOAT32 ixheaacd_dft_hbe_window_ts_12[13] = {
+    0.000000000000000f, 0.017037086855466f, 0.066987298107781f, 0.146446609406726f,
+    0.250000000000000f, 0.370590477448740f, 0.500000000000000f, 0.629409522551260f,
+    0.750000000000000f, 0.853553390593274f, 0.933012701892219f, 0.982962913144534f,
+    1.000000000000000f
+};
+
+const FLOAT32 ixheaacd_dft_hbe_window_ts_18[19] = {
+    0.000000000000000f, 0.007596123493896f, 0.030153689607046f, 0.066987298107781f,
+    0.116977778440511f, 0.178606195156730f, 0.250000000000000f, 0.328989928337166f,
+    0.413175911166535f, 0.500000000000000f, 0.586824088833465f, 0.671010071662834f,
+    0.750000000000000f, 0.821393804843270f, 0.883022221559489f, 0.933012701892219f,
+    0.969846310392954f, 0.992403876506104f, 1.000000000000000f
+};
+
+const FLOAT32 ixheaacd_sine_pi_n_by_1024[1024] = {
+    0.0000000000f, 0.0030679568f, 0.0061358846f, 0.0092037548f, 0.0122715383f, 0.0153392063f,
+    0.0184067299f, 0.0214740803f, 0.0245412285f, 0.0276081458f, 0.0306748032f, 0.0337411719f,
+    0.0368072229f, 0.0398729276f, 0.0429382569f, 0.0460031821f, 0.0490676743f, 0.0521317047f,
+    0.0551952443f, 0.0582582645f, 0.0613207363f, 0.0643826309f, 0.0674439196f, 0.0705045734f,
+    0.0735645636f, 0.0766238614f, 0.0796824380f, 0.0827402645f, 0.0857973123f, 0.0888535526f,
+    0.0919089565f, 0.0949634953f, 0.0980171403f, 0.1010698628f, 0.1041216339f, 0.1071724250f,
+    0.1102222073f, 0.1132709522f, 0.1163186309f, 0.1193652148f, 0.1224106752f, 0.1254549834f,
+    0.1284981108f, 0.1315400287f, 0.1345807085f, 0.1376201216f, 0.1406582393f, 0.1436950332f,
+    0.1467304745f, 0.1497645347f, 0.1527971853f, 0.1558283977f, 0.1588581433f, 0.1618863938f,
+    0.1649131205f, 0.1679382950f, 0.1709618888f, 0.1739838734f, 0.1770042204f, 0.1800229014f,
+    0.1830398880f, 0.1860551517f, 0.1890686641f, 0.1920803970f, 0.1950903220f, 0.1980984107f,
+    0.2011046348f, 0.2041089661f, 0.2071113762f, 0.2101118369f, 0.2131103199f, 0.2161067971f,
+    0.2191012402f, 0.2220936210f, 0.2250839114f, 0.2280720832f, 0.2310581083f, 0.2340419586f,
+    0.2370236060f, 0.2400030224f, 0.2429801799f, 0.2459550503f, 0.2489276057f, 0.2518978182f,
+    0.2548656596f, 0.2578311022f, 0.2607941179f, 0.2637546790f, 0.2667127575f, 0.2696683256f,
+    0.2726213554f, 0.2755718193f, 0.2785196894f, 0.2814649379f, 0.2844075372f, 0.2873474595f,
+    0.2902846773f, 0.2932191627f, 0.2961508882f, 0.2990798263f, 0.3020059493f, 0.3049292297f,
+    0.3078496400f, 0.3107671527f, 0.3136817404f, 0.3165933756f, 0.3195020308f, 0.3224076788f,
+    0.3253102922f, 0.3282098436f, 0.3311063058f, 0.3339996514f, 0.3368898534f, 0.3397768844f,
+    0.3426607173f, 0.3455413250f, 0.3484186802f, 0.3512927561f, 0.3541635254f, 0.3570309612f,
+    0.3598950365f, 0.3627557244f, 0.3656129978f, 0.3684668300f, 0.3713171940f, 0.3741640630f,
+    0.3770074102f, 0.3798472089f, 0.3826834324f, 0.3855160538f, 0.3883450467f, 0.3911703843f,
+    0.3939920401f, 0.3968099874f, 0.3996241998f, 0.4024346509f, 0.4052413140f, 0.4080441629f,
+    0.4108431711f, 0.4136383122f, 0.4164295601f, 0.4192168884f, 0.4220002708f, 0.4247796812f,
+    0.4275550934f, 0.4303264813f, 0.4330938189f, 0.4358570799f, 0.4386162385f, 0.4413712687f,
+    0.4441221446f, 0.4468688402f, 0.4496113297f, 0.4523495872f, 0.4550835871f, 0.4578133036f,
+    0.4605387110f, 0.4632597836f, 0.4659764958f, 0.4686888220f, 0.4713967368f, 0.4741002147f,
+    0.4767992301f, 0.4794937577f, 0.4821837721f, 0.4848692480f, 0.4875501601f, 0.4902264833f,
+    0.4928981922f, 0.4955652618f, 0.4982276670f, 0.5008853826f, 0.5035383837f, 0.5061866453f,
+    0.5088301425f, 0.5114688504f, 0.5141027442f, 0.5167317990f, 0.5193559902f, 0.5219752929f,
+    0.5245896827f, 0.5271991348f, 0.5298036247f, 0.5324031279f, 0.5349976199f, 0.5375870763f,
+    0.5401714727f, 0.5427507849f, 0.5453249884f, 0.5478940592f, 0.5504579729f, 0.5530167056f,
+    0.5555702330f, 0.5581185312f, 0.5606615762f, 0.5631993440f, 0.5657318108f, 0.5682589527f,
+    0.5707807459f, 0.5732971667f, 0.5758081914f, 0.5783137964f, 0.5808139581f, 0.5833086529f,
+    0.5857978575f, 0.5882815482f, 0.5907597019f, 0.5932322950f, 0.5956993045f, 0.5981607070f,
+    0.6006164794f, 0.6030665985f, 0.6055110414f, 0.6079497850f, 0.6103828063f, 0.6128100824f,
+    0.6152315906f, 0.6176473079f, 0.6200572118f, 0.6224612794f, 0.6248594881f, 0.6272518155f,
+    0.6296382389f, 0.6320187359f, 0.6343932842f, 0.6367618612f, 0.6391244449f, 0.6414810128f,
+    0.6438315429f, 0.6461760130f, 0.6485144010f, 0.6508466850f, 0.6531728430f, 0.6554928530f,
+    0.6578066933f, 0.6601143421f, 0.6624157776f, 0.6647109782f, 0.6669999223f, 0.6692825883f,
+    0.6715589548f, 0.6738290004f, 0.6760927036f, 0.6783500431f, 0.6806009978f, 0.6828455464f,
+    0.6850836678f, 0.6873153409f, 0.6895405447f, 0.6917592584f, 0.6939714609f, 0.6961771315f,
+    0.6983762494f, 0.7005687939f, 0.7027547445f, 0.7049340804f, 0.7071067812f, 0.7092728264f,
+    0.7114321957f, 0.7135848688f, 0.7157308253f, 0.7178700451f, 0.7200025080f, 0.7221281939f,
+    0.7242470830f, 0.7263591551f, 0.7284643904f, 0.7305627692f, 0.7326542717f, 0.7347388781f,
+    0.7368165689f, 0.7388873245f, 0.7409511254f, 0.7430079521f, 0.7450577854f, 0.7471006060f,
+    0.7491363945f, 0.7511651319f, 0.7531867990f, 0.7552013769f, 0.7572088465f, 0.7592091890f,
+    0.7612023855f, 0.7631884173f, 0.7651672656f, 0.7671389119f, 0.7691033376f, 0.7710605243f,
+    0.7730104534f, 0.7749531066f, 0.7768884657f, 0.7788165124f, 0.7807372286f, 0.7826505962f,
+    0.7845565972f, 0.7864552136f, 0.7883464276f, 0.7902302214f, 0.7921065773f, 0.7939754776f,
+    0.7958369046f, 0.7976908409f, 0.7995372691f, 0.8013761717f, 0.8032075315f, 0.8050313311f,
+    0.8068475535f, 0.8086561816f, 0.8104571983f, 0.8122505866f, 0.8140363297f, 0.8158144108f,
+    0.8175848132f, 0.8193475201f, 0.8211025150f, 0.8228497814f, 0.8245893028f, 0.8263210628f,
+    0.8280450453f, 0.8297612338f, 0.8314696123f, 0.8331701647f, 0.8348628750f, 0.8365477272f,
+    0.8382247056f, 0.8398937942f, 0.8415549774f, 0.8432082396f, 0.8448535652f, 0.8464909388f,
+    0.8481203448f, 0.8497417680f, 0.8513551931f, 0.8529606049f, 0.8545579884f, 0.8561473284f,
+    0.8577286100f, 0.8593018184f, 0.8608669386f, 0.8624239561f, 0.8639728561f, 0.8655136241f,
+    0.8670462455f, 0.8685707060f, 0.8700869911f, 0.8715950867f, 0.8730949784f, 0.8745866523f,
+    0.8760700942f, 0.8775452902f, 0.8790122264f, 0.8804708891f, 0.8819212643f, 0.8833633387f,
+    0.8847970984f, 0.8862225301f, 0.8876396204f, 0.8890483559f, 0.8904487232f, 0.8918407094f,
+    0.8932243012f, 0.8945994856f, 0.8959662498f, 0.8973245807f, 0.8986744657f, 0.9000158920f,
+    0.9013488470f, 0.9026733182f, 0.9039892931f, 0.9052967593f, 0.9065957045f, 0.9078861165f,
+    0.9091679831f, 0.9104412923f, 0.9117060320f, 0.9129621904f, 0.9142097557f, 0.9154487161f,
+    0.9166790599f, 0.9179007756f, 0.9191138517f, 0.9203182767f, 0.9215140393f, 0.9227011283f,
+    0.9238795325f, 0.9250492408f, 0.9262102421f, 0.9273625257f, 0.9285060805f, 0.9296408958f,
+    0.9307669611f, 0.9318842656f, 0.9329927988f, 0.9340925504f, 0.9351835099f, 0.9362656672f,
+    0.9373390119f, 0.9384035341f, 0.9394592236f, 0.9405060706f, 0.9415440652f, 0.9425731976f,
+    0.9435934582f, 0.9446048373f, 0.9456073254f, 0.9466009131f, 0.9475855910f, 0.9485613499f,
+    0.9495281806f, 0.9504860739f, 0.9514350210f, 0.9523750127f, 0.9533060404f, 0.9542280951f,
+    0.9551411683f, 0.9560452513f, 0.9569403357f, 0.9578264130f, 0.9587034749f, 0.9595715131f,
+    0.9604305194f, 0.9612804858f, 0.9621214043f, 0.9629532669f, 0.9637760658f, 0.9645897933f,
+    0.9653944417f, 0.9661900034f, 0.9669764710f, 0.9677538371f, 0.9685220943f, 0.9692812354f,
+    0.9700312532f, 0.9707721407f, 0.9715038910f, 0.9722264971f, 0.9729399522f, 0.9736442497f,
+    0.9743393828f, 0.9750253451f, 0.9757021300f, 0.9763697313f, 0.9770281427f, 0.9776773578f,
+    0.9783173707f, 0.9789481753f, 0.9795697657f, 0.9801821360f, 0.9807852804f, 0.9813791933f,
+    0.9819638691f, 0.9825393023f, 0.9831054874f, 0.9836624192f, 0.9842100924f, 0.9847485018f,
+    0.9852776424f, 0.9857975092f, 0.9863080972f, 0.9868094018f, 0.9873014182f, 0.9877841416f,
+    0.9882575677f, 0.9887216920f, 0.9891765100f, 0.9896220175f, 0.9900582103f, 0.9904850843f,
+    0.9909026354f, 0.9913108598f, 0.9917097537f, 0.9920993131f, 0.9924795346f, 0.9928504145f,
+    0.9932119492f, 0.9935641355f, 0.9939069700f, 0.9942404495f, 0.9945645707f, 0.9948793308f,
+    0.9951847267f, 0.9954807555f, 0.9957674145f, 0.9960447009f, 0.9963126122f, 0.9965711458f,
+    0.9968202993f, 0.9970600703f, 0.9972904567f, 0.9975114561f, 0.9977230666f, 0.9979252862f,
+    0.9981181129f, 0.9983015449f, 0.9984755806f, 0.9986402182f, 0.9987954562f, 0.9989412932f,
+    0.9990777278f, 0.9992047586f, 0.9993223846f, 0.9994306046f, 0.9995294175f, 0.9996188225f,
+    0.9996988187f, 0.9997694054f, 0.9998305818f, 0.9998823475f, 0.9999247018f, 0.9999576446f,
+    0.9999811753f, 0.9999952938f, 1.0000000000f, 0.9999952938f, 0.9999811753f, 0.9999576446f,
+    0.9999247018f, 0.9998823475f, 0.9998305818f, 0.9997694054f, 0.9996988187f, 0.9996188225f,
+    0.9995294175f, 0.9994306046f, 0.9993223846f, 0.9992047586f, 0.9990777278f, 0.9989412932f,
+    0.9987954562f, 0.9986402182f, 0.9984755806f, 0.9983015449f, 0.9981181129f, 0.9979252862f,
+    0.9977230666f, 0.9975114561f, 0.9972904567f, 0.9970600703f, 0.9968202993f, 0.9965711458f,
+    0.9963126122f, 0.9960447009f, 0.9957674145f, 0.9954807555f, 0.9951847267f, 0.9948793308f,
+    0.9945645707f, 0.9942404495f, 0.9939069700f, 0.9935641355f, 0.9932119492f, 0.9928504145f,
+    0.9924795346f, 0.9920993131f, 0.9917097537f, 0.9913108598f, 0.9909026354f, 0.9904850843f,
+    0.9900582103f, 0.9896220175f, 0.9891765100f, 0.9887216920f, 0.9882575677f, 0.9877841416f,
+    0.9873014182f, 0.9868094018f, 0.9863080972f, 0.9857975092f, 0.9852776424f, 0.9847485018f,
+    0.9842100924f, 0.9836624192f, 0.9831054874f, 0.9825393023f, 0.9819638691f, 0.9813791933f,
+    0.9807852804f, 0.9801821360f, 0.9795697657f, 0.9789481753f, 0.9783173707f, 0.9776773578f,
+    0.9770281427f, 0.9763697313f, 0.9757021300f, 0.9750253451f, 0.9743393828f, 0.9736442497f,
+    0.9729399522f, 0.9722264971f, 0.9715038910f, 0.9707721407f, 0.9700312532f, 0.9692812354f,
+    0.9685220943f, 0.9677538371f, 0.9669764710f, 0.9661900034f, 0.9653944417f, 0.9645897933f,
+    0.9637760658f, 0.9629532669f, 0.9621214043f, 0.9612804858f, 0.9604305194f, 0.9595715131f,
+    0.9587034749f, 0.9578264130f, 0.9569403357f, 0.9560452513f, 0.9551411683f, 0.9542280951f,
+    0.9533060404f, 0.9523750127f, 0.9514350210f, 0.9504860739f, 0.9495281806f, 0.9485613499f,
+    0.9475855910f, 0.9466009131f, 0.9456073254f, 0.9446048373f, 0.9435934582f, 0.9425731976f,
+    0.9415440652f, 0.9405060706f, 0.9394592236f, 0.9384035341f, 0.9373390119f, 0.9362656672f,
+    0.9351835099f, 0.9340925504f, 0.9329927988f, 0.9318842656f, 0.9307669611f, 0.9296408958f,
+    0.9285060805f, 0.9273625257f, 0.9262102421f, 0.9250492408f, 0.9238795325f, 0.9227011283f,
+    0.9215140393f, 0.9203182767f, 0.9191138517f, 0.9179007756f, 0.9166790599f, 0.9154487161f,
+    0.9142097557f, 0.9129621904f, 0.9117060320f, 0.9104412923f, 0.9091679831f, 0.9078861165f,
+    0.9065957045f, 0.9052967593f, 0.9039892931f, 0.9026733182f, 0.9013488470f, 0.9000158920f,
+    0.8986744657f, 0.8973245807f, 0.8959662498f, 0.8945994856f, 0.8932243012f, 0.8918407094f,
+    0.8904487232f, 0.8890483559f, 0.8876396204f, 0.8862225301f, 0.8847970984f, 0.8833633387f,
+    0.8819212643f, 0.8804708891f, 0.8790122264f, 0.8775452902f, 0.8760700942f, 0.8745866523f,
+    0.8730949784f, 0.8715950867f, 0.8700869911f, 0.8685707060f, 0.8670462455f, 0.8655136241f,
+    0.8639728561f, 0.8624239561f, 0.8608669386f, 0.8593018184f, 0.8577286100f, 0.8561473284f,
+    0.8545579884f, 0.8529606049f, 0.8513551931f, 0.8497417680f, 0.8481203448f, 0.8464909388f,
+    0.8448535652f, 0.8432082396f, 0.8415549774f, 0.8398937942f, 0.8382247056f, 0.8365477272f,
+    0.8348628750f, 0.8331701647f, 0.8314696123f, 0.8297612338f, 0.8280450453f, 0.8263210628f,
+    0.8245893028f, 0.8228497814f, 0.8211025150f, 0.8193475201f, 0.8175848132f, 0.8158144108f,
+    0.8140363297f, 0.8122505866f, 0.8104571983f, 0.8086561816f, 0.8068475535f, 0.8050313311f,
+    0.8032075315f, 0.8013761717f, 0.7995372691f, 0.7976908409f, 0.7958369046f, 0.7939754776f,
+    0.7921065773f, 0.7902302214f, 0.7883464276f, 0.7864552136f, 0.7845565972f, 0.7826505962f,
+    0.7807372286f, 0.7788165124f, 0.7768884657f, 0.7749531066f, 0.7730104534f, 0.7710605243f,
+    0.7691033376f, 0.7671389119f, 0.7651672656f, 0.7631884173f, 0.7612023855f, 0.7592091890f,
+    0.7572088465f, 0.7552013769f, 0.7531867990f, 0.7511651319f, 0.7491363945f, 0.7471006060f,
+    0.7450577854f, 0.7430079521f, 0.7409511254f, 0.7388873245f, 0.7368165689f, 0.7347388781f,
+    0.7326542717f, 0.7305627692f, 0.7284643904f, 0.7263591551f, 0.7242470830f, 0.7221281939f,
+    0.7200025080f, 0.7178700451f, 0.7157308253f, 0.7135848688f, 0.7114321957f, 0.7092728264f,
+    0.7071067812f, 0.7049340804f, 0.7027547445f, 0.7005687939f, 0.6983762494f, 0.6961771315f,
+    0.6939714609f, 0.6917592584f, 0.6895405447f, 0.6873153409f, 0.6850836678f, 0.6828455464f,
+    0.6806009978f, 0.6783500431f, 0.6760927036f, 0.6738290004f, 0.6715589548f, 0.6692825883f,
+    0.6669999223f, 0.6647109782f, 0.6624157776f, 0.6601143421f, 0.6578066933f, 0.6554928530f,
+    0.6531728430f, 0.6508466850f, 0.6485144010f, 0.6461760130f, 0.6438315429f, 0.6414810128f,
+    0.6391244449f, 0.6367618612f, 0.6343932842f, 0.6320187359f, 0.6296382389f, 0.6272518155f,
+    0.6248594881f, 0.6224612794f, 0.6200572118f, 0.6176473079f, 0.6152315906f, 0.6128100824f,
+    0.6103828063f, 0.6079497850f, 0.6055110414f, 0.6030665985f, 0.6006164794f, 0.5981607070f,
+    0.5956993045f, 0.5932322950f, 0.5907597019f, 0.5882815482f, 0.5857978575f, 0.5833086529f,
+    0.5808139581f, 0.5783137964f, 0.5758081914f, 0.5732971667f, 0.5707807459f, 0.5682589527f,
+    0.5657318108f, 0.5631993440f, 0.5606615762f, 0.5581185312f, 0.5555702330f, 0.5530167056f,
+    0.5504579729f, 0.5478940592f, 0.5453249884f, 0.5427507849f, 0.5401714727f, 0.5375870763f,
+    0.5349976199f, 0.5324031279f, 0.5298036247f, 0.5271991348f, 0.5245896827f, 0.5219752929f,
+    0.5193559902f, 0.5167317990f, 0.5141027442f, 0.5114688504f, 0.5088301425f, 0.5061866453f,
+    0.5035383837f, 0.5008853826f, 0.4982276670f, 0.4955652618f, 0.4928981922f, 0.4902264833f,
+    0.4875501601f, 0.4848692480f, 0.4821837721f, 0.4794937577f, 0.4767992301f, 0.4741002147f,
+    0.4713967368f, 0.4686888220f, 0.4659764958f, 0.4632597836f, 0.4605387110f, 0.4578133036f,
+    0.4550835871f, 0.4523495872f, 0.4496113297f, 0.4468688402f, 0.4441221446f, 0.4413712687f,
+    0.4386162385f, 0.4358570799f, 0.4330938189f, 0.4303264813f, 0.4275550934f, 0.4247796812f,
+    0.4220002708f, 0.4192168884f, 0.4164295601f, 0.4136383122f, 0.4108431711f, 0.4080441629f,
+    0.4052413140f, 0.4024346509f, 0.3996241998f, 0.3968099874f, 0.3939920401f, 0.3911703843f,
+    0.3883450467f, 0.3855160538f, 0.3826834324f, 0.3798472089f, 0.3770074102f, 0.3741640630f,
+    0.3713171940f, 0.3684668300f, 0.3656129978f, 0.3627557244f, 0.3598950365f, 0.3570309612f,
+    0.3541635254f, 0.3512927561f, 0.3484186802f, 0.3455413250f, 0.3426607173f, 0.3397768844f,
+    0.3368898534f, 0.3339996514f, 0.3311063058f, 0.3282098436f, 0.3253102922f, 0.3224076788f,
+    0.3195020308f, 0.3165933756f, 0.3136817404f, 0.3107671527f, 0.3078496400f, 0.3049292297f,
+    0.3020059493f, 0.2990798263f, 0.2961508882f, 0.2932191627f, 0.2902846773f, 0.2873474595f,
+    0.2844075372f, 0.2814649379f, 0.2785196894f, 0.2755718193f, 0.2726213554f, 0.2696683256f,
+    0.2667127575f, 0.2637546790f, 0.2607941179f, 0.2578311022f, 0.2548656596f, 0.2518978182f,
+    0.2489276057f, 0.2459550503f, 0.2429801799f, 0.2400030224f, 0.2370236060f, 0.2340419586f,
+    0.2310581083f, 0.2280720832f, 0.2250839114f, 0.2220936210f, 0.2191012402f, 0.2161067971f,
+    0.2131103199f, 0.2101118369f, 0.2071113762f, 0.2041089661f, 0.2011046348f, 0.1980984107f,
+    0.1950903220f, 0.1920803970f, 0.1890686641f, 0.1860551517f, 0.1830398880f, 0.1800229014f,
+    0.1770042204f, 0.1739838734f, 0.1709618888f, 0.1679382950f, 0.1649131205f, 0.1618863938f,
+    0.1588581433f, 0.1558283977f, 0.1527971853f, 0.1497645347f, 0.1467304745f, 0.1436950332f,
+    0.1406582393f, 0.1376201216f, 0.1345807085f, 0.1315400287f, 0.1284981108f, 0.1254549834f,
+    0.1224106752f, 0.1193652148f, 0.1163186309f, 0.1132709522f, 0.1102222073f, 0.1071724250f,
+    0.1041216339f, 0.1010698628f, 0.0980171403f, 0.0949634953f, 0.0919089565f, 0.0888535526f,
+    0.0857973123f, 0.0827402645f, 0.0796824380f, 0.0766238614f, 0.0735645636f, 0.0705045734f,
+    0.0674439196f, 0.0643826309f, 0.0613207363f, 0.0582582645f, 0.0551952443f, 0.0521317047f,
+    0.0490676743f, 0.0460031821f, 0.0429382569f, 0.0398729276f, 0.0368072229f, 0.0337411719f,
+    0.0306748032f, 0.0276081458f, 0.0245412285f, 0.0214740803f, 0.0184067299f, 0.0153392063f,
+    0.0122715383f, 0.0092037548f, 0.0061358846f, 0.0030679568f,
+};
+
+const FLOAT32 ixheaacd_sine_pi_n_by_960[960] = {
+    0.0000000000f, 0.0032724865f, 0.0065449380f, 0.0098173193f, 0.0130895956f, 0.0163617316f,
+    0.0196336925f, 0.0229054430f, 0.0261769483f, 0.0294481732f, 0.0327190828f, 0.0359896420f,
+    0.0392598158f, 0.0425295691f, 0.0457988669f, 0.0490676743f, 0.0523359562f, 0.0556036777f,
+    0.0588708037f, 0.0621372992f, 0.0654031292f, 0.0686682589f, 0.0719326532f, 0.0751962771f,
+    0.0784590957f, 0.0817210741f, 0.0849821774f, 0.0882423705f, 0.0915016187f, 0.0947598869f,
+    0.0980171403f, 0.1012733441f, 0.1045284633f, 0.1077824630f, 0.1110353086f, 0.1142869650f,
+    0.1175373975f, 0.1207865712f, 0.1240344515f, 0.1272810034f, 0.1305261922f, 0.1337699832f,
+    0.1370123417f, 0.1402532328f, 0.1434926220f, 0.1467304745f, 0.1499667556f, 0.1532014306f,
+    0.1564344650f, 0.1596658242f, 0.1628954734f, 0.1661233781f, 0.1693495038f, 0.1725738160f,
+    0.1757962799f, 0.1790168613f, 0.1822355255f, 0.1854522381f, 0.1886669647f, 0.1918796708f,
+    0.1950903220f, 0.1982988840f, 0.2015053223f, 0.2047096027f, 0.2079116908f, 0.2111115524f,
+    0.2143091531f, 0.2175044587f, 0.2206974350f, 0.2238880479f, 0.2270762630f, 0.2302620464f,
+    0.2334453639f, 0.2366261813f, 0.2398044647f, 0.2429801799f, 0.2461532930f, 0.2493237701f,
+    0.2524915770f, 0.2556566800f, 0.2588190451f, 0.2619786385f, 0.2651354262f, 0.2682893746f,
+    0.2714404499f, 0.2745886182f, 0.2777338459f, 0.2808760993f, 0.2840153447f, 0.2871515486f,
+    0.2902846773f, 0.2934146972f, 0.2965415750f, 0.2996652770f, 0.3027857698f, 0.3059030201f,
+    0.3090169944f, 0.3121276593f, 0.3152349816f, 0.3183389281f, 0.3214394653f, 0.3245365602f,
+    0.3276301796f, 0.3307202903f, 0.3338068592f, 0.3368898534f, 0.3399692397f, 0.3430449853f,
+    0.3461170571f, 0.3491854222f, 0.3522500479f, 0.3553109013f, 0.3583679495f, 0.3614211600f,
+    0.3644704999f, 0.3675159366f, 0.3705574375f, 0.3735949701f, 0.3766285017f, 0.3796579999f,
+    0.3826834324f, 0.3857047666f, 0.3887219702f, 0.3917350109f, 0.3947438564f, 0.3977484745f,
+    0.4007488331f, 0.4037449000f, 0.4067366431f, 0.4097240303f, 0.4127070298f, 0.4156856095f,
+    0.4186597375f, 0.4216293821f, 0.4245945113f, 0.4275550934f, 0.4305110968f, 0.4334624898f,
+    0.4364092407f, 0.4393513180f, 0.4422886902f, 0.4452213259f, 0.4481491936f, 0.4510722620f,
+    0.4539904997f, 0.4569038756f, 0.4598123584f, 0.4627159170f, 0.4656145203f, 0.4685081372f,
+    0.4713967368f, 0.4742802881f, 0.4771587603f, 0.4800321224f, 0.4829003438f, 0.4857633937f,
+    0.4886212415f, 0.4914738565f, 0.4943212083f, 0.4971632663f, 0.5000000000f, 0.5028313791f,
+    0.5056573734f, 0.5084779524f, 0.5112930861f, 0.5141027442f, 0.5169068967f, 0.5197055135f,
+    0.5224985647f, 0.5252860204f, 0.5280678507f, 0.5308440257f, 0.5336145159f, 0.5363792915f,
+    0.5391383229f, 0.5418915806f, 0.5446390350f, 0.5473806568f, 0.5501164166f, 0.5528462851f,
+    0.5555702330f, 0.5582882313f, 0.5610002507f, 0.5637062622f, 0.5664062369f, 0.5691001459f,
+    0.5717879602f, 0.5744696512f, 0.5771451900f, 0.5798145481f, 0.5824776969f, 0.5851346077f,
+    0.5877852523f, 0.5904296021f, 0.5930676290f, 0.5956993045f, 0.5983246006f, 0.6009434891f,
+    0.6035559420f, 0.6061619312f, 0.6087614290f, 0.6113544074f, 0.6139408388f, 0.6165206953f,
+    0.6190939493f, 0.6216605734f, 0.6242205399f, 0.6267738216f, 0.6293203910f, 0.6318602210f,
+    0.6343932842f, 0.6369195535f, 0.6394390020f, 0.6419516026f, 0.6444573284f, 0.6469561525f,
+    0.6494480483f, 0.6519329891f, 0.6544109481f, 0.6568818989f, 0.6593458151f, 0.6618026702f,
+    0.6642524379f, 0.6666950920f, 0.6691306064f, 0.6715589548f, 0.6739801115f, 0.6763940503f,
+    0.6788007455f, 0.6812001713f, 0.6835923020f, 0.6859771120f, 0.6883545757f, 0.6907246677f,
+    0.6930873625f, 0.6954426350f, 0.6977904598f, 0.7001308119f, 0.7024636661f, 0.7047889975f,
+    0.7071067812f, 0.7094169923f, 0.7117196062f, 0.7140145981f, 0.7163019434f, 0.7185816178f,
+    0.7208535967f, 0.7231178559f, 0.7253743710f, 0.7276231180f, 0.7298640727f, 0.7320972112f,
+    0.7343225094f, 0.7365399437f, 0.7387494902f, 0.7409511254f, 0.7431448255f, 0.7453305671f,
+    0.7475083269f, 0.7496780814f, 0.7518398075f, 0.7539934820f, 0.7561390818f, 0.7582765840f,
+    0.7604059656f, 0.7625272039f, 0.7646402762f, 0.7667451597f, 0.7688418321f, 0.7709302707f,
+    0.7730104534f, 0.7750823577f, 0.7771459615f, 0.7792012426f, 0.7812481792f, 0.7832867492f,
+    0.7853169309f, 0.7873387024f, 0.7893520422f, 0.7913569286f, 0.7933533403f, 0.7953412558f,
+    0.7973206538f, 0.7992915131f, 0.8012538127f, 0.8032075315f, 0.8051526486f, 0.8070891431f,
+    0.8090169944f, 0.8109361817f, 0.8128466846f, 0.8147484825f, 0.8166415552f, 0.8185258822f,
+    0.8204014435f, 0.8222682190f, 0.8241261886f, 0.8259753325f, 0.8278156309f, 0.8296470640f,
+    0.8314696123f, 0.8332832562f, 0.8350879763f, 0.8368837533f, 0.8386705679f, 0.8404484011f,
+    0.8422172337f, 0.8439770469f, 0.8457278217f, 0.8474695395f, 0.8492021815f, 0.8509257293f,
+    0.8526401644f, 0.8543454683f, 0.8560416229f, 0.8577286100f, 0.8594064115f, 0.8610750095f,
+    0.8627343860f, 0.8643845233f, 0.8660254038f, 0.8676570098f, 0.8692793239f, 0.8708923288f,
+    0.8724960071f, 0.8740903416f, 0.8756753154f, 0.8772509113f, 0.8788171127f, 0.8803739026f,
+    0.8819212643f, 0.8834591815f, 0.8849876375f, 0.8865066159f, 0.8880161007f, 0.8895160754f,
+    0.8910065242f, 0.8924874310f, 0.8939587800f, 0.8954205554f, 0.8968727415f, 0.8983153229f,
+    0.8997482841f, 0.9011716096f, 0.9025852843f, 0.9039892931f, 0.9053836209f, 0.9067682527f,
+    0.9081431738f, 0.9095083694f, 0.9108638249f, 0.9122095258f, 0.9135454576f, 0.9148716061f,
+    0.9161879571f, 0.9174944964f, 0.9187912101f, 0.9200780843f, 0.9213551052f, 0.9226222591f,
+    0.9238795325f, 0.9251269119f, 0.9263643839f, 0.9275919353f, 0.9288095529f, 0.9300172237f,
+    0.9312149348f, 0.9324026733f, 0.9335804265f, 0.9347481818f, 0.9359059268f, 0.9370536489f,
+    0.9381913359f, 0.9393189757f, 0.9404365561f, 0.9415440652f, 0.9426414911f, 0.9437288221f,
+    0.9448060465f, 0.9458731528f, 0.9469301295f, 0.9479769654f, 0.9490136492f, 0.9500401698f,
+    0.9510565163f, 0.9520626777f, 0.9530586433f, 0.9540444024f, 0.9550199445f, 0.9559852590f,
+    0.9569403357f, 0.9578851644f, 0.9588197349f, 0.9597440372f, 0.9606580614f, 0.9615617977f,
+    0.9624552365f, 0.9633383681f, 0.9642111832f, 0.9650736723f, 0.9659258263f, 0.9667676360f,
+    0.9675990924f, 0.9684201865f, 0.9692309097f, 0.9700312532f, 0.9708212084f, 0.9716007669f,
+    0.9723699204f, 0.9731286606f, 0.9738769793f, 0.9746148686f, 0.9753423205f, 0.9760593273f,
+    0.9767658813f, 0.9774619749f, 0.9781476007f, 0.9788227513f, 0.9794874196f, 0.9801415982f,
+    0.9807852804f, 0.9814184591f, 0.9820411277f, 0.9826532793f, 0.9832549076f, 0.9838460059f,
+    0.9844265681f, 0.9849965878f, 0.9855560591f, 0.9861049758f, 0.9866433321f, 0.9871711222f,
+    0.9876883406f, 0.9881949816f, 0.9886910398f, 0.9891765100f, 0.9896513868f, 0.9901156653f,
+    0.9905693404f, 0.9910124074f, 0.9914448614f, 0.9918666978f, 0.9922779121f, 0.9926784999f,
+    0.9930684570f, 0.9934477790f, 0.9938164621f, 0.9941745021f, 0.9945218954f, 0.9948586381f,
+    0.9951847267f, 0.9955001576f, 0.9958049276f, 0.9960990333f, 0.9963824715f, 0.9966552393f,
+    0.9969173337f, 0.9971687520f, 0.9974094913f, 0.9976395492f, 0.9978589232f, 0.9980676110f,
+    0.9982656102f, 0.9984529188f, 0.9986295348f, 0.9987954562f, 0.9989506814f, 0.9990952086f,
+    0.9992290362f, 0.9993521630f, 0.9994645875f, 0.9995663085f, 0.9996573250f, 0.9997376359f,
+    0.9998072405f, 0.9998661379f, 0.9999143276f, 0.9999518090f, 0.9999785817f, 0.9999946454f,
+    1.0000000000f, 0.9999946454f, 0.9999785817f, 0.9999518090f, 0.9999143276f, 0.9998661379f,
+    0.9998072405f, 0.9997376359f, 0.9996573250f, 0.9995663085f, 0.9994645875f, 0.9993521630f,
+    0.9992290362f, 0.9990952086f, 0.9989506814f, 0.9987954562f, 0.9986295348f, 0.9984529188f,
+    0.9982656102f, 0.9980676110f, 0.9978589232f, 0.9976395492f, 0.9974094913f, 0.9971687520f,
+    0.9969173337f, 0.9966552393f, 0.9963824715f, 0.9960990333f, 0.9958049276f, 0.9955001576f,
+    0.9951847267f, 0.9948586381f, 0.9945218954f, 0.9941745021f, 0.9938164621f, 0.9934477790f,
+    0.9930684570f, 0.9926784999f, 0.9922779121f, 0.9918666978f, 0.9914448614f, 0.9910124074f,
+    0.9905693404f, 0.9901156653f, 0.9896513868f, 0.9891765100f, 0.9886910398f, 0.9881949816f,
+    0.9876883406f, 0.9871711222f, 0.9866433321f, 0.9861049758f, 0.9855560591f, 0.9849965878f,
+    0.9844265681f, 0.9838460059f, 0.9832549076f, 0.9826532793f, 0.9820411277f, 0.9814184591f,
+    0.9807852804f, 0.9801415982f, 0.9794874196f, 0.9788227513f, 0.9781476007f, 0.9774619749f,
+    0.9767658813f, 0.9760593273f, 0.9753423205f, 0.9746148686f, 0.9738769793f, 0.9731286606f,
+    0.9723699204f, 0.9716007669f, 0.9708212084f, 0.9700312532f, 0.9692309097f, 0.9684201865f,
+    0.9675990924f, 0.9667676360f, 0.9659258263f, 0.9650736723f, 0.9642111832f, 0.9633383681f,
+    0.9624552365f, 0.9615617977f, 0.9606580614f, 0.9597440372f, 0.9588197349f, 0.9578851644f,
+    0.9569403357f, 0.9559852590f, 0.9550199445f, 0.9540444024f, 0.9530586433f, 0.9520626777f,
+    0.9510565163f, 0.9500401698f, 0.9490136492f, 0.9479769654f, 0.9469301295f, 0.9458731528f,
+    0.9448060465f, 0.9437288221f, 0.9426414911f, 0.9415440652f, 0.9404365561f, 0.9393189757f,
+    0.9381913359f, 0.9370536489f, 0.9359059268f, 0.9347481818f, 0.9335804265f, 0.9324026733f,
+    0.9312149348f, 0.9300172237f, 0.9288095529f, 0.9275919353f, 0.9263643839f, 0.9251269119f,
+    0.9238795325f, 0.9226222591f, 0.9213551052f, 0.9200780843f, 0.9187912101f, 0.9174944964f,
+    0.9161879571f, 0.9148716061f, 0.9135454576f, 0.9122095258f, 0.9108638249f, 0.9095083694f,
+    0.9081431738f, 0.9067682527f, 0.9053836209f, 0.9039892931f, 0.9025852843f, 0.9011716096f,
+    0.8997482841f, 0.8983153229f, 0.8968727415f, 0.8954205554f, 0.8939587800f, 0.8924874310f,
+    0.8910065242f, 0.8895160754f, 0.8880161007f, 0.8865066159f, 0.8849876375f, 0.8834591815f,
+    0.8819212643f, 0.8803739026f, 0.8788171127f, 0.8772509113f, 0.8756753154f, 0.8740903416f,
+    0.8724960071f, 0.8708923288f, 0.8692793239f, 0.8676570098f, 0.8660254038f, 0.8643845233f,
+    0.8627343860f, 0.8610750095f, 0.8594064115f, 0.8577286100f, 0.8560416229f, 0.8543454683f,
+    0.8526401644f, 0.8509257293f, 0.8492021815f, 0.8474695395f, 0.8457278217f, 0.8439770469f,
+    0.8422172337f, 0.8404484011f, 0.8386705679f, 0.8368837533f, 0.8350879763f, 0.8332832562f,
+    0.8314696123f, 0.8296470640f, 0.8278156309f, 0.8259753325f, 0.8241261886f, 0.8222682190f,
+    0.8204014435f, 0.8185258822f, 0.8166415552f, 0.8147484825f, 0.8128466846f, 0.8109361817f,
+    0.8090169944f, 0.8070891431f, 0.8051526486f, 0.8032075315f, 0.8012538127f, 0.7992915131f,
+    0.7973206538f, 0.7953412558f, 0.7933533403f, 0.7913569286f, 0.7893520422f, 0.7873387024f,
+    0.7853169309f, 0.7832867492f, 0.7812481792f, 0.7792012426f, 0.7771459615f, 0.7750823577f,
+    0.7730104534f, 0.7709302707f, 0.7688418321f, 0.7667451597f, 0.7646402762f, 0.7625272039f,
+    0.7604059656f, 0.7582765840f, 0.7561390818f, 0.7539934820f, 0.7518398075f, 0.7496780814f,
+    0.7475083269f, 0.7453305671f, 0.7431448255f, 0.7409511254f, 0.7387494902f, 0.7365399437f,
+    0.7343225094f, 0.7320972112f, 0.7298640727f, 0.7276231180f, 0.7253743710f, 0.7231178559f,
+    0.7208535967f, 0.7185816178f, 0.7163019434f, 0.7140145981f, 0.7117196062f, 0.7094169923f,
+    0.7071067812f, 0.7047889975f, 0.7024636661f, 0.7001308119f, 0.6977904598f, 0.6954426350f,
+    0.6930873625f, 0.6907246677f, 0.6883545757f, 0.6859771120f, 0.6835923020f, 0.6812001713f,
+    0.6788007455f, 0.6763940503f, 0.6739801115f, 0.6715589548f, 0.6691306064f, 0.6666950920f,
+    0.6642524379f, 0.6618026702f, 0.6593458151f, 0.6568818989f, 0.6544109481f, 0.6519329891f,
+    0.6494480483f, 0.6469561525f, 0.6444573284f, 0.6419516026f, 0.6394390020f, 0.6369195535f,
+    0.6343932842f, 0.6318602210f, 0.6293203910f, 0.6267738216f, 0.6242205399f, 0.6216605734f,
+    0.6190939493f, 0.6165206953f, 0.6139408388f, 0.6113544074f, 0.6087614290f, 0.6061619312f,
+    0.6035559420f, 0.6009434891f, 0.5983246006f, 0.5956993045f, 0.5930676290f, 0.5904296021f,
+    0.5877852523f, 0.5851346077f, 0.5824776969f, 0.5798145481f, 0.5771451900f, 0.5744696512f,
+    0.5717879602f, 0.5691001459f, 0.5664062369f, 0.5637062622f, 0.5610002507f, 0.5582882313f,
+    0.5555702330f, 0.5528462851f, 0.5501164166f, 0.5473806568f, 0.5446390350f, 0.5418915806f,
+    0.5391383229f, 0.5363792915f, 0.5336145159f, 0.5308440257f, 0.5280678507f, 0.5252860204f,
+    0.5224985647f, 0.5197055135f, 0.5169068967f, 0.5141027442f, 0.5112930861f, 0.5084779524f,
+    0.5056573734f, 0.5028313791f, 0.5000000000f, 0.4971632663f, 0.4943212083f, 0.4914738565f,
+    0.4886212415f, 0.4857633937f, 0.4829003438f, 0.4800321224f, 0.4771587603f, 0.4742802881f,
+    0.4713967368f, 0.4685081372f, 0.4656145203f, 0.4627159170f, 0.4598123584f, 0.4569038756f,
+    0.4539904997f, 0.4510722620f, 0.4481491936f, 0.4452213259f, 0.4422886902f, 0.4393513180f,
+    0.4364092407f, 0.4334624898f, 0.4305110968f, 0.4275550934f, 0.4245945113f, 0.4216293821f,
+    0.4186597375f, 0.4156856095f, 0.4127070298f, 0.4097240303f, 0.4067366431f, 0.4037449000f,
+    0.4007488331f, 0.3977484745f, 0.3947438564f, 0.3917350109f, 0.3887219702f, 0.3857047666f,
+    0.3826834324f, 0.3796579999f, 0.3766285017f, 0.3735949701f, 0.3705574375f, 0.3675159366f,
+    0.3644704999f, 0.3614211600f, 0.3583679495f, 0.3553109013f, 0.3522500479f, 0.3491854222f,
+    0.3461170571f, 0.3430449853f, 0.3399692397f, 0.3368898534f, 0.3338068592f, 0.3307202903f,
+    0.3276301796f, 0.3245365602f, 0.3214394653f, 0.3183389281f, 0.3152349816f, 0.3121276593f,
+    0.3090169944f, 0.3059030201f, 0.3027857698f, 0.2996652770f, 0.2965415750f, 0.2934146972f,
+    0.2902846773f, 0.2871515486f, 0.2840153447f, 0.2808760993f, 0.2777338459f, 0.2745886182f,
+    0.2714404499f, 0.2682893746f, 0.2651354262f, 0.2619786385f, 0.2588190451f, 0.2556566800f,
+    0.2524915770f, 0.2493237701f, 0.2461532930f, 0.2429801799f, 0.2398044647f, 0.2366261813f,
+    0.2334453639f, 0.2302620464f, 0.2270762630f, 0.2238880479f, 0.2206974350f, 0.2175044587f,
+    0.2143091531f, 0.2111115524f, 0.2079116908f, 0.2047096027f, 0.2015053223f, 0.1982988840f,
+    0.1950903220f, 0.1918796708f, 0.1886669647f, 0.1854522381f, 0.1822355255f, 0.1790168613f,
+    0.1757962799f, 0.1725738160f, 0.1693495038f, 0.1661233781f, 0.1628954734f, 0.1596658242f,
+    0.1564344650f, 0.1532014306f, 0.1499667556f, 0.1467304745f, 0.1434926220f, 0.1402532328f,
+    0.1370123417f, 0.1337699832f, 0.1305261922f, 0.1272810034f, 0.1240344515f, 0.1207865712f,
+    0.1175373975f, 0.1142869650f, 0.1110353086f, 0.1077824630f, 0.1045284633f, 0.1012733441f,
+    0.0980171403f, 0.0947598869f, 0.0915016187f, 0.0882423705f, 0.0849821774f, 0.0817210741f,
+    0.0784590957f, 0.0751962771f, 0.0719326532f, 0.0686682589f, 0.0654031292f, 0.0621372992f,
+    0.0588708037f, 0.0556036777f, 0.0523359562f, 0.0490676743f, 0.0457988669f, 0.0425295691f,
+    0.0392598158f, 0.0359896420f, 0.0327190828f, 0.0294481732f, 0.0261769483f, 0.0229054430f,
+    0.0196336925f, 0.0163617316f, 0.0130895956f, 0.0098173193f, 0.0065449380f, 0.0032724865f,
+};
+
+const FLOAT32 ixheaacd_sine_pi_n_by_896[896] = {
+    0.0000000000f, 0.0035062346f, 0.0070124261f, 0.0105185314f, 0.0140245074f, 0.0175303110f,
+    0.0210358991f, 0.0245412285f, 0.0280462563f, 0.0315509392f, 0.0350552343f, 0.0385590984f,
+    0.0420624885f, 0.0455653615f, 0.0490676743f, 0.0525693839f, 0.0560704472f, 0.0595708212f,
+    0.0630704629f, 0.0665693292f, 0.0700673771f, 0.0735645636f, 0.0770608457f, 0.0805561805f,
+    0.0840505249f, 0.0875438361f, 0.0910360710f, 0.0945271867f, 0.0980171403f, 0.1015058890f,
+    0.1049933897f, 0.1084795997f, 0.1119644761f, 0.1154479760f, 0.1189300567f, 0.1224106752f,
+    0.1258897889f, 0.1293673549f, 0.1328433305f, 0.1363176729f, 0.1397903395f, 0.1432612876f,
+    0.1467304745f, 0.1501978574f, 0.1536633939f, 0.1571270413f, 0.1605887571f, 0.1640484986f,
+    0.1675062233f, 0.1709618888f, 0.1744154525f, 0.1778668719f, 0.1813161048f, 0.1847631086f,
+    0.1882078409f, 0.1916502595f, 0.1950903220f, 0.1985279861f, 0.2019632096f, 0.2053959502f,
+    0.2088261657f, 0.2122538139f, 0.2156788528f, 0.2191012402f, 0.2225209340f, 0.2259378921f,
+    0.2293520727f, 0.2327634337f, 0.2361719332f, 0.2395775292f, 0.2429801799f, 0.2463798435f,
+    0.2497764782f, 0.2531700422f, 0.2565604937f, 0.2599477912f, 0.2633318930f, 0.2667127575f,
+    0.2700903430f, 0.2734646082f, 0.2768355114f, 0.2802030113f, 0.2835670665f, 0.2869276356f,
+    0.2902846773f, 0.2936381502f, 0.2969880133f, 0.3003342253f, 0.3036767451f, 0.3070155316f,
+    0.3103505437f, 0.3136817404f, 0.3170090808f, 0.3203325240f, 0.3236520291f, 0.3269675554f,
+    0.3302790620f, 0.3335865082f, 0.3368898534f, 0.3401890570f, 0.3434840784f, 0.3467748771f,
+    0.3500614126f, 0.3533436446f, 0.3566215327f, 0.3598950365f, 0.3631641160f, 0.3664287307f,
+    0.3696888408f, 0.3729444059f, 0.3761953862f, 0.3794417417f, 0.3826834324f, 0.3859204185f,
+    0.3891526602f, 0.3923801177f, 0.3956027515f, 0.3988205218f, 0.4020333892f, 0.4052413140f,
+    0.4084442569f, 0.4116421786f, 0.4148350396f, 0.4180228007f, 0.4212054228f, 0.4243828668f,
+    0.4275550934f, 0.4307220639f, 0.4338837391f, 0.4370400803f, 0.4401910487f, 0.4433366055f,
+    0.4464767120f, 0.4496113297f, 0.4527404199f, 0.4558639443f, 0.4589818645f, 0.4620941420f,
+    0.4652007387f, 0.4683016164f, 0.4713967368f, 0.4744860621f, 0.4775695541f, 0.4806471751f,
+    0.4837188871f, 0.4867846524f, 0.4898444333f, 0.4928981922f, 0.4959458916f, 0.4989874939f,
+    0.5020229618f, 0.5050522580f, 0.5080753452f, 0.5110921863f, 0.5141027442f, 0.5171069818f,
+    0.5201048623f, 0.5230963487f, 0.5260814044f, 0.5290599925f, 0.5320320765f, 0.5349976199f,
+    0.5379565861f, 0.5409089389f, 0.5438546419f, 0.5467936589f, 0.5497259538f, 0.5526514905f,
+    0.5555702330f, 0.5584821455f, 0.5613871922f, 0.5642853374f, 0.5671765454f, 0.5700607807f,
+    0.5729380078f, 0.5758081914f, 0.5786712962f, 0.5815272869f, 0.5843761285f, 0.5872177860f,
+    0.5900522243f, 0.5928794088f, 0.5956993045f, 0.5985118769f, 0.6013170913f, 0.6041149133f,
+    0.6069053085f, 0.6096882426f, 0.6124636813f, 0.6152315906f, 0.6179919364f, 0.6207446847f,
+    0.6234898019f, 0.6262272540f, 0.6289570074f, 0.6316790286f, 0.6343932842f, 0.6370997406f,
+    0.6397983648f, 0.6424891235f, 0.6451719835f, 0.6478469121f, 0.6505138761f, 0.6531728430f,
+    0.6558237799f, 0.6584666543f, 0.6611014336f, 0.6637280856f, 0.6663465780f, 0.6689568784f,
+    0.6715589548f, 0.6741527754f, 0.6767383080f, 0.6793155210f, 0.6818843828f, 0.6844448616f,
+    0.6869969260f, 0.6895405447f, 0.6920756864f, 0.6946023199f, 0.6971204142f, 0.6996299382f,
+    0.7021308612f, 0.7046231524f, 0.7071067812f, 0.7095817170f, 0.7120479294f, 0.7145053880f,
+    0.7169540628f, 0.7193939235f, 0.7218249402f, 0.7242470830f, 0.7266603220f, 0.7290646278f,
+    0.7314599706f, 0.7338463210f, 0.7362236498f, 0.7385919276f, 0.7409511254f, 0.7433012141f,
+    0.7456421649f, 0.7479739490f, 0.7502965377f, 0.7526099024f, 0.7549140148f, 0.7572088465f,
+    0.7594943693f, 0.7617705550f, 0.7640373758f, 0.7662948037f, 0.7685428110f, 0.7707813701f,
+    0.7730104534f, 0.7752300335f, 0.7774400831f, 0.7796405751f, 0.7818314825f, 0.7840127782f,
+    0.7861844355f, 0.7883464276f, 0.7904987281f, 0.7926413103f, 0.7947741481f, 0.7968972152f,
+    0.7990104854f, 0.8011139328f, 0.8032075315f, 0.8052912558f, 0.8073650801f, 0.8094289789f,
+    0.8114829268f, 0.8135268985f, 0.8155608690f, 0.8175848132f, 0.8195987062f, 0.8216025233f,
+    0.8235962399f, 0.8255798314f, 0.8275532734f, 0.8295165418f, 0.8314696123f, 0.8334124610f,
+    0.8353450639f, 0.8372673973f, 0.8391794376f, 0.8410811612f, 0.8429725449f, 0.8448535652f,
+    0.8467241992f, 0.8485844238f, 0.8504342161f, 0.8522735535f, 0.8541024132f, 0.8559207728f,
+    0.8577286100f, 0.8595259025f, 0.8613126282f, 0.8630887652f, 0.8648542917f, 0.8666091858f,
+    0.8683534261f, 0.8700869911f, 0.8718098595f, 0.8735220101f, 0.8752234219f, 0.8769140739f,
+    0.8785939454f, 0.8802630157f, 0.8819212643f, 0.8835686709f, 0.8852052150f, 0.8868308767f,
+    0.8884456360f, 0.8900494729f, 0.8916423679f, 0.8932243012f, 0.8947952535f, 0.8963552054f,
+    0.8979041378f, 0.8994420316f, 0.9009688679f, 0.9024846280f, 0.9039892931f, 0.9054828449f,
+    0.9069652649f, 0.9084365350f, 0.9098966369f, 0.9113455529f, 0.9127832651f, 0.9142097557f,
+    0.9156250073f, 0.9170290025f, 0.9184217239f, 0.9198031546f, 0.9211732775f, 0.9225320757f,
+    0.9238795325f, 0.9252156315f, 0.9265403561f, 0.9278536900f, 0.9291556172f, 0.9304461216f,
+    0.9317251874f, 0.9329927988f, 0.9342489403f, 0.9354935964f, 0.9367267517f, 0.9379483912f,
+    0.9391584999f, 0.9403570628f, 0.9415440652f, 0.9427194925f, 0.9438833303f, 0.9450355643f,
+    0.9461761802f, 0.9473051642f, 0.9484225022f, 0.9495281806f, 0.9506221858f, 0.9517045042f,
+    0.9527751227f, 0.9538340281f, 0.9548812072f, 0.9559166474f, 0.9569403357f, 0.9579522597f,
+    0.9589524069f, 0.9599407651f, 0.9609173219f, 0.9618820656f, 0.9628349841f, 0.9637760658f,
+    0.9647052991f, 0.9656226726f, 0.9665281750f, 0.9674217952f, 0.9683035221f, 0.9691733450f,
+    0.9700312532f, 0.9708772361f, 0.9717112832f, 0.9725333845f, 0.9733435297f, 0.9741417088f,
+    0.9749279122f, 0.9757021300f, 0.9764643529f, 0.9772145714f, 0.9779527762f, 0.9786789584f,
+    0.9793931090f, 0.9800952192f, 0.9807852804f, 0.9814632841f, 0.9821292220f, 0.9827830858f,
+    0.9834248676f, 0.9840545594f, 0.9846721535f, 0.9852776424f, 0.9858710185f, 0.9864522746f,
+    0.9870214036f, 0.9875783983f, 0.9881232521f, 0.9886559582f, 0.9891765100f, 0.9896849011f,
+    0.9901811253f, 0.9906651766f, 0.9911370488f, 0.9915967363f, 0.9920442334f, 0.9924795346f,
+    0.9929026345f, 0.9933135280f, 0.9937122099f, 0.9940986754f, 0.9944729197f, 0.9948349383f,
+    0.9951847267f, 0.9955222805f, 0.9958475957f, 0.9961606681f, 0.9964614941f, 0.9967500699f,
+    0.9970263919f, 0.9972904567f, 0.9975422611f, 0.9977818020f, 0.9980090765f, 0.9982240817f,
+    0.9984268150f, 0.9986172740f, 0.9987954562f, 0.9989613595f, 0.9991149819f, 0.9992563214f,
+    0.9993853764f, 0.9995021452f, 0.9996066264f, 0.9996988187f, 0.9997787210f, 0.9998463323f,
+    0.9999016518f, 0.9999446787f, 0.9999754126f, 0.9999938531f, 1.0000000000f, 0.9999938531f,
+    0.9999754126f, 0.9999446787f, 0.9999016518f, 0.9998463323f, 0.9997787210f, 0.9996988187f,
+    0.9996066264f, 0.9995021452f, 0.9993853764f, 0.9992563214f, 0.9991149819f, 0.9989613595f,
+    0.9987954562f, 0.9986172740f, 0.9984268150f, 0.9982240817f, 0.9980090765f, 0.9977818020f,
+    0.9975422611f, 0.9972904567f, 0.9970263919f, 0.9967500699f, 0.9964614941f, 0.9961606681f,
+    0.9958475957f, 0.9955222805f, 0.9951847267f, 0.9948349383f, 0.9944729197f, 0.9940986754f,
+    0.9937122099f, 0.9933135280f, 0.9929026345f, 0.9924795346f, 0.9920442334f, 0.9915967363f,
+    0.9911370488f, 0.9906651766f, 0.9901811253f, 0.9896849011f, 0.9891765100f, 0.9886559582f,
+    0.9881232521f, 0.9875783983f, 0.9870214036f, 0.9864522746f, 0.9858710185f, 0.9852776424f,
+    0.9846721535f, 0.9840545594f, 0.9834248676f, 0.9827830858f, 0.9821292220f, 0.9814632841f,
+    0.9807852804f, 0.9800952192f, 0.9793931090f, 0.9786789584f, 0.9779527762f, 0.9772145714f,
+    0.9764643529f, 0.9757021300f, 0.9749279122f, 0.9741417088f, 0.9733435297f, 0.9725333845f,
+    0.9717112832f, 0.9708772361f, 0.9700312532f, 0.9691733450f, 0.9683035221f, 0.9674217952f,
+    0.9665281750f, 0.9656226726f, 0.9647052991f, 0.9637760658f, 0.9628349841f, 0.9618820656f,
+    0.9609173219f, 0.9599407651f, 0.9589524069f, 0.9579522597f, 0.9569403357f, 0.9559166474f,
+    0.9548812072f, 0.9538340281f, 0.9527751227f, 0.9517045042f, 0.9506221858f, 0.9495281806f,
+    0.9484225022f, 0.9473051642f, 0.9461761802f, 0.9450355643f, 0.9438833303f, 0.9427194925f,
+    0.9415440652f, 0.9403570628f, 0.9391584999f, 0.9379483912f, 0.9367267517f, 0.9354935964f,
+    0.9342489403f, 0.9329927988f, 0.9317251874f, 0.9304461216f, 0.9291556172f, 0.9278536900f,
+    0.9265403561f, 0.9252156315f, 0.9238795325f, 0.9225320757f, 0.9211732775f, 0.9198031546f,
+    0.9184217239f, 0.9170290025f, 0.9156250073f, 0.9142097557f, 0.9127832651f, 0.9113455529f,
+    0.9098966369f, 0.9084365350f, 0.9069652649f, 0.9054828449f, 0.9039892931f, 0.9024846280f,
+    0.9009688679f, 0.8994420316f, 0.8979041378f, 0.8963552054f, 0.8947952535f, 0.8932243012f,
+    0.8916423679f, 0.8900494729f, 0.8884456360f, 0.8868308767f, 0.8852052150f, 0.8835686709f,
+    0.8819212643f, 0.8802630157f, 0.8785939454f, 0.8769140739f, 0.8752234219f, 0.8735220101f,
+    0.8718098595f, 0.8700869911f, 0.8683534261f, 0.8666091858f, 0.8648542917f, 0.8630887652f,
+    0.8613126282f, 0.8595259025f, 0.8577286100f, 0.8559207728f, 0.8541024132f, 0.8522735535f,
+    0.8504342161f, 0.8485844238f, 0.8467241992f, 0.8448535652f, 0.8429725449f, 0.8410811612f,
+    0.8391794376f, 0.8372673973f, 0.8353450639f, 0.8334124610f, 0.8314696123f, 0.8295165418f,
+    0.8275532734f, 0.8255798314f, 0.8235962399f, 0.8216025233f, 0.8195987062f, 0.8175848132f,
+    0.8155608690f, 0.8135268985f, 0.8114829268f, 0.8094289789f, 0.8073650801f, 0.8052912558f,
+    0.8032075315f, 0.8011139328f, 0.7990104854f, 0.7968972152f, 0.7947741481f, 0.7926413103f,
+    0.7904987281f, 0.7883464276f, 0.7861844355f, 0.7840127782f, 0.7818314825f, 0.7796405751f,
+    0.7774400831f, 0.7752300335f, 0.7730104534f, 0.7707813701f, 0.7685428110f, 0.7662948037f,
+    0.7640373758f, 0.7617705550f, 0.7594943693f, 0.7572088465f, 0.7549140148f, 0.7526099024f,
+    0.7502965377f, 0.7479739490f, 0.7456421649f, 0.7433012141f, 0.7409511254f, 0.7385919276f,
+    0.7362236498f, 0.7338463210f, 0.7314599706f, 0.7290646278f, 0.7266603220f, 0.7242470830f,
+    0.7218249402f, 0.7193939235f, 0.7169540628f, 0.7145053880f, 0.7120479294f, 0.7095817170f,
+    0.7071067812f, 0.7046231524f, 0.7021308612f, 0.6996299382f, 0.6971204142f, 0.6946023199f,
+    0.6920756864f, 0.6895405447f, 0.6869969260f, 0.6844448616f, 0.6818843828f, 0.6793155210f,
+    0.6767383080f, 0.6741527754f, 0.6715589548f, 0.6689568784f, 0.6663465780f, 0.6637280856f,
+    0.6611014336f, 0.6584666543f, 0.6558237799f, 0.6531728430f, 0.6505138761f, 0.6478469121f,
+    0.6451719835f, 0.6424891235f, 0.6397983648f, 0.6370997406f, 0.6343932842f, 0.6316790286f,
+    0.6289570074f, 0.6262272540f, 0.6234898019f, 0.6207446847f, 0.6179919364f, 0.6152315906f,
+    0.6124636813f, 0.6096882426f, 0.6069053085f, 0.6041149133f, 0.6013170913f, 0.5985118769f,
+    0.5956993045f, 0.5928794088f, 0.5900522243f, 0.5872177860f, 0.5843761285f, 0.5815272869f,
+    0.5786712962f, 0.5758081914f, 0.5729380078f, 0.5700607807f, 0.5671765454f, 0.5642853374f,
+    0.5613871922f, 0.5584821455f, 0.5555702330f, 0.5526514905f, 0.5497259538f, 0.5467936589f,
+    0.5438546419f, 0.5409089389f, 0.5379565861f, 0.5349976199f, 0.5320320765f, 0.5290599925f,
+    0.5260814044f, 0.5230963487f, 0.5201048623f, 0.5171069818f, 0.5141027442f, 0.5110921863f,
+    0.5080753452f, 0.5050522580f, 0.5020229618f, 0.4989874939f, 0.4959458916f, 0.4928981922f,
+    0.4898444333f, 0.4867846524f, 0.4837188871f, 0.4806471751f, 0.4775695541f, 0.4744860621f,
+    0.4713967368f, 0.4683016164f, 0.4652007387f, 0.4620941420f, 0.4589818645f, 0.4558639443f,
+    0.4527404199f, 0.4496113297f, 0.4464767120f, 0.4433366055f, 0.4401910487f, 0.4370400803f,
+    0.4338837391f, 0.4307220639f, 0.4275550934f, 0.4243828668f, 0.4212054228f, 0.4180228007f,
+    0.4148350396f, 0.4116421786f, 0.4084442569f, 0.4052413140f, 0.4020333892f, 0.3988205218f,
+    0.3956027515f, 0.3923801177f, 0.3891526602f, 0.3859204185f, 0.3826834324f, 0.3794417417f,
+    0.3761953862f, 0.3729444059f, 0.3696888408f, 0.3664287307f, 0.3631641160f, 0.3598950365f,
+    0.3566215327f, 0.3533436446f, 0.3500614126f, 0.3467748771f, 0.3434840784f, 0.3401890570f,
+    0.3368898534f, 0.3335865082f, 0.3302790620f, 0.3269675554f, 0.3236520291f, 0.3203325240f,
+    0.3170090808f, 0.3136817404f, 0.3103505437f, 0.3070155316f, 0.3036767451f, 0.3003342253f,
+    0.2969880133f, 0.2936381502f, 0.2902846773f, 0.2869276356f, 0.2835670665f, 0.2802030113f,
+    0.2768355114f, 0.2734646082f, 0.2700903430f, 0.2667127575f, 0.2633318930f, 0.2599477912f,
+    0.2565604937f, 0.2531700422f, 0.2497764782f, 0.2463798435f, 0.2429801799f, 0.2395775292f,
+    0.2361719332f, 0.2327634337f, 0.2293520727f, 0.2259378921f, 0.2225209340f, 0.2191012402f,
+    0.2156788528f, 0.2122538139f, 0.2088261657f, 0.2053959502f, 0.2019632096f, 0.1985279861f,
+    0.1950903220f, 0.1916502595f, 0.1882078409f, 0.1847631086f, 0.1813161048f, 0.1778668719f,
+    0.1744154525f, 0.1709618888f, 0.1675062233f, 0.1640484986f, 0.1605887571f, 0.1571270413f,
+    0.1536633939f, 0.1501978574f, 0.1467304745f, 0.1432612876f, 0.1397903395f, 0.1363176729f,
+    0.1328433305f, 0.1293673549f, 0.1258897889f, 0.1224106752f, 0.1189300567f, 0.1154479760f,
+    0.1119644761f, 0.1084795997f, 0.1049933897f, 0.1015058890f, 0.0980171403f, 0.0945271867f,
+    0.0910360710f, 0.0875438361f, 0.0840505249f, 0.0805561805f, 0.0770608457f, 0.0735645636f,
+    0.0700673771f, 0.0665693292f, 0.0630704629f, 0.0595708212f, 0.0560704472f, 0.0525693839f,
+    0.0490676743f, 0.0455653615f, 0.0420624885f, 0.0385590984f, 0.0350552343f, 0.0315509392f,
+    0.0280462563f, 0.0245412285f, 0.0210358991f, 0.0175303110f, 0.0140245074f, 0.0105185314f,
+    0.0070124261f, 0.0035062346f,
+};
+
+const FLOAT32 ixheaacd_sine_pi_n_by_832[832] = {
+    0.0000000000f, 0.0037759437f, 0.0075518336f, 0.0113276159f, 0.0151032366f, 0.0188786420f,
+    0.0226537782f, 0.0264285914f, 0.0302030278f, 0.0339770336f, 0.0377505549f, 0.0415235380f,
+    0.0452959291f, 0.0490676743f, 0.0528387200f, 0.0566090123f, 0.0603784974f, 0.0641471217f,
+    0.0679148314f, 0.0716815728f, 0.0754472922f, 0.0792119358f, 0.0829754501f, 0.0867377813f,
+    0.0904988758f, 0.0942586800f, 0.0980171403f, 0.1017742031f, 0.1055298148f, 0.1092839219f,
+    0.1130364708f, 0.1167874081f, 0.1205366803f, 0.1242842338f, 0.1280300154f, 0.1317739715f,
+    0.1355160488f, 0.1392561939f, 0.1429943536f, 0.1467304745f, 0.1504645033f, 0.1541963868f,
+    0.1579260718f, 0.1616535052f, 0.1653786337f, 0.1691014043f, 0.1728217639f, 0.1765396594f,
+    0.1802550378f, 0.1839678462f, 0.1876780316f, 0.1913855412f, 0.1950903220f, 0.1987923213f,
+    0.2024914862f, 0.2061877640f, 0.2098811021f, 0.2135714477f, 0.2172587482f, 0.2209429511f,
+    0.2246240039f, 0.2283018540f, 0.2319764490f, 0.2356477366f, 0.2393156643f, 0.2429801799f,
+    0.2466412312f, 0.2502987658f, 0.2539527318f, 0.2576030770f, 0.2612497493f, 0.2648926968f,
+    0.2685318675f, 0.2721672095f, 0.2757986710f, 0.2794262002f, 0.2830497454f, 0.2866692550f,
+    0.2902846773f, 0.2938959607f, 0.2975030539f, 0.3011059053f, 0.3047044636f, 0.3082986774f,
+    0.3118884957f, 0.3154738670f, 0.3190547404f, 0.3226310648f, 0.3262027892f, 0.3297698627f,
+    0.3333322343f, 0.3368898534f, 0.3404426692f, 0.3439906309f, 0.3475336882f, 0.3510717904f,
+    0.3546048870f, 0.3581329278f, 0.3616558624f, 0.3651736406f, 0.3686862122f, 0.3721935271f,
+    0.3756955354f, 0.3791921871f, 0.3826834324f, 0.3861692214f, 0.3896495045f, 0.3931242320f,
+    0.3965933545f, 0.4000568224f, 0.4035145864f, 0.4069665971f, 0.4104128055f, 0.4138531622f,
+    0.4172876183f, 0.4207161247f, 0.4241386327f, 0.4275550934f, 0.4309654581f, 0.4343696782f,
+    0.4377677052f, 0.4411594905f, 0.4445449859f, 0.4479241430f, 0.4512969137f, 0.4546632499f,
+    0.4580231036f, 0.4613764269f, 0.4647231720f, 0.4680632912f, 0.4713967368f, 0.4747234614f,
+    0.4780434174f, 0.4813565576f, 0.4846628346f, 0.4879622015f, 0.4912546111f, 0.4945400165f,
+    0.4978183708f, 0.5010896273f, 0.5043537394f, 0.5076106605f, 0.5108603442f, 0.5141027442f,
+    0.5173378142f, 0.5205655081f, 0.5237857798f, 0.5269985836f, 0.5302038734f, 0.5334016038f,
+    0.5365917290f, 0.5397742036f, 0.5429489822f, 0.5461160195f, 0.5492752705f, 0.5524266899f,
+    0.5555702330f, 0.5587058549f, 0.5618335108f, 0.5649531563f, 0.5680647467f, 0.5711682378f,
+    0.5742635853f, 0.5773507451f, 0.5804296731f, 0.5835003254f, 0.5865626583f, 0.5896166282f,
+    0.5926621914f, 0.5956993045f, 0.5987279243f, 0.6017480075f, 0.6047595111f, 0.6077623922f,
+    0.6107566079f, 0.6137421156f, 0.6167188726f, 0.6196868366f, 0.6226459653f, 0.6255962163f,
+    0.6285375478f, 0.6314699177f, 0.6343932842f, 0.6373076056f, 0.6402128405f, 0.6431089473f,
+    0.6459958848f, 0.6488736118f, 0.6517420873f, 0.6546012704f, 0.6574511203f, 0.6602915964f,
+    0.6631226582f, 0.6659442654f, 0.6687563776f, 0.6715589548f, 0.6743519571f, 0.6771353446f,
+    0.6799090777f, 0.6826731167f, 0.6854274223f, 0.6881719553f, 0.6909066764f, 0.6936315467f,
+    0.6963465273f, 0.6990515796f, 0.7017466649f, 0.7044317449f, 0.7071067812f, 0.7097717357f,
+    0.7124265705f, 0.7150712476f, 0.7177057293f, 0.7203299782f, 0.7229439567f, 0.7255476276f,
+    0.7281409539f, 0.7307238984f, 0.7332964244f, 0.7358584953f, 0.7384100744f, 0.7409511254f,
+    0.7434816120f, 0.7460014983f, 0.7485107482f, 0.7510093260f, 0.7534971960f, 0.7559743228f,
+    0.7584406711f, 0.7608962057f, 0.7633408916f, 0.7657746940f, 0.7681975780f, 0.7706095093f,
+    0.7730104534f, 0.7754003760f, 0.7777792431f, 0.7801470208f, 0.7825036754f, 0.7848491731f,
+    0.7871834806f, 0.7895065646f, 0.7918183920f, 0.7941189298f, 0.7964081452f, 0.7986860056f,
+    0.8009524784f, 0.8032075315f, 0.8054511326f, 0.8076832497f, 0.8099038510f, 0.8121129048f,
+    0.8143103798f, 0.8164962444f, 0.8186704676f, 0.8208330184f, 0.8229838659f, 0.8251229794f,
+    0.8272503286f, 0.8293658829f, 0.8314696123f, 0.8335614868f, 0.8356414765f, 0.8377095518f,
+    0.8397656832f, 0.8418098414f, 0.8438419973f, 0.8458621218f, 0.8478701862f, 0.8498661618f,
+    0.8518500202f, 0.8538217330f, 0.8557812723f, 0.8577286100f, 0.8596637184f, 0.8615865698f,
+    0.8634971370f, 0.8653953925f, 0.8672813094f, 0.8691548608f, 0.8710160200f, 0.8728647604f,
+    0.8747010556f, 0.8765248796f, 0.8783362062f, 0.8801350097f, 0.8819212643f, 0.8836949448f,
+    0.8854560257f, 0.8872044819f, 0.8889402885f, 0.8906634208f, 0.8923738542f, 0.8940715643f,
+    0.8957565269f, 0.8974287180f, 0.8990881138f, 0.9007346905f, 0.9023684247f, 0.9039892931f,
+    0.9055972727f, 0.9071923404f, 0.9087744735f, 0.9103436495f, 0.9118998460f, 0.9134430408f,
+    0.9149732119f, 0.9164903376f, 0.9179943960f, 0.9194853659f, 0.9209632260f, 0.9224279552f,
+    0.9238795325f, 0.9253179374f, 0.9267431492f, 0.9281551478f, 0.9295539129f, 0.9309394246f,
+    0.9323116631f, 0.9336706089f, 0.9350162427f, 0.9363485451f, 0.9376674973f, 0.9389730805f,
+    0.9402652759f, 0.9415440652f, 0.9428094301f, 0.9440613527f, 0.9452998150f, 0.9465247995f,
+    0.9477362885f, 0.9489342650f, 0.9501187117f, 0.9512896118f, 0.9524469486f, 0.9535907056f,
+    0.9547208665f, 0.9558374152f, 0.9569403357f, 0.9580296124f, 0.9591052297f, 0.9601671722f,
+    0.9612154249f, 0.9622499728f, 0.9632708010f, 0.9642778952f, 0.9652712409f, 0.9662508239f,
+    0.9672166303f, 0.9681686464f, 0.9691068584f, 0.9700312532f, 0.9709418174f, 0.9718385382f,
+    0.9727214026f, 0.9735903982f, 0.9744455125f, 0.9752867334f, 0.9761140488f, 0.9769274470f,
+    0.9777269164f, 0.9785124455f, 0.9792840232f, 0.9800416384f, 0.9807852804f, 0.9815149386f,
+    0.9822306025f, 0.9829322619f, 0.9836199069f, 0.9842935277f, 0.9849531146f, 0.9855986582f,
+    0.9862301494f, 0.9868475790f, 0.9874509384f, 0.9880402190f, 0.9886154122f, 0.9891765100f,
+    0.9897235042f, 0.9902563872f, 0.9907751513f, 0.9912797892f, 0.9917702935f, 0.9922466575f,
+    0.9927088741f, 0.9931569369f, 0.9935908395f, 0.9940105756f, 0.9944161393f, 0.9948075249f,
+    0.9951847267f, 0.9955477393f, 0.9958965576f, 0.9962311766f, 0.9965515916f, 0.9968577979f,
+    0.9971497912f, 0.9974275674f, 0.9976911224f, 0.9979404525f, 0.9981755542f, 0.9983964241f,
+    0.9986030591f, 0.9987954562f, 0.9989736127f, 0.9991375260f, 0.9992871938f, 0.9994226139f,
+    0.9995437845f, 0.9996507038f, 0.9997433702f, 0.9998217826f, 0.9998859396f, 0.9999358405f,
+    0.9999714845f, 0.9999928711f, 1.0000000000f, 0.9999928711f, 0.9999714845f, 0.9999358405f,
+    0.9998859396f, 0.9998217826f, 0.9997433702f, 0.9996507038f, 0.9995437845f, 0.9994226139f,
+    0.9992871938f, 0.9991375260f, 0.9989736127f, 0.9987954562f, 0.9986030591f, 0.9983964241f,
+    0.9981755542f, 0.9979404525f, 0.9976911224f, 0.9974275674f, 0.9971497912f, 0.9968577979f,
+    0.9965515916f, 0.9962311766f, 0.9958965576f, 0.9955477393f, 0.9951847267f, 0.9948075249f,
+    0.9944161393f, 0.9940105756f, 0.9935908395f, 0.9931569369f, 0.9927088741f, 0.9922466575f,
+    0.9917702935f, 0.9912797892f, 0.9907751513f, 0.9902563872f, 0.9897235042f, 0.9891765100f,
+    0.9886154122f, 0.9880402190f, 0.9874509384f, 0.9868475790f, 0.9862301494f, 0.9855986582f,
+    0.9849531146f, 0.9842935277f, 0.9836199069f, 0.9829322619f, 0.9822306025f, 0.9815149386f,
+    0.9807852804f, 0.9800416384f, 0.9792840232f, 0.9785124455f, 0.9777269164f, 0.9769274470f,
+    0.9761140488f, 0.9752867334f, 0.9744455125f, 0.9735903982f, 0.9727214026f, 0.9718385382f,
+    0.9709418174f, 0.9700312532f, 0.9691068584f, 0.9681686464f, 0.9672166303f, 0.9662508239f,
+    0.9652712409f, 0.9642778952f, 0.9632708010f, 0.9622499728f, 0.9612154249f, 0.9601671722f,
+    0.9591052297f, 0.9580296124f, 0.9569403357f, 0.9558374152f, 0.9547208665f, 0.9535907056f,
+    0.9524469486f, 0.9512896118f, 0.9501187117f, 0.9489342650f, 0.9477362885f, 0.9465247995f,
+    0.9452998150f, 0.9440613527f, 0.9428094301f, 0.9415440652f, 0.9402652759f, 0.9389730805f,
+    0.9376674973f, 0.9363485451f, 0.9350162427f, 0.9336706089f, 0.9323116631f, 0.9309394246f,
+    0.9295539129f, 0.9281551478f, 0.9267431492f, 0.9253179374f, 0.9238795325f, 0.9224279552f,
+    0.9209632260f, 0.9194853659f, 0.9179943960f, 0.9164903376f, 0.9149732119f, 0.9134430408f,
+    0.9118998460f, 0.9103436495f, 0.9087744735f, 0.9071923404f, 0.9055972727f, 0.9039892931f,
+    0.9023684247f, 0.9007346905f, 0.8990881138f, 0.8974287180f, 0.8957565269f, 0.8940715643f,
+    0.8923738542f, 0.8906634208f, 0.8889402885f, 0.8872044819f, 0.8854560257f, 0.8836949448f,
+    0.8819212643f, 0.8801350097f, 0.8783362062f, 0.8765248796f, 0.8747010556f, 0.8728647604f,
+    0.8710160200f, 0.8691548608f, 0.8672813094f, 0.8653953925f, 0.8634971370f, 0.8615865698f,
+    0.8596637184f, 0.8577286100f, 0.8557812723f, 0.8538217330f, 0.8518500202f, 0.8498661618f,
+    0.8478701862f, 0.8458621218f, 0.8438419973f, 0.8418098414f, 0.8397656832f, 0.8377095518f,
+    0.8356414765f, 0.8335614868f, 0.8314696123f, 0.8293658829f, 0.8272503286f, 0.8251229794f,
+    0.8229838659f, 0.8208330184f, 0.8186704676f, 0.8164962444f, 0.8143103798f, 0.8121129048f,
+    0.8099038510f, 0.8076832497f, 0.8054511326f, 0.8032075315f, 0.8009524784f, 0.7986860056f,
+    0.7964081452f, 0.7941189298f, 0.7918183920f, 0.7895065646f, 0.7871834806f, 0.7848491731f,
+    0.7825036754f, 0.7801470208f, 0.7777792431f, 0.7754003760f, 0.7730104534f, 0.7706095093f,
+    0.7681975780f, 0.7657746940f, 0.7633408916f, 0.7608962057f, 0.7584406711f, 0.7559743228f,
+    0.7534971960f, 0.7510093260f, 0.7485107482f, 0.7460014983f, 0.7434816120f, 0.7409511254f,
+    0.7384100744f, 0.7358584953f, 0.7332964244f, 0.7307238984f, 0.7281409539f, 0.7255476276f,
+    0.7229439567f, 0.7203299782f, 0.7177057293f, 0.7150712476f, 0.7124265705f, 0.7097717357f,
+    0.7071067812f, 0.7044317449f, 0.7017466649f, 0.6990515796f, 0.6963465273f, 0.6936315467f,
+    0.6909066764f, 0.6881719553f, 0.6854274223f, 0.6826731167f, 0.6799090777f, 0.6771353446f,
+    0.6743519571f, 0.6715589548f, 0.6687563776f, 0.6659442654f, 0.6631226582f, 0.6602915964f,
+    0.6574511203f, 0.6546012704f, 0.6517420873f, 0.6488736118f, 0.6459958848f, 0.6431089473f,
+    0.6402128405f, 0.6373076056f, 0.6343932842f, 0.6314699177f, 0.6285375478f, 0.6255962163f,
+    0.6226459653f, 0.6196868366f, 0.6167188726f, 0.6137421156f, 0.6107566079f, 0.6077623922f,
+    0.6047595111f, 0.6017480075f, 0.5987279243f, 0.5956993045f, 0.5926621914f, 0.5896166282f,
+    0.5865626583f, 0.5835003254f, 0.5804296731f, 0.5773507451f, 0.5742635853f, 0.5711682378f,
+    0.5680647467f, 0.5649531563f, 0.5618335108f, 0.5587058549f, 0.5555702330f, 0.5524266899f,
+    0.5492752705f, 0.5461160195f, 0.5429489822f, 0.5397742036f, 0.5365917290f, 0.5334016038f,
+    0.5302038734f, 0.5269985836f, 0.5237857798f, 0.5205655081f, 0.5173378142f, 0.5141027442f,
+    0.5108603442f, 0.5076106605f, 0.5043537394f, 0.5010896273f, 0.4978183708f, 0.4945400165f,
+    0.4912546111f, 0.4879622015f, 0.4846628346f, 0.4813565576f, 0.4780434174f, 0.4747234614f,
+    0.4713967368f, 0.4680632912f, 0.4647231720f, 0.4613764269f, 0.4580231036f, 0.4546632499f,
+    0.4512969137f, 0.4479241430f, 0.4445449859f, 0.4411594905f, 0.4377677052f, 0.4343696782f,
+    0.4309654581f, 0.4275550934f, 0.4241386327f, 0.4207161247f, 0.4172876183f, 0.4138531622f,
+    0.4104128055f, 0.4069665971f, 0.4035145864f, 0.4000568224f, 0.3965933545f, 0.3931242320f,
+    0.3896495045f, 0.3861692214f, 0.3826834324f, 0.3791921871f, 0.3756955354f, 0.3721935271f,
+    0.3686862122f, 0.3651736406f, 0.3616558624f, 0.3581329278f, 0.3546048870f, 0.3510717904f,
+    0.3475336882f, 0.3439906309f, 0.3404426692f, 0.3368898534f, 0.3333322343f, 0.3297698627f,
+    0.3262027892f, 0.3226310648f, 0.3190547404f, 0.3154738670f, 0.3118884957f, 0.3082986774f,
+    0.3047044636f, 0.3011059053f, 0.2975030539f, 0.2938959607f, 0.2902846773f, 0.2866692550f,
+    0.2830497454f, 0.2794262002f, 0.2757986710f, 0.2721672095f, 0.2685318675f, 0.2648926968f,
+    0.2612497493f, 0.2576030770f, 0.2539527318f, 0.2502987658f, 0.2466412312f, 0.2429801799f,
+    0.2393156643f, 0.2356477366f, 0.2319764490f, 0.2283018540f, 0.2246240039f, 0.2209429511f,
+    0.2172587482f, 0.2135714477f, 0.2098811021f, 0.2061877640f, 0.2024914862f, 0.1987923213f,
+    0.1950903220f, 0.1913855412f, 0.1876780316f, 0.1839678462f, 0.1802550378f, 0.1765396594f,
+    0.1728217639f, 0.1691014043f, 0.1653786337f, 0.1616535052f, 0.1579260718f, 0.1541963868f,
+    0.1504645033f, 0.1467304745f, 0.1429943536f, 0.1392561939f, 0.1355160488f, 0.1317739715f,
+    0.1280300154f, 0.1242842338f, 0.1205366803f, 0.1167874081f, 0.1130364708f, 0.1092839219f,
+    0.1055298148f, 0.1017742031f, 0.0980171403f, 0.0942586800f, 0.0904988758f, 0.0867377813f,
+    0.0829754501f, 0.0792119358f, 0.0754472922f, 0.0716815728f, 0.0679148314f, 0.0641471217f,
+    0.0603784974f, 0.0566090123f, 0.0528387200f, 0.0490676743f, 0.0452959291f, 0.0415235380f,
+    0.0377505549f, 0.0339770336f, 0.0302030278f, 0.0264285914f, 0.0226537782f, 0.0188786420f,
+    0.0151032366f, 0.0113276159f, 0.0075518336f, 0.0037759437f,
+};
+
+const FLOAT32 ixheaacd_sine_pi_n_by_768[768] = {
+    0.0000000000f, 0.0040906040f, 0.0081811396f, 0.0122715383f, 0.0163617316f, 0.0204516512f,
+    0.0245412285f, 0.0286303952f, 0.0327190828f, 0.0368072229f, 0.0408947472f, 0.0449815871f,
+    0.0490676743f, 0.0531529405f, 0.0572373173f, 0.0613207363f, 0.0654031292f, 0.0694844278f,
+    0.0735645636f, 0.0776434685f, 0.0817210741f, 0.0857973123f, 0.0898721149f, 0.0939454136f,
+    0.0980171403f, 0.1020872269f, 0.1061556053f, 0.1102222073f, 0.1142869650f, 0.1183498103f,
+    0.1224106752f, 0.1264694918f, 0.1305261922f, 0.1345807085f, 0.1386329728f, 0.1426829174f,
+    0.1467304745f, 0.1507755762f, 0.1548181551f, 0.1588581433f, 0.1628954734f, 0.1669300777f,
+    0.1709618888f, 0.1749908391f, 0.1790168613f, 0.1830398880f, 0.1870598518f, 0.1910766856f,
+    0.1950903220f, 0.1991006940f, 0.2031077344f, 0.2071113762f, 0.2111115524f, 0.2151081960f,
+    0.2191012402f, 0.2230906181f, 0.2270762630f, 0.2310581083f, 0.2350360872f, 0.2390101332f,
+    0.2429801799f, 0.2469461607f, 0.2509080094f, 0.2548656596f, 0.2588190451f, 0.2627680998f,
+    0.2667127575f, 0.2706529523f, 0.2745886182f, 0.2785196894f, 0.2824461001f, 0.2863677846f,
+    0.2902846773f, 0.2941967126f, 0.2981038250f, 0.3020059493f, 0.3059030201f, 0.3097949722f,
+    0.3136817404f, 0.3175632598f, 0.3214394653f, 0.3253102922f, 0.3291756756f, 0.3330355508f,
+    0.3368898534f, 0.3407385187f, 0.3445814824f, 0.3484186802f, 0.3522500479f, 0.3560755214f,
+    0.3598950365f, 0.3637085296f, 0.3675159366f, 0.3713171940f, 0.3751122380f, 0.3789010053f,
+    0.3826834324f, 0.3864594560f, 0.3902290129f, 0.3939920401f, 0.3977484745f, 0.4014982534f,
+    0.4052413140f, 0.4089775936f, 0.4127070298f, 0.4164295601f, 0.4201451222f, 0.4238536540f,
+    0.4275550934f, 0.4312493785f, 0.4349364474f, 0.4386162385f, 0.4422886902f, 0.4459537410f,
+    0.4496113297f, 0.4532613949f, 0.4569038756f, 0.4605387110f, 0.4641658400f, 0.4677852022f,
+    0.4713967368f, 0.4750003835f, 0.4785960820f, 0.4821837721f, 0.4857633937f, 0.4893348870f,
+    0.4928981922f, 0.4964532497f, 0.5000000000f, 0.5035383837f, 0.5070683417f, 0.5105898148f,
+    0.5141027442f, 0.5176070710f, 0.5211027367f, 0.5245896827f, 0.5280678507f, 0.5315371824f,
+    0.5349976199f, 0.5384491052f, 0.5418915806f, 0.5453249884f, 0.5487492713f, 0.5521643719f,
+    0.5555702330f, 0.5589667978f, 0.5623540092f, 0.5657318108f, 0.5691001459f, 0.5724589582f,
+    0.5758081914f, 0.5791477896f, 0.5824776969f, 0.5857978575f, 0.5891082158f, 0.5924087166f,
+    0.5956993045f, 0.5989799245f, 0.6022505217f, 0.6055110414f, 0.6087614290f, 0.6120016301f,
+    0.6152315906f, 0.6184512563f, 0.6216605734f, 0.6248594881f, 0.6280479471f, 0.6312258968f,
+    0.6343932842f, 0.6375500561f, 0.6406961599f, 0.6438315429f, 0.6469561525f, 0.6500699366f,
+    0.6531728430f, 0.6562648197f, 0.6593458151f, 0.6624157776f, 0.6654746558f, 0.6685223986f,
+    0.6715589548f, 0.6745842739f, 0.6775983050f, 0.6806009978f, 0.6835923020f, 0.6865721676f,
+    0.6895405447f, 0.6924973837f, 0.6954426350f, 0.6983762494f, 0.7012981778f, 0.7042083713f,
+    0.7071067812f, 0.7099933590f, 0.7128680564f, 0.7157308253f, 0.7185816178f, 0.7214203862f,
+    0.7242470830f, 0.7270616608f, 0.7298640727f, 0.7326542717f, 0.7354322111f, 0.7381978444f,
+    0.7409511254f, 0.7436920079f, 0.7464204462f, 0.7491363945f, 0.7518398075f, 0.7545306398f,
+    0.7572088465f, 0.7598743827f, 0.7625272039f, 0.7651672656f, 0.7677945237f, 0.7704089342f,
+    0.7730104534f, 0.7755990377f, 0.7781746438f, 0.7807372286f, 0.7832867492f, 0.7858231631f,
+    0.7883464276f, 0.7908565007f, 0.7933533403f, 0.7958369046f, 0.7983071521f, 0.8007640414f,
+    0.8032075315f, 0.8056375814f, 0.8080541504f, 0.8104571983f, 0.8128466846f, 0.8152225695f,
+    0.8175848132f, 0.8199333761f, 0.8222682190f, 0.8245893028f, 0.8268965886f, 0.8291900379f,
+    0.8314696123f, 0.8337352736f, 0.8359869839f, 0.8382247056f, 0.8404484011f, 0.8426580333f,
+    0.8448535652f, 0.8470349602f, 0.8492021815f, 0.8513551931f, 0.8534939589f, 0.8556184430f,
+    0.8577286100f, 0.8598244245f, 0.8619058515f, 0.8639728561f, 0.8660254038f, 0.8680634601f,
+    0.8700869911f, 0.8720959628f, 0.8740903416f, 0.8760700942f, 0.8780351874f, 0.8799855883f,
+    0.8819212643f, 0.8838421831f, 0.8857483124f, 0.8876396204f, 0.8895160754f, 0.8913776461f,
+    0.8932243012f, 0.8950560099f, 0.8968727415f, 0.8986744657f, 0.9004611522f, 0.9022327713f,
+    0.9039892931f, 0.9057306884f, 0.9074569281f, 0.9091679831f, 0.9108638249f, 0.9125444252f,
+    0.9142097557f, 0.9158597887f, 0.9174944964f, 0.9191138517f, 0.9207178273f, 0.9223063964f,
+    0.9238795325f, 0.9254372092f, 0.9269794005f, 0.9285060805f, 0.9300172237f, 0.9315128048f,
+    0.9329927988f, 0.9344571810f, 0.9359059268f, 0.9373390119f, 0.9387564125f, 0.9401581047f,
+    0.9415440652f, 0.9429142707f, 0.9442686983f, 0.9456073254f, 0.9469301295f, 0.9482370885f,
+    0.9495281806f, 0.9508033841f, 0.9520626777f, 0.9533060404f, 0.9545334512f, 0.9557448898f,
+    0.9569403357f, 0.9581197691f, 0.9592831702f, 0.9604305194f, 0.9615617977f, 0.9626769860f,
+    0.9637760658f, 0.9648590186f, 0.9659258263f, 0.9669764710f, 0.9680109353f, 0.9690292017f,
+    0.9700312532f, 0.9710170731f, 0.9719866448f, 0.9729399522f, 0.9738769793f, 0.9747977104f,
+    0.9757021300f, 0.9765902232f, 0.9774619749f, 0.9783173707f, 0.9791563962f, 0.9799790374f,
+    0.9807852804f, 0.9815751119f, 0.9823485185f, 0.9831054874f, 0.9838460059f, 0.9845700616f,
+    0.9852776424f, 0.9859687364f, 0.9866433321f, 0.9873014182f, 0.9879429836f, 0.9885680177f,
+    0.9891765100f, 0.9897684502f, 0.9903438286f, 0.9909026354f, 0.9914448614f, 0.9919704974f,
+    0.9924795346f, 0.9929719646f, 0.9934477790f, 0.9939069700f, 0.9943495298f, 0.9947754511f,
+    0.9951847267f, 0.9955773497f, 0.9959533136f, 0.9963126122f, 0.9966552393f, 0.9969811893f,
+    0.9972904567f, 0.9975830363f, 0.9978589232f, 0.9981181129f, 0.9983606009f, 0.9985863833f,
+    0.9987954562f, 0.9989878162f, 0.9991634599f, 0.9993223846f, 0.9994645875f, 0.9995900662f,
+    0.9996988187f, 0.9997908431f, 0.9998661379f, 0.9999247018f, 0.9999665339f, 0.9999916334f,
+    1.0000000000f, 0.9999916334f, 0.9999665339f, 0.9999247018f, 0.9998661379f, 0.9997908431f,
+    0.9996988187f, 0.9995900662f, 0.9994645875f, 0.9993223846f, 0.9991634599f, 0.9989878162f,
+    0.9987954562f, 0.9985863833f, 0.9983606009f, 0.9981181129f, 0.9978589232f, 0.9975830363f,
+    0.9972904567f, 0.9969811893f, 0.9966552393f, 0.9963126122f, 0.9959533136f, 0.9955773497f,
+    0.9951847267f, 0.9947754511f, 0.9943495298f, 0.9939069700f, 0.9934477790f, 0.9929719646f,
+    0.9924795346f, 0.9919704974f, 0.9914448614f, 0.9909026354f, 0.9903438286f, 0.9897684502f,
+    0.9891765100f, 0.9885680177f, 0.9879429836f, 0.9873014182f, 0.9866433321f, 0.9859687364f,
+    0.9852776424f, 0.9845700616f, 0.9838460059f, 0.9831054874f, 0.9823485185f, 0.9815751119f,
+    0.9807852804f, 0.9799790374f, 0.9791563962f, 0.9783173707f, 0.9774619749f, 0.9765902232f,
+    0.9757021300f, 0.9747977104f, 0.9738769793f, 0.9729399522f, 0.9719866448f, 0.9710170731f,
+    0.9700312532f, 0.9690292017f, 0.9680109353f, 0.9669764710f, 0.9659258263f, 0.9648590186f,
+    0.9637760658f, 0.9626769860f, 0.9615617977f, 0.9604305194f, 0.9592831702f, 0.9581197691f,
+    0.9569403357f, 0.9557448898f, 0.9545334512f, 0.9533060404f, 0.9520626777f, 0.9508033841f,
+    0.9495281806f, 0.9482370885f, 0.9469301295f, 0.9456073254f, 0.9442686983f, 0.9429142707f,
+    0.9415440652f, 0.9401581047f, 0.9387564125f, 0.9373390119f, 0.9359059268f, 0.9344571810f,
+    0.9329927988f, 0.9315128048f, 0.9300172237f, 0.9285060805f, 0.9269794005f, 0.9254372092f,
+    0.9238795325f, 0.9223063964f, 0.9207178273f, 0.9191138517f, 0.9174944964f, 0.9158597887f,
+    0.9142097557f, 0.9125444252f, 0.9108638249f, 0.9091679831f, 0.9074569281f, 0.9057306884f,
+    0.9039892931f, 0.9022327713f, 0.9004611522f, 0.8986744657f, 0.8968727415f, 0.8950560099f,
+    0.8932243012f, 0.8913776461f, 0.8895160754f, 0.8876396204f, 0.8857483124f, 0.8838421831f,
+    0.8819212643f, 0.8799855883f, 0.8780351874f, 0.8760700942f, 0.8740903416f, 0.8720959628f,
+    0.8700869911f, 0.8680634601f, 0.8660254038f, 0.8639728561f, 0.8619058515f, 0.8598244245f,
+    0.8577286100f, 0.8556184430f, 0.8534939589f, 0.8513551931f, 0.8492021815f, 0.8470349602f,
+    0.8448535652f, 0.8426580333f, 0.8404484011f, 0.8382247056f, 0.8359869839f, 0.8337352736f,
+    0.8314696123f, 0.8291900379f, 0.8268965886f, 0.8245893028f, 0.8222682190f, 0.8199333761f,
+    0.8175848132f, 0.8152225695f, 0.8128466846f, 0.8104571983f, 0.8080541504f, 0.8056375814f,
+    0.8032075315f, 0.8007640414f, 0.7983071521f, 0.7958369046f, 0.7933533403f, 0.7908565007f,
+    0.7883464276f, 0.7858231631f, 0.7832867492f, 0.7807372286f, 0.7781746438f, 0.7755990377f,
+    0.7730104534f, 0.7704089342f, 0.7677945237f, 0.7651672656f, 0.7625272039f, 0.7598743827f,
+    0.7572088465f, 0.7545306398f, 0.7518398075f, 0.7491363945f, 0.7464204462f, 0.7436920079f,
+    0.7409511254f, 0.7381978444f, 0.7354322111f, 0.7326542717f, 0.7298640727f, 0.7270616608f,
+    0.7242470830f, 0.7214203862f, 0.7185816178f, 0.7157308253f, 0.7128680564f, 0.7099933590f,
+    0.7071067812f, 0.7042083713f, 0.7012981778f, 0.6983762494f, 0.6954426350f, 0.6924973837f,
+    0.6895405447f, 0.6865721676f, 0.6835923020f, 0.6806009978f, 0.6775983050f, 0.6745842739f,
+    0.6715589548f, 0.6685223986f, 0.6654746558f, 0.6624157776f, 0.6593458151f, 0.6562648197f,
+    0.6531728430f, 0.6500699366f, 0.6469561525f, 0.6438315429f, 0.6406961599f, 0.6375500561f,
+    0.6343932842f, 0.6312258968f, 0.6280479471f, 0.6248594881f, 0.6216605734f, 0.6184512563f,
+    0.6152315906f, 0.6120016301f, 0.6087614290f, 0.6055110414f, 0.6022505217f, 0.5989799245f,
+    0.5956993045f, 0.5924087166f, 0.5891082158f, 0.5857978575f, 0.5824776969f, 0.5791477896f,
+    0.5758081914f, 0.5724589582f, 0.5691001459f, 0.5657318108f, 0.5623540092f, 0.5589667978f,
+    0.5555702330f, 0.5521643719f, 0.5487492713f, 0.5453249884f, 0.5418915806f, 0.5384491052f,
+    0.5349976199f, 0.5315371824f, 0.5280678507f, 0.5245896827f, 0.5211027367f, 0.5176070710f,
+    0.5141027442f, 0.5105898148f, 0.5070683417f, 0.5035383837f, 0.5000000000f, 0.4964532497f,
+    0.4928981922f, 0.4893348870f, 0.4857633937f, 0.4821837721f, 0.4785960820f, 0.4750003835f,
+    0.4713967368f, 0.4677852022f, 0.4641658400f, 0.4605387110f, 0.4569038756f, 0.4532613949f,
+    0.4496113297f, 0.4459537410f, 0.4422886902f, 0.4386162385f, 0.4349364474f, 0.4312493785f,
+    0.4275550934f, 0.4238536540f, 0.4201451222f, 0.4164295601f, 0.4127070298f, 0.4089775936f,
+    0.4052413140f, 0.4014982534f, 0.3977484745f, 0.3939920401f, 0.3902290129f, 0.3864594560f,
+    0.3826834324f, 0.3789010053f, 0.3751122380f, 0.3713171940f, 0.3675159366f, 0.3637085296f,
+    0.3598950365f, 0.3560755214f, 0.3522500479f, 0.3484186802f, 0.3445814824f, 0.3407385187f,
+    0.3368898534f, 0.3330355508f, 0.3291756756f, 0.3253102922f, 0.3214394653f, 0.3175632598f,
+    0.3136817404f, 0.3097949722f, 0.3059030201f, 0.3020059493f, 0.2981038250f, 0.2941967126f,
+    0.2902846773f, 0.2863677846f, 0.2824461001f, 0.2785196894f, 0.2745886182f, 0.2706529523f,
+    0.2667127575f, 0.2627680998f, 0.2588190451f, 0.2548656596f, 0.2509080094f, 0.2469461607f,
+    0.2429801799f, 0.2390101332f, 0.2350360872f, 0.2310581083f, 0.2270762630f, 0.2230906181f,
+    0.2191012402f, 0.2151081960f, 0.2111115524f, 0.2071113762f, 0.2031077344f, 0.1991006940f,
+    0.1950903220f, 0.1910766856f, 0.1870598518f, 0.1830398880f, 0.1790168613f, 0.1749908391f,
+    0.1709618888f, 0.1669300777f, 0.1628954734f, 0.1588581433f, 0.1548181551f, 0.1507755762f,
+    0.1467304745f, 0.1426829174f, 0.1386329728f, 0.1345807085f, 0.1305261922f, 0.1264694918f,
+    0.1224106752f, 0.1183498103f, 0.1142869650f, 0.1102222073f, 0.1061556053f, 0.1020872269f,
+    0.0980171403f, 0.0939454136f, 0.0898721149f, 0.0857973123f, 0.0817210741f, 0.0776434685f,
+    0.0735645636f, 0.0694844278f, 0.0654031292f, 0.0613207363f, 0.0572373173f, 0.0531529405f,
+    0.0490676743f, 0.0449815871f, 0.0408947472f, 0.0368072229f, 0.0327190828f, 0.0286303952f,
+    0.0245412285f, 0.0204516512f, 0.0163617316f, 0.0122715383f, 0.0081811396f, 0.0040906040f,
+};
+
+const FLOAT32 ixheaacd_sine_pi_n_by_704[704] = {
+    0.0000000000f, 0.0044624748f, 0.0089248606f, 0.0133870688f, 0.0178490104f, 0.0223105965f,
+    0.0267717384f, 0.0312323471f, 0.0356923338f, 0.0401516098f, 0.0446100863f, 0.0490676743f,
+    0.0535242853f, 0.0579798303f, 0.0624342208f, 0.0668873680f, 0.0713391832f, 0.0757895778f,
+    0.0802384631f, 0.0846857505f, 0.0891313516f, 0.0935751777f, 0.0980171403f, 0.1024571511f,
+    0.1068951216f, 0.1113309633f, 0.1157645881f, 0.1201959075f, 0.1246248334f, 0.1290512776f,
+    0.1334751518f, 0.1378963681f, 0.1423148383f, 0.1467304745f, 0.1511431887f, 0.1555528931f,
+    0.1599594998f, 0.1643629212f, 0.1687630694f, 0.1731598570f, 0.1775531963f, 0.1819429998f,
+    0.1863291801f, 0.1907116500f, 0.1950903220f, 0.1994651091f, 0.2038359240f, 0.2082026798f,
+    0.2125652896f, 0.2169236663f, 0.2212777232f, 0.2256273737f, 0.2299725311f, 0.2343131089f,
+    0.2386490206f, 0.2429801799f, 0.2473065006f, 0.2516278964f, 0.2559442814f, 0.2602555695f,
+    0.2645616750f, 0.2688625121f, 0.2731579951f, 0.2774480385f, 0.2817325568f, 0.2860114648f,
+    0.2902846773f, 0.2945521090f, 0.2988136751f, 0.3030692907f, 0.3073188711f, 0.3115623315f,
+    0.3157995876f, 0.3200305549f, 0.3242551492f, 0.3284732864f, 0.3326848824f, 0.3368898534f,
+    0.3410881156f, 0.3452795855f, 0.3494641796f, 0.3536418145f, 0.3578124071f, 0.3619758743f,
+    0.3661321331f, 0.3702811009f, 0.3744226950f, 0.3785568329f, 0.3826834324f, 0.3868024111f,
+    0.3909136872f, 0.3950171787f, 0.3991128039f, 0.4032004812f, 0.4072801293f, 0.4113516669f,
+    0.4154150130f, 0.4194700866f, 0.4235168069f, 0.4275550934f, 0.4315848657f, 0.4356060435f,
+    0.4396185467f, 0.4436222955f, 0.4476172101f, 0.4516032109f, 0.4555802186f, 0.4595481539f,
+    0.4635069380f, 0.4674564918f, 0.4713967368f, 0.4753275946f, 0.4792489867f, 0.4831608352f,
+    0.4870630622f, 0.4909555898f, 0.4948383407f, 0.4987112375f, 0.5025742031f, 0.5064271605f,
+    0.5102700331f, 0.5141027442f, 0.5179252176f, 0.5217373772f, 0.5255391469f, 0.5293304513f,
+    0.5331112146f, 0.5368813617f, 0.5406408175f, 0.5443895070f, 0.5481273557f, 0.5518542891f,
+    0.5555702330f, 0.5592751134f, 0.5629688565f, 0.5666513888f, 0.5703226369f, 0.5739825278f,
+    0.5776309884f, 0.5812679463f, 0.5848933289f, 0.5885070641f, 0.5921090798f, 0.5956993045f,
+    0.5992776665f, 0.6028440946f, 0.6063985179f, 0.6099408654f, 0.6134710667f, 0.6169890515f,
+    0.6204947497f, 0.6239880915f, 0.6274690074f, 0.6309374279f, 0.6343932842f, 0.6378365072f,
+    0.6412670285f, 0.6446847798f, 0.6480896929f, 0.6514817002f, 0.6548607339f, 0.6582267270f,
+    0.6615796122f, 0.6649193229f, 0.6682457925f, 0.6715589548f, 0.6748587439f, 0.6781450940f,
+    0.6814179396f, 0.6846772156f, 0.6879228571f, 0.6911547995f, 0.6943729784f, 0.6975773296f,
+    0.7007677895f, 0.7039442944f, 0.7071067812f, 0.7102551868f, 0.7133894485f, 0.7165095039f,
+    0.7196152909f, 0.7227067477f, 0.7257838126f, 0.7288464244f, 0.7318945222f, 0.7349280451f,
+    0.7379469329f, 0.7409511254f, 0.7439405627f, 0.7469151853f, 0.7498749341f, 0.7528197499f,
+    0.7557495744f, 0.7586643489f, 0.7615640156f, 0.7644485167f, 0.7673177947f, 0.7701717926f,
+    0.7730104534f, 0.7758337206f, 0.7786415380f, 0.7814338498f, 0.7842106003f, 0.7869717341f,
+    0.7897171964f, 0.7924469324f, 0.7951608878f, 0.7978590086f, 0.8005412409f, 0.8032075315f,
+    0.8058578271f, 0.8084920751f, 0.8111102230f, 0.8137122185f, 0.8162980100f, 0.8188675460f,
+    0.8214207751f, 0.8239576467f, 0.8264781102f, 0.8289821153f, 0.8314696123f, 0.8339405516f,
+    0.8363948840f, 0.8388325606f, 0.8412535328f, 0.8436577526f, 0.8460451719f, 0.8484157432f,
+    0.8507694194f, 0.8531061536f, 0.8554258992f, 0.8577286100f, 0.8600142402f, 0.8622827443f,
+    0.8645340770f, 0.8667681937f, 0.8689850497f, 0.8711846009f, 0.8733668035f, 0.8755316141f,
+    0.8776789896f, 0.8798088871f, 0.8819212643f, 0.8840160792f, 0.8860932899f, 0.8881528552f,
+    0.8901947340f, 0.8922188857f, 0.8942252699f, 0.8962138467f, 0.8981845764f, 0.9001374200f,
+    0.9020723384f, 0.9039892931f, 0.9058882460f, 0.9077691592f, 0.9096319954f, 0.9114767173f,
+    0.9133032882f, 0.9151116718f, 0.9169018321f, 0.9186737335f, 0.9204273405f, 0.9221626184f,
+    0.9238795325f, 0.9255780487f, 0.9272581331f, 0.9289197523f, 0.9305628733f, 0.9321874631f,
+    0.9337934897f, 0.9353809208f, 0.9369497250f, 0.9384998710f, 0.9400313279f, 0.9415440652f,
+    0.9430380528f, 0.9445132610f, 0.9459696603f, 0.9474072218f, 0.9488259168f, 0.9502257172f,
+    0.9516065949f, 0.9529685226f, 0.9543114730f, 0.9556354195f, 0.9569403357f, 0.9582261956f,
+    0.9594929736f, 0.9607406445f, 0.9619691833f, 0.9631785658f, 0.9643687677f, 0.9655397654f,
+    0.9666915355f, 0.9678240552f, 0.9689373018f, 0.9700312532f, 0.9711058876f, 0.9721611837f,
+    0.9731971203f, 0.9742136769f, 0.9752108332f, 0.9761885694f, 0.9771468660f, 0.9780857039f,
+    0.9790050644f, 0.9799049292f, 0.9807852804f, 0.9816461005f, 0.9824873722f, 0.9833090790f,
+    0.9841112043f, 0.9848937323f, 0.9856566473f, 0.9863999342f, 0.9871235781f, 0.9878275646f,
+    0.9885118798f, 0.9891765100f, 0.9898214419f, 0.9904466627f, 0.9910521600f, 0.9916379217f,
+    0.9922039361f, 0.9927501920f, 0.9932766785f, 0.9937833852f, 0.9942703018f, 0.9947374187f,
+    0.9951847267f, 0.9956122167f, 0.9960198804f, 0.9964077096f, 0.9967756965f, 0.9971238338f,
+    0.9974521146f, 0.9977605324f, 0.9980490810f, 0.9983177547f, 0.9985665481f, 0.9987954562f,
+    0.9990044746f, 0.9991935990f, 0.9993628257f, 0.9995121512f, 0.9996415728f, 0.9997510877f,
+    0.9998406937f, 0.9999103892f, 0.9999601726f, 0.9999900431f, 1.0000000000f, 0.9999900431f,
+    0.9999601726f, 0.9999103892f, 0.9998406937f, 0.9997510877f, 0.9996415728f, 0.9995121512f,
+    0.9993628257f, 0.9991935990f, 0.9990044746f, 0.9987954562f, 0.9985665481f, 0.9983177547f,
+    0.9980490810f, 0.9977605324f, 0.9974521146f, 0.9971238338f, 0.9967756965f, 0.9964077096f,
+    0.9960198804f, 0.9956122167f, 0.9951847267f, 0.9947374187f, 0.9942703018f, 0.9937833852f,
+    0.9932766785f, 0.9927501920f, 0.9922039361f, 0.9916379217f, 0.9910521600f, 0.9904466627f,
+    0.9898214419f, 0.9891765100f, 0.9885118798f, 0.9878275646f, 0.9871235781f, 0.9863999342f,
+    0.9856566473f, 0.9848937323f, 0.9841112043f, 0.9833090790f, 0.9824873722f, 0.9816461005f,
+    0.9807852804f, 0.9799049292f, 0.9790050644f, 0.9780857039f, 0.9771468660f, 0.9761885694f,
+    0.9752108332f, 0.9742136769f, 0.9731971203f, 0.9721611837f, 0.9711058876f, 0.9700312532f,
+    0.9689373018f, 0.9678240552f, 0.9666915355f, 0.9655397654f, 0.9643687677f, 0.9631785658f,
+    0.9619691833f, 0.9607406445f, 0.9594929736f, 0.9582261956f, 0.9569403357f, 0.9556354195f,
+    0.9543114730f, 0.9529685226f, 0.9516065949f, 0.9502257172f, 0.9488259168f, 0.9474072218f,
+    0.9459696603f, 0.9445132610f, 0.9430380528f, 0.9415440652f, 0.9400313279f, 0.9384998710f,
+    0.9369497250f, 0.9353809208f, 0.9337934897f, 0.9321874631f, 0.9305628733f, 0.9289197523f,
+    0.9272581331f, 0.9255780487f, 0.9238795325f, 0.9221626184f, 0.9204273405f, 0.9186737335f,
+    0.9169018321f, 0.9151116718f, 0.9133032882f, 0.9114767173f, 0.9096319954f, 0.9077691592f,
+    0.9058882460f, 0.9039892931f, 0.9020723384f, 0.9001374200f, 0.8981845764f, 0.8962138467f,
+    0.8942252699f, 0.8922188857f, 0.8901947340f, 0.8881528552f, 0.8860932899f, 0.8840160792f,
+    0.8819212643f, 0.8798088871f, 0.8776789896f, 0.8755316141f, 0.8733668035f, 0.8711846009f,
+    0.8689850497f, 0.8667681937f, 0.8645340770f, 0.8622827443f, 0.8600142402f, 0.8577286100f,
+    0.8554258992f, 0.8531061536f, 0.8507694194f, 0.8484157432f, 0.8460451719f, 0.8436577526f,
+    0.8412535328f, 0.8388325606f, 0.8363948840f, 0.8339405516f, 0.8314696123f, 0.8289821153f,
+    0.8264781102f, 0.8239576467f, 0.8214207751f, 0.8188675460f, 0.8162980100f, 0.8137122185f,
+    0.8111102230f, 0.8084920751f, 0.8058578271f, 0.8032075315f, 0.8005412409f, 0.7978590086f,
+    0.7951608878f, 0.7924469324f, 0.7897171964f, 0.7869717341f, 0.7842106003f, 0.7814338498f,
+    0.7786415380f, 0.7758337206f, 0.7730104534f, 0.7701717926f, 0.7673177947f, 0.7644485167f,
+    0.7615640156f, 0.7586643489f, 0.7557495744f, 0.7528197499f, 0.7498749341f, 0.7469151853f,
+    0.7439405627f, 0.7409511254f, 0.7379469329f, 0.7349280451f, 0.7318945222f, 0.7288464244f,
+    0.7257838126f, 0.7227067477f, 0.7196152909f, 0.7165095039f, 0.7133894485f, 0.7102551868f,
+    0.7071067812f, 0.7039442944f, 0.7007677895f, 0.6975773296f, 0.6943729784f, 0.6911547995f,
+    0.6879228571f, 0.6846772156f, 0.6814179396f, 0.6781450940f, 0.6748587439f, 0.6715589548f,
+    0.6682457925f, 0.6649193229f, 0.6615796122f, 0.6582267270f, 0.6548607339f, 0.6514817002f,
+    0.6480896929f, 0.6446847798f, 0.6412670285f, 0.6378365072f, 0.6343932842f, 0.6309374279f,
+    0.6274690074f, 0.6239880915f, 0.6204947497f, 0.6169890515f, 0.6134710667f, 0.6099408654f,
+    0.6063985179f, 0.6028440946f, 0.5992776665f, 0.5956993045f, 0.5921090798f, 0.5885070641f,
+    0.5848933289f, 0.5812679463f, 0.5776309884f, 0.5739825278f, 0.5703226369f, 0.5666513888f,
+    0.5629688565f, 0.5592751134f, 0.5555702330f, 0.5518542891f, 0.5481273557f, 0.5443895070f,
+    0.5406408175f, 0.5368813617f, 0.5331112146f, 0.5293304513f, 0.5255391469f, 0.5217373772f,
+    0.5179252176f, 0.5141027442f, 0.5102700331f, 0.5064271605f, 0.5025742031f, 0.4987112375f,
+    0.4948383407f, 0.4909555898f, 0.4870630622f, 0.4831608352f, 0.4792489867f, 0.4753275946f,
+    0.4713967368f, 0.4674564918f, 0.4635069380f, 0.4595481539f, 0.4555802186f, 0.4516032109f,
+    0.4476172101f, 0.4436222955f, 0.4396185467f, 0.4356060435f, 0.4315848657f, 0.4275550934f,
+    0.4235168069f, 0.4194700866f, 0.4154150130f, 0.4113516669f, 0.4072801293f, 0.4032004812f,
+    0.3991128039f, 0.3950171787f, 0.3909136872f, 0.3868024111f, 0.3826834324f, 0.3785568329f,
+    0.3744226950f, 0.3702811009f, 0.3661321331f, 0.3619758743f, 0.3578124071f, 0.3536418145f,
+    0.3494641796f, 0.3452795855f, 0.3410881156f, 0.3368898534f, 0.3326848824f, 0.3284732864f,
+    0.3242551492f, 0.3200305549f, 0.3157995876f, 0.3115623315f, 0.3073188711f, 0.3030692907f,
+    0.2988136751f, 0.2945521090f, 0.2902846773f, 0.2860114648f, 0.2817325568f, 0.2774480385f,
+    0.2731579951f, 0.2688625121f, 0.2645616750f, 0.2602555695f, 0.2559442814f, 0.2516278964f,
+    0.2473065006f, 0.2429801799f, 0.2386490206f, 0.2343131089f, 0.2299725311f, 0.2256273737f,
+    0.2212777232f, 0.2169236663f, 0.2125652896f, 0.2082026798f, 0.2038359240f, 0.1994651091f,
+    0.1950903220f, 0.1907116500f, 0.1863291801f, 0.1819429998f, 0.1775531963f, 0.1731598570f,
+    0.1687630694f, 0.1643629212f, 0.1599594998f, 0.1555528931f, 0.1511431887f, 0.1467304745f,
+    0.1423148383f, 0.1378963681f, 0.1334751518f, 0.1290512776f, 0.1246248334f, 0.1201959075f,
+    0.1157645881f, 0.1113309633f, 0.1068951216f, 0.1024571511f, 0.0980171403f, 0.0935751777f,
+    0.0891313516f, 0.0846857505f, 0.0802384631f, 0.0757895778f, 0.0713391832f, 0.0668873680f,
+    0.0624342208f, 0.0579798303f, 0.0535242853f, 0.0490676743f, 0.0446100863f, 0.0401516098f,
+    0.0356923338f, 0.0312323471f, 0.0267717384f, 0.0223105965f, 0.0178490104f, 0.0133870688f,
+    0.0089248606f, 0.0044624748f,
+};
+
+const FLOAT32 ixheaacd_sine_pi_n_by_640[640] = {
+    0.0000000000f, 0.0049087188f, 0.0098173193f, 0.0147256833f, 0.0196336925f, 0.0245412285f,
+    0.0294481732f, 0.0343544084f, 0.0392598158f, 0.0441642771f, 0.0490676743f, 0.0539698892f,
+    0.0588708037f, 0.0637702996f, 0.0686682589f, 0.0735645636f, 0.0784590957f, 0.0833517373f,
+    0.0882423705f, 0.0931308775f, 0.0980171403f, 0.1029010414f, 0.1077824630f, 0.1126612876f,
+    0.1175373975f, 0.1224106752f, 0.1272810034f, 0.1321482646f, 0.1370123417f, 0.1418731173f,
+    0.1467304745f, 0.1515842960f, 0.1564344650f, 0.1612808647f, 0.1661233781f, 0.1709618888f,
+    0.1757962799f, 0.1806264352f, 0.1854522381f, 0.1902735724f, 0.1950903220f, 0.1999023708f,
+    0.2047096027f, 0.2095119021f, 0.2143091531f, 0.2191012402f, 0.2238880479f, 0.2286694608f,
+    0.2334453639f, 0.2382156419f, 0.2429801799f, 0.2477388632f, 0.2524915770f, 0.2572382069f,
+    0.2619786385f, 0.2667127575f, 0.2714404499f, 0.2761616017f, 0.2808760993f, 0.2855838289f,
+    0.2902846773f, 0.2949785310f, 0.2996652770f, 0.3043448024f, 0.3090169944f, 0.3136817404f,
+    0.3183389281f, 0.3229884451f, 0.3276301796f, 0.3322640195f, 0.3368898534f, 0.3415075697f,
+    0.3461170571f, 0.3507182046f, 0.3553109013f, 0.3598950365f, 0.3644704999f, 0.3690371811f,
+    0.3735949701f, 0.3781437570f, 0.3826834324f, 0.3872138867f, 0.3917350109f, 0.3962466959f,
+    0.4007488331f, 0.4052413140f, 0.4097240303f, 0.4141968741f, 0.4186597375f, 0.4231125131f,
+    0.4275550934f, 0.4319873716f, 0.4364092407f, 0.4408205942f, 0.4452213259f, 0.4496113297f,
+    0.4539904997f, 0.4583587306f, 0.4627159170f, 0.4670619540f, 0.4713967368f, 0.4757201610f,
+    0.4800321224f, 0.4843325171f, 0.4886212415f, 0.4928981922f, 0.4971632663f, 0.5014163608f,
+    0.5056573734f, 0.5098862018f, 0.5141027442f, 0.5183068989f, 0.5224985647f, 0.5266776406f,
+    0.5308440257f, 0.5349976199f, 0.5391383229f, 0.5432660350f, 0.5473806568f, 0.5514820891f,
+    0.5555702330f, 0.5596449901f, 0.5637062622f, 0.5677539514f, 0.5717879602f, 0.5758081914f,
+    0.5798145481f, 0.5838069338f, 0.5877852523f, 0.5917494077f, 0.5956993045f, 0.5996348475f,
+    0.6035559420f, 0.6074624933f, 0.6113544074f, 0.6152315906f, 0.6190939493f, 0.6229413906f,
+    0.6267738216f, 0.6305911501f, 0.6343932842f, 0.6381801321f, 0.6419516026f, 0.6457076048f,
+    0.6494480483f, 0.6531728430f, 0.6568818989f, 0.6605751269f, 0.6642524379f, 0.6679137433f,
+    0.6715589548f, 0.6751879847f, 0.6788007455f, 0.6823971502f, 0.6859771120f, 0.6895405447f,
+    0.6930873625f, 0.6966174800f, 0.7001308119f, 0.7036272737f, 0.7071067812f, 0.7105692504f,
+    0.7140145981f, 0.7174427410f, 0.7208535967f, 0.7242470830f, 0.7276231180f, 0.7309816205f,
+    0.7343225094f, 0.7376457044f, 0.7409511254f, 0.7442386926f, 0.7475083269f, 0.7507599494f,
+    0.7539934820f, 0.7572088465f, 0.7604059656f, 0.7635847622f, 0.7667451597f, 0.7698870820f,
+    0.7730104534f, 0.7761151985f, 0.7792012426f, 0.7822685114f, 0.7853169309f, 0.7883464276f,
+    0.7913569286f, 0.7943483614f, 0.7973206538f, 0.8002737342f, 0.8032075315f, 0.8061219750f,
+    0.8090169944f, 0.8118925200f, 0.8147484825f, 0.8175848132f, 0.8204014435f, 0.8231983058f,
+    0.8259753325f, 0.8287324568f, 0.8314696123f, 0.8341867329f, 0.8368837533f, 0.8395606084f,
+    0.8422172337f, 0.8448535652f, 0.8474695395f, 0.8500650934f, 0.8526401644f, 0.8551946904f,
+    0.8577286100f, 0.8602418620f, 0.8627343860f, 0.8652061218f, 0.8676570098f, 0.8700869911f,
+    0.8724960071f, 0.8748839997f, 0.8772509113f, 0.8795966851f, 0.8819212643f, 0.8842245931f,
+    0.8865066159f, 0.8887672778f, 0.8910065242f, 0.8932243012f, 0.8954205554f, 0.8975952338f,
+    0.8997482841f, 0.9018796543f, 0.9039892931f, 0.9060771497f, 0.9081431738f, 0.9101873156f,
+    0.9122095258f, 0.9142097557f, 0.9161879571f, 0.9181440824f, 0.9200780843f, 0.9219899164f,
+    0.9238795325f, 0.9257468871f, 0.9275919353f, 0.9294146324f, 0.9312149348f, 0.9329927988f,
+    0.9347481818f, 0.9364810414f, 0.9381913359f, 0.9398790241f, 0.9415440652f, 0.9431864192f,
+    0.9448060465f, 0.9464029080f, 0.9479769654f, 0.9495281806f, 0.9510565163f, 0.9525619357f,
+    0.9540444024f, 0.9555038808f, 0.9569403357f, 0.9583537325f, 0.9597440372f, 0.9611112161f,
+    0.9624552365f, 0.9637760658f, 0.9650736723f, 0.9663480247f, 0.9675990924f, 0.9688268450f,
+    0.9700312532f, 0.9712122878f, 0.9723699204f, 0.9735041231f, 0.9746148686f, 0.9757021300f,
+    0.9767658813f, 0.9778060968f, 0.9788227513f, 0.9798158205f, 0.9807852804f, 0.9817311076f,
+    0.9826532793f, 0.9835517734f, 0.9844265681f, 0.9852776424f, 0.9861049758f, 0.9869085483f,
+    0.9876883406f, 0.9884443339f, 0.9891765100f, 0.9898848512f, 0.9905693404f, 0.9912299613f,
+    0.9918666978f, 0.9924795346f, 0.9930684570f, 0.9936334507f, 0.9941745021f, 0.9946915983f,
+    0.9951847267f, 0.9956538754f, 0.9960990333f, 0.9965201894f, 0.9969173337f, 0.9972904567f,
+    0.9976395492f, 0.9979646030f, 0.9982656102f, 0.9985425635f, 0.9987954562f, 0.9990242823f,
+    0.9992290362f, 0.9994097131f, 0.9995663085f, 0.9996988187f, 0.9998072405f, 0.9998915712f,
+    0.9999518090f, 0.9999879522f, 1.0000000000f, 0.9999879522f, 0.9999518090f, 0.9998915712f,
+    0.9998072405f, 0.9996988187f, 0.9995663085f, 0.9994097131f, 0.9992290362f, 0.9990242823f,
+    0.9987954562f, 0.9985425635f, 0.9982656102f, 0.9979646030f, 0.9976395492f, 0.9972904567f,
+    0.9969173337f, 0.9965201894f, 0.9960990333f, 0.9956538754f, 0.9951847267f, 0.9946915983f,
+    0.9941745021f, 0.9936334507f, 0.9930684570f, 0.9924795346f, 0.9918666978f, 0.9912299613f,
+    0.9905693404f, 0.9898848512f, 0.9891765100f, 0.9884443339f, 0.9876883406f, 0.9869085483f,
+    0.9861049758f, 0.9852776424f, 0.9844265681f, 0.9835517734f, 0.9826532793f, 0.9817311076f,
+    0.9807852804f, 0.9798158205f, 0.9788227513f, 0.9778060968f, 0.9767658813f, 0.9757021300f,
+    0.9746148686f, 0.9735041231f, 0.9723699204f, 0.9712122878f, 0.9700312532f, 0.9688268450f,
+    0.9675990924f, 0.9663480247f, 0.9650736723f, 0.9637760658f, 0.9624552365f, 0.9611112161f,
+    0.9597440372f, 0.9583537325f, 0.9569403357f, 0.9555038808f, 0.9540444024f, 0.9525619357f,
+    0.9510565163f, 0.9495281806f, 0.9479769654f, 0.9464029080f, 0.9448060465f, 0.9431864192f,
+    0.9415440652f, 0.9398790241f, 0.9381913359f, 0.9364810414f, 0.9347481818f, 0.9329927988f,
+    0.9312149348f, 0.9294146324f, 0.9275919353f, 0.9257468871f, 0.9238795325f, 0.9219899164f,
+    0.9200780843f, 0.9181440824f, 0.9161879571f, 0.9142097557f, 0.9122095258f, 0.9101873156f,
+    0.9081431738f, 0.9060771497f, 0.9039892931f, 0.9018796543f, 0.8997482841f, 0.8975952338f,
+    0.8954205554f, 0.8932243012f, 0.8910065242f, 0.8887672778f, 0.8865066159f, 0.8842245931f,
+    0.8819212643f, 0.8795966851f, 0.8772509113f, 0.8748839997f, 0.8724960071f, 0.8700869911f,
+    0.8676570098f, 0.8652061218f, 0.8627343860f, 0.8602418620f, 0.8577286100f, 0.8551946904f,
+    0.8526401644f, 0.8500650934f, 0.8474695395f, 0.8448535652f, 0.8422172337f, 0.8395606084f,
+    0.8368837533f, 0.8341867329f, 0.8314696123f, 0.8287324568f, 0.8259753325f, 0.8231983058f,
+    0.8204014435f, 0.8175848132f, 0.8147484825f, 0.8118925200f, 0.8090169944f, 0.8061219750f,
+    0.8032075315f, 0.8002737342f, 0.7973206538f, 0.7943483614f, 0.7913569286f, 0.7883464276f,
+    0.7853169309f, 0.7822685114f, 0.7792012426f, 0.7761151985f, 0.7730104534f, 0.7698870820f,
+    0.7667451597f, 0.7635847622f, 0.7604059656f, 0.7572088465f, 0.7539934820f, 0.7507599494f,
+    0.7475083269f, 0.7442386926f, 0.7409511254f, 0.7376457044f, 0.7343225094f, 0.7309816205f,
+    0.7276231180f, 0.7242470830f, 0.7208535967f, 0.7174427410f, 0.7140145981f, 0.7105692504f,
+    0.7071067812f, 0.7036272737f, 0.7001308119f, 0.6966174800f, 0.6930873625f, 0.6895405447f,
+    0.6859771120f, 0.6823971502f, 0.6788007455f, 0.6751879847f, 0.6715589548f, 0.6679137433f,
+    0.6642524379f, 0.6605751269f, 0.6568818989f, 0.6531728430f, 0.6494480483f, 0.6457076048f,
+    0.6419516026f, 0.6381801321f, 0.6343932842f, 0.6305911501f, 0.6267738216f, 0.6229413906f,
+    0.6190939493f, 0.6152315906f, 0.6113544074f, 0.6074624933f, 0.6035559420f, 0.5996348475f,
+    0.5956993045f, 0.5917494077f, 0.5877852523f, 0.5838069338f, 0.5798145481f, 0.5758081914f,
+    0.5717879602f, 0.5677539514f, 0.5637062622f, 0.5596449901f, 0.5555702330f, 0.5514820891f,
+    0.5473806568f, 0.5432660350f, 0.5391383229f, 0.5349976199f, 0.5308440257f, 0.5266776406f,
+    0.5224985647f, 0.5183068989f, 0.5141027442f, 0.5098862018f, 0.5056573734f, 0.5014163608f,
+    0.4971632663f, 0.4928981922f, 0.4886212415f, 0.4843325171f, 0.4800321224f, 0.4757201610f,
+    0.4713967368f, 0.4670619540f, 0.4627159170f, 0.4583587306f, 0.4539904997f, 0.4496113297f,
+    0.4452213259f, 0.4408205942f, 0.4364092407f, 0.4319873716f, 0.4275550934f, 0.4231125131f,
+    0.4186597375f, 0.4141968741f, 0.4097240303f, 0.4052413140f, 0.4007488331f, 0.3962466959f,
+    0.3917350109f, 0.3872138867f, 0.3826834324f, 0.3781437570f, 0.3735949701f, 0.3690371811f,
+    0.3644704999f, 0.3598950365f, 0.3553109013f, 0.3507182046f, 0.3461170571f, 0.3415075697f,
+    0.3368898534f, 0.3322640195f, 0.3276301796f, 0.3229884451f, 0.3183389281f, 0.3136817404f,
+    0.3090169944f, 0.3043448024f, 0.2996652770f, 0.2949785310f, 0.2902846773f, 0.2855838289f,
+    0.2808760993f, 0.2761616017f, 0.2714404499f, 0.2667127575f, 0.2619786385f, 0.2572382069f,
+    0.2524915770f, 0.2477388632f, 0.2429801799f, 0.2382156419f, 0.2334453639f, 0.2286694608f,
+    0.2238880479f, 0.2191012402f, 0.2143091531f, 0.2095119021f, 0.2047096027f, 0.1999023708f,
+    0.1950903220f, 0.1902735724f, 0.1854522381f, 0.1806264352f, 0.1757962799f, 0.1709618888f,
+    0.1661233781f, 0.1612808647f, 0.1564344650f, 0.1515842960f, 0.1467304745f, 0.1418731173f,
+    0.1370123417f, 0.1321482646f, 0.1272810034f, 0.1224106752f, 0.1175373975f, 0.1126612876f,
+    0.1077824630f, 0.1029010414f, 0.0980171403f, 0.0931308775f, 0.0882423705f, 0.0833517373f,
+    0.0784590957f, 0.0735645636f, 0.0686682589f, 0.0637702996f, 0.0588708037f, 0.0539698892f,
+    0.0490676743f, 0.0441642771f, 0.0392598158f, 0.0343544084f, 0.0294481732f, 0.0245412285f,
+    0.0196336925f, 0.0147256833f, 0.0098173193f, 0.0049087188f,
+};
+
+const FLOAT32 ixheaacd_sine_pi_n_by_576[576] = {
+    0.0000000000f, 0.0054541269f, 0.0109080915f, 0.0163617316f, 0.0218148850f, 0.0272673895f,
+    0.0327190828f, 0.0381698028f, 0.0436193874f, 0.0490676743f, 0.0545145016f, 0.0599597073f,
+    0.0654031292f, 0.0708446056f, 0.0762839745f, 0.0817210741f, 0.0871557427f, 0.0925878187f,
+    0.0980171403f, 0.1034435462f, 0.1088668749f, 0.1142869650f, 0.1197036553f, 0.1251167847f,
+    0.1305261922f, 0.1359317169f, 0.1413331978f, 0.1467304745f, 0.1521233862f, 0.1575117726f,
+    0.1628954734f, 0.1682743284f, 0.1736481777f, 0.1790168613f, 0.1843802195f, 0.1897380929f,
+    0.1950903220f, 0.2004367476f, 0.2057772107f, 0.2111115524f, 0.2164396139f, 0.2217612369f,
+    0.2270762630f, 0.2323845341f, 0.2376858923f, 0.2429801799f, 0.2482672394f, 0.2535469135f,
+    0.2588190451f, 0.2640834775f, 0.2693400540f, 0.2745886182f, 0.2798290140f, 0.2850610856f,
+    0.2902846773f, 0.2954996336f, 0.3007057995f, 0.3059030201f, 0.3110911408f, 0.3162700072f,
+    0.3214394653f, 0.3265993613f, 0.3317495418f, 0.3368898534f, 0.3420201433f, 0.3471402589f,
+    0.3522500479f, 0.3573493583f, 0.3624380383f, 0.3675159366f, 0.3725829021f, 0.3776387842f,
+    0.3826834324f, 0.3877166966f, 0.3927384271f, 0.3977484745f, 0.4027466899f, 0.4077329244f,
+    0.4127070298f, 0.4176688581f, 0.4226182617f, 0.4275550934f, 0.4324792063f, 0.4373904540f,
+    0.4422886902f, 0.4471737694f, 0.4520455462f, 0.4569038756f, 0.4617486132f, 0.4665796149f,
+    0.4713967368f, 0.4761998358f, 0.4809887689f, 0.4857633937f, 0.4905235682f, 0.4952691506f,
+    0.5000000000f, 0.5047159755f, 0.5094169368f, 0.5141027442f, 0.5187732582f, 0.5234283398f,
+    0.5280678507f, 0.5326916527f, 0.5372996083f, 0.5418915806f, 0.5464674328f, 0.5510270288f,
+    0.5555702330f, 0.5600969103f, 0.5646069260f, 0.5691001459f, 0.5735764364f, 0.5780356642f,
+    0.5824776969f, 0.5869024021f, 0.5913096484f, 0.5956993045f, 0.6000712399f, 0.6044253246f,
+    0.6087614290f, 0.6130794241f, 0.6173791816f, 0.6216605734f, 0.6259234722f, 0.6301677512f,
+    0.6343932842f, 0.6385999454f, 0.6427876097f, 0.6469561525f, 0.6511054499f, 0.6552353784f,
+    0.6593458151f, 0.6634366378f, 0.6675077247f, 0.6715589548f, 0.6755902076f, 0.6796013631f,
+    0.6835923020f, 0.6875629056f, 0.6915130558f, 0.6954426350f, 0.6993515264f, 0.7032396137f,
+    0.7071067812f, 0.7109529139f, 0.7147778973f, 0.7185816178f, 0.7223639621f, 0.7261248177f,
+    0.7298640727f, 0.7335816159f, 0.7372773368f, 0.7409511254f, 0.7446028723f, 0.7482324690f,
+    0.7518398075f, 0.7554247804f, 0.7589872812f, 0.7625272039f, 0.7660444431f, 0.7695388943f,
+    0.7730104534f, 0.7764590172f, 0.7798844831f, 0.7832867492f, 0.7866657144f, 0.7900212780f,
+    0.7933533403f, 0.7966618021f, 0.7999465651f, 0.8032075315f, 0.8064446043f, 0.8096576872f,
+    0.8128466846f, 0.8160115017f, 0.8191520443f, 0.8222682190f, 0.8253599331f, 0.8284270946f,
+    0.8314696123f, 0.8344873957f, 0.8374803550f, 0.8404484011f, 0.8433914458f, 0.8463094016f,
+    0.8492021815f, 0.8520696997f, 0.8549118707f, 0.8577286100f, 0.8605198339f, 0.8632854592f,
+    0.8660254038f, 0.8687395861f, 0.8714279254f, 0.8740903416f, 0.8767267557f, 0.8793370892f,
+    0.8819212643f, 0.8844792044f, 0.8870108332f, 0.8895160754f, 0.8919948566f, 0.8944471029f,
+    0.8968727415f, 0.8992717002f, 0.9016439076f, 0.9039892931f, 0.9063077870f, 0.9085993204f,
+    0.9108638249f, 0.9131012334f, 0.9153114791f, 0.9174944964f, 0.9196502204f, 0.9217785869f,
+    0.9238795325f, 0.9259529948f, 0.9279989122f, 0.9300172237f, 0.9320078693f, 0.9339707898f,
+    0.9359059268f, 0.9378132227f, 0.9396926208f, 0.9415440652f, 0.9433675008f, 0.9451628734f,
+    0.9469301295f, 0.9486692166f, 0.9503800830f, 0.9520626777f, 0.9537169507f, 0.9553428529f,
+    0.9569403357f, 0.9585093518f, 0.9600498544f, 0.9615617977f, 0.9630451367f, 0.9644998273f,
+    0.9659258263f, 0.9673230912f, 0.9686915804f, 0.9700312532f, 0.9713420698f, 0.9726239912f,
+    0.9738769793f, 0.9751009967f, 0.9762960071f, 0.9774619749f, 0.9785988655f, 0.9797066450f,
+    0.9807852804f, 0.9818347397f, 0.9828549917f, 0.9838460059f, 0.9848077530f, 0.9857402043f,
+    0.9866433321f, 0.9875171095f, 0.9883615105f, 0.9891765100f, 0.9899620837f, 0.9907182083f,
+    0.9914448614f, 0.9921420212f, 0.9928096670f, 0.9934477790f, 0.9940563382f, 0.9946353265f,
+    0.9951847267f, 0.9957045224f, 0.9961946981f, 0.9966552393f, 0.9970861323f, 0.9974873643f,
+    0.9978589232f, 0.9982007982f, 0.9985129789f, 0.9987954562f, 0.9990482216f, 0.9992712676f,
+    0.9994645875f, 0.9996281756f, 0.9997620271f, 0.9998661379f, 0.9999405050f, 0.9999851261f,
+    1.0000000000f, 0.9999851261f, 0.9999405050f, 0.9998661379f, 0.9997620271f, 0.9996281756f,
+    0.9994645875f, 0.9992712676f, 0.9990482216f, 0.9987954562f, 0.9985129789f, 0.9982007982f,
+    0.9978589232f, 0.9974873643f, 0.9970861323f, 0.9966552393f, 0.9961946981f, 0.9957045224f,
+    0.9951847267f, 0.9946353265f, 0.9940563382f, 0.9934477790f, 0.9928096670f, 0.9921420212f,
+    0.9914448614f, 0.9907182083f, 0.9899620837f, 0.9891765100f, 0.9883615105f, 0.9875171095f,
+    0.9866433321f, 0.9857402043f, 0.9848077530f, 0.9838460059f, 0.9828549917f, 0.9818347397f,
+    0.9807852804f, 0.9797066450f, 0.9785988655f, 0.9774619749f, 0.9762960071f, 0.9751009967f,
+    0.9738769793f, 0.9726239912f, 0.9713420698f, 0.9700312532f, 0.9686915804f, 0.9673230912f,
+    0.9659258263f, 0.9644998273f, 0.9630451367f, 0.9615617977f, 0.9600498544f, 0.9585093518f,
+    0.9569403357f, 0.9553428529f, 0.9537169507f, 0.9520626777f, 0.9503800830f, 0.9486692166f,
+    0.9469301295f, 0.9451628734f, 0.9433675008f, 0.9415440652f, 0.9396926208f, 0.9378132227f,
+    0.9359059268f, 0.9339707898f, 0.9320078693f, 0.9300172237f, 0.9279989122f, 0.9259529948f,
+    0.9238795325f, 0.9217785869f, 0.9196502204f, 0.9174944964f, 0.9153114791f, 0.9131012334f,
+    0.9108638249f, 0.9085993204f, 0.9063077870f, 0.9039892931f, 0.9016439076f, 0.8992717002f,
+    0.8968727415f, 0.8944471029f, 0.8919948566f, 0.8895160754f, 0.8870108332f, 0.8844792044f,
+    0.8819212643f, 0.8793370892f, 0.8767267557f, 0.8740903416f, 0.8714279254f, 0.8687395861f,
+    0.8660254038f, 0.8632854592f, 0.8605198339f, 0.8577286100f, 0.8549118707f, 0.8520696997f,
+    0.8492021815f, 0.8463094016f, 0.8433914458f, 0.8404484011f, 0.8374803550f, 0.8344873957f,
+    0.8314696123f, 0.8284270946f, 0.8253599331f, 0.8222682190f, 0.8191520443f, 0.8160115017f,
+    0.8128466846f, 0.8096576872f, 0.8064446043f, 0.8032075315f, 0.7999465651f, 0.7966618021f,
+    0.7933533403f, 0.7900212780f, 0.7866657144f, 0.7832867492f, 0.7798844831f, 0.7764590172f,
+    0.7730104534f, 0.7695388943f, 0.7660444431f, 0.7625272039f, 0.7589872812f, 0.7554247804f,
+    0.7518398075f, 0.7482324690f, 0.7446028723f, 0.7409511254f, 0.7372773368f, 0.7335816159f,
+    0.7298640727f, 0.7261248177f, 0.7223639621f, 0.7185816178f, 0.7147778973f, 0.7109529139f,
+    0.7071067812f, 0.7032396137f, 0.6993515264f, 0.6954426350f, 0.6915130558f, 0.6875629056f,
+    0.6835923020f, 0.6796013631f, 0.6755902076f, 0.6715589548f, 0.6675077247f, 0.6634366378f,
+    0.6593458151f, 0.6552353784f, 0.6511054499f, 0.6469561525f, 0.6427876097f, 0.6385999454f,
+    0.6343932842f, 0.6301677512f, 0.6259234722f, 0.6216605734f, 0.6173791816f, 0.6130794241f,
+    0.6087614290f, 0.6044253246f, 0.6000712399f, 0.5956993045f, 0.5913096484f, 0.5869024021f,
+    0.5824776969f, 0.5780356642f, 0.5735764364f, 0.5691001459f, 0.5646069260f, 0.5600969103f,
+    0.5555702330f, 0.5510270288f, 0.5464674328f, 0.5418915806f, 0.5372996083f, 0.5326916527f,
+    0.5280678507f, 0.5234283398f, 0.5187732582f, 0.5141027442f, 0.5094169368f, 0.5047159755f,
+    0.5000000000f, 0.4952691506f, 0.4905235682f, 0.4857633937f, 0.4809887689f, 0.4761998358f,
+    0.4713967368f, 0.4665796149f, 0.4617486132f, 0.4569038756f, 0.4520455462f, 0.4471737694f,
+    0.4422886902f, 0.4373904540f, 0.4324792063f, 0.4275550934f, 0.4226182617f, 0.4176688581f,
+    0.4127070298f, 0.4077329244f, 0.4027466899f, 0.3977484745f, 0.3927384271f, 0.3877166966f,
+    0.3826834324f, 0.3776387842f, 0.3725829021f, 0.3675159366f, 0.3624380383f, 0.3573493583f,
+    0.3522500479f, 0.3471402589f, 0.3420201433f, 0.3368898534f, 0.3317495418f, 0.3265993613f,
+    0.3214394653f, 0.3162700072f, 0.3110911408f, 0.3059030201f, 0.3007057995f, 0.2954996336f,
+    0.2902846773f, 0.2850610856f, 0.2798290140f, 0.2745886182f, 0.2693400540f, 0.2640834775f,
+    0.2588190451f, 0.2535469135f, 0.2482672394f, 0.2429801799f, 0.2376858923f, 0.2323845341f,
+    0.2270762630f, 0.2217612369f, 0.2164396139f, 0.2111115524f, 0.2057772107f, 0.2004367476f,
+    0.1950903220f, 0.1897380929f, 0.1843802195f, 0.1790168613f, 0.1736481777f, 0.1682743284f,
+    0.1628954734f, 0.1575117726f, 0.1521233862f, 0.1467304745f, 0.1413331978f, 0.1359317169f,
+    0.1305261922f, 0.1251167847f, 0.1197036553f, 0.1142869650f, 0.1088668749f, 0.1034435462f,
+    0.0980171403f, 0.0925878187f, 0.0871557427f, 0.0817210741f, 0.0762839745f, 0.0708446056f,
+    0.0654031292f, 0.0599597073f, 0.0545145016f, 0.0490676743f, 0.0436193874f, 0.0381698028f,
+    0.0327190828f, 0.0272673895f, 0.0218148850f, 0.0163617316f, 0.0109080915f, 0.0054541269f,
+};
+
+const FLOAT32 ixheaacd_sine_pi_by_2_N[] = {
+    0.0015339802f, 0.9999988235f,
+    0.0016362454f, 0.9999986613f,
+    0.0017531200f, 0.9999984633f,
+    0.0018879752f, 0.9999982178f,
+    0.0020453063f, 0.9999979084f,
+    0.0022312429f, 0.9999975108f,
+    0.0024543668f, 0.9999969880f,
+    0.0027270736f, 0.9999962815f,
+    0.0049087188f, 0.9999879522f
+};
+
+const FLOAT32 ixheaacd_sin_cos_448[] = {
+    0.014025f, 0.999902f, 0.028046f, 0.999607f, 0.042062f, 0.999115f, 0.056070f, 0.998427f,
+    0.070067f, 0.997542f, 0.084051f, 0.996462f, 0.098017f, 0.995185f, 0.111964f, 0.993712f,
+    0.125890f, 0.992044f, 0.139790f, 0.990181f, 0.153663f, 0.988123f, 0.167506f, 0.985871f,
+    0.181316f, 0.983425f, 0.195090f, 0.980785f, 0.208826f, 0.977953f, 0.222521f, 0.974928f,
+    0.236172f, 0.971711f, 0.249776f, 0.968304f, 0.263332f, 0.964705f, 0.276836f, 0.960917f,
+    0.290285f, 0.956940f, 0.303677f, 0.952775f, 0.317009f, 0.948422f, 0.330279f, 0.943883f,
+    0.343484f, 0.939158f, 0.356622f, 0.934249f, 0.369689f, 0.929156f, 0.382683f, 0.923880f,
+    0.395603f, 0.918422f, 0.408444f, 0.912783f, 0.421205f, 0.906965f, 0.433884f, 0.900969f,
+    0.446477f, 0.894795f, 0.458982f, 0.888446f, 0.471397f, 0.881921f, 0.483719f, 0.875223f,
+    0.495946f, 0.868353f, 0.508075f, 0.861313f, 0.520105f, 0.854102f, 0.532032f, 0.846724f,
+    0.543855f, 0.839179f, 0.555570f, 0.831470f, 0.567177f, 0.823596f, 0.578671f, 0.815561f,
+    0.590052f, 0.807365f, 0.601317f, 0.799010f, 0.612464f, 0.790499f, 0.623490f, 0.781832f,
+    0.634393f, 0.773010f, 0.645172f, 0.764037f, 0.655824f, 0.754914f, 0.666347f, 0.745642f,
+    0.676738f, 0.736224f, 0.686997f, 0.726660f, 0.697120f, 0.716954f, 0.707107f, 0.707107f,
+    0.716954f, 0.697120f, 0.726660f, 0.686997f, 0.736224f, 0.676738f, 0.745642f, 0.666347f,
+    0.754914f, 0.655824f, 0.764037f, 0.645172f, 0.773010f, 0.634393f, 0.781832f, 0.623490f,
+    0.790499f, 0.612464f, 0.799010f, 0.601317f, 0.807365f, 0.590052f, 0.815561f, 0.578671f,
+    0.823596f, 0.567177f, 0.831470f, 0.555570f, 0.839179f, 0.543855f, 0.846724f, 0.532032f,
+    0.854102f, 0.520105f, 0.861313f, 0.508075f, 0.868353f, 0.495946f, 0.875223f, 0.483719f,
+    0.881921f, 0.471397f, 0.888446f, 0.458982f, 0.894795f, 0.446477f, 0.900969f, 0.433884f,
+    0.906965f, 0.421205f, 0.912783f, 0.408444f, 0.918422f, 0.395603f, 0.923880f, 0.382683f,
+    0.929156f, 0.369689f, 0.934249f, 0.356622f, 0.939158f, 0.343484f, 0.943883f, 0.330279f,
+    0.948422f, 0.317009f, 0.952775f, 0.303677f, 0.956940f, 0.290285f, 0.960917f, 0.276836f,
+    0.964705f, 0.263332f, 0.968304f, 0.249776f, 0.971711f, 0.236172f, 0.974928f, 0.222521f,
+    0.977953f, 0.208826f, 0.980785f, 0.195090f, 0.983425f, 0.181316f, 0.985871f, 0.167506f,
+    0.988123f, 0.153663f, 0.990181f, 0.139790f, 0.992044f, 0.125890f, 0.993712f, 0.111964f,
+    0.995185f, 0.098017f, 0.996462f, 0.084051f, 0.997542f, 0.070067f, 0.998427f, 0.056070f,
+    0.999115f, 0.042062f, 0.999607f, 0.028046f, 0.999902f, 0.014025f, 1.000000f, 0.000000f};
+
+const FLOAT32 ixheaacd_sin_cos_672[] = {
+    0.009350f, 0.999956f, 0.018699f, 0.999825f, 0.028046f,
+    0.999607f, 0.037391f, 0.999301f, 0.046733f, 0.998907f,
+    0.056070f, 0.998427f, 0.065403f, 0.997859f, 0.074730f,
+    0.997204f, 0.084051f, 0.996462f, 0.093364f, 0.995632f,
+    0.102669f, 0.994716f, 0.111964f, 0.993712f, 0.121251f,
+    0.992622f, 0.130526f, 0.991445f, 0.139790f, 0.990181f,
+    0.149042f, 0.988831f, 0.158281f, 0.987394f, 0.167506f,
+    0.985871f, 0.176717f, 0.984262f, 0.185912f, 0.982566f,
+    0.195090f, 0.980785f, 0.204252f, 0.978918f, 0.213396f,
+    0.976966f, 0.222521f, 0.974928f, 0.231627f, 0.972805f,
+    0.240712f, 0.970597f, 0.249776f, 0.968304f, 0.258819f,
+    0.965926f, 0.267839f, 0.963464f, 0.276836f, 0.960917f,
+    0.285808f, 0.958287f, 0.294755f, 0.955573f, 0.303677f,
+    0.952775f, 0.312572f, 0.949894f, 0.321439f, 0.946930f,
+    0.330279f, 0.943883f, 0.339090f, 0.940754f, 0.347871f,
+    0.937542f, 0.356622f, 0.934249f, 0.365341f, 0.930874f,
+    0.374029f, 0.927417f, 0.382683f, 0.923880f, 0.391305f,
+    0.920261f, 0.399892f, 0.916562f, 0.408444f, 0.912783f,
+    0.416961f, 0.908924f, 0.425441f, 0.904986f, 0.433884f,
+    0.900969f, 0.442289f, 0.896873f, 0.450655f, 0.892698f,
+    0.458982f, 0.888446f, 0.467269f, 0.884115f, 0.475515f,
+    0.879708f, 0.483719f, 0.875223f, 0.491881f, 0.870662f,
+    0.500000f, 0.866025f, 0.508075f, 0.861313f, 0.516106f,
+    0.856525f, 0.524092f, 0.851662f, 0.532032f, 0.846724f,
+    0.539926f, 0.841713f, 0.547772f, 0.836628f, 0.555570f,
+    0.831470f, 0.563320f, 0.826239f, 0.571021f, 0.820936f,
+    0.578671f, 0.815561f, 0.586271f, 0.810115f, 0.593820f,
+    0.804598f, 0.601317f, 0.799010f, 0.608761f, 0.793353f,
+    0.616153f, 0.787627f, 0.623490f, 0.781832f, 0.630773f,
+    0.775968f, 0.638000f, 0.770036f, 0.645172f, 0.764037f,
+    0.652287f, 0.757972f, 0.659346f, 0.751840f, 0.666347f,
+    0.745642f, 0.673289f, 0.739379f, 0.680173f, 0.733052f,
+    0.686997f, 0.726660f, 0.693761f, 0.720205f, 0.700465f,
+    0.713687f, 0.707107f, 0.707107f, 0.713687f, 0.700465f,
+    0.720205f, 0.693761f, 0.726660f, 0.686997f, 0.733052f,
+    0.680173f, 0.739379f, 0.673289f, 0.745642f, 0.666347f,
+    0.751840f, 0.659346f, 0.757972f, 0.652287f, 0.764037f,
+    0.645172f, 0.770036f, 0.638000f, 0.775968f, 0.630773f,
+    0.781832f, 0.623490f, 0.787627f, 0.616153f, 0.793353f,
+    0.608761f, 0.799010f, 0.601317f, 0.804598f, 0.593820f,
+    0.810115f, 0.586271f, 0.815561f, 0.578671f, 0.820936f,
+    0.571021f, 0.826239f, 0.563320f, 0.831470f, 0.555570f,
+    0.836628f, 0.547772f, 0.841713f, 0.539926f, 0.846724f,
+    0.532032f, 0.851662f, 0.524092f, 0.856525f, 0.516106f,
+    0.861313f, 0.508075f, 0.866025f, 0.500000f, 0.870662f,
+    0.491881f, 0.875223f, 0.483719f, 0.879708f, 0.475515f,
+    0.884115f, 0.467269f, 0.888446f, 0.458982f, 0.892698f,
+    0.450655f, 0.896873f, 0.442289f, 0.900969f, 0.433884f,
+    0.904986f, 0.425441f, 0.908924f, 0.416961f, 0.912783f,
+    0.408444f, 0.916562f, 0.399892f, 0.920261f, 0.391305f,
+    0.923880f, 0.382683f, 0.927417f, 0.374029f, 0.930874f,
+    0.365341f, 0.934249f, 0.356622f, 0.937542f, 0.347871f,
+    0.940754f, 0.339090f, 0.943883f, 0.330279f, 0.946930f,
+    0.321439f, 0.949894f, 0.312572f, 0.952775f, 0.303677f,
+    0.955573f, 0.294755f, 0.958287f, 0.285808f, 0.960917f,
+    0.276836f, 0.963464f, 0.267839f, 0.965926f, 0.258819f,
+    0.968304f, 0.249776f, 0.970597f, 0.240712f, 0.972805f,
+    0.231627f, 0.974928f, 0.222521f, 0.976966f, 0.213396f,
+    0.978918f, 0.204252f, 0.980785f, 0.195090f, 0.982566f,
+    0.185912f, 0.984262f, 0.176717f, 0.985871f, 0.167506f,
+    0.987394f, 0.158281f, 0.988831f, 0.149042f, 0.990181f,
+    0.139790f, 0.991445f, 0.130526f, 0.992622f, 0.121251f,
+    0.993712f, 0.111964f, 0.994716f, 0.102669f, 0.995632f,
+    0.093364f, 0.996462f, 0.084051f, 0.997204f, 0.074730f,
+    0.997859f, 0.065403f, 0.998427f, 0.056070f, 0.998907f,
+    0.046733f, 0.999301f, 0.037391f, 0.999607f, 0.028046f,
+    0.999825f, 0.018699f, 0.999956f, 0.009350f, 1.000000f,
+    0.000000f};
+
+const FLOAT32 ixheaacd_sin_cos_512[] = {
+    0.012272f, 0.999925f, 0.024541f, 0.999699f, 0.036807f, 0.999322f, 0.049068f, 0.998795f,
+    0.061321f, 0.998118f, 0.073565f, 0.997290f, 0.085797f, 0.996313f, 0.098017f, 0.995185f,
+    0.110222f, 0.993907f, 0.122411f, 0.992480f, 0.134581f, 0.990903f, 0.146730f, 0.989177f,
+    0.158858f, 0.987301f, 0.170962f, 0.985278f, 0.183040f, 0.983105f, 0.195090f, 0.980785f,
+    0.207111f, 0.978317f, 0.219101f, 0.975702f, 0.231058f, 0.972940f, 0.242980f, 0.970031f,
+    0.254866f, 0.966976f, 0.266713f, 0.963776f, 0.278520f, 0.960431f, 0.290285f, 0.956940f,
+    0.302006f, 0.953306f, 0.313682f, 0.949528f, 0.325310f, 0.945607f, 0.336890f, 0.941544f,
+    0.348419f, 0.937339f, 0.359895f, 0.932993f, 0.371317f, 0.928506f, 0.382683f, 0.923880f,
+    0.393992f, 0.919114f, 0.405241f, 0.914210f, 0.416430f, 0.909168f, 0.427555f, 0.903989f,
+    0.438616f, 0.898674f, 0.449611f, 0.893224f, 0.460539f, 0.887640f, 0.471397f, 0.881921f,
+    0.482184f, 0.876070f, 0.492898f, 0.870087f, 0.503538f, 0.863973f, 0.514103f, 0.857729f,
+    0.524590f, 0.851355f, 0.534998f, 0.844854f, 0.545325f, 0.838225f, 0.555570f, 0.831470f,
+    0.565732f, 0.824589f, 0.575808f, 0.817585f, 0.585798f, 0.810457f, 0.595699f, 0.803208f,
+    0.605511f, 0.795837f, 0.615232f, 0.788346f, 0.624860f, 0.780737f, 0.634393f, 0.773010f,
+    0.643832f, 0.765167f, 0.653173f, 0.757209f, 0.662416f, 0.749136f, 0.671559f, 0.740951f,
+    0.680601f, 0.732654f, 0.689541f, 0.724247f, 0.698376f, 0.715731f, 0.707107f, 0.707107f,
+    0.715731f, 0.698376f, 0.724247f, 0.689541f, 0.732654f, 0.680601f, 0.740951f, 0.671559f,
+    0.749136f, 0.662416f, 0.757209f, 0.653173f, 0.765167f, 0.643832f, 0.773010f, 0.634393f,
+    0.780737f, 0.624860f, 0.788346f, 0.615232f, 0.795837f, 0.605511f, 0.803208f, 0.595699f,
+    0.810457f, 0.585798f, 0.817585f, 0.575808f, 0.824589f, 0.565732f, 0.831470f, 0.555570f,
+    0.838225f, 0.545325f, 0.844854f, 0.534998f, 0.851355f, 0.524590f, 0.857729f, 0.514103f,
+    0.863973f, 0.503538f, 0.870087f, 0.492898f, 0.876070f, 0.482184f, 0.881921f, 0.471397f,
+    0.887640f, 0.460539f, 0.893224f, 0.449611f, 0.898674f, 0.438616f, 0.903989f, 0.427555f,
+    0.909168f, 0.416430f, 0.914210f, 0.405241f, 0.919114f, 0.393992f, 0.923880f, 0.382683f,
+    0.928506f, 0.371317f, 0.932993f, 0.359895f, 0.937339f, 0.348419f, 0.941544f, 0.336890f,
+    0.945607f, 0.325310f, 0.949528f, 0.313682f, 0.953306f, 0.302006f, 0.956940f, 0.290285f,
+    0.960431f, 0.278520f, 0.963776f, 0.266713f, 0.966976f, 0.254866f, 0.970031f, 0.242980f,
+    0.972940f, 0.231058f, 0.975702f, 0.219101f, 0.978317f, 0.207111f, 0.980785f, 0.195090f,
+    0.983105f, 0.183040f, 0.985278f, 0.170962f, 0.987301f, 0.158858f, 0.989177f, 0.146730f,
+    0.990903f, 0.134581f, 0.992480f, 0.122411f, 0.993907f, 0.110222f, 0.995185f, 0.098017f,
+    0.996313f, 0.085797f, 0.997290f, 0.073565f, 0.998118f, 0.061321f, 0.998795f, 0.049068f,
+    0.999322f, 0.036807f, 0.999699f, 0.024541f, 0.999925f, 0.012272f, 1.000000f, 0.000000f,
+    0.014025f, 0.999902f, 0.028046f, 0.999607f, 0.042062f, 0.999115f, 0.056070f, 0.998427f,
+    0.070067f, 0.997542f, 0.084051f, 0.996462f, 0.098017f, 0.995185f, 0.111964f, 0.993712f,
+    0.125890f, 0.992044f, 0.139790f, 0.990181f, 0.153663f, 0.988123f, 0.167506f, 0.985871f,
+    0.181316f, 0.983425f, 0.195090f, 0.980785f, 0.208826f, 0.977953f, 0.222521f, 0.974928f,
+    0.236172f, 0.971711f, 0.249776f, 0.968304f, 0.263332f, 0.964705f, 0.276836f, 0.960917f,
+    0.290285f, 0.956940f, 0.303677f, 0.952775f, 0.317009f, 0.948422f, 0.330279f, 0.943883f,
+    0.343484f, 0.939158f, 0.356622f, 0.934249f, 0.369689f, 0.929156f, 0.382683f, 0.923880f,
+    0.395603f, 0.918422f, 0.408444f, 0.912783f, 0.421205f, 0.906965f, 0.433884f, 0.900969f,
+    0.446477f, 0.894795f, 0.458982f, 0.888446f, 0.471397f, 0.881921f, 0.483719f, 0.875223f,
+    0.495946f, 0.868353f, 0.508075f, 0.861313f, 0.520105f, 0.854102f, 0.532032f, 0.846724f,
+    0.543855f, 0.839179f, 0.555570f, 0.831470f, 0.567177f, 0.823596f, 0.578671f, 0.815561f,
+    0.590052f, 0.807365f, 0.601317f, 0.799010f, 0.612464f, 0.790499f, 0.623490f, 0.781832f,
+    0.634393f, 0.773010f, 0.645172f, 0.764037f, 0.655824f, 0.754914f, 0.666347f, 0.745642f,
+    0.676738f, 0.736224f, 0.686997f, 0.726660f, 0.697120f, 0.716954f, 0.707107f, 0.707107f,
+    0.716954f, 0.697120f, 0.726660f, 0.686997f, 0.736224f, 0.676738f, 0.745642f, 0.666347f,
+    0.754914f, 0.655824f, 0.764037f, 0.645172f, 0.773010f, 0.634393f, 0.781832f, 0.623490f,
+    0.790499f, 0.612464f, 0.799010f, 0.601317f, 0.807365f, 0.590052f, 0.815561f, 0.578671f,
+    0.823596f, 0.567177f, 0.831470f, 0.555570f, 0.839179f, 0.543855f, 0.846724f, 0.532032f,
+    0.854102f, 0.520105f, 0.861313f, 0.508075f, 0.868353f, 0.495946f, 0.875223f, 0.483719f,
+    0.881921f, 0.471397f, 0.888446f, 0.458982f, 0.894795f, 0.446477f, 0.900969f, 0.433884f,
+    0.906965f, 0.421205f, 0.912783f, 0.408444f, 0.918422f, 0.395603f, 0.923880f, 0.382683f,
+    0.929156f, 0.369689f, 0.934249f, 0.356622f, 0.939158f, 0.343484f, 0.943883f, 0.330279f,
+    0.948422f, 0.317009f, 0.952775f, 0.303677f, 0.956940f, 0.290285f, 0.960917f, 0.276836f,
+    0.964705f, 0.263332f, 0.968304f, 0.249776f, 0.971711f, 0.236172f, 0.974928f, 0.222521f,
+    0.977953f, 0.208826f, 0.980785f, 0.195090f, 0.983425f, 0.181316f, 0.985871f, 0.167506f,
+    0.988123f, 0.153663f, 0.990181f, 0.139790f, 0.992044f, 0.125890f, 0.993712f, 0.111964f,
+    0.995185f, 0.098017f, 0.996462f, 0.084051f, 0.997542f, 0.070067f, 0.998427f, 0.056070f,
+    0.999115f, 0.042062f, 0.999607f, 0.028046f, 0.999902f, 0.014025f, 1.000000f, 0.000000f};
+
+const FLOAT32 ixheaacd_sin_cos_576[] = {
+    0.010908f, 0.999941f, 0.021815f, 0.999762f, 0.032719f, 0.999465f, 0.043619f, 0.999048f,
+    0.054515f, 0.998513f, 0.065403f, 0.997859f, 0.076284f, 0.997086f, 0.087156f, 0.996195f,
+    0.098017f, 0.995185f, 0.108867f, 0.994056f, 0.119704f, 0.992810f, 0.130526f, 0.991445f,
+    0.141333f, 0.989962f, 0.152123f, 0.988362f, 0.162895f, 0.986643f, 0.173648f, 0.984808f,
+    0.184380f, 0.982855f, 0.195090f, 0.980785f, 0.205777f, 0.978599f, 0.216440f, 0.976296f,
+    0.227076f, 0.973877f, 0.237686f, 0.971342f, 0.248267f, 0.968692f, 0.258819f, 0.965926f,
+    0.269340f, 0.963045f, 0.279829f, 0.960050f, 0.290285f, 0.956940f, 0.300706f, 0.953717f,
+    0.311091f, 0.950380f, 0.321439f, 0.946930f, 0.331750f, 0.943367f, 0.342020f, 0.939693f,
+    0.352250f, 0.935906f, 0.362438f, 0.932008f, 0.372583f, 0.927999f, 0.382683f, 0.923880f,
+    0.392738f, 0.919650f, 0.402747f, 0.915311f, 0.412707f, 0.910864f, 0.422618f, 0.906308f,
+    0.432479f, 0.901644f, 0.442289f, 0.896873f, 0.452046f, 0.891995f, 0.461749f, 0.887011f,
+    0.471397f, 0.881921f, 0.480989f, 0.876727f, 0.490524f, 0.871428f, 0.500000f, 0.866025f,
+    0.509417f, 0.860520f, 0.518773f, 0.854912f, 0.528068f, 0.849202f, 0.537300f, 0.843391f,
+    0.546467f, 0.837480f, 0.555570f, 0.831470f, 0.564607f, 0.825360f, 0.573576f, 0.819152f,
+    0.582478f, 0.812847f, 0.591310f, 0.806445f, 0.600071f, 0.799947f, 0.608761f, 0.793353f,
+    0.617379f, 0.786666f, 0.625923f, 0.779884f, 0.634393f, 0.773010f, 0.642788f, 0.766044f,
+    0.651105f, 0.758987f, 0.659346f, 0.751840f, 0.667508f, 0.744603f, 0.675590f, 0.737277f,
+    0.683592f, 0.729864f, 0.691513f, 0.722364f, 0.699352f, 0.714778f, 0.707107f, 0.707107f,
+    0.714778f, 0.699352f, 0.722364f, 0.691513f, 0.729864f, 0.683592f, 0.737277f, 0.675590f,
+    0.744603f, 0.667508f, 0.751840f, 0.659346f, 0.758987f, 0.651105f, 0.766044f, 0.642788f,
+    0.773010f, 0.634393f, 0.779884f, 0.625923f, 0.786666f, 0.617379f, 0.793353f, 0.608761f,
+    0.799947f, 0.600071f, 0.806445f, 0.591310f, 0.812847f, 0.582478f, 0.819152f, 0.573576f,
+    0.825360f, 0.564607f, 0.831470f, 0.555570f, 0.837480f, 0.546467f, 0.843391f, 0.537300f,
+    0.849202f, 0.528068f, 0.854912f, 0.518773f, 0.860520f, 0.509417f, 0.866025f, 0.500000f,
+    0.871428f, 0.490524f, 0.876727f, 0.480989f, 0.881921f, 0.471397f, 0.887011f, 0.461749f,
+    0.891995f, 0.452046f, 0.896873f, 0.442289f, 0.901644f, 0.432479f, 0.906308f, 0.422618f,
+    0.910864f, 0.412707f, 0.915311f, 0.402747f, 0.919650f, 0.392738f, 0.923880f, 0.382683f,
+    0.927999f, 0.372583f, 0.932008f, 0.362438f, 0.935906f, 0.352250f, 0.939693f, 0.342020f,
+    0.943367f, 0.331750f, 0.946930f, 0.321439f, 0.950380f, 0.311091f, 0.953717f, 0.300706f,
+    0.956940f, 0.290285f, 0.960050f, 0.279829f, 0.963045f, 0.269340f, 0.965926f, 0.258819f,
+    0.968692f, 0.248267f, 0.971342f, 0.237686f, 0.973877f, 0.227076f, 0.976296f, 0.216440f,
+    0.978599f, 0.205777f, 0.980785f, 0.195090f, 0.982855f, 0.184380f, 0.984808f, 0.173648f,
+    0.986643f, 0.162895f, 0.988362f, 0.152123f, 0.989962f, 0.141333f, 0.991445f, 0.130526f,
+    0.992810f, 0.119704f, 0.994056f, 0.108867f, 0.995185f, 0.098017f, 0.996195f, 0.087156f,
+    0.997086f, 0.076284f, 0.997859f, 0.065403f, 0.998513f, 0.054515f, 0.999048f, 0.043619f,
+    0.999465f, 0.032719f, 0.999762f, 0.021815f, 0.999941f, 0.010908f, 1.000000f, 0.000000f};
+
+const FLOAT32 ixheaacd_sin_cos_384[] = {
+    0.016362f, 0.999866f, 0.032719f, 0.999465f, 0.049068f, 0.998795f,
+    0.065403f, 0.997859f, 0.081721f, 0.996655f, 0.098017f, 0.995185f,
+    0.114287f, 0.993448f, 0.130526f, 0.991445f, 0.146730f, 0.989177f,
+    0.162895f, 0.986643f, 0.179017f, 0.983846f, 0.195090f, 0.980785f,
+    0.211112f, 0.977462f, 0.227076f, 0.973877f, 0.242980f, 0.970031f,
+    0.258819f, 0.965926f, 0.274589f, 0.961562f, 0.290285f, 0.956940f,
+    0.305903f, 0.952063f, 0.321439f, 0.946930f, 0.336890f, 0.941544f,
+    0.352250f, 0.935906f, 0.367516f, 0.930017f, 0.382683f, 0.923880f,
+    0.397748f, 0.917494f, 0.412707f, 0.910864f, 0.427555f, 0.903989f,
+    0.442289f, 0.896873f, 0.456904f, 0.889516f, 0.471397f, 0.881921f,
+    0.485763f, 0.874090f, 0.500000f, 0.866025f, 0.514103f, 0.857729f,
+    0.528068f, 0.849202f, 0.541892f, 0.840448f, 0.555570f, 0.831470f,
+    0.569100f, 0.822268f, 0.582478f, 0.812847f, 0.595699f, 0.803208f,
+    0.608761f, 0.793353f, 0.621661f, 0.783287f, 0.634393f, 0.773010f,
+    0.646956f, 0.762527f, 0.659346f, 0.751840f, 0.671559f, 0.740951f,
+    0.683592f, 0.729864f, 0.695443f, 0.718582f, 0.707107f, 0.707107f,
+    0.718582f, 0.695443f, 0.729864f, 0.683592f, 0.740951f, 0.671559f,
+    0.751840f, 0.659346f, 0.762527f, 0.646956f, 0.773010f, 0.634393f,
+    0.783287f, 0.621661f, 0.793353f, 0.608761f, 0.803208f, 0.595699f,
+    0.812847f, 0.582478f, 0.822268f, 0.569100f, 0.831470f, 0.555570f,
+    0.840448f, 0.541892f, 0.849202f, 0.528068f, 0.857729f, 0.514103f,
+    0.866025f, 0.500000f, 0.874090f, 0.485763f, 0.881921f, 0.471397f,
+    0.889516f, 0.456904f, 0.896873f, 0.442289f, 0.903989f, 0.427555f,
+    0.910864f, 0.412707f, 0.917494f, 0.397748f, 0.923880f, 0.382683f,
+    0.930017f, 0.367516f, 0.935906f, 0.352250f, 0.941544f, 0.336890f,
+    0.946930f, 0.321439f, 0.952063f, 0.305903f, 0.956940f, 0.290285f,
+    0.961562f, 0.274589f, 0.965926f, 0.258819f, 0.970031f, 0.242980f,
+    0.973877f, 0.227076f, 0.977462f, 0.211112f, 0.980785f, 0.195090f,
+    0.983846f, 0.179017f, 0.986643f, 0.162895f, 0.989177f, 0.146730f,
+    0.991445f, 0.130526f, 0.993448f, 0.114287f, 0.995185f, 0.098017f,
+    0.996655f, 0.081721f, 0.997859f, 0.065403f, 0.998795f, 0.049068f,
+    0.999465f, 0.032719f, 0.999866f, 0.016362f, 1.000000f, 0.000000f,
+    0.012272f, 0.999925f, 0.024541f, 0.999699f, 0.036807f, 0.999322f,
+    0.049068f, 0.998795f, 0.061321f, 0.998118f, 0.073565f, 0.997290f,
+    0.085797f, 0.996313f, 0.098017f, 0.995185f, 0.110222f, 0.993907f,
+    0.122411f, 0.992480f, 0.134581f, 0.990903f, 0.146730f, 0.989177f,
+    0.158858f, 0.987301f, 0.170962f, 0.985278f, 0.183040f, 0.983105f,
+    0.195090f, 0.980785f, 0.207111f, 0.978317f, 0.219101f, 0.975702f,
+    0.231058f, 0.972940f, 0.242980f, 0.970031f, 0.254866f, 0.966976f,
+    0.266713f, 0.963776f, 0.278520f, 0.960431f, 0.290285f, 0.956940f,
+    0.302006f, 0.953306f, 0.313682f, 0.949528f, 0.325310f, 0.945607f,
+    0.336890f, 0.941544f, 0.348419f, 0.937339f, 0.359895f, 0.932993f,
+    0.371317f, 0.928506f, 0.382683f, 0.923880f, 0.393992f, 0.919114f,
+    0.405241f, 0.914210f, 0.416430f, 0.909168f, 0.427555f, 0.903989f,
+    0.438616f, 0.898674f, 0.449611f, 0.893224f, 0.460539f, 0.887640f,
+    0.471397f, 0.881921f, 0.482184f, 0.876070f, 0.492898f, 0.870087f,
+    0.503538f, 0.863973f, 0.514103f, 0.857729f, 0.524590f, 0.851355f,
+    0.534998f, 0.844854f, 0.545325f, 0.838225f, 0.555570f, 0.831470f,
+    0.565732f, 0.824589f, 0.575808f, 0.817585f, 0.585798f, 0.810457f,
+    0.595699f, 0.803208f, 0.605511f, 0.795837f, 0.615232f, 0.788346f,
+    0.624860f, 0.780737f, 0.634393f, 0.773010f, 0.643832f, 0.765167f,
+    0.653173f, 0.757209f, 0.662416f, 0.749136f, 0.671559f, 0.740951f,
+    0.680601f, 0.732654f, 0.689541f, 0.724247f, 0.698376f, 0.715731f,
+    0.707107f, 0.707107f, 0.715731f, 0.698376f, 0.724247f, 0.689541f,
+    0.732654f, 0.680601f, 0.740951f, 0.671559f, 0.749136f, 0.662416f,
+    0.757209f, 0.653173f, 0.765167f, 0.643832f, 0.773010f, 0.634393f,
+    0.780737f, 0.624860f, 0.788346f, 0.615232f, 0.795837f, 0.605511f,
+    0.803208f, 0.595699f, 0.810457f, 0.585798f, 0.817585f, 0.575808f,
+    0.824589f, 0.565732f, 0.831470f, 0.555570f, 0.838225f, 0.545325f,
+    0.844854f, 0.534998f, 0.851355f, 0.524590f, 0.857729f, 0.514103f,
+    0.863973f, 0.503538f, 0.870087f, 0.492898f, 0.876070f, 0.482184f,
+    0.881921f, 0.471397f, 0.887640f, 0.460539f, 0.893224f, 0.449611f,
+    0.898674f, 0.438616f, 0.903989f, 0.427555f, 0.909168f, 0.416430f,
+    0.914210f, 0.405241f, 0.919114f, 0.393992f, 0.923880f, 0.382683f,
+    0.928506f, 0.371317f, 0.932993f, 0.359895f, 0.937339f, 0.348419f,
+    0.941544f, 0.336890f, 0.945607f, 0.325310f, 0.949528f, 0.313682f,
+    0.953306f, 0.302006f, 0.956940f, 0.290285f, 0.960431f, 0.278520f,
+    0.963776f, 0.266713f, 0.966976f, 0.254866f, 0.970031f, 0.242980f,
+    0.972940f, 0.231058f, 0.975702f, 0.219101f, 0.978317f, 0.207111f,
+    0.980785f, 0.195090f, 0.983105f, 0.183040f, 0.985278f, 0.170962f,
+    0.987301f, 0.158858f, 0.989177f, 0.146730f, 0.990903f, 0.134581f,
+    0.992480f, 0.122411f, 0.993907f, 0.110222f, 0.995185f, 0.098017f,
+    0.996313f, 0.085797f, 0.997290f, 0.073565f, 0.998118f, 0.061321f,
+    0.998795f, 0.049068f, 0.999322f, 0.036807f, 0.999699f, 0.024541f,
+    0.999925f, 0.012272f, 1.000000f, 0.000000f
+
+};
+
+const FLOAT32 ixheaacd_sin_cos_768[] = {
+    0.008181f, 0.999967f, 0.016362f, 0.999866f, 0.024541f, 0.999699f, 0.032719f, 0.999465f,
+    0.040895f, 0.999163f, 0.049068f, 0.998795f, 0.057237f, 0.998361f, 0.065403f, 0.997859f,
+    0.073565f, 0.997290f, 0.081721f, 0.996655f, 0.089872f, 0.995953f, 0.098017f, 0.995185f,
+    0.106156f, 0.994350f, 0.114287f, 0.993448f, 0.122411f, 0.992480f, 0.130526f, 0.991445f,
+    0.138633f, 0.990344f, 0.146730f, 0.989177f, 0.154818f, 0.987943f, 0.162895f, 0.986643f,
+    0.170962f, 0.985278f, 0.179017f, 0.983846f, 0.187060f, 0.982349f, 0.195090f, 0.980785f,
+    0.203108f, 0.979156f, 0.211112f, 0.977462f, 0.219101f, 0.975702f, 0.227076f, 0.973877f,
+    0.235036f, 0.971987f, 0.242980f, 0.970031f, 0.250908f, 0.968011f, 0.258819f, 0.965926f,
+    0.266713f, 0.963776f, 0.274589f, 0.961562f, 0.282446f, 0.959283f, 0.290285f, 0.956940f,
+    0.298104f, 0.954533f, 0.305903f, 0.952063f, 0.313682f, 0.949528f, 0.321439f, 0.946930f,
+    0.329176f, 0.944269f, 0.336890f, 0.941544f, 0.344581f, 0.938756f, 0.352250f, 0.935906f,
+    0.359895f, 0.932993f, 0.367516f, 0.930017f, 0.375112f, 0.926979f, 0.382683f, 0.923880f,
+    0.390229f, 0.920718f, 0.397748f, 0.917494f, 0.405241f, 0.914210f, 0.412707f, 0.910864f,
+    0.420145f, 0.907457f, 0.427555f, 0.903989f, 0.434936f, 0.900461f, 0.442289f, 0.896873f,
+    0.449611f, 0.893224f, 0.456904f, 0.889516f, 0.464166f, 0.885748f, 0.471397f, 0.881921f,
+    0.478596f, 0.878035f, 0.485763f, 0.874090f, 0.492898f, 0.870087f, 0.500000f, 0.866025f,
+    0.507068f, 0.861906f, 0.514103f, 0.857729f, 0.521103f, 0.853494f, 0.528068f, 0.849202f,
+    0.534998f, 0.844854f, 0.541892f, 0.840448f, 0.548749f, 0.835987f, 0.555570f, 0.831470f,
+    0.562354f, 0.826897f, 0.569100f, 0.822268f, 0.575808f, 0.817585f, 0.582478f, 0.812847f,
+    0.589108f, 0.808054f, 0.595699f, 0.803208f, 0.602251f, 0.798307f, 0.608761f, 0.793353f,
+    0.615232f, 0.788346f, 0.621661f, 0.783287f, 0.628048f, 0.778175f, 0.634393f, 0.773010f,
+    0.640696f, 0.767795f, 0.646956f, 0.762527f, 0.653173f, 0.757209f, 0.659346f, 0.751840f,
+    0.665475f, 0.746420f, 0.671559f, 0.740951f, 0.677598f, 0.735432f, 0.683592f, 0.729864f,
+    0.689541f, 0.724247f, 0.695443f, 0.718582f, 0.701298f, 0.712868f, 0.707107f, 0.707107f,
+    0.712868f, 0.701298f, 0.718582f, 0.695443f, 0.724247f, 0.689541f, 0.729864f, 0.683592f,
+    0.735432f, 0.677598f, 0.740951f, 0.671559f, 0.746420f, 0.665475f, 0.751840f, 0.659346f,
+    0.757209f, 0.653173f, 0.762527f, 0.646956f, 0.767795f, 0.640696f, 0.773010f, 0.634393f,
+    0.778175f, 0.628048f, 0.783287f, 0.621661f, 0.788346f, 0.615232f, 0.793353f, 0.608761f,
+    0.798307f, 0.602251f, 0.803208f, 0.595699f, 0.808054f, 0.589108f, 0.812847f, 0.582478f,
+    0.817585f, 0.575808f, 0.822268f, 0.569100f, 0.826897f, 0.562354f, 0.831470f, 0.555570f,
+    0.835987f, 0.548749f, 0.840448f, 0.541892f, 0.844854f, 0.534998f, 0.849202f, 0.528068f,
+    0.853494f, 0.521103f, 0.857729f, 0.514103f, 0.861906f, 0.507068f, 0.866025f, 0.500000f,
+    0.870087f, 0.492898f, 0.874090f, 0.485763f, 0.878035f, 0.478596f, 0.881921f, 0.471397f,
+    0.885748f, 0.464166f, 0.889516f, 0.456904f, 0.893224f, 0.449611f, 0.896873f, 0.442289f,
+    0.900461f, 0.434936f, 0.903989f, 0.427555f, 0.907457f, 0.420145f, 0.910864f, 0.412707f,
+    0.914210f, 0.405241f, 0.917494f, 0.397748f, 0.920718f, 0.390229f, 0.923880f, 0.382683f,
+    0.926979f, 0.375112f, 0.930017f, 0.367516f, 0.932993f, 0.359895f, 0.935906f, 0.352250f,
+    0.938756f, 0.344581f, 0.941544f, 0.336890f, 0.944269f, 0.329176f, 0.946930f, 0.321439f,
+    0.949528f, 0.313682f, 0.952063f, 0.305903f, 0.954533f, 0.298104f, 0.956940f, 0.290285f,
+    0.959283f, 0.282446f, 0.961562f, 0.274589f, 0.963776f, 0.266713f, 0.965926f, 0.258819f,
+    0.968011f, 0.250908f, 0.970031f, 0.242980f, 0.971987f, 0.235036f, 0.973877f, 0.227076f,
+    0.975702f, 0.219101f, 0.977462f, 0.211112f, 0.979156f, 0.203108f, 0.980785f, 0.195090f,
+    0.982349f, 0.187060f, 0.983846f, 0.179017f, 0.985278f, 0.170962f, 0.986643f, 0.162895f,
+    0.987943f, 0.154818f, 0.989177f, 0.146730f, 0.990344f, 0.138633f, 0.991445f, 0.130526f,
+    0.992480f, 0.122411f, 0.993448f, 0.114287f, 0.994350f, 0.106156f, 0.995185f, 0.098017f,
+    0.995953f, 0.089872f, 0.996655f, 0.081721f, 0.997290f, 0.073565f, 0.997859f, 0.065403f,
+    0.998361f, 0.057237f, 0.998795f, 0.049068f, 0.999163f, 0.040895f, 0.999465f, 0.032719f,
+    0.999699f, 0.024541f, 0.999866f, 0.016362f, 0.999967f, 0.008181f, 1.000000f, 0.000000f};
diff --git a/decoder/ixheaacd_esbr_rom.h b/decoder/ixheaacd_esbr_rom.h
index 34eef98..6f15971 100644
--- a/decoder/ixheaacd_esbr_rom.h
+++ b/decoder/ixheaacd_esbr_rom.h
@@ -21,19 +21,19 @@
 #define IXHEAACD_ESBR_ROM_H
 
 extern const FLOAT32 ixheaacd_sub_samp_qmf_window_coeff[40 + 80 + 120 + 160 +
-                                                        200 + 240 + 320 + 400];
+                                                        200 + 240 + 320 + 400 + 440];
 extern const FLOAT32 ixheaacd_random_phase[512][2];
 extern const FLOAT32 ixheaacd_hphase_tbl[2][8];
 
 extern const FLOAT32 ixheaacd_g_lim_gains[4];
 
-typedef FLOAT32 FIR_FILTER[5];
-extern const FIR_FILTER ixheaacd_fir_0;
-extern const FIR_FILTER ixheaacd_fir_1;
-extern const FIR_FILTER ixheaacd_fir_2;
-extern const FIR_FILTER ixheaacd_fir_3;
-extern const FIR_FILTER ixheaacd_fir_4;
-extern const FIR_FILTER* const ixheaacd_fir_table[5];
+typedef FLOAT32 ia_fir_table_struct[5];
+extern const ia_fir_table_struct ixheaacd_fir_0;
+extern const ia_fir_table_struct ixheaacd_fir_1;
+extern const ia_fir_table_struct ixheaacd_fir_2;
+extern const ia_fir_table_struct ixheaacd_fir_3;
+extern const ia_fir_table_struct ixheaacd_fir_4;
+extern const ia_fir_table_struct *ixheaacd_fir_table[5];
 extern const FLOAT32 ixheaacd_q_gamma_table[4];
 extern const WORD32 ixheaacd_start_subband2kL_tbl[33];
 extern const FLOAT32 ixheaacd_cos_table_trans_qmf[7][32 * 2];
@@ -57,5 +57,27 @@
 extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_24[96];
 extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_32[128];
 extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_40[40 * 40 * 2];
+
+extern const FLOAT32 ixheaacd_dft_hbe_window_ts_12[13];
+extern const FLOAT32 ixheaacd_dft_hbe_window_ts_18[19];
+
+extern const FLOAT32 ixheaacd_sine_pi_n_by_1024[1024];
+extern const FLOAT32 ixheaacd_sine_pi_n_by_960[960];
+extern const FLOAT32 ixheaacd_sine_pi_n_by_896[896];
+extern const FLOAT32 ixheaacd_sine_pi_n_by_832[832];
+extern const FLOAT32 ixheaacd_sine_pi_n_by_768[768];
+extern const FLOAT32 ixheaacd_sine_pi_n_by_704[704];
+extern const FLOAT32 ixheaacd_sine_pi_n_by_640[640];
+extern const FLOAT32 ixheaacd_sine_pi_n_by_576[576];
+extern const FLOAT32 ixheaacd_sine_pi_by_2_N[];
+extern const FLOAT32 ixheaacd_sin_cos_448[];
+extern const FLOAT32 ixheaacd_sin_cos_672[];
+extern const FLOAT32 ixheaacd_sin_cos_512[];
+extern const FLOAT32 ixheaacd_sin_cos_576[];
+extern const FLOAT32 ixheaacd_sin_cos_384[];
+extern const FLOAT32 ixheaacd_sin_cos_768[];
+
 extern const FLOAT32 ixheaacd_sel_case[5][8];
+extern const FLOAT32 ixheaacd_sub_samp_qmf_window_coeff_28_36[280 + 360];
+extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_56[56 * 56 * 2];
 #endif
diff --git a/decoder/ixheaacd_ext_ch_ele.c b/decoder/ixheaacd_ext_ch_ele.c
index f72526d..aa70291 100644
--- a/decoder/ixheaacd_ext_ch_ele.c
+++ b/decoder/ixheaacd_ext_ch_ele.c
@@ -20,6 +20,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <setjmp.h>
 
 #include "ixheaacd_type_def.h"
 
@@ -43,6 +44,9 @@
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
 
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_rom.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_tns_usac.h"
@@ -60,6 +64,13 @@
 
 #include "ixheaacd_vec_baisc_ops.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_defines.h"
+#include "ixheaacd_aac_rom.h"
+#include "ixheaacd_pulsedata.h"
+#include "ixheaacd_pns.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_ec.h"
+#include "ixheaacd_error_codes.h"
 
 const WORD16 ixheaacd_mdst_fcoeff_long_sin[] = {0, 0, -16384, 0, 16384, 0, 0};
 const WORD16 ixheaacd_mdst_fcoeff_long_kbd[] = {-2998, 0, -19052, 0,
@@ -370,11 +381,13 @@
   out++;
 
   for (i = 3; i < length - 4; i += 2) {
+    sum = 0;
     sum = ixheaacd_mac32x32in64_7(&in[i - 3], filter);
     *out = ixheaacd_add32_sat(
         *out, ixheaacd_sat64_32((((WORD64)sum * (WORD64)factor_odd) >> 15)));
     out++;
 
+    sum = 0;
     sum = ixheaacd_mac32x32in64_7(&in[i - 2], filter);
     *out = ixheaacd_add32_sat(
         *out, ixheaacd_sat64_32((((WORD64)sum * (WORD64)factor_even) >> 15)));
@@ -515,8 +528,8 @@
     for (grp = 0, i = 0; grp < pstr_sfb_info->num_groups; grp++) {
       for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) {
         for (sfb = 0; sfb < pstr_sfb_info->sfb_per_sbk; sfb++) {
-          alpha_q_re_temp = alpha_q_re[grp][sfb] * 1677722;
-          alpha_q_im_temp = alpha_q_im[grp][sfb] * 1677722;
+          alpha_q_re_temp = ixheaacd_sat64_32(ixheaacd_mult32x32in64(alpha_q_re[grp][sfb], 1677722));
+          alpha_q_im_temp = ixheaacd_sat64_32(ixheaacd_mult32x32in64(alpha_q_im[grp][sfb], 1677722));
           if (cplx_pred_used[grp][sfb]) {
             for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) {
               WORD32 mid_side = ixheaacd_sub32_sat(
@@ -531,7 +544,6 @@
                           (WORD64)(ixheaacd_sub32_sat(l_spec[i], mid_side));
               l_spec[i] = ixheaacd_add32_sat(l_spec[i], mid_side);
             }
-
           } else {
             i += pstr_sfb_info->sfb_width[sfb];
           }
@@ -542,7 +554,7 @@
     for (grp = 0, i = 0; grp < pstr_sfb_info->num_groups; grp++) {
       for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) {
         for (sfb = 0; sfb < pstr_sfb_info->sfb_per_sbk; sfb++) {
-          alpha_q_re_temp = alpha_q_re[grp][sfb] * 1677722;
+          alpha_q_re_temp = ixheaacd_sat64_32(ixheaacd_mult32x32in64(alpha_q_re[grp][sfb], 1677722));
           if (cplx_pred_used[grp][sfb]) {
             for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) {
               WORD32 mid_side = ixheaacd_sub32_sat(
@@ -554,7 +566,6 @@
                           (WORD64)(ixheaacd_sub32_sat(l_spec[i], mid_side));
               l_spec[i] = ixheaacd_add32_sat(l_spec[i], mid_side);
             }
-
           } else {
             i += pstr_sfb_info->sfb_width[sfb];
           }
@@ -602,12 +613,11 @@
   usac_data->pstr_sfb_info[chn] =
       usac_data->pstr_usac_winmap[usac_data->window_sequence[chn]];
 
-  usac_data->window_shape[chn] = (WORD32)ixheaacd_read_bits_buf(it_bit_buff, 1);
+  usac_data->window_shape[chn] = ixheaacd_read_bits_buf(it_bit_buff, 1);
 
   if (usac_data->pstr_usac_winmap[win]->islong) {
     *max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 6);
     *scf_group_ptr = 1;
-
   } else {
     WORD32 i, scale_factor_grouping;
 
@@ -628,7 +638,7 @@
 
   if (*max_sfb > usac_data->pstr_sfb_info[chn]->sfb_per_sbk) {
     *max_sfb = usac_data->pstr_sfb_info[chn]->sfb_per_sbk;
-    return 0;
+    return -1;
   }
 
   return 0;
@@ -639,280 +649,421 @@
                                 ia_bit_buf_struct *it_bit_buff,
                                 WORD32 nr_core_coder_channels) {
   WORD32 err_code = 0;
-  WORD32 k = 0, ch = 0, chn, left = 0, right = 0;
+  WORD32 k = 0, ch = 0, chn = 0, left = 0, right = 0;
 
   ia_usac_tmp_core_coder_struct str_tmp_core_coder = {0};
   ia_usac_tmp_core_coder_struct *pstr_core_coder = &str_tmp_core_coder;
   ia_td_frame_data_struct td_frame;
+  jmp_buf local;
 
-  memset(&td_frame, 0, sizeof(td_frame));
-  pstr_core_coder->tns_on_lr = 0;
-  pstr_core_coder->pred_dir = 0;
-  if (id != ID_USAC_LFE) {
-    for (ch = 0; ch < nr_core_coder_channels; ch++)
-      pstr_core_coder->core_mode[ch] = ixheaacd_read_bits_buf(it_bit_buff, 1);
-  } else {
-    for (ch = 0; ch < nr_core_coder_channels; ch++)
-      pstr_core_coder->core_mode[ch] = 0;
+  if (usac_data->ec_flag) {
+    err_code = setjmp(local);
+    it_bit_buff->xaac_jmp_buf = &local;
   }
-
-  if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 &&
-      pstr_core_coder->core_mode[1] == 0) {
-    pstr_core_coder->tns_active = ixheaacd_read_bits_buf(it_bit_buff, 1);
-    pstr_core_coder->common_window = ixheaacd_read_bits_buf(it_bit_buff, 1);
-
-    if (pstr_core_coder->common_window) {
-      left = chan_offset;
-      right = chan_offset + 1;
-
-      err_code =
-          ixheaacd_ics_info(usac_data, left, &pstr_core_coder->max_sfb[left],
-                            it_bit_buff, usac_data->window_sequence_last[left]);
-
-      if (err_code == -1) return err_code;
-
-      pstr_core_coder->common_max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 1);
-
-      if (pstr_core_coder->common_max_sfb == 0) {
-        if (usac_data->window_sequence[left] == EIGHT_SHORT_SEQUENCE)
-          pstr_core_coder->max_sfb[right] =
-              ixheaacd_read_bits_buf(it_bit_buff, 4);
-        else
-          pstr_core_coder->max_sfb[right] =
-              ixheaacd_read_bits_buf(it_bit_buff, 6);
-      } else {
-        pstr_core_coder->max_sfb[right] = pstr_core_coder->max_sfb[left];
-      }
-
-      pstr_core_coder->max_sfb_ste =
-          max(pstr_core_coder->max_sfb[left], pstr_core_coder->max_sfb[right]);
-
-      usac_data->window_sequence[right] = usac_data->window_sequence[left];
-      usac_data->window_shape[right] = usac_data->window_shape[left];
-      memcpy(&usac_data->group_dis[right][0], &usac_data->group_dis[left][0],
-             8);
-      usac_data->pstr_sfb_info[right] = usac_data->pstr_sfb_info[left];
-      if (pstr_core_coder->max_sfb[right] >
-          usac_data->pstr_sfb_info[right]->sfb_per_sbk)
-        pstr_core_coder->max_sfb[right] =
-            usac_data->pstr_sfb_info[right]->sfb_per_sbk;
-
-      pstr_core_coder->ms_mask_present[0] =
-          ixheaacd_read_ms_mask(usac_data, pstr_core_coder, it_bit_buff, left);
+  if (err_code == 0 &&
+      ((usac_data->ec_flag == 0) || (usac_data->frame_ok == 1 && usac_data->ec_flag == 1))) {
+    memset(&td_frame, 0, sizeof(td_frame));
+    pstr_core_coder->tns_on_lr = 0;
+    pstr_core_coder->pred_dir = 0;
+    if (id != ID_USAC_LFE) {
+      for (ch = 0; ch < nr_core_coder_channels; ch++)
+        pstr_core_coder->core_mode[ch] = ixheaacd_read_bits_buf(it_bit_buff, 1);
     } else {
-      left = chan_offset;
-      right = chan_offset + 1;
-
-      pstr_core_coder->ms_mask_present[0] = 0;
-      pstr_core_coder->ms_mask_present[1] = 0;
-
-      for (k = 0; k < SFB_NUM_MAX; k++) {
-        usac_data->alpha_q_re_prev[k] = 0;
-        usac_data->alpha_q_im_prev[k] = 0;
-      }
+      for (ch = 0; ch < nr_core_coder_channels; ch++) pstr_core_coder->core_mode[ch] = 0;
     }
 
-    if (usac_data->tw_mdct[elem_idx] == 1) {
-      pstr_core_coder->common_tw = ixheaacd_read_bits_buf(it_bit_buff, 1);
+    if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 &&
+        pstr_core_coder->core_mode[1] == 0) {
+      pstr_core_coder->tns_active = ixheaacd_read_bits_buf(it_bit_buff, 1);
+      pstr_core_coder->common_window = ixheaacd_read_bits_buf(it_bit_buff, 1);
 
-      if (pstr_core_coder->common_tw == 1) {
-        usac_data->tw_data_present[left] =
-            ixheaacd_read_bits_buf(it_bit_buff, 1);
-        usac_data->tw_data_present[right] = usac_data->tw_data_present[left];
-        if (usac_data->tw_data_present[left]) {
-          for (k = 0; k < NUM_TW_NODES; k++) {
-            usac_data->tw_ratio[left][k] =
-                ixheaacd_read_bits_buf(it_bit_buff, 3);
-            usac_data->tw_ratio[right][k] = usac_data->tw_ratio[left][k];
+      if (pstr_core_coder->common_window) {
+        left = chan_offset;
+        right = chan_offset + 1;
+
+        err_code = ixheaacd_ics_info(usac_data, left, &pstr_core_coder->max_sfb[left],
+                                     it_bit_buff, usac_data->window_sequence_last[left]);
+
+        if (err_code == -1) {
+          if (usac_data->ec_flag) {
+            memcpy(usac_data->max_sfb, pstr_core_coder->max_sfb,
+                   sizeof(pstr_core_coder->max_sfb));
+            longjmp(*(it_bit_buff->xaac_jmp_buf),
+                    IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          } else {
+            return err_code;
+          }
+        }
+
+        pstr_core_coder->common_max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+        if (pstr_core_coder->common_max_sfb == 0) {
+          if (usac_data->window_sequence[left] == EIGHT_SHORT_SEQUENCE)
+            pstr_core_coder->max_sfb[right] = ixheaacd_read_bits_buf(it_bit_buff, 4);
+          else
+            pstr_core_coder->max_sfb[right] = ixheaacd_read_bits_buf(it_bit_buff, 6);
+        } else {
+          pstr_core_coder->max_sfb[right] = pstr_core_coder->max_sfb[left];
+        }
+
+        pstr_core_coder->max_sfb_ste =
+            max(pstr_core_coder->max_sfb[left], pstr_core_coder->max_sfb[right]);
+
+        usac_data->window_sequence[right] = usac_data->window_sequence[left];
+        usac_data->window_shape[right] = usac_data->window_shape[left];
+        memcpy(&usac_data->group_dis[right][0], &usac_data->group_dis[left][0], 8);
+        usac_data->pstr_sfb_info[right] = usac_data->pstr_sfb_info[left];
+        if (pstr_core_coder->max_sfb[right] > usac_data->pstr_sfb_info[right]->sfb_per_sbk)
+          pstr_core_coder->max_sfb[right] = usac_data->pstr_sfb_info[right]->sfb_per_sbk;
+
+        pstr_core_coder->ms_mask_present[0] =
+            ixheaacd_read_ms_mask(usac_data, pstr_core_coder, it_bit_buff, left);
+      } else {
+        left = chan_offset;
+        right = chan_offset + 1;
+
+        pstr_core_coder->ms_mask_present[0] = 0;
+        pstr_core_coder->ms_mask_present[1] = 0;
+
+        for (k = 0; k < SFB_NUM_MAX; k++) {
+          usac_data->alpha_q_re_prev[k] = 0;
+          usac_data->alpha_q_im_prev[k] = 0;
+        }
+      }
+
+      if (usac_data->tw_mdct[elem_idx] == 1) {
+        pstr_core_coder->common_tw = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+        if (pstr_core_coder->common_tw == 1) {
+          usac_data->tw_data_present[left] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+          usac_data->tw_data_present[right] = usac_data->tw_data_present[left];
+          if (usac_data->tw_data_present[left]) {
+            for (k = 0; k < NUM_TW_NODES; k++) {
+              usac_data->tw_ratio[left][k] = ixheaacd_read_bits_buf(it_bit_buff, 3);
+              usac_data->tw_ratio[right][k] = usac_data->tw_ratio[left][k];
+            }
           }
         }
       }
-    }
 
-    if (pstr_core_coder->tns_active) {
-      if (pstr_core_coder->common_window) {
-        pstr_core_coder->common_tns = ixheaacd_read_bits_buf(it_bit_buff, 1);
+      if (pstr_core_coder->tns_active) {
+        if (pstr_core_coder->common_window) {
+          pstr_core_coder->common_tns = ixheaacd_read_bits_buf(it_bit_buff, 1);
 
+        } else {
+          pstr_core_coder->common_tns = 0;
+        }
+
+        pstr_core_coder->tns_on_lr = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+        if (pstr_core_coder->common_tns) {
+          ixheaacd_read_tns_u(usac_data->pstr_sfb_info[0], &usac_data->pstr_tns[left][0],
+                              it_bit_buff);
+          memcpy(&usac_data->pstr_tns[right][0], &usac_data->pstr_tns[left][0],
+                 sizeof(ia_tns_frame_info_struct));
+
+          pstr_core_coder->tns_data_present[0] = 2;
+          pstr_core_coder->tns_data_present[1] = 2;
+        } else {
+          pstr_core_coder->tns_present_both = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+          if (pstr_core_coder->tns_present_both) {
+            pstr_core_coder->tns_data_present[0] = 1;
+            pstr_core_coder->tns_data_present[1] = 1;
+          } else {
+            pstr_core_coder->tns_data_present[1] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+            pstr_core_coder->tns_data_present[0] = 1 - pstr_core_coder->tns_data_present[1];
+          }
+        }
       } else {
         pstr_core_coder->common_tns = 0;
+        pstr_core_coder->tns_data_present[0] = 0;
+        pstr_core_coder->tns_data_present[1] = 0;
       }
 
-      pstr_core_coder->tns_on_lr = ixheaacd_read_bits_buf(it_bit_buff, 1);
+    } else {
+      pstr_core_coder->common_window = 0;
+      pstr_core_coder->common_tw = 0;
+      left = chan_offset;
+      right = chan_offset;
+      if (nr_core_coder_channels == 2) right = chan_offset + 1;
+    }
 
-      if (pstr_core_coder->common_tns) {
-        ixheaacd_read_tns_u(usac_data->pstr_sfb_info[0],
-                            &usac_data->pstr_tns[left][0], it_bit_buff);
-        memcpy(&usac_data->pstr_tns[right][0], &usac_data->pstr_tns[left][0],
-               sizeof(ia_tns_frame_info_struct));
-
-        pstr_core_coder->tns_data_present[0] = 2;
-        pstr_core_coder->tns_data_present[1] = 2;
-      } else {
-        pstr_core_coder->tns_present_both =
-            ixheaacd_read_bits_buf(it_bit_buff, 1);
-
-        if (pstr_core_coder->tns_present_both) {
-          pstr_core_coder->tns_data_present[0] = 1;
-          pstr_core_coder->tns_data_present[1] = 1;
-        } else {
-          pstr_core_coder->tns_data_present[1] =
-              ixheaacd_read_bits_buf(it_bit_buff, 1);
-          pstr_core_coder->tns_data_present[0] =
-              1 - pstr_core_coder->tns_data_present[1];
+    for (ch = 0, chn = chan_offset; ch < nr_core_coder_channels; ch++, chn++) {
+      if (pstr_core_coder->core_mode[chn] == CORE_MODE_LPD &&
+          usac_data->td_frame_prev[chn] == CORE_MODE_FD && usac_data->ec_flag) {
+        memcpy(usac_data->coef_fix[chn], usac_data->str_error_concealment[chn].spectral_coeff,
+               sizeof(usac_data->str_error_concealment[chn].spectral_coeff));
+        memcpy(usac_data->spec_scale[chn], usac_data->str_error_concealment[chn].q_spec_coeff,
+               sizeof(usac_data->spec_scale[chn]));
+        err_code = ixheaacd_fd_frm_dec(usac_data, chn);
+        if (err_code == -1) return err_code;
+        for (k = 0; k < usac_data->ccfl; k++) {
+          usac_data->time_sample_vector[chn][k] = (FLOAT32)(
+              (FLOAT32)usac_data->output_data_ptr[chn][k] * (FLOAT32)(ONE_BY_TWO_POW_15));
         }
+        memcpy(usac_data->time_sample_vector_prev[chn], usac_data->time_sample_vector[chn],
+               usac_data->ccfl * sizeof(usac_data->time_sample_vector_prev[chn][0]));
+
+        usac_data->window_sequence[ch] = usac_data->str_error_concealment[ch].win_seq;
+        usac_data->window_shape[ch] = usac_data->str_error_concealment[ch].win_shape;
+        usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
+        usac_data->window_sequence_last[ch] = usac_data->window_sequence[ch];
       }
-    } else {
-      pstr_core_coder->common_tns = 0;
-      pstr_core_coder->tns_data_present[0] = 0;
-      pstr_core_coder->tns_data_present[1] = 0;
-    }
+      if (pstr_core_coder->core_mode[ch] == 1) {
+        err_code = ixheaacd_tw_buff_update(usac_data, chn, usac_data->str_tddec[chn]);
+        if (err_code == -1) return err_code;
 
-  } else {
-    pstr_core_coder->common_window = 0;
-    pstr_core_coder->common_tw = 0;
-    left = chan_offset;
-    right = chan_offset;
-    if (nr_core_coder_channels == 2) right = chan_offset + 1;
-  }
+        if (!usac_data->td_frame_prev[chn]) {
+          ixheaacd_fix2flt_data(usac_data, usac_data->str_tddec[chn], chn);
+        }
 
-  for (ch = 0, chn = chan_offset; ch < nr_core_coder_channels; ch++, chn++) {
-    if (pstr_core_coder->core_mode[ch] == 1) {
-      err_code =
-          ixheaacd_tw_buff_update(usac_data, chn, usac_data->str_tddec[chn]);
-      if (err_code == -1) return err_code;
+        for (k = 0; k < usac_data->ccfl; k++) {
+          usac_data->time_sample_vector[chn][k] = (FLOAT32)(
+              (FLOAT32)usac_data->output_data_ptr[chn][k] * (FLOAT32)(ONE_BY_TWO_POW_15));
+        }
+        usac_data->present_chan = chn;
+        err_code = ixheaacd_lpd_channel_stream(usac_data, &td_frame, it_bit_buff,
+                                               usac_data->time_sample_vector[chn]);
+        if (err_code == -1) return err_code;
+        if (usac_data->ec_flag) {
+          it_bit_buff->xaac_jmp_buf = &local;
+        }
+        if (usac_data->ec_flag && usac_data->frame_ok) {
+          memcpy(&usac_data->td_frame_data_prev[chn], &td_frame, sizeof(td_frame));
+          usac_data->core_mode = CORE_MODE_LPD;
+        }
+        for (k = 0; k < usac_data->ccfl; k++) {
+          usac_data->output_data_ptr[chn][k] =
+              (WORD32)(usac_data->time_sample_vector[chn][k] * (FLOAT32)((WORD64)1 << 15));
+        }
 
-      if (!usac_data->td_frame_prev[chn]) {
-        ixheaacd_fix2flt_data(usac_data, usac_data->str_tddec[chn], chn);
-      }
+        usac_data->window_shape[chn] = WIN_SEL_0;
 
-      for (k = 0; k < usac_data->ccfl; k++) {
-        usac_data->time_sample_vector[chn][k] =
-            (FLOAT32)((FLOAT32)usac_data->output_data_ptr[chn][k] *
-                      (FLOAT32)(ONE_BY_TWO_POW_15));
-      }
-      usac_data->present_chan = chn;
-      err_code =
-          ixheaacd_lpd_channel_stream(usac_data, &td_frame, it_bit_buff,
-                                      usac_data->time_sample_vector[chn]);
-      if (err_code == -1) return err_code;
+        ixheaacd_td_frm_dec(usac_data, chn, td_frame.mod[0]);
 
-      for (k = 0; k < usac_data->ccfl; k++) {
-        usac_data->output_data_ptr[chn][k] = (WORD32)(
-            usac_data->time_sample_vector[chn][k] * (FLOAT32)((WORD64)1 << 15));
-      }
+        usac_data->window_shape_prev[chn] = usac_data->window_shape[chn];
+        usac_data->window_sequence_last[chn] = EIGHT_SHORT_SEQUENCE;
 
-      usac_data->window_shape[chn] = WIN_SEL_0;
+      } else {
+        memset(usac_data->coef_fix[chn], 0, LN2 * sizeof(*usac_data->coef_fix[0]));
 
-      ixheaacd_td_frm_dec(usac_data, chn, td_frame.mod[0]);
+        if (usac_data->str_tddec[chn] && usac_data->td_frame_prev[chn]) {
+          if (usac_data->ec_flag) {
+            memcpy(usac_data->time_sample_vector[chn], usac_data->time_sample_vector_prev[chn],
+                   usac_data->ccfl * sizeof(usac_data->time_sample_vector[chn][0]));
+          }
+          ixheaacd_lpd_dec_update(usac_data->str_tddec[chn], usac_data, chn);
+        }
 
-      for (k = 0; k < usac_data->ccfl; k++) {
-        usac_data->time_sample_vector[chn][k] =
-            (FLOAT32)((FLOAT32)usac_data->output_data_ptr[chn][k] *
-                      (FLOAT32)(ONE_BY_TWO_POW_15));
-      }
+        if (id != ID_USAC_LFE) {
+          if ((nr_core_coder_channels == 1) ||
+              (pstr_core_coder->core_mode[0] != pstr_core_coder->core_mode[1]))
+            pstr_core_coder->tns_data_present[ch] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+        }
 
-      usac_data->window_shape_prev[chn] = usac_data->window_shape[chn];
-      usac_data->window_sequence_last[chn] = EIGHT_SHORT_SEQUENCE;
-
-    } else {
-      memset(usac_data->coef_fix[chn], 0,
-             LN2 * sizeof(*usac_data->coef_fix[0]));
-
-      if (usac_data->str_tddec[chn] && usac_data->td_frame_prev[chn]) {
-        ixheaacd_lpd_dec_update(usac_data->str_tddec[chn], usac_data, chn);
-      }
-
-      if (id != ID_USAC_LFE) {
-        if ((nr_core_coder_channels == 1) ||
-            (pstr_core_coder->core_mode[0] != pstr_core_coder->core_mode[1]))
-          pstr_core_coder->tns_data_present[ch] =
-              ixheaacd_read_bits_buf(it_bit_buff, 1);
-      }
-
-      err_code = ixheaacd_fd_channel_stream(
-          usac_data, pstr_core_coder, &pstr_core_coder->max_sfb[ch],
-          usac_data->window_sequence_last[chn], chn,
-          usac_data->noise_filling_config[elem_idx], ch, it_bit_buff);
-      if (err_code == -1) return err_code;
-    }
-  }
-
-  if (pstr_core_coder->core_mode[0] == CORE_MODE_FD &&
-      pstr_core_coder->core_mode[1] == CORE_MODE_FD &&
-      nr_core_coder_channels == 2) {
-    ixheaacd_cplx_prev_mdct_dmx(
-        usac_data->pstr_sfb_info[left], usac_data->coef_save[left],
-        usac_data->coef_save[right], usac_data->dmx_re_prev,
-        pstr_core_coder->pred_dir);
-  }
-
-  if (pstr_core_coder->tns_on_lr == 0 && (id != ID_USAC_LFE)) {
-    for (ch = 0, chn = left; chn <= right; ch++, chn++) {
-      if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
-        err_code = ixheaacd_tns_apply(
-            usac_data, usac_data->coef_fix[chn], pstr_core_coder->max_sfb[ch],
-            usac_data->pstr_sfb_info[chn], usac_data->pstr_tns[chn]);
-        if (err_code) return err_code;
+        err_code = ixheaacd_fd_channel_stream(
+            usac_data, pstr_core_coder, &pstr_core_coder->max_sfb[ch],
+            usac_data->window_sequence_last[chn], chn, usac_data->noise_filling_config[elem_idx],
+            ch, it_bit_buff);
+        if (err_code == -1) return err_code;
       }
     }
-  }
 
-  if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 &&
-      pstr_core_coder->core_mode[1] == 0) {
-    if (pstr_core_coder->ms_mask_present[0] == 3) {
-      ixheaacd_cplx_pred_upmixing(usac_data, usac_data->coef_fix[left],
-                                  usac_data->coef_fix[right], pstr_core_coder,
-                                  left);
-
-    } else if (pstr_core_coder->ms_mask_present[0] > 0) {
-      ixheaacd_ms_stereo(
-          usac_data, usac_data->coef_fix[right], usac_data->coef_fix[left],
-          left, pstr_core_coder->max_sfb[right] > pstr_core_coder->max_sfb[left]
-                    ? pstr_core_coder->max_sfb[right]
-                    : pstr_core_coder->max_sfb[left]);
+    if (pstr_core_coder->core_mode[0] == CORE_MODE_FD &&
+        pstr_core_coder->core_mode[1] == CORE_MODE_FD && nr_core_coder_channels == 2) {
+      ixheaacd_cplx_prev_mdct_dmx(usac_data->pstr_sfb_info[left], usac_data->coef_save[left],
+                                  usac_data->coef_save[right], usac_data->dmx_re_prev,
+                                  pstr_core_coder->pred_dir);
     }
 
-    if (pstr_core_coder->tns_on_lr) {
+    if (pstr_core_coder->tns_on_lr == 0 && (id != ID_USAC_LFE)) {
       for (ch = 0, chn = left; chn <= right; ch++, chn++) {
         if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
-          err_code = ixheaacd_tns_apply(
-              usac_data, usac_data->coef_fix[chn], pstr_core_coder->max_sfb[ch],
-              usac_data->pstr_sfb_info[chn], usac_data->pstr_tns[chn]);
+          err_code = ixheaacd_tns_apply(usac_data, usac_data->coef_fix[chn],
+                                        pstr_core_coder->max_sfb[ch],
+                                        usac_data->pstr_sfb_info[chn], usac_data->pstr_tns[chn]);
           if (err_code) return err_code;
         }
       }
     }
 
-    ixheaacd_usac_cplx_save_prev(
-        usac_data->pstr_sfb_info[left], usac_data->coef_fix[left],
-        usac_data->coef_fix[right], usac_data->coef_save[left],
-        usac_data->coef_save[right]);
+    if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 &&
+        pstr_core_coder->core_mode[1] == 0) {
+      if (pstr_core_coder->ms_mask_present[0] == 3) {
+        ixheaacd_cplx_pred_upmixing(usac_data, usac_data->coef_fix[left],
+                                    usac_data->coef_fix[right], pstr_core_coder, left);
+
+      } else if (pstr_core_coder->ms_mask_present[0] > 0) {
+        ixheaacd_ms_stereo(usac_data, usac_data->coef_fix[right], usac_data->coef_fix[left], left,
+                           pstr_core_coder->max_sfb[right] > pstr_core_coder->max_sfb[left]
+                               ? pstr_core_coder->max_sfb[right]
+                               : pstr_core_coder->max_sfb[left]);
+      }
+
+      if (pstr_core_coder->tns_on_lr) {
+        for (ch = 0, chn = left; chn <= right; ch++, chn++) {
+          if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
+            err_code = ixheaacd_tns_apply(
+                usac_data, usac_data->coef_fix[chn], pstr_core_coder->max_sfb[ch],
+                usac_data->pstr_sfb_info[chn], usac_data->pstr_tns[chn]);
+            if (err_code) return err_code;
+          }
+        }
+      }
+
+      ixheaacd_usac_cplx_save_prev(usac_data->pstr_sfb_info[left], usac_data->coef_fix[left],
+                                   usac_data->coef_fix[right], usac_data->coef_save[left],
+                                   usac_data->coef_save[right]);
+    }
+    if (usac_data->ec_flag) {
+      for (chn = left; chn <= right; chn++) {
+        if (pstr_core_coder->core_mode[chn] == CORE_MODE_FD &&
+            usac_data->td_frame_prev[chn] == CORE_MODE_LPD) {
+          memcpy(usac_data->str_error_concealment[chn].spectral_coeff, usac_data->coef_fix[chn],
+                 sizeof(usac_data->str_error_concealment[chn].spectral_coeff));
+          memcpy(usac_data->str_error_concealment[chn].q_spec_coeff, usac_data->spec_scale[chn],
+                 sizeof(usac_data->spec_scale[chn]));
+          usac_data->str_error_concealment[chn].win_seq = usac_data->window_sequence[chn];
+          usac_data->str_error_concealment[chn].win_shape = usac_data->window_shape[chn];
+          usac_data->str_error_concealment[chn].win_shape_prev =
+              usac_data->window_shape_prev[chn];
+          usac_data->str_error_concealment[chn].td_frame_prev = usac_data->td_frame_prev[chn];
+          usac_data->str_error_concealment[chn].fac_data_present =
+              usac_data->fac_data_present[chn];
+        }
+      }
+      if (usac_data->frame_ok && usac_data->ec_flag) {
+        memcpy(usac_data->max_sfb, pstr_core_coder->max_sfb, sizeof(pstr_core_coder->max_sfb));
+      }
+    }
+  } else {
+    left = chan_offset;
+    right = chan_offset;
+    if (nr_core_coder_channels == 2) right = chan_offset + 1;
+    if (usac_data->ec_flag == 1) {
+      WORD32 err = 0;
+      usac_data->frame_ok = 0;
+      for (ch = left; ch <= right; ch++) {
+        if (usac_data->td_frame_prev[ch] == CORE_MODE_LPD) {
+          usac_data->fac_data_present[ch] = 0;
+          usac_data->str_error_concealment[ch].pstr_ec_scratch =
+              (ia_ec_scratch_str *)&usac_data->str_error_concealment[ch].str_ec_scratch;
+          usac_data->core_mode = usac_data->td_frame_prev[ch];
+          usac_data->present_chan = ch;
+          ixheaacd_usac_apply_ec(usac_data, NULL, ch);
+          err = ixheaacd_lpd_dec(usac_data, usac_data->str_tddec[ch],
+                                 &usac_data->td_frame_data_prev[ch],
+                                 usac_data->time_sample_vector[ch], usac_data->first_lpd_flag, 0,
+                                 usac_data->bpf_control_info);
+
+          if (err) return err;
+
+          for (k = 0; k < usac_data->ccfl; k++) {
+            usac_data->output_data_ptr[ch][k] =
+                (WORD32)(usac_data->time_sample_vector[ch][k] * (FLOAT32)((WORD64)1 << 15));
+          }
+
+          usac_data->window_shape[ch] = WIN_SEL_0;
+          usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
+          usac_data->window_sequence_last[ch] = EIGHT_SHORT_SEQUENCE;
+        } else {
+          pstr_core_coder->core_mode[ch] = CORE_MODE_FD;
+        }
+      }
+    }
   }
 
   for (ch = left; ch <= right; ch++) {
-    if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
+    FLOAT32 *ptr_scratch =
+        (FLOAT32 *)usac_data->str_error_concealment[ch].str_ec_scratch.spec_coeff;
+    if ((pstr_core_coder->core_mode[ch] != CORE_MODE_LPD &&
+         usac_data->td_frame_prev[ch] != CORE_MODE_LPD && usac_data->ec_flag) ||
+        (pstr_core_coder->core_mode[ch] == CORE_MODE_FD && usac_data->ec_flag == 0)) {
       if (usac_data->tw_mdct[elem_idx]) {
         err_code = -1;
         return err_code;
 
       } else {
+        if (usac_data->frame_ok == 0) {
+          usac_data->fac_data_present[ch] = 0;
+        }
         err_code = ixheaacd_fd_frm_dec(usac_data, ch);
         if (err_code == -1) return err_code;
+        if (usac_data->ec_flag) {
+          if (usac_data->str_error_concealment[ch].fade_idx < MAX_FADE_FRAMES) {
+            FLOAT32 fade_fac = (FLOAT32)(ONE_BY_TWO_POW_15)*ia_ec_fade_factors
+                [usac_data->str_error_concealment[ch].fade_idx];
+            for (k = 0; k < usac_data->ccfl; k++) {
+              usac_data->time_sample_vector[ch][k] =
+                  (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] * fade_fac);
+            }
+          } else {
+            memset(&usac_data->time_sample_vector[ch][0], 0,
+                   usac_data->ccfl * sizeof(usac_data->time_sample_vector[ch][0]));
+          }
+        } else {
+          for (k = 0; k < usac_data->ccfl; k++) {
+            usac_data->time_sample_vector[ch][k] =
+                (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] *
+                          (FLOAT32)(ONE_BY_TWO_POW_15));
+          }
+        }
+      }
+      usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
+      usac_data->window_sequence_last[ch] = usac_data->window_sequence[ch];
+    } else {
+      if (usac_data->ec_flag) {
+        usac_data->str_error_concealment[ch].prev_frame_ok[0] =
+            usac_data->str_error_concealment[ch].prev_frame_ok[1];
+        usac_data->str_error_concealment[ch].prev_frame_ok[1] = usac_data->frame_ok;
 
+        if (usac_data->str_error_concealment[ch].fade_idx < MAX_FADE_FRAMES) {
+          FLOAT32 fade_fac =
+              (FLOAT32)(ONE_BY_TWO_POW_15)*ia_ec_fade_factors[usac_data->str_error_concealment[ch]
+                                                                  .fade_idx];
+          for (k = 0; k < usac_data->ccfl; k++) {
+            usac_data->time_sample_vector[ch][k] =
+                (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] * fade_fac);
+          }
+        } else {
+          memset(&usac_data->time_sample_vector[ch][0], 0,
+                 usac_data->ccfl * sizeof(usac_data->time_sample_vector[ch][0]));
+        }
+
+        memcpy(ptr_scratch, usac_data->time_sample_vector[ch],
+               usac_data->ccfl * sizeof(ptr_scratch[0]));
+        memcpy(usac_data->time_sample_vector[ch], usac_data->time_sample_vector_prev[ch],
+               usac_data->ccfl * sizeof(usac_data->time_sample_vector[ch][0]));
+        memcpy(usac_data->time_sample_vector_prev[ch], ptr_scratch,
+               usac_data->ccfl * sizeof(ptr_scratch[0]));
+      } else {
         for (k = 0; k < usac_data->ccfl; k++) {
           usac_data->time_sample_vector[ch][k] =
               (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] *
                         (FLOAT32)(ONE_BY_TWO_POW_15));
         }
       }
-
-      usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
-      usac_data->window_sequence_last[ch] = usac_data->window_sequence[ch];
+    }
+    if (usac_data->ec_flag) {
+      usac_data->window_sequence[ch] = usac_data->str_error_concealment[ch].win_seq;
+      usac_data->window_shape[ch] = usac_data->str_error_concealment[ch].win_shape;
+      if (usac_data->first_frame == 0) {
+        usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
+        usac_data->window_sequence_last[ch] = usac_data->window_sequence[ch];
+      }
     }
   }
-
-  for (ch = 0, chn = left; chn <= right; chn++, ch++)
-    usac_data->td_frame_prev[chn] = pstr_core_coder->core_mode[ch];
+  if (usac_data->ec_flag) {
+    usac_data->first_frame = 0;
+    if (usac_data->frame_ok == 1) {
+      for (ch = 0, chn = left; chn <= right; chn++, ch++)
+        usac_data->td_frame_prev[chn] = pstr_core_coder->core_mode[ch];
+    }
+  } else {
+    for (ch = 0, chn = left; chn <= right; chn++, ch++)
+      usac_data->td_frame_prev[chn] = pstr_core_coder->core_mode[ch];
+  }
 
   return 0;
 }
diff --git a/decoder/ixheaacd_fft.c b/decoder/ixheaacd_fft.c
index 0932097..ecb88c1 100644
--- a/decoder/ixheaacd_fft.c
+++ b/decoder/ixheaacd_fft.c
@@ -28,9 +28,11 @@
 #include "ixheaacd_function_selector.h"
 
 extern const WORD32 ixheaacd_twiddle_table_fft_32x32[514];
+extern const FLOAT32 ixheaacd_twiddle_table_fft[514];
+extern const FLOAT32 ixheaacd_twiddle_table_fft_flt[16];
 extern const WORD32 ixheaacd_twiddle_table_3pr[1155];
 extern const WORD32 ixheaacd_twiddle_table_3pi[1155];
-extern const WORD8 ixheaacd_mps_dig_rev[16];
+extern const WORD8 ixheaacd_mps_dig_rev[8];
 
 #define PLATFORM_INLINE __inline
 
@@ -61,25 +63,844 @@
   return (result);
 }
 
+static PLATFORM_INLINE FLOAT32 ixheaacd_mult32X32float(FLOAT32 a, FLOAT32 b) {
+  FLOAT32 result;
 
-VOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re,
-                                     WORD32 *fin_im, WORD32 nlength) {
-  WORD32 i, j, k, n_stages;
-  WORD32 h2, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+  result = a * b;
+
+  return result;
+}
+
+static PLATFORM_INLINE FLOAT32 ixheaacd_mac32X32float(FLOAT32 a, FLOAT32 b, FLOAT32 c) {
+  FLOAT32 result;
+
+  result = a + b * c;
+
+  return result;
+}
+
+VOID ixheaacd_mps_synth_calc_fft(FLOAT32 *ptr_xr, FLOAT32 *ptr_xi,
+                                 WORD32 npoints) {
+  WORD32 i, j, k;
+  FLOAT32 y[64], z[64];
+  FLOAT32 *ptr_y = y, *ptr_z = z;
+  const FLOAT32 *ptr_w = ixheaacd_twiddle_table_fft_flt;
+
+  for (i = 0; i < npoints; i += 4) {
+    FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+    FLOAT32 *inp = ptr_xr;
+    FLOAT32 tmk;
+
+    WORD32 h2 = ixheaacd_mps_dig_rev[i >> 2];
+
+    inp += (h2);
+
+    x0r = *inp;
+    x0i = *(inp + 1);
+    inp += 16;
+
+    x1r = *inp;
+    x1i = *(inp + 1);
+    inp += 16;
+
+    x2r = *inp;
+    x2i = *(inp + 1);
+    inp += 16;
+
+    x3r = *inp;
+    x3i = *(inp + 1);
+
+    x0r = x0r + x2r;
+    x0i = x0i + x2i;
+
+    tmk = x0r - x2r;
+    x2r = tmk - x2r;
+    tmk = x0i - x2i;
+    x2i = tmk - x2i;
+
+    x1r = x1r + x3r;
+    x1i = x1i + x3i;
+
+    tmk = x1r - x3r;
+    x3r = tmk - x3r;
+    tmk = x1i - x3i;
+    x3i = tmk - x3i;
+
+    x0r = x0r + x1r;
+    x0i = x0i + x1i;
+
+    tmk = x0r - x1r;
+    x1r = tmk - x1r;
+    tmk = x0i - x1i;
+    x1i = tmk - x1i;
+
+    x2r = x2r + x3i;
+    x2i = x2i - x3r;
+
+    tmk = x2r - x3i;
+    x3i = tmk - x3i;
+    tmk = x2i + x3r;
+    x3r = tmk + x3r;
+
+    *ptr_y++ = x0r;
+    *ptr_y++ = x0i;
+    *ptr_y++ = x2r;
+    *ptr_y++ = x2i;
+    *ptr_y++ = x1r;
+    *ptr_y++ = x1i;
+    *ptr_y++ = x3i;
+    *ptr_y++ = x3r;
+
+    inp = ptr_xi;
+
+    inp += (h2);
+
+    x0r = *inp;
+    x0i = *(inp + 1);
+    inp += 16;
+
+    x1r = *inp;
+    x1i = *(inp + 1);
+    inp += 16;
+
+    x2r = *inp;
+    x2i = *(inp + 1);
+    inp += 16;
+
+    x3r = *inp;
+    x3i = *(inp + 1);
+
+    x0r = x0r + x2r;
+    x0i = x0i + x2i;
+
+    tmk = x0r - x2r;
+    x2r = tmk - x2r;
+    tmk = x0i - x2i;
+    x2i = tmk - x2i;
+
+    x1r = x1r + x3r;
+    x1i = x1i + x3i;
+
+    tmk = x1r - x3r;
+    x3r = tmk - x3r;
+    tmk = x1i - x3i;
+    x3i = tmk - x3i;
+
+    x0r = x0r + x1r;
+    x0i = x0i + x1i;
+
+    tmk = x0r - x1r;
+    x1r = tmk - x1r;
+    tmk = x0i - x1i;
+    x1i = tmk - x1i;
+
+    x2r = x2r + x3i;
+    x2i = x2i - x3r;
+
+    tmk = x2r - x3i;
+    x3i = tmk - x3i;
+    tmk = x2i + x3r;
+    x3r = tmk + x3r;
+
+    *ptr_z++ = x0r;
+    *ptr_z++ = x0i;
+    *ptr_z++ = x2r;
+    *ptr_z++ = x2i;
+    *ptr_z++ = x1r;
+    *ptr_z++ = x1i;
+    *ptr_z++ = x3i;
+    *ptr_z++ = x3r;
+  }
+  ptr_y -= 64;
+  ptr_z -= 64;
+  {
+    FLOAT32 *data_r = ptr_y;
+    FLOAT32 *data_i = ptr_z;
+    for (k = 2; k != 0; k--) {
+      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+      x0r = (*data_r);
+      x0i = (*(data_r + 1));
+      data_r += 8;
+
+      x1r = (*data_r);
+      x1i = (*(data_r + 1));
+      data_r += 8;
+
+      x2r = (*data_r);
+      x2i = (*(data_r + 1));
+      data_r += 8;
+
+      x3r = (*data_r);
+      x3i = (*(data_r + 1));
+      data_r -= 24;
+
+      x0r = x0r + x2r;
+      x0i = x0i + x2i;
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + x1r;
+      x0i = x0i + x1i;
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + x3i;
+      x2i = x2i - x3r;
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_r = x0r;
+      *(data_r + 1) = x0i;
+      data_r += 8;
+
+      *data_r = x2r;
+      *(data_r + 1) = x2i;
+      data_r += 8;
+
+      *data_r = x1r;
+      *(data_r + 1) = x1i;
+      data_r += 8;
+
+      *data_r = x3i;
+      *(data_r + 1) = x3r;
+      data_r += 8;
+
+      x0r = (*data_i);
+      x0i = (*(data_i + 1));
+      data_i += 8;
+
+      x1r = (*data_i);
+      x1i = (*(data_i + 1));
+      data_i += 8;
+
+      x2r = (*data_i);
+      x2i = (*(data_i + 1));
+      data_i += 8;
+
+      x3r = (*data_i);
+      x3i = (*(data_i + 1));
+      data_i -= 24;
+
+      x0r = x0r + x2r;
+      x0i = x0i + x2i;
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + x1r;
+      x0i = x0i + x1i;
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + x3i;
+      x2i = x2i - x3r;
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_i = x0r;
+      *(data_i + 1) = x0i;
+      data_i += 8;
+
+      *data_i = x2r;
+      *(data_i + 1) = x2i;
+      data_i += 8;
+
+      *data_i = x1r;
+      *(data_i + 1) = x1i;
+      data_i += 8;
+
+      *data_i = x3i;
+      *(data_i + 1) = x3r;
+      data_i += 8;
+    }
+    data_r = ptr_y + 2;
+    data_i = ptr_z + 2;
+
+    for (k = 2; k != 0; k--) {
+      FLOAT32 tmp;
+      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+      data_r += 8;
+
+      x1r = *data_r;
+      x1i = *(data_r + 1);
+      data_r += 8;
+
+      x2r = *data_r;
+      x2i = *(data_r + 1);
+      data_r += 8;
+
+      x3r = *data_r;
+      x3i = *(data_r + 1);
+      data_r -= 24;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.923880f) -
+                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.382683f));
+      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.382683f),
+                                   (FLOAT32)x1i, 0.923880f);
+      x1r = tmp;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x2r, 0.707107f) -
+                      ixheaacd_mult32X32float((FLOAT32)x2i, -0.707107f));
+      x2i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x2r, -0.707107f),
+                                   (FLOAT32)x2i, 0.707107f);
+      x2r = tmp;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x3r, 0.382683f) -
+                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.923880f));
+      x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x3r, -0.923880f),
+                                   (FLOAT32)x3i, 0.382683f);
+      x3r = tmp;
+
+      x0r = (*data_r);
+      x0i = (*(data_r + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_r = x0r;
+      *(data_r + 1) = x0i;
+      data_r += 8;
+
+      *data_r = x2r;
+      *(data_r + 1) = x2i;
+      data_r += 8;
+
+      *data_r = x1r;
+      *(data_r + 1) = x1i;
+      data_r += 8;
+
+      *data_r = x3i;
+      *(data_r + 1) = x3r;
+      data_r += 8;
+      data_i += 8;
+
+      x1r = *data_i;
+      x1i = *(data_i + 1);
+      data_i += 8;
+
+      x2r = *data_i;
+      x2i = *(data_i + 1);
+      data_i += 8;
+
+      x3r = *data_i;
+      x3i = *(data_i + 1);
+      data_i -= 24;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.923880f) -
+                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.382683f));
+      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.382683f),
+                                   (FLOAT32)x1i, 0.923880f);
+      x1r = tmp;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x2r, 0.707107f) -
+                      ixheaacd_mult32X32float((FLOAT32)x2i, -0.707107f));
+      x2i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x2r, -0.707107f),
+                                   (FLOAT32)x2i, 0.707107f);
+      x2r = tmp;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x3r, 0.382683f) -
+                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.923880f));
+      x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x3r, -0.923880f),
+                                   (FLOAT32)x3i, 0.382683f);
+      x3r = tmp;
+
+      x0r = (*data_i);
+      x0i = (*(data_i + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_i = x0r;
+      *(data_i + 1) = x0i;
+      data_i += 8;
+
+      *data_i = x2r;
+      *(data_i + 1) = x2i;
+      data_i += 8;
+
+      *data_i = x1r;
+      *(data_i + 1) = x1i;
+      data_i += 8;
+
+      *data_i = x3i;
+      *(data_i + 1) = x3r;
+      data_i += 8;
+    }
+    data_r -= 62;
+    data_i -= 62;
+    for (k = 2; k != 0; k--) {
+      FLOAT32 tmp;
+      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+      data_r += 8;
+
+      x1r = *data_r;
+      x1i = *(data_r + 1);
+      data_r += 8;
+
+      x2r = *data_r;
+      x2i = *(data_r + 1);
+      data_r += 8;
+
+      x3r = *data_r;
+      x3i = *(data_r + 1);
+      data_r -= 24;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.707107f) -
+                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.707107f));
+      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.707107f),
+                                   (FLOAT32)x1i, 0.707107f);
+      x1r = tmp;
+
+      tmp = x2i;
+      x2i = -x2r;
+      x2r = tmp;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x3r, -0.707107f) +
+                      ixheaacd_mult32X32float((FLOAT32)x3i, 0.707107f));
+      x3i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x3r, 0.707107f) +
+                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.707107f));
+      x3r = tmp;
+
+      x0r = (*data_r);
+      x0i = (*(data_r + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_r = x0r;
+      *(data_r + 1) = x0i;
+      data_r += 8;
+
+      *data_r = x2r;
+      *(data_r + 1) = x2i;
+      data_r += 8;
+
+      *data_r = x1r;
+      *(data_r + 1) = x1i;
+      data_r += 8;
+
+      *data_r = x3i;
+      *(data_r + 1) = x3r;
+      data_r += 8;
+      data_i += 8;
+
+      x1r = *data_i;
+      x1i = *(data_i + 1);
+      data_i += 8;
+
+      x2r = *data_i;
+      x2i = *(data_i + 1);
+      data_i += 8;
+
+      x3r = *data_i;
+      x3i = *(data_i + 1);
+      data_i -= 24;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.707107f) -
+                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.707107f));
+      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.707107f),
+                                   (FLOAT32)x1i, 0.707107f);
+      x1r = tmp;
+
+      tmp = x2i;
+      x2i = -x2r;
+      x2r = tmp;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x3r, -0.707107f) +
+                      ixheaacd_mult32X32float((FLOAT32)x3i, 0.707107f));
+      x3i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x3r, 0.707107f) +
+                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.707107f));
+      x3r = tmp;
+
+      x0r = (*data_i);
+      x0i = (*(data_i + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_i = x0r;
+      *(data_i + 1) = x0i;
+      data_i += 8;
+
+      *data_i = x2r;
+      *(data_i + 1) = x2i;
+      data_i += 8;
+
+      *data_i = x1r;
+      *(data_i + 1) = x1i;
+      data_i += 8;
+
+      *data_i = x3i;
+      *(data_i + 1) = x3r;
+      data_i += 8;
+    }
+    data_r -= 62;
+    data_i -= 62;
+    for (k = 2; k != 0; k--) {
+      FLOAT32 tmp;
+      FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+      data_r += 8;
+
+      x1r = *data_r;
+      x1i = *(data_r + 1);
+      data_r += 8;
+
+      x2r = *data_r;
+      x2i = *(data_r + 1);
+      data_r += 8;
+
+      x3r = *data_r;
+      x3i = *(data_r + 1);
+      data_r -= 24;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.382683f) -
+                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.923880f));
+      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.923880f),
+                                   (FLOAT32)x1i, 0.382683f);
+      x1r = tmp;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x2r, -0.707107f) +
+                      ixheaacd_mult32X32float((FLOAT32)x2i, 0.707107f));
+      x2i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x2r, 0.707107f) +
+                      ixheaacd_mult32X32float((FLOAT32)x2i, -0.707107f));
+      x2r = tmp;
+
+      tmp = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x3r, 0.923880f) +
+                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.382683f));
+      x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x3r, -0.382683f),
+                                   (FLOAT32)x3i, 0.923880f);
+      x3r = tmp;
+
+      x0r = (*data_r);
+      x0i = (*(data_r + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i - x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i + (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_r = x0r;
+      *(data_r + 1) = x0i;
+      data_r += 8;
+
+      *data_r = x2r;
+      *(data_r + 1) = x2i;
+      data_r += 8;
+
+      *data_r = x1r;
+      *(data_r + 1) = x1i;
+      data_r += 8;
+
+      *data_r = x3i;
+      *(data_r + 1) = x3r;
+      data_r += 8;
+      data_i += 8;
+
+      x1r = *data_i;
+      x1i = *(data_i + 1);
+      data_i += 8;
+
+      x2r = *data_i;
+      x2i = *(data_i + 1);
+      data_i += 8;
+
+      x3r = *data_i;
+      x3i = *(data_i + 1);
+      data_i -= 24;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, 0.382683f) -
+                      ixheaacd_mult32X32float((FLOAT32)x1i, -0.923880f));
+      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, -0.923880f),
+                                   (FLOAT32)x1i, 0.382683f);
+      x1r = tmp;
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x2r, -0.707107f) +
+                      ixheaacd_mult32X32float((FLOAT32)x2i, 0.707107f));
+      x2i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x2r, 0.707107f) +
+                      ixheaacd_mult32X32float((FLOAT32)x2i, -0.707107f));
+      x2r = tmp;
+
+      tmp = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x3r, 0.923880f) +
+                      ixheaacd_mult32X32float((FLOAT32)x3i, -0.382683f));
+      x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x3r, -0.382683f),
+                                   (FLOAT32)x3i, 0.923880f);
+      x3r = tmp;
+
+      x0r = (*data_i);
+      x0i = (*(data_i + 1));
+
+      x0r = x0r + (x2r);
+      x0i = x0i + (x2i);
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i - x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i + (x3i * 2);
+
+      x0r = x0r + (x1r);
+      x0i = x0i + (x1i);
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + (x3i);
+      x2i = x2i - (x3r);
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
+
+      *data_i = x0r;
+      *(data_i + 1) = x0i;
+      data_i += 8;
+
+      *data_i = x2r;
+      *(data_i + 1) = x2i;
+      data_i += 8;
+
+      *data_i = x1r;
+      *(data_i + 1) = x1i;
+      data_i += 8;
+
+      *data_i = x3i;
+      *(data_i + 1) = x3r;
+      data_i += 8;
+    }
+    data_r -= 62;
+    data_i -= 62;
+  }
+  {
+    const FLOAT32 *twiddles = ptr_w;
+    FLOAT32 x0r, x0i, x1r, x1i;
+    for (j = 8; j != 0; j--) {
+      FLOAT32 W1 = *twiddles;
+      twiddles++;
+      FLOAT32 W4 = *twiddles;
+      twiddles++;
+      FLOAT32 tmp;
+
+      x0r = *ptr_y;
+      x0i = *(ptr_y + 1);
+      ptr_y += 32;
+      ptr_xr += 32;
+
+      x1r = *ptr_y;
+      x1i = *(ptr_y + 1);
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, W1) -
+                      ixheaacd_mult32X32float((FLOAT32)x1i, W4));
+      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, W4),
+                                   (FLOAT32)x1i, W1);
+      x1r = tmp;
+
+      *ptr_xr = (x0r) - (x1r);
+      *(ptr_xr + 1) = (x0i) - (x1i);
+      ptr_y -= 32;
+      ptr_xr -= 32;
+
+      *ptr_xr = (x0r) + (x1r);
+      *(ptr_xr + 1) = (x0i) + (x1i);
+      ptr_y += 2;
+      ptr_xr += 2;
+
+      x0r = *ptr_z;
+      x0i = *(ptr_z + 1);
+      ptr_z += 32;
+      ptr_xi += 32;
+
+      x1r = *ptr_z;
+      x1i = *(ptr_z + 1);
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, W1) -
+                      ixheaacd_mult32X32float((FLOAT32)x1i, W4));
+      x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT32)x1r, W4),
+                                   (FLOAT32)x1i, W1);
+      x1r = tmp;
+
+      *ptr_xi = (x0r) - (x1r);
+      *(ptr_xi + 1) = (x0i) - (x1i);
+      ptr_z -= 32;
+      ptr_xi -= 32;
+
+      *ptr_xi = (x0r) + (x1r);
+      *(ptr_xi + 1) = (x0i) + (x1i);
+      ptr_z += 2;
+      ptr_xi += 2;
+    }
+    twiddles = ptr_w;
+    for (j = 8; j != 0; j--) {
+      FLOAT32 W1 = *twiddles;
+      twiddles++;
+      FLOAT32 W4 = *twiddles;
+      twiddles++;
+      FLOAT32 tmp;
+
+      x0r = *ptr_y;
+      x0i = *(ptr_y + 1);
+      ptr_y += 32;
+      ptr_xr += 32;
+
+      x1r = *ptr_y;
+      x1i = *(ptr_y + 1);
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, W4) +
+                      ixheaacd_mult32X32float((FLOAT32)x1i, W1));
+      x1i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x1r, W1) +
+                      ixheaacd_mult32X32float((FLOAT32)x1i, W4));
+      x1r = tmp;
+
+      *ptr_xr = (x0r) - (x1r);
+      *(ptr_xr + 1) = (x0i) - (x1i);
+      ptr_y -= 32;
+      ptr_xr -= 32;
+
+      *ptr_xr = (x0r) + (x1r);
+      *(ptr_xr + 1) = (x0i) + (x1i);
+      ptr_y += 2;
+      ptr_xr += 2;
+
+      x0r = *ptr_z;
+      x0i = *(ptr_z + 1);
+      ptr_z += 32;
+      ptr_xi += 32;
+
+      x1r = *ptr_z;
+      x1i = *(ptr_z + 1);
+
+      tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT32)x1r, W4) +
+                      ixheaacd_mult32X32float((FLOAT32)x1i, W1));
+      x1i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT32)x1r, W1) +
+                      ixheaacd_mult32X32float((FLOAT32)x1i, W4));
+      x1r = tmp;
+
+      *ptr_xi = (x0r) - (x1r);
+      *(ptr_xi + 1) = (x0i) - (x1i);
+      ptr_z -= 32;
+      ptr_xi -= 32;
+
+      *ptr_xi = (x0r) + (x1r);
+      *(ptr_xi + 1) = (x0i) + (x1i);
+      ptr_z += 2;
+      ptr_xi += 2;
+    }
+  }
+}
+
+VOID ixheaacd_mps_complex_fft(FLOAT32 *xr, FLOAT32 *xi, WORD32 nlength) {
+  WORD32 i, j, k, n_stages, h2;
+  FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
   WORD32 del, nodespacing, in_loop_cnt;
-  WORD32 y[128];
+  WORD32 dig_rev_shift;
+  WORD32 not_power_4;
+  FLOAT32 ptr_x[256];
+  FLOAT32 y[256];
   WORD32 npoints = nlength;
-  WORD32 *ptr_y = y;
-  const WORD32 *ptr_w;
+  FLOAT32 *ptr_y = y;
+  const FLOAT32 *ptr_w;
+  dig_rev_shift = ixheaacd_norm32(npoints) + 1 - 16;
   n_stages = 30 - ixheaacd_norm32(npoints);
+  not_power_4 = n_stages & 1;
 
   n_stages = n_stages >> 1;
 
-  ptr_w = ixheaacd_twiddle_table_fft_32x32;
 
-  for (i = 0; i < npoints; i += 4) {
-    WORD32 *inp = ptr_x;
-    h2 = ixheaacd_mps_dig_rev[i >> 2];
+  for (i = 0; i<nlength; i++)
+  {
+    ptr_x[2 * i] = xr[i];
+    ptr_x[2 * i + 1] = xi[i];
+  }
+
+  ptr_w = ixheaacd_twiddle_table_fft;
+
+  for (i = 0; i<npoints; i += 4)
+  {
+    FLOAT32 *inp = ptr_x;
+
+    DIG_REV(i, dig_rev_shift, h2);
+    if (not_power_4)
+    {
+      h2 += 1;
+      h2 &= ~1;
+    }
     inp += (h2);
 
     x0r = *inp;
@@ -97,23 +918,23 @@
     x3r = *inp;
     x3i = *(inp + 1);
 
-    x0r = ixheaacd_add32_sat(x0r, x2r);
-    x0i = ixheaacd_add32_sat(x0i, x2i);
-    x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-    x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-    x1r = ixheaacd_add32_sat(x1r, x3r);
-    x1i = ixheaacd_add32_sat(x1i, x3i);
-    x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-    x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+    x0r = x0r + x2r;
+    x0i = x0i + x2i;
+    x2r = x0r - (x2r * 2);
+    x2i = x0i - (x2i * 2);
+    x1r = x1r + x3r;
+    x1i = x1i + x3i;
+    x3r = x1r - (x3r * 2);
+    x3i = x1i - (x3i * 2);
 
-    x0r = ixheaacd_add32_sat(x0r, x1r);
-    x0i = ixheaacd_add32_sat(x0i, x1i);
-    x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-    x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-    x2r = ixheaacd_add32_sat(x2r, x3i);
-    x2i = ixheaacd_sub32_sat(x2i, x3r);
-    x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-    x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+    x0r = x0r + x1r;
+    x0i = x0i + x1i;
+    x1r = x0r - (x1r * 2);
+    x1i = x0i - (x1i * 2);
+    x2r = x2r + x3i;
+    x2i = x2i - x3r;
+    x3i = x2r - (x3i * 2);
+    x3r = x2i + (x3r * 2);
 
     *ptr_y++ = x0r;
     *ptr_y++ = x0i;
@@ -128,13 +949,15 @@
   del = 4;
   nodespacing = 64;
   in_loop_cnt = npoints >> 4;
-  for (i = n_stages - 1; i > 0; i--) {
-    const WORD32 *twiddles = ptr_w;
-    WORD32 *data = ptr_y;
-    WORD32 w1h, w2h, w3h, w1l, w2l, w3l;
+  for (i = n_stages - 1; i>0; i--)
+  {
+    const FLOAT32 *twiddles = ptr_w;
+    FLOAT32 *data = ptr_y;
+    FLOAT32 w1h, w2h, w3h, w1l, w2l, w3l;
     WORD32 sec_loop_cnt;
 
-    for (k = in_loop_cnt; k != 0; k--) {
+    for (k = in_loop_cnt; k != 0; k--)
+    {
       x0r = (*data);
       x0i = (*(data + 1));
       data += (del << 1);
@@ -151,23 +974,23 @@
       x3i = (*(data + 1));
       data -= 3 * (del << 1);
 
-      x0r = ixheaacd_add32_sat(x0r, x2r);
-      x0i = ixheaacd_add32_sat(x0i, x2i);
-      x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-      x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-      x1r = ixheaacd_add32_sat(x1r, x3r);
-      x1i = ixheaacd_add32_sat(x1i, x3i);
-      x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-      x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+      x0r = x0r + x2r;
+      x0i = x0i + x2i;
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
 
-      x0r = ixheaacd_add32_sat(x0r, x1r);
-      x0i = ixheaacd_add32_sat(x0i, x1i);
-      x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-      x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-      x2r = ixheaacd_add32_sat(x2r, x3i);
-      x2i = ixheaacd_sub32_sat(x2i, x3r);
-      x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-      x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+      x0r = x0r + x1r;
+      x0i = x0i + x1i;
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r + x3i;
+      x2i = x2i - x3r;
+      x3i = x2r - (x3i * 2);
+      x3r = x2i + (x3r * 2);
 
       *data = x0r;
       *(data + 1) = x0i;
@@ -188,13 +1011,13 @@
     data = ptr_y + 2;
 
     sec_loop_cnt = (nodespacing * del);
-    sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) -
-                   (sec_loop_cnt / 16) + (sec_loop_cnt / 32) -
-                   (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
-                   (sec_loop_cnt / 256);
+    sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) \
+            + (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) \
+            - (sec_loop_cnt / 256);
     j = nodespacing;
 
-    for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
+    for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing)
+    {
       w1h = *(twiddles + 2 * j);
       w1l = *(twiddles + 2 * j + 1);
       w2h = *(twiddles + 2 * (j << 1));
@@ -202,9 +1025,10 @@
       w3h = *(twiddles + 2 * j + 2 * (j << 1));
       w3l = *(twiddles + 2 * j + 2 * (j << 1) + 1);
 
-      for (k = in_loop_cnt; k != 0; k--) {
-        WORD32 tmp;
-        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+      for (k = in_loop_cnt; k != 0; k--)
+      {
+        FLOAT32 tmp;
+        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
 
         data += (del << 1);
 
@@ -220,41 +1044,38 @@
         x3i = *(data + 1);
         data -= 3 * (del << 1);
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
-                                 ixheaacd_mult32_sat(x1i, w1h));
-        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
+        tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
+        x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
         x1r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
-                                 ixheaacd_mult32_sat(x2i, w2h));
-        x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
+        tmp = (ixheaacd_mult32X32float(x2r, w2l) - ixheaacd_mult32X32float(x2i, w2h));
+        x2i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x2r, w2h), x2i, w2l);
         x2r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3r, w3l),
-                                 ixheaacd_mult32_sat(x3i, w3h));
-        x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
+        tmp = (ixheaacd_mult32X32float(x3r, w3l) - ixheaacd_mult32X32float(x3i, w3h));
+        x3i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x3r, w3h), x3i, w3l);
         x3r = tmp;
 
         x0r = (*data);
         x0i = (*(data + 1));
 
-        x0r = ixheaacd_add32_sat(x0r, x2r);
-        x0i = ixheaacd_add32_sat(x0i, x2i);
-        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-        x1r = ixheaacd_add32_sat(x1r, x3r);
-        x1i = ixheaacd_add32_sat(x1i, x3i);
-        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+        x0r = x0r + (x2r);
+        x0i = x0i + (x2i);
+        x2r = x0r - (x2r * 2);
+        x2i = x0i - (x2i * 2);
+        x1r = x1r + x3r;
+        x1i = x1i + x3i;
+        x3r = x1r - (x3r * 2);
+        x3i = x1i - (x3i * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x1r);
-        x0i = ixheaacd_add32_sat(x0i, x1i);
-        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-        x2r = ixheaacd_add32_sat(x2r, x3i);
-        x2i = ixheaacd_sub32_sat(x2i, x3r);
-        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+        x0r = x0r + (x1r);
+        x0i = x0i + (x1i);
+        x1r = x0r - (x1r * 2);
+        x1i = x0i - (x1i * 2);
+        x2r = x2r + (x3i);
+        x2i = x2i - (x3r);
+        x3i = x2r - (x3i * 2);
+        x3r = x2i + (x3r * 2);
 
         *data = x0r;
         *(data + 1) = x0i;
@@ -275,7 +1096,8 @@
       data -= 2 * npoints;
       data += 2;
     }
-    for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
+    for (; j <= (nodespacing * del) >> 1; j += nodespacing)
+    {
       w1h = *(twiddles + 2 * j);
       w2h = *(twiddles + 2 * (j << 1));
       w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
@@ -283,9 +1105,10 @@
       w2l = *(twiddles + 2 * (j << 1) + 1);
       w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
 
-      for (k = in_loop_cnt; k != 0; k--) {
-        WORD32 tmp;
-        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+      for (k = in_loop_cnt; k != 0; k--)
+      {
+        FLOAT32 tmp;
+        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
 
         data += (del << 1);
 
@@ -301,42 +1124,38 @@
         x3i = *(data + 1);
         data -= 3 * (del << 1);
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
-                                 ixheaacd_mult32_sat(x1i, w1h));
-        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
+        tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
+        x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
         x1r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2r, w2l),
-                                 ixheaacd_mult32_sat(x2i, w2h));
-        x2i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x2r, w2h), x2i, w2l);
+        tmp = (ixheaacd_mult32X32float(x2r, w2l) - ixheaacd_mult32X32float(x2i, w2h));
+        x2i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x2r, w2h), x2i, w2l);
         x2r = tmp;
 
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
-                                 ixheaacd_mult32_sat(x3i, w3l));
-        x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
-                                 ixheaacd_mult32_sat(x3r, w3l));
+        tmp = (ixheaacd_mult32X32float(x3r, w3h) + ixheaacd_mult32X32float(x3i, w3l));
+        x3i = -ixheaacd_mult32X32float(x3r, w3l) + ixheaacd_mult32X32float(x3i, w3h);
         x3r = tmp;
 
         x0r = (*data);
         x0i = (*(data + 1));
 
-        x0r = ixheaacd_add32_sat(x0r, x2r);
-        x0i = ixheaacd_add32_sat(x0i, x2i);
-        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-        x1r = ixheaacd_add32_sat(x1r, x3r);
-        x1i = ixheaacd_add32_sat(x1i, x3i);
-        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+        x0r = x0r + (x2r);
+        x0i = x0i + (x2i);
+        x2r = x0r - (x2r * 2);
+        x2i = x0i - (x2i * 2);
+        x1r = x1r + x3r;
+        x1i = x1i + x3i;
+        x3r = x1r - (x3r * 2);
+        x3i = x1i - (x3i * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x1r);
-        x0i = ixheaacd_add32_sat(x0i, x1i);
-        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-        x2r = ixheaacd_add32_sat(x2r, x3i);
-        x2i = ixheaacd_sub32_sat(x2i, x3r);
-        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+        x0r = x0r + (x1r);
+        x0i = x0i + (x1i);
+        x1r = x0r - (x1r * 2);
+        x1i = x0i - (x1i * 2);
+        x2r = x2r + (x3i);
+        x2i = x2i - (x3r);
+        x3i = x2r - (x3i * 2);
+        x3r = x2i + (x3r * 2);
 
         *data = x0r;
         *(data + 1) = x0i;
@@ -357,7 +1176,8 @@
       data -= 2 * npoints;
       data += 2;
     }
-    for (; j <= sec_loop_cnt * 2; j += nodespacing) {
+    for (; j <= sec_loop_cnt * 2; j += nodespacing)
+    {
       w1h = *(twiddles + 2 * j);
       w2h = *(twiddles + 2 * (j << 1) - 512);
       w3h = *(twiddles + 2 * j + 2 * (j << 1) - 512);
@@ -365,9 +1185,10 @@
       w2l = *(twiddles + 2 * (j << 1) - 511);
       w3l = *(twiddles + 2 * j + 2 * (j << 1) - 511);
 
-      for (k = in_loop_cnt; k != 0; k--) {
-        WORD32 tmp;
-        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+      for (k = in_loop_cnt; k != 0; k--)
+      {
+        FLOAT32 tmp;
+        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
 
         data += (del << 1);
 
@@ -383,43 +1204,38 @@
         x3i = *(data + 1);
         data -= 3 * (del << 1);
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
-                                 ixheaacd_mult32_sat(x1i, w1h));
-        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
+        tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
+        x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
         x1r = tmp;
 
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
-                                 ixheaacd_mult32_sat(x2i, w2l));
-        x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
-                                 ixheaacd_mult32_sat(x2r, w2l));
+        tmp = (ixheaacd_mult32X32float(x2r, w2h) + ixheaacd_mult32X32float(x2i, w2l));
+        x2i = -ixheaacd_mult32X32float(x2r, w2l) + ixheaacd_mult32X32float(x2i, w2h);
         x2r = tmp;
 
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x3r, w3h),
-                                 ixheaacd_mult32_sat(x3i, w3l));
-        x3i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
-                                 ixheaacd_mult32_sat(x3r, w3l));
+        tmp = (ixheaacd_mult32X32float(x3r, w3h) + ixheaacd_mult32X32float(x3i, w3l));
+        x3i = -ixheaacd_mult32X32float(x3r, w3l) + ixheaacd_mult32X32float(x3i, w3h);
         x3r = tmp;
 
         x0r = (*data);
         x0i = (*(data + 1));
 
-        x0r = ixheaacd_add32_sat(x0r, x2r);
-        x0i = ixheaacd_add32_sat(x0i, x2i);
-        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-        x1r = ixheaacd_add32_sat(x1r, x3r);
-        x1i = ixheaacd_add32_sat(x1i, x3i);
-        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-        x3i = ixheaacd_sub32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+        x0r = x0r + (x2r);
+        x0i = x0i + (x2i);
+        x2r = x0r - (x2r * 2);
+        x2i = x0i - (x2i * 2);
+        x1r = x1r + x3r;
+        x1i = x1i + x3i;
+        x3r = x1r - (x3r * 2);
+        x3i = x1i - (x3i * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x1r);
-        x0i = ixheaacd_add32_sat(x0i, x1i);
-        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-        x2r = ixheaacd_add32_sat(x2r, x3i);
-        x2i = ixheaacd_sub32_sat(x2i, x3r);
-        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+        x0r = x0r + (x1r);
+        x0i = x0i + (x1i);
+        x1r = x0r - (x1r * 2);
+        x1i = x0i - (x1i * 2);
+        x2r = x2r + (x3i);
+        x2i = x2i - (x3r);
+        x3i = x2r - (x3i * 2);
+        x3r = x2i + (x3r * 2);
 
         *data = x0r;
         *(data + 1) = x0i;
@@ -440,7 +1256,8 @@
       data -= 2 * npoints;
       data += 2;
     }
-    for (; j < nodespacing * del; j += nodespacing) {
+    for (; j<nodespacing * del; j += nodespacing)
+    {
       w1h = *(twiddles + 2 * j);
       w2h = *(twiddles + 2 * (j << 1) - 512);
       w3h = *(twiddles + 2 * j + 2 * (j << 1) - 1024);
@@ -448,9 +1265,10 @@
       w2l = *(twiddles + 2 * (j << 1) - 511);
       w3l = *(twiddles + 2 * j + 2 * (j << 1) - 1023);
 
-      for (k = in_loop_cnt; k != 0; k--) {
-        WORD32 tmp;
-        WORD32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+      for (k = in_loop_cnt; k != 0; k--)
+      {
+        FLOAT32 tmp;
+        FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
 
         data += (del << 1);
 
@@ -466,42 +1284,38 @@
         x3i = *(data + 1);
         data -= 3 * (del << 1);
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x1r, w1l),
-                                 ixheaacd_mult32_sat(x1i, w1h));
-        x1i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x1r, w1h), x1i, w1l);
+        tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
+        x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
         x1r = tmp;
 
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(x2r, w2h),
-                                 ixheaacd_mult32_sat(x2i, w2l));
-        x2i = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x2i, w2h),
-                                 ixheaacd_mult32_sat(x2r, w2l));
+        tmp = (ixheaacd_mult32X32float(x2r, w2h) + ixheaacd_mult32X32float(x2i, w2l));
+        x2i = -ixheaacd_mult32X32float(x2r, w2l) + ixheaacd_mult32X32float(x2i, w2h);
         x2r = tmp;
 
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(x3i, w3h),
-                                 ixheaacd_mult32_sat(x3r, w3l));
-        x3i = ixheaacd_mac32_sat(ixheaacd_mult32_sat(x3r, w3h), x3i, w3l);
+        tmp = (-ixheaacd_mult32X32float(x3r, w3l) + ixheaacd_mult32X32float(x3i, w3h));
+        x3i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x3r, w3h), x3i, w3l);
         x3r = tmp;
 
         x0r = (*data);
         x0i = (*(data + 1));
 
-        x0r = ixheaacd_add32_sat(x0r, x2r);
-        x0i = ixheaacd_add32_sat(x0i, x2i);
-        x2r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x2r, 1));
-        x2i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x2i, 1));
-        x1r = ixheaacd_add32_sat(x1r, x3r);
-        x1i = ixheaacd_sub32_sat(x1i, x3i);
-        x3r = ixheaacd_sub32_sat(x1r, ixheaacd_shl32_sat(x3r, 1));
-        x3i = ixheaacd_add32_sat(x1i, ixheaacd_shl32_sat(x3i, 1));
+        x0r = x0r + (x2r);
+        x0i = x0i + (x2i);
+        x2r = x0r - (x2r * 2);
+        x2i = x0i - (x2i * 2);
+        x1r = x1r + x3r;
+        x1i = x1i - x3i;
+        x3r = x1r - (x3r * 2);
+        x3i = x1i + (x3i * 2);
 
-        x0r = ixheaacd_add32_sat(x0r, x1r);
-        x0i = ixheaacd_add32_sat(x0i, x1i);
-        x1r = ixheaacd_sub32_sat(x0r, ixheaacd_shl32_sat(x1r, 1));
-        x1i = ixheaacd_sub32_sat(x0i, ixheaacd_shl32_sat(x1i, 1));
-        x2r = ixheaacd_add32_sat(x2r, x3i);
-        x2i = ixheaacd_sub32_sat(x2i, x3r);
-        x3i = ixheaacd_sub32_sat(x2r, ixheaacd_shl32_sat(x3i, 1));
-        x3r = ixheaacd_add32_sat(x2i, ixheaacd_shl32_sat(x3r, 1));
+        x0r = x0r + (x1r);
+        x0i = x0i + (x1i);
+        x1r = x0r - (x1r * 2);
+        x1i = x0i - (x1i * 2);
+        x2r = x2r + (x3i);
+        x2i = x2i - (x3r);
+        x3i = x2r - (x3i * 2);
+        x3r = x2i + (x3r * 2);
 
         *data = x0r;
         *(data + 1) = x0i;
@@ -526,10 +1340,70 @@
     del <<= 2;
     in_loop_cnt >>= 2;
   }
+  if (not_power_4)
+  {
+    const FLOAT32 *twiddles = ptr_w;
+    nodespacing <<= 1;
 
-  for (i = 0; i < 2 * nlength; i += 2) {
-    fin_re[i] = y[i];
-    fin_im[i] = y[i + 1];
+    for (j = del / 2; j != 0; j--)
+    {
+      FLOAT32 w1h = *twiddles;
+      FLOAT32 w1l = *(twiddles + 1);
+      FLOAT32 tmp;
+      twiddles += nodespacing * 2;
+
+      x0r = *ptr_y;
+      x0i = *(ptr_y + 1);
+      ptr_y += (del << 1);
+
+      x1r = *ptr_y;
+      x1i = *(ptr_y + 1);
+
+      tmp = (ixheaacd_mult32X32float(x1r, w1l) - ixheaacd_mult32X32float(x1i, w1h));
+      x1i = ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, w1h), x1i, w1l);
+      x1r = tmp;
+
+      *ptr_y = (x0r) - (x1r);
+      *(ptr_y + 1) = (x0i) - (x1i);
+      ptr_y -= (del << 1);
+
+      *ptr_y = (x0r) + (x1r);
+      *(ptr_y + 1) = (x0i) + (x1i);
+      ptr_y += 2;
+    }
+    twiddles = ptr_w;
+    for (j = del / 2; j != 0; j--)
+    {
+      FLOAT32 w1h = *twiddles;
+      FLOAT32 w1l = *(twiddles + 1);
+      FLOAT32 tmp;
+      twiddles += nodespacing * 2;
+
+      x0r = *ptr_y;
+      x0i = *(ptr_y + 1);
+      ptr_y += (del << 1);
+
+      x1r = *ptr_y;
+      x1i = *(ptr_y + 1);
+
+      tmp = (ixheaacd_mult32X32float(x1r, w1h) + ixheaacd_mult32X32float(x1i, w1l));
+      x1i = -ixheaacd_mult32X32float(x1r, w1l) + ixheaacd_mult32X32float(x1i, w1h);
+      x1r = tmp;
+
+      *ptr_y = (x0r) - (x1r);
+      *(ptr_y + 1) = (x0i) - (x1i);
+      ptr_y -= (del << 1);
+
+      *ptr_y = (x0r) + (x1r);
+      *(ptr_y + 1) = (x0i) + (x1i);
+      ptr_y += 2;
+    }
+  }
+
+  for (i = 0; i<nlength; i++)
+  {
+    xr[i] = y[2 * i];
+    xi[i] = y[2 * i + 1];
   }
 
   return;
@@ -1087,7 +1961,6 @@
         ptr_y += 2;
       }
     }
-
   }
 
   else {
@@ -1715,13 +2588,6 @@
 
     if (fft_mode < 0) {
       for (i = 0; i < nlength; i += 3) {
-        tmp = ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1r)),
-                                 ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1i)));
-        ptr_x[2 * i + 1] =
-            ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1i)),
-                               ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1r)));
-        ptr_x[2 * i] = tmp;
-
         w1r++;
         w1i++;
 
@@ -1749,13 +2615,6 @@
 
     else {
       for (i = 0; i < nlength; i += 3) {
-        tmp = ixheaacd_add32_sat(ixheaacd_mult32_sat(ptr_x[2 * i], (*w1r)),
-                                 ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1i)));
-        ptr_x[2 * i + 1] =
-            ixheaacd_sub32_sat(ixheaacd_mult32_sat(ptr_x[2 * i + 1], (*w1r)),
-                               ixheaacd_mult32_sat(ptr_x[2 * i], (*w1i)));
-        ptr_x[2 * i] = tmp;
-
         w1r++;
         w1i++;
 
@@ -1789,34 +2648,25 @@
     ptr_y = ptr_y + 6;
   }
 
+  ptr_y = y;
   for (i = 0; i < mpass; i++) {
-    xr[i] = y[6 * i];
-    xi[i] = y[6 * i + 1];
+    xr[i] = *ptr_y++;
+    xi[i] = *ptr_y++;
+    xr[mpass + i] = *ptr_y++;
+    xi[mpass + i] = *ptr_y++;
+    xr[2 * mpass + i] = *ptr_y++;
+    xi[2 * mpass + i] = *ptr_y++;
   }
 
-  for (i = 0; i < mpass; i++) {
-    xr[mpass + i] = y[6 * i + 2];
-    xi[mpass + i] = y[6 * i + 3];
-  }
-
-  for (i = 0; i < mpass; i++) {
-    xr[2 * mpass + i] = y[6 * i + 4];
-    xi[2 * mpass + i] = y[6 * i + 5];
-  }
   return;
 }
 
-WORD32 ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 nlength,
-                            WORD32 fft_mode, WORD32 *preshift) {
+VOID ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 nlength, WORD32 fft_mode,
+                          WORD32 *preshift) {
   if (nlength & (nlength - 1)) {
-    if ((nlength != 24) && (nlength != 48) && (nlength != 96) &&
-        (nlength != 192) && (nlength != 384)) {
-      printf("%d point FFT not supported", nlength);
-      return IA_FATAL_ERROR;
-    }
     ixheaacd_complex_fft_p3(data_r, data_i, nlength, fft_mode, preshift);
   } else
     (*ixheaacd_complex_fft_p2)(data_r, data_i, nlength, fft_mode, preshift);
 
-  return 0;
+  return;
 }
diff --git a/decoder/ixheaacd_fft_ifft_32x32.c b/decoder/ixheaacd_fft_ifft_32x32.c
new file mode 100644
index 0000000..33376b1
--- /dev/null
+++ b/decoder/ixheaacd_fft_ifft_32x32.c
@@ -0,0 +1,1587 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <stdlib.h>
+#include <math.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_fft_ifft_rom.h"
+#include "ixheaacd_dsp_fft32x32s.h"
+
+#define DIG_REV(i, m, j)                                    \
+  do {                                                      \
+    unsigned _ = (i);                                       \
+    _ = ((_ & 0x33333333) << 2) | ((_ & ~0x33333333) >> 2); \
+    _ = ((_ & 0x0F0F0F0F) << 4) | ((_ & ~0x0F0F0F0F) >> 4); \
+    _ = ((_ & 0x00FF00FF) << 8) | ((_ & ~0x00FF00FF) >> 8); \
+    (j) = _ >> (m);                                         \
+  } while (0)
+
+FLOAT64 ixheaacd_mult32X32float(FLOAT64 a, FLOAT64 b) {
+  FLOAT64 result;
+
+  result = a * b;
+
+  return result;
+}
+
+FLOAT64 ixheaacd_mac32X32float(FLOAT64 a, FLOAT64 b, FLOAT64 c) {
+  FLOAT64 result;
+
+  result = a + b * c;
+
+  return result;
+}
+
+VOID ixheaacd_hbe_apply_ifft_7(FLOAT32 *inp, FLOAT32 *op) {
+  FLOAT32 x0r, x1r, x2r, x3r, x4r, x5r, x6r, x7r, x8r;
+  FLOAT32 x0i, x1i, x2i, x3i, x4i, x5i, x6i, x7i, x8i;
+  FLOAT32 y0r, y1r, y2r, y3r, y4r, y5r, y6r, y7r, y8r;
+  FLOAT32 y0i, y1i, y2i, y3i, y4i, y5i, y6i, y7i, y8i;
+
+  x0r = inp[0];
+  x0i = inp[1];
+  x1r = inp[2] + inp[12];
+  x1i = inp[3] + inp[13];
+  x2r = inp[2] - inp[12];
+  x2i = inp[3] - inp[13];
+  x3r = inp[4] + inp[10];
+  x3i = inp[5] + inp[11];
+  x4r = inp[4] - inp[10];
+  x4i = inp[5] - inp[11];
+  x5r = inp[8] + inp[6];
+  x5i = inp[9] + inp[7];
+  x6r = inp[8] - inp[6];
+  x6i = inp[9] - inp[7];
+
+  y0r = x0r;
+  y0i = x0i;
+  y1r = x1r + x3r + x5r;
+  y1i = x1i + x3i + x5i;
+  y2r = x1r - x3r;
+  y2i = x1i - x3i;
+  y3r = x5r - x1r;
+  y3i = x5i - x1i;
+  y4r = x3r - x5r;
+  y4i = x3i - x5i;
+  y5r = x2r + x4r + x6r;
+  y5i = x2i + x4i + x6i;
+  y6r = x2r - x4r;
+  y6i = x2i - x4i;
+  y7r = x6r - x2r;
+  y7i = x6i - x2i;
+  y8r = x4r - x6r;
+  y8i = x4i - x6i;
+
+  x0r = y0r + y1r;
+  x0i = y0i + y1i;
+  x1r = y0r + C70 * y1r;
+  x1i = y0i + C70 * y1i;
+  x2r = C71 * y2r;
+  x2i = C71 * y2i;
+  x3r = C72 * y3r;
+  x3i = C72 * y3i;
+  x4r = C73 * y4r;
+  x4i = C73 * y4i;
+  x5r = C74 * y5i;
+  x5i = -C74 * y5r;
+  x6r = C75 * y6i;
+  x6i = -C75 * y6r;
+  x7r = C76 * y7i;
+  x7i = -C76 * y7r;
+  x8r = C77 * y8i;
+  x8i = -C77 * y8r;
+
+  y0r = x0r;
+  y0i = x0i;
+  y1r = x1r + x2r + x4r;
+  y1i = x1i + x2i + x4i;
+  y2r = x1r - x2r - x3r;
+  y2i = x1i - x2i - x3i;
+  y3r = x1r + x3r - x4r;
+  y3i = x1i + x3i - x4i;
+  y4r = x5r + x6r + x8r;
+  y4i = x5i + x6i + x8i;
+  y5r = x5r - x6r - x7r;
+  y5i = x5i - x6i - x7i;
+  y6r = x5r + x7r - x8r;
+  y6i = x5i + x7i - x8i;
+
+  x0r = y0r;
+  x0i = y0i;
+  x1r = y1r + y4r;
+  x1i = y1i + y4i;
+  x2r = y3r + y6r;
+  x2i = y3i + y6i;
+  x3r = y2r - y5r;
+  x3i = y2i - y5i;
+  x4r = y2r + y5r;
+  x4i = y2i + y5i;
+  x5r = y3r - y6r;
+  x5i = y3i - y6i;
+  x6r = y1r - y4r;
+  x6i = y1i - y4i;
+
+  op[0] = x0r;
+  op[1] = x0i;
+  op[2] = x1r;
+  op[3] = x1i;
+  op[4] = x2r;
+  op[5] = x2i;
+  op[6] = x3r;
+  op[7] = x3i;
+  op[8] = x4r;
+  op[9] = x4i;
+  op[10] = x5r;
+  op[11] = x5i;
+  op[12] = x6r;
+  op[13] = x6i;
+
+  return;
+}
+
+VOID ixheaacd_hbe_apply_fft_3(FLOAT32 *inp, FLOAT32 *op, WORD32 i_sign) {
+  FLOAT32 add_r, sub_r;
+  FLOAT32 add_i, sub_i;
+  FLOAT32 X01r, X01i, temp;
+
+  FLOAT32 p1, p2, p3, p4;
+
+  FLOAT64 sinmu;
+  sinmu = -0.866025403784439 * (FLOAT64)i_sign;
+
+  X01r = inp[0] + inp[2];
+  X01i = inp[1] + inp[3];
+
+  add_r = inp[2] + inp[4];
+  add_i = inp[3] + inp[5];
+
+  sub_r = inp[2] - inp[4];
+  sub_i = inp[3] - inp[5];
+
+  p1 = add_r / (FLOAT32)2.0;
+  p4 = add_i / (FLOAT32)2.0;
+  p2 = (FLOAT32)((FLOAT64)sub_i * sinmu);
+  p3 = (FLOAT32)((FLOAT64)sub_r * sinmu);
+
+  temp = inp[0] - p1;
+
+  op[0] = X01r + inp[4];
+  op[1] = X01i + inp[5];
+  op[2] = temp + p2;
+  op[3] = (inp[1] - p3) - p4;
+  op[4] = temp - p2;
+  op[5] = (inp[1] + p3) - p4;
+
+  return;
+}
+
+VOID ixheaacd_hbe_apply_tw_mult_ifft(FLOAT32 *inp, FLOAT32 *op, WORD32 dim1, WORD32 dim2,
+                                     const FLOAT32 *tw) {
+  FLOAT32 accu1, accu2;
+  WORD32 i, j;
+  WORD32 step_val = (dim2 - 1) << 1;
+  for (i = 0; i < (dim2); i++) {
+    op[0] = inp[0];
+    op[1] = inp[1];
+    op += 2;
+    inp += 2;
+  }
+
+  for (j = 0; j < (dim1 - 1); j++) {
+    op[0] = inp[0];
+    op[1] = inp[1];
+    inp += 2;
+    op += 2;
+    for (i = 0; i < (dim2 - 1); i++) {
+      CPLX_MPY_IFFT(accu1, accu2, inp[2 * i + 0], inp[2 * i + 1], tw[2 * i + 1], tw[2 * i]);
+      op[2 * i + 0] = accu1;
+      op[2 * i + 1] = accu2;
+    }
+    inp += step_val;
+    op += step_val;
+    tw += (dim2 - 1) * 2;
+  }
+}
+
+VOID ixheaacd_hbe_apply_tw_mult_fft(FLOAT32 *inp, FLOAT32 *op, WORD32 dim1, WORD32 dim2,
+                                    const FLOAT32 *tw) {
+  FLOAT32 accu1, accu2;
+  WORD32 i, j;
+  WORD32 step_val = (dim2 - 1) << 1;
+  for (i = 0; i < (dim2); i++) {
+    op[0] = inp[0];
+    op[1] = inp[1];
+    op += 2;
+    inp += 2;
+  }
+
+  for (j = 0; j < (dim1 - 1); j++) {
+    op[0] = inp[0];
+    op[1] = inp[1];
+    inp += 2;
+    op += 2;
+    for (i = 0; i < (dim2 - 1); i++) {
+      CPLX_MPY_FFT(accu1, accu2, inp[2 * i + 0], inp[2 * i + 1], tw[2 * i + 1], tw[2 * i]);
+      op[2 * i + 0] = accu1;
+      op[2 * i + 1] = accu2;
+    }
+    inp += step_val;
+    op += step_val;
+    tw += (dim2 - 1) * 2;
+  }
+}
+
+VOID ixheaacd_hbe_apply_cfftn(FLOAT32 re[], FLOAT32 *scratch, WORD32 n_pass, WORD32 i_sign) {
+  WORD32 i, j, k, n_stages, h2;
+  FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+  WORD32 del, nodespacing, in_loop_cnt;
+  WORD32 not_power_4;
+  WORD32 dig_rev_shift;
+  WORD32 mpass = n_pass;
+  WORD32 npoints = n_pass;
+  const FLOAT64 *ptr_w;
+  FLOAT32 *ptr_x = scratch;
+  FLOAT32 *y = scratch + (2 * n_pass);
+  FLOAT32 *ptr_y = y;
+
+  dig_rev_shift = ixheaacd_norm32(mpass) + 1 - 16;
+  n_stages = 30 - ixheaacd_norm32(mpass);
+  not_power_4 = n_stages & 1;
+
+  n_stages = n_stages >> 1;
+
+  ptr_w = ixheaacd_twid_tbl_fft_double;
+  ptr_x = re;
+
+  if (i_sign == -1) {
+    for (i = 0; i < npoints; i += 4) {
+      FLOAT32 *inp = ptr_x;
+      FLOAT32 tmk;
+
+      DIG_REV(i, dig_rev_shift, h2);
+      if (not_power_4) {
+        h2 += 1;
+        h2 &= ~1;
+      }
+      inp += (h2);
+
+      x0r = *inp;
+      x0i = *(inp + 1);
+      inp += (npoints >> 1);
+
+      x1r = *inp;
+      x1i = *(inp + 1);
+      inp += (npoints >> 1);
+
+      x2r = *inp;
+      x2i = *(inp + 1);
+      inp += (npoints >> 1);
+
+      x3r = *inp;
+      x3i = *(inp + 1);
+
+      x0r = x0r + x2r;
+      x0i = x0i + x2i;
+
+      tmk = x0r - x2r;
+      x2r = tmk - x2r;
+      tmk = x0i - x2i;
+      x2i = tmk - x2i;
+
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+
+      tmk = x1r - x3r;
+      x3r = tmk - x3r;
+      tmk = x1i - x3i;
+      x3i = tmk - x3i;
+
+      x0r = x0r + x1r;
+      x0i = x0i + x1i;
+
+      tmk = x0r - x1r;
+      x1r = tmk - x1r;
+      tmk = x0i - x1i;
+      x1i = tmk - x1i;
+
+      x2r = x2r + x3i;
+      x2i = x2i - x3r;
+
+      tmk = x2r - x3i;
+      x3i = tmk - x3i;
+      tmk = x2i + x3r;
+      x3r = tmk + x3r;
+
+      *ptr_y++ = x0r;
+      *ptr_y++ = x0i;
+      *ptr_y++ = x2r;
+      *ptr_y++ = x2i;
+      *ptr_y++ = x1r;
+      *ptr_y++ = x1i;
+      *ptr_y++ = x3i;
+      *ptr_y++ = x3r;
+    }
+    ptr_y -= 2 * npoints;
+    del = 4;
+    nodespacing = 64;
+    in_loop_cnt = npoints >> 4;
+    for (i = n_stages - 1; i > 0; i--) {
+      const FLOAT64 *twiddles = ptr_w;
+      FLOAT32 *data = ptr_y;
+      FLOAT64 W1, W2, W3, W4, W5, W6;
+      WORD32 sec_loop_cnt;
+
+      for (k = in_loop_cnt; k != 0; k--) {
+        x0r = (*data);
+        x0i = (*(data + 1));
+        data += (del << 1);
+
+        x1r = (*data);
+        x1i = (*(data + 1));
+        data += (del << 1);
+
+        x2r = (*data);
+        x2i = (*(data + 1));
+        data += (del << 1);
+
+        x3r = (*data);
+        x3i = (*(data + 1));
+        data -= 3 * (del << 1);
+
+        x0r = x0r + x2r;
+        x0i = x0i + x2i;
+        x2r = x0r - (x2r * 2);
+        x2i = x0i - (x2i * 2);
+        x1r = x1r + x3r;
+        x1i = x1i + x3i;
+        x3r = x1r - (x3r * 2);
+        x3i = x1i - (x3i * 2);
+
+        x0r = x0r + x1r;
+        x0i = x0i + x1i;
+        x1r = x0r - (x1r * 2);
+        x1i = x0i - (x1i * 2);
+        x2r = x2r + x3i;
+        x2i = x2i - x3r;
+        x3i = x2r - (x3i * 2);
+        x3r = x2i + (x3r * 2);
+
+        *data = x0r;
+        *(data + 1) = x0i;
+        data += (del << 1);
+
+        *data = x2r;
+        *(data + 1) = x2i;
+        data += (del << 1);
+
+        *data = x1r;
+        *(data + 1) = x1i;
+        data += (del << 1);
+
+        *data = x3i;
+        *(data + 1) = x3r;
+        data += (del << 1);
+      }
+      data = ptr_y + 2;
+
+      sec_loop_cnt = (nodespacing * del);
+      sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
+                     (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
+                     (sec_loop_cnt / 256);
+      j = nodespacing;
+
+      for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
+        W1 = *(twiddles + j);
+        W4 = *(twiddles + j + 257);
+        W2 = *(twiddles + (j << 1));
+        W5 = *(twiddles + (j << 1) + 257);
+        W3 = *(twiddles + j + (j << 1));
+        W6 = *(twiddles + j + (j << 1) + 257);
+
+        for (k = in_loop_cnt; k != 0; k--) {
+          FLOAT32 tmp;
+          FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+          data += (del << 1);
+
+          x1r = *data;
+          x1i = *(data + 1);
+          data += (del << 1);
+
+          x2r = *data;
+          x2i = *(data + 1);
+          data += (del << 1);
+
+          x3r = *data;
+          x3i = *(data + 1);
+          data -= 3 * (del << 1);
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
+                          ixheaacd_mult32X32float((FLOAT64)x1i, W4));
+          x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x1r, W4),
+                                                      (FLOAT64)x1i, W1);
+          x1r = tmp;
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x2r, W2) -
+                          ixheaacd_mult32X32float((FLOAT64)x2i, W5));
+          x2i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x2r, W5),
+                                                      (FLOAT64)x2i, W2);
+          x2r = tmp;
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x3r, W3) -
+                          ixheaacd_mult32X32float((FLOAT64)x3i, W6));
+          x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x3r, W6),
+                                                      (FLOAT64)x3i, W3);
+          x3r = tmp;
+
+          x0r = (*data);
+          x0i = (*(data + 1));
+
+          x0r = x0r + (x2r);
+          x0i = x0i + (x2i);
+          x2r = x0r - (x2r * 2);
+          x2i = x0i - (x2i * 2);
+          x1r = x1r + x3r;
+          x1i = x1i + x3i;
+          x3r = x1r - (x3r * 2);
+          x3i = x1i - (x3i * 2);
+
+          x0r = x0r + (x1r);
+          x0i = x0i + (x1i);
+          x1r = x0r - (x1r * 2);
+          x1i = x0i - (x1i * 2);
+          x2r = x2r + (x3i);
+          x2i = x2i - (x3r);
+          x3i = x2r - (x3i * 2);
+          x3r = x2i + (x3r * 2);
+
+          *data = x0r;
+          *(data + 1) = x0i;
+          data += (del << 1);
+
+          *data = x2r;
+          *(data + 1) = x2i;
+          data += (del << 1);
+
+          *data = x1r;
+          *(data + 1) = x1i;
+          data += (del << 1);
+
+          *data = x3i;
+          *(data + 1) = x3r;
+          data += (del << 1);
+        }
+        data -= 2 * npoints;
+        data += 2;
+      }
+      for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
+        W1 = *(twiddles + j);
+        W4 = *(twiddles + j + 257);
+        W2 = *(twiddles + (j << 1));
+        W5 = *(twiddles + (j << 1) + 257);
+        W3 = *(twiddles + j + (j << 1) - 256);
+        W6 = *(twiddles + j + (j << 1) + 1);
+
+        for (k = in_loop_cnt; k != 0; k--) {
+          FLOAT32 tmp;
+          FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+          data += (del << 1);
+
+          x1r = *data;
+          x1i = *(data + 1);
+          data += (del << 1);
+
+          x2r = *data;
+          x2i = *(data + 1);
+          data += (del << 1);
+
+          x3r = *data;
+          x3i = *(data + 1);
+          data -= 3 * (del << 1);
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
+                          ixheaacd_mult32X32float((FLOAT64)x1i, W4));
+          x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x1r, W4),
+                                                      (FLOAT64)x1i, W1);
+          x1r = tmp;
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x2r, W2) -
+                          ixheaacd_mult32X32float((FLOAT64)x2i, W5));
+          x2i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x2r, W5),
+                                                      (FLOAT64)x2i, W2);
+          x2r = tmp;
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x3r, W6) +
+                          ixheaacd_mult32X32float((FLOAT64)x3i, W3));
+          x3i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x3r, W3) +
+                          ixheaacd_mult32X32float((FLOAT64)x3i, W6));
+          x3r = tmp;
+
+          x0r = (*data);
+          x0i = (*(data + 1));
+
+          x0r = x0r + (x2r);
+          x0i = x0i + (x2i);
+          x2r = x0r - (x2r * 2);
+          x2i = x0i - (x2i * 2);
+          x1r = x1r + x3r;
+          x1i = x1i + x3i;
+          x3r = x1r - (x3r * 2);
+          x3i = x1i - (x3i * 2);
+
+          x0r = x0r + (x1r);
+          x0i = x0i + (x1i);
+          x1r = x0r - (x1r * 2);
+          x1i = x0i - (x1i * 2);
+          x2r = x2r + (x3i);
+          x2i = x2i - (x3r);
+          x3i = x2r - (x3i * 2);
+          x3r = x2i + (x3r * 2);
+
+          *data = x0r;
+          *(data + 1) = x0i;
+          data += (del << 1);
+
+          *data = x2r;
+          *(data + 1) = x2i;
+          data += (del << 1);
+
+          *data = x1r;
+          *(data + 1) = x1i;
+          data += (del << 1);
+
+          *data = x3i;
+          *(data + 1) = x3r;
+          data += (del << 1);
+        }
+        data -= 2 * npoints;
+        data += 2;
+      }
+      for (; j <= sec_loop_cnt * 2; j += nodespacing) {
+        W1 = *(twiddles + j);
+        W4 = *(twiddles + j + 257);
+        W2 = *(twiddles + (j << 1) - 256);
+        W5 = *(twiddles + (j << 1) + 1);
+        W3 = *(twiddles + j + (j << 1) - 256);
+        W6 = *(twiddles + j + (j << 1) + 1);
+
+        for (k = in_loop_cnt; k != 0; k--) {
+          FLOAT32 tmp;
+          FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+          data += (del << 1);
+
+          x1r = *data;
+          x1i = *(data + 1);
+          data += (del << 1);
+
+          x2r = *data;
+          x2i = *(data + 1);
+          data += (del << 1);
+
+          x3r = *data;
+          x3i = *(data + 1);
+          data -= 3 * (del << 1);
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
+                          ixheaacd_mult32X32float((FLOAT64)x1i, W4));
+          x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float(x1r, W4), x1i, W1);
+          x1r = tmp;
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x2r, W5) +
+                          ixheaacd_mult32X32float((FLOAT64)x2i, W2));
+          x2i = (FLOAT32)(-ixheaacd_mult32X32float(x2r, W2) + ixheaacd_mult32X32float(x2i, W5));
+          x2r = tmp;
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x3r, W6) +
+                          ixheaacd_mult32X32float((FLOAT64)x3i, W3));
+          x3i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x3r, W3) +
+                          ixheaacd_mult32X32float((FLOAT64)x3i, W6));
+          x3r = tmp;
+
+          x0r = (*data);
+          x0i = (*(data + 1));
+
+          x0r = x0r + (x2r);
+          x0i = x0i + (x2i);
+          x2r = x0r - (x2r * 2);
+          x2i = x0i - (x2i * 2);
+          x1r = x1r + x3r;
+          x1i = x1i + x3i;
+          x3r = x1r - (x3r * 2);
+          x3i = x1i - (x3i * 2);
+
+          x0r = x0r + (x1r);
+          x0i = x0i + (x1i);
+          x1r = x0r - (x1r * 2);
+          x1i = x0i - (x1i * 2);
+          x2r = x2r + (x3i);
+          x2i = x2i - (x3r);
+          x3i = x2r - (x3i * 2);
+          x3r = x2i + (x3r * 2);
+
+          *data = x0r;
+          *(data + 1) = x0i;
+          data += (del << 1);
+
+          *data = x2r;
+          *(data + 1) = x2i;
+          data += (del << 1);
+
+          *data = x1r;
+          *(data + 1) = x1i;
+          data += (del << 1);
+
+          *data = x3i;
+          *(data + 1) = x3r;
+          data += (del << 1);
+        }
+        data -= 2 * npoints;
+        data += 2;
+      }
+      for (; j < nodespacing * del; j += nodespacing) {
+        W1 = *(twiddles + j);
+        W4 = *(twiddles + j + 257);
+        W2 = *(twiddles + (j << 1) - 256);
+        W5 = *(twiddles + (j << 1) + 1);
+        W3 = *(twiddles + j + (j << 1) - 512);
+        W6 = *(twiddles + j + (j << 1) - 512 + 257);
+
+        for (k = in_loop_cnt; k != 0; k--) {
+          FLOAT32 tmp;
+          FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+          data += (del << 1);
+
+          x1r = *data;
+          x1i = *(data + 1);
+          data += (del << 1);
+
+          x2r = *data;
+          x2i = *(data + 1);
+          data += (del << 1);
+
+          x3r = *data;
+          x3i = *(data + 1);
+          data -= 3 * (del << 1);
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
+                          ixheaacd_mult32X32float((FLOAT64)x1i, W4));
+          x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x1r, W4),
+                                                      (FLOAT64)x1i, W1);
+          x1r = tmp;
+
+          tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x2r, W5) +
+                          ixheaacd_mult32X32float((FLOAT64)x2i, W2));
+          x2i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x2r, W2) +
+                          ixheaacd_mult32X32float((FLOAT64)x2i, W5));
+          x2r = tmp;
+
+          tmp = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x3r, W3) +
+                          ixheaacd_mult32X32float((FLOAT64)x3i, W6));
+          x3i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x3r, W6),
+                                                      (FLOAT64)x3i, W3);
+          x3r = tmp;
+
+          x0r = (*data);
+          x0i = (*(data + 1));
+
+          x0r = x0r + (x2r);
+          x0i = x0i + (x2i);
+          x2r = x0r - (x2r * 2);
+          x2i = x0i - (x2i * 2);
+          x1r = x1r + x3r;
+          x1i = x1i - x3i;
+          x3r = x1r - (x3r * 2);
+          x3i = x1i + (x3i * 2);
+
+          x0r = x0r + (x1r);
+          x0i = x0i + (x1i);
+          x1r = x0r - (x1r * 2);
+          x1i = x0i - (x1i * 2);
+          x2r = x2r + (x3i);
+          x2i = x2i - (x3r);
+          x3i = x2r - (x3i * 2);
+          x3r = x2i + (x3r * 2);
+
+          *data = x0r;
+          *(data + 1) = x0i;
+          data += (del << 1);
+
+          *data = x2r;
+          *(data + 1) = x2i;
+          data += (del << 1);
+
+          *data = x1r;
+          *(data + 1) = x1i;
+          data += (del << 1);
+
+          *data = x3i;
+          *(data + 1) = x3r;
+          data += (del << 1);
+        }
+        data -= 2 * npoints;
+        data += 2;
+      }
+      nodespacing >>= 2;
+      del <<= 2;
+      in_loop_cnt >>= 2;
+    }
+    if (not_power_4) {
+      const FLOAT64 *twiddles = ptr_w;
+      nodespacing <<= 1;
+
+      for (j = del / 2; j != 0; j--) {
+        FLOAT64 W1 = *twiddles;
+        FLOAT64 W4 = *(twiddles + 257);
+        FLOAT32 tmp;
+        twiddles += nodespacing;
+
+        x0r = *ptr_y;
+        x0i = *(ptr_y + 1);
+        ptr_y += (del << 1);
+
+        x1r = *ptr_y;
+        x1i = *(ptr_y + 1);
+
+        tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W1) -
+                        ixheaacd_mult32X32float((FLOAT64)x1i, W4));
+        x1i = (FLOAT32)ixheaacd_mac32X32float(ixheaacd_mult32X32float((FLOAT64)x1r, W4),
+                                                    (FLOAT64)x1i, W1);
+        x1r = tmp;
+
+        *ptr_y = (x0r) - (x1r);
+        *(ptr_y + 1) = (x0i) - (x1i);
+        ptr_y -= (del << 1);
+
+        *ptr_y = (x0r) + (x1r);
+        *(ptr_y + 1) = (x0i) + (x1i);
+        ptr_y += 2;
+      }
+      twiddles = ptr_w;
+      for (j = del / 2; j != 0; j--) {
+        FLOAT64 W1 = *twiddles;
+        FLOAT64 W4 = *(twiddles + 257);
+        FLOAT32 tmp;
+        twiddles += nodespacing;
+
+        x0r = *ptr_y;
+        x0i = *(ptr_y + 1);
+        ptr_y += (del << 1);
+
+        x1r = *ptr_y;
+        x1i = *(ptr_y + 1);
+
+        tmp = (FLOAT32)(ixheaacd_mult32X32float((FLOAT64)x1r, W4) +
+                        ixheaacd_mult32X32float((FLOAT64)x1i, W1));
+        x1i = (FLOAT32)(-ixheaacd_mult32X32float((FLOAT64)x1r, W1) +
+                        ixheaacd_mult32X32float((FLOAT64)x1i, W4));
+        x1r = tmp;
+
+        *ptr_y = (x0r) - (x1r);
+        *(ptr_y + 1) = (x0i) - (x1i);
+        ptr_y -= (del << 1);
+
+        *ptr_y = (x0r) + (x1r);
+        *(ptr_y + 1) = (x0i) + (x1i);
+        ptr_y += 2;
+      }
+    }
+  } else {
+    for (i = 0; i < npoints; i += 4) {
+      FLOAT32 *inp = ptr_x;
+
+      DIG_REV(i, dig_rev_shift, h2);
+      if (not_power_4) {
+        h2 += 1;
+        h2 &= ~1;
+      }
+      inp += (h2);
+
+      x0r = *inp;
+      x0i = *(inp + 1);
+      inp += (npoints >> 1);
+
+      x1r = *inp;
+      x1i = *(inp + 1);
+      inp += (npoints >> 1);
+
+      x2r = *inp;
+      x2i = *(inp + 1);
+      inp += (npoints >> 1);
+
+      x3r = *inp;
+      x3i = *(inp + 1);
+
+      x0r = x0r + x2r;
+      x0i = x0i + x2i;
+      x2r = x0r - (x2r * 2);
+      x2i = x0i - (x2i * 2);
+      x1r = x1r + x3r;
+      x1i = x1i + x3i;
+      x3r = x1r - (x3r * 2);
+      x3i = x1i - (x3i * 2);
+
+      x0r = x0r + x1r;
+      x0i = x0i + x1i;
+      x1r = x0r - (x1r * 2);
+      x1i = x0i - (x1i * 2);
+      x2r = x2r - x3i;
+      x2i = x2i + x3r;
+      x3i = x2r + (x3i * 2);
+      x3r = x2i - (x3r * 2);
+
+      *ptr_y++ = x0r;
+      *ptr_y++ = x0i;
+      *ptr_y++ = x2r;
+      *ptr_y++ = x2i;
+      *ptr_y++ = x1r;
+      *ptr_y++ = x1i;
+      *ptr_y++ = x3i;
+      *ptr_y++ = x3r;
+    }
+    ptr_y -= 2 * npoints;
+    del = 4;
+    nodespacing = 64;
+    in_loop_cnt = npoints >> 4;
+    for (i = n_stages - 1; i > 0; i--) {
+      const FLOAT64 *twiddles = ptr_w;
+      FLOAT32 *data = ptr_y;
+      FLOAT64 W1, W2, W3, W4, W5, W6;
+      WORD32 sec_loop_cnt;
+
+      for (k = in_loop_cnt; k != 0; k--) {
+        x0r = (*data);
+        x0i = (*(data + 1));
+        data += (del << 1);
+
+        x1r = (*data);
+        x1i = (*(data + 1));
+        data += (del << 1);
+
+        x2r = (*data);
+        x2i = (*(data + 1));
+        data += (del << 1);
+
+        x3r = (*data);
+        x3i = (*(data + 1));
+        data -= 3 * (del << 1);
+
+        x0r = x0r + x2r;
+        x0i = x0i + x2i;
+        x2r = x0r - (x2r * 2);
+        x2i = x0i - (x2i * 2);
+        x1r = x1r + x3r;
+        x1i = x1i + x3i;
+        x3r = x1r - (x3r * 2);
+        x3i = x1i - (x3i * 2);
+
+        x0r = x0r + x1r;
+        x0i = x0i + x1i;
+        x1r = x0r - (x1r * 2);
+        x1i = x0i - (x1i * 2);
+        x2r = x2r - x3i;
+        x2i = x2i + x3r;
+        x3i = x2r + (x3i * 2);
+        x3r = x2i - (x3r * 2);
+
+        *data = x0r;
+        *(data + 1) = x0i;
+        data += (del << 1);
+
+        *data = x2r;
+        *(data + 1) = x2i;
+        data += (del << 1);
+
+        *data = x1r;
+        *(data + 1) = x1i;
+        data += (del << 1);
+
+        *data = x3i;
+        *(data + 1) = x3r;
+        data += (del << 1);
+      }
+      data = ptr_y + 2;
+
+      sec_loop_cnt = (nodespacing * del);
+      sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
+                     (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
+                     (sec_loop_cnt / 256);
+      j = nodespacing;
+
+      for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
+        W1 = *(twiddles + j);
+        W4 = *(twiddles + j + 257);
+        W2 = *(twiddles + (j << 1));
+        W5 = *(twiddles + (j << 1) + 257);
+        W3 = *(twiddles + j + (j << 1));
+        W6 = *(twiddles + j + (j << 1) + 257);
+
+        for (k = in_loop_cnt; k != 0; k--) {
+          FLOAT32 tmp;
+          FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+          data += (del << 1);
+
+          x1r = *data;
+          x1i = *(data + 1);
+          data += (del << 1);
+
+          x2r = *data;
+          x2i = *(data + 1);
+          data += (del << 1);
+
+          x3r = *data;
+          x3i = *(data + 1);
+          data -= 3 * (del << 1);
+
+          tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
+          x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
+          x1r = tmp;
+
+          tmp = (FLOAT32)(((FLOAT64)x2r * W2) + ((FLOAT64)x2i * W5));
+          x2i = (FLOAT32)(-((FLOAT64)x2r * W5) + (FLOAT64)x2i * W2);
+          x2r = tmp;
+
+          tmp = (FLOAT32)(((FLOAT64)x3r * W3) + ((FLOAT64)x3i * W6));
+          x3i = (FLOAT32)(-((FLOAT64)x3r * W6) + (FLOAT64)x3i * W3);
+          x3r = tmp;
+
+          x0r = (*data);
+          x0i = (*(data + 1));
+
+          x0r = x0r + (x2r);
+          x0i = x0i + (x2i);
+          x2r = x0r - (x2r * 2);
+          x2i = x0i - (x2i * 2);
+          x1r = x1r + x3r;
+          x1i = x1i + x3i;
+          x3r = x1r - (x3r * 2);
+          x3i = x1i - (x3i * 2);
+
+          x0r = x0r + (x1r);
+          x0i = x0i + (x1i);
+          x1r = x0r - (x1r * 2);
+          x1i = x0i - (x1i * 2);
+          x2r = x2r - (x3i);
+          x2i = x2i + (x3r);
+          x3i = x2r + (x3i * 2);
+          x3r = x2i - (x3r * 2);
+
+          *data = x0r;
+          *(data + 1) = x0i;
+          data += (del << 1);
+
+          *data = x2r;
+          *(data + 1) = x2i;
+          data += (del << 1);
+
+          *data = x1r;
+          *(data + 1) = x1i;
+          data += (del << 1);
+
+          *data = x3i;
+          *(data + 1) = x3r;
+          data += (del << 1);
+        }
+        data -= 2 * npoints;
+        data += 2;
+      }
+      for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
+        W1 = *(twiddles + j);
+        W4 = *(twiddles + j + 257);
+        W2 = *(twiddles + (j << 1));
+        W5 = *(twiddles + (j << 1) + 257);
+        W3 = *(twiddles + j + (j << 1) - 256);
+        W6 = *(twiddles + j + (j << 1) + 1);
+
+        for (k = in_loop_cnt; k != 0; k--) {
+          FLOAT32 tmp;
+          FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+          data += (del << 1);
+
+          x1r = *data;
+          x1i = *(data + 1);
+          data += (del << 1);
+
+          x2r = *data;
+          x2i = *(data + 1);
+          data += (del << 1);
+
+          x3r = *data;
+          x3i = *(data + 1);
+          data -= 3 * (del << 1);
+
+          tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
+          x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
+          x1r = tmp;
+
+          tmp = (FLOAT32)(((FLOAT64)x2r * W2) + ((FLOAT64)x2i * W5));
+          x2i = (FLOAT32)(-((FLOAT64)x2r * W5) + (FLOAT64)x2i * W2);
+          x2r = tmp;
+
+          tmp = (FLOAT32)(((FLOAT64)x3r * W6) - ((FLOAT64)x3i * W3));
+          x3i = (FLOAT32)(((FLOAT64)x3r * W3) + ((FLOAT64)x3i * W6));
+          x3r = tmp;
+
+          x0r = (*data);
+          x0i = (*(data + 1));
+
+          x0r = x0r + (x2r);
+          x0i = x0i + (x2i);
+          x2r = x0r - (x2r * 2);
+          x2i = x0i - (x2i * 2);
+          x1r = x1r + x3r;
+          x1i = x1i + x3i;
+          x3r = x1r - (x3r * 2);
+          x3i = x1i - (x3i * 2);
+
+          x0r = x0r + (x1r);
+          x0i = x0i + (x1i);
+          x1r = x0r - (x1r * 2);
+          x1i = x0i - (x1i * 2);
+          x2r = x2r - (x3i);
+          x2i = x2i + (x3r);
+          x3i = x2r + (x3i * 2);
+          x3r = x2i - (x3r * 2);
+
+          *data = x0r;
+          *(data + 1) = x0i;
+          data += (del << 1);
+
+          *data = x2r;
+          *(data + 1) = x2i;
+          data += (del << 1);
+
+          *data = x1r;
+          *(data + 1) = x1i;
+          data += (del << 1);
+
+          *data = x3i;
+          *(data + 1) = x3r;
+          data += (del << 1);
+        }
+        data -= 2 * npoints;
+        data += 2;
+      }
+      for (; j <= sec_loop_cnt * 2; j += nodespacing) {
+        W1 = *(twiddles + j);
+        W4 = *(twiddles + j + 257);
+        W2 = *(twiddles + (j << 1) - 256);
+        W5 = *(twiddles + (j << 1) + 1);
+        W3 = *(twiddles + j + (j << 1) - 256);
+        W6 = *(twiddles + j + (j << 1) + 1);
+
+        for (k = in_loop_cnt; k != 0; k--) {
+          FLOAT32 tmp;
+          FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+          data += (del << 1);
+
+          x1r = *data;
+          x1i = *(data + 1);
+          data += (del << 1);
+
+          x2r = *data;
+          x2i = *(data + 1);
+          data += (del << 1);
+
+          x3r = *data;
+          x3i = *(data + 1);
+          data -= 3 * (del << 1);
+
+          tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
+          x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
+          x1r = tmp;
+
+          tmp = (FLOAT32)(((FLOAT64)x2r * W5) - ((FLOAT64)x2i * W2));
+          x2i = (FLOAT32)(((FLOAT64)x2r * W2) + ((FLOAT64)x2i * W5));
+          x2r = tmp;
+
+          tmp = (FLOAT32)(((FLOAT64)x3r * W6) - ((FLOAT64)x3i * W3));
+          x3i = (FLOAT32)(((FLOAT64)x3r * W3) + ((FLOAT64)x3i * W6));
+          x3r = tmp;
+
+          x0r = (*data);
+          x0i = (*(data + 1));
+
+          x0r = x0r + (x2r);
+          x0i = x0i + (x2i);
+          x2r = x0r - (x2r * 2);
+          x2i = x0i - (x2i * 2);
+          x1r = x1r + x3r;
+          x1i = x1i + x3i;
+          x3r = x1r - (x3r * 2);
+          x3i = x1i - (x3i * 2);
+
+          x0r = x0r + (x1r);
+          x0i = x0i + (x1i);
+          x1r = x0r - (x1r * 2);
+          x1i = x0i - (x1i * 2);
+          x2r = x2r - (x3i);
+          x2i = x2i + (x3r);
+          x3i = x2r + (x3i * 2);
+          x3r = x2i - (x3r * 2);
+
+          *data = x0r;
+          *(data + 1) = x0i;
+          data += (del << 1);
+
+          *data = x2r;
+          *(data + 1) = x2i;
+          data += (del << 1);
+
+          *data = x1r;
+          *(data + 1) = x1i;
+          data += (del << 1);
+
+          *data = x3i;
+          *(data + 1) = x3r;
+          data += (del << 1);
+        }
+        data -= 2 * npoints;
+        data += 2;
+      }
+      for (; j < nodespacing * del; j += nodespacing) {
+        W1 = *(twiddles + j);
+        W4 = *(twiddles + j + 257);
+        W2 = *(twiddles + (j << 1) - 256);
+        W5 = *(twiddles + (j << 1) + 1);
+        W3 = *(twiddles + j + (j << 1) - 512);
+        W6 = *(twiddles + j + (j << 1) - 512 + 257);
+
+        for (k = in_loop_cnt; k != 0; k--) {
+          FLOAT32 tmp;
+          FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
+
+          data += (del << 1);
+
+          x1r = *data;
+          x1i = *(data + 1);
+          data += (del << 1);
+
+          x2r = *data;
+          x2i = *(data + 1);
+          data += (del << 1);
+
+          x3r = *data;
+          x3i = *(data + 1);
+          data -= 3 * (del << 1);
+
+          tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
+          x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
+          x1r = tmp;
+
+          tmp = (FLOAT32)(((FLOAT64)x2r * W5) - ((FLOAT64)x2i * W2));
+          x2i = (FLOAT32)(((FLOAT64)x2r * W2) + ((FLOAT64)x2i * W5));
+          x2r = tmp;
+
+          tmp = (FLOAT32)(-((FLOAT64)x3r * W3) - ((FLOAT64)x3i * W6));
+          x3i = (FLOAT32)(-((FLOAT64)x3r * W6) + (FLOAT64)x3i * W3);
+          x3r = tmp;
+
+          x0r = (*data);
+          x0i = (*(data + 1));
+
+          x0r = x0r + (x2r);
+          x0i = x0i + (x2i);
+          x2r = x0r - (x2r * 2);
+          x2i = x0i - (x2i * 2);
+          x1r = x1r + x3r;
+          x1i = x1i - x3i;
+          x3r = x1r - (x3r * 2);
+          x3i = x1i + (x3i * 2);
+
+          x0r = x0r + (x1r);
+          x0i = x0i + (x1i);
+          x1r = x0r - (x1r * 2);
+          x1i = x0i - (x1i * 2);
+          x2r = x2r - (x3i);
+          x2i = x2i + (x3r);
+          x3i = x2r + (x3i * 2);
+          x3r = x2i - (x3r * 2);
+
+          *data = x0r;
+          *(data + 1) = x0i;
+          data += (del << 1);
+
+          *data = x2r;
+          *(data + 1) = x2i;
+          data += (del << 1);
+
+          *data = x1r;
+          *(data + 1) = x1i;
+          data += (del << 1);
+
+          *data = x3i;
+          *(data + 1) = x3r;
+          data += (del << 1);
+        }
+        data -= 2 * npoints;
+        data += 2;
+      }
+      nodespacing >>= 2;
+      del <<= 2;
+      in_loop_cnt >>= 2;
+    }
+
+    if (not_power_4) {
+      const FLOAT64 *twiddles = ptr_w;
+      nodespacing <<= 1;
+
+      for (j = del / 2; j != 0; j--) {
+        FLOAT64 W1 = *twiddles;
+        FLOAT64 W4 = *(twiddles + 257);
+        FLOAT32 tmp;
+        twiddles += nodespacing;
+
+        x0r = *ptr_y;
+        x0i = *(ptr_y + 1);
+        ptr_y += (del << 1);
+
+        x1r = *ptr_y;
+        x1i = *(ptr_y + 1);
+
+        tmp = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
+        x1i = (FLOAT32)(-((FLOAT64)x1r * W4) + (FLOAT64)x1i * W1);
+        x1r = tmp;
+
+        *ptr_y = (x0r) - (x1r);
+        *(ptr_y + 1) = (x0i) - (x1i);
+        ptr_y -= (del << 1);
+
+        *ptr_y = (x0r) + (x1r);
+        *(ptr_y + 1) = (x0i) + (x1i);
+        ptr_y += 2;
+      }
+      twiddles = ptr_w;
+      for (j = del / 2; j != 0; j--) {
+        FLOAT64 W1 = *twiddles;
+        FLOAT64 W4 = *(twiddles + 257);
+        FLOAT32 tmp;
+        twiddles += nodespacing;
+
+        x0r = *ptr_y;
+        x0i = *(ptr_y + 1);
+        ptr_y += (del << 1);
+
+        x1r = *ptr_y;
+        x1i = *(ptr_y + 1);
+
+        tmp = (FLOAT32)(((FLOAT64)x1r * W4) - ((FLOAT64)x1i * W1));
+        x1i = (FLOAT32)(((FLOAT64)x1r * W1) + ((FLOAT64)x1i * W4));
+        x1r = tmp;
+
+        *ptr_y = (x0r) - (x1r);
+        *(ptr_y + 1) = (x0i) - (x1i);
+        ptr_y -= (del << 1);
+
+        *ptr_y = (x0r) + (x1r);
+        *(ptr_y + 1) = (x0i) + (x1i);
+        ptr_y += 2;
+      }
+    }
+  }
+
+  for (i = 0; i < n_pass; i++) {
+    re[2 * i + 0] = y[2 * i + 0];
+    re[2 * i + 1] = y[2 * i + 1];
+  }
+}
+
+VOID ixheaacd_hbe_apply_cfftn_gen(FLOAT32 re[], FLOAT32 *scratch, WORD32 n_pass,
+                                  WORD32 i_sign) {
+  WORD32 i, j;
+  WORD32 m_points = n_pass;
+  FLOAT32 *x, *y, *re3;
+  FLOAT32 *ptr_x, *ptr_y;
+  ptr_x = x = scratch;
+  scratch += 2 * m_points;
+  ptr_y = y = scratch;
+  scratch += 4 * m_points;
+  re3 = scratch;
+  scratch += 2 * m_points;
+  WORD32 cnfac;
+  WORD32 mpass = n_pass;
+
+  cnfac = 0;
+  while (mpass % 3 == 0) {
+    mpass /= 3;
+    cnfac++;
+  }
+
+  for (i = 0; i < 3 * cnfac; i++) {
+    for (j = 0; j < mpass; j++) {
+      re3[2 * j + 0] = re[6 * j + 2 * i + 0];
+      re3[2 * j + 1] = re[6 * j + 2 * i + 1];
+    }
+
+    ixheaacd_hbe_apply_cfftn(re3, scratch, mpass, i_sign);
+
+    for (j = 0; j < mpass; j++) {
+      re[6 * j + 2 * i + 0] = re3[2 * j + 0];
+      re[6 * j + 2 * i + 1] = re3[2 * j + 1];
+    }
+  }
+
+  {
+    FLOAT64 *w1r, *w1i;
+    FLOAT32 tmp;
+    w1r = (FLOAT64 *)ixheaacd_twid_tbl_fft_ntwt3r;
+    w1i = (FLOAT64 *)ixheaacd_twid_tbl_fft_ntwt3i;
+
+    if (i_sign < 0) {
+
+      for (i = 0; i < n_pass; i += 3) {
+        tmp = (FLOAT32)((FLOAT64)re[2 * i + 0] * (*w1r) - (FLOAT64)re[2 * i + 1] * (*w1i));
+        re[2 * i + 1] =
+            (FLOAT32)((FLOAT64)re[2 * i + 0] * (*w1i) + (FLOAT64)re[2 * i + 1] * (*w1r));
+        re[2 * i + 0] = tmp;
+
+        w1r++;
+        w1i++;
+
+        tmp = (FLOAT32)((FLOAT64)re[2 * i + 2] * (*w1r) - (FLOAT64)re[2 * i + 3] * (*w1i));
+        re[2 * i + 3] =
+            (FLOAT32)((FLOAT64)re[2 * i + 2] * (*w1i) + (FLOAT64)re[2 * i + 3] * (*w1r));
+        re[2 * i + 2] = tmp;
+
+        w1r++;
+        w1i++;
+
+        tmp = (FLOAT32)((FLOAT64)re[2 * i + 4] * (*w1r) - (FLOAT64)re[2 * i + 5] * (*w1i));
+        re[2 * i + 5] =
+            (FLOAT32)((FLOAT64)re[2 * i + 4] * (*w1i) + (FLOAT64)re[2 * i + 5] * (*w1r));
+        re[2 * i + 4] = tmp;
+
+        w1r += 3 * (128 / mpass - 1) + 1;
+        w1i += 3 * (128 / mpass - 1) + 1;
+      }
+    } else {
+      for (i = 0; i < n_pass; i += 3) {
+        tmp = (FLOAT32)((FLOAT64)re[2 * i + 0] * (*w1r) + (FLOAT64)re[2 * i + 1] * (*w1i));
+        re[2 * i + 1] =
+            (FLOAT32)(-(FLOAT64)re[2 * i + 0] * (*w1i) + (FLOAT64)re[2 * i + 1] * (*w1r));
+        re[2 * i + 0] = tmp;
+
+        w1r++;
+        w1i++;
+
+        tmp = (FLOAT32)((FLOAT64)re[2 * i + 2] * (*w1r) + (FLOAT64)re[2 * i + 3] * (*w1i));
+        re[2 * i + 3] =
+            (FLOAT32)(-(FLOAT64)re[2 * i + 2] * (*w1i) + (FLOAT64)re[2 * i + 3] * (*w1r));
+        re[2 * i + 2] = tmp;
+
+        w1r++;
+        w1i++;
+
+        tmp = (FLOAT32)((FLOAT64)re[2 * i + 4] * (*w1r) + (FLOAT64)re[2 * i + 5] * (*w1i));
+        re[2 * i + 5] =
+            (FLOAT32)(-(FLOAT64)re[2 * i + 4] * (*w1i) + (FLOAT64)re[2 * i + 5] * (*w1r));
+        re[2 * i + 4] = tmp;
+
+        w1r += 3 * (128 / mpass - 1) + 1;
+        w1i += 3 * (128 / mpass - 1) + 1;
+      }
+    }
+  }
+
+  for (i = 0; i < n_pass; i++) {
+    ptr_x[2 * i + 0] = re[2 * i + 0];
+    ptr_x[2 * i + 1] = re[2 * i + 1];
+  }
+  for (i = 0; i < mpass; i++) {
+    ixheaacd_hbe_apply_fft_3(ptr_x, ptr_y, i_sign);
+
+    ptr_x = ptr_x + 6;
+    ptr_y = ptr_y + 6;
+  }
+
+  for (i = 0; i < mpass; i++) {
+    re[2 * i + 0] = y[6 * i + 0];
+    re[2 * i + 1] = y[6 * i + 1];
+  }
+
+  for (i = 0; i < mpass; i++) {
+    re[2 * mpass + 2 * i + 0] = y[6 * i + 2];
+    re[2 * mpass + 2 * i + 1] = y[6 * i + 3];
+  }
+
+  for (i = 0; i < mpass; i++) {
+    re[4 * mpass + 2 * i + 0] = y[6 * i + 4];
+    re[4 * mpass + 2 * i + 1] = y[6 * i + 5];
+  }
+}
+
+VOID ixheaacd_hbe_apply_fft_288(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 i_sign) {
+  FLOAT32 *op = scratch;
+  WORD32 mpoints = len / 96;
+  WORD32 fpoints = len / 3;
+  WORD32 ii, jj;
+  scratch += 2 * len;
+
+  for (ii = 0; ii < mpoints; ii++) {
+    for (jj = 0; jj < fpoints; jj++) {
+      op[2 * jj + 0] = inp[2 * mpoints * jj + 2 * ii];
+      op[2 * jj + 1] = inp[2 * mpoints * jj + 2 * ii + 1];
+    }
+
+    if (fpoints & (fpoints - 1))
+      ixheaacd_hbe_apply_cfftn_gen(op, scratch, fpoints, i_sign);
+    else
+      ixheaacd_hbe_apply_cfftn(op, scratch, fpoints, i_sign);
+
+    for (jj = 0; jj < fpoints; jj++) {
+      inp[mpoints * 2 * jj + 2 * ii + 0] = op[2 * jj + 0];
+      inp[mpoints * 2 * jj + 2 * ii + 1] = op[2 * jj + 1];
+    }
+  }
+
+  ixheaacd_hbe_apply_tw_mult_fft(inp, op, fpoints, mpoints, ixheaacd_twid_tbl_fft_288);
+
+  for (ii = 0; ii < fpoints; ii++) {
+    ixheaacd_hbe_apply_fft_3(op, scratch, i_sign);
+    op = op + (mpoints * 2);
+    scratch = scratch + (mpoints * 2);
+  }
+
+  scratch -= fpoints * mpoints * 2;
+
+  for (jj = 0; jj < fpoints; jj++) {
+    inp[2 * jj + 0] = scratch[6 * jj];
+    inp[2 * jj + 1] = scratch[6 * jj + 1];
+  }
+  for (jj = 0; jj < fpoints; jj++) {
+    inp[2 * fpoints + 2 * jj + 0] = scratch[6 * jj + 2];
+    inp[2 * fpoints + 2 * jj + 1] = scratch[6 * jj + 3];
+  }
+  for (jj = 0; jj < fpoints; jj++) {
+    inp[4 * fpoints + 2 * jj + 0] = scratch[6 * jj + 4];
+    inp[4 * fpoints + 2 * jj + 1] = scratch[6 * jj + 5];
+  }
+}
+
+VOID ixheaacd_hbe_apply_ifft_224(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 i_sign) {
+  WORD32 mpoints = len / 32;
+  WORD32 fpoints = len / 7;
+  WORD32 ii, jj;
+  FLOAT32 *op = scratch;
+  scratch += 2 * len;
+
+  for (ii = 0; ii < mpoints; ii++) {
+    for (jj = 0; jj < fpoints; jj++) {
+      op[2 * jj + 0] = inp[2 * mpoints * jj + 2 * ii];
+      op[2 * jj + 1] = inp[2 * mpoints * jj + 2 * ii + 1];
+    }
+
+    if (fpoints & (fpoints - 1))
+      ixheaacd_hbe_apply_cfftn_gen(op, scratch, fpoints, i_sign);
+    else
+      ixheaacd_hbe_apply_cfftn(op, scratch, fpoints, i_sign);
+
+    for (jj = 0; jj < fpoints; jj++) {
+      inp[mpoints * 2 * jj + 2 * ii + 0] = op[2 * jj + 0];
+      inp[mpoints * 2 * jj + 2 * ii + 1] = op[2 * jj + 1];
+    }
+  }
+
+  ixheaacd_hbe_apply_tw_mult_ifft(inp, op, fpoints, mpoints, ixheaacd_twid_tbl_fft_224);
+
+  for (ii = 0; ii < fpoints; ii++) {
+    ixheaacd_hbe_apply_ifft_7(op, scratch);
+    scratch += (mpoints * 2);
+    op += (mpoints * 2);
+  }
+
+  scratch -= fpoints * mpoints * 2;
+
+  for (jj = 0; jj < fpoints; jj++) {
+    for (ii = 0; ii < mpoints; ii++) {
+      inp[fpoints * ii * 2 + 2 * jj + 0] = scratch[mpoints * jj * 2 + 2 * ii + 0];
+      inp[fpoints * ii * 2 + 2 * jj + 1] = scratch[mpoints * jj * 2 + 2 * ii + 1];
+    }
+  }
+}
+
+VOID ixheaacd_hbe_apply_ifft_336(FLOAT32 *inp, FLOAT32 *ptr_scratch, WORD32 len,
+                                 WORD32 i_sign) {
+  WORD32 i, j;
+  WORD32 m_points = len / 7;
+  WORD32 n_points = len / 48;
+  FLOAT32 *ptr_real, *ptr_imag, *p_real_1, *p_scratch;
+  ptr_real = ptr_scratch;
+  ptr_scratch += 2 * len;
+  ptr_imag = ptr_scratch;
+  ptr_scratch += len;
+  p_scratch = ptr_scratch;
+  ptr_scratch += len;
+  p_real_1 = ptr_scratch;
+  ptr_scratch += len;
+
+  for (i = 0; i < len; i++) {
+    ptr_real[i] = inp[2 * i + 0];
+    ptr_imag[i] = inp[2 * i + 1];
+  }
+
+  for (i = 0; i < m_points; i++) {
+    for (j = 0; j < n_points; j++) {
+      p_real_1[2 * j + 0] = inp[m_points * 2 * j + 2 * i + 0];
+      p_real_1[2 * j + 1] = inp[m_points * 2 * j + 2 * i + 1];
+    }
+
+    ixheaacd_hbe_apply_ifft_7(p_real_1, ptr_scratch);
+
+    for (j = 0; j < n_points; j++) {
+      inp[m_points * 2 * j + 2 * i + 0] = ptr_scratch[2 * j + 0];
+      inp[m_points * 2 * j + 2 * i + 1] = ptr_scratch[2 * j + 1];
+    }
+  }
+
+  if (m_points == 48)
+    ixheaacd_hbe_apply_tw_mult_ifft(inp, p_scratch, n_points, m_points,
+                                    ixheaacd_twid_tbl_fft_336);
+  else
+    ixheaacd_hbe_apply_tw_mult_ifft(inp, p_scratch, n_points, m_points,
+                                    ixheaacd_twid_tbl_fft_168);
+
+  for (i = 0; i < len; i++) {
+    ptr_real[2 * i + 0] = p_scratch[2 * i + 0];
+    ptr_real[2 * i + 1] = p_scratch[2 * i + 1];
+  }
+
+  for (i = 0; i < n_points; i++) {
+    ixheaacd_hbe_apply_cfftn_gen(ptr_real, ptr_scratch, m_points, i_sign);
+    ptr_real += (2 * m_points);
+  }
+
+  ptr_real -= n_points * 2 * m_points;
+
+  for (j = 0; j < n_points; j++) {
+    for (i = 0; i < m_points; i++) {
+      inp[n_points * 2 * i + 2 * j + 0] = ptr_real[2 * m_points * j + 2 * i + 0];
+      inp[n_points * 2 * i + 2 * j + 1] = ptr_real[2 * m_points * j + 2 * i + 1];
+    }
+  }
+  return;
+}
+
diff --git a/decoder/ixheaacd_fft_ifft_32x32_rom.c b/decoder/ixheaacd_fft_ifft_32x32_rom.c
new file mode 100644
index 0000000..411aae4
--- /dev/null
+++ b/decoder/ixheaacd_fft_ifft_32x32_rom.c
@@ -0,0 +1,1210 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+
+const FLOAT64 ixheaacd_twid_tbl_fft_double[514] = {
+    1.00000000000000000000,  0.99998117528260111000,  0.99992470183914450000,
+    0.99983058179582340000,  0.99969881869620425000,  0.99952941750109314000,
+    0.99932238458834954000,  0.99907772775264536000,  0.99879545620517241000,
+    0.99847558057329477000,  0.99811811290014918000,  0.99772306664419164000,
+    0.99729045667869021000,  0.99682029929116567000,  0.99631261218277800000,
+    0.99576741446765982000,  0.99518472667219693000,  0.99456457073425542000,
+    0.99390697000235606000,  0.99321194923479450000,  0.99247953459870997000,
+    0.99170975366909953000,  0.99090263542778001000,  0.99005821026229712000,
+    0.98917650996478101000,  0.98825756773074946000,  0.98730141815785843000,
+    0.98630809724459867000,  0.98527764238894122000,  0.98421009238692903000,
+    0.98310548743121629000,  0.98196386910955524000,  0.98078528040323043000,
+    0.97956976568544052000,  0.97831737071962765000,  0.97702814265775439000,
+    0.97570213003852857000,  0.97433938278557586000,  0.97293995220556018000,
+    0.97150389098625178000,  0.97003125319454397000,  0.96852209427441738000,
+    0.96697647104485207000,  0.96539444169768940000,  0.96377606579543984000,
+    0.96212140426904158000,  0.96043051941556579000,  0.95870347489587160000,
+    0.95694033573220882000,  0.95514116830577078000,  0.95330604035419386000,
+    0.95143502096900834000,  0.94952818059303667000,  0.94758559101774109000,
+    0.94560732538052128000,  0.94359345816196039000,  0.94154406518302081000,
+    0.93945922360218992000,  0.93733901191257496000,  0.93518350993894761000,
+    0.93299279883473896000,  0.93076696107898371000,  0.92850608047321559000,
+    0.92621024213831138000,  0.92387953251128674000,  0.92151403934204201000,
+    0.91911385169005777000,  0.91667905992104270000,  0.91420975570353069000,
+    0.91170603200542988000,  0.90916798309052238000,  0.90659570451491533000,
+    0.90398929312344334000,  0.90134884704602203000,  0.89867446569395382000,
+    0.89596624975618522000,  0.89322430119551532000,  0.89044872324475788000,
+    0.88763962040285393000,  0.88479709843093779000,  0.88192126434835505000,
+    0.87901222642863353000,  0.87607009419540660000,  0.87309497841829009000,
+    0.87008699110871146000,  0.86704624551569265000,  0.86397285612158681000,
+    0.86086693863776731000,  0.85772861000027212000,  0.85455798836540053000,
+    0.85135519310526520000,  0.84812034480329723000,  0.84485356524970712000,
+    0.84155497743689844000,  0.83822470555483808000,  0.83486287498638001000,
+    0.83146961230254524000,  0.82804504525775580000,  0.82458930278502529000,
+    0.82110251499110465000,  0.81758481315158371000,  0.81403632970594841000,
+    0.81045719825259477000,  0.80684755354379933000,  0.80320753148064494000,
+    0.79953726910790501000,  0.79583690460888357000,  0.79210657730021239000,
+    0.78834642762660634000,  0.78455659715557524000,  0.78073722857209449000,
+    0.77688846567323244000,  0.77301045336273699000,  0.76910333764557970000,
+    0.76516726562245896000,  0.76120238548426178000,  0.75720884650648457000,
+    0.75318679904361252000,  0.74913639452345937000,  0.74505778544146606000,
+    0.74095112535495911000,  0.73681656887736990000,  0.73265427167241282000,
+    0.72846439044822520000,  0.72424708295146700000,  0.72000250796138165000,
+    0.71573082528381859000,  0.71143219574521643000,  0.70710678118654757000,
+    0.70275474445722530000,  0.69837624940897292000,  0.69397146088965400000,
+    0.68954054473706694000,  0.68508366777270036000,  0.68060099779545313000,
+    0.67609270357531603000,  0.67155895484701833000,  0.66699992230363747000,
+    0.66241577759017178000,  0.65780669329707864000,  0.65317284295377676000,
+    0.64851440102211255000,  0.64383154288979150000,  0.63912444486377573000,
+    0.63439328416364549000,  0.62963823891492710000,  0.62485948814238645000,
+    0.62005721176328921000,  0.61523159058062682000,  0.61038280627630948000,
+    0.60551104140432555000,  0.60061647938386897000,  0.59569930449243347000,
+    0.59075970185887428000,  0.58579785745643886000,  0.58081395809576453000,
+    0.57580819141784534000,  0.57078074588696737000,  0.56573181078361323000,
+    0.56066157619733603000,  0.55557023301960229000,  0.55045797293660481000,
+    0.54532498842204646000,  0.54017147272989297000,  0.53499761988709726000,
+    0.52980362468629483000,  0.52458968267846884000,  0.51935599016558953000,
+    0.51410274419322166000,  0.50883014254310699000,  0.50353838372571758000,
+    0.49822766697278187000,  0.49289819222978409000,  0.48755016014843605000,
+    0.48218377207912283000,  0.47679923006332225000,  0.47139673682599781000,
+    0.46597649576796613000,  0.46053871095824001000,  0.45508358712634384000,
+    0.44961132965460660000,  0.44412214457042926000,  0.43861623853852771000,
+    0.43309381885315201000,  0.42755509343028220000,  0.42200027079979979000,
+    0.41642956009763732000,  0.41084317105790391000,  0.40524131400498986000,
+    0.39962419984564679000,  0.39399204006104810000,  0.38834504669882630000,
+    0.38268343236508984000,  0.37700741021641831000,  0.37131719395183760000,
+    0.36561299780477396000,  0.35989503653498828000,  0.35416352542049051000,
+    0.34841868024943451000,  0.34266071731199438000,  0.33688985339222005000,
+    0.33110630575987643000,  0.32531029216226298000,  0.31950203081601575000,
+    0.31368174039889157000,  0.30784964004153498000,  0.30200594931922820000,
+    0.29615088824362396000,  0.29028467725446233000,  0.28440753721127182000,
+    0.27851968938505306000,  0.27262135544994898000,  0.26671275747489842000,
+    0.26079411791527557000,  0.25486565960451463000,  0.24892760574572026000,
+    0.24298017990326398000,  0.23702360599436734000,  0.23105810828067128000,
+    0.22508391135979278000,  0.21910124015686977000,  0.21311031991609136000,
+    0.20711137619221856000,  0.20110463484209196000,  0.19509032201612833000,
+    0.18906866414980628000,  0.18303988795514106000,  0.17700422041214886000,
+    0.17096188876030136000,  0.16491312048997009000,  0.15885814333386139000,
+    0.15279718525844341000,  0.14673047445536175000,  0.14065823933284924000,
+    0.13458070850712622000,  0.12849811079379322000,  0.12241067519921628000,
+    0.11631863091190488000,  0.11022220729388318000,  0.10412163387205473000,
+    0.09801714032956077000,  0.09190895649713269600,  0.08579731234443988000,
+    0.07968243797143012600,  0.07356456359966745400,  0.06744391956366410600,
+    0.06132073630220864800,  0.05519524434969003100,  0.04906767432741812600,
+    0.04293825693494095900,  0.03680722294135899100,  0.03067480317663658100,
+    0.02454122852291226400,  0.01840672990580482000,  0.01227153828571994400,
+    0.00613588464915451520,  0.00000000000000006123,  0.00000000000000000000,
+    -0.00613588464915447530, -0.01227153828571992500, -0.01840672990580482000,
+    -0.02454122852291228800, -0.03067480317663662600, -0.03680722294135883200,
+    -0.04293825693494082000, -0.04906767432741801500, -0.05519524434968993400,
+    -0.06132073630220857800, -0.06744391956366405100, -0.07356456359966742600,
+    -0.07968243797143012600, -0.08579731234443989400, -0.09190895649713272400,
+    -0.09801714032956060400, -0.10412163387205459000, -0.11022220729388306000,
+    -0.11631863091190475000, -0.12241067519921620000, -0.12849811079379317000,
+    -0.13458070850712617000, -0.14065823933284921000, -0.14673047445536175000,
+    -0.15279718525844344000, -0.15885814333386145000, -0.16491312048996989000,
+    -0.17096188876030122000, -0.17700422041214875000, -0.18303988795514095000,
+    -0.18906866414980619000, -0.19509032201612825000, -0.20110463484209190000,
+    -0.20711137619221856000, -0.21311031991609136000, -0.21910124015686980000,
+    -0.22508391135979283000, -0.23105810828067111000, -0.23702360599436720000,
+    -0.24298017990326387000, -0.24892760574572015000, -0.25486565960451457000,
+    -0.26079411791527551000, -0.26671275747489837000, -0.27262135544994898000,
+    -0.27851968938505306000, -0.28440753721127188000, -0.29028467725446233000,
+    -0.29615088824362379000, -0.30200594931922808000, -0.30784964004153487000,
+    -0.31368174039889152000, -0.31950203081601569000, -0.32531029216226293000,
+    -0.33110630575987643000, -0.33688985339222005000, -0.34266071731199438000,
+    -0.34841868024943456000, -0.35416352542049034000, -0.35989503653498811000,
+    -0.36561299780477385000, -0.37131719395183754000, -0.37700741021641826000,
+    -0.38268343236508978000, -0.38834504669882625000, -0.39399204006104810000,
+    -0.39962419984564679000, -0.40524131400498986000, -0.41084317105790391000,
+    -0.41642956009763715000, -0.42200027079979968000, -0.42755509343028208000,
+    -0.43309381885315196000, -0.43861623853852766000, -0.44412214457042920000,
+    -0.44961132965460654000, -0.45508358712634384000, -0.46053871095824001000,
+    -0.46597649576796618000, -0.47139673682599764000, -0.47679923006332209000,
+    -0.48218377207912272000, -0.48755016014843600000, -0.49289819222978404000,
+    -0.49822766697278187000, -0.50353838372571758000, -0.50883014254310699000,
+    -0.51410274419322166000, -0.51935599016558964000, -0.52458968267846895000,
+    -0.52980362468629461000, -0.53499761988709715000, -0.54017147272989285000,
+    -0.54532498842204646000, -0.55045797293660481000, -0.55557023301960218000,
+    -0.56066157619733603000, -0.56573181078361312000, -0.57078074588696726000,
+    -0.57580819141784534000, -0.58081395809576453000, -0.58579785745643886000,
+    -0.59075970185887416000, -0.59569930449243336000, -0.60061647938386897000,
+    -0.60551104140432555000, -0.61038280627630948000, -0.61523159058062682000,
+    -0.62005721176328910000, -0.62485948814238634000, -0.62963823891492698000,
+    -0.63439328416364549000, -0.63912444486377573000, -0.64383154288979139000,
+    -0.64851440102211244000, -0.65317284295377676000, -0.65780669329707864000,
+    -0.66241577759017178000, -0.66699992230363747000, -0.67155895484701833000,
+    -0.67609270357531592000, -0.68060099779545302000, -0.68508366777270036000,
+    -0.68954054473706683000, -0.69397146088965400000, -0.69837624940897292000,
+    -0.70275474445722530000, -0.70710678118654746000, -0.71143219574521643000,
+    -0.71573082528381859000, -0.72000250796138165000, -0.72424708295146689000,
+    -0.72846439044822520000, -0.73265427167241282000, -0.73681656887736979000,
+    -0.74095112535495911000, -0.74505778544146595000, -0.74913639452345926000,
+    -0.75318679904361241000, -0.75720884650648446000, -0.76120238548426178000,
+    -0.76516726562245896000, -0.76910333764557959000, -0.77301045336273699000,
+    -0.77688846567323244000, -0.78073722857209438000, -0.78455659715557524000,
+    -0.78834642762660623000, -0.79210657730021239000, -0.79583690460888346000,
+    -0.79953726910790501000, -0.80320753148064483000, -0.80684755354379922000,
+    -0.81045719825259477000, -0.81403632970594830000, -0.81758481315158371000,
+    -0.82110251499110465000, -0.82458930278502529000, -0.82804504525775580000,
+    -0.83146961230254524000, -0.83486287498638001000, -0.83822470555483797000,
+    -0.84155497743689833000, -0.84485356524970701000, -0.84812034480329712000,
+    -0.85135519310526520000, -0.85455798836540053000, -0.85772861000027212000,
+    -0.86086693863776731000, -0.86397285612158670000, -0.86704624551569265000,
+    -0.87008699110871135000, -0.87309497841829009000, -0.87607009419540660000,
+    -0.87901222642863341000, -0.88192126434835494000, -0.88479709843093779000,
+    -0.88763962040285393000, -0.89044872324475788000, -0.89322430119551532000,
+    -0.89596624975618511000, -0.89867446569395382000, -0.90134884704602203000,
+    -0.90398929312344334000, -0.90659570451491533000, -0.90916798309052227000,
+    -0.91170603200542988000, -0.91420975570353069000, -0.91667905992104270000,
+    -0.91911385169005777000, -0.92151403934204190000, -0.92387953251128674000,
+    -0.92621024213831127000, -0.92850608047321548000, -0.93076696107898371000,
+    -0.93299279883473885000, -0.93518350993894750000, -0.93733901191257496000,
+    -0.93945922360218992000, -0.94154406518302081000, -0.94359345816196039000,
+    -0.94560732538052128000, -0.94758559101774109000, -0.94952818059303667000,
+    -0.95143502096900834000, -0.95330604035419375000, -0.95514116830577067000,
+    -0.95694033573220894000, -0.95870347489587160000, -0.96043051941556579000,
+    -0.96212140426904158000, -0.96377606579543984000, -0.96539444169768940000,
+    -0.96697647104485207000, -0.96852209427441727000, -0.97003125319454397000,
+    -0.97150389098625178000, -0.97293995220556007000, -0.97433938278557586000,
+    -0.97570213003852857000, -0.97702814265775439000, -0.97831737071962765000,
+    -0.97956976568544052000, -0.98078528040323043000, -0.98196386910955524000,
+    -0.98310548743121629000, -0.98421009238692903000, -0.98527764238894122000,
+    -0.98630809724459867000, -0.98730141815785843000, -0.98825756773074946000,
+    -0.98917650996478101000, -0.99005821026229712000, -0.99090263542778001000,
+    -0.99170975366909953000, -0.99247953459870997000, -0.99321194923479450000,
+    -0.99390697000235606000, -0.99456457073425542000, -0.99518472667219682000,
+    -0.99576741446765982000, -0.99631261218277800000, -0.99682029929116567000,
+    -0.99729045667869021000, -0.99772306664419164000, -0.99811811290014918000,
+    -0.99847558057329477000, -0.99879545620517241000, -0.99907772775264536000,
+    -0.99932238458834954000, -0.99952941750109314000, -0.99969881869620425000,
+    -0.99983058179582340000, -0.99992470183914450000, -0.99998117528260111000,
+    -1.00000000000000000000};
+
+const FLOAT64 ixheaacd_twid_tbl_fft_ntwt3r[1155] = {
+    1.00000000000000000000, 1.00000000000000000000,  1.00000000000000000000,
+    1.00000000000000000000, 0.99986613790956180000,  0.99946458747636568000,
+    1.00000000000000000000, 0.99946458747636568000,  0.99785892323860348000,
+    1.00000000000000000000, 0.99879545620517241000,  0.99518472667219693000,
+    1.00000000000000000000, 0.99785892323860348000,  0.99144486137381038000,
+    1.00000000000000000000, 0.99665523930918032000,  0.98664333208487898000,
+    1.00000000000000000000, 0.99518472667219693000,  0.98078528040323043000,
+    1.00000000000000000000, 0.99344777901944437000,  0.97387697927733363000,
+    1.00000000000000000000, 0.99144486137381038000,  0.96592582628906831000,
+    1.00000000000000000000, 0.98917650996478101000,  0.95694033573220882000,
+    1.00000000000000000000, 0.98664333208487898000,  0.94693012949510569000,
+    1.00000000000000000000, 0.98384600592707738000,  0.93590592675732576000,
+    1.00000000000000000000, 0.98078528040323043000,  0.92387953251128674000,
+    1.00000000000000000000, 0.97746197494357190000,  0.91086382492117579000,
+    1.00000000000000000000, 0.97387697927733363000,  0.89687274153268837000,
+    1.00000000000000000000, 0.97003125319454397000,  0.88192126434835505000,
+    1.00000000000000000000, 0.96592582628906831000,  0.86602540378443871000,
+    1.00000000000000000000, 0.96156179768296191000,  0.84920218152657889000,
+    1.00000000000000000000, 0.95694033573220882000,  0.83146961230254524000,
+    1.00000000000000000000, 0.95206267771392428000,  0.81284668459161524000,
+    1.00000000000000000000, 0.94693012949510569000,  0.79335334029123517000,
+    1.00000000000000000000, 0.94154406518302081000,  0.77301045336273699000,
+    1.00000000000000000000, 0.93590592675732576000,  0.75183980747897738000,
+    1.00000000000000000000, 0.93001722368401218000,  0.72986407269783571000,
+    1.00000000000000000000, 0.92387953251128674000,  0.70710678118654757000,
+    1.00000000000000000000, 0.91749449644749126000,  0.68359230202287125000,
+    1.00000000000000000000, 0.91086382492117579000,  0.65934581510006884000,
+    1.00000000000000000000, 0.90398929312344334000,  0.63439328416364549000,
+    1.00000000000000000000, 0.89687274153268837000,  0.60876142900872066000,
+    1.00000000000000000000, 0.88951607542185607000,  0.58247769686780215000,
+    1.00000000000000000000, 0.88192126434835505000,  0.55557023301960240000,
+    1.00000000000000000000, 0.87409034162675892000,  0.52806785065036810000,
+    1.00000000000000000000, 0.86602540378443871000,  0.50000000000000011000,
+    1.00000000000000000000, 0.85772861000027201000,  0.47139673682599759000,
+    1.00000000000000000000, 0.84920218152657889000,  0.44228869021900125000,
+    1.00000000000000000000, 0.84044840109443797000,  0.41270702980439472000,
+    1.00000000000000000000, 0.83146961230254524000,  0.38268343236508984000,
+    1.00000000000000000000, 0.82226821898977509000,  0.35225004792123360000,
+    1.00000000000000000000, 0.81284668459161524000,  0.32143946530316170000,
+    1.00000000000000000000, 0.80320753148064494000,  0.29028467725446250000,
+    1.00000000000000000000, 0.79335334029123517000,  0.25881904510252074000,
+    1.00000000000000000000, 0.78328674922865049000,  0.22707626303437345000,
+    1.00000000000000000000, 0.77301045336273699000,  0.19509032201612833000,
+    1.00000000000000000000, 0.76252720390638817000,  0.16289547339458882000,
+    1.00000000000000000000, 0.75183980747897738000,  0.13052619222005171000,
+    1.00000000000000000000, 0.74095112535495911000,  0.09801714032956054800,
+    1.00000000000000000000, 0.72986407269783571000,  0.06540312923014327000,
+    1.00000000000000000000, 0.71858161777969809000,  0.03271908282177616500,
+    1.00000000000000000000, 0.70710678118654757000,  0.00000000000000006123,
+    1.00000000000000000000, 0.69544263500961168000,  -0.03271908282177604000,
+    1.00000000000000000000, 0.68359230202287125000,  -0.06540312923014314500,
+    1.00000000000000000000, 0.67155895484701844000,  -0.09801714032956042300,
+    1.00000000000000000000, 0.65934581510006884000,  -0.13052619222005160000,
+    1.00000000000000000000, 0.64695615253485739000,  -0.16289547339458871000,
+    1.00000000000000000000, 0.63439328416364549000,  -0.19509032201612819000,
+    1.00000000000000000000, 0.62166057337007741000,  -0.22707626303437331000,
+    1.00000000000000000000, 0.60876142900872066000,  -0.25881904510252063000,
+    1.00000000000000000000, 0.59569930449243347000,  -0.29028467725446216000,
+    1.00000000000000000000, 0.58247769686780215000,  -0.32143946530316159000,
+    1.00000000000000000000, 0.56910014587889823000,  -0.35225004792123349000,
+    1.00000000000000000000, 0.55557023301960240000,  -0.38268343236508950000,
+    1.00000000000000000000, 0.54189158057475173000,  -0.41270702980439461000,
+    1.00000000000000000000, 0.52806785065036810000,  -0.44228869021900113000,
+    1.00000000000000000000, 0.51410274419322166000,  -0.47139673682599770000,
+    1.00000000000000000000, 0.50000000000000011000,  -0.49999999999999978000,
+    1.00000000000000000000, 0.48576339371634009000,  -0.52806785065036799000,
+    1.00000000000000000000, 0.47139673682599759000,  -0.55557023301960229000,
+    1.00000000000000000000, 0.45690387563042073000,  -0.58247769686780204000,
+    1.00000000000000000000, 0.44228869021900125000,  -0.60876142900872066000,
+    1.00000000000000000000, 0.42755509343028220000,  -0.63439328416364538000,
+    1.00000000000000000000, 0.41270702980439472000,  -0.65934581510006884000,
+    1.00000000000000000000, 0.39774847452701095000,  -0.68359230202287136000,
+    1.00000000000000000000, 0.38268343236508984000,  -0.70710678118654746000,
+    1.00000000000000000000, 0.36751593659470372000,  -0.72986407269783538000,
+    1.00000000000000000000, 0.35225004792123360000,  -0.75183980747897727000,
+    1.00000000000000000000, 0.33688985339222005000,  -0.77301045336273699000,
+    1.00000000000000000000, 0.32143946530316170000,  -0.79335334029123505000,
+    1.00000000000000000000, 0.30590302009655351000,  -0.81284668459161513000,
+    1.00000000000000000000, 0.29028467725446250000,  -0.83146961230254501000,
+    1.00000000000000000000, 0.27458861818493241000,  -0.84920218152657878000,
+    1.00000000000000000000, 0.25881904510252074000,  -0.86602540378443871000,
+    1.00000000000000000000, 0.24298017990326398000,  -0.88192126434835494000,
+    1.00000000000000000000, 0.22707626303437345000,  -0.89687274153268814000,
+    1.00000000000000000000, 0.21111155235896509000,  -0.91086382492117590000,
+    1.00000000000000000000, 0.19509032201612833000,  -0.92387953251128674000,
+    1.00000000000000000000, 0.17901686127663263000,  -0.93590592675732576000,
+    1.00000000000000000000, 0.16289547339458882000,  -0.94693012949510558000,
+    1.00000000000000000000, 0.14673047445536197000,  -0.95694033573220871000,
+    1.00000000000000000000, 0.13052619222005171000,  -0.96592582628906820000,
+    1.00000000000000000000, 0.11428696496684644000,  -0.97387697927733363000,
+    1.00000000000000000000, 0.09801714032956054800,  -0.98078528040323043000,
+    1.00000000000000000000, 0.08172107413366830300,  -0.98664333208487898000,
+    1.00000000000000000000, 0.06540312923014327000,  -0.99144486137381038000,
+    1.00000000000000000000, 0.04906767432741812600,  -0.99518472667219682000,
+    1.00000000000000000000, 0.03271908282177616500,  -0.99785892323860348000,
+    1.00000000000000000000, 0.01636173162648671400,  -0.99946458747636568000,
+    1.00000000000000000000, 0.00000000000000006123,  -1.00000000000000000000,
+    1.00000000000000000000, -0.01636173162648658900, -0.99946458747636568000,
+    1.00000000000000000000, -0.03271908282177604000, -0.99785892323860348000,
+    1.00000000000000000000, -0.04906767432741800800, -0.99518472667219693000,
+    1.00000000000000000000, -0.06540312923014314500, -0.99144486137381038000,
+    1.00000000000000000000, -0.08172107413366817800, -0.98664333208487898000,
+    1.00000000000000000000, -0.09801714032956042300, -0.98078528040323054000,
+    1.00000000000000000000, -0.11428696496684632000, -0.97387697927733363000,
+    1.00000000000000000000, -0.13052619222005160000, -0.96592582628906831000,
+    1.00000000000000000000, -0.14673047445536186000, -0.95694033573220882000,
+    1.00000000000000000000, -0.16289547339458871000, -0.94693012949510569000,
+    1.00000000000000000000, -0.17901686127663252000, -0.93590592675732587000,
+    1.00000000000000000000, -0.19509032201612819000, -0.92387953251128685000,
+    1.00000000000000000000, -0.21111155235896498000, -0.91086382492117601000,
+    1.00000000000000000000, -0.22707626303437331000, -0.89687274153268826000,
+    1.00000000000000000000, -0.24298017990326387000, -0.88192126434835505000,
+    1.00000000000000000000, -0.25881904510252063000, -0.86602540378443882000,
+    1.00000000000000000000, -0.27458861818493230000, -0.84920218152657889000,
+    1.00000000000000000000, -0.29028467725446216000, -0.83146961230254546000,
+    1.00000000000000000000, -0.30590302009655357000, -0.81284668459161502000,
+    1.00000000000000000000, -0.32143946530316159000, -0.79335334029123517000,
+    1.00000000000000000000, -0.33688985339221994000, -0.77301045336273710000,
+    1.00000000000000000000, -0.35225004792123349000, -0.75183980747897750000,
+    1.00000000000000000000, -0.36751593659470339000, -0.72986407269783593000,
+    1.00000000000000000000, -0.38268343236508950000, -0.70710678118654791000,
+    1.00000000000000000000, -0.39774847452701106000, -0.68359230202287125000,
+    1.00000000000000000000, -0.41270702980439461000, -0.65934581510006907000,
+    1.00000000000000000000, -0.42755509343028186000, -0.63439328416364593000,
+    1.00000000000000000000, -0.44228869021900113000, -0.60876142900872088000,
+    1.00000000000000000000, -0.45690387563042062000, -0.58247769686780226000,
+    1.00000000000000000000, -0.47139673682599770000, -0.55557023301960218000,
+    1.00000000000000000000, -0.48576339371634014000, -0.52806785065036776000,
+    1.00000000000000000000, -0.49999999999999978000, -0.50000000000000044000,
+    1.00000000000000000000, -0.51410274419322166000, -0.47139673682599786000,
+    1.00000000000000000000, -0.52806785065036799000, -0.44228869021900136000,
+    1.00000000000000000000, -0.54189158057475173000, -0.41270702980439467000,
+    1.00000000000000000000, -0.55557023301960229000, -0.38268343236508950000,
+    1.00000000000000000000, -0.56910014587889801000, -0.35225004792123393000,
+    1.00000000000000000000, -0.58247769686780204000, -0.32143946530316181000,
+    1.00000000000000000000, -0.59569930449243336000, -0.29028467725446244000,
+    1.00000000000000000000, -0.60876142900872066000, -0.25881904510252063000,
+    1.00000000000000000000, -0.62166057337007752000, -0.22707626303437292000,
+    1.00000000000000000000, -0.63439328416364538000, -0.19509032201612866000,
+    1.00000000000000000000, -0.64695615253485728000, -0.16289547339458896000,
+    1.00000000000000000000, -0.65934581510006884000, -0.13052619222005163000,
+    1.00000000000000000000, -0.67155895484701811000, -0.09801714032956133900,
+    1.00000000000000000000, -0.68359230202287136000, -0.06540312923014272900,
+    1.00000000000000000000, -0.69544263500961156000, -0.03271908282177651100,
+    1.00000000000000000000, -0.70710678118654746000, -0.00000000000000018369,
+    1.00000000000000000000, -0.71858161777969809000, 0.03271908282177614400,
+    1.00000000000000000000, -0.72986407269783538000, 0.06540312923014236800,
+    1.00000000000000000000, -0.74095112535495922000, 0.09801714032956096400,
+    1.00000000000000000000, -0.75183980747897727000, 0.13052619222005127000,
+    1.00000000000000000000, -0.76252720390638806000, 0.16289547339458860000,
+    1.00000000000000000000, -0.77301045336273699000, 0.19509032201612830000,
+    1.00000000000000000000, -0.78328674922865016000, 0.22707626303437256000,
+    1.00000000000000000000, -0.79335334029123505000, 0.25881904510252030000,
+    1.00000000000000000000, -0.80320753148064483000, 0.29028467725446205000,
+    1.00000000000000000000, -0.81284668459161513000, 0.32143946530316148000,
+    1.00000000000000000000, -0.82226821898977509000, 0.35225004792123354000,
+    1.00000000000000000000, -0.83146961230254501000, 0.38268343236508917000,
+    1.00000000000000000000, -0.84044840109443786000, 0.41270702980439433000,
+    1.00000000000000000000, -0.84920218152657878000, 0.44228869021900102000,
+    1.00000000000000000000, -0.85772861000027201000, 0.47139673682599759000,
+    1.00000000000000000000, -0.86602540378443871000, 0.50000000000000011000,
+    1.00000000000000000000, -0.87409034162675869000, 0.52806785065036743000,
+    1.00000000000000000000, -0.88192126434835494000, 0.55557023301960184000,
+    1.00000000000000000000, -0.88951607542185596000, 0.58247769686780193000,
+    1.00000000000000000000, -0.89687274153268814000, 0.60876142900871988000,
+    1.00000000000000000000, -0.90398929312344312000, 0.63439328416364493000,
+    1.00000000000000000000, -0.91086382492117590000, 0.65934581510006907000,
+    1.00000000000000000000, -0.91749449644749137000, 0.68359230202287169000,
+    1.00000000000000000000, -0.92387953251128674000, 0.70710678118654735000,
+    1.00000000000000000000, -0.93001722368401207000, 0.72986407269783560000,
+    1.00000000000000000000, -0.93590592675732576000, 0.75183980747897750000,
+    1.00000000000000000000, -0.94154406518302070000, 0.77301045336273666000,
+    1.00000000000000000000, -0.94693012949510558000, 0.79335334029123494000,
+    1.00000000000000000000, -0.95206267771392428000, 0.81284668459161513000,
+    1.00000000000000000000, -0.95694033573220871000, 0.83146961230254479000,
+    1.00000000000000000000, -0.96156179768296191000, 0.84920218152657856000,
+    1.00000000000000000000, -0.96592582628906820000, 0.86602540378443837000,
+    1.00000000000000000000, -0.97003125319454409000, 0.88192126434835527000,
+    1.00000000000000000000, -0.97387697927733363000, 0.89687274153268826000,
+    1.00000000000000000000, -0.97746197494357190000, 0.91086382492117579000,
+    1.00000000000000000000, -0.98078528040323043000, 0.92387953251128685000,
+    1.00000000000000000000, -0.98384600592707738000, 0.93590592675732553000,
+    1.00000000000000000000, -0.98664333208487898000, 0.94693012949510558000,
+    1.00000000000000000000, -0.98917650996478101000, 0.95694033573220882000,
+    1.00000000000000000000, -0.99144486137381038000, 0.96592582628906809000,
+    1.00000000000000000000, -0.99344777901944437000, 0.97387697927733352000,
+    1.00000000000000000000, -0.99518472667219682000, 0.98078528040323032000,
+    1.00000000000000000000, -0.99665523930918032000, 0.98664333208487909000,
+    1.00000000000000000000, -0.99785892323860348000, 0.99144486137381038000,
+    1.00000000000000000000, -0.99879545620517241000, 0.99518472667219693000,
+    1.00000000000000000000, -0.99946458747636568000, 0.99785892323860348000,
+    1.00000000000000000000, -0.99986613790956180000, 0.99946458747636568000,
+    1.00000000000000000000, -1.00000000000000000000, 1.00000000000000000000,
+    1.00000000000000000000, -0.99986613790956180000, 0.99946458747636568000,
+    1.00000000000000000000, -0.99946458747636568000, 0.99785892323860359000,
+    1.00000000000000000000, -0.99879545620517241000, 0.99518472667219693000,
+    1.00000000000000000000, -0.99785892323860348000, 0.99144486137381049000,
+    1.00000000000000000000, -0.99665523930918032000, 0.98664333208487920000,
+    1.00000000000000000000, -0.99518472667219693000, 0.98078528040323043000,
+    1.00000000000000000000, -0.99344777901944437000, 0.97387697927733363000,
+    1.00000000000000000000, -0.99144486137381038000, 0.96592582628906820000,
+    1.00000000000000000000, -0.98917650996478101000, 0.95694033573220894000,
+    1.00000000000000000000, -0.98664333208487898000, 0.94693012949510569000,
+    1.00000000000000000000, -0.98384600592707738000, 0.93590592675732565000,
+    1.00000000000000000000, -0.98078528040323054000, 0.92387953251128707000,
+    1.00000000000000000000, -0.97746197494357190000, 0.91086382492117601000,
+    1.00000000000000000000, -0.97387697927733363000, 0.89687274153268848000,
+    1.00000000000000000000, -0.97003125319454409000, 0.88192126434835549000,
+    1.00000000000000000000, -0.96592582628906831000, 0.86602540378443860000,
+    1.00000000000000000000, -0.96156179768296191000, 0.84920218152657878000,
+    1.00000000000000000000, -0.95694033573220882000, 0.83146961230254501000,
+    1.00000000000000000000, -0.95206267771392428000, 0.81284668459161535000,
+    1.00000000000000000000, -0.94693012949510569000, 0.79335334029123528000,
+    1.00000000000000000000, -0.94154406518302081000, 0.77301045336273688000,
+    1.00000000000000000000, -0.93590592675732587000, 0.75183980747897783000,
+    1.00000000000000000000, -0.93001722368401218000, 0.72986407269783593000,
+    1.00000000000000000000, -0.92387953251128685000, 0.70710678118654768000,
+    1.00000000000000000000, -0.91749449644749148000, 0.68359230202287202000,
+    1.00000000000000000000, -0.91086382492117601000, 0.65934581510006951000,
+    1.00000000000000000000, -0.90398929312344323000, 0.63439328416364527000,
+    1.00000000000000000000, -0.89687274153268826000, 0.60876142900872032000,
+    1.00000000000000000000, -0.88951607542185607000, 0.58247769686780237000,
+    1.00000000000000000000, -0.88192126434835505000, 0.55557023301960229000,
+    1.00000000000000000000, -0.87409034162675880000, 0.52806785065036788000,
+    1.00000000000000000000, -0.86602540378443882000, 0.50000000000000056000,
+    1.00000000000000000000, -0.85772861000027212000, 0.47139673682599798000,
+    1.00000000000000000000, -0.84920218152657889000, 0.44228869021900147000,
+    1.00000000000000000000, -0.84044840109443830000, 0.41270702980439555000,
+    1.00000000000000000000, -0.83146961230254546000, 0.38268343236509045000,
+    1.00000000000000000000, -0.82226821898977531000, 0.35225004792123404000,
+    1.00000000000000000000, -0.81284668459161502000, 0.32143946530316109000,
+    1.00000000000000000000, -0.80320753148064494000, 0.29028467725446255000,
+    1.00000000000000000000, -0.79335334029123517000, 0.25881904510252074000,
+    1.00000000000000000000, -0.78328674922865027000, 0.22707626303437303000,
+    1.00000000000000000000, -0.77301045336273710000, 0.19509032201612878000,
+    1.00000000000000000000, -0.76252720390638817000, 0.16289547339458907000,
+    1.00000000000000000000, -0.75183980747897750000, 0.13052619222005174000,
+    1.00000000000000000000, -0.74095112535495933000, 0.09801714032956145000,
+    1.00000000000000000000, -0.72986407269783593000, 0.06540312923014374200,
+    1.00000000000000000000, -0.71858161777969820000, 0.03271908282177662900,
+    1.00000000000000000000, -0.70710678118654791000, 0.00000000000000119433,
+    1.00000000000000000000, -0.69544263500961168000, -0.03271908282177601900,
+    1.00000000000000000000, -0.68359230202287125000, -0.06540312923014313100,
+    1.00000000000000000000, -0.67155895484701833000, -0.09801714032956084000,
+    1.00000000000000000000, -0.65934581510006907000, -0.13052619222005113000,
+    1.00000000000000000000, -0.64695615253485750000, -0.16289547339458846000,
+    1.00000000000000000000, -0.63439328416364593000, -0.19509032201612730000,
+    1.00000000000000000000, -0.62166057337007741000, -0.22707626303437331000,
+    1.00000000000000000000, -0.60876142900872088000, -0.25881904510252018000,
+    1.00000000000000000000, -0.59569930449243391000, -0.29028467725446111000,
+    1.00000000000000000000, -0.58247769686780226000, -0.32143946530316136000,
+    1.00000000000000000000, -0.56910014587889790000, -0.35225004792123427000,
+    1.00000000000000000000, -0.55557023301960218000, -0.38268343236508989000,
+    1.00000000000000000000, -0.54189158057475195000, -0.41270702980439422000,
+    1.00000000000000000000, -0.52806785065036776000, -0.44228869021900175000,
+    1.00000000000000000000, -0.51410274419322177000, -0.47139673682599748000,
+    1.00000000000000000000, -0.50000000000000044000, -0.49999999999999922000,
+    1.00000000000000000000, -0.48576339371633998000, -0.52806785065036810000,
+    1.00000000000000000000, -0.47139673682599786000, -0.55557023301960173000,
+    1.00000000000000000000, -0.45690387563042123000, -0.58247769686780115000,
+    1.00000000000000000000, -0.44228869021900136000, -0.60876142900872054000,
+    1.00000000000000000000, -0.42755509343028247000, -0.63439328416364482000,
+    1.00000000000000000000, -0.41270702980439467000, -0.65934581510006895000,
+    1.00000000000000000000, -0.39774847452701129000, -0.68359230202287091000,
+    1.00000000000000000000, -0.38268343236508950000, -0.70710678118654791000,
+    1.00000000000000000000, -0.36751593659470366000, -0.72986407269783560000,
+    1.00000000000000000000, -0.35225004792123393000, -0.75183980747897683000,
+    1.00000000000000000000, -0.33688985339221994000, -0.77301045336273710000,
+    1.00000000000000000000, -0.32143946530316181000, -0.79335334029123483000,
+    1.00000000000000000000, -0.30590302009655401000, -0.81284668459161447000,
+    1.00000000000000000000, -0.29028467725446244000, -0.83146961230254512000,
+    1.00000000000000000000, -0.27458861818493274000, -0.84920218152657845000,
+    1.00000000000000000000, -0.25881904510252063000, -0.86602540378443882000,
+    1.00000000000000000000, -0.24298017990326412000, -0.88192126434835483000,
+    1.00000000000000000000, -0.22707626303437292000, -0.89687274153268859000,
+    1.00000000000000000000, -0.21111155235896520000, -0.91086382492117579000,
+    1.00000000000000000000, -0.19509032201612866000, -0.92387953251128641000,
+    1.00000000000000000000, -0.17901686127663255000, -0.93590592675732576000,
+    1.00000000000000000000, -0.16289547339458896000, -0.94693012949510558000,
+    1.00000000000000000000, -0.14673047445536230000, -0.95694033573220849000,
+    1.00000000000000000000, -0.13052619222005163000, -0.96592582628906831000,
+    1.00000000000000000000, -0.11428696496684677000, -0.97387697927733352000,
+    1.00000000000000000000, -0.09801714032956133900, -0.98078528040323021000,
+    1.00000000000000000000, -0.08172107413366842800, -0.98664333208487898000,
+    1.00000000000000000000, -0.06540312923014272900, -0.99144486137381049000,
+    1.00000000000000000000, -0.04906767432741802900, -0.99518472667219693000,
+    1.00000000000000000000, -0.03271908282177651100, -0.99785892323860348000,
+    1.00000000000000000000, -0.01636173162648661300, -0.99946458747636568000,
+    1.00000000000000000000, -0.00000000000000018369, -1.00000000000000000000,
+    1.00000000000000000000, 0.01636173162648624600,  -0.99946458747636568000,
+    1.00000000000000000000, 0.03271908282177614400,  -0.99785892323860348000,
+    1.00000000000000000000, 0.04906767432741766100,  -0.99518472667219693000,
+    1.00000000000000000000, 0.06540312923014236800,  -0.99144486137381060000,
+    1.00000000000000000000, 0.08172107413366805400,  -0.98664333208487909000,
+    1.00000000000000000000, 0.09801714032956096400,  -0.98078528040323032000,
+    1.00000000000000000000, 0.11428696496684641000,  -0.97387697927733363000,
+    1.00000000000000000000, 0.13052619222005127000,  -0.96592582628906842000,
+    1.00000000000000000000, 0.14673047445536194000,  -0.95694033573220871000,
+    1.00000000000000000000, 0.16289547339458860000,  -0.94693012949510580000,
+    1.00000000000000000000, 0.17901686127663219000,  -0.93590592675732609000,
+    1.00000000000000000000, 0.19509032201612830000,  -0.92387953251128674000,
+    1.00000000000000000000, 0.21111155235896484000,  -0.91086382492117612000,
+    1.00000000000000000000, 0.22707626303437256000,  -0.89687274153268892000,
+    1.00000000000000000000, 0.24298017990326376000,  -0.88192126434835516000,
+    1.00000000000000000000, 0.25881904510252030000,  -0.86602540378443915000,
+    1.00000000000000000000, 0.27458861818493241000,  -0.84920218152657889000,
+    1.00000000000000000000, 0.29028467725446205000,  -0.83146961230254557000,
+    1.00000000000000000000, 0.30590302009655368000,  -0.81284668459161491000,
+    1.00000000000000000000, 0.32143946530316148000,  -0.79335334029123528000,
+    1.00000000000000000000, 0.33688985339221961000,  -0.77301045336273755000,
+    1.00000000000000000000, 0.35225004792123354000,  -0.75183980747897727000,
+    1.00000000000000000000, 0.36751593659470327000,  -0.72986407269783604000,
+    1.00000000000000000000, 0.38268343236508917000,  -0.70710678118654846000,
+    1.00000000000000000000, 0.39774847452701095000,  -0.68359230202287147000,
+    1.00000000000000000000, 0.41270702980439433000,  -0.65934581510006951000,
+    1.00000000000000000000, 0.42755509343028214000,  -0.63439328416364538000,
+    1.00000000000000000000, 0.44228869021900102000,  -0.60876142900872110000,
+    1.00000000000000000000, 0.45690387563042090000,  -0.58247769686780171000,
+    1.00000000000000000000, 0.47139673682599759000,  -0.55557023301960240000,
+    1.00000000000000000000, 0.48576339371633964000,  -0.52806785065036876000,
+    1.00000000000000000000, 0.50000000000000011000,  -0.49999999999999983000,
+    1.00000000000000000000, 0.51410274419322155000,  -0.47139673682599809000,
+    1.00000000000000000000, 0.52806785065036743000,  -0.44228869021900236000,
+    1.00000000000000000000, 0.54189158057475162000,  -0.41270702980439489000,
+    1.00000000000000000000, 0.55557023301960184000,  -0.38268343236509056000,
+    1.00000000000000000000, 0.56910014587889757000,  -0.35225004792123499000,
+    1.00000000000000000000, 0.58247769686780193000,  -0.32143946530316203000,
+    1.00000000000000000000, 0.59569930449243358000,  -0.29028467725446183000,
+    1.00000000000000000000, 0.60876142900871988000,  -0.25881904510252257000,
+    1.00000000000000000000, 0.62166057337007707000,  -0.22707626303437400000,
+    1.00000000000000000000, 0.63439328416364493000,  -0.19509032201612977000,
+    1.00000000000000000000, 0.64695615253485717000,  -0.16289547339458918000,
+    1.00000000000000000000, 0.65934581510006907000,  -0.13052619222005099000,
+    1.00000000000000000000, 0.67155895484701833000,  -0.09801714032956068700,
+    1.00000000000000000000, 0.68359230202287169000,  -0.06540312923014209000,
+    1.00000000000000000000, 0.69544263500961112000,  -0.03271908282177764200,
+    1.00000000000000000000, 0.70710678118654735000,  -0.00000000000000042861,
+    1.00000000000000000000, 0.71858161777969765000,  0.03271908282177501300,
+    1.00000000000000000000, 0.72986407269783560000,  0.06540312923014300600,
+    1.00000000000000000000, 0.74095112535495888000,  0.09801714032955984000,
+    1.00000000000000000000, 0.75183980747897750000,  0.13052619222005191000,
+    1.00000000000000000000, 0.76252720390638740000,  0.16289547339458660000,
+    1.00000000000000000000, 0.77301045336273666000,  0.19509032201612719000,
+    1.00000000000000000000, 0.78328674922865038000,  0.22707626303437317000,
+    1.00000000000000000000, 0.79335334029123494000,  0.25881904510252007000,
+    1.00000000000000000000, 0.80320753148064505000,  0.29028467725446266000,
+    1.00000000000000000000, 0.81284668459161513000,  0.32143946530316125000,
+    1.00000000000000000000, 0.82226821898977531000,  0.35225004792123416000,
+    1.00000000000000000000, 0.83146961230254479000,  0.38268343236508812000,
+    1.00000000000000000000, 0.84044840109443786000,  0.41270702980439411000,
+    1.00000000000000000000, 0.84920218152657856000,  0.44228869021900002000,
+    1.00000000000000000000, 0.85772861000027201000,  0.47139673682599736000,
+    1.00000000000000000000, 0.86602540378443837000,  0.49999999999999911000,
+    1.00000000000000000000, 0.87409034162675880000,  0.52806785065036799000,
+    1.00000000000000000000, 0.88192126434835527000,  0.55557023301960318000,
+    1.00000000000000000000, 0.88951607542185573000,  0.58247769686780104000,
+    1.00000000000000000000, 0.89687274153268826000,  0.60876142900872043000,
+    1.00000000000000000000, 0.90398929312344312000,  0.63439328416364471000,
+    1.00000000000000000000, 0.91086382492117579000,  0.65934581510006895000,
+    1.00000000000000000000, 0.91749449644749115000,  0.68359230202287080000,
+    1.00000000000000000000, 0.92387953251128685000,  0.70710678118654779000,
+    1.00000000000000000000, 0.93001722368401174000,  0.72986407269783427000,
+    1.00000000000000000000, 0.93590592675732553000,  0.75183980747897672000,
+    1.00000000000000000000, 0.94154406518302081000,  0.77301045336273699000,
+    1.00000000000000000000, 0.94693012949510558000,  0.79335334029123483000,
+    1.00000000000000000000, 0.95206267771392428000,  0.81284668459161546000,
+    1.00000000000000000000, 0.95694033573220882000,  0.83146961230254512000,
+    1.00000000000000000000, 0.96156179768296202000,  0.84920218152657934000,
+    1.00000000000000000000, 0.96592582628906809000,  0.86602540378443782000,
+    1.00000000000000000000, 0.97003125319454397000,  0.88192126434835472000,
+    1.00000000000000000000, 0.97387697927733352000,  0.89687274153268770000,
+    1.00000000000000000000, 0.97746197494357179000,  0.91086382492117568000,
+    1.00000000000000000000, 0.98078528040323032000,  0.92387953251128641000,
+    1.00000000000000000000, 0.98384600592707738000,  0.93590592675732576000,
+    1.00000000000000000000, 0.98664333208487909000,  0.94693012949510602000,
+    1.00000000000000000000, 0.98917650996478090000,  0.95694033573220849000,
+    1.00000000000000000000, 0.99144486137381038000,  0.96592582628906820000,
+    1.00000000000000000000, 0.99344777901944437000,  0.97387697927733341000,
+    1.00000000000000000000, 0.99518472667219693000,  0.98078528040323043000,
+    1.00000000000000000000, 0.99665523930918032000,  0.98664333208487887000,
+    1.00000000000000000000, 0.99785892323860348000,  0.99144486137381049000,
+    1.00000000000000000000, 0.99879545620517229000,  0.99518472667219671000,
+    1.00000000000000000000, 0.99946458747636568000,  0.99785892323860348000,
+    1.00000000000000000000, 0.99986613790956180000,  0.99946458747636557000,
+    1.00000000000000000000, 1.00000000000000000000,  1.00000000000000000000};
+
+const FLOAT64 ixheaacd_twid_tbl_fft_ntwt3i[1155] = {
+    0.00000000000000000000, 0.00000000000000000000,  0.00000000000000000000,
+    0.00000000000000000000, -0.01636173162648678000, -0.03271908282177613700,
+    0.00000000000000000000, -0.03271908282177613700, -0.06540312923014306200,
+    0.00000000000000000000, -0.04906767432741801500, -0.09801714032956060400,
+    0.00000000000000000000, -0.06540312923014306200, -0.13052619222005157000,
+    0.00000000000000000000, -0.08172107413366822000, -0.16289547339458874000,
+    0.00000000000000000000, -0.09801714032956060400, -0.19509032201612825000,
+    0.00000000000000000000, -0.11428696496684639000, -0.22707626303437320000,
+    0.00000000000000000000, -0.13052619222005157000, -0.25881904510252074000,
+    0.00000000000000000000, -0.14673047445536175000, -0.29028467725446233000,
+    0.00000000000000000000, -0.16289547339458874000, -0.32143946530316159000,
+    0.00000000000000000000, -0.17901686127663266000, -0.35225004792123349000,
+    0.00000000000000000000, -0.19509032201612825000, -0.38268343236508978000,
+    0.00000000000000000000, -0.21111155235896517000, -0.41270702980439472000,
+    0.00000000000000000000, -0.22707626303437320000, -0.44228869021900125000,
+    0.00000000000000000000, -0.24298017990326384000, -0.47139673682599759000,
+    0.00000000000000000000, -0.25881904510252074000, -0.49999999999999994000,
+    0.00000000000000000000, -0.27458861818493235000, -0.52806785065036799000,
+    0.00000000000000000000, -0.29028467725446233000, -0.55557023301960218000,
+    0.00000000000000000000, -0.30590302009655346000, -0.58247769686780215000,
+    0.00000000000000000000, -0.32143946530316159000, -0.60876142900872066000,
+    0.00000000000000000000, -0.33688985339222005000, -0.63439328416364549000,
+    0.00000000000000000000, -0.35225004792123349000, -0.65934581510006884000,
+    0.00000000000000000000, -0.36751593659470350000, -0.68359230202287125000,
+    0.00000000000000000000, -0.38268343236508978000, -0.70710678118654746000,
+    0.00000000000000000000, -0.39774847452701106000, -0.72986407269783571000,
+    0.00000000000000000000, -0.41270702980439472000, -0.75183980747897738000,
+    0.00000000000000000000, -0.42755509343028208000, -0.77301045336273699000,
+    0.00000000000000000000, -0.44228869021900125000, -0.79335334029123517000,
+    0.00000000000000000000, -0.45690387563042067000, -0.81284668459161524000,
+    0.00000000000000000000, -0.47139673682599759000, -0.83146961230254512000,
+    0.00000000000000000000, -0.48576339371634003000, -0.84920218152657889000,
+    0.00000000000000000000, -0.49999999999999994000, -0.86602540378443860000,
+    0.00000000000000000000, -0.51410274419322177000, -0.88192126434835505000,
+    0.00000000000000000000, -0.52806785065036799000, -0.89687274153268837000,
+    0.00000000000000000000, -0.54189158057475173000, -0.91086382492117579000,
+    0.00000000000000000000, -0.55557023301960218000, -0.92387953251128674000,
+    0.00000000000000000000, -0.56910014587889823000, -0.93590592675732565000,
+    0.00000000000000000000, -0.58247769686780215000, -0.94693012949510558000,
+    0.00000000000000000000, -0.59569930449243325000, -0.95694033573220882000,
+    0.00000000000000000000, -0.60876142900872066000, -0.96592582628906831000,
+    0.00000000000000000000, -0.62166057337007730000, -0.97387697927733363000,
+    0.00000000000000000000, -0.63439328416364549000, -0.98078528040323043000,
+    0.00000000000000000000, -0.64695615253485728000, -0.98664333208487898000,
+    0.00000000000000000000, -0.65934581510006884000, -0.99144486137381038000,
+    0.00000000000000000000, -0.67155895484701844000, -0.99518472667219693000,
+    0.00000000000000000000, -0.68359230202287125000, -0.99785892323860348000,
+    0.00000000000000000000, -0.69544263500961168000, -0.99946458747636568000,
+    0.00000000000000000000, -0.70710678118654746000, -1.00000000000000000000,
+    0.00000000000000000000, -0.71858161777969798000, -0.99946458747636568000,
+    0.00000000000000000000, -0.72986407269783571000, -0.99785892323860348000,
+    0.00000000000000000000, -0.74095112535495899000, -0.99518472667219693000,
+    0.00000000000000000000, -0.75183980747897738000, -0.99144486137381038000,
+    0.00000000000000000000, -0.76252720390638806000, -0.98664333208487898000,
+    0.00000000000000000000, -0.77301045336273699000, -0.98078528040323043000,
+    0.00000000000000000000, -0.78328674922865038000, -0.97387697927733363000,
+    0.00000000000000000000, -0.79335334029123517000, -0.96592582628906831000,
+    0.00000000000000000000, -0.80320753148064483000, -0.95694033573220894000,
+    0.00000000000000000000, -0.81284668459161524000, -0.94693012949510569000,
+    0.00000000000000000000, -0.82226821898977509000, -0.93590592675732576000,
+    0.00000000000000000000, -0.83146961230254512000, -0.92387953251128685000,
+    0.00000000000000000000, -0.84044840109443797000, -0.91086382492117590000,
+    0.00000000000000000000, -0.84920218152657889000, -0.89687274153268837000,
+    0.00000000000000000000, -0.85772861000027212000, -0.88192126434835505000,
+    0.00000000000000000000, -0.86602540378443860000, -0.86602540378443871000,
+    0.00000000000000000000, -0.87409034162675880000, -0.84920218152657889000,
+    0.00000000000000000000, -0.88192126434835505000, -0.83146961230254512000,
+    0.00000000000000000000, -0.88951607542185596000, -0.81284668459161524000,
+    0.00000000000000000000, -0.89687274153268837000, -0.79335334029123517000,
+    0.00000000000000000000, -0.90398929312344334000, -0.77301045336273710000,
+    0.00000000000000000000, -0.91086382492117579000, -0.75183980747897738000,
+    0.00000000000000000000, -0.91749449644749137000, -0.72986407269783560000,
+    0.00000000000000000000, -0.92387953251128674000, -0.70710678118654757000,
+    0.00000000000000000000, -0.93001722368401207000, -0.68359230202287158000,
+    0.00000000000000000000, -0.93590592675732565000, -0.65934581510006895000,
+    0.00000000000000000000, -0.94154406518302081000, -0.63439328416364549000,
+    0.00000000000000000000, -0.94693012949510558000, -0.60876142900872088000,
+    0.00000000000000000000, -0.95206267771392428000, -0.58247769686780215000,
+    0.00000000000000000000, -0.95694033573220882000, -0.55557023301960251000,
+    0.00000000000000000000, -0.96156179768296191000, -0.52806785065036810000,
+    0.00000000000000000000, -0.96592582628906831000, -0.49999999999999994000,
+    0.00000000000000000000, -0.97003125319454397000, -0.47139673682599786000,
+    0.00000000000000000000, -0.97387697927733363000, -0.44228869021900169000,
+    0.00000000000000000000, -0.97746197494357190000, -0.41270702980439461000,
+    0.00000000000000000000, -0.98078528040323043000, -0.38268343236508989000,
+    0.00000000000000000000, -0.98384600592707738000, -0.35225004792123343000,
+    0.00000000000000000000, -0.98664333208487898000, -0.32143946530316175000,
+    0.00000000000000000000, -0.98917650996478090000, -0.29028467725446278000,
+    0.00000000000000000000, -0.99144486137381038000, -0.25881904510252102000,
+    0.00000000000000000000, -0.99344777901944437000, -0.22707626303437328000,
+    0.00000000000000000000, -0.99518472667219693000, -0.19509032201612816000,
+    0.00000000000000000000, -0.99665523930918032000, -0.16289547339458890000,
+    0.00000000000000000000, -0.99785892323860348000, -0.13052619222005199000,
+    0.00000000000000000000, -0.99879545620517241000, -0.09801714032956082600,
+    0.00000000000000000000, -0.99946458747636568000, -0.06540312923014311700,
+    0.00000000000000000000, -0.99986613790956180000, -0.03271908282177600500,
+    0.00000000000000000000, -1.00000000000000000000, -0.00000000000000012246,
+    0.00000000000000000000, -0.99986613790956180000, 0.03271908282177576200,
+    0.00000000000000000000, -0.99946458747636568000, 0.06540312923014286700,
+    0.00000000000000000000, -0.99879545620517241000, 0.09801714032956059000,
+    0.00000000000000000000, -0.99785892323860348000, 0.13052619222005177000,
+    0.00000000000000000000, -0.99665523930918032000, 0.16289547339458865000,
+    0.00000000000000000000, -0.99518472667219693000, 0.19509032201612792000,
+    0.00000000000000000000, -0.99344777901944437000, 0.22707626303437303000,
+    0.00000000000000000000, -0.99144486137381038000, 0.25881904510252079000,
+    0.00000000000000000000, -0.98917650996478090000, 0.29028467725446255000,
+    0.00000000000000000000, -0.98664333208487898000, 0.32143946530316153000,
+    0.00000000000000000000, -0.98384600592707749000, 0.35225004792123321000,
+    0.00000000000000000000, -0.98078528040323043000, 0.38268343236508967000,
+    0.00000000000000000000, -0.97746197494357190000, 0.41270702980439439000,
+    0.00000000000000000000, -0.97387697927733363000, 0.44228869021900147000,
+    0.00000000000000000000, -0.97003125319454397000, 0.47139673682599764000,
+    0.00000000000000000000, -0.96592582628906831000, 0.49999999999999972000,
+    0.00000000000000000000, -0.96156179768296202000, 0.52806785065036788000,
+    0.00000000000000000000, -0.95694033573220894000, 0.55557023301960196000,
+    0.00000000000000000000, -0.95206267771392417000, 0.58247769686780237000,
+    0.00000000000000000000, -0.94693012949510569000, 0.60876142900872066000,
+    0.00000000000000000000, -0.94154406518302081000, 0.63439328416364527000,
+    0.00000000000000000000, -0.93590592675732576000, 0.65934581510006884000,
+    0.00000000000000000000, -0.93001722368401218000, 0.68359230202287102000,
+    0.00000000000000000000, -0.92387953251128685000, 0.70710678118654713000,
+    0.00000000000000000000, -0.91749449644749126000, 0.72986407269783571000,
+    0.00000000000000000000, -0.91086382492117590000, 0.75183980747897727000,
+    0.00000000000000000000, -0.90398929312344345000, 0.77301045336273666000,
+    0.00000000000000000000, -0.89687274153268837000, 0.79335334029123494000,
+    0.00000000000000000000, -0.88951607542185607000, 0.81284668459161513000,
+    0.00000000000000000000, -0.88192126434835505000, 0.83146961230254524000,
+    0.00000000000000000000, -0.87409034162675880000, 0.84920218152657900000,
+    0.00000000000000000000, -0.86602540378443871000, 0.86602540378443837000,
+    0.00000000000000000000, -0.85772861000027212000, 0.88192126434835494000,
+    0.00000000000000000000, -0.84920218152657889000, 0.89687274153268826000,
+    0.00000000000000000000, -0.84044840109443797000, 0.91086382492117590000,
+    0.00000000000000000000, -0.83146961230254512000, 0.92387953251128685000,
+    0.00000000000000000000, -0.82226821898977520000, 0.93590592675732553000,
+    0.00000000000000000000, -0.81284668459161524000, 0.94693012949510558000,
+    0.00000000000000000000, -0.80320753148064494000, 0.95694033573220882000,
+    0.00000000000000000000, -0.79335334029123517000, 0.96592582628906831000,
+    0.00000000000000000000, -0.78328674922865027000, 0.97387697927733374000,
+    0.00000000000000000000, -0.77301045336273710000, 0.98078528040323032000,
+    0.00000000000000000000, -0.76252720390638817000, 0.98664333208487898000,
+    0.00000000000000000000, -0.75183980747897738000, 0.99144486137381038000,
+    0.00000000000000000000, -0.74095112535495933000, 0.99518472667219682000,
+    0.00000000000000000000, -0.72986407269783560000, 0.99785892323860348000,
+    0.00000000000000000000, -0.71858161777969820000, 0.99946458747636568000,
+    0.00000000000000000000, -0.70710678118654757000, 1.00000000000000000000,
+    0.00000000000000000000, -0.69544263500961168000, 0.99946458747636568000,
+    0.00000000000000000000, -0.68359230202287158000, 0.99785892323860359000,
+    0.00000000000000000000, -0.67155895484701822000, 0.99518472667219682000,
+    0.00000000000000000000, -0.65934581510006895000, 0.99144486137381049000,
+    0.00000000000000000000, -0.64695615253485739000, 0.98664333208487898000,
+    0.00000000000000000000, -0.63439328416364549000, 0.98078528040323043000,
+    0.00000000000000000000, -0.62166057337007763000, 0.97387697927733385000,
+    0.00000000000000000000, -0.60876142900872088000, 0.96592582628906842000,
+    0.00000000000000000000, -0.59569930449243347000, 0.95694033573220894000,
+    0.00000000000000000000, -0.58247769686780215000, 0.94693012949510569000,
+    0.00000000000000000000, -0.56910014587889823000, 0.93590592675732565000,
+    0.00000000000000000000, -0.55557023301960251000, 0.92387953251128696000,
+    0.00000000000000000000, -0.54189158057475195000, 0.91086382492117601000,
+    0.00000000000000000000, -0.52806785065036810000, 0.89687274153268848000,
+    0.00000000000000000000, -0.51410274419322177000, 0.88192126434835505000,
+    0.00000000000000000000, -0.49999999999999994000, 0.86602540378443860000,
+    0.00000000000000000000, -0.48576339371634031000, 0.84920218152657923000,
+    0.00000000000000000000, -0.47139673682599786000, 0.83146961230254546000,
+    0.00000000000000000000, -0.45690387563042079000, 0.81284668459161535000,
+    0.00000000000000000000, -0.44228869021900169000, 0.79335334029123572000,
+    0.00000000000000000000, -0.42755509343028242000, 0.77301045336273744000,
+    0.00000000000000000000, -0.41270702980439461000, 0.75183980747897716000,
+    0.00000000000000000000, -0.39774847452701084000, 0.72986407269783538000,
+    0.00000000000000000000, -0.38268343236508989000, 0.70710678118654768000,
+    0.00000000000000000000, -0.36751593659470361000, 0.68359230202287136000,
+    0.00000000000000000000, -0.35225004792123343000, 0.65934581510006873000,
+    0.00000000000000000000, -0.33688985339222033000, 0.63439328416364593000,
+    0.00000000000000000000, -0.32143946530316175000, 0.60876142900872088000,
+    0.00000000000000000000, -0.30590302009655357000, 0.58247769686780226000,
+    0.00000000000000000000, -0.29028467725446278000, 0.55557023301960295000,
+    0.00000000000000000000, -0.27458861818493269000, 0.52806785065036854000,
+    0.00000000000000000000, -0.25881904510252102000, 0.50000000000000044000,
+    0.00000000000000000000, -0.24298017990326362000, 0.47139673682599714000,
+    0.00000000000000000000, -0.22707626303437328000, 0.44228869021900141000,
+    0.00000000000000000000, -0.21111155235896514000, 0.41270702980439472000,
+    0.00000000000000000000, -0.19509032201612816000, 0.38268343236508956000,
+    0.00000000000000000000, -0.17901686127663291000, 0.35225004792123399000,
+    0.00000000000000000000, -0.16289547339458890000, 0.32143946530316186000,
+    0.00000000000000000000, -0.14673047445536180000, 0.29028467725446250000,
+    0.00000000000000000000, -0.13052619222005199000, 0.25881904510252157000,
+    0.00000000000000000000, -0.11428696496684672000, 0.22707626303437384000,
+    0.00000000000000000000, -0.09801714032956082600, 0.19509032201612872000,
+    0.00000000000000000000, -0.08172107413366791500, 0.16289547339458813000,
+    0.00000000000000000000, -0.06540312923014311700, 0.13052619222005168000,
+    0.00000000000000000000, -0.04906767432741796600, 0.09801714032956050600,
+    0.00000000000000000000, -0.03271908282177600500, 0.06540312923014279800,
+    0.00000000000000000000, -0.01636173162648699500, 0.03271908282177657400,
+    0.00000000000000000000, -0.00000000000000012246, 0.00000000000000024492,
+    0.00000000000000000000, 0.01636173162648675200,  -0.03271908282177608100,
+    0.00000000000000000000, 0.03271908282177576200,  -0.06540312923014229800,
+    0.00000000000000000000, 0.04906767432741772400,  -0.09801714032956002100,
+    0.00000000000000000000, 0.06540312923014286700,  -0.13052619222005118000,
+    0.00000000000000000000, 0.08172107413366767900,  -0.16289547339458765000,
+    0.00000000000000000000, 0.09801714032956059000,  -0.19509032201612825000,
+    0.00000000000000000000, 0.11428696496684647000,  -0.22707626303437337000,
+    0.00000000000000000000, 0.13052619222005177000,  -0.25881904510252107000,
+    0.00000000000000000000, 0.14673047445536158000,  -0.29028467725446200000,
+    0.00000000000000000000, 0.16289547339458865000,  -0.32143946530316142000,
+    0.00000000000000000000, 0.17901686127663269000,  -0.35225004792123349000,
+    0.00000000000000000000, 0.19509032201612792000,  -0.38268343236508912000,
+    0.00000000000000000000, 0.21111155235896492000,  -0.41270702980439428000,
+    0.00000000000000000000, 0.22707626303437303000,  -0.44228869021900097000,
+    0.00000000000000000000, 0.24298017990326337000,  -0.47139673682599675000,
+    0.00000000000000000000, 0.25881904510252079000,  -0.50000000000000000000,
+    0.00000000000000000000, 0.27458861818493246000,  -0.52806785065036821000,
+    0.00000000000000000000, 0.29028467725446255000,  -0.55557023301960251000,
+    0.00000000000000000000, 0.30590302009655329000,  -0.58247769686780193000,
+    0.00000000000000000000, 0.32143946530316153000,  -0.60876142900872054000,
+    0.00000000000000000000, 0.33688985339222011000,  -0.63439328416364560000,
+    0.00000000000000000000, 0.35225004792123321000,  -0.65934581510006840000,
+    0.00000000000000000000, 0.36751593659470333000,  -0.68359230202287091000,
+    0.00000000000000000000, 0.38268343236508967000,  -0.70710678118654735000,
+    0.00000000000000000000, 0.39774847452701062000,  -0.72986407269783504000,
+    0.00000000000000000000, 0.41270702980439439000,  -0.75183980747897683000,
+    0.00000000000000000000, 0.42755509343028220000,  -0.77301045336273710000,
+    0.00000000000000000000, 0.44228869021900147000,  -0.79335334029123550000,
+    0.00000000000000000000, 0.45690387563042056000,  -0.81284668459161502000,
+    0.00000000000000000000, 0.47139673682599764000,  -0.83146961230254524000,
+    0.00000000000000000000, 0.48576339371634009000,  -0.84920218152657900000,
+    0.00000000000000000000, 0.49999999999999972000,  -0.86602540378443837000,
+    0.00000000000000000000, 0.51410274419322155000,  -0.88192126434835483000,
+    0.00000000000000000000, 0.52806785065036788000,  -0.89687274153268826000,
+    0.00000000000000000000, 0.54189158057475129000,  -0.91086382492117546000,
+    0.00000000000000000000, 0.55557023301960196000,  -0.92387953251128652000,
+    0.00000000000000000000, 0.56910014587889801000,  -0.93590592675732553000,
+    0.00000000000000000000, 0.58247769686780237000,  -0.94693012949510580000,
+    0.00000000000000000000, 0.59569930449243325000,  -0.95694033573220882000,
+    0.00000000000000000000, 0.60876142900872066000,  -0.96592582628906831000,
+    0.00000000000000000000, 0.62166057337007752000,  -0.97387697927733374000,
+    0.00000000000000000000, 0.63439328416364527000,  -0.98078528040323032000,
+    0.00000000000000000000, 0.64695615253485728000,  -0.98664333208487898000,
+    0.00000000000000000000, 0.65934581510006884000,  -0.99144486137381038000,
+    0.00000000000000000000, 0.67155895484701811000,  -0.99518472667219682000,
+    0.00000000000000000000, 0.68359230202287102000,  -0.99785892323860348000,
+    0.00000000000000000000, 0.69544263500961145000,  -0.99946458747636557000,
+    0.00000000000000000000, 0.70710678118654713000,  -1.00000000000000000000,
+    0.00000000000000000000, 0.71858161777969798000,  -0.99946458747636568000,
+    0.00000000000000000000, 0.72986407269783571000,  -0.99785892323860348000,
+    0.00000000000000000000, 0.74095112535495922000,  -0.99518472667219682000,
+    0.00000000000000000000, 0.75183980747897727000,  -0.99144486137381049000,
+    0.00000000000000000000, 0.76252720390638806000,  -0.98664333208487909000,
+    0.00000000000000000000, 0.77301045336273666000,  -0.98078528040323065000,
+    0.00000000000000000000, 0.78328674922865038000,  -0.97387697927733363000,
+    0.00000000000000000000, 0.79335334029123494000,  -0.96592582628906842000,
+    0.00000000000000000000, 0.80320753148064450000,  -0.95694033573220927000,
+    0.00000000000000000000, 0.81284668459161513000,  -0.94693012949510569000,
+    0.00000000000000000000, 0.82226821898977531000,  -0.93590592675732542000,
+    0.00000000000000000000, 0.83146961230254524000,  -0.92387953251128674000,
+    0.00000000000000000000, 0.84044840109443786000,  -0.91086382492117601000,
+    0.00000000000000000000, 0.84920218152657900000,  -0.89687274153268803000,
+    0.00000000000000000000, 0.85772861000027201000,  -0.88192126434835516000,
+    0.00000000000000000000, 0.86602540378443837000,  -0.86602540378443915000,
+    0.00000000000000000000, 0.87409034162675892000,  -0.84920218152657878000,
+    0.00000000000000000000, 0.88192126434835494000,  -0.83146961230254557000,
+    0.00000000000000000000, 0.88951607542185573000,  -0.81284668459161591000,
+    0.00000000000000000000, 0.89687274153268826000,  -0.79335334029123528000,
+    0.00000000000000000000, 0.90398929312344312000,  -0.77301045336273755000,
+    0.00000000000000000000, 0.91086382492117590000,  -0.75183980747897727000,
+    0.00000000000000000000, 0.91749449644749126000,  -0.72986407269783604000,
+    0.00000000000000000000, 0.92387953251128685000,  -0.70710678118654713000,
+    0.00000000000000000000, 0.93001722368401207000,  -0.68359230202287136000,
+    0.00000000000000000000, 0.93590592675732553000,  -0.65934581510006951000,
+    0.00000000000000000000, 0.94154406518302081000,  -0.63439328416364538000,
+    0.00000000000000000000, 0.94693012949510558000,  -0.60876142900872099000,
+    0.00000000000000000000, 0.95206267771392405000,  -0.58247769686780315000,
+    0.00000000000000000000, 0.95694033573220882000,  -0.55557023301960229000,
+    0.00000000000000000000, 0.96156179768296179000,  -0.52806785065036865000,
+    0.00000000000000000000, 0.96592582628906831000,  -0.49999999999999978000,
+    0.00000000000000000000, 0.97003125319454397000,  -0.47139673682599803000,
+    0.00000000000000000000, 0.97387697927733374000,  -0.44228869021900075000,
+    0.00000000000000000000, 0.97746197494357190000,  -0.41270702980439483000,
+    0.00000000000000000000, 0.98078528040323032000,  -0.38268343236509050000,
+    0.00000000000000000000, 0.98384600592707749000,  -0.35225004792123327000,
+    0.00000000000000000000, 0.98664333208487898000,  -0.32143946530316198000,
+    0.00000000000000000000, 0.98917650996478090000,  -0.29028467725446344000,
+    0.00000000000000000000, 0.99144486137381038000,  -0.25881904510252079000,
+    0.00000000000000000000, 0.99344777901944437000,  -0.22707626303437395000,
+    0.00000000000000000000, 0.99518472667219682000,  -0.19509032201612972000,
+    0.00000000000000000000, 0.99665523930918032000,  -0.16289547339458912000,
+    0.00000000000000000000, 0.99785892323860348000,  -0.13052619222005094000,
+    0.00000000000000000000, 0.99879545620517241000,  -0.09801714032956063100,
+    0.00000000000000000000, 0.99946458747636568000,  -0.06540312923014379700,
+    0.00000000000000000000, 0.99986613790956180000,  -0.03271908282177580400,
+    0.00000000000000000000, 1.00000000000000000000,  -0.00000000000000036738,
+    0.00000000000000000000, 0.99986613790956180000,  0.03271908282177506800,
+    0.00000000000000000000, 0.99946458747636568000,  0.06540312923014306200,
+    0.00000000000000000000, 0.99879545620517241000,  0.09801714032955989600,
+    0.00000000000000000000, 0.99785892323860359000,  0.13052619222005019000,
+    0.00000000000000000000, 0.99665523930918032000,  0.16289547339458840000,
+    0.00000000000000000000, 0.99518472667219682000,  0.19509032201612900000,
+    0.00000000000000000000, 0.99344777901944437000,  0.22707626303437323000,
+    0.00000000000000000000, 0.99144486137381049000,  0.25881904510252013000,
+    0.00000000000000000000, 0.98917650996478090000,  0.29028467725446278000,
+    0.00000000000000000000, 0.98664333208487898000,  0.32143946530316131000,
+    0.00000000000000000000, 0.98384600592707749000,  0.35225004792123255000,
+    0.00000000000000000000, 0.98078528040323043000,  0.38268343236508984000,
+    0.00000000000000000000, 0.97746197494357190000,  0.41270702980439417000,
+    0.00000000000000000000, 0.97387697927733385000,  0.44228869021900008000,
+    0.00000000000000000000, 0.97003125319454397000,  0.47139673682599742000,
+    0.00000000000000000000, 0.96592582628906842000,  0.49999999999999917000,
+    0.00000000000000000000, 0.96156179768296191000,  0.52806785065036810000,
+    0.00000000000000000000, 0.95694033573220894000,  0.55557023301960173000,
+    0.00000000000000000000, 0.95206267771392417000,  0.58247769686780249000,
+    0.00000000000000000000, 0.94693012949510569000,  0.60876142900872043000,
+    0.00000000000000000000, 0.94154406518302092000,  0.63439328416364471000,
+    0.00000000000000000000, 0.93590592675732565000,  0.65934581510006895000,
+    0.00000000000000000000, 0.93001722368401218000,  0.68359230202287080000,
+    0.00000000000000000000, 0.92387953251128696000,  0.70710678118654657000,
+    0.00000000000000000000, 0.91749449644749137000,  0.72986407269783549000,
+    0.00000000000000000000, 0.91086382492117601000,  0.75183980747897683000,
+    0.00000000000000000000, 0.90398929312344334000,  0.77301045336273710000,
+    0.00000000000000000000, 0.89687274153268848000,  0.79335334029123483000,
+    0.00000000000000000000, 0.88951607542185596000,  0.81284668459161546000,
+    0.00000000000000000000, 0.88192126434835505000,  0.83146961230254512000,
+    0.00000000000000000000, 0.87409034162675903000,  0.84920218152657845000,
+    0.00000000000000000000, 0.86602540378443860000,  0.86602540378443871000,
+    0.00000000000000000000, 0.85772861000027223000,  0.88192126434835483000,
+    0.00000000000000000000, 0.84920218152657923000,  0.89687274153268781000,
+    0.00000000000000000000, 0.84044840109443808000,  0.91086382492117579000,
+    0.00000000000000000000, 0.83146961230254546000,  0.92387953251128641000,
+    0.00000000000000000000, 0.82226821898977553000,  0.93590592675732520000,
+    0.00000000000000000000, 0.81284668459161535000,  0.94693012949510547000,
+    0.00000000000000000000, 0.80320753148064472000,  0.95694033573220905000,
+    0.00000000000000000000, 0.79335334029123572000,  0.96592582628906776000,
+    0.00000000000000000000, 0.78328674922865060000,  0.97387697927733341000,
+    0.00000000000000000000, 0.77301045336273744000,  0.98078528040323010000,
+    0.00000000000000000000, 0.76252720390638828000,  0.98664333208487898000,
+    0.00000000000000000000, 0.75183980747897716000,  0.99144486137381049000,
+    0.00000000000000000000, 0.74095112535495911000,  0.99518472667219693000,
+    0.00000000000000000000, 0.72986407269783538000,  0.99785892323860359000,
+    0.00000000000000000000, 0.71858161777969853000,  0.99946458747636557000,
+    0.00000000000000000000, 0.70710678118654768000,  1.00000000000000000000,
+    0.00000000000000000000, 0.69544263500961201000,  0.99946458747636568000,
+    0.00000000000000000000, 0.68359230202287136000,  0.99785892323860348000,
+    0.00000000000000000000, 0.67155895484701866000,  0.99518472667219693000,
+    0.00000000000000000000, 0.65934581510006873000,  0.99144486137381038000,
+    0.00000000000000000000, 0.64695615253485816000,  0.98664333208487931000,
+    0.00000000000000000000, 0.63439328416364593000,  0.98078528040323065000,
+    0.00000000000000000000, 0.62166057337007741000,  0.97387697927733363000,
+    0.00000000000000000000, 0.60876142900872088000,  0.96592582628906842000,
+    0.00000000000000000000, 0.59569930449243325000,  0.95694033573220871000,
+    0.00000000000000000000, 0.58247769686780226000,  0.94693012949510580000,
+    0.00000000000000000000, 0.56910014587889790000,  0.93590592675732542000,
+    0.00000000000000000000, 0.55557023301960295000,  0.92387953251128740000,
+    0.00000000000000000000, 0.54189158057475206000,  0.91086382492117612000,
+    0.00000000000000000000, 0.52806785065036854000,  0.89687274153268892000,
+    0.00000000000000000000, 0.51410274419322188000,  0.88192126434835516000,
+    0.00000000000000000000, 0.50000000000000044000,  0.86602540378443915000,
+    0.00000000000000000000, 0.48576339371634003000,  0.84920218152657889000,
+    0.00000000000000000000, 0.47139673682599714000,  0.83146961230254457000,
+    0.00000000000000000000, 0.45690387563042129000,  0.81284668459161602000,
+    0.00000000000000000000, 0.44228869021900141000,  0.79335334029123539000,
+    0.00000000000000000000, 0.42755509343028253000,  0.77301045336273755000,
+    0.00000000000000000000, 0.41270702980439472000,  0.75183980747897738000,
+    0.00000000000000000000, 0.39774847452701134000,  0.72986407269783604000,
+    0.00000000000000000000, 0.38268343236508956000,  0.70710678118654724000,
+    0.00000000000000000000, 0.36751593659470450000,  0.68359230202287280000,
+    0.00000000000000000000, 0.35225004792123399000,  0.65934581510006962000,
+    0.00000000000000000000, 0.33688985339222000000,  0.63439328416364538000,
+    0.00000000000000000000, 0.32143946530316186000,  0.60876142900872110000,
+    0.00000000000000000000, 0.30590302009655324000,  0.58247769686780182000,
+    0.00000000000000000000, 0.29028467725446250000,  0.55557023301960240000,
+    0.00000000000000000000, 0.27458861818493197000,  0.52806785065036732000,
+    0.00000000000000000000, 0.25881904510252157000,  0.50000000000000144000,
+    0.00000000000000000000, 0.24298017990326418000,  0.47139673682599814000,
+    0.00000000000000000000, 0.22707626303437384000,  0.44228869021900241000,
+    0.00000000000000000000, 0.21111155235896528000,  0.41270702980439494000,
+    0.00000000000000000000, 0.19509032201612872000,  0.38268343236509061000,
+    0.00000000000000000000, 0.17901686127663261000,  0.35225004792123338000,
+    0.00000000000000000000, 0.16289547339458813000,  0.32143946530316042000,
+    0.00000000000000000000, 0.14673047445536239000,  0.29028467725446355000,
+    0.00000000000000000000, 0.13052619222005168000,  0.25881904510252096000,
+    0.00000000000000000000, 0.11428696496684684000,  0.22707626303437406000,
+    0.00000000000000000000, 0.09801714032956050600,  0.19509032201612808000,
+    0.00000000000000000000, 0.08172107413366848400,  0.16289547339458926000,
+    0.00000000000000000000, 0.06540312923014279800,  0.13052619222005105000,
+    0.00000000000000000000, 0.04906767432741897900,  0.09801714032956251900,
+    0.00000000000000000000, 0.03271908282177657400,  0.06540312923014392200,
+    0.00000000000000000000, 0.01636173162648756400,  0.03271908282177770500,
+    0.00000000000000000000, 0.00000000000000024492,  0.00000000000000048984};
+
+const FLOAT32 ixheaacd_twid_tbl_fft_224[372] = {
+    -0.028046f, 0.999607f,  -0.056070f, 0.998427f,  -0.084051f, 0.996461f,  -0.111964f,
+    0.993712f,  -0.139790f, 0.990181f,  -0.167506f, 0.985871f,  -0.056070f, 0.998427f,
+    -0.111964f, 0.993712f,  -0.167506f, 0.985871f,  -0.222521f, 0.974928f,  -0.276836f,
+    0.960917f,  -0.330279f, 0.943883f,  -0.084051f, 0.996461f,  -0.167506f, 0.985871f,
+    -0.249776f, 0.968304f,  -0.330279f, 0.943883f,  -0.408444f, 0.912783f,  -0.483719f,
+    0.875223f,  -0.111964f, 0.993712f,  -0.222521f, 0.974928f,  -0.330279f, 0.943883f,
+    -0.433884f, 0.900969f,  -0.532032f, 0.846724f,  -0.623490f, 0.781831f,  -0.139790f,
+    0.990181f,  -0.276836f, 0.960917f,  -0.408444f, 0.912783f,  -0.532032f, 0.846724f,
+    -0.645172f, 0.764037f,  -0.745642f, 0.666347f,  -0.167506f, 0.985871f,  -0.330279f,
+    0.943883f,  -0.483719f, 0.875223f,  -0.623490f, 0.781831f,  -0.745642f, 0.666347f,
+    -0.846724f, 0.532032f,  -0.195090f, 0.980785f,  -0.382683f, 0.923880f,  -0.555570f,
+    0.831470f,  -0.707107f, 0.707107f,  -0.831470f, 0.555570f,  -0.923880f, 0.382683f,
+    -0.222521f, 0.974928f,  -0.433884f, 0.900969f,  -0.623490f, 0.781831f,  -0.781831f,
+    0.623490f,  -0.900969f, 0.433884f,  -0.974928f, 0.222521f,  -0.249776f, 0.968304f,
+    -0.483719f, 0.875223f,  -0.686997f, 0.726660f,  -0.846724f, 0.532032f,  -0.952775f,
+    0.303677f,  -0.998427f, 0.056070f,  -0.276836f, 0.960917f,  -0.532032f, 0.846724f,
+    -0.745642f, 0.666347f,  -0.900969f, 0.433884f,  -0.985871f, 0.167506f,  -0.993712f,
+    -0.111964f, -0.303677f, 0.952775f,  -0.578671f, 0.815561f,  -0.799010f, 0.601317f,
+    -0.943883f, 0.330279f,  -0.999607f, 0.028046f,  -0.960917f, -0.276836f, -0.330279f,
+    0.943883f,  -0.623490f, 0.781831f,  -0.846724f, 0.532032f,  -0.974928f, 0.222521f,
+    -0.993712f, -0.111964f, -0.900969f, -0.433884f, -0.356622f, 0.934249f,  -0.666347f,
+    0.745642f,  -0.888446f, 0.458982f,  -0.993712f, 0.111964f,  -0.968304f, -0.249776f,
+    -0.815561f, -0.578671f, -0.382683f, 0.923880f,  -0.707107f, 0.707107f,  -0.923880f,
+    0.382683f,  -1.000000f, 0.000000f,  -0.923880f, -0.382683f, -0.707107f, -0.707107f,
+    -0.408444f, 0.912783f,  -0.745642f, 0.666347f,  -0.952775f, 0.303677f,  -0.993712f,
+    -0.111964f, -0.861313f, -0.508075f, -0.578671f, -0.815561f, -0.433884f, 0.900969f,
+    -0.781831f, 0.623490f,  -0.974928f, 0.222521f,  -0.974928f, -0.222521f, -0.781831f,
+    -0.623490f, -0.433884f, -0.900969f, -0.458982f, 0.888446f,  -0.815561f, 0.578671f,
+    -0.990181f, 0.139790f,  -0.943883f, -0.330279f, -0.686997f, -0.726660f, -0.276836f,
+    -0.960917f, -0.483719f, 0.875223f,  -0.846724f, 0.532032f,  -0.998427f, 0.056070f,
+    -0.900969f, -0.433884f, -0.578671f, -0.815561f, -0.111964f, -0.993712f, -0.508075f,
+    0.861313f,  -0.875223f, 0.483719f,  -0.999607f, -0.028046f, -0.846724f, -0.532032f,
+    -0.458982f, -0.888446f, 0.056070f,  -0.998427f, -0.532032f, 0.846724f,  -0.900969f,
+    0.433884f,  -0.993712f, -0.111964f, -0.781831f, -0.623490f, -0.330279f, -0.943883f,
+    0.222521f,  -0.974928f, -0.555570f, 0.831470f,  -0.923880f, 0.382683f,  -0.980785f,
+    -0.195090f, -0.707107f, -0.707107f, -0.195090f, -0.980785f, 0.382683f,  -0.923880f,
+    -0.578671f, 0.815561f,  -0.943883f, 0.330279f,  -0.960917f, -0.276836f, -0.623490f,
+    -0.781831f, -0.056070f, -0.998427f, 0.532032f,  -0.846724f, -0.601317f, 0.799010f,
+    -0.960917f, 0.276836f,  -0.934249f, -0.356622f, -0.532032f, -0.846724f, 0.084051f,
+    -0.996461f, 0.666347f,  -0.745642f, -0.623490f, 0.781831f,  -0.974928f, 0.222521f,
+    -0.900969f, -0.433884f, -0.433884f, -0.900969f, 0.222521f,  -0.974928f, 0.781831f,
+    -0.623490f, -0.645172f, 0.764037f,  -0.985871f, 0.167506f,  -0.861313f, -0.508075f,
+    -0.330279f, -0.943883f, 0.356622f,  -0.934249f, 0.875223f,  -0.483719f, -0.666347f,
+    0.745642f,  -0.993712f, 0.111964f,  -0.815561f, -0.578671f, -0.222521f, -0.974928f,
+    0.483719f,  -0.875223f, 0.943883f,  -0.330279f, -0.686997f, 0.726660f,  -0.998427f,
+    0.056070f,  -0.764037f, -0.645172f, -0.111964f, -0.993712f, 0.601317f,  -0.799010f,
+    0.985871f,  -0.167506f, -0.707107f, 0.707107f,  -1.000000f, 0.000000f,  -0.707107f,
+    -0.707107f, -0.000000f, -1.000000f, 0.707107f,  -0.707107f, 1.000000f,  -0.000000f,
+    -0.726660f, 0.686997f,  -0.998427f, -0.056070f, -0.645172f, -0.764037f, 0.111964f,
+    -0.993712f, 0.799010f,  -0.601317f, 0.985871f,  0.167506f,  -0.745642f, 0.666347f,
+    -0.993712f, -0.111964f, -0.578671f, -0.815561f, 0.222521f,  -0.974928f, 0.875223f,
+    -0.483719f, 0.943883f,  0.330279f,  -0.764037f, 0.645172f,  -0.985871f, -0.167506f,
+    -0.508075f, -0.861313f, 0.330279f,  -0.943883f, 0.934249f,  -0.356622f, 0.875223f,
+    0.483719f};
+
+const FLOAT32 ixheaacd_twid_tbl_fft_288[380] = {
+    -0.021815f, 0.999762f,  -0.043619f, 0.999048f,  -0.043619f, 0.999048f,  -0.087156f,
+    0.996195f,  -0.065403f, 0.997859f,  -0.130526f, 0.991445f,  -0.087156f, 0.996195f,
+    -0.173648f, 0.984808f,  -0.108867f, 0.994056f,  -0.216440f, 0.976296f,  -0.130526f,
+    0.991445f,  -0.258819f, 0.965926f,  -0.152123f, 0.988362f,  -0.300706f, 0.953717f,
+    -0.173648f, 0.984808f,  -0.342020f, 0.939693f,  -0.195090f, 0.980785f,  -0.382683f,
+    0.923880f,  -0.216440f, 0.976296f,  -0.422618f, 0.906308f,  -0.237686f, 0.971342f,
+    -0.461749f, 0.887011f,  -0.258819f, 0.965926f,  -0.500000f, 0.866025f,  -0.279829f,
+    0.960050f,  -0.537300f, 0.843391f,  -0.300706f, 0.953717f,  -0.573576f, 0.819152f,
+    -0.321439f, 0.946930f,  -0.608761f, 0.793353f,  -0.342020f, 0.939693f,  -0.642788f,
+    0.766044f,  -0.362438f, 0.932008f,  -0.675590f, 0.737277f,  -0.382683f, 0.923880f,
+    -0.707107f, 0.707107f,  -0.402747f, 0.915311f,  -0.737277f, 0.675590f,  -0.422618f,
+    0.906308f,  -0.766044f, 0.642788f,  -0.442289f, 0.896873f,  -0.793353f, 0.608761f,
+    -0.461749f, 0.887011f,  -0.819152f, 0.573576f,  -0.480989f, 0.876727f,  -0.843391f,
+    0.537300f,  -0.500000f, 0.866025f,  -0.866025f, 0.500000f,  -0.518773f, 0.854912f,
+    -0.887011f, 0.461749f,  -0.537300f, 0.843391f,  -0.906308f, 0.422618f,  -0.555570f,
+    0.831470f,  -0.923880f, 0.382683f,  -0.573576f, 0.819152f,  -0.939693f, 0.342020f,
+    -0.591310f, 0.806445f,  -0.953717f, 0.300706f,  -0.608761f, 0.793353f,  -0.965926f,
+    0.258819f,  -0.625923f, 0.779884f,  -0.976296f, 0.216440f,  -0.642788f, 0.766044f,
+    -0.984808f, 0.173648f,  -0.659346f, 0.751840f,  -0.991445f, 0.130526f,  -0.675590f,
+    0.737277f,  -0.996195f, 0.087156f,  -0.691513f, 0.722364f,  -0.999048f, 0.043619f,
+    -0.707107f, 0.707107f,  -1.000000f, 0.000000f,  -0.722364f, 0.691513f,  -0.999048f,
+    -0.043619f, -0.737277f, 0.675590f,  -0.996195f, -0.087156f, -0.751840f, 0.659346f,
+    -0.991445f, -0.130526f, -0.766044f, 0.642788f,  -0.984808f, -0.173648f, -0.779884f,
+    0.625923f,  -0.976296f, -0.216440f, -0.793353f, 0.608761f,  -0.965926f, -0.258819f,
+    -0.806445f, 0.591310f,  -0.953717f, -0.300706f, -0.819152f, 0.573576f,  -0.939693f,
+    -0.342020f, -0.831470f, 0.555570f,  -0.923880f, -0.382683f, -0.843391f, 0.537300f,
+    -0.906308f, -0.422618f, -0.854912f, 0.518773f,  -0.887011f, -0.461749f, -0.866025f,
+    0.500000f,  -0.866025f, -0.500000f, -0.876727f, 0.480989f,  -0.843391f, -0.537300f,
+    -0.887011f, 0.461749f,  -0.819152f, -0.573576f, -0.896873f, 0.442289f,  -0.793353f,
+    -0.608761f, -0.906308f, 0.422618f,  -0.766044f, -0.642788f, -0.915311f, 0.402747f,
+    -0.737277f, -0.675590f, -0.923880f, 0.382683f,  -0.707107f, -0.707107f, -0.932008f,
+    0.362438f,  -0.675590f, -0.737277f, -0.939693f, 0.342020f,  -0.642788f, -0.766044f,
+    -0.946930f, 0.321439f,  -0.608761f, -0.793353f, -0.953717f, 0.300706f,  -0.573576f,
+    -0.819152f, -0.960050f, 0.279829f,  -0.537300f, -0.843391f, -0.965926f, 0.258819f,
+    -0.500000f, -0.866025f, -0.971342f, 0.237686f,  -0.461749f, -0.887011f, -0.976296f,
+    0.216440f,  -0.422618f, -0.906308f, -0.980785f, 0.195090f,  -0.382683f, -0.923880f,
+    -0.984808f, 0.173648f,  -0.342020f, -0.939693f, -0.988362f, 0.152123f,  -0.300706f,
+    -0.953717f, -0.991445f, 0.130526f,  -0.258819f, -0.965926f, -0.994056f, 0.108867f,
+    -0.216440f, -0.976296f, -0.996195f, 0.087156f,  -0.173648f, -0.984808f, -0.997859f,
+    0.065403f,  -0.130526f, -0.991445f, -0.999048f, 0.043619f,  -0.087156f, -0.996195f,
+    -0.999762f, 0.021815f,  -0.043619f, -0.999048f, -1.000000f, 0.000000f,  -0.000000f,
+    -1.000000f, -0.999762f, -0.021815f, 0.043619f,  -0.999048f, -0.999048f, -0.043619f,
+    0.087156f,  -0.996195f, -0.997859f, -0.065403f, 0.130526f,  -0.991445f, -0.996195f,
+    -0.087156f, 0.173648f,  -0.984808f, -0.994056f, -0.108867f, 0.216440f,  -0.976296f,
+    -0.991445f, -0.130526f, 0.258819f,  -0.965926f, -0.988362f, -0.152123f, 0.300706f,
+    -0.953717f, -0.984808f, -0.173648f, 0.342020f,  -0.939693f, -0.980785f, -0.195090f,
+    0.382683f,  -0.923880f, -0.976296f, -0.216440f, 0.422618f,  -0.906308f, -0.971342f,
+    -0.237686f, 0.461749f,  -0.887011f, -0.965926f, -0.258819f, 0.500000f,  -0.866025f,
+    -0.960050f, -0.279829f, 0.537300f,  -0.843391f, -0.953717f, -0.300706f, 0.573576f,
+    -0.819152f, -0.946930f, -0.321439f, 0.608761f,  -0.793353f, -0.939693f, -0.342020f,
+    0.642788f,  -0.766044f, -0.932008f, -0.362438f, 0.675590f,  -0.737277f, -0.923880f,
+    -0.382683f, 0.707107f,  -0.707107f, -0.915311f, -0.402747f, 0.737277f,  -0.675590f,
+    -0.906308f, -0.422618f, 0.766044f,  -0.642788f, -0.896873f, -0.442289f, 0.793353f,
+    -0.608761f, -0.887011f, -0.461749f, 0.819152f,  -0.573576f, -0.876727f, -0.480989f,
+    0.843391f,  -0.537300f};
+
+const FLOAT32 ixheaacd_twid_tbl_fft_336[564] = {
+    -0.018699f, 0.999825f,  -0.037391f, 0.999301f,  -0.056070f, 0.998427f,  -0.074730f,
+    0.997204f,  -0.093364f, 0.995632f,  -0.111964f, 0.993712f,  -0.130526f, 0.991445f,
+    -0.149042f, 0.988831f,  -0.167506f, 0.985871f,  -0.185912f, 0.982566f,  -0.204252f,
+    0.978918f,  -0.222521f, 0.974928f,  -0.240712f, 0.970597f,  -0.258819f, 0.965926f,
+    -0.276836f, 0.960917f,  -0.294755f, 0.955573f,  -0.312572f, 0.949894f,  -0.330279f,
+    0.943883f,  -0.347871f, 0.937542f,  -0.365341f, 0.930874f,  -0.382683f, 0.923880f,
+    -0.399892f, 0.916562f,  -0.416961f, 0.908924f,  -0.433884f, 0.900969f,  -0.450655f,
+    0.892698f,  -0.467269f, 0.884115f,  -0.483719f, 0.875223f,  -0.500000f, 0.866025f,
+    -0.516106f, 0.856525f,  -0.532032f, 0.846724f,  -0.547772f, 0.836628f,  -0.563320f,
+    0.826239f,  -0.578671f, 0.815561f,  -0.593820f, 0.804598f,  -0.608761f, 0.793353f,
+    -0.623490f, 0.781832f,  -0.638000f, 0.770036f,  -0.652287f, 0.757972f,  -0.666347f,
+    0.745642f,  -0.680173f, 0.733052f,  -0.693761f, 0.720205f,  -0.707107f, 0.707107f,
+    -0.720205f, 0.693761f,  -0.733052f, 0.680173f,  -0.745642f, 0.666347f,  -0.757972f,
+    0.652287f,  -0.770036f, 0.638000f,  -0.037391f, 0.999301f,  -0.074730f, 0.997204f,
+    -0.111964f, 0.993712f,  -0.149042f, 0.988831f,  -0.185912f, 0.982566f,  -0.222521f,
+    0.974928f,  -0.258819f, 0.965926f,  -0.294755f, 0.955573f,  -0.330279f, 0.943883f,
+    -0.365341f, 0.930874f,  -0.399892f, 0.916562f,  -0.433884f, 0.900969f,  -0.467269f,
+    0.884115f,  -0.500000f, 0.866025f,  -0.532032f, 0.846724f,  -0.563320f, 0.826239f,
+    -0.593820f, 0.804598f,  -0.623490f, 0.781832f,  -0.652287f, 0.757972f,  -0.680173f,
+    0.733052f,  -0.707107f, 0.707107f,  -0.733052f, 0.680173f,  -0.757972f, 0.652287f,
+    -0.781832f, 0.623490f,  -0.804598f, 0.593820f,  -0.826239f, 0.563320f,  -0.846724f,
+    0.532032f,  -0.866025f, 0.500000f,  -0.884115f, 0.467269f,  -0.900969f, 0.433884f,
+    -0.916562f, 0.399892f,  -0.930874f, 0.365341f,  -0.943883f, 0.330279f,  -0.955573f,
+    0.294755f,  -0.965926f, 0.258819f,  -0.974928f, 0.222521f,  -0.982566f, 0.185912f,
+    -0.988831f, 0.149042f,  -0.993712f, 0.111964f,  -0.997204f, 0.074730f,  -0.999301f,
+    0.037391f,  -1.000000f, 0.000000f,  -0.999301f, -0.037391f, -0.997204f, -0.074730f,
+    -0.993712f, -0.111964f, -0.988831f, -0.149042f, -0.982566f, -0.185912f, -0.056070f,
+    0.998427f,  -0.111964f, 0.993712f,  -0.167506f, 0.985871f,  -0.222521f, 0.974928f,
+    -0.276836f, 0.960917f,  -0.330279f, 0.943883f,  -0.382683f, 0.923880f,  -0.433884f,
+    0.900969f,  -0.483719f, 0.875223f,  -0.532032f, 0.846724f,  -0.578671f, 0.815561f,
+    -0.623490f, 0.781832f,  -0.666347f, 0.745642f,  -0.707107f, 0.707107f,  -0.745642f,
+    0.666347f,  -0.781832f, 0.623490f,  -0.815561f, 0.578671f,  -0.846724f, 0.532032f,
+    -0.875223f, 0.483719f,  -0.900969f, 0.433884f,  -0.923880f, 0.382683f,  -0.943883f,
+    0.330279f,  -0.960917f, 0.276836f,  -0.974928f, 0.222521f,  -0.985871f, 0.167506f,
+    -0.993712f, 0.111964f,  -0.998427f, 0.056070f,  -1.000000f, 0.000000f,  -0.998427f,
+    -0.056070f, -0.993712f, -0.111964f, -0.985871f, -0.167506f, -0.974928f, -0.222521f,
+    -0.960917f, -0.276836f, -0.943883f, -0.330279f, -0.923880f, -0.382683f, -0.900969f,
+    -0.433884f, -0.875223f, -0.483719f, -0.846724f, -0.532032f, -0.815561f, -0.578671f,
+    -0.781832f, -0.623490f, -0.745642f, -0.666347f, -0.707107f, -0.707107f, -0.666347f,
+    -0.745642f, -0.623490f, -0.781832f, -0.578671f, -0.815561f, -0.532032f, -0.846724f,
+    -0.483719f, -0.875223f, -0.074730f, 0.997204f,  -0.149042f, 0.988831f,  -0.222521f,
+    0.974928f,  -0.294755f, 0.955573f,  -0.365341f, 0.930874f,  -0.433884f, 0.900969f,
+    -0.500000f, 0.866025f,  -0.563320f, 0.826239f,  -0.623490f, 0.781832f,  -0.680173f,
+    0.733052f,  -0.733052f, 0.680173f,  -0.781832f, 0.623490f,  -0.826239f, 0.563320f,
+    -0.866025f, 0.500000f,  -0.900969f, 0.433884f,  -0.930874f, 0.365341f,  -0.955573f,
+    0.294755f,  -0.974928f, 0.222521f,  -0.988831f, 0.149042f,  -0.997204f, 0.074730f,
+    -1.000000f, 0.000000f,  -0.997204f, -0.074730f, -0.988831f, -0.149042f, -0.974928f,
+    -0.222521f, -0.955573f, -0.294755f, -0.930874f, -0.365341f, -0.900969f, -0.433884f,
+    -0.866025f, -0.500000f, -0.826239f, -0.563320f, -0.781832f, -0.623490f, -0.733052f,
+    -0.680173f, -0.680173f, -0.733052f, -0.623490f, -0.781832f, -0.563320f, -0.826239f,
+    -0.500000f, -0.866025f, -0.433884f, -0.900969f, -0.365341f, -0.930874f, -0.294755f,
+    -0.955573f, -0.222521f, -0.974928f, -0.149042f, -0.988831f, -0.074730f, -0.997204f,
+    -0.000000f, -1.000000f, 0.074730f,  -0.997204f, 0.149042f,  -0.988831f, 0.222521f,
+    -0.974928f, 0.294755f,  -0.955573f, 0.365341f,  -0.930874f, -0.093364f, 0.995632f,
+    -0.185912f, 0.982566f,  -0.276836f, 0.960917f,  -0.365341f, 0.930874f,  -0.450655f,
+    0.892698f,  -0.532032f, 0.846724f,  -0.608761f, 0.793353f,  -0.680173f, 0.733052f,
+    -0.745642f, 0.666347f,  -0.804598f, 0.593820f,  -0.856525f, 0.516106f,  -0.900969f,
+    0.433884f,  -0.937542f, 0.347871f,  -0.965926f, 0.258819f,  -0.985871f, 0.167506f,
+    -0.997204f, 0.074730f,  -0.999825f, -0.018699f, -0.993712f, -0.111964f, -0.978918f,
+    -0.204252f, -0.955573f, -0.294755f, -0.923880f, -0.382683f, -0.884115f, -0.467269f,
+    -0.836628f, -0.547772f, -0.781832f, -0.623490f, -0.720205f, -0.693761f, -0.652287f,
+    -0.757972f, -0.578671f, -0.815561f, -0.500000f, -0.866025f, -0.416961f, -0.908924f,
+    -0.330279f, -0.943883f, -0.240712f, -0.970597f, -0.149042f, -0.988831f, -0.056070f,
+    -0.998427f, 0.037391f,  -0.999301f, 0.130526f,  -0.991445f, 0.222521f,  -0.974928f,
+    0.312572f,  -0.949894f, 0.399892f,  -0.916562f, 0.483719f,  -0.875223f, 0.563320f,
+    -0.826239f, 0.638000f,  -0.770036f, 0.707107f,  -0.707107f, 0.770036f,  -0.638000f,
+    0.826239f,  -0.563320f, 0.875223f,  -0.483719f, 0.916562f,  -0.399892f, 0.949894f,
+    -0.312572f, -0.111964f, 0.993712f,  -0.222521f, 0.974928f,  -0.330279f, 0.943883f,
+    -0.433884f, 0.900969f,  -0.532032f, 0.846724f,  -0.623490f, 0.781832f,  -0.707107f,
+    0.707107f,  -0.781832f, 0.623490f,  -0.846724f, 0.532032f,  -0.900969f, 0.433884f,
+    -0.943883f, 0.330279f,  -0.974928f, 0.222521f,  -0.993712f, 0.111964f,  -1.000000f,
+    0.000000f,  -0.993712f, -0.111964f, -0.974928f, -0.222521f, -0.943883f, -0.330279f,
+    -0.900969f, -0.433884f, -0.846724f, -0.532032f, -0.781832f, -0.623490f, -0.707107f,
+    -0.707107f, -0.623490f, -0.781832f, -0.532032f, -0.846724f, -0.433884f, -0.900969f,
+    -0.330279f, -0.943883f, -0.222521f, -0.974928f, -0.111964f, -0.993712f, -0.000000f,
+    -1.000000f, 0.111964f,  -0.993712f, 0.222521f,  -0.974928f, 0.330279f,  -0.943883f,
+    0.433884f,  -0.900969f, 0.532032f,  -0.846724f, 0.623490f,  -0.781832f, 0.707107f,
+    -0.707107f, 0.781832f,  -0.623490f, 0.846724f,  -0.532032f, 0.900969f,  -0.433884f,
+    0.943883f,  -0.330279f, 0.974928f,  -0.222521f, 0.993712f,  -0.111964f, 1.000000f,
+    -0.000000f, 0.993712f,  0.111964f,  0.974928f,  0.222521f,  0.943883f,  0.330279f,
+    0.900969f,  0.433884f,  0.846724f,  0.532032f
+
+};
+
+const FLOAT32 ixheaacd_twid_tbl_fft_168[276] = {
+    -0.037391f, 0.999301f,  -0.074730f, 0.997204f,  -0.111964f, 0.993712f,  -0.149042f,
+    0.988831f,  -0.185912f, 0.982566f,  -0.222521f, 0.974928f,  -0.258819f, 0.965926f,
+    -0.294755f, 0.955573f,  -0.330279f, 0.943883f,  -0.365341f, 0.930874f,  -0.399892f,
+    0.916562f,  -0.433884f, 0.900969f,  -0.467269f, 0.884115f,  -0.500000f, 0.866025f,
+    -0.532032f, 0.846724f,  -0.563320f, 0.826239f,  -0.593820f, 0.804598f,  -0.623490f,
+    0.781832f,  -0.652287f, 0.757972f,  -0.680173f, 0.733052f,  -0.707107f, 0.707107f,
+    -0.733052f, 0.680173f,  -0.757972f, 0.652287f,  -0.074730f, 0.997204f,  -0.149042f,
+    0.988831f,  -0.222521f, 0.974928f,  -0.294755f, 0.955573f,  -0.365341f, 0.930874f,
+    -0.433884f, 0.900969f,  -0.500000f, 0.866025f,  -0.563320f, 0.826239f,  -0.623490f,
+    0.781832f,  -0.680173f, 0.733052f,  -0.733052f, 0.680173f,  -0.781832f, 0.623490f,
+    -0.826239f, 0.563320f,  -0.866025f, 0.500000f,  -0.900969f, 0.433884f,  -0.930874f,
+    0.365341f,  -0.955573f, 0.294755f,  -0.974928f, 0.222521f,  -0.988831f, 0.149042f,
+    -0.997204f, 0.074730f,  -1.000000f, 0.000000f,  -0.997204f, -0.074730f, -0.988831f,
+    -0.149042f, -0.111964f, 0.993712f,  -0.222521f, 0.974928f,  -0.330279f, 0.943883f,
+    -0.433884f, 0.900969f,  -0.532032f, 0.846724f,  -0.623490f, 0.781832f,  -0.707107f,
+    0.707107f,  -0.781832f, 0.623490f,  -0.846724f, 0.532032f,  -0.900969f, 0.433884f,
+    -0.943883f, 0.330279f,  -0.974928f, 0.222521f,  -0.993712f, 0.111964f,  -1.000000f,
+    0.000000f,  -0.993712f, -0.111964f, -0.974928f, -0.222521f, -0.943883f, -0.330279f,
+    -0.900969f, -0.433884f, -0.846724f, -0.532032f, -0.781832f, -0.623490f, -0.707107f,
+    -0.707107f, -0.623490f, -0.781832f, -0.532032f, -0.846724f, -0.149042f, 0.988831f,
+    -0.294755f, 0.955573f,  -0.433884f, 0.900969f,  -0.563320f, 0.826239f,  -0.680173f,
+    0.733052f,  -0.781832f, 0.623490f,  -0.866025f, 0.500000f,  -0.930874f, 0.365341f,
+    -0.974928f, 0.222521f,  -0.997204f, 0.074730f,  -0.997204f, -0.074730f, -0.974928f,
+    -0.222521f, -0.930874f, -0.365341f, -0.866025f, -0.500000f, -0.781832f, -0.623490f,
+    -0.680173f, -0.733052f, -0.563320f, -0.826239f, -0.433884f, -0.900969f, -0.294755f,
+    -0.955573f, -0.149042f, -0.988831f, -0.000000f, -1.000000f, 0.149042f,  -0.988831f,
+    0.294755f,  -0.955573f, -0.185912f, 0.982566f,  -0.365341f, 0.930874f,  -0.532032f,
+    0.846724f,  -0.680173f, 0.733052f,  -0.804598f, 0.593820f,  -0.900969f, 0.433884f,
+    -0.965926f, 0.258819f,  -0.997204f, 0.074730f,  -0.993712f, -0.111964f, -0.955573f,
+    -0.294755f, -0.884115f, -0.467269f, -0.781832f, -0.623490f, -0.652287f, -0.757972f,
+    -0.500000f, -0.866025f, -0.330279f, -0.943883f, -0.149042f, -0.988831f, 0.037391f,
+    -0.999301f, 0.222521f,  -0.974928f, 0.399892f,  -0.916562f, 0.563320f,  -0.826239f,
+    0.707107f,  -0.707107f, 0.826239f,  -0.563320f, 0.916562f,  -0.399892f, -0.222521f,
+    0.974928f,  -0.433884f, 0.900969f,  -0.623490f, 0.781832f,  -0.781832f, 0.623490f,
+    -0.900969f, 0.433884f,  -0.974928f, 0.222521f,  -1.000000f, 0.000000f,  -0.974928f,
+    -0.222521f, -0.900969f, -0.433884f, -0.781832f, -0.623490f, -0.623490f, -0.781832f,
+    -0.433884f, -0.900969f, -0.222521f, -0.974928f, -0.000000f, -1.000000f, 0.222521f,
+    -0.974928f, 0.433884f,  -0.900969f, 0.623490f,  -0.781832f, 0.781832f,  -0.623490f,
+    0.900969f,  -0.433884f, 0.974928f,  -0.222521f, 1.000000f,  -0.000000f, 0.974928f,
+    0.222521f,  0.900969f,  0.433884f,
+
+};
\ No newline at end of file
diff --git a/decoder/ixheaacd_fft_ifft_rom.h b/decoder/ixheaacd_fft_ifft_rom.h
new file mode 100644
index 0000000..8a67d61
--- /dev/null
+++ b/decoder/ixheaacd_fft_ifft_rom.h
@@ -0,0 +1,31 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_FFT_IFFT_ROM_H
+#define IXHEAACD_FFT_IFFT_ROM_H
+
+extern const FLOAT64 ixheaacd_twid_tbl_fft_double[514];
+extern const FLOAT64 ixheaacd_twid_tbl_fft_ntwt3r[1155];
+extern const FLOAT64 ixheaacd_twid_tbl_fft_ntwt3i[1155];
+extern const FLOAT32 ixheaacd_twid_tbl_fft_224[372];
+extern const FLOAT32 ixheaacd_twid_tbl_fft_288[380];
+extern const FLOAT32 ixheaacd_twid_tbl_fft_336[564];
+extern const FLOAT32 ixheaacd_twid_tbl_fft_168[276];
+
+#endif /* IXHEAACD_FFT_IFFT_ROM_H */
diff --git a/decoder/ixheaacd_freq_sca.c b/decoder/ixheaacd_freq_sca.c
index f24e344..57dc68d 100644
--- a/decoder/ixheaacd_freq_sca.c
+++ b/decoder/ixheaacd_freq_sca.c
@@ -455,7 +455,6 @@
         f_master_tbl[num_bands0 + k] =
             f_master_tbl[num_bands0 + k - 1] + vec_dk1[k - 1];
       num_mf_bands = add_d(num_bands0, num_bands1);
-
     } else {
       k1 = k2;
 
@@ -490,6 +489,15 @@
     return -1;
   }
   pstr_freq_band_data->num_mf_bands = num_mf_bands;
+
+  if (upsamp_fac == 4) {
+    for (k = 1; k < num_mf_bands; k++) {
+      if (!(f_master_tbl[k] - f_master_tbl[k - 1] <= k0 - 2)) {
+        return -1;
+      }
+    }
+  }
+
   return 0;
 }
 
@@ -523,7 +531,6 @@
       if (direction == 0) step = ixheaacd_shr32(step, 1);
       direction = 1;
       bandfactor = ixheaacd_add32_sat(bandfactor, step);
-
     } else {
       if (direction == 1) step = ixheaacd_shr32(step, 1);
       direction = 0;
@@ -661,7 +668,7 @@
 WORD32 ixheaacd_calc_frq_bnd_tbls(ia_sbr_header_data_struct *ptr_header_data,
                                   ixheaacd_misc_tables *pstr_common_tables) {
   WORD32 err;
-  WORD16 num_lf_bands, num_hf_bands, lsb, usb;
+  WORD16 num_lf_bands, lsb, usb;
   ia_freq_band_data_struct *pstr_freq_band_data =
       ptr_header_data->pstr_freq_band_data;
 
@@ -676,7 +683,6 @@
   ixheaacd_derive_hi_lo_freq_bnd_tbls(pstr_freq_band_data, ptr_header_data);
 
   num_lf_bands = pstr_freq_band_data->num_sf_bands[LOW];
-  num_hf_bands = pstr_freq_band_data->num_sf_bands[HIGH];
 
   if ((num_lf_bands <= 0) ||
       (num_lf_bands > ixheaacd_shr16(MAX_FREQ_COEFFS, 1))) {
diff --git a/decoder/ixheaacd_func_def.h b/decoder/ixheaacd_func_def.h
index 07591f1..31a06d4 100644
--- a/decoder/ixheaacd_func_def.h
+++ b/decoder/ixheaacd_func_def.h
@@ -55,7 +55,7 @@
                                FLOAT32 *ptr_ola_buffer, WORD32 last_was_short,
                                WORD32 tw_mdct);
 
-WORD32 ixheaacd_acelp_alias_cnx(ia_usac_data_struct *usac_data,
+VOID ixheaacd_acelp_alias_cnx(ia_usac_data_struct *usac_data,
                                 ia_td_frame_data_struct *pstr_td_frame_data,
                                 WORD32 k, FLOAT32 A[], FLOAT32 stab_fac,
                                 ia_usac_lpd_decoder_handle st);
@@ -65,14 +65,13 @@
                          WORD32 frame_index, FLOAT32 A[], WORD32 long_frame,
                          ia_usac_lpd_decoder_handle st);
 
-VOID ixheaacd_alg_vec_dequant(ia_td_frame_data_struct *pstr_td_frame_data,
-                              WORD32 first_lpd_flag, FLOAT32 *lsf,
-                              WORD32 mod[]);
+VOID ixheaacd_alg_vec_dequant(ia_td_frame_data_struct *pstr_td_frame_data, WORD32 first_lpd_flag,
+                              FLOAT32 *lsf, WORD32 mod[], WORD32 ec_flag);
 
 VOID ixheaacd_fac_decoding(WORD32 fac_len, WORD32 k, WORD32 *fac_prm,
                            ia_bit_buf_struct *it_bit_buff);
 
-WORD32 ixheaacd_lpc_to_td(FLOAT32 *lpc_coeffs, WORD32 lpc_order,
+VOID ixheaacd_lpc_to_td(FLOAT32 *lpc_coeffs, WORD32 lpc_order,
                           FLOAT32 *mdct_gains, WORD32 lg);
 
 VOID ixheaacd_noise_shaping(FLOAT32 x[], WORD32 lg, WORD32 fdns_npts,
diff --git a/decoder/ixheaacd_function_selector.h b/decoder/ixheaacd_function_selector.h
index daa5aac..b83216a 100644
--- a/decoder/ixheaacd_function_selector.h
+++ b/decoder/ixheaacd_function_selector.h
@@ -41,6 +41,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -57,11 +60,16 @@
 
 extern WORD32 (*ixheaacd_fix_div)(WORD32, WORD32);
 extern VOID (*ixheaacd_covariance_matrix_calc)(WORD32 *,
-                                               ixheaacd_lpp_trans_cov_matrix *,
-                                               WORD32);
+                                               ia_lpp_trans_cov_matrix *,
+                                               WORD32, WORD32);
+
+extern VOID(*ixheaacd_covariance_matrix_calc_960)(WORD32 *,
+                                                  ia_lpp_trans_cov_matrix *,
+                                                  WORD32, WORD32);
+
 extern VOID (*ixheaacd_covariance_matrix_calc_2)(
-    ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32, WORD16);
-extern VOID (*ixheaacd_over_lap_add1)(WORD32 *, WORD32 *, WORD16 *,
+    ia_lpp_trans_cov_matrix *, WORD32 *, WORD32, WORD16);
+extern VOID (*ixheaacd_over_lap_add1)(WORD32 *, WORD32 *, WORD32 *,
                                       const WORD16 *, WORD16, WORD16, WORD16);
 extern VOID (*ixheaacd_over_lap_add2)(WORD32 *, WORD32 *, WORD32 *,
                                       const WORD16 *, WORD16, WORD16, WORD16);
@@ -119,44 +127,48 @@
 extern VOID (*ixheaacd_post_twiddle)(WORD32[], WORD32[],
                                      ia_aac_dec_imdct_tables_struct *, WORD);
 
-extern VOID (*ixheaacd_post_twid_overlap_add)(WORD16[], WORD32[],
+extern VOID (*ixheaacd_post_twid_overlap_add)(WORD32[], WORD32[],
                                               ia_aac_dec_imdct_tables_struct *,
                                               WORD, WORD32 *, WORD16,
                                               const WORD16 *, WORD16);
 
-extern VOID (*ixheaacd_neg_shift_spec)(WORD32 *, WORD16 *, WORD16, WORD16);
+extern VOID (*ixheaacd_neg_shift_spec)(WORD32 *, WORD32 *, WORD16, WORD16);
 
 extern VOID (*ixheaacd_spec_to_overlapbuf)(WORD32 *, WORD32 *, WORD32, WORD32);
 
-extern VOID (*ixheaacd_overlap_buf_out)(WORD16 *, WORD32 *, WORD32,
+extern VOID (*ixheaacd_overlap_buf_out)(WORD32 *, WORD32 *, WORD32,
                                         const WORD16);
 
-extern VOID (*ixheaacd_overlap_out_copy)(WORD16 *, WORD32 *, WORD32 *,
-                                         const WORD16);
+extern VOID (*ixheaacd_overlap_out_copy)(WORD32 *, WORD32 *, WORD32 *,
+                                         const WORD16, WORD16);
 
 extern VOID (*ixheaacd_pretwiddle_compute)(WORD32 *, WORD32 *, WORD32 *,
                                            ia_aac_dec_imdct_tables_struct *,
                                            WORD, WORD32);
 
+extern VOID(*ixheaacd_pretwiddle_compute_960)(WORD32 *, WORD32 *, WORD32 *,
+                                              ia_aac_dec_imdct_tables_struct *,
+                                              WORD, WORD32);
+
 extern VOID (*ixheaacd_imdct_using_fft)(ia_aac_dec_imdct_tables_struct *,
                                         WORD32, WORD32 *, WORD32 *);
 
 extern VOID (*ixheaacd_complex_fft_p2)(WORD32 *xr, WORD32 *xi, WORD32 nlength,
                                        WORD32 fft_mode, WORD32 *preshift);
 
-extern VOID (*ixheaacd_mps_complex_fft_64)(WORD32 *ptr_x, WORD32 *fin_re,
-                                           WORD32 *fin_im, WORD32 nlength);
+extern VOID(*ixheaacd_mps_complex_fft_64)(WORD32 *ptr_x, WORD32 *fin_re,
+                                          WORD32 *fin_im, WORD32 nlength);
 
-extern VOID (*ixheaacd_mps_synt_pre_twiddle)(WORD32 *ptr_in,
+extern VOID(*ixheaacd_mps_synt_pre_twiddle)(FLOAT32 *ptr_in,
+                                            const FLOAT32 *table_re,
+                                            const FLOAT32 *table_im,
+                                            WORD32 resolution);
+
+extern VOID(*ixheaacd_mps_synt_post_twiddle)(WORD32 *ptr_in,
                                              const WORD32 *table_re,
                                              const WORD32 *table_im,
                                              WORD32 resolution);
 
-extern VOID (*ixheaacd_mps_synt_post_twiddle)(WORD32 *ptr_in,
-                                              const WORD32 *table_re,
-                                              const WORD32 *table_im,
-                                              WORD32 resolution);
-
 extern VOID (*ixheaacd_calc_pre_twid)(WORD32 *ptr_x, WORD32 *r_ptr,
                                       WORD32 *i_ptr, WORD32 nlength,
                                       const WORD32 *cos_ptr,
@@ -167,20 +179,28 @@
                                        const WORD32 *cos_ptr,
                                        const WORD32 *sin_ptr);
 
-extern VOID (*ixheaacd_mps_synt_post_fft_twiddle)(
-    WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
-    const WORD32 *table_im, WORD32 *state);
-extern VOID (*ixheaacd_mps_synt_out_calc)(WORD32 resolution, WORD32 *out,
-                                          WORD32 *state,
-                                          const WORD32 *filter_coeff);
+extern VOID(*ixheaacd_mps_synt_post_fft_twiddle)(
+    WORD32 resolution, FLOAT32 *fin_re, FLOAT32 *fin_im, const FLOAT32 *table_re,
+    const FLOAT32 *table_im, FLOAT32 *state);
+
+extern VOID (*ixheaacd_mps_synt_out_calc)(WORD32 resolution, FLOAT32 *out,
+                                          FLOAT32 *state,
+                                          const FLOAT32 *filter_coeff);
 
 extern VOID (*ixheaacd_fft_15_ld)(WORD32 *inp, WORD32 *op, WORD32 *fft3out,
                                   UWORD8 *re_arr_tab_sml_240_ptr);
 
+extern VOID(*ixheaacd_fft_15_960_dec)(WORD32 *inp, WORD32 *op, WORD32 *fft3out,
+                                      UWORD8 *re_arr_tab_sml_480_ptr);
+
 extern VOID (*ixheaacd_aac_ld_dec_rearrange)(WORD32 *ip, WORD32 *op,
                                              WORD32 mdct_len_2,
                                              UWORD8 *re_arr_tab);
 
+extern VOID(*ixheaacd_aac_ld_dec_rearrange_960)(WORD32 *ip, WORD32 *op,
+                                                WORD32 mdct_len_2,
+                                                WORD16 *re_arr_tab);
+
 extern VOID (*ixheaacd_fft32x32_ld)(
     ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints,
     WORD32 *ptr_x, WORD32 *ptr_y);
@@ -189,6 +209,10 @@
     ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints,
     WORD32 *ptr_x, WORD32 *ptr_y);
 
+extern VOID(*ixheaacd_fft32_points_960)(
+    ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints,
+    WORD32 *ptr_x, WORD32 *ptr_y);
+
 extern WORD16 (*ixheaacd_neg_expo_inc)(WORD16 neg_expo);
 
 extern VOID (*ixheaacd_inv_dit_fft_8pt)(WORD32 *x, WORD32 *real, WORD32 *imag);
diff --git a/decoder/ixheaacd_fwd_alias_cnx.c b/decoder/ixheaacd_fwd_alias_cnx.c
index 4441dab..f7d8f6c 100644
--- a/decoder/ixheaacd_fwd_alias_cnx.c
+++ b/decoder/ixheaacd_fwd_alias_cnx.c
@@ -36,6 +36,8 @@
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_windows.h"
@@ -91,13 +93,12 @@
   return;
 }
 
-WORD32 ixheaacd_fwd_alias_cancel_tool(
+VOID ixheaacd_fwd_alias_cancel_tool(
     ia_usac_data_struct *usac_data, ia_td_frame_data_struct *pstr_td_frame_data,
     WORD32 fac_length, FLOAT32 *lp_filt_coeff, WORD32 gain) {
   WORD32 i;
   FLOAT32 lp_filt_coeff_a[ORDER + 1];
   WORD32 qshift = 0;
-  WORD32 err = 0;
 
   WORD32 *x_in = pstr_td_frame_data->fac_data;
   WORD32 *ptr_scratch = &usac_data->scratch_buffer[0];
@@ -110,8 +111,7 @@
 
   memset(fac_signal - 16, 0, ORDER * sizeof(WORD32));
 
-  err = ixheaacd_acelp_mdct(x_in, fac_signal, &qshift, fac_length, ptr_scratch);
-  if (err == -1) return err;
+  ixheaacd_acelp_mdct(x_in, fac_signal, &qshift, fac_length, ptr_scratch);
 
   ixheaacd_lpc_coeff_wt_apply(lp_filt_coeff, lp_filt_coeff_a);
 
@@ -132,10 +132,10 @@
         ptr_overlap_buf[i],
         (WORD32)ixheaacd_mul32_sh(fac_signal[i], gain, (WORD8)(16 - qshift)));
 
-  return err;
+  return;
 }
 
-WORD32 ixheaacd_fr_alias_cnx_fix(WORD32 *x_in, WORD32 len, WORD32 fac_length,
+VOID ixheaacd_fr_alias_cnx_fix(WORD32 *x_in, WORD32 len, WORD32 fac_length,
                                  WORD32 *lp_filt_coeff, WORD32 *izir,
                                  WORD32 *fac_data_out, WORD8 *qshift1,
                                  WORD8 qshift2, WORD8 qshift3, WORD32 *preshift,
@@ -144,7 +144,6 @@
   const WORD32 *sine_window;
   WORD32 fac_window[2 * FAC_LENGTH];
   WORD32 lp_filt_coeff_a[ORDER + 1];
-  WORD32 err = 0;
 
   if (fac_length == 48) {
     sine_window = ixheaacd_sine_win_96;
@@ -155,25 +154,11 @@
   } else {
     sine_window = ixheaacd_sine_win_256;
   }
-  if (FAC_LENGTH < fac_length) {
-    return -1;
-  }
-
-  if (FAC_LENGTH < fac_length) {
-    return -1;
-  }
-  if ((1 + (len / 2)) < (fac_length + 1)) {
-    return -1;
-  }
-  if ((len / 2 + 1) > (2 * LEN_FRAME - fac_length - 1)) {
-    return -1;
-  }
 
   if (lp_filt_coeff != NULL && fac_data_out != NULL) {
     memset(fac_data_out - 16, 0, ORDER * sizeof(WORD32));
-    err = ixheaacd_acelp_mdct(x_in, fac_data_out, preshift, fac_length,
+    ixheaacd_acelp_mdct(x_in, fac_data_out, preshift, fac_length,
                               ptr_scratch);
-    if (err == -1) return err;
 
     ixheaacd_weighted_synthesis_filter(lp_filt_coeff, lp_filt_coeff_a);
 
@@ -210,5 +195,5 @@
     }
   }
 
-  return err;
+  return;
 }
diff --git a/decoder/ixheaacd_hbe_dft_trans.c b/decoder/ixheaacd_hbe_dft_trans.c
new file mode 100644
index 0000000..4ce6800
--- /dev/null
+++ b/decoder/ixheaacd_hbe_dft_trans.c
@@ -0,0 +1,941 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+ */
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ixheaacd_type_def.h"
+
+#include "ixheaacd_bitbuffer.h"
+
+#include "ixheaacd_interface.h"
+
+#include "ixheaacd_tns_usac.h"
+#include "ixheaacd_cnst.h"
+
+#include "ixheaacd_acelp_info.h"
+
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_info.h"
+#include "ixheaacd_sbr_common.h"
+#include "ixheaacd_drc_data_struct.h"
+#include "ixheaacd_drc_dec.h"
+#include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_sbr_const.h"
+
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_freq_sca.h"
+#include "ixheaacd_lpp_tran.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_env_extr.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_env_calc.h"
+#include "ixheaacd_pvc_dec.h"
+
+#include "ixheaacd_sbr_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_sbrqmftrans.h"
+#include "ixheaacd_qmf_poly.h"
+
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_op.h"
+
+#include "ixheaacd_esbr_rom.h"
+
+static FLOAT32 *ixheaacd_map_prot_filter(WORD32 filt_length) {
+  switch (filt_length) {
+    case 4:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[0];
+      break;
+    case 8:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[40];
+      break;
+    case 12:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[120];
+      break;
+    case 16:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[240];
+      break;
+    case 20:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[400];
+      break;
+    case 24:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[600];
+      break;
+    case 28:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff_28_36[0];
+      break;
+    case 32:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[840];
+      break;
+    case 36:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff_28_36[280];
+      break;
+    case 40:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[1160];
+      break;
+    case 44:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[1560];
+      break;
+    default:
+      return (FLOAT32 *)&ixheaacd_sub_samp_qmf_window_coeff[0];
+  }
+}
+
+static VOID ixheaacd_create_dft_hbe_window(FLOAT32 *win, WORD32 x_over_bin1,
+                                           WORD32 x_over_bin2,
+                                           WORD32 ts, WORD32 size) {
+  const FLOAT32 *ptr_freq_domain_win = NULL;
+  WORD32 n;
+  if (ts == 12) {
+    ptr_freq_domain_win = &ixheaacd_dft_hbe_window_ts_12[0];
+  } else {
+    ptr_freq_domain_win = &ixheaacd_dft_hbe_window_ts_18[0];
+  }
+  for (n = 0; n < (x_over_bin1 - ts / 2); n++) {
+    win[n] = 0;
+  }
+
+  for (n = (x_over_bin1 - ts / 2); n <= (x_over_bin1 + ts / 2); n++) {
+    win[n] = (FLOAT32)ptr_freq_domain_win[n - (x_over_bin1 - ts / 2)];
+  }
+
+  for (n = (x_over_bin1 + ts / 2 + 1); n < (x_over_bin2 - ts / 2); n++) {
+    win[n] = (FLOAT32)1.0f;
+  }
+
+  for (n = (x_over_bin2 - ts / 2); n <= (x_over_bin2 + ts / 2); n++) {
+    win[n] = (FLOAT32)1.0f - ptr_freq_domain_win[n - (x_over_bin2 - ts / 2)];
+  }
+
+  for (n = (x_over_bin2 + ts / 2 + 1); n < size; n++) {
+    win[n] = 0.0f;
+  }
+}
+
+static WORD32 ixheaacd_calc_anal_synth_window(WORD32 fft_size, FLOAT32 *ptr_window) {
+  FLOAT32 sin_pi_2_N = 0.0f;
+  FLOAT32 cos_pi_2_N = 0.0f;
+  FLOAT32 *ptr_sin_pi_n_by_N = NULL;
+  WORD32 hop_stride = 1;
+  WORD32 i, j;
+  WORD32 l_fft_stride = 512;
+  switch (fft_size) {
+    case 64:
+      hop_stride = 16;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_1024[0];
+      sin_pi_2_N = ptr_sin_pi_n_by_N[hop_stride >> 1];
+      cos_pi_2_N = ptr_sin_pi_n_by_N[512 + (hop_stride >> 1)];
+      l_fft_stride = 512;
+      break;
+    case 128:
+      hop_stride = 8;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_1024[0];
+      sin_pi_2_N = ptr_sin_pi_n_by_N[hop_stride >> 1];
+      cos_pi_2_N = ptr_sin_pi_n_by_N[512 + (hop_stride >> 1)];
+      l_fft_stride = 512;
+      break;
+    case 256:
+      hop_stride = 4;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_1024[0];
+      sin_pi_2_N = ptr_sin_pi_n_by_N[hop_stride >> 1];
+      cos_pi_2_N = ptr_sin_pi_n_by_N[512 + (hop_stride >> 1)];
+      l_fft_stride = 512;
+      break;
+    case 512:
+      hop_stride = 2;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_1024[0];
+      sin_pi_2_N = ptr_sin_pi_n_by_N[1];
+      cos_pi_2_N = ptr_sin_pi_n_by_N[512 + 1];
+      l_fft_stride = 512;
+      break;
+    case 1024:
+      hop_stride = 1;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_1024[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[0];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[1];
+      l_fft_stride = 512;
+      break;
+    case 192:
+      hop_stride = 4;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_768[0];
+      sin_pi_2_N = ptr_sin_pi_n_by_N[hop_stride >> 1];
+      cos_pi_2_N = ptr_sin_pi_n_by_N[384 + (hop_stride >> 1)];
+      l_fft_stride = 384;
+      break;
+    case 384:
+      hop_stride = 2;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_768[0];
+      sin_pi_2_N = ptr_sin_pi_n_by_N[1];
+      cos_pi_2_N = ptr_sin_pi_n_by_N[384 + 1];
+      l_fft_stride = 384;
+      break;
+    case 768:
+      hop_stride = 1;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_768[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[8];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[9];
+      l_fft_stride = 384;
+      break;
+    case 320:
+      hop_stride = 3;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_960[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[16];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[17];
+      l_fft_stride = 480;
+      break;
+    case 960:
+      hop_stride = 1;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_960[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[2];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[3];
+      l_fft_stride = 480;
+      break;
+    case 448:
+      hop_stride = 2;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_896[0];
+      sin_pi_2_N = ptr_sin_pi_n_by_N[1];
+      cos_pi_2_N = ptr_sin_pi_n_by_N[448 + 1];
+      l_fft_stride = 448;
+      break;
+    case 896:
+      hop_stride = 1;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_896[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[4];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[5];
+      l_fft_stride = 448;
+      break;
+    case 576:
+      hop_stride = 1;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_576[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[14];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[15];
+      l_fft_stride = 288;
+      break;
+    case 640:
+      hop_stride = 1;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_640[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[12];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[13];
+      l_fft_stride = 320;
+      break;
+    case 704:
+      hop_stride = 1;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_704[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[10];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[11];
+      l_fft_stride = 352;
+      break;
+    case 832:
+      hop_stride = 1;
+      ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaacd_sine_pi_n_by_832[0];
+      sin_pi_2_N = ixheaacd_sine_pi_by_2_N[6];
+      cos_pi_2_N = ixheaacd_sine_pi_by_2_N[7];
+      l_fft_stride = 416;
+      break;
+    default:
+      return -1;
+  }
+
+  for (i = 0, j = 0; j < (fft_size >> 1); i += hop_stride, j++) {
+    FLOAT32 cos_val = ptr_sin_pi_n_by_N[i + l_fft_stride];
+    FLOAT32 sin_val = ptr_sin_pi_n_by_N[i];
+    ptr_window[j] = cos_val * sin_pi_2_N + sin_val * cos_pi_2_N;
+  }
+
+  for (; j < fft_size; j++, i += hop_stride) {
+    FLOAT32 cos_val = ptr_sin_pi_n_by_N[i - l_fft_stride];
+    FLOAT32 sin_val = ptr_sin_pi_n_by_N[i];
+    ptr_window[j] = sin_val * cos_pi_2_N - cos_val * sin_pi_2_N;
+  }
+  return 0;
+}
+
+WORD32 ixheaacd_dft_hbe_data_reinit(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+                                    WORD16 *p_freq_band_tab[2], WORD16 *p_num_sfb) {
+  WORD32 sfb;
+  WORD32 patch;
+  WORD32 i;
+  WORD32 temp_start;
+  FLOAT32 fb_ratio;
+  WORD32 stop_patch;
+  WORD32 in_hop_size_divisor = 8;
+  static const WORD32 trans_samp[2] = {12, 18};
+  WORD32 err = 0;
+
+  ptr_hbe_txposer->start_band = p_freq_band_tab[LOW][0];
+  ptr_hbe_txposer->end_band = p_freq_band_tab[LOW][p_num_sfb[LOW]];
+  ptr_hbe_txposer->esbr_hq = 1;
+
+  ptr_hbe_txposer->synth_size = 4 * ((ptr_hbe_txposer->start_band + 4) / 8 + 1);
+  ptr_hbe_txposer->k_start = ixheaacd_start_subband2kL_tbl[ptr_hbe_txposer->start_band];
+
+  fb_ratio = ptr_hbe_txposer->synth_size / 32.0f;
+
+  ptr_hbe_txposer->ana_fft_size[0] = (WORD32)(fb_ratio * ptr_hbe_txposer->fft_size[0]);
+  ptr_hbe_txposer->ana_fft_size[1] = (WORD32)(fb_ratio * ptr_hbe_txposer->fft_size[1]);
+
+  ptr_hbe_txposer->in_hop_size = ptr_hbe_txposer->ana_fft_size[0] / in_hop_size_divisor;
+
+  ptr_hbe_txposer->synth_window = (FLOAT32 *)&ptr_hbe_txposer->synthesis_window_buf[0];
+  ptr_hbe_txposer->anal_window = (FLOAT32 *)&ptr_hbe_txposer->analysis_window_buf[0];
+
+  err = ixheaacd_calc_anal_synth_window(ptr_hbe_txposer->ana_fft_size[0],
+                                        ptr_hbe_txposer->anal_window);
+  if (err) {
+    return err;
+  }
+
+  memset(ptr_hbe_txposer->synth_buf, 0, 1280 * sizeof(ptr_hbe_txposer->synth_buf[0]));
+
+  ptr_hbe_txposer->synth_wind_coeff = ixheaacd_map_prot_filter(ptr_hbe_txposer->synth_size);
+
+  temp_start = 2 * ((ptr_hbe_txposer->start_band - 1) / 2);
+  ptr_hbe_txposer->analy_size =
+      4 * ((min(64, ptr_hbe_txposer->end_band + 1) - temp_start - 1) / 4 +
+           1);
+  ptr_hbe_txposer->a_start = temp_start - max(0, temp_start + ptr_hbe_txposer->analy_size - 64);
+
+  fb_ratio = ptr_hbe_txposer->analy_size / 64.0f;
+
+  ptr_hbe_txposer->syn_fft_size[0] = (WORD32)(fb_ratio * ptr_hbe_txposer->fft_size[0]);
+  ptr_hbe_txposer->syn_fft_size[1] = (WORD32)(fb_ratio * ptr_hbe_txposer->fft_size[1]);
+
+  ptr_hbe_txposer->out_hop_size = 2 * ptr_hbe_txposer->syn_fft_size[0] / in_hop_size_divisor;
+
+  err = ixheaacd_calc_anal_synth_window(ptr_hbe_txposer->syn_fft_size[0],
+                                        ptr_hbe_txposer->synth_window);
+  if (err) {
+    return err;
+  }
+
+  ptr_hbe_txposer->analy_wind_coeff = ixheaacd_map_prot_filter(ptr_hbe_txposer->analy_size);
+
+  memset(&ptr_hbe_txposer->x_over_qmf[0], 0, sizeof(ptr_hbe_txposer->x_over_qmf));
+  for (i = 0; i < MAX_STRETCH; i++) {
+    memset(&ptr_hbe_txposer->x_over_bin[i][0], 0,
+           2 * sizeof(ptr_hbe_txposer->x_over_bin[i][0]));
+  }
+  sfb = 0;
+  stop_patch = MAX_STRETCH;
+
+  switch (ptr_hbe_txposer->synth_size) {
+    case 4:
+      ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaacd_synth_cos_table_kl_4;
+      ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p2;
+      break;
+    case 8:
+      ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaacd_synth_cos_table_kl_8;
+      ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p2;
+      break;
+    case 12:
+      ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaacd_synth_cos_table_kl_12;
+      ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p3;
+      break;
+    case 16:
+      ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaacd_synth_cos_table_kl_16;
+      ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p2;
+      break;
+    case 20:
+      ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaacd_synth_cos_table_kl_20;
+      break;
+    case 28:
+      ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaacd_synth_cos_table_kl_20;
+      break;
+    default:
+      ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaacd_synth_cos_table_kl_4;
+      ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaacd_real_synth_fft_p2;
+  }
+
+  {
+    WORD32 l, k, L = ptr_hbe_txposer->analy_size;
+    for (k = 0; k < L; k++) {
+      for (l = 0; l < 2 * L; l++) {
+        ptr_hbe_txposer->str_dft_hbe_anal_coeff.real[k][l] =
+            (FLOAT32)cos(PI / (2 * L) *
+                         ((k + 0.5) * (2 * l - L / 64.0) - L / 64.0 *
+                          ptr_hbe_txposer->a_start));
+        ptr_hbe_txposer->str_dft_hbe_anal_coeff.imag[k][l] =
+            (FLOAT32)sin(PI / (2 * L) *
+                         ((k + 0.5) * (2 * l - L / 64.0) - L / 64.0 *
+                          ptr_hbe_txposer->a_start));
+      }
+    }
+  }
+
+  for (patch = 1; patch <= stop_patch; patch++) {
+    while (sfb <= p_num_sfb[LOW] &&
+           p_freq_band_tab[LOW][sfb] <= patch * ptr_hbe_txposer->start_band)
+      sfb++;
+    if (sfb <= p_num_sfb[LOW]) {
+      if ((patch * ptr_hbe_txposer->start_band - p_freq_band_tab[LOW][sfb - 1]) <= 3) {
+        ptr_hbe_txposer->x_over_qmf[patch - 1] = p_freq_band_tab[LOW][sfb - 1];
+        if (patch <= MAX_STRETCH) {
+          ptr_hbe_txposer->x_over_bin[patch - 1][0] = (WORD32)(
+              ptr_hbe_txposer->fft_size[0] * p_freq_band_tab[LOW][sfb - 1] / 128 + 0.5);
+          ptr_hbe_txposer->x_over_bin[patch - 1][1] = (WORD32)(
+              ptr_hbe_txposer->fft_size[1] * p_freq_band_tab[LOW][sfb - 1] / 128 + 0.5);
+        }
+      } else {
+        WORD32 sfb = 0;
+        while (sfb <= p_num_sfb[HIGH] &&
+               p_freq_band_tab[HIGH][sfb] <= patch * ptr_hbe_txposer->start_band)
+          sfb++;
+        ptr_hbe_txposer->x_over_qmf[patch - 1] = p_freq_band_tab[HIGH][sfb - 1];
+        if (patch <= MAX_STRETCH) {
+          ptr_hbe_txposer->x_over_bin[patch - 1][0] = (WORD32)(
+              ptr_hbe_txposer->fft_size[0] * p_freq_band_tab[HIGH][sfb - 1] / 128 + 0.5);
+          ptr_hbe_txposer->x_over_bin[patch - 1][1] = (WORD32)(
+              ptr_hbe_txposer->fft_size[1] * p_freq_band_tab[HIGH][sfb - 1] / 128 + 0.5);
+        }
+      }
+    } else {
+      ptr_hbe_txposer->x_over_qmf[patch - 1] = ptr_hbe_txposer->end_band;
+      if (patch <= MAX_STRETCH) {
+        ptr_hbe_txposer->x_over_bin[patch - 1][0] =
+            (WORD32)(ptr_hbe_txposer->fft_size[0] * ptr_hbe_txposer->end_band / 128 + 0.5);
+        ptr_hbe_txposer->x_over_bin[patch - 1][1] =
+            (WORD32)(ptr_hbe_txposer->fft_size[1] * ptr_hbe_txposer->end_band / 128 + 0.5);
+      }
+      ptr_hbe_txposer->max_stretch = min(patch, MAX_STRETCH);
+      break;
+    }
+  }
+
+  for (patch = 0; patch < ptr_hbe_txposer->max_stretch - 1; patch++) {
+    for (i = 0; i < 2; i++) {
+      ixheaacd_create_dft_hbe_window(ptr_hbe_txposer->fd_win_buf[patch][i],
+                                     ptr_hbe_txposer->x_over_bin[patch][i],
+                                     ptr_hbe_txposer->x_over_bin[patch + 1][i], trans_samp[i],
+                                     ptr_hbe_txposer->fft_size[i]);
+    }
+  }
+  return 0;
+}
+
+static VOID ixheaacd_dft_hbe_apply_win(const FLOAT32 *inp1, const FLOAT32 *inp2, FLOAT32 *out,
+                                       WORD32 n) {
+  WORD32 i;
+  for (i = 0; i < n; i++) {
+    out[i] = inp1[i] * inp2[i];
+  }
+}
+
+VOID ixheaacd_dft_hbe_fft_memmove(FLOAT32 *ptr_spectrum, WORD32 size) {
+  WORD32 n;
+
+  for (n = 0; n < size / 2; n++) {
+    FLOAT32 tmp = ptr_spectrum[n];
+    ptr_spectrum[n] = ptr_spectrum[n + size / 2];
+    ptr_spectrum[n + size / 2] = tmp;
+  }
+}
+
+VOID ixheaacd_karth2polar(FLOAT32 *spectrum, FLOAT32 *mag, FLOAT32 *phase, WORD32 fft_size) {
+  WORD32 n;
+
+  for (n = 1; n < fft_size / 2; n++) {
+    phase[n] = (FLOAT32)atan2(spectrum[2 * n + 1], spectrum[2 * n]);
+    mag[n] = (FLOAT32)sqrt(spectrum[2 * n] * spectrum[2 * n] +
+                           spectrum[2 * n + 1] * spectrum[2 * n + 1]);
+  }
+
+  if (spectrum[0] < 0) {
+    phase[0] = (FLOAT32)acos(-1);
+    mag[0] = -spectrum[0];
+  } else {
+    phase[0] = 0;
+    mag[0] = spectrum[0];
+  }
+
+  if (spectrum[1] < 0) {
+    phase[fft_size / 2] = (FLOAT32)acos(-1);
+    mag[fft_size / 2] = -spectrum[1];
+  } else {
+    phase[fft_size / 2] = 0;
+    mag[fft_size / 2] = spectrum[1];
+  }
+}
+
+VOID ixheaacd_hbe_fft_table(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) {
+  WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
+  WORD32 ana_fft_size = ptr_hbe_txposer->ana_fft_size[oversampling_flag];
+  WORD32 syn_fft_size = ptr_hbe_txposer->syn_fft_size[oversampling_flag];
+
+  switch (ana_fft_size) {
+    case 576:
+      ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_576;
+      break;
+    case 384:
+      ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_384;
+      break;
+    case 512:
+      ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_512;
+      break;
+    case 768:
+      ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_768;
+      break;
+    default:
+      break;
+  }
+
+  switch (syn_fft_size) {
+    case 448:
+      ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_448;
+      break;
+    case 512:
+      ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_512;
+      break;
+    case 768:
+      ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_768;
+      break;
+    case 672:
+      ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_672;
+      break;
+    default:
+      break;
+  }
+}
+
+IA_ERRORCODE ixheaacd_hbe_fft_map(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) {
+  WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
+  WORD32 ana_fft_size = ptr_hbe_txposer->ana_fft_size[oversampling_flag];
+  WORD32 syn_fft_size = ptr_hbe_txposer->syn_fft_size[oversampling_flag];
+
+  switch (ana_fft_size) {
+    case 576:
+      ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_576;
+      ptr_hbe_txposer->ixheaacd_hbe_anal_fft = &ixheaacd_hbe_apply_fft_288;
+      break;
+    case 384:
+      ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_384;
+      ptr_hbe_txposer->ixheaacd_hbe_anal_fft = &ixheaacd_hbe_apply_cfftn_gen;
+      break;
+    case 512:
+      ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_512;
+      ptr_hbe_txposer->ixheaacd_hbe_anal_fft = &ixheaacd_hbe_apply_cfftn;
+      break;
+    case 768:
+      ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_768;
+      ptr_hbe_txposer->ixheaacd_hbe_anal_fft = &ixheaacd_hbe_apply_cfftn_gen;
+      break;
+    default:
+      return IA_FATAL_ERROR;
+      break;
+  }
+
+  switch (syn_fft_size) {
+    case 448:
+      ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_448;
+      ptr_hbe_txposer->ixheaacd_hbe_synth_ifft = &ixheaacd_hbe_apply_ifft_224;
+      break;
+    case 512:
+      ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_512;
+      ptr_hbe_txposer->ixheaacd_hbe_synth_ifft = &ixheaacd_hbe_apply_cfftn;
+      break;
+    case 768:
+      ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_768;
+      ptr_hbe_txposer->ixheaacd_hbe_synth_ifft = &ixheaacd_hbe_apply_cfftn_gen;
+      break;
+    case 672:
+      ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaacd_sin_cos_672;
+      ptr_hbe_txposer->ixheaacd_hbe_synth_ifft = &ixheaacd_hbe_apply_ifft_336;
+      break;
+    default:
+      return IA_FATAL_ERROR;
+      break;
+  }
+
+  return IA_NO_ERROR;
+}
+
+VOID ixheaacd_dft_hbe_apply_polar_t2(
+    WORD32 trans_fac, ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+    WORD32 pitch_in_bins, WORD out_transform_size) {
+  WORD32 tr;
+  WORD32 ti;
+  WORD32 m_tr;
+  WORD32 p, i;
+  FLOAT32 mag_t;
+  FLOAT32 phase_t;
+  FLOAT32 m_val;
+  FLOAT32(*fd_win_buf)[3][3][1536] = &ptr_hbe_txposer->fd_win_buf;
+  FLOAT32 *phase = ptr_hbe_txposer->phase;
+  WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
+  WORD32 fft_size = ptr_hbe_txposer->fft_size[oversampling_flag];
+  FLOAT32 *ptr_spectrum_tx = ptr_hbe_txposer->ptr_spectrum_tx;
+  FLOAT32 *mag = ptr_hbe_txposer->mag;
+  FLOAT32 p_flt = fft_size * pitch_in_bins / 1536.0f;
+  p = (WORD32)p_flt;
+  FLOAT32 q_thr = 4.0f;
+  m_tr = 0;
+
+  for (i = 0; i <= out_transform_size; i++) {
+    WORD32 utk = i;
+
+    mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] * mag[utk];
+
+    phase_t = trans_fac * phase[utk];
+
+    if (phase_t == 0.0) {
+      ptr_spectrum_tx[2 * i] += mag_t;
+    } else {
+      ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
+      ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
+    }
+    if (p > 0) {
+      m_val = 0;
+      for (tr = 1; tr < trans_fac; tr++) {
+        FLOAT32 temp;
+        ti = (WORD32)((2.0f * i - tr * p_flt) / trans_fac + 0.5f);
+        if ((ti < 0) || (ti + p > fft_size / 2)) continue;
+        temp = min(mag[ti], mag[ti + p]);
+        if (temp > m_val) {
+          m_val = temp;
+          m_tr = tr;
+          utk = ti;
+        }
+      }
+
+      if (m_val > q_thr * mag[2 * i / trans_fac]) {
+        mag_t = (FLOAT32)((*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
+                         sqrt(mag[utk]) * sqrt(mag[utk + p]));
+        phase_t = (trans_fac - m_tr) * phase[utk] + m_tr * phase[utk + p];
+        ptr_spectrum_tx[2 * i] += (FLOAT32)(mag_t * cos(phase_t));
+        ptr_spectrum_tx[2 * i + 1] += (FLOAT32)(mag_t * sin(phase_t));
+      }
+    }
+  }
+}
+
+VOID ixheaacd_dft_hbe_apply_polar_t3(
+    WORD32 trans_fac, ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+    WORD32 pitch_in_bins, WORD out_transform_size) {
+  WORD32 tr;
+  WORD32 ti;
+  WORD32 m_tr = 0;
+  WORD32 p, i;
+  FLOAT32 mag_t = 0;
+  FLOAT32 phase_t;
+  FLOAT32 m_val;
+  FLOAT32(*fd_win_buf)[3][3][1536] = &ptr_hbe_txposer->fd_win_buf;
+  FLOAT32 *phase = ptr_hbe_txposer->phase;
+  WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
+  WORD32 fft_size = ptr_hbe_txposer->fft_size[oversampling_flag];
+  FLOAT32 *ptr_spectrum_tx = ptr_hbe_txposer->ptr_spectrum_tx;
+  FLOAT32 *mag = ptr_hbe_txposer->mag;
+  FLOAT32 p_flt = fft_size * pitch_in_bins / 1536.0f;
+  p = (WORD32)p_flt;
+  FLOAT32 q_thr = 4.0f;
+
+  for (i = 0; i <= out_transform_size; i++) {
+    WORD32 utk = 2 * i / trans_fac;
+    FLOAT32 ptk = (2.0f * i / trans_fac) - utk;
+    FLOAT32 k;
+
+    if (i % 3 == 0) {
+      mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] * mag[utk];
+    } else if (i % 3 == 1) {
+      k = (FLOAT32)cbrt(mag[utk]);
+      mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] * k *
+             (FLOAT32)pow(mag[utk + 1], ptk);
+    } else if (i % 3 == 2) {
+      k = (FLOAT32)cbrt(mag[utk + 1]);
+      mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
+             (FLOAT32)pow(mag[utk], 1.0 - ptk) * k;
+    }
+
+    phase_t = trans_fac * ((1 - ptk) * phase[utk] + ptk * phase[utk + 1]);
+
+    ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
+    ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
+
+    if (p > 0) {
+      m_val = 0;
+      for (tr = 1; tr < trans_fac; tr++) {
+        FLOAT32 temp;
+        ti = (WORD32)((2.0f * i - tr * p_flt) / trans_fac + 0.5f);
+        if ((ti < 0) || (ti + p > fft_size / 2)) continue;
+        temp = min(mag[ti], mag[ti + p]);
+        if (temp > m_val) {
+          m_val = temp;
+          m_tr = tr;
+          utk = ti;
+        }
+      }
+
+      if (m_val > q_thr * mag[2 * i / trans_fac]) {
+        FLOAT32 r = (FLOAT32)m_tr / trans_fac;
+        if (m_tr == 1) {
+          k = (FLOAT32)(cbrt((FLOAT32)mag[utk + p]));
+          mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
+                 (FLOAT32)pow(mag[utk], 1.0 - r) * k;
+          phase_t = (trans_fac - m_tr) * phase[utk] + phase[utk + p];
+        } else if (m_tr == 2) {
+          k = (FLOAT32)(cbrt((FLOAT32)mag[utk]));
+          mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] * k *
+                 (FLOAT32)pow(mag[utk + p], r);
+          phase_t = phase[utk] + m_tr * phase[utk + p];
+        }
+
+        ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
+        ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
+      }
+    }
+  }
+}
+
+VOID ixheaacd_dft_hbe_apply_polar_t(
+    WORD32 trans_fac, ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+    WORD32 pitch_in_bins, WORD out_transform_size) {
+  WORD32 tr;
+  WORD32 ti;
+  WORD32 m_tr;
+  WORD32 p, i;
+  FLOAT32 mag_t;
+  FLOAT32 phase_t;
+  FLOAT32 m_val;
+  FLOAT32(*fd_win_buf)[3][3][1536] = &ptr_hbe_txposer->fd_win_buf;
+  FLOAT32 *phase = ptr_hbe_txposer->phase;
+  WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
+  WORD32 fft_size = ptr_hbe_txposer->fft_size[oversampling_flag];
+  FLOAT32 *ptr_spectrum_tx = ptr_hbe_txposer->ptr_spectrum_tx;
+  FLOAT32 *mag = ptr_hbe_txposer->mag;
+  FLOAT32 p_flt = fft_size * pitch_in_bins / 1536.0f;
+  p = (WORD32)p_flt;
+  FLOAT32 q_thr = 4.0f;
+  m_tr = 0;
+
+  for (i = 0; i <= out_transform_size; i++) {
+    WORD32 utk = 2 * i / trans_fac;
+    FLOAT32 ptk = (2.0f * i / trans_fac) - utk;
+
+    mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
+            (FLOAT32)pow(mag[utk], 1.0f - ptk) * (FLOAT32)pow(mag[utk + 1], ptk);
+
+    phase_t = trans_fac * ((1 - ptk) * phase[utk] + ptk * phase[utk + 1]);
+
+    ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
+    ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
+
+    if (p > 0) {
+      m_val = 0;
+      for (tr = 1; tr < trans_fac; tr++) {
+        FLOAT32 temp;
+        ti = (WORD32)((2.0f * i - tr * p_flt) / trans_fac + 0.5f);
+        if ((ti < 0) || (ti + p > fft_size / 2)) continue;
+        temp = min(mag[ti], mag[ti + p]);
+        if (temp > m_val) {
+          m_val = temp;
+          m_tr = tr;
+          utk = ti;
+        }
+      }
+
+      if (m_val > q_thr * mag[2 * i / trans_fac]) {
+        FLOAT32 r = (FLOAT32)m_tr / trans_fac;
+        mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
+                (FLOAT32)pow(mag[utk], 1.0 - r) * (FLOAT32)pow(mag[utk + p], r);
+        phase_t = (trans_fac - m_tr) * phase[utk] + m_tr * phase[utk + p];
+        ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
+        ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
+      }
+    }
+  }
+}
+
+WORD32 ixheaacd_dft_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+                              FLOAT32 qmf_buf_real[][64], FLOAT32 qmf_buf_imag[][64],
+                              WORD32 num_columns, FLOAT32 pv_qmf_buf_real[][64],
+                              FLOAT32 pv_qmf_buf_imag[][64], WORD32 pitch_in_bins,
+                              FLOAT32 *dft_hbe_scratch_buf) {
+  WORD32 in_offset = 0;
+  WORD32 out_offset = 0;
+  WORD32 in_hop_size = ptr_hbe_txposer->in_hop_size;
+  WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
+  WORD32 fft_size = ptr_hbe_txposer->fft_size[oversampling_flag];
+
+  WORD32 out_hop_size = ptr_hbe_txposer->out_hop_size;
+  WORD32 num_in_samples = num_columns * ptr_hbe_txposer->synth_size;
+  WORD32 ana_fft_size = ptr_hbe_txposer->ana_fft_size[oversampling_flag];
+  WORD32 syn_fft_size = ptr_hbe_txposer->syn_fft_size[oversampling_flag];
+
+  WORD32 ana_pad_size = (ana_fft_size - ptr_hbe_txposer->ana_fft_size[0]) / 2;
+  WORD32 syn_pad_size = (syn_fft_size - ptr_hbe_txposer->syn_fft_size[0]) / 2;
+
+  FLOAT32 *ptr_input_buf = ptr_hbe_txposer->ptr_input_buf;
+  FLOAT32 *ptr_output_buf = ptr_hbe_txposer->ptr_output_buf;
+  FLOAT32 *ptr_spectrum = ptr_hbe_txposer->ptr_spectrum;
+  FLOAT32 *ptr_spectrum_tx = ptr_hbe_txposer->ptr_spectrum_tx;
+  FLOAT32 *mag = ptr_hbe_txposer->mag;
+  FLOAT32 *phase = ptr_hbe_txposer->phase;
+  WORD32 i, trans_fac;
+
+  FLOAT32 *ptr_cos_fft;
+  FLOAT32 *ptr_cos_ifft;
+
+  WORD32 ana_fft_offset = ptr_hbe_txposer->k_start * fft_size / 32;
+  WORD32 syn_fft_offset = ptr_hbe_txposer->a_start * fft_size / 64;
+
+  WORD32 err_code = IA_NO_ERROR;
+
+  memcpy(ptr_hbe_txposer->ptr_input_buf,
+         ptr_hbe_txposer->ptr_input_buf + ptr_hbe_txposer->ana_fft_size[0],
+         ptr_hbe_txposer->ana_fft_size[0] * sizeof(ptr_hbe_txposer->ptr_input_buf[0]));
+
+  ixheaacd_real_synth_filt(ptr_hbe_txposer, num_columns, qmf_buf_real, qmf_buf_imag);
+  memcpy(ptr_output_buf, ptr_output_buf + 2 * ptr_hbe_txposer->syn_fft_size[0],
+         2 * ptr_hbe_txposer->syn_fft_size[0] * sizeof(*ptr_output_buf));
+
+  memset(ptr_output_buf + 2 * ptr_hbe_txposer->syn_fft_size[0], 0,
+         2 * ptr_hbe_txposer->syn_fft_size[0] * sizeof(*ptr_output_buf));
+
+  err_code = ixheaacd_hbe_fft_map(ptr_hbe_txposer);
+  if (err_code) return err_code;
+  while (in_offset < num_in_samples) {
+    memset(ptr_spectrum, 0, fft_size * sizeof(FLOAT32));
+    memset(ptr_spectrum_tx, 0, ((fft_size + 2) * sizeof(FLOAT32)));
+
+    memset(mag, 0, (fft_size / 2 + 2) * sizeof(FLOAT32));
+    memset(phase, 0, (fft_size / 2 + 2) * sizeof(FLOAT32));
+    ixheaacd_dft_hbe_apply_win(ptr_input_buf + in_offset, ptr_hbe_txposer->anal_window,
+                               ptr_spectrum + ana_pad_size + ana_fft_offset,
+                               ptr_hbe_txposer->ana_fft_size[0]);
+    ixheaacd_dft_hbe_fft_memmove(ptr_spectrum + ana_fft_offset, ana_fft_size);
+    {
+      WORD32 len = ana_fft_size;
+      ptr_cos_fft = ptr_hbe_txposer->ana_cos_sin_tab;
+      FLOAT32 *ptr_fft_data = ptr_spectrum + ana_fft_offset;
+      FLOAT32 tmp1, tmp2, tmp3, tmp4;
+
+      (*(ptr_hbe_txposer->ixheaacd_hbe_anal_fft))(ptr_fft_data, dft_hbe_scratch_buf,
+                                                  len / 2, -1);
+
+      tmp1 = ptr_fft_data[0] + ptr_fft_data[1];
+      ptr_fft_data[1] = ptr_fft_data[0] - ptr_fft_data[1];
+      ptr_fft_data[0] = tmp1;
+
+      for (i = 1; i <= (len / 4 + (len % 4) / 2); ++i) {
+        tmp1 = ptr_fft_data[2 * i] - ptr_fft_data[len - 2 * i];
+        tmp2 = ptr_fft_data[2 * i + 1] + ptr_fft_data[len - 2 * i + 1];
+
+        tmp3 = (*(ptr_cos_fft)) * tmp1 -
+               (*(ptr_cos_fft + 1)) * tmp2;
+        tmp4 = (*(ptr_cos_fft + 1)) * tmp1 +
+               (*(ptr_cos_fft)) * tmp2;
+
+        ptr_cos_fft = ptr_cos_fft + 2;
+
+        tmp1 = ptr_fft_data[2 * i] + ptr_fft_data[len - 2 * i];
+        tmp2 = ptr_fft_data[2 * i + 1] - ptr_fft_data[len - 2 * i + 1];
+
+        ptr_fft_data[2 * i + 0] = 0.5f * (tmp1 - tmp3);
+        ptr_fft_data[2 * i + 1] = 0.5f * (tmp2 - tmp4);
+        ptr_fft_data[len - 2 * i + 0] = 0.5f * (tmp1 + tmp3);
+        ptr_fft_data[len - 2 * i + 1] = -0.5f * (tmp2 + tmp4);
+      }
+    }
+    ixheaacd_karth2polar(ptr_spectrum + ana_fft_offset, mag + ana_fft_offset / 2,
+                         phase + ana_fft_offset / 2, ana_fft_size);
+
+    for (trans_fac = 2; trans_fac <= ptr_hbe_txposer->max_stretch; trans_fac++) {
+      WORD32 out_transform_size;
+
+      out_transform_size = (fft_size / 2);
+
+      switch (trans_fac) {
+        case 2:
+          ixheaacd_dft_hbe_apply_polar_t2(trans_fac, ptr_hbe_txposer,
+                                          pitch_in_bins, out_transform_size);
+          break;
+        case 3:
+          ixheaacd_dft_hbe_apply_polar_t3(trans_fac, ptr_hbe_txposer,
+                                          pitch_in_bins, out_transform_size);
+          break;
+        default:
+          ixheaacd_dft_hbe_apply_polar_t(trans_fac, ptr_hbe_txposer,
+                                         pitch_in_bins, out_transform_size);
+      }
+    }
+
+    ptr_spectrum_tx[syn_fft_offset + 1] = ptr_spectrum_tx[syn_fft_offset +
+                                                          syn_fft_size];
+
+    {
+      WORD32 len = syn_fft_size;
+      ptr_cos_ifft = ptr_hbe_txposer->syn_cos_sin_tab;
+      FLOAT32 *ptr_fft_data = ptr_spectrum_tx + syn_fft_offset;
+      FLOAT32 tmp1, tmp2, tmp3, tmp4;
+
+      FLOAT32 scale = 1.0f / len;
+      tmp1 = ptr_fft_data[0] + ptr_fft_data[1];
+      ptr_fft_data[1] = scale * (ptr_fft_data[0] - ptr_fft_data[1]);
+      ptr_fft_data[0] = scale * tmp1;
+
+      for (i = 1; i <= (len / 4 + (len % 4) / 2); ++i) {
+        tmp1 = ptr_fft_data[2 * i] - ptr_fft_data[len - 2 * i];
+        tmp2 = ptr_fft_data[2 * i + 1] + ptr_fft_data[len - 2 * i + 1];
+
+        tmp3 = (*(ptr_cos_ifft)) * tmp1 +
+               (*(ptr_cos_ifft + 1)) * tmp2;
+        tmp4 = -(*(ptr_cos_ifft + 1)) * tmp1 +
+               (*(ptr_cos_ifft)) * tmp2;
+
+        ptr_cos_ifft = ptr_cos_ifft + 2;
+
+        tmp1 = ptr_fft_data[2 * i] + ptr_fft_data[len - 2 * i];
+        tmp2 = ptr_fft_data[2 * i + 1] - ptr_fft_data[len - 2 * i + 1];
+
+        ptr_fft_data[2 * i] = scale * (tmp1 - tmp3);
+        ptr_fft_data[2 * i + 1] = scale * (tmp2 - tmp4);
+        ptr_fft_data[len - 2 * i] = scale * (tmp1 + tmp3);
+        ptr_fft_data[len - 2 * i + 1] = -scale * (tmp2 + tmp4);
+      }
+
+      (*(ptr_hbe_txposer->ixheaacd_hbe_synth_ifft))(ptr_fft_data, dft_hbe_scratch_buf,
+                                                    len / 2, 1);
+    }
+
+    ixheaacd_dft_hbe_fft_memmove(ptr_spectrum_tx + syn_fft_offset, syn_fft_size);
+    ixheaacd_dft_hbe_apply_win(
+        ptr_spectrum_tx + syn_pad_size + syn_fft_offset, ptr_hbe_txposer->synth_window,
+        ptr_spectrum_tx + syn_pad_size + syn_fft_offset, ptr_hbe_txposer->syn_fft_size[0]);
+
+    for (i = 0; i < ptr_hbe_txposer->syn_fft_size[0]; i++) {
+      ptr_output_buf[out_offset + i] += ptr_spectrum_tx[syn_pad_size + syn_fft_offset + i];
+    }
+
+    in_offset += in_hop_size;
+    out_offset += out_hop_size;
+
+  }
+
+  err_code = ixheaacd_dft_hbe_cplx_anal_filt(ptr_hbe_txposer, pv_qmf_buf_real,
+                                             pv_qmf_buf_imag);
+
+  return err_code;
+}
diff --git a/decoder/ixheaacd_hbe_trans.c b/decoder/ixheaacd_hbe_trans.c
index 26965ca..179349d 100644
--- a/decoder/ixheaacd_hbe_trans.c
+++ b/decoder/ixheaacd_hbe_trans.c
@@ -114,6 +114,7 @@
         ixheaacd_start_subband2kL_tbl[ptr_hbe_txposer->start_band];
 
     ptr_hbe_txposer->upsamp_4_flag = upsamp_4_flag;
+    ptr_hbe_txposer->esbr_hq = 0;
 
     if (upsamp_4_flag) {
       if (ptr_hbe_txposer->k_start + ptr_hbe_txposer->synth_size > 16)
@@ -225,7 +226,8 @@
                               FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
                               FLOAT32 pv_qmf_buf_real[][64],
                               FLOAT32 pv_qmf_buf_imag[][64],
-                              WORD32 pitch_in_bins) {
+                              WORD32 pitch_in_bins,
+                              ia_sbr_header_data_struct *ptr_header_data) {
   WORD32 i, qmf_band_idx;
   WORD32 qmf_voc_columns = ptr_hbe_txposer->no_bins / 2;
   WORD32 err_code = 0;
@@ -235,6 +237,16 @@
              ptr_hbe_txposer->no_bins * ptr_hbe_txposer->synth_size,
          ptr_hbe_txposer->synth_size * sizeof(FLOAT32));
 
+  if (ptr_hbe_txposer->ixheaacd_cmplx_anal_fft == NULL) {
+    WORD32 err = ixheaacd_qmf_hbe_data_reinit(
+        ptr_hbe_txposer,
+        ptr_header_data->pstr_freq_band_data->freq_band_table,
+        ptr_header_data->pstr_freq_band_data->num_sf_bands,
+        ptr_header_data->is_usf_4);
+    if (err)
+      return err;
+  }
+
   err_code = ixheaacd_real_synth_filt(ptr_hbe_txposer, num_columns,
                                       qmf_buf_real, qmf_buf_imag);
   if (err_code) return err_code;
diff --git a/decoder/ixheaacd_hcr.h b/decoder/ixheaacd_hcr.h
index e872764..95687a2 100644
--- a/decoder/ixheaacd_hcr.h
+++ b/decoder/ixheaacd_hcr.h
@@ -20,25 +20,25 @@
 
 #ifndef IXHEAACD_HCR_H
 #define IXHEAACD_HCR_H
-void ixheaacd_huff_code_reorder_tbl_init(ia_hcr_info_struct* ptr_hcr_info);
+VOID ixheaacd_huff_code_reorder_tbl_init(ia_hcr_info_struct *ptr_hcr_info);
 UWORD32 ixheaacd_huff_code_reorder_init(
     ia_hcr_info_struct* ptr_hcr_info,
-    ia_aac_dec_channel_info_struct* ptr_aac_dec_channel_info,
+    ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
     ia_aac_dec_tables_struct* ptr_aac_tables, ia_bit_buf_struct* itt_bit_buff);
 UWORD32 ixheaacd_hcr_decoder(
     ia_hcr_info_struct* ptr_hcr_info,
-    ia_aac_dec_channel_info_struct* ptr_aac_dec_channel_info,
+    ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
     ia_aac_dec_tables_struct* ptr_aac_tables, ia_bit_buf_struct* itt_bit_buff);
-VOID ixheaacd_huff_mute_erroneous_lines(ia_hcr_info_struct* ptr_hcr_info);
+VOID ixheaacd_huff_mute_erroneous_lines(ia_hcr_info_struct *ptr_hcr_info);
 
 void ixheaacd_lt_prediction(
     ia_aac_dec_channel_info_struct* ptr_aac_dec_channel_info, ltp_info* ltp,
     WORD32* spec, ia_aac_dec_tables_struct* aac_tables_ptr,
     UWORD16 win_shape_prev, UWORD32 sr_index, UWORD32 object_type,
-    UWORD32 frame_len, WORD32* in_data, WORD32* out_data);
+    UWORD32 frame_len, WORD32 *in_data, WORD32 *out_data);
 
 WORD32 ixheaacd_ltp_data(WORD32 object_type, ia_ics_info_struct* ics,
-                         ltp_info* ltp, ia_handle_bit_buf_struct bs,
+                         ltp_info* ltp, ia_bit_buf_struct *it_bit_buf,
                          WORD32 frame_len);
 
 #endif
diff --git a/decoder/ixheaacd_headerdecode.c b/decoder/ixheaacd_headerdecode.c
index 356cf08..4e07b8d 100644
--- a/decoder/ixheaacd_headerdecode.c
+++ b/decoder/ixheaacd_headerdecode.c
@@ -49,6 +49,9 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
@@ -65,8 +68,12 @@
 #include "ixheaacd_aacdec.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
-
 #include "ixheaacd_struct_def.h"
 #include "ixheaacd_error_codes.h"
 #include "ixheaacd_definitions.h"
@@ -76,21 +83,18 @@
 
 #include "ixheaacd_interface.h"
 #include "ixheaacd_info.h"
-
+#include "ixheaacd_mps_interface.h"
 #include "ixheaacd_config.h"
 
 #include "ixheaacd_struct.h"
 #include "ixheaacd_function_selector.h"
+#include "ixheaacd_ld_mps_dec.h"
 
 #include "ixheaacd_error_standards.h"
 
-#undef ALLOW_SMALL_FRAMELENGTH
-
-#define ALLOW_SMALL_FRAMELENGTH
-#ifdef ALLOW_SMALL_FRAMELENGTH
-#undef FRAME_SIZE_SMALL
-#define FRAME_SIZE_SMALL 960
-#endif
+#define ELDEXT_SAOC 1
+#define ELDEXT_TERM 0
+#define ELDEXT_LDSAC 2
 
 extern const WORD32 ixheaacd_sampl_freq_idx_table[17];
 
@@ -98,10 +102,6 @@
 
 #define ADTS_HEADER_LENGTH 7
 
-#undef ALLOW_SMALL_FRAMELENGTH
-
-#define ALLOW_SMALL_FRAMELENGTH
-
 static PLATFORM_INLINE VOID
 ixheaacd_aac_bytealign(struct ia_bit_buf_struct *it_bit_buff) {
   WORD16 num_bit;
@@ -165,12 +165,12 @@
       && (ptr_config_element->object_type + 1) != 4
 
       ) {
-    return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
   }
 
   ptr_config_element->samp_freq_index = ixheaacd_read_bits_buf(it_bit_buff, 4);
   if (ptr_config_element->samp_freq_index > 11) {
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
+    return IA_XHEAAC_DEC_EXE_NONFATAL_DECODE_FRAME_ERROR;
   }
 
   tmp = ixheaacd_read_bits_buf(it_bit_buff, 21);
@@ -184,7 +184,7 @@
   count += ptr_config_element->num_valid_cc_elements = tmp & 0xF;
 
   if (count > MAX_BS_ELEMENT) {
-    return IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
+    return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
   }
 
   ixheaacd_read_pce_mixdown_data(it_bit_buff, 1, 4);
@@ -303,12 +303,12 @@
   while (1) {
     ixheaacd_read_bidirection(it_bit_buff, -4);
     if (it_bit_buff->cnt_bits < 12) {
-      return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+      return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
     }
     adts->sync_word = (WORD16)ixheaacd_read_bits_buf(it_bit_buff, 12);
     if (adts->sync_word == 0xFFF) {
       ixheaacd_read_bidirection(it_bit_buff, -12);
-      return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+      return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
     }
   }
 }
@@ -339,7 +339,7 @@
   if (((adts->profile != AAC_LC_PROFILE)) || (adts->samp_freq_index > 11))
 
   {
-    return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
   }
 
   tmp = ixheaacd_read_bits_buf(it_bit_buff, 21);
@@ -488,8 +488,8 @@
                            struct ia_bit_buf_struct *it_bit_buff) {
   WORD32 tmp;
   WORD32 cnt_bits = it_bit_buff->cnt_bits;
-  WORD32 dummy = 0;
   UWORD32 aot_init;
+  UWORD32 tmp_aot;
 
   ia_audio_specific_config_struct *pstr_audio_specific_config;
 
@@ -505,15 +505,22 @@
       it_bit_buff->bit_pos;
 
   aot_init = aac_state_struct->audio_object_type;
+  aac_state_struct->frame_length = FRAME_SIZE;
 
-  aac_state_struct->audio_object_type = ixheaacd_read_bits_buf(it_bit_buff, 5);
+  tmp_aot = ixheaacd_read_bits_buf(it_bit_buff, 5);
 
-  if (aac_state_struct->audio_object_type == 31) {
+  if (tmp_aot == 31) {
     tmp = ixheaacd_read_bits_buf(it_bit_buff, 6);
-    aac_state_struct->audio_object_type = 32 + tmp;
+    tmp_aot = 32 + tmp;
   }
+
+  if (aac_state_struct->header_dec_done || aac_state_struct->ui_init_done) {
+    if (tmp_aot != aot_init && tmp_aot != AOT_SBR && tmp_aot != AOT_PS)
+      return IA_FATAL_ERROR;
+  }
+
   pstr_audio_specific_config->audio_object_type =
-      aac_state_struct->audio_object_type;
+      aac_state_struct->audio_object_type = tmp_aot;
 
   tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
                                pstr_audio_specific_config);
@@ -521,7 +528,7 @@
 
   if (tmp == -1) {
     *bytes_consumed = 1;
-    return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
   } else
     aac_state_struct->sampling_rate = tmp;
   aac_state_struct->p_config->ui_samp_freq = tmp;
@@ -538,7 +545,7 @@
     aac_state_struct->sbr_present_flag = 1;
     if (tmp == -1) {
       *bytes_consumed = 1;
-      return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+      return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
     } else
       aac_state_struct->extension_samp_rate = tmp;
 
@@ -556,6 +563,7 @@
        aac_state_struct->audio_object_type == AOT_TWIN_VQ ||
        aac_state_struct->audio_object_type == AOT_ER_AAC_LD ||
        aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
+       aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL ||
        aac_state_struct->audio_object_type == AOT_ER_AAC_LC) &&
       aac_state_struct->audio_object_type != AOT_USAC)
 
@@ -580,7 +588,9 @@
       }
     }
     if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
-        aac_state_struct->audio_object_type == AOT_ER_AAC_LD) {
+        aac_state_struct->audio_object_type == AOT_ER_AAC_LD ||
+        aac_state_struct->audio_object_type == AOT_ER_AAC_LC ||
+        aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL) {
       aac_state_struct->eld_specific_config.aac_sect_data_resil_flag = 0;
       aac_state_struct->eld_specific_config.aac_sf_data_resil_flag = 0;
       aac_state_struct->eld_specific_config.aac_spect_data_resil_flag = 0;
@@ -594,10 +604,10 @@
               ixheaacd_read_bits_buf(it_bit_buff, 1);
           aac_state_struct->eld_specific_config.aac_spect_data_resil_flag =
               ixheaacd_read_bits_buf(it_bit_buff, 1);
-          if (aac_state_struct->audio_object_type != AOT_ER_AAC_ELD)
+          if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
             aac_state_struct->eld_specific_config.ep_config =
                 ixheaacd_read_bits_buf(it_bit_buff, 2);
-          else
+          if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD)
             aac_state_struct->eld_specific_config.ld_sbr_flag_present =
                 ixheaacd_read_bits_buf(it_bit_buff, 1);
         }
@@ -610,156 +620,209 @@
       pstr_audio_specific_config->ext_audio_object_type = 0;
     }
 
-    {{size_t tmp = 0xf;
-    UWORD32 i;
-    WORD32 err = 0;
+    {
+      {
+        SIZE_T tmp = 0xf;
+        UWORD32 i;
+        WORD32 err = 0;
 
-    aac_state_struct->usac_flag = 1;
+        aac_state_struct->usac_flag = 1;
 
-    ixheaacd_conf_default(&(pstr_audio_specific_config->str_usac_config));
-    err = ixheaacd_config(it_bit_buff,
-                          &(pstr_audio_specific_config->str_usac_config),
-                          &(pstr_audio_specific_config->channel_configuration));
-    if (err != 0) return err;
+        ixheaacd_conf_default(&(pstr_audio_specific_config->str_usac_config));
+        err = ixheaacd_config(it_bit_buff, &(pstr_audio_specific_config->str_usac_config),
+                              &(pstr_audio_specific_config->channel_configuration),
+                              aac_state_struct->ec_enable);
+        if (err != 0) return err;
 
-    pstr_audio_specific_config->sampling_frequency =
-        pstr_audio_specific_config->str_usac_config.usac_sampling_frequency;
+        pstr_audio_specific_config->sampling_frequency =
+            pstr_audio_specific_config->str_usac_config.usac_sampling_frequency;
 
-    if (pstr_audio_specific_config->audio_object_type == AOT_USAC) {
-      pstr_audio_specific_config->sbr_present_flag = 1;
-      pstr_audio_specific_config->ext_audio_object_type = AOT_SBR;
-      pstr_audio_specific_config->ext_sampling_frequency =
-          pstr_audio_specific_config->sampling_frequency;
-      pstr_audio_specific_config->ext_samp_frequency_index =
-          pstr_audio_specific_config->samp_frequency_index;
+        if (pstr_audio_specific_config->audio_object_type == AOT_USAC) {
+          pstr_audio_specific_config->sbr_present_flag = 1;
+          pstr_audio_specific_config->ext_audio_object_type = AOT_SBR;
+          pstr_audio_specific_config->ext_sampling_frequency =
+              pstr_audio_specific_config->sampling_frequency;
+          pstr_audio_specific_config->ext_samp_frequency_index =
+              pstr_audio_specific_config->samp_frequency_index;
 
-      for (i = 0; i < sizeof(ixheaacd_sampl_freq_idx_table) /
-                          sizeof(ixheaacd_sampl_freq_idx_table[0]);
-           i++) {
-        if (ixheaacd_sampl_freq_idx_table[i] ==
-            (int)(pstr_audio_specific_config->sampling_frequency)) {
-          tmp = i;
+          for (i = 0; i < sizeof(ixheaacd_sampl_freq_idx_table) /
+                              sizeof(ixheaacd_sampl_freq_idx_table[0]);
+               i++) {
+            if (ixheaacd_sampl_freq_idx_table[i] ==
+                (int)(pstr_audio_specific_config->sampling_frequency)) {
+              tmp = i;
+              break;
+            }
+          }
+          pstr_audio_specific_config->samp_frequency_index = (UINT32)tmp;
+        } else {
+          pstr_audio_specific_config->sbr_present_flag = 0;
+        }
+      }
+    }
+
+    if (aac_state_struct->bs_format != LOAS_BSFORMAT) {
+      ixheaacd_skip_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
+
+      if ((SIZE_T)it_bit_buff->ptr_read_next ==
+          (SIZE_T)it_bit_buff->ptr_bit_buf_base) {
+        *bytes_consumed = ((WORD32)it_bit_buff->size) >> 3;
+      } else {
+        *bytes_consumed = (WORD32)((((((SIZE_T)it_bit_buff->ptr_read_next -
+                              (SIZE_T)it_bit_buff->ptr_bit_buf_base))
+                            << 3) +
+                            7 - it_bit_buff->bit_pos + 7) >>
+                            3);
+      }
+    }
+    return 0;
+  }
+
+  aac_state_struct->frame_length = FRAME_SIZE;
+  if (aac_state_struct->frame_len_flag)
+    aac_state_struct->frame_length = FRAME_SIZE_SMALL;
+
+  if (aac_state_struct->extension_flag)
+    aac_state_struct->extension_flag_3 = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+  if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
+    aac_state_struct->frame_length >>= 1;
+
+  if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
+    aac_state_struct->frame_length >>= 1;
+    if (aac_state_struct->eld_specific_config.ld_sbr_flag_present) {
+      aac_state_struct->eld_specific_config.ld_sbr_samp_rate =
+          ixheaacd_read_bits_buf(it_bit_buff, 1);
+      aac_state_struct->eld_specific_config.ld_sbr_crc_flag =
+          ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+      ixheaacd_eld_sbr_header(it_bit_buff, aac_state_struct->ch_config,
+                              &aac_state_struct->str_sbr_config);
+
+      aac_state_struct->dwnsmp_signal =
+          !aac_state_struct->eld_specific_config.ld_sbr_samp_rate;
+    }
+
+    {
+      UWORD16 len, eld_ext_type;
+      WORD32 err;
+      UWORD16 cnt;
+
+      if (ixheaacd_show_bits_buf(it_bit_buff, 4) != ELDEXT_TERM) {
+        while ((eld_ext_type = ixheaacd_read_bits_buf(it_bit_buff, 4)) !=
+               ELDEXT_TERM) {
+          len = ixheaacd_read_bits_buf(it_bit_buff, 4);
+          if (len == 15) {
+            len += ixheaacd_read_bits_buf(it_bit_buff, 8);
+          }
+          if (len == 15 + 255) {
+            len += ixheaacd_read_bits_buf(it_bit_buff, 16);
+          }
+
+          switch (eld_ext_type) {
+            case ELDEXT_SAOC:
+              break;
+            case ELDEXT_LDSAC:
+              aac_state_struct->ldmps_present = 1;
+              aac_state_struct->mps_dec_handle.ldmps_config.ldmps_present_flag =
+                  1;
+              aac_state_struct->mps_dec_handle.object_type =
+                  aac_state_struct->audio_object_type;
+              aac_state_struct->mps_dec_handle.ec_flag = aac_state_struct->ec_enable;
+              err = ixheaacd_ld_spatial_specific_config(
+                  &(aac_state_struct->mps_dec_handle.ldmps_config), it_bit_buff);
+              if (err) return err;
+
+              if (ixheaacd_mps_create(
+                      &aac_state_struct->mps_dec_handle,
+                      aac_state_struct->mps_dec_handle.ldmps_config
+                          .bs_frame_length,
+                      0, &(aac_state_struct->mps_dec_handle.ldmps_config))) {
+                return -1;
+              }
+              break;
+            default:
+              for (cnt = 0; cnt < len; cnt++) {
+                ixheaacd_read_bits_buf(it_bit_buff, 8);
+              }
+
+              break;
+          }
           break;
         }
       }
-      pstr_audio_specific_config->samp_frequency_index = (UINT32)tmp;
-    } else {
-      pstr_audio_specific_config->sbr_present_flag = 0;
     }
+    if (!((aac_state_struct->ldmps_present == 1) &&
+          !(it_bit_buff->cnt_bits >= 1)))
+    ixheaacd_read_bits_buf(it_bit_buff, 1);
   }
-}
-
-{
-  dummy = ixheaacd_skip_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
-
-  if ((SIZE_T)it_bit_buff->ptr_read_next ==
-      (SIZE_T)it_bit_buff->ptr_bit_buf_base) {
-    *bytes_consumed = ((WORD32)it_bit_buff->size) >> 3;
-  } else {
-    *bytes_consumed = (((((SIZE_T)it_bit_buff->ptr_read_next -
-                          (SIZE_T)it_bit_buff->ptr_bit_buf_base))
-                        << 3) +
-                       7 - it_bit_buff->bit_pos + 7) >>
-                      3;
-  }
-}
-return 0;
-}
-
-aac_state_struct->frame_length = FRAME_SIZE;
-if (aac_state_struct->frame_len_flag)
-#ifdef ALLOW_SMALL_FRAMELENGTH
-  aac_state_struct->frame_length = FRAME_SIZE_SMALL;
-#else
-  return -1;
-#endif
-
-if (aac_state_struct->extension_flag)
-  aac_state_struct->extension_flag_3 = ixheaacd_read_bits_buf(it_bit_buff, 1);
-
-if (aac_state_struct->audio_object_type == AOT_ER_AAC_LD)
-  aac_state_struct->frame_length >>= 1;
-
-if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
-  aac_state_struct->frame_length >>= 1;
-  if (aac_state_struct->eld_specific_config.ld_sbr_flag_present) {
-    aac_state_struct->eld_specific_config.ld_sbr_samp_rate =
-        ixheaacd_read_bits_buf(it_bit_buff, 1);
-    aac_state_struct->eld_specific_config.ld_sbr_crc_flag =
-        ixheaacd_read_bits_buf(it_bit_buff, 1);
-
-    ixheaacd_eld_sbr_header(it_bit_buff, aac_state_struct->ch_config,
-                            &aac_state_struct->str_sbr_config);
-
-    aac_state_struct->dwnsmp_signal =
-        !aac_state_struct->eld_specific_config.ld_sbr_samp_rate;
-  }
-
-  ixheaacd_read_bits_buf(it_bit_buff, 1);
-}
-if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD) {
-  int ep_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
-  if (ep_config == 2 || ep_config == 3) {
-  }
-  if (ep_config == 3) {
-    int direct_map = ixheaacd_read_bits_buf(it_bit_buff, 1);
-    if (!direct_map) {
-    }
-  }
-}
-
-tmp = (header_len * 8) - it_bit_buff->cnt_bits;
-
-if (aac_state_struct->audio_object_type != AOT_SBR &&
-    (it_bit_buff->cnt_bits >= 16)) {
-  tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
-
-  if (tmp == 0x2b7) {
-    tmp = ixheaacd_read_bits_buf(it_bit_buff, 5);
-
-    if (tmp == AOT_SBR) {
-      WORD32 sbr_present_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
-      if (sbr_present_flag) {
-        tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
-                                     pstr_audio_specific_config);
-        if (tmp == -1) {
-          *bytes_consumed = 1;
-          return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
-        } else
-          aac_state_struct->extension_samp_rate = tmp;
-
-        if (it_bit_buff->cnt_bits >= 12) {
-          tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
-          if (tmp == 0x548) {
-            tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
-          }
+  if (!((aac_state_struct->ldmps_present == 1) && !(it_bit_buff->cnt_bits > 0))) {
+    if (aac_state_struct->audio_object_type == AOT_ER_AAC_ELD ||
+        aac_state_struct->audio_object_type == AOT_ER_AAC_LC ||
+        aac_state_struct->audio_object_type == AOT_ER_AAC_SCAL) {
+      WORD32 ep_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
+      if (ep_config == 2 || ep_config == 3) {
+      }
+      if (ep_config == 3) {
+        WORD32 direct_map = ixheaacd_read_bits_buf(it_bit_buff, 1);
+        if (!direct_map) {
         }
       }
     }
-  } else if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
-    ixheaacd_read_bidirection(it_bit_buff, -11);
+
+    tmp = (header_len * 8) - it_bit_buff->cnt_bits;
+
+    if (aac_state_struct->audio_object_type != AOT_SBR &&
+        (it_bit_buff->cnt_bits >= 16)) {
+      tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
+
+      if (tmp == 0x2b7) {
+        tmp = ixheaacd_read_bits_buf(it_bit_buff, 5);
+
+        if (tmp == AOT_SBR) {
+          WORD32 sbr_present_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
+          if (sbr_present_flag) {
+            tmp = ixheaacd_get_samp_rate(it_bit_buff, pstr_samp_rate_info,
+                                         pstr_audio_specific_config);
+            if (tmp == -1) {
+              *bytes_consumed = 1;
+              return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
+            } else
+              aac_state_struct->extension_samp_rate = tmp;
+
+            if (it_bit_buff->cnt_bits >= 12) {
+              tmp = ixheaacd_read_bits_buf(it_bit_buff, 11);
+              if (tmp == 0x548) {
+                tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
+              }
+            }
+          }
+        }
+      } else if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
+        ixheaacd_read_bidirection(it_bit_buff, -11);
+      }
+    }
   }
-}
 
-if (aac_state_struct->audio_object_type != AOT_AAC_LC &&
-    aac_state_struct->audio_object_type != AOT_SBR &&
-    aac_state_struct->audio_object_type != AOT_PS &&
-    aac_state_struct->audio_object_type != AOT_ER_AAC_LC &&
-    aac_state_struct->audio_object_type != AOT_ER_AAC_LD &&
-    aac_state_struct->audio_object_type != AOT_ER_AAC_ELD &&
-    aac_state_struct->audio_object_type != AOT_AAC_LTP) {
-  *bytes_consumed = 1;
-  return IA_ENHAACPLUS_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
-} else {
-  if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
-    *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) >> 3;
-    if (it_bit_buff->bit_pos < 7) *bytes_consumed += 1;
+  if (aac_state_struct->audio_object_type != AOT_AAC_LC &&
+      aac_state_struct->audio_object_type != AOT_SBR &&
+      aac_state_struct->audio_object_type != AOT_PS &&
+      aac_state_struct->audio_object_type != AOT_ER_AAC_LC &&
+      aac_state_struct->audio_object_type != AOT_ER_AAC_LD &&
+      aac_state_struct->audio_object_type != AOT_ER_AAC_ELD &&
+      aac_state_struct->audio_object_type != AOT_AAC_LTP) {
+    *bytes_consumed = 1;
+    return IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
+  } else {
+    if (aac_state_struct->bs_format == LOAS_BSFORMAT) {
+      *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) >> 3;
+      if (it_bit_buff->bit_pos < 7) *bytes_consumed += 1;
 
-  } else
-    *bytes_consumed = header_len;
+    } else
+      *bytes_consumed = header_len;
 
-  return 0;
-}
+    return 0;
+  }
 }
 
 WORD32 ixheaacd_check_if_adts(ia_adts_header_struct *adts,
@@ -807,7 +870,7 @@
         if (it_bit_buff->cnt_bits < 13) {
           ixheaacd_read_bidirection(it_bit_buff, -11);
           *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
-          return (IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
+          return (IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START);
         }
       }
 
@@ -833,10 +896,16 @@
         }
 
       } else {
-        ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
-        bit_count -= (13 + 11);
-        *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
-        return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+        if (it_bit_buff->cnt_bits != audio_mux_len_bits_last) {
+          ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
+          bit_count -= (13 + 11);
+          *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
+          return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+        } else {
+          ixheaacd_read_bidirection(it_bit_buff, -(13 + 11));
+          bit_count -= (13 + 11);
+          break;
+        }
       }
     } while (1);
 
@@ -851,7 +920,7 @@
         ixheaacd_read_bidirection(it_bit_buff, -25);
         bit_count -= 11;
         *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
-        return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
+        return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
       }
 
       audio_mux_len_bytes_last = ixheaacd_read_bits_buf(it_bit_buff, 13);
@@ -860,22 +929,21 @@
       use_same_stream_mux = ixheaacd_read_bits_buf(it_bit_buff, 1);
       bit_count += 1;
 
-      if (it_bit_buff->cnt_bits - (audio_mux_len_bytes_last * 8 - 1 + 11) < 0) {
-        ixheaacd_read_bidirection(it_bit_buff, -25);
-        bit_count -= 25;
-        aac_state_struct->bit_count = bit_count;
-        *bytes_consumed = (cnt_bits - it_bit_buff->cnt_bits) / 8;
-        return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
-      }
-
       if (!use_same_stream_mux) {
         ixheaacd_read_bidirection(it_bit_buff, -25);
         bit_count -= 25;
         sync_status = 1;
         aac_state_struct->sync_status = sync_status;
         break;
+      } else {
+        ixheaacd_read_bidirection(it_bit_buff, -25);
+        bit_count -= 25;
+        aac_state_struct->bit_count = bit_count;
+        *bytes_consumed = 1;
+        return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
       }
 
+
       ixheaacd_read_bidirection(it_bit_buff, audio_mux_len_bytes_last * 8 - 1);
       bit_count += audio_mux_len_bytes_last * 8 - 1;
 
@@ -930,7 +998,7 @@
           ->str_sample_rate_info[0];
 
   if (buffer == 0) {
-    return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+    return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
   }
 
   header_len = aac_state_struct->ui_in_bytes;
@@ -968,6 +1036,13 @@
       handle_bit_buff->pstr_adts_crc_info = &handle_bit_buff->str_adts_crc_info;
       ixheaacd_adts_crc_open(handle_bit_buff->pstr_adts_crc_info);
 
+      aac_state_struct->ldmps_present = 0;
+      aac_state_struct->latm_initialized = 0;
+      memset(&aac_state_struct->mps_dec_handle, 0,
+             sizeof(aac_state_struct->mps_dec_handle));
+      memset(&aac_state_struct->eld_specific_config, 0,
+             sizeof(aac_state_struct->eld_specific_config));
+
       if ((buffer[0] == 'A') && (buffer[1] == 'D') && (buffer[2] == 'I') &&
           (buffer[3] == 'F')) {
         adif.prog_config_present = 0;
@@ -1049,9 +1124,9 @@
         if (result != 0) {
           if ((result ==
                (WORD32)
-                   IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) ||
+                   IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES) ||
               (result ==
-               (WORD32)IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX)) {
+               (WORD32)IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX)) {
             bytes_taken += *bytes_consumed;
             *bytes_consumed = bytes_taken;
             return result;
@@ -1095,7 +1170,7 @@
         case AOT_USAC:
           break;
         default:
-          return IA_ENHAACPLUS_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
+          return IA_XHEAAC_DEC_INIT_FATAL_AUDIOOBJECTTYPE_NOT_SUPPORTED;
       }
 
     if (aac_state_struct->audio_object_type != AOT_USAC)
@@ -1106,12 +1181,12 @@
         (handle_bit_buff->size <
          (usr_max_ch * (IA_ENHAACPLUS_DEC_INP_BUF_SIZE << 3)))) {
       return (WORD16)(
-          (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
     }
 
     if (header_found == 0) {
       *bytes_consumed = bytes_taken + 1;
-      return IA_ENHAACPLUS_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
+      return IA_XHEAAC_DEC_INIT_NONFATAL_HEADER_NOT_AT_START;
     } else {
       return 0;
     }
diff --git a/decoder/ixheaacd_headerdecode.h b/decoder/ixheaacd_headerdecode.h
index f813de6..3aa9b92 100644
--- a/decoder/ixheaacd_headerdecode.h
+++ b/decoder/ixheaacd_headerdecode.h
@@ -57,7 +57,12 @@
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD ch_idx1,
     WORD *ch_idx, WORD *channel, WORD *element_index_order, WORD total_elements,
     WORD8 *element_used, WORD total_channels, ia_drc_dec_struct *pstr_drc_dec,
-    ia_drc_dec_struct *drc_dummy);
+    ia_drc_dec_struct *drc_dummy
+    ,
+    UWORD8 *mps_buffer,
+    WORD32 *mps_header,
+    WORD32 *mps_bytes
+);
 
 WORD32 ixheaacd_latm_audio_mux_element(
     struct ia_bit_buf_struct *it_bit_buff, ixheaacd_latm_struct *latm_element,
diff --git a/decoder/ixheaacd_huff_code_reorder.c b/decoder/ixheaacd_huff_code_reorder.c
index 0cc07ed..08b2318 100644
--- a/decoder/ixheaacd_huff_code_reorder.c
+++ b/decoder/ixheaacd_huff_code_reorder.c
@@ -20,6 +20,7 @@
 #include <string.h>
 #include "ixheaacd_sbr_common.h"
 #include "ixheaacd_type_def.h"
+#include "ixheaacd_error_standards.h"
 
 #include "ixheaacd_constants.h"
 #include "ixheaacd_basic_ops32.h"
@@ -34,7 +35,9 @@
 #include "ixheaacd_pns.h"
 
 #include "ixheaacd_lt_predict.h"
-
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 
 #include "ixheaacd_drc_data_struct.h"
@@ -49,7 +52,7 @@
 #include "ixheaacd_aacdec.h"
 
 #include "ixheaacd_sbrdecsettings.h"
-
+#include "ixheaacd_sbr_scale.h"
 #include "ixheaacd_env_extr_part.h"
 #include "ixheaacd_sbr_rom.h"
 #include "ixheaacd_audioobjtypes.h"
@@ -57,10 +60,16 @@
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_struct_def.h"
 
-#include "ixheaacd_cnst.h"
 #include "ixheaacd_rvlc.h"
 
 const UWORD8 ixheaacd_min_huff_cb_pair_tbl[MAX_CB_PAIRS] = {
@@ -1131,8 +1140,10 @@
 
     if (codebook <= 4) {
       WORD32 tbl_sign = 0;
-      const UWORD16 *cb_table = (UWORD16 *)(ptr_aac_tables->code_book[codebook]);
-      const UWORD32 *idx_table = (UWORD32 *)(ptr_aac_tables->index_table[codebook]);
+      const UWORD16 *cb_table =
+          (UWORD16 *)(ptr_aac_tables->code_book[codebook]);
+      const UWORD32 *idx_table =
+          (UWORD32 *)(ptr_aac_tables->index_table[codebook]);
 
       if (codebook > 2) {
         tbl_sign = 1;
@@ -1168,8 +1179,10 @@
       {
         WORD32 tbl_sign = 0;
         WORD32 huff_mode = 9;
-        const UWORD16 *cb_table = (UWORD16 *)(ptr_aac_tables->code_book[codebook]);
-        const UWORD32 *idx_table = (UWORD32 *)(ptr_aac_tables->index_table[codebook]);
+        const UWORD16 *cb_table =
+            (UWORD16 *)(ptr_aac_tables->code_book[codebook]);
+        const UWORD32 *idx_table =
+            (UWORD32 *)(ptr_aac_tables->index_table[codebook]);
         num_decoded_bits = 0;
 
         if (codebook > 6) {
@@ -1360,11 +1373,12 @@
 
   WORD32 read_word;
   WORD32 increment;
+  UWORD8 *ptr_read_next;
 
   read_word = ixheaacd_aac_showbits_32(itt_bit_buff->byte_ptr,
                                        itt_bit_buff->bit_count, &increment);
 
-  UWORD8 *ptr_read_next = itt_bit_buff->byte_ptr;
+  ptr_read_next = itt_bit_buff->byte_ptr;
   ptr_read_next += increment;
 
   ixheaacd_huff_sfb_table(read_word, &index, &length, code_book_tbl, idx_table);
diff --git a/decoder/ixheaacd_hybrid.h b/decoder/ixheaacd_hybrid.h
index 3fb080f..83f3cfa 100644
--- a/decoder/ixheaacd_hybrid.h
+++ b/decoder/ixheaacd_hybrid.h
@@ -26,6 +26,15 @@
 #define NO_HYBRID_CHANNELS_LOW 2
 #define NO_HYBRID_CHANNELS_HIGH 8
 
+#define NO_HYBRID_CHANNELS_2 2
+#define NO_HYBRID_CHANNELS_4 4
+#define NO_HYBRID_CHANNELS_8 8
+#define NO_HYBRID_CHANNELS_12 12
+#define MAX_NUM_QMF_CHANNELS 64
+
+#define REAL 0
+#define CPLX 1
+
 typedef struct {
   const WORD16 *ptr_resol;
   WORD8 ptr_qmf_buf;
@@ -37,6 +46,18 @@
   WORD32 *ptr_temp_im;
 } ia_hybrid_struct;
 
+typedef struct {
+  WORD32 num_qmf_bands;
+  WORD32 frame_size;
+  WORD16 *ptr_resol;
+  FLOAT32 *ptr_work_re;
+  FLOAT32 *ptr_work_im;
+  FLOAT32 (*ptr_qmf_buf_re)[HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 (*ptr_qmf_buf_im)[HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 (*ptr_temp_re)[MAX_NUM_QMF_CHANNELS];
+  FLOAT32 (*ptr_temp_im)[MAX_NUM_QMF_CHANNELS];
+} ia_hybrid_flt_struct;
+
 VOID ixheaacd_hybrid_analysis(const WORD32 *ptr_qmf_real, WORD32 *ptr_hyb_real,
                               WORD32 *ptr_hyb_imag,
                               ia_hybrid_struct *ptr_hybrid, WORD16 scale,
diff --git a/decoder/ixheaacd_imdct.c b/decoder/ixheaacd_imdct.c
index 08a89fc..512cbc3 100644
--- a/decoder/ixheaacd_imdct.c
+++ b/decoder/ixheaacd_imdct.c
@@ -25,8 +25,10 @@
 #include "ixheaacd_type_def.h"
 #include "ixheaacd_interface.h"
 
+#include "ixheaacd_defines.h"
+#include "ixheaacd_aac_rom.h"
+
 #include "ixheaacd_bitbuffer.h"
-#include "ixheaacd_interface.h"
 
 #include "ixheaacd_tns_usac.h"
 #include "ixheaacd_cnst.h"
@@ -42,7 +44,15 @@
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
+
+#include "ixheaacd_pulsedata.h"
+#include "ixheaacd_pns.h"
+#include "ixheaacd_lt_predict.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_ec.h"
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_windows.h"
 
@@ -65,6 +75,7 @@
 extern const WORD32 ixheaacd_pre_post_twid_cos_48[48];
 extern const WORD32 ixheaacd_pre_post_twid_sin_48[48];
 extern const FLOAT64 ixheaacd_power_10_table[28];
+extern const ia_usac_samp_rate_info ixheaacd_samp_rate_info[];
 
 #define ABS(A) ((A) < 0 ? (-A) : (A))
 
@@ -135,12 +146,11 @@
   }
 }
 
-static WORD32 ixheaacd_fft_based_imdct(WORD32 *data, WORD32 npoints,
-                                       WORD32 *preshift, WORD32 *tmp_data) {
+static VOID ixheaacd_fft_based_imdct(WORD32 *data, WORD32 npoints, WORD32 *preshift,
+                                     WORD32 *tmp_data) {
   WORD32 *data_r;
   WORD32 *data_i;
   WORD32 nlength = npoints >> 1;
-  WORD32 err = 0;
   const WORD32 *cos_ptr;
   const WORD32 *sin_ptr;
 
@@ -165,20 +175,19 @@
   }
 
   (*ixheaacd_calc_pre_twid)(data, data_r, data_i, nlength, cos_ptr, sin_ptr);
-  err = ixheaacd_complex_fft(data_r, data_i, nlength, 1, preshift);
-  if (err) return err;
+  ixheaacd_complex_fft(data_r, data_i, nlength, 1, preshift);
+
   (*ixheaacd_calc_post_twid)(data, data_r, data_i, nlength, cos_ptr, sin_ptr);
-  return err;
+  return;
 }
 
 #define N_LONG_LEN_MAX 1024
 
-WORD32 ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift,
+VOID ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift,
                             WORD32 *tmp_data) {
   WORD32 preshift = 0;
   WORD32 i;
   WORD32 k = (npoints / 2);
-  WORD32 err = 0;
 
   while (((k & 1) == 0) & (k != 1)) {
     k = k >> 1;
@@ -192,11 +201,10 @@
     preshift++;
   }
 
-  err = ixheaacd_fft_based_imdct(imdct_in, npoints / 2, &preshift, tmp_data);
-  if (err) return err;
+  ixheaacd_fft_based_imdct(imdct_in, npoints / 2, &preshift, tmp_data);
   preshift += 2;
   *qshift -= preshift;
-  return err;
+  return;
 }
 
 IA_ERRORCODE ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch,
@@ -212,7 +220,6 @@
   WORD8 qshift2 = 0;
   WORD8 qshift3 = 0;
   WORD32 preshift = 0;
-  IA_ERRORCODE err = IA_NO_ERROR;
 
   FLOAT32 *last_lpc = usac_data->lpc_prev[i_ch];
   FLOAT32 *acelp_in = usac_data->acelp_in[i_ch];
@@ -281,10 +288,39 @@
     x_in[lfac / 2 + k] = fac_data[lfac - 2 * k];
   }
 
-  err = ixheaacd_fr_alias_cnx_fix(x_in, n_long / 4, lfac, i_aq, izir,
-                                  fac_idata + 16, &qshift1, qshift2, qshift3,
-                                  &preshift, ptr_scratch);
-  if (err) return err;
+  if (FAC_LENGTH < lfac) {
+    if (usac_data->ec_flag == 0)
+      return -1;
+    else
+      lfac = FAC_LENGTH;
+  }
+
+  if ((n_long / 8) < lfac) {
+    if (usac_data->ec_flag == 0)
+      return -1;
+    else
+      lfac = (n_long / 8);
+  }
+
+  if ((n_long / 8 + 1) > (2 * LEN_FRAME - lfac - 1)) {
+    if (usac_data->ec_flag == 0)
+      return -1;
+    else
+      lfac = (2 * LEN_FRAME) - (n_long / 8);
+  }
+
+  if (lfac & (lfac - 1)) {
+    if ((lfac != 48) && (lfac != 96) && (lfac != 192) && (lfac != 384) && (lfac != 768)) {
+      if (usac_data->ec_flag == 0)
+        return -1;
+      else
+        lfac = 48;
+    }
+  }
+
+  ixheaacd_fr_alias_cnx_fix(x_in, n_long / 4, lfac, i_aq, izir, fac_idata + 16, &qshift1, qshift2,
+                            qshift3, &preshift, ptr_scratch);
+
   preshift += 4;
   *q_fac = (qshift1 - preshift);
 
@@ -321,8 +357,19 @@
   ia_usac_lpd_decoder_handle st = usac_data->str_tddec[i_ch];
   WORD32 err_code = 0;
 
-  max_shift =
-      ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long);
+  if (usac_data->ec_flag) {
+    td_frame_prev = usac_data->td_frame_prev_ec[i_ch];
+  } else {
+    if (ixheaacd_drc_offset->n_short & (ixheaacd_drc_offset->n_short - 1)) {
+      if ((ixheaacd_drc_offset->n_short != 48) && (ixheaacd_drc_offset->n_short != 96) &&
+          (ixheaacd_drc_offset->n_short != 192) && (ixheaacd_drc_offset->n_short != 384) &&
+          (ixheaacd_drc_offset->n_short != 768)) {
+        return -1;
+      }
+    }
+  }
+
+  max_shift = ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long);
   ixheaacd_normalize(p_in_ibuffer, max_shift, ixheaacd_drc_offset->n_long);
   shiftp = max_shift + 6;
   input_q = shiftp;
@@ -335,10 +382,9 @@
 
   for (k = 0; k < 8; k++) {
     shiftp = input_q;
-    err_code = ixheaacd_acelp_imdct(
+    ixheaacd_acelp_imdct(
         p_in_ibuffer + (k * ixheaacd_drc_offset->n_short),
         2 * ixheaacd_drc_offset->n_short, &shiftp, scratch_mem);
-    if (err_code) return err_code;
   }
 
   max_shift =
@@ -347,11 +393,10 @@
   shiftp += max_shift - 1;
 
   err_code = ixheaacd_calc_window(&window_short, ixheaacd_drc_offset->n_short,
-                                  window_select);
+                                  window_select, usac_data->ec_flag);
   if (err_code == -1) return err_code;
-  err_code =
-      ixheaacd_calc_window(&window_short_prev_ptr,
-                           ixheaacd_drc_offset->n_trans_ls, window_select_prev);
+  err_code = ixheaacd_calc_window(&window_short_prev_ptr, ixheaacd_drc_offset->n_trans_ls,
+                                  window_select_prev, usac_data->ec_flag);
   if (err_code == -1) return err_code;
 
   if (fac_apply)
@@ -431,7 +476,7 @@
                                            offset_lengths *ixheaacd_drc_offset,
                                            WORD8 fac_q) {
   FLOAT32 qfac;
-  WORD32 *window_long_prev, k, i, *window_short_prev_ptr;
+  WORD32 *window_long_prev = NULL, k, i, *window_short_prev_ptr = NULL;
 
   WORD32 *p_in_ibuffer = usac_data->coef_fix[i_ch];
   WORD32 *p_overlap_ibuffer = usac_data->overlap_data_ptr[i_ch];
@@ -449,15 +494,25 @@
   ia_usac_lpd_decoder_handle st = usac_data->str_tddec[i_ch];
 
   WORD32 err_code = 0;
+  if (usac_data->ec_flag) {
+    td_frame_prev = usac_data->td_frame_prev_ec[i_ch];
+  } else {
+    if (ixheaacd_drc_offset->n_long & (ixheaacd_drc_offset->n_long - 1)) {
+      if ((ixheaacd_drc_offset->n_long != 48) && (ixheaacd_drc_offset->n_long != 96) &&
+          (ixheaacd_drc_offset->n_long != 192) && (ixheaacd_drc_offset->n_long != 384) &&
+          (ixheaacd_drc_offset->n_long != 768)) {
+        return -1;
+      }
+    }
+  }
 
   max_shift =
       ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long);
   ixheaacd_normalize(p_in_ibuffer, max_shift, ixheaacd_drc_offset->n_long);
   shiftp = max_shift + 6;
 
-  err_code = ixheaacd_acelp_imdct(p_in_ibuffer, 2 * ixheaacd_drc_offset->n_long,
+  ixheaacd_acelp_imdct(p_in_ibuffer, 2 * ixheaacd_drc_offset->n_long,
                                   &shiftp, scratch_mem);
-  if (err_code) return err_code;
 
   max_shift =
       ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long);
@@ -468,7 +523,7 @@
     case ONLY_LONG_SEQUENCE:
     case LONG_START_SEQUENCE:
       err_code = ixheaacd_calc_window(
-          &window_long_prev, ixheaacd_drc_offset->n_long, window_select_prev);
+          &window_long_prev, ixheaacd_drc_offset->n_long, window_select_prev, usac_data->ec_flag);
       if (err_code == -1) return err_code;
       output_q = ixheaacd_windowing_long1(
           p_in_ibuffer + n_long / 2, p_overlap_ibuffer, window_long_prev,
@@ -480,7 +535,7 @@
     case LONG_STOP_SEQUENCE:
       err_code = ixheaacd_calc_window(&window_short_prev_ptr,
                                       ixheaacd_drc_offset->n_trans_ls,
-                                      window_select_prev);
+                                      window_select_prev, usac_data->ec_flag);
       if (err_code == -1) return err_code;
       if (fac_apply) {
         output_q = ixheaacd_windowing_long2(
@@ -528,10 +583,21 @@
   WORD32 fac_idata[2 * FAC_LENGTH + 16];
   offset_lengths ixheaacd_drc_offset;
   WORD8 fac_q = 0;
-  WORD32 td_frame_prev = usac_data->td_frame_prev[i_ch];
-  WORD32 fac_apply = usac_data->fac_data_present[i_ch];
-  WORD32 window_sequence = usac_data->window_sequence[i_ch];
   IA_ERRORCODE err = IA_NO_ERROR;
+  WORD32 td_frame_prev, fac_apply, window_sequence;
+  if (usac_data->ec_flag) {
+    usac_data->str_error_concealment[i_ch].pstr_ec_scratch =
+        (ia_ec_scratch_str *)&usac_data->str_error_concealment[i_ch].str_ec_scratch;
+    usac_data->core_mode = 0;
+    ixheaacd_usac_apply_ec(usac_data, &ixheaacd_samp_rate_info[0], i_ch);
+  }
+  if (usac_data->ec_flag) {
+    td_frame_prev = usac_data->td_frame_prev_ec[i_ch];
+  } else {
+    td_frame_prev = usac_data->td_frame_prev[i_ch];
+  }
+  fac_apply = usac_data->fac_data_present[i_ch];
+  window_sequence = usac_data->window_sequence[i_ch];
   ixheaacd_drc_offset.n_long = usac_data->ccfl;
   ixheaacd_drc_offset.n_short = ixheaacd_drc_offset.n_long >> 3;
 
@@ -554,7 +620,7 @@
     ixheaacd_drc_offset.n_trans_ls = ixheaacd_drc_offset.n_short;
   }
 
-  if (fac_apply) {
+  if (fac_apply && usac_data->frame_ok == 1) {
     err = ixheaacd_cal_fac_data(usac_data, i_ch, ixheaacd_drc_offset.n_long,
                                 ixheaacd_drc_offset.lfac, fac_idata, &fac_q);
     if (err) return err;
diff --git a/decoder/ixheaacd_info.h b/decoder/ixheaacd_info.h
index 3f4d485..822338c 100644
--- a/decoder/ixheaacd_info.h
+++ b/decoder/ixheaacd_info.h
@@ -20,8 +20,6 @@
 #ifndef IXHEAACD_INFO_H
 #define IXHEAACD_INFO_H
 
-#define chans 51
-
 #define EXT_SBR_DATA 13
 
 typedef struct {
diff --git a/decoder/ixheaacd_init_config.c b/decoder/ixheaacd_init_config.c
index fc2dd09..4285fab 100644
--- a/decoder/ixheaacd_init_config.c
+++ b/decoder/ixheaacd_init_config.c
@@ -23,12 +23,13 @@
 #include <assert.h>
 
 #include "ixheaacd_type_def.h"
-
+#include "ixheaacd_constants.h"
 #include "ixheaacd_bitbuffer.h"
 
 #include "ixheaacd_defines.h"
 #include "ixheaacd_memory_standards.h"
 #include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
 #include "ixheaacd_env_extr_part.h"
 #include "ixheaacd_aac_rom.h"
 #include "ixheaacd_common_rom.h"
@@ -41,27 +42,33 @@
 #include "ixheaacd_drc_dec.h"
 
 #include "ixheaacd_lt_predict.h"
-
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_channel.h"
-#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
 #include "ixheaacd_sbr_common.h"
 
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
 #include "ixheaacd_mps_dec.h"
-
 #include "ixheaacd_struct_def.h"
 
 #include "ixheaacd_config.h"
 #include "ixheaacd_interface.h"
 #include "ixheaacd_info.h"
 #include "ixheaacd_struct.h"
-#include "ixheaacd_constants.h"
 #include "ixheaacd_error_standards.h"
 
 #include "ixheaacd_error_codes.h"
@@ -176,8 +183,9 @@
   *ext_ele_value = value;
 }
 
-static VOID ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config,
-                                        UWORD32 ch_config_index) {
+static IA_ERRORCODE ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config,
+                        UWORD32 ch_config_index, ia_bit_buf_struct *it_bit_buff, WORD32 ec_flag)
+{
   switch (ch_config_index) {
     case 1:
       pstr_usac_config->num_out_channels = 1;
@@ -195,9 +203,14 @@
       break;
 
     default:
-      assert(0);
+      if (ec_flag)
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+            IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+      else
+        return IA_FATAL_ERROR;
       break;
   }
+  return IA_NO_ERROR;
 }
 
 VOID ixheaacd_sbr_config(ia_bit_buf_struct *it_bit_buff,
@@ -377,9 +390,10 @@
 WORD32 ixheaacd_decoder_config(
     ia_bit_buf_struct *it_bit_buff,
     ia_usac_decoder_config_struct *pstr_usac_decoder_config,
-    WORD32 sbr_ratio_index, UINT32 *chan) {
+    WORD32 sbr_ratio_index, UINT32 *chan, WORD32 ec_flag) {
   UWORD32 elem_idx = 0;
   UWORD32 err = 0;
+  WORD32 num_channels = 0;
 
   ixheaacd_read_escape_value(
       it_bit_buff, &(pstr_usac_decoder_config->num_elements), 4, 8, 16);
@@ -387,7 +401,12 @@
   pstr_usac_decoder_config->preroll_flag = 0;
 
   if (pstr_usac_decoder_config->num_elements > USAC_MAX_ELEMENTS) {
-    return -1;
+    if (ec_flag) {
+      pstr_usac_decoder_config->num_elements = USAC_MAX_ELEMENTS;
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    } else {
+      return IA_FATAL_ERROR;
+    }
   }
 
   for (elem_idx = 0; elem_idx < pstr_usac_decoder_config->num_elements;
@@ -400,7 +419,7 @@
 
     switch (pstr_usac_decoder_config->usac_element_type[elem_idx]) {
       case ID_USAC_SCE:
-
+        num_channels++;
         pstr_usac_element_config->tw_mdct =
             ixheaacd_read_bits_buf(it_bit_buff, 1);
         pstr_usac_element_config->noise_filling =
@@ -413,16 +432,28 @@
         break;
 
       case ID_USAC_CPE:
-        if (ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config,
-                                sbr_ratio_index) != IA_NO_ERROR)
-          return IA_FATAL_ERROR;
-        if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2)
-          return -1;
-
+        num_channels += 2;
+        if (ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config, sbr_ratio_index) !=
+            IA_NO_ERROR) {
+          if (ec_flag) {
+            longjmp(*(it_bit_buff->xaac_jmp_buf),
+                    IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          } else {
+            return IA_FATAL_ERROR;
+          }
+        }
+        if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2) {
+          if (ec_flag) {
+            longjmp(*(it_bit_buff->xaac_jmp_buf),
+                    IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          } else {
+            return IA_FATAL_ERROR;
+          }
+        }
         break;
 
       case ID_USAC_LFE:
-
+        num_channels++;
         pstr_usac_element_config->tw_mdct = 0;
         pstr_usac_element_config->noise_filling = 0;
         pstr_usac_element_config->stereo_config_index = 0;
@@ -440,19 +471,38 @@
         } else {
           pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 0;
         }
-        if (err != 0) return -1;
+        if (err != 0) {
+          if (ec_flag) {
+            longjmp(*(it_bit_buff->xaac_jmp_buf),
+                    IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          } else {
+            return IA_FATAL_ERROR;
+          }
+        }
         break;
       default:
-        return -1;
+        if (ec_flag) {
+          longjmp(*(it_bit_buff->xaac_jmp_buf),
+                  IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+        } else {
+          return IA_FATAL_ERROR;
+        }
         break;
     }
+    if (num_channels > 2) {
+      if (ec_flag) {
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+      } else {
+        return IA_FATAL_ERROR;
+      }
+    }
   }
   return err;
 }
 
-WORD32 ixheaacd_config_extension(
-    ia_bit_buf_struct *it_bit_buff,
-    ia_usac_decoder_config_struct *pstr_usac_decoder_config) {
+WORD32 ixheaacd_config_extension(ia_bit_buf_struct *it_bit_buff,
+    ia_usac_decoder_config_struct *pstr_usac_decoder_config, WORD32 ec_flag) {
   UWORD32 i, j;
   UWORD32 num_config_extensions;
   UWORD32 usac_config_ext_type, usac_config_ext_len;
@@ -460,7 +510,11 @@
   ixheaacd_read_escape_value(it_bit_buff, &(num_config_extensions), 2, 4, 8);
   num_config_extensions += 1;
   if (USAC_MAX_CONFIG_EXTENSIONS < num_config_extensions) {
-    return -1;
+    if (ec_flag) {
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    } else {
+      return IA_FATAL_ERROR;
+    }
   }
 
   pstr_usac_decoder_config->num_config_extensions = num_config_extensions;
@@ -470,24 +524,42 @@
          USAC_MAX_CONFIG_EXTENSIONS * sizeof(WORD32));
 
   for (j = 0; j < num_config_extensions; j++) {
-    UWORD32 tmp;
     UWORD32 fill_byte_val = 0xa5;
 
     ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_type), 4, 8, 16);
     ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_len), 4, 8, 16);
 
-    if (usac_config_ext_len > 768) return IA_FATAL_ERROR;
+    if (usac_config_ext_len > 768) {
+      if (ec_flag) {
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+      } else {
+        return IA_FATAL_ERROR;
+      }
+    }
 
     switch (usac_config_ext_type) {
       case ID_CONFIG_EXT_FILL:
         for (i = 0; i < usac_config_ext_len; i++) {
           fill_byte_val = ixheaacd_read_bits_buf(it_bit_buff, 8);
-          if (fill_byte_val != 0xa5) return -1;
+          if (fill_byte_val != 0xa5) {
+            if (ec_flag) {
+              longjmp(*(it_bit_buff->xaac_jmp_buf),
+                      IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+            } else {
+              return IA_FATAL_ERROR;
+            }
+          }
         }
         break;
       default:
         if ((WORD32)usac_config_ext_len > (it_bit_buff->cnt_bits >> 3)) {
-          return -1;
+          if (ec_flag) {
+            longjmp(*(it_bit_buff->xaac_jmp_buf),
+                    IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+          } else {
+            return IA_FATAL_ERROR;
+          }
         }
         if (ID_CONFIG_EXT_LOUDNESS_INFO == usac_config_ext_type) {
           for (i = 0; i < usac_config_ext_len; i++) {
@@ -499,7 +571,7 @@
           pstr_usac_decoder_config->usac_cfg_ext_info_present[j] = 1;
         } else {
           for (i = 0; i < usac_config_ext_len; i++)
-            tmp = ixheaacd_read_bits_buf(it_bit_buff, 8);
+            ixheaacd_read_bits_buf(it_bit_buff, 8);
         }
         break;
     }
@@ -508,8 +580,8 @@
   return 0;
 }
 
-WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff,
-                       ia_usac_config_struct *pstr_usac_conf, UINT32 *chan) {
+WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff, ia_usac_config_struct *pstr_usac_conf,
+                       UINT32 *chan, WORD32 ec_flag) {
   WORD32 tmp, err;
   err = 0;
 
@@ -521,7 +593,12 @@
         ixheaacd_read_bits_buf(it_bit_buff, 24);
 
     if (pstr_usac_conf->usac_sampling_frequency > USAC_MAX_SAMPLE_RATE) {
-      return IA_FATAL_ERROR;
+      if (ec_flag) {
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+      } else {
+        return IA_FATAL_ERROR;
+      }
     }
 
   } else {
@@ -529,17 +606,34 @@
         sampling_rate_tbl[pstr_usac_conf->usac_sampling_frequency_index];
   }
 
+  if (pstr_usac_conf->usac_sampling_frequency == 0) {
+    if (ec_flag) {
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    } else {
+      return IA_FATAL_ERROR;
+    }
+  }
   pstr_usac_conf->core_sbr_framelength_index =
       ixheaacd_read_bits_buf(it_bit_buff, 3);
 
-  if (pstr_usac_conf->core_sbr_framelength_index > MAX_CORE_SBR_FRAME_LEN_IDX)
-    return -1;
+  if (pstr_usac_conf->core_sbr_framelength_index > MAX_CORE_SBR_FRAME_LEN_IDX) {
+    if (ec_flag) {
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    } else {
+      return IA_FATAL_ERROR;
+    }
+  }
 
   pstr_usac_conf->channel_configuration_index =
       ixheaacd_read_bits_buf(it_bit_buff, 5);
   if ((pstr_usac_conf->channel_configuration_index >= 3) &&
-      (pstr_usac_conf->channel_configuration_index != 8))
-    return -1;
+      (pstr_usac_conf->channel_configuration_index != 8)) {
+    if (ec_flag) {
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    } else {
+      return IA_FATAL_ERROR;
+    }
+  }
 
   if (pstr_usac_conf->channel_configuration_index == 0) {
     UWORD32 i;
@@ -548,27 +642,32 @@
                                (UWORD32 *)(&(pstr_usac_conf->num_out_channels)),
                                5, 8, 16);
     if (BS_MAX_NUM_OUT_CHANNELS < pstr_usac_conf->num_out_channels) {
-      return IA_ENHAACPLUS_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
+      return IA_XHEAAC_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX;
     }
     for (i = 0; i < pstr_usac_conf->num_out_channels; i++)
       pstr_usac_conf->output_channel_pos[i] =
           ixheaacd_read_bits_buf(it_bit_buff, 5);
 
+    if (ec_flag) {
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    }
   } else {
-    ixheaacd_get_usac_chan_conf(pstr_usac_conf,
-                                pstr_usac_conf->channel_configuration_index);
+    err = ixheaacd_get_usac_chan_conf(pstr_usac_conf, pstr_usac_conf->channel_configuration_index,
+                                      it_bit_buff, ec_flag);
+    if (err != 0)
+      return err;
   }
 
   err = ixheaacd_decoder_config(
       it_bit_buff, &(pstr_usac_conf->str_usac_dec_config),
-      ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index), chan);
-  if (err != 0) return -1;
+      ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index), chan, ec_flag);
+  if (err != 0) return err;
 
   tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
 
   if (tmp) {
     err = ixheaacd_config_extension(it_bit_buff,
-                                    &pstr_usac_conf->str_usac_dec_config);
+                                    &pstr_usac_conf->str_usac_dec_config, ec_flag);
     if (err != 0) return -1;
   }
 
diff --git a/decoder/ixheaacd_initfuncs.c b/decoder/ixheaacd_initfuncs.c
index c00dc74..e1a0498 100644
--- a/decoder/ixheaacd_initfuncs.c
+++ b/decoder/ixheaacd_initfuncs.c
@@ -46,6 +46,9 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
@@ -75,6 +78,11 @@
 #include "ixheaacd_aacdec.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 
 #include "ixheaacd_struct_def.h"
@@ -109,6 +117,16 @@
 
   persistent_used += ALIGN_SIZE64(MAXSBRBYTES) * num_channel * sizeof(WORD8);
 
+  aac_persistent_mem->prev_sbr_payload_buffer =
+      (WORD8 *)((WORD8 *)aac_persistent_mem_v + persistent_used);
+
+  memset((WORD8 *)aac_persistent_mem->prev_sbr_payload_buffer, 0,
+         ALIGN_SIZE64(MAXSBRBYTES) * num_channel *
+         sizeof(*(aac_persistent_mem->prev_sbr_payload_buffer)));
+
+  persistent_used += ALIGN_SIZE64(MAXSBRBYTES) * num_channel *
+         sizeof(*(aac_persistent_mem->prev_sbr_payload_buffer));
+
   {
     WORD32 i;
 
@@ -217,6 +235,31 @@
   ptr_aac_tables->scale_factor_bands_short[11] =
       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_128;
 
+  ptr_aac_tables->scale_factor_bands_short[12] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_120;
+  ptr_aac_tables->scale_factor_bands_short[13] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_120;
+  ptr_aac_tables->scale_factor_bands_short[14] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_120;
+  ptr_aac_tables->scale_factor_bands_short[15] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_120;
+  ptr_aac_tables->scale_factor_bands_short[16] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_120;
+  ptr_aac_tables->scale_factor_bands_short[17] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_120;
+  ptr_aac_tables->scale_factor_bands_short[18] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_120;
+  ptr_aac_tables->scale_factor_bands_short[19] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_120;
+  ptr_aac_tables->scale_factor_bands_short[20] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_120;
+  ptr_aac_tables->scale_factor_bands_short[21] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_120;
+  ptr_aac_tables->scale_factor_bands_short[22] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_120;
+  ptr_aac_tables->scale_factor_bands_short[23] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_120;
+
   ptr_aac_tables->scale_factor_bands_long[0] =
       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_1024;
   ptr_aac_tables->scale_factor_bands_long[1] =
@@ -242,6 +285,31 @@
   ptr_aac_tables->scale_factor_bands_long[11] =
       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_1024;
 
+  ptr_aac_tables->scale_factor_bands_long[12] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_960;
+  ptr_aac_tables->scale_factor_bands_long[13] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_960;
+  ptr_aac_tables->scale_factor_bands_long[14] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_64_960;
+  ptr_aac_tables->scale_factor_bands_long[15] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_960;
+  ptr_aac_tables->scale_factor_bands_long[16] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_960;
+  ptr_aac_tables->scale_factor_bands_long[17] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_960;
+  ptr_aac_tables->scale_factor_bands_long[18] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_960;
+  ptr_aac_tables->scale_factor_bands_long[19] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_960;
+  ptr_aac_tables->scale_factor_bands_long[20] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_960;
+  ptr_aac_tables->scale_factor_bands_long[21] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_960;
+  ptr_aac_tables->scale_factor_bands_long[22] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_960;
+  ptr_aac_tables->scale_factor_bands_long[23] =
+      ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_960;
+
   ptr_aac_tables->scale_fac_bands_512[0] =
       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
   ptr_aac_tables->scale_fac_bands_512[1] =
@@ -354,8 +422,13 @@
     ptr_sbr_bitstream->no_elements = 0;
     ptr_sbr_bitstream->str_sbr_ele[0].ptr_sbr_data =
         &aac_persistent_mem->sbr_payload_buffer[ALIGN_SIZE64(MAXSBRBYTES) * i];
+    ptr_sbr_bitstream->str_sbr_ele[0].ptr_prev_sbr_data =
+        &aac_persistent_mem->prev_sbr_payload_buffer[ALIGN_SIZE64(MAXSBRBYTES) * i];
     ptr_sbr_bitstream->str_sbr_ele[0].sbr_ele_id = ID_SCE;
     ptr_sbr_bitstream->str_sbr_ele[0].size_payload = 0;
+    ptr_sbr_bitstream->str_sbr_ele[0].prev_size_payload = 0;
+    ptr_sbr_bitstream->str_sbr_ele[0].prev_sbr_ele_id = ID_SCE;
+    ptr_sbr_bitstream->str_sbr_ele[0].size_payload_old = 0;
   }
 
   {
@@ -368,6 +441,7 @@
                        sizeof(ia_sampling_rate_info_struct);
 
     WORD32 sampling_rate = p_state_enhaacplus_dec->sampling_rate;
+    WORD sfidx;
 
     i = 0;
     while ((i < num_entries) &&
@@ -382,18 +456,22 @@
     if (i == num_entries) {
       return NULL;
     }
+    sfidx = i;
 
-    if (frame_length == 1024) {
+    if (frame_length == 1024 || frame_length == 960) {
       WORD16 *psfb_table_idx[2];
       const WORD8 *psfb_width[2];
       WORD width_idx;
       WORD32 j;
 
+      if (frame_length == 960)
+        sfidx += 12;
+
       psfb_table_idx[0] = ptr_aac_tables->sfb_long_table;
       psfb_table_idx[1] = ptr_aac_tables->sfb_short_table;
 
-      psfb_width[0] = ptr_aac_tables->scale_factor_bands_long[i];
-      psfb_width[1] = ptr_aac_tables->scale_factor_bands_short[i];
+      psfb_width[0] = ptr_aac_tables->scale_factor_bands_long[sfidx];
+      psfb_width[1] = ptr_aac_tables->scale_factor_bands_short[sfidx];
 
       for (j = 1; j >= 0; j--) {
         const WORD8 *ptr_width = psfb_width[j];
@@ -428,7 +506,7 @@
       }
     } else {
       WORD16 *ptr_sfb_idx[2];
-      const WORD8 *ptr_sfb_width[2];
+      const WORD8 *ptr_sfb_width[2] = {0};
       WORD width_idx;
       WORD32 j;
 
diff --git a/decoder/ixheaacd_interface.h b/decoder/ixheaacd_interface.h
index 4a9c263..c320e2a 100644
--- a/decoder/ixheaacd_interface.h
+++ b/decoder/ixheaacd_interface.h
@@ -55,8 +55,7 @@
 VOID ixheaacd_complex_fft_p2_armv7(WORD32 *xr, WORD32 *xi, WORD32 nlength,
                                    WORD32 fft_mode, WORD32 *preshift);
 
-VOID ixheaacd_mps_complex_fft_64_dec(WORD32 *ptr_x, WORD32 *fin_re,
-                                     WORD32 *fin_im, WORD32 nlength);
+VOID ixheaacd_mps_synth_calc_fft(FLOAT32 *ptr_x, FLOAT32 *ptr_y, WORD32 nPass);
 
 VOID ixheaacd_mps_complex_fft_64_armv7(WORD32 *ptr_x, WORD32 *fin_re,
                                        WORD32 *fin_im, WORD32 nlength);
@@ -71,18 +70,10 @@
 VOID ixheaacd_complex_fft_p2_asm(const WORD32 *table, WORD32 nlength,
                                  WORD32 *ptr_x, WORD32 *ptr_y);
 
-VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re,
-                                       const WORD32 *table_im,
-                                       WORD32 resolution);
-
 VOID ixheaacd_mps_synt_pre_twiddle_armv7(WORD32 *ptr_in, const WORD32 *table_re,
                                          const WORD32 *table_im,
                                          WORD32 resolution);
 
-VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re,
-                                        const WORD32 *table_im,
-                                        WORD32 resolution);
-
 VOID ixheaacd_mps_synt_post_twiddle_armv7(WORD32 *ptr_in,
                                           const WORD32 *table_re,
                                           const WORD32 *table_im,
@@ -104,20 +95,13 @@
                                    WORD32 nlength, const WORD32 *cos_ptr,
                                    const WORD32 *sin_ptr);
 
-VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, WORD32 *fin_re,
-                                            WORD32 *fin_im,
-                                            const WORD32 *table_re,
-                                            const WORD32 *table_im,
-                                            WORD32 *state);
+VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, FLOAT32 *out,
+                                    FLOAT32 *state,
+                                    const FLOAT32 *filter_coeff);
 
-VOID ixheaacd_mps_synt_post_fft_twiddle_armv7(WORD32 resolution, WORD32 *fin_re,
-                                              WORD32 *fin_im,
-                                              const WORD32 *table_re,
-                                              const WORD32 *table_im,
-                                              WORD32 *state);
-
-VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out,
-                                    WORD32 *state, const WORD32 *filter_coeff);
+VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, FLOAT32 *fin_re,
+                                            FLOAT32 *fin_im, const FLOAT32 *table_re,
+                                            const FLOAT32 *table_im, FLOAT32 *state);
 
 VOID ixheaacd_mps_synt_out_calc_armv7(WORD32 resolution, WORD32 *out,
                                       WORD32 *state,
diff --git a/decoder/ixheaacd_latmdemux.c b/decoder/ixheaacd_latmdemux.c
index ecceb04..590d671 100644
--- a/decoder/ixheaacd_latmdemux.c
+++ b/decoder/ixheaacd_latmdemux.c
@@ -44,7 +44,9 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
-
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
@@ -71,7 +73,12 @@
 
 #include "ixheaacd_aacdec.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_struct_def.h"
 
@@ -113,7 +120,7 @@
             layer_info->frame_len_bits =
                 ixheaacd_latm_au_chunk_length_info(it_bit_buff);
             if (layer_info->frame_len_bits % 8 != 0) {
-              error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
+              error_code = IA_XHEAAC_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
               return error_code;
             }
 
@@ -123,13 +130,13 @@
             break;
 
           default:
-            error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
+            error_code = IA_XHEAAC_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
             return error_code;
         }
       }
     }
   } else {
-    error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
+    error_code = IA_XHEAAC_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
     return error_code;
   }
 
@@ -144,8 +151,8 @@
   if (bytes_read <= 3)
     return ixheaacd_read_bits_buf(it_bit_buff, 8 * bytes_read);
   else
-    return (ixheaacd_read_bits_buf(it_bit_buff, 24) << 8) +
-           ixheaacd_read_bits_buf(it_bit_buff, 8);
+    return ixheaacd_add32_sat(ixheaacd_shl32_sat(ixheaacd_read_bits_buf(it_bit_buff, 24), 8),
+                              ixheaacd_read_bits_buf(it_bit_buff, 8));
 }
 
 IA_ERRORCODE ixheaacd_latm_stream_mux_config(
@@ -156,7 +163,6 @@
   UWORD32 lay;
   WORD32 bytes_consumed;
   WORD32 audio_mux_version_a;
-  UWORD32 tara_buf_fullness;
   IA_ERRORCODE error_code = AAC_DEC_OK;
   ixheaacd_latm_layer_info *layer_info = 0;
 
@@ -169,7 +175,7 @@
 
   if (audio_mux_version_a == 0) {
     if (latm_element->audio_mux_version == 1) {
-      tara_buf_fullness = ixheaacd_latm_get_value(it_bit_buff);
+      ixheaacd_latm_get_value(it_bit_buff);/*tara_buf_fullness*/
     }
     latm_element->all_streams_same_time_framing =
         ixheaacd_read_bits_buf(it_bit_buff, 1);
@@ -177,7 +183,7 @@
     latm_element->num_sub_frames = ixheaacd_read_bits_buf(it_bit_buff, 6) + 1;
 
     if (latm_element->num_sub_frames != 1)
-      return IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
+      return IA_XHEAAC_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
 
     latm_element->num_program = ixheaacd_read_bits_buf(it_bit_buff, 4) + 1;
 
@@ -202,7 +208,7 @@
 
           if (asc_len > it_bit_buff->size - 106 || asc_len > 2592 ||
               asc_len < 0) {
-            return IA_ENHAACPLUS_DEC_INIT_FATAL_DEC_INIT_FAIL;
+            return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
           }
 
           if ((error_code = ixheaacd_ga_hdr_dec(
@@ -248,7 +254,7 @@
             break;
 
           default:
-            return IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
+            return IA_XHEAAC_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
         }
       }
     }
@@ -278,7 +284,7 @@
       latm_element->crc_check_sum = ixheaacd_read_bits_buf(it_bit_buff, 8);
     }
   } else {
-    error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
+    error_code = IA_XHEAAC_DEC_EXE_FATAL_INVALID_LOAS_HEADER;
   }
   return (error_code);
 }
diff --git a/decoder/ixheaacd_latmdemux.h b/decoder/ixheaacd_latmdemux.h
index d085f1f..d7f6291 100644
--- a/decoder/ixheaacd_latmdemux.h
+++ b/decoder/ixheaacd_latmdemux.h
@@ -57,9 +57,9 @@
   ixheaacd_latm_layer_info layer_info[LATM_MAX_PROG][LATM_MAX_LAYER];
 } ixheaacd_latm_struct;
 
-WORD32 ixheaacd_latm_au_chunk_length_info(ia_bit_buf_struct* it_bit_buff);
+WORD32 ixheaacd_latm_au_chunk_length_info(ia_bit_buf_struct *it_bit_buff);
 
-WORD32 ixheaacd_latm_payload_length_info(ia_bit_buf_struct* it_bit_buff,
-                                         ixheaacd_latm_struct* latm_element);
+WORD32 ixheaacd_latm_payload_length_info(ia_bit_buf_struct *it_bit_buff,
+                                         ixheaacd_latm_struct *latm_element);
 
 #endif
diff --git a/decoder/ixheaacd_ld_mps_config.c b/decoder/ixheaacd_ld_mps_config.c
new file mode 100644
index 0000000..b378748
--- /dev/null
+++ b/decoder/ixheaacd_ld_mps_config.c
@@ -0,0 +1,311 @@
+/******************************************************************************
+*                                                                            *
+* Copyright (C) 2018 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at:
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*****************************************************************************
+* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_error_standards.h"
+
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_config.h"
+
+#include <assert.h>
+
+#ifndef sign
+#define sign(a) (((a) > 0) ? 1 : ((a) < 0) ? -1 : 0)
+#endif
+
+typedef struct {
+  WORD32 num_input_chan;
+  WORD32 num_output_chan;
+  WORD32 num_ott_boxes;
+  WORD32 num_ttt_boxes;
+  WORD32 ott_mode_lfe[MAX_NUM_OTT];
+} ia_ld_mps_dec_tree_properties_struct;
+
+static WORD32 ixheaacd_freq_res_table[] = {0, 23, 15, 12, 9, 7, 5, 4};
+
+static WORD32 ixheaacd_hrtf_freq_res_table[][8] = {{0, 28, 20, 14, 10, 7, 5, 4},
+                                          {0, 13, 13, 8, 7, 4, 3, 3}};
+
+static ia_ld_mps_dec_tree_properties_struct ixheaacd_tree_property_table[] = {
+    {1, 6, 5, 0, {0, 0, 0, 0, 1}}, {1, 6, 5, 0, {0, 0, 1, 0, 0}}, {2, 6, 3, 1, {1, 0, 0, 0, 0}},
+    {2, 8, 5, 1, {1, 0, 0, 0, 0}}, {2, 8, 5, 1, {1, 0, 0, 0, 0}}, {6, 8, 2, 0, {0, 0, 0, 0, 0}},
+    {6, 8, 2, 0, {0, 0, 0, 0, 0}}, {1, 2, 1, 0, {0, 0, 0, 0, 0}}};
+
+static IA_ERRORCODE ixheaacd_ld_spatial_extension_config(
+    ia_bit_buf_struct *it_bit_buff, ia_usac_dec_mps_config_struct *config,
+    WORD32 bits_available) {
+  WORD32 j, ch, idx, tmp, tmp_open, sac_ext_len, bits_read, n_fill_bits;
+  UWORD32 i;
+  WORD32 ba = bits_available;
+
+  config->sac_ext_cnt = 0;
+
+  tmp = it_bit_buff->cnt_bits;
+
+  while (ba >= 8) {
+    if (config->sac_ext_cnt >= MAX_NUM_EXT_TYPES) return IA_FATAL_ERROR;
+
+    config->bs_sac_ext_type[config->sac_ext_cnt] =
+        ixheaacd_read_bits_buf(it_bit_buff, 4);
+    ba -= 4;
+
+    sac_ext_len = ixheaacd_read_bits_buf(it_bit_buff, 4);
+    ba -= 4;
+
+    if ((ba >= 6) && (sac_ext_len > 0)) {
+      if (sac_ext_len == 15) {
+        sac_ext_len += ixheaacd_read_bits_buf(it_bit_buff, 8);
+        ba -= 8;
+        if (sac_ext_len == 15 + 255) {
+          sac_ext_len += ixheaacd_read_bits_buf(it_bit_buff, 16);
+          ba -= 16;
+        }
+      }
+
+      switch (config->bs_sac_ext_type[config->sac_ext_cnt]) {
+        case 0:
+          config->bs_residual_coding = 1;
+
+          config->bs_residual_sampling_freq_index =
+              ixheaacd_read_bits_buf(it_bit_buff, 4);
+          config->bs_residual_frames_per_spatial_frame =
+              ixheaacd_read_bits_buf(it_bit_buff, 2);
+
+          if ((config->num_ott_boxes + config->num_ttt_boxes) >
+              MAX_RESIDUAL_CHANNELS)
+            return IA_FATAL_ERROR;
+          for (j = 0; j < config->num_ott_boxes + config->num_ttt_boxes; j++) {
+            config->bs_residual_present[j] =
+                ixheaacd_read_bits_buf(it_bit_buff, 1);
+            if (config->bs_residual_present[j]) {
+              config->bs_residual_bands_ld_mps[j] =
+                  ixheaacd_read_bits_buf(it_bit_buff, 5);
+            }
+          }
+          break;
+
+        case 1:
+          config->bs_arbitrary_downmix = 2;
+
+          config->bs_arbitrary_downmix_residual_sampling_freq_index =
+              ixheaacd_read_bits_buf(it_bit_buff, 4);
+          config->bs_arbitrary_downmix_residual_frames_per_spatial_frame =
+              ixheaacd_read_bits_buf(it_bit_buff, 2);
+          config->bs_arbitrary_downmix_residual_bands =
+              ixheaacd_read_bits_buf(it_bit_buff, 5);
+
+          break;
+
+        case 2:
+          config->num_out_chan_AT = 0;
+          config->num_ott_boxes_AT = 0;
+          if (config->num_output_channels > MAX_OUTPUT_CHANNELS)
+            return IA_FATAL_ERROR;
+          for (ch = 0; ch < config->num_output_channels; ch++) {
+            tmp_open = 1;
+            idx = 0;
+            while ((tmp_open > 0) && (idx < MAX_ARBITRARY_TREE_INDEX)) {
+              config->bs_ott_box_present_AT[ch][idx] =
+                  ixheaacd_read_bits_buf(it_bit_buff, 1);
+              if (config->bs_ott_box_present_AT[ch][idx]) {
+                config->num_ott_boxes_AT++;
+                tmp_open++;
+              } else {
+                config->num_out_chan_AT++;
+                tmp_open--;
+              }
+              idx++;
+            }
+          }
+
+          for (i = 0; i < config->num_ott_boxes_AT; i++) {
+            config->bs_ott_default_cld_AT[i] =
+                ixheaacd_read_bits_buf(it_bit_buff, 1);
+            config->bs_ott_mode_lfe_AT[i] =
+                ixheaacd_read_bits_buf(it_bit_buff, 1);
+            if (config->bs_ott_mode_lfe_AT[i]) {
+              config->bs_ott_bands_AT[i] =
+                  ixheaacd_read_bits_buf(it_bit_buff, 5);
+            } else {
+              config->bs_ott_bands_AT[i] = ixheaacd_freq_res_table[config->bs_freq_res];
+            }
+          }
+
+          for (i = 0; i < config->num_out_chan_AT; i++) {
+            config->bs_output_channel_pos_AT[i] =
+                ixheaacd_read_bits_buf(it_bit_buff, 5);
+          }
+
+          break;
+
+        default:;
+      }
+    }
+
+    bits_read = tmp - it_bit_buff->cnt_bits;
+    n_fill_bits = 8 * sac_ext_len - bits_read;
+
+    while (n_fill_bits > 7) {
+      ixheaacd_read_bits_buf(it_bit_buff, 8);
+      n_fill_bits -= 8;
+    }
+    if (n_fill_bits > 0) {
+      ixheaacd_read_bits_buf(it_bit_buff, n_fill_bits);
+    }
+
+    ba -= 8 * sac_ext_len;
+    config->sac_ext_cnt++;
+  }
+  return IA_NO_ERROR;
+}
+
+IA_ERRORCODE ixheaacd_ld_spatial_specific_config(
+    ia_usac_dec_mps_config_struct *config, ia_bit_buf_struct *it_bit_buff) {
+  WORD32 i, num_header_bits;
+  UWORD32 hc, hb;
+  WORD32 sac_header_len;
+  WORD32 bits_available;
+  WORD32 tmp = it_bit_buff->cnt_bits;
+  WORD32 err = 0;
+
+  sac_header_len = tmp;
+
+  bits_available = sac_header_len;
+  config->bs_sampling_freq_index = ixheaacd_read_bits_buf(it_bit_buff, 4);
+  if (config->bs_sampling_freq_index == 15) {
+    config->bs_fampling_frequency = ixheaacd_read_bits_buf(it_bit_buff, 24);
+  }
+
+  config->bs_frame_length = ixheaacd_read_bits_buf(it_bit_buff, 5);
+  config->bs_freq_res = ixheaacd_read_bits_buf(it_bit_buff, 3);
+  config->bs_tree_config = ixheaacd_read_bits_buf(it_bit_buff, 4);
+
+  if (config->bs_tree_config > 7) return IA_FATAL_ERROR;
+
+  if (config->bs_tree_config != 15) {
+    config->num_ott_boxes =
+        ixheaacd_tree_property_table[config->bs_tree_config].num_ott_boxes;
+    config->num_ttt_boxes =
+        ixheaacd_tree_property_table[config->bs_tree_config].num_ttt_boxes;
+    config->num_input_channels =
+        ixheaacd_tree_property_table[config->bs_tree_config].num_input_chan;
+    config->num_output_channels =
+        ixheaacd_tree_property_table[config->bs_tree_config].num_output_chan;
+    for (i = 0; i < MAX_NUM_OTT; i++) {
+      config->ott_mode_lfe[i] =
+          ixheaacd_tree_property_table[config->bs_tree_config].ott_mode_lfe[i];
+    }
+  }
+  config->bs_quant_mode = ixheaacd_read_bits_buf(it_bit_buff, 2);
+  if (config->bs_tree_config != 7) {
+    config->bs_one_icc = ixheaacd_read_bits_buf(it_bit_buff, 1);
+  }
+  config->bs_arbitrary_downmix = ixheaacd_read_bits_buf(it_bit_buff, 1);
+  if (config->bs_tree_config != 7) {
+    config->bs_fixed_gain_sur = ixheaacd_read_bits_buf(it_bit_buff, 3);
+    config->bs_fixed_gain_LFE = ixheaacd_read_bits_buf(it_bit_buff, 3);
+  }
+  config->bs_fixed_gain_dmx = ixheaacd_read_bits_buf(it_bit_buff, 3);
+  if (config->bs_tree_config != 7) {
+    config->bs_matrix_mode = ixheaacd_read_bits_buf(it_bit_buff, 1);
+  }
+  config->bs_temp_shape_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
+  config->bs_decorr_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
+  if (config->bs_tree_config != 7) {
+    config->bs_3D_audio_mode = ixheaacd_read_bits_buf(it_bit_buff, 1);
+  } else {
+    config->bs_3D_audio_mode = 0;
+  }
+
+  // ott_config
+  for (i = 0; i < config->num_ott_boxes; i++) {
+    if (config->ott_mode_lfe[i]) {
+      config->bs_ott_bands[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
+    } else {
+      config->bs_ott_bands[i] = ixheaacd_freq_res_table[config->bs_freq_res];
+    }
+  }
+
+  // ttt_config
+  for (i = 0; i < config->num_ttt_boxes; i++) {
+    config->bs_ttt_dual_mode[i] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+    config->bs_ttt_mode_low[i] = ixheaacd_read_bits_buf(it_bit_buff, 3);
+    if (config->bs_ttt_dual_mode[i]) {
+      config->bs_ttt_mode_high[i] = ixheaacd_read_bits_buf(it_bit_buff, 3);
+      config->bs_ttt_bands_low[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
+      config->bs_ttt_bands_high[i] = ixheaacd_freq_res_table[config->bs_freq_res];
+    } else {
+      config->bs_ttt_bands_low[i] = ixheaacd_freq_res_table[config->bs_freq_res];
+    }
+  }
+
+  if (config->bs_temp_shape_config == 2) {
+    config->bs_env_quant_mode = ixheaacd_read_bits_buf(it_bit_buff, 1);
+  }
+
+  if (config->bs_3D_audio_mode) {
+    config->bs_3D_audio_HRTF_set = ixheaacd_read_bits_buf(it_bit_buff, 2);
+    // param_HRTF_set
+    if (config->bs_3D_audio_HRTF_set == 0) {
+      config->bs_HRTF_freq_res = ixheaacd_read_bits_buf(it_bit_buff, 3);
+      config->bs_HRTF_num_chan = 5;
+      config->bs_HRTF_asymmetric = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+      config->HRTF_num_band = ixheaacd_hrtf_freq_res_table[0][config->bs_HRTF_freq_res];
+      config->HRTF_num_phase = ixheaacd_hrtf_freq_res_table[1][config->bs_HRTF_freq_res];
+
+      for (hc = 0; hc < config->bs_HRTF_num_chan; hc++) {
+        for (hb = 0; hb < config->HRTF_num_band; hb++) {
+          config->bs_HRTF_level_left[hc][hb] =
+              ixheaacd_read_bits_buf(it_bit_buff, 6);
+        }
+        for (hb = 0; hb < config->HRTF_num_band; hb++) {
+          config->bs_HRTF_level_right[hc][hb] =
+              config->bs_HRTF_asymmetric
+                  ? ixheaacd_read_bits_buf(it_bit_buff, 6)
+                  : config->bs_HRTF_level_left[hc][hb];
+        }
+        config->bs_HRTF_phase[hc] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+        for (hb = 0; hb < config->HRTF_num_phase; hb++) {
+          config->bs_HRTF_phase_LR[hc][hb] =
+              config->bs_HRTF_phase[hc] ? ixheaacd_read_bits_buf(it_bit_buff, 6)
+                                        : 0;
+        }
+        config->bs_HRTF_icc[hc] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+        if (config->bs_HRTF_icc[hc]) {
+          for (hb = 0; hb < config->HRTF_num_band; hb++)
+            config->bs_HRTF_icc_LR[hc][hb] =
+                ixheaacd_read_bits_buf(it_bit_buff, 3);
+        }
+      }
+    }
+  }
+
+  // byte_align
+  i = (it_bit_buff->cnt_bits & 0x7);
+  ixheaacd_read_bits_buf(it_bit_buff, i);
+
+  num_header_bits = tmp - (it_bit_buff->cnt_bits);
+  bits_available -= num_header_bits;
+
+  err =
+      ixheaacd_ld_spatial_extension_config(it_bit_buff, config, bits_available);
+  return err;
+}
diff --git a/decoder/ixheaacd_ld_mps_dec.c b/decoder/ixheaacd_ld_mps_dec.c
new file mode 100644
index 0000000..b12d1f8
--- /dev/null
+++ b/decoder/ixheaacd_ld_mps_dec.c
@@ -0,0 +1,212 @@
+/******************************************************************************
+*                                                                            *
+* Copyright (C) 2018 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at:
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*****************************************************************************
+* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <stdio.h>
+#include <string.h>
+
+#include <math.h>
+
+#include "ixheaacd_sbr_common.h"
+#include "ixheaacd_type_def.h"
+
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_basic_ops.h"
+#include "ixheaacd_bitbuffer.h"
+
+#include "ixheaacd_basic_op.h"
+#include "ixheaacd_intrinsics.h"
+#include "ixheaacd_sbr_const.h"
+
+#include "ixheaacd_defines.h"
+
+#include "ixheaacd_aac_rom.h"
+
+#include "ixheaacd_definitions.h"
+
+#include "ixheaacd_error_codes.h"
+
+#include "ixheaacd_pulsedata.h"
+
+#include "ixheaacd_pns.h"
+#include "ixheaacd_drc_data_struct.h"
+
+#include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_drc_dec.h"
+#include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_block.h"
+#include "ixheaacd_channel.h"
+
+#include "ixheaacd_sbr_payload.h"
+#include "ixheaacd_common_rom.h"
+
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_stereo.h"
+#include "ixheaacd_lpp_tran.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_env_extr.h"
+#include "ixheaacd_adts.h"
+#
+#include "ixheaacd_audioobjtypes.h"
+#include "ixheaacd_memory_standards.h"
+#include "ixheaacd_latmdemux.h"
+#include "ixheaacd_aacdec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_env_calc.h"
+
+#include "ixheaacd_pvc_dec.h"
+#include "ixheaacd_sbr_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_struct_def.h"
+
+#include "ixheaacd_mps_process.h"
+
+#include "ixheaacd_ld_mps_dec.h"
+#include "ixheaacd_interface.h"
+#include "ixheaacd_info.h"
+#include "ixheaacd_tns_usac.h"
+#include "ixheaacd_acelp_info.h"
+#include "ixheaacd_main.h"
+#include "ixheaacd_struct.h"
+#include "ixheaacd_create.h"
+
+WORD32 ixheaacd_ld_qmf_analysis(ia_mps_dec_state_struct *self,
+                                WORD16 *output_buf) {
+  WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS + MAX_ENV_COLS];
+  WORD32 **p_arr_qmf_buf_imag = &p_arr_qmf_buf_real[MAX_ENV_COLS];
+  WORD32 temp_arr[64 * 64];
+  WORD32 *ptr = &temp_arr[0];
+  float in_gain_n_q8_fac = self->input_gain * 0.00390625f;
+
+  int i;
+  WORD32 ts;
+
+  for (ts = 2; ts < self->time_slots + 2; ts++) {
+    p_arr_qmf_buf_real[ts] = ptr;
+    ptr += NO_SYNTHESIS_CHANNELS;
+
+    p_arr_qmf_buf_imag[ts] = ptr;
+    ptr += NO_SYNTHESIS_CHANNELS;
+  }
+
+  self->str_mps_qmf_bank.num_time_slots = self->time_slots;
+  self->str_mps_qmf_bank.no_channels = self->qmf_band_count;
+
+  ixheaacd_cplx_anal_qmffilt_32((WORD32 *)output_buf, self->str_sbr_scale_fact,
+                                &p_arr_qmf_buf_real[0], &p_arr_qmf_buf_imag[0],
+                                &self->str_mps_qmf_bank,
+                                self->qmf_dec_tables_ptr, 2, 0);
+
+  for (ts = 0; ts < self->time_slots; ts++) {
+    for (i = 0; i < self->qmf_band_count; i++) {
+      self->qmf_in[0][ts][i].re =
+          (p_arr_qmf_buf_real[ts + 2][i] * in_gain_n_q8_fac);
+      self->qmf_in[0][ts][i].im =
+          (p_arr_qmf_buf_imag[ts + 2][i] * in_gain_n_q8_fac);
+    }
+  }
+
+  return 0;
+}
+
+WORD32 ixheaacd_ld_mps_apply(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
+                             WORD16 *output_buf) {
+  ia_aac_dec_state_struct *aac_handle = p_obj_exhaacplus_dec->p_state_aac;
+  ia_mps_dec_state_struct *mps_handle = &(aac_handle->mps_dec_handle);
+  WORD32 err = 0;
+  WORD32 ts, i;
+  ia_dec_data_struct *pstr_dec_data =
+      (ia_dec_data_struct *)aac_handle->pstr_dec_data;
+  ia_usac_data_struct *pstr_usac_data = &(pstr_dec_data->str_usac_data);
+
+  mps_handle->hyb_band_count[0] = mps_handle->hyb_band_count_max;
+  mps_handle->hyb_band_count[1] = mps_handle->hyb_band_count_max;
+
+  err = ixheaacd_mps_frame_decode(mps_handle);
+  if (err != IA_NO_ERROR) return err;
+
+  if (aac_handle->mps_dec_handle.num_parameter_sets_prev <= 0) return IA_FATAL_ERROR;
+
+  if (mps_handle->ldmps_config.bs_tree_config == 7) {
+    ixheaacd_pre_and_mix_matrix_calculation(&(aac_handle->mps_dec_handle));
+    ixheaacd_mps_pre_matrix_mix_matrix_smoothing(&(aac_handle->mps_dec_handle));
+  }
+  mps_handle->output_buffer = pstr_usac_data->time_sample_vector;
+  if (mps_handle->ldmps_config.no_ldsbr_present)
+    ixheaacd_ld_qmf_analysis(mps_handle, output_buf);
+  else {
+    for (ts = 0; ts < mps_handle->time_slots; ts++) {
+      FLOAT32 *qmf_re = p_obj_exhaacplus_dec->p_state_aac->str_sbr_dec_info[0]
+                          ->pstr_sbr_channel[0]
+                          ->str_sbr_dec.mps_qmf_buf_real[ts + 2];
+      FLOAT32 *qmf_im = p_obj_exhaacplus_dec->p_state_aac->str_sbr_dec_info[0]
+                          ->pstr_sbr_channel[0]
+                          ->str_sbr_dec.mps_qmf_buf_imag[ts + 2];
+      for (i = 0; i < mps_handle->qmf_band_count; i++) {
+        mps_handle->qmf_in[0][ts][i].re = qmf_re[i] * mps_handle->input_gain;
+        mps_handle->qmf_in[0][ts][i].im = qmf_im[i] * mps_handle->input_gain;
+      }
+    }
+  }
+  ixheaacd_mps_qmf_hyb_analysis(mps_handle);
+
+  mps_handle->bs_high_rate_mode = 1;
+
+  ixheaacd_mps_apply_pre_matrix(mps_handle);
+
+  ixheaacd_mps_create_w(mps_handle);
+
+  if ((!(mps_handle->res_bands | mps_handle->pre_mix_req)) &&
+      (mps_handle->config->bs_phase_coding == 0)) {
+    ixheaacd_mps_apply_mix_matrix_type1(mps_handle);
+
+  } else if (mps_handle->pre_mix_req) {
+    ixheaacd_mps_apply_mix_matrix_type2(mps_handle);
+
+  } else {
+    ixheaacd_mps_apply_mix_matrix_type3(mps_handle);
+  }
+
+  if (mps_handle->ldmps_config.bs_temp_shape_config == 2) {
+    ixheaacd_mps_time_env_shaping(mps_handle);
+  }
+
+  err = ixheaacd_mps_temp_process(mps_handle);
+  mps_handle->pre_mix_req = 0;
+  if (err)
+    return err;
+
+  return err;
+}
diff --git a/decoder/ixheaacd_ld_mps_dec.h b/decoder/ixheaacd_ld_mps_dec.h
new file mode 100644
index 0000000..480787a
--- /dev/null
+++ b/decoder/ixheaacd_ld_mps_dec.h
@@ -0,0 +1,39 @@
+/******************************************************************************
+*                                                                            *
+* Copyright (C) 2018 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at:
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+*****************************************************************************
+* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_LD_MPS_DEC_H
+#define IXHEAACD_LD_MPS_DEC_H
+
+WORD32 ixheaacd_ld_mps_apply(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
+                             WORD16 *output_buf);
+
+IA_ERRORCODE ixheaacd_ld_mps_frame_parsing(
+    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff);
+
+WORD32 ixheaacd_extension_payload(ia_bit_buf_struct *it_bit_buff, WORD32 *cnt,
+                                  ia_mps_dec_state_struct *self);
+
+IA_ERRORCODE ixheaacd_ld_spatial_specific_config(
+    ia_usac_dec_mps_config_struct *config, ia_bit_buf_struct *it_bit_buff);
+
+IA_ERRORCODE ixheaacd_heaac_mps_apply(ia_exhaacplus_dec_api_struct *self,
+                                      WORD16 *output_buf, UWORD8 *mps_buffer,
+                                      WORD32 mps_bytes);
+
+#endif /* IXHEAACD_LD_MPS_DEC_H */
diff --git a/decoder/ixheaacd_longblock.c b/decoder/ixheaacd_longblock.c
index 1f41387..0938389 100644
--- a/decoder/ixheaacd_longblock.c
+++ b/decoder/ixheaacd_longblock.c
@@ -39,9 +39,10 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
-
-#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
 #include "ixheaacd_block.h"
@@ -124,7 +125,7 @@
             band_offsets[top] - band_offsets[sfb];
         num_lines_sec_idx++;
         if (sect_cb == (ESC_HCB + 1)) {
-          return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INVALID_CODE_BOOK;
+          return IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK;
         } else {
           *ptr_hcr_code_book++ = sect_cb;
         }
@@ -134,11 +135,11 @@
       sfb = (sfb + sect_len);
       if (sfb > max_sfb) {
         return (WORD16)(
-            (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED);
+            (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED);
       }
       if (sect_cb == (ESC_HCB + 1)) {
         return (WORD16)(
-            (WORD32)IA_ENHAACPLUS_DEC_EXE_NONFATAL_INVALID_CODE_BOOK);
+            (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK);
       }
 
       while (sect_len--) {
@@ -245,7 +246,7 @@
           }
 
           if ((object_type != AOT_ER_AAC_ELD) &&
-              (object_type != AOT_ER_AAC_LD)) {
+              (object_type != AOT_ER_AAC_LD) && (object_type != AOT_ER_AAC_LC)) {
             if (sfb_cb > NOISE_HCB) {
               position = position + norm_value;
               *ptr_scale_fact_short++ = -position;
@@ -297,8 +298,9 @@
   it_bit_buff->bit_pos = 7 - bit_pos;
   {
     WORD bits_consumed;
-    bits_consumed = ((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
-                    (start_bit_pos - it_bit_buff->bit_pos);
+    bits_consumed =
+        (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) +
+               (start_bit_pos - it_bit_buff->bit_pos));
     it_bit_buff->cnt_bits -= bits_consumed;
   }
 }
diff --git a/decoder/ixheaacd_lpc.c b/decoder/ixheaacd_lpc.c
index 6bbb902..3f76fd7 100644
--- a/decoder/ixheaacd_lpc.c
+++ b/decoder/ixheaacd_lpc.c
@@ -27,6 +27,8 @@
 #include "ixheaacd_type_def.h"
 #include "ixheaacd_bitbuffer.h"
 #include "ixheaacd_interface.h"
+#include "ixheaacd_defines.h"
+#include "ixheaacd_aac_rom.h"
 #include "ixheaacd_tns_usac.h"
 #include "ixheaacd_cnst.h"
 #include "ixheaacd_acelp_info.h"
@@ -39,7 +41,15 @@
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
+
+#include "ixheaacd_pulsedata.h"
+#include "ixheaacd_pns.h"
+#include "ixheaacd_lt_predict.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_ec.h"
 #include "ixheaacd_arith_dec.h"
 
 #include "ixheaacd_func_def.h"
@@ -53,8 +63,6 @@
 #define FREQ_MAX_F 6400.0f
 #define FREQ_DIV_F 400.0f
 
-extern const FLOAT32 lsf_init[ORDER];
-
 extern const FLOAT32 ixheaacd_fir_lp_filt[1 + FILTER_DELAY];
 
 const WORD32 ixheaacd_pow_10_i_by_128[128] = {
@@ -214,10 +222,9 @@
   return;
 }
 
-static WORD32 ixheaacd_bass_post_filter(FLOAT32 *synth_sig, WORD32 *pitch,
-                                        FLOAT32 *pitch_gain, FLOAT32 *synth_out,
-                                        WORD32 len_fr, WORD32 len2,
-                                        FLOAT32 bpf_prev[]) {
+static WORD32 ixheaacd_bass_post_filter(FLOAT32 *synth_sig, WORD32 *pitch, FLOAT32 *pitch_gain,
+                                        FLOAT32 *synth_out, WORD32 len_fr, WORD32 len2,
+                                        FLOAT32 bpf_prev[], WORD32 ec_flag) {
   WORD32 i, j, sf, num_subfr, pitch_lag, lg;
   FLOAT32 x_energy, xy_corr, y_energy, norm_corr, energy, gain, tmp, alpha;
   FLOAT32 noise_buf[FILTER_DELAY + (2 * LEN_SUBFR)], *noise_tmp1, *noise_tmp2,
@@ -235,7 +242,13 @@
   for (num_subfr = 0; num_subfr < len_fr; num_subfr += LEN_SUBFR, sf++) {
     pitch_lag = pitch[sf];
     gain = pitch_gain[sf];
-    if (((pitch_lag >> 1) + 96 - num_subfr) > MAX_PITCH) return -1;
+    if (((pitch_lag >> 1) + 96 - num_subfr) > MAX_PITCH) {
+      if (ec_flag) {
+        pitch_lag = (MAX_PITCH + num_subfr - 96) << 1;
+      } else {
+        return -1;
+      }
+    }
     if (gain > 1.0f) gain = 1.0f;
     if (gain < 0.0f) gain = 0.0f;
 
@@ -259,6 +272,14 @@
     if (lg < 0) lg = 0;
     if (lg > LEN_SUBFR) lg = LEN_SUBFR;
 
+    if (pitch_lag > MAX_PITCH) {
+      if (ec_flag) {
+        pitch_lag = MAX_PITCH;
+      } else {
+        return -1;
+      }
+    }
+
     if (gain > 0) {
       if (lg > 0) {
         tmp = 0.01f;
@@ -343,7 +364,7 @@
 
   WORD32 i, k, tp, mode;
   WORD32 *mod;
-  FLOAT32 gain, stability_factor;
+  FLOAT32 gain, stability_factor = 0.0f;
   FLOAT32 tmp, synth_corr, synth_energy;
 
   WORD32 len_fr;
@@ -356,8 +377,9 @@
 
   WORD32 *ptr_scratch = &usac_data->scratch_buffer[0];
 
-  WORD32 subfr_len, n_subfr;
+  WORD32 subfr_len = 0, n_subfr = 0;
   WORD32 err = 0;
+  WORD32 ch = usac_data->present_chan;
 
   len_fr = usac_data->ccfl;
   len_subfrm = usac_data->len_subfrm;
@@ -376,7 +398,14 @@
   memset(xcitation_curr, 0, sizeof(FLOAT32) * (LEN_SUPERFRAME + 1));
 
   mod = pstr_td_frame_data->mod;
+  if (usac_data->frame_ok == 1) {
+    usac_data->num_lost_lpd_frames[usac_data->present_chan] = 0;
+  }
 
+  if (usac_data->ec_flag && usac_data->frame_ok == 0) {
+    ixheaacd_usac_lpc_ec(usac_data->lsp_coeff, usac_data->lpc4_lsf, usac_data->lsf_adaptive_mean,
+                         first_lpd_flag);
+  }
   for (i = 0; i < num_subfr_by2; i++) {
     pitch[i] = st->pitch_prev[i];
     pitch_gain[i] = st->gain_prev[i];
@@ -385,13 +414,20 @@
     pitch[i + num_subfr_by2] = 64;
     pitch_gain[i + num_subfr_by2] = 0.0f;
   }
-  if (!first_lpd_flag) {
-    ixheaacd_lsp_2_lsf_conversion(st->lspold, lsf_flt, ORDER);
+
+  if (usac_data->frame_ok) {
+    if (!first_lpd_flag) {
+      ixheaacd_lsp_2_lsf_conversion(st->lspold, lsf_flt, ORDER);
+    }
+
+    ixheaacd_alg_vec_dequant(pstr_td_frame_data, first_lpd_flag, lsf_flt, pstr_td_frame_data->mod,
+                             usac_data->ec_flag);
   }
-
-  ixheaacd_alg_vec_dequant(pstr_td_frame_data, first_lpd_flag, lsf_flt,
-                           pstr_td_frame_data->mod);
-
+  if (usac_data->ec_flag && !(usac_data->frame_ok)) {
+    for (i = 0; i < 5; i++) {
+      memcpy(&lsf_flt[i * ORDER], &usac_data->lsp_coeff[i], ORDER * sizeof(lsf_flt[0]));
+    }
+  }
   if (first_lpd_flag) {
     ixheaacd_mem_cpy(&lsf_flt[0], st->lsf_prev, ORDER);
     ixheaacd_lsf_2_lsp_conversion_float(st->lsf_prev, st->lspold, ORDER);
@@ -424,9 +460,9 @@
       } else {
         fac_length = len_subfrm / 2;
       }
-      if ((pstr_td_frame_data->fac_data[0] < 0) ||
-          (pstr_td_frame_data->fac_data[0] > 128)) {
-        return -1;
+
+      if (usac_data->frame_ok == 0) {
+        memset(&pstr_td_frame_data->fac_data[0], 0, sizeof(pstr_td_frame_data->fac_data));
       }
       gain = ixheaacd_pow_10_i_by_128[pstr_td_frame_data->fac_data[0]];
 
@@ -439,13 +475,20 @@
             ptr_scratch[fac_length - 2 * i] << 16;
       }
 
-      err = ixheaacd_fwd_alias_cancel_tool(usac_data, pstr_td_frame_data,
-                                           fac_length, lp_flt_coeff_a, gain);
-      if (err == -1) return err;
+      if (usac_data->ec_flag == 0) {
+        if (fac_length & (fac_length - 1)) {
+          if ((fac_length != 48) && (fac_length != 96) && (fac_length != 192) &&
+              (fac_length != 384) && (fac_length != 768)) {
+            return -1;
+          }
+        }
+      }
 
-      memset(
-          &usac_data->overlap_data_ptr[usac_data->present_chan][(len_fr / 2)],
-          0, fac_length * sizeof(WORD32));
+      ixheaacd_fwd_alias_cancel_tool(usac_data, pstr_td_frame_data, fac_length, lp_flt_coeff_a,
+                                     gain);
+
+      memset(&usac_data->overlap_data_ptr[usac_data->present_chan][(len_fr / 2)], 0,
+             fac_length * sizeof(WORD32));
     }
 
     for (i = 0; i < 2 * len_subfrm; i++)
@@ -484,6 +527,14 @@
   k = 0;
 
   while (k < 4) {
+    if (usac_data->ec_flag && usac_data->frame_ok == 0) {
+      if (mod[k] != 0 && usac_data->frame_ok == 0 &&
+          usac_data->str_error_concealment[ch].prev_frame_ok[0] == 0 && k == 0) {
+        memcpy(st->lspold, usac_data->lspold_ec, sizeof(st->lspold));
+      }
+      usac_data->num_lost_lpd_frames[usac_data->present_chan]++;
+    }
+
     mode = mod[k];
     if ((st->mode_prev == 0) && (mode > 0) &&
         (k != 0 || st->bpf_active_prev == 1)) {
@@ -491,35 +542,52 @@
       pitch[i + 1] = pitch[i] = pitch[i - 1];
       pitch_gain[i + 1] = pitch_gain[i] = pitch_gain[i - 1];
     }
-
-    if ((mode == 0) || (mode == 1))
+    if (usac_data->frame_ok == 0) {
       memcpy(lsf_curr, &lsf_flt[(k + 1) * ORDER], ORDER * sizeof(FLOAT32));
-    else if (mode == 2)
-      memcpy(lsf_curr, &lsf_flt[(k + 2) * ORDER], ORDER * sizeof(FLOAT32));
-    else
-      memcpy(lsf_curr, &lsf_flt[(k + 4) * ORDER], ORDER * sizeof(FLOAT32));
+    } else {
+      if ((mode == 0) || (mode == 1))
+        memcpy(lsf_curr, &lsf_flt[(k + 1) * ORDER], ORDER * sizeof(FLOAT32));
+      else if (mode == 2)
+        memcpy(lsf_curr, &lsf_flt[(k + 2) * ORDER], ORDER * sizeof(FLOAT32));
+      else
+        memcpy(lsf_curr, &lsf_flt[(k + 4) * ORDER], ORDER * sizeof(FLOAT32));
+    }
 
     ixheaacd_lsf_2_lsp_conversion_float(lsf_curr, lsp_curr, ORDER);
-
-    tmp = 0.0f;
-    for (i = 0; i < ORDER; i++) {
-      tmp += (lsf_curr[i] - st->lsf_prev[i]) * (lsf_curr[i] - st->lsf_prev[i]);
+    if (usac_data->frame_ok) {
+      tmp = 0.0f;
+      for (i = 0; i < ORDER; i++) {
+        tmp += (lsf_curr[i] - st->lsf_prev[i]) * (lsf_curr[i] - st->lsf_prev[i]);
+      }
+      stability_factor = (FLOAT32)(1.25f - (tmp / 400000.0f));
+      if (stability_factor > 1.0f) {
+        stability_factor = 1.0f;
+      }
+      if (stability_factor < 0.0f) {
+        stability_factor = 0.0f;
+      }
+      if (usac_data->ec_flag) {
+        usac_data->stability_factor_old = stability_factor;
+      }
     }
-    stability_factor = (FLOAT32)(1.25f - (tmp / 400000.0f));
-    if (stability_factor > 1.0f) {
-      stability_factor = 1.0f;
+    if (usac_data->ec_flag && !(usac_data->frame_ok)) {
+      stability_factor = usac_data->stability_factor_old;
     }
-    if (stability_factor < 0.0f) {
-      stability_factor = 0.0f;
+    if (usac_data->frame_ok == 0) {
+      mode = st->mode_prev;
     }
+    if ((usac_data->frame_ok == 1 && mode == 0) ||
+        (usac_data->frame_ok == 0 && (st->mode_prev == 0 || st->mode_prev == 1))) {
+      ixheaacd_interpolation_lsp_params(st->lspold, lsp_curr, lp_flt_coff_a, num_subfr);
 
-    if (mode == 0) {
-      ixheaacd_interpolation_lsp_params(st->lspold, lsp_curr, lp_flt_coff_a,
-                                        num_subfr);
+      if (usac_data->frame_ok == 1 || (usac_data->frame_ok == 0 && st->mode_prev == 0)) {
+        ixheaacd_acelp_alias_cnx(usac_data, pstr_td_frame_data, k, lp_flt_coff_a,
+                                 stability_factor, st);
+      }
 
-      err = ixheaacd_acelp_alias_cnx(usac_data, pstr_td_frame_data, k,
-                                     lp_flt_coff_a, stability_factor, st);
-      if (err) return err;
+      if (usac_data->frame_ok == 0 && st->mode_prev == 1) {
+        ixheaacd_usac_tcx_ec(usac_data, st, lsp_curr, k, lp_flt_coff_a);
+      }
 
       if ((st->mode_prev != 0) && bpf_control_info) {
         i = (k * num_subfr) + num_subfr_by2;
@@ -541,6 +609,12 @@
       } else if (mode == 3) {
         subfr_len = len_subfrm << 2;
         n_subfr = num_subfr_in_superfr;
+      } else {
+        if (usac_data->frame_ok == 0) {
+          mode = 3;
+          subfr_len = len_subfrm << 2;
+          n_subfr = num_subfr_in_superfr;
+        }
       }
 
       ixheaacd_lpc_coef_gen(st->lspold, lsp_curr, lp_flt_coff_a, n_subfr,
@@ -549,11 +623,17 @@
       err = ixheaacd_tcx_mdct(usac_data, pstr_td_frame_data, k, lp_flt_coff_a,
                               subfr_len, st);
       if (err) return err;
+      if (usac_data->frame_ok == 1 && k == 2) {
+        memcpy(usac_data->lp_flt_coff_a_ec, &lp_flt_coff_a[k * (ORDER + 1)],
+               sizeof(usac_data->lp_flt_coff_a_ec));
+      }
       k += (1 << (mode - 1));
     }
 
     st->mode_prev = mode;
-
+    if (usac_data->frame_ok == 0) {
+      memcpy(usac_data->lspold_ec, st->lspold, sizeof(st->lspold));
+    }
     ixheaacd_mem_cpy(lsp_curr, st->lspold, ORDER);
     ixheaacd_mem_cpy(lsf_curr, st->lsf_prev, ORDER);
   }
@@ -587,8 +667,12 @@
     if (gain > 0.0f) {
       synth_corr = 0.0f, synth_energy = 1e-6f;
       if ((((i * LEN_SUBFR) + LEN_SUBFR) > LEN_SUPERFRAME) ||
-          ((((i * LEN_SUBFR) + LEN_SUBFR) - tp) > LEN_SUPERFRAME))
-        return -1;
+          ((((i * LEN_SUBFR) + LEN_SUBFR) - tp) > LEN_SUPERFRAME)) {
+        if (usac_data->ec_flag) {
+          tp = LEN_SUPERFRAME - LEN_SUBFR - (i * LEN_SUBFR);
+        } else
+          return -1;
+      }
       for (k = 0; k < LEN_SUBFR; k++) {
         synth_corr +=
             synth[i * LEN_SUBFR + k] * synth[(i * LEN_SUBFR) - tp + k];
@@ -600,12 +684,20 @@
   }
 
   if (mod[3] == 0) {
-    err = ixheaacd_bass_post_filter(synth, pitch, pitch_gain, fsynth, len_fr,
-                                    synth_delay, st->bpf_prev);
+    err = ixheaacd_bass_post_filter(synth, pitch, pitch_gain, fsynth, len_fr, synth_delay,
+                                    st->bpf_prev, usac_data->ec_flag);
   } else {
-    err =
-        ixheaacd_bass_post_filter(synth, pitch, pitch_gain, fsynth, len_fr,
-                                  synth_delay - (len_subfrm / 2), st->bpf_prev);
+    err = ixheaacd_bass_post_filter(synth, pitch, pitch_gain, fsynth, len_fr,
+                                    synth_delay - (len_subfrm / 2), st->bpf_prev,
+                                    usac_data->ec_flag);
+  }
+  if (err) return err;
+  if (usac_data->ec_flag && usac_data->frame_ok) {
+    memcpy(usac_data->lpc4_lsf, pstr_td_frame_data->lpc4_lsf, sizeof(usac_data->lpc4_lsf));
+    memcpy(usac_data->str_error_concealment[ch].lsf4, usac_data->lpc4_lsf,
+           sizeof(usac_data->lpc4_lsf));
+    memcpy(usac_data->lsf_adaptive_mean, pstr_td_frame_data->lsf_adaptive_mean_cand,
+           sizeof(usac_data->lsf_adaptive_mean));
   }
   return err;
 }
@@ -663,15 +755,13 @@
   float *synth, synth_corr, synth_energy;
   WORD32 pitch[NUM_SUBFR_SUPERFRAME_BY2 + 3];
   float pitch_gain[NUM_SUBFR_SUPERFRAME_BY2 + 3];
-  WORD32 len_fr, lpd_sbf_len, lpd_delay, num_subfr_by2, synth_delay, fac_length;
+  WORD32 len_fr, lpd_sbf_len, num_subfr_by2, synth_delay;
   WORD32 err = 0;
 
   len_fr = usac_data->ccfl;
   lpd_sbf_len = (NUM_FRAMES * usac_data->num_subfrm) / 2;
-  lpd_delay = lpd_sbf_len * LEN_SUBFR;
   num_subfr_by2 = lpd_sbf_len - 1;
   synth_delay = num_subfr_by2 * LEN_SUBFR;
-  fac_length = (usac_data->len_subfrm) / 2;
 
   ixheaacd_memset(synth_buf, MAX_PITCH + synth_delay + len_fr);
   ixheaacd_mem_cpy(st->synth_prev, synth_buf, MAX_PITCH + synth_delay);
@@ -700,11 +790,19 @@
   for (i = 0; i < num_subfr_by2 + 2; i++) {
     tp = pitch[i];
     if ((i * LEN_SUBFR + MAX_PITCH) < tp) {
-      return -1;
+      if (usac_data->ec_flag == 0)
+        return -1;
+      else {
+        tp = MAX_PITCH - (i * LEN_SUBFR);
+      }
     } else if (((i * LEN_SUBFR + MAX_PITCH - tp) >= 1883) ||
                (((i * LEN_SUBFR) + LEN_SUBFR) > LEN_SUPERFRAME) ||
                ((((i * LEN_SUBFR) + LEN_SUBFR) - tp) > LEN_SUPERFRAME)) {
-      return -1;
+      if (usac_data->ec_flag == 0)
+        return -1;
+      else {
+        tp = (i * LEN_SUBFR + MAX_PITCH - 1882);
+      }
     }
 
     if (pitch_gain[i] > 0.0f) {
@@ -719,10 +817,9 @@
     }
   }
 
-  err = ixheaacd_bass_post_filter(synth, pitch, pitch_gain, signal_out,
-                                  (lpd_sbf_len + 2) * LEN_SUBFR + LEN_SUBFR,
-                                  len_fr - (lpd_sbf_len + 4) * LEN_SUBFR,
-                                  st->bpf_prev);
+  err = ixheaacd_bass_post_filter(
+      synth, pitch, pitch_gain, signal_out, (lpd_sbf_len + 2) * LEN_SUBFR + LEN_SUBFR,
+      len_fr - (lpd_sbf_len + 4) * LEN_SUBFR, st->bpf_prev, usac_data->ec_flag);
   if (err != 0) return err;
 
   ixheaacd_mem_cpy(signal_out, out_buffer,
diff --git a/decoder/ixheaacd_lpc_dec.c b/decoder/ixheaacd_lpc_dec.c
index 3dda040..2794776 100644
--- a/decoder/ixheaacd_lpc_dec.c
+++ b/decoder/ixheaacd_lpc_dec.c
@@ -31,6 +31,8 @@
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_func_def.h"
@@ -65,7 +67,7 @@
 }
 
 static WORD32 ixheaacd_decoding_avq_tool(WORD32 *read_arr, WORD32 *nvecq) {
-  WORD32 i, k, n, qn, nk, kv[8] = {0};
+  WORD32 i, k, qn, kv[8] = {0};
   WORD32 code_book_idx;
   WORD32 *ptr_kv = &kv[0];
 
@@ -74,13 +76,6 @@
   for (k = 0; k < 2; k++) {
     qn = read_arr[k];
 
-    nk = 0;
-    n = qn;
-    if (qn > 4) {
-      nk = (qn - 3) >> 1;
-      n = qn - nk * 2;
-    }
-
     if (qn > 0) {
       code_book_idx = read_arr[position++];
 
@@ -104,7 +99,7 @@
   extern const FLOAT32 ixheaacd_weight_table_avq[];
   WORD32 position = 0;
   WORD32 avq[ORDER];
-  FLOAT32 d[ORDER + 1], lsf_min;
+  FLOAT32 lsf_min;
   const FLOAT32 *ptr_w;
 
   ptr_w = &ixheaacd_weight_table_avq[(indx[0] * ORDER)];
@@ -117,12 +112,6 @@
 
   position += ixheaacd_decoding_avq_tool(&indx[position], avq);
 
-  d[0] = lsf[0];
-  d[ORDER] = FREQ_MAX - lsf[ORDER - 1];
-  for (i = 1; i < ORDER; i++) {
-    d[i] = lsf[i] - lsf[i - 1];
-  }
-
   lsf_min = LSF_GAP;
   for (i = 0; i < ORDER; i++) {
     lsf[i] += (ptr_w[i] * avq[i]);
@@ -132,6 +121,15 @@
     lsf_min = lsf[i] + LSF_GAP;
   }
 
+  lsf_min = FREQ_MAX - LSF_GAP;
+  for (i = ORDER - 1; i >= 0; i--) {
+    if (lsf[i] > lsf_min) {
+      lsf[i] = lsf_min;
+    }
+
+    lsf_min = lsf[i] - LSF_GAP;
+  }
+
   return position;
 }
 
@@ -159,14 +157,13 @@
   return position;
 }
 
-VOID ixheaacd_alg_vec_dequant(ia_td_frame_data_struct *pstr_td_frame_data,
-                              WORD32 first_lpd_flag, FLOAT32 *lsf,
-                              WORD32 mod[]) {
+VOID ixheaacd_alg_vec_dequant(ia_td_frame_data_struct *pstr_td_frame_data, WORD32 first_lpd_flag,
+                              FLOAT32 *lsf, WORD32 mod[], WORD32 ec_flag) {
   WORD32 i;
   WORD32 *lpc_index, mode_lpc, pos = 0;
-
+  WORD32 lpc_present[5] = {0, 0, 0, 0, 0};
   lpc_index = pstr_td_frame_data->lpc_first_approx_idx;
-
+  lpc_present[4] = 1;
   pos = ixheaacd_avq_first_approx_abs(&lsf[4 * ORDER], &lpc_index[0]);
 
   lpc_index += pos;
@@ -185,10 +182,12 @@
 
     lpc_index += pos;
   }
+  lpc_present[0] = 1;
 
   if (mod[0] < 3) {
     mode_lpc = lpc_index[0];
     lpc_index++;
+    lpc_present[2] = 1;
 
     if (mode_lpc == 0) {
       pos = ixheaacd_avq_first_approx_abs(&lsf[2 * ORDER], &lpc_index[0]);
@@ -203,6 +202,7 @@
   if (mod[0] < 2) {
     mode_lpc = lpc_index[0];
     lpc_index++;
+    lpc_present[1] = 1;
 
     if (mode_lpc == 1) {
       for (i = 0; i < ORDER; i++)
@@ -222,6 +222,7 @@
   if (mod[2] < 2) {
     mode_lpc = lpc_index[0];
     lpc_index++;
+    lpc_present[3] = 1;
 
     if (mode_lpc == 0) {
       pos = ixheaacd_avq_first_approx_abs(&lsf[3 * ORDER], &lpc_index[0]);
@@ -239,4 +240,40 @@
 
     lpc_index += pos;
   }
-}
\ No newline at end of file
+  if (ec_flag) {
+    WORD32 last, k;
+    WORD32 num_lpc = 0, num_div = 4;
+    FLOAT32 div_fac;
+    FLOAT32 *lsf4 = &lsf[4 * ORDER];
+    for (i = 0; i < ORDER; i++) {
+      pstr_td_frame_data->lpc4_lsf[i] = lsf4[i];
+    }
+    i = num_div;
+    do {
+      num_lpc += lpc_present[i--];
+    } while (i >= 0 && num_lpc < 3);
+
+    last = i;
+
+    switch (num_lpc) {
+      case 3:
+        div_fac = (1.0f / 3.0f);
+        break;
+      case 2:
+        div_fac = (1.0f / 2.0f);
+        break;
+      default:
+        div_fac = (1.0f);
+        break;
+    }
+    for (k = 0; k < ORDER; k++) {
+      FLOAT32 temp = 0;
+      for (i = 4; i > last; i--) {
+        if (lpc_present[i]) {
+          temp = temp + (lsf[i * ORDER + k] * div_fac);
+        }
+      }
+      pstr_td_frame_data->lsf_adaptive_mean_cand[k] = temp;
+    }
+  }
+}
diff --git a/decoder/ixheaacd_lpfuncs.c b/decoder/ixheaacd_lpfuncs.c
index 44433a0..a86c94d 100644
--- a/decoder/ixheaacd_lpfuncs.c
+++ b/decoder/ixheaacd_lpfuncs.c
@@ -45,8 +45,10 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
-#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
 #include "ixheaacd_sbrdecoder.h"
@@ -72,11 +74,15 @@
 
 #include "ixheaacd_latmdemux.h"
 
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_aacdec.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
-
 #include "ixheaacd_struct_def.h"
 
 #include "ixheaacd_tns.h"
@@ -85,98 +91,69 @@
 #include "ixheaacd_multichannel.h"
 #include "ixheaacd_function_selector.h"
 
-static PLATFORM_INLINE WORD32 ixheaacd_shr32_drc(WORD32 a, WORD32 b) {
-  WORD32 out_val;
-
-  b = ((UWORD32)(b << 24) >> 24);
-  if (b >= 31) {
-    if (a < 0)
-      out_val = -1;
-    else
-      out_val = 0;
-  } else {
-    a = ixheaacd_add32_sat(a, (1 << (b - 1)));
-    out_val = (WORD32)a >> b;
-  }
-
-  return out_val;
-}
-
-static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_drc(WORD32 a, WORD16 b) {
-  WORD32 result;
-  WORD64 temp_result;
-
-  temp_result = (WORD64)a * (WORD64)b;
-
-  if (temp_result < (WORD64)MIN_32)
-    result = MIN_32;
-
-  else if (temp_result > (WORD64)MAX_32)
-    result = MAX_32;
-
-  else
-    result = (WORD32)(temp_result);
-
-  return (result);
-}
-
-VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD32 *out,
                               const WORD16 *window_long,
                               const WORD16 *window_short, WORD16 q_shift,
-                              WORD16 ch_fac, WORD16 flag) {
+                              WORD16 ch_fac, WORD16 flag, WORD16 size_01) {
   WORD32 i, accu;
   WORD32 *coef_1;
   const WORD16 *temp_win_sh, *temp_win_long;
-  WORD16 *out1, *out2;
+  WORD32 *out1, *out2;
   WORD32 *temp_prev;
 
+  WORD16 size_07 = 7 * size_01;
+  WORD16 size_08 = 8 * size_01;
+  WORD16 size_09 = 9 * size_01;
+  WORD16 size_14 = 14 * size_01;
+  WORD16 size_15 = 15 * size_01;
+
   if (flag == 1) {
-    for (i = 0; i < SIZE07; i++) {
+    for (i = 0; i < size_07; i++) {
       WORD32 temp1 = ixheaacd_shl32_dir_sat_limit(
-          ixheaacd_mult32x16in32(coef[SIZE08 + i], window_long[2 * i]),
+          ixheaacd_mult32x16in32(coef[size_08 + i], window_long[2 * i]),
           (q_shift + 1));
 
       accu = ixheaacd_add32_sat(temp1, ((WORD32)prev[i] << 16));
-      out[ch_fac * i] = ixheaacd_round16(accu << 1);
+      out[ch_fac * i] = accu;
 
       accu = ixheaacd_shl32_dir_sat_limit(
-          ixheaacd_mult32x16in32(-(coef[SIZE15 - 1 - i]),
-                                 window_long[2 * (SIZE07 - i) - 1]),
+          ixheaacd_mult32x16in32(-(coef[size_15 - 1 - i]),
+                                 window_long[2 * (size_07 - i) - 1]),
           q_shift);
-      out[ch_fac * (i + SIZE09)] = ixheaacd_round16(accu << 2);
+      out[ch_fac * (i + size_09)] = (accu << 1);
     }
 
     temp_win_sh = &(window_short[0]);
-    coef_1 = &(coef[SIZE15]);
-    temp_win_long = &(window_long[SIZE14]);
-    temp_prev = &(prev[SIZE08 - 1]);
-    out1 = &(out[ch_fac * (SIZE07)]);
-    out2 = &(out[ch_fac * (SIZE09 - 1)]);
+    coef_1 = &(coef[size_15]);
+    temp_win_long = &(window_long[size_14]);
+    temp_prev = &(prev[size_08 - 1]);
+    out1 = &(out[ch_fac * (size_07)]);
+    out2 = &(out[ch_fac * (size_09 - 1)]);
 
   } else {
-    for (i = 0; i < SIZE07; i++) {
-      accu = ixheaacd_mult32x16in32_drc(
-          prev[SIZE08 - 1 - i], ixheaacd_negate16(window_long[2 * i + 1]));
+    for (i = 0; i < size_07; i++) {
+      accu = ixheaacd_mult32x16in32_sat(
+          prev[size_08 - 1 - i], ixheaacd_negate16(window_long[2 * i + 1]));
 
-      out[ch_fac * i] = ixheaacd_round16(accu << 2);
+      out[ch_fac * i] = accu;
 
       accu = ixheaacd_sub32_sat(
-          ixheaacd_shl32_dir_sat_limit(-(coef[SIZE15 - 1 - i]), (q_shift - 1)),
-          ixheaacd_mult32x16in32_drc(prev[i + SIZE01],
-                                     window_long[2 * SIZE07 - 2 - 2 * i]));
+          ixheaacd_shl32_dir_sat_limit(-(coef[size_15 - 1 - i]), (q_shift - 1)),
+          ixheaacd_mult32x16in32_sat(prev[i + size_01],
+                                     window_long[2 * size_07 - 2 - 2 * i]));
 
-      out[ch_fac * (SIZE09 + i)] = ixheaacd_round16(accu << 2);
+      out[ch_fac * (size_09 + i)] = accu;
     }
 
-    temp_win_sh = &(window_long[SIZE14]);
-    coef_1 = &(coef[SIZE15]);
+    temp_win_sh = &(window_long[size_14]);
+    coef_1 = &(coef[size_15]);
     temp_win_long = &(window_short[0]);
-    temp_prev = &(prev[SIZE01 - 1]);
-    out1 = &(out[ch_fac * (SIZE07)]);
-    out2 = &(out[ch_fac * (SIZE09 - 1)]);
+    temp_prev = &(prev[size_01 - 1]);
+    out1 = &(out[ch_fac * (size_07)]);
+    out2 = &(out[ch_fac * (size_09 - 1)]);
   }
 
-  for (i = SIZE01 - 1; i >= 0; i--) {
+  for (i = size_01 - 1; i >= 0; i--) {
     WORD32 temp_coef = *coef_1++;
     WORD16 win1 = *temp_win_long++;
     WORD16 win2 = *temp_win_long++;
@@ -186,31 +163,34 @@
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_dir_sat_limit(ixheaacd_mult32x16in32(temp_coef, win1),
                                      q_shift),
-        ixheaacd_mult32x16in32_drc(prev1, win3));
-    *out1 = ixheaacd_round16(accu << 2);
+        ixheaacd_mult32x16in32_sat(prev1, win3));
+    *out1 = accu << flag;
     out1 += ch_fac;
 
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_dir_sat_limit(
             ixheaacd_mult32x16in32(ixheaacd_negate32_sat(temp_coef), win2),
             q_shift),
-        ixheaacd_mult32x16in32_drc(prev1, win4));
-    *out2 = ixheaacd_round16(accu << 2);
+        ixheaacd_mult32x16in32_sat(prev1, win4));
+    *out2 = accu << flag;
     out2 -= ch_fac;
   }
 }
 
 static PLATFORM_INLINE VOID ixheaacd_long_short_win_process(
-    WORD32 *current, WORD32 *prev, WORD16 *out, const WORD16 *short_window,
+    WORD32 *current, WORD32 *prev, WORD32 *out, const WORD16 *short_window,
     const WORD16 *long_window_prev, WORD16 q_shift, WORD16 ch_fac,
-    WORD32 flag) {
+    WORD32 flag, WORD16 size_01) {
+
+  WORD16 size_02 = 2 * size_01;
+  WORD16 size_03 = 3 * size_01;
   WORD i;
   WORD32 accu;
-  WORD32 *current_tmp1 = &(current[(SIZE03 - 1)]);
-  WORD32 *current_tmp2 = &(current[-SIZE01]);
-  const WORD16 *short_ptr = &(short_window[SIZE02 - 1]);
+  WORD32 *current_tmp1 = &(current[(size_03 - 1)]);
+  WORD32 *current_tmp2 = &(current[-size_01]);
+  const WORD16 *short_ptr = &(short_window[size_02 - 1]);
 
-  for (i = SIZE01 - 1; i >= 0; i--) {
+  for (i = size_01 - 1; i >= 0; i--) {
     WORD32 tmp1_cur = *current_tmp1--;
     WORD32 tmp2_cur = *current_tmp2++;
     WORD16 short1 = *short_ptr--;
@@ -219,143 +199,176 @@
         ixheaacd_shl32_dir_sat_limit((ixheaacd_mult32x16in32(tmp1_cur, short2) -
                                       ixheaacd_mult32x16in32(tmp2_cur, short1)),
                                      q_shift),
-        ixheaacd_mult32x16in32_drc(prev[i], long_window_prev[0 - 2 - 2 * i]));
-    out[ch_fac * (0 + i)] = ixheaacd_round16(accu << 2);
+        ixheaacd_mult32x16in32_sat(prev[i], long_window_prev[0 - 2 - 2 * i]));
+    out[ch_fac * (0 + i)] = accu;
 
     if (flag) {
       accu = ixheaacd_sub32_sat(
           ixheaacd_shl32_dir_sat_limit(
-              (ixheaacd_mult32x16in32(-(tmp1_cur), short1) -
+              (ixheaacd_mult32x16in32(ixheaacd_negate32_sat(tmp1_cur), short1) -
                ixheaacd_mult32x16in32(tmp2_cur, short2)),
               q_shift),
-          ixheaacd_mult32x16in32_drc(prev[SIZE02 - 1 - i],
-                                     long_window_prev[-2 * SIZE02 + 2 * i]));
-      out[ch_fac * (SIZE02 - 1 - i)] = ixheaacd_round16(accu << 2);
+          ixheaacd_mult32x16in32_sat(prev[size_02 - 1 - i],
+                                     long_window_prev[-2 * size_02 + 2 * i]));
+      out[ch_fac * (size_02 - 1 - i)] = accu;
     }
   }
 }
 
-VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD16 *out,
+VOID ixheaacd_long_short_win_seq(WORD32 *current, WORD32 *prev, WORD32 *out,
                                  const WORD16 *short_window,
                                  const WORD16 *short_window_prev,
                                  const WORD16 *long_window_prev, WORD16 q_shift,
-                                 WORD16 ch_fac) {
+                                 WORD16 ch_fac, WORD16 size_01) {
+
+  WORD16 size_02 = 2 * size_01;
+  WORD16 size_06 = 6 * size_01;
+  WORD16 size_07 = 7 * size_01;
+  WORD16 size_08 = 8 * size_01;
+  WORD16 size_09 = 9 * size_01;
+  WORD16 size_10 = 10 * size_01;
+  WORD16 size_16 = 16 * size_01;
+
   WORD32 i, flag;
   WORD32 accu;
-  for (i = 0; i < SIZE07; i++) {
-    accu = ixheaacd_mult32x16in32_drc(
-        prev[SIZE08 - 1 - i], ixheaacd_negate16(long_window_prev[2 * i + 1]));
-    out[ch_fac * i] = ixheaacd_round16(accu << 2);
+  for (i = 0; i < size_07; i++) {
+    accu = ixheaacd_mult32x16in32_sat(
+        prev[size_08 - 1 - i], ixheaacd_negate16(long_window_prev[2 * i + 1]));
+    out[ch_fac * i] = accu;
   }
 
-  for (i = 0; i < SIZE01; i++) {
+  for (i = 0; i < size_01; i++) {
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_dir_sat_limit(
-            ixheaacd_mult32x16in32(current[SIZE01 + i],
+            ixheaacd_mult32x16in32(current[size_01 + i],
                                    short_window_prev[2 * i]),
             q_shift),
-        ixheaacd_mult32x16in32_drc(prev[SIZE01 - 1 - i],
-                                   long_window_prev[2 * SIZE07 + 1 + 2 * i]));
-    out[ch_fac * (SIZE07 + i)] = ixheaacd_round16(accu << 2);
+        ixheaacd_mult32x16in32_sat(prev[size_01 - 1 - i],
+                                   long_window_prev[2 * size_07 + 1 + 2 * i]));
+    out[ch_fac * (size_07 + i)] = accu;
   }
 
-  for (i = 0; i < SIZE01; i++) {
+  for (i = 0; i < size_01; i++) {
     accu = ixheaacd_sub32_sat(
         ixheaacd_shl32_dir_sat_limit(
-            ixheaacd_mult32x16in32(-(current[SIZE02 - 1 - i]),
-                                   short_window_prev[SIZE02 - 2 * i - 1]),
+            ixheaacd_mult32x16in32(ixheaacd_negate32_sat(current[size_02 - 1 - i]),
+                                   short_window_prev[size_02 - 2 * i - 1]),
             q_shift),
-        ixheaacd_mult32x16in32_drc(prev[i],
-                                   long_window_prev[SIZE16 - 2 - (2 * i)]));
-    out[ch_fac * (SIZE08 + i)] = ixheaacd_round16(accu << 2);
+        ixheaacd_mult32x16in32_sat(prev[i],
+                                   long_window_prev[size_16 - 2 - (2 * i)]));
+    out[ch_fac * (size_08 + i)] = accu;
   }
 
   flag = 1;
   for (i = 0; i < 4; i++) {
-    WORD32 inc = i * SIZE02;
+    WORD32 inc = i * size_02;
 
     if (i == 3) {
       flag = 0;
     }
 
-    ixheaacd_long_short_win_process(&current[SIZE01 + inc], &prev[SIZE01 + inc],
-                                    &out[ch_fac * (SIZE09 + inc)], short_window,
-                                    &long_window_prev[2 * (SIZE07 - inc)],
-                                    q_shift, ch_fac, flag);
+    ixheaacd_long_short_win_process(&current[size_01 + inc], &prev[size_01 + inc],
+                                    &out[ch_fac * (size_09 + inc)], short_window,
+                                    &long_window_prev[2 * (size_07 - inc)],
+                                    q_shift, ch_fac, flag, size_01);
   }
 
-  for (i = 0; i < SIZE01; i++) {
-    accu = (ixheaacd_mult32x16in32(-(current[SIZE10 - 1 - i]),
-                                   short_window[SIZE02 - 2 * i - 1]) -
-            ixheaacd_mult32x16in32(current[SIZE06 + i],
-                                   short_window[SIZE02 - 2 * i - 2]));
+  for (i = 0; i < size_01; i++) {
+    accu = (ixheaacd_mult32x16in32(-(current[size_10 - 1 - i]),
+                                   short_window[size_02 - 2 * i - 1]) -
+            ixheaacd_mult32x16in32(current[size_06 + i],
+                                   short_window[size_02 - 2 * i - 2]));
     prev[i] =
         ixheaacd_round16(ixheaacd_shl32_dir_sat_limit(accu, (q_shift + 1)));
   }
 }
 
-VOID ixheaacd_nolap1_32(WORD32 *coef,
-
-                        WORD32 *out,
-
-                        WORD16 q_shift, WORD16 ch_fac) {
+VOID ixheaacd_nolap1_32(WORD32 *coef, WORD32 *out, WORD16 q_shift,
+                        WORD16 ch_fac, WORD16 size_01) {
+  WORD16 size_07 = 7 * size_01;
   WORD32 i;
 
-  for (i = 0; i < SIZE07; i++) {
-    out[ch_fac * i] = ixheaacd_shr32_drc(
-        ixheaacd_negate32_sat(coef[SIZE07 - 1 - i]), 16 - q_shift);
+  for (i = 0; i < size_07; i++) {
+    out[ch_fac * i] = ixheaacd_shr32_sat(
+        ixheaacd_negate32_sat(coef[size_07 - 1 - i]), 16 - q_shift);
   }
 }
 
-VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+VOID ixheaacd_neg_shift_spec_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift,
                                  WORD16 ch_fac) {
   WORD32 i;
-
   for (i = 0; i < SIZE07; i++) {
-    out[ch_fac * i] = ixheaacd_round16(ixheaacd_shl32_dir_sat_limit(
+    out[ch_fac * i] = (ixheaacd_shl32_dir_sat_limit(
         ixheaacd_negate32_sat(coef[SIZE07 - 1 - i]), q_shift));
   }
 }
 
+VOID ixheaacd_Nolap_dec(WORD32 *coef, WORD32 *out, WORD16 q_shift,
+                        WORD16 ch_fac, WORD16 size_01) {
+  WORD16 size_07 = 7 * size_01;
+  WORD32 i;
+  for (i = 0; i < size_07; i++) {
+    out[ch_fac * i] = ixheaacd_shl32_dir_sat_limit(
+        ixheaacd_negate32_sat(coef[size_07 - 1 - i]), q_shift);
+  }
+}
+
 VOID ixheaacd_spec_to_overlapbuf_dec(WORD32 *ptr_overlap_buf,
                                      WORD32 *ptr_spec_coeff, WORD32 q_shift,
                                      WORD32 size) {
   WORD32 i;
   for (i = 0; i < size; i++) {
-    ptr_overlap_buf[i] = ixheaacd_shr32_drc(ptr_spec_coeff[i], 16 - q_shift);
+    ptr_overlap_buf[i] = ixheaacd_shr32_sat(ptr_spec_coeff[i], 16 - q_shift);
   }
 }
 
-VOID ixheaacd_overlap_buf_out_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf,
+VOID ixheaacd_overlap_buf_out_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
                                   WORD32 size, const WORD16 ch_fac) {
   WORD32 i;
 
   for (i = 0; i < size; i++) {
-    out_samples[ch_fac * i] = ixheaacd_shl16_sat((WORD16)ptr_overlap_buf[i], 1);
+    out_samples[ch_fac * i] =
+        (ixheaacd_shl32_sat((WORD16)ptr_overlap_buf[i], 15));
   }
 }
 
-VOID ixheaacd_overlap_out_copy_dec(WORD16 *out_samples, WORD32 *ptr_overlap_buf,
+VOID ixheaacd_overlap_out_copy_dec(WORD32 *out_samples, WORD32 *ptr_overlap_buf,
                                    WORD32 *ptr_overlap_buf1,
-                                   const WORD16 ch_fac) {
+                                   const WORD16 ch_fac, WORD16 size_01) {
   WORD32 i;
 
-  for (i = 0; i < SIZE01; i++) {
-    out_samples[ch_fac * i] = ixheaacd_shl16_sat((WORD16)ptr_overlap_buf[i], 1);
+  for (i = 0; i < size_01; i++) {
+    out_samples[ch_fac * i] =
+        ixheaacd_shl32_sat((WORD16)ptr_overlap_buf[i], 15);
     ptr_overlap_buf[i] = ptr_overlap_buf1[i];
   }
 }
 
 VOID ixheaacd_imdct_process(ia_aac_dec_overlap_info *ptr_aac_dec_overlap_info,
                             WORD32 *ptr_spec_coeff,
-                            ia_ics_info_struct *ptr_ics_info,
-                            WORD16 out_samples[], const WORD16 ch_fac,
-                            WORD32 *scratch,
+                            ia_ics_info_struct *ptr_ics_info, VOID *out_samples,
+                            const WORD16 ch_fac, WORD32 *scratch,
                             ia_aac_dec_tables_struct *ptr_aac_tables,
-                            WORD32 object_type) {
+                            WORD32 object_type, WORD32 ld_mps_present,
+                            WORD slot_element) {
   WORD32 *ptr_overlap_buf;
   const WORD16 *ptr_long_window;
   const WORD16 *ptr_short_window;
+  WORD16 max_bin_long = ptr_ics_info->frame_length;
+  WORD16 size_01;
+  if (max_bin_long == 960)
+    size_01 = (max_bin_long / 16);
+  else
+    size_01 = (MAX_BINS_LONG / 16);
+  WORD16 size_02 = 2 * size_01;
+  WORD16 size_04 = 4 * size_01;
+  WORD16 size_06 = 6 * size_01;
+  WORD16 size_07 = 7 * size_01;
+  WORD16 size_08 = 8 * size_01;
+  WORD16 size_09 = 9 * size_01;
+  WORD16 size_10 = 10 * size_01;
+  WORD16 size_14 = 14 * size_01;
+  WORD16 size_15 = 15 * size_01;
 
   ptr_overlap_buf = ptr_aac_dec_overlap_info->ptr_overlap_buf;
   ptr_long_window =
@@ -371,6 +384,8 @@
 
     if ((512 == ptr_ics_info->frame_length) ||
         (480 == ptr_ics_info->frame_length)) {
+      ptr_ics_info->qshift_adj = -2;
+
       if (512 == ptr_ics_info->frame_length) {
         WORD32 *ld_cos_sin_ptr =
             (WORD32 *)ptr_aac_tables->pstr_imdct_tables->cosine_array_1024;
@@ -392,9 +407,10 @@
           ptr_spec_coeff[i + N + N / 2] = -ptr_spec_coeff[i + N / 2];
         }
       }
-    } else
-
-    {
+    } else if (960 == ptr_ics_info->frame_length) {
+      ixheaacd_mdct_960(ptr_spec_coeff, scratch, &imdct_scale, 0,
+                        ptr_aac_tables->pstr_imdct_tables);
+    } else {
       expo = (*ixheaacd_calc_max_spectral_line)(ptr_spec_coeff, 1024) - 1;
 
       expo = 8 - expo;
@@ -415,32 +431,57 @@
 
             if (1024 == ptr_ics_info->frame_length) {
               ia_ics_info_struct *tmp_ptr_ics_info = ptr_ics_info;
+
               (*ixheaacd_post_twid_overlap_add)(
-                  out_samples, ptr_spec_coeff,
+                  (WORD32 *)out_samples, ptr_spec_coeff,
                   ptr_aac_tables->pstr_imdct_tables, 1024, ptr_overlap_buf,
                   q_shift, ptr_long_window, ch_fac);
+
+              ptr_ics_info->qshift_adj = 2;
               ptr_ics_info = tmp_ptr_ics_info;
             }
+
+            if (960 == ptr_ics_info->frame_length)
+            {
+                ixheaacd_over_lap_add1_dec(ptr_spec_coeff, ptr_overlap_buf,
+                    (WORD32*)out_samples, ptr_long_window, q_shift,
+                    480, ch_fac);
+
+                ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
+                                            q_shift, 480);
+
+                ptr_ics_info->qshift_adj = 2;
+            }
+
             if ((512 == ptr_ics_info->frame_length) ||
                 (480 == ptr_ics_info->frame_length)) {
               if (object_type != AOT_ER_AAC_ELD) {
                 if (512 == ptr_ics_info->frame_length) {
                   ixheaacd_lap1_512_480(ptr_spec_coeff, ptr_overlap_buf,
-                                        out_samples, ptr_long_window, q_shift,
-                                        SIZE04, ch_fac);
+                                        (WORD16 *)out_samples, ptr_long_window,
+                                        q_shift, size_04, ch_fac, slot_element);
                   ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
-                                              q_shift, SIZE04);
+                                              q_shift, size_04);
                 } else if (480 == ptr_ics_info->frame_length) {
                   ixheaacd_lap1_512_480(ptr_spec_coeff, ptr_overlap_buf,
-                                        out_samples, ptr_long_window, q_shift,
-                                        240, ch_fac);
+                                        (WORD16 *)out_samples, ptr_long_window,
+                                        q_shift, 240, ch_fac, slot_element);
                   ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
                                               q_shift, 240);
                 }
               } else {
-                ixheaacd_eld_dec_windowing(
-                    ptr_spec_coeff, ptr_long_window, ptr_ics_info->frame_length,
-                    q_shift, ptr_overlap_buf, ch_fac, out_samples);
+                if (ld_mps_present == 1) {
+                  ixheaacd_eld_dec_windowing_32bit(
+                      ptr_spec_coeff, ptr_long_window,
+                      ptr_ics_info->frame_length, q_shift, ptr_overlap_buf,
+                      ch_fac, (WORD32 *)out_samples);
+                } else {
+                  ixheaacd_eld_dec_windowing(
+                      ptr_spec_coeff, ptr_long_window,
+                      ptr_ics_info->frame_length, q_shift, ptr_overlap_buf,
+                      ch_fac, (WORD16 *)out_samples, slot_element);
+                }
+                ptr_ics_info->qshift_adj = -2;
               }
             }
             break;
@@ -450,21 +491,32 @@
             if (1024 == ptr_ics_info->frame_length) {
               (*ixheaacd_post_twiddle)(scratch, ptr_spec_coeff,
                                        ptr_aac_tables->pstr_imdct_tables, 1024);
+              ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
+                                       (WORD32*)out_samples, ptr_long_window,
+                                       ptr_short_window, q_shift, ch_fac, 1,
+                                       size_01);
+              (*ixheaacd_spec_to_overlapbuf)(ptr_overlap_buf, scratch, q_shift,
+                                             size_08);
             }
 
-            ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples,
-                                     ptr_long_window, ptr_short_window, q_shift,
-                                     ch_fac, 1);
+            if (960 == ptr_ics_info->frame_length) {
+              ixheaacd_process_win_seq(ptr_spec_coeff, ptr_overlap_buf,
+                                       (WORD32*)out_samples, ptr_long_window,
+                                       ptr_short_window, q_shift, ch_fac, 1,
+                                       size_01);
+              ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
+                                          q_shift, 480);
+            }
+
+            ptr_ics_info->qshift_adj = 1;
 
             if (512 == ptr_ics_info->frame_length) {
               ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
-                                          q_shift, SIZE04);
-            } else if (480 == ptr_ics_info->frame_length) {
+                                          q_shift, size_04);
+            }
+            if (480 == ptr_ics_info->frame_length) {
               ixheaacd_spec_to_overlapbuf(ptr_overlap_buf, ptr_spec_coeff,
                                           q_shift, 240);
-            } else {
-              (*ixheaacd_spec_to_overlapbuf)(ptr_overlap_buf, scratch, q_shift,
-                                             SIZE08);
             }
             break;
         }
@@ -480,25 +532,51 @@
           case ONLY_LONG_SEQUENCE:
           case LONG_STOP_SEQUENCE:
 
-            (*ixheaacd_over_lap_add1)(scratch, ptr_overlap_buf, out_samples,
-                                      ptr_long_window, q_shift, SIZE08, ch_fac);
-
+            if (1024 == ptr_ics_info->frame_length) {
+              (*ixheaacd_over_lap_add1)(scratch, ptr_overlap_buf,
+                                        (WORD32*)out_samples, ptr_long_window,
+                                        q_shift, size_08, ch_fac);
+            } else {
+              ixheaacd_over_lap_add1_dec(ptr_spec_coeff, ptr_overlap_buf,
+                                         (WORD32*)out_samples, ptr_long_window,
+                                         q_shift, size_08, ch_fac);
+            }
+            ptr_ics_info->qshift_adj = 2;
             break;
 
           case LONG_START_SEQUENCE:
           case EIGHT_SHORT_SEQUENCE:
 
-            ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples,
-                                     ptr_long_window, ptr_short_window, q_shift,
-                                     ch_fac, 1);
+            if (1024 == ptr_ics_info->frame_length) {
+              ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
+                                       (WORD32*)out_samples, ptr_long_window,
+                                       ptr_short_window, q_shift, ch_fac, 1,
+                                       size_01);
+            } else {
+              ixheaacd_process_win_seq(ptr_spec_coeff, ptr_overlap_buf,
+                                       (WORD32*)out_samples, ptr_long_window,
+                                       ptr_short_window, q_shift, ch_fac, 1,
+                                       size_01);
+            }
+
+            ptr_ics_info->qshift_adj = 1;
 
             break;
         }
 
-        ixheaacd_nolap1_32(&scratch[SIZE01], ptr_overlap_buf, q_shift, 1);
+        if (960 != ptr_ics_info->frame_length) {
+          ixheaacd_nolap1_32(&scratch[size_01], ptr_overlap_buf, q_shift, 1,
+                             size_01);
 
-        (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[SIZE07], scratch,
-                                       q_shift, SIZE01);
+          (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[size_07], scratch,
+                                         q_shift, size_01);
+        } else {
+          ixheaacd_nolap1_32(&ptr_spec_coeff[size_01], ptr_overlap_buf,
+                             q_shift, 1, size_01);
+
+          (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[size_07],
+                                         ptr_spec_coeff, q_shift, size_01);
+        }
 
         break;
 
@@ -512,33 +590,66 @@
           case EIGHT_SHORT_SEQUENCE:
           case LONG_START_SEQUENCE:
 
-            (*ixheaacd_overlap_buf_out)(out_samples, ptr_overlap_buf, SIZE07,
-                                        ch_fac);
-
-            (*ixheaacd_over_lap_add1)(
-                &scratch[SIZE14], &ptr_overlap_buf[SIZE07],
-                &out_samples[ch_fac * (SIZE07)], ptr_short_window, q_shift,
-                SIZE01, ch_fac);
+            if (960 != ptr_ics_info->frame_length) {
+              (*ixheaacd_overlap_buf_out)((WORD32*)out_samples,
+                                          ptr_overlap_buf, size_07, ch_fac);
+              (*ixheaacd_over_lap_add1)(
+                  &scratch[size_14], &ptr_overlap_buf[size_07],
+                  ((WORD32*)out_samples + ch_fac * (size_07)),
+                  ptr_short_window, q_shift, size_01, ch_fac);
+            } else {
+              ixheaacd_dec_copy_outsample((WORD32*)out_samples,
+                                          ptr_overlap_buf, size_07, ch_fac);
+              ixheaacd_over_lap_add1_dec(&ptr_spec_coeff[size_14],
+                                         &ptr_overlap_buf[size_07],
+                                         ((WORD32*)out_samples + ch_fac * (size_07)),
+                                         ptr_short_window, q_shift, size_01,
+                                         ch_fac);
+            }
 
             {
-              WORD16 q_shift1 = q_shift + 1;
-              (*ixheaacd_neg_shift_spec)(&scratch[SIZE08],
-                                         &out_samples[ch_fac * SIZE09],
-                                         q_shift1, ch_fac);
+              if (960 != ptr_ics_info->frame_length) {
+
+                WORD16 q_shift1 = q_shift - 1;
+                (*ixheaacd_neg_shift_spec)(&scratch[size_08],
+                                           ((WORD32*)out_samples + ch_fac * size_09),
+                                           q_shift1, ch_fac);
+              } else {
+                WORD16 q_shift1 = q_shift - 1;
+                ixheaacd_Nolap_dec(&ptr_spec_coeff[size_08],
+                                   ((WORD32*)out_samples + ch_fac * size_09),
+                                   q_shift1, ch_fac, size_01);
+              }
             }
+            ptr_ics_info->qshift_adj = 2;
 
             break;
           case ONLY_LONG_SEQUENCE:
           case LONG_STOP_SEQUENCE:
 
-            ixheaacd_process_win_seq(scratch, ptr_overlap_buf, out_samples,
-                                     ptr_long_window, ptr_short_window, q_shift,
-                                     ch_fac, 0);
+            if (1024 == ptr_ics_info->frame_length) {
+              ixheaacd_process_win_seq(scratch, ptr_overlap_buf,
+                                       (WORD32*)out_samples, ptr_long_window,
+                                       ptr_short_window, q_shift, ch_fac, 0,
+                                       size_01);
+            } else {
+              ixheaacd_process_win_seq(ptr_spec_coeff, ptr_overlap_buf,
+                                       (WORD32*)out_samples, ptr_long_window,
+                                       ptr_short_window, q_shift, ch_fac, 0,
+                                       size_01);
+            }
+
+            ptr_ics_info->qshift_adj = 2;
             break;
         }
 
-        (*ixheaacd_spec_to_overlapbuf)(ptr_overlap_buf, scratch, q_shift,
-                                       SIZE08);
+        if (1024 == ptr_ics_info->frame_length) {
+          (*ixheaacd_spec_to_overlapbuf)(ptr_overlap_buf, scratch, q_shift,
+                                         size_08);
+        } else {
+          (*ixheaacd_spec_to_overlapbuf)(ptr_overlap_buf, ptr_spec_coeff,
+                                         q_shift, size_08);
+        }
 
         break;
     }
@@ -554,88 +665,146 @@
     {
       WORD32 expo;
 
-      expo = (*ixheaacd_calc_max_spectral_line)(ptr_spec_coeff, 1024) - 1;
+      if (1024 == ptr_ics_info->frame_length) {
+        expo = (*ixheaacd_calc_max_spectral_line)(ptr_spec_coeff, 1024) - 1;
 
-      expo = 5 - expo;
+        expo = 5 - expo;
 
-      for (i = 0; i < MAX_WINDOWS; i++) {
-        imdct_scale[i] = ixheaacd_inverse_transform(
-            &ptr_spec_coeff[i * SIZE02], &scratch[i * SIZE02],
-            ptr_aac_tables->pstr_imdct_tables, expo, 128);
+        for (i = 0; i < MAX_WINDOWS; i++) {
+          imdct_scale[i] = ixheaacd_inverse_transform(
+              &ptr_spec_coeff[i * size_02], &scratch[i * size_02],
+              ptr_aac_tables->pstr_imdct_tables, expo, 128);
 
-        (*ixheaacd_post_twiddle)(&scratch[i * SIZE02],
-                                 &ptr_spec_coeff[i * SIZE02],
+        (*ixheaacd_post_twiddle)(&scratch[i * size_02],
+                                 &ptr_spec_coeff[i * size_02],
                                  ptr_aac_tables->pstr_imdct_tables, 128);
+        }
+        max_scale = 31 + imdct_scale[0];
+        q_shift = max_scale + (-16 - 6 - 1);
+      } else {
+        expo = (*ixheaacd_calc_max_spectral_line)(ptr_spec_coeff, 960) - 1;
+        memcpy(scratch, ptr_spec_coeff, sizeof(WORD32) * 960);
+
+        for (i = 0; i < MAX_WINDOWS; i++) {
+            ixheaacd_inverse_transform_960(
+                &ptr_spec_coeff[i * size_02], &scratch[i * size_02],
+                ptr_aac_tables->pstr_imdct_tables, expo, &imdct_scale[i]);
+
+                imdct_scale[i] -= expo;
+        }
+        max_scale = 31 + imdct_scale[0];
+        q_shift = max_scale + (-16 - 6 - 1);
+
       }
     }
-
-    max_scale = 31 + imdct_scale[0];
-
-    q_shift = max_scale + (-16 - 6 - 1);
-
     switch (ptr_aac_dec_overlap_info->window_sequence) {
-      WORD32 overlap_buf_loc[SIZE01];
+      WORD32 overlap_buf_loc[64];
 
       case EIGHT_SHORT_SEQUENCE:
       case LONG_START_SEQUENCE:
 
-        (*ixheaacd_overlap_buf_out)(out_samples, ptr_overlap_buf, SIZE07,
-                                    ch_fac);
+        (*ixheaacd_overlap_buf_out)((WORD32 *)out_samples, ptr_overlap_buf,
+                                    size_07, ch_fac);
 
-        (*ixheaacd_over_lap_add1)(&scratch[0], &ptr_overlap_buf[SIZE07],
-                                  &out_samples[ch_fac * SIZE07],
-                                  ptr_short_window, q_shift, SIZE01, ch_fac);
-
-        for (i = 0; i < 3; i++) {
-          WORD32 inc = (i * SIZE02);
-          (*ixheaacd_spec_to_overlapbuf)(overlap_buf_loc, &scratch[inc],
-                                         q_shift, SIZE01);
-
-          (*ixheaacd_over_lap_add1)(&scratch[SIZE02 + inc], overlap_buf_loc,
-                                    &out_samples[ch_fac * (SIZE09 + inc)],
-                                    short_window, q_shift, SIZE01, ch_fac);
+        if (1024 == ptr_ics_info->frame_length) {
+          (*ixheaacd_over_lap_add1)(&scratch[0], &ptr_overlap_buf[size_07],
+                                    ((WORD32*)out_samples + ch_fac * size_07),
+                                    ptr_short_window, q_shift, size_01, ch_fac);
+        } else {
+          ixheaacd_over_lap_add1_dec(&ptr_spec_coeff[0], &ptr_overlap_buf[size_07],
+                                     ((WORD32*)out_samples + ch_fac * size_07),
+                                     ptr_short_window, q_shift, size_01, ch_fac);
         }
 
-        (*ixheaacd_over_lap_add2)(&scratch[SIZE08], &scratch[SIZE06],
-                                  ptr_overlap_buf, short_window, q_shift,
-                                  SIZE01, 1);
+        for (i = 0; i < 3; i++) {
+          WORD32 inc = (i * size_02);
 
-        (*ixheaacd_overlap_out_copy)(&out_samples[ch_fac * SIZE15],
-                                     ptr_overlap_buf, &ptr_overlap_buf[SIZE01],
-                                     ch_fac);
+          if (1024 == ptr_ics_info->frame_length) {
+            (*ixheaacd_spec_to_overlapbuf)(overlap_buf_loc, &scratch[inc],
+                                           q_shift, size_01);
+
+            (*ixheaacd_over_lap_add1)(&scratch[size_02 + inc], overlap_buf_loc,
+                                      ((WORD32*)out_samples + ch_fac * (size_09 + inc)),
+                                      short_window, q_shift, size_01, ch_fac);
+          } else {
+            (*ixheaacd_spec_to_overlapbuf)(overlap_buf_loc, &ptr_spec_coeff[inc],
+                                           q_shift, size_01);
+
+            ixheaacd_over_lap_add1_dec(&ptr_spec_coeff[size_02 + inc], overlap_buf_loc,
+                                       ((WORD32*)out_samples + ch_fac * (size_09 + inc)),
+                                       short_window, q_shift, size_01, ch_fac);
+          }
+        }
+
+        if (1024 == ptr_ics_info->frame_length) {
+          (*ixheaacd_over_lap_add2)(&scratch[size_08], &scratch[size_06],
+                                    ptr_overlap_buf, short_window, q_shift,
+                                    size_01, 1);
+        } else {
+          ixheaacd_over_lap_add2_dec(&ptr_spec_coeff[size_08], &ptr_spec_coeff[size_06],
+                                     ptr_overlap_buf, short_window, q_shift,
+                                     size_01, 1);
+        }
+
+
+        (*ixheaacd_overlap_out_copy)(((WORD32 *)out_samples + ch_fac * size_15),
+                                     ptr_overlap_buf, &ptr_overlap_buf[size_01],
+                                     ch_fac, size_01);
+
+        ptr_ics_info->qshift_adj = 2;
 
         break;
 
       case ONLY_LONG_SEQUENCE:
       case LONG_STOP_SEQUENCE:
 
-        ixheaacd_long_short_win_seq(scratch, ptr_overlap_buf, out_samples,
-                                    short_window, ptr_short_window,
-                                    ptr_long_window, q_shift, ch_fac);
+        if (1024 == ptr_ics_info->frame_length) {
 
+          ixheaacd_long_short_win_seq(
+              scratch, ptr_overlap_buf, (WORD32*)out_samples, short_window,
+              ptr_short_window, ptr_long_window, q_shift, ch_fac, size_01);
+        } else {
+          ixheaacd_long_short_win_seq(
+              ptr_spec_coeff, ptr_overlap_buf, (WORD32*)out_samples, short_window,
+              ptr_short_window, ptr_long_window, q_shift, ch_fac, size_01);
+        }
+
+        ptr_ics_info->qshift_adj = 2;
         break;
     }
 
     for (i = 0; i < 3; i++) {
-      WORD32 inc = (i * SIZE02);
-      (*ixheaacd_over_lap_add2)(&scratch[SIZE10 + inc], &scratch[SIZE08 + inc],
-                                &ptr_overlap_buf[SIZE01 + inc], short_window,
-                                q_shift, SIZE01, 1);
+      WORD32 inc = (i * size_02);
+
+      if (1024 == ptr_ics_info->frame_length) {
+        (*ixheaacd_over_lap_add2)(&scratch[size_10 + inc], &scratch[size_08 + inc],
+                                  &ptr_overlap_buf[size_01 + inc], short_window,
+                                  q_shift, size_01, 1);
+      } else {
+        ixheaacd_over_lap_add2_dec(&ptr_spec_coeff[size_10 + inc],
+                                   &ptr_spec_coeff[size_08 + inc],
+                                   &ptr_overlap_buf[size_01 + inc],
+                                   short_window, q_shift, size_01, 1);
+      }
     }
 
-    (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[SIZE07], &scratch[SIZE14],
-                                   q_shift, SIZE01);
+    if (1024 == ptr_ics_info->frame_length) {
+      (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[size_07], &scratch[size_14],
+                                     q_shift, size_01);
+    } else {
+      (*ixheaacd_spec_to_overlapbuf)(&ptr_overlap_buf[size_07], &ptr_spec_coeff[size_14],
+                                     q_shift, size_01);
+    }
   }
 
   ptr_aac_dec_overlap_info->window_shape = ptr_ics_info->window_shape;
   ptr_aac_dec_overlap_info->window_sequence = ptr_ics_info->window_sequence;
 }
+
 void ixheaacd_eld_dec_windowing(WORD32 *ptr_spect_coeff, const WORD16 *p_win,
                                 WORD32 framesize, WORD16 q_shift,
                                 WORD32 *p_overlap_buffer, const WORD16 stride,
-                                WORD16 *out_samples)
-
-{
+                                VOID *out_samples_t, WORD slot_element) {
   int i = 0;
   int loop_size;
   WORD32 *ptr_z = ptr_spect_coeff;
@@ -644,6 +813,8 @@
   WORD32 *p_overlap_buffer32 = (WORD32 *)p_overlap_buffer;
   WORD32 delay = framesize >> 2;
 
+  WORD16 *out_samples = (WORD16 *)out_samples_t - slot_element;
+
   ptr_z = ptr_spect_coeff + delay;
   p_win += delay;
   ptr_out = p_overlap_buffer32;
@@ -837,3 +1008,201 @@
     }
   }
 }
+
+void ixheaacd_eld_dec_windowing_32bit(WORD32 *ptr_spect_coeff,
+                                      const WORD16 *p_win, WORD32 framesize,
+                                      WORD16 q_shift, WORD32 *p_overlap_buffer,
+                                      const WORD16 stride, WORD32 *out_samples)
+
+{
+  WORD32 i = 0;
+  WORD32 loop_size;
+  WORD32 *ptr_z = ptr_spect_coeff;
+
+  WORD32 *ptr_out, *p_out2;
+  WORD32 *p_overlap_buffer32 = (WORD32 *)p_overlap_buffer;
+  WORD32 delay = framesize >> 2;
+
+  ptr_z = ptr_spect_coeff + delay;
+  p_win += delay;
+  ptr_out = p_overlap_buffer32;
+
+  q_shift = q_shift + 2;
+
+  if (q_shift >= 0) {
+    for (i = (delay)-1; i >= 0; i--) {
+      WORD32 win_op;
+      WORD16 win_val;
+
+      win_val = *p_win++;
+
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+
+      *out_samples =
+          ixheaacd_add32_sat(ixheaacd_shl32(win_op, q_shift), *ptr_out++);
+
+      out_samples += stride;
+
+      win_val = *p_win++;
+
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+
+      *out_samples =
+          ixheaacd_add32_sat(ixheaacd_shl32(win_op, q_shift), *ptr_out++);
+
+      out_samples += stride;
+      win_val = *p_win++;
+
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+
+      *out_samples =
+          ixheaacd_add32_sat(ixheaacd_shl32(win_op, q_shift), *ptr_out++);
+
+      out_samples += stride;
+
+      win_val = *p_win++;
+
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+
+      *out_samples =
+          ixheaacd_add32_sat(ixheaacd_shl32(win_op, q_shift), *ptr_out++);
+
+      out_samples += stride;
+    }
+
+    p_out2 = p_overlap_buffer32;
+    loop_size = (((framesize * 3) - framesize) >> 2) - 1;
+
+    for (i = loop_size; i >= 0; i--) {
+      WORD32 win_op;
+      WORD16 win_val;
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ =
+          ixheaacd_add32_sat(ixheaacd_shl32(win_op, q_shift), *ptr_out++);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ =
+          ixheaacd_add32_sat(ixheaacd_shl32(win_op, q_shift), *ptr_out++);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ =
+          ixheaacd_add32_sat(ixheaacd_shl32(win_op, q_shift), *ptr_out++);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ =
+          ixheaacd_add32_sat(ixheaacd_shl32(win_op, q_shift), *ptr_out++);
+    }
+
+    loop_size = ((((framesize << 2) - delay) - (framesize * 3)) >> 2) - 1;
+    for (i = loop_size; i >= 0; i--) {
+      WORD32 win_op;
+      WORD16 win_val;
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ = ixheaacd_shl32(win_op, q_shift);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ = ixheaacd_shl32(win_op, q_shift);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ = ixheaacd_shl32(win_op, q_shift);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ = ixheaacd_shl32(win_op, q_shift);
+    }
+  } else {
+    q_shift = -q_shift;
+
+    for (i = (delay)-1; i >= 0; i--) {
+      WORD32 win_op;
+      WORD16 win_val;
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+
+      *out_samples =
+          ixheaacd_add32_sat(ixheaacd_shr32(win_op, q_shift), *ptr_out++);
+
+      out_samples += stride;
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+
+      *out_samples =
+          ixheaacd_add32_sat(ixheaacd_shr32(win_op, q_shift), *ptr_out++);
+
+      out_samples += stride;
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+
+      *out_samples =
+          ixheaacd_add32_sat(ixheaacd_shr32(win_op, q_shift), *ptr_out++);
+
+      out_samples += stride;
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+
+      *out_samples =
+          ixheaacd_add32_sat(ixheaacd_shr32(win_op, q_shift), *ptr_out++);
+
+      out_samples += stride;
+    }
+
+    p_out2 = p_overlap_buffer32;
+    loop_size = (((framesize * 3) - framesize) >> 2) - 1;
+
+    for (i = loop_size; i >= 0; i--) {
+      WORD32 win_op;
+      WORD16 win_val;
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ =
+          ixheaacd_add32_sat(ixheaacd_shr32(win_op, q_shift), *ptr_out++);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ =
+          ixheaacd_add32_sat(ixheaacd_shr32(win_op, q_shift), *ptr_out++);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ =
+          ixheaacd_add32_sat(ixheaacd_shr32(win_op, q_shift), *ptr_out++);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ =
+          ixheaacd_add32_sat(ixheaacd_shr32(win_op, q_shift), *ptr_out++);
+    }
+    loop_size = ((((framesize << 2) - delay) - (framesize * 3)) >> 2) - 1;
+    for (i = loop_size; i >= 0; i--) {
+      WORD32 win_op;
+      WORD16 win_val;
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ = ixheaacd_shr32(win_op, q_shift);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ = ixheaacd_shr32(win_op, q_shift);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ = ixheaacd_shr32(win_op, q_shift);
+
+      win_val = *p_win++;
+      win_op = ixheaacd_mult32x16in32(*ptr_z++, (win_val));
+      *p_out2++ = ixheaacd_shr32(win_op, q_shift);
+    }
+  }
+}
diff --git a/decoder/ixheaacd_lpp_tran.c b/decoder/ixheaacd_lpp_tran.c
index f096825..395206a 100644
--- a/decoder/ixheaacd_lpp_tran.c
+++ b/decoder/ixheaacd_lpp_tran.c
@@ -46,7 +46,9 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
-
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -74,18 +76,11 @@
 
 #define LPC_SCALE_FACTOR 2
 
+#define AUTO_CORR_LEN_1024 38
+#define AUTO_CORR_LEN_960  36
+
 #define SHIFT 5
 
-static PLATFORM_INLINE WORD32 ixheaacd_mult32x16hin32(WORD32 a, WORD32 b) {
-  WORD32 result;
-  WORD64 temp_result;
-
-  temp_result = (WORD64)(a) * (WORD64)(b >> 16);
-  result = (WORD32)(temp_result >> 16);
-
-  return (result);
-}
-
 static PLATFORM_INLINE WORD32 ixheaacd_mac32x16hin32(WORD32 a, WORD32 b,
                                                      WORD32 c) {
   WORD32 result;
@@ -171,17 +166,17 @@
   }
 }
 
-VOID ixheaacd_covariance_matrix_calc_dec(
-    WORD32 *sub_sign_xlow, ixheaacd_lpp_trans_cov_matrix *cov_matrix,
-    WORD32 count) {
+VOID ixheaacd_covariance_matrix_calc_dec_960(
+    WORD32 *sub_sign_xlow, ia_lpp_trans_cov_matrix *cov_matrix,
+    WORD32 count, WORD32 len) {
   WORD32 j, k;
   WORD32 ixheaacd_drc_offset = 2;
-  WORD32 len = 38;
   WORD32 factor;
   WORD32 max_val, q_factor;
   WORD32 temp1, temp2, temp3, temp4;
   WORD32 *temp_buf_ptr = sub_sign_xlow;
 
+  temp3 = 0;
   for (k = count; k > 0; k--) {
     WORD32 t_phi_01 = 0, t_phi_02 = 0, t_phi_11 = 0;
     WORD32 t_phi_12 = 0, t_phi_22 = 0;
@@ -196,7 +191,7 @@
     temp2 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
     sub_sign_xlow += 64;
 
-    for (; (j = j + 3) < ixheaacd_drc_offset + len;) {
+    for (; (j = j + 3) <= ixheaacd_drc_offset + len;) {
       temp3 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
       sub_sign_xlow += 64;
 
@@ -219,19 +214,128 @@
       t_phi_11 += ixheaacd_mult32x16hin32(temp1, temp1);
     }
 
-    temp3 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
-    sub_sign_xlow += 64;
+    if (AUTO_CORR_LEN_1024 == len) {
+      temp3 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
+      sub_sign_xlow += 64;
 
-    t_phi_01 += ixheaacd_mult32x16hin32(temp3, temp2);
-    t_phi_02 += ixheaacd_mult32x16hin32(temp3, temp1);
-    t_phi_11 += ixheaacd_mult32x16hin32(temp2, temp2);
+      t_phi_01 += ixheaacd_mult32x16hin32(temp3, temp2);
+      t_phi_02 += ixheaacd_mult32x16hin32(temp3, temp1);
+      t_phi_11 += ixheaacd_mult32x16hin32(temp2, temp2);
+
+      temp1 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
+      sub_sign_xlow += 64;
+
+      t_phi_01 += ixheaacd_mult32x16hin32(temp1, temp3);
+      t_phi_02 += ixheaacd_mult32x16hin32(temp1, temp2);
+      t_phi_11 += ixheaacd_mult32x16hin32(temp3, temp3);
+    }
+
+    temp2 = ixheaacd_shl32_dir(*temp_buf_ptr, factor);
+    temp4 = ixheaacd_shl32_dir(*(temp_buf_ptr + 64), factor);
+
+    if (AUTO_CORR_LEN_960 == len) {
+      temp3 = ixheaacd_shl32_dir(sub_sign_xlow[-128], factor);
+      temp1 = ixheaacd_shl32_dir(sub_sign_xlow[-64], factor);
+    }
+
+    t_phi_12 = (t_phi_01 - ixheaacd_mult32x16hin32(temp1, temp3) +
+        ixheaacd_mult32x16hin32(temp4, temp2));
+
+    t_phi_22 = (t_phi_11 - ixheaacd_mult32x16hin32(temp3, temp3) +
+        ixheaacd_mult32x16hin32(temp2, temp2));
+
+    max_val = ixheaacd_abs32_nrm(t_phi_01);
+    max_val = max_val | ixheaacd_abs32_nrm(t_phi_02);
+    max_val = max_val | ixheaacd_abs32_nrm(t_phi_12);
+    max_val = max_val | (t_phi_11);
+    max_val = max_val | (t_phi_22);
+
+    q_factor = ixheaacd_pnorm32(max_val);
+
+    cov_matrix->phi_11 = (t_phi_11 << q_factor);
+    cov_matrix->phi_22 = (t_phi_22 << q_factor);
+    cov_matrix->phi_01 = (t_phi_01 << q_factor);
+    cov_matrix->phi_02 = (t_phi_02 << q_factor);
+    cov_matrix->phi_12 = (t_phi_12 << q_factor);
+
+    cov_matrix->d = ixheaacd_sub32_sat(
+        ixheaacd_mult32(cov_matrix->phi_22, cov_matrix->phi_11),
+        ixheaacd_mult32(cov_matrix->phi_12, cov_matrix->phi_12));
+
+    cov_matrix++;
+    temp_buf_ptr++;
+  }
+  return;
+}
+
+VOID ixheaacd_covariance_matrix_calc_dec(
+    WORD32 *sub_sign_xlow, ia_lpp_trans_cov_matrix *cov_matrix,
+    WORD32 count, WORD32 len) {
+  WORD32 j, k;
+  WORD32 ixheaacd_drc_offset = 2;
+  WORD32 factor;
+  WORD32 max_val, q_factor;
+  WORD32 temp1, temp2, temp3, temp4;
+  WORD32 *temp_buf_ptr = sub_sign_xlow;
+
+  for (k = count; k > 0; k--) {
+    WORD32 t_phi_01 = 0, t_phi_02 = 0, t_phi_11 = 0;
+    WORD32 t_phi_12 = 0, t_phi_22 = 0;
+
+    factor = -3;
+    j = ixheaacd_drc_offset;
+    sub_sign_xlow = temp_buf_ptr;
 
     temp1 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
     sub_sign_xlow += 64;
 
-    t_phi_01 += ixheaacd_mult32x16hin32(temp1, temp3);
-    t_phi_02 += ixheaacd_mult32x16hin32(temp1, temp2);
-    t_phi_11 += ixheaacd_mult32x16hin32(temp3, temp3);
+    temp2 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
+    sub_sign_xlow += 64;
+
+    for (; (j = j + 3) <= ixheaacd_drc_offset + len;) {
+      temp3 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
+      sub_sign_xlow += 64;
+
+      t_phi_01 += ixheaacd_mult32x16hin32(temp3, temp2);
+      t_phi_02 += ixheaacd_mult32x16hin32(temp3, temp1);
+      t_phi_11 += ixheaacd_mult32x16hin32(temp2, temp2);
+
+      temp1 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
+      sub_sign_xlow += 64;
+
+      t_phi_01 += ixheaacd_mult32x16hin32(temp1, temp3);
+      t_phi_02 += ixheaacd_mult32x16hin32(temp1, temp2);
+      t_phi_11 += ixheaacd_mult32x16hin32(temp3, temp3);
+
+      temp2 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
+      sub_sign_xlow += 64;
+
+      t_phi_01 += ixheaacd_mult32x16hin32(temp2, temp1);
+      t_phi_02 += ixheaacd_mult32x16hin32(temp2, temp3);
+      t_phi_11 += ixheaacd_mult32x16hin32(temp1, temp1);
+    }
+
+    if (AUTO_CORR_LEN_960 != len) {
+      temp3 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
+      sub_sign_xlow += 64;
+
+      t_phi_01 += ixheaacd_mult32x16hin32(temp3, temp2);
+      t_phi_02 += ixheaacd_mult32x16hin32(temp3, temp1);
+      t_phi_11 += ixheaacd_mult32x16hin32(temp2, temp2);
+
+      temp1 = ixheaacd_shl32_dir(*sub_sign_xlow, factor);
+      sub_sign_xlow += 64;
+
+      t_phi_01 += ixheaacd_mult32x16hin32(temp1, temp3);
+      t_phi_02 += ixheaacd_mult32x16hin32(temp1, temp2);
+      t_phi_11 += ixheaacd_mult32x16hin32(temp3, temp3);
+    }
+    if (AUTO_CORR_LEN_960 == len) {
+      temp3 = ixheaacd_shl32_dir(sub_sign_xlow[-128], factor);
+
+      temp3 = ixheaacd_shl32_dir(sub_sign_xlow[-64], factor);
+
+    }
 
     temp2 = ixheaacd_shl32_dir(*temp_buf_ptr, factor);
     temp4 = ixheaacd_shl32_dir(*(temp_buf_ptr + 64), factor);
@@ -268,13 +372,13 @@
 }
 
 VOID ixheaacd_covariance_matrix_calc_2_dec(
-    ixheaacd_lpp_trans_cov_matrix *cov_matrix,
+    ia_lpp_trans_cov_matrix *cov_matrix,
 
     WORD32 *real_buffer, WORD32 num_bands, WORD16 slots) {
   WORD32 k;
   WORD32 *img_buffer;
   WORD32 *ptr_real = real_buffer;
-  ixheaacd_lpp_trans_cov_matrix *pac_arr = cov_matrix;
+  ia_lpp_trans_cov_matrix *pac_arr = cov_matrix;
 
   for (k = 0; k < num_bands; k++) {
     WORD32 t_phi_11 = 0, t_phi_01 = 0, t_phi_01_i = 0;
@@ -541,18 +645,16 @@
     WORD32 temp = ixheaacd_mult32x16hin32(prev2, coef2);
     pqmf_real_low += 64;
 
-    *pqmf_real_high = ixheaacd_add32_sat(
-        (curr >> LPC_SCALE_FACTOR),
-        (ixheaacd_shl32_sat(ixheaacd_mac32x16hin32(temp, prev1, coef1), 1)));
+    *pqmf_real_high = ixheaacd_add32_sat((curr >> LPC_SCALE_FACTOR),
+                                         ((ixheaacd_mac32x16hin32(temp, prev1, coef1)) << 1));
     pqmf_real_high += 64;
 
     prev2 = *pqmf_real_low;
     temp = ixheaacd_mult32x16hin32(prev1, coef2);
     pqmf_real_low += 64;
 
-    *pqmf_real_high = ixheaacd_add32_sat(
-        (prev2 >> LPC_SCALE_FACTOR),
-        (ixheaacd_shl32_sat(ixheaacd_mac32x16hin32(temp, curr, coef1), 1)));
+    *pqmf_real_high = ixheaacd_add32_sat((prev2 >> LPC_SCALE_FACTOR),
+                                         ((ixheaacd_mac32x16hin32(temp, curr, coef1)) << 1));
     pqmf_real_high += 64;
 
     prev1 = prev2;
@@ -561,7 +663,7 @@
 }
 
 VOID ixheaacd_filter1_lp(ia_sbr_hf_generator_struct *hf_generator,
-                         ixheaacd_lpp_trans_cov_matrix *cov_matrix_seq,
+                         ia_lpp_trans_cov_matrix *cov_matrix_seq,
                          WORD32 *bw_array, WORD16 *degree_alias,
                          WORD32 start_idx, WORD32 stop_idx,
                          WORD32 max_qmf_subband, WORD32 start_patch,
@@ -582,7 +684,7 @@
   memset(bw_index, 0, sizeof(WORD32) * num_patches);
 
   for (low_band = start_patch; low_band < stop_patch; low_band++) {
-    ixheaacd_lpp_trans_cov_matrix *p_cov_matrix = &cov_matrix_seq[low_band];
+    ia_lpp_trans_cov_matrix *p_cov_matrix = &cov_matrix_seq[low_band];
 
     alpha_real[1] = 0;
     alpha_real[0] = 0;
@@ -751,10 +853,11 @@
   ia_patch_param_struct *patch_param =
       hf_generator->pstr_settings->str_patch_param;
   WORD32 patch;
-  ixheaacd_lpp_trans_cov_matrix cov_matrix_seq[MAX_COLS];
+  ia_lpp_trans_cov_matrix cov_matrix_seq[MAX_COLS];
 
   WORD32 actual_stop_band;
   WORD32 num_patches = hf_generator->pstr_settings->num_patches;
+  WORD32 auto_corr_length = hf_generator->pstr_settings->num_columns + 6;
 
   stop_idx = (hf_generator->pstr_settings->num_columns + stop_idx);
 
@@ -798,13 +901,19 @@
     }
   }
   if (norm_max != 30) {
-    (*ixheaacd_covariance_matrix_calc)(sub_sig_x + start_patch,
-                                       &cov_matrix_seq[start_patch],
-                                       (stop_patch - start_patch));
-
+    if (30 == hf_generator->pstr_settings->num_columns) {
+      (*ixheaacd_covariance_matrix_calc_960)(sub_sig_x + start_patch,
+                                             &cov_matrix_seq[start_patch],
+                                             (stop_patch - start_patch),
+                                             auto_corr_length);
+     } else
+      (*ixheaacd_covariance_matrix_calc)(sub_sig_x + start_patch,
+                                         &cov_matrix_seq[start_patch],
+                                         (stop_patch - start_patch),
+                                         auto_corr_length);
   } else {
     memset(&cov_matrix_seq[0], 0,
-           sizeof(ixheaacd_lpp_trans_cov_matrix) * stop_patch);
+           sizeof(ia_lpp_trans_cov_matrix) * stop_patch);
   }
 
   ixheaacd_filter1_lp(hf_generator, cov_matrix_seq, bw_array, degree_alias,
@@ -815,7 +924,7 @@
   stop_patch = hf_generator->pstr_settings->stop_patch;
 
   for (low_band = start_patch; low_band < stop_patch; low_band++) {
-    WORD32 src_start_band, src_end_band, dst_start_band, dst_end_band;
+    WORD32 src_start_band, src_end_band, dst_start_band;
     patch = 0;
 
     while (patch < num_patches) {
@@ -824,7 +933,6 @@
       src_start_band = ptr_loc_patch_param->src_start_band;
       src_end_band = ptr_loc_patch_param->src_end_band;
       dst_start_band = ptr_loc_patch_param->dst_start_band;
-      dst_end_band = ptr_loc_patch_param->dst_end_band;
 
       high_band = (low_band + ptr_loc_patch_param->dst_end_band);
 
@@ -868,13 +976,15 @@
 
   WORD16 bw = 0;
 
-  ixheaacd_lpp_trans_cov_matrix cov_matrix;
-  ixheaacd_lpp_trans_cov_matrix cov_matrix_seq[MAX_COLS];
+  ia_lpp_trans_cov_matrix cov_matrix;
+  ia_lpp_trans_cov_matrix cov_matrix_seq[MAX_COLS];
 
   WORD32 common_scale;
   WORD32 actual_stop_band;
   WORD32 num_patches = hf_generator->pstr_settings->num_patches;
 
+  WORD32  auto_corr_length = hf_generator->pstr_settings->num_columns + 6;
+
   start_idx = (start_idx * factor);
 
   stop_idx = (hf_generator->pstr_settings->num_columns + (stop_idx * factor));
@@ -916,15 +1026,30 @@
   }
   if (audio_object_type != AOT_ER_AAC_ELD &&
       audio_object_type != AOT_ER_AAC_LD) {
-    (*ixheaacd_covariance_matrix_calc_2)(
-        &cov_matrix_seq[start_patch],
-        (sub_sig_x + start_patch + LPC_ORDER * 128), (stop_patch - start_patch),
-        38);
+    if (auto_corr_length == 36) {
+      (*ixheaacd_covariance_matrix_calc_2)(
+          &cov_matrix_seq[start_patch],
+          (sub_sig_x + start_patch + LPC_ORDER * 128),
+          (stop_patch - start_patch), auto_corr_length);
+     } else {
+      (*ixheaacd_covariance_matrix_calc_2)(
+          &cov_matrix_seq[start_patch],
+          (sub_sig_x + start_patch + LPC_ORDER * 128),
+          (stop_patch - start_patch), 38);
+    }
   } else {
-    (*ixheaacd_covariance_matrix_calc_2)(
-        &cov_matrix_seq[start_patch],
-        (sub_sig_x + start_patch + LPC_ORDER * 128), (stop_patch - start_patch),
-        16);
+    if (hf_generator->pstr_settings->num_columns == 15) {
+      (*ixheaacd_covariance_matrix_calc_2)(
+          &cov_matrix_seq[start_patch],
+          (sub_sig_x + start_patch + LPC_ORDER * 128),
+          (stop_patch - start_patch),
+          hf_generator->pstr_settings->num_columns);
+     } else {
+      (*ixheaacd_covariance_matrix_calc_2)(
+          &cov_matrix_seq[start_patch],
+          (sub_sig_x + start_patch + LPC_ORDER * 128),
+          (stop_patch - start_patch), 16);
+    }
   }
 
   for (low_band = start_patch; low_band < stop_patch; low_band++) {
diff --git a/decoder/ixheaacd_lpp_tran.h b/decoder/ixheaacd_lpp_tran.h
index e741412..7c27d72 100644
--- a/decoder/ixheaacd_lpp_tran.h
+++ b/decoder/ixheaacd_lpp_tran.h
@@ -34,7 +34,7 @@
   WORD32 phi_02_im;
   WORD32 phi_12_im;
   WORD32 d;
-} ixheaacd_lpp_trans_cov_matrix;
+} ia_lpp_trans_cov_matrix;
 
 typedef struct {
   WORD16 src_start_band;
@@ -88,19 +88,23 @@
 };
 
 VOID ixheaacd_covariance_matrix_calc_dec(
-    WORD32 *sub_sign_xlow, ixheaacd_lpp_trans_cov_matrix *cov_matrix,
-    WORD32 count);
+    WORD32 *sub_sign_xlow, ia_lpp_trans_cov_matrix *cov_matrix,
+    WORD32 count, WORD32 auto_corr_length);
+
+VOID ixheaacd_covariance_matrix_calc_dec_960(
+    WORD32 *sub_sign_xlow, ia_lpp_trans_cov_matrix *cov_matrix,
+    WORD32 count, WORD32 auto_corr_length);
 
 VOID ixheaacd_covariance_matrix_calc_armv7(
-    WORD32 *sub_sign_xlow, ixheaacd_lpp_trans_cov_matrix *cov_matrix,
+    WORD32 *sub_sign_xlow, ia_lpp_trans_cov_matrix *cov_matrix,
     WORD32 count);
 
 VOID ixheaacd_covariance_matrix_calc_2_dec(
-    ixheaacd_lpp_trans_cov_matrix *cov_matrix, WORD32 *real_buffer,
+    ia_lpp_trans_cov_matrix *cov_matrix, WORD32 *real_buffer,
     WORD32 ixheaacd_num_bands, WORD16 slots);
 
 VOID ixheaacd_covariance_matrix_calc_2_armv7(
-    ixheaacd_lpp_trans_cov_matrix *cov_matrix, WORD32 *real_buffer,
+    ia_lpp_trans_cov_matrix *cov_matrix, WORD32 *real_buffer,
     WORD32 ixheaacd_num_bands, WORD16 slots);
 
 #endif /* IXHEAACD_LPP_TRAN_H */
diff --git a/decoder/ixheaacd_lt_predict.c b/decoder/ixheaacd_lt_predict.c
index 83fc9cc..0838741 100644
--- a/decoder/ixheaacd_lt_predict.c
+++ b/decoder/ixheaacd_lt_predict.c
@@ -29,15 +29,17 @@
 #include "ixheaacd_basic_ops40.h"
 
 #include "ixheaacd_defines.h"
+#include "ixheaacd_cnst.h"
 #include "ixheaacd_aac_rom.h"
+#include "ixheaacd_lt_predict.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_audioobjtypes.h"
 
 #include "ixheaacd_bitbuffer.h"
 #include "ixheaacd_pulsedata.h"
 #include "ixheaacd_pns.h"
-#include "ixheaacd_lt_predict.h"
 #include "ixheaacd_channelinfo.h"
-#include "ixheaacd_cnst.h"
 #include "ixheaacd_tns.h"
 #include "ixheaacd_aac_imdct.h"
 
@@ -218,13 +220,12 @@
         }
 
       } else {
-        WORD32 *win1, *win2, *win3;
+        WORD32 *win1, *win2;
         WORD32 *ptr_in1, *ptr_in2;
         win1 = (WORD32 *)window_long_prev;
         win2 = (WORD32 *)window_long;
         ptr_in1 = &in_data[0];
         ptr_in2 = &in_data[nlong];
-        win3 = win2 + nlong - 1;
 
         for (i = nlong - 1; i >= 0; i--) {
           WORD32 temp1 = ixheaacd_mult32_shl(*ptr_in1, *win1++);
@@ -396,15 +397,18 @@
   }
 }
 
-VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, WORD16 *time,
+VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, VOID *time_t,
                               WORD32 *overlap, WORD32 frame_len,
                               WORD32 object_type, WORD32 stride,
-                              WORD16 window_sequence, WORD16 *p_window_next) {
+                              WORD16 window_sequence, WORD16 *p_window_next,
+                              WORD slot_element) {
   WORD32 i;
+
   if (object_type == AOT_ER_AAC_LD) {
     WORD16 *ptr_ltp_state0 = &lt_pred_stat[0];
     WORD16 *ptr_ltp_state_fl = &lt_pred_stat[frame_len + 0];
     WORD16 *ptr_ltp_state_2fl = &lt_pred_stat[(frame_len * 2) + 0];
+    WORD16 *time = (WORD16 *)time_t - slot_element;
     WORD16 *ptr_time_in = &time[0 * stride];
 
     for (i = 0; i < frame_len; i++) {
@@ -417,11 +421,15 @@
   } else {
     WORD16 *ptr_ltp_state0 = &lt_pred_stat[0];
     WORD16 *ptr_ltp_state_fl = &lt_pred_stat[frame_len + 0];
-    WORD16 *ptr_time_in = &time[0 * stride];
+    WORD32 *time = (WORD32 *)time_t;
+    WORD32 *ptr_time_in = &time[0 * stride];
+
+    time = (WORD32 *)time_t;
 
     for (i = 0; i < frame_len; i++) {
       *ptr_ltp_state0++ = *ptr_ltp_state_fl;
-      *ptr_ltp_state_fl++ = *ptr_time_in;
+      *ptr_ltp_state_fl++ =
+          ixheaacd_round16(ixheaacd_shl32_sat(*ptr_time_in, 2));
       ptr_time_in += stride;
     }
   }
diff --git a/decoder/ixheaacd_lt_predict.h b/decoder/ixheaacd_lt_predict.h
index 8e4fbfc..4c60cfb 100644
--- a/decoder/ixheaacd_lt_predict.h
+++ b/decoder/ixheaacd_lt_predict.h
@@ -17,9 +17,8 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
  */
-
-#ifndef _LT_PREDICT_
-#define _LT_PREDICT_
+#ifndef IXHEAACD_LT_PREDICT_H
+#define IXHEAACD_LT_PREDICT_H
 
 #define MAX_SFB 51
 #define MAX_LTP_SFB 40
@@ -46,10 +45,10 @@
 
 VOID ixheaacd_init_ltp_object(ltp_info *ltp);
 
-VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, WORD16 *time,
-                              WORD32 *overlap, WORD32 frame_len,
-                              WORD32 object_type, WORD32 stride,
-                              WORD16 window_sequence, WORD16 *p_window_next);
+VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, VOID *time, WORD32 *overlap,
+                              WORD32 frame_len, WORD32 object_type,
+                              WORD32 stride, WORD16 window_sequence,
+                              WORD16 *p_window_next, WORD slot_element);
 
 VOID ixheaacd_filter_bank_ltp(ia_aac_dec_tables_struct *aac_tables_ptr,
                               WORD16 window_sequence, WORD16 win_shape,
@@ -57,4 +56,4 @@
                               WORD32 *out_mdct, UWORD32 object_type,
                               UWORD32 frame_len);
 
-#endif
+#endif /* IXHEAACD_LT_PREDICT_H */
diff --git a/decoder/ixheaacd_main.h b/decoder/ixheaacd_main.h
index fe6355b..78a0602 100644
--- a/decoder/ixheaacd_main.h
+++ b/decoder/ixheaacd_main.h
@@ -61,11 +61,13 @@
   FLOAT32 fd_synth_buf[3 * LEN_FRAME + 1 + ORDER];
   FLOAT32 *fd_synth;
   WORD32 bpf_active_prev;
-
+  WORD32 last_tcx_pitch;
+  FLOAT32 synth_prev_ec[ORDER];
 } ia_usac_lpd_decoder, *ia_usac_lpd_decoder_handle;
 
 typedef struct ia_usac_data_main_struct {
   FLOAT32 time_sample_vector[MAX_NUM_CHANNELS][4096];
+  FLOAT32 time_sample_vector_prev[MAX_NUM_CHANNELS][4096];
   WORD32 input_data_ptr[MAX_NUM_CHANNELS][4096];
   WORD32 overlap_data_ptr[MAX_NUM_CHANNELS][4096];
   WORD32 output_data_ptr[MAX_NUM_CHANNELS][4096];
@@ -112,7 +114,7 @@
   WORD32 *coef_fix[MAX_NUM_CHANNELS];
   FLOAT32 *coef[MAX_NUM_CHANNELS];
   UWORD8 *ms_used[MAX_NUM_CHANNELS];
-  WORD32 *coef_save[chans];
+  WORD32 *coef_save[MAX_NUM_CHANNELS];
 
   WORD16 *factors[MAX_NUM_CHANNELS];
   UWORD8 *group_dis[MAX_NUM_CHANNELS];
@@ -170,7 +172,7 @@
 
   WORD32 arr_coef_fix[MAX_NUM_CHANNELS][(LN2 + LN2 / 8)];
   FLOAT32 arr_coef[MAX_NUM_CHANNELS][(LN2 + LN2 / 8)];
-  WORD32 arr_coef_save[chans][(LN2 + LN2 / 8)];
+  WORD32 arr_coef_save[MAX_NUM_CHANNELS][(LN2 + LN2 / 8)];
   WORD16 arr_factors[MAX_NUM_CHANNELS][MAXBANDS];
   UWORD8 arr_group_dis[MAX_NUM_CHANNELS][NSHORT];
   WORD32 arr_tw_ratio[MAX_NUM_CHANNELS][NUM_TW_NODES];
@@ -178,6 +180,48 @@
   ia_usac_lpd_decoder arr_str_tddec[MAX_NUM_CHANNELS];
   ia_tns_frame_info_struct arr_str_tns[MAX_NUM_CHANNELS];
 
+  WORD32 enh_sbr;
+  WORD32 esbr_hq;
+  WORD32 enh_sbr_ps;
+  WORD32 drc_config_changed;
+  WORD32 core_mode;
+  WORD32 frame_ok;
+  WORD32 sbr_parse_err_flag;
+  WORD32 last_frame_ok;
+  WORD32 ec_flag;
+  WORD32 first_frame;
+  WORD32 sbr_parse_complete;
+  UWORD8 max_sfb[2];
+  WORD32 num_ch_out;
+  WORD16 spec_scale[MAX_NUM_CHANNELS][128];
+  ia_ec_state_str str_error_concealment[MAX_NUM_CHANNELS];
+  ia_td_frame_data_struct *pstr_td_frame;
+  WORD32 sampling_rate;
+  WORD32 td_frame_prev_ec[MAX_NUM_CHANNELS];
+  FLOAT32 lsp_coeff[5][ORDER];
+  FLOAT32 lsf_adaptive_mean_cand[ORDER];
+  FLOAT32 lsf_adaptive_mean[ORDER];
+  FLOAT32 lpc4_lsf[ORDER];
+  WORD32 bpf_control_info;
+  WORD32 first_lpd_flag;
+  WORD32 short_fac_flag;
+  WORD32 core_mode_last;
+  FLOAT32 stability_factor_old;
+  WORD32 num_lost_lpd_frames[MAX_NUM_CHANNELS];
+  WORD32 pitch_lag_old;
+  WORD32 pitch_lag_frac_old;
+  WORD32 pitch_lag;
+  WORD32 pitch_lag_frac;
+  WORD16 seed_ace;
+  ia_ec_state_str *pstr_ec_state;
+  FLOAT32 past_pitch_gain;
+  FLOAT32 past_gain_code;
+  FLOAT32 past_gain_tcx[MAX_NUM_CHANNELS];
+  WORD32 tcx_spec_coeffs[MAX_NUM_CHANNELS][1280];
+  FLOAT32 lspold_ec[ORDER];
+  FLOAT32 lp_flt_coff_a_ec[ORDER + 1];
+  ia_td_frame_data_struct td_frame_data_prev[MAX_NUM_CHANNELS];
+  WORD32 last_shiftp;
 } ia_usac_data_struct;
 
 IA_ERRORCODE ixheaacd_tns_apply(ia_usac_data_struct *usac_data, WORD32 *spec,
@@ -205,21 +249,19 @@
 
 WORD32 ixheaacd_fd_frm_dec(ia_usac_data_struct *usac_data, WORD32 i_ch);
 
-WORD32 ixheaacd_acelp_mdct(WORD32 *ptr_in, WORD32 *ptr_out, WORD32 *preshift,
-                           WORD32 length, WORD32 *ptr_scratch);
+VOID ixheaacd_acelp_mdct(WORD32 *ptr_in, WORD32 *ptr_out, WORD32 *preshift, WORD32 length,
+                         WORD32 *ptr_scratch);
 
-WORD32 ixheaacd_acelp_mdct_main(ia_usac_data_struct *usac_data, WORD32 *x,
-                                WORD32 *y, WORD32 l, WORD32 m,
-                                WORD32 *preshift);
+VOID ixheaacd_acelp_mdct_main(ia_usac_data_struct *usac_data, WORD32 *x, WORD32 *y, WORD32 l,
+                              WORD32 m, WORD32 *preshift);
 
-WORD32 ixheaacd_fr_alias_cnx_fix(WORD32 *x_in, WORD32 len_subfr, WORD32 lfac,
-                                 WORD32 *iaq, WORD32 *izir, WORD32 *ifacdec,
-                                 WORD8 *qshift1, WORD8 qshift2, WORD8 qshift3,
-                                 WORD32 *preshift, WORD32 *ptr_scratch);
+VOID ixheaacd_fr_alias_cnx_fix(WORD32 *x_in, WORD32 len_subfr, WORD32 lfac, WORD32 *iaq,
+                               WORD32 *izir, WORD32 *ifacdec, WORD8 *qshift1, WORD8 qshift2,
+                               WORD8 qshift3, WORD32 *preshift, WORD32 *ptr_scratch);
 
-WORD32 ixheaacd_fwd_alias_cancel_tool(
-    ia_usac_data_struct *usac_data, ia_td_frame_data_struct *pstr_td_frame_data,
-    WORD32 fac_length, FLOAT32 *iaq, WORD32 gain);
+VOID ixheaacd_fwd_alias_cancel_tool(ia_usac_data_struct *usac_data,
+                                    ia_td_frame_data_struct *pstr_td_frame_data,
+                                    WORD32 fac_length, FLOAT32 *iaq, WORD32 gain);
 
 WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, WORD32 is_short,
                             FLOAT32 out_buffer[],
@@ -229,4 +271,6 @@
                                    ia_usac_lpd_decoder_handle st,
                                    WORD32 *ptr_ola_buff, WORD32 last_was_short,
                                    WORD32 tw_mdct);
+
+FLOAT32 ixheaacd_randomsign(UWORD32 *seed);
 #endif
diff --git a/decoder/ixheaacd_memory_standards.h b/decoder/ixheaacd_memory_standards.h
index 2494751..bcd8726 100644
--- a/decoder/ixheaacd_memory_standards.h
+++ b/decoder/ixheaacd_memory_standards.h
@@ -33,6 +33,13 @@
   UWORD32 ui_placed[2];    /* the o_red location for placement  */
 } ia_mem_info_struct;
 
+typedef struct {
+  WORD8 *p_lib_name;
+  WORD8 *p_version_num;
+} ia_lib_info_struct;
+
+VOID ixheaacd_get_lib_id_strings(pVOID pv_output);
+
 /*****************************************************************************/
 /* Constant hash defines                                                     */
 /*****************************************************************************/
diff --git a/decoder/ixheaacd_mps_aac_struct.h b/decoder/ixheaacd_mps_aac_struct.h
new file mode 100644
index 0000000..aeed275
--- /dev/null
+++ b/decoder/ixheaacd_mps_aac_struct.h
@@ -0,0 +1,94 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_AAC_STRUCT_H
+#define IXHEAACD_MPS_AAC_STRUCT_H
+
+#include "ixheaacd_defines.h"
+
+#define PNS_BAND_FLAGS_SIZE 16
+#define MAX_WINDOWS 8
+#define MAX_SFB_SHORT 16
+#define MAXIMUM_LINES 4
+
+typedef struct {
+  WORD16 a_scale_factor[MAX_WINDOWS * MAX_SFB_SHORT];
+  WORD8 a_code_book[MAX_WINDOWS * MAX_SFB_SHORT];
+} ia_mps_dec_residual_dynamic_data_struct;
+
+typedef struct {
+  WORD16 window_sequence;
+  WORD16 max_sf_bands;
+  WORD16 total_sf_bands;
+  WORD16 sampling_rate_index;
+  WORD16 window_groups;
+  WORD8 window_group_length[8];
+  WORD16 frame_length;
+
+} ia_mps_dec_residual_ics_info_struct;
+
+typedef struct {
+  WORD16 start_band;
+  WORD16 stop_band;
+  WORD8 direction;
+  WORD8 resolution;
+  WORD8 order;
+  WORD8 coeff[MAX_ORDER];
+} ia_mps_dec_residual_filter_struct;
+
+typedef struct {
+  FLAG tns_data_present;
+  WORD8 number_of_filters[MAX_WINDOWS];
+  ia_mps_dec_residual_filter_struct filter[MAX_WINDOWS][MAX_FILTERS];
+} ia_mps_dec_residual_tns_data;
+
+typedef struct {
+  FLAG pulse_data_present;
+  WORD16 number_pulse;
+  WORD16 pulse_start_band;
+  WORD8 pulse_offset[MAXIMUM_LINES];
+  WORD8 pulse_amp[MAXIMUM_LINES];
+} ia_mps_dec_residual_pulse_data_struct;
+
+typedef struct {
+  UWORD8 pns_used[PNS_BAND_FLAGS_SIZE * 8];
+  WORD16 current_energy;
+  UWORD16 pns_active;
+} ia_mps_dec_residual_pns_data_struct;
+
+typedef struct {
+  WORD16 *p_scale_factor;
+  WORD8 *p_code_book;
+  WORD32 *p_spectral_coefficient;
+  ia_mps_dec_residual_ics_info_struct ics_info;
+  ia_mps_dec_residual_tns_data tns_data;
+  ia_mps_dec_residual_pulse_data_struct pulse_data;
+  ia_mps_dec_residual_pns_data_struct pns_data;
+  WORD16 common_window;
+  WORD16 global_gain;
+  WORD32 *p_tns_scratch;
+} ia_mps_dec_residual_channel_info_struct;
+
+typedef struct {
+  WORD16 sfb_long_idx[52];
+  WORD16 sfb_short_idx[16];
+
+} ia_mps_dec_residual_sfband_info_struct;
+
+#endif /* IXHEAACD_MPS_AAC_STRUCT_H */
diff --git a/decoder/ixheaacd_mps_apply_common.c b/decoder/ixheaacd_mps_apply_common.c
new file mode 100644
index 0000000..130e7c7
--- /dev/null
+++ b/decoder/ixheaacd_mps_apply_common.c
@@ -0,0 +1,112 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+
+VOID ixheaacd_dec_interp_umx(WORD32 m[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], WORD32 *ptr_r,
+                             WORD32 *ptr_m_prev, ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 ts, ps = 0, pb;
+  WORD32 *r_out;
+  const WORD32 *reciprocal_tab = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->reciprocal;
+
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+
+  WORD32 prev_slot = -1;
+  WORD32 *prm_slot = pstr_mps_state->aux_struct->param_slot;
+  WORD32 curr_slot = *prm_slot;
+
+  WORD32 temp = reciprocal_tab[curr_slot];
+  r_out = ptr_r;
+
+  for (ts = prev_slot + 1; ts <= curr_slot; ts++) {
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      WORD32 alpha = temp * (ts + 1);
+      WORD32 one_minus_alpha;
+      WORD64 result;
+
+      one_minus_alpha = (ONE_IN_Q28 - alpha);
+
+      result = ((WORD64)(*ptr_m_prev) * (WORD64)one_minus_alpha);
+      result += ((WORD64)(m[ps][pb]) * (WORD64)alpha);
+
+      *r_out++ = (WORD32)((WORD64)result >> 28);
+      ptr_m_prev++;
+    }
+    ptr_m_prev -= num_parameter_bands;
+  }
+
+  for (ps = 1; ps < num_parameter_sets; ps++) {
+    WORD32 prev_slot = prm_slot[ps - 1];
+    WORD32 curr_slot = prm_slot[ps];
+
+    temp = reciprocal_tab[curr_slot - prev_slot - 1];
+
+    for (ts = (prev_slot) + 1; ts <= (curr_slot); ts++) {
+      for (pb = 0; pb < num_parameter_bands; pb++) {
+        WORD32 alpha = (ts - prev_slot) * temp;
+        WORD64 result;
+        WORD32 one_minus_alpha;
+        one_minus_alpha = (ONE_IN_Q28 - alpha);
+
+        result = ((WORD64)(m[ps - 1][pb]) * (WORD64)one_minus_alpha);
+        result += ((WORD64)(m[ps][pb]) * (WORD64)alpha);
+
+        *r_out++ = (WORD32)((WORD64)result >> 28);
+      }
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_apply_abs_kernels(WORD32 *ptr_r_in, WORD32 *ptr_r_out, SIZE_T *ptr_params) {
+  WORD32 ts, qb;
+  SIZE_T *idx_ptr = (SIZE_T *)ptr_params[0];
+  WORD32 time_slots = (WORD32)ptr_params[1];
+  WORD32 num_parameter_bands = (WORD32)ptr_params[2];
+  WORD32 hybrid_bands = (WORD32)ptr_params[3];
+
+  for (ts = 0; ts < time_slots; ts++) {
+    SIZE_T *idx = idx_ptr;
+    for (qb = 0; qb < hybrid_bands; qb++) {
+      WORD32 idx_v = (WORD32)(*idx);
+      *ptr_r_out++ = *(ptr_r_in + idx_v);
+      idx++;
+    }
+    ptr_r_in += num_parameter_bands;
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_apply_common.h b/decoder/ixheaacd_mps_apply_common.h
new file mode 100644
index 0000000..c8d7d57
--- /dev/null
+++ b/decoder/ixheaacd_mps_apply_common.h
@@ -0,0 +1,28 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_APPLY_COMMON_H
+#define IXHEAACD_MPS_APPLY_COMMON_H
+
+VOID ixheaacd_dec_interp_umx(WORD32 m[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], WORD32 *ptr_r,
+                             WORD32 *ptr_m_prev, ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_apply_abs_kernels(WORD32 *ptr_r_in, WORD32 *ptr_r_out, SIZE_T *ptr_params);
+
+#endif /* IXHEAACD_MPS_APPLY_COMMON_H */
diff --git a/decoder/ixheaacd_mps_apply_m1.c b/decoder/ixheaacd_mps_apply_m1.c
new file mode 100644
index 0000000..e4d5e0d
--- /dev/null
+++ b/decoder/ixheaacd_mps_apply_m1.c
@@ -0,0 +1,258 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_apply_common.h"
+#include "ixheaacd_mps_basic_op.h"
+
+VOID ixheaacd_mps_apply_m1(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+  ia_mps_dec_m1_param_struct *m1_param = p_array_struct->m1_param;
+  WORD32 ts, qs, row, col;
+  WORD32 temp_1, temp_2;
+  WORD32 *rout_real_ptr, *rout_imag_ptr, *rout_kernel_real_ptr, *rout_kernel_imag_ptr;
+  WORD32 *v_real, *v_imag, *x_real, *x_imag;
+  WORD32 *p_buffer_real, *p_buffer_imag, *p_v_real, *p_v_imag;
+
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  WORD32 *m1_param_real_prev = curr_state->mps_persistent_mem.m1_param_real_prev;
+  WORD32 *m1_param_imag_prev = curr_state->mps_persistent_mem.m1_param_imag_prev;
+  WORD32 imag_present = curr_state->m1_param_imag_present;
+  WORD32 v_channels = curr_state->num_v_channels;
+  WORD32 x_channels = curr_state->num_x_channels;
+  WORD32 hybrid_bands = curr_state->hybrid_bands;
+  WORD32 num_parameter_bands = curr_state->num_parameter_bands;
+  WORD32 *index = curr_state->index;
+
+  WORD32 *p_x_re, *p_x_im;
+
+  WORD32 hyb_bands = hybrid_bands;
+  WORD32 time_slots = curr_state->time_slots;
+  SIZE_T params[4];
+
+  params[0] = (SIZE_T)(&curr_state->kernels[0]);
+  params[1] = time_slots;
+  params[2] = num_parameter_bands;
+  params[3] = hybrid_bands;
+
+  rout_real_ptr = pstr_mps_state->mps_scratch_mem_v;
+  rout_kernel_real_ptr = rout_real_ptr + TSXHB;
+  rout_imag_ptr = rout_kernel_real_ptr + TSXHB;
+  rout_kernel_imag_ptr = rout_imag_ptr + TSXHB;
+
+  p_buffer_real = p_array_struct->buf_real;
+  p_buffer_imag = p_array_struct->buf_imag;
+
+  for (row = 0; row < v_channels; row++) {
+    v_real = p_buffer_real;
+    v_imag = p_buffer_imag;
+
+    for (ts = 0; ts < time_slots; ts++) {
+      memset(v_real, 0, hybrid_bands * sizeof(v_real[0]));
+      memset(v_imag, 0, hybrid_bands * sizeof(v_imag[0]));
+
+      v_real += MAX_HYBRID_BANDS;
+      v_imag += MAX_HYBRID_BANDS;
+    }
+    p_buffer_real += TSXHB;
+    p_buffer_imag += TSXHB;
+  }
+
+  p_buffer_real = p_array_struct->buf_real;
+  p_buffer_imag = p_array_struct->buf_imag;
+
+  if (!imag_present) {
+    for (row = 0; row < v_channels; row++) {
+      WORD32 *p_x_real = p_array_struct->x_real;
+      WORD32 *p_x_imag = p_array_struct->x_imag;
+
+      for (col = 0; col < x_channels; col++) {
+        if (pstr_mps_state->m1_param_present[row][col]) {
+          WORD32 idx = index[col];
+
+          ixheaacd_dec_interp_umx(m1_param->m1_param_real[row][col], rout_real_ptr,
+                                  m1_param_real_prev, pstr_mps_state);
+          ixheaacd_apply_abs_kernels(rout_real_ptr, rout_kernel_real_ptr, params);
+
+          p_v_real = p_buffer_real;
+          p_v_imag = p_buffer_imag;
+
+          p_x_re = p_x_real;
+          p_x_im = p_x_imag;
+
+          for (ts = 0; ts < time_slots; ts++) {
+            v_real = p_v_real;
+            v_imag = p_v_imag;
+
+            x_real = p_x_re;
+            x_imag = p_x_im;
+
+            for (qs = 0; qs < idx; qs++) {
+              temp_1 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_real_ptr);
+              *v_real = *v_real + temp_1;
+              v_real++;
+
+              temp_1 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_real_ptr);
+              rout_kernel_real_ptr++;
+              *v_imag = *v_imag + temp_1;
+              v_imag++;
+
+              x_real++;
+              x_imag++;
+            }
+            rout_kernel_real_ptr += hyb_bands - idx;
+
+            p_v_real += MAX_HYBRID_BANDS;
+            p_v_imag += MAX_HYBRID_BANDS;
+
+            p_x_re += MAX_HYBRID_BANDS;
+            p_x_im += MAX_HYBRID_BANDS;
+          }
+
+          m1_param_real_prev += num_parameter_bands;
+
+          p_x_real += TSXHB;
+          p_x_imag += TSXHB;
+        } else {
+          m1_param_real_prev += num_parameter_bands;
+
+          p_x_real += TSXHB;
+          p_x_imag += TSXHB;
+        }
+      }
+      p_buffer_real += TSXHB;
+      p_buffer_imag += TSXHB;
+    }
+  } else {
+    for (row = 0; row < v_channels; row++) {
+      WORD32 *p_x_real = p_array_struct->x_real;
+      WORD32 *p_x_imag = p_array_struct->x_imag;
+
+      for (col = 0; col < x_channels; col++) {
+        if (pstr_mps_state->m1_param_present[row][col]) {
+          WORD32 idx = index[col];
+
+          ixheaacd_dec_interp_umx(m1_param->m1_param_real[row][col], rout_real_ptr,
+                                  m1_param_real_prev, pstr_mps_state);
+          ixheaacd_dec_interp_umx(m1_param->m1_param_imag[row][col], rout_imag_ptr,
+                                  m1_param_imag_prev, pstr_mps_state);
+          ixheaacd_apply_abs_kernels(rout_real_ptr, rout_kernel_real_ptr, params);
+          ixheaacd_apply_abs_kernels(rout_imag_ptr, rout_kernel_imag_ptr, params);
+
+          p_v_real = p_buffer_real;
+          p_v_imag = p_buffer_imag;
+
+          p_x_re = p_x_real;
+          p_x_im = p_x_imag;
+
+          for (ts = 0; ts < time_slots; ts++) {
+            v_real = p_v_real;
+            v_imag = p_v_imag;
+
+            x_real = p_x_re;
+            x_imag = p_x_im;
+            for (qs = 0; qs < 2; qs++) {
+              temp_1 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_real_ptr);
+              temp_2 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_imag_ptr);
+              temp_1 += temp_2;
+
+              *v_real = *v_real + temp_1;
+              v_real++;
+
+              temp_1 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_real_ptr);
+              rout_kernel_real_ptr++;
+              temp_2 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_imag_ptr);
+              rout_kernel_imag_ptr++;
+              temp_1 -= temp_2;
+
+              *v_imag = *v_imag + temp_1;
+              v_imag++;
+
+              x_real++;
+              x_imag++;
+            }
+            for (; qs < idx; qs++) {
+              temp_1 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_real_ptr);
+              temp_2 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_imag_ptr);
+              temp_1 -= temp_2;
+
+              *v_real = *v_real + temp_1;
+              v_real++;
+
+              temp_1 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_real_ptr);
+              rout_kernel_real_ptr++;
+              temp_2 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_imag_ptr);
+              rout_kernel_imag_ptr++;
+              temp_1 += temp_2;
+
+              *v_imag = *v_imag + temp_1;
+              v_imag++;
+
+              x_real++;
+              x_imag++;
+            }
+            rout_kernel_real_ptr += hyb_bands - idx;
+            rout_kernel_imag_ptr += hyb_bands - idx;
+
+            p_v_real += MAX_HYBRID_BANDS;
+            p_v_imag += MAX_HYBRID_BANDS;
+
+            p_x_re += MAX_HYBRID_BANDS;
+            p_x_im += MAX_HYBRID_BANDS;
+          }
+
+          m1_param_real_prev += num_parameter_bands;
+          m1_param_imag_prev += num_parameter_bands;
+
+          p_x_real += TSXHB;
+          p_x_imag += TSXHB;
+        } else {
+          m1_param_real_prev += num_parameter_bands;
+          m1_param_imag_prev += num_parameter_bands;
+
+          p_x_real += TSXHB;
+          p_x_imag += TSXHB;
+        }
+      }
+      p_buffer_real += TSXHB;
+      p_buffer_imag += TSXHB;
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_apply_m2.c b/decoder/ixheaacd_mps_apply_m2.c
new file mode 100644
index 0000000..6c989c3
--- /dev/null
+++ b/decoder/ixheaacd_mps_apply_m2.c
@@ -0,0 +1,497 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_apply_common.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_get_index.h"
+
+VOID ixheaacd_apply_m2(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 ts, qs, row, col;
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  ia_mps_persistent_mem *persistent_mem = &curr_state->mps_persistent_mem;
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+  ia_mps_dec_m2_param_struct *p_m2_param = pstr_mps_state->aux_struct->m2_param;
+
+  WORD32 num_direct_signals = curr_state->num_direct_signals;
+  WORD32 temp_1, loop_counter, col_counter = num_direct_signals + curr_state->num_decor_signals;
+
+  WORD32 *rout_ptr, *rout_kernel_ptr;
+
+  WORD32 *hyb_output_real_dry, *hyb_output_imag_dry, *hyb_output_real_wet, *hyb_output_imag_wet;
+
+  WORD32 *p_hyb_out_dry_real, *p_hyb_out_dry_imag, *p_hyb_out_dry_re, *p_hyb_out_dry_im;
+
+  WORD32 *w_wet_real, *w_wet_imag, *w_dry_real, *w_dry_imag;
+
+  WORD32 *m2_decor_real_prev = persistent_mem->m2_decor_real_prev;
+  WORD32 *m2_decor_imag_prev = persistent_mem->m2_decor_imag_prev;
+
+  WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
+  WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
+
+  WORD32 *m2_resid_real_prev = persistent_mem->m2_resid_real_prev;
+  WORD32 *m2_resid_imag_prev = persistent_mem->m2_resid_imag_prev;
+
+  WORD32 idx = 0;
+  WORD32 w_wet_offset = num_direct_signals * TSXHB;
+
+  WORD32 num_output_channels = curr_state->num_output_channels;
+  WORD32 time_slots = curr_state->time_slots;
+  WORD32 hybrid_bands = curr_state->hybrid_bands;
+  WORD32 m2_param_imag_present = curr_state->m2_param_imag_present;
+  WORD32 num_parameter_bands = curr_state->num_parameter_bands;
+  WORD32 up_mix_type = curr_state->up_mix_type;
+  WORD32 residual_coding = curr_state->residual_coding;
+  WORD32 *index_ptr = curr_state->index;
+
+  SIZE_T params[4];
+
+  params[0] = (SIZE_T)(&curr_state->kernels[0]);
+  params[1] = time_slots;
+  params[2] = num_parameter_bands;
+  params[3] = hybrid_bands;
+
+  rout_ptr = pstr_mps_state->mps_scratch_mem_v;
+  rout_kernel_ptr = rout_ptr + TSXHB;
+
+  p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
+  p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
+
+  for (row = 0; row < num_output_channels; row++) {
+    hyb_output_real_dry = p_hyb_out_dry_real;
+    hyb_output_imag_dry = p_hyb_out_dry_imag;
+
+    for (ts = 0; ts < time_slots; ts++) {
+      memset(hyb_output_real_dry, 0, (hybrid_bands) * sizeof(hyb_output_real_dry[0]));
+      memset(hyb_output_imag_dry, 0, (hybrid_bands) * sizeof(hyb_output_imag_dry[0]));
+
+      hyb_output_real_dry += MAX_HYBRID_BANDS;
+      hyb_output_imag_dry += MAX_HYBRID_BANDS;
+    }
+
+    p_hyb_out_dry_real += TSXHB;
+    p_hyb_out_dry_imag += TSXHB;
+  }
+
+  if (residual_coding)
+    loop_counter = col_counter;
+  else
+    loop_counter = num_direct_signals;
+
+  idx = 0;
+
+  p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
+  p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
+
+  for (row = 0; row < num_output_channels; row++) {
+    p_buffer_real = p_array_struct->buf_real;
+    p_buffer_imag = p_array_struct->buf_imag;
+
+    for (col = 0; col < num_direct_signals; col++) {
+      p_buffer_re = p_buffer_real;
+      p_buffer_im = p_buffer_imag;
+
+      if (curr_state->m2_param_present[row][col] & 2) {
+        ixheaacd_dec_interp_umx(p_m2_param->m2_resid_real[idx++], rout_ptr, m2_resid_real_prev,
+                                pstr_mps_state);
+        ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
+
+        p_hyb_out_dry_re = p_hyb_out_dry_real;
+        p_hyb_out_dry_im = p_hyb_out_dry_imag;
+
+        for (ts = 0; ts < time_slots; ts++) {
+          hyb_output_real_dry = p_hyb_out_dry_re;
+          hyb_output_imag_dry = p_hyb_out_dry_im;
+
+          w_dry_real = p_buffer_re;
+          w_dry_imag = p_buffer_im;
+
+          for (qs = 0; qs < hybrid_bands; qs++) {
+            temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
+            w_dry_real++;
+            *hyb_output_real_dry = *hyb_output_real_dry + temp_1;
+            hyb_output_real_dry++;
+
+            temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
+            w_dry_imag++;
+            rout_kernel_ptr++;
+            *hyb_output_imag_dry = *hyb_output_imag_dry + temp_1;
+            hyb_output_imag_dry++;
+          }
+          p_buffer_re += MAX_HYBRID_BANDS;
+          p_buffer_im += MAX_HYBRID_BANDS;
+
+          p_hyb_out_dry_re += MAX_HYBRID_BANDS;
+          p_hyb_out_dry_im += MAX_HYBRID_BANDS;
+        }
+        m2_resid_real_prev += num_parameter_bands;
+      }
+      p_buffer_real += TSXHB;
+      p_buffer_imag += TSXHB;
+    }
+
+    for (; col < loop_counter; col++) {
+      WORD32 index;
+      WORD32 res = ixheaacd_get_res_idx(pstr_mps_state, col);
+      index = index_ptr[res];
+
+      if (curr_state->m2_param_present[row][col] & 2) {
+        WORD32 *p_dry_real = p_array_struct->w_dry_real + res * TSXHB;
+        WORD32 *p_dry_imag = p_array_struct->w_dry_imag + res * TSXHB;
+
+        ixheaacd_dec_interp_umx(p_m2_param->m2_resid_real[idx++], rout_ptr, m2_resid_real_prev,
+                                pstr_mps_state);
+        ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
+
+        p_hyb_out_dry_re = p_hyb_out_dry_real;
+        p_hyb_out_dry_im = p_hyb_out_dry_imag;
+
+        for (ts = 0; ts < time_slots; ts++) {
+          hyb_output_real_dry = p_hyb_out_dry_re;
+          hyb_output_imag_dry = p_hyb_out_dry_im;
+
+          w_dry_real = p_dry_real;
+          w_dry_imag = p_dry_imag;
+
+          for (qs = 0; qs < index; qs++) {
+            temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
+            w_dry_real++;
+            *hyb_output_real_dry = *hyb_output_real_dry + temp_1;
+            hyb_output_real_dry++;
+
+            temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
+            w_dry_imag++;
+            rout_kernel_ptr++;
+            *hyb_output_imag_dry = *hyb_output_imag_dry + temp_1;
+            hyb_output_imag_dry++;
+          }
+          rout_kernel_ptr += hybrid_bands - index;
+
+          p_hyb_out_dry_re += MAX_HYBRID_BANDS;
+          p_hyb_out_dry_im += MAX_HYBRID_BANDS;
+
+          p_dry_real += MAX_HYBRID_BANDS;
+          p_dry_imag += MAX_HYBRID_BANDS;
+        }
+        m2_resid_real_prev += num_parameter_bands;
+      }
+    }
+
+    p_hyb_out_dry_real += TSXHB;
+    p_hyb_out_dry_imag += TSXHB;
+  }
+
+  if (up_mix_type == 2) {
+    if (m2_param_imag_present) {
+      if (residual_coding)
+        loop_counter = col_counter;
+      else
+        loop_counter = num_direct_signals;
+
+      idx = 0;
+
+      p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
+      p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
+
+      for (row = 0; row < num_output_channels; row++) {
+        p_buffer_real = p_array_struct->buf_real;
+        p_buffer_imag = p_array_struct->buf_imag;
+
+        for (col = 0; col < num_direct_signals; col++) {
+          p_buffer_re = p_buffer_real;
+          p_buffer_im = p_buffer_imag;
+
+          if (curr_state->m2_param_present[row][col] & 2) {
+            ixheaacd_dec_interp_umx(p_m2_param->m2_resid_imag[idx++], rout_ptr,
+                                    m2_resid_imag_prev, pstr_mps_state);
+            ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
+
+            p_hyb_out_dry_re = p_hyb_out_dry_real;
+            p_hyb_out_dry_im = p_hyb_out_dry_imag;
+
+            for (ts = 0; ts < time_slots; ts++) {
+              hyb_output_real_dry = p_hyb_out_dry_re;
+              hyb_output_imag_dry = p_hyb_out_dry_im;
+
+              w_dry_real = p_buffer_re;
+              w_dry_imag = p_buffer_im;
+
+              for (qs = 0; qs < 2; qs++) {
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
+                w_dry_imag++;
+                *hyb_output_real_dry = *hyb_output_real_dry + temp_1;
+                hyb_output_real_dry++;
+
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
+                w_dry_real++;
+                rout_kernel_ptr++;
+                *hyb_output_imag_dry = *hyb_output_imag_dry - temp_1;
+                hyb_output_imag_dry++;
+              }
+
+              for (; qs < hybrid_bands; qs++) {
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
+                w_dry_imag++;
+                *hyb_output_real_dry = *hyb_output_real_dry - temp_1;
+                hyb_output_real_dry++;
+
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
+                w_dry_real++;
+                rout_kernel_ptr++;
+                *hyb_output_imag_dry = *hyb_output_imag_dry + temp_1;
+                hyb_output_imag_dry++;
+              }
+              p_buffer_re += MAX_HYBRID_BANDS;
+              p_buffer_im += MAX_HYBRID_BANDS;
+
+              p_hyb_out_dry_re += MAX_HYBRID_BANDS;
+              p_hyb_out_dry_im += MAX_HYBRID_BANDS;
+            }
+            m2_resid_imag_prev += num_parameter_bands;
+          }
+          p_buffer_real += TSXHB;
+          p_buffer_imag += TSXHB;
+        }
+
+        for (; col < loop_counter; col++) {
+          WORD32 index;
+          WORD32 res = ixheaacd_get_res_idx(pstr_mps_state, col);
+          index = index_ptr[res];
+
+          if (curr_state->m2_param_present[row][col] & 2) {
+            WORD32 *p_dry_real = p_array_struct->w_dry_real + res * TSXHB;
+            WORD32 *p_dry_imag = p_array_struct->w_dry_imag + res * TSXHB;
+            ixheaacd_dec_interp_umx(p_m2_param->m2_resid_imag[idx++], rout_ptr,
+                                    m2_resid_imag_prev, pstr_mps_state);
+            ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
+
+            p_hyb_out_dry_re = p_hyb_out_dry_real;
+            p_hyb_out_dry_im = p_hyb_out_dry_imag;
+
+            for (ts = 0; ts < time_slots; ts++) {
+              hyb_output_real_dry = p_hyb_out_dry_re;
+              hyb_output_imag_dry = p_hyb_out_dry_im;
+
+              w_dry_real = p_dry_real;
+              w_dry_imag = p_dry_imag;
+
+              for (qs = 0; qs < 2; qs++) {
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
+                w_dry_imag++;
+                *hyb_output_real_dry = *hyb_output_real_dry + temp_1;
+                hyb_output_real_dry++;
+
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
+                w_dry_real++;
+                rout_kernel_ptr++;
+                *hyb_output_imag_dry = *hyb_output_imag_dry - temp_1;
+                hyb_output_imag_dry++;
+              }
+
+              for (; qs < index; qs++) {
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_imag, *rout_kernel_ptr);
+                w_dry_imag++;
+                *hyb_output_real_dry = *hyb_output_real_dry - temp_1;
+                hyb_output_real_dry++;
+
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_dry_real, *rout_kernel_ptr);
+                w_dry_real++;
+                rout_kernel_ptr++;
+                *hyb_output_imag_dry = *hyb_output_imag_dry + temp_1;
+                hyb_output_imag_dry++;
+              }
+              rout_kernel_ptr += hybrid_bands - index;
+
+              p_hyb_out_dry_re += MAX_HYBRID_BANDS;
+              p_hyb_out_dry_im += MAX_HYBRID_BANDS;
+
+              p_dry_real += MAX_HYBRID_BANDS;
+              p_dry_imag += MAX_HYBRID_BANDS;
+            }
+            m2_resid_imag_prev += num_parameter_bands;
+          }
+        }
+        p_hyb_out_dry_real += TSXHB;
+        p_hyb_out_dry_imag += TSXHB;
+      }
+    }
+  }
+  p_buffer_real = p_array_struct->buf_real;
+  p_buffer_imag = p_array_struct->buf_imag;
+
+  for (row = 0; row < num_output_channels; row++) {
+    hyb_output_real_wet = p_buffer_real;
+    hyb_output_imag_wet = p_buffer_imag;
+
+    for (ts = 0; ts < time_slots; ts++) {
+      memset(hyb_output_real_wet, 0, (hybrid_bands) * sizeof(*hyb_output_real_wet));
+      memset(hyb_output_imag_wet, 0, (hybrid_bands) * sizeof(*hyb_output_imag_wet));
+
+      hyb_output_real_wet += MAX_HYBRID_BANDS;
+      hyb_output_imag_wet += MAX_HYBRID_BANDS;
+    }
+    p_buffer_real += TSXHB;
+    p_buffer_imag += TSXHB;
+  }
+  idx = 0;
+
+  p_buffer_real = p_array_struct->buf_real;
+  p_buffer_imag = p_array_struct->buf_imag;
+
+  for (row = 0; row < num_output_channels; row++) {
+    p_buf_real = p_array_struct->buffer_real + w_wet_offset;
+    p_buf_imag = p_array_struct->buffer_imag + w_wet_offset;
+    for (col = num_direct_signals; col < col_counter; col++) {
+      if (curr_state->m2_param_present[row][col] & 1) {
+        ixheaacd_dec_interp_umx(p_m2_param->m2_decor_real[idx++], rout_ptr, m2_decor_real_prev,
+                                pstr_mps_state);
+
+        ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
+        p_buffer_re = p_buffer_real;
+        p_buffer_im = p_buffer_imag;
+
+        p_buf_re = p_buf_real;
+        p_buf_im = p_buf_imag;
+        for (ts = 0; ts < time_slots; ts++) {
+          hyb_output_real_wet = p_buffer_re;
+          hyb_output_imag_wet = p_buffer_im;
+
+          w_wet_real = p_buf_re;
+          w_wet_imag = p_buf_im;
+
+          for (qs = 0; qs < hybrid_bands; qs++) {
+            temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_real, *rout_kernel_ptr);
+            w_wet_real++;
+            *hyb_output_real_wet = *hyb_output_real_wet + temp_1;
+            hyb_output_real_wet++;
+
+            temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_imag, *rout_kernel_ptr);
+            w_wet_imag++;
+            rout_kernel_ptr++;
+            *hyb_output_imag_wet = *hyb_output_imag_wet + temp_1;
+            hyb_output_imag_wet++;
+          }
+          p_buffer_re += MAX_HYBRID_BANDS;
+          p_buffer_im += MAX_HYBRID_BANDS;
+
+          p_buf_re += MAX_HYBRID_BANDS;
+          p_buf_im += MAX_HYBRID_BANDS;
+        }
+        m2_decor_real_prev += num_parameter_bands;
+      }
+      p_buf_real += TSXHB;
+      p_buf_imag += TSXHB;
+    }
+    p_buffer_real += TSXHB;
+    p_buffer_imag += TSXHB;
+  }
+
+  if (up_mix_type == 2) {
+    if (m2_param_imag_present) {
+      idx = 0;
+
+      p_buffer_real = p_array_struct->buf_real;
+      p_buffer_imag = p_array_struct->buf_imag;
+
+      for (row = 0; row < num_output_channels; row++) {
+        m2_decor_imag_prev += num_parameter_bands * num_direct_signals;
+        p_buf_real = p_array_struct->buffer_real + w_wet_offset;
+        p_buf_imag = p_array_struct->buffer_imag + w_wet_offset;
+        for (col = num_direct_signals; col < col_counter; col++) {
+          if (curr_state->m2_param_present[row][col] & 1) {
+            ixheaacd_dec_interp_umx(p_m2_param->m2_decor_imag[idx++], rout_ptr,
+                                    m2_decor_imag_prev, pstr_mps_state);
+            ixheaacd_apply_abs_kernels(rout_ptr, rout_kernel_ptr, params);
+
+            p_buffer_re = p_buffer_real;
+            p_buffer_im = p_buffer_imag;
+
+            p_buf_re = p_buf_real;
+            p_buf_im = p_buf_imag;
+            for (ts = 0; ts < time_slots; ts++) {
+              hyb_output_real_wet = p_buffer_re;
+              hyb_output_imag_wet = p_buffer_im;
+
+              w_wet_real = p_buf_re;
+              w_wet_imag = p_buf_im;
+
+              for (qs = 0; qs < 2; qs++) {
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_imag, *rout_kernel_ptr);
+                w_wet_imag++;
+                *hyb_output_real_wet = *hyb_output_real_wet + temp_1;
+                hyb_output_real_wet++;
+
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_real, *rout_kernel_ptr);
+                w_wet_real++;
+                rout_kernel_ptr++;
+                *hyb_output_imag_wet = *hyb_output_imag_wet - temp_1;
+                hyb_output_imag_wet++;
+              }
+
+              for (; qs < hybrid_bands; qs++) {
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_imag, *rout_kernel_ptr);
+                w_wet_imag++;
+                *hyb_output_real_wet = *hyb_output_real_wet - temp_1;
+                hyb_output_real_wet++;
+
+                temp_1 = ixheaacd_mps_mult32_shr_15(*w_wet_real, *rout_kernel_ptr);
+                w_wet_real++;
+                rout_kernel_ptr++;
+                *hyb_output_imag_wet = *hyb_output_imag_wet + temp_1;
+                hyb_output_imag_wet++;
+              }
+              p_buffer_re += MAX_HYBRID_BANDS;
+              p_buffer_im += MAX_HYBRID_BANDS;
+
+              p_buf_re += MAX_HYBRID_BANDS;
+              p_buf_im += MAX_HYBRID_BANDS;
+            }
+            m2_decor_imag_prev += num_parameter_bands;
+          }
+          p_buf_real += TSXHB;
+          p_buf_imag += TSXHB;
+        }
+        p_buffer_real += TSXHB;
+        p_buffer_imag += TSXHB;
+      }
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_basic_op.h b/decoder/ixheaacd_mps_basic_op.h
new file mode 100644
index 0000000..65987b0
--- /dev/null
+++ b/decoder/ixheaacd_mps_basic_op.h
@@ -0,0 +1,393 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_BASIC_OP_H
+#define IXHEAACD_MPS_BASIC_OP_H
+
+#define NORM32 (0x40000000)
+#define INV_SQRT_2_Q31 (1518500250)
+#define Q_SQRT_TAB (15)
+#define LOG2XQ17 (5171707904LL)
+#define LOG_COEFF1 (27890)
+#define LOG_COEFF2 (16262)
+#define LOG_COEFF3 (7574)
+#define LOG_COEFF4 (1786)
+
+#define TRIG_TABLE_CONV_FAC 326
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_get_rshift_bits(WORD64 a) {
+  WORD32 temp_1, temp_2;
+  temp_1 = (WORD32)(a >> 32);
+  temp_2 = ixheaacd_norm32(temp_1);
+  if (temp_2 < 31) {
+    return (32 - temp_2);
+  } else {
+    temp_2 = (WORD32)(a);
+    if ((temp_1 ^ temp_2) < 0) {
+      return 1;
+    } else {
+      return 0;
+    }
+  }
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_narrow(WORD64 a, WORD16 *qfac) {
+  WORD32 x;
+  x = ixheaacd_mps_get_rshift_bits(a);
+  *qfac = 20 - x;
+  return (WORD32)((WORD64)a >> x);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_sqrt(WORD32 num, WORD16 *q, const WORD32 *sqrt_tab) {
+  WORD32 index, answer, temp;
+  WORD k;
+
+  if (num == 0) return 0;
+
+  k = ixheaacd_norm32(num);
+  temp = ixheaacd_shr32(ixheaacd_shl32(num, k), 21);
+  *q += k;
+  index = temp & 0x1FF;
+  answer = sqrt_tab[index];
+  if (*q & 1) {
+    *q -= 1;
+    answer = ixheaacd_mult32_shl(answer, INV_SQRT_2_Q31);
+  }
+  *q = *q >> 1;
+  *q += Q_SQRT_TAB;
+  return answer;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_reshape_add32(WORD32 op1, WORD32 op2, WORD16 *qop1,
+                                                         WORD16 qop2) {
+  WORD64 tempresult;
+  if (0 == op2) {
+    return op1;
+  }
+  if (0 == op1) {
+    *qop1 = qop2;
+    return op2;
+  }
+  if (*qop1 < qop2) {
+    if ((qop2 - *qop1) > 31)
+      op2 = 0;
+    else
+      op2 = op2 >> (qop2 - *qop1);
+    tempresult = (WORD64)op1 + (WORD64)op2;
+  } else {
+    if ((*qop1 - qop2) > 31)
+      op1 = 0;
+    else
+      op1 = op1 >> (*qop1 - qop2);
+    *qop1 = qop2;
+    tempresult = (WORD64)op1 + (WORD64)op2;
+  }
+  if (tempresult > (WORD32)0x7fffffff || tempresult < (WORD32)0x80000000) {
+    tempresult = tempresult >> 1;
+    *qop1 -= 1;
+  }
+  return (WORD32)tempresult;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_add32(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
+  WORD64 temp_result;
+
+  if (a == 0 || b == 0) {
+    if (b == 0) {
+      return a;
+    } else {
+      *q_a = q_b;
+      return b;
+    }
+  }
+  if (*q_a > q_b) {
+    if (((*q_a) - q_b) > 31) {
+      a = 0;
+      *q_a = q_b;
+    } else {
+      a = (a >> ((*q_a) - q_b));
+      *q_a = q_b;
+    }
+  } else {
+    if ((q_b - (*q_a)) > 31) {
+      b = 0;
+    } else {
+      b = (b >> (q_b - (*q_a)));
+      q_b = *q_a;
+    }
+  }
+  temp_result = (WORD64)a + (WORD64)b;
+  if (temp_result > (WORD32)0x7fffffff || temp_result < (WORD32)0x80000000) {
+    temp_result = temp_result >> 1;
+    *q_a -= 1;
+  }
+
+  return (WORD32)temp_result;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
+  WORD64 temp_result;
+  WORD32 temp;
+
+  if (a == 0 || b == 0) {
+    temp_result = 0;
+    *q_a = 15;
+    return (WORD32)temp_result;
+  }
+
+  *q_a = *q_a + q_b;
+
+  temp_result = (WORD64)a * (WORD64)b;
+  temp = ixheaacd_mps_get_rshift_bits(temp_result);
+  if (0 != temp) {
+    *q_a -= temp;
+    temp_result = temp_result >> temp;
+  }
+
+  return (WORD32)temp_result;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32x32(WORD32 a, WORD32 b, WORD16 *q_a,
+                                                     WORD16 q_b) {
+  WORD64 temp_result;
+  if (a == 0 || b == 0) {
+    temp_result = 0;
+    *q_a = 15;
+    return (WORD32)temp_result;
+  }
+  *q_a = *q_a + q_b;
+
+  temp_result = (WORD64)a * (WORD64)b;
+  while (temp_result > (WORD32)0x7fffffff || temp_result < (WORD32)0x80000000) {
+    temp_result = temp_result >> 1;
+    *q_a -= 1;
+  }
+
+  return (WORD32)temp_result;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_n(WORD32 a, WORD32 b, WORD16 n) {
+  WORD32 result;
+  WORD64 temp_result;
+
+  temp_result = (WORD64)a * (WORD64)b;
+  result = (WORD32)(temp_result >> n);
+
+  return (result);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_30(WORD32 a, WORD32 b) {
+  WORD32 result;
+  WORD64 temp_result;
+
+  temp_result = (WORD64)a * (WORD64)b;
+  result = (WORD32)(temp_result >> 30);
+
+  return (result);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_16(WORD32 a, WORD32 b) {
+  WORD32 result;
+  WORD64 temp_result;
+
+  temp_result = (WORD64)a * (WORD64)b;
+  result = (WORD32)(temp_result >> 16);
+  return (result);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32x16_shr_16(WORD32 a, WORD32 b) {
+  WORD32 result;
+  WORD64 temp_result;
+  temp_result = (WORD64)a * (WORD64)b;
+  result = (WORD32)(temp_result >> 16);
+  return (result);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_15(WORD32 a, WORD32 b) {
+  WORD32 result;
+  WORD64 temp_result;
+  temp_result = (WORD64)a * (WORD64)b;
+  result = (WORD32)(temp_result >> 15);
+
+  return (result);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_14(WORD32 a, WORD32 b) {
+  WORD32 result;
+  WORD64 temp_result;
+
+  temp_result = (WORD64)a * (WORD64)b;
+  result = (WORD32)(temp_result >> 16);
+  result = result << 2;
+
+  return (result);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_div_32(WORD32 a, WORD32 b, WORD16 *q_format) {
+  WORD32 quotient;
+  UWORD32 mantissa_nr, mantissa_dr;
+  LOOPINDEX i;
+  WORD q_nr, q_dr;
+
+  quotient = 0;
+
+  if (0 == b) {
+    *q_format = 0;
+    return (a);
+  }
+
+  quotient = 0;
+
+  q_nr = ixheaacd_norm32(a);
+  mantissa_nr = (UWORD32)a << (q_nr);
+  q_dr = ixheaacd_norm32(b);
+  mantissa_dr = (UWORD32)b << (q_dr);
+  *q_format = (WORD)(30 + q_nr - q_dr);
+
+  for (i = 0; i < 31; i++) {
+    quotient <<= 1;
+
+    if (mantissa_nr >= mantissa_dr) {
+      mantissa_nr -= mantissa_dr;
+      quotient += 1;
+    }
+    mantissa_nr <<= 1;
+  }
+
+  if ((a ^ b) < 0) {
+    return -(quotient);
+  }
+
+  return quotient;
+}
+
+static WORD32 ixheaacd_mps_convert_to_qn(WORD32 temp, WORD16 qtemp, WORD16 n) {
+  WORD64 result;
+  if (qtemp == n)
+    return temp;
+  else if (qtemp > n)
+    temp = (WORD32)((WORD64)temp >> (qtemp - n));
+  else {
+    result = (WORD32)((WORD64)temp << (n - qtemp));
+    if (result > (WORD32)0x7fffffff || result < (WORD32)0x80000000) {
+      return 0;
+    } else
+      temp = (WORD32)result;
+  }
+  return temp;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_div32_in_q15(WORD32 num, WORD32 den) {
+  WORD32 quotient;
+  WORD16 q_quotient;
+
+  quotient = ixheaacd_mps_div_32(num, den, &q_quotient);
+  quotient = ixheaacd_mps_convert_to_qn(quotient, q_quotient, 15);
+  return quotient;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_log10(WORD32 a, WORD16 q_a) {
+  WORD32 x;
+  WORD16 q_x;
+  WORD32 j, k, temp;
+  WORD16 q_num;
+  q_num = ixheaacd_norm32(a);
+  a = a << q_num;
+  x = ixheaacd_mps_div_32(a, NORM32, &q_x);
+
+  if (q_x > 16)
+    x = x >> (q_x - 16);
+  else
+    x = x << (16 - q_x);
+
+  q_num = 30 - (q_num + q_a);
+
+  j = x - ONE_IN_Q16;
+  k = ixheaacd_mps_mult32_shr_16(SQRT_THREE_Q15, j);
+  temp = ixheaacd_mps_mult32_shr_16(j, j);
+  k -= ixheaacd_mps_mult32_shr_16(LOG_COEFF1, temp);
+  temp = ixheaacd_mps_mult32_shr_16(temp, j);
+  k += ixheaacd_mps_mult32_shr_16(LOG_COEFF2, temp);
+  temp = ixheaacd_mps_mult32_shr_16(temp, j);
+  k -= ixheaacd_mps_mult32_shr_16(LOG_COEFF3, temp);
+  temp = ixheaacd_mps_mult32_shr_16(temp, j);
+  k += ixheaacd_mps_mult32_shr_16(LOG_COEFF4, temp);
+
+  k += (WORD32)(q_num * ((WORD32)LOG2XQ17));
+
+  return (k >> 1);
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_cos(WORD32 a, const WORD32 *cosine_tab) {
+  WORD32 temp_result;
+
+  if (a < 0) {
+    a = -a;
+  }
+
+  a = a % TWO_PI_IN_Q15;
+
+  temp_result = cosine_tab[((a * TRIG_TABLE_CONV_FAC) >> 15)];
+  return temp_result;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_sin(WORD32 a, const WORD32 *sine_tab) {
+  WORD32 temp_result, flag = 0;
+
+  if (a < 0) {
+    a = -a;
+    flag = 1;
+  }
+
+  a = a % TWO_PI_IN_Q15;
+
+  temp_result = sine_tab[((a * TRIG_TABLE_CONV_FAC) >> 15)];
+  if (flag) temp_result = -temp_result;
+
+  return temp_result;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_mps_comp(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
+  if (a == 0 || b == 0) {
+    if (a == 0) {
+      if (b < 0)
+        return 1;
+      else
+        return 0;
+    } else if (b == 0) {
+      if (a > 0)
+        return 1;
+      else
+        return 0;
+    }
+  }
+
+  if (*q_a > q_b) {
+    a = (a >> ((*q_a) - q_b));
+  } else {
+    b = (b >> (q_b - (*q_a)));
+  }
+
+  if (a > b)
+    return 1;
+  else
+    return 0;
+}
+
+#endif /* IXHEAACD_MPS_BASIC_OP_H */
diff --git a/decoder/ixheaacd_mps_bitdec.c b/decoder/ixheaacd_mps_bitdec.c
new file mode 100644
index 0000000..c67d346
--- /dev/null
+++ b/decoder/ixheaacd_mps_bitdec.c
@@ -0,0 +1,2482 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_res_channel.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_interface.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_nlc_dec.h"
+#include "ixheaacd_mps_bitdec.h"
+#include "ixheaacd_mps_res_tns.h"
+#include "ixheaacd_mps_mdct_2_qmf.h"
+#include "ixheaacd_sbr_const.h"
+
+static IA_ERRORCODE ixheaacd_parse_extension_config(
+    ia_mps_spatial_bs_config_struct *config, WORD32 num_ott_boxes, WORD32 num_ttt_boxes,
+    WORD32 num_out_chan, WORD32 bits_available, ia_bit_buf_struct *it_bit_buff,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  WORD32 i, ch, idx, tmp, tmp_open, sac_ext_len, bits_read, n_fill_bits, temp;
+  WORD32 ba = bits_available;
+
+  config->sac_ext_cnt = 0;
+
+  while (ba >= 8) {
+    ba -= 8;
+    temp = ixheaacd_read_bits_buf(it_bit_buff, 8);
+    config->bs_sac_ext_type[config->sac_ext_cnt] = (temp >> 4) & FOUR_BIT_MASK;
+    sac_ext_len = temp & FOUR_BIT_MASK;
+    if (sac_ext_len == 15) {
+      sac_ext_len += ixheaacd_read_bits_buf(it_bit_buff, 8);
+      ba -= 8;
+      if (sac_ext_len == 15 + 255) {
+        sac_ext_len += ixheaacd_read_bits_buf(it_bit_buff, 16);
+        ba -= 16;
+      }
+    }
+
+    tmp = (WORD32)(((it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base + 1) << 3) -
+                   (it_bit_buff->bit_pos + 1));
+
+    switch (config->bs_sac_ext_type[config->sac_ext_cnt]) {
+      case EXT_TYPE_0:
+        config->bs_residual_coding = 1;
+        temp = ixheaacd_read_bits_buf(it_bit_buff, 6);
+        config->bs_residual_sampling_freq_index = (temp >> 2) & FOUR_BIT_MASK;
+        config->bs_residual_frames_per_spatial_frame = temp & TWO_BIT_MASK;
+
+        for (i = 0; i < num_ott_boxes + num_ttt_boxes; i++) {
+          config->bs_residual_present[i] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+          if (config->bs_residual_present[i]) {
+            config->bs_residual_bands[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
+          }
+        }
+        break;
+
+      case EXT_TYPE_1:
+        config->bs_arbitrary_downmix = 2;
+
+        temp = ixheaacd_read_bits_buf(it_bit_buff, 11);
+        config->bs_arbitrary_downmix_residual_sampling_freq_index = (temp >> 7) & FOUR_BIT_MASK;
+        config->bs_arbitrary_downmix_residual_frames_per_spatial_frame =
+            (temp >> 5) & TWO_BIT_MASK;
+        config->bs_arbitrary_downmix_residual_bands = temp & FIVE_BIT_MASK;
+
+        break;
+
+      case EXT_TYPE_2:
+        config->arbitrary_tree = 1;
+        config->num_out_chan_at = 0;
+        config->num_ott_boxes_at = 0;
+        for (ch = 0; ch < num_out_chan; ch++) {
+          tmp_open = 1;
+          idx = 0;
+          while (tmp_open > 0) {
+            config->bs_ott_box_present_at[ch][idx] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+            if (config->bs_ott_box_present_at[ch][idx]) {
+              config->num_ott_boxes_at++;
+              tmp_open++;
+            } else {
+              config->num_out_chan_at++;
+              tmp_open--;
+            }
+            if (config->num_ott_boxes_at >= 56) return IA_FATAL_ERROR;
+            idx++;
+            if (idx >= MAX_ARBITRARY_TREE_INDEX) return IA_FATAL_ERROR;
+          }
+        }
+
+        for (i = 0; i < config->num_ott_boxes_at; i++) {
+          temp = ixheaacd_read_bits_buf(it_bit_buff, 2);
+          config->bs_ott_default_cld_at[i] = (temp >> 1) & ONE_BIT_MASK;
+          config->bs_ott_mode_lfe_at[i] = temp & ONE_BIT_MASK;
+          if (config->bs_ott_mode_lfe_at[i]) {
+            config->bs_ott_bands_at[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
+            if (config->bs_ott_bands_at[i] > MAX_PARAMETER_BANDS) return IA_FATAL_ERROR;
+          } else {
+            config->bs_ott_bands_at[i] =
+                ixheaacd_mps_dec_bitdec_tables->freq_res_table[config->bs_freq_res];
+          }
+        }
+
+        for (i = 0; i < config->num_out_chan_at; i++) {
+          config->bs_output_channel_pos_at[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
+        }
+
+        break;
+
+      default:
+        return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_EXTENSION_TYPE;
+    }
+
+    bits_read = (WORD32)(((it_bit_buff->ptr_read_next - it_bit_buff->ptr_bit_buf_base + 1) << 3) -
+                         (it_bit_buff->bit_pos + 1) - tmp);
+    n_fill_bits = 8 * sac_ext_len - bits_read;
+
+    while (n_fill_bits > 7) {
+      ixheaacd_read_bits_buf(it_bit_buff, 8);
+      n_fill_bits -= 8;
+    }
+    if (n_fill_bits > 0) {
+      ixheaacd_read_bits_buf(it_bit_buff, n_fill_bits);
+    }
+
+    ba -= 8 * sac_ext_len;
+    config->sac_ext_cnt++;
+    if (config->sac_ext_cnt >= MAX_NUM_EXT_TYPES) {
+      return IA_FATAL_ERROR;
+    }
+  }
+
+  return IA_NO_ERROR;
+}
+
+IA_ERRORCODE ixheaacd_parse_specific_config(ia_heaac_mps_state_struct *pstr_mps_state,
+                                            WORD32 sac_header_len) {
+  IA_ERRORCODE err_code = IA_NO_ERROR;
+  ia_mps_spatial_bs_config_struct *config = &(pstr_mps_state->bs_config);
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  const ia_mps_dec_tree_properties_struct *p_tree_property_table =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr->tree_property_table;
+  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
+
+  WORD32 i, hc, hb, num_header_bits, ott_mode_lfe[MAX_NUM_OTT];
+
+  WORD32 tmp = (WORD32)(((mps_bit_buf->ptr_read_next - mps_bit_buf->ptr_bit_buf_base + 1) << 3) -
+                        (mps_bit_buf->bit_pos + 1));
+  WORD32 bits_available = (sac_header_len << 3);
+  WORD32 temp, alignment_bits = 0;
+
+  config->bs_sampling_freq_index = ixheaacd_read_bits_buf(mps_bit_buf, 4);
+  if (config->bs_sampling_freq_index == 15) {
+    config->bs_sampling_frequency = ixheaacd_read_bits_buf(mps_bit_buf, 24);
+  }
+  temp = ixheaacd_read_bits_buf(mps_bit_buf, 14);
+  config->bs_frame_length = (temp >> 7) & SEVEN_BIT_MASK;
+  if (config->bs_frame_length >= (MAX_QMF_BUF_LEN - 1)) {
+    return IA_FATAL_ERROR;
+  }
+  config->bs_freq_res = (temp >> 4) & THREE_BIT_MASK;
+  if (config->bs_freq_res == 0) {
+    return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_PARAMETER_BANDS;
+  }
+  config->bs_tree_config = (temp)&FOUR_BIT_MASK;
+
+  if (config->bs_tree_config >= 7) {
+    return IA_FATAL_ERROR;
+  }
+
+  if (config->bs_tree_config != 15) {
+    curr_state->num_ott_boxes = p_tree_property_table[config->bs_tree_config].num_ott_boxes;
+    curr_state->num_ttt_boxes = p_tree_property_table[config->bs_tree_config].num_ttt_boxes;
+    curr_state->num_input_channels =
+        p_tree_property_table[config->bs_tree_config].num_input_channels;
+    curr_state->num_output_channels =
+        p_tree_property_table[config->bs_tree_config].num_output_channels;
+    for (i = 0; i < MAX_NUM_OTT; i++) {
+      ott_mode_lfe[i] = p_tree_property_table[config->bs_tree_config].ott_mode_lfe[i];
+    }
+  }
+  temp = ixheaacd_read_bits_buf(mps_bit_buf, 19);
+  config->bs_quant_mode = (temp >> 17) & TWO_BIT_MASK;
+  config->bs_one_icc = (temp >> 16) & ONE_BIT_MASK;
+  config->bs_arbitrary_downmix = (temp >> 15) & ONE_BIT_MASK;
+  config->bs_fixed_gain_sur = (temp >> 12) & THREE_BIT_MASK;
+  if (config->bs_fixed_gain_sur >= 5) {
+    return IA_FATAL_ERROR;
+  }
+  config->bs_fixed_gain_lfe = (temp >> 9) & THREE_BIT_MASK;
+
+  if (config->bs_fixed_gain_lfe >= 5) return IA_FATAL_ERROR;
+  config->bs_fixed_gain_dmx = (temp >> 6) & THREE_BIT_MASK;
+  config->bs_matrix_mode = (temp >> 5) & ONE_BIT_MASK;
+  config->bs_temp_shape_config = (temp >> 3) & TWO_BIT_MASK;
+  config->bs_decorr_config = (temp >> 1) & TWO_BIT_MASK;
+  config->bs_3d_audio_mode = (temp)&ONE_BIT_MASK;
+
+  for (i = 0; i < curr_state->num_ott_boxes; i++) {
+    if (ott_mode_lfe[i]) {
+      config->bs_ott_bands[i] = ixheaacd_read_bits_buf(mps_bit_buf, 5);
+      if (config->bs_ott_bands[i] > MAX_PARAMETER_BANDS) return IA_FATAL_ERROR;
+    }
+  }
+
+  for (i = 0; i < curr_state->num_ttt_boxes; i++) {
+    temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
+    config->bs_ttt_dual_mode[i] = (temp >> 3) & ONE_BIT_MASK;
+    config->bs_ttt_mode_low[i] = (temp)&THREE_BIT_MASK;
+    if (config->bs_ttt_dual_mode[i]) {
+      temp = ixheaacd_read_bits_buf(mps_bit_buf, 8);
+      config->bs_ttt_mode_high[i] = (temp >> 5) & THREE_BIT_MASK;
+      config->bs_ttt_bands_low[i] = (temp)&FIVE_BIT_MASK;
+      if (config->bs_ttt_bands_low[i] > MAX_PARAMETER_BANDS) return IA_FATAL_ERROR;
+    }
+  }
+
+  if (config->bs_temp_shape_config == 2) {
+    config->bs_env_quant_mode = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+  }
+
+  if (config->bs_3d_audio_mode) {
+    config->bs_3d_audio_hrtf_set = ixheaacd_read_bits_buf(mps_bit_buf, 2);
+    if (config->bs_3d_audio_hrtf_set == 0) {
+      temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
+      config->bs_hrtf_freq_res = (temp >> 1) & THREE_BIT_MASK;
+      config->bs_hrtf_num_chan = 5;
+      config->bs_hrtf_asymmetric = (temp)&ONE_BIT_MASK;
+
+      config->hrtf_num_band = pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr
+                                  ->freq_res_table[config->bs_hrtf_freq_res];
+
+      for (hc = 0; hc < config->bs_hrtf_num_chan; hc++) {
+        for (hb = 0; hb < config->hrtf_num_band; hb++) {
+          config->bs_hrtf_level_left[hc][hb] = ixheaacd_read_bits_buf(mps_bit_buf, 6);
+        }
+        for (hb = 0; hb < config->hrtf_num_band; hb++) {
+          config->bs_hrtf_level_right[hc][hb] = config->bs_hrtf_asymmetric
+                                                    ? ixheaacd_read_bits_buf(mps_bit_buf, 6)
+                                                    : config->bs_hrtf_level_left[hc][hb];
+        }
+        config->bs_hrtf_phase[hc] = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+        for (hb = 0; hb < config->hrtf_num_band; hb++) {
+          config->bs_hrtf_phase_lr[hc][hb] =
+              config->bs_hrtf_phase[hc] ? ixheaacd_read_bits_buf(mps_bit_buf, 6) : 0;
+        }
+      }
+    }
+  }
+
+  ixheaacd_byte_align(mps_bit_buf, &alignment_bits);
+
+  num_header_bits =
+      (WORD32)(((mps_bit_buf->ptr_read_next - mps_bit_buf->ptr_bit_buf_base + 1) << 3) -
+               (mps_bit_buf->bit_pos + 1) - tmp);
+  bits_available -= num_header_bits;
+
+  err_code = ixheaacd_parse_extension_config(
+      config, curr_state->num_ott_boxes, curr_state->num_ttt_boxes,
+      curr_state->num_output_channels, bits_available, mps_bit_buf,
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
+  if (err_code != IA_NO_ERROR) return err_code;
+
+  return IA_NO_ERROR;
+}
+
+IA_ERRORCODE ixheaacd_default_specific_config(ia_heaac_mps_state_struct *pstr_mps_state,
+                                              WORD32 sampling_freq) {
+  ia_mps_spatial_bs_config_struct *config = &(pstr_mps_state->bs_config);
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  const ia_mps_dec_tree_properties_struct *p_tree_property_table =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr->tree_property_table;
+  WORD32 i, ott_mode_lfe[MAX_NUM_OTT];
+
+  config->bs_sampling_freq_index = 15;
+  for (i = 0; i < 15; i++) {
+    if (sampling_freq ==
+        pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr->sampling_freq_table[i]) {
+      config->bs_sampling_freq_index = i;
+    }
+  }
+  if (config->bs_sampling_freq_index == 15) {
+    config->bs_sampling_frequency = sampling_freq;
+  }
+  config->bs_frame_length = 31;
+  config->bs_freq_res = 1;
+  config->bs_tree_config = 2;
+  if (config->bs_tree_config > 5) return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
+  if (config->bs_tree_config != 15) {
+    curr_state->num_ott_boxes = p_tree_property_table[config->bs_tree_config].num_ott_boxes;
+    curr_state->num_ttt_boxes = p_tree_property_table[config->bs_tree_config].num_ttt_boxes;
+    curr_state->num_input_channels =
+        p_tree_property_table[config->bs_tree_config].num_input_channels;
+    curr_state->num_output_channels =
+        p_tree_property_table[config->bs_tree_config].num_output_channels;
+    memcpy(ott_mode_lfe, p_tree_property_table[config->bs_tree_config].ott_mode_lfe,
+           MAX_NUM_OTT * sizeof(ott_mode_lfe[0]));
+  }
+  config->bs_quant_mode = 0;
+  config->bs_one_icc = 0;
+  config->bs_arbitrary_downmix = 0;
+  config->bs_residual_coding = 0;
+  config->bs_smooth_config = 0;
+  config->bs_fixed_gain_sur = 2;
+  config->bs_fixed_gain_lfe = 1;
+  config->bs_fixed_gain_dmx = 0;
+  config->bs_matrix_mode = 1;
+  config->bs_temp_shape_config = 0;
+  config->bs_decorr_config = 0;
+  if (config->bs_tree_config == 15) {
+    return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
+  }
+  for (i = 0; i < curr_state->num_ott_boxes; i++) {
+    if (ott_mode_lfe[i]) {
+      config->bs_ott_bands[i] = 28;
+    }
+  }
+  for (i = 0; i < curr_state->num_ttt_boxes; i++) {
+    config->bs_ttt_dual_mode[i] = 0;
+    config->bs_ttt_mode_low[i] = 1;
+    if (config->bs_ttt_dual_mode[i]) {
+      config->bs_ttt_mode_high[i] = 1;
+      config->bs_ttt_bands_low[i] = 28;
+    }
+  }
+  return IA_NO_ERROR;
+}
+
+static VOID ixheaacd_coarse_2_fine(WORD32 *data, WORD32 data_type, WORD32 start_band,
+                                   WORD32 num_bands) {
+  WORD32 i;
+
+  for (i = start_band; i < start_band + num_bands; i++) {
+    data[i] <<= 1;
+  }
+
+  if (data_type == CLD) {
+    for (i = start_band; i < start_band + num_bands; i++) {
+      if (data[i] == -14)
+        data[i] = -15;
+      else if (data[i] == 14)
+        data[i] = 15;
+    }
+  }
+}
+
+static VOID ixheaacd_fine_2_coarse(WORD32 *data, WORD32 start_band, WORD32 num_bands) {
+  WORD32 i;
+
+  for (i = start_band; i < start_band + num_bands; i++) {
+    data[i] >>= 1;
+  }
+}
+
+static WORD32 ixheaacd_get_stride_map(
+    WORD32 freq_res_stride, WORD32 start_band, WORD32 stop_band, WORD32 *a_strides,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  WORD32 i, pb, pb_stride, data_bands, str_offset;
+
+  pb_stride = ixheaacd_mps_dec_bitdec_tables->pb_stride_table[freq_res_stride];
+  data_bands = (stop_band - start_band - 1) / pb_stride + 1;
+
+  a_strides[0] = start_band;
+  for (pb = 1; pb <= data_bands; pb++) {
+    a_strides[pb] = a_strides[pb - 1] + pb_stride;
+  }
+  str_offset = 0;
+  while (a_strides[data_bands] > stop_band) {
+    if (str_offset < data_bands) str_offset++;
+    for (i = str_offset; i <= data_bands; i++) {
+      a_strides[i]--;
+    }
+  }
+
+  return data_bands;
+}
+
+static IA_ERRORCODE ixheaacd_ec_data_dec(ia_heaac_mps_state_struct *pstr_mps_state,
+                                         ia_mps_dec_lossless_data_struct *ll_data,
+                                         WORD32 data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
+                                         WORD32 lastdata[][MAX_PARAMETER_BANDS], WORD32 datatype,
+                                         WORD32 box_idx, WORD32 param_idx, WORD32 start_band,
+                                         WORD32 stop_band) {
+  IA_ERRORCODE error_code = IA_NO_ERROR;
+  WORD32 i, pb, data_sets, set_idx, bs_data_pair, data_bands, old_quant_coarse_xxx, temp;
+  WORD32 a_strides[MAX_PARAMETER_BANDS + 1] = {0};
+
+  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
+  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
+
+  data_sets = 0;
+  for (i = 0; i < pstr_mps_state->num_parameter_sets; i++) {
+    ll_data->bs_xxx_data_mode[param_idx][i] = ixheaacd_read_bits_buf(mps_bit_buf, 2);
+    if (ll_data->bs_xxx_data_mode[param_idx][i] == 3) {
+      data_sets++;
+    }
+  }
+  set_idx = 0;
+  old_quant_coarse_xxx = ll_data->bs_quant_coarse_xxx_prev[param_idx];
+
+  while (set_idx < data_sets) {
+    temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
+    bs_data_pair = (temp >> 3) & ONE_BIT_MASK;
+    ll_data->bs_quant_coarse_xxx[param_idx][set_idx] = (temp >> 2) & ONE_BIT_MASK;
+    ll_data->bs_freq_res_stride_xxx[param_idx][set_idx] = temp & TWO_BIT_MASK;
+
+    if (ll_data->bs_quant_coarse_xxx[param_idx][set_idx] != old_quant_coarse_xxx) {
+      if (old_quant_coarse_xxx) {
+        ixheaacd_coarse_2_fine(lastdata[box_idx], datatype, start_band, stop_band - start_band);
+      } else {
+        ixheaacd_fine_2_coarse(lastdata[box_idx], start_band, stop_band - start_band);
+      }
+    }
+
+    data_bands = ixheaacd_get_stride_map(ll_data->bs_freq_res_stride_xxx[param_idx][set_idx],
+                                         start_band, stop_band, a_strides,
+                                         pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
+
+    for (pb = 0; pb < data_bands; pb++) {
+      lastdata[box_idx][start_band + pb] = lastdata[box_idx][a_strides[pb]];
+    }
+
+    error_code = ixheaacd_mps_ecdatapairdec(
+        mps_bit_buf, data[box_idx], lastdata[box_idx], datatype, set_idx, start_band, data_bands,
+        bs_data_pair, ll_data->bs_quant_coarse_xxx[param_idx][set_idx],
+        (!frame->bs_independency_flag || (set_idx > 0)), 0, 1, pstr_mps_state->ec_flag);
+    if (error_code != IA_NO_ERROR) return error_code;
+
+    for (pb = 0; pb < data_bands; pb++) {
+      for (i = a_strides[pb]; i < a_strides[pb + 1]; i++) {
+        lastdata[box_idx][i] = data[box_idx][set_idx + bs_data_pair][start_band + pb];
+      }
+    }
+
+    old_quant_coarse_xxx = ll_data->bs_quant_coarse_xxx[param_idx][set_idx];
+
+    if (bs_data_pair) {
+      ll_data->bs_quant_coarse_xxx[param_idx][set_idx + 1] =
+          ll_data->bs_quant_coarse_xxx[param_idx][set_idx];
+      ll_data->bs_freq_res_stride_xxx[param_idx][set_idx + 1] =
+          ll_data->bs_freq_res_stride_xxx[param_idx][set_idx];
+    }
+    set_idx += bs_data_pair + 1;
+  }
+  return error_code;
+}
+
+static IA_ERRORCODE ixheaacd_parse_arbitrary_downmix_data(
+    ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
+  IA_ERRORCODE error_code = IA_NO_ERROR;
+  WORD32 offset = pstr_mps_state->num_ott_boxes + 4 * pstr_mps_state->num_ttt_boxes;
+  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
+  WORD32 bitstream_parameter_bands = pstr_mps_state->bitstream_parameter_bands;
+  WORD32 ch;
+
+  for (ch = 0; ch < num_input_channels; ch++) {
+    error_code = ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data,
+                                      frame->cmp_arbdmx_gain_idx, frame->cmp_arbdmx_gain_idx_prev,
+                                      CLD, ch, offset + ch, 0, bitstream_parameter_bands);
+    if (error_code != IA_NO_ERROR) return error_code;
+  }
+  return error_code;
+}
+
+static WORD32 ixheaacd_decode_icc_diff_code(ia_bit_buf_struct *it_bit_buff) {
+  WORD32 value = 0;
+  WORD32 count = 0;
+  while ((ixheaacd_read_bits_buf(it_bit_buff, 1) == 0) && (count++ < 7)) {
+    value++;
+  }
+
+  return value;
+}
+
+static VOID ixheaacd_parse_residual_data(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 ich, ch;
+  WORD32 rfpsf;
+  WORD32 ps;
+  WORD32 pb;
+
+  ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr =
+      pstr_mps_state->ia_mps_dec_mps_table.aac_tab;
+  WORD32 i;
+
+  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
+  ia_mps_spatial_bs_config_struct *config = &(pstr_mps_state->bs_config);
+
+  WORD32 num_ott_boxes = pstr_mps_state->num_ott_boxes;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 residual_frames_per_spatial_frame = pstr_mps_state->residual_frames_per_spatial_frame;
+  WORD32 upd_qmf = pstr_mps_state->upd_qmf;
+
+  WORD32 loop_counter = num_ott_boxes + pstr_mps_state->num_ttt_boxes;
+  WORD32 *p_mdct_res;
+
+  WORD32 *p_res_mdct = pstr_mps_state->array_struct->res_mdct;
+  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
+
+  for (ich = 0; ich < loop_counter; ich++) {
+    ch = ich;
+
+    p_mdct_res = p_res_mdct;
+    if (config->bs_residual_bands[ch] > 0) {
+      if (ch < num_ott_boxes) {
+        for (ps = 0; ps < num_parameter_sets; ps++) {
+          frame->res_data.bs_icc_diff_present[ch][ps] = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+          if (frame->res_data.bs_icc_diff_present[ch][ps]) {
+            for (pb = 0; pb < config->bs_residual_bands[ch]; pb++) {
+              frame->res_data.bs_icc_diff[ch][ps][pb] =
+                  ixheaacd_decode_icc_diff_code(mps_bit_buf);
+              frame->ott_icc_diff_idx[ch][ps][pb] = frame->res_data.bs_icc_diff[ch][ps][pb];
+            }
+          }
+        }
+      }
+      p_mdct_res = p_res_mdct;
+      for (rfpsf = 0; rfpsf < residual_frames_per_spatial_frame; rfpsf++) {
+        ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
+                              aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+        if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
+          ixheaacd_res_ctns_apply(
+              pstr_mps_state->p_aac_decoder_channel_info[0],
+              pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
+              aac_tables_ptr);
+        pstr_mps_state->res_block_type[ch][rfpsf] =
+            pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
+        for (i = 0; i < AAC_FRAME_LENGTH; i++) {
+          *p_mdct_res++ =
+              (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
+        }
+
+        if ((pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence ==
+             EIGHT_SHORT_SEQUENCE) &&
+            ((upd_qmf == UPD_QMF_18) || (upd_qmf == UPD_QMF_24) || (upd_qmf == UPD_QMF_30))) {
+          ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
+                                aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+          if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
+            ixheaacd_res_ctns_apply(
+                pstr_mps_state->p_aac_decoder_channel_info[0],
+                pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
+                aac_tables_ptr);
+          for (i = 0; i < AAC_FRAME_LENGTH; i++) {
+            *p_mdct_res++ =
+                (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
+          }
+        }
+      }
+    }
+
+    p_res_mdct += RFX2XMDCTCOEF;
+  }
+}
+
+static IA_ERRORCODE ixheaacd_parse_extension_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 i, fr, gr, offset, ch;
+  WORD32 ext_num, sac_ext_type, sac_ext_len, tmp, bits_read, n_fill_bits, temp;
+  WORD32 channel_grouping[MAX_INPUT_CHANNELS_MPS];
+
+  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
+  ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
+
+  ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr =
+      pstr_mps_state->ia_mps_dec_mps_table.aac_tab;
+
+  WORD32 arbdmx_upd_qmf = pstr_mps_state->arbdmx_upd_qmf;
+  WORD32 num_ott_boxes = pstr_mps_state->num_ott_boxes;
+  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
+  WORD32 num_ttt_boxes = pstr_mps_state->num_ttt_boxes;
+  WORD32 arbdmx_frames_per_spatial_frame = pstr_mps_state->arbdmx_frames_per_spatial_frame;
+  WORD32 *p_res_mdct, *p_mdct_res;
+
+  WORD32 sfidx;
+  VOID *free_scratch = pstr_mps_state->mps_scratch_mem_v;
+  ia_mps_dec_residual_sfband_info_struct *p_sfband_info_tab = &pstr_mps_state->sfband_info_tab;
+  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
+
+  for (ch = 0; ch < 2; ch++) {
+    pstr_mps_state->p_aac_decoder_channel_info[ch] = free_scratch;
+    free_scratch = (WORD8 *)free_scratch + sizeof(ia_mps_dec_residual_channel_info_struct);
+    pstr_mps_state->p_aac_decoder_dynamic_data_init[ch] = free_scratch;
+    free_scratch = (WORD8 *)free_scratch + sizeof(ia_mps_dec_residual_dynamic_data_struct);
+    pstr_mps_state->p_aac_decoder_channel_info[ch]->p_scale_factor =
+        pstr_mps_state->p_aac_decoder_dynamic_data_init[ch]->a_scale_factor;
+    pstr_mps_state->p_aac_decoder_channel_info[ch]->p_code_book =
+        pstr_mps_state->p_aac_decoder_dynamic_data_init[ch]->a_code_book;
+    pstr_mps_state->p_aac_decoder_channel_info[ch]->p_spectral_coefficient = free_scratch;
+    free_scratch = (WORD8 *)free_scratch + 4096;
+    pstr_mps_state->p_aac_decoder_channel_info[ch]->p_tns_scratch = free_scratch;
+    free_scratch = (WORD8 *)free_scratch + 4096;
+    pstr_mps_state->p_aac_decoder_channel_info[ch]->ics_info.frame_length = AAC_FRAME_LENGTH;
+    pstr_mps_state->p_aac_decoder_channel_info[ch]->common_window = 0;
+  }
+  if (pstr_mps_state->arbitrary_downmix == 2)
+    sfidx = p_bs_config->bs_arbitrary_downmix_residual_sampling_freq_index;
+  else
+    sfidx = p_bs_config->bs_residual_sampling_freq_index;
+  {
+    WORD16 *psfb_idx[2];
+    const WORD8 *psfb_width[2];
+    WORD width_idx;
+    WORD32 j;
+
+    pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.sampling_rate_index = sfidx;
+    psfb_idx[0] = p_sfband_info_tab->sfb_long_idx;
+    psfb_idx[1] = p_sfband_info_tab->sfb_short_idx;
+    psfb_width[0] = aac_tables_ptr->scale_factor_bands_long[sfidx];
+    psfb_width[1] = aac_tables_ptr->scale_factor_bands_short[sfidx];
+
+    for (j = 1; j >= 0; j--) {
+      const WORD8 *ptr_w = psfb_width[j];
+      WORD16 *ptr_i = psfb_idx[j];
+      width_idx = 0;
+      *ptr_i++ = width_idx;
+      do {
+        width_idx += (*ptr_w++);
+        *ptr_i++ = width_idx;
+      } while (*ptr_w != -1);
+
+      pstr_mps_state->tot_sf_bands_ls[j] = (WORD8)(ptr_w - psfb_width[j]);
+    }
+
+    {
+      aac_tables_ptr->sfb_index_long = p_sfband_info_tab->sfb_long_idx;
+      aac_tables_ptr->sfb_index_short = p_sfband_info_tab->sfb_short_idx;
+      aac_tables_ptr->sfb_index_long_width = (WORD8 *)psfb_width[0];
+      aac_tables_ptr->sfb_index_short_width = (WORD8 *)psfb_width[1];
+    }
+  }
+
+  for (ext_num = 0; ext_num < p_bs_config->sac_ext_cnt; ext_num++) {
+    sac_ext_type = p_bs_config->bs_sac_ext_type[ext_num];
+
+    if (sac_ext_type < 12) {
+      sac_ext_len = ixheaacd_read_bits_buf(mps_bit_buf, 8);
+      if (sac_ext_len == 255) {
+        sac_ext_len += ixheaacd_read_bits_buf(mps_bit_buf, 16);
+      }
+
+      tmp = (WORD32)(((mps_bit_buf->ptr_read_next - mps_bit_buf->ptr_bit_buf_base + 1) << 3) -
+                     (mps_bit_buf->bit_pos + 1));
+
+      switch (sac_ext_type) {
+        case EXT_TYPE_0:
+          ixheaacd_parse_residual_data(pstr_mps_state);
+          break;
+
+        case EXT_TYPE_1:
+          switch (num_input_channels) {
+            case IN_CH_1:
+              channel_grouping[0] = 1;
+              break;
+            case IN_CH_2:
+              channel_grouping[0] = 2;
+              break;
+            case IN_CH_6:
+              channel_grouping[0] = 2;
+              channel_grouping[1] = 2;
+              channel_grouping[2] = 2;
+              break;
+            default:
+              return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_INPUT_CHANNEL;
+              break;
+          }
+
+          offset = num_ott_boxes + num_ttt_boxes;
+
+          p_res_mdct = pstr_mps_state->array_struct->res_mdct + offset * RFX2XMDCTCOEF;
+
+          for (ch = 0, gr = 0; ch < num_input_channels; ch += channel_grouping[gr++]) {
+            p_mdct_res = p_res_mdct;
+
+            temp = ixheaacd_read_bits_buf(mps_bit_buf, 2);
+            frame->bs_arbitrary_downmix_residual_abs[ch] = (temp >> 1) & ONE_BIT_MASK;
+            frame->bs_arbitrary_downmix_residual_alpha_update_set[ch] = temp & ONE_BIT_MASK;
+
+            if (channel_grouping[gr] == 1) {
+              for (fr = 0; fr < arbdmx_frames_per_spatial_frame; fr++) {
+                ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
+                                      aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+                if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
+                  ixheaacd_res_ctns_apply(
+                      pstr_mps_state->p_aac_decoder_channel_info[0],
+                      pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
+                      aac_tables_ptr);
+
+                pstr_mps_state->res_block_type[offset + ch][fr] =
+                    pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
+                for (i = 0; i < AAC_FRAME_LENGTH; i++) {
+                  *p_mdct_res++ =
+                      (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
+                }
+
+                if ((pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence ==
+                     EIGHT_SHORT_SEQUENCE) &&
+                    ((arbdmx_upd_qmf == UPD_QMF_18) || (arbdmx_upd_qmf == UPD_QMF_24) ||
+                     (arbdmx_upd_qmf == UPD_QMF_30))) {
+                  ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
+                                        1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+                  if (1 ==
+                      pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
+                    ixheaacd_res_ctns_apply(
+                        pstr_mps_state->p_aac_decoder_channel_info[0],
+                        pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
+                        aac_tables_ptr);
+                  for (i = 0; i < AAC_FRAME_LENGTH; i++) {
+                    *p_mdct_res++ = (pstr_mps_state->p_aac_decoder_channel_info[0]
+                                         ->p_spectral_coefficient[i]);
+                  }
+                }
+              }
+              p_res_mdct += RFX2XMDCTCOEF;
+            } else {
+              frame->bs_arbitrary_downmix_residual_abs[ch + 1] =
+                  frame->bs_arbitrary_downmix_residual_abs[ch];
+              frame->bs_arbitrary_downmix_residual_alpha_update_set[ch + 1] =
+                  frame->bs_arbitrary_downmix_residual_alpha_update_set[ch];
+
+              for (fr = 0; fr < arbdmx_frames_per_spatial_frame; fr++) {
+                WORD32 *res_mdct_1 = p_mdct_res + RFX2XMDCTCOEF;
+                WORD32 temp, win1, win2;
+                temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
+                temp = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+
+                if (temp != 0) {
+                  return IA_XHEAAC_MPS_DEC_EXE_FATAL_NONZERO_BIT;
+                }
+
+                ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
+                                      aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+
+                if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
+                  ixheaacd_res_ctns_apply(
+                      pstr_mps_state->p_aac_decoder_channel_info[0],
+                      pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
+                      aac_tables_ptr);
+                win1 = pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
+                pstr_mps_state->res_block_type[offset + ch][fr] =
+                    pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
+
+                for (i = 0; i < AAC_FRAME_LENGTH; i++) {
+                  *p_mdct_res++ =
+                      (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
+                }
+
+                ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info, 1,
+                                      aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+
+                if (1 == pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
+                  ixheaacd_res_ctns_apply(
+                      pstr_mps_state->p_aac_decoder_channel_info[0],
+                      pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
+                      aac_tables_ptr);
+                win2 = pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
+                for (i = 0; i < AAC_FRAME_LENGTH; i++) {
+                  *res_mdct_1++ =
+                      (pstr_mps_state->p_aac_decoder_channel_info[0]->p_spectral_coefficient[i]);
+                }
+
+                if (win1 != win2) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_WINDOW_SEQUENCE;
+
+                if ((win1 == EIGHT_SHORT_SEQUENCE) &&
+                    ((arbdmx_upd_qmf == UPD_QMF_18) || (arbdmx_upd_qmf == UPD_QMF_24) ||
+                     (arbdmx_upd_qmf == UPD_QMF_30))) {
+                  temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
+                  temp = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+
+                  if (temp != 0) {
+                    return IA_XHEAAC_MPS_DEC_EXE_FATAL_NONZERO_BIT;
+                  }
+
+                  ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
+                                        1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+
+                  if (1 ==
+                      pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
+                    ixheaacd_res_ctns_apply(
+                        pstr_mps_state->p_aac_decoder_channel_info[0],
+                        pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
+                        aac_tables_ptr);
+                  win1 = pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
+
+                  for (i = 0; i < AAC_FRAME_LENGTH; i++) {
+                    *p_mdct_res++ = (pstr_mps_state->p_aac_decoder_channel_info[0]
+                                         ->p_spectral_coefficient[i]);
+                  }
+
+                  ixheaacd_res_read_ics(mps_bit_buf, pstr_mps_state->p_aac_decoder_channel_info,
+                                        1, aac_tables_ptr, pstr_mps_state->tot_sf_bands_ls);
+
+                  if (1 ==
+                      pstr_mps_state->p_aac_decoder_channel_info[0]->tns_data.tns_data_present)
+                    ixheaacd_res_ctns_apply(
+                        pstr_mps_state->p_aac_decoder_channel_info[0],
+                        pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.max_sf_bands,
+                        aac_tables_ptr);
+                  win2 = pstr_mps_state->p_aac_decoder_channel_info[0]->ics_info.window_sequence;
+                  for (i = 0; i < AAC_FRAME_LENGTH; i++) {
+                    *res_mdct_1++ = (pstr_mps_state->p_aac_decoder_channel_info[0]
+                                         ->p_spectral_coefficient[i]);
+                  }
+
+                  if (win1 != win2) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_WINDOW_SEQUENCE;
+                }
+              }
+              p_res_mdct += RFX2XMDCTCOEF;
+            }
+          }
+
+          break;
+
+        case EXT_TYPE_2:
+          for (i = 0; i < p_bs_config->num_ott_boxes_at; i++) {
+            ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data,
+                                 frame->cmp_ott_cld_idx, frame->cmp_ott_cld_idx_prev, CLD,
+                                 num_ott_boxes + i, num_ott_boxes + i, 0,
+                                 p_bs_config->bs_ott_bands_at[i]);
+          }
+
+          break;
+
+        default:
+          return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_EXTENSION_TYPE;
+      }
+
+      bits_read =
+          (WORD32)(((mps_bit_buf->ptr_read_next - mps_bit_buf->ptr_bit_buf_base + 1) << 3) -
+                   (mps_bit_buf->bit_pos + 1) - tmp);
+      n_fill_bits = (sac_ext_len << 3) - bits_read;
+
+      while (n_fill_bits > 7) {
+        ixheaacd_read_bits_buf(mps_bit_buf, 8);
+        n_fill_bits -= 8;
+      }
+      if (n_fill_bits > 0) {
+        ixheaacd_read_bits_buf(mps_bit_buf, n_fill_bits);
+      }
+    }
+  }
+  return IA_NO_ERROR;
+}
+
+IA_ERRORCODE ixheaacd_parse_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
+
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 i, bs_framing_type, prev_param_slot, data_bands, bs_temp_shape_enable,
+      num_temp_shape_chan;
+  WORD32 ttt_off, ps, pg, ts, pb, temp;
+  WORD32 *bs_env_shape_data = pstr_mps_state->mps_scratch_mem_v;
+  WORD32 const *reciprocal_tab = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->reciprocal;
+  WORD32 num_parameter_sets;
+
+  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
+  ia_mps_dec_bitdec_tables_struct *bitdec_table =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
+  WORD32 bs_num_output_channels =
+      bitdec_table->tree_property_table[pstr_mps_state->tree_config].num_output_channels;
+
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 bitstream_parameter_bands = pstr_mps_state->bitstream_parameter_bands;
+  WORD32 *b_ott_bands = pstr_mps_state->bitstream_ott_bands;
+  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
+
+  WORD32 num_ott_boxes = pstr_mps_state->num_ott_boxes;
+
+  WORD32 reciprocal, alignment_bits = 0;
+  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
+
+  if (pstr_mps_state->parse_next_bitstream_frame == 0) return IA_NO_ERROR;
+
+  temp = ixheaacd_read_bits_buf(mps_bit_buf, 4);
+  bs_framing_type = (temp >> 3) & ONE_BIT_MASK;
+  num_parameter_sets = (temp & THREE_BIT_MASK) + 1;
+  pstr_mps_state->num_parameter_sets = num_parameter_sets;
+
+  reciprocal = reciprocal_tab[num_parameter_sets - 1];
+
+  prev_param_slot = -1;
+  for (i = 0; i < num_parameter_sets; i++) {
+    if (bs_framing_type) {
+      WORD32 bits_param_slot = 0;
+      while ((1 << bits_param_slot) < (time_slots - num_parameter_sets + i - prev_param_slot))
+        bits_param_slot++;
+      param_slot[i] =
+          bits_param_slot
+              ? prev_param_slot + 1 + ixheaacd_read_bits_buf(mps_bit_buf, bits_param_slot)
+              : prev_param_slot + 1;
+      prev_param_slot = param_slot[i];
+    } else {
+      WORD64 temp = (WORD64)(
+          ((WORD64)((time_slots * (i + 1)) + num_parameter_sets - 1) * (WORD64)reciprocal) >> 28);
+      param_slot[i] = (WORD32)(temp - 1);
+    }
+  }
+  frame->bs_independency_flag = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+
+  for (i = 0; i < num_ott_boxes; i++) {
+    ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data, frame->cmp_ott_cld_idx,
+                         frame->cmp_ott_cld_idx_prev, CLD, i, i, 0, b_ott_bands[i]);
+  }
+  if (pstr_mps_state->one_icc) {
+    ixheaacd_ec_data_dec(pstr_mps_state, &frame->icc_lossless_data, frame->cmp_ott_icc_idx,
+                         frame->cmp_ott_icc_idx_prev, ICC, 0, 0, 0, bitstream_parameter_bands);
+  } else {
+    for (i = 0; i < num_ott_boxes; i++) {
+      if (!pstr_mps_state->ott_mode_lfe[i]) {
+        ixheaacd_ec_data_dec(pstr_mps_state, &frame->icc_lossless_data, frame->cmp_ott_icc_idx,
+                             frame->cmp_ott_icc_idx_prev, ICC, i, i, 0, b_ott_bands[i]);
+      }
+    }
+  }
+
+  ttt_off = num_ott_boxes;
+  for (i = 0; i < pstr_mps_state->num_ttt_boxes; i++) {
+    if (p_aux_struct->ttt_config[0][i].mode < 2) {
+      ixheaacd_ec_data_dec(pstr_mps_state, &frame->cpc_lossless_data, frame->cmp_ttt_cpc_1_idx,
+                           frame->cmp_ttt_cpc_1_idx_prev, CPC, i, ttt_off + 4 * i,
+                           p_aux_struct->ttt_config[0][i].bitstream_start_band,
+                           p_aux_struct->ttt_config[0][i].bitstream_stop_band);
+      ixheaacd_ec_data_dec(pstr_mps_state, &frame->cpc_lossless_data, frame->cmp_ttt_cpc_2_idx,
+                           frame->cmp_ttt_cpc_2_idx_prev, CPC, i, ttt_off + 4 * i + 1,
+                           p_aux_struct->ttt_config[0][i].bitstream_start_band,
+                           p_aux_struct->ttt_config[0][i].bitstream_stop_band);
+      ixheaacd_ec_data_dec(pstr_mps_state, &frame->icc_lossless_data, frame->cmp_ttt_icc_idx,
+                           frame->cmp_ttt_icc_idx_prev, ICC, i, ttt_off + 4 * i,
+                           p_aux_struct->ttt_config[0][i].bitstream_start_band,
+                           p_aux_struct->ttt_config[0][i].bitstream_stop_band);
+    } else {
+      ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data, frame->cmp_ttt_cld_1_idx,
+                           frame->cmp_ttt_cld_1_idx_prev, CLD, i, ttt_off + 4 * i,
+                           p_aux_struct->ttt_config[0][i].bitstream_start_band,
+                           p_aux_struct->ttt_config[0][i].bitstream_stop_band);
+      ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data, frame->cmp_ttt_cld_2_idx,
+                           frame->cmp_ttt_cld_2_idx_prev, CLD, i, ttt_off + 4 * i + 1,
+                           p_aux_struct->ttt_config[0][i].bitstream_start_band,
+                           p_aux_struct->ttt_config[0][i].bitstream_stop_band);
+    }
+
+    if (p_aux_struct->ttt_config[1][i].bitstream_start_band <
+        p_aux_struct->ttt_config[1][i].bitstream_stop_band) {
+      if (p_aux_struct->ttt_config[1][i].mode < 2) {
+        ixheaacd_ec_data_dec(pstr_mps_state, &frame->cpc_lossless_data, frame->cmp_ttt_cpc_1_idx,
+                             frame->cmp_ttt_cpc_1_idx_prev, CPC, i, ttt_off + 4 * i + 2,
+                             p_aux_struct->ttt_config[1][i].bitstream_start_band,
+                             p_aux_struct->ttt_config[1][i].bitstream_stop_band);
+        ixheaacd_ec_data_dec(pstr_mps_state, &frame->cpc_lossless_data, frame->cmp_ttt_cpc_2_idx,
+                             frame->cmp_ttt_cpc_2_idx_prev, CPC, i, ttt_off + 4 * i + 3,
+                             p_aux_struct->ttt_config[1][i].bitstream_start_band,
+                             p_aux_struct->ttt_config[1][i].bitstream_stop_band);
+        ixheaacd_ec_data_dec(pstr_mps_state, &frame->icc_lossless_data, frame->cmp_ttt_icc_idx,
+                             frame->cmp_ttt_icc_idx_prev, ICC, i, ttt_off + 4 * i + 2,
+                             p_aux_struct->ttt_config[1][i].bitstream_start_band,
+                             p_aux_struct->ttt_config[1][i].bitstream_stop_band);
+      } else {
+        ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data, frame->cmp_ttt_cld_1_idx,
+                             frame->cmp_ttt_cld_1_idx_prev, CLD, i, ttt_off + 4 * i + 2,
+                             p_aux_struct->ttt_config[1][i].bitstream_start_band,
+                             p_aux_struct->ttt_config[1][i].bitstream_stop_band);
+        ixheaacd_ec_data_dec(pstr_mps_state, &frame->cld_lossless_data, frame->cmp_ttt_cld_2_idx,
+                             frame->cmp_ttt_cld_2_idx_prev, CLD, i, ttt_off + 4 * i + 3,
+                             p_aux_struct->ttt_config[1][i].bitstream_start_band,
+                             p_aux_struct->ttt_config[1][i].bitstream_stop_band);
+      }
+    }
+  }
+
+  frame->bs_smooth_control = 1;
+
+  if (frame->bs_smooth_control) {
+    for (ps = 0; ps < num_parameter_sets; ps++) {
+      frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(mps_bit_buf, 2);
+      if (frame->bs_smooth_mode[ps] > 3 || frame->bs_smooth_mode[ps] < 0) {
+        return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_SMOOTH_MODE;
+      }
+      if (frame->bs_smooth_mode[ps] >= 2) {
+        frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(mps_bit_buf, 2);
+      }
+      if (frame->bs_smooth_mode[ps] == 3) {
+        frame->bs_freq_res_stride_smg[ps] = ixheaacd_read_bits_buf(mps_bit_buf, 2);
+        data_bands = (bitstream_parameter_bands - 1) /
+                         bitdec_table->pb_stride_table[frame->bs_freq_res_stride_smg[ps]] +
+                     1;
+        for (pg = 0; pg < data_bands; pg++) {
+          frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+        }
+      }
+    }
+  }
+
+  for (i = 0; i < bs_num_output_channels; i++) {
+    p_aux_struct->temp_shape_enable_channel_stp[i] = 0;
+    p_aux_struct->temp_shape_enable_channel_ges[i] = 0;
+  }
+
+  if (p_bs_config->bs_temp_shape_config != 0) {
+    bs_temp_shape_enable = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+    if (bs_temp_shape_enable) {
+      num_temp_shape_chan =
+          bitdec_table->temp_shape_chan_table[p_bs_config->bs_temp_shape_config - 1]
+                                             [p_bs_config->bs_tree_config];
+      switch (pstr_mps_state->temp_shape_config) {
+        case 1:
+          for (i = 0; i < num_temp_shape_chan; i++) {
+            p_aux_struct->temp_shape_enable_channel_stp[i] =
+                ixheaacd_read_bits_buf(mps_bit_buf, 1);
+          }
+          break;
+        case 2:
+          for (i = 0; i < num_temp_shape_chan; i++) {
+            p_aux_struct->temp_shape_enable_channel_ges[i] =
+                ixheaacd_read_bits_buf(mps_bit_buf, 1);
+          }
+          for (i = 0; i < num_temp_shape_chan; i++) {
+            if (p_aux_struct->temp_shape_enable_channel_ges[i]) {
+              WORD32 const *envshape_data =
+                  &bitdec_table->envshape_data[pstr_mps_state->env_quant_mode][0];
+              ixheaacd_mps_huff_decode(mps_bit_buf, bs_env_shape_data, time_slots);
+              for (ts = 0; ts < time_slots; ts++) {
+                p_aux_struct->env_shape_data[i][ts] = envshape_data[bs_env_shape_data[ts]];
+              }
+            }
+          }
+          break;
+        default:
+          return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TEMPORAL_SHAPING_CONFIG;
+      }
+    }
+  }
+
+  if (pstr_mps_state->up_mix_type == 2) {
+    for (i = 0; i < bs_num_output_channels; i++) {
+      p_aux_struct->temp_shape_enable_channel_stp[i] = 0;
+      p_aux_struct->temp_shape_enable_channel_ges[i] = 0;
+    }
+  }
+
+  if (pstr_mps_state->arbitrary_downmix != 0) {
+    ixheaacd_parse_arbitrary_downmix_data(pstr_mps_state);
+  }
+
+  ixheaacd_byte_align(mps_bit_buf, &alignment_bits);
+  ixheaacd_parse_extension_frame(pstr_mps_state);
+
+  for (i = 0; i < num_ott_boxes; i++) {
+    for (ps = 0; ps < num_parameter_sets; ps++) {
+      if (!frame->res_data.bs_icc_diff_present[i][ps] || (pstr_mps_state->up_mix_type == 2) ||
+          (pstr_mps_state->up_mix_type == 3)) {
+        for (pb = 0; pb < bitstream_parameter_bands; pb++) {
+          pstr_mps_state->bs_frame->ott_icc_diff_idx[i][ps][pb] = 0;
+        }
+      }
+    }
+  }
+
+  pstr_mps_state->parse_next_bitstream_frame = 1;
+
+  return IA_NO_ERROR;
+}
+
+static VOID ixheaacd_create_mapping(WORD32 a_map[MAX_PARAMETER_BANDS + 1], WORD32 start_band,
+                                    WORD32 stop_band, WORD32 stride, VOID *scratch) {
+  WORD32 in_bands, out_bands, bands_achived, bands_diff, incr, k, i;
+  WORD32 *v_dk;
+  in_bands = stop_band - start_band;
+  out_bands = (in_bands - 1) / stride + 1;
+  v_dk = scratch;
+  if (out_bands < 1) {
+    out_bands = 1;
+  }
+
+  bands_achived = out_bands * stride;
+  bands_diff = in_bands - bands_achived;
+  for (i = 0; i < out_bands; i++) {
+    v_dk[i] = stride;
+  }
+
+  if (bands_diff > 0) {
+    incr = -1;
+    k = out_bands - 1;
+  } else {
+    incr = 1;
+    k = 0;
+  }
+
+  while (bands_diff != 0) {
+    v_dk[k] = v_dk[k] - incr;
+    k = k + incr;
+    bands_diff = bands_diff + incr;
+    if (k >= out_bands) {
+      if (bands_diff > 0) {
+        k = out_bands - 1;
+      } else if (bands_diff < 0) {
+        k = 0;
+      }
+    }
+  }
+  a_map[0] = start_band;
+  for (i = 0; i < out_bands; i++) {
+    a_map[i + 1] = a_map[i] + v_dk[i];
+  }
+}
+
+static VOID ixheaacd_map_frequency(WORD32 *p_input, WORD32 *p_output, WORD32 *p_map,
+                                   WORD32 data_bands) {
+  WORD32 i, j, start_band, stop_band, value;
+  WORD32 start_band_0 = p_map[0];
+
+  for (i = 0; i < data_bands; i++) {
+    value = p_input[i + start_band_0];
+
+    start_band = p_map[i];
+    stop_band = p_map[i + 1];
+    for (j = start_band; j < stop_band; j++) {
+      p_output[j] = value;
+    }
+  }
+}
+
+static IA_ERRORCODE ixheaacd_deq_coarse(
+    WORD32 value, WORD32 param_type, WORD32 *dequant,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  switch (param_type) {
+    case CLD:
+      if (value >= 8 || value < -7) return IA_FATAL_ERROR;
+      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_cld_coarse[value + 7];
+      break;
+
+    case ICC:
+      if (value >= 8 || value < 0) return IA_FATAL_ERROR;
+      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_icc[value];
+      break;
+
+    case CPC:
+      if (value >= 16 || value < -10) return IA_FATAL_ERROR;
+      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_cpc_coarse[value + 10];
+      break;
+    default:
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_DEQUANT_PARAM;
+  }
+  return IA_NO_ERROR;
+}
+
+static IA_ERRORCODE ia_mps_dec_deq(
+    WORD32 value, WORD32 param_type, WORD32 *dequant,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  switch (param_type) {
+    case CLD:
+      if (value >= 16 || value < -15) return IA_FATAL_ERROR;
+      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_cld[value + 15];
+      break;
+
+    case ICC:
+      if (value >= 8 || value < 0) return IA_FATAL_ERROR;
+      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_icc[value];
+      break;
+
+    case CPC:
+      if (value >= 32 || value < -20) return IA_FATAL_ERROR;
+      *dequant = ixheaacd_mps_dec_bitdec_tables->dequant_cpc[value + 20];
+      break;
+
+    default:
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_DEQUANT_PARAM;
+  }
+  return IA_NO_ERROR;
+}
+
+static IA_ERRORCODE ixheaacd_factor_funct(WORD32 ott_vs_tot_db, WORD32 quant_mode,
+                                          WORD32 *factor) {
+  WORD32 db_diff;
+  WORD32 x_linear = 0;
+
+  WORD32 maxfactor = 0;
+  WORD32 constfact;
+
+  if (ott_vs_tot_db > 0) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_MPS_PARAM;
+  db_diff = -ott_vs_tot_db;
+
+  switch (quant_mode) {
+    case QUANT_MODE_0:
+      return (ONE_IN_Q25);
+      break;
+    case QUANT_MODE_1:
+      x_linear = 1024;
+
+      maxfactor = 167772160;
+      constfact = 6554;
+      break;
+    case QUANT_MODE_2:
+      x_linear = 1024;
+
+      maxfactor = ONE_IN_Q28;
+      constfact = 9557;
+      break;
+    default:
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_QUANT_MODE;
+  }
+
+  if (db_diff > (x_linear << 5)) {
+    WORD32 db_diff_fix = db_diff >> 5;
+    *factor = (db_diff_fix - (WORD32)x_linear) * constfact + ONE_IN_Q25;
+  } else {
+    *factor = ONE_IN_Q25;
+  }
+
+  *factor = min(maxfactor, *factor);
+  return IA_NO_ERROR;
+}
+
+static VOID ixheaacd_factor_cld(WORD32 *idx, WORD32 ott_vs_tot_db, WORD32 *ott_vs_tot_db_1,
+                                WORD32 *ott_vs_tot_db_2, WORD32 quant_mode,
+                                ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  WORD32 factor = 0;
+  WORD32 c1;
+  WORD32 c2;
+  WORD32 cld_idx;
+
+  ixheaacd_factor_funct(ott_vs_tot_db, quant_mode, &factor);
+
+  cld_idx = (((*idx * factor) + THIRTYONE_BY_TWO_IN_Q25) >> 25);
+  cld_idx -= 15;
+
+  cld_idx = min(cld_idx, 15);
+  cld_idx = max(cld_idx, -15);
+
+  *idx = cld_idx;
+
+  c1 = ixheaacd_mps_dec_bitdec_tables->factor_cld_tab_1[*idx + 15];
+  c2 = ixheaacd_mps_dec_bitdec_tables->factor_cld_tab_1[15 - *idx];
+
+  *ott_vs_tot_db_1 = c1 + ott_vs_tot_db;
+  *ott_vs_tot_db_2 = c2 + ott_vs_tot_db;
+}
+
+static IA_ERRORCODE ixheaacd_map_index_data(
+    ia_mps_dec_lossless_data_struct *ll_data,
+    WORD32 output_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
+    WORD32 output_idx_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
+    WORD32 cmp_idx_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS],
+    WORD32 diff_idx_data[][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], WORD32 xtt_idx,
+    WORD32 idx_prev[MAX_NUM_OTT][MAX_PARAMETER_BANDS], WORD32 param_idx, WORD32 param_type,
+    WORD32 start_band, WORD32 stop_band, WORD32 default_value, WORD32 num_parameter_sets,
+    WORD32 *param_slot, WORD32 extend_frame, WORD32 quant_mode, WORD32 *ott_vs_tot_db_in,
+    WORD32 *ott_vs_tot_db_1, WORD32 *ott_vs_tot_db_2,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables, VOID *scratch) {
+  WORD32 *a_param_slots;
+  WORD32 *a_interpolate;
+
+  WORD32 data_sets;
+  WORD32 *a_map;
+  VOID *free_scratch;
+
+  WORD32 set_idx, i, band, parm_slot;
+  WORD32 data_bands, stride;
+  WORD32 ps, pb;
+
+  WORD32 i1, i2, x1, xi, x2;
+  WORD32 *db_in;
+  WORD32 *db_1, *db_2;
+  db_in = ott_vs_tot_db_in;
+  db_1 = ott_vs_tot_db_1;
+  db_2 = ott_vs_tot_db_2;
+  a_param_slots = scratch;
+  a_interpolate = a_param_slots + MAX_PARAMETER_SETS;
+  a_map = a_interpolate + MAX_PARAMETER_SETS;
+  free_scratch = a_map + MAX_PARAMETER_BANDS_PLUS_1;
+
+  data_sets = 0;
+  for (i = 0; i < num_parameter_sets; i++) {
+    if (ll_data->bs_xxx_data_mode[param_idx][i] == 3) {
+      a_param_slots[data_sets] = i;
+      data_sets++;
+    }
+  }
+
+  set_idx = 0;
+
+  for (i = 0; i < num_parameter_sets; i++) {
+    if (ll_data->bs_xxx_data_mode[param_idx][i] == 0) {
+      ll_data->no_cmp_quant_coarse_xxx[param_idx][i] = 0;
+      for (band = start_band; band < stop_band; band++) {
+        output_idx_data[xtt_idx][i][band] = default_value;
+      }
+      for (band = start_band; band < stop_band; band++) {
+        idx_prev[xtt_idx][band] = output_idx_data[xtt_idx][i][band];
+      }
+    }
+
+    if (ll_data->bs_xxx_data_mode[param_idx][i] == 1) {
+      for (band = start_band; band < stop_band; band++) {
+        output_idx_data[xtt_idx][i][band] = idx_prev[xtt_idx][band];
+      }
+      ll_data->no_cmp_quant_coarse_xxx[param_idx][i] =
+          ll_data->bs_quant_coarse_xxx_prev[param_idx];
+    }
+
+    if (ll_data->bs_xxx_data_mode[param_idx][i] == 2) {
+      for (band = start_band; band < stop_band; band++) {
+        output_idx_data[xtt_idx][i][band] = idx_prev[xtt_idx][band];
+      }
+      a_interpolate[i] = 1;
+    } else {
+      a_interpolate[i] = 0;
+    }
+
+    if (ll_data->bs_xxx_data_mode[param_idx][i] == 3) {
+      parm_slot = a_param_slots[set_idx];
+      stride = ixheaacd_mps_dec_bitdec_tables
+                   ->pb_stride_table[ll_data->bs_freq_res_stride_xxx[param_idx][set_idx]];
+      data_bands = (stop_band - start_band - 1) / stride + 1;
+      ixheaacd_create_mapping(a_map, start_band, stop_band, stride, free_scratch);
+      ixheaacd_map_frequency(&cmp_idx_data[xtt_idx][set_idx][0],
+                             &output_idx_data[xtt_idx][parm_slot][0], a_map, data_bands);
+
+      for (band = start_band; band < stop_band; band++) {
+        idx_prev[xtt_idx][band] = output_idx_data[xtt_idx][parm_slot][band];
+      }
+
+      ll_data->bs_quant_coarse_xxx_prev[param_idx] =
+          ll_data->bs_quant_coarse_xxx[param_idx][set_idx];
+      ll_data->no_cmp_quant_coarse_xxx[param_idx][i] =
+          ll_data->bs_quant_coarse_xxx[param_idx][set_idx];
+
+      set_idx++;
+    }
+
+    if (diff_idx_data != NULL) {
+      for (band = start_band; band < stop_band; band++) {
+        output_idx_data[xtt_idx][i][band] += diff_idx_data[xtt_idx][i][band];
+      }
+    }
+  }
+
+  for (i = 0; i < num_parameter_sets; i++) {
+    if (a_interpolate[i] != 1) {
+      if (ll_data->no_cmp_quant_coarse_xxx[param_idx][i] == 1) {
+        for (band = start_band; band < stop_band; band++) {
+          ixheaacd_deq_coarse(output_idx_data[xtt_idx][i][band], param_type,
+                              &(output_data[xtt_idx][i][band]), ixheaacd_mps_dec_bitdec_tables);
+        }
+      } else {
+        for (band = start_band; band < stop_band; band++) {
+          ia_mps_dec_deq(output_idx_data[xtt_idx][i][band], param_type,
+                         &(output_data[xtt_idx][i][band]), ixheaacd_mps_dec_bitdec_tables);
+        }
+      }
+    }
+  }
+
+  if (quant_mode && (param_type == CLD)) {
+    if (db_in == 0 || db_1 == 0 || db_2 == 0)
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_MPS_PARAM;
+
+    for (ps = 0; ps < num_parameter_sets; ps++) {
+      if (a_interpolate[ps] != 1) {
+        if (ll_data->no_cmp_quant_coarse_xxx[param_idx][ps]) {
+          ixheaacd_coarse_2_fine(output_idx_data[xtt_idx][ps], param_type, start_band,
+                                 stop_band - start_band);
+        }
+        for (pb = start_band; pb < stop_band; pb++) {
+          ll_data->no_cmp_quant_coarse_xxx[param_idx][ps] = 1;
+          ixheaacd_factor_cld(&(output_idx_data[xtt_idx][ps][pb]), *db_in++, &(*db_1++),
+                              &(*db_2++), quant_mode, ixheaacd_mps_dec_bitdec_tables);
+          ia_mps_dec_deq(output_idx_data[xtt_idx][ps][pb], param_type,
+                         &(output_data[xtt_idx][ps][pb]), ixheaacd_mps_dec_bitdec_tables);
+        }
+      }
+    }
+  }
+
+  i1 = 0;
+  x1 = 0;
+  i2 = 0;
+  for (i = 0; i < num_parameter_sets; i++) {
+    if (a_interpolate[i] != 1) {
+      i1 = i;
+    }
+    i2 = i;
+    while (a_interpolate[i2] == 1) {
+      i2++;
+    }
+    x1 = param_slot[i1];
+    xi = param_slot[i];
+    x2 = param_slot[i2];
+
+    if (a_interpolate[i] == 1) {
+      if (i2 >= num_parameter_sets) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_PARAMETER_SETS;
+      if (ll_data->no_cmp_quant_coarse_xxx[param_idx][i1]) {
+        ixheaacd_coarse_2_fine(output_idx_data[xtt_idx][i1], param_type, start_band,
+                               stop_band - start_band);
+      }
+      if (ll_data->no_cmp_quant_coarse_xxx[param_idx][i2]) {
+        ixheaacd_coarse_2_fine(output_idx_data[xtt_idx][i2], param_type, start_band,
+                               stop_band - start_band);
+      }
+      for (band = start_band; band < stop_band; band++) {
+        WORD32 yi = 0, y1, y2;
+        y1 = output_idx_data[xtt_idx][i1][band];
+        y2 = output_idx_data[xtt_idx][i2][band];
+
+        if (x2 != x1) {
+          yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
+        }
+        output_idx_data[xtt_idx][i][band] = yi;
+        ia_mps_dec_deq(output_idx_data[xtt_idx][i][band], param_type,
+                       &(output_data[xtt_idx][i][band]), ixheaacd_mps_dec_bitdec_tables);
+      }
+    }
+  }
+
+  if (extend_frame) {
+    for (band = start_band; band < stop_band; band++) {
+      output_data[xtt_idx][num_parameter_sets][band] =
+          output_data[xtt_idx][num_parameter_sets - 1][band];
+      output_idx_data[xtt_idx][num_parameter_sets][band] =
+          output_idx_data[xtt_idx][num_parameter_sets - 1][band];
+    }
+  }
+  return IA_NO_ERROR;
+}
+
+static VOID ixheaacd_get_parameters_mapping(
+    WORD32 bs_parameter_bands, WORD32 *mapping,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  switch (bs_parameter_bands) {
+    case PARAMETER_BANDS_4:
+      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_4_to_28;
+      break;
+    case PARAMETER_BANDS_5:
+      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_5_to_28;
+      break;
+    case PARAMETER_BANDS_7:
+      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_7_to_28;
+      break;
+    case PARAMETER_BANDS_10:
+      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_10_to_28;
+      break;
+    case PARAMETER_BANDS_14:
+      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_14_to_28;
+      break;
+    case PARAMETER_BANDS_20:
+      mapping = ixheaacd_mps_dec_bitdec_tables->map_table.mapping_20_to_28;
+      break;
+    case PARAMETER_BANDS_28:
+      break;
+    default:
+      break;
+  }
+  return;
+}
+
+static VOID ixheaacd_map_number_of_bands_to_28_bands(
+    WORD32 bands, WORD32 bs_parameter_bands, WORD32 *bands28,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  WORD32 *mapping = NULL;
+  WORD32 pb;
+
+  *bands28 = bands;
+
+  ixheaacd_get_parameters_mapping(bs_parameter_bands, mapping, ixheaacd_mps_dec_bitdec_tables);
+
+  if (mapping != NULL) {
+    for (pb = 0; pb < MAX_PARAMETER_BANDS; pb++) {
+      if (mapping[pb] == bands) {
+        break;
+      }
+    }
+    *bands28 = pb;
+  }
+  return;
+}
+
+static VOID ixheaacd_map_data_to_28_bands(
+    WORD32 *data, WORD32 bs_parameter_bands,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  WORD32 *mapping = NULL;
+  WORD32 pb;
+
+  ixheaacd_get_parameters_mapping(bs_parameter_bands, mapping, ixheaacd_mps_dec_bitdec_tables);
+
+  if (mapping != NULL) {
+    for (pb = MAX_PARAMETER_BANDS - 1; pb >= 0; pb--) {
+      data[pb] = data[mapping[pb]];
+    }
+  }
+  return;
+}
+
+static VOID ixheaacd_decode_and_map_frame_ott(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_bitdec_tables_struct *bitdec_table =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
+  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
+
+  WORD32 i, num_parameter_sets, ott_idx, band;
+  WORD32 num_ott_boxes;
+  VOID *free_scratch;
+
+  WORD32 ps, pb;
+
+  WORD32 *tot_db;
+  WORD32 *ott_vs_tot_db_fc;
+  WORD32 *ott_vs_tot_db_s;
+  WORD32 *ott_vs_tot_db_f;
+  WORD32 *ott_vs_tot_db_c;
+  WORD32 *ott_vs_tot_db_lr;
+  WORD32 *ott_vs_tot_db_l;
+  WORD32 *ott_vs_tot_db_r;
+  WORD32 *tmp1;
+  WORD32 *tmp2;
+
+  WORD32 bitstream_parameter_bands = curr_state->bitstream_parameter_bands;
+  WORD32 *b_ott_bands = curr_state->bitstream_ott_bands;
+  WORD32 *ott_cld_default = curr_state->ott_cld_default;
+  WORD32 parameter_sets = curr_state->num_parameter_sets;
+  WORD32 extend_frame = curr_state->extend_frame;
+  WORD32 quant_mode = curr_state->quant_mode;
+
+  tot_db = pstr_mps_state->mps_scratch_mem_v;
+  ott_vs_tot_db_fc = tot_db + MAX_PSXPB;
+  ott_vs_tot_db_s = ott_vs_tot_db_fc + MAX_PSXPB;
+  ott_vs_tot_db_f = ott_vs_tot_db_s + MAX_PSXPB;
+  ott_vs_tot_db_c = ott_vs_tot_db_f + MAX_PSXPB;
+  ott_vs_tot_db_lr = ott_vs_tot_db_c + MAX_PSXPB;
+  ott_vs_tot_db_l = ott_vs_tot_db_lr + MAX_PSXPB;
+  ott_vs_tot_db_r = ott_vs_tot_db_l + MAX_PSXPB;
+  tmp1 = ott_vs_tot_db_r + MAX_PSXPB;
+  tmp2 = tmp1 + MAX_PSXPB;
+  free_scratch = tmp2 + MAX_PSXPB;
+
+  p_cur_bs = pstr_mps_state->bs_frame;
+  num_ott_boxes = curr_state->num_ott_boxes;
+
+  pb = MAX_PSXPB;
+  for (i = 0; i < pb; i++) tot_db[i] = 0;
+
+  switch (curr_state->tree_config) {
+    case TREE_5151:
+      i = 0;
+
+      ixheaacd_map_index_data(
+          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
+          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
+          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+          quant_mode, tot_db, ott_vs_tot_db_fc, ott_vs_tot_db_s, bitdec_table, free_scratch);
+
+      i = 1;
+
+      ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+                              p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
+                              p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
+                              ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+                              quant_mode, ott_vs_tot_db_fc, ott_vs_tot_db_f, ott_vs_tot_db_c,
+                              bitdec_table, free_scratch);
+
+      i = 2;
+      ixheaacd_map_index_data(
+          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
+          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
+          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+          quant_mode, ott_vs_tot_db_s, tmp1, tmp2, bitdec_table, free_scratch);
+
+      i = 3;
+      ixheaacd_map_index_data(
+          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
+          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
+          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+          quant_mode, ott_vs_tot_db_f, tmp1, tmp2, bitdec_table, free_scratch);
+
+      i = 4;
+      ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+                              p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
+                              p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
+                              ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+                              quant_mode, tot_db, tmp1, tmp2, bitdec_table, free_scratch);
+
+      break;
+
+    case TREE_5152:
+      i = 0;
+      ixheaacd_map_index_data(
+          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
+          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
+          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+          quant_mode, tot_db, ott_vs_tot_db_lr, ott_vs_tot_db_c, bitdec_table, free_scratch);
+      i = 1;
+      ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+                              p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
+                              p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
+                              ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+                              quant_mode, ott_vs_tot_db_lr, ott_vs_tot_db_l, ott_vs_tot_db_r,
+                              bitdec_table, free_scratch);
+      i = 2;
+      ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+                              p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
+                              p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
+                              ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+                              quant_mode, tot_db, tmp1, tmp2, bitdec_table, free_scratch);
+      i = 3;
+      ixheaacd_map_index_data(
+          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
+          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
+          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+          quant_mode, ott_vs_tot_db_l, tmp1, tmp2, bitdec_table, free_scratch);
+      i = 4;
+      ixheaacd_map_index_data(
+          &p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld, p_cur_bs->ott_cld_idx,
+          p_cur_bs->cmp_ott_cld_idx, NULL, i, p_cur_bs->ott_cld_idx_prev, i, CLD, 0,
+          b_ott_bands[i], ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+          quant_mode, ott_vs_tot_db_r, tmp1, tmp2, bitdec_table, free_scratch);
+      break;
+
+    default:
+      for (i = 0; i < num_ott_boxes; i++) {
+        ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+                                p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, i,
+                                p_cur_bs->ott_cld_idx_prev, i, CLD, 0, b_ott_bands[i],
+                                ott_cld_default[i], parameter_sets, param_slot, extend_frame,
+                                (curr_state->tree_config == TREE_525) ? 0 : quant_mode, NULL,
+                                NULL, NULL, bitdec_table, free_scratch);
+      }
+      break;
+  }
+
+  if (curr_state->one_icc == 1) {
+    if (extend_frame == 0) {
+      num_parameter_sets = parameter_sets;
+    } else {
+      num_parameter_sets = parameter_sets + 1;
+    }
+
+    for (ott_idx = 1; ott_idx < num_ott_boxes; ott_idx++) {
+      if (curr_state->ott_mode_lfe[ott_idx] == 0) {
+        for (i = 0; i < num_parameter_sets; i++) {
+          for (band = 0; band < bitstream_parameter_bands; band++) {
+            p_cur_bs->cmp_ott_icc_idx[ott_idx][i][band] = p_cur_bs->cmp_ott_icc_idx[0][i][band];
+          }
+        }
+      }
+    }
+
+    for (ott_idx = 0; ott_idx < num_ott_boxes; ott_idx++) {
+      if (curr_state->ott_mode_lfe[ott_idx] == 0) {
+        ixheaacd_map_index_data(&p_cur_bs->icc_lossless_data, p_aux_struct->ott_icc,
+                                p_cur_bs->ott_icc_idx, p_cur_bs->cmp_ott_icc_idx,
+                                p_cur_bs->ott_icc_diff_idx, ott_idx, p_cur_bs->ott_icc_idx_prev,
+                                0, ICC, 0, b_ott_bands[ott_idx], curr_state->icc_default,
+                                parameter_sets, param_slot, extend_frame, quant_mode, NULL, NULL,
+                                NULL, bitdec_table, free_scratch);
+      }
+    }
+  } else {
+    for (ott_idx = 0; ott_idx < num_ott_boxes; ott_idx++) {
+      if (curr_state->ott_mode_lfe[ott_idx] == 0) {
+        ixheaacd_map_index_data(&p_cur_bs->icc_lossless_data, p_aux_struct->ott_icc,
+                                p_cur_bs->ott_icc_idx, p_cur_bs->cmp_ott_icc_idx,
+                                p_cur_bs->ott_icc_diff_idx, ott_idx, p_cur_bs->ott_icc_idx_prev,
+                                ott_idx, ICC, 0, b_ott_bands[ott_idx], curr_state->icc_default,
+                                parameter_sets, param_slot, extend_frame, quant_mode, NULL, NULL,
+                                NULL, bitdec_table, free_scratch);
+      }
+    }
+  }
+
+  if (curr_state->up_mix_type == 2) {
+    WORD32 num_parameter_sets = parameter_sets;
+
+    if (extend_frame) {
+      num_parameter_sets++;
+    }
+
+    for (ott_idx = 0; ott_idx < curr_state->num_ott_boxes; ott_idx++) {
+      for (ps = 0; ps < num_parameter_sets; ps++) {
+        ixheaacd_map_data_to_28_bands(p_aux_struct->ott_cld[ott_idx][ps],
+                                      bitstream_parameter_bands, bitdec_table);
+        ixheaacd_map_data_to_28_bands(p_aux_struct->ott_icc[ott_idx][ps],
+                                      bitstream_parameter_bands, bitdec_table);
+      }
+    }
+  }
+  return;
+}
+
+static VOID ixheaacd_decode_and_map_frame_ttt(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+  ia_mps_dec_bitdec_tables_struct *bitdec_table =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
+
+  WORD32 num_bands;
+
+  WORD32 i, j, offset;
+  WORD32 num_ttt_boxes;
+  VOID *free_scratch;
+
+  p_cur_bs = pstr_mps_state->bs_frame;
+  num_bands = pstr_mps_state->bitstream_parameter_bands;
+  offset = pstr_mps_state->num_ott_boxes;
+  num_ttt_boxes = pstr_mps_state->num_ttt_boxes;
+  free_scratch = pstr_mps_state->mps_scratch_mem_v;
+
+  for (i = 0; i < num_ttt_boxes; i++) {
+    for (j = 0;
+         (j < 2) &&
+         p_aux_struct->ttt_config[j][i].start_band < p_aux_struct->ttt_config[j][i].stop_band;
+         j++) {
+      if (p_aux_struct->ttt_config[j][i].mode < 2) {
+        ixheaacd_map_index_data(
+            &p_cur_bs->cpc_lossless_data, p_aux_struct->ttt_cpc_1, p_cur_bs->ttt_cpc_1_idx,
+            p_cur_bs->cmp_ttt_cpc_1_idx, NULL, i, p_cur_bs->ttt_cpc_1_idx_prev,
+            offset + 4 * i + 2 * j, CPC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
+            p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->cpc_default,
+            pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
+            pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
+
+        ixheaacd_map_index_data(
+            &p_cur_bs->cpc_lossless_data, p_aux_struct->ttt_cpc_2, p_cur_bs->ttt_cpc_2_idx,
+            p_cur_bs->cmp_ttt_cpc_2_idx, NULL, i, p_cur_bs->ttt_cpc_2_idx_prev,
+            offset + 4 * i + 1 + 2 * j, CPC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
+            p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->cpc_default,
+            pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
+            pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
+
+        ixheaacd_map_index_data(
+            &p_cur_bs->icc_lossless_data, p_aux_struct->ttt_icc, p_cur_bs->ttt_icc_idx,
+            p_cur_bs->cmp_ttt_icc_idx, NULL, i, p_cur_bs->ttt_icc_idx_prev,
+            offset + 4 * i + 2 * j, ICC, p_aux_struct->ttt_config[j][i].bitstream_start_band,
+            p_aux_struct->ttt_config[j][i].bitstream_stop_band, pstr_mps_state->icc_default,
+            pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame,
+            pstr_mps_state->quant_mode, NULL, NULL, NULL, bitdec_table, free_scratch);
+      }
+
+      else {
+        ixheaacd_map_index_data(
+            &p_cur_bs->cld_lossless_data, p_aux_struct->ttt_cld_1, p_cur_bs->ttt_cld_1_idx,
+            p_cur_bs->cmp_ttt_cld_1_idx, NULL, i, p_cur_bs->ttt_cld_1_idx_prev,
+            offset + 4 * i + 2 * j, CLD, p_aux_struct->ttt_config[j][i].bitstream_start_band,
+            p_aux_struct->ttt_config[j][i].bitstream_stop_band,
+            pstr_mps_state->ttt_cld_1_default[i], pstr_mps_state->num_parameter_sets, param_slot,
+            pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL, NULL,
+            bitdec_table, free_scratch);
+
+        ixheaacd_map_index_data(
+            &p_cur_bs->cld_lossless_data, p_aux_struct->ttt_cld_2, p_cur_bs->ttt_cld_2_idx,
+            p_cur_bs->cmp_ttt_cld_2_idx, NULL, i, p_cur_bs->ttt_cld_2_idx_prev,
+            offset + 4 * i + 1 + 2 * j, CLD, p_aux_struct->ttt_config[j][i].bitstream_start_band,
+            p_aux_struct->ttt_config[j][i].bitstream_stop_band,
+            pstr_mps_state->ttt_cld_2_default[i], pstr_mps_state->num_parameter_sets, param_slot,
+            pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL, NULL,
+            bitdec_table, free_scratch);
+      }
+
+      if (pstr_mps_state->up_mix_type == 2) {
+        WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+        WORD32 ps;
+
+        if (pstr_mps_state->extend_frame) {
+          num_parameter_sets++;
+        }
+
+        for (ps = 0; ps < num_parameter_sets; ps++) {
+          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_cpc_1[i][ps], num_bands, bitdec_table);
+          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_cpc_2[i][ps], num_bands, bitdec_table);
+          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_cld_1[i][ps], num_bands, bitdec_table);
+          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_cld_2[i][ps], num_bands, bitdec_table);
+          ixheaacd_map_data_to_28_bands(p_aux_struct->ttt_icc[i][ps], num_bands, bitdec_table);
+        }
+      }
+    }
+  }
+}
+
+static VOID ixheaacd_decode_and_map_frame_smg(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_smoothing_state_struct *smooth_state =
+      pstr_mps_state->mps_persistent_mem.smooth_state;
+  ia_mps_dec_bitdec_tables_struct *bitdec_table =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 *smg_time = p_aux_struct->smg_time;
+  WORD32 ps, pb, pg, pb_stride, data_bands, pb_start, pb_stop;
+  WORD32 *a_group_to_band;
+  VOID *free_scratch;
+  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
+  pstr_mps_state->smooth_control = frame->bs_smooth_control;
+  a_group_to_band = pstr_mps_state->mps_scratch_mem_v;
+  free_scratch = a_group_to_band + MAX_PARAMETER_BANDS_PLUS_1;
+
+  if (pstr_mps_state->smooth_control) {
+    for (ps = 0; ps < pstr_mps_state->num_parameter_sets; ps++) {
+      switch (frame->bs_smooth_mode[ps]) {
+        case SMOOTH_MODE_0:
+          smg_time[ps] = 256;
+          for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
+            p_aux_struct->smg_data[ps][pb] = 0;
+          }
+          break;
+
+        case SMOOTH_MODE_1:
+          if (ps > 0)
+            smg_time[ps] = smg_time[ps - 1];
+          else
+            smg_time[ps] = smooth_state->prev_smg_time;
+
+          for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
+            if (ps > 0)
+              p_aux_struct->smg_data[ps][pb] = p_aux_struct->smg_data[ps - 1][pb];
+            else
+              p_aux_struct->smg_data[ps][pb] = smooth_state->prev_smg_data[pb];
+          }
+          break;
+
+        case SMOOTH_MODE_2:
+          smg_time[ps] = bitdec_table->smg_time_table[frame->bs_smooth_time[ps]];
+          for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
+            p_aux_struct->smg_data[ps][pb] = 1;
+          }
+          break;
+
+        case SMOOTH_MODE_3:
+          smg_time[ps] = bitdec_table->smg_time_table[frame->bs_smooth_time[ps]];
+          pb_stride = bitdec_table->pb_stride_table[frame->bs_freq_res_stride_smg[ps]];
+          data_bands = (pstr_mps_state->bitstream_parameter_bands - 1) / pb_stride + 1;
+          ixheaacd_create_mapping(a_group_to_band, 0, pstr_mps_state->bitstream_parameter_bands,
+                                  pb_stride, free_scratch);
+          for (pg = 0; pg < data_bands; pg++) {
+            pb_start = a_group_to_band[pg];
+            pb_stop = a_group_to_band[pg + 1];
+            for (pb = pb_start; pb < pb_stop; pb++) {
+              p_aux_struct->smg_data[ps][pb] = frame->bs_smg_data[ps][pg];
+            }
+          }
+          break;
+
+        default:
+          break;
+      }
+    }
+
+    smooth_state->prev_smg_time = smg_time[pstr_mps_state->num_parameter_sets - 1];
+    for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
+      smooth_state->prev_smg_data[pb] =
+          p_aux_struct->smg_data[pstr_mps_state->num_parameter_sets - 1][pb];
+    }
+
+    if (pstr_mps_state->extend_frame) {
+      smg_time[pstr_mps_state->num_parameter_sets] =
+          smg_time[pstr_mps_state->num_parameter_sets - 1];
+      for (pb = 0; pb < pstr_mps_state->bitstream_parameter_bands; pb++) {
+        p_aux_struct->smg_data[pstr_mps_state->num_parameter_sets][pb] =
+            p_aux_struct->smg_data[pstr_mps_state->num_parameter_sets - 1][pb];
+      }
+    }
+
+    if (pstr_mps_state->up_mix_type == 2) {
+      WORD32 *mapping = NULL;
+      ixheaacd_get_parameters_mapping(pstr_mps_state->bitstream_parameter_bands, mapping,
+                                      bitdec_table);
+
+      if (mapping != NULL) {
+        WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+
+        if (pstr_mps_state->extend_frame) {
+          num_parameter_sets++;
+        }
+
+        for (ps = 0; ps < num_parameter_sets; ps++) {
+          for (pb = MAX_PARAMETER_BANDS - 1; pb >= 0; pb--) {
+            p_aux_struct->smg_data[ps][pb] = p_aux_struct->smg_data[ps][mapping[pb]];
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+static VOID ixheaacd_decode_and_map_frame_arbdmx(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
+  ia_mps_dec_bitdec_tables_struct *bitdec_table =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 *param_slot = p_aux_struct->param_slot;
+  WORD32 offset = pstr_mps_state->num_ott_boxes + 4 * pstr_mps_state->num_ttt_boxes;
+  WORD32 ch;
+
+  VOID *scratch = pstr_mps_state->mps_scratch_mem_v;
+
+  for (ch = 0; ch < pstr_mps_state->num_input_channels; ch++) {
+    ixheaacd_map_index_data(
+        &frame->cld_lossless_data, p_aux_struct->arbdmx_gain, frame->arbdmx_gain_idx,
+        frame->cmp_arbdmx_gain_idx, NULL, ch, frame->arbdmx_gain_idx_prev, offset + ch, CLD, 0,
+        pstr_mps_state->bitstream_parameter_bands, pstr_mps_state->arbdmx_gain_default,
+        pstr_mps_state->num_parameter_sets, param_slot, pstr_mps_state->extend_frame, 0, NULL,
+        NULL, NULL, bitdec_table, scratch);
+
+    p_aux_struct->arbdmx_residual_abs[ch] = frame->bs_arbitrary_downmix_residual_abs[ch];
+    p_aux_struct->arbdmx_alpha_upd_set[ch] =
+        frame->bs_arbitrary_downmix_residual_alpha_update_set[ch];
+
+    if (pstr_mps_state->up_mix_type == 2) {
+      WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+      WORD32 ps;
+
+      if (pstr_mps_state->extend_frame) {
+        num_parameter_sets++;
+      }
+
+      for (ps = 0; ps < num_parameter_sets; ps++) {
+        ixheaacd_map_data_to_28_bands(p_aux_struct->arbdmx_gain[ch][ps],
+                                      pstr_mps_state->bitstream_parameter_bands, bitdec_table);
+      }
+    }
+  }
+}
+
+static VOID ixheaacd_decode_and_map_frame_arb_tree(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+  ia_mps_spatial_bs_config_struct *p_config = &(pstr_mps_state->bs_config);
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 *param_slot = p_aux_struct->param_slot;
+  WORD32 offset = pstr_mps_state->num_ott_boxes;
+
+  VOID *scratch = pstr_mps_state->mps_scratch_mem_v;
+
+  WORD32 i;
+
+  for (i = 0; i < p_config->num_ott_boxes_at; i++) {
+    ixheaacd_map_index_data(&p_cur_bs->cld_lossless_data, p_aux_struct->ott_cld,
+                            p_cur_bs->ott_cld_idx, p_cur_bs->cmp_ott_cld_idx, NULL, offset + i,
+                            p_cur_bs->ott_cld_idx_prev, offset + i, CLD, 0,
+                            p_config->bs_ott_bands_at[i], p_config->bs_ott_default_cld_at[i],
+                            pstr_mps_state->num_parameter_sets, param_slot,
+                            pstr_mps_state->extend_frame, pstr_mps_state->quant_mode, NULL, NULL,
+                            NULL, pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr, scratch);
+  }
+}
+
+IA_ERRORCODE ixheaacd_decode_frame(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
+  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
+
+  pstr_mps_state->extend_frame = 0;
+  if (param_slot[pstr_mps_state->num_parameter_sets - 1] != pstr_mps_state->time_slots - 1) {
+    pstr_mps_state->extend_frame = 1;
+  }
+
+  ixheaacd_decode_and_map_frame_ott(pstr_mps_state);
+  ixheaacd_decode_and_map_frame_ttt(pstr_mps_state);
+
+  ixheaacd_decode_and_map_frame_smg(pstr_mps_state);
+  if (p_bs_config->arbitrary_tree != 0) {
+    ixheaacd_decode_and_map_frame_arb_tree(pstr_mps_state);
+  }
+
+  if (pstr_mps_state->arbitrary_downmix != 0) {
+    ixheaacd_decode_and_map_frame_arbdmx(pstr_mps_state);
+  }
+
+  if (pstr_mps_state->extend_frame) {
+    pstr_mps_state->num_parameter_sets++;
+    if (pstr_mps_state->num_parameter_sets > MAX_PARAMETER_SETS) {
+      if (pstr_mps_state->ec_flag)
+        pstr_mps_state->num_parameter_sets = 1;
+      else
+        return IA_FATAL_ERROR;
+    }
+
+    param_slot[pstr_mps_state->num_parameter_sets - 1] = pstr_mps_state->time_slots - 1;
+  }
+  return IA_NO_ERROR;
+}
+
+IA_ERRORCODE ixheaacd_set_current_state_parameters(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 i;
+
+  ia_mps_spatial_bs_config_struct *config = &(pstr_mps_state->bs_config);
+  ia_mps_spatial_bs_config_struct *p_bs_config = &pstr_mps_state->bs_config;
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  ia_mps_dec_bitdec_tables_struct *bitdec_table =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 *b_ott_bands = curr_state->bitstream_ott_bands;
+
+  if (config->bs_sampling_freq_index == 15) {
+    curr_state->sampling_freq = config->bs_sampling_frequency;
+  } else {
+    curr_state->sampling_freq = bitdec_table->sampling_freq_table[config->bs_sampling_freq_index];
+  }
+  curr_state->time_slots = config->bs_frame_length + 1;
+  curr_state->frame_length = curr_state->time_slots * curr_state->qmf_bands;
+  curr_state->bitstream_parameter_bands = bitdec_table->freq_res_table[config->bs_freq_res];
+
+  curr_state->hybrid_bands = curr_state->qmf_bands - QMF_BANDS_TO_HYBRID + 10;
+  curr_state->tp_hyb_band_border = 12;
+  if (curr_state->hybrid_bands > 71) {
+    return IA_FATAL_ERROR;
+  }
+  if (curr_state->up_mix_type == 2) {
+    curr_state->num_parameter_bands = MAX_PARAMETER_BANDS;
+  } else {
+    curr_state->num_parameter_bands = curr_state->bitstream_parameter_bands;
+  }
+
+  switch (curr_state->num_parameter_bands) {
+    case PARAMETER_BANDS_4:
+      for (i = 0; i < curr_state->hybrid_bands; i++) {
+        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_4_to_71[i];
+      }
+      break;
+    case PARAMETER_BANDS_5:
+      for (i = 0; i < curr_state->hybrid_bands; i++) {
+        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_5_to_71[i];
+      }
+      break;
+    case PARAMETER_BANDS_7:
+      for (i = 0; i < curr_state->hybrid_bands; i++) {
+        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_7_to_71[i];
+      }
+      break;
+    case PARAMETER_BANDS_10:
+      for (i = 0; i < curr_state->hybrid_bands; i++) {
+        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_10_to_71[i];
+      }
+      break;
+    case PARAMETER_BANDS_14:
+      for (i = 0; i < curr_state->hybrid_bands; i++) {
+        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_14_to_71[i];
+      }
+      break;
+    case PARAMETER_BANDS_20:
+      for (i = 0; i < curr_state->hybrid_bands; i++) {
+        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_20_to_71[i];
+      }
+      break;
+    case PARAMETER_BANDS_28:
+      for (i = 0; i < curr_state->hybrid_bands; i++) {
+        curr_state->kernels[i] = bitdec_table->kernel_table.kernels_28_to_71[i];
+      }
+      break;
+    default:
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_PARAMETER_BANDS;
+  };
+
+  curr_state->tree_config = config->bs_tree_config;
+
+  switch (curr_state->tree_config) {
+    case TREE_5151:
+    case TREE_5152:
+    case TREE_525:
+      config->ui_channel_mask = FIVE_POINT_ONE_CHANNEL_MASK;
+      break;
+    case TREE_7271:
+    case TREE_7571:
+      config->ui_channel_mask = SEVEN_POINT_ONE_CHANNEL_MASK1;
+      break;
+    case TREE_7272:
+    case TREE_7572:
+      config->ui_channel_mask = SEVEN_POINT_ONE_CHANNEL_MASK2;
+      break;
+    default:
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
+  }
+
+  curr_state->num_ott_boxes =
+      bitdec_table->tree_property_table[curr_state->tree_config].num_ott_boxes;
+  curr_state->num_ttt_boxes =
+      bitdec_table->tree_property_table[curr_state->tree_config].num_ttt_boxes;
+  curr_state->num_input_channels =
+      bitdec_table->tree_property_table[curr_state->tree_config].num_input_channels;
+  curr_state->num_output_channels =
+      bitdec_table->tree_property_table[curr_state->tree_config].num_output_channels;
+  curr_state->quant_mode = config->bs_quant_mode;
+  curr_state->one_icc = config->bs_one_icc;
+  curr_state->arbitrary_downmix = config->bs_arbitrary_downmix;
+  curr_state->residual_coding = config->bs_residual_coding;
+  curr_state->smooth_config = config->bs_smooth_config;
+  curr_state->mtx_inversion = config->bs_matrix_mode;
+  curr_state->temp_shape_config = config->bs_temp_shape_config;
+  curr_state->decorr_config = config->bs_decorr_config;
+  curr_state->env_quant_mode = config->bs_env_quant_mode;
+  curr_state->lfe_gain = bitdec_table->lfe_gain_table[config->bs_fixed_gain_lfe];
+  curr_state->surround_gain = bitdec_table->surround_gain_table[config->bs_fixed_gain_sur];
+  curr_state->clip_protect_gain = bitdec_table->clip_gain_table[config->bs_fixed_gain_dmx];
+
+  if (curr_state->up_mix_type == 2) {
+    curr_state->num_output_channels = 2;
+    curr_state->decorr_config = 0;
+  }
+
+  if (curr_state->up_mix_type == 3) {
+    curr_state->num_output_channels = 2;
+  }
+
+  if (p_bs_config->arbitrary_tree == 1)
+    curr_state->num_output_channels_at = p_bs_config->num_out_chan_at;
+  else
+    curr_state->num_output_channels_at = curr_state->num_output_channels;
+
+  p_bs_config->ui_out_channels = curr_state->num_output_channels_at;
+
+  curr_state->_3d_stereo_inversion = config->bs_3d_audio_mode;
+
+  if (curr_state->mtx_inversion == 1 || curr_state->_3d_stereo_inversion == 1)
+    curr_state->m1_param_imag_present = 1;
+
+  for (i = 0; i < curr_state->num_ott_boxes; i++) {
+    if (bitdec_table->tree_property_table[curr_state->tree_config].ott_mode_lfe[i]) {
+      b_ott_bands[i] = config->bs_ott_bands[i];
+      curr_state->ott_mode_lfe[i] = 1;
+    } else {
+      b_ott_bands[i] = curr_state->bitstream_parameter_bands;
+      curr_state->ott_mode_lfe[i] = 0;
+    }
+
+    if (curr_state->up_mix_type == 2) {
+      ixheaacd_map_number_of_bands_to_28_bands(b_ott_bands[i],
+                                               curr_state->bitstream_parameter_bands,
+                                               &p_aux_struct->num_ott_bands[i], bitdec_table);
+    } else {
+      p_aux_struct->num_ott_bands[i] = b_ott_bands[i];
+    }
+  }
+  for (i = 0; i < curr_state->num_ttt_boxes; i++) {
+    p_aux_struct->ttt_config[0][i].mode = config->bs_ttt_mode_low[i];
+    p_aux_struct->ttt_config[1][i].mode = config->bs_ttt_mode_high[i];
+    p_aux_struct->ttt_config[0][i].bitstream_start_band = 0;
+    p_aux_struct->ttt_config[1][i].bitstream_stop_band = curr_state->bitstream_parameter_bands;
+
+    if (config->bs_ttt_dual_mode[i]) {
+      p_aux_struct->ttt_config[0][i].bitstream_stop_band = config->bs_ttt_bands_low[i];
+      p_aux_struct->ttt_config[1][i].bitstream_start_band = config->bs_ttt_bands_low[i];
+    } else {
+      p_aux_struct->ttt_config[0][i].bitstream_stop_band = curr_state->bitstream_parameter_bands;
+      p_aux_struct->ttt_config[1][i].bitstream_start_band = curr_state->bitstream_parameter_bands;
+    }
+
+    if (curr_state->up_mix_type == 2) {
+      ixheaacd_map_number_of_bands_to_28_bands(
+          p_aux_struct->ttt_config[0][i].bitstream_start_band,
+          curr_state->bitstream_parameter_bands, &p_aux_struct->ttt_config[0][i].start_band,
+          bitdec_table);
+
+      ixheaacd_map_number_of_bands_to_28_bands(p_aux_struct->ttt_config[0][i].bitstream_stop_band,
+                                               curr_state->bitstream_parameter_bands,
+                                               &p_aux_struct->ttt_config[0][i].stop_band,
+                                               bitdec_table);
+
+      ixheaacd_map_number_of_bands_to_28_bands(
+          p_aux_struct->ttt_config[1][i].bitstream_start_band,
+          curr_state->bitstream_parameter_bands, &p_aux_struct->ttt_config[1][i].start_band,
+          bitdec_table);
+
+      ixheaacd_map_number_of_bands_to_28_bands(p_aux_struct->ttt_config[1][i].bitstream_stop_band,
+                                               curr_state->bitstream_parameter_bands,
+                                               &p_aux_struct->ttt_config[1][i].stop_band,
+                                               bitdec_table);
+    } else {
+      p_aux_struct->ttt_config[0][i].start_band =
+          p_aux_struct->ttt_config[0][i].bitstream_start_band;
+      p_aux_struct->ttt_config[0][i].stop_band =
+          p_aux_struct->ttt_config[0][i].bitstream_stop_band;
+      p_aux_struct->ttt_config[1][i].start_band =
+          p_aux_struct->ttt_config[1][i].bitstream_start_band;
+      p_aux_struct->ttt_config[1][i].stop_band =
+          p_aux_struct->ttt_config[1][i].bitstream_stop_band;
+    }
+  }
+  curr_state->residual_coding = config->bs_residual_coding;
+  curr_state->num_residual_signals = 0;
+  if (curr_state->residual_coding) {
+    for (i = 0; i < curr_state->num_ttt_boxes + curr_state->num_ott_boxes; i++) {
+      if (config->bs_residual_present[i]) {
+        curr_state->res_bands[i] = config->bs_residual_bands[i];
+        curr_state->num_residual_signals++;
+      } else {
+        curr_state->res_bands[i] = 0;
+      }
+
+      if (curr_state->up_mix_type == 2 || curr_state->up_mix_type == 3) {
+        curr_state->res_bands[i] = 0;
+      }
+    }
+  }
+
+  curr_state->residual_frames_per_spatial_frame =
+      p_bs_config->bs_residual_frames_per_spatial_frame + 1;
+  if (curr_state->residual_frames_per_spatial_frame > 0) {
+    WORD32 const *reciprocal_tab =
+        pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->reciprocal;
+
+    WORD64 temp =
+        (WORD64)(((WORD64)(p_bs_config->bs_frame_length + 1) *
+                  (WORD64)reciprocal_tab[p_bs_config->bs_residual_frames_per_spatial_frame]) >>
+                 28);
+    curr_state->upd_qmf = (WORD32)temp;
+    if (curr_state->upd_qmf != UPD_QMF_15 && curr_state->upd_qmf != UPD_QMF_16 &&
+        curr_state->upd_qmf != UPD_QMF_32 && curr_state->upd_qmf != UPD_QMF_18 &&
+        curr_state->upd_qmf != UPD_QMF_30 && curr_state->upd_qmf != UPD_QMF_24)
+      return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_QMF_UPDATE;
+  }
+
+  curr_state->arbdmx_residual_bands = config->bs_arbitrary_downmix_residual_bands;
+  curr_state->arbdmx_frames_per_spatial_frame =
+      config->bs_arbitrary_downmix_residual_frames_per_spatial_frame + 1;
+  if (curr_state->arbdmx_frames_per_spatial_frame > 0) {
+    curr_state->arbdmx_upd_qmf =
+        curr_state->time_slots / curr_state->arbdmx_frames_per_spatial_frame;
+    if (curr_state->arbdmx_upd_qmf != UPD_QMF_15 && curr_state->arbdmx_upd_qmf != UPD_QMF_16 &&
+        curr_state->arbdmx_upd_qmf != UPD_QMF_32 && curr_state->arbdmx_upd_qmf != UPD_QMF_18 &&
+        curr_state->arbdmx_upd_qmf != UPD_QMF_30 && curr_state->arbdmx_upd_qmf != UPD_QMF_24)
+      return IA_XHEAAC_MPS_DEC_EXE_NONFATAL_INVALID_QMF_UPDATE;
+  }
+
+  curr_state->cpc_default = 10;
+  curr_state->ttt_cld_1_default[0] = 15;
+  curr_state->ttt_cld_2_default[0] = 0;
+  curr_state->icc_default = 0;
+  curr_state->arbdmx_gain_default = 0;
+
+  if (curr_state->_3d_stereo_inversion) {
+    if (config->bs_3d_audio_hrtf_set == 0) {
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_HRTF_SET;
+    } else {
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_HRTF_SET;
+    }
+  }
+
+  switch (curr_state->tree_config) {
+    case TREE_5151:
+      curr_state->num_direct_signals = 1;
+      curr_state->num_decor_signals = 4;
+
+      if (curr_state->up_mix_type == 2) {
+        curr_state->num_decor_signals = 1;
+      }
+
+      if (curr_state->up_mix_type == 3) {
+        curr_state->num_decor_signals = 3;
+      }
+
+      curr_state->num_x_channels = 1;
+      if (curr_state->arbitrary_downmix == 2) {
+        curr_state->num_x_channels += 1;
+      }
+      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
+      curr_state->num_w_channels = curr_state->num_v_channels;
+      curr_state->w_start_residual_idx = 0;
+      curr_state->ott_cld_default[0] = 15;
+      curr_state->ott_cld_default[1] = 15;
+      curr_state->ott_cld_default[2] = 0;
+      curr_state->ott_cld_default[3] = 0;
+      curr_state->ott_cld_default[4] = 15;
+      break;
+    case TREE_5152:
+      curr_state->num_direct_signals = 1;
+      curr_state->num_decor_signals = 4;
+
+      if (curr_state->up_mix_type == 2) {
+        curr_state->num_decor_signals = 1;
+      }
+
+      if (curr_state->up_mix_type == 3) {
+        curr_state->num_decor_signals = 2;
+      }
+
+      curr_state->num_x_channels = 1;
+      if (curr_state->arbitrary_downmix == 2) {
+        curr_state->num_x_channels += 1;
+      }
+      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
+      curr_state->num_w_channels = curr_state->num_v_channels;
+      curr_state->w_start_residual_idx = 0;
+      curr_state->ott_cld_default[0] = 15;
+      curr_state->ott_cld_default[1] = 0;
+      curr_state->ott_cld_default[2] = 15;
+      curr_state->ott_cld_default[3] = 15;
+      curr_state->ott_cld_default[4] = 15;
+      break;
+    case TREE_525:
+      curr_state->num_direct_signals = 3;
+
+      for (i = 0; i < 2; i++) {
+        switch (p_aux_struct->ttt_config[i][0].mode) {
+          case TTT_MODE_0:
+            p_aux_struct->ttt_config[i][0].use_ttt_decorr = 1;
+            curr_state->num_decor_signals = 3;
+            break;
+          case TTT_MODE_1:
+          case TTT_MODE_2:
+          case TTT_MODE_3:
+          case TTT_MODE_4:
+          case TTT_MODE_5:
+            p_aux_struct->ttt_config[i][0].use_ttt_decorr = 0;
+            curr_state->num_decor_signals = 2;
+            break;
+          default:
+            if (p_bs_config->bs_ttt_mode_low[0] <= 1)
+              return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TTT_MODE;
+            break;
+        }
+      }
+
+      if (curr_state->residual_coding == 1) {
+        curr_state->num_x_channels = 3;
+      } else {
+        curr_state->num_x_channels = 2;
+      }
+
+      if (curr_state->arbitrary_downmix == 2) {
+        curr_state->num_x_channels = 5;
+      }
+
+      if (curr_state->up_mix_type == 2) {
+        curr_state->num_direct_signals = 2;
+        curr_state->num_decor_signals = 0;
+        curr_state->num_x_channels = 2;
+
+        if (curr_state->arbitrary_downmix == 2) {
+          curr_state->num_direct_signals = 4;
+          curr_state->num_x_channels = 5;
+        }
+      }
+
+      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
+      curr_state->num_w_channels = curr_state->num_v_channels;
+      curr_state->w_start_residual_idx = 1;
+      curr_state->ott_cld_default[0] = 15;
+      curr_state->ott_cld_default[1] = 15;
+      curr_state->ott_cld_default[2] = 15;
+      break;
+    case TREE_7271:
+    case TREE_7272:
+      curr_state->num_direct_signals = 3;
+
+      for (i = 0; i < 2; i++) {
+        switch (p_aux_struct->ttt_config[i][0].mode) {
+          case TTT_MODE_0:
+            p_aux_struct->ttt_config[i][0].use_ttt_decorr = 1;
+            curr_state->num_decor_signals = 5;
+            break;
+          case TTT_MODE_1:
+          case TTT_MODE_2:
+          case TTT_MODE_3:
+          case TTT_MODE_4:
+          case TTT_MODE_5:
+            p_aux_struct->ttt_config[i][0].use_ttt_decorr = 0;
+            curr_state->num_decor_signals = 5;
+            break;
+          default:
+            if (p_bs_config->bs_ttt_mode_low[0] <= 1)
+              return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TTT_MODE;
+            break;
+        }
+      }
+
+      if (curr_state->residual_coding == 1) {
+        curr_state->num_x_channels = 3;
+      } else {
+        curr_state->num_x_channels = 2;
+      }
+
+      if (curr_state->arbitrary_downmix == 2) {
+        curr_state->num_x_channels = 5;
+      }
+
+      if (curr_state->up_mix_type == 2) {
+        curr_state->num_direct_signals = 2;
+        curr_state->num_decor_signals = 0;
+        curr_state->num_x_channels = 2;
+
+        if (curr_state->arbitrary_downmix == 2) {
+          curr_state->num_direct_signals = 4;
+          curr_state->num_x_channels = 5;
+        }
+      }
+
+      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
+      curr_state->num_w_channels = curr_state->num_v_channels;
+      curr_state->w_start_residual_idx = 1;
+      curr_state->ott_cld_default[0] = 15;
+      curr_state->ott_cld_default[1] = 15;
+      curr_state->ott_cld_default[2] = 15;
+      curr_state->ott_cld_default[3] = 15;
+      curr_state->ott_cld_default[4] = 15;
+      break;
+    case TREE_7571:
+    case TREE_7572:
+      curr_state->num_direct_signals = 6;
+      curr_state->num_decor_signals = 2;
+      curr_state->num_x_channels = 6;
+      curr_state->num_v_channels = curr_state->num_direct_signals + curr_state->num_decor_signals;
+      curr_state->num_w_channels = curr_state->num_v_channels;
+      curr_state->w_start_residual_idx = 0;
+      curr_state->ott_cld_default[0] = 15;
+      curr_state->ott_cld_default[1] = 15;
+      break;
+    default:
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
+      break;
+  }
+  return IA_NO_ERROR;
+}
+
+VOID ixheaacd_get_dequant_tables(
+    WORD32 **cld, WORD32 **icc, WORD32 **cpc,
+    ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  *cld = ixheaacd_mps_dec_bitdec_tables->dequant_cld;
+  *icc = ixheaacd_mps_dec_bitdec_tables->dequant_icc;
+  *cpc = ixheaacd_mps_dec_bitdec_tables->dequant_cpc;
+}
+
+WORD32 ixheaacd_quantize_cld(WORD32 v,
+                             ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  WORD32 i = 1;
+  WORD32 temp_1;
+  WORD32 vmin = ixheaacd_mps_dec_bitdec_tables->dequant_cld[0];
+  WORD32 dmin = abs(v - vmin);
+
+  do {
+    temp_1 = abs(v - ixheaacd_mps_dec_bitdec_tables->dequant_cld[i]);
+    if (temp_1 < dmin) {
+      dmin = temp_1;
+      vmin = ixheaacd_mps_dec_bitdec_tables->dequant_cld[i];
+    }
+  } while (ixheaacd_mps_dec_bitdec_tables->dequant_cld[i++] < ONE_FORTYNINE_Q15);
+  return vmin;
+}
+
+WORD32 ixheaacd_quantize_icc(WORD32 v,
+                             ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables) {
+  WORD32 i = 1;
+  WORD32 temp_1;
+  WORD32 vmin = ixheaacd_mps_dec_bitdec_tables->dequant_icc[0];
+  WORD32 dmin = abs(v - vmin);
+
+  do {
+    temp_1 = abs(v - ixheaacd_mps_dec_bitdec_tables->dequant_icc[i]);
+    if (temp_1 < dmin) {
+      dmin = temp_1;
+      vmin = ixheaacd_mps_dec_bitdec_tables->dequant_icc[i];
+    }
+  } while (ixheaacd_mps_dec_bitdec_tables->dequant_icc[i++] > MINUS_POINT_NINE_EIGHT_Q15);
+
+  return vmin;
+}
diff --git a/decoder/ixheaacd_mps_bitdec.h b/decoder/ixheaacd_mps_bitdec.h
new file mode 100644
index 0000000..b4a4931
--- /dev/null
+++ b/decoder/ixheaacd_mps_bitdec.h
@@ -0,0 +1,80 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_BITDEC_H
+#define IXHEAACD_MPS_BITDEC_H
+
+enum { EXT_TYPE_0 = 0, EXT_TYPE_1 = 1, EXT_TYPE_2 = 2 };
+
+enum { QUANT_MODE_0 = 0, QUANT_MODE_1 = 1, QUANT_MODE_2 = 2 };
+
+enum { IN_CH_1 = 1, IN_CH_2 = 2, IN_CH_6 = 6 };
+
+enum {
+  TREE_5151 = 0,
+  TREE_5152 = 1,
+  TREE_525 = 2,
+  TREE_7271 = 3,
+  TREE_7272 = 4,
+  TREE_7571 = 5,
+  TREE_7572 = 6
+};
+
+enum {
+  PARAMETER_BANDS_4 = 4,
+  PARAMETER_BANDS_5 = 5,
+  PARAMETER_BANDS_7 = 7,
+  PARAMETER_BANDS_10 = 10,
+  PARAMETER_BANDS_14 = 14,
+  PARAMETER_BANDS_20 = 20,
+  PARAMETER_BANDS_28 = 28,
+  PARAMETER_BANDS_40 = 40
+};
+
+enum { SMOOTH_MODE_0 = 0, SMOOTH_MODE_1 = 1, SMOOTH_MODE_2 = 2, SMOOTH_MODE_3 = 3 };
+
+enum {
+  TTT_MODE_0 = 0,
+  TTT_MODE_1 = 1,
+  TTT_MODE_2 = 2,
+  TTT_MODE_3 = 3,
+  TTT_MODE_4 = 4,
+  TTT_MODE_5 = 5
+};
+
+IA_ERRORCODE ixheaacd_parse_specific_config(ia_heaac_mps_state_struct *pstr_mps_state,
+                                            WORD32 sac_header_len);
+
+IA_ERRORCODE ixheaacd_default_specific_config(ia_heaac_mps_state_struct *pstr_mps_state,
+                                              WORD32 sampling_freq);
+
+IA_ERRORCODE ixheaacd_decode_frame(ia_heaac_mps_state_struct *pstr_mps_state);
+
+IA_ERRORCODE ixheaacd_set_current_state_parameters(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_get_dequant_tables(WORD32 **cld, WORD32 **icc, WORD32 **cpc,
+                                 ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables);
+
+WORD32 ixheaacd_quantize_icc(WORD32 v,
+                             ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables);
+
+WORD32 ixheaacd_quantize_cld(WORD32 v,
+                             ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables);
+
+#endif /* IXHEAACD_MPS_BITDEC_H */
diff --git a/decoder/ixheaacd_mps_blind.c b/decoder/ixheaacd_mps_blind.c
new file mode 100644
index 0000000..3aff243
--- /dev/null
+++ b/decoder/ixheaacd_mps_blind.c
@@ -0,0 +1,427 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_bitdec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_blind.h"
+
+static IA_ERRORCODE ixheaacd_get_sampling_freq_idx(
+    WORD32 sampling_freq, ia_mps_dec_bitdec_tables_struct *ixheaacd_mps_dec_bitdec_tables,
+    WORD32 *idx) {
+  WORD32 i;
+  for (i = 0; i < 13; i++) {
+    if (ixheaacd_mps_dec_bitdec_tables->sampling_freq_table[i] == sampling_freq) {
+      *idx = i;
+      return IA_NO_ERROR;
+    }
+  }
+  *idx = 3;
+  return IA_XHEAAC_DEC_CONFIG_FATAL_INVALID_SAMPLE_RATE;
+}
+
+VOID ixheaacd_init_blind(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_blind_decoder_struct *blind = pstr_mps_state->mps_persistent_mem.blind_decoder;
+  ia_mps_dec_blind_tables_struct *p_blind_table =
+      pstr_mps_state->ia_mps_dec_mps_table.blind_table_ptr;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 temp_1, temp_2;
+  WORD32 q_64, q_32, q_16, q_8, q_4, q_2;
+  WORD32 r_64, r_32, r_16, r_8, r_4, r_2;
+  WORD32 i;
+  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
+
+  ixheaacd_get_sampling_freq_idx(pstr_mps_state->sampling_freq,
+                                 pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr, &temp_1);
+  if (pstr_mps_state->qmf_bands == 128)
+    blind->filter_coeff = p_blind_table->exp_128[temp_1];
+  else {
+    q_64 = (WORD32)(qmf_bands >> 6) ? p_blind_table->exp_64[temp_1] : ONE_IN_Q15;
+    r_64 = (WORD32)(qmf_bands & SIX_BIT_MASK);
+
+    q_32 = (WORD32)(r_64 >> 5) ? p_blind_table->exp_32[temp_1] : ONE_IN_Q15;
+    r_32 = (WORD32)(r_64 & FIVE_BIT_MASK);
+
+    q_16 = (WORD32)(r_32 >> 4) ? p_blind_table->exp_16[temp_1] : ONE_IN_Q15;
+    r_16 = (WORD32)(r_32 & FOUR_BIT_MASK);
+
+    q_8 = (WORD32)(r_16 >> 3) ? p_blind_table->exp_8[temp_1] : ONE_IN_Q15;
+    r_8 = (WORD32)(r_16 & THREE_BIT_MASK);
+
+    q_4 = (WORD32)(r_8 >> 2) ? p_blind_table->exp_4[temp_1] : ONE_IN_Q15;
+    r_4 = (WORD32)(r_8 & TWO_BIT_MASK);
+
+    q_2 = (WORD32)(r_4 >> 1) ? p_blind_table->exp_2[temp_1] : ONE_IN_Q15;
+    r_2 = (WORD32)(r_4 & ONE_BIT_MASK) ? p_blind_table->exp_1[temp_1] : ONE_IN_Q15;
+
+    temp_1 = ixheaacd_mps_mult32_shr_15(ixheaacd_mps_mult32_shr_15(q_64, q_32), q_16);
+    temp_2 = ixheaacd_mps_mult32_shr_15(ixheaacd_mps_mult32_shr_15(q_8, q_4), q_2);
+    blind->filter_coeff =
+        ixheaacd_mps_mult32_shr_15(ixheaacd_mps_mult32_shr_15(temp_1, temp_2), r_2);
+  }
+  for (i = 0; i < MAX_PARAMETER_BANDS; i++) {
+    blind->excitation[0][i] = ABS_THR_FIX;
+    blind->excitation[1][i] = ABS_THR_FIX;
+    blind->excitation[2][i] = ABS_THR_FIX;
+
+    blind->q_excitation[0][i] = 15;
+    blind->q_excitation[1][i] = 15;
+    blind->q_excitation[2][i] = 15;
+  }
+
+  memset(p_aux_struct->temp_shape_enable_channel_stp, 0,
+         MAX_OUTPUT_CHANNELS_MPS * sizeof(p_aux_struct->temp_shape_enable_channel_stp[0]));
+  memset(p_aux_struct->temp_shape_enable_channel_ges, 0,
+         MAX_OUTPUT_CHANNELS_MPS * sizeof(p_aux_struct->temp_shape_enable_channel_ges[0]));
+}
+
+static VOID ixheaacd_signal_2_parameters(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps) {
+  ia_mps_dec_blind_decoder_struct *blind = pstr_mps_state->mps_persistent_mem.blind_decoder;
+  ia_mps_dec_blind_tables_struct *p_blind_table =
+      pstr_mps_state->ia_mps_dec_mps_table.blind_table_ptr;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+
+  WORD32 cld_index;
+  WORD32 icc_index;
+  WORD32 mesh[2][2];
+  WORD32 pb;
+  WORD32 *dequant_cld;
+  WORD32 *dequant_icc;
+  WORD32 *dequant_cpc;
+  WORD32 cld;
+  WORD32 icc;
+  WORD16 q_icc;
+  WORD32 cld_delta;
+  WORD32 icc_delta;
+  WORD16 q_icc_delta;
+  WORD32 temp_1;
+  WORD16 qtemp1, qtemp;
+  const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+
+  ixheaacd_get_dequant_tables(&dequant_cld, &dequant_icc, &dequant_cpc,
+                              pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
+
+  for (pb = 0; pb < num_parameter_bands; pb++) {
+    temp_1 = ixheaacd_mps_div_32(blind->excitation[0][pb], blind->excitation[1][pb], &qtemp1);
+    qtemp1 = qtemp1 + blind->q_excitation[0][pb] - blind->q_excitation[1][pb];
+    cld = 10 * ixheaacd_mps_log10(temp_1, qtemp1);
+
+    qtemp1 = blind->q_excitation[0][pb];
+    temp_1 = ixheaacd_mps_mult32(blind->excitation[0][pb], blind->excitation[1][pb], &qtemp1,
+                                 blind->q_excitation[1][pb]);
+    temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+    icc = ixheaacd_mps_div_32(blind->excitation[2][pb], temp_1, &q_icc);
+    q_icc = q_icc + blind->q_excitation[2][pb] - qtemp1;
+
+    if (abs(cld) > THIRTY_IN_Q16)
+      cld_delta = THIRTY_IN_Q16;
+    else
+      cld_delta = ixheaacd_abs32(cld);
+
+    q_icc_delta = q_icc;
+    icc_delta = ixheaacd_mps_add32(icc, ONE_IN_Q15, &q_icc_delta, 15);
+    icc_delta = ixheaacd_mps_mult32(icc_delta, 10, &q_icc_delta, 0);
+
+    temp_1 = cld_delta >> 16;
+    if (temp_1 > 29)
+      cld_index = 29;
+    else
+      cld_index = temp_1;
+
+    temp_1 = icc_delta >> q_icc_delta;
+    if (temp_1 > 19)
+      icc_index = 19;
+    else
+      icc_index = temp_1;
+
+    cld_delta -= (cld_index << 16);
+    icc_delta -= (icc_index << q_icc_delta);
+
+    mesh[0][0] = p_blind_table->mesh_table.blind_cld_mesh[cld_index][icc_index] + 15;
+    mesh[0][1] = p_blind_table->mesh_table.blind_cld_mesh[cld_index][icc_index + 1] + 15;
+    mesh[1][0] = p_blind_table->mesh_table.blind_cld_mesh[cld_index + 1][icc_index] + 15;
+    mesh[1][1] = p_blind_table->mesh_table.blind_cld_mesh[cld_index + 1][icc_index + 1] + 15;
+
+    qtemp1 = q_icc_delta;
+    temp_1 = ixheaacd_mps_mult32(icc_delta, (mesh[0][1] - mesh[0][0]), &qtemp1, 0);
+    qtemp = 15;
+    p_aux_struct->ott_cld[0][ps][pb] =
+        ixheaacd_mps_add32((mesh[0][0] << 15), temp_1, &qtemp, qtemp1);
+    qtemp1 = 16;
+    temp_1 = ixheaacd_mps_mult32(cld_delta, (mesh[1][0] - mesh[0][0]), &qtemp1, 0);
+    p_aux_struct->ott_cld[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ott_cld[0][ps][pb], temp_1, &qtemp, qtemp1);
+    qtemp1 = q_icc_delta;
+    temp_1 = ixheaacd_mps_mult32(icc_delta, cld_delta, &qtemp1, 16);
+    temp_1 = ixheaacd_mps_mult32(temp_1, (mesh[1][1] - mesh[0][1] - mesh[1][0] + mesh[0][0]),
+                                 &qtemp1, 0);
+    p_aux_struct->ott_cld[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ott_cld[0][ps][pb], temp_1, &qtemp, qtemp1);
+
+    p_aux_struct->ott_cld[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ott_cld[0][ps][pb], ONE_IN_Q14, &qtemp, 15);
+    p_aux_struct->ott_cld[0][ps][pb] = dequant_cld[((p_aux_struct->ott_cld[0][ps][pb]) >> qtemp)];
+
+    mesh[0][0] = p_blind_table->mesh_table.blind_icc_mesh[cld_index][icc_index];
+    mesh[0][1] = p_blind_table->mesh_table.blind_icc_mesh[cld_index][icc_index + 1];
+    mesh[1][0] = p_blind_table->mesh_table.blind_icc_mesh[cld_index + 1][icc_index];
+    mesh[1][1] = p_blind_table->mesh_table.blind_icc_mesh[cld_index + 1][icc_index + 1];
+
+    qtemp1 = q_icc_delta;
+    temp_1 = ixheaacd_mps_mult32(icc_delta, (mesh[0][1] - mesh[0][0]), &qtemp1, 0);
+    qtemp = 15;
+    p_aux_struct->ott_icc[0][ps][pb] =
+        ixheaacd_mps_add32((mesh[0][0] << 15), temp_1, &qtemp, qtemp1);
+    qtemp1 = 16;
+    temp_1 = ixheaacd_mps_mult32(cld_delta, (mesh[1][0] - mesh[0][0]), &qtemp1, 0);
+    p_aux_struct->ott_icc[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ott_icc[0][ps][pb], temp_1, &qtemp, qtemp1);
+    qtemp1 = q_icc_delta;
+    temp_1 = ixheaacd_mps_mult32(icc_delta, cld_delta, &qtemp1, 16);
+    temp_1 = ixheaacd_mps_mult32(temp_1, (mesh[1][1] - mesh[0][1] - mesh[1][0] + mesh[0][0]),
+                                 &qtemp1, 0);
+    p_aux_struct->ott_icc[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ott_icc[0][ps][pb], temp_1, &qtemp, qtemp1);
+
+    p_aux_struct->ott_icc[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ott_icc[0][ps][pb], ONE_IN_Q14, &qtemp, 15);
+    p_aux_struct->ott_icc[0][ps][pb] = dequant_icc[((p_aux_struct->ott_icc[0][ps][pb]) >> qtemp)];
+
+    mesh[0][0] = p_blind_table->mesh_table.blind_cpc_1_mesh[cld_index][icc_index] + 20;
+    mesh[0][1] = p_blind_table->mesh_table.blind_cpc_1_mesh[cld_index][icc_index + 1] + 20;
+    mesh[1][0] = p_blind_table->mesh_table.blind_cpc_1_mesh[cld_index + 1][icc_index] + 20;
+    mesh[1][1] = p_blind_table->mesh_table.blind_cpc_1_mesh[cld_index + 1][icc_index + 1] + 20;
+
+    qtemp1 = q_icc_delta;
+    temp_1 = ixheaacd_mps_mult32(icc_delta, (mesh[0][1] - mesh[0][0]), &qtemp1, 0);
+    qtemp = 15;
+    p_aux_struct->ttt_cpc_1[0][ps][pb] =
+        ixheaacd_mps_add32((mesh[0][0] << 15), temp_1, &qtemp, qtemp1);
+    qtemp1 = 16;
+    temp_1 = ixheaacd_mps_mult32(cld_delta, (mesh[1][0] - mesh[0][0]), &qtemp1, 0);
+    p_aux_struct->ttt_cpc_1[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ttt_cpc_1[0][ps][pb], temp_1, &qtemp, qtemp1);
+    qtemp1 = q_icc_delta;
+    temp_1 = ixheaacd_mps_mult32(icc_delta, cld_delta, &qtemp1, 16);
+    temp_1 = ixheaacd_mps_mult32(temp_1, (mesh[1][1] - mesh[0][1] - mesh[1][0] + mesh[0][0]),
+                                 &qtemp1, 0);
+    p_aux_struct->ttt_cpc_1[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ttt_cpc_1[0][ps][pb], temp_1, &qtemp, qtemp1);
+
+    p_aux_struct->ttt_cpc_1[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ttt_cpc_1[0][ps][pb], ONE_IN_Q14, &qtemp, 15);
+    p_aux_struct->ttt_cpc_1[0][ps][pb] =
+        dequant_cpc[((p_aux_struct->ttt_cpc_1[0][ps][pb]) >> qtemp)];
+
+    mesh[0][0] = p_blind_table->mesh_table.blind_cpc_2_mesh[cld_index][icc_index] + 20;
+    mesh[0][1] = p_blind_table->mesh_table.blind_cpc_2_mesh[cld_index][icc_index + 1] + 20;
+    mesh[1][0] = p_blind_table->mesh_table.blind_cpc_2_mesh[cld_index + 1][icc_index] + 20;
+    mesh[1][1] = p_blind_table->mesh_table.blind_cpc_2_mesh[cld_index + 1][icc_index + 1] + 20;
+
+    qtemp1 = q_icc_delta;
+    temp_1 = ixheaacd_mps_mult32(icc_delta, (mesh[0][1] - mesh[0][0]), &qtemp1, 0);
+    qtemp = 15;
+    p_aux_struct->ttt_cpc_2[0][ps][pb] =
+        ixheaacd_mps_add32((mesh[0][0] < 15), temp_1, &qtemp, qtemp1);
+    qtemp1 = 16;
+    temp_1 = ixheaacd_mps_mult32(cld_delta, (mesh[1][0] - mesh[0][0]), &qtemp1, 0);
+    p_aux_struct->ttt_cpc_2[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ttt_cpc_2[0][ps][pb], temp_1, &qtemp, qtemp1);
+    qtemp1 = q_icc_delta;
+    temp_1 = ixheaacd_mps_mult32(icc_delta, cld_delta, &qtemp1, 16);
+    temp_1 = ixheaacd_mps_mult32(temp_1, (mesh[1][1] - mesh[0][1] - mesh[1][0] + mesh[0][0]),
+                                 &qtemp1, 0);
+    p_aux_struct->ttt_cpc_2[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ttt_cpc_2[0][ps][pb], temp_1, &qtemp, qtemp1);
+
+    p_aux_struct->ttt_cpc_2[0][ps][pb] =
+        ixheaacd_mps_add32(p_aux_struct->ttt_cpc_2[0][ps][pb], ONE_IN_Q14, &qtemp, 15);
+    p_aux_struct->ttt_cpc_2[0][ps][pb] =
+        dequant_cpc[((p_aux_struct->ttt_cpc_2[0][ps][pb]) >> qtemp)];
+
+    if (cld < 0) {
+      cld = p_aux_struct->ttt_cpc_2[0][ps][pb];
+      p_aux_struct->ttt_cpc_2[0][ps][pb] = p_aux_struct->ttt_cpc_1[0][ps][pb];
+      p_aux_struct->ttt_cpc_1[0][ps][pb] = cld;
+    }
+  }
+}
+
+static VOID ixheaacd_update_down_mix_state(ia_heaac_mps_state_struct *pstr_mps_state,
+                                           WORD32 offset) {
+  ia_mps_dec_blind_decoder_struct *blind = pstr_mps_state->mps_persistent_mem.blind_decoder;
+  WORD32 ts;
+  WORD32 hb;
+  WORD32 pb;
+  WORD32 *excitation_0, *excitation_1, *excitation_2;
+  WORD16 *q_excitation_0, *q_excitation_1, *q_excitation_2;
+  WORD32 temp_1, temp_2;
+  WORD16 qtemp1, qtemp2;
+  WORD32 *p_x_real, *p_x_imag;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
+  excitation_0 = pstr_mps_state->mps_scratch_mem_v;
+  q_excitation_0 = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX2;
+  excitation_1 = excitation_0 + PARAMETER_BANDSX1_5;
+  q_excitation_1 = q_excitation_0 + PARAMETER_BANDSX3;
+  excitation_2 = excitation_1 + PARAMETER_BANDSX1_5;
+  q_excitation_2 = q_excitation_1 + PARAMETER_BANDSX3;
+
+  p_x_real = &pstr_mps_state->array_struct->x_real[offset * MAX_HYBRID_BANDS];
+  p_x_imag = &pstr_mps_state->array_struct->x_imag[offset * MAX_HYBRID_BANDS];
+  for (ts = 0; ts < HOP_SLOTS; ts++) {
+    WORD32 *x_real_0 = p_x_real;
+    WORD32 *x_imag_0 = p_x_imag;
+
+    WORD32 *x_real_1 = p_x_real + TSXHB;
+    WORD32 *x_imag_1 = p_x_imag + TSXHB;
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      excitation_0[pb] = ABS_THR_FIX;
+      excitation_1[pb] = ABS_THR_FIX;
+      excitation_2[pb] = ABS_THR_FIX;
+
+      q_excitation_0[pb] = 15;
+      q_excitation_1[pb] = 15;
+      q_excitation_2[pb] = 15;
+    }
+
+    for (hb = 0; hb < hybrid_bands; hb++) {
+      WORD64 temp;
+      pb = (WORD32)pstr_mps_state->kernels[hb];
+
+      temp =
+          (WORD64)((WORD64)*x_real_0 * (WORD64)*x_real_0 + (WORD64)*x_imag_0 * (WORD64)*x_imag_0);
+      temp >>= 10;
+      temp_1 = (WORD32)temp;
+      qtemp1 = 10;
+      excitation_0[pb] =
+          ixheaacd_mps_add32(excitation_0[pb], temp_1, &(q_excitation_0[pb]), qtemp1);
+
+      temp =
+          (WORD64)((WORD64)*x_real_1 * (WORD64)*x_real_1 + (WORD64)*x_imag_1 * (WORD64)*x_imag_1);
+      temp >>= 10;
+      temp_1 = (WORD32)temp;
+      qtemp1 = 10;
+      excitation_1[pb] =
+          ixheaacd_mps_add32(excitation_1[pb], temp_1, &(q_excitation_1[pb]), qtemp1);
+
+      temp =
+          (WORD64)((WORD64)*x_real_0 * (WORD64)*x_real_1 + (WORD64)*x_imag_0 * (WORD64)*x_imag_1);
+      temp >>= 10;
+      temp_1 = (WORD32)temp;
+      qtemp1 = 10;
+      excitation_2[pb] =
+          ixheaacd_mps_add32(excitation_2[pb], temp_1, &(q_excitation_2[pb]), qtemp1);
+
+      x_real_0++;
+      x_imag_0++;
+      x_real_1++;
+      x_imag_1++;
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      blind->excitation[0][pb] =
+          ixheaacd_mps_mult32_shr_15(blind->excitation[0][pb], blind->filter_coeff);
+      blind->excitation[1][pb] =
+          ixheaacd_mps_mult32_shr_15(blind->excitation[1][pb], blind->filter_coeff);
+      blind->excitation[2][pb] =
+          ixheaacd_mps_mult32_shr_15(blind->excitation[2][pb], blind->filter_coeff);
+
+      temp_1 = ONE_IN_Q15 - blind->filter_coeff;
+
+      qtemp2 = *q_excitation_0++;
+      temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *excitation_0);
+      excitation_0++;
+
+      blind->excitation[0][pb] = ixheaacd_mps_add32(blind->excitation[0][pb], temp_2,
+                                                    &(blind->q_excitation[0][pb]), qtemp2);
+
+      qtemp2 = *q_excitation_1++;
+      temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *excitation_1);
+      excitation_1++;
+
+      blind->excitation[1][pb] = ixheaacd_mps_add32(blind->excitation[1][pb], temp_2,
+                                                    &(blind->q_excitation[1][pb]), qtemp2);
+
+      qtemp2 = *q_excitation_2++;
+      temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *excitation_2);
+      excitation_2++;
+
+      blind->excitation[2][pb] = ixheaacd_mps_add32(blind->excitation[2][pb], temp_2,
+                                                    &(blind->q_excitation[2][pb]), qtemp2);
+    }
+    excitation_0[pb] -= num_parameter_bands;
+    excitation_1[pb] -= num_parameter_bands;
+    excitation_2[pb] -= num_parameter_bands;
+
+    q_excitation_0[pb] -= num_parameter_bands;
+    q_excitation_1[pb] -= num_parameter_bands;
+    q_excitation_2[pb] -= num_parameter_bands;
+
+    p_x_real += MAX_HYBRID_BANDS;
+    p_x_imag += MAX_HYBRID_BANDS;
+  }
+}
+
+VOID ixheaacd_apply_blind(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_spatial_bs_frame_struct *frame = pstr_mps_state->bs_frame;
+  WORD32 ts;
+  WORD32 ps;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
+
+  for (ts = 0, ps = 0; ts < time_slots; ts += HOP_SLOTS, ps++) {
+    param_slot[ps] = ts + HOP_SLOTS - 1;
+
+    ixheaacd_signal_2_parameters(pstr_mps_state, ps);
+    ixheaacd_update_down_mix_state(pstr_mps_state, ts);
+  }
+
+  pstr_mps_state->num_parameter_sets_prev = ps;
+  pstr_mps_state->num_parameter_sets = ps;
+  frame->bs_independency_flag = 0;
+  pstr_mps_state->aux_struct->num_ott_bands[0] = pstr_mps_state->num_parameter_bands;
+
+  return;
+}
diff --git a/decoder/ixheaacd_mps_blind.h b/decoder/ixheaacd_mps_blind.h
new file mode 100644
index 0000000..d213dce
--- /dev/null
+++ b/decoder/ixheaacd_mps_blind.h
@@ -0,0 +1,29 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_BLIND_H
+#define IXHEAACD_MPS_BLIND_H
+
+#define HOP_SLOTS (4)
+
+VOID ixheaacd_init_blind(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_apply_blind(ia_heaac_mps_state_struct *pstr_mps_state);
+
+#endif /* IXHEAACD_MPS_BLIND_H */
diff --git a/decoder/ixheaacd_mps_calc_m1m2_common.c b/decoder/ixheaacd_mps_calc_m1m2_common.c
new file mode 100644
index 0000000..a1532d8
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_common.c
@@ -0,0 +1,930 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+
+VOID ixheaacd_get_matrix_inversion_weights(
+    WORD32 iid_lf_ls_idx, WORD32 iid_rf_rs_idx, WORD32 prediction_mode, WORD32 c1, WORD32 c2,
+    WORD32 *weight1, WORD32 *weight2, ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr) {
+  WORD32 temp, temp_1, temp_2;
+  WORD16 qtemp;
+  WORD32 w1 = ia_mps_dec_mps_table_ptr->m1_m2_table_ptr->cld_tab_2[iid_lf_ls_idx + 15];
+  WORD32 w2 = ia_mps_dec_mps_table_ptr->m1_m2_table_ptr->cld_tab_2[iid_rf_rs_idx + 15];
+
+  if (prediction_mode == 1) {
+    if (abs(c1) >= ONE_IN_Q15) {
+      c1 = ONE_IN_Q15;
+    } else if ((c1 < MINUS_ONE_IN_Q14) && (c1 > MINUS_ONE_IN_Q15)) {
+      c1 = MINUS_ONE_IN_Q15 - (c1 << 1);
+    } else {
+      qtemp = 15;
+      temp = ixheaacd_mps_mult32(TWO_BY_THREE_Q15, c1, &qtemp, 15);
+      temp = ixheaacd_mps_convert_to_qn(temp, qtemp, 15);
+      c1 = ONE_BY_THREE_Q15 + temp;
+    }
+
+    if (abs(c2) >= ONE_IN_Q15) {
+      c2 = ONE_IN_Q15;
+    } else if ((c2 < MINUS_ONE_IN_Q14) && (c2 > MINUS_ONE_IN_Q15)) {
+      c2 = MINUS_ONE_IN_Q15 - (c2 << 1);
+    } else {
+      qtemp = 15;
+      temp = ixheaacd_mps_mult32(TWO_BY_THREE_Q15, c2, &qtemp, 15);
+      temp = ixheaacd_mps_convert_to_qn(temp, qtemp, 15);
+      qtemp = 15;
+      temp = ixheaacd_mps_add32(temp, ONE_BY_THREE_Q15, &qtemp, 15);
+      c2 = ixheaacd_mps_convert_to_qn(temp, qtemp, 15);
+    }
+  } else {
+    WORD32 c1p, c2p;
+    WORD64 acc;
+    const WORD32 *cld_tab_3 = ia_mps_dec_mps_table_ptr->m1_m2_table_ptr->cld_tab_3;
+    const WORD32 *sqrt_tab = ia_mps_dec_mps_table_ptr->common_table_ptr->sqrt_tab;
+
+    c1p = cld_tab_3[c1 + 15];
+    c2p = cld_tab_3[c2 + 15];
+
+    acc = (WORD64)((WORD64)c1p * (WORD64)c2p);
+    acc >>= 15;
+    temp = (WORD32)acc;
+    temp_1 = (ONE_IN_Q15 + c2p) << 1;
+    acc += temp_1;
+    temp_2 = (WORD32)acc;
+
+    temp = ixheaacd_mps_div_32(temp, temp_2, &qtemp);
+
+    c1 = ixheaacd_mps_sqrt(temp, &qtemp, sqrt_tab);
+    c1 = ixheaacd_mps_convert_to_qn(c1, qtemp, 15);
+
+    temp_2 = c1p + temp_1;
+    temp = ixheaacd_mps_div_32(c1p, temp_2, &qtemp);
+    c2 = ixheaacd_mps_sqrt(temp, &qtemp, sqrt_tab);
+    c2 = ixheaacd_mps_convert_to_qn(c2, qtemp, 15);
+  }
+  temp_1 = ONE_IN_Q15 + w1;
+  temp_2 = ixheaacd_mps_mult32_shr_15(c1, w1);
+  *weight1 = ixheaacd_mps_div32_in_q15(temp_2, temp_1);
+
+  temp_1 = ONE_IN_Q15 + w2;
+  temp_2 = ixheaacd_mps_mult32_shr_15(c2, w2);
+  *weight2 = ixheaacd_mps_div32_in_q15(temp_2, temp_1);
+}
+
+VOID ixheaacd_invert_matrix(WORD32 weight1, WORD32 weight2, WORD32 h_real[][2],
+                            WORD32 h_imag[][2],
+                            const ia_mps_dec_common_tables_struct *common_tab_ptr) {
+  WORD32 h11_f_real, h12_f_real, h21_f_real, h22_f_real;
+  WORD32 h11_f_imag, h12_f_imag, h21_f_imag, h22_f_imag;
+
+  WORD32 inv_norm_real, inv_norm_imag, inv_norm;
+
+  WORD32 len1, len2;
+  WORD16 q_len1 = 0, q_len2 = 0;
+
+  WORD64 acc1, acc2;
+
+  len1 = ixheaacd_mps_sqrt((ONE_IN_Q15 - (weight1 << 1) + ((weight1 * weight1) >> 14)), &q_len1,
+                           common_tab_ptr->sqrt_tab);
+
+  len2 = ixheaacd_mps_sqrt((ONE_IN_Q15 - (weight2 << 1) + ((weight2 * weight2) >> 14)), &q_len2,
+                           common_tab_ptr->sqrt_tab);
+
+  len1 = ixheaacd_mps_convert_to_qn(len1, q_len1, 15);
+  len2 = ixheaacd_mps_convert_to_qn(len2, q_len2, 15);
+
+  h11_f_real = ixheaacd_mps_div32_in_q15((ONE_IN_Q15 - weight1), len1);
+
+  h11_f_imag = ixheaacd_mps_div32_in_q15(weight1, len1);
+
+  h22_f_imag = -(ixheaacd_mps_div32_in_q15(weight2, len2));
+
+  h12_f_real = 0;
+
+  h12_f_imag = ixheaacd_mps_mult32_shr_15(h22_f_imag, ONE_BY_SQRT_3_Q15);
+
+  h21_f_real = 0;
+
+  h21_f_imag = ixheaacd_mps_mult32_shr_15(h11_f_imag, -(ONE_BY_SQRT_3_Q15));
+
+  h22_f_real = ixheaacd_mps_div32_in_q15((ONE_IN_Q15 - weight2), len2);
+
+  acc1 =
+      (WORD64)((WORD64)h11_f_real * (WORD64)h22_f_real - (WORD64)h11_f_imag * (WORD64)h22_f_imag);
+  acc1 >>= 15;
+
+  acc2 =
+      (WORD64)((WORD64)h12_f_real * (WORD64)h21_f_real - (WORD64)h12_f_imag * (WORD64)h21_f_imag);
+  acc2 >>= 15;
+  inv_norm_real = (WORD32)(acc1 - acc2);
+
+  acc1 =
+      (WORD64)((WORD64)h11_f_real * (WORD64)h22_f_imag + (WORD64)h11_f_imag * (WORD64)h22_f_real);
+  acc1 >>= 15;
+
+  acc2 =
+      (WORD64)((WORD64)h12_f_real * (WORD64)h21_f_imag + (WORD64)h12_f_imag * (WORD64)h21_f_real);
+  acc2 >>= 15;
+  inv_norm_imag = (WORD32)(acc1 + acc2);
+
+  acc1 = (WORD64)((WORD64)inv_norm_real * (WORD64)inv_norm_real +
+                  (WORD64)inv_norm_imag * (WORD64)inv_norm_imag);
+  acc1 >>= 15;
+  inv_norm = (WORD32)acc1;
+
+  inv_norm_real = ixheaacd_mps_div32_in_q15(inv_norm_real, inv_norm);
+  inv_norm_imag = -(ixheaacd_mps_div32_in_q15(inv_norm_imag, inv_norm));
+
+  acc1 = (WORD64)((WORD64)h22_f_real * (WORD64)inv_norm_real -
+                  (WORD64)h22_f_imag * (WORD64)inv_norm_imag);
+  acc1 >>= 15;
+  h_real[0][0] = (WORD32)acc1;
+
+  acc1 = (WORD64)((WORD64)h22_f_real * (WORD64)inv_norm_imag +
+                  (WORD64)h22_f_imag * (WORD64)inv_norm_real);
+  acc1 >>= 15;
+  h_imag[0][0] = (WORD32)acc1;
+
+  acc1 = (WORD64)((WORD64)h12_f_imag * (WORD64)inv_norm_imag -
+                  (WORD64)h12_f_real * (WORD64)inv_norm_real);
+  acc1 >>= 15;
+  h_real[0][1] = (WORD32)acc1;
+
+  acc1 = (WORD64)((WORD64)h12_f_real * (WORD64)inv_norm_imag +
+                  (WORD64)h12_f_imag * (WORD64)inv_norm_real);
+  acc1 = -(acc1 >> 15);
+  h_imag[0][1] = (WORD32)acc1;
+
+  acc1 = (WORD64)((WORD64)h21_f_imag * (WORD64)inv_norm_imag -
+                  (WORD64)h21_f_real * (WORD64)inv_norm_real);
+  acc1 >>= 15;
+  h_real[1][0] = (WORD32)acc1;
+
+  acc1 = (WORD64)((WORD64)h21_f_real * (WORD64)inv_norm_imag +
+                  (WORD64)h21_f_imag * (WORD64)inv_norm_real);
+  acc1 = -(acc1 >> 15);
+  h_imag[1][0] = (WORD32)acc1;
+
+  acc1 = (WORD64)((WORD64)h11_f_real * (WORD64)inv_norm_real -
+                  (WORD64)h11_f_imag * (WORD64)inv_norm_imag);
+  acc1 >>= 15;
+  h_real[1][1] = (WORD32)acc1;
+
+  acc1 = (WORD64)((WORD64)h11_f_real * (WORD64)inv_norm_imag +
+                  (WORD64)h11_f_imag * (WORD64)inv_norm_real);
+  acc1 >>= 15;
+  h_imag[1][1] = (WORD32)acc1;
+}
+
+WORD32 ixheaacd_dequant_icc_band(WORD32 iccband, WORD32 cldband) {
+  if (iccband < 6) {
+    return iccband;
+  }
+  if (iccband == 6) {
+    if (cldband > 9 && cldband < 21) {
+      switch (cldband) {
+        case 10:
+        case 20:
+          return 10;
+        case 11:
+        case 19:
+          return 11;
+        case 12:
+        case 18:
+          return 12;
+        case 13:
+        case 17:
+          return 13;
+        case 14:
+        case 16:
+          return 14;
+        case 15:
+          return 15;
+        default:
+          return iccband;
+      }
+    } else {
+      return iccband;
+    }
+  }
+  if (7 == iccband) {
+    if (cldband > 7 && cldband < 23) {
+      switch (cldband) {
+        case 8:
+        case 22:
+          return 8;
+        case 9:
+        case 21:
+          return 9;
+        case 10:
+        case 20:
+          return 10;
+        case 11:
+        case 19:
+          return 11;
+        case 12:
+        case 18:
+          return 12;
+        case 13:
+        case 17:
+          return 13;
+        case 14:
+        case 16:
+          return 14;
+        case 15:
+          return 15;
+        default:
+          return iccband;
+      }
+    } else {
+      return iccband;
+    }
+  } else {
+    return iccband;
+  }
+}
+
+WORD32 ixheaacd_dequant_cld_band(WORD32 cld) {
+  switch (cld) {
+    case -4915200:
+      return 0;
+    case -1474560:
+      return 1;
+    case -1310720:
+      return 2;
+    case -1146880:
+      return 3;
+    case -983040:
+      return 4;
+    case -819200:
+      return 5;
+    case -720896:
+      return 6;
+    case -622592:
+      return 7;
+    case -524288:
+      return 8;
+    case -425984:
+      return 9;
+    case -327680:
+      return 10;
+    case -262144:
+      return 11;
+    case -196608:
+      return 12;
+    case -131072:
+      return 13;
+    case -65536:
+      return 14;
+    case 0:
+      return 15;
+    case 65536:
+      return 16;
+    case 131072:
+      return 17;
+    case 196608:
+      return 18;
+    case 262144:
+      return 19;
+    case 327680:
+      return 20;
+    case 425984:
+      return 21;
+    case 524288:
+      return 22;
+    case 622592:
+      return 23;
+    case 720896:
+      return 24;
+    case 819200:
+      return 25;
+    case 983040:
+      return 26;
+    case 1146880:
+      return 27;
+    case 1310720:
+      return 28;
+    case 1474560:
+      return 29;
+    case 4915200:
+      return 30;
+    default:
+      return 0;
+  }
+}
+
+VOID ixheaacd_param_2_umx_ps_core_tables(
+    WORD32 cld[MAX_PARAMETER_BANDS], WORD32 icc[MAX_PARAMETER_BANDS], WORD32 num_ott_bands,
+    WORD32 res_bands, WORD32 h11[MAX_PARAMETER_BANDS], WORD32 h12[MAX_PARAMETER_BANDS],
+    WORD32 h21[MAX_PARAMETER_BANDS], WORD32 h22[MAX_PARAMETER_BANDS],
+    WORD32 h12_res[MAX_PARAMETER_BANDS], WORD32 h22_res[MAX_PARAMETER_BANDS],
+    WORD16 c_l[MAX_PARAMETER_BANDS], WORD16 c_r[MAX_PARAMETER_BANDS],
+    const ia_mps_dec_m1_m2_tables_struct *ixheaacd_mps_dec_m1_m2_tables) {
+  WORD32 band;
+  WORD32 quant_band_cld, quant_band_icc;
+
+  for (band = 0; band < num_ott_bands; band++) {
+    quant_band_cld = ixheaacd_dequant_cld_band(cld[band]);
+
+    c_l[band] = (WORD16)ixheaacd_mps_dec_m1_m2_tables->c_l_table[quant_band_cld];
+    c_r[band] = (WORD16)ixheaacd_mps_dec_m1_m2_tables->c_l_table[30 - quant_band_cld];
+  }
+
+  for (band = 0; band < num_ott_bands; band++) {
+    if (band < res_bands) {
+      quant_band_cld = ixheaacd_dequant_cld_band(cld[band]);
+      quant_band_icc = ixheaacd_dequant_icc_band(icc[band], quant_band_cld);
+
+      h11[band] = ixheaacd_mps_dec_m1_m2_tables->cos_table[quant_band_icc][quant_band_cld];
+      h11[band] = ixheaacd_mps_mult32_shr_15(h11[band], c_l[band]);
+      h21[band] = ixheaacd_mps_dec_m1_m2_tables->cos_table[quant_band_icc][30 - quant_band_cld];
+      h21[band] = ixheaacd_mps_mult32_shr_15(h21[band], c_r[band]);
+
+      h12[band] = 0;
+      h22[band] = 0;
+      h12_res[band] = ONE_IN_Q15;
+      h22_res[band] = MINUS_ONE_IN_Q15;
+    } else {
+      quant_band_cld = ixheaacd_dequant_cld_band(cld[band]);
+      if (quant_band_cld < 0 || quant_band_cld >= 31) {
+        quant_band_cld = 30;
+      }
+
+      quant_band_icc = icc[band];
+
+      if (quant_band_icc < 0 || quant_band_icc >= 8) {
+        quant_band_icc = 7;
+      }
+      h11[band] = ixheaacd_mps_dec_m1_m2_tables->cos_table[quant_band_icc][quant_band_cld];
+      h11[band] = ixheaacd_mps_mult32_shr_15(h11[band], c_l[band]);
+      h21[band] = ixheaacd_mps_dec_m1_m2_tables->cos_table[quant_band_icc][30 - quant_band_cld];
+      h21[band] = ixheaacd_mps_mult32_shr_15(h21[band], c_r[band]);
+      h12[band] = ixheaacd_mps_dec_m1_m2_tables->sin_table[quant_band_icc][quant_band_cld];
+      h12[band] = ixheaacd_mps_mult32_shr_15(h12[band], c_l[band]);
+      h22[band] = -ixheaacd_mps_dec_m1_m2_tables->sin_table[quant_band_icc][30 - quant_band_cld];
+      h22[band] = ixheaacd_mps_mult32_shr_15(h22[band], c_r[band]);
+
+      h12_res[band] = 0;
+      h22_res[band] = 0;
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_param_2_umx_ps(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 *h11, WORD32 *h12,
+                             WORD32 *h21, WORD32 *h22, WORD32 *h12_res, WORD32 *h22_res,
+                             WORD16 *c_l, WORD16 *c_r, WORD32 ott_box_indx,
+                             WORD32 parameter_set_indx, WORD32 res_bands) {
+  WORD32 band;
+  ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+
+  ixheaacd_param_2_umx_ps_core_tables(p_aux_struct->ott_cld[ott_box_indx][parameter_set_indx],
+                                      p_cur_bs->ott_icc_idx[ott_box_indx][parameter_set_indx],
+                                      p_aux_struct->num_ott_bands[ott_box_indx], res_bands, h11,
+                                      h12, h21, h22, h12_res, h22_res, c_l, c_r,
+                                      pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr);
+
+  for (band = p_aux_struct->num_ott_bands[ott_box_indx]; band < num_parameter_bands; band++) {
+    h11[band] = h21[band] = h12[band] = h22[band] = h12_res[band] = h22_res[band] = 0;
+  }
+  return;
+}
+
+static WORD32 ixheaacd_dequant_one_by_icc(WORD32 icc) {
+  switch (icc) {
+    case 32768:
+      return 32768;
+    case 30704:
+      return 34971;
+    case 27564:
+      return 38955;
+    case 19691:
+      return 54530;
+    case 12047:
+      return 89131;
+    case 0:
+      return 0;
+    case -19300:
+      return -55633;
+    case -32440:
+      return -33099;
+    default:
+      return 0;
+  }
+}
+
+static WORD16 ixheaacd_map_cld_index(WORD32 cld_val) {
+  WORD32 temp = cld_val;
+  WORD16 idx = 0;
+  if (cld_val == 0) {
+    return 15;
+  } else {
+    if (cld_val < 0) {
+      temp = -cld_val;
+    }
+    switch (temp) {
+      case 150:
+        idx = 15;
+        break;
+      case 45:
+        idx = 14;
+        break;
+      case 40:
+        idx = 13;
+        break;
+      case 35:
+        idx = 12;
+        break;
+      case 30:
+        idx = 11;
+        break;
+      case 25:
+        idx = 10;
+        break;
+      case 22:
+        idx = 9;
+        break;
+      case 19:
+        idx = 8;
+        break;
+      case 16:
+        idx = 7;
+        break;
+      case 13:
+        idx = 6;
+        break;
+      case 10:
+        idx = 5;
+        break;
+      case 8:
+        idx = 4;
+        break;
+      case 6:
+        idx = 3;
+        break;
+      case 4:
+        idx = 2;
+        break;
+      case 2:
+        idx = 1;
+        break;
+      default:
+        idx = 0;
+        break;
+    }
+  }
+
+  return (cld_val >= 0) ? idx + 15 : 15 - idx;
+}
+
+VOID ixheaacd_calculate_ttt(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps, WORD32 pb,
+                            WORD32 ttt_mode, WORD32 m_ttt[][3]) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 col;
+
+  if (ttt_mode < 2) {
+    m_ttt[0][0] = (p_aux_struct->ttt_cpc_1[0][ps][pb] + ONE_IN_Q16);
+    m_ttt[0][1] = (p_aux_struct->ttt_cpc_2[0][ps][pb] - ONE_IN_Q15);
+    m_ttt[1][0] = (p_aux_struct->ttt_cpc_1[0][ps][pb] - ONE_IN_Q15);
+    m_ttt[1][1] = (p_aux_struct->ttt_cpc_2[0][ps][pb] + ONE_IN_Q16);
+    m_ttt[2][0] = (ONE_IN_Q15 - p_aux_struct->ttt_cpc_1[0][ps][pb]);
+    m_ttt[2][1] = (ONE_IN_Q15 - p_aux_struct->ttt_cpc_2[0][ps][pb]);
+
+    if (pb >= pstr_mps_state->res_bands[3]) {
+      WORD32 one_by_icc;
+      one_by_icc = ixheaacd_dequant_one_by_icc(p_aux_struct->ttt_icc[0][ps][pb]);
+
+      m_ttt[0][0] = ixheaacd_mps_mult32_shr_15(m_ttt[0][0], one_by_icc);
+      m_ttt[0][1] = ixheaacd_mps_mult32_shr_15(m_ttt[0][1], one_by_icc);
+      m_ttt[1][0] = ixheaacd_mps_mult32_shr_15(m_ttt[1][0], one_by_icc);
+      m_ttt[1][1] = ixheaacd_mps_mult32_shr_15(m_ttt[1][1], one_by_icc);
+      m_ttt[2][0] = ixheaacd_mps_mult32_shr_15(m_ttt[2][0], one_by_icc);
+      m_ttt[2][1] = ixheaacd_mps_mult32_shr_15(m_ttt[2][1], one_by_icc);
+    }
+
+    m_ttt[0][0] = ixheaacd_mult32x16in32(m_ttt[0][0], TWO_BY_THREE_Q15);
+    m_ttt[0][1] = ixheaacd_mult32x16in32(m_ttt[0][1], TWO_BY_THREE_Q15);
+    m_ttt[1][0] = ixheaacd_mult32x16in32(m_ttt[1][0], TWO_BY_THREE_Q15);
+    m_ttt[1][1] = ixheaacd_mult32x16in32(m_ttt[1][1], TWO_BY_THREE_Q15);
+    m_ttt[2][0] = ixheaacd_mult32x16in32(m_ttt[2][0], TWO_BY_THREE_Q15);
+    m_ttt[2][1] = ixheaacd_mult32x16in32(m_ttt[2][1], TWO_BY_THREE_Q15);
+  } else {
+    WORD32 center_wiener;
+    WORD32 center_subtraction;
+    WORD32 c1d, c2d;
+    WORD64 prod;
+    WORD32 w11, w00, w20, w21;
+    WORD16 q_w11, q_w00, q_w20, q_w21;
+
+    const WORD32 *ten_cld_by_10 =
+        pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->ten_cld_by_10;
+
+    ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+    WORD16 index = ixheaacd_map_cld_index(p_aux_struct->ttt_cld_1[0][ps][pb] >> 15);
+
+    c1d = ten_cld_by_10[index];
+
+    index = ixheaacd_map_cld_index(p_aux_struct->ttt_cld_2[0][ps][pb] >> 15);
+    c2d = ten_cld_by_10[index];
+
+    if (p_cur_bs->cmp_ttt_cld_1_idx[0][ps][pb] == 15 ||
+        p_cur_bs->cmp_ttt_cld_2_idx[0][ps][pb] == 15) {
+      if (p_cur_bs->cmp_ttt_cld_1_idx[0][ps][pb] == 15) {
+        if (p_cur_bs->cmp_ttt_cld_2_idx[0][ps][pb] == -15) {
+          w00 = ONE_BY_SQRT_2_Q15;
+          w20 = ONE_BY_SQRT_8_Q15;
+        } else {
+          w00 = ONE_IN_Q15;
+          w20 = 0;
+        }
+
+        if (p_cur_bs->cmp_ttt_cld_2_idx[0][ps][pb] == 15) {
+          w11 = ONE_BY_SQRT_2_Q15;
+          w21 = ONE_BY_SQRT_8_Q15;
+        } else {
+          w11 = ONE_IN_Q15;
+          w21 = 0;
+        }
+
+        m_ttt[0][0] = w00;
+        m_ttt[2][0] = w20;
+        m_ttt[2][1] = w21;
+        m_ttt[1][1] = w11;
+      }
+
+      if (p_cur_bs->cmp_ttt_cld_2_idx[0][ps][pb] == 15) {
+        const WORD32 *w00_cld2_15 =
+            pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->w00_cld2_15;
+
+        if (p_cur_bs->cmp_ttt_cld_1_idx[0][ps][pb] == 15) {
+          w11 = ONE_BY_SQRT_2_Q15;
+          w21 = ONE_BY_SQRT_8_Q15;
+        } else {
+          w11 = 0;
+          w21 = ONE_IN_Q14;
+        }
+
+        w00 = w00_cld2_15[p_cur_bs->cmp_ttt_cld_1_idx[0][ps][pb] + 15];
+        w20 = w00_cld2_15[15 - p_cur_bs->cmp_ttt_cld_1_idx[0][ps][pb]] / 2;
+        m_ttt[0][0] = w00;
+        m_ttt[2][0] = w20;
+        m_ttt[2][1] = w21;
+        m_ttt[1][1] = w11;
+      }
+
+      m_ttt[0][1] = 0;
+      m_ttt[1][0] = 0;
+    } else {
+      WORD32 temporary;
+      const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+      prod = ixheaacd_mps_mult32_shr_15(c1d, c2d);
+
+      temporary = ixheaacd_add32_sat(ONE_IN_Q15, c2d);
+      temporary = ixheaacd_add32_sat(temporary, (WORD32)prod);
+      w00 = ixheaacd_mps_div_32((WORD32)prod, temporary, &q_w00);
+
+      w11 = ixheaacd_mps_div_32(c1d, (ixheaacd_add32_sat3(c1d, c2d, ONE_IN_Q15)), &q_w11);
+
+      w20 = ixheaacd_mps_div_32((ixheaacd_add32_sat(c2d, ONE_IN_Q15)),
+                                ixheaacd_add32_sat3(ONE_IN_Q15, (WORD32)prod, c2d), &q_w20);
+
+      w21 = ixheaacd_mps_div_32(ixheaacd_add32_sat(c2d, ONE_IN_Q15),
+                                (ixheaacd_add32_sat3(c1d, c2d, ONE_IN_Q15)), &q_w21);
+
+      m_ttt[0][0] = ixheaacd_mps_sqrt(w00, &q_w00, sqrt_tab);
+      m_ttt[0][0] = ixheaacd_mps_convert_to_qn(m_ttt[0][0], q_w00, 15);
+
+      m_ttt[0][1] = 0;
+      m_ttt[1][0] = 0;
+
+      m_ttt[1][1] = ixheaacd_mps_sqrt(w11, &q_w11, sqrt_tab);
+      m_ttt[1][1] = ixheaacd_mps_convert_to_qn(m_ttt[1][1], q_w11, 15);
+
+      m_ttt[2][0] = ixheaacd_mps_sqrt(w20, &q_w20, sqrt_tab) >> 1;
+
+      m_ttt[2][0] = ixheaacd_mps_convert_to_qn(m_ttt[2][0], q_w20, 15);
+
+      m_ttt[2][1] = ixheaacd_mps_sqrt(w21, &q_w21, sqrt_tab) >> 1;
+
+      m_ttt[2][1] = ixheaacd_mps_convert_to_qn(m_ttt[2][1], q_w21, 15);
+      if (p_aux_struct->ttt_cld_1[0][ps][pb] == 4915200) {
+        m_ttt[0][0] = 32767;
+        m_ttt[1][1] = 32767;
+        m_ttt[2][0] = 0;
+        m_ttt[2][1] = 0;
+      }
+    }
+
+    center_wiener = 0;
+    center_subtraction = (ttt_mode == 2 || ttt_mode == 3);
+
+    if (center_wiener) {
+      WORD32 cld_1_idx = p_cur_bs->cmp_ttt_cld_1_idx[0][ps][pb];
+      WORD32 cld_2_idx = p_cur_bs->cmp_ttt_cld_2_idx[0][ps][pb];
+
+      if (cld_1_idx == 15 && cld_2_idx == 15) {
+        m_ttt[2][0] = 0;
+        m_ttt[2][1] = ONE_BY_SQRT_2_Q15;
+      } else if (cld_1_idx == 15) {
+        if (cld_2_idx == -15)
+          m_ttt[2][0] = ONE_BY_SQRT_2_Q15;
+        else
+          m_ttt[2][0] = 0;
+        m_ttt[2][1] = 0;
+      } else if (cld_2_idx == 15) {
+        m_ttt[2][0] = 0;
+        m_ttt[2][1] = ONE_IN_Q15;
+      } else {
+        WORD32 temp;
+        WORD16 q_temp;
+        const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+
+        prod = ixheaacd_mps_mult32_shr_15(c2d, (c2d + c1d + ONE_IN_Q16)) + ONE_IN_Q15;
+
+        temp = ixheaacd_mps_div_32((WORD32)ONE_IN_Q15, (WORD32)prod, &q_temp);
+
+        m_ttt[2][0] = ixheaacd_mps_sqrt(temp, &q_temp, sqrt_tab);
+        m_ttt[2][0] = ixheaacd_mps_convert_to_qn(m_ttt[2][0], q_temp, 15);
+
+        m_ttt[2][1] = ixheaacd_mps_mult32_shr_15(c2d, m_ttt[2][0]);
+      }
+    }
+
+    if (center_subtraction) {
+      WORD32 wl1, wl2, wr1, wr2;
+      WORD16 q_wl1, q_wr1;
+      WORD32 cld_1_idx = p_cur_bs->cmp_ttt_cld_1_idx[0][ps][pb];
+      WORD32 cld_2_idx = p_cur_bs->cmp_ttt_cld_2_idx[0][ps][pb];
+
+      if (cld_1_idx == 15 && cld_2_idx == 15) {
+        m_ttt[0][0] = ONE_IN_Q15;
+        m_ttt[0][1] = MINUS_ONE_IN_Q14;
+        m_ttt[1][1] = ONE_BY_SQRT_2_Q15;
+        m_ttt[1][0] = 0;
+      } else if (cld_1_idx == 15) {
+        if (cld_2_idx == -15) {
+          m_ttt[0][0] = ONE_BY_SQRT_2_Q15;
+          m_ttt[1][0] = MINUS_ONE_IN_Q14;
+        } else {
+          m_ttt[0][0] = ONE_IN_Q15;
+          m_ttt[1][0] = 0;
+        }
+
+        m_ttt[0][1] = 0;
+        m_ttt[1][1] = ONE_IN_Q15;
+      } else if (cld_2_idx == 15) {
+        m_ttt[0][0] = ONE_IN_Q15;
+        m_ttt[0][1] = MINUS_ONE_IN_Q15;
+        m_ttt[1][1] = 0;
+        m_ttt[1][0] = 0;
+      } else {
+        WORD32 temp, temp_1, q_a;
+        WORD16 q_c, q_l, q_r, q_temp, q_temp1;
+        WORD32 c;
+        WORD32 r;
+        WORD32 l;
+        const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+
+        c = ixheaacd_mps_div_32(ONE_IN_Q15, (ixheaacd_add32_sat(c1d, ONE_IN_Q15)), &q_c);
+        r = ixheaacd_mps_div_32(c1d, (ixheaacd_add32_sat(c2d, ONE_IN_Q15)), &q_r);
+        r = ixheaacd_mps_mult32_shr_30(r, c);
+        q_r = q_r + q_c - 30;
+
+        l = ixheaacd_mps_mult32_shr_30(c2d, r);
+        q_l = q_r - 15;
+
+        temp = ixheaacd_mps_div_32(r, l, &q_temp);
+        q_temp += (q_r - q_l);
+
+        if (q_temp > 28) {
+          temp = temp >> (q_temp - 28);
+          q_temp = 28;
+        }
+
+        temp += ((1 << q_temp) - 1);
+
+        temp = ixheaacd_add32_sat(
+            ixheaacd_mps_mult32_shr_n(c, temp, (WORD16)(q_c + q_temp - q_r)), r);
+        q_temp = q_r;
+
+        if (q_c > q_r) {
+          temp_1 = r + (c >> (q_c - q_r));
+          q_temp1 = q_r;
+        } else {
+          temp_1 = (r >> (q_r - q_c)) + c;
+          q_temp1 = q_c;
+        }
+
+        temp = ixheaacd_div32(temp_1, temp, &q_a);
+        q_wl1 = q_a + q_temp1 - q_temp;
+        wl1 = ixheaacd_mps_sqrt(temp, &q_wl1, sqrt_tab);
+        m_ttt[0][0] = ixheaacd_mps_convert_to_qn(wl1, q_wl1, 15);
+
+        temp = ixheaacd_div32(wl1, temp_1, &q_a);
+        q_temp = q_a + (q_wl1 - q_temp1);
+        wl2 = ixheaacd_mps_mult32_shr_n(c, temp, (WORD16)(q_c + q_temp - 15));
+        m_ttt[0][1] = ixheaacd_negate32_sat(wl2);
+
+        temp = ixheaacd_mps_div_32(l, r, &q_temp);
+        q_temp += (q_l - q_r);
+
+        if (q_temp > 28) {
+          temp = temp >> (q_temp - 28);
+          q_temp = 28;
+        }
+
+        temp = ixheaacd_add32_sat((1 << q_temp) - 1, temp);
+
+        temp = ixheaacd_add32_sat(
+                   ixheaacd_mps_mult32_shr_n(c, temp, (WORD16)(q_c + q_temp - q_l)), l);
+
+        q_temp = q_l;
+
+        if (q_c > q_l) {
+          temp_1 = l + (c >> (q_c - q_l));
+          q_temp1 = q_l;
+        } else {
+          temp_1 = (l >> (q_l - q_c)) + c;
+          q_temp1 = q_c;
+        }
+
+        temp = ixheaacd_div32(temp_1, temp, &q_a);
+        q_wr1 = q_a + q_temp1 - q_temp;
+        wr1 = ixheaacd_mps_sqrt(temp, &q_wr1, sqrt_tab);
+        m_ttt[1][1] = ixheaacd_mps_convert_to_qn(wr1, q_wr1, 15);
+
+        temp = ixheaacd_div32(wr1, temp_1, &q_a);
+        q_temp = q_a + (q_wl1 - q_temp1);
+        wr2 = ixheaacd_mps_mult32_shr_n(c, temp, (WORD16)(q_c + q_temp - 15));
+        m_ttt[1][0] = ixheaacd_negate32_sat(wr2);
+      }
+    }
+  }
+
+  m_ttt[0][2] = ONE_BY_THREE_Q15;
+  m_ttt[1][2] = ONE_BY_THREE_Q15;
+  m_ttt[2][2] = MINUS_ONE_BY_THREE_Q15;
+
+  for (col = 0; col < 3; col++) {
+    m_ttt[2][col] = ixheaacd_mps_mult32_shr_15(m_ttt[2][col], SQRT_TWO_Q15);
+  }
+}
+
+VOID ixheaacd_calculate_mtx_inv(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps, WORD32 pb,
+                                WORD32 mode, WORD32 h_real[][2], WORD32 h_imag[][2]) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+
+  WORD32 weight1;
+  WORD32 weight2;
+  ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+
+  if (mode < 2) {
+    ixheaacd_get_matrix_inversion_weights(
+        p_cur_bs->ott_cld_idx[1][ps][pb], p_cur_bs->ott_cld_idx[2][ps][pb], 1,
+        p_aux_struct->ttt_cpc_1[0][ps][pb], p_aux_struct->ttt_cpc_2[0][ps][pb], &weight1,
+        &weight2, &(pstr_mps_state->ia_mps_dec_mps_table));
+  } else {
+    ixheaacd_get_matrix_inversion_weights(
+        p_cur_bs->ott_cld_idx[1][ps][pb], p_cur_bs->ott_cld_idx[2][ps][pb], 0,
+        p_cur_bs->cmp_ttt_cld_1_idx[0][ps][pb], p_cur_bs->cmp_ttt_cld_2_idx[0][ps][pb], &weight1,
+        &weight2, &(pstr_mps_state->ia_mps_dec_mps_table));
+  }
+
+  ixheaacd_invert_matrix(weight1, weight2, h_real, h_imag,
+                         pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr);
+}
+
+VOID ixheaacd_calculate_arb_dmx_mtx(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps,
+                                    WORD32 pb, WORD32 g_real[]) {
+  WORD32 ch;
+  WORD32 gain;
+
+  WORD32 *arbdmx_alpha_prev = pstr_mps_state->mps_persistent_mem.arbdmx_alpha_prev;
+  WORD32 *arbdmx_alpha_upd_set = pstr_mps_state->aux_struct->arbdmx_alpha_upd_set;
+  WORD32 *arbdmx_alpha = pstr_mps_state->aux_struct->arbdmx_alpha;
+
+  WORD32 n_ch_in = pstr_mps_state->num_input_channels;
+  WORD32 temp_1;
+  for (ch = 0; ch < n_ch_in; ch++) {
+    temp_1 = pstr_mps_state->bs_frame->arbdmx_gain_idx[ch][ps][pb] + 15;
+    gain = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->dec_pow[temp_1];
+
+    if (pb < pstr_mps_state->arbdmx_residual_bands) {
+      if ((ps == 0) && (arbdmx_alpha_upd_set[ch] == 1)) {
+        g_real[ch] = ixheaacd_mps_mult32_shr_15(*arbdmx_alpha_prev, gain);
+      } else {
+        g_real[ch] = ixheaacd_mps_mult32_shr_15(arbdmx_alpha[ch], gain);
+      }
+    } else {
+      g_real[ch] = gain;
+    }
+    arbdmx_alpha_prev++;
+  }
+}
+
+WORD32 ixheaacd_quantize(WORD32 cld) {
+  switch (cld) {
+    case -150:
+      return -15;
+    case -45:
+      return -14;
+    case -40:
+      return -13;
+    case -35:
+      return -12;
+    case -30:
+      return -11;
+    case -25:
+      return -10;
+    case -22:
+      return -9;
+    case -19:
+      return -8;
+    case -16:
+      return -7;
+    case -13:
+      return -6;
+    case -10:
+      return -5;
+    case -8:
+      return -4;
+    case -6:
+      return -3;
+    case -4:
+      return -2;
+    case -2:
+      return -1;
+    case 0:
+      return 0;
+    case 2:
+      return 1;
+    case 4:
+      return 2;
+    case 6:
+      return 3;
+    case 8:
+      return 4;
+    case 10:
+      return 5;
+    case 13:
+      return 6;
+    case 16:
+      return 7;
+    case 19:
+      return 8;
+    case 22:
+      return 9;
+    case 25:
+      return 10;
+    case 30:
+      return 11;
+    case 35:
+      return 12;
+    case 40:
+      return 13;
+    case 45:
+      return 14;
+    case 150:
+      return 15;
+    default:
+      return 0;
+  }
+}
diff --git a/decoder/ixheaacd_mps_calc_m1m2_common.h b/decoder/ixheaacd_mps_calc_m1m2_common.h
new file mode 100644
index 0000000..ffdc557
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_common.h
@@ -0,0 +1,52 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_CALC_M1M2_COMMON_H
+#define IXHEAACD_MPS_CALC_M1M2_COMMON_H
+
+VOID ixheaacd_param_2_umx_ps(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 *h11, WORD32 *h12,
+                             WORD32 *h21, WORD32 *h22, WORD32 *h12_res, WORD32 *h22_res,
+                             WORD16 *c_l, WORD16 *c_r, WORD32 ott_box_indx,
+                             WORD32 parameter_set_indx, WORD32 res_bands);
+
+VOID ixheaacd_get_matrix_inversion_weights(
+    WORD32 iid_lf_ls_idx, WORD32 iid_rf_rs_idx, WORD32 prediction_mode, WORD32 c1, WORD32 c2,
+    WORD32 *weight1, WORD32 *weight2, ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr);
+
+VOID ixheaacd_invert_matrix(WORD32 weight1, WORD32 weight2, WORD32 h_real[][2],
+                            WORD32 h_imag[][2],
+                            const ia_mps_dec_common_tables_struct *common_tab_ptr);
+
+VOID ixheaacd_calculate_arb_dmx_mtx(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps,
+                                    WORD32 pb, WORD32 g_real[]);
+
+VOID ixheaacd_param_2_umx_ps_core_tables(
+    WORD32 *cld, WORD32 *icc, WORD32 num_ott_bands, WORD32 res_bands, WORD32 *h11, WORD32 *h12,
+    WORD32 *h21, WORD32 *h22, WORD32 *h12_res, WORD32 *h22_res, WORD16 *c_l, WORD16 *c_r,
+    const ia_mps_dec_m1_m2_tables_struct *ixheaacd_mps_dec_m1_m2_tables);
+
+VOID ixheaacd_calculate_ttt(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps, WORD32 pb,
+                            WORD32 ttt_mode, WORD32 m_ttt[][3]);
+
+VOID ixheaacd_calculate_mtx_inv(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps, WORD32 pb,
+                                WORD32 mode, WORD32 h_real[][2], WORD32 h_imag[][2]);
+
+WORD32 ixheaacd_quantize(WORD32 cld);
+
+#endif /* IXHEAACD_MPS_CALC_M1M2_COMMON_H */
diff --git a/decoder/ixheaacd_mps_calc_m1m2_emm.c b/decoder/ixheaacd_mps_calc_m1m2_emm.c
new file mode 100644
index 0000000..276c149
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_emm.c
@@ -0,0 +1,189 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_sbr_common.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_calc_m1m2_common.h"
+
+VOID ixheaacd_calc_m1m2_emm(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 ps;
+  WORD32 pb;
+  WORD32 col;
+  WORD32 row;
+
+  WORD64 acc;
+  WORD32 *h11, *h12, *h21, *h22, *dummy1, *dummy2;
+  WORD16 *dummy3, *dummy4;
+
+  h11 = pstr_mps_state->mps_scratch_mem_v;
+  h12 = h11 + MAX_PARAMETER_BANDS;
+  h21 = h12 + MAX_PARAMETER_BANDS;
+  h22 = h21 + MAX_PARAMETER_BANDS;
+  dummy1 = h22 + MAX_PARAMETER_BANDS;
+  dummy2 = dummy1 + MAX_PARAMETER_BANDS;
+
+  dummy3 = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX12;
+  dummy4 = dummy3 + MAX_PARAMETER_BANDS;
+
+  for (ps = 0; ps < pstr_mps_state->num_parameter_sets; ps++) {
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11, h12, h21, h22, dummy1, dummy2, dummy3, dummy4, 0,
+                            ps, 0);
+
+    for (pb = 0; pb < pstr_mps_state->num_parameter_bands; pb++) {
+      WORD32 m11 = p_aux_struct->ttt_cpc_1[0][ps][pb] + ONE_IN_Q16;
+      WORD32 m12 = p_aux_struct->ttt_cpc_2[0][ps][pb] - ONE_IN_Q15;
+      WORD32 m21 = p_aux_struct->ttt_cpc_1[0][ps][pb] - ONE_IN_Q15;
+      WORD32 m22 = p_aux_struct->ttt_cpc_2[0][ps][pb] + ONE_IN_Q16;
+      WORD32 m31 = ONE_IN_Q15 - p_aux_struct->ttt_cpc_1[0][ps][pb];
+      WORD32 m32 = ONE_IN_Q15 - p_aux_struct->ttt_cpc_2[0][ps][pb];
+      WORD32 weight1;
+      WORD32 weight2;
+      WORD32 h_real[2][2];
+      WORD32 h_imag[2][2];
+
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+
+      ixheaacd_get_matrix_inversion_weights(
+          p_cur_bs->ott_cld_idx[0][ps][pb], p_cur_bs->ott_cld_idx[0][ps][pb], 1,
+          p_aux_struct->ttt_cpc_1[0][ps][pb], p_aux_struct->ttt_cpc_2[0][ps][pb], &weight1,
+          &weight2, &(pstr_mps_state->ia_mps_dec_mps_table));
+
+      ixheaacd_invert_matrix(weight1, weight2, h_real, h_imag,
+                             pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr);
+
+      pstr_mps_state->m1_param_imag_present = 1;
+
+      acc = (WORD64)((WORD64)h_real[0][0] * (WORD64)m11 + (WORD64)h_real[1][0] * (WORD64)m12);
+      acc >>= 15;
+      m1_param->m1_param_real[0][0][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_real[0][1] * (WORD64)m11 + (WORD64)h_real[1][1] * (WORD64)m12);
+      acc >>= 15;
+      m1_param->m1_param_real[0][1][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_imag[0][0] * (WORD64)m11 + (WORD64)h_imag[1][0] * (WORD64)m12);
+      acc >>= 15;
+      m1_param->m1_param_imag[0][0][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_imag[0][1] * (WORD64)m11 + (WORD64)h_imag[1][1] * (WORD64)m12);
+      acc >>= 15;
+      m1_param->m1_param_imag[0][1][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_real[0][0] * (WORD64)m21 + (WORD64)h_real[1][0] * (WORD64)m22);
+      acc >>= 15;
+      m1_param->m1_param_real[1][0][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_real[0][1] * (WORD64)m21 + (WORD64)h_real[1][1] * (WORD64)m22);
+      acc >>= 15;
+      m1_param->m1_param_real[1][1][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_imag[0][0] * (WORD64)m21 + (WORD64)h_imag[1][0] * (WORD64)m22);
+      acc >>= 15;
+      m1_param->m1_param_imag[1][0][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_imag[0][1] * (WORD64)m21 + (WORD64)h_imag[1][1] * (WORD64)m22);
+      acc >>= 15;
+      m1_param->m1_param_imag[1][1][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_real[0][0] * (WORD64)m31 + (WORD64)h_real[1][0] * (WORD64)m32);
+      acc >>= 15;
+      m1_param->m1_param_real[2][0][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_real[0][1] * (WORD64)m31 + (WORD64)h_real[1][1] * (WORD64)m32);
+      acc >>= 15;
+      m1_param->m1_param_real[2][1][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_imag[0][0] * (WORD64)m31 + (WORD64)h_imag[1][0] * (WORD64)m32);
+      acc >>= 15;
+      m1_param->m1_param_imag[2][0][ps][pb] = (WORD32)acc;
+
+      acc = (WORD64)((WORD64)h_imag[0][1] * (WORD64)m31 + (WORD64)h_imag[1][1] * (WORD64)m32);
+      acc >>= 15;
+      m1_param->m1_param_imag[2][1][ps][pb] = (WORD32)acc;
+
+      m1_param->m1_param_real[0][2][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[1][2][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[2][2][ps][pb] = -32768;
+
+      m1_param->m1_param_imag[0][2][ps][pb] = 0;
+      m1_param->m1_param_imag[1][2][ps][pb] = 0;
+      m1_param->m1_param_imag[2][2][ps][pb] = 0;
+
+      for (row = 0; row < 3; row++) {
+        for (col = 0; col < 3; col++) {
+          m1_param->m1_param_real[row][col][ps][pb] = ixheaacd_mps_mult32_shr_15(
+              m1_param->m1_param_real[row][col][ps][pb], ONE_BY_THREE_Q15);
+          m1_param->m1_param_imag[row][col][ps][pb] = ixheaacd_mps_mult32_shr_15(
+              m1_param->m1_param_imag[row][col][ps][pb], ONE_BY_THREE_Q15);
+        }
+
+        m1_param->m1_param_real[2][col][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[2][col][ps][pb], SQRT_TWO_Q15);
+        m1_param->m1_param_imag[2][col][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_imag[2][col][ps][pb], SQRT_TWO_Q15);
+
+        m1_param->m1_param_real[3][col][ps][pb] = m1_param->m1_param_real[0][col][ps][pb];
+        m1_param->m1_param_imag[3][col][ps][pb] = m1_param->m1_param_imag[0][col][ps][pb];
+        m1_param->m1_param_real[4][col][ps][pb] = m1_param->m1_param_real[1][col][ps][pb];
+        m1_param->m1_param_imag[4][col][ps][pb] = m1_param->m1_param_imag[1][col][ps][pb];
+        m1_param->m1_param_real[5][col][ps][pb] = 0;
+        m1_param->m1_param_imag[5][col][ps][pb] = 0;
+      }
+    }
+
+    for (pb = 0; pb < pstr_mps_state->num_parameter_bands; pb++) {
+      m2_param->m2_decor_real[0][ps][pb] = h12[pb];
+      m2_param->m2_decor_real[1][ps][pb] = h22[pb];
+      m2_param->m2_decor_real[2][ps][pb] = h12[pb];
+      m2_param->m2_decor_real[3][ps][pb] = h22[pb];
+    }
+
+    for (pb = 0; pb < pstr_mps_state->num_parameter_bands; pb++) {
+      m2_param->m2_resid_real[0][ps][pb] = h11[pb];
+      m2_param->m2_resid_real[1][ps][pb] = h21[pb];
+      m2_param->m2_resid_real[2][ps][pb] = h21[pb];
+      m2_param->m2_resid_real[3][ps][pb] = 32768;
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_calc_m1m2_tree_515x.c b/decoder/ixheaacd_mps_calc_m1m2_tree_515x.c
new file mode 100644
index 0000000..23875be
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_tree_515x.c
@@ -0,0 +1,463 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_calc_m1m2_common.h"
+
+VOID ixheaacd_calc_m1m2_5151(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  WORD32 ps, pb;
+  WORD32 *h11_fs, *h11_c;
+  WORD32 *h12_fs, *h12_c;
+  WORD32 *h21_fs, *h21_c;
+  WORD32 *h22_fs, *h22_c;
+  WORD32 *h12_res_fs, *h12_res_c;
+  WORD32 *h22_res_fs, *h22_res_c;
+  WORD16 *c_l_fs, *c_l_c;
+  WORD16 *c_r_fs, *c_r_c;
+
+  WORD32 *h11_f, *h11_s;
+  WORD32 *h12_f, *h12_s;
+  WORD32 *h21_f, *h21_s;
+  WORD32 *h22_f, *h22_s;
+  WORD32 *h12_res_f, *h12_res_s, *c_r_clfe;
+  WORD32 *h22_res_f, *h22_res_s, *c_l_clfe;
+  WORD16 *c_l_f, *c_l_s;
+  WORD16 *c_r_f, *c_r_s;
+
+  WORD32 idx;
+  WORD32 residual_coding = pstr_mps_state->residual_coding;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 arbitrary_downmix = pstr_mps_state->arbitrary_downmix;
+  WORD32 *res_bands = pstr_mps_state->res_bands;
+
+  h11_fs = pstr_mps_state->mps_scratch_mem_v;
+  h11_c = h11_fs + MAX_PARAMETER_BANDS;
+  h12_fs = h11_c + MAX_PARAMETER_BANDS;
+  h12_c = h12_fs + MAX_PARAMETER_BANDS;
+  h21_fs = h12_c + MAX_PARAMETER_BANDS;
+  h21_c = h21_fs + MAX_PARAMETER_BANDS;
+  h22_fs = h21_c + MAX_PARAMETER_BANDS;
+  h22_c = h22_fs + MAX_PARAMETER_BANDS;
+  h12_res_fs = h22_c + MAX_PARAMETER_BANDS;
+  h12_res_c = h12_res_fs + MAX_PARAMETER_BANDS;
+  h22_res_fs = h12_res_c + MAX_PARAMETER_BANDS;
+  h22_res_c = h22_res_fs + MAX_PARAMETER_BANDS;
+  h11_f = h22_res_c + MAX_PARAMETER_BANDS;
+  h11_s = h11_f + MAX_PARAMETER_BANDS;
+  h12_f = h11_s + MAX_PARAMETER_BANDS;
+  h12_s = h12_f + MAX_PARAMETER_BANDS;
+  h21_f = h12_s + MAX_PARAMETER_BANDS;
+  h21_s = h21_f + MAX_PARAMETER_BANDS;
+  h22_f = h21_s + MAX_PARAMETER_BANDS;
+  h22_s = h22_f + MAX_PARAMETER_BANDS;
+  h12_res_f = h22_s + MAX_PARAMETER_BANDS;
+  h12_res_s = h12_res_f + MAX_PARAMETER_BANDS;
+  h22_res_f = h12_res_s + MAX_PARAMETER_BANDS;
+  h22_res_s = h22_res_f + MAX_PARAMETER_BANDS;
+  c_r_clfe = h22_res_s + MAX_PARAMETER_BANDS;
+  c_l_clfe = c_r_clfe + MAX_PARAMETER_BANDS;
+
+  c_l_fs = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX52;
+  c_l_c = c_l_fs + MAX_PARAMETER_BANDS;
+  c_r_fs = c_l_c + MAX_PARAMETER_BANDS;
+  c_r_c = c_r_fs + MAX_PARAMETER_BANDS;
+  c_l_f = c_r_c + MAX_PARAMETER_BANDS;
+  c_l_s = c_l_f + MAX_PARAMETER_BANDS;
+  c_r_f = c_l_s + MAX_PARAMETER_BANDS;
+  c_r_s = c_r_f + MAX_PARAMETER_BANDS;
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_fs, h12_fs, h21_fs, h22_fs, h12_res_fs,
+                            h22_res_fs, c_l_fs, c_r_fs, 0, ps, res_bands[0]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_c, h12_c, h21_c, h22_c, h12_res_c, h22_res_c,
+                            c_l_c, c_r_c, 1, ps, res_bands[1]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_s, h12_s, h21_s, h22_s, h12_res_s, h22_res_s,
+                            c_l_s, c_r_s, 2, ps, res_bands[2]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_f, h12_f, h21_f, h22_f, h12_res_f, h22_res_f,
+                            c_l_f, c_r_f, 3, ps, res_bands[3]);
+
+    for (pb = 0; pb < p_aux_struct->num_ott_bands[4]; pb++) {
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+      c_l_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                         ->r1_matrix_l[p_cur_bs->ott_cld_idx[4][ps][pb] + 15];
+      c_r_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                         ->r1_matrix_l[15 - p_cur_bs->ott_cld_idx[4][ps][pb]];
+    }
+
+    for (pb = p_aux_struct->num_ott_bands[4]; pb < num_parameter_bands; pb++) {
+      c_l_clfe[pb] = ONE_IN_Q15;
+      c_r_clfe[pb] = 0;
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m1_param->m1_param_real[0][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[1][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[2][0][ps][pb] = c_l_fs[pb];
+      m1_param->m1_param_real[3][0][ps][pb] = ixheaacd_mult16_shl(c_l_fs[pb], c_l_c[pb]);
+      m1_param->m1_param_real[4][0][ps][pb] = c_r_fs[pb];
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m2_param->m2_decor_real[0][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h11_f[pb], ixheaacd_mps_mult32_shr_15(h11_c[pb], h12_fs[pb]));
+      m2_param->m2_decor_real[1][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_f[pb], h12_c[pb]);
+      m2_param->m2_decor_real[2][ps][pb] = h12_f[pb];
+
+      m2_param->m2_decor_real[3][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h21_f[pb], ixheaacd_mps_mult32_shr_15(h11_c[pb], h12_fs[pb]));
+      m2_param->m2_decor_real[4][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_f[pb], h12_c[pb]);
+      m2_param->m2_decor_real[5][ps][pb] = h22_f[pb];
+
+      m2_param->m2_decor_real[6][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          c_l_clfe[pb], ixheaacd_mps_mult32_shr_15(h21_c[pb], h12_fs[pb]));
+      m2_param->m2_decor_real[7][ps][pb] = ixheaacd_mps_mult32_shr_15(c_l_clfe[pb], h22_c[pb]);
+
+      m2_param->m2_decor_real[8][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_s[pb], h22_fs[pb]);
+      m2_param->m2_decor_real[9][ps][pb] = h12_s[pb];
+
+      m2_param->m2_decor_real[10][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_s[pb], h22_fs[pb]);
+      m2_param->m2_decor_real[11][ps][pb] = h22_s[pb];
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h11_f[pb], ixheaacd_mps_mult32_shr_15(h11_c[pb], h11_fs[pb]));
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+            h11_f[pb], ixheaacd_mps_mult32_shr_15(h11_c[pb], h12_res_fs[pb]));
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h11_f[pb], h12_res_c[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h12_res_f[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h21_f[pb], ixheaacd_mps_mult32_shr_15(h11_c[pb], h11_fs[pb]));
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+            h21_f[pb], ixheaacd_mps_mult32_shr_15(h11_c[pb], h12_res_fs[pb]));
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h21_f[pb], h12_res_c[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h22_res_f[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          c_l_clfe[pb], ixheaacd_mps_mult32_shr_15(h21_c[pb], h11_fs[pb]));
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+            c_l_clfe[pb], ixheaacd_mps_mult32_shr_15(h21_c[pb], h12_res_fs[pb]));
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(c_l_clfe[pb], h22_res_c[pb]);
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          c_r_clfe[pb], ixheaacd_mps_mult32_shr_15(c_r_c[pb], c_l_fs[pb]));
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_s[pb], h21_fs[pb]);
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h11_s[pb], h22_res_fs[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h12_res_s[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_s[pb], h21_fs[pb]);
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h21_s[pb], h22_res_fs[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h22_res_s[pb];
+      }
+    }
+  }
+
+  if (arbitrary_downmix > 0) {
+    for (ps = 0; ps < num_parameter_sets; ps++) {
+      for (pb = 0; pb < num_parameter_bands; pb++) {
+        WORD32 g_real[1];
+        ixheaacd_calculate_arb_dmx_mtx(pstr_mps_state, ps, pb, g_real);
+
+        if (arbitrary_downmix == 2) {
+          m1_param->m1_param_real[0][1][ps][pb] = m1_param->m1_param_real[0][0][ps][pb];
+          m1_param->m1_param_real[1][1][ps][pb] = m1_param->m1_param_real[1][0][ps][pb];
+          m1_param->m1_param_real[2][1][ps][pb] = m1_param->m1_param_real[2][0][ps][pb];
+          m1_param->m1_param_real[3][1][ps][pb] = m1_param->m1_param_real[3][0][ps][pb];
+          m1_param->m1_param_real[4][1][ps][pb] = m1_param->m1_param_real[4][0][ps][pb];
+
+          curr_state->m1_param_present[0][1] = 1;
+          curr_state->m1_param_present[1][1] = 1;
+          curr_state->m1_param_present[2][1] = 1;
+          curr_state->m1_param_present[3][1] = 1;
+          curr_state->m1_param_present[4][1] = 1;
+        }
+
+        m1_param->m1_param_real[0][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[0][0][ps][pb], g_real[0]);
+        m1_param->m1_param_real[1][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[1][0][ps][pb], g_real[0]);
+        m1_param->m1_param_real[2][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[2][0][ps][pb], g_real[0]);
+        m1_param->m1_param_real[3][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[3][0][ps][pb], g_real[0]);
+        m1_param->m1_param_real[4][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[4][0][ps][pb], g_real[0]);
+      }
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_calc_m1m2_5152(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  WORD32 ps, pb;
+
+  WORD32 *h11_lr, *h11_c, *h12_lr, *h12_c, *h21_lr, *h21_c, *h22_lr, *h22_c, *h12_res_lr,
+      *h12_res_c, *h22_res_lr, *h22_res_c;
+  WORD16 *c_l_lr, *c_l_c, *c_r_lr, *c_r_c;
+
+  WORD32 *h11_l, *h11_r, *h12_l, *h12_r, *h21_l, *h21_r, *h22_l, *h22_r, *h12_res_l, *h12_res_r,
+      *h22_res_l, *h22_res_r, *c_l_clfe, *c_r_clfe;
+  WORD16 *c_l_l, *c_l_r, *c_r_l, *c_r_r;
+
+  WORD32 idx;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 residual_coding = pstr_mps_state->residual_coding;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 arbitrary_downmix = pstr_mps_state->arbitrary_downmix;
+  WORD32 *res_bands = pstr_mps_state->res_bands;
+
+  h11_lr = pstr_mps_state->mps_scratch_mem_v;
+  h11_c = h11_lr + MAX_PARAMETER_BANDS;
+  h12_lr = h11_c + MAX_PARAMETER_BANDS;
+  h12_c = h12_lr + MAX_PARAMETER_BANDS;
+  h21_lr = h12_c + MAX_PARAMETER_BANDS;
+  h21_c = h21_lr + MAX_PARAMETER_BANDS;
+  h22_lr = h21_c + MAX_PARAMETER_BANDS;
+  h22_c = h22_lr + MAX_PARAMETER_BANDS;
+  h12_res_lr = h22_c + MAX_PARAMETER_BANDS;
+  h12_res_c = h12_res_lr + MAX_PARAMETER_BANDS;
+  h22_res_lr = h12_res_c + MAX_PARAMETER_BANDS;
+  h22_res_c = h22_res_lr + MAX_PARAMETER_BANDS;
+  h11_l = h22_res_c + MAX_PARAMETER_BANDS;
+  h11_r = h11_l + MAX_PARAMETER_BANDS;
+  h12_l = h11_r + MAX_PARAMETER_BANDS;
+  h12_r = h12_l + MAX_PARAMETER_BANDS;
+  h21_l = h12_r + MAX_PARAMETER_BANDS;
+  h21_r = h21_l + MAX_PARAMETER_BANDS;
+  h22_l = h21_r + MAX_PARAMETER_BANDS;
+  h22_r = h22_l + MAX_PARAMETER_BANDS;
+  h12_res_l = h22_r + MAX_PARAMETER_BANDS;
+  h12_res_r = h12_res_l + MAX_PARAMETER_BANDS;
+  h22_res_l = h12_res_r + MAX_PARAMETER_BANDS;
+  h22_res_r = h22_res_l + MAX_PARAMETER_BANDS;
+  c_r_clfe = h22_res_r + MAX_PARAMETER_BANDS;
+  c_l_clfe = c_r_clfe + MAX_PARAMETER_BANDS;
+
+  c_l_lr = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX52;
+  c_l_c = c_l_lr + MAX_PARAMETER_BANDS;
+  c_r_lr = c_l_c + MAX_PARAMETER_BANDS;
+  c_r_c = c_r_lr + MAX_PARAMETER_BANDS;
+  c_l_l = c_r_c + MAX_PARAMETER_BANDS;
+  c_l_r = c_l_l + MAX_PARAMETER_BANDS;
+  c_r_l = c_l_r + MAX_PARAMETER_BANDS;
+  c_r_r = c_r_l + MAX_PARAMETER_BANDS;
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_c, h12_c, h21_c, h22_c, h12_res_c, h22_res_c,
+                            c_l_c, c_r_c, 0, ps, res_bands[0]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_lr, h12_lr, h21_lr, h22_lr, h12_res_lr,
+                            h22_res_lr, c_l_lr, c_r_lr, 1, ps, res_bands[1]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_l, h12_l, h21_l, h22_l, h12_res_l, h22_res_l,
+                            c_l_l, c_r_l, 3, ps, res_bands[3]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_r, h12_r, h21_r, h22_r, h12_res_r, h22_res_r,
+                            c_l_r, c_r_r, 4, ps, res_bands[4]);
+
+    for (pb = 0; pb < p_aux_struct->num_ott_bands[2]; pb++) {
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+      c_l_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                         ->r1_matrix_l[p_cur_bs->ott_cld_idx[2][ps][pb] + 15];
+      c_r_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                         ->r1_matrix_l[15 - p_cur_bs->ott_cld_idx[2][ps][pb]];
+    }
+
+    for (pb = p_aux_struct->num_ott_bands[2]; pb < num_parameter_bands; pb++) {
+      c_l_clfe[pb] = ONE_IN_Q15;
+      c_r_clfe[pb] = 0;
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m1_param->m1_param_real[0][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[1][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[2][0][ps][pb] = c_l_c[pb];
+      m1_param->m1_param_real[3][0][ps][pb] = ixheaacd_mult16_shl(c_l_c[pb], c_l_lr[pb]);
+      m1_param->m1_param_real[4][0][ps][pb] = ixheaacd_mult16_shl(c_l_c[pb], c_r_lr[pb]);
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m2_param->m2_decor_real[0][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h11_l[pb], ixheaacd_mps_mult32_shr_15(h11_lr[pb], h12_c[pb]));
+      m2_param->m2_decor_real[1][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_l[pb], h12_lr[pb]);
+      m2_param->m2_decor_real[2][ps][pb] = h12_l[pb];
+
+      m2_param->m2_decor_real[3][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h21_l[pb], ixheaacd_mps_mult32_shr_15(h11_lr[pb], h12_c[pb]));
+      m2_param->m2_decor_real[4][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_l[pb], h12_lr[pb]);
+      m2_param->m2_decor_real[5][ps][pb] = h22_l[pb];
+
+      m2_param->m2_decor_real[6][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h11_r[pb], ixheaacd_mps_mult32_shr_15(h21_lr[pb], h12_c[pb]));
+      m2_param->m2_decor_real[7][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_r[pb], h22_lr[pb]);
+      m2_param->m2_decor_real[8][ps][pb] = h12_r[pb];
+
+      m2_param->m2_decor_real[9][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h21_r[pb], ixheaacd_mps_mult32_shr_15(h21_lr[pb], h12_c[pb]));
+      m2_param->m2_decor_real[10][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_r[pb], h22_lr[pb]);
+      m2_param->m2_decor_real[11][ps][pb] = h22_r[pb];
+
+      m2_param->m2_decor_real[12][ps][pb] = ixheaacd_mps_mult32_shr_15(c_l_clfe[pb], h22_c[pb]);
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h11_l[pb], ixheaacd_mps_mult32_shr_15(h11_lr[pb], h11_c[pb]));
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+            h11_l[pb], ixheaacd_mps_mult32_shr_15(h11_lr[pb], h12_res_c[pb]));
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h11_l[pb], h12_res_lr[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h12_res_l[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h21_l[pb], ixheaacd_mps_mult32_shr_15(h11_lr[pb], h11_c[pb]));
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+            h21_l[pb], ixheaacd_mps_mult32_shr_15(h11_lr[pb], h12_res_c[pb]));
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h21_l[pb], h12_res_lr[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h22_res_l[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h11_r[pb], ixheaacd_mps_mult32_shr_15(h21_lr[pb], h11_c[pb]));
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+            h11_r[pb], ixheaacd_mps_mult32_shr_15(h21_lr[pb], h12_res_c[pb]));
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h11_r[pb], h22_res_lr[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h12_res_r[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+          h21_r[pb], ixheaacd_mps_mult32_shr_15(h21_lr[pb], h11_c[pb]));
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(
+            h21_r[pb], ixheaacd_mps_mult32_shr_15(h21_lr[pb], h12_res_c[pb]));
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h21_r[pb], h22_res_lr[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h22_res_r[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] =
+          ixheaacd_mps_mult32_shr_15(c_l_clfe[pb], h21_c[pb]);
+
+      if (residual_coding)
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(c_l_clfe[pb], h22_res_c[pb]);
+
+      m2_param->m2_resid_real[idx++][ps][pb] =
+          ixheaacd_mps_mult32_shr_15(c_r_c[pb], c_r_clfe[pb]);
+    }
+  }
+
+  if (arbitrary_downmix > 0) {
+    for (ps = 0; ps < num_parameter_sets; ps++) {
+      for (pb = 0; pb < num_parameter_bands; pb++) {
+        WORD32 g_real[1];
+        ixheaacd_calculate_arb_dmx_mtx(pstr_mps_state, ps, pb, g_real);
+
+        if (arbitrary_downmix == 2) {
+          m1_param->m1_param_real[0][1][ps][pb] = m1_param->m1_param_real[0][0][ps][pb];
+          m1_param->m1_param_real[1][1][ps][pb] = m1_param->m1_param_real[1][0][ps][pb];
+          m1_param->m1_param_real[2][1][ps][pb] = m1_param->m1_param_real[2][0][ps][pb];
+          m1_param->m1_param_real[3][1][ps][pb] = m1_param->m1_param_real[3][0][ps][pb];
+          m1_param->m1_param_real[4][1][ps][pb] = m1_param->m1_param_real[4][0][ps][pb];
+
+          curr_state->m1_param_present[0][1] = 1;
+          curr_state->m1_param_present[1][1] = 1;
+          curr_state->m1_param_present[2][1] = 1;
+          curr_state->m1_param_present[3][1] = 1;
+          curr_state->m1_param_present[4][1] = 1;
+        }
+
+        m1_param->m1_param_real[0][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[0][0][ps][pb], g_real[0]);
+        m1_param->m1_param_real[1][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[1][0][ps][pb], g_real[0]);
+        m1_param->m1_param_real[2][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[2][0][ps][pb], g_real[0]);
+        m1_param->m1_param_real[3][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[3][0][ps][pb], g_real[0]);
+        m1_param->m1_param_real[4][0][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[4][0][ps][pb], g_real[0]);
+      }
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_calc_m1m2_tree_51sx.c b/decoder/ixheaacd_mps_calc_m1m2_tree_51sx.c
new file mode 100644
index 0000000..481eb9a
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_tree_51sx.c
@@ -0,0 +1,324 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_calc_m1m2_common.h"
+#include "ixheaacd_mps_bitdec.h"
+
+#undef ABS_THR
+#define ABS_THR 1
+
+VOID ixheaacd_calc_m1m2_51s1(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 ps, pb;
+
+  WORD32 *iid;
+  WORD32 *icc;
+  WORD32 *h11;
+  WORD32 *h12;
+  WORD32 *h21;
+  WORD32 *h22;
+  WORD32 *h12_res;
+  WORD32 *h22_res;
+  WORD16 *c_l;
+  WORD16 *c_r;
+
+  const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  iid = pstr_mps_state->mps_scratch_mem_v;
+  icc = iid + MAX_PARAMETER_BANDS;
+  h11 = icc + MAX_PARAMETER_BANDS;
+  h12 = h11 + MAX_PARAMETER_BANDS;
+  h21 = h12 + MAX_PARAMETER_BANDS;
+  h22 = h21 + MAX_PARAMETER_BANDS;
+  h12_res = h22 + MAX_PARAMETER_BANDS;
+  h22_res = h12_res + MAX_PARAMETER_BANDS;
+  c_l = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX16;
+  c_r = c_l + MAX_PARAMETER_BANDS;
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      WORD32 p_l_fs, p_r_fs;
+      WORD32 p_l_c, p_r_c;
+      WORD32 p_l_s, p_r_s;
+      WORD32 p_l_f, p_r_f;
+      WORD32 left_f;
+      WORD32 right_f;
+      WORD32 center;
+      WORD32 left_s;
+      WORD32 right_s;
+      WORD32 left;
+      WORD32 right;
+      WORD32 cross;
+      WORD32 temp_1, temp_2;
+      WORD16 qtemp1, qtemp2;
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+
+      p_l_fs = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                   ->cld_tab_1[p_cur_bs->ott_cld_idx[0][ps][pb] + 15];
+      p_r_fs = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                   ->cld_tab_1[15 - p_cur_bs->ott_cld_idx[0][ps][pb]];
+
+      p_l_c = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                  ->cld_tab_1[p_cur_bs->ott_cld_idx[1][ps][pb] + 15];
+      p_r_c = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                  ->cld_tab_1[15 - p_cur_bs->ott_cld_idx[1][ps][pb]];
+
+      p_l_s = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                  ->cld_tab_1[p_cur_bs->ott_cld_idx[2][ps][pb] + 15];
+      p_r_s = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                  ->cld_tab_1[15 - p_cur_bs->ott_cld_idx[2][ps][pb]];
+
+      p_l_f = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                  ->cld_tab_1[p_cur_bs->ott_cld_idx[3][ps][pb] + 15];
+      p_r_f = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                  ->cld_tab_1[15 - p_cur_bs->ott_cld_idx[3][ps][pb]];
+
+      left_f = ixheaacd_mps_mult32_shr_15(ixheaacd_mps_mult32_shr_15(p_l_fs, p_l_c), p_l_f);
+      right_f = ixheaacd_mps_mult32_shr_15(ixheaacd_mps_mult32_shr_15(p_l_fs, p_l_c), p_r_f);
+      center = ixheaacd_mps_mult32_shr_16(p_l_fs, p_r_c);
+      left_s = ixheaacd_mps_mult32_shr_15(p_r_fs, p_l_s);
+      right_s = ixheaacd_mps_mult32_shr_15(p_r_fs, p_r_s);
+
+      left = center + left_f + left_s;
+      right = center + right_f + right_s;
+
+      temp_1 = ixheaacd_mps_mult32_shr_15(left_f, right_f);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, p_aux_struct->ott_icc[3][ps][pb]);
+
+      temp_2 = ixheaacd_mps_mult32_shr_15(left_f, right_f);
+      temp_2 = ixheaacd_mps_mult32_shr_15(temp_2, p_aux_struct->ott_icc[3][ps][pb]);
+
+      temp_1 = ixheaacd_add32_sat(temp_1, temp_2);
+      cross = ixheaacd_add32_sat(center, temp_1);
+
+      temp_1 = ixheaacd_mps_div32_in_q15(left, right);
+      qtemp1 = 15;
+
+      iid[pb] = (10 * ixheaacd_mps_log10(temp_1, qtemp1)) >> 1;
+
+      temp_1 = ixheaacd_mps_mult32_shr_15(left, right);
+      qtemp1 = 15;
+      temp_1 = ixheaacd_mps_add32(temp_1, ABS_THR, &qtemp1, 30);
+      temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+      temp_2 = ixheaacd_mps_div_32(cross, temp_1, &qtemp2);
+      qtemp2 = qtemp2 + 15 - qtemp1;
+      icc[pb] = ixheaacd_mps_convert_to_qn(temp_2, qtemp2, 15);
+
+      if (icc[pb] > ONE_IN_Q15) {
+        icc[pb] = ONE_IN_Q15;
+      } else {
+        if (icc[pb] < MINUS_POINT_NINE_NINE_Q15) {
+          icc[pb] = MINUS_POINT_NINE_NINE_Q15;
+        }
+      }
+
+      iid[pb] =
+          ixheaacd_quantize_cld(iid[pb], pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
+      icc[pb] =
+          ixheaacd_quantize_icc(icc[pb], pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
+    }
+
+    ixheaacd_param_2_umx_ps_core_tables(iid, icc, num_parameter_bands, 0, h11, h12, h21, h22,
+                                        h12_res, h22_res, c_l, c_r,
+                                        pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr);
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m1_param->m1_param_real[0][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[3][0][ps][pb] = ONE_IN_Q15;
+    }
+
+    memcpy(m2_param->m2_decor_real[0][ps], h12, num_parameter_bands * sizeof(h12[0]));
+    memcpy(m2_param->m2_decor_real[1][ps], h22, num_parameter_bands * sizeof(h22[0]));
+    memcpy(m2_param->m2_resid_real[0][ps], h11, num_parameter_bands * sizeof(h11[0]));
+    memcpy(m2_param->m2_resid_real[1][ps], h21, num_parameter_bands * sizeof(h21[0]));
+  }
+  return;
+}
+
+VOID ixheaacd_calc_m1m2_51s2(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 ps, pb;
+
+  WORD32 *iid;
+  WORD32 *icc;
+  WORD32 *h11;
+  WORD32 *h12;
+  WORD32 *h21;
+  WORD32 *h22;
+  WORD32 *h12_res;
+  WORD32 *h22_res;
+  WORD32 *g_s;
+  WORD16 *c_l;
+  WORD16 *c_r;
+
+  const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+
+  iid = pstr_mps_state->mps_scratch_mem_v;
+  icc = iid + MAX_PARAMETER_BANDS;
+  h11 = icc + MAX_PARAMETER_BANDS;
+  h12 = h11 + MAX_PARAMETER_BANDS;
+  h21 = h12 + MAX_PARAMETER_BANDS;
+  h22 = h21 + MAX_PARAMETER_BANDS;
+  h12_res = h22 + MAX_PARAMETER_BANDS;
+  h22_res = h12_res + MAX_PARAMETER_BANDS;
+  g_s = h22_res + MAX_PARAMETER_BANDS;
+  c_l = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX18;
+  c_r = c_l + MAX_PARAMETER_BANDS;
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      WORD32 p_l_c, p_r_c;
+      WORD32 p_l_lr, p_r_lr;
+      WORD32 left;
+      WORD32 right;
+      WORD32 center;
+      WORD32 cross;
+      WORD32 temp_1;
+      WORD16 qtemp1;
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+
+      p_l_c = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                  ->cld_tab_1[p_cur_bs->ott_cld_idx[0][ps][pb] + 15];
+      p_r_c = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                  ->cld_tab_1[15 - p_cur_bs->ott_cld_idx[0][ps][pb]];
+
+      p_l_lr = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                   ->cld_tab_1[p_cur_bs->ott_cld_idx[1][ps][pb] + 15];
+      p_r_lr = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                   ->cld_tab_1[15 - p_cur_bs->ott_cld_idx[1][ps][pb]];
+
+      left = ixheaacd_mps_mult32_shr_15(p_l_c, p_l_lr);
+      right = ixheaacd_mps_mult32_shr_15(p_l_c, p_r_lr);
+      center = (p_r_c) >> 1;
+
+      temp_1 = ixheaacd_mps_mult32_shr_15(left, right);
+      qtemp1 = 15;
+      temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+      temp_1 = ixheaacd_mps_convert_to_qn(temp_1, qtemp1, 15);
+      cross = ixheaacd_mps_mult32_shr_15(temp_1, p_aux_struct->ott_icc[1][ps][pb]);
+
+      temp_1 = ixheaacd_add32_sat((left + right), cross);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, center);
+      qtemp1 = 15;
+      temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+      temp_1 = ixheaacd_mps_convert_to_qn(temp_1, qtemp1, 15);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, p_aux_struct->ott_icc[0][ps][pb]);
+      temp_1 = ixheaacd_add32_sat(temp_1, center);
+      cross = ixheaacd_add32_sat(cross, temp_1);
+
+      temp_1 = ixheaacd_mps_mult32_shr_15(left, center);
+      qtemp1 = 15;
+      temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+      temp_1 = ixheaacd_mps_convert_to_qn(2 * temp_1, qtemp1, 15);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, p_aux_struct->ott_icc[0][ps][pb]);
+      temp_1 = ixheaacd_add32_sat(temp_1, center);
+      left = ixheaacd_add32_sat(left, temp_1);
+
+      temp_1 = ixheaacd_mps_mult32_shr_15(right, center);
+      qtemp1 = 15;
+      temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+      temp_1 = ixheaacd_mps_convert_to_qn(2 * temp_1, qtemp1, 15);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, p_aux_struct->ott_icc[0][ps][pb]);
+      temp_1 = ixheaacd_add32_sat(temp_1, center);
+      right = ixheaacd_add32_sat(right, temp_1);
+
+      temp_1 = ixheaacd_mps_div32_in_q15(left, right);
+      qtemp1 = 15;
+      iid[pb] = ((10 * ixheaacd_mps_log10(temp_1, qtemp1)) >> 1);
+
+      temp_1 = ixheaacd_mps_mult32_shr_15(left, right);
+      qtemp1 = 15;
+      temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+      temp_1 = ixheaacd_mps_convert_to_qn(temp_1, qtemp1, 15);
+      if (temp_1 == 0) {
+        temp_1 = 1;
+      }
+
+      icc[pb] = ixheaacd_mps_div32_in_q15(cross, temp_1);
+
+      temp_1 = ixheaacd_add32_sat(left, right);
+      qtemp1 = 15;
+      temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+      g_s[pb] = ixheaacd_mps_convert_to_qn(temp_1, qtemp1, 15);
+
+      if (icc[pb] > ONE_IN_Q15) {
+        icc[pb] = ONE_IN_Q15;
+      } else {
+        if (icc[pb] < MINUS_POINT_NINE_NINE_Q15) {
+          icc[pb] = MINUS_POINT_NINE_NINE_Q15;
+        }
+      }
+
+      iid[pb] =
+          ixheaacd_quantize_cld(iid[pb], pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
+      icc[pb] =
+          ixheaacd_quantize_icc(icc[pb], pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr);
+    }
+
+    ixheaacd_param_2_umx_ps_core_tables(iid, icc, num_parameter_bands, 0, h11, h12, h21, h22,
+                                        h12_res, h22_res, c_l, c_r,
+                                        pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr);
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m1_param->m1_param_real[0][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[2][0][ps][pb] = ONE_IN_Q15;
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m2_param->m2_decor_real[0][ps][pb] = ixheaacd_mps_mult32_shr_15(g_s[pb], h12[pb]);
+      m2_param->m2_decor_real[1][ps][pb] = ixheaacd_mps_mult32_shr_15(g_s[pb], h22[pb]);
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m2_param->m2_resid_real[0][ps][pb] = ixheaacd_mps_mult32_shr_15(g_s[pb], h11[pb]);
+      m2_param->m2_resid_real[1][ps][pb] = ixheaacd_mps_mult32_shr_15(g_s[pb], h21[pb]);
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_calc_m1m2_tree_52xx.c b/decoder/ixheaacd_mps_calc_m1m2_tree_52xx.c
new file mode 100644
index 0000000..e9579c2
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_tree_52xx.c
@@ -0,0 +1,620 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_calc_m1m2_common.h"
+
+VOID ixheaacd_calc_m1m2_5227(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 ps, pb, i;
+  WORD32 row, col, ch;
+  WORD32 *a_prediction_mode;
+
+  WORD32 *m_real;
+  WORD32 *m_imag;
+
+  WORD32 *lf;
+  WORD32 *ls;
+  WORD32 *rf;
+  WORD32 *rs;
+  WORD32 *a_c1;
+  WORD32 *a_c2;
+  WORD32 *a_icc_c;
+
+  WORD64 acc;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 arbitrary_downmix = pstr_mps_state->arbitrary_downmix;
+  WORD32 arbdmx_residual_bands = pstr_mps_state->arbdmx_residual_bands;
+  WORD32 in_ch = pstr_mps_state->num_input_channels;
+
+  const WORD32 *cld_tab_1 = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->cld_tab_1;
+
+  lf = pstr_mps_state->mps_scratch_mem_v;
+  ls = lf + MAX_PARAMETER_BANDS;
+  rf = ls + MAX_PARAMETER_BANDS;
+  rs = rf + MAX_PARAMETER_BANDS;
+  a_c1 = rs + MAX_PARAMETER_BANDS;
+  a_c2 = a_c1 + MAX_PARAMETER_BANDS;
+  a_icc_c = a_c2 + MAX_PARAMETER_BANDS;
+  a_prediction_mode = a_icc_c + MAX_PARAMETER_BANDS;
+  m_real = a_prediction_mode + MAX_PARAMETER_BANDS;
+  m_imag = m_real + PARAMETER_BANDSX15;
+
+  for (i = 0; i < PARAMETER_BANDSX15; i++) {
+    m_real[i] = 0;
+    m_imag[i] = 0;
+  }
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    for (i = 0; i < 2; i++) {
+      for (pb = p_aux_struct->ttt_config[i][0].start_band;
+           pb < p_aux_struct->ttt_config[i][0].stop_band; pb++) {
+        WORD32 m_pre[3][5];
+        WORD32 m_ttt[3][3];
+        WORD32 mtx_inversion = pstr_mps_state->mtx_inversion;
+
+        memset(m_pre, 0, sizeof(m_pre));
+
+        if (p_aux_struct->ttt_config[i][0].mode >= 2) {
+          mtx_inversion = mtx_inversion && (p_aux_struct->ttt_config[i][0].mode == 2 ||
+                                            p_aux_struct->ttt_config[i][0].mode == 4);
+        }
+
+        ixheaacd_calculate_ttt(pstr_mps_state, ps, pb, p_aux_struct->ttt_config[i][0].mode,
+                               m_ttt);
+
+        for (row = 0; row < 3; row++) {
+          for (col = 0; col < 3; col++) {
+            m_pre[row][col] = m_ttt[row][col];
+          }
+        }
+
+        if (arbitrary_downmix != 0) {
+          WORD32 g_real[2];
+          ixheaacd_calculate_arb_dmx_mtx(pstr_mps_state, ps, pb, g_real);
+
+          if (arbitrary_downmix == 2 && pb < arbdmx_residual_bands) {
+            for (ch = 0; ch < in_ch; ch++) {
+              for (row = 0; row < 3; row++) {
+                m_pre[row][ch] = ixheaacd_mps_mult32_shr_15(m_pre[row][ch], g_real[ch]);
+
+                m_pre[row][3 + ch] = m_ttt[row][ch];
+              }
+            }
+          } else {
+            for (ch = 0; ch < in_ch; ch++) {
+              for (row = 0; row < 3; row++) {
+                m_pre[row][ch] = ixheaacd_mps_mult32_shr_15(m_pre[row][ch], g_real[ch]);
+              }
+            }
+          }
+        }
+
+        if (mtx_inversion) {
+          WORD32 h_real[2][2];
+          WORD32 h_imag[2][2];
+
+          ixheaacd_calculate_mtx_inv(pstr_mps_state, ps, pb, p_aux_struct->ttt_config[i][0].mode,
+                                     h_real, h_imag);
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m_real[0] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m_real[1] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m_real[5] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m_real[6] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m_real[10] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m_real[11] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m_imag[0] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m_imag[1] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m_imag[5] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m_imag[6] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m_imag[10] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m_imag[11] = (WORD32)acc;
+        } else if (pstr_mps_state->_3d_stereo_inversion) {
+        } else {
+          m_real[0] = m_pre[0][0];
+          m_real[1] = m_pre[0][1];
+          m_real[5] = m_pre[1][0];
+          m_real[6] = m_pre[1][1];
+          m_real[10] = m_pre[2][0];
+          m_real[11] = m_pre[2][1];
+
+          m_imag[0] = 0;
+          m_imag[1] = 0;
+          m_imag[5] = 0;
+          m_imag[6] = 0;
+          m_imag[10] = 0;
+          m_imag[11] = 0;
+        }
+
+        m_real[2] = m_pre[0][3];
+        m_real[3] = m_pre[0][4];
+        m_real[4] = m_pre[0][2];
+        m_real[7] = m_pre[1][3];
+        m_real[8] = m_pre[1][4];
+        m_real[9] = m_pre[1][2];
+        m_real[12] = m_pre[2][3];
+        m_real[13] = m_pre[2][4];
+        m_real[14] = m_pre[2][2];
+      }
+    }
+
+    for (i = 0; i < 2; i++) {
+      for (pb = p_aux_struct->ttt_config[i][0].start_band;
+           pb < p_aux_struct->ttt_config[i][0].stop_band; pb++) {
+        ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+        if (p_aux_struct->ttt_config[i][0].mode < 2) {
+          a_prediction_mode[pb] = 1;
+          a_c1[pb] = p_aux_struct->ttt_cpc_1[0][ps][pb];
+          a_c2[pb] = p_aux_struct->ttt_cpc_2[0][ps][pb];
+          a_icc_c[pb] = p_aux_struct->ttt_icc[0][ps][pb];
+        } else {
+          a_prediction_mode[pb] = 0;
+          a_c1[pb] = p_aux_struct->ttt_cld_1[0][ps][pb];
+          a_c2[pb] = p_aux_struct->ttt_cld_2[0][ps][pb];
+          a_icc_c[pb] = 0;
+        }
+        lf[pb] = cld_tab_1[p_cur_bs->ott_cld_idx[1][ps][pb] + 15];
+        ls[pb] = cld_tab_1[15 - p_cur_bs->ott_cld_idx[1][ps][pb]];
+
+        rf[pb] = cld_tab_1[p_cur_bs->ott_cld_idx[1][ps][pb] + 15];
+        rs[pb] = cld_tab_1[15 - p_cur_bs->ott_cld_idx[2][ps][pb]];
+      }
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m1_param->m1_param_real[0][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[0][1][ps][pb] = 0;
+      m1_param->m1_param_real[1][0][ps][pb] = 0;
+      m1_param->m1_param_real[1][1][ps][pb] = ONE_IN_Q15;
+
+      m1_param->m1_param_real[2][3][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[2][4][ps][pb] = 0;
+      m1_param->m1_param_real[3][3][ps][pb] = 0;
+      m1_param->m1_param_real[3][4][ps][pb] = ONE_IN_Q15;
+    }
+  }
+}
+
+VOID ixheaacd_calc_m1m2_5251(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 ch, ps, pb, col, row, i;
+
+  WORD32 temp_1;
+  WORD32 *h11_l, *h11_r, *h12_l, *h12_r, *h21_l, *h21_r, *h22_l, *h22_r, *h12_res_l, *h12_res_r,
+      *h22_res_l, *h22_res_r;
+  WORD32 *c_l_clfe, *c_r_clfe, *kappa, *g_dd;
+  WORD16 *c_f_l, *c_f_r, *dummy1, *dummy2;
+
+  WORD32 idx, index2 = 0, index3 = 0;
+  WORD32 mode_0 = p_aux_struct->ttt_config[0][0].mode;
+  WORD32 mode_1 = p_aux_struct->ttt_config[1][0].mode;
+  WORD32 enable_additionals = ((mode_0 == 0) || (mode_1 == 0));
+
+  WORD32 num_decor_signals = pstr_mps_state->num_decor_signals;
+  WORD32 residual_coding = pstr_mps_state->residual_coding;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 m1_param_imag_present = pstr_mps_state->m1_param_imag_present;
+  WORD32 num_x_channels = pstr_mps_state->num_x_channels;
+  WORD32 arbitrary_downmix = pstr_mps_state->arbitrary_downmix;
+  WORD32 arbdmx_residual_bands = pstr_mps_state->arbdmx_residual_bands;
+  WORD32 in_ch = pstr_mps_state->num_input_channels;
+  WORD32 res_bands = pstr_mps_state->res_bands[3];
+
+  WORD32 decorr_present;
+  WORD32 pos[3];
+  WORD64 acc;
+
+  h11_l = pstr_mps_state->mps_scratch_mem_v;
+  h11_r = h11_l + MAX_PARAMETER_BANDS;
+  h12_l = h11_r + MAX_PARAMETER_BANDS;
+  h12_r = h12_l + MAX_PARAMETER_BANDS;
+  h21_l = h12_r + MAX_PARAMETER_BANDS;
+  h21_r = h21_l + MAX_PARAMETER_BANDS;
+  h22_l = h21_r + MAX_PARAMETER_BANDS;
+  h22_r = h22_l + MAX_PARAMETER_BANDS;
+  h12_res_l = h22_r + MAX_PARAMETER_BANDS;
+  h12_res_r = h12_res_l + MAX_PARAMETER_BANDS;
+  h22_res_l = h12_res_r + MAX_PARAMETER_BANDS;
+  h22_res_r = h22_res_l + MAX_PARAMETER_BANDS;
+  c_l_clfe = h22_res_r + MAX_PARAMETER_BANDS;
+  c_r_clfe = c_l_clfe + MAX_PARAMETER_BANDS;
+  kappa = c_r_clfe + MAX_PARAMETER_BANDS;
+  g_dd = kappa + MAX_PARAMETER_BANDS;
+
+  c_f_l = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX32;
+  c_f_r = c_f_l + MAX_PARAMETER_BANDS;
+  dummy1 = c_f_r + MAX_PARAMETER_BANDS;
+  dummy2 = dummy1 + MAX_PARAMETER_BANDS;
+
+  if (enable_additionals) {
+    if (mode_1 == 0 &&
+        (p_aux_struct->ttt_config[1][0].start_band >= p_aux_struct->ttt_config[1][0].stop_band))
+      enable_additionals = 0;
+    else if (mode_0 == 0 && (p_aux_struct->ttt_config[0][0].start_band >=
+                             p_aux_struct->ttt_config[0][0].stop_band))
+      enable_additionals = 0;
+  }
+
+  decorr_present = enable_additionals && num_decor_signals == 3;
+
+  pstr_mps_state->num_decor_signals = 2;
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    for (i = 0; i < 2; i++) {
+      for (pb = p_aux_struct->ttt_config[i][0].start_band;
+           pb < p_aux_struct->ttt_config[i][0].stop_band; pb++) {
+        WORD32 m_ttt[3][3];
+        WORD32 m_pre[3][5];
+        WORD32 mtx_inversion = pstr_mps_state->mtx_inversion;
+
+        memset(m_pre, 0, sizeof(m_pre));
+
+        if (p_aux_struct->ttt_config[i][0].mode >= 2) {
+          mtx_inversion = mtx_inversion && (p_aux_struct->ttt_config[i][0].mode == 2 ||
+                                            p_aux_struct->ttt_config[i][0].mode == 4);
+        }
+
+        ixheaacd_calculate_ttt(pstr_mps_state, ps, pb, p_aux_struct->ttt_config[i][0].mode,
+                               m_ttt);
+
+        for (row = 0; row < 3; row++) {
+          for (col = 0; col < 3; col++) {
+            m_pre[row][col] = m_ttt[row][col];
+          }
+        }
+
+        if (arbitrary_downmix != 0) {
+          WORD32 g_real[2];
+          ixheaacd_calculate_arb_dmx_mtx(pstr_mps_state, ps, pb, g_real);
+
+          if (arbitrary_downmix == 2 && pb < arbdmx_residual_bands) {
+            for (ch = 0; ch < in_ch; ch++) {
+              for (row = 0; row < 3; row++) {
+                m_pre[row][ch] = ixheaacd_mps_mult32_shr_15(m_pre[row][ch], g_real[ch]);
+                m_pre[row][3 + ch] = m_ttt[row][ch];
+              }
+            }
+          } else {
+            for (ch = 0; ch < in_ch; ch++) {
+              for (row = 0; row < 3; row++) {
+                m_pre[row][ch] = ixheaacd_mps_mult32_shr_15(m_pre[row][ch], g_real[ch]);
+              }
+            }
+          }
+        }
+
+        if (mtx_inversion) {
+          WORD32 h_real[2][2], h_imag[2][2];
+
+          ixheaacd_calculate_mtx_inv(pstr_mps_state, ps, pb, p_aux_struct->ttt_config[i][0].mode,
+                                     h_real, h_imag);
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[0][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[0][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[1][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[1][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[2][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[2][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[0][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[0][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[1][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[1][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[2][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[2][1][ps][pb] = (WORD32)acc;
+        } else if (pstr_mps_state->_3d_stereo_inversion) {
+        } else {
+          m1_param->m1_param_real[0][0][ps][pb] = m_pre[0][0];
+          m1_param->m1_param_real[0][1][ps][pb] = m_pre[0][1];
+          m1_param->m1_param_real[1][0][ps][pb] = m_pre[1][0];
+          m1_param->m1_param_real[1][1][ps][pb] = m_pre[1][1];
+          m1_param->m1_param_real[2][0][ps][pb] = m_pre[2][0];
+          m1_param->m1_param_real[2][1][ps][pb] = m_pre[2][1];
+          m1_param->m1_param_imag[0][0][ps][pb] = 0;
+          m1_param->m1_param_imag[0][1][ps][pb] = 0;
+          m1_param->m1_param_imag[1][0][ps][pb] = 0;
+          m1_param->m1_param_imag[1][1][ps][pb] = 0;
+          m1_param->m1_param_imag[2][0][ps][pb] = 0;
+          m1_param->m1_param_imag[2][1][ps][pb] = 0;
+        }
+
+        m1_param->m1_param_real[0][2][ps][pb] = m_pre[0][2];
+        m1_param->m1_param_real[0][3][ps][pb] = m_pre[0][3];
+        m1_param->m1_param_real[0][4][ps][pb] = m_pre[0][4];
+        m1_param->m1_param_real[1][2][ps][pb] = m_pre[1][2];
+        m1_param->m1_param_real[1][3][ps][pb] = m_pre[1][3];
+        m1_param->m1_param_real[1][4][ps][pb] = m_pre[1][4];
+        m1_param->m1_param_real[2][2][ps][pb] = m_pre[2][2];
+        m1_param->m1_param_real[2][3][ps][pb] = m_pre[2][3];
+        m1_param->m1_param_real[2][4][ps][pb] = m_pre[2][4];
+
+        m1_param->m1_param_imag[0][2][ps][pb] = 0;
+        m1_param->m1_param_imag[0][3][ps][pb] = 0;
+        m1_param->m1_param_imag[0][4][ps][pb] = 0;
+        m1_param->m1_param_imag[1][2][ps][pb] = 0;
+        m1_param->m1_param_imag[1][3][ps][pb] = 0;
+        m1_param->m1_param_imag[1][4][ps][pb] = 0;
+        m1_param->m1_param_imag[2][2][ps][pb] = 0;
+        m1_param->m1_param_imag[2][3][ps][pb] = 0;
+        m1_param->m1_param_imag[2][4][ps][pb] = 0;
+
+        for (col = 0; col < num_x_channels; col++) {
+          m1_param->m1_param_real[3][col][ps][pb] = m1_param->m1_param_real[0][col][ps][pb];
+          m1_param->m1_param_real[4][col][ps][pb] = m1_param->m1_param_real[1][col][ps][pb];
+
+          if (m1_param_imag_present) {
+            m1_param->m1_param_imag[3][col][ps][pb] = m1_param->m1_param_imag[0][col][ps][pb];
+            m1_param->m1_param_imag[4][col][ps][pb] = m1_param->m1_param_imag[1][col][ps][pb];
+          }
+          pstr_mps_state->m1_param_present[3][col] = 1;
+          pstr_mps_state->m1_param_present[4][col] = 1;
+
+          if (p_aux_struct->ttt_config[i][0].use_ttt_decorr) {
+            m1_param->m1_param_real[5][col][ps][pb] = m1_param->m1_param_real[2][col][ps][pb];
+            if (m1_param_imag_present)
+              m1_param->m1_param_imag[5][col][ps][pb] = m1_param->m1_param_imag[2][col][ps][pb];
+
+            pstr_mps_state->m1_param_present[5][col] = 1;
+          }
+        }
+      }
+    }
+  }
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_l, h12_l, h21_l, h22_l, h12_res_l, h22_res_l,
+                            c_f_l, dummy1, 1, ps, pstr_mps_state->res_bands[1]);
+
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_r, h12_r, h21_r, h22_r, h12_res_r, h22_res_r,
+                            c_f_r, dummy2, 2, ps, pstr_mps_state->res_bands[2]);
+
+    for (pb = 0; pb < p_aux_struct->num_ott_bands[0]; pb++) {
+      WORD32 temp = ixheaacd_quantize((p_aux_struct->ott_cld[0][ps][pb]) >> 15);
+
+      c_l_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->r1_matrix_l[temp + 15];
+      c_r_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->r1_matrix_l[15 - temp];
+    }
+
+    for (pb = p_aux_struct->num_ott_bands[0]; pb < num_parameter_bands; pb++) {
+      c_l_clfe[pb] = ONE_IN_Q15;
+      c_r_clfe[pb] = 0;
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+
+      m2_param->m2_decor_real[idx++][ps][pb] = h12_l[pb];
+      if (enable_additionals) {
+        pos[0] = idx++;
+      }
+      m2_param->m2_decor_real[idx++][ps][pb] = h22_l[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = h12_r[pb];
+      if (enable_additionals) {
+        pos[1] = idx++;
+      }
+      m2_param->m2_decor_real[idx++][ps][pb] = h22_r[pb];
+      if (enable_additionals) {
+        pos[2] = idx++;
+      }
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 1;
+
+      m2_param->m2_resid_real[0][ps][pb] = h11_l[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h12_res_l[pb];
+
+      if (decorr_present) idx++;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h21_l[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h22_res_l[pb];
+
+      m2_param->m2_resid_real[idx][ps][pb] = h11_r[pb];
+      index2 = idx++;
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h12_res_r[pb];
+
+      if (decorr_present) idx++;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h21_r[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h22_res_r[pb];
+
+      m2_param->m2_resid_real[idx][ps][pb] = c_l_clfe[pb];
+      index3 = idx++;
+
+      if (decorr_present) idx++;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = c_r_clfe[pb];
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+
+      kappa[pb] = p_aux_struct->ttt_icc[0][ps][pb];
+      g_dd[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                     ->table_kappa[p_cur_bs->ttt_icc_idx[0][ps][pb]];
+    }
+
+    for (i = 0; i < 2; i++) {
+      if (p_aux_struct->ttt_config[i][0].use_ttt_decorr) {
+        for (pb = p_aux_struct->ttt_config[i][0].start_band;
+             pb < p_aux_struct->ttt_config[i][0].stop_band; pb++) {
+          if (p_aux_struct->ttt_config[i][0].mode == 0 && pb >= res_bands) {
+            if (p_aux_struct->ttt_config[i][0].use_ttt_decorr && enable_additionals) {
+              WORD32 temp;
+              pstr_mps_state->num_decor_signals = 3;
+
+              temp_1 = MINUS_SQRT_2_Q30;
+              m2_param->m2_decor_real[pos[0]][ps][pb] =
+                  ixheaacd_mps_mult32_shr_15(g_dd[pb], c_f_l[pb]);
+              m2_param->m2_decor_real[pos[1]][ps][pb] =
+                  ixheaacd_mps_mult32_shr_15(g_dd[pb], c_f_r[pb]);
+
+              temp = ixheaacd_mps_mult32_shr_15(g_dd[pb], c_l_clfe[pb]);
+              m2_param->m2_decor_real[pos[2]][ps][pb] = ixheaacd_mps_mult32_shr_30(temp, temp_1);
+
+              pstr_mps_state->m2_param_present[0][5] = 3;
+              pstr_mps_state->m2_param_present[2][5] = 3;
+              pstr_mps_state->m2_param_present[4][5] = 3;
+
+              m2_param->m2_resid_real[0][ps][pb] =
+                  ixheaacd_mps_mult32_shr_15(m2_param->m2_resid_real[0][ps][pb], kappa[pb]);
+              m2_param->m2_resid_real[index2][ps][pb] =
+                  ixheaacd_mps_mult32_shr_15(m2_param->m2_resid_real[index2][ps][pb], kappa[pb]);
+              m2_param->m2_resid_real[index3][ps][pb] =
+                  ixheaacd_mps_mult32_shr_15(m2_param->m2_resid_real[index3][ps][pb], kappa[pb]);
+
+              m2_param->m2_resid_real[pos[0]][ps][pb] =
+                  ixheaacd_mps_mult32_shr_15(g_dd[pb], c_f_l[pb]);
+              m2_param->m2_resid_real[pos[1]][ps][pb] =
+                  ixheaacd_mps_mult32_shr_15(g_dd[pb], c_f_r[pb]);
+
+              temp = ixheaacd_mps_mult32_shr_15(g_dd[pb], c_l_clfe[pb]);
+              m2_param->m2_resid_real[pos[2]][ps][pb] = ixheaacd_mps_mult32_shr_30(temp, temp_1);
+            }
+          }
+        }
+      }
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_calc_m1m2_tree_727x.c b/decoder/ixheaacd_mps_calc_m1m2_tree_727x.c
new file mode 100644
index 0000000..77072cf
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_tree_727x.c
@@ -0,0 +1,833 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_calc_m1m2_common.h"
+
+VOID ixheaacd_calc_m1m2_7271(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  WORD32 ps, pb, col, row, i;
+
+  WORD32 m_pre[3][5];
+  WORD32 m_ttt[3][3];
+
+  WORD32 g_real[2];
+
+  WORD32 temp_1, temp_2;
+  WORD64 acc;
+
+  WORD32 *h11_l, *h11_r, *h12_l, *h12_r, *h21_l, *h21_r, *h22_l, *h22_r, *h12_res_l, *h12_res_r,
+      *h22_res_l, *h22_res_r;
+  WORD32 *c_l_clfe, *c_r_clfe, *kappa, *g_dd;
+  WORD16 *c_f_l, *c_f_r, *dummy;
+
+  WORD32 *h11_lc, *h11_rc, *h12_lc, *h12_rc, *h21_lc, *h21_rc, *h22_lc, *h22_rc, *h12_res_lc,
+      *h12_res_rc, *h22_res_lc, *h22_res_rc;
+  WORD16 *c_f_lc, *c_f_rc;
+
+  WORD32 idx;
+  WORD32 residual_coding = pstr_mps_state->residual_coding;
+  WORD32 *res_bands = pstr_mps_state->res_bands;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 m1_param_imag_present = pstr_mps_state->m1_param_imag_present;
+  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 arbitrary_downmix = pstr_mps_state->arbitrary_downmix;
+  WORD32 mode_0 = p_aux_struct->ttt_config[0][0].mode;
+  WORD32 mode_1 = p_aux_struct->ttt_config[1][0].mode;
+  WORD32 enable_additionals = ((mode_0 == 0) || (mode_1 == 0));
+  WORD32 pos[5] = {0};
+  WORD32 pos_resid[5] = {0};
+
+  h11_l = pstr_mps_state->mps_scratch_mem_v;
+  h11_r = h11_l + MAX_PARAMETER_BANDS;
+  h12_l = h11_r + MAX_PARAMETER_BANDS;
+  h12_r = h12_l + MAX_PARAMETER_BANDS;
+  h21_l = h12_r + MAX_PARAMETER_BANDS;
+  h21_r = h21_l + MAX_PARAMETER_BANDS;
+  h22_l = h21_r + MAX_PARAMETER_BANDS;
+  h22_r = h22_l + MAX_PARAMETER_BANDS;
+  h12_res_l = h22_r + MAX_PARAMETER_BANDS;
+  h12_res_r = h12_res_l + MAX_PARAMETER_BANDS;
+  h22_res_l = h12_res_r + MAX_PARAMETER_BANDS;
+  h22_res_r = h22_res_l + MAX_PARAMETER_BANDS;
+  c_l_clfe = h22_res_r + MAX_PARAMETER_BANDS;
+  c_r_clfe = c_l_clfe + MAX_PARAMETER_BANDS;
+  kappa = c_r_clfe + MAX_PARAMETER_BANDS;
+  g_dd = kappa + MAX_PARAMETER_BANDS;
+
+  h11_lc = g_dd + MAX_PARAMETER_BANDS;
+  h11_rc = h11_lc + MAX_PARAMETER_BANDS;
+  h12_lc = h11_rc + MAX_PARAMETER_BANDS;
+  h12_rc = h12_lc + MAX_PARAMETER_BANDS;
+  h21_lc = h12_rc + MAX_PARAMETER_BANDS;
+  h21_rc = h21_lc + MAX_PARAMETER_BANDS;
+  h22_lc = h21_rc + MAX_PARAMETER_BANDS;
+  h22_rc = h22_lc + MAX_PARAMETER_BANDS;
+  h12_res_lc = h22_rc + MAX_PARAMETER_BANDS;
+  h12_res_rc = h12_res_lc + MAX_PARAMETER_BANDS;
+  h22_res_lc = h12_res_rc + MAX_PARAMETER_BANDS;
+  h22_res_rc = h22_res_lc + MAX_PARAMETER_BANDS;
+
+  c_f_l = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX56;
+  c_f_r = c_f_l + MAX_PARAMETER_BANDS;
+  dummy = c_f_r + MAX_PARAMETER_BANDS;
+  c_f_lc = dummy + MAX_PARAMETER_BANDS;
+  c_f_rc = c_f_lc + MAX_PARAMETER_BANDS;
+
+  if (enable_additionals) {
+    if (mode_1 == 0 &&
+        (p_aux_struct->ttt_config[1][0].start_band >= p_aux_struct->ttt_config[1][0].stop_band))
+      enable_additionals = 0;
+    else if (mode_0 == 0 && (p_aux_struct->ttt_config[0][0].start_band >=
+                             p_aux_struct->ttt_config[0][0].stop_band))
+      enable_additionals = 0;
+  }
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_l, h12_l, h21_l, h22_l, h12_res_l, h22_res_l,
+                            c_f_l, dummy, 1, ps, res_bands[1]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_r, h12_r, h21_r, h22_r, h12_res_r, h22_res_r,
+                            c_f_r, dummy, 2, ps, res_bands[2]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_lc, h12_lc, h21_lc, h22_lc, h12_res_lc,
+                            h22_res_lc, c_f_lc, dummy, 3, ps, res_bands[3]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_rc, h12_rc, h21_rc, h22_rc, h12_res_rc,
+                            h22_res_rc, c_f_rc, dummy, 4, ps, res_bands[4]);
+
+    for (i = 0; i < 2; i++) {
+      for (pb = p_aux_struct->ttt_config[i][0].start_band;
+           pb < p_aux_struct->ttt_config[i][0].stop_band; pb++) {
+        WORD32 mtx_inversion = pstr_mps_state->mtx_inversion;
+
+        memset(m_pre, 0, sizeof(m_pre));
+
+        if (p_aux_struct->ttt_config[i][0].mode >= 2) {
+          mtx_inversion = mtx_inversion && (p_aux_struct->ttt_config[i][0].mode == 2 ||
+                                            p_aux_struct->ttt_config[i][0].mode == 4);
+        }
+
+        ixheaacd_calculate_ttt(pstr_mps_state, ps, pb, p_aux_struct->ttt_config[i][0].mode,
+                               m_ttt);
+
+        for (row = 0; row < 3; row++) {
+          for (col = 0; col < 3; col++) {
+            m_pre[row][col] = m_ttt[row][col];
+          }
+        }
+
+        if (arbitrary_downmix != 0) {
+          WORD32 ch;
+          ixheaacd_calculate_arb_dmx_mtx(pstr_mps_state, ps, pb, g_real);
+
+          for (ch = 0; ch < num_input_channels; ch++) {
+            for (row = 0; row < 3; row++) {
+              m_pre[row][col] = ixheaacd_mps_mult32_shr_15(m_pre[row][col], g_real[ch]);
+
+              if (arbitrary_downmix == 2 && pb < pstr_mps_state->arbdmx_residual_bands) {
+                m_pre[row][3 + ch] = m_ttt[row][ch];
+              }
+            }
+          }
+        }
+
+        if (mtx_inversion) {
+          WORD32 h_real[2][2], h_imag[2][2];
+
+          ixheaacd_calculate_mtx_inv(pstr_mps_state, ps, pb, p_aux_struct->ttt_config[i][0].mode,
+                                     h_real, h_imag);
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[0][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[0][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[1][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[1][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[2][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[2][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[0][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[0][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[1][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[1][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[2][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[2][1][ps][pb] = (WORD32)acc;
+        } else if (pstr_mps_state->_3d_stereo_inversion) {
+        } else {
+          m1_param->m1_param_real[0][0][ps][pb] = m_pre[0][0];
+          m1_param->m1_param_real[0][1][ps][pb] = m_pre[0][1];
+          m1_param->m1_param_real[1][0][ps][pb] = m_pre[1][0];
+          m1_param->m1_param_real[1][1][ps][pb] = m_pre[1][1];
+          m1_param->m1_param_real[2][0][ps][pb] = m_pre[2][0];
+          m1_param->m1_param_real[2][1][ps][pb] = m_pre[2][1];
+        }
+
+        m1_param->m1_param_real[0][2][ps][pb] = m_pre[0][2];
+        m1_param->m1_param_real[0][3][ps][pb] = m_pre[0][3];
+        m1_param->m1_param_real[0][4][ps][pb] = m_pre[0][4];
+        m1_param->m1_param_real[1][2][ps][pb] = m_pre[1][2];
+        m1_param->m1_param_real[1][3][ps][pb] = m_pre[1][3];
+        m1_param->m1_param_real[1][4][ps][pb] = m_pre[1][4];
+        m1_param->m1_param_real[2][2][ps][pb] = m_pre[2][2];
+        m1_param->m1_param_real[2][3][ps][pb] = m_pre[2][3];
+        m1_param->m1_param_real[2][4][ps][pb] = m_pre[2][4];
+
+        for (col = 0; col < pstr_mps_state->num_x_channels; col++) {
+          m1_param->m1_param_real[3][col][ps][pb] = m1_param->m1_param_real[0][col][ps][pb];
+          m1_param->m1_param_real[4][col][ps][pb] = m1_param->m1_param_real[1][col][ps][pb];
+
+          curr_state->m1_param_present[3][col] = 1;
+          curr_state->m1_param_present[4][col] = 1;
+
+          if (m1_param_imag_present) {
+            m1_param->m1_param_imag[3][col][ps][pb] = m1_param->m1_param_imag[0][col][ps][pb];
+            m1_param->m1_param_imag[4][col][ps][pb] = m1_param->m1_param_imag[1][col][ps][pb];
+          }
+
+          if (p_aux_struct->ttt_config[i][0].use_ttt_decorr) {
+            m1_param->m1_param_real[5][col][ps][pb] = m1_param->m1_param_real[2][col][ps][pb];
+            if (m1_param_imag_present)
+              m1_param->m1_param_imag[5][col][ps][pb] = m1_param->m1_param_imag[2][col][ps][pb];
+
+            curr_state->m1_param_present[5][col] = 1;
+          } else {
+            m1_param->m1_param_real[5][col][ps][pb] = 0;
+            if (m1_param_imag_present) m1_param->m1_param_imag[5][col][ps][pb] = 0;
+          }
+
+          m1_param->m1_param_real[6][col][ps][pb] =
+              ixheaacd_mps_mult32_shr_15(c_f_l[pb], m1_param->m1_param_real[0][col][ps][pb]);
+          m1_param->m1_param_real[7][col][ps][pb] =
+              ixheaacd_mps_mult32_shr_15(c_f_r[pb], m1_param->m1_param_real[1][col][ps][pb]);
+
+          if (m1_param_imag_present) {
+            m1_param->m1_param_imag[6][col][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(c_f_l[pb], m1_param->m1_param_imag[0][col][ps][pb]);
+            m1_param->m1_param_imag[7][col][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(c_f_r[pb], m1_param->m1_param_imag[1][col][ps][pb]);
+          }
+
+          curr_state->m1_param_present[6][col] = 1;
+          curr_state->m1_param_present[7][col] = 1;
+        }
+      }
+    }
+
+    for (pb = 0; pb < p_aux_struct->num_ott_bands[0]; pb++) {
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+      c_l_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                         ->r1_matrix_l[p_cur_bs->ott_cld_idx[0][ps][pb] + 15];
+      c_r_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                         ->r1_matrix_l[15 - p_cur_bs->ott_cld_idx[0][ps][pb]];
+    }
+    for (pb = p_aux_struct->num_ott_bands[0]; pb < num_parameter_bands; pb++) {
+      c_l_clfe[pb] = ONE_IN_Q15;
+      c_r_clfe[pb] = 0;
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+
+      m2_param->m2_decor_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_lc[pb], h12_l[pb]);
+      if (enable_additionals) {
+        pos[0] = idx++;
+      }
+      m2_param->m2_decor_real[idx++][ps][pb] = h12_lc[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_lc[pb], h12_l[pb]);
+      if (enable_additionals) {
+        pos[1] = idx++;
+      }
+      m2_param->m2_decor_real[idx++][ps][pb] = h22_lc[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = h22_l[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_rc[pb], h12_r[pb]);
+      if (enable_additionals) {
+        pos[2] = idx++;
+      }
+      m2_param->m2_decor_real[idx++][ps][pb] = h12_rc[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_rc[pb], h12_r[pb]);
+      if (enable_additionals) {
+        pos[3] = idx++;
+      }
+      m2_param->m2_decor_real[idx++][ps][pb] = h22_rc[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = h22_r[pb];
+      if (enable_additionals) {
+        pos[4] = idx++;
+      }
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+
+      m2_param->m2_resid_real[idx][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_lc[pb], h11_l[pb]);
+      pos_resid[0] = idx++;
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h11_lc[pb], h12_res_l[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h12_res_lc[pb];
+      }
+
+      m2_param->m2_resid_real[idx][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_lc[pb], h11_l[pb]);
+      pos_resid[1] = idx++;
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h21_lc[pb], h12_res_l[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h22_res_lc[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h21_l[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h22_res_l[pb];
+
+      m2_param->m2_resid_real[idx][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_rc[pb], h11_r[pb]);
+      pos_resid[2] = idx++;
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h11_rc[pb], h12_res_r[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h12_res_rc[pb];
+      }
+
+      m2_param->m2_resid_real[idx][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_rc[pb], h11_r[pb]);
+      pos_resid[3] = idx++;
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h21_rc[pb], h12_res_r[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h22_res_rc[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h21_r[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h22_res_r[pb];
+
+      m2_param->m2_resid_real[idx][ps][pb] = c_l_clfe[pb];
+      pos_resid[4] = idx++;
+
+      m2_param->m2_resid_real[idx][ps][pb] = c_r_clfe[pb];
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+
+      kappa[pb] = p_aux_struct->ttt_icc[0][ps][pb];
+      g_dd[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                     ->table_kappa[p_cur_bs->ttt_icc_idx[0][ps][pb]];
+    }
+
+    for (i = 0; i < 2; i++) {
+      for (pb = p_aux_struct->ttt_config[i][0].start_band;
+           pb < p_aux_struct->ttt_config[i][0].stop_band; pb++) {
+        if (p_aux_struct->ttt_config[i][0].mode == 0 && pb >= pstr_mps_state->res_bands[5]) {
+          if (p_aux_struct->ttt_config[i][0].use_ttt_decorr) {
+            temp_1 = ixheaacd_mps_mult32_shr_15(g_dd[pb], c_f_l[pb]);
+            m2_param->m2_decor_real[pos[0]][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(temp_1, h11_lc[pb]);
+
+            temp_1 = ixheaacd_mps_mult32_shr_15(g_dd[pb], c_f_l[pb]);
+            m2_param->m2_decor_real[pos[1]][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(temp_1, h21_lc[pb]);
+
+            temp_1 = ixheaacd_mps_mult32_shr_15(g_dd[pb], c_f_r[pb]);
+            m2_param->m2_decor_real[pos[2]][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(temp_1, h11_rc[pb]);
+
+            temp_1 = ixheaacd_mps_mult32_shr_15(g_dd[pb], c_f_r[pb]);
+            m2_param->m2_decor_real[pos[3]][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(temp_1, h21_rc[pb]);
+
+            temp_1 = ixheaacd_mps_mult32_shr_15(g_dd[pb], c_l_clfe[pb]);
+            temp_2 = MINUS_SQRT_2_Q30;
+            m2_param->m2_decor_real[pos[4]][ps][pb] = ixheaacd_mps_mult32_shr_30(temp_1, temp_2);
+
+            pstr_mps_state->m2_param_present[0][5] = 1;
+            pstr_mps_state->m2_param_present[1][5] = 1;
+            pstr_mps_state->m2_param_present[3][5] = 1;
+            pstr_mps_state->m2_param_present[4][5] = 1;
+            pstr_mps_state->m2_param_present[6][5] = 1;
+
+            m2_param->m2_resid_real[pos_resid[0]][ps][pb] = ixheaacd_mps_mult32_shr_15(
+                m2_param->m2_resid_real[pos_resid[0]][ps][pb], kappa[pb]);
+            m2_param->m2_resid_real[pos_resid[1]][ps][pb] = ixheaacd_mps_mult32_shr_15(
+                m2_param->m2_resid_real[pos_resid[1]][ps][pb], kappa[pb]);
+            m2_param->m2_resid_real[pos_resid[2]][ps][pb] = ixheaacd_mps_mult32_shr_15(
+                m2_param->m2_resid_real[pos_resid[2]][ps][pb], kappa[pb]);
+            m2_param->m2_resid_real[pos_resid[3]][ps][pb] = ixheaacd_mps_mult32_shr_15(
+                m2_param->m2_resid_real[pos_resid[3]][ps][pb], kappa[pb]);
+            m2_param->m2_resid_real[pos_resid[4]][ps][pb] = ixheaacd_mps_mult32_shr_15(
+                m2_param->m2_resid_real[pos_resid[4]][ps][pb], kappa[pb]);
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_calc_m1m2_7272(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  WORD32 ps, pb, col, row, i;
+
+  WORD32 m_pre[3][5];
+  WORD32 m_ttt[3][3];
+
+  WORD32 g_real[2];
+
+  WORD32 temp_1, temp_2;
+  WORD64 acc;
+
+  WORD32 *h11_l, *h11_r, *h12_l, *h12_r, *h21_l, *h21_r, *h22_l, *h22_r, *h12_res_l, *h12_res_r,
+      *h22_res_l, *h22_res_r;
+  WORD32 *c_l_clfe, *c_r_clfe, *kappa, *g_dd;
+  WORD16 *c_1_L, *c_1_R, *c_2_L, *c_2_R;
+  WORD32 *h11_ls, *h11_rs, *h12_ls, *h12_rs, *h21_ls, *h21_rs, *h22_ls, *h22_rs, *h12_res_ls,
+      *h12_res_rs, *h22_res_ls, *h22_res_rs;
+  WORD16 *c_f_ls, *c_f_rs, *dummy;
+
+  WORD32 idx;
+  WORD32 mode_0 = p_aux_struct->ttt_config[0][0].mode;
+  WORD32 mode_1 = p_aux_struct->ttt_config[1][0].mode;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 m1_param_imag_present = pstr_mps_state->m1_param_imag_present;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 arbitrary_downmix = pstr_mps_state->arbitrary_downmix;
+
+  WORD32 enable_additionals = ((mode_0 == 0) || (mode_1 == 0));
+  WORD32 pos[3] = {0};
+  WORD32 pos_resid[3] = {0};
+
+  WORD32 residual_coding = pstr_mps_state->residual_coding;
+
+  h11_l = pstr_mps_state->mps_scratch_mem_v;
+  h11_r = h11_l + MAX_PARAMETER_BANDS;
+  h12_l = h11_r + MAX_PARAMETER_BANDS;
+  h12_r = h12_l + MAX_PARAMETER_BANDS;
+  h21_l = h12_r + MAX_PARAMETER_BANDS;
+  h21_r = h21_l + MAX_PARAMETER_BANDS;
+  h22_l = h21_r + MAX_PARAMETER_BANDS;
+  h22_r = h22_l + MAX_PARAMETER_BANDS;
+  h12_res_l = h22_r + MAX_PARAMETER_BANDS;
+  h12_res_r = h12_res_l + MAX_PARAMETER_BANDS;
+  h22_res_l = h12_res_r + MAX_PARAMETER_BANDS;
+  h22_res_r = h22_res_l + MAX_PARAMETER_BANDS;
+  c_l_clfe = h22_res_r + MAX_PARAMETER_BANDS;
+  c_r_clfe = c_l_clfe + MAX_PARAMETER_BANDS;
+  kappa = c_r_clfe + MAX_PARAMETER_BANDS;
+  g_dd = kappa + MAX_PARAMETER_BANDS;
+
+  h11_ls = g_dd + MAX_PARAMETER_BANDS;
+  h11_rs = h11_ls + MAX_PARAMETER_BANDS;
+  h12_ls = h11_rs + MAX_PARAMETER_BANDS;
+  h12_rs = h12_ls + MAX_PARAMETER_BANDS;
+  h21_ls = h12_rs + MAX_PARAMETER_BANDS;
+  h21_rs = h21_ls + MAX_PARAMETER_BANDS;
+  h22_ls = h21_rs + MAX_PARAMETER_BANDS;
+  h22_rs = h22_ls + MAX_PARAMETER_BANDS;
+  h12_res_ls = h22_rs + MAX_PARAMETER_BANDS;
+  h12_res_rs = h12_res_ls + MAX_PARAMETER_BANDS;
+  h22_res_ls = h12_res_rs + MAX_PARAMETER_BANDS;
+  h22_res_rs = h22_res_ls + MAX_PARAMETER_BANDS;
+
+  c_1_L = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX56;
+  c_1_R = c_1_L + MAX_PARAMETER_BANDS;
+  c_2_L = c_1_R + MAX_PARAMETER_BANDS;
+  c_2_R = c_2_L + MAX_PARAMETER_BANDS;
+  c_f_ls = c_2_R + MAX_PARAMETER_BANDS;
+  c_f_rs = c_f_ls + MAX_PARAMETER_BANDS;
+  dummy = c_f_rs + MAX_PARAMETER_BANDS;
+
+  if (enable_additionals) {
+    if (mode_1 == 0 &&
+        (p_aux_struct->ttt_config[1][0].start_band >= p_aux_struct->ttt_config[1][0].stop_band))
+      enable_additionals = 0;
+    else if (mode_0 == 0 && (p_aux_struct->ttt_config[0][0].start_band >=
+                             p_aux_struct->ttt_config[0][0].stop_band))
+      enable_additionals = 0;
+  }
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_l, h12_l, h21_l, h22_l, h12_res_l, h22_res_l,
+                            c_1_L, c_2_L, 1, ps, pstr_mps_state->res_bands[1]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_r, h12_r, h21_r, h22_r, h12_res_r, h22_res_r,
+                            c_1_R, c_2_R, 2, ps, pstr_mps_state->res_bands[2]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_ls, h12_ls, h21_ls, h22_ls, h12_res_ls,
+                            h22_res_ls, dummy, c_f_ls, 3, ps, pstr_mps_state->res_bands[3]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_rs, h12_rs, h21_rs, h22_rs, h12_res_rs,
+                            h22_res_rs, dummy, c_f_rs, 4, ps, pstr_mps_state->res_bands[4]);
+
+    for (i = 0; i < 2; i++) {
+      for (pb = p_aux_struct->ttt_config[i][0].start_band;
+           pb < p_aux_struct->ttt_config[i][0].stop_band; pb++) {
+        WORD32 mtx_inversion = pstr_mps_state->mtx_inversion;
+
+        memset(m_pre, 0, sizeof(m_pre));
+
+        if (p_aux_struct->ttt_config[i][0].mode >= 2) {
+          mtx_inversion = mtx_inversion && (p_aux_struct->ttt_config[i][0].mode == 2 ||
+                                            p_aux_struct->ttt_config[i][0].mode == 4);
+        }
+
+        ixheaacd_calculate_ttt(pstr_mps_state, ps, pb, p_aux_struct->ttt_config[i][0].mode,
+                               m_ttt);
+
+        for (row = 0; row < 3; row++) {
+          for (col = 0; col < 3; col++) {
+            m_pre[row][col] = m_ttt[row][col];
+          }
+        }
+
+        if (arbitrary_downmix != 0) {
+          WORD32 ch;
+          ixheaacd_calculate_arb_dmx_mtx(pstr_mps_state, ps, pb, g_real);
+
+          for (ch = 0; ch < pstr_mps_state->num_input_channels; ch++) {
+            for (row = 0; row < 3; row++) {
+              m_pre[row][col] = ixheaacd_mps_mult32_shr_15(m_pre[row][col], g_real[ch]);
+
+              if (arbitrary_downmix == 2 && pb < pstr_mps_state->arbdmx_residual_bands) {
+                m_pre[row][3 + ch] = m_ttt[row][ch];
+              }
+            }
+          }
+        }
+
+        if (mtx_inversion) {
+          WORD32 h_real[2][2], h_imag[2][2];
+
+          ixheaacd_calculate_mtx_inv(pstr_mps_state, ps, pb, p_aux_struct->ttt_config[i][0].mode,
+                                     h_real, h_imag);
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[0][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[0][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[1][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[1][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_real[0][0] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_real[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_real[2][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_real[0][1] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_real[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_real[2][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[0][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[0][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[0][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[0][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[1][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[1][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[1][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[1][1][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_imag[0][0] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_imag[1][0]);
+          acc >>= 15;
+          m1_param->m1_param_imag[2][0][ps][pb] = (WORD32)acc;
+
+          acc = (WORD64)((WORD64)m_pre[2][0] * (WORD64)h_imag[0][1] +
+                         (WORD64)m_pre[2][1] * (WORD64)h_imag[1][1]);
+          acc >>= 15;
+          m1_param->m1_param_imag[2][1][ps][pb] = (WORD32)acc;
+        } else if (pstr_mps_state->_3d_stereo_inversion) {
+        } else {
+          m1_param->m1_param_real[0][0][ps][pb] = m_pre[0][0];
+          m1_param->m1_param_real[0][1][ps][pb] = m_pre[0][1];
+          m1_param->m1_param_real[1][0][ps][pb] = m_pre[1][0];
+          m1_param->m1_param_real[1][1][ps][pb] = m_pre[1][1];
+          m1_param->m1_param_real[2][0][ps][pb] = m_pre[2][0];
+          m1_param->m1_param_real[2][1][ps][pb] = m_pre[2][1];
+        }
+
+        m1_param->m1_param_real[0][2][ps][pb] = m_pre[0][2];
+        m1_param->m1_param_real[0][3][ps][pb] = m_pre[0][3];
+        m1_param->m1_param_real[0][4][ps][pb] = m_pre[0][4];
+        m1_param->m1_param_real[1][2][ps][pb] = m_pre[1][2];
+        m1_param->m1_param_real[1][3][ps][pb] = m_pre[1][3];
+        m1_param->m1_param_real[1][4][ps][pb] = m_pre[1][4];
+        m1_param->m1_param_real[2][2][ps][pb] = m_pre[2][2];
+        m1_param->m1_param_real[2][3][ps][pb] = m_pre[2][3];
+        m1_param->m1_param_real[2][4][ps][pb] = m_pre[2][4];
+
+        for (col = 0; col < pstr_mps_state->num_x_channels; col++) {
+          m1_param->m1_param_real[3][col][ps][pb] = m1_param->m1_param_real[0][col][ps][pb];
+          m1_param->m1_param_real[4][col][ps][pb] = m1_param->m1_param_real[1][col][ps][pb];
+
+          if (m1_param_imag_present) {
+            m1_param->m1_param_imag[3][col][ps][pb] = m1_param->m1_param_imag[0][col][ps][pb];
+            m1_param->m1_param_imag[4][col][ps][pb] = m1_param->m1_param_imag[1][col][ps][pb];
+          }
+
+          curr_state->m1_param_present[3][col] = 1;
+          curr_state->m1_param_present[4][col] = 1;
+
+          if (p_aux_struct->ttt_config[i][0].use_ttt_decorr) {
+            m1_param->m1_param_real[5][col][ps][pb] = m1_param->m1_param_real[2][col][ps][pb];
+            if (m1_param_imag_present)
+              m1_param->m1_param_imag[5][col][ps][pb] = m1_param->m1_param_imag[2][col][ps][pb];
+
+            curr_state->m1_param_present[5][col] = 1;
+          } else {
+            m1_param->m1_param_real[5][col][ps][pb] = 0;
+            if (m1_param_imag_present) m1_param->m1_param_imag[5][col][ps][pb] = 0;
+          }
+
+          m1_param->m1_param_real[6][col][ps][pb] =
+              ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[0][col][ps][pb], c_2_L[pb]);
+          m1_param->m1_param_real[7][col][ps][pb] =
+              ixheaacd_mps_mult32_shr_15(m1_param->m1_param_real[1][col][ps][pb], c_2_R[pb]);
+
+          if (m1_param_imag_present) {
+            m1_param->m1_param_imag[6][col][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(m1_param->m1_param_imag[0][col][ps][pb], c_2_L[pb]);
+            m1_param->m1_param_imag[7][col][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(m1_param->m1_param_imag[1][col][ps][pb], c_2_R[pb]);
+          }
+
+          curr_state->m1_param_present[6][col] = 1;
+          curr_state->m1_param_present[7][col] = 1;
+        }
+      }
+    }
+
+    for (pb = 0; pb < p_aux_struct->num_ott_bands[0]; pb++) {
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+      c_l_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                         ->r1_matrix_l[p_cur_bs->ott_cld_idx[0][ps][pb] + 15];
+      c_r_clfe[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                         ->r1_matrix_l[15 - p_cur_bs->ott_cld_idx[0][ps][pb]];
+    }
+    for (pb = p_aux_struct->num_ott_bands[0]; pb < num_parameter_bands; pb++) {
+      c_l_clfe[pb] = ONE_IN_Q15;
+      c_r_clfe[pb] = 0;
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+
+      m2_param->m2_decor_real[idx++][ps][pb] = h12_l[pb];
+      if (enable_additionals) {
+        pos[0] = idx++;
+      }
+      m2_param->m2_decor_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_ls[pb], h22_l[pb]);
+      m2_param->m2_decor_real[idx++][ps][pb] = h12_ls[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_ls[pb], h22_l[pb]);
+      m2_param->m2_decor_real[idx++][ps][pb] = h22_ls[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = h12_r[pb];
+      if (enable_additionals) {
+        pos[1] = idx++;
+      }
+      m2_param->m2_decor_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_rs[pb], h22_r[pb]);
+      m2_param->m2_decor_real[idx++][ps][pb] = h12_rs[pb];
+      m2_param->m2_decor_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_rs[pb], h22_r[pb]);
+      m2_param->m2_decor_real[idx++][ps][pb] = h22_rs[pb];
+      if (enable_additionals) {
+        pos[2] = idx++;
+      }
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+      m2_param->m2_resid_real[idx][ps][pb] = h11_l[pb];
+      pos_resid[0] = idx++;
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h12_res_l[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_ls[pb], h21_l[pb]);
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h11_ls[pb], h22_res_l[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h12_res_ls[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_ls[pb], h21_l[pb]);
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h21_ls[pb], h22_res_l[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h22_res_ls[pb];
+      }
+
+      m2_param->m2_resid_real[idx][ps][pb] = h11_r[pb];
+      pos_resid[1] = idx++;
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h12_res_r[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h11_rs[pb], h21_r[pb]);
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h11_rs[pb], h22_res_r[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h12_res_rs[pb];
+      }
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ixheaacd_mps_mult32_shr_15(h21_rs[pb], h21_r[pb]);
+
+      if (residual_coding) {
+        m2_param->m2_resid_real[idx++][ps][pb] =
+            ixheaacd_mps_mult32_shr_15(h21_rs[pb], h22_res_r[pb]);
+        m2_param->m2_resid_real[idx++][ps][pb] = h22_res_rs[pb];
+      }
+
+      m2_param->m2_resid_real[idx][ps][pb] = c_l_clfe[pb];
+      pos_resid[2] = idx++;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = c_r_clfe[pb];
+    }
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      ia_mps_dec_spatial_bs_frame_struct *p_cur_bs = pstr_mps_state->bs_frame;
+
+      kappa[pb] = p_aux_struct->ttt_icc[0][ps][pb];
+      g_dd[pb] = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr
+                     ->table_kappa[p_cur_bs->ttt_icc_idx[0][ps][pb]];
+    }
+
+    for (i = 0; i < 2; i++) {
+      for (pb = p_aux_struct->ttt_config[i][0].start_band;
+           pb < p_aux_struct->ttt_config[i][0].stop_band; pb++) {
+        if (p_aux_struct->ttt_config[i][0].mode == 0 && pb >= pstr_mps_state->res_bands[5]) {
+          if (p_aux_struct->ttt_config[i][0].use_ttt_decorr) {
+            m2_param->m2_decor_real[pos[0]][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(g_dd[pb], c_1_L[pb]);
+
+            m2_param->m2_decor_real[pos[1]][ps][pb] =
+                ixheaacd_mps_mult32_shr_15(g_dd[pb], c_1_R[pb]);
+
+            temp_1 = ixheaacd_mps_mult32_shr_15(g_dd[pb], c_l_clfe[pb]);
+            temp_2 = MINUS_SQRT_2_Q30;
+            m2_param->m2_decor_real[pos[2]][ps][pb] = ixheaacd_mps_mult32_shr_30(temp_1, temp_2);
+
+            pstr_mps_state->m2_param_present[0][5] = 1;
+            pstr_mps_state->m2_param_present[3][5] = 1;
+            pstr_mps_state->m2_param_present[6][5] = 1;
+
+            m2_param->m2_resid_real[pos_resid[0]][ps][pb] = ixheaacd_mps_mult32_shr_15(
+                m2_param->m2_resid_real[pos_resid[0]][ps][pb], kappa[pb]);
+            m2_param->m2_resid_real[pos_resid[1]][ps][pb] = ixheaacd_mps_mult32_shr_15(
+                m2_param->m2_resid_real[pos_resid[1]][ps][pb], kappa[pb]);
+            m2_param->m2_resid_real[pos_resid[2]][ps][pb] = ixheaacd_mps_mult32_shr_15(
+                m2_param->m2_resid_real[pos_resid[2]][ps][pb], kappa[pb]);
+          }
+        }
+      }
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_calc_m1m2_tree_757x.c b/decoder/ixheaacd_mps_calc_m1m2_tree_757x.c
new file mode 100644
index 0000000..b118bf7
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_tree_757x.c
@@ -0,0 +1,212 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_calc_m1m2_common.h"
+
+VOID ixheaacd_calc_m1m2_7571(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 ps, pb;
+
+  WORD32 *h11_l, *h11_r, *h12_l, *h12_r, *h21_l, *h21_r, *h22_l, *h22_r, *h12_res_l, *h12_res_r,
+      *h22_res_l, *h22_res_r;
+  WORD16 *c_f_l, *c_f_r, *dummy;
+
+  WORD32 idx;
+  WORD32 residual_coding = pstr_mps_state->residual_coding;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+
+  h11_l = pstr_mps_state->mps_scratch_mem_v;
+  h11_r = h11_l + MAX_PARAMETER_BANDS;
+  h12_l = h11_r + MAX_PARAMETER_BANDS;
+  h12_r = h12_l + MAX_PARAMETER_BANDS;
+  h21_l = h12_r + MAX_PARAMETER_BANDS;
+  h21_r = h21_l + MAX_PARAMETER_BANDS;
+  h22_l = h21_r + MAX_PARAMETER_BANDS;
+  h22_r = h22_l + MAX_PARAMETER_BANDS;
+  h12_res_l = h22_r + MAX_PARAMETER_BANDS;
+  h12_res_r = h12_res_l + MAX_PARAMETER_BANDS;
+  h22_res_l = h12_res_r + MAX_PARAMETER_BANDS;
+  h22_res_r = h22_res_l + MAX_PARAMETER_BANDS;
+
+  c_f_l = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX24;
+  c_f_r = c_f_l + MAX_PARAMETER_BANDS;
+  dummy = c_f_r + MAX_PARAMETER_BANDS;
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_l, h12_l, h21_l, h22_l, h12_res_l, h22_res_l,
+                            c_f_l, dummy, 0, ps, pstr_mps_state->res_bands[0]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_r, h12_r, h21_r, h22_r, h12_res_r, h22_res_r,
+                            c_f_r, dummy, 1, ps, pstr_mps_state->res_bands[1]);
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m1_param->m1_param_real[0][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[1][1][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[2][2][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[3][3][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[4][4][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[5][5][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[6][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[7][1][ps][pb] = ONE_IN_Q15;
+    }
+
+    memcpy(m2_param->m2_decor_real[0][ps], h12_l, num_parameter_bands * sizeof(h12_l[0]));
+    memcpy(m2_param->m2_decor_real[1][ps], h22_l, num_parameter_bands * sizeof(h22_l[0]));
+    memcpy(m2_param->m2_decor_real[2][ps], h12_r, num_parameter_bands * sizeof(h12_r[0]));
+    memcpy(m2_param->m2_decor_real[3][ps], h22_r, num_parameter_bands * sizeof(h22_r[0]));
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h11_l[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h12_res_l[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h21_l[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h22_res_l[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ONE_IN_Q15;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h11_r[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h12_res_r[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h21_r[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h22_res_r[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ONE_IN_Q15;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ONE_IN_Q15;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ONE_IN_Q15;
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_calc_m1m2_7572(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 ps, pb;
+  WORD32 *h11_l, *h11_r, *h12_l, *h12_r, *h21_l, *h21_r, *h22_l, *h22_r, *h12_res_l, *h12_res_r,
+      *h22_res_l, *h22_res_r;
+  WORD16 *c_f_l, *c_f_r, *dummy;
+
+  WORD32 idx;
+  WORD32 residual_coding = pstr_mps_state->residual_coding;
+  WORD32 num_parameter_sets = pstr_mps_state->num_parameter_sets;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+
+  h11_l = pstr_mps_state->mps_scratch_mem_v;
+  h11_r = h11_l + MAX_PARAMETER_BANDS;
+  h12_l = h11_r + MAX_PARAMETER_BANDS;
+  h12_r = h12_l + MAX_PARAMETER_BANDS;
+  h21_l = h12_r + MAX_PARAMETER_BANDS;
+  h21_r = h21_l + MAX_PARAMETER_BANDS;
+  h22_l = h21_r + MAX_PARAMETER_BANDS;
+  h22_r = h22_l + MAX_PARAMETER_BANDS;
+  h12_res_l = h22_r + MAX_PARAMETER_BANDS;
+  h12_res_r = h12_res_l + MAX_PARAMETER_BANDS;
+  h22_res_l = h12_res_r + MAX_PARAMETER_BANDS;
+  h22_res_r = h22_res_l + MAX_PARAMETER_BANDS;
+
+  c_f_l = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + PARAMETER_BANDSX24;
+  c_f_r = c_f_l + MAX_PARAMETER_BANDS;
+  dummy = c_f_r + MAX_PARAMETER_BANDS;
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_l, h12_l, h21_l, h22_l, h12_res_l, h22_res_l,
+                            c_f_l, dummy, 0, ps, pstr_mps_state->res_bands[0]);
+    ixheaacd_param_2_umx_ps(pstr_mps_state, h11_r, h12_r, h21_r, h22_r, h12_res_r, h22_res_r,
+                            c_f_r, dummy, 1, ps, pstr_mps_state->res_bands[1]);
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      m1_param->m1_param_real[0][0][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[1][1][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[2][2][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[3][3][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[4][4][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[5][5][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[6][4][ps][pb] = ONE_IN_Q15;
+      m1_param->m1_param_real[7][5][ps][pb] = ONE_IN_Q15;
+    }
+
+    memcpy(m2_param->m2_decor_real[0][ps], h22_l, num_parameter_bands * sizeof(h22_l[0]));
+    memcpy(m2_param->m2_decor_real[1][ps], h12_l, num_parameter_bands * sizeof(h12_l[0]));
+    memcpy(m2_param->m2_decor_real[2][ps], h22_r, num_parameter_bands * sizeof(h22_r[0]));
+    memcpy(m2_param->m2_decor_real[3][ps], h12_r, num_parameter_bands * sizeof(h12_r[0]));
+
+    for (pb = 0; pb < num_parameter_bands; pb++) {
+      idx = 0;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ONE_IN_Q15;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h21_l[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h22_res_l[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h11_l[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h12_res_l[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ONE_IN_Q15;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h21_r[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h22_res_r[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = h11_r[pb];
+
+      if (residual_coding) m2_param->m2_resid_real[idx++][ps][pb] = h12_res_r[pb];
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ONE_IN_Q15;
+
+      m2_param->m2_resid_real[idx++][ps][pb] = ONE_IN_Q15;
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_calc_m1m2_tree_config.h b/decoder/ixheaacd_mps_calc_m1m2_tree_config.h
new file mode 100644
index 0000000..4af674b
--- /dev/null
+++ b/decoder/ixheaacd_mps_calc_m1m2_tree_config.h
@@ -0,0 +1,35 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_CALC_M1M2_TREE_CONFIG_H
+#define IXHEAACD_MPS_CALC_M1M2_TREE_CONFIG_H
+
+VOID ixheaacd_calc_m1m2_emm(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_5151(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_5152(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_51s1(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_51s2(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_5227(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_5251(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_7271(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_7272(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_7571(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_calc_m1m2_7572(ia_heaac_mps_state_struct *pstr_mps_state);
+
+#endif /* IXHEAACD_MPS_CALC_M1M2_TREE_CONFIG_H */
diff --git a/decoder/ixheaacd_mps_dec.c b/decoder/ixheaacd_mps_dec.c
index 98f6646..715cd4c 100644
--- a/decoder/ixheaacd_mps_dec.c
+++ b/decoder/ixheaacd_mps_dec.c
@@ -17,18 +17,15 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
-#include <stdlib.h>
-#include <stdio.h>
 #include <math.h>
-
-#include <assert.h>
 #include <string.h>
-
 #include "ixheaacd_type_def.h"
-
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
 #include "ixheaacd_bitbuffer.h"
-
 #include "ixheaacd_defines.h"
+#include "ixheaacd_sbr_const.h"
 #include "ixheaacd_memory_standards.h"
 #include "ixheaacd_sbrdecsettings.h"
 #include "ixheaacd_env_extr_part.h"
@@ -37,39 +34,47 @@
 #include "ixheaacd_sbr_rom.h"
 #include "ixheaacd_pulsedata.h"
 #include "ixheaacd_pns.h"
-
 #include "ixheaacd_sbr_common.h"
 #include "ixheaacd_drc_data_struct.h"
-#include "ixheaacd_drc_dec.h"
-
-#include "ixheaacd_lt_predict.h"
-#include "ixheaacd_channelinfo.h"
-#include "ixheaacd_channel.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_error_codes.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
-#include "ixheaacd_sbr_common.h"
-
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_lpp_tran.h"
+#include "ixheaacd_env_extr.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_env_calc.h"
+#include "ixheaacd_pvc_dec.h"
+#include "ixheaacd_sbr_dec.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_mps_interface.h"
 #include "ixheaacd_struct_def.h"
-
-#include "ixheaacd_config.h"
-#include "ixheaacd_mps_interface.h"
-
-#include "ixheaacd_mps_polyphase.h"
-
-#include "ixheaacd_mps_dec.h"
 #include "ixheaacd_mps_process.h"
+#include "ixheaacd_mps_bitdec.h"
+#include "ixheaacd_mps_smoothing.h"
+#include "ixheaacd_mps_tp_process.h"
+#include "ixheaacd_mps_reshape_bb_env.h"
+#include "ixheaacd_mps_blind.h"
+#include "ixheaacd_mps_m1m2.h"
+#include "ixheaacd_mps_basic_op.h"
 #include "ixheaacd_mps_decor.h"
 #include "ixheaacd_mps_hybfilter.h"
 #include "ixheaacd_mps_nlc_dec.h"
 #include "ixheaacd_mps_huff_tab.h"
-#include "ixheaacd_error_standards.h"
 
 extern const ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes;
 extern const ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes;
@@ -77,6 +82,7 @@
 extern const ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes;
 extern const ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes;
 extern const ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes;
+extern const ia_huff_cpc_nodes_struct ixheaacd_huff_cpc_nodes;
 extern const ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes;
 
 WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len,
@@ -109,16 +115,19 @@
 
   err_code = ixheaacd_mps_header_decode(self);
 
-  if (err_code != 0) return err_code;
+  if (err_code != IA_NO_ERROR) {
+    self->mps_init_done = 0;
+    return err_code;
+  }
 
   if ((self->residual_coding) && (self->res_bands > 0)) self->res_ch_count++;
 
   ixheaacd_mps_env_init(self);
 
-  ixheaacd_mps_synt_create(&self->poly_phase_filt_kernel, self->qmf_band_count);
+  self->resolution = self->qmf_band_count;
 
   for (num_ch = 0; num_ch < self->out_ch_count; num_ch++) {
-    ixheaacd_mps_synt_init(&self->qmf_filt_state[num_ch]);
+    ixheaacd_mps_synt_init(self->qmf_filt_state[num_ch]);
   }
 
   ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[0]);
@@ -126,9 +135,14 @@
   if ((self->residual_coding) && (self->res_bands > 0))
     ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[1]);
 
-  err_code = ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count,
-                                     self->config->bs_decorr_config);
-  if (err_code != IA_NO_ERROR) return err_code;
+  err_code = ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count_max,
+                                     self->config->bs_decorr_config,
+                                     self->object_type);
+
+  if (err_code != IA_NO_ERROR) {
+    self->mps_init_done = 0;
+    return err_code;
+  }
 
   ixheaacd_mps_init_pre_and_post_matrix(self);
 
@@ -149,6 +163,7 @@
          MAX_PARAMETER_BANDS * sizeof(WORD32));
   memset(self->opd_smooth.smooth_r_phase, 0,
          MAX_PARAMETER_BANDS * sizeof(WORD32));
+  self->mps_init_done = 1;
 
   return 0;
 }
@@ -162,13 +177,25 @@
     0.0f, -0.707106781186548f, -1.0f, -0.707106781186548f};
 
 VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct* self) {
-  ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[0], self->qmf_in[0],
+  if (self->object_type == AOT_ER_AAC_ELD ||
+      self->object_type == AOT_ER_AAC_LD) {
+    WORD32 k, n;
+
+    for (n = 0; n < self->time_slots; n++) {
+      for (k = 0; k < self->qmf_band_count; k++) {
+        self->hyb_in[0][k][n].re = self->qmf_in[0][n][k].re;
+        self->hyb_in[0][k][n].im = self->qmf_in[0][n][k].im;
+      }
+    }
+  } else {
+      ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[0], self->qmf_in[0],
                                    self->qmf_band_count, self->time_slots,
                                    self->hyb_in[0]);
+  }
 
   if ((self->residual_coding) && (self->res_bands > 0)) {
     ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[self->in_ch_count],
-                                     self->qmf_in[1], self->qmf_band_count,
+                                     self->qmf_in[1], self->band_count[1],
                                      self->time_slots, self->hyb_res);
   }
 }
@@ -176,10 +203,23 @@
 VOID ixheaacd_mps_qmf_hyb_synthesis(ia_mps_dec_state_struct* self) {
   WORD32 ch;
 
-  for (ch = 0; ch < self->out_ch_count; ch++) {
-    ixheaacd_mps_qmf_hybrid_synthesis(self->hyb_dir_out[ch],
+  if (self->object_type == AOT_ER_AAC_ELD ||
+      self->object_type == AOT_ER_AAC_LD) {
+    WORD32 k, n;
+    for (ch = 0; ch < self->out_ch_count; ch++) {
+      for (n = 0; n < self->time_slots; n++) {
+        for (k = 0; k < self->qmf_band_count; k++) {
+          self->qmf_out_dir[ch][n][k].re = self->hyb_dir_out[ch][n][k].re;
+          self->qmf_out_dir[ch][n][k].im = self->hyb_dir_out[ch][n][k].im;
+        }
+      }
+    }
+  } else {
+      for (ch = 0; ch < self->out_ch_count; ch++) {
+          ixheaacd_mps_qmf_hybrid_synthesis(self->hyb_dir_out[ch],
                                       self->qmf_band_count, self->time_slots,
                                       self->qmf_out_dir[ch]);
+      }
   }
 }
 
@@ -209,7 +249,8 @@
     }
 
     ixheaacd_mps_decor_apply(&self->mps_decor, self->v[k], self->w_diff[k],
-                             self->time_slots);
+                             self->time_slots, NO_RES_BANDS,
+                             self->ldmps_config.ldmps_present_flag);
 
     if (self->bs_tsd_enable) {
       for (sb_sample = 0; sb_sample < self->time_slots; sb_sample++) {
@@ -235,7 +276,7 @@
   WORD32 ts, qs, row, indx;
 
   for (ts = 0; ts < self->time_slots; ts++) {
-    for (qs = 0; qs < self->hyb_band_count; qs++) {
+    for (qs = 0; qs < self->hyb_band_count_max; qs++) {
       indx = self->hyb_band_to_processing_band_table[qs];
 
       for (row = 0; row < self->dir_sig_count; row++) {
@@ -246,8 +287,8 @@
       for (row = self->dir_sig_count;
            row < (self->dir_sig_count + self->decor_sig_count); row++) {
         if (indx < self->res_bands) {
-          self->w_dir[row][ts][qs].re = self->hyb_res[ts][qs].re;
-          self->w_dir[row][ts][qs].im = self->hyb_res[ts][qs].im;
+          self->w_dir[row][ts][qs].re = self->hyb_res[qs][ts].re;
+          self->w_dir[row][ts][qs].im = self->hyb_res[qs][ts].im;
         } else {
           self->w_dir[row][ts][qs].re = 0.0f;
           self->w_dir[row][ts][qs].im = 0.0f;
@@ -270,10 +311,56 @@
   }
 }
 
+VOID ixheaacd_mps_mix_res_decor_residual_band(ia_mps_dec_state_struct* self) {
+  WORD32 ts, qs, indx;
+  for (qs = 0; qs < self->hyb_band_count_max; qs++) {
+    indx = self->hyb_band_to_processing_band_table[qs];
+    if (indx >= self->res_bands) {
+      if (qs < self->hyb_band_count[1]) {
+        for (ts = 0; ts < self->time_slots; ts++) {
+          self->w_dir[1][ts][qs].re = 0.0f;
+          self->w_dir[1][ts][qs].im = 0.0f;
+        }
+      }
+    } else {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        self->w_diff[1][ts][qs].re = 0.0f;
+        self->w_diff[1][ts][qs].im = 0.0f;
+      }
+    }
+  }
+}
+
 VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self) {
   ixheaacd_mps_decor(self);
   ixheaacd_mps_mix_res_decor(self);
 }
+
+VOID ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(ia_mps_dec_state_struct* self) {
+  ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
+      &self->hyb_filt_state[0], self->qmf_in[0], self->band_count[0],
+      self->time_slots, self->w_dir[0]);
+
+  if (self->res_bands) {
+    ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
+        &self->hyb_filt_state[1], self->qmf_in[1], self->band_count[1],
+        self->time_slots, self->w_dir[1]);
+
+    if (self->res_bands != 28) {
+      ixheaacd_mps_decor_apply(&self->mps_decor, self->w_dir[0],
+                               self->w_diff[1], self->time_slots,
+                               self->res_bands,
+                               self->ldmps_config.ldmps_present_flag);
+
+      ixheaacd_mps_mix_res_decor_residual_band(self);
+    }
+  } else {
+    ixheaacd_mps_decor_apply(&self->mps_decor, self->w_dir[0], self->w_diff[1],
+                             self->time_slots, NO_RES_BANDS,
+                             self->ldmps_config.ldmps_present_flag);
+  }
+}
+
 WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self,
                           FLOAT32** input_buffer[4],
                           FLOAT32 (*output_buffer)[4096]) {
@@ -281,44 +368,53 @@
   WORD32 time_slots = self->time_slots;
   WORD32 in_ch_count = self->in_ch_count + self->res_ch_count;
   WORD32 err = 0;
-
+  self->hyb_band_count[0] = self->band_count[0] - QMF_BANDS_TO_HYBRID + 10;
+  self->hyb_band_count[1] = self->band_count[1] - QMF_BANDS_TO_HYBRID + 10;
+  self->hyb_band_count_max =
+      max(self->hyb_band_count[0], self->hyb_band_count[1]);
+  self->mps_decor.decor_nrg_smooth.num_bins = self->hyb_band_count_max;
+  self->mps_decor.num_bins = self->hyb_band_count_max;
   self->output_buffer = output_buffer;
 
-  assert(self->present_time_slot + time_slots <= self->time_slots);
-
-  for (ts = 0; ts < time_slots; ts++) {
-    for (ch = 0; ch < in_ch_count; ch++) {
-      for (qs = 0; qs < self->qmf_band_count; qs++) {
-        self->qmf_in[ch][self->present_time_slot + ts][qs].re =
-            self->input_gain * input_buffer[2 * ch][ts][qs];
-        self->qmf_in[ch][self->present_time_slot + ts][qs].im =
-            self->input_gain * input_buffer[2 * ch + 1][ts][qs];
-      }
-    }
-  }
-
-  self->present_time_slot += time_slots;
-
-  if (self->present_time_slot < self->time_slots) return 0;
-
-  self->present_time_slot = 0;
-
   err = ixheaacd_mps_frame_decode(self);
 
-  if (err != 0) return err;
-  ixheaacd_mps_qmf_hyb_analysis(self);
+  if (err != IA_NO_ERROR) return err;
 
   ixheaacd_pre_and_mix_matrix_calculation(self);
 
   ixheaacd_mps_pre_matrix_mix_matrix_smoothing(self);
 
-  err = ixheaacd_mps_apply_pre_matrix(self);
-  if (err < 0) return err;
+  for (ch = 0; ch < in_ch_count; ch++) {
+    for (ts = 0; ts < time_slots; ts++) {
+      for (qs = 0; qs < self->band_count[ch]; qs++) {
+        self->qmf_in[ch][qs][ts].re =
+            self->input_gain * input_buffer[2 * ch][ts][qs];
+        self->qmf_in[ch][qs][ts].im =
+            self->input_gain * input_buffer[2 * ch + 1][ts][qs];
+      }
+    }
+  }
 
-  ixheaacd_mps_create_w(self);
+  if (!(self->pre_mix_req | self->bs_tsd_enable)) {
+    ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(self);
+  } else {
+    ixheaacd_mps_qmf_hyb_analysis(self);
 
-  err = ixheaacd_mps_apply_mix_matrix(self);
-  if (err < 0) return err;
+    ixheaacd_mps_apply_pre_matrix(self);
+
+    ixheaacd_mps_create_w(self);
+  }
+
+  if ((!(self->res_bands | self->pre_mix_req)) &&
+      (self->config->bs_phase_coding == 0)) {
+    ixheaacd_mps_apply_mix_matrix_type1(self);
+
+  } else if (self->pre_mix_req) {
+    ixheaacd_mps_apply_mix_matrix_type2(self);
+
+  } else {
+    ixheaacd_mps_apply_mix_matrix_type3(self);
+  }
 
   if (self->config->bs_temp_shape_config == 2) {
     ixheaacd_mps_time_env_shaping(self);
@@ -328,12 +424,11 @@
   if (err) return err;
 
   self->parse_nxt_frame = 1;
+  self->pre_mix_req = 0;
   return 0;
 }
 
-#define min(a, b) (((a) < (b)) ? (a) : (b))
-
-static VOID ixheaacd_mps_pcm_decode(ia_handle_bit_buf_struct it_bit_buff,
+static VOID ixheaacd_mps_pcm_decode(ia_bit_buf_struct *it_bit_buff,
                                     WORD32* out_data_1, WORD32* out_data_2,
                                     WORD32 ixheaacd_drc_offset, WORD32 num_val,
                                     WORD32 num_levels) {
@@ -376,7 +471,7 @@
       max_grp_len = 1;
       break;
     default:
-      assert(0);
+      return;
   }
 
   ld_nlev = (FLOAT32)(log((FLOAT32)num_levels) / log(2.f));
@@ -414,7 +509,7 @@
   return;
 }
 
-static VOID ixheaacd_mps_huff_read(ia_handle_bit_buf_struct it_bit_buff,
+static VOID ixheaacd_mps_huff_read(ia_bit_buf_struct *it_bit_buff,
                                    const WORD32 (*node_tab)[][2],
                                    WORD32* out_data) {
   WORD32 node = 0;
@@ -430,7 +525,7 @@
   return;
 }
 
-static VOID ixheaacd_mps_huff_read_2d(ia_handle_bit_buf_struct it_bit_buff,
+static VOID ixheaacd_mps_huff_read_2d(ia_bit_buf_struct *it_bit_buff,
                                       const WORD32 (*node_tab)[][2],
                                       WORD32 out_data[2], WORD32* escape)
 
@@ -453,7 +548,7 @@
   return;
 }
 
-static VOID ixheaacd_mps_sym_restore(ia_handle_bit_buf_struct it_bit_buff,
+static VOID ixheaacd_mps_sym_restore(ia_bit_buf_struct *it_bit_buff,
                                      WORD32 lav, WORD32 data[2]) {
   WORD32 tmp = 0;
   UWORD32 sym_bit = 0;
@@ -489,7 +584,7 @@
   return;
 }
 
-static VOID ixheaacd_mps_sym_restoreipd(ia_handle_bit_buf_struct it_bit_buff,
+static VOID ixheaacd_mps_sym_restoreipd(ia_bit_buf_struct *it_bit_buff,
                                         WORD32 lav, WORD32 data[2]) {
   WORD32 tmp = 0;
   UWORD32 sym_bit = 0;
@@ -517,7 +612,7 @@
   return;
 }
 
-static VOID ixheaacd_mps_huff_dec_pilot(ia_handle_bit_buf_struct it_bit_buff,
+static VOID ixheaacd_mps_huff_dec_pilot(ia_bit_buf_struct *it_bit_buff,
                                         const WORD32 (*node_tab)[][2],
                                         WORD32* pilot_data) {
   WORD32 node = 0;
@@ -529,7 +624,7 @@
 }
 
 static VOID ixheaacd_mps_huff_dec_cld_1d(
-    ia_handle_bit_buf_struct it_bit_buff,
+    ia_bit_buf_struct *it_bit_buff,
     const ia_huff_cld_node_1d_struct* huff_nodes, WORD32* out_data,
     WORD32 num_val, WORD32 p0_flag) {
   WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
@@ -563,7 +658,7 @@
 }
 
 static VOID ixheaacd_mps_huff_dec_ipd_1d(
-    ia_handle_bit_buf_struct it_bit_buff,
+    ia_bit_buf_struct *it_bit_buff,
     const ia_huff_ipd_node_1d_struct* huff_nodes, WORD32* out_data,
     WORD32 num_val, WORD32 p0_flag) {
   WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
@@ -588,7 +683,7 @@
 }
 
 static VOID ixheaacd_mps_huff_dec_icc_1d(
-    ia_handle_bit_buf_struct it_bit_buff,
+    ia_bit_buf_struct *it_bit_buff,
     const ia_huff_icc_node_1d_struct* huff_nodes, WORD32* out_data,
     WORD32 num_val, WORD32 p0_flag) {
   WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
@@ -621,8 +716,39 @@
   return;
 }
 
+static VOID ia_mps_dec_huff_dec_cpc_1d(
+    const ia_huff_cpc_node_1d_struct *huff_nodes, WORD32 *out_data,
+    WORD32 num_val, WORD32 p0_flag, ia_bit_buf_struct *h_bit_buf) {
+  WORD32 i = 0, node = 0, offset = 0;
+  WORD32 od = 0, od_sign = 0;
+  WORD32 data = 0;
+
+  if (p0_flag) {
+    ixheaacd_mps_huff_read(
+        h_bit_buf, (ia_huff_node_struct) & (ixheaacd_huff_part0_nodes.cpc),
+        &node);
+    out_data[0] = -(node + 1);
+    offset = 1;
+  }
+
+  for (i = offset; i < num_val; i++) {
+    ixheaacd_mps_huff_read(h_bit_buf,
+                           (ia_huff_node_struct)&huff_nodes->node_tab, &node);
+    od = -(node + 1);
+
+    if (od != 0) {
+      data = ixheaacd_read_bits_buf(h_bit_buf, 1);
+      od_sign = data;
+
+      if (od_sign) od = -od;
+    }
+
+    out_data[i] = od;
+  }
+}
+
 static VOID ixheaacd_mps_huff_dec_cld_2d(
-    ia_handle_bit_buf_struct it_bit_buff,
+    ia_bit_buf_struct *it_bit_buff,
     const ia_huff_cld_node_2d_struct* huff_nodes, WORD32 out_data[][2],
     WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
   WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
@@ -699,7 +825,7 @@
 }
 
 static VOID ixheaacd_mps_huff_dec_icc_2d(
-    ia_handle_bit_buf_struct it_bit_buff,
+    ia_bit_buf_struct *it_bit_buff,
     const ia_huff_icc_node_2d_struct* huff_nodes, WORD32 out_data[][2],
     WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
   WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
@@ -774,7 +900,7 @@
 }
 
 static VOID ixheaacd_mps_huff_dec_ipd_2d(
-    ia_handle_bit_buf_struct it_bit_buff,
+    ia_bit_buf_struct *it_bit_buff,
     const ia_huff_ipd_node_2d_struct* huff_nodes, WORD32 out_data[][2],
     WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
   WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
@@ -853,12 +979,86 @@
   return;
 }
 
-static WORD32 ixheaacd_huff_decode(ia_handle_bit_buf_struct it_bit_buff,
-                                   WORD32* out_data_1, WORD32* out_data_2,
-                                   WORD32 data_type, WORD32 diff_type_1,
-                                   WORD32 diff_type_2, WORD32 pilot_coding_flag,
-                                   WORD32* pilot_data, WORD32 num_val,
-                                   WORD32* cdg_scheme) {
+static VOID ia_mps_dec_huff_dec_cpc_2d(
+    const ia_mps_dec_huff_cpc_nod_2d *huff_nodes, WORD32 out_data[][2],
+    WORD32 num_val, WORD32 stride, WORD32 *p0_data[2],
+    ia_bit_buf_struct *h_bit_buf) {
+  WORD32 i = 0, lav = 0, escape = 0, esc_cntr = 0;
+  WORD32 node = 0;
+  WORD32 data = 0;
+
+  WORD32 esc_data[2][MAXBANDS] = {{0}};
+  WORD32 esc_idx[MAXBANDS] = {0};
+
+  ixheaacd_mps_huff_read(
+      h_bit_buf, (ia_huff_node_struct) & (ixheaacd_huff_lav_idx_nodes.node_tab),
+      &node);
+  data = -(node + 1);
+
+  lav = 3 * data + 3;
+
+  if (p0_data[0] != NULL) {
+    ixheaacd_mps_huff_read(
+        h_bit_buf, (ia_huff_node_struct) & (ixheaacd_huff_part0_nodes.cpc),
+        &node);
+    *p0_data[0] = -(node + 1);
+  }
+  if (p0_data[1] != NULL) {
+    ixheaacd_mps_huff_read(
+        h_bit_buf, (ia_huff_node_struct) & (ixheaacd_huff_part0_nodes.cpc),
+        &node);
+    *p0_data[1] = -(node + 1);
+  }
+
+  for (i = 0; i < num_val; i += stride) {
+    switch (lav) {
+      case LAV_3:
+        ixheaacd_mps_huff_read_2d(h_bit_buf,
+                                  (ia_huff_node_struct)&huff_nodes->lav3,
+                                  out_data[i], &escape);
+        break;
+      case LAV_6:
+        ixheaacd_mps_huff_read_2d(h_bit_buf,
+                                  (ia_huff_node_struct)&huff_nodes->lav6,
+                                  out_data[i], &escape);
+        break;
+      case LAV_9:
+        ixheaacd_mps_huff_read_2d(h_bit_buf,
+                                  (ia_huff_node_struct)&huff_nodes->lav9,
+                                  out_data[i], &escape);
+        break;
+      case LAV_12:
+        ixheaacd_mps_huff_read_2d(h_bit_buf,
+                                  (ia_huff_node_struct)&huff_nodes->lav12,
+                                  out_data[i], &escape);
+        break;
+      default:
+        break;
+    }
+
+    if (escape) {
+      esc_idx[esc_cntr++] = i;
+    } else {
+      ixheaacd_mps_sym_restore(h_bit_buf, lav, out_data[i]);
+    }
+  }
+
+  if (esc_cntr > 0) {
+    ixheaacd_mps_pcm_decode(h_bit_buf, esc_data[0], esc_data[1], 0,
+                            (esc_cntr << 1), ((lav << 1) + 1));
+
+    for (i = 0; i < esc_cntr; i++) {
+      out_data[esc_idx[i]][0] = esc_data[0][i] - lav;
+      out_data[esc_idx[i]][1] = esc_data[1][i] - lav;
+    }
+  }
+  return;
+}
+
+static VOID ixheaacd_huff_decode(ia_bit_buf_struct *it_bit_buff, WORD32 *out_data_1,
+                                 WORD32 *out_data_2, WORD32 data_type, WORD32 diff_type_1,
+                                 WORD32 diff_type_2, WORD32 pilot_coding_flag, WORD32 *pilot_data,
+                                 WORD32 num_val, WORD32 *cdg_scheme, WORD32 ld_mps_flag) {
   WORD32 diff_type;
 
   WORD32 i = 0;
@@ -883,7 +1083,6 @@
   WORD32 huff_yy_1;
   WORD32 huff_yy_2;
   WORD32 huff_yy;
-
   if (pilot_coding_flag) {
     switch (data_type) {
       case CLD:
@@ -902,11 +1101,17 @@
         }
         break;
 
-      default:
+      case CPC:
         if (out_data_1 != NULL) {
-          return 0;
+          ixheaacd_mps_huff_dec_pilot(
+              it_bit_buff,
+              (ia_huff_node_struct) & (ixheaacd_huff_pilot_nodes.cpc),
+              pilot_data);
         }
         break;
+
+      default:
+        break;
     }
   }
 
@@ -914,7 +1119,7 @@
   *cdg_scheme = data << PAIR_SHIFT;
 
   if (*cdg_scheme >> PAIR_SHIFT == HUFF_2D) {
-    if ((out_data_1 != NULL) && (out_data_2 != NULL)) {
+    if ((out_data_1 != NULL) && (out_data_2 != NULL) && (ld_mps_flag != 1)) {
       data = ixheaacd_read_bits_buf(it_bit_buff, 1);
       *cdg_scheme |= data;
     } else {
@@ -978,7 +1183,19 @@
           }
 
           break;
+        case CPC:
+          if (out_data_1 != NULL) {
+            ia_mps_dec_huff_dec_cpc_1d(
+                &(ixheaacd_huff_cpc_nodes.h_1_dim[huff_yy_1]), out_data_1,
+                num_val_1_int, p0_flag[0], it_bit_buff);
+          }
+          if (out_data_2 != NULL) {
+            ia_mps_dec_huff_dec_cpc_1d(
+                &(ixheaacd_huff_cpc_nodes.h_1_dim[huff_yy_2]), out_data_2,
+                num_val_2_int, p0_flag[1], it_bit_buff);
+          }
 
+          break;
         default:
           break;
       }
@@ -1089,7 +1306,28 @@
                 }
               }
               break;
+            case CPC:
+              if (out_data_1 != NULL) {
+                ia_mps_dec_huff_dec_cpc_2d(
+                    &(ixheaacd_huff_cpc_nodes.h_2_dim[huff_yy_1][FREQ_PAIR]), pair_vec,
+                    num_val_1_int, 2, p0_data_1, it_bit_buff);
+                if (df_rest_flag_1) {
+                  ia_mps_dec_huff_dec_cpc_1d(&(ixheaacd_huff_cpc_nodes.h_1_dim[huff_yy_1]),
+                      out_data_1_int + num_val_1_int, 1, 0, it_bit_buff);
+                }
+              }
+              if (out_data_2 != NULL) {
+                ia_mps_dec_huff_dec_cpc_2d(
+                    &(ixheaacd_huff_cpc_nodes.h_2_dim[huff_yy_2][FREQ_PAIR]), pair_vec + 1,
+                    num_val_2_int, 2, p0_data_2, it_bit_buff);
 
+                if (df_rest_flag_2) {
+                  ia_mps_dec_huff_dec_cpc_1d(
+                      &(ixheaacd_huff_cpc_nodes.h_1_dim[huff_yy_2]),
+                      out_data_2_int + num_val_2_int, 1, 0, it_bit_buff);
+                }
+              }
+              break;
             default:
               break;
           }
@@ -1154,7 +1392,10 @@
                   &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy][TIME_PAIR],
                   pair_vec, num_val_1_int, 1, p0_data_1);
               break;
-
+            case CPC:
+              ia_mps_dec_huff_dec_cpc_2d(&(ixheaacd_huff_cpc_nodes.h_2_dim[huff_yy][TIME_PAIR]),
+                  pair_vec, num_val_1_int, 1, p0_data_1, it_bit_buff);
+              break;
             default:
               break;
           }
@@ -1176,7 +1417,7 @@
       break;
   }
 
-  return 1;
+  return;
 }
 
 static VOID ixheaacd_diff_freq_decode(WORD32* diff_data, WORD32* out_data,
@@ -1226,7 +1467,7 @@
   }
 }
 
-static VOID ixheaacd_attach_lsb(ia_handle_bit_buf_struct it_bit_buff,
+static VOID ixheaacd_attach_lsb(ia_bit_buf_struct *it_bit_buff,
                                 WORD32* in_data_msb, WORD32 ixheaacd_drc_offset,
                                 WORD32 num_lsb, WORD32 num_val,
                                 WORD32* out_data) {
@@ -1248,15 +1489,11 @@
   return;
 }
 
-WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct it_bit_buff,
-                                  WORD32 outdata[][MAXBANDS],
-                                  WORD32 history[MAXBANDS], WORD32 data_type,
-                                  WORD32 set_idx, WORD32 data_bands,
-                                  WORD32 pair_flag, WORD32 coarse_flag,
-                                  WORD32 independency_flag)
-
-{
-  WORD32 diff_time_back_flag = !independency_flag || (set_idx > 0);
+WORD32 ixheaacd_mps_ecdatapairdec(ia_bit_buf_struct *it_bit_buff, WORD32 outdata[][MAXBANDS],
+                                  WORD32 history[MAXBANDS], WORD32 data_type, WORD32 set_idx,
+                                  WORD32 start_band, WORD32 data_bands, WORD32 pair_flag,
+                                  WORD32 coarse_flag, WORD32 diff_time_back_flag,
+                                  WORD32 ld_mps_flag, WORD32 heaac_mps_present, WORD32 ec_flag) {
   WORD32 attach_lsb_flag = 0;
   WORD32 pcm_coding_flag = 0;
   WORD32 pilot_coding_flag = 0;
@@ -1277,6 +1514,10 @@
   WORD32 cdg_scheme = HUFF_1D;
   WORD32 direction = BACKWARDS;
 
+  if (heaac_mps_present == 1) {
+    band_start = start_band;
+  }
+
   switch (data_type) {
     case CLD:
       if (coarse_flag) {
@@ -1316,9 +1557,20 @@
       }
       break;
 
+    case CPC:
+      if (coarse_flag) {
+        attach_lsb_flag = 0;
+        quant_levels = 26;
+        quant_offset = 10;
+      } else {
+        attach_lsb_flag = 1;
+        quant_levels = 51;
+        quant_offset = 20;
+      }
+      break;
+
     default:
-      fprintf(stderr, "Unknown type of data!\n");
-      return -1;
+      break;
   }
 
   data = ixheaacd_read_bits_buf(it_bit_buff, 1);
@@ -1326,6 +1578,13 @@
 
   pilot_coding_flag = 0;
 
+  if (heaac_mps_present == 1) {
+    if (pcm_coding_flag && data_bands > 4) {
+      data = ixheaacd_read_bits_buf(it_bit_buff, 1);
+      pilot_coding_flag = data;
+    }
+  }
+
   if (pcm_coding_flag && !pilot_coding_flag) {
     if (pair_flag) {
       data_array[0] = data_pair[0];
@@ -1366,64 +1625,78 @@
       }
     }
 
-    if (data_bands <= 0) return -1;
-
-    if (!ixheaacd_huff_decode(it_bit_buff, data_array[0], data_array[1],
-                              data_type, diff_type[0], diff_type[1],
-                              pilot_coding_flag, pilot_data, data_bands,
-                              &cdg_scheme)) {
-      return 0;
+    if (data_bands <= 0) {
+      if (!ec_flag)
+        return -1;
+      else
+        longjmp(*(it_bit_buff->xaac_jmp_buf), IA_FATAL_ERROR);
     }
 
-    if ((diff_type[0] == DIFF_TIME) || (diff_type[1] == DIFF_TIME)) {
+    ixheaacd_huff_decode(it_bit_buff, data_array[0], data_array[1], data_type, diff_type[0],
+                         diff_type[1], pilot_coding_flag, pilot_data, data_bands, &cdg_scheme,
+                         ld_mps_flag);
+
+    if (pilot_coding_flag && heaac_mps_present == 1) {
+      WORD32 i;
+      for (i = 0; i < data_bands; i++) {
+        data_pair[0][i] = data_diff[0][i] + pilot_data[0];
+      }
+
       if (pair_flag) {
-        if ((diff_type[0] == DIFF_TIME) && !diff_time_back_flag) {
-          direction = FORWARDS;
-        } else if (diff_type[1] == DIFF_TIME) {
-          direction = BACKWARDS;
-        } else {
-          data = ixheaacd_read_bits_buf(it_bit_buff, 1);
-          direction = data;
-        }
-      } else {
-        direction = BACKWARDS;
-      }
-    }
-
-    mixed_time_pair = (diff_type[0] != diff_type[1]) &&
-                      ((cdg_scheme & PAIR_MASK) == TIME_PAIR);
-
-    if (direction == BACKWARDS) {
-      if (diff_type[0] == DIFF_FREQ) {
-        ixheaacd_diff_freq_decode(data_diff[0], data_pair[0], data_bands);
-      } else {
-        WORD32 i;
         for (i = 0; i < data_bands; i++) {
-          msb_state[i] = history[i + band_start] + quant_offset;
-          if (attach_lsb_flag) {
-            msb_state[i] >>= 1;
-          }
+          data_pair[1][i] = data_diff[1][i] + pilot_data[0];
         }
-        ixheaacd_mps_diff_time_dec_bwd(msb_state, data_diff[0], data_pair[0],
-                                       mixed_time_pair, data_bands);
-      }
-      if (diff_type[1] == DIFF_FREQ) {
-        ixheaacd_diff_freq_decode(data_diff[1], data_pair[1], data_bands);
-      } else {
-        ixheaacd_mps_diff_time_dec_bwd(data_pair[0], data_diff[1], data_pair[1],
-                                       mixed_time_pair, data_bands);
       }
     } else {
-      ixheaacd_diff_freq_decode(data_diff[1], data_pair[1], data_bands);
+      if ((diff_type[0] == DIFF_TIME) || (diff_type[1] == DIFF_TIME)) {
+        if (pair_flag) {
+          if ((diff_type[0] == DIFF_TIME) && !diff_time_back_flag) {
+            direction = FORWARDS;
+          } else if (diff_type[1] == DIFF_TIME) {
+            direction = BACKWARDS;
+          } else {
+            data = ixheaacd_read_bits_buf(it_bit_buff, 1);
+            direction = data;
+          }
+        } else {
+          direction = BACKWARDS;
+        }
+      }
 
-      if (diff_type[0] == DIFF_FREQ) {
-        ixheaacd_diff_freq_decode(data_diff[0], data_pair[0], data_bands);
+      mixed_time_pair = (diff_type[0] != diff_type[1]) &&
+                        ((cdg_scheme & PAIR_MASK) == TIME_PAIR);
+
+      if (direction == BACKWARDS) {
+        if (diff_type[0] == DIFF_FREQ) {
+          ixheaacd_diff_freq_decode(data_diff[0], data_pair[0], data_bands);
+        } else {
+          WORD32 i;
+          for (i = 0; i < data_bands; i++) {
+            msb_state[i] = history[i + band_start] + quant_offset;
+            if (attach_lsb_flag) {
+              msb_state[i] >>= 1;
+            }
+          }
+          ixheaacd_mps_diff_time_dec_bwd(msb_state, data_diff[0], data_pair[0],
+                                         mixed_time_pair, data_bands);
+        }
+        if (diff_type[1] == DIFF_FREQ) {
+          ixheaacd_diff_freq_decode(data_diff[1], data_pair[1], data_bands);
+        } else {
+          ixheaacd_mps_diff_time_dec_bwd(data_pair[0], data_diff[1], data_pair[1],
+                                         mixed_time_pair, data_bands);
+        }
       } else {
-        ixheaacd_mps_diff_time_dec_fwd(data_pair[1], data_diff[0], data_pair[0],
-                                       mixed_time_pair, data_bands);
+        ixheaacd_diff_freq_decode(data_diff[1], data_pair[1], data_bands);
+
+        if (diff_type[0] == DIFF_FREQ) {
+          ixheaacd_diff_freq_decode(data_diff[0], data_pair[0], data_bands);
+        } else {
+          ixheaacd_mps_diff_time_dec_fwd(data_pair[1], data_diff[0], data_pair[0],
+                                         mixed_time_pair, data_bands);
+        }
       }
     }
-
     ixheaacd_attach_lsb(it_bit_buff, data_pair[0], quant_offset,
                         attach_lsb_flag ? 1 : 0, data_bands, data_pair[0]);
     if (pair_flag) {
@@ -1442,7 +1715,7 @@
   return IA_NO_ERROR;
 }
 
-VOID ixheaacd_mps_huff_decode(ia_handle_bit_buf_struct it_bit_buff,
+VOID ixheaacd_mps_huff_decode(ia_bit_buf_struct *it_bit_buff,
                               WORD32* out_data, WORD32 num_val) {
   WORD32 val_rcvd = 0, dummy = 0, i = 0, val = 0, len = 0;
   WORD32 rl_data[2] = {0};
@@ -1461,3 +1734,375 @@
 
   return;
 }
+
+VOID ixheaacd_update_out_buffer(ia_heaac_mps_state_struct *pstr_mps_state,
+                                WORD16 *out_buf) {
+  WORD32 ch, sam;
+  WORD32 num_output_channels_at = pstr_mps_state->num_output_channels_at;
+  WORD32 frame_length = pstr_mps_state->frame_length;
+
+  WORD32 *p_time_out = pstr_mps_state->array_struct->time_out;
+
+  for (ch = 0; ch < num_output_channels_at; ch++) {
+    WORD32 *time_out = p_time_out;
+    for (sam = 0; sam < frame_length; sam++) {
+      out_buf[sam * num_output_channels_at + ch] = (*time_out++) >> 16;
+    }
+    p_time_out += QBXTS;
+  }
+
+  return;
+}
+
+VOID ixheaacd_update_time_out_buffer(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 n;
+  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
+  WORD32 tree_config = pstr_mps_state->tree_config;
+  WORD32 lfe_gain = pstr_mps_state->lfe_gain;
+  WORD32 surround_gain = pstr_mps_state->surround_gain;
+
+  if (!pstr_mps_state->bs_config.arbitrary_tree && up_mix_type != 2 && up_mix_type != 3) {
+    WORD32 frame_length = pstr_mps_state->frame_length;
+
+    WORD32 *time_out_3 = pstr_mps_state->array_struct->time_out + QBXTSX3;
+    WORD32 *time_out_4 = time_out_3 + QBXTS;
+    WORD32 *time_out_5 = time_out_4 + QBXTS;
+    WORD32 *time_out_6 = time_out_5 + QBXTS;
+    WORD32 *time_out_7 = time_out_6 + QBXTS;
+
+    for (n = 0; n < frame_length; n++) {
+      *time_out_3 = ixheaacd_mps_mult32_shr_15(*time_out_3, lfe_gain);
+      time_out_3++;
+      *time_out_4 = ixheaacd_mps_mult32_shr_15(*time_out_4, surround_gain);
+      time_out_4++;
+      *time_out_5 = ixheaacd_mps_mult32_shr_15(*time_out_5, surround_gain);
+      time_out_5++;
+    }
+
+    if (tree_config == 4 || tree_config == 6) {
+      for (n = 0; n < frame_length; n++) {
+        *time_out_6 = ixheaacd_mps_mult32_shr_15(*time_out_6, surround_gain);
+        time_out_6++;
+        *time_out_7 = ixheaacd_mps_mult32_shr_15(*time_out_7, surround_gain);
+        time_out_7++;
+      }
+    }
+  }
+}
+
+static IA_ERRORCODE ixheaacd_apply_frame(ia_heaac_mps_state_struct *pstr_mps_state,
+                                         WORD32 in_time_slots,
+                                         WORD32 *m_qmf_real, WORD32 *m_qmf_imag,
+                                         WORD16 *out_buf) {
+  IA_ERRORCODE err_code = IA_NO_ERROR;
+  WORD32 ch, ts, qs;
+  WORD32 *pbuf_real, *pbuf_imag, *pbuf_re, *pbuf_im;
+  WORD32 *buf_real, *buf_imag;
+  WORD32 *qmf_input_delay_real_2 =
+      pstr_mps_state->mps_persistent_mem.qmf_input_delay_real;
+  WORD32 *qmf_input_delay_imag_2 =
+      pstr_mps_state->mps_persistent_mem.qmf_input_delay_imag;
+  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
+  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
+  WORD32 cur_time_slot = pstr_mps_state->cur_time_slot;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 qmf_input_delay_index = pstr_mps_state->qmf_input_delay_index;
+  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
+  WORD32 residual_coding = pstr_mps_state->residual_coding;
+  WORD32 arbitrary_downmix = pstr_mps_state->arbitrary_downmix;
+
+  WORD32 *qmf_input_delay_real_1, *qmf_input_delay_imag_1;
+  WORD32 *qmf_input_delay_real, *qmf_input_delay_imag;
+
+  WORD32 *p_qmf_real = m_qmf_real;
+  WORD32 *p_qmf_imag = m_qmf_imag;
+  WORD32 *p_qmf_re, *p_qmf_im, *qmf_real, *qmf_imag;
+
+  if (cur_time_slot + in_time_slots > time_slots) {
+    if (pstr_mps_state->ec_flag)
+      cur_time_slot = time_slots - in_time_slots;
+    else
+      return IA_FATAL_ERROR;
+  }
+  if (time_slots % HOP_SLOTS != 0) {
+    if (pstr_mps_state->ec_flag)
+      time_slots = time_slots - (time_slots % HOP_SLOTS);
+    else
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TIMESLOTS;
+  }
+
+  pbuf_real = pstr_mps_state->array_struct->buf_real;
+  pbuf_imag = pstr_mps_state->array_struct->buf_imag;
+
+  if (up_mix_type == 1) {
+    for (ch = 0; ch < num_input_channels; ch++) {
+      pbuf_re = pbuf_real;
+      pbuf_im = pbuf_imag;
+
+      p_qmf_re = p_qmf_real;
+      p_qmf_im = p_qmf_imag;
+
+      for (ts = 0; ts < in_time_slots; ts++) {
+        buf_real = pbuf_re + (cur_time_slot + ts);
+        buf_imag = pbuf_im + (cur_time_slot + ts);
+
+        qmf_real = p_qmf_re;
+        qmf_imag = p_qmf_im;
+
+        for (qs = 0; qs < qmf_bands; qs++) {
+          *buf_real++ = *qmf_real++;
+          *buf_imag++ = *qmf_imag++;
+        }
+        pbuf_re += MAX_HYBRID_BANDS;
+        pbuf_im += MAX_HYBRID_BANDS;
+
+        p_qmf_re += MAX_NUM_QMF_BANDS;
+        p_qmf_im += MAX_NUM_QMF_BANDS;
+      }
+      pbuf_real += TSXHB;
+      pbuf_imag += TSXHB;
+
+      p_qmf_real += QBXTS;
+      p_qmf_imag += QBXTS;
+    }
+  } else {
+    for (ch = 0; ch < num_input_channels; ch++) {
+      WORD32 offset = ch * PCXQB;
+      qmf_input_delay_index = pstr_mps_state->qmf_input_delay_index;
+      qmf_input_delay_real_1 = qmf_input_delay_real_2 + offset;
+      qmf_input_delay_imag_1 = qmf_input_delay_imag_2 + offset;
+
+      pbuf_re = pbuf_real + cur_time_slot * MAX_HYBRID_BANDS;
+      pbuf_im = pbuf_imag + cur_time_slot * MAX_HYBRID_BANDS;
+
+      p_qmf_re = p_qmf_real;
+      p_qmf_im = p_qmf_imag;
+
+      for (ts = 0; ts < in_time_slots; ts++) {
+        WORD32 off_set = qmf_input_delay_index * MAX_NUM_QMF_BANDS;
+        qmf_input_delay_real = qmf_input_delay_real_1 + off_set;
+        qmf_input_delay_imag = qmf_input_delay_imag_1 + off_set;
+
+        buf_real = pbuf_re;
+        buf_imag = pbuf_im;
+
+        qmf_real = p_qmf_re;
+        qmf_imag = p_qmf_im;
+
+        for (qs = 0; qs < qmf_bands; qs++) {
+          {
+            *buf_real++ = *qmf_input_delay_real;
+            *buf_imag++ = *qmf_input_delay_imag;
+
+            *qmf_input_delay_real++ = *qmf_real++;
+            *qmf_input_delay_imag++ = *qmf_imag++;
+          }
+        }
+
+        qmf_input_delay_index++;
+
+        if (qmf_input_delay_index == PC_FILTERDELAY) {
+          qmf_input_delay_index = 0;
+        }
+        pbuf_re += MAX_HYBRID_BANDS;
+        pbuf_im += MAX_HYBRID_BANDS;
+
+        p_qmf_re += MAX_NUM_QMF_BANDS;
+        p_qmf_im += MAX_NUM_QMF_BANDS;
+      }
+      pbuf_real += TSXHB;
+      pbuf_imag += TSXHB;
+
+      p_qmf_real += QBXTS;
+      p_qmf_imag += QBXTS;
+    }
+    pstr_mps_state->qmf_input_delay_index = qmf_input_delay_index;
+  }
+
+  pstr_mps_state->cur_time_slot += in_time_slots;
+  cur_time_slot = pstr_mps_state->cur_time_slot;
+
+  if (pstr_mps_state->cur_time_slot < time_slots) {
+    if (pstr_mps_state->ec_flag) {
+      pstr_mps_state->cur_time_slot = time_slots;
+    } else
+      return IA_FATAL_ERROR;
+  }
+
+  pstr_mps_state->cur_time_slot = 0;
+
+  err_code = ixheaacd_decode_frame(pstr_mps_state);
+  if (err_code != IA_NO_ERROR) return err_code;
+
+  ixheaacd_mdct_2_qmf(pstr_mps_state);
+
+  ixheaacd_hybrid_qmf_analysis(pstr_mps_state);
+
+  if (residual_coding || (arbitrary_downmix == 2)) {
+    ixheaacd_update_buffers(pstr_mps_state);
+  }
+
+  if (up_mix_type == 1) {
+    ixheaacd_apply_blind(pstr_mps_state);
+  }
+
+  ixheaacd_calc_m1m2(pstr_mps_state);
+
+  ixheaacd_smooth_m1m2(pstr_mps_state);
+
+  ixheaacd_mps_apply_m1(pstr_mps_state);
+
+  ixheaacd_buffer_m1(pstr_mps_state);
+
+  if (up_mix_type != 2) {
+    if (pstr_mps_state->temp_shape_config == 2) {
+      ixheaacd_pre_reshape_bb_env(pstr_mps_state);
+    }
+  }
+
+  ixheaacd_create_w(pstr_mps_state);
+
+  ixheaacd_apply_m2(pstr_mps_state);
+
+  ixheaacd_buffer_m2(pstr_mps_state);
+
+  if (up_mix_type != 2) {
+    if (pstr_mps_state->temp_shape_config == 2) {
+      ixheaacd_reshape_bb_env(pstr_mps_state);
+    }
+  }
+
+  ixheaacd_tp_process(pstr_mps_state);
+
+  ixheaacd_update_time_out_buffer(pstr_mps_state);
+
+  ixheaacd_update_out_buffer(pstr_mps_state, out_buf);
+
+  pstr_mps_state->parse_next_bitstream_frame = 1;
+
+  return IA_NO_ERROR;
+}
+
+IA_ERRORCODE ixheaacd_heaac_mps_apply(ia_exhaacplus_dec_api_struct *self,
+                                      WORD16 *output_buf, UWORD8 *mps_buffer,
+                                      WORD32 mps_bytes) {
+  ia_heaac_mps_state_struct *pstr_mps_state =
+      &self->p_state_aac->heaac_mps_handle;
+  IA_ERRORCODE error_code = IA_NO_ERROR;
+  WORD32 n_channels, n_time_slots, qmf_bands, channel;
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+
+  WORD32 *p_qmf_real = pstr_mps_state->array_struct->m_qmf_real;
+  WORD32 *p_qmf_imag = pstr_mps_state->array_struct->m_qmf_imag;
+  WORD32 buffer_size = mps_bytes;
+
+  if (self->p_state_aac->heaac_mps_handle.is_first == 1) {
+    self->p_state_aac->heaac_mps_handle.is_first = 1;
+    if (pstr_mps_state->bytes_remaining != 0) {
+      buffer_size = mps_bytes + pstr_mps_state->bytes_remaining;
+      for (WORD32 ii = 0; ii < mps_bytes; ii++) {
+        pstr_mps_state->temp_buf[ii + pstr_mps_state->bytes_remaining] =
+            mps_buffer[ii];
+      }
+
+      pstr_mps_state->ptr_mps_bit_buff = ixheaacd_create_bit_buf(
+          &pstr_mps_state->mps_bit_buf, (UWORD8 *)pstr_mps_state->temp_buf,
+          buffer_size);
+      pstr_mps_state->ptr_mps_bit_buff->xaac_jmp_buf =
+          &self->p_state_aac->xaac_jmp_buf;
+
+      pstr_mps_state->ptr_mps_bit_buff->cnt_bits += (8 * buffer_size);
+    } else {
+      memcpy(pstr_mps_state->temp_buf, mps_buffer, mps_bytes);
+      buffer_size = mps_bytes;
+      pstr_mps_state->ptr_mps_bit_buff = ixheaacd_create_bit_buf(
+          &pstr_mps_state->mps_bit_buf, (UWORD8 *)mps_buffer, buffer_size);
+      pstr_mps_state->ptr_mps_bit_buff->cnt_bits += (8 * buffer_size);
+
+      pstr_mps_state->ptr_mps_bit_buff->xaac_jmp_buf =
+          &self->p_state_aac->xaac_jmp_buf;
+    }
+  }
+
+  if (curr_state->num_input_channels > 2 && pstr_mps_state->mps_with_sbr == 1) {
+    if (pstr_mps_state->ec_flag) {
+      curr_state->num_input_channels = 2;
+      pstr_mps_state->frame_ok = 0;
+    } else {
+      return IA_FATAL_ERROR;
+    }
+  }
+
+  n_channels = curr_state->num_input_channels;
+  n_time_slots = curr_state->time_slots;
+  qmf_bands = curr_state->qmf_bands;
+
+  if (pstr_mps_state->mps_decode == 1) {
+    if (pstr_mps_state->mps_with_sbr) {
+      for (channel = 0; channel < n_channels; channel++) {
+        WORD32 kk = 0;
+
+        for (WORD32 ii = 0; ii < n_time_slots; ii++) {
+          FLOAT32 *qmf_re = self->p_state_aac->str_sbr_dec_info[0]
+                              ->pstr_sbr_channel[channel]
+                              ->str_sbr_dec.pp_qmf_buf_real[ii];
+          FLOAT32 *qmf_im = self->p_state_aac->str_sbr_dec_info[0]
+                              ->pstr_sbr_channel[channel]
+                              ->str_sbr_dec.pp_qmf_buf_imag[ii];
+
+          for (WORD32 jj = 0; jj < qmf_bands; jj++) {
+            p_qmf_real[kk] = ixheaacd_mps_mult32_shr_15(
+                curr_state->clip_protect_gain, (WORD32)(qmf_re[jj] * 1024));
+            p_qmf_imag[kk++] = ixheaacd_mps_mult32_shr_15(
+                curr_state->clip_protect_gain, (WORD32)(qmf_im[jj] * 1024));
+          }
+        }
+        p_qmf_real += QBXTS;
+        p_qmf_imag += QBXTS;
+      }
+    } else {
+      for (channel = 0; channel < n_channels; channel++) {
+        ixheaacd_calc_ana_filt_bank(pstr_mps_state, output_buf, p_qmf_real,
+                                    p_qmf_imag, channel);
+
+        p_qmf_real += QBXTS;
+        p_qmf_imag += QBXTS;
+      }
+    }
+    if (!pstr_mps_state->ec_flag && pstr_mps_state->frame_ok) {
+      error_code = ixheaacd_parse_frame(pstr_mps_state);
+      if (error_code != IA_NO_ERROR) return error_code;
+    }
+
+    if (!pstr_mps_state->first_frame || !pstr_mps_state->ec_flag) {
+      error_code = ixheaacd_apply_frame(pstr_mps_state, n_time_slots,
+                                        pstr_mps_state->array_struct->m_qmf_real,
+                                        pstr_mps_state->array_struct->m_qmf_imag, output_buf);
+      if (error_code != IA_NO_ERROR) return error_code;
+    }
+    if (error_code == 0 && pstr_mps_state->ec_flag && pstr_mps_state->frame_ok) {
+      error_code = ixheaacd_parse_frame(pstr_mps_state);
+      if (error_code != IA_NO_ERROR) {
+        pstr_mps_state->frame_ok = 0;
+      }
+    }
+
+    pstr_mps_state->i_bytes_consumed_mps =
+        (WORD32)(pstr_mps_state->ptr_mps_bit_buff->ptr_read_next -
+                 pstr_mps_state->ptr_mps_bit_buff->ptr_bit_buf_base);
+
+    pstr_mps_state->bytes_remaining =
+        buffer_size - pstr_mps_state->i_bytes_consumed_mps;
+
+    if (pstr_mps_state->bytes_remaining != 0) {
+      for (WORD32 ii = 0; ii < pstr_mps_state->bytes_remaining; ii++) {
+        pstr_mps_state->temp_buf[ii] =
+            pstr_mps_state->temp_buf[ii + pstr_mps_state->i_bytes_consumed_mps];
+      }
+    }
+  }
+  self->p_state_aac->heaac_mps_handle.is_first = 1;
+  self->p_state_aac->heaac_mps_handle.first_frame = 0;
+
+  return error_code;
+}
diff --git a/decoder/ixheaacd_mps_dec.h b/decoder/ixheaacd_mps_dec.h
index 845b723..68a11e2 100644
--- a/decoder/ixheaacd_mps_dec.h
+++ b/decoder/ixheaacd_mps_dec.h
@@ -20,23 +20,78 @@
 #ifndef IXHEAACD_MPS_DEC_H
 #define IXHEAACD_MPS_DEC_H
 
+#include "stddef.h"
+
 #define ABS_THR (1e-9f * 32768 * 32768)
 
 #define MAX_NUM_QMF_BANDS_MPS (128)
 #define MAX_NUM_QMF_BANDS_MPS_NEW (64)
 
 #define MAX_PARAMETER_SETS_MPS (9)
-#define MAX_M2_OUTPUT_MP (MAX_OUTPUT_CHANNELS_MPS)
 #define BUFFER_LEN_HF_MPS ((QMF_HYBRID_FILT_ORDER - 1) / 2 + MAX_TIME_SLOTS)
-#define MAX_OUTPUT_CHANNELS_MPS_AT (2)
-#define HYBRID_BAND_BORDER (12)
+
+#define DECORR_FILTER_ORDER_BAND_0 (20)
+#define DECORR_FILTER_ORDER_BAND_1 (15)
+#define DECORR_FILTER_ORDER_BAND_2 (6)
+#define DECORR_FILTER_ORDER_BAND_3 (3)
+
+#define MAX_DECORR_FILTER_ORDER (DECORR_FILTER_ORDER_BAND_0)
 
 #define DECORR_FILT_0_ORD (10)
 #define DECORR_FILT_1_ORD (8)
 #define DECORR_FILT_2_ORD (3)
 #define DECORR_FILT_3_ORD (2)
 
-#define MAX_DECORR_FIL_ORDER (DECORR_FILT_0_ORD)
+#define NO_RES_BANDS -1
+
+#define MAX_HYBRID_BANDS_MPS (MAX_NUM_QMF_BANDS_MPS_NEW - 3 + 10)
+#define MAX_TIME_SLOTS (72)
+
+#define QMF_HYBRID_FILT_ORDER (13)
+#define BUFFER_LEN_LF_MPS (QMF_HYBRID_FILT_ORDER - 1 + MAX_TIME_SLOTS)
+#define MAX_NO_TIME_SLOTS_DELAY (14)
+
+#define MAXNRSBRCHANNELS 2
+#define abs(x) (x < 0) ? -x : x
+
+#define PC_FILTERLENGTH (11)
+#define PC_FILTERDELAY ((PC_FILTERLENGTH - 1) / 2)
+#define ABS_THR_FIX (35184)
+
+#ifndef MAX_NUM_QMF_BANDS
+#define MAX_NUM_QMF_BANDS (64)
+#endif
+
+#define MAX_HYBRID_BANDS (MAX_NUM_QMF_BANDS - 3 + 10)
+#define MAX_INPUT_CHANNELS_MPS (6)
+
+#define MAX_RESIDUAL_CHANNELS_MPS (10)
+#define MAX_RESIDUAL_FRAMES (4)
+
+#define MAX_OUTPUT_CHANNELS_MPS (8)
+#define MAX_NUM_PARAMS (MAX_NUM_OTT + 4 * MAX_NUM_TTT + MAX_INPUT_CHANNELS_MPS)
+
+#define MAX_PARAMETER_SETS (8)
+
+#define MAX_M1_OUTPUT (8)
+#define MAX_M2_INPUT (8)
+#define MAX_M2_OUTPUT (8)
+
+#define PROTO_LEN (13)
+#define BUFFER_LEN_LF (PROTO_LEN - 1 + MAX_TIME_SLOTS)
+#define BUFFER_LEN_HF ((PROTO_LEN - 1) / 2 + MAX_TIME_SLOTS)
+
+#define MAX_NO_DECORR_CHANNELS (5)
+
+#define MAX_OUTPUT_CHANNELS_AT_MPS (8)
+
+#define QMF_FILTER_STATE_SYN_SIZE_MPS (576)
+
+#define QMF_FILTER_STATE_ANA_SIZE_MPS (640)
+
+#define MAX_NUM_POAT max(MAX_NUM_PARAMS, MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT)
+
+#define BP_SIZE 25
 
 typedef struct {
   FLOAT32 re;
@@ -59,33 +114,12 @@
   WORD32 num_len;
   WORD32 den_len;
 
-  ia_cmplx_flt_struct state[MAX_DECORR_FIL_ORDER + 1];
+  ia_cmplx_flt_struct state[MAX_DECORR_FILTER_ORDER + 1];
   const FLOAT32 *num;
   const FLOAT32 *den;
 
 } ia_mps_decor_filt_struct;
 
-typedef struct ia_mps_decor_struct *ia_mps_decor_struct_handle;
-
-#define MAX_HYBRID_BANDS_MPS (MAX_NUM_QMF_BANDS_MPS_NEW - 3 + 10)
-#define MAX_TIME_SLOTS (72)
-#define MAX_PARAMETER_BANDS (28)
-
-#define MAX_M1_INPUT (2)
-#define MAX_M1_OUTPUT (2)
-#define MAX_M2_INPUT (2)
-
-#define MAX_M_INPUT (2)
-#define MAX_M_OUTPUT (2)
-
-#define QMF_BANDS_TO_HYBRID (3)
-#define MAX_HYBRID_ONLY_BANDS_PER_QMF (8)
-#define QMF_HYBRID_FILT_ORDER (13)
-#define BUFFER_LEN_LF_MPS (QMF_HYBRID_FILT_ORDER - 1 + MAX_TIME_SLOTS)
-#define MAX_NO_TIME_SLOTS_DELAY (14)
-
-#define MAXNRSBRCHANNELS 2
-
 typedef struct ixheaacd_mps_decor_energy_adjust_filt_struct {
   WORD32 num_bins;
   FLOAT32 smooth_in_energy[MAX_PARAMETER_BANDS];
@@ -107,7 +141,7 @@
 
 typedef struct ia_mps_hybrid_filt_struct {
   ia_cmplx_flt_struct hf_buffer[MAX_NUM_QMF_BANDS_MPS][BUFFER_LEN_HF_MPS];
-  ia_cmplx_w32_struct lf_buffer[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF_MPS];
+  ia_cmplx_flt_struct lf_buffer[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF_MPS];
 } ia_mps_hybrid_filt_struct;
 
 typedef struct ia_mps_data_struct {
@@ -151,7 +185,7 @@
 
 typedef struct ia_mps_smoothing_struct {
   WORD32 prev_smg_time;
-  WORD32 inv_prev_smg_time;
+  FLOAT32 inv_prev_smg_time;
   WORD32 prev_smg_data[MAX_PARAMETER_BANDS];
 } ia_mps_smoothing_struct;
 
@@ -161,8 +195,6 @@
   FLOAT32 frame_energy_prev[3];
 } ia_mps_env_reshape_struct;
 
-#define BP_SIZE 25
-
 typedef struct ia_mps_stp_struct {
   FLOAT32 nrg_dir;
   FLOAT32 nrg_diff[2];
@@ -188,18 +220,18 @@
   WORD32 decor_sig_count;
 
   WORD32 time_slots;
-  WORD32 present_time_slot;
-  WORD32 frame_len;
-
+  WORD32 pre_mix_req;
   WORD32 temp_shape_enable_ch_stp[2];
   WORD32 temp_shape_enable_ch_ges[2];
 
   FLOAT32 env_shape_data[2][MAX_TIME_SLOTS];
 
   WORD8 parse_nxt_frame;
-
+  WORD32 band_count[MAX_M_INPUT];
+  WORD32 synth_count;
   WORD32 qmf_band_count;
-  WORD32 hyb_band_count;
+  WORD32 hyb_band_count[MAX_M_INPUT];
+  WORD32 hyb_band_count_max;
   const WORD32 *hyb_band_to_processing_band_table;
 
   WORD32 res_ch_count;
@@ -223,10 +255,11 @@
   WORD32 bs_residual_bands;
 
   ia_usac_dec_mps_config_struct *config;
+  ia_usac_dec_mps_config_struct ldmps_config;
   ia_mps_bs_frame bs_frame;
 
   WORD32 smoothing_time[MAX_PARAMETER_SETS_MPS];
-  WORD32 inv_smoothing_time[MAX_PARAMETER_SETS_MPS];
+  FLOAT32 inv_smoothing_time[MAX_PARAMETER_SETS_MPS];
   WORD32 smoothing_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS];
 
   WORD32 bs_tsd_enable;
@@ -248,36 +281,32 @@
   FLOAT32 phase_l_prev[MAX_PARAMETER_BANDS];
   FLOAT32 phase_r_prev[MAX_PARAMETER_BANDS];
 
-  WORD32 phase_l_fix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS];
-  WORD32 phase_r_fix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS];
+  FLOAT32 m1_param_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m1_param_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m2_decor_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m2_decor_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m2_resid_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
+  FLOAT32 m2_resid_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                     [MAX_M_INPUT];
 
-  WORD32 m1_param_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m1_param_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m2_decor_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m2_decor_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m2_resid_re[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
-  WORD32 m2_resid_im[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                    [MAX_M_INPUT];
+  FLOAT32 m1_param_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m1_param_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m2_decor_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m2_decor_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m2_resid_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
+  FLOAT32 m2_resid_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
 
-  WORD32 m1_param_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m1_param_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m2_decor_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m2_decor_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m2_resid_re_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-  WORD32 m2_resid_im_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT];
-
-  ia_cmplx_flt_struct qmf_in[2][MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW];
-  ia_cmplx_flt_struct hyb_in[2][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
-  ia_cmplx_flt_struct hyb_res[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
-  ia_cmplx_flt_struct v[MAX_M1_OUTPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
-  ia_cmplx_flt_struct w_diff[MAX_M2_INPUT][MAX_TIME_SLOTS]
-                            [MAX_HYBRID_BANDS_MPS];
-  ia_cmplx_flt_struct w_dir[MAX_M2_INPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
+  ia_cmplx_flt_struct qmf_in[2][MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS];
+  ia_cmplx_flt_struct hyb_in[2][MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS];
+  ia_cmplx_flt_struct hyb_res[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS];
+  ia_cmplx_flt_struct v[MAX_M_OUTPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
+  ia_cmplx_flt_struct w_diff[MAX_M_INPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
+  ia_cmplx_flt_struct w_dir[MAX_M_INPUT][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
   ia_cmplx_flt_struct hyb_dir_out[2][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
   ia_cmplx_flt_struct hyb_diff_out[2][MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS];
 
@@ -287,7 +316,7 @@
   FLOAT32 (*output_buffer)[4096];
 
   ia_mps_hybrid_filt_struct hyb_filt_state[2];
-  ia_mps_poly_phase_synth_struct qmf_filt_state[2];
+  FLOAT32 qmf_filt_state[2][POLY_PHASE_SYNTH_SIZE];
 
   ia_mps_decor_struct mps_decor;
 
@@ -297,7 +326,7 @@
 
   WORD32 bs_high_rate_mode;
 
-  WORD32 tmp_buf[84 * MAX_NUM_QMF_BANDS_SAC];
+  FLOAT32 tmp_buf[84 * MAX_NUM_QMF_BANDS_SAC];
 
   FLOAT32 r_out_re_in_m1[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
                         [MAX_M_INPUT];
@@ -331,22 +360,38 @@
 
   ia_mps_stp_struct subband_var;
   ia_mps_opd_smooth_struct opd_smooth;
-  ia_mps_poly_phase_struct poly_phase_filt_kernel;
+  WORD32 resolution;
   VOID *p_sbr_dec[MAXNRSBRCHANNELS];
   VOID *p_sbr_frame[MAXNRSBRCHANNELS];
   VOID *p_sbr_header[MAXNRSBRCHANNELS];
+
+  WORD32 object_type;
+  WORD32 mps_init_done;
+  ia_sbr_qmf_filter_bank_struct str_mps_qmf_bank;
+  ia_qmf_dec_tables_struct *qmf_dec_tables_ptr;
+  ia_sbr_tables_struct *sbr_tables_ptr;
+  ia_sbr_scale_fact_struct *str_sbr_scale_fact;
+  WORD8 ec_flag;
+  WORD8 frame_ok;
 } ia_mps_dec_state_struct;
 
 VOID ixheaacd_mps_init_pre_and_post_matrix(ia_mps_dec_state_struct *self);
 VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self);
-WORD32 ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self);
-WORD32 ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct *self);
 
-VOID ixheaacd_mps_config(ia_mps_dec_state_struct *self, WORD32 frame_len,
-                         WORD32 residual_coding,
-                         ia_usac_dec_mps_config_struct *mps212_config);
+VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out,
+                          WORD32 pcmsize, FLOAT32 (*out_samples)[4096],
+                          WORD32 *out_bytes, WORD32 num_channel_out);
 
-WORD32 ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self);
+VOID ixheaacd_samples_sat_mc(WORD8* outbuffer, WORD32 num_samples_out,
+                             FLOAT32(*out_samples)[4096], WORD32* out_bytes,
+                             WORD32 num_channel_out, WORD32 ch_fac);
+
+IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self);
 
 WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self);
 
@@ -359,25 +404,41 @@
 WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct *self);
 
 VOID ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct *self,
-                             ia_mps_bs_frame *curr_bit_stream, WORD32 *h_real,
+                             ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_real,
                              WORD32 param_set_idx);
-
 VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self,
                                      ia_mps_bs_frame *curr_bit_stream,
-                                     WORD32 *h_real, WORD32 param_set_idx);
+                                     FLOAT32 *h_real, WORD32 param_set_idx);
 
 VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self,
-                               ia_mps_bs_frame *curr_bit_stream, WORD32 *h_imag,
-                               WORD32 *h_real, WORD32 param_set_idx,
+                               ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_imag,
+                               FLOAT32 *h_real, WORD32 param_set_idx,
                                WORD32 res_bands);
 
-WORD32 ixheaacd_mps_upmix_interp(
-    WORD32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+VOID ixheaacd_mps_upmix_interp(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
                    [MAX_M_INPUT],
-    WORD32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+    FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
                    [MAX_M_INPUT],
-    WORD32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
-    WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self);
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self, WORD32 bs_high_rate_mode);
+
+VOID ixheaacd_mps_upmix_interp_type1(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self,
+    WORD32 bs_high_rate_mode);
+
+VOID ixheaacd_mps_upmix_interp_type2(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
+                    [MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    WORD32 num_rows, ia_mps_dec_state_struct *self, WORD32 col);
 
 VOID ixheaacd_mps_phase_interpolation(
     FLOAT32 pl[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
@@ -387,4 +448,580 @@
     FLOAT32 r_im[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],
     ia_mps_dec_state_struct *self);
 
-#endif
+VOID ixheaacd_mps_complex_fft(FLOAT32 *xr, FLOAT32 *xi, WORD32 nlength);
+
+typedef struct {
+  WORD32 state_length;
+  WORD32 num_length;
+  WORD32 den_length;
+  WORD32 complex;
+
+  WORD32 *state_real;
+  WORD32 *state_imag;
+
+  WORD32 *numerator_real;
+  WORD32 *numerator_imag;
+
+  WORD32 *denominator_real;
+  WORD32 *denominator_imag;
+} ia_mps_dec_decorr_filter_instance_struct;
+
+typedef struct ia_mps_dec_ducker_interface ia_mps_dec_ducker_interface;
+
+typedef struct {
+  WORD32 decorr_seed;
+  WORD32 numbins;
+
+  ia_mps_dec_decorr_filter_instance_struct *filter[MAX_HYBRID_BANDS];
+
+  ia_mps_dec_ducker_interface *ducker;
+
+  WORD32 no_sample_delay[MAX_HYBRID_BANDS];
+  WORD32 **delay_buffer_real;
+  WORD32 **delay_buffer_imag;
+} ia_mps_dec_decorr_dec_struct, *ia_mps_dec_decorr_dec_handle;
+
+typedef struct {
+  WORD32 buffer_lf_real[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF];
+  WORD32 buffer_lf_imag[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF];
+  WORD32 qmf_lf_real[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF];
+  WORD32 qmf_lf_imag[QMF_BANDS_TO_HYBRID][BUFFER_LEN_LF];
+  WORD32 buffer_hf_real[MAX_NUM_QMF_BANDS][BUFFER_LEN_HF];
+  WORD32 buffer_hf_imag[MAX_NUM_QMF_BANDS][BUFFER_LEN_HF];
+} ia_mps_dec_thyb_filter_state_struct;
+
+typedef struct {
+  WORD32 re;
+  WORD32 im;
+} complex;
+
+typedef struct {
+  UWORD32 ui_pcm_wdsz;
+  UWORD32 ui_samp_freq;
+  UWORD32 ui_in_channels;
+  UWORD32 ui_out_channels;
+  WORD32 ui_channel_mask;
+
+  WORD32 frame_ok;
+  UWORD32 ui_bs_is_buried;
+  WORD32 ui_dec_type;
+  WORD32 ui_upmix_type;
+  WORD32 ui_binaural_quality;
+  WORD32 ui_hrtf_model;
+  UWORD32 ui_qmf_bands;
+
+  WORD32 bs_frame_length;
+  WORD32 bs_sampling_freq_index;
+  WORD32 bs_sampling_frequency;
+  WORD32 bs_freq_res;
+  WORD32 bs_tree_config;
+  WORD32 bs_quant_mode;
+  WORD32 bs_one_icc;
+  WORD32 bs_arbitrary_downmix;
+  WORD32 bs_residual_coding;
+  WORD32 bs_smooth_config;
+  WORD32 bs_fixed_gain_sur;
+  WORD32 bs_fixed_gain_lfe;
+  WORD32 bs_fixed_gain_dmx;
+  WORD32 bs_matrix_mode;
+  WORD32 bs_temp_shape_config;
+
+  WORD32 bs_decorr_config;
+
+  WORD32 bs_3d_audio_mode;
+  WORD32 bs_3d_audio_hrtf_set;
+  WORD32 bs_hrtf_freq_res;
+  WORD32 hrtf_num_band;
+  WORD32 bs_hrtf_num_chan;
+  WORD32 bs_hrtf_asymmetric;
+  WORD32 bs_hrtf_level_left[MAX_OUTPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS];
+  WORD32 bs_hrtf_level_right[MAX_OUTPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS];
+  WORD32 bs_hrtf_phase[MAX_OUTPUT_CHANNELS_MPS];
+  WORD32 bs_hrtf_phase_lr[MAX_OUTPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS];
+
+  WORD32 bs_ott_bands[MAX_NUM_OTT];
+  WORD32 bs_ttt_dual_mode[MAX_NUM_TTT];
+  WORD32 bs_ttt_mode_low[MAX_NUM_TTT];
+  WORD32 bs_ttt_mode_high[MAX_NUM_TTT];
+  WORD32 bs_ttt_bands_low[MAX_NUM_TTT];
+
+  WORD32 bs_sac_ext_type[MAX_NUM_EXT_TYPES];
+  WORD32 sac_ext_cnt;
+
+  WORD32 bs_residual_present[MAX_RESIDUAL_CHANNELS_MPS];
+  WORD32 bs_residual_sampling_freq_index;
+  WORD32 bs_residual_frames_per_spatial_frame;
+
+  WORD32 bs_residual_bands[MAX_RESIDUAL_CHANNELS_MPS];
+
+  WORD32 bs_arbitrary_downmix_residual_sampling_freq_index;
+  WORD32 bs_arbitrary_downmix_residual_frames_per_spatial_frame;
+  WORD32 bs_arbitrary_downmix_residual_bands;
+
+  WORD32 bs_env_quant_mode;
+
+  WORD32 arbitrary_tree;
+  WORD32 num_out_chan_at;
+  WORD32 num_ott_boxes_at;
+  WORD32 bs_output_channel_pos_at[MAX_OUTPUT_CHANNELS_AT_MPS];
+  WORD32 bs_ott_box_present_at[MAX_OUTPUT_CHANNELS_AT_MPS]
+                              [MAX_ARBITRARY_TREE_INDEX];
+  WORD32 bs_ott_default_cld_at[MAX_OUTPUT_CHANNELS_AT_MPS *
+                               MAX_ARBITRARY_TREE_INDEX];
+  WORD32
+  bs_ott_mode_lfe_at[MAX_OUTPUT_CHANNELS_AT_MPS * MAX_ARBITRARY_TREE_INDEX];
+  WORD32 bs_ott_bands_at[MAX_OUTPUT_CHANNELS_AT_MPS * MAX_ARBITRARY_TREE_INDEX];
+} ia_mps_spatial_bs_config_struct;
+
+typedef struct {
+  WORD32
+  bs_xxx_data_mode[MAX_NUM_POAT][MAX_PARAMETER_SETS];
+  WORD32
+  bs_quant_coarse_xxx[MAX_NUM_POAT][MAX_PARAMETER_SETS];
+  WORD32
+  bs_freq_res_stride_xxx[MAX_NUM_POAT][MAX_PARAMETER_SETS];
+
+  WORD32 bs_quant_coarse_xxx_prev[MAX_NUM_POAT];
+  WORD32
+  no_cmp_quant_coarse_xxx[MAX_NUM_POAT][MAX_PARAMETER_SETS];
+
+} ia_mps_dec_lossless_data_struct;
+
+typedef struct {
+  WORD32 bs_icc_diff_present[MAX_RESIDUAL_CHANNELS_MPS][MAX_PARAMETER_SETS];
+  WORD32
+  bs_icc_diff[MAX_RESIDUAL_CHANNELS_MPS][MAX_PARAMETER_SETS]
+             [MAX_PARAMETER_BANDS];
+
+} RESIDUAL_FRAME_DATA;
+
+typedef struct {
+  WORD32 bs_independency_flag;
+  WORD32
+  ott_cld_idx[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT][MAX_PARAMETER_SETS]
+             [MAX_PARAMETER_BANDS];
+  WORD32 ott_icc_idx[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+  WORD32 ttt_cpc_1_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+  WORD32 ttt_cpc_2_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+  WORD32 ttt_cld_1_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+  WORD32 ttt_cld_2_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+  WORD32 ttt_icc_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+
+  WORD32 ott_cld_idx_prev[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT][MAX_PARAMETER_BANDS];
+  WORD32 ott_icc_idx_prev[MAX_NUM_OTT][MAX_PARAMETER_BANDS];
+  WORD32 ttt_cpc_1_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+  WORD32 ttt_cpc_2_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+  WORD32 ttt_cld_1_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+  WORD32 ttt_cld_2_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+  WORD32 ttt_icc_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+
+  WORD32
+  cmp_ott_cld_idx[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT][MAX_PARAMETER_SETS]
+                 [MAX_PARAMETER_BANDS];
+  WORD32 cmp_ott_icc_idx[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+  WORD32 ott_icc_diff_idx[MAX_NUM_OTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_cpc_1_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                          [MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_cpc_2_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                          [MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_cld_1_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                          [MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_cld_2_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                          [MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_icc_idx[MAX_NUM_TTT][MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+  WORD32 cmp_ott_cld_idx_prev[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT]
+                             [MAX_PARAMETER_BANDS];
+  WORD32 cmp_ott_icc_idx_prev[MAX_NUM_OTT][MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_cpc_1_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_cpc_2_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_cld_1_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_cld_2_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+  WORD32 cmp_ttt_icc_idx_prev[MAX_NUM_TTT][MAX_PARAMETER_BANDS];
+
+  ia_mps_dec_lossless_data_struct cld_lossless_data;
+  ia_mps_dec_lossless_data_struct icc_lossless_data;
+  ia_mps_dec_lossless_data_struct cpc_lossless_data;
+
+  WORD32 bs_smooth_control;
+  WORD32 bs_smooth_mode[MAX_PARAMETER_SETS];
+  WORD32 bs_smooth_time[MAX_PARAMETER_SETS];
+  WORD32 bs_freq_res_stride_smg[MAX_PARAMETER_SETS];
+  WORD32 bs_smg_data[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+
+  RESIDUAL_FRAME_DATA res_data;
+
+  WORD32
+  arbdmx_gain_idx[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS]
+                 [MAX_PARAMETER_BANDS];
+  WORD32 arbdmx_gain_idx_prev[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS];
+  WORD32
+  cmp_arbdmx_gain_idx[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS]
+                     [MAX_PARAMETER_BANDS];
+  WORD32 cmp_arbdmx_gain_idx_prev[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_BANDS];
+  WORD32 bs_arbitrary_downmix_residual_abs[MAX_INPUT_CHANNELS_MPS];
+  WORD32 bs_arbitrary_downmix_residual_alpha_update_set[MAX_INPUT_CHANNELS_MPS];
+
+} ia_mps_dec_spatial_bs_frame_struct;
+
+typedef struct {
+  WORD32 spec_prev_real[MAX_NUM_QMF_BANDS * 8];
+  WORD32 spec_prev_imag[MAX_NUM_QMF_BANDS * 8];
+  WORD32 p_cross_real[MAX_NUM_QMF_BANDS * 8];
+  WORD32 p_cross_imag[MAX_NUM_QMF_BANDS * 8];
+
+  WORD32 p_sum[MAX_NUM_QMF_BANDS * 8];
+  WORD32 p_sum_prev[MAX_NUM_QMF_BANDS * 8];
+
+  WORD32 buf_real[MAX_NUM_QMF_BANDS][6];
+  WORD32 buf_imag[MAX_NUM_QMF_BANDS][6];
+
+  WORD32 win_buf_real[MAX_NUM_QMF_BANDS][16];
+  WORD32 win_buf_imag[MAX_NUM_QMF_BANDS][16];
+} ia_mps_dec_tonality_state_struct;
+
+typedef struct {
+  WORD32 prev_smg_time;
+  WORD32 prev_smg_data[MAX_PARAMETER_BANDS];
+} ia_mps_dec_smoothing_state_struct;
+
+typedef struct {
+  WORD32
+  part_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS]
+               [MAX_PARAMETER_BANDS];
+  WORD32 norm_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS];
+  WORD32 frame_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS];
+
+  WORD16
+  q_part_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS]
+                 [MAX_PARAMETER_BANDS];
+  WORD16 q_norm_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS];
+  WORD16 q_frame_nrg_prev[2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS];
+
+} ia_mps_dec_reshape_bb_env_state_struct;
+
+typedef struct {
+  WORD32 use_ttt_decorr;
+  WORD32 mode;
+  WORD32 start_band;
+  WORD32 stop_band;
+  WORD32 bitstream_start_band;
+  WORD32 bitstream_stop_band;
+} ia_mps_dec_ttt_config_struct;
+
+typedef struct {
+  WORD32 excitation[3][MAX_PARAMETER_BANDS];
+  WORD32 filter_coeff;
+  WORD16 q_excitation[3][MAX_PARAMETER_BANDS];
+} ia_mps_dec_blind_decoder_struct;
+
+typedef struct {
+  WORD32 run_dry_ener[MAX_INPUT_CHANNELS_MPS];
+  WORD32 run_wet_ener[MAX_OUTPUT_CHANNELS_MPS];
+  WORD32 old_dry_ener[MAX_INPUT_CHANNELS_MPS];
+  WORD32 old_wet_ener[MAX_OUTPUT_CHANNELS_MPS];
+
+  WORD16 q_run_dry_ener[MAX_INPUT_CHANNELS_MPS];
+  WORD16 q_run_wet_ener[MAX_OUTPUT_CHANNELS_MPS];
+  WORD16 q_old_dry_ener[MAX_INPUT_CHANNELS_MPS];
+  WORD16 q_old_wet_ener[MAX_OUTPUT_CHANNELS_MPS];
+  WORD32 update_old_ener;
+
+  WORD32 prev_tp_scale[MAX_OUTPUT_CHANNELS_MPS];
+  WORD16 q_prev_tp_scale[MAX_OUTPUT_CHANNELS_MPS];
+} ia_mps_dec_subband_tp_params_struct;
+
+typedef struct ia_mps_persistent_mem {
+  WORD32 *prev_gain_at;
+  WORD32 *arbdmx_alpha_prev;
+  WORD32 *m1_param_real_prev;
+  WORD32 *m1_param_imag_prev;
+  WORD32 *m2_decor_real_prev;
+  WORD32 *m2_decor_imag_prev;
+  WORD32 *m2_resid_real_prev;
+  WORD32 *m2_resid_imag_prev;
+  WORD32 *qmf_input_delay_real;
+  WORD32 *qmf_input_delay_imag;
+  WORD32 *ana_qmf_states_buffer;
+  WORD32 *syn_qmf_states_buffer;
+  VOID *decorr_ptr;
+
+  ia_mps_dec_thyb_filter_state_struct *hyb_filter_state;
+  ia_mps_dec_tonality_state_struct *ton_state;
+  ia_mps_dec_smoothing_state_struct *smooth_state;
+  ia_mps_dec_reshape_bb_env_state_struct *reshape_bb_env_state;
+  ia_mps_dec_subband_tp_params_struct *sub_band_params;
+  ia_mps_dec_blind_decoder_struct *blind_decoder;
+  ia_mps_dec_spatial_bs_frame_struct *p_bs_frame;
+} ia_mps_persistent_mem;
+
+typedef struct {
+  ia_mps_dec_qmf_tables_struct *qmf_table_ptr;
+  ia_mps_dec_common_tables_struct *common_table_ptr;
+  ia_mps_dec_hybrid_tables_struct *hybrid_table_ptr;
+  ia_mps_dec_m1_m2_tables_struct *m1_m2_table_ptr;
+  ia_mps_dec_decorr_tables_struct *decor_table_ptr;
+  ia_mps_dec_tp_process_tables_struct *tp_process_table_ptr;
+  ia_mps_dec_mdct2qmf_table_struct *mdct2qmf_table_ptr;
+  ia_mps_dec_tonality_tables_struct *tonality_table_ptr;
+  ia_mps_dec_bitdec_tables_struct *bitdec_table_ptr;
+  ia_mps_dec_blind_tables_struct *blind_table_ptr;
+  ia_mps_dec_mdct2qmf_tables_struct *mdct2qmfcos_table_ptr;
+  ia_mps_dec_mdct2qmf_cos_table_struct *mdct2qmfcos_tab_ptr;
+  VOID *aac_tab;
+  ia_mps_dec_wf_ptr_table_struct *wf_tab_ptr;
+
+} ia_mps_dec_mps_tables_struct;
+
+typedef struct {
+  VOID(*syn_filter_bank)
+  (ia_mps_dec_qmf_syn_filter_bank *syn, WORD32 *sr, WORD32 *si,
+   WORD32 *time_sig, WORD32 channel, WORD32 resolution, WORD32 nr_samples,
+   ia_mps_dec_qmf_tables_struct *qmf_table_ptr);
+} ia_mps_dec_synthesis_interface, *ia_mps_dec_synthesis_interface_handle;
+
+typedef struct {
+  WORD32
+  m1_param_real[MAX_M1_OUTPUT][MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS]
+               [MAX_PARAMETER_BANDS];
+  WORD32
+  m1_param_imag[MAX_M1_OUTPUT][MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS]
+               [MAX_PARAMETER_BANDS];
+} ia_mps_dec_m1_param_struct;
+
+typedef struct {
+  WORD32 *qmf_residual_real;
+  WORD32 *qmf_residual_imag;
+  WORD32 *qmf_residual_real_pre, *qmf_residual_real_post;
+  WORD32 *qmf_residual_imag_pre, *qmf_residual_imag_post;
+  WORD32 *res_mdct;
+  WORD32 *time_out;
+  WORD32 *x_real;
+  WORD32 *x_imag;
+  WORD32 *hyb_output_real_dry;
+  WORD32 *hyb_output_imag_dry;
+  WORD32 *env_dmx_0;
+  WORD32 *env_dmx_1;
+  WORD32 *m_qmf_real;
+  WORD32 *m_qmf_imag;
+  WORD32 *w_dry_real;
+  WORD32 *w_dry_imag;
+  WORD32 *buf_real;
+  WORD32 *buf_imag;
+  WORD32 *buffer_real;
+  WORD32 *buffer_imag;
+  ia_mps_dec_m1_param_struct *m1_param;
+} ia_mps_dec_reuse_array_struct;
+
+typedef struct {
+  WORD32 m2_decor_real[15][MAX_PARAMETER_SETS]
+                      [MAX_PARAMETER_BANDS];
+  WORD32 m2_decor_imag[15][MAX_PARAMETER_SETS]
+                      [MAX_PARAMETER_BANDS];
+
+  WORD32 m2_resid_real[19][MAX_PARAMETER_SETS]
+                      [MAX_PARAMETER_BANDS];
+  WORD32 m2_resid_imag[19][MAX_PARAMETER_SETS]
+                      [MAX_PARAMETER_BANDS];
+} ia_mps_dec_m2_param_struct;
+
+typedef struct {
+  ia_mps_dec_m2_param_struct *m2_param;
+
+  WORD32 temp_shape_enable_channel_stp[MAX_OUTPUT_CHANNELS_MPS];
+  WORD32 temp_shape_enable_channel_ges[MAX_OUTPUT_CHANNELS_MPS];
+
+  WORD32 env_shape_data[MAX_OUTPUT_CHANNELS_MPS][MAX_TIME_SLOTS];
+
+  WORD32 num_ott_bands[MAX_NUM_OTT];
+
+  ia_mps_dec_ttt_config_struct ttt_config[2][MAX_NUM_TTT];
+  WORD32 param_slot[MAX_PARAMETER_SETS];
+
+  WORD32 smg_time[MAX_PARAMETER_SETS];
+  WORD32 smg_data[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+
+  WORD32
+  ott_cld[MAX_NUM_OTT + MAX_OUTPUT_CHANNELS_AT][MAX_PARAMETER_SETS]
+         [MAX_PARAMETER_BANDS];
+  WORD32 ott_icc[MAX_NUM_OTT][MAX_PARAMETER_SETS]
+                [MAX_PARAMETER_BANDS];
+
+  WORD32 ttt_cpc_1[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                  [MAX_PARAMETER_BANDS];
+  WORD32 ttt_cpc_2[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                  [MAX_PARAMETER_BANDS];
+  WORD32 ttt_cld_1[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                  [MAX_PARAMETER_BANDS];
+  WORD32 ttt_cld_2[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                  [MAX_PARAMETER_BANDS];
+  WORD32 ttt_icc[MAX_NUM_TTT][MAX_PARAMETER_SETS]
+                [MAX_PARAMETER_BANDS];
+
+  WORD32
+  arbdmx_gain[MAX_INPUT_CHANNELS_MPS][MAX_PARAMETER_SETS]
+             [MAX_PARAMETER_BANDS];
+
+  WORD32 arbdmx_residual_abs[MAX_INPUT_CHANNELS_MPS];
+  WORD32 arbdmx_alpha_upd_set[MAX_INPUT_CHANNELS_MPS];
+  WORD32 arbdmx_alpha[MAX_INPUT_CHANNELS_MPS];
+} ia_mps_dec_auxilary_struct;
+
+typedef struct ia_heaac_mps_state_struct {
+  WORD32 sac_time_align_flag;
+  WORD32 sac_time_align;
+  WORD32 sampling_freq;
+
+  WORD32 tree_config;
+  WORD32 num_input_channels;
+  WORD32 num_output_channels;
+  WORD32 num_ott_boxes;
+  WORD32 num_ttt_boxes;
+
+  WORD32 num_output_channels_at;
+
+  WORD32 quant_mode;
+  WORD32 one_icc;
+  WORD32 arbitrary_downmix;
+  WORD32 residual_coding;
+  WORD32 smooth_config;
+  WORD32 temp_shape_config;
+  WORD32 decorr_config;
+  WORD32 mtx_inversion;
+  WORD32 _3d_stereo_inversion;
+  WORD32 env_quant_mode;
+
+  WORD32 clip_protect_gain;
+  WORD32 surround_gain;
+  WORD32 lfe_gain;
+  WORD32 cpc_default;
+  WORD32 icc_default;
+  WORD32 arbdmx_gain_default;
+
+  WORD32 num_direct_signals;
+  WORD32 num_residual_signals;
+  WORD32 num_decor_signals;
+  WORD32 num_v_channels;
+  WORD32 num_w_channels;
+  WORD32 w_start_residual_idx;
+  WORD32 num_x_channels;
+
+  WORD32 time_slots;
+  WORD32 cur_time_slot;
+  WORD32 frame_length;
+  WORD32 dec_type;
+  WORD32 up_mix_type;
+  WORD32 binaural_quality;
+  WORD32 hrtf_model;
+
+  WORD32 tp_hyb_band_border;
+
+  WORD32 parse_next_bitstream_frame;
+
+  WORD32 qmf_bands;
+  WORD32 hybrid_bands;
+
+  WORD32 residual_frames_per_spatial_frame;
+  WORD32 upd_qmf;
+
+  WORD32 arbdmx_residual_bands;
+  WORD32 arbdmx_frames_per_spatial_frame;
+  WORD32 arbdmx_upd_qmf;
+
+  WORD32 bitstream_parameter_bands;
+  WORD32 num_parameter_bands;
+
+  WORD32 extend_frame;
+  WORD32 num_parameter_sets;
+  WORD32 num_parameter_sets_prev;
+
+  WORD32 smooth_control;
+
+  WORD32 i_bytes_consumed_mps;
+  WORD32 bytes_remaining;
+  WORD32 ui_mps_in_bytes;
+  WORD32 is_sbr_present;
+
+  WORD32 bits_per_sample;
+  WORD32 qmf_input_delay_index;
+
+  WORD32 m1_param_imag_present;
+  WORD32 m2_param_imag_present;
+
+  WORD32 m1_param_present[MAX_M1_OUTPUT][MAX_INPUT_CHANNELS_MPS];
+  WORD32 m2_param_present[MAX_M2_OUTPUT][MAX_M2_INPUT];
+
+  WORD32 index[MAX_RESIDUAL_CHANNELS_MPS];
+
+  WORD32 ott_cld_default[MAX_NUM_OTT];
+  WORD32 ttt_cld_1_default[MAX_NUM_TTT];
+  WORD32 ttt_cld_2_default[MAX_NUM_TTT];
+
+  SIZE_T kernels[MAX_HYBRID_BANDS];
+
+  WORD32 res_bands[MAX_RESIDUAL_CHANNELS_MPS];
+  WORD32 ott_mode_lfe[MAX_NUM_OTT];
+  WORD32 bitstream_ott_bands[MAX_NUM_OTT];
+
+  WORD32 scaling_enable;
+
+  WORD32 is_buried_flag;
+
+  ia_mps_dec_residual_sfband_info_struct sfband_info_tab;
+  WORD16 *pcm_out_buf;
+
+  WORD32 res_block_type[MAX_RESIDUAL_CHANNELS_MPS][MAX_RESIDUAL_FRAMES];
+
+  ia_mps_spatial_bs_config_struct bs_config;
+  ia_mps_dec_decorr_dec_handle ap_decor[MAX_NO_DECORR_CHANNELS];
+  ia_mps_dec_qmf_ana_filter_bank qmf_bank[6];
+  ia_mps_dec_qmf_syn_filter_bank syn_qmf_bank;
+  struct ia_bit_buf_struct mps_bit_buf, *ptr_mps_bit_buff;
+
+  ia_mps_dec_spatial_bs_frame_struct *bs_frame;
+  ia_mps_dec_reuse_array_struct *array_struct;
+  ia_mps_dec_auxilary_struct *aux_struct;
+  VOID *mps_scratch_mem_v;
+  ia_mps_persistent_mem mps_persistent_mem;
+  VOID *mps_persistent_mem_v;
+
+  ia_mps_dec_synthesis_interface *syn;
+  ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info[2];
+  ia_mps_dec_residual_dynamic_data_struct *p_aac_decoder_dynamic_data_init[2];
+  WORD8 tot_sf_bands_ls[2];
+
+  ia_mps_dec_mps_tables_struct ia_mps_dec_mps_table;
+  ia_mps_dec_residual_aac_tables_struct aac_table;
+  ia_mps_dec_mdct2qmf_cos_table_struct ia_mps_dec_mdct2qmfcos_table;
+  ia_mps_dec_wf_ptr_table_struct wf_tab;
+  WORD32 is_first;
+  WORD32 mps_decode;
+  UWORD8 temp_buf[1024];
+  WORD32 heaac_mps_present;
+  WORD32 mps_with_sbr;
+  WORD32 mps_init_done;
+  WORD32 ec_flag;
+  WORD32 frame_ok;
+  WORD32 first_frame;
+
+} ia_heaac_mps_state_struct;
+
+WORD32 ixheaacd_mps_persistent_buffer_sizes();
+
+WORD32 ixheaacd_getsize_mps_persistent();
+
+VOID ixheaacd_set_mps_persistent_buffers(ia_heaac_mps_state_struct *pstr_mps_state,
+                                         WORD32 *persistent_used,
+                                         WORD32 num_channel,
+                                         VOID *persistent_mem);
+
+VOID ixheaacd_set_scratch_buffers(ia_heaac_mps_state_struct *pstr_mps_state,
+                                  VOID *scratch_mem);
+
+VOID ixheaacd_calc_ana_filt_bank(ia_heaac_mps_state_struct *pstr_mps_state,
+                                 WORD16 *time_in, WORD32 *p_qmf_real,
+                                 WORD32 *p_qmf_imag, WORD32 channel);
+
+IA_ERRORCODE
+ixheaacd_syn_filt_bank_init(ia_mps_dec_synthesis_interface_handle self,
+                            WORD32 resolution);
+#endif /* IXHEAACD_MPS_DEC_H */
diff --git a/decoder/ixheaacd_mps_decor.h b/decoder/ixheaacd_mps_decor.h
index 4f856f5..2ec6010 100644
--- a/decoder/ixheaacd_mps_decor.h
+++ b/decoder/ixheaacd_mps_decor.h
@@ -24,12 +24,58 @@
 #define ONE_MINUS_DECOR_ALPHA (1 - DECOR_ALPHA)
 #define DECOR_GAMMA (1.5f)
 
-IA_ERRORCODE ixheaacd_mps_decor_init(ia_mps_decor_struct_handle, int, int);
+#define DUCK_ALPHA (26214)
+#define DUCK_GAMMA (24576)
+#define DUCK_ONEMINUSALPHA (6554)
+
+enum {
+  REVERB_BAND_0 = 0,
+  REVERB_BAND_1 = 1,
+  REVERB_BAND_2 = 2,
+  REVERB_BAND_3 = 3
+};
+
+enum { DECOR_CONFIG_0 = 0, DECOR_CONFIG_1 = 1, DECOR_CONFIG_2 = 2 };
+
+struct ia_mps_dec_ducker_interface {
+  VOID(*apply)
+  (ia_mps_dec_ducker_interface *const self, WORD32 const time_slots,
+   WORD32 const *input_real, WORD32 const *input_imag, WORD32 *output_real,
+   WORD32 *output_imag, ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr,
+   VOID *scratch);
+};
+
+typedef struct {
+  WORD32 hybrid_bands;
+  WORD32 parameter_bands;
+  WORD32 alpha;
+  WORD32 one_minus_alpha;
+  WORD32 gamma;
+  WORD32 abs_thr;
+  WORD16 qalpha;
+  WORD16 qgamma;
+  WORD32 smooth_direct_nrg[MAX_PARAMETER_BANDS];
+  WORD32 smooth_reverb_nrg[MAX_PARAMETER_BANDS];
+  WORD16 q_smooth_direct_nrg[MAX_PARAMETER_BANDS];
+  WORD16 q_smooth_reverb_nrg[MAX_PARAMETER_BANDS];
+} ia_mps_dec_duck_instance_struct;
+
+VOID ixheaacd_decorr_apply(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 length,
+                           WORD32 *input_real, WORD32 *input_imag,
+                           WORD32 *output_real, WORD32 *output_imag,
+                           WORD32 index);
+
+WORD32 ixheaacd_decorr_create(
+    ia_mps_dec_decorr_dec_handle hDecorrDec, WORD32 subbands, WORD32 seed,
+    WORD32 dec_type, WORD32 decorr_config,
+    ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table);
+
+IA_ERRORCODE ixheaacd_mps_decor_init(ia_mps_decor_struct *, WORD32, WORD32, WORD32);
 
 VOID ixheaacd_mps_decor_apply(
-    ia_mps_decor_struct_handle self,
+    ia_mps_decor_struct *self,
     ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
     ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
-    WORD32 length);
+    WORD32 length, WORD32 res_bands, WORD32 ldmps_present);
 
-#endif
+#endif /* IXHEAACD_MPS_DECOR_H */
diff --git a/decoder/ixheaacd_mps_decorr.c b/decoder/ixheaacd_mps_decorr.c
index 33b6aa5..fc53039 100644
--- a/decoder/ixheaacd_mps_decorr.c
+++ b/decoder/ixheaacd_mps_decorr.c
@@ -17,33 +17,48 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
-#include <stdio.h>
-#include <stdlib.h>
 #include <math.h>
 #include <string.h>
-#include <assert.h>
-
 #include "ixheaacd_type_def.h"
 #include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_config.h"
-
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
 #include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
-
-#include "ixheaacd_mps_polyphase.h"
-
 #include "ixheaacd_mps_decor.h"
 #include "ixheaacd_mps_hybfilter.h"
 #include "ixheaacd_error_standards.h"
-#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
 
 static const WORD32 ixheaacd_decorr_delay[] = {11, 10, 5, 2};
+static const WORD32 ixheaacd_decorr_delay_ldmps[] = {8, 7, 2, 1};
 
 static const WORD32 ixheaacd_qmf_split_freq_0[] = {3, 15, 24, 65};
 static const WORD32 ixheaacd_qmf_split_freq_1[] = {3, 50, 65, 65};
 static const WORD32 ixheaacd_qmf_split_freq_2[] = {0, 15, 65, 65};
 
+
+static const WORD32 ixheaacd_qmf_split_freq_0_ldmps[] = {0, 15, 24, 65};
+static const WORD32 ixheaacd_qmf_split_freq_1_ldmps[] = {0, 50, 65, 65};
+static const WORD32 ixheaacd_qmf_split_freq_2_ldmps[] = {0, 15, 65, 65};
+
+extern const WORD32 ixheaacd_mps_gain_set_indx[29];
+
 static const FLOAT32
     ixheaacd_lattice_coeff_0_filt_den_coeff[DECORR_FILT_0_ORD + 1] = {
         1.000000f, -0.314818f, -0.256828f, -0.173641f, -0.115077f, 0.000599f,
@@ -76,8 +91,44 @@
     ixheaacd_lattice_coeff_3_filt_num_coeff[DECORR_FILT_3_ORD + 1] = {
         -0.013000f, 0.034742f, 1.000000f};
 
-extern const WORD32
+static const FLOAT32
+    ixheaacd_lattice_coeff_1_filt_num_ldmps[DECORR_FILTER_ORDER_BAND_1 + 1] = {
+        (0.3355999887f),  (0.0024894588f),  (-0.1572290659f), (0.2807503343f),
+        (-0.1942857355f), (0.3840600252f),  (-0.4084388912f), (-0.1750483066f),
+        (0.5559588671f),  (-0.4935829639f), (0.0567415841f),  (-0.0658148378f),
+        (0.3378961682f),  (0.2284426540f),  (-0.7025330663f), (1.0000000000f)};
+
+static const FLOAT32
+    ixheaacd_lattice_coeff_1_filt_den_ldmps[DECORR_FILTER_ORDER_BAND_1 + 1] = {
+        (1.0000000000f),  (-0.7025330663f), (0.2284426540f),  (0.3378961682f),
+        (-0.0658148378f), (0.0567415841f),  (-0.4935829639f), (0.5559588671f),
+        (-0.1750483066f), (-0.4084388912f), (0.3840600252f),  (-0.1942857355f),
+        (0.2807503343f),  (-0.1572290659f), (0.0024894588f),  (0.3355999887f)};
+
+static const FLOAT32
+    ixheaacd_lattice_coeff_2_filt_num_ldmps[DECORR_FILTER_ORDER_BAND_2 + 1] = {
+        (-0.4623999894f), (0.2341193259f), (0.5163637400f), (-0.0253488291f),
+        (-0.2871030867f), (0.0153170601f), (1.0000000000f)};
+
+static const FLOAT32
+    ixheaacd_lattice_coeff_2_filt_den_ldmps[DECORR_FILTER_ORDER_BAND_2 + 1] = {
+        (1.0000000000f), (0.0153170601f), (-0.2871030867f), (-0.0253488291f),
+        (0.5163637400f), (0.2341193259f), (-0.4623999894f)
+
+};
+
+static const FLOAT32
+    ixheaacd_lattice_coeff_3_filt_num_ldmps[DECORR_FILTER_ORDER_BAND_3 + 1] = {
+        (0.2468000054f), (0.0207958221f), (-0.3898491263f), (1.0000000000f)};
+
+static const FLOAT32
+    ixheaacd_lattice_coeff_3_filt_den_ldmps[DECORR_FILTER_ORDER_BAND_3 + 1] = {
+        (1.0000000000f), (-0.3898491263f), (0.0207958221f), (0.2468000054f)};
+
+extern WORD32
     ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS];
+extern WORD32
+    ixheaacd_hybrid_band_64_to_processing_band_23_map[MAX_HYBRID_BANDS_MPS];
 
 static const WORD32 ixheaacd_hybrid_to_qmf_map[MAX_HYBRID_BANDS_MPS] = {
     0,  0,  0,  0,  0,  0,  1,  1,  2,  2,  3,  4,  5,  6,  7,  8,  9,  10,
@@ -85,36 +136,70 @@
     29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
     47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
 
-static void ixheaacd_mps_decor_filt_init(ia_mps_decor_filt_struct *self,
-                                         WORD32 reverb_band) {
-  switch (reverb_band) {
-    case 0:
-      self->num_len = self->den_len = DECORR_FILT_0_ORD + 1;
-      self->num = ixheaacd_lattice_coeff_0_filt_num_coeff;
-      self->den = ixheaacd_lattice_coeff_0_filt_den_coeff;
+static const WORD32 ixheaacd_hybrid_to_qmf_map_ldmps[MAX_HYBRID_BANDS_MPS] = {
+    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16, 17,
+    18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+    36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+    54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70};
 
-      break;
-    case 1:
-      self->num_len = self->den_len = DECORR_FILT_1_ORD + 1;
-      self->num = ixheaacd_lattice_coeff_1_filt_num_coeff;
-      self->den = ixheaacd_lattice_coeff_1_filt_den_coeff;
+static VOID ixheaacd_mps_decor_filt_init(ia_mps_decor_filt_struct *self,
+                                         WORD32 reverb_band,
+                                         WORD32 object_type) {
+  if (object_type == AOT_ER_AAC_ELD || object_type == AOT_ER_AAC_LD) {
+    switch (reverb_band) {
+      case 0:
+        self->num_len = self->den_len = DECORR_FILTER_ORDER_BAND_0 + 1;
+        self->num = NULL;
+        self->den = NULL;
 
-      break;
-    case 2:
-      self->num_len = self->den_len = DECORR_FILT_2_ORD + 1;
-      self->num = ixheaacd_lattice_coeff_2_filt_num_coeff;
-      self->den = ixheaacd_lattice_coeff_2_filt_den_coeff;
-      break;
-    case 3:
-      self->num_len = self->den_len = DECORR_FILT_3_ORD + 1;
-      self->num = ixheaacd_lattice_coeff_3_filt_num_coeff;
-      self->den = ixheaacd_lattice_coeff_3_filt_den_coeff;
-      break;
+        break;
+      case 1:
+        self->num_len = self->den_len = DECORR_FILTER_ORDER_BAND_1 + 1;
+        self->num = ixheaacd_lattice_coeff_1_filt_num_ldmps;
+        self->den = ixheaacd_lattice_coeff_1_filt_den_ldmps;
+
+        break;
+      case 2:
+        self->num_len = self->den_len = DECORR_FILTER_ORDER_BAND_2 + 1;
+        self->num = ixheaacd_lattice_coeff_2_filt_num_ldmps;
+        self->den = ixheaacd_lattice_coeff_2_filt_den_ldmps;
+        break;
+      case 3:
+        self->num_len = self->den_len = DECORR_FILTER_ORDER_BAND_3 + 1;
+        self->num = ixheaacd_lattice_coeff_3_filt_num_ldmps;
+        self->den = ixheaacd_lattice_coeff_3_filt_den_ldmps;
+        break;
+    }
+  } else {
+    switch (reverb_band) {
+      case 0:
+        self->num_len = self->den_len = DECORR_FILT_0_ORD + 1;
+        self->num = ixheaacd_lattice_coeff_0_filt_num_coeff;
+        self->den = ixheaacd_lattice_coeff_0_filt_den_coeff;
+
+        break;
+      case 1:
+        self->num_len = self->den_len = DECORR_FILT_1_ORD + 1;
+        self->num = ixheaacd_lattice_coeff_1_filt_num_coeff;
+        self->den = ixheaacd_lattice_coeff_1_filt_den_coeff;
+
+        break;
+      case 2:
+        self->num_len = self->den_len = DECORR_FILT_2_ORD + 1;
+        self->num = ixheaacd_lattice_coeff_2_filt_num_coeff;
+        self->den = ixheaacd_lattice_coeff_2_filt_den_coeff;
+        break;
+      case 3:
+        self->num_len = self->den_len = DECORR_FILT_3_ORD + 1;
+        self->num = ixheaacd_lattice_coeff_3_filt_num_coeff;
+        self->den = ixheaacd_lattice_coeff_3_filt_den_coeff;
+        break;
+    }
   }
 
   self->state_len = self->num_len;
   memset(self->state, 0,
-         sizeof(ia_cmplx_flt_struct) * (MAX_DECORR_FIL_ORDER + 1));
+         sizeof(ia_cmplx_flt_struct) * (MAX_DECORR_FILTER_ORDER + 1));
 
   return;
 }
@@ -141,27 +226,42 @@
     ixheaacd_mps_decor_energy_adjust_filt_struct *handle,
     ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
     ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
-    WORD32 time_slots) {
+    WORD32 time_slots, WORD32 res_bands, WORD32 ldmps_present) {
   ixheaacd_mps_decor_energy_adjust_filt_struct *self =
       (ixheaacd_mps_decor_energy_adjust_filt_struct *)handle;
   FLOAT32 in_energy[MAX_PARAMETER_BANDS] = {0};
   FLOAT32 out_energy[MAX_PARAMETER_BANDS] = {0};
   FLOAT32 gain[MAX_PARAMETER_BANDS];
-  WORD32 i, j, k;
+  WORD32 i, j, k, loop_counter;
+  WORD32 *ptr_hybrid_band;
+
+  if (ldmps_present == 1)
+    ptr_hybrid_band = ixheaacd_hybrid_band_64_to_processing_band_23_map;
+  else
+    ptr_hybrid_band = ixheaacd_hybrid_band_71_to_processing_band_28_map;
+
+  WORD32 start_param_band = 0, start_bin = 0;
+
+  if (res_bands != NO_RES_BANDS) {
+    start_bin = ixheaacd_mps_gain_set_indx[res_bands];
+    start_param_band = res_bands;
+  }
 
   for (i = 0; i < time_slots; i++) {
     memset(in_energy, 0, sizeof(FLOAT32) * MAX_PARAMETER_BANDS);
     memset(out_energy, 0, sizeof(FLOAT32) * MAX_PARAMETER_BANDS);
 
-    for (j = 0; j < self->num_bins; j++) {
-      k = ixheaacd_hybrid_band_71_to_processing_band_28_map[j];
+    for (j = start_bin; j < self->num_bins; j++) {
+      k = ptr_hybrid_band[j];
 
       in_energy[k] += in[i][j].re * in[i][j].re + in[i][j].im * in[i][j].im;
       out_energy[k] +=
           out[i][j].re * out[i][j].re + out[i][j].im * out[i][j].im;
     }
 
-    for (k = 0; k < MAX_PARAMETER_BANDS; k++) {
+    loop_counter = MAX_PARAMETER_BANDS;
+
+    for (k = start_param_band; k < loop_counter; k++) {
       self->smooth_in_energy[k] = self->smooth_in_energy[k] * DECOR_ALPHA +
                                   in_energy[k] * ONE_MINUS_DECOR_ALPHA;
       self->smooth_out_energy[k] = self->smooth_out_energy[k] * DECOR_ALPHA +
@@ -184,8 +284,8 @@
       }
     }
 
-    for (j = 0; j < self->num_bins; j++) {
-      k = ixheaacd_hybrid_band_71_to_processing_band_28_map[j];
+    for (j = start_bin; j < self->num_bins; j++) {
+      k = ptr_hybrid_band[j];
 
       out[i][j].re *= gain[k];
       out[i][j].im *= gain[k];
@@ -193,35 +293,58 @@
   }
 }
 
-IA_ERRORCODE ixheaacd_mps_decor_init(ia_mps_decor_struct_handle self,
-                                     WORD32 subbands, WORD32 decor_config) {
+IA_ERRORCODE ixheaacd_mps_decor_init(ia_mps_decor_struct *self,
+                                     WORD32 subbands, WORD32 decor_config,
+                                     WORD32 object_type) {
   WORD32 i, reverb_band;
   const WORD32 *splitfreq;
-
-  switch (decor_config) {
-    case 0:
-      splitfreq = ixheaacd_qmf_split_freq_0;
-      break;
-    case 1:
-      splitfreq = ixheaacd_qmf_split_freq_1;
-      break;
-    case 2:
-      splitfreq = ixheaacd_qmf_split_freq_2;
-      break;
-    default:
-      return IA_FATAL_ERROR;
+  const WORD32 *ptr_ixheaacd_hybrid_to_qmf_map;
+  const WORD32 *ptr_decorr_delay;
+  if (object_type == AOT_ER_AAC_ELD || object_type == AOT_ER_AAC_LD) {
+    ptr_ixheaacd_hybrid_to_qmf_map = ixheaacd_hybrid_to_qmf_map_ldmps;
+    ptr_decorr_delay = ixheaacd_decorr_delay_ldmps;
+    switch (decor_config) {
+      case 0:
+        splitfreq = ixheaacd_qmf_split_freq_0_ldmps;
+        break;
+      case 1:
+        splitfreq = ixheaacd_qmf_split_freq_1_ldmps;
+        break;
+      case 2:
+        splitfreq = ixheaacd_qmf_split_freq_2_ldmps;
+        break;
+      default:
+        return IA_FATAL_ERROR;
+    }
+  } else {
+    ptr_ixheaacd_hybrid_to_qmf_map = ixheaacd_hybrid_to_qmf_map;
+    ptr_decorr_delay = ixheaacd_decorr_delay;
+    switch (decor_config) {
+      case 0:
+        splitfreq = ixheaacd_qmf_split_freq_0;
+        break;
+      case 1:
+        splitfreq = ixheaacd_qmf_split_freq_1;
+        break;
+      case 2:
+        splitfreq = ixheaacd_qmf_split_freq_2;
+        break;
+      default:
+        return IA_FATAL_ERROR;
+    }
   }
 
   self->num_bins = subbands;
+  if (self->num_bins > MAX_HYBRID_BANDS_MPS) return IA_FATAL_ERROR;
 
   for (i = 0; i < self->num_bins; i++) {
     reverb_band = 0;
     while ((reverb_band < 3) &&
-           (ixheaacd_hybrid_to_qmf_map[i] >= (splitfreq[reverb_band] - 1)))
+           (ptr_ixheaacd_hybrid_to_qmf_map[i] >= (splitfreq[reverb_band] - 1)))
       reverb_band++;
 
-    self->delay_sample_count[i] = ixheaacd_decorr_delay[reverb_band];
-    ixheaacd_mps_decor_filt_init(&self->filter[i], reverb_band);
+    self->delay_sample_count[i] = ptr_decorr_delay[reverb_band];
+    ixheaacd_mps_decor_filt_init(&self->filter[i], reverb_band, object_type);
   }
 
   self->decor_nrg_smooth.num_bins = self->num_bins;
@@ -230,15 +353,17 @@
 }
 
 VOID ixheaacd_mps_decor_apply(
-    ia_mps_decor_struct_handle self,
+    ia_mps_decor_struct *self,
     ia_cmplx_flt_struct in[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
     ia_cmplx_flt_struct out[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
-    WORD32 length) {
-  WORD32 idx, sb_sample;
+    WORD32 length, WORD32 res_bands, WORD32 ldmps_present) {
+  WORD32 idx, sb_sample, index = 0;
 
   ia_cmplx_flt_struct scratch[MAX_TIME_SLOTS];
 
-  for (idx = 0; idx < self->num_bins; idx++) {
+  if (res_bands != NO_RES_BANDS) index = ixheaacd_mps_gain_set_indx[res_bands];
+
+  for (idx = index; idx < self->num_bins; idx++) {
     for (sb_sample = 0; sb_sample < length; sb_sample++) {
       self->decor_delay_buffer[idx][self->delay_sample_count[idx] + sb_sample]
           .re = in[sb_sample][idx].re;
@@ -262,6 +387,675 @@
     }
   }
 
-  ixheaacd_mps_decor_energy_adjustment(&self->decor_nrg_smooth, in, out,
-                                       length);
+  ixheaacd_mps_decor_energy_adjustment(&self->decor_nrg_smooth, in, out, length,
+                                       res_bands,
+                                       ldmps_present);
+}
+
+static VOID ixheaacd_convert_lattice_coefs_complex(WORD32 const order,
+                                                   WORD32 const *const rfc_real,
+                                                   WORD32 const *const rfc_imag,
+                                                   WORD32 *const apar_real,
+                                                   WORD32 *const apar_imag) {
+  WORD32 i, j;
+  WORD32 tmp_real[MAX_DECORR_FILTER_ORDER + 1];
+  WORD32 tmp_imag[MAX_DECORR_FILTER_ORDER + 1];
+  WORD64 temp;
+
+  apar_real[0] = 32768;
+  apar_imag[0] = 0;
+
+  for (i = 0; i < order; i++) {
+    apar_real[i + 1] = rfc_real[i];
+    apar_imag[i + 1] = rfc_imag[i];
+    for (j = 0; j < i; j++) {
+      temp = (WORD64)((WORD64)rfc_real[i] * (WORD64)tmp_real[i - j - 1] +
+                      (WORD64)rfc_imag[i] * (WORD64)tmp_imag[i - j - 1]);
+      temp >>= 15;
+      apar_real[j + 1] = ixheaacd_add32(tmp_real[j], (WORD32)temp);
+
+      temp = (WORD64)((WORD64)rfc_real[i] * (WORD64)tmp_imag[i - j - 1] +
+                      (WORD64)rfc_imag[i] * (WORD64)tmp_real[i - j - 1]);
+      temp >>= 15;
+      apar_imag[j + 1] = ixheaacd_sub32(tmp_imag[j], (WORD32)temp);
+    }
+    for (j = 0; j <= i; j++) {
+      tmp_real[j] = apar_real[j + 1];
+      tmp_imag[j] = apar_imag[j + 1];
+    }
+  }
+}
+
+static IA_ERRORCODE ixheaacd_decorr_filt_create(
+    ia_mps_dec_decorr_filter_instance_struct *self, WORD32 const decorr_seed,
+    WORD32 const qmf_band, WORD32 const reverb_band, WORD32 const dec_type,
+    ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table) {
+  IA_ERRORCODE error_code = IA_NO_ERROR;
+  WORD32 i;
+  const WORD32 *lattice_coeff = NULL;
+  WORD32 lattice_coeff_real[MAX_DECORR_FILTER_ORDER];
+  WORD32 lattice_coeff_imag[MAX_DECORR_FILTER_ORDER];
+  WORD32 temp_1;
+
+  if (self == NULL) {
+    error_code = IA_FATAL_ERROR;
+  }
+
+  if (error_code == IA_NO_ERROR) {
+    switch (reverb_band) {
+      case REVERB_BAND_0:
+        self->num_length = self->den_length = DECORR_FILTER_ORDER_BAND_0 + 1;
+        lattice_coeff = &(ia_mps_dec_mps_table->decor_table_ptr
+                              ->lattice_coeff_0[decorr_seed][0]);
+        break;
+      case REVERB_BAND_1:
+        self->num_length = self->den_length = DECORR_FILTER_ORDER_BAND_1 + 1;
+        lattice_coeff = &(ia_mps_dec_mps_table->decor_table_ptr
+                              ->lattice_coeff_1[decorr_seed][0]);
+        break;
+      case REVERB_BAND_2:
+        self->num_length = self->den_length = DECORR_FILTER_ORDER_BAND_2 + 1;
+        lattice_coeff = &(ia_mps_dec_mps_table->decor_table_ptr
+                              ->lattice_coeff_2[decorr_seed][0]);
+        break;
+      case REVERB_BAND_3:
+        self->num_length = self->den_length = DECORR_FILTER_ORDER_BAND_3 + 1;
+        lattice_coeff = &(ia_mps_dec_mps_table->decor_table_ptr
+                              ->lattice_coeff_3[decorr_seed][0]);
+        break;
+      default:
+        return IA_FATAL_ERROR;
+    }
+    self->state_length = (self->num_length > self->den_length)
+                             ? self->num_length
+                             : self->den_length;
+  }
+
+  if (error_code == IA_NO_ERROR) {
+    const WORD32 *cos_tab =
+        ia_mps_dec_mps_table->hybrid_table_ptr->cosine_array;
+    const WORD32 *sin_tab = ia_mps_dec_mps_table->hybrid_table_ptr->sine_array;
+
+    if (dec_type == 1) {
+      for (i = 0; i < self->num_length - 1; i++) {
+        temp_1 = (qmf_band * ia_mps_dec_mps_table->decor_table_ptr
+                                 ->lattice_delta_phi[decorr_seed][i]) >>
+                 1;
+        lattice_coeff_real[i] = ixheaacd_mps_mult32_shr_15(
+            ixheaacd_mps_cos(temp_1, cos_tab), lattice_coeff[i]);
+        lattice_coeff_imag[i] = ixheaacd_mps_mult32_shr_15(
+            ixheaacd_mps_sin(temp_1, sin_tab), lattice_coeff[i]);
+      }
+
+      ixheaacd_convert_lattice_coefs_complex(
+          self->num_length - 1, lattice_coeff_real, lattice_coeff_imag,
+          self->denominator_real, self->denominator_imag);
+      for (i = 0; i < self->num_length; i++) {
+        self->numerator_real[i] =
+            self->denominator_real[self->num_length - 1 - i];
+        self->numerator_imag[i] =
+            -self->denominator_imag[self->num_length - 1 - i];
+      }
+
+      self->complex = 1;
+    } else {
+      switch (reverb_band) {
+        case REVERB_BAND_0:
+          self->denominator_real = &(ia_mps_dec_mps_table->decor_table_ptr
+                                         ->den_coef_0[decorr_seed][0]);
+          break;
+        case REVERB_BAND_1:
+          self->denominator_real = &(ia_mps_dec_mps_table->decor_table_ptr
+                                         ->den_coef_1[decorr_seed][0]);
+          break;
+        case REVERB_BAND_2:
+          self->denominator_real = &(ia_mps_dec_mps_table->decor_table_ptr
+                                         ->den_coef_2[decorr_seed][0]);
+          break;
+        case REVERB_BAND_3:
+          self->denominator_real = &(ia_mps_dec_mps_table->decor_table_ptr
+                                         ->den_coef_3[decorr_seed][0]);
+          break;
+        default:
+          return IA_FATAL_ERROR;
+      }
+
+      for (i = 0; i < self->num_length; i++) {
+        self->numerator_real[i] =
+            self->denominator_real[self->num_length - 1 - i];
+      }
+      self->complex = 0;
+    }
+  }
+  return error_code;
+}
+
+static VOID ixheaacd_decorr_filt_apply(
+    ia_mps_dec_decorr_filter_instance_struct *const self, WORD32 const length,
+    WORD32 const *const input_real, WORD32 const *const input_imag,
+    WORD32 *const p_output_real, WORD32 *const p_output_imag) {
+  WORD32 temp_1, temp_2, temp3, temp4;
+  WORD32 temp5, temp6, temp7, temp8;
+  WORD32 *state_real, *state_imag;
+  WORD32 *numerator_real, *denominator_real;
+  WORD32 *output_real = p_output_real;
+  WORD32 *output_imag = p_output_imag;
+
+  WORD32 common_part;
+  WORD32 i;
+  WORD32 j;
+
+  common_part = self->num_length;
+  state_real = self->state_real;
+  state_imag = self->state_imag;
+  numerator_real = self->numerator_real;
+  denominator_real = self->denominator_real;
+
+  {
+    for (i = 0; i < length; i++) {
+      {
+        temp5 = input_real[i];
+        temp6 = input_imag[i];
+
+        temp_1 = ixheaacd_mps_mult32_shr_14(temp5, numerator_real[0]);
+        temp_2 = ixheaacd_mps_mult32_shr_14(temp6, numerator_real[0]);
+
+        *output_real = temp_1 + state_real[0];
+        *output_imag = temp_2 + state_imag[0];
+
+        temp7 = *output_real;
+        temp8 = *output_imag;
+
+        output_real += MAX_HYBRID_BANDS;
+        output_imag += MAX_HYBRID_BANDS;
+        for (j = 1; j < common_part; j++) {
+          temp_1 = ixheaacd_mps_mult32x16_shr_16(temp5, numerator_real[j]);
+          temp3 = ixheaacd_mps_mult32x16_shr_16(temp6, numerator_real[j]);
+          temp_2 = ixheaacd_mps_mult32x16_shr_16(temp7, denominator_real[j]);
+          temp4 = ixheaacd_mps_mult32x16_shr_16(temp8, denominator_real[j]);
+          temp_1 -= temp_2;
+
+          state_real[j - 1] = state_real[j] + (temp_1 << 2);
+          temp3 -= temp4;
+
+          state_imag[j - 1] = state_imag[j] + (temp3 << 2);
+        }
+      }
+    }
+  }
+}
+
+static VOID ixheaacd_ducker_apply_71(
+    ia_mps_dec_ducker_interface *const face, WORD32 const time_slots,
+    WORD32 const *input_real, WORD32 const *input_imag, WORD32 *output_real,
+    WORD32 *output_imag, ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr,
+    VOID *scratch) {
+  ia_mps_dec_duck_instance_struct *self =
+      (ia_mps_dec_duck_instance_struct *)&face[1];
+  WORD32 *duck_gain;
+  WORD32 gain;
+  WORD16 qgain;
+  WORD64 direct_nrg[28];
+  WORD64 reverb_nrg[28];
+  WORD16 *q_duck_gain;
+  WORD32 ts;
+  WORD32 qs;
+  WORD32 pb;
+  WORD16 qtemp1, qtemp2, qtemp3;
+  WORD32 temp_1, temp_2, temp3;
+  const WORD32 *p_input_real;
+  const WORD32 *p_input_imag;
+  const WORD32 *hybrid_2_param_28 =
+      ia_mps_dec_mps_table_ptr->m1_m2_table_ptr->hybrid_2_param_28;
+  const WORD32 *sqrt_tab = ia_mps_dec_mps_table_ptr->common_table_ptr->sqrt_tab;
+  WORD32 *smooth_direct_nrg = self->smooth_direct_nrg;
+  WORD16 *q_smooth_direct_nrg = self->q_smooth_direct_nrg;
+
+  WORD32 *smooth_reverb_nrg = self->smooth_reverb_nrg;
+  WORD16 *q_smooth_reverb_nrg = self->q_smooth_reverb_nrg;
+
+  WORD32 parameter_bands = self->parameter_bands;
+
+  WORD32 *p_output_real, *p_output_imag;
+
+  WORD32 num_bands_2 = self->hybrid_bands;
+  WORD32 v1, v2, v3, v4;
+  WORD16 one_by_5 = ONE_BY_FIVE_Q16;
+
+  duck_gain = scratch;
+  q_duck_gain = (WORD16 *)scratch + PARAMETER_BANDSX2;
+
+  p_input_real = input_real;
+  p_input_imag = input_imag;
+
+  p_output_real = output_real;
+  p_output_imag = output_imag;
+
+  for (ts = 0; ts < time_slots; ts++) {
+    memset(direct_nrg, 0, sizeof(direct_nrg));
+    memset(reverb_nrg, 0, sizeof(reverb_nrg));
+
+    for (qs = 0; qs < 55; qs++) {
+      v1 = p_input_real[qs];
+      v2 = p_input_imag[qs];
+      v3 = p_output_real[qs];
+      v4 = p_output_imag[qs];
+
+      pb = hybrid_2_param_28[qs];
+      direct_nrg[pb] +=
+          (WORD64)((WORD64)v1 * (WORD64)v1) + (WORD64)((WORD64)v2 * (WORD64)v2);
+      reverb_nrg[pb] +=
+          (WORD64)((WORD64)v3 * (WORD64)v3) + (WORD64)((WORD64)v4 * (WORD64)v4);
+    }
+
+    for (; qs < num_bands_2; qs++) {
+      v1 = p_input_real[qs];
+      v2 = p_input_imag[qs];
+      v3 = p_output_real[qs];
+      v4 = p_output_imag[qs];
+
+      direct_nrg[27] +=
+          (WORD64)((WORD64)v1 * (WORD64)v1) + (WORD64)((WORD64)v2 * (WORD64)v2);
+      reverb_nrg[27] +=
+          (WORD64)((WORD64)v3 * (WORD64)v3) + (WORD64)((WORD64)v4 * (WORD64)v4);
+    }
+
+    for (pb = 0; pb < parameter_bands; pb++) {
+      WORD16 qtemp, qtemp_1;
+      temp_1 = ixheaacd_mps_narrow(direct_nrg[pb], &qtemp);
+
+      temp_2 = smooth_direct_nrg[pb] << 2;
+      temp3 =
+          ixheaacd_mps_add32(temp_2, temp_1, &(q_smooth_direct_nrg[pb]), qtemp);
+      smooth_direct_nrg[pb] = ixheaacd_mps_mult32x16_shr_16(temp3, one_by_5);
+
+      temp_1 = ixheaacd_mps_narrow(reverb_nrg[pb], &qtemp);
+      temp_2 = smooth_reverb_nrg[pb] << 2;
+
+      temp3 =
+          ixheaacd_mps_add32(temp_2, temp_1, &(q_smooth_reverb_nrg[pb]), qtemp);
+      smooth_reverb_nrg[pb] = ixheaacd_mps_mult32x16_shr_16(temp3, one_by_5);
+
+      qtemp1 = q_smooth_reverb_nrg[pb] - 1;
+      temp_1 = (smooth_reverb_nrg[pb] >> 2) * 3;
+      qtemp = q_smooth_direct_nrg[pb];
+      temp3 = smooth_direct_nrg[pb];
+
+      if (ixheaacd_mps_comp(temp3, temp_1, &qtemp, qtemp1)) {
+        temp_2 = ixheaacd_mps_div_32(temp3, temp_1, &qtemp2);
+        qtemp2 = qtemp2 + qtemp - qtemp1;
+        temp3 = (qtemp2) > 28 ? MAX_32 : 4 << qtemp2;
+
+        if (temp_2 > temp3) {
+          *duck_gain = (ONE_IN_Q15 - 1);
+          *q_duck_gain++ = 14;
+        } else {
+          *duck_gain = ixheaacd_mps_sqrt(temp_2, &qtemp2, sqrt_tab);
+          *q_duck_gain++ = qtemp2;
+        }
+        duck_gain++;
+        continue;
+      }
+
+      *duck_gain = ONE_IN_Q14 - 1;
+
+      qtemp = q_smooth_direct_nrg[pb] - 1;
+      temp_1 = (smooth_direct_nrg[pb] >> 2) * 3;
+
+      qtemp_1 = q_smooth_reverb_nrg[pb];
+      temp_2 = smooth_reverb_nrg[pb];
+      if (ixheaacd_mps_comp(temp_2, temp_1, &(qtemp_1), qtemp)) {
+        temp3 = ixheaacd_mps_div_32(temp_1, temp_2, &qtemp3);
+        qtemp3 = qtemp3 + qtemp - qtemp_1;
+
+        *duck_gain = ixheaacd_mps_sqrt(temp3, &qtemp3, sqrt_tab);
+        *q_duck_gain = qtemp3;
+      }
+
+      duck_gain++;
+      q_duck_gain++;
+    }
+    duck_gain -= parameter_bands;
+    q_duck_gain -= parameter_bands;
+
+    for (qs = 0; qs < 55; qs++) {
+      pb = hybrid_2_param_28[qs];
+      gain = duck_gain[pb];
+      if (gain == 16383) {
+        continue;
+      }
+      qgain = q_duck_gain[pb];
+      p_output_real[qs] =
+          ixheaacd_mps_mult32_shr_n(p_output_real[qs], gain, qgain);
+      p_output_imag[qs] =
+          ixheaacd_mps_mult32_shr_n(p_output_imag[qs], gain, qgain);
+    }
+
+    gain = duck_gain[27];
+
+    if (gain != 16383) {
+      qgain = q_duck_gain[27];
+      for (; qs < num_bands_2; qs++) {
+        p_output_real[qs] =
+            ixheaacd_mps_mult32_shr_n(p_output_real[qs], gain, qgain);
+        p_output_imag[qs] =
+            ixheaacd_mps_mult32_shr_n(p_output_imag[qs], gain, qgain);
+      }
+    }
+
+    p_input_real += MAX_HYBRID_BANDS;
+    p_input_imag += MAX_HYBRID_BANDS;
+
+    p_output_real += MAX_HYBRID_BANDS;
+    p_output_imag += MAX_HYBRID_BANDS;
+  }
+}
+
+static VOID ixheaacd_ducker_apply(
+    ia_mps_dec_ducker_interface *const face, WORD32 const time_slots,
+    WORD32 const *input_real, WORD32 const *input_imag, WORD32 *output_real,
+    WORD32 *output_imag, ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr,
+    VOID *scratch) {
+  ia_mps_dec_duck_instance_struct *self =
+      (ia_mps_dec_duck_instance_struct *)&face[1];
+  WORD32 *duck_gain;
+  WORD32 gain;
+  WORD16 qgain;
+  WORD64 direct_nrg[28];
+  WORD64 reverb_nrg[28];
+  WORD16 *q_duck_gain;
+  WORD32 ts;
+  WORD32 qs;
+  WORD32 pb;
+  WORD16 qtemp1, qtemp2, qtemp3;
+  WORD32 temp_1, temp_2, temp3;
+  const WORD32 *p_input_real;
+  const WORD32 *p_input_imag;
+  const WORD32 *hybrid_2_param_28 =
+      ia_mps_dec_mps_table_ptr->m1_m2_table_ptr->hybrid_2_param_28;
+  const WORD32 *sqrt_tab = ia_mps_dec_mps_table_ptr->common_table_ptr->sqrt_tab;
+  WORD32 *smooth_direct_nrg = self->smooth_direct_nrg;
+  WORD16 *q_smooth_direct_nrg = self->q_smooth_direct_nrg;
+
+  WORD32 *smooth_reverb_nrg = self->smooth_reverb_nrg;
+  WORD16 *q_smooth_reverb_nrg = self->q_smooth_reverb_nrg;
+
+  WORD32 parameter_bands = self->parameter_bands;
+
+  WORD32 *p_output_real, *p_output_imag;
+
+  WORD32 num_bands_2 = self->hybrid_bands;
+  WORD32 v1, v2, v3, v4;
+  WORD16 one_by_5 = ONE_BY_FIVE_Q16;
+
+  duck_gain = scratch;
+  q_duck_gain = (WORD16 *)scratch + PARAMETER_BANDSX2;
+
+  p_input_real = input_real;
+  p_input_imag = input_imag;
+
+  p_output_real = output_real;
+  p_output_imag = output_imag;
+
+  for (ts = 0; ts < time_slots; ts++) {
+    memset(direct_nrg, 0, sizeof(direct_nrg));
+    memset(reverb_nrg, 0, sizeof(reverb_nrg));
+
+    for (qs = 0; qs < num_bands_2; qs++) {
+      v1 = p_input_real[qs];
+      v2 = p_input_imag[qs];
+      v3 = p_output_real[qs];
+      v4 = p_output_imag[qs];
+
+      pb = hybrid_2_param_28[qs];
+      direct_nrg[pb] +=
+          (WORD64)((WORD64)v1 * (WORD64)v1) + (WORD64)((WORD64)v2 * (WORD64)v2);
+      reverb_nrg[pb] +=
+          (WORD64)((WORD64)v3 * (WORD64)v3) + (WORD64)((WORD64)v4 * (WORD64)v4);
+    }
+
+    for (pb = 0; pb < parameter_bands; pb++) {
+      WORD16 qtemp, qtemp_1;
+      temp_1 = ixheaacd_mps_narrow(direct_nrg[pb], &qtemp);
+      temp_2 = smooth_direct_nrg[pb] << 2;
+      temp3 =
+          ixheaacd_mps_add32(temp_2, temp_1, &(q_smooth_direct_nrg[pb]), qtemp);
+      smooth_direct_nrg[pb] = ixheaacd_mps_mult32x16_shr_16(temp3, one_by_5);
+
+      temp_1 = ixheaacd_mps_narrow(reverb_nrg[pb], &qtemp);
+      temp_2 = smooth_reverb_nrg[pb] << 2;
+
+      temp3 =
+          ixheaacd_mps_add32(temp_2, temp_1, &(q_smooth_reverb_nrg[pb]), qtemp);
+      smooth_reverb_nrg[pb] = ixheaacd_mps_mult32x16_shr_16(temp3, one_by_5);
+
+      qtemp1 = q_smooth_reverb_nrg[pb] - 1;
+      temp_1 = (smooth_reverb_nrg[pb] >> 2) * 3;
+      qtemp = q_smooth_direct_nrg[pb];
+      temp3 = smooth_direct_nrg[pb];
+
+      if (ixheaacd_mps_comp(temp3, temp_1, &qtemp, qtemp1)) {
+        temp_2 = ixheaacd_mps_div_32(temp3, temp_1, &qtemp2);
+        qtemp2 = qtemp2 + qtemp - qtemp1;
+        temp3 = qtemp2 > 28 ? MAX_32 : 4 << qtemp2;
+
+        if (temp_2 > temp3) {
+          *duck_gain = 32767;
+          *q_duck_gain++ = 14;
+        } else {
+          *duck_gain = ixheaacd_mps_sqrt(temp_2, &qtemp2, sqrt_tab);
+          *q_duck_gain++ = qtemp2;
+        }
+        duck_gain++;
+        continue;
+      }
+
+      *duck_gain = 16383;
+
+      qtemp = q_smooth_direct_nrg[pb] - 1;
+      temp_1 = (smooth_direct_nrg[pb] >> 2) * 3;
+
+      qtemp_1 = q_smooth_reverb_nrg[pb];
+      temp_2 = smooth_reverb_nrg[pb];
+      if (ixheaacd_mps_comp(temp_2, temp_1, &(qtemp_1), qtemp)) {
+        temp3 = ixheaacd_mps_div_32(temp_1, temp_2, &qtemp3);
+        qtemp3 = qtemp3 + qtemp - qtemp_1;
+
+        *duck_gain = ixheaacd_mps_sqrt(temp3, &qtemp3, sqrt_tab);
+        *q_duck_gain = qtemp3;
+      }
+
+      duck_gain++;
+      q_duck_gain++;
+    }
+
+    duck_gain -= parameter_bands;
+    q_duck_gain -= parameter_bands;
+
+    for (qs = 0; qs < num_bands_2; qs++) {
+      pb = hybrid_2_param_28[qs];
+      gain = duck_gain[pb];
+      if (gain == 16383) {
+        continue;
+      }
+      qgain = q_duck_gain[pb];
+      p_output_real[qs] =
+          ixheaacd_mps_mult32_shr_n(p_output_real[qs], gain, qgain);
+      p_output_imag[qs] =
+          ixheaacd_mps_mult32_shr_n(p_output_imag[qs], gain, qgain);
+    }
+
+    p_input_real += MAX_HYBRID_BANDS;
+    p_input_imag += MAX_HYBRID_BANDS;
+
+    p_output_real += MAX_HYBRID_BANDS;
+    p_output_imag += MAX_HYBRID_BANDS;
+  }
+}
+
+static IA_ERRORCODE ixheaacd_ducker_create(
+    ia_mps_dec_ducker_interface *const face, WORD32 const hybrid_bands) {
+  ia_mps_dec_duck_instance_struct *self = NULL;
+  IA_ERRORCODE error_code = IA_NO_ERROR;
+  WORD32 i;
+
+  if (face == NULL) {
+    error_code = IA_FATAL_ERROR;
+  }
+
+  if (error_code == IA_NO_ERROR) {
+    self = (ia_mps_dec_duck_instance_struct *)&face[1];
+
+    self->hybrid_bands = hybrid_bands;
+    self->parameter_bands = MAX_PARAMETER_BANDS;
+
+    self->alpha = DUCK_ALPHA;
+    self->one_minus_alpha = DUCK_ONEMINUSALPHA;
+    self->gamma = DUCK_GAMMA;
+    self->abs_thr = ABS_THR_FIX;
+    self->hybrid_bands = hybrid_bands;
+    self->parameter_bands = MAX_PARAMETER_BANDS;
+
+    self->qalpha = 15;
+    self->qgamma = 14;
+
+    if (hybrid_bands == 71)
+      face->apply = ixheaacd_ducker_apply_71;
+    else
+      face->apply = ixheaacd_ducker_apply;
+
+    for (i = 0; i < MAX_PARAMETER_BANDS; i++) {
+      self->q_smooth_direct_nrg[i] = 31;
+      self->q_smooth_reverb_nrg[i] = 31;
+    }
+  }
+
+  return error_code;
+}
+
+IA_ERRORCODE ixheaacd_decorr_create(
+    ia_mps_dec_decorr_dec_handle self, WORD32 subbands, WORD32 seed,
+    WORD32 dec_type, WORD32 decorr_config,
+    ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr) {
+  IA_ERRORCODE error_code = IA_NO_ERROR;
+  WORD32 i, reverb_band;
+
+  const WORD32 *rev_split_freq;
+
+  switch (decorr_config) {
+    case DECOR_CONFIG_0:
+      rev_split_freq =
+          ia_mps_dec_mps_table_ptr->decor_table_ptr->rev_table.rev_split_freq_0;
+      break;
+    case DECOR_CONFIG_1:
+      rev_split_freq =
+          ia_mps_dec_mps_table_ptr->decor_table_ptr->rev_table.rev_split_freq_1;
+      break;
+    case DECOR_CONFIG_2:
+      rev_split_freq =
+          ia_mps_dec_mps_table_ptr->decor_table_ptr->rev_table.rev_split_freq_2;
+      break;
+    default:
+      return IA_FATAL_ERROR;
+      break;
+  }
+
+  if (error_code == IA_NO_ERROR) {
+    self->decorr_seed = seed;
+    self->numbins = subbands;
+
+    for (i = 0; i < self->numbins; i++) {
+      reverb_band = 0;
+      while ((reverb_band < 3) &&
+             (ixheaacd_get_qmf_sb(
+                  i, ia_mps_dec_mps_table_ptr->mdct2qmf_table_ptr) >=
+              (rev_split_freq[reverb_band] - 1)))
+        reverb_band++;
+
+      {
+        self->no_sample_delay[i] =
+            ia_mps_dec_mps_table_ptr->decor_table_ptr->rev_table
+                .rev_delay[reverb_band][self->decorr_seed];
+
+        error_code = ixheaacd_decorr_filt_create(
+            self->filter[i], self->decorr_seed,
+            ixheaacd_get_qmf_sb(i,
+                                ia_mps_dec_mps_table_ptr->mdct2qmf_table_ptr),
+            reverb_band, dec_type, ia_mps_dec_mps_table_ptr);
+      }
+    }
+
+    if (error_code == IA_NO_ERROR) {
+      error_code = ixheaacd_ducker_create(self->ducker, self->numbins);
+    }
+  }
+  return (error_code);
+}
+
+VOID ixheaacd_decorr_apply(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 length,
+                           WORD32 *input_real, WORD32 *input_imag,
+                           WORD32 *output_real, WORD32 *output_imag,
+                           WORD32 index) {
+  WORD32 l = index - pstr_mps_state->num_direct_signals;
+  ia_mps_dec_decorr_dec_handle decorr_ptr = pstr_mps_state->ap_decor[l];
+  WORD32 idx, sb_sample;
+
+  WORD32 *p_input_real, *p_input_re, *p_input_imag, *p_input_im;
+  WORD32 *p_output_real, *p_output_imag, *p_output_re, *p_output_im;
+  WORD32 *delay_buffer_real, *delay_buffer_imag;
+  WORD32 length1;
+  VOID *free_scratch;
+
+  free_scratch = (WORD32 *)pstr_mps_state->mps_scratch_mem_v + MAX_TIMESLOTSX2;
+
+  if (decorr_ptr != NULL) {
+    p_input_real = input_real;
+    p_input_imag = input_imag;
+
+    p_output_real = output_real;
+    p_output_imag = output_imag;
+    for (idx = 0; idx < decorr_ptr->numbins; idx++) {
+      p_input_re = p_input_real;
+      p_input_im = p_input_imag;
+
+      p_output_re = p_output_real;
+      p_output_im = p_output_imag;
+
+      length1 = length - decorr_ptr->no_sample_delay[idx];
+      delay_buffer_real =
+          &decorr_ptr->delay_buffer_real[idx][decorr_ptr->no_sample_delay[idx]];
+      delay_buffer_imag =
+          &decorr_ptr->delay_buffer_imag[idx][decorr_ptr->no_sample_delay[idx]];
+      for (sb_sample = 0; sb_sample < length1; sb_sample++) {
+        delay_buffer_real[sb_sample] = *p_input_re;
+        *delay_buffer_imag++ = *p_input_im;
+        p_input_re += MAX_HYBRID_BANDS;
+        p_input_im += MAX_HYBRID_BANDS;
+      }
+      {
+        ixheaacd_decorr_filt_apply(
+            decorr_ptr->filter[idx], length, decorr_ptr->delay_buffer_real[idx],
+            decorr_ptr->delay_buffer_imag[idx], p_output_re++, p_output_im++);
+      }
+
+      length1 = decorr_ptr->no_sample_delay[idx];
+      delay_buffer_real = &decorr_ptr->delay_buffer_real[idx][0];
+      delay_buffer_imag = &decorr_ptr->delay_buffer_imag[idx][0];
+      for (sb_sample = 0; sb_sample < length1; sb_sample++) {
+        delay_buffer_real[sb_sample] = *p_input_re;
+        p_input_re += MAX_HYBRID_BANDS;
+        *delay_buffer_imag++ = *p_input_im;
+        p_input_im += MAX_HYBRID_BANDS;
+      }
+
+      p_input_real++;
+      p_input_imag++;
+
+      p_output_real++;
+      p_output_imag++;
+    }
+    decorr_ptr->ducker->apply(decorr_ptr->ducker, length, input_real,
+                              input_imag, output_real, output_imag,
+                              &(pstr_mps_state->ia_mps_dec_mps_table), free_scratch);
+  }
 }
diff --git a/decoder/ixheaacd_mps_defines.h b/decoder/ixheaacd_mps_defines.h
new file mode 100644
index 0000000..aa2a674
--- /dev/null
+++ b/decoder/ixheaacd_mps_defines.h
@@ -0,0 +1,33 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_DEFINES_H
+#define IXHEAACD_MPS_DEFINES_H
+
+#define INV_SQRT2_Q15 23170
+
+#define COS_3PI_BY_8_Q15 12540
+
+#define SQRT2PLUS1_Q13 19777
+
+#define SQRT2MINUS1_Q15 13573
+
+#define COS_PI_BY_8_Q15 30274
+
+#endif /* IXHEAACD_MPS_DEFINES_H */
diff --git a/decoder/ixheaacd_mps_get_index.c b/decoder/ixheaacd_mps_get_index.c
new file mode 100644
index 0000000..4a9b079
--- /dev/null
+++ b/decoder/ixheaacd_mps_get_index.c
@@ -0,0 +1,61 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_reshape_bb_env.h"
+
+VOID ixheaacd_get_ch_idx(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 row, WORD32 *index) {
+  switch (pstr_mps_state->temp_shape_config) {
+    case SHAPE_STP:
+      *index = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->idx_table
+                   .row_2_channel_stp[pstr_mps_state->tree_config][row];
+      break;
+    case SHAPE_GES:
+      *index = pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->idx_table
+                   .row_2_channel_ges[pstr_mps_state->tree_config][row];
+      break;
+    default:
+      break;
+  }
+
+  return;
+}
+
+WORD32 ixheaacd_get_res_idx(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 row) {
+  return pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->idx_table
+      .row_2_residual[pstr_mps_state->tree_config][row];
+}
diff --git a/decoder/ixheaacd_mps_get_index.h b/decoder/ixheaacd_mps_get_index.h
new file mode 100644
index 0000000..455d730
--- /dev/null
+++ b/decoder/ixheaacd_mps_get_index.h
@@ -0,0 +1,27 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_GET_INDEX_H
+#define IXHEAACD_MPS_GET_INDEX_H
+
+VOID ixheaacd_get_ch_idx(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 row, WORD32 *index);
+
+WORD32 ixheaacd_get_res_idx(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 row);
+
+#endif /* IXHEAACD_MPS_GET_INDEX_H */
diff --git a/decoder/ixheaacd_mps_huff_tab.h b/decoder/ixheaacd_mps_huff_tab.h
index 20ed1e5..afbe6b8 100644
--- a/decoder/ixheaacd_mps_huff_tab.h
+++ b/decoder/ixheaacd_mps_huff_tab.h
@@ -20,34 +20,34 @@
 #ifndef IXHEAACD_MPS_HUFF_TAB_H
 #define IXHEAACD_MPS_HUFF_TAB_H
 
-typedef struct { const WORD32 node_tab[39][2]; } ia_huff_res_nodes_struct;
+typedef struct { WORD32 node_tab[39][2]; } ia_huff_res_nodes_struct;
 
-typedef struct { const WORD32 node_tab[30][2]; } ia_huff_cld_node_1d_struct;
+typedef struct { WORD32 node_tab[30][2]; } ia_huff_cld_node_1d_struct;
 
-typedef struct { const WORD32 node_tab[7][2]; } ia_huff_icc_node_1d_struct;
+typedef struct { WORD32 node_tab[7][2]; } ia_huff_icc_node_1d_struct;
 
-typedef struct { const WORD32 node_tab[50][2]; } HUFF_CPC_NOD_1D;
+typedef struct { WORD32 node_tab[50][2]; } ia_huff_cpc_node_1d_struct;
 
 typedef struct {
-  const WORD32 lav3[15][2];
-  const WORD32 lav5[35][2];
-  const WORD32 lav7[63][2];
-  const WORD32 lav9[99][2];
+  WORD32 lav3[15][2];
+  WORD32 lav5[35][2];
+  WORD32 lav7[63][2];
+  WORD32 lav9[99][2];
 } ia_huff_cld_node_2d_struct;
 
 typedef struct {
-  const WORD32 lav1[3][2];
-  const WORD32 lav3[15][2];
-  const WORD32 lav5[35][2];
-  const WORD32 lav7[63][2];
+  WORD32 lav1[3][2];
+  WORD32 lav3[15][2];
+  WORD32 lav5[35][2];
+  WORD32 lav7[63][2];
 } ia_huff_icc_node_2d_struct;
 
 typedef struct {
-  const WORD32 lav3[15][2];
-  const WORD32 lav6[48][2];
-  const WORD32 lav9[99][2];
-  const WORD32 lav12[168][2];
-} HUFF_CPC_NOD_2D;
+  WORD32 lav3[15][2];
+  WORD32 lav6[48][2];
+  WORD32 lav9[99][2];
+  WORD32 lav12[168][2];
+} ia_mps_dec_huff_cpc_nod_2d;
 
 typedef struct {
   ia_huff_cld_node_1d_struct h_1_dim[3];
@@ -62,27 +62,27 @@
 } ia_huff_icc_nodes_struct;
 
 typedef struct {
-  HUFF_CPC_NOD_1D h_1_dim[3];
-  HUFF_CPC_NOD_2D h_2_dim[3][2];
+  ia_huff_cpc_node_1d_struct h_1_dim[3];
+  ia_mps_dec_huff_cpc_nod_2d h_2_dim[3][2];
 
-} HUFF_CPC_NODES;
+} ia_huff_cpc_nodes_struct;
 
 typedef struct {
-  const WORD32 cld[30][2];
-  const WORD32 icc[7][2];
-  const WORD32 cpc[25][2];
+  WORD32 cld[30][2];
+  WORD32 icc[7][2];
+  WORD32 cpc[25][2];
 
 } ia_huff_pt0_nodes_struct;
 
-typedef struct { const WORD32 node_tab[3][2]; } ia_huff_lav_nodes_struct;
+typedef struct { WORD32 node_tab[3][2]; } ia_huff_lav_nodes_struct;
 
-typedef struct { const WORD32 node_tab[7][2]; } ia_huff_ipd_node_1d_struct;
+typedef struct { WORD32 node_tab[7][2]; } ia_huff_ipd_node_1d_struct;
 
 typedef struct {
-  const WORD32 lav1[3][2];
-  const WORD32 lav3[15][2];
-  const WORD32 lav5[35][2];
-  const WORD32 lav7[63][2];
+  WORD32 lav1[3][2];
+  WORD32 lav3[15][2];
+  WORD32 lav5[35][2];
+  WORD32 lav7[63][2];
 } ia_huff_ipd_node_2d_struct;
 
 typedef struct {
@@ -92,4 +92,4 @@
 
 } ia_huff_ipd_nodes_struct;
 
-#endif
+#endif /* IXHEAACD_MPS_HUFF_TAB_H */
diff --git a/decoder/ixheaacd_mps_hybfilter.h b/decoder/ixheaacd_mps_hybfilter.h
index b0b8266..06a8ee4 100644
--- a/decoder/ixheaacd_mps_hybfilter.h
+++ b/decoder/ixheaacd_mps_hybfilter.h
@@ -24,13 +24,51 @@
 
 VOID ixheaacd_mps_qmf_hybrid_analysis(
     ia_mps_hybrid_filt_struct *handle,
-    ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW],
+    ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS],
     WORD32 num_bands, WORD32 num_samples,
-    ia_cmplx_flt_struct out_hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]);
+    ia_cmplx_flt_struct out_hyb[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]);
+
+VOID ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
+    ia_mps_hybrid_filt_struct *handle,
+    ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS][MAX_TIME_SLOTS],
+    WORD32 num_bands, WORD32 num_samples,
+    ia_cmplx_flt_struct v[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]);
 
 VOID ixheaacd_mps_qmf_hybrid_synthesis(
     ia_cmplx_flt_struct in_hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
     WORD32 num_bands, WORD32 num_samples,
     ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS]);
 
-#endif
+WORD32 ixheaacd_get_qmf_sb(
+    WORD32 hybrid_subband,
+    const ia_mps_dec_mdct2qmf_table_struct *ixheaacd_mps_dec_mdct2qmf_table);
+
+VOID ixheaacd_init_ana_hyb_filt_bank(
+    ia_mps_dec_thyb_filter_state_struct *hyb_state);
+
+VOID ixheaacd_apply_ana_hyb_filt_bank_merge_res_decor(
+    ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real,
+    WORD32 *m_qmf_imag, WORD32 nr_bands, WORD32 nr_samples,
+    WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
+    const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr);
+
+VOID ixheaacd_apply_ana_hyb_filt_bank_create_x(
+    ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real,
+    WORD32 *m_qmf_imag, WORD32 nr_bands, WORD32 nr_samples,
+    WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
+    const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr);
+
+VOID ixheaacd_apply_ana_hyb_filt_bank_create_x_res(
+    ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real,
+    WORD32 *m_qmf_imag, WORD32 nr_bands, WORD32 nr_samples,
+    WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag, SIZE_T *indx, WORD32 res,
+    WORD32 hyb_bands, WORD32 num_parameter_bands, WORD32 *counter,
+    const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr);
+
+VOID ixheaacd_8ch_filtering(const WORD32 *p_qmf_real, const WORD32 *p_qmf_imag,
+                            WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
+                            const ia_mps_dec_hybrid_tables_struct *hyb_tab);
+
+VOID ixheaacd_2ch_filtering(WORD32 *p_qmf, WORD32 *m_hybrid,
+                            const ia_mps_dec_hybrid_tables_struct *hyb_tab);
+#endif /* IXHEAACD_MPS_HYBFILTER_H */
diff --git a/decoder/ixheaacd_mps_hybrid_filt.c b/decoder/ixheaacd_mps_hybrid_filt.c
index 044f4b1..35d7995 100644
--- a/decoder/ixheaacd_mps_hybrid_filt.c
+++ b/decoder/ixheaacd_mps_hybrid_filt.c
@@ -17,173 +17,210 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
-#include <math.h>
 #include <string.h>
 #include "ixheaacd_type_def.h"
 #include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_config.h"
-
-#include "ixheaacd_mps_polyphase.h"
-#include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
-
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_constants.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_dec.h"
 #include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
 
-#include "ixheaacd_mps_hybfilter.h"
+extern const FLOAT32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER];
+extern const FLOAT32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER];
 
-extern const WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER];
-extern const WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER];
-extern const WORD32 ixheaacd_cosine[8][13];
-extern const WORD32 ixheaacd_sine[8][13];
-extern const WORD32 ixheaacd_cosine2[2][13];
+extern const FLOAT32 ixheaacd_sine[8][8];
+extern const FLOAT32 ixheaacd_cosine[8][8];
 
-static WORD32 ixheaacd_mps_mult32_local(WORD32 a, WORD32 b, WORD16 shift) {
-  WORD64 temp;
-
-  temp = (WORD64)a * (WORD64)b;
-  temp = temp >> shift;
-  return (WORD32)temp;
-}
-
-static VOID ixheaacd_mps_hyb_filt_type1(
-    ia_cmplx_w32_struct *input, ia_cmplx_w32_struct output[8][MAX_TIME_SLOTS],
-    WORD32 num_samples, const WORD32 *filt_coeff)
-
-{
+static VOID ixheaacd_mps_hyb_filt_type1(ia_cmplx_flt_struct *input,
+                                        ia_cmplx_flt_struct output[8][MAX_TIME_SLOTS],
+                                        WORD32 num_samples, const FLOAT32 *filt_coeff) {
   WORD32 i, n, q;
 
-  WORD32 modulation_fac_re, modulation_fac_im;
-  WORD32 in_re, in_im;
-  WORD32 temp;
-  WORD32 coeff;
-  WORD64 acc_re, acc_im;
-
-  WORD16 shift = 8;
+  FLOAT32 in_re, in_im;
+  FLOAT32 coeff;
+  FLOAT32 acc_re_l, acc_re_h, acc_im_l, acc_im_h;
 
   for (i = 0; i < num_samples; i++) {
-    for (q = 0; q < 8; q++) {
-      acc_re = 0;
-      acc_im = 0;
-      for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) {
-        modulation_fac_re = ixheaacd_cosine[q][n];
-        modulation_fac_im = ixheaacd_sine[q][n];
+    FLOAT32 x0_re[13], x0_im[13], x0_1_re[8], x0_1_im[8];
+    FLOAT32 acc_re_val[8], acc_im_val[8];
+    for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) {
+      in_re = input[n + i].re;
+      in_im = input[n + i].im;
 
-        in_re = (WORD32)(input[n + i].re);
-        in_im = (WORD32)(input[n + i].im);
+      coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
 
-        in_re = ixheaacd_shl32_sat(in_re, shift);
-        in_im = ixheaacd_shl32_sat(in_im, shift);
+      x0_re[n] = coeff * in_re;
+      x0_im[n] = coeff * in_im;
+    }
 
-        coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
+    x0_1_re[0] = x0_re[6];
+    x0_1_im[0] = x0_im[6];
 
-        temp = ixheaacd_sub32_sat(
-            ixheaacd_mps_mult32_local(in_re, modulation_fac_re, 30),
-            ixheaacd_mps_mult32_local(in_im, modulation_fac_im, 30));
+    x0_1_re[1] = x0_re[7];
+    x0_1_im[1] = x0_im[7];
 
-        if (temp >= 1073741823)
-          temp = 1073741823;
-        else if (temp <= -1073741824)
-          temp = -1073741824;
+    x0_1_re[2] = x0_re[8] - x0_re[0];
+    x0_1_im[2] = x0_im[8] - x0_im[0];
 
-        temp = ixheaacd_mps_mult32_local(coeff, temp, 30);
-        acc_re = acc_re + (WORD64)temp;
+    x0_1_re[3] = x0_re[9] - x0_re[1];
+    x0_1_im[3] = x0_im[9] - x0_im[1];
 
-        temp = ixheaacd_add32_sat(
-            ixheaacd_mps_mult32_local(in_im, modulation_fac_re, 30),
-            ixheaacd_mps_mult32_local(in_re, modulation_fac_im, 30));
+    x0_1_re[4] = x0_re[10] - x0_re[2];
+    x0_1_im[4] = x0_im[10] - x0_im[2];
 
-        if (temp >= 1073741823)
-          temp = 1073741823;
-        else if (temp <= -1073741824)
-          temp = -1073741824;
+    x0_1_re[5] = x0_re[11] - x0_re[3];
+    x0_1_im[5] = x0_im[11] - x0_im[3];
 
-        temp = ixheaacd_mps_mult32_local(coeff, temp, 30);
-        acc_im = acc_im + (WORD64)temp;
-      }
+    x0_1_re[6] = x0_re[12] - x0_re[4];
+    x0_1_im[6] = x0_im[12] - x0_im[4];
 
-      output[q][i].re = (WORD32)(acc_re >> shift);
-      output[q][i].im = (WORD32)(acc_im >> shift);
+    x0_1_re[7] = -(x0_re[5]);
+    x0_1_im[7] = -(x0_im[5]);
+
+    acc_re_val[0] = x0_1_re[0];
+    acc_re_val[1] = x0_1_re[1] - x0_1_re[7];
+    acc_re_val[2] = x0_1_re[2] - x0_1_re[6];
+    acc_re_val[3] = x0_1_re[3] - x0_1_re[5];
+    acc_re_val[4] = x0_1_im[1] + x0_1_im[7];
+    acc_re_val[5] = x0_1_im[2] + x0_1_im[6];
+    acc_re_val[6] = x0_1_im[3] + x0_1_im[5];
+    acc_re_val[7] = x0_1_im[4];
+
+    acc_im_val[0] = x0_1_im[0];
+    acc_im_val[1] = x0_1_im[1] - x0_1_im[7];
+    acc_im_val[2] = x0_1_im[2] - x0_1_im[6];
+    acc_im_val[3] = x0_1_im[3] - x0_1_im[5];
+    acc_im_val[4] = x0_1_re[1] + x0_1_re[7];
+    acc_im_val[5] = x0_1_re[2] + x0_1_re[6];
+    acc_im_val[6] = x0_1_re[3] + x0_1_re[5];
+    acc_im_val[7] = x0_1_re[4];
+
+    for (q = 0; q < 4; q++) {
+      acc_re_l = 0;
+      acc_im_l = 0;
+      acc_re_h = 0;
+      acc_im_h = 0;
+
+      acc_re_l += acc_re_val[0];
+      acc_re_l += acc_re_val[1] * ixheaacd_cosine[q][1];
+      acc_re_l += acc_re_val[2] * ixheaacd_cosine[q][2];
+      acc_re_l += acc_re_val[3] * ixheaacd_cosine[q][3];
+
+      acc_re_h = acc_re_l;
+
+      acc_re_l -= acc_re_val[4] * ixheaacd_sine[q][1];
+      acc_re_l -= acc_re_val[5] * ixheaacd_sine[q][2];
+      acc_re_l -= acc_re_val[6] * ixheaacd_sine[q][3];
+      acc_re_l -= acc_re_val[7] * ixheaacd_sine[q][4];
+
+      acc_re_h = acc_re_h - (acc_re_l - acc_re_h);
+
+      acc_im_l += acc_im_val[0];
+      acc_im_l += acc_im_val[1] * ixheaacd_cosine[q][1];
+      acc_im_l += acc_im_val[2] * ixheaacd_cosine[q][2];
+      acc_im_l += acc_im_val[3] * ixheaacd_cosine[q][3];
+
+      acc_im_h = acc_im_l;
+
+      acc_im_l += acc_im_val[4] * ixheaacd_sine[q][1];
+      acc_im_l += acc_im_val[5] * ixheaacd_sine[q][2];
+      acc_im_l += acc_im_val[6] * ixheaacd_sine[q][3];
+      acc_im_l += acc_im_val[7] * ixheaacd_sine[q][4];
+
+      acc_im_h = acc_im_h - (acc_im_l - acc_im_h);
+
+      output[q][i].re = acc_re_l;
+      output[q][i].im = acc_im_l;
+
+      output[7 - q][i].re = acc_re_h;
+      output[7 - q][i].im = acc_im_h;
     }
   }
 }
 
-static VOID ixheaacd_mps_hyb_filt_type2(
-    ia_cmplx_w32_struct *input, ia_cmplx_w32_struct output[2][MAX_TIME_SLOTS],
-    WORD32 num_samples, const WORD32 *filt_coeff)
+static VOID ixheaacd_mps_hyb_filt_type2(ia_cmplx_flt_struct *input,
+                                        ia_cmplx_flt_struct output[2][MAX_TIME_SLOTS],
+                                        WORD32 num_samples, const FLOAT32 *filt_coeff) {
+  WORD32 i, n;
 
-{
-  WORD32 i, n, q;
-
-  WORD32 modulation_fac_re;
-  WORD32 in_re, in_im;
-  WORD32 temp;
-  WORD32 coeff;
-  WORD64 acc_re, acc_im;
-
-  WORD16 shift = 8;
+  FLOAT32 in_re, in_im;
+  FLOAT32 coeff;
+  FLOAT32 acc_re[2], acc_im[2];
 
   for (i = 0; i < num_samples; i++) {
-    for (q = 0; q < 2; q++) {
-      acc_re = 0;
-      acc_im = 0;
-      for (n = 0; n < QMF_HYBRID_FILT_ORDER; n++) {
-        modulation_fac_re = ixheaacd_cosine2[q][n];
+    FLOAT32 x_0_re[13], x_0_im[13];
 
-        in_re = (WORD32)(input[n + i].re);
-        in_im = (WORD32)(input[n + i].im);
+    for (n = 1; n < 6; n = n + 2) {
+      in_re = input[n + i].re;
+      in_im = input[n + i].im;
 
-        in_re = ixheaacd_shl32_sat(in_re, shift);
-        in_im = ixheaacd_shl32_sat(in_im, shift);
+      in_re += input[12 - n + i].re;
+      in_im += input[12 - n + i].im;
 
-        coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
+      coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
 
-        temp = ixheaacd_mps_mult32_local(in_re, modulation_fac_re, 30);
-
-        if (temp >= 1073741823)
-          temp = 1073741823;
-        else if (temp <= -1073741824)
-          temp = -1073741824;
-
-        temp = ixheaacd_mps_mult32_local(coeff, temp, 30);
-        acc_re = acc_re + (WORD64)temp;
-
-        temp = ixheaacd_mps_mult32_local(in_im, modulation_fac_re, 30);
-
-        if (temp >= 1073741823)
-          temp = 1073741823;
-        else if (temp <= -1073741824)
-          temp = -1073741824;
-
-        temp = ixheaacd_mps_mult32_local(coeff, temp, 30);
-        acc_im = acc_im + (WORD64)temp;
-      }
-
-      output[q][i].re = (WORD32)(acc_re >> shift);
-      output[q][i].im = (WORD32)(acc_im >> shift);
+      x_0_re[n] = coeff * in_re;
+      x_0_im[n] = coeff * in_im;
     }
+
+    n = 6;
+    in_re = input[n + i].re;
+    in_im = input[n + i].im;
+
+    coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n];
+
+    x_0_re[n] = coeff * in_re;
+    x_0_im[n] = coeff * in_im;
+
+    x_0_re[1] = x_0_re[1] + x_0_re[3] + x_0_re[5];
+    x_0_im[1] = x_0_im[1] + x_0_im[3] + x_0_im[5];
+
+    acc_re[0] = x_0_re[6] + x_0_re[1];
+    acc_im[0] = x_0_im[6] + x_0_im[1];
+
+    acc_re[1] = x_0_re[6] - x_0_re[1];
+    acc_im[1] = x_0_im[6] - x_0_im[1];
+
+    output[0][i].re = acc_re[0];
+    output[0][i].im = acc_im[0];
+
+    output[1][i].re = acc_re[1];
+    output[1][i].im = acc_im[1];
   }
 }
 
 VOID ixheaacd_mps_qmf_hybrid_analysis_init(ia_mps_hybrid_filt_struct *handle) {
   memset(handle->lf_buffer, 0,
          QMF_BANDS_TO_HYBRID * BUFFER_LEN_LF_MPS * sizeof(ia_cmplx_w32_struct));
-  memset(handle->hf_buffer, 0, MAX_NUM_QMF_BANDS_MPS * BUFFER_LEN_HF_MPS *
-                                   sizeof(ia_cmplx_flt_struct));
+  memset(handle->hf_buffer, 0,
+         MAX_NUM_QMF_BANDS_MPS * BUFFER_LEN_HF_MPS * sizeof(ia_cmplx_flt_struct));
 }
 
-VOID ixheaacd_mps_qmf_hybrid_analysis(
+VOID ixheaacd_mps_qmf_hybrid_analysis_no_pre_mix(
     ia_mps_hybrid_filt_struct *handle,
-    ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS_NEW],
-    WORD32 num_bands, WORD32 num_samples,
-    ia_cmplx_flt_struct hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]) {
+    ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS][MAX_TIME_SLOTS], WORD32 num_bands,
+    WORD32 num_samples, ia_cmplx_flt_struct v[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS]) {
   WORD32 lf_samples_shift;
   WORD32 hf_samples_shift;
   WORD32 lf_qmf_bands;
   WORD32 k, n;
 
-  ia_cmplx_w32_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS];
+  ia_cmplx_flt_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS];
 
   lf_samples_shift = BUFFER_LEN_LF_MPS - num_samples;
   hf_samples_shift = BUFFER_LEN_HF_MPS - num_samples;
@@ -191,87 +228,158 @@
   lf_qmf_bands = QMF_BANDS_TO_HYBRID;
 
   for (k = 0; k < lf_qmf_bands; k++) {
-    for (n = 0; n < lf_samples_shift; n++) {
-      handle->lf_buffer[k][n].re = handle->lf_buffer[k][n + num_samples].re;
-      handle->lf_buffer[k][n].im = handle->lf_buffer[k][n + num_samples].im;
-    }
+    memmove(&handle->lf_buffer[k][0].re, &handle->lf_buffer[k][num_samples].re,
+            2 * lf_samples_shift * sizeof(FLOAT32));
   }
 
   for (k = 0; k < lf_qmf_bands; k++) {
-    for (n = 0; n < num_samples; n++) {
-      handle->lf_buffer[k][n + lf_samples_shift].re = (WORD32)(in_qmf[n][k].re);
-      handle->lf_buffer[k][n + lf_samples_shift].im = (WORD32)(in_qmf[n][k].im);
-    }
+    memcpy(&handle->lf_buffer[k][lf_samples_shift].re, &in_qmf[k][0].re,
+           2 * num_samples * sizeof(FLOAT32));
+  }
+
+  for (k = 0; k < MAX_NUM_QMF_BANDS_SAC / 2 - lf_qmf_bands; k++) {
+    memmove(&handle->hf_buffer[k][0].re, &handle->hf_buffer[k][num_samples].re,
+            2 * hf_samples_shift * sizeof(FLOAT32));
   }
 
   for (k = 0; k < num_bands - lf_qmf_bands; k++) {
-    for (n = 0; n < hf_samples_shift; n++) {
-      handle->hf_buffer[k][n].re = handle->hf_buffer[k][n + num_samples].re;
-      handle->hf_buffer[k][n].im = handle->hf_buffer[k][n + num_samples].im;
-    }
-  }
-
-  for (k = 0; k < num_bands - lf_qmf_bands; k++) {
-    for (n = 0; n < num_samples; n++) {
-      handle->hf_buffer[k][n + hf_samples_shift].re =
-          (in_qmf[n][k + lf_qmf_bands].re);
-      handle->hf_buffer[k][n + hf_samples_shift].im =
-          (in_qmf[n][k + lf_qmf_bands].im);
-    }
+    memcpy(&handle->hf_buffer[k][hf_samples_shift].re, &in_qmf[k + lf_qmf_bands][0].re,
+           2 * num_samples * sizeof(FLOAT32));
   }
 
   ixheaacd_mps_hyb_filt_type1(
-      &(handle->lf_buffer[0][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]),
-      scratch, num_samples, ixheaacd_ia_mps_hyb_filter_coeff_8);
+      &(handle->lf_buffer[0][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
+      ixheaacd_ia_mps_hyb_filter_coeff_8);
 
   for (k = 0; k < 2; k++) {
     for (n = 0; n < num_samples; n++) {
-      hyb[n][k].re = (FLOAT32)scratch[k + 6][n].re;
-      hyb[n][k + 2].re = (FLOAT32)scratch[k][n].re;
-      hyb[n][k + 4].re = (FLOAT32)scratch[k + 2][n].re;
-      hyb[n][k + 4].re += (FLOAT32)scratch[5 - k][n].re;
+      v[n][k].re = scratch[k + 6][n].re;
+      v[n][k + 2].re = scratch[k][n].re;
+      v[n][k + 4].re = scratch[k + 2][n].re;
+      v[n][k + 4].re += scratch[5 - k][n].re;
 
-      hyb[n][k].im = (FLOAT32)scratch[k + 6][n].im;
-      hyb[n][k + 2].im = (FLOAT32)scratch[k][n].im;
-      hyb[n][k + 4].im = (FLOAT32)scratch[k + 2][n].im;
-      hyb[n][k + 4].im += (FLOAT32)scratch[5 - k][n].im;
+      v[n][k].im = scratch[k + 6][n].im;
+      v[n][k + 2].im = scratch[k][n].im;
+      v[n][k + 4].im = scratch[k + 2][n].im;
+      v[n][k + 4].im += scratch[5 - k][n].im;
     }
   }
 
   ixheaacd_mps_hyb_filt_type2(
-      &(handle->lf_buffer[1][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]),
-      scratch, num_samples, ixheaacd_mps_hyb_filter_coeff_2);
+      &(handle->lf_buffer[1][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
+      ixheaacd_mps_hyb_filter_coeff_2);
 
   for (k = 0; k < 2; k++) {
     for (n = 0; n < num_samples; n++) {
-      hyb[n][k + 6].re = (FLOAT32)scratch[1 - k][n].re;
-      hyb[n][k + 6].im = (FLOAT32)scratch[1 - k][n].im;
+      v[n][k + 6].re = scratch[1 - k][n].re;
+      v[n][k + 6].im = scratch[1 - k][n].im;
     }
   }
 
   ixheaacd_mps_hyb_filt_type2(
-      &(handle->lf_buffer[2][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]),
-      scratch, num_samples, ixheaacd_mps_hyb_filter_coeff_2);
+      &(handle->lf_buffer[2][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
+      ixheaacd_mps_hyb_filter_coeff_2);
 
   for (k = 0; k < 2; k++) {
     for (n = 0; n < num_samples; n++) {
-      hyb[n][k + 8].re = (FLOAT32)scratch[k][n].re;
-      hyb[n][k + 8].im = (FLOAT32)scratch[k][n].im;
+      v[n][k + 8].re = scratch[k][n].re;
+      v[n][k + 8].im = scratch[k][n].im;
     }
   }
 
   for (k = 0; k < num_bands - lf_qmf_bands; k++) {
     for (n = 0; n < num_samples; n++) {
-      hyb[n][k + 10].re = (handle->hf_buffer[k][n + hf_samples_shift].re);
-      hyb[n][k + 10].im = (handle->hf_buffer[k][n + hf_samples_shift].im);
+      v[n][k + 10].re = (handle->hf_buffer[k][n + hf_samples_shift].re);
+      v[n][k + 10].im = (handle->hf_buffer[k][n + hf_samples_shift].im);
     }
   }
 }
 
+VOID ixheaacd_mps_qmf_hybrid_analysis(
+    ia_mps_hybrid_filt_struct *handle,
+    ia_cmplx_flt_struct in_qmf[MAX_NUM_QMF_BANDS_MPS_NEW][MAX_TIME_SLOTS], WORD32 num_bands,
+    WORD32 num_samples, ia_cmplx_flt_struct hyb[MAX_HYBRID_BANDS_MPS][MAX_TIME_SLOTS]) {
+  WORD32 lf_samples_shift;
+  WORD32 hf_samples_shift;
+  WORD32 lf_qmf_bands;
+  WORD32 k, n;
+
+  ia_cmplx_flt_struct scratch[MAX_HYBRID_ONLY_BANDS_PER_QMF][MAX_TIME_SLOTS];
+
+  lf_samples_shift = BUFFER_LEN_LF_MPS - num_samples;
+  hf_samples_shift = BUFFER_LEN_HF_MPS - num_samples;
+
+  lf_qmf_bands = QMF_BANDS_TO_HYBRID;
+
+  for (k = 0; k < lf_qmf_bands; k++) {
+    memmove(&handle->lf_buffer[k][0].re, &handle->lf_buffer[k][num_samples].re,
+            2 * lf_samples_shift * sizeof(FLOAT32));
+  }
+
+  for (k = 0; k < lf_qmf_bands; k++) {
+    memcpy(&handle->lf_buffer[k][lf_samples_shift].re, &in_qmf[k][0].re,
+           2 * num_samples * sizeof(FLOAT32));
+  }
+
+  for (k = 0; k < MAX_NUM_QMF_BANDS_SAC / 2 - lf_qmf_bands; k++) {
+    memmove(&handle->hf_buffer[k][0].re, &handle->hf_buffer[k][num_samples].re,
+            2 * hf_samples_shift * sizeof(FLOAT32));
+  }
+
+  for (k = 0; k < num_bands - lf_qmf_bands; k++) {
+    memcpy(&handle->hf_buffer[k][hf_samples_shift].re, &in_qmf[k + lf_qmf_bands][0].re,
+           2 * num_samples * sizeof(FLOAT32));
+  }
+
+  ixheaacd_mps_hyb_filt_type1(
+      &(handle->lf_buffer[0][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
+      ixheaacd_ia_mps_hyb_filter_coeff_8);
+
+  for (k = 0; k < 2; k++) {
+    for (n = 0; n < num_samples; n++) {
+      hyb[k][n].re = scratch[k + 6][n].re;
+      hyb[k + 2][n].re = scratch[k][n].re;
+      hyb[k + 4][n].re = scratch[k + 2][n].re;
+      hyb[k + 4][n].re += scratch[5 - k][n].re;
+
+      hyb[k][n].im = scratch[k + 6][n].im;
+      hyb[k + 2][n].im = scratch[k][n].im;
+      hyb[k + 4][n].im = scratch[k + 2][n].im;
+      hyb[k + 4][n].im += scratch[5 - k][n].im;
+    }
+  }
+
+  ixheaacd_mps_hyb_filt_type2(
+      &(handle->lf_buffer[1][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
+      ixheaacd_mps_hyb_filter_coeff_2);
+
+  for (k = 0; k < 2; k++) {
+    for (n = 0; n < num_samples; n++) {
+      hyb[k + 6][n].re = scratch[1 - k][n].re;
+      hyb[k + 6][n].im = scratch[1 - k][n].im;
+    }
+  }
+
+  ixheaacd_mps_hyb_filt_type2(
+      &(handle->lf_buffer[2][lf_samples_shift + 1 - QMF_HYBRID_FILT_ORDER]), scratch, num_samples,
+      ixheaacd_mps_hyb_filter_coeff_2);
+
+  for (k = 0; k < 2; k++) {
+    for (n = 0; n < num_samples; n++) {
+      hyb[k + 8][n].re = scratch[k][n].re;
+      hyb[k + 8][n].im = scratch[k][n].im;
+    }
+  }
+
+  for (k = 0; k < num_bands - lf_qmf_bands; k++) {
+    memcpy(&hyb[k + 10][0].re, &handle->hf_buffer[k][hf_samples_shift].re,
+           2 * num_samples * sizeof(FLOAT32));
+  }
+}
+
 VOID ixheaacd_mps_qmf_hybrid_synthesis(
-    ia_cmplx_flt_struct hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS],
-    WORD32 num_bands, WORD32 num_samples,
-    ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS]) {
+    ia_cmplx_flt_struct hyb[MAX_TIME_SLOTS][MAX_HYBRID_BANDS_MPS], WORD32 num_bands,
+    WORD32 num_samples, ia_cmplx_flt_struct in_qmf[MAX_TIME_SLOTS][MAX_NUM_QMF_BANDS_MPS]) {
   WORD32 k, n;
 
   for (n = 0; n < num_samples; n++) {
@@ -289,9 +397,832 @@
     in_qmf[n][2].re = hyb[n][8].re + hyb[n][9].re;
     in_qmf[n][2].im = hyb[n][8].im + hyb[n][9].im;
 
-    for (k = 3; k < num_bands; k++) {
-      in_qmf[n][k].re = hyb[n][k - 3 + 10].re;
-      in_qmf[n][k].im = hyb[n][k - 3 + 10].im;
+    memcpy(&in_qmf[n][3].re, &hyb[n][10].re, 2 * (num_bands - 3) * sizeof(FLOAT32));
+  }
+}
+
+VOID ixheaacd_mps_fft(complex *out, LOOPINDEX idx, WORD32 nob,
+                      const ia_mps_dec_hybrid_tables_struct *hyb_tab) {
+  LOOPINDEX block_per_stage, stage_num, inner;
+  const WORD32 *cosine_array = hyb_tab->cosine_array;
+  const WORD32 *sine_array = hyb_tab->sine_array;
+  WORD32 index_1, index_2, index, tab_modifier;
+  WORD32 len, increment, i;
+
+  WORD32 cos_val;
+  WORD32 sin_val;
+
+  WORD16 index1;
+  WORD32 re_temp;
+  WORD32 im_temp;
+  WORD32 *out1_w32, *out2_w32;
+
+  len = idx;
+  i = 1;
+  increment = 0;
+
+  len = len >> 1;
+  index_1 = 0;
+  increment += 1;
+
+  index = 11 - increment;
+  tab_modifier = ixheaacd_shl32(1, index);
+
+  out1_w32 = (WORD32 *)&out[index_1];
+  out2_w32 = (WORD32 *)&out[index_1 + 1];
+
+  for (block_per_stage = 0; block_per_stage < len; block_per_stage++) {
+    re_temp = out2_w32[0];
+    im_temp = out2_w32[1];
+
+    out2_w32[0] = (out1_w32[0] - re_temp);
+    out2_w32[1] = (out1_w32[1] - im_temp);
+
+    out1_w32[0] = (re_temp + out1_w32[0]);
+    out1_w32[1] = (im_temp + out1_w32[1]);
+
+    out1_w32 += 4;
+    out2_w32 += 4;
+  }
+
+  i <<= 1;
+
+  for (stage_num = 1; stage_num < nob; stage_num++) {
+    len = len >> 1;
+    index_1 = 0;
+    increment += 1;
+
+    index = 11 - increment;
+    tab_modifier = ixheaacd_shl32(1, index);
+
+    for (block_per_stage = 0; block_per_stage < len; block_per_stage++) {
+      index_2 = index_1 + i;
+
+      out1_w32 = (WORD32 *)&out[index_1];
+      out2_w32 = (WORD32 *)&out[index_2];
+
+      re_temp = out1_w32[0];
+      im_temp = out1_w32[1];
+
+      out1_w32[0] = (re_temp + out2_w32[0]) >> 1;
+      out1_w32[1] = (im_temp + out2_w32[1]) >> 1;
+
+      out2_w32[0] = (re_temp - out2_w32[0]) >> 1;
+      out2_w32[1] = (im_temp - out2_w32[1]) >> 1;
+
+      index1 = tab_modifier;
+
+      out1_w32 += 2;
+      out2_w32 += 2;
+
+      for (inner = 0; inner < ((i - 1) << 1); inner += 2) {
+        cos_val = cosine_array[index1];
+        sin_val = sine_array[index1];
+
+        re_temp = ixheaacd_mps_mult32x16_shr_16(out2_w32[inner], cos_val) +
+                  ixheaacd_mps_mult32x16_shr_16(out2_w32[inner + 1], sin_val);
+        im_temp = ixheaacd_mps_mult32x16_shr_16(out2_w32[inner + 1], cos_val) -
+                  ixheaacd_mps_mult32x16_shr_16(out2_w32[inner], sin_val);
+
+        out1_w32[inner] >>= 1;
+        out1_w32[inner + 1] >>= 1;
+
+        out2_w32[inner] = out1_w32[inner] - re_temp;
+        out2_w32[inner + 1] = out1_w32[inner + 1] - im_temp;
+
+        out1_w32[inner] = (out1_w32[inner] + re_temp);
+        out1_w32[inner + 1] = (out1_w32[inner + 1] + im_temp);
+
+        index1 += tab_modifier;
+      }
+
+      index_1 += ixheaacd_shl32(1, increment);
     }
+    i <<= 1;
+  }
+}
+
+VOID ixheaacd_8ch_filtering(const WORD32 *p_qmf_real, const WORD32 *p_qmf_imag,
+                            WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
+                            const ia_mps_dec_hybrid_tables_struct *hyb_tab) {
+  WORD32 n;
+  WORD32 real, imag;
+  const WORD16 tcos = COS_PI_BY_8;
+  const WORD16 tsin = SIN_PI_BY_8;
+  WORD32 cum[16];
+  WORD32 *p_complex;
+  const WORD16 *p8_13 = hyb_tab->p8_13;
+
+  real = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_real[4], p8_13[4]) +
+                         ixheaacd_mult32x16in32(p_qmf_real[12], p8_13[12])),
+                        1);
+  imag = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_imag[4], p8_13[4]) +
+                         ixheaacd_mult32x16in32(p_qmf_imag[12], p8_13[12])),
+                        1);
+
+  cum[5] = imag - real;
+  cum[4] = -(imag + real);
+
+  real = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_real[3], p8_13[3]) +
+                         ixheaacd_mult32x16in32(p_qmf_real[11], p8_13[11])),
+                        1);
+  imag = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_imag[3], p8_13[3]) +
+                         ixheaacd_mult32x16in32(p_qmf_imag[11], p8_13[11])),
+                        1);
+
+  cum[13] = ixheaacd_shl32(
+      (ixheaacd_mult32x16in32(imag, tcos) - ixheaacd_mult32x16in32(real, tsin)), 1);
+  cum[12] = ixheaacd_shl32(
+      -((ixheaacd_mult32x16in32(imag, tsin) + ixheaacd_mult32x16in32(real, tcos))), 1);
+
+  cum[2] = ixheaacd_shl32(ixheaacd_mult32x16in32((p_qmf_real[2] - p_qmf_real[10]), p8_13[10]), 1);
+  cum[3] = ixheaacd_shl32(ixheaacd_mult32x16in32((p_qmf_imag[2] - p_qmf_imag[10]), p8_13[2]), 1);
+
+  real = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_real[1], p8_13[1]) +
+                         ixheaacd_mult32x16in32(p_qmf_real[9], p8_13[9])),
+                        1);
+  imag = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_imag[1], p8_13[1]) +
+                         ixheaacd_mult32x16in32(p_qmf_imag[9], p8_13[9])),
+                        1);
+
+  cum[11] = ixheaacd_shl32(
+      (ixheaacd_mult32x16in32(imag, tcos) + ixheaacd_mult32x16in32(real, tsin)), 1);
+  cum[10] = ixheaacd_shl32(
+      (ixheaacd_mult32x16in32(imag, tsin) - ixheaacd_mult32x16in32(real, tcos)), 1);
+
+  real = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_real[0], p8_13[0]) +
+                         ixheaacd_mult32x16in32(p_qmf_real[8], p8_13[8])),
+                        1);
+  imag = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_imag[0], p8_13[0]) +
+                         ixheaacd_mult32x16in32(p_qmf_imag[8], p8_13[8])),
+                        1);
+
+  cum[7] = imag + real;
+  cum[6] = imag - real;
+
+  cum[15] = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_imag[7], p8_13[14]) +
+                            ixheaacd_mult32x16in32(p_qmf_real[7], p8_13[13])),
+                           1);
+  cum[14] = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_imag[7], p8_13[13]) -
+                            ixheaacd_mult32x16in32(p_qmf_real[7], p8_13[14])),
+                           1);
+
+  cum[1] = ixheaacd_shl32(
+      ixheaacd_mult32x16in32(p_qmf_real[HYBRID_FILTER_DELAY], p8_13[HYBRID_FILTER_DELAY]), 1);
+  cum[0] = ixheaacd_shl32(
+      ixheaacd_mult32x16in32(p_qmf_imag[HYBRID_FILTER_DELAY], p8_13[HYBRID_FILTER_DELAY]), 1);
+
+  cum[9] = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_real[5], p8_13[13]) -
+                           ixheaacd_mult32x16in32(p_qmf_imag[5], p8_13[14])),
+                          1);
+  cum[8] = ixheaacd_shl32((ixheaacd_mult32x16in32(p_qmf_real[5], p8_13[14]) +
+                           ixheaacd_mult32x16in32(p_qmf_imag[5], p8_13[13])),
+                          1);
+
+  ixheaacd_mps_fft((complex *)cum, 8, 3, hyb_tab);
+
+  p_complex = cum;
+
+  for (n = 0; n < 8; n++) {
+    m_hybrid_imag[n] = *p_complex++;
+    m_hybrid_real[n] = *p_complex++;
+  }
+}
+
+VOID ixheaacd_2ch_filtering(WORD32 *p_qmf, WORD32 *m_hybrid,
+                            const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr) {
+  WORD32 cum0, cum1;
+  WORD64 temp;
+  const WORD16 *p2_6 = hyb_tab_ptr->p2_6;
+
+  cum0 = (WORD32)p_qmf[HYBRID_FILTER_DELAY] >> 1;
+
+  temp = (WORD64)((WORD64)p2_6[0] * (WORD64)(p_qmf[1] + p_qmf[11]) +
+                  (WORD64)p2_6[1] * (WORD64)(p_qmf[3] + p_qmf[9]));
+  temp += (WORD64)p2_6[2] * (WORD64)(p_qmf[5] + p_qmf[7]);
+  cum1 = (WORD32)(temp >> 16);
+
+  m_hybrid[0] = cum0 + cum1;
+  m_hybrid[1] = cum0 - cum1;
+}
+
+WORD32 ixheaacd_get_qmf_sb(
+    WORD32 hybrid_subband,
+    const ia_mps_dec_mdct2qmf_table_struct *ixheaacd_mps_dec_mdct2qmf_table) {
+  return ixheaacd_mps_dec_mdct2qmf_table->hybrid_2_qmf[hybrid_subband];
+}
+
+VOID ixheaacd_init_ana_hyb_filt_bank(ia_mps_dec_thyb_filter_state_struct *hyb_state) {
+  WORD32 k, n;
+
+  for (k = 0; k < QMF_BANDS_TO_HYBRID; k++) {
+    for (n = 0; n < PROTO_LEN - 1 + MAX_TIME_SLOTS; n++) {
+      hyb_state->buffer_lf_real[k][n] = 0;
+      hyb_state->buffer_lf_imag[k][n] = 0;
+      hyb_state->qmf_lf_real[k][n] = 0;
+      hyb_state->qmf_lf_imag[k][n] = 0;
+    }
+  }
+
+  for (k = 0; k < MAX_NUM_QMF_BANDS; k++) {
+    for (n = 0; n < ((PROTO_LEN - 1) >> 1) + MAX_TIME_SLOTS; n++) {
+      hyb_state->buffer_hf_real[k][n] = 0;
+      hyb_state->buffer_hf_imag[k][n] = 0;
+    }
+  }
+}
+
+VOID ixheaacd_apply_ana_hyb_filt_bank_create_x(
+    ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real, WORD32 *m_qmf_imag,
+    WORD32 nr_bands, WORD32 nr_samples, WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
+    const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr) {
+  WORD32 nr_samples_shift_lf;
+  WORD32 nr_qmf_bands_lf;
+  WORD32 k, n;
+  WORD32 time_slot;
+
+  WORD32 proto_len = (PROTO_LEN - 1) >> 1;
+  WORD32 val = nr_samples - proto_len;
+  WORD32 val_xhb = val * MAX_HYBRID_BANDS;
+  WORD32 loop_cnt, loop_cnt_x4;
+  WORD32 *p_qmf_real, *p_qmf_re, *p_qmf_imag, *p_qmf_im;
+
+  WORD32 m_temp_output_real[MAX_HYBRID_ONLY_BANDS_PER_QMF];
+  WORD32 m_temp_output_imag[MAX_HYBRID_ONLY_BANDS_PER_QMF];
+
+  WORD32 *p_hybrid_real = m_hybrid_real + 10;
+  WORD32 *p_hybrid_imag = m_hybrid_imag + 10;
+
+  WORD32 *p_hybrid_re, *p_hybrid_im;
+
+  nr_samples_shift_lf = BUFFER_LEN_LF - nr_samples;
+
+  nr_qmf_bands_lf = QMF_BANDS_TO_HYBRID;
+  loop_cnt = nr_bands - nr_qmf_bands_lf;
+  loop_cnt_x4 = (loop_cnt << 2);
+
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    for (n = 0; n < nr_samples_shift_lf; n++) {
+      hyb_state->buffer_lf_real[k][n] = hyb_state->buffer_lf_real[k][n + nr_samples];
+      hyb_state->buffer_lf_imag[k][n] = hyb_state->buffer_lf_imag[k][n + nr_samples];
+
+      hyb_state->qmf_lf_real[k][n] = hyb_state->qmf_lf_real[k][n + nr_samples];
+      hyb_state->qmf_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n + nr_samples];
+    }
+  }
+
+  p_qmf_real = m_qmf_real;
+  p_qmf_imag = m_qmf_imag;
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    p_qmf_re = p_qmf_real;
+    p_qmf_im = p_qmf_imag;
+
+    for (n = 0; n < nr_samples; n++) {
+      hyb_state->buffer_lf_real[k][n + nr_samples_shift_lf] = *p_qmf_re;
+      hyb_state->buffer_lf_imag[k][n + nr_samples_shift_lf] = *p_qmf_im;
+
+      hyb_state->qmf_lf_imag[k][n + nr_samples_shift_lf] = *p_qmf_im;
+      hyb_state->qmf_lf_real[k][n + nr_samples_shift_lf] = *p_qmf_re;
+
+      p_qmf_re += MAX_HYBRID_BANDS;
+      p_qmf_im += MAX_HYBRID_BANDS;
+    }
+
+    p_qmf_real++;
+    p_qmf_imag++;
+  }
+
+  p_qmf_real = m_qmf_real + nr_qmf_bands_lf + val_xhb;
+  p_qmf_imag = m_qmf_imag + nr_qmf_bands_lf + val_xhb;
+
+  for (n = 0; n < proto_len; n++) {
+    p_qmf_re = p_qmf_real;
+    p_qmf_im = p_qmf_imag;
+
+    p_hybrid_re = p_hybrid_real;
+    p_hybrid_im = p_hybrid_imag;
+
+    for (k = 0; k < loop_cnt; k++) {
+      *p_hybrid_re++ = hyb_state->buffer_hf_real[k][n];
+      *p_hybrid_im++ = hyb_state->buffer_hf_imag[k][n];
+
+      hyb_state->buffer_hf_real[k][n] = *p_qmf_re++;
+      hyb_state->buffer_hf_imag[k][n] = *p_qmf_im++;
+    }
+    p_qmf_real += MAX_HYBRID_BANDS;
+    p_qmf_imag += MAX_HYBRID_BANDS;
+
+    p_hybrid_real += MAX_HYBRID_BANDS;
+    p_hybrid_imag += MAX_HYBRID_BANDS;
+  }
+
+  p_qmf_real = m_qmf_real;
+  p_qmf_imag = m_qmf_imag;
+
+  p_hybrid_real = m_hybrid_real + 10;
+  p_hybrid_imag = m_hybrid_imag + 10;
+
+  k = proto_len * MAX_HYBRID_BANDS;
+
+  p_hybrid_re = p_hybrid_real + k;
+  p_hybrid_im = p_hybrid_imag + k;
+
+  p_qmf_re = p_qmf_real + nr_qmf_bands_lf;
+  p_qmf_im = p_qmf_imag + nr_qmf_bands_lf;
+
+  for (n = 0; n < val; n++) {
+    memcpy(p_hybrid_re, p_qmf_re, loop_cnt_x4);
+    memcpy(p_hybrid_im, p_qmf_im, loop_cnt_x4);
+
+    p_qmf_re += MAX_HYBRID_BANDS;
+    p_qmf_im += MAX_HYBRID_BANDS;
+
+    p_hybrid_re += MAX_HYBRID_BANDS;
+    p_hybrid_im += MAX_HYBRID_BANDS;
+  }
+
+  p_hybrid_real = m_hybrid_real;
+  p_hybrid_imag = m_hybrid_imag;
+
+  for (time_slot = 0; time_slot < nr_samples; time_slot++) {
+    p_hybrid_re = p_hybrid_real;
+    p_hybrid_im = p_hybrid_imag;
+
+    ixheaacd_8ch_filtering(
+        &(hyb_state->buffer_lf_real[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        &(hyb_state->buffer_lf_imag[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, m_temp_output_imag, hyb_tab_ptr);
+
+    *p_hybrid_re++ = m_temp_output_real[6];
+    *p_hybrid_re++ = m_temp_output_real[7];
+    *p_hybrid_re++ = m_temp_output_real[0];
+    *p_hybrid_re++ = m_temp_output_real[1];
+    *p_hybrid_re++ = (m_temp_output_real[2] + m_temp_output_real[5]);
+    *p_hybrid_re++ = (m_temp_output_real[3] + m_temp_output_real[4]);
+
+    *p_hybrid_im++ = m_temp_output_imag[6];
+    *p_hybrid_im++ = m_temp_output_imag[7];
+    *p_hybrid_im++ = m_temp_output_imag[0];
+    *p_hybrid_im++ = m_temp_output_imag[1];
+    *p_hybrid_im++ = (m_temp_output_imag[2] + m_temp_output_imag[5]);
+    *p_hybrid_im++ = (m_temp_output_imag[3] + m_temp_output_imag[4]);
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_real[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, hyb_tab_ptr);
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_imag[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_imag, hyb_tab_ptr);
+
+    *p_hybrid_re++ = m_temp_output_real[1];
+    *p_hybrid_re++ = m_temp_output_real[0];
+
+    *p_hybrid_im++ = m_temp_output_imag[1];
+    *p_hybrid_im++ = m_temp_output_imag[0];
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_real[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, hyb_tab_ptr);
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_imag[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_imag, hyb_tab_ptr);
+
+    *p_hybrid_re++ = m_temp_output_real[0];
+    *p_hybrid_re++ = m_temp_output_real[1];
+
+    *p_hybrid_im++ = m_temp_output_imag[0];
+    *p_hybrid_im++ = m_temp_output_imag[1];
+
+    p_hybrid_real += MAX_HYBRID_BANDS;
+    p_hybrid_imag += MAX_HYBRID_BANDS;
+  }
+
+  p_qmf_real = m_qmf_real;
+  p_qmf_imag = m_qmf_imag;
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    p_qmf_re = p_qmf_real;
+    p_qmf_im = p_qmf_imag;
+    for (n = MAX_TIME_SLOTS; n < nr_samples_shift_lf; n++) {
+      hyb_state->buffer_lf_real[k][n] = hyb_state->qmf_lf_real[k][n];
+      hyb_state->buffer_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n];
+    }
+    for (n = 0; n < nr_samples; n++) {
+      hyb_state->buffer_lf_real[k][n + nr_samples_shift_lf] = *p_qmf_re;
+      hyb_state->buffer_lf_imag[k][n + nr_samples_shift_lf] = *p_qmf_im;
+
+      p_qmf_re += MAX_HYBRID_BANDS;
+      p_qmf_im += MAX_HYBRID_BANDS;
+    }
+    p_qmf_real++;
+    p_qmf_imag++;
+  }
+}
+
+VOID ixheaacd_apply_ana_hyb_filt_bank_merge_res_decor(
+    ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real, WORD32 *m_qmf_imag,
+    WORD32 nr_bands, WORD32 nr_samples, WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
+    const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr) {
+  WORD32 nr_samples_shift_lf;
+  WORD32 nr_qmf_bands_lf;
+  WORD32 k, n;
+  WORD32 time_slot;
+
+  WORD32 m_temp_output_real[MAX_HYBRID_ONLY_BANDS_PER_QMF];
+  WORD32 m_temp_output_imag[MAX_HYBRID_ONLY_BANDS_PER_QMF];
+
+  WORD32 proto_len = (PROTO_LEN - 1) >> 1;
+  WORD32 val = nr_samples - proto_len;
+  WORD32 loop_cnt;
+
+  WORD32 *p_qmf_real = m_qmf_real;
+  WORD32 *p_qmf_imag = m_qmf_imag;
+
+  WORD32 *p_hybrid_real = m_hybrid_real + 10;
+  WORD32 *p_hybrid_imag = m_hybrid_imag + 10;
+  WORD32 *p_buffer_lf_real, *p_buffer_lf_imag;
+
+  WORD32 nr_samples_x4 = nr_samples << 2;
+
+  nr_samples_shift_lf = BUFFER_LEN_LF - nr_samples;
+
+  nr_qmf_bands_lf = QMF_BANDS_TO_HYBRID;
+  loop_cnt = nr_bands - nr_qmf_bands_lf;
+
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    for (n = 0; n < nr_samples_shift_lf; n++) {
+      hyb_state->buffer_lf_real[k][n] = hyb_state->buffer_lf_real[k][n + nr_samples];
+      hyb_state->buffer_lf_imag[k][n] = hyb_state->buffer_lf_imag[k][n + nr_samples];
+
+      hyb_state->qmf_lf_real[k][n] = hyb_state->qmf_lf_real[k][n + nr_samples];
+      hyb_state->qmf_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n + nr_samples];
+    }
+  }
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    WORD32 *qmf_real = p_qmf_real;
+    WORD32 *qmf_imag = p_qmf_imag;
+    for (n = 0; n < nr_samples; n++) {
+      hyb_state->buffer_lf_real[k][n + nr_samples_shift_lf] = *qmf_real;
+      hyb_state->buffer_lf_imag[k][n + nr_samples_shift_lf] = *qmf_imag;
+
+      hyb_state->qmf_lf_imag[k][n + nr_samples_shift_lf] = *qmf_imag++;
+      hyb_state->qmf_lf_real[k][n + nr_samples_shift_lf] = *qmf_real++;
+    }
+    p_qmf_real += MAX_TIME_SLOTS;
+    p_qmf_imag += MAX_TIME_SLOTS;
+  }
+
+  p_qmf_real = m_qmf_real + nr_qmf_bands_lf * MAX_TIME_SLOTS;
+  p_qmf_imag = m_qmf_imag + nr_qmf_bands_lf * MAX_TIME_SLOTS;
+
+  for (k = 0; k < loop_cnt; k++) {
+    WORD32 *qmf_real = p_qmf_real + val;
+    WORD32 *qmf_imag = p_qmf_imag + val;
+
+    WORD32 *hybrid_real = p_hybrid_real;
+    WORD32 *hybrid_imag = p_hybrid_imag;
+
+    for (n = 0; n < proto_len; n++) {
+      *hybrid_real = hyb_state->buffer_hf_real[k][n];
+      *hybrid_imag = hyb_state->buffer_hf_imag[k][n];
+
+      hyb_state->buffer_hf_real[k][n] = *qmf_real++;
+      hyb_state->buffer_hf_imag[k][n] = *qmf_imag++;
+
+      hybrid_real += MAX_HYBRID_BANDS;
+      hybrid_imag += MAX_HYBRID_BANDS;
+    }
+
+    p_qmf_real += MAX_TIME_SLOTS;
+    p_qmf_imag += MAX_TIME_SLOTS;
+
+    p_hybrid_real++;
+    p_hybrid_imag++;
+  }
+
+  p_qmf_real = m_qmf_real + NR_QMF_BANDS_LFXTS;
+  p_qmf_imag = m_qmf_imag + NR_QMF_BANDS_LFXTS;
+
+  p_hybrid_real = m_hybrid_real + 10;
+  p_hybrid_imag = m_hybrid_imag + 10;
+
+  for (k = 0; k < loop_cnt; k++) {
+    WORD32 *qmf_real = p_qmf_real;
+    WORD32 *qmf_imag = p_qmf_imag;
+
+    WORD32 *hybrid_real = p_hybrid_real + proto_len * MAX_HYBRID_BANDS;
+    WORD32 *hybrid_imag = p_hybrid_imag + proto_len * MAX_HYBRID_BANDS;
+
+    for (n = 0; n < val; n++) {
+      *hybrid_real = *qmf_real++;
+      *hybrid_imag = *qmf_imag++;
+
+      hybrid_real += MAX_HYBRID_BANDS;
+      hybrid_imag += MAX_HYBRID_BANDS;
+    }
+
+    p_qmf_real += MAX_TIME_SLOTS;
+    p_qmf_imag += MAX_TIME_SLOTS;
+
+    p_hybrid_real++;
+    p_hybrid_imag++;
+  }
+
+  p_hybrid_real = m_hybrid_real;
+  p_hybrid_imag = m_hybrid_imag;
+
+  for (time_slot = 0; time_slot < nr_samples; time_slot++) {
+    WORD32 *hybrid_real = p_hybrid_real;
+    WORD32 *hybrid_imag = p_hybrid_imag;
+
+    ixheaacd_8ch_filtering(
+        &(hyb_state->buffer_lf_real[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        &(hyb_state->buffer_lf_imag[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, m_temp_output_imag, hyb_tab_ptr);
+
+    *hybrid_real++ = m_temp_output_real[6];
+    *hybrid_real++ = m_temp_output_real[7];
+    *hybrid_real++ = m_temp_output_real[0];
+    *hybrid_real++ = m_temp_output_real[1];
+    *hybrid_imag++ = (m_temp_output_imag[2] + m_temp_output_imag[5]);
+    *hybrid_real++ = (m_temp_output_real[3] + m_temp_output_real[4]);
+
+    *hybrid_imag++ = m_temp_output_imag[6];
+    *hybrid_imag++ = m_temp_output_imag[7];
+    *hybrid_imag++ = m_temp_output_imag[0];
+    *hybrid_imag++ = m_temp_output_imag[1];
+    *hybrid_real++ = (m_temp_output_real[2] + m_temp_output_real[5]);
+    *hybrid_imag++ = (m_temp_output_imag[3] + m_temp_output_imag[4]);
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_real[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, hyb_tab_ptr);
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_imag[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_imag, hyb_tab_ptr);
+
+    *hybrid_real++ = m_temp_output_real[1];
+    *hybrid_real++ = m_temp_output_real[0];
+
+    *hybrid_imag++ = m_temp_output_imag[0];
+    *hybrid_imag++ = m_temp_output_imag[1];
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_real[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, hyb_tab_ptr);
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_imag[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_imag, hyb_tab_ptr);
+
+    *hybrid_real++ = m_temp_output_real[0];
+    *hybrid_real++ = m_temp_output_real[1];
+
+    *hybrid_imag++ = m_temp_output_imag[0];
+    *hybrid_imag++ = m_temp_output_imag[1];
+
+    p_hybrid_real += MAX_HYBRID_BANDS;
+    p_hybrid_imag += MAX_HYBRID_BANDS;
+  }
+
+  p_qmf_real = m_qmf_real;
+  p_qmf_imag = m_qmf_imag;
+
+  p_buffer_lf_real = &hyb_state->buffer_lf_real[0][nr_samples_shift_lf];
+  p_buffer_lf_imag = &hyb_state->buffer_lf_imag[0][nr_samples_shift_lf];
+
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    for (n = MAX_TIME_SLOTS; n < nr_samples_shift_lf; n++) {
+      hyb_state->buffer_lf_real[k][n] = hyb_state->qmf_lf_real[k][n];
+      hyb_state->buffer_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n];
+    }
+    {
+      memcpy(p_buffer_lf_real, p_qmf_real, nr_samples_x4);
+      memcpy(p_buffer_lf_imag, p_qmf_imag, nr_samples_x4);
+    }
+    p_qmf_real += MAX_TIME_SLOTS;
+    p_qmf_imag += MAX_TIME_SLOTS;
+
+    p_buffer_lf_real += BUFFER_LEN_LF;
+    p_buffer_lf_imag += BUFFER_LEN_LF;
+  }
+}
+
+VOID ixheaacd_apply_ana_hyb_filt_bank_create_x_res(
+    ia_mps_dec_thyb_filter_state_struct *hyb_state, WORD32 *m_qmf_real, WORD32 *m_qmf_imag,
+    WORD32 nr_bands, WORD32 nr_samples, WORD32 *m_hybrid_real, WORD32 *m_hybrid_imag,
+    SIZE_T *indx, WORD32 res, WORD32 hyb_bands, WORD32 num_parameter_bands, WORD32 *counter,
+    const ia_mps_dec_hybrid_tables_struct *hyb_tab_ptr) {
+  WORD32 nr_samples_shift_lf;
+  WORD32 nr_qmf_bands_lf;
+  WORD32 k, n, qs;
+  WORD32 time_slot, ch_off_set;
+  SIZE_T *idx = indx;
+
+  WORD32 proto_len = (PROTO_LEN - 1) >> 1;
+  WORD32 val = nr_samples - proto_len;
+
+  WORD32 *p_qmf_real = m_qmf_real;
+  WORD32 *p_qmf_imag = m_qmf_imag;
+  WORD32 loop_cnt;
+
+  WORD32 m_temp_output_real[MAX_HYBRID_ONLY_BANDS_PER_QMF];
+  WORD32 m_temp_output_imag[MAX_HYBRID_ONLY_BANDS_PER_QMF];
+
+  WORD32 *p_hybrid_real = m_hybrid_real + 10;
+  WORD32 *p_hybrid_imag = m_hybrid_imag + 10;
+
+  WORD32 *p_hybrid_re, *p_hybrid_im;
+
+  WORD32 *p_buffer_lf_real, *p_buffer_lf_imag;
+
+  WORD32 nr_samples_x4 = nr_samples << 2;
+
+  nr_samples_shift_lf = BUFFER_LEN_LF - nr_samples;
+
+  nr_qmf_bands_lf = QMF_BANDS_TO_HYBRID;
+  loop_cnt = nr_bands - nr_qmf_bands_lf;
+  ch_off_set = 0;
+
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    for (n = 0; n < nr_samples_shift_lf; n++) {
+      hyb_state->buffer_lf_real[k][n] = hyb_state->buffer_lf_real[k][n + nr_samples];
+      hyb_state->buffer_lf_imag[k][n] = hyb_state->buffer_lf_imag[k][n + nr_samples];
+
+      hyb_state->qmf_lf_real[k][n] = hyb_state->qmf_lf_real[k][n + nr_samples];
+      hyb_state->qmf_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n + nr_samples];
+    }
+  }
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    WORD32 *qmf_real = p_qmf_real;
+    WORD32 *qmf_imag = p_qmf_imag;
+
+    for (n = 0; n < nr_samples; n++) {
+      hyb_state->buffer_lf_real[k][n + nr_samples_shift_lf] = *qmf_real;
+      hyb_state->buffer_lf_imag[k][n + nr_samples_shift_lf] = *qmf_imag;
+
+      hyb_state->qmf_lf_imag[k][n + nr_samples_shift_lf] = *qmf_imag++;
+      hyb_state->qmf_lf_real[k][n + nr_samples_shift_lf] = *qmf_real++;
+    }
+    p_qmf_real += MAX_TIME_SLOTS;
+    p_qmf_imag += MAX_TIME_SLOTS;
+  }
+
+  p_qmf_real = m_qmf_real + NR_QMF_BANDS_LFXTS;
+  p_qmf_imag = m_qmf_imag + NR_QMF_BANDS_LFXTS;
+
+  for (k = 0; k < loop_cnt; k++) {
+    WORD32 *qmf_real = p_qmf_real + val;
+    WORD32 *qmf_imag = p_qmf_imag + val;
+
+    p_hybrid_re = p_hybrid_real;
+    p_hybrid_im = p_hybrid_imag;
+
+    for (n = 0; n < proto_len; n++) {
+      *p_hybrid_re = hyb_state->buffer_hf_real[k][n];
+      *p_hybrid_im = hyb_state->buffer_hf_imag[k][n];
+
+      hyb_state->buffer_hf_real[k][n] = *qmf_real++;
+      hyb_state->buffer_hf_imag[k][n] = *qmf_imag++;
+
+      p_hybrid_re += MAX_HYBRID_BANDS;
+      p_hybrid_im += MAX_HYBRID_BANDS;
+    }
+    p_qmf_real += MAX_TIME_SLOTS;
+    p_qmf_imag += MAX_TIME_SLOTS;
+
+    p_hybrid_real++;
+    p_hybrid_imag++;
+  }
+
+  p_qmf_real = m_qmf_real + NR_QMF_BANDS_LFXTS;
+  p_qmf_imag = m_qmf_imag + NR_QMF_BANDS_LFXTS;
+
+  p_hybrid_real = m_hybrid_real + 10;
+  p_hybrid_imag = m_hybrid_imag + 10;
+
+  for (k = 0; k < loop_cnt; k++) {
+    WORD32 *qmf_real = p_qmf_real;
+    WORD32 *qmf_imag = p_qmf_imag;
+
+    p_hybrid_re = p_hybrid_real + proto_len * MAX_HYBRID_BANDS;
+    p_hybrid_im = p_hybrid_imag + proto_len * MAX_HYBRID_BANDS;
+
+    for (n = 0; n < val; n++) {
+      *p_hybrid_re = *qmf_real++;
+      *p_hybrid_im = *qmf_imag++;
+
+      p_hybrid_re += MAX_HYBRID_BANDS;
+      p_hybrid_im += MAX_HYBRID_BANDS;
+    }
+    p_qmf_real += MAX_TIME_SLOTS;
+    p_qmf_imag += MAX_TIME_SLOTS;
+
+    p_hybrid_real++;
+    p_hybrid_imag++;
+  }
+
+  if (res == 1 && (num_parameter_bands == 20 || num_parameter_bands == 28))
+    *counter = 3;
+  else {
+    idx = indx;
+    for (qs = 0; qs < hyb_bands; qs++) {
+      if (*idx++ >= (SIZE_T)res) {
+        *counter = qs;
+        qs = hyb_bands;
+      }
+    }
+  }
+
+  p_hybrid_real = m_hybrid_real;
+  p_hybrid_imag = m_hybrid_imag;
+  for (time_slot = 0; time_slot < nr_samples; time_slot++) {
+    idx = indx;
+    p_hybrid_re = p_hybrid_real;
+    p_hybrid_im = p_hybrid_imag;
+
+    ixheaacd_8ch_filtering(
+        &(hyb_state->buffer_lf_real[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        &(hyb_state->buffer_lf_imag[0][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, m_temp_output_imag, hyb_tab_ptr);
+
+    *p_hybrid_re++ = m_temp_output_real[6];
+    *p_hybrid_re++ = m_temp_output_real[7];
+    *p_hybrid_re++ = m_temp_output_real[0];
+
+    *p_hybrid_re++ = m_temp_output_real[1];
+
+    *p_hybrid_im++ = m_temp_output_imag[6];
+    *p_hybrid_im++ = m_temp_output_imag[7];
+    *p_hybrid_im++ = m_temp_output_imag[0];
+    *p_hybrid_im++ = m_temp_output_imag[1];
+
+    if (*counter > 4) {
+      *p_hybrid_re++ = (m_temp_output_real[2] + m_temp_output_real[5]);
+      *p_hybrid_im++ = (m_temp_output_imag[2] + m_temp_output_imag[5]);
+    }
+
+    if (*counter > 5) {
+      *p_hybrid_re++ = (m_temp_output_real[3] + m_temp_output_real[4]);
+      *p_hybrid_im++ = (m_temp_output_imag[3] + m_temp_output_imag[4]);
+    }
+
+    ch_off_set = 6;
+    p_hybrid_re = p_hybrid_real + ch_off_set;
+    p_hybrid_im = p_hybrid_imag + ch_off_set;
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_real[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, hyb_tab_ptr);
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_imag[1][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_imag, hyb_tab_ptr);
+
+    *p_hybrid_re++ = m_temp_output_real[1];
+    *p_hybrid_re++ = m_temp_output_real[0];
+
+    *p_hybrid_im++ = m_temp_output_imag[1];
+    *p_hybrid_im++ = m_temp_output_imag[0];
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_real[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_real, hyb_tab_ptr);
+
+    ixheaacd_2ch_filtering(
+        &(hyb_state->buffer_lf_imag[2][time_slot + nr_samples_shift_lf + 1 - PROTO_LEN]),
+        m_temp_output_imag, hyb_tab_ptr);
+
+    *p_hybrid_re++ = m_temp_output_real[0];
+    *p_hybrid_re++ = m_temp_output_real[1];
+
+    *p_hybrid_im++ = m_temp_output_imag[0];
+    *p_hybrid_im++ = m_temp_output_imag[1];
+
+    p_hybrid_real += MAX_HYBRID_BANDS;
+    p_hybrid_imag += MAX_HYBRID_BANDS;
+  }
+  p_qmf_real = m_qmf_real;
+  p_qmf_imag = m_qmf_imag;
+
+  p_buffer_lf_real = &hyb_state->buffer_lf_real[0][nr_samples_shift_lf];
+  p_buffer_lf_imag = &hyb_state->buffer_lf_imag[0][nr_samples_shift_lf];
+
+  for (k = 0; k < nr_qmf_bands_lf; k++) {
+    for (n = MAX_TIME_SLOTS; n < nr_samples_shift_lf; n++) {
+      hyb_state->buffer_lf_real[k][n] = hyb_state->qmf_lf_real[k][n];
+      hyb_state->buffer_lf_imag[k][n] = hyb_state->qmf_lf_imag[k][n];
+    }
+    {
+      memcpy(p_buffer_lf_real, p_qmf_real, nr_samples_x4);
+      memcpy(p_buffer_lf_imag, p_qmf_imag, nr_samples_x4);
+    }
+    p_qmf_real += MAX_TIME_SLOTS;
+    p_qmf_imag += MAX_TIME_SLOTS;
+
+    p_buffer_lf_real += BUFFER_LEN_LF;
+    p_buffer_lf_imag += BUFFER_LEN_LF;
   }
 }
diff --git a/decoder/ixheaacd_mps_initfuncs.c b/decoder/ixheaacd_mps_initfuncs.c
new file mode 100644
index 0000000..060a7f5
--- /dev/null
+++ b/decoder/ixheaacd_mps_initfuncs.c
@@ -0,0 +1,1272 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_sbr_common.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_aac_rom.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_pulsedata.h"
+#include "ixheaacd_pns.h"
+#include "ixheaacd_drc_data_struct.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_lpp_tran.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_env_extr.h"
+#include "ixheaacd_audioobjtypes.h"
+#include "ixheaacd_memory_standards.h"
+#include "ixheaacd_latmdemux.h"
+#include "ixheaacd_aacdec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_struct_def.h"
+#include "ixheaacd_mps_decor.h"
+#include "ixheaacd_mps_bitdec.h"
+#include "ixheaacd_mps_mdct_2_qmf.h"
+#include "ixheaacd_mps_tonality.h"
+#include "ixheaacd_mps_reshape_bb_env.h"
+#include "ixheaacd_mps_hybfilter.h"
+#include "ixheaacd_mps_blind.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_tables.h"
+
+#define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
+
+#define ALIGN_SIZE32(x) ((((x) + 3) >> 2) << 2)
+
+WORD32 ixheaacd_getsize_mps_persistent() { return (ALIGN_SIZE64(sizeof(ia_mps_persistent_mem))); }
+
+static WORD32 ixheaacd_calc_decorr_size() {
+  WORD32 matrix_alloc_size, decorr_filter_size, num_den_size;
+  WORD32 fraction_alloc_size, ducker_create_size, decor_dec_size;
+  WORD32 state_alloc_size, alloc_size, dec_type = 0;
+
+  matrix_alloc_size =
+      2 * (MAX_HYBRID_BANDS * (MAX_TIME_SLOTS + MAX_NO_TIME_SLOTS_DELAY) * sizeof(WORD32) +
+           MAX_HYBRID_BANDS * sizeof(VOID *)) *
+      MAX_NO_DECORR_CHANNELS;
+  decorr_filter_size = MAX_NO_DECORR_CHANNELS * MAX_HYBRID_BANDS *
+                       sizeof(ia_mps_dec_decorr_filter_instance_struct);
+  num_den_size =
+      (MAX_NUM_DEN_LENGTH) * sizeof(WORD32) * MAX_NO_DECORR_CHANNELS * MAX_HYBRID_BANDS;
+
+  if (dec_type == 1)
+    fraction_alloc_size = 4 * num_den_size;
+  else
+    fraction_alloc_size = 2 * num_den_size;
+
+  state_alloc_size =
+      2 * (MAX_NUM_DEN_LENGTH) * sizeof(WORD32) * MAX_NO_DECORR_CHANNELS * MAX_HYBRID_BANDS;
+
+  ducker_create_size = MAX_NO_DECORR_CHANNELS * (sizeof(ia_mps_dec_ducker_interface) +
+                                                 sizeof(ia_mps_dec_duck_instance_struct));
+  decor_dec_size = sizeof(ia_mps_dec_decorr_dec_struct) * MAX_NO_DECORR_CHANNELS;
+
+  alloc_size = matrix_alloc_size + decorr_filter_size + fraction_alloc_size + ducker_create_size +
+               decor_dec_size + state_alloc_size;
+
+  return (2 * alloc_size);
+}
+
+WORD32 ixheaacd_mps_persistent_buffer_sizes() {
+  WORD32 buffer_size;
+
+  buffer_size = sizeof(ia_heaac_mps_state_struct);
+
+  buffer_size += PREV_GAINAT;
+
+  buffer_size += ARBDMX_ALPHA;
+
+  buffer_size += M1_PREV;
+
+  buffer_size += M1_PREV;
+
+  buffer_size += M2_PREV_DECOR;
+
+  buffer_size += M2_PREV_DECOR;
+
+  buffer_size += M2_PREV_RESID;
+
+  buffer_size += M2_PREV_RESID;
+
+  buffer_size += QMF_DELAY_INPUT;
+
+  buffer_size += QMF_DELAY_INPUT;
+
+  buffer_size += ANA_BUF_SIZE;
+
+  buffer_size += SYN_BUF_SIZE;
+
+  buffer_size += ixheaacd_calc_decorr_size();
+
+  buffer_size += HYB_FILTER_STATE_SIZE;
+
+  buffer_size += TONALITY_STATE_SIZE;
+
+  buffer_size += SMOOTHING_STATE_SIZE;
+
+  buffer_size += RESHAPE_STATE_SIZE;
+
+  buffer_size += SUBBAND_TP_SIZE;
+
+  buffer_size += BLIND_DECODER_SIZE;
+
+  buffer_size += sizeof(ia_mps_dec_spatial_bs_frame_struct);
+
+  buffer_size += ARRAY_STRUCT_SIZE;
+
+  return buffer_size;
+}
+
+VOID ixheaacd_set_mps_persistent_buffers(ia_heaac_mps_state_struct *pstr_mps_state,
+                                         WORD32 *persistent_used, WORD32 num_channel,
+                                         VOID *persistent_mem) {
+  WORD32 used_persistent = *persistent_used;
+
+  struct ia_mps_persistent_mem *mps_persistent_mem = &(pstr_mps_state->mps_persistent_mem);
+
+  WORD32 decorr_size;
+
+  num_channel = max(2, num_channel);
+
+  mps_persistent_mem->prev_gain_at = (WORD32 *)((WORD8 *)persistent_mem);
+
+  memset(mps_persistent_mem->prev_gain_at, 0, PREV_GAINAT);
+
+  used_persistent += PREV_GAINAT;
+
+  mps_persistent_mem->arbdmx_alpha_prev = (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->arbdmx_alpha_prev, 0, ARBDMX_ALPHA);
+  used_persistent += ARBDMX_ALPHA;
+
+  mps_persistent_mem->m1_param_real_prev = (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->m1_param_real_prev, 0, M1_PREV);
+  used_persistent += M1_PREV;
+
+  mps_persistent_mem->m1_param_imag_prev = (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->m1_param_imag_prev, 0, M1_PREV);
+  used_persistent += M1_PREV;
+
+  mps_persistent_mem->m2_decor_real_prev = (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->m2_decor_real_prev, 0, M2_PREV_DECOR);
+  used_persistent += M2_PREV_DECOR;
+
+  mps_persistent_mem->m2_decor_imag_prev = (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->m2_decor_imag_prev, 0, M2_PREV_DECOR);
+  used_persistent += M2_PREV_DECOR;
+
+  mps_persistent_mem->m2_resid_real_prev = (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->m2_resid_real_prev, 0, M2_PREV_RESID);
+  used_persistent += M2_PREV_RESID;
+
+  mps_persistent_mem->m2_resid_imag_prev = (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->m2_resid_imag_prev, 0, M2_PREV_RESID);
+  used_persistent += M2_PREV_RESID;
+
+  mps_persistent_mem->qmf_input_delay_real =
+      (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->qmf_input_delay_real, 0, QMF_DELAY_INPUT);
+  used_persistent += QMF_DELAY_INPUT;
+
+  mps_persistent_mem->qmf_input_delay_imag =
+      (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->qmf_input_delay_imag, 0, QMF_DELAY_INPUT);
+  used_persistent += QMF_DELAY_INPUT;
+
+  mps_persistent_mem->syn_qmf_states_buffer =
+      (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->syn_qmf_states_buffer, 0, SYN_BUF_SIZE);
+  used_persistent += SYN_BUF_SIZE;
+
+  mps_persistent_mem->ana_qmf_states_buffer =
+      (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->ana_qmf_states_buffer, 0, ANA_BUF_SIZE);
+  used_persistent += ANA_BUF_SIZE;
+
+  decorr_size = ixheaacd_calc_decorr_size();
+
+  mps_persistent_mem->decorr_ptr = (WORD32 *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->decorr_ptr, 0, decorr_size);
+  used_persistent += decorr_size;
+
+  mps_persistent_mem->hyb_filter_state =
+      (ia_mps_dec_thyb_filter_state_struct *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->hyb_filter_state, 0, HYB_FILTER_STATE_SIZE);
+  used_persistent += HYB_FILTER_STATE_SIZE;
+
+  mps_persistent_mem->ton_state =
+      (ia_mps_dec_tonality_state_struct *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->ton_state, 0, TONALITY_STATE_SIZE);
+  used_persistent += TONALITY_STATE_SIZE;
+
+  mps_persistent_mem->smooth_state =
+      (ia_mps_dec_smoothing_state_struct *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->smooth_state, 0, SMOOTHING_STATE_SIZE);
+  used_persistent += SMOOTHING_STATE_SIZE;
+
+  mps_persistent_mem->reshape_bb_env_state =
+      (ia_mps_dec_reshape_bb_env_state_struct *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->reshape_bb_env_state, 0, RESHAPE_STATE_SIZE);
+  used_persistent += RESHAPE_STATE_SIZE;
+
+  mps_persistent_mem->sub_band_params =
+      (ia_mps_dec_subband_tp_params_struct *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->sub_band_params, 0, SUBBAND_TP_SIZE);
+  used_persistent += SUBBAND_TP_SIZE;
+
+  mps_persistent_mem->blind_decoder =
+      (ia_mps_dec_blind_decoder_struct *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->blind_decoder, 0, BLIND_DECODER_SIZE);
+  used_persistent += BLIND_DECODER_SIZE;
+
+  mps_persistent_mem->p_bs_frame =
+      (ia_mps_dec_spatial_bs_frame_struct *)((WORD8 *)persistent_mem + used_persistent);
+  memset(mps_persistent_mem->p_bs_frame, 0, sizeof(ia_mps_dec_spatial_bs_frame_struct));
+  used_persistent += sizeof(ia_mps_dec_spatial_bs_frame_struct);
+
+  pstr_mps_state->array_struct =
+      (ia_mps_dec_reuse_array_struct *)((WORD8 *)persistent_mem + used_persistent);
+  memset(pstr_mps_state->array_struct, 0, ARRAY_STRUCT_SIZE);
+  used_persistent += ARRAY_STRUCT_SIZE;
+
+  *persistent_used = used_persistent;
+}
+
+VOID ixheaacd_set_scratch_buffers(ia_heaac_mps_state_struct *pstr_mps_state, VOID *scratch_mem) {
+  WORD32 scratch_used;
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+
+  p_array_struct->qmf_residual_real = scratch_mem;
+  scratch_used = QMF_RES_BUF_SIZE;
+  p_array_struct->qmf_residual_imag = (WORD32 *)((WORD8 *)scratch_mem + scratch_used);
+  scratch_used += QMF_RES_BUF_SIZE;
+
+  p_array_struct->res_mdct = (WORD32 *)((WORD8 *)scratch_mem + scratch_used);
+  scratch_used += MDCT_RES_BUF_SIZE;
+
+  p_array_struct->m_qmf_real = (WORD32 *)((WORD8 *)scratch_mem + scratch_used);
+  scratch_used += QMF_BUF_SIZE;
+  p_array_struct->m_qmf_imag = (WORD32 *)((WORD8 *)scratch_mem + scratch_used);
+  scratch_used += QMF_BUF_SIZE;
+
+  p_array_struct->buf_real = (WORD32 *)((WORD8 *)scratch_mem + scratch_used);
+  scratch_used += BUF_SIZE;
+  p_array_struct->buf_imag = (WORD32 *)((WORD8 *)scratch_mem + scratch_used);
+  scratch_used += BUF_SIZE;
+
+  p_array_struct->hyb_output_real_dry = p_array_struct->res_mdct;
+  p_array_struct->hyb_output_imag_dry =
+      p_array_struct->res_mdct + MAX_OUTPUT_CHANNELS_AT_MPS * TSXHB;
+
+  p_array_struct->x_real = p_array_struct->hyb_output_real_dry;
+  p_array_struct->x_imag = p_array_struct->hyb_output_imag_dry;
+
+  p_array_struct->time_out = p_array_struct->hyb_output_real_dry;
+
+  p_array_struct->w_dry_real = p_array_struct->m_qmf_real;
+  p_array_struct->w_dry_imag = p_array_struct->m_qmf_imag;
+
+  p_array_struct->env_dmx_0 = p_array_struct->m_qmf_real + TSXHBX5;
+  p_array_struct->env_dmx_1 = p_array_struct->env_dmx_0 + MAX_TIME_SLOTS;
+
+  p_array_struct->qmf_residual_real_pre = p_array_struct->qmf_residual_real;
+  p_array_struct->qmf_residual_real_post = p_array_struct->qmf_residual_real + RES_CHXQMFXTS;
+
+  p_array_struct->qmf_residual_imag_pre = p_array_struct->qmf_residual_imag;
+  p_array_struct->qmf_residual_imag_post = p_array_struct->qmf_residual_imag + RES_CHXQMFXTS;
+
+  p_array_struct->buffer_real = p_array_struct->qmf_residual_real_post;
+  p_array_struct->buffer_imag = p_array_struct->qmf_residual_imag_post;
+
+  p_array_struct->m1_param = (ia_mps_dec_m1_param_struct *)p_array_struct->buffer_real;
+
+  pstr_mps_state->aux_struct =
+      (ia_mps_dec_auxilary_struct *)((WORD8 *)scratch_mem + scratch_used);
+  scratch_used += sizeof(ia_mps_dec_auxilary_struct);
+
+  pstr_mps_state->aux_struct->m2_param =
+      (ia_mps_dec_m2_param_struct *)((WORD8 *)scratch_mem + scratch_used);
+  scratch_used += sizeof(ia_mps_dec_m2_param_struct);
+
+  pstr_mps_state->mps_scratch_mem_v = (VOID *)((WORD8 *)scratch_mem + scratch_used);
+}
+VOID ixheaacd_ana_filter_bank_init(ia_heaac_mps_state_struct *pstr_mps_state,
+                                   ia_mps_dec_qmf_ana_filter_bank *qmf_bank) {
+  memset(qmf_bank->qmf_states_buffer, 0,
+         QMF_FILTER_STATE_ANA_SIZE_MPS * sizeof(qmf_bank->qmf_states_buffer[0]));
+  qmf_bank->p_filter_ana =
+      pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr->ia_mps_enc_qmf_64_640;
+  qmf_bank->flag = 0;
+  qmf_bank->offset = 0;
+  qmf_bank->ref_co_eff_ptr_l = qmf_bank->p_filter_ana + 10;
+  qmf_bank->ref_co_eff_ptr_r = qmf_bank->p_filter_ana + QMF_FILTER_STATE_ANA_SIZE_MPS;
+  qmf_bank->offset_l = 5;
+  qmf_bank->offset_r = 5;
+}
+
+VOID ixheaacd_syn_filter_bank_create(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_qmf_syn_filter_bank *qmf_bank = &(pstr_mps_state->syn_qmf_bank);
+
+  memset(qmf_bank->sbr_qmf_states_synthesis, 0, SYN_BUFFER_SIZE);
+  qmf_bank->p_filter_syn =
+      pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr->ia_mps_dec_qmf_64_640;
+}
+
+static IA_ERRORCODE ixheaacd_set_m2_params(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  WORD32 up_mix_type = curr_state->up_mix_type;
+
+  switch (curr_state->tree_config) {
+    case TREE_5151:
+      if (up_mix_type == 2) {
+        curr_state->m2_param_imag_present = 1;
+
+        curr_state->m2_param_present[0][1] = 1;
+        curr_state->m2_param_present[1][1] = 1;
+        curr_state->m2_param_present[0][0] = 2;
+        curr_state->m2_param_present[1][0] = 2;
+
+        curr_state->m1_param_present[0][0] = 1;
+        curr_state->m1_param_present[1][0] = 1;
+      } else {
+        if (up_mix_type == 3) {
+          curr_state->m2_param_present[0][3] = 1;
+          curr_state->m2_param_present[1][3] = 1;
+          curr_state->m2_param_present[0][0] = 2;
+          curr_state->m2_param_present[1][0] = 2;
+
+          curr_state->m1_param_present[0][0] = 1;
+          curr_state->m1_param_present[3][0] = 1;
+        } else {
+          curr_state->m2_param_present[0][0] = 3;
+          curr_state->m2_param_present[0][1] = 3;
+          curr_state->m2_param_present[0][2] = 3;
+          curr_state->m2_param_present[0][3] = 3;
+          curr_state->m2_param_present[1][0] = 3;
+          curr_state->m2_param_present[1][1] = 3;
+          curr_state->m2_param_present[1][2] = 3;
+          curr_state->m2_param_present[1][3] = 3;
+          curr_state->m2_param_present[2][0] = 3;
+          curr_state->m2_param_present[2][1] = 3;
+          curr_state->m2_param_present[2][2] = 3;
+          curr_state->m2_param_present[3][0] = 3;
+          curr_state->m2_param_present[4][0] = 3;
+          curr_state->m2_param_present[4][1] = 3;
+          curr_state->m2_param_present[4][4] = 3;
+          curr_state->m2_param_present[5][0] = 3;
+          curr_state->m2_param_present[5][1] = 3;
+          curr_state->m2_param_present[5][4] = 3;
+
+          curr_state->m1_param_present[0][0] = 1;
+          curr_state->m1_param_present[1][0] = 1;
+          curr_state->m1_param_present[2][0] = 1;
+          curr_state->m1_param_present[3][0] = 1;
+          curr_state->m1_param_present[4][0] = 1;
+        }
+      }
+      break;
+    case TREE_5152:
+      if (up_mix_type == 2) {
+        curr_state->m2_param_imag_present = 1;
+
+        curr_state->m2_param_present[0][1] = 1;
+        curr_state->m2_param_present[1][1] = 1;
+        curr_state->m2_param_present[0][0] = 2;
+        curr_state->m2_param_present[1][0] = 2;
+
+        curr_state->m1_param_present[0][0] = 1;
+        curr_state->m1_param_present[1][0] = 1;
+      } else {
+        if (up_mix_type == 3) {
+          curr_state->m2_param_present[0][2] = 1;
+          curr_state->m2_param_present[1][2] = 1;
+          curr_state->m2_param_present[0][0] = 2;
+          curr_state->m2_param_present[1][0] = 2;
+
+          curr_state->m1_param_present[0][0] = 1;
+          curr_state->m1_param_present[2][0] = 1;
+        } else {
+          curr_state->m2_param_present[0][0] = 3;
+          curr_state->m2_param_present[0][1] = 3;
+          curr_state->m2_param_present[0][2] = 3;
+          curr_state->m2_param_present[0][3] = 3;
+          curr_state->m2_param_present[1][0] = 3;
+          curr_state->m2_param_present[1][1] = 3;
+          curr_state->m2_param_present[1][2] = 3;
+          curr_state->m2_param_present[1][3] = 3;
+          curr_state->m2_param_present[2][0] = 3;
+          curr_state->m2_param_present[2][1] = 3;
+          curr_state->m2_param_present[2][2] = 3;
+          curr_state->m2_param_present[2][4] = 3;
+          curr_state->m2_param_present[3][0] = 3;
+          curr_state->m2_param_present[3][1] = 3;
+          curr_state->m2_param_present[3][2] = 3;
+          curr_state->m2_param_present[3][4] = 3;
+          curr_state->m2_param_present[4][0] = 3;
+          curr_state->m2_param_present[4][1] = 3;
+          curr_state->m2_param_present[5][0] = 3;
+
+          curr_state->m1_param_present[0][0] = 1;
+          curr_state->m1_param_present[1][0] = 1;
+          curr_state->m1_param_present[2][0] = 1;
+          curr_state->m1_param_present[3][0] = 1;
+          curr_state->m1_param_present[4][0] = 1;
+        }
+      }
+      break;
+    case TREE_525:
+      if (up_mix_type == 1) {
+        curr_state->m2_param_present[0][3] = 1;
+        curr_state->m2_param_present[1][3] = 1;
+        curr_state->m2_param_present[2][4] = 1;
+        curr_state->m2_param_present[3][4] = 1;
+
+        curr_state->m2_param_present[0][0] = 2;
+        curr_state->m2_param_present[1][0] = 2;
+        curr_state->m2_param_present[2][1] = 2;
+        curr_state->m2_param_present[3][1] = 2;
+        curr_state->m2_param_present[4][2] = 2;
+
+        curr_state->m1_param_present[0][0] = 1;
+        curr_state->m1_param_present[0][1] = 1;
+        curr_state->m1_param_present[0][2] = 1;
+        curr_state->m1_param_present[1][0] = 1;
+        curr_state->m1_param_present[1][1] = 1;
+        curr_state->m1_param_present[1][2] = 1;
+        curr_state->m1_param_present[2][0] = 1;
+        curr_state->m1_param_present[2][1] = 1;
+        curr_state->m1_param_present[2][2] = 1;
+      } else if (up_mix_type == 2) {
+        if (curr_state->binaural_quality == 1) {
+        } else {
+          curr_state->m2_param_imag_present = 1;
+
+          curr_state->m2_param_present[0][0] = 2;
+          curr_state->m2_param_present[0][1] = 2;
+          curr_state->m2_param_present[1][0] = 2;
+          curr_state->m2_param_present[1][1] = 2;
+          if (curr_state->arbitrary_downmix == 2) {
+            curr_state->m2_param_present[0][2] = 2;
+            curr_state->m2_param_present[0][3] = 2;
+            curr_state->m2_param_present[1][2] = 2;
+            curr_state->m2_param_present[1][3] = 2;
+          }
+
+          curr_state->m1_param_present[0][0] = 1;
+          curr_state->m1_param_present[1][1] = 1;
+          curr_state->m1_param_present[2][3] = 1;
+          curr_state->m1_param_present[3][4] = 1;
+        }
+      } else {
+        curr_state->m2_param_present[0][0] = 3;
+        curr_state->m2_param_present[0][3] = 3;
+        curr_state->m2_param_present[1][0] = 3;
+        curr_state->m2_param_present[1][3] = 3;
+        curr_state->m2_param_present[2][1] = 3;
+        curr_state->m2_param_present[2][4] = 3;
+        curr_state->m2_param_present[3][1] = 3;
+        curr_state->m2_param_present[3][4] = 3;
+        curr_state->m2_param_present[4][2] = 3;
+        curr_state->m2_param_present[5][2] = 3;
+
+        curr_state->m1_param_present[0][0] = 1;
+        curr_state->m1_param_present[0][1] = 1;
+        curr_state->m1_param_present[0][2] = 1;
+        curr_state->m1_param_present[0][3] = 1;
+        curr_state->m1_param_present[0][4] = 1;
+        curr_state->m1_param_present[1][0] = 1;
+        curr_state->m1_param_present[1][1] = 1;
+        curr_state->m1_param_present[1][2] = 1;
+        curr_state->m1_param_present[1][3] = 1;
+        curr_state->m1_param_present[1][4] = 1;
+        curr_state->m1_param_present[2][0] = 1;
+        curr_state->m1_param_present[2][1] = 1;
+        curr_state->m1_param_present[2][2] = 1;
+        curr_state->m1_param_present[2][3] = 1;
+        curr_state->m1_param_present[2][4] = 1;
+      }
+      break;
+    case TREE_7271:
+      if (up_mix_type == 0) {
+        curr_state->m2_param_present[0][3] = 3;
+        curr_state->m2_param_present[0][6] = 3;
+        curr_state->m2_param_present[1][3] = 3;
+        curr_state->m2_param_present[1][6] = 3;
+        curr_state->m2_param_present[2][3] = 3;
+        curr_state->m2_param_present[3][4] = 3;
+        curr_state->m2_param_present[3][7] = 3;
+        curr_state->m2_param_present[4][4] = 3;
+        curr_state->m2_param_present[4][7] = 3;
+        curr_state->m2_param_present[5][4] = 3;
+
+        curr_state->m2_param_present[0][0] = 2;
+        curr_state->m2_param_present[1][0] = 2;
+        curr_state->m2_param_present[2][0] = 2;
+        curr_state->m2_param_present[3][1] = 2;
+        curr_state->m2_param_present[4][1] = 2;
+        curr_state->m2_param_present[5][1] = 2;
+        curr_state->m2_param_present[6][2] = 2;
+        curr_state->m2_param_present[7][2] = 2;
+
+        curr_state->m1_param_present[0][0] = 1;
+        curr_state->m1_param_present[0][1] = 1;
+        curr_state->m1_param_present[0][2] = 1;
+        curr_state->m1_param_present[0][3] = 1;
+        curr_state->m1_param_present[0][4] = 1;
+        curr_state->m1_param_present[1][0] = 1;
+        curr_state->m1_param_present[1][1] = 1;
+        curr_state->m1_param_present[1][2] = 1;
+        curr_state->m1_param_present[1][3] = 1;
+        curr_state->m1_param_present[1][4] = 1;
+        curr_state->m1_param_present[2][0] = 1;
+        curr_state->m1_param_present[2][1] = 1;
+        curr_state->m1_param_present[2][2] = 1;
+        curr_state->m1_param_present[2][3] = 1;
+        curr_state->m1_param_present[2][4] = 1;
+      } else if (up_mix_type == 2) {
+        if (curr_state->binaural_quality == 1) {
+        } else {
+          curr_state->m2_param_imag_present = 1;
+
+          curr_state->m2_param_present[0][0] = 2;
+          curr_state->m2_param_present[0][1] = 2;
+          curr_state->m2_param_present[1][0] = 2;
+          curr_state->m2_param_present[1][1] = 2;
+          if (curr_state->arbitrary_downmix == 2) {
+            curr_state->m2_param_present[0][2] = 2;
+            curr_state->m2_param_present[0][3] = 2;
+            curr_state->m2_param_present[1][2] = 2;
+            curr_state->m2_param_present[1][3] = 2;
+          }
+
+          curr_state->m1_param_present[0][0] = 1;
+          curr_state->m1_param_present[1][1] = 1;
+          curr_state->m1_param_present[2][3] = 1;
+          curr_state->m1_param_present[3][4] = 1;
+        }
+      }
+      break;
+    case TREE_7272:
+      if (up_mix_type == 0) {
+        curr_state->m2_param_present[0][3] = 3;
+        curr_state->m2_param_present[1][3] = 3;
+        curr_state->m2_param_present[1][6] = 3;
+        curr_state->m2_param_present[2][3] = 3;
+        curr_state->m2_param_present[2][6] = 3;
+        curr_state->m2_param_present[3][4] = 3;
+        curr_state->m2_param_present[4][4] = 3;
+        curr_state->m2_param_present[4][7] = 3;
+        curr_state->m2_param_present[5][4] = 3;
+        curr_state->m2_param_present[5][7] = 3;
+
+        curr_state->m2_param_present[0][0] = 2;
+        curr_state->m2_param_present[1][0] = 2;
+        curr_state->m2_param_present[2][0] = 2;
+        curr_state->m2_param_present[3][1] = 2;
+        curr_state->m2_param_present[4][1] = 2;
+        curr_state->m2_param_present[5][1] = 2;
+        curr_state->m2_param_present[6][2] = 2;
+        curr_state->m2_param_present[7][2] = 2;
+
+        curr_state->m1_param_present[0][0] = 1;
+        curr_state->m1_param_present[0][1] = 1;
+        curr_state->m1_param_present[0][2] = 1;
+        curr_state->m1_param_present[0][3] = 1;
+        curr_state->m1_param_present[0][4] = 1;
+        curr_state->m1_param_present[1][0] = 1;
+        curr_state->m1_param_present[1][1] = 1;
+        curr_state->m1_param_present[1][2] = 1;
+        curr_state->m1_param_present[1][3] = 1;
+        curr_state->m1_param_present[1][4] = 1;
+        curr_state->m1_param_present[2][0] = 1;
+        curr_state->m1_param_present[2][1] = 1;
+        curr_state->m1_param_present[2][2] = 1;
+        curr_state->m1_param_present[2][3] = 1;
+        curr_state->m1_param_present[2][4] = 1;
+      } else if (up_mix_type == 2) {
+        if (curr_state->binaural_quality == 1) {
+        } else {
+          curr_state->m2_param_imag_present = 1;
+
+          curr_state->m2_param_present[0][0] = 2;
+          curr_state->m2_param_present[0][1] = 2;
+          curr_state->m2_param_present[1][0] = 2;
+          curr_state->m2_param_present[1][1] = 2;
+          if (curr_state->arbitrary_downmix == 2) {
+            curr_state->m2_param_present[0][2] = 2;
+            curr_state->m2_param_present[0][3] = 2;
+            curr_state->m2_param_present[1][2] = 2;
+            curr_state->m2_param_present[1][3] = 2;
+          }
+
+          curr_state->m1_param_present[0][0] = 1;
+          curr_state->m1_param_present[1][1] = 1;
+          curr_state->m1_param_present[2][3] = 1;
+          curr_state->m1_param_present[3][4] = 1;
+        }
+      }
+      break;
+    case TREE_7571:
+      curr_state->m2_param_present[0][6] = 3;
+      curr_state->m2_param_present[1][6] = 3;
+      curr_state->m2_param_present[3][7] = 3;
+      curr_state->m2_param_present[4][7] = 3;
+
+      curr_state->m2_param_present[0][0] = 2;
+      curr_state->m2_param_present[1][0] = 2;
+      curr_state->m2_param_present[2][4] = 2;
+      curr_state->m2_param_present[3][1] = 2;
+      curr_state->m2_param_present[4][1] = 2;
+      curr_state->m2_param_present[5][5] = 2;
+      curr_state->m2_param_present[6][2] = 2;
+      curr_state->m2_param_present[7][3] = 2;
+
+      curr_state->m1_param_present[0][0] = 1;
+      curr_state->m1_param_present[1][1] = 1;
+      curr_state->m1_param_present[2][2] = 1;
+      curr_state->m1_param_present[3][3] = 1;
+      curr_state->m1_param_present[4][4] = 1;
+      curr_state->m1_param_present[5][5] = 1;
+      curr_state->m1_param_present[6][0] = 1;
+      curr_state->m1_param_present[7][1] = 1;
+      break;
+    case TREE_7572:
+      curr_state->m2_param_present[1][6] = 3;
+      curr_state->m2_param_present[2][6] = 3;
+      curr_state->m2_param_present[4][7] = 3;
+      curr_state->m2_param_present[5][7] = 3;
+
+      curr_state->m2_param_present[0][0] = 2;
+      curr_state->m2_param_present[1][4] = 2;
+      curr_state->m2_param_present[2][4] = 2;
+      curr_state->m2_param_present[3][1] = 2;
+      curr_state->m2_param_present[4][5] = 2;
+      curr_state->m2_param_present[5][5] = 2;
+      curr_state->m2_param_present[6][2] = 2;
+      curr_state->m2_param_present[7][3] = 2;
+
+      curr_state->m1_param_present[0][0] = 1;
+      curr_state->m1_param_present[1][1] = 1;
+      curr_state->m1_param_present[2][2] = 1;
+      curr_state->m1_param_present[3][3] = 1;
+      curr_state->m1_param_present[4][4] = 1;
+      curr_state->m1_param_present[5][5] = 1;
+      curr_state->m1_param_present[6][4] = 1;
+      curr_state->m1_param_present[7][5] = 1;
+      break;
+    default:
+      return IA_XHEAAC_MPS_DEC_EXE_FATAL_UNSUPPRORTED_TREE_CONFIG;
+      break;
+  };
+
+  return IA_NO_ERROR;
+}
+
+VOID ixheaacd_sb_tp_init(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 ch;
+  ia_mps_dec_subband_tp_params_struct *sub_band_tp =
+      pstr_mps_state->mps_persistent_mem.sub_band_params;
+  WORD32 *prev_tp_scale = sub_band_tp->prev_tp_scale;
+  WORD16 *q_prev_tp_scale = sub_band_tp->q_prev_tp_scale;
+
+  WORD32 *old_wet_ener = sub_band_tp->old_wet_ener;
+  WORD16 *q_old_wet_ener = sub_band_tp->q_old_wet_ener;
+
+  WORD32 *run_wet_ener = sub_band_tp->run_wet_ener;
+  WORD16 *q_run_wet_ener = sub_band_tp->q_run_wet_ener;
+
+  for (ch = 0; ch < MAX_OUTPUT_CHANNELS_MPS; ch++) {
+    prev_tp_scale[ch] = ONE_IN_Q15;
+    q_prev_tp_scale[ch] = 15;
+
+    old_wet_ener[ch] = ONE_IN_Q30;
+    q_old_wet_ener[ch] = 0;
+    run_wet_ener[ch] = 0;
+    q_run_wet_ener[ch] = 0;
+  }
+  for (ch = 0; ch < MAX_INPUT_CHANNELS_MPS; ch++) {
+    sub_band_tp->old_dry_ener[ch] = ONE_IN_Q30;
+    sub_band_tp->q_old_dry_ener[ch] = 0;
+    sub_band_tp->run_dry_ener[ch] = 0;
+    sub_band_tp->q_run_dry_ener[ch] = 0;
+  }
+}
+
+VOID ixheaacd_decorr_init(ia_heaac_mps_state_struct *pstr_mps_state) {
+  VOID *decorr_persistent = pstr_mps_state->mps_persistent_mem.decorr_ptr;
+  WORD32 i, k;
+  WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
+  WORD32 dec_type = pstr_mps_state->dec_type;
+
+  for (k = 0; k < MAX_NO_DECORR_CHANNELS; k++) {
+    pstr_mps_state->ap_decor[k] = decorr_persistent;
+    decorr_persistent = (WORD8 *)decorr_persistent + sizeof(ia_mps_dec_decorr_dec_struct);
+  }
+  for (k = 0; k < MAX_NO_DECORR_CHANNELS; k++) {
+    pstr_mps_state->ap_decor[k]->ducker = decorr_persistent;
+    decorr_persistent = (WORD8 *)decorr_persistent + sizeof(ia_mps_dec_ducker_interface) +
+                        sizeof(ia_mps_dec_duck_instance_struct);
+  }
+
+  for (k = 0; k < MAX_NO_DECORR_CHANNELS; k++) {
+    for (i = 0; i < hybrid_bands; i++) {
+      pstr_mps_state->ap_decor[k]->filter[i] = decorr_persistent;
+      decorr_persistent =
+          (WORD8 *)decorr_persistent + sizeof(ia_mps_dec_decorr_filter_instance_struct);
+    }
+  }
+
+  if (dec_type == 1) {
+    for (k = 0; k < MAX_NO_DECORR_CHANNELS; k++) {
+      for (i = 0; i < hybrid_bands; i++) {
+        pstr_mps_state->ap_decor[k]->filter[i]->numerator_real = decorr_persistent;
+        decorr_persistent = (WORD8 *)decorr_persistent + sizeof(WORD32) * MAX_NUM_DEN_LENGTH;
+        pstr_mps_state->ap_decor[k]->filter[i]->denominator_real = decorr_persistent;
+        decorr_persistent = (WORD8 *)decorr_persistent + sizeof(WORD32) * MAX_NUM_DEN_LENGTH;
+        pstr_mps_state->ap_decor[k]->filter[i]->numerator_imag = decorr_persistent;
+        decorr_persistent = (WORD8 *)decorr_persistent + sizeof(WORD32) * MAX_NUM_DEN_LENGTH;
+        pstr_mps_state->ap_decor[k]->filter[i]->denominator_imag = decorr_persistent;
+        decorr_persistent = (WORD8 *)decorr_persistent + sizeof(WORD32) * MAX_NUM_DEN_LENGTH;
+      }
+    }
+  } else {
+    for (k = 0; k < MAX_NO_DECORR_CHANNELS; k++) {
+      for (i = 0; i < hybrid_bands; i++) {
+        pstr_mps_state->ap_decor[k]->filter[i]->numerator_real = decorr_persistent;
+        decorr_persistent = (WORD8 *)decorr_persistent + sizeof(WORD32) * MAX_NUM_DEN_LENGTH;
+        pstr_mps_state->ap_decor[k]->filter[i]->denominator_real = decorr_persistent;
+        decorr_persistent = (WORD8 *)decorr_persistent + sizeof(WORD32) * MAX_NUM_DEN_LENGTH;
+      }
+    }
+  }
+
+  for (k = 0; k < MAX_NO_DECORR_CHANNELS; k++) {
+    for (i = 0; i < hybrid_bands; i++) {
+      pstr_mps_state->ap_decor[k]->filter[i]->state_real = decorr_persistent;
+      decorr_persistent = (WORD8 *)decorr_persistent + sizeof(WORD32) * MAX_NUM_DEN_LENGTH;
+      pstr_mps_state->ap_decor[k]->filter[i]->state_imag = decorr_persistent;
+      decorr_persistent = (WORD8 *)decorr_persistent + sizeof(WORD32) * MAX_NUM_DEN_LENGTH;
+    }
+  }
+
+  for (k = 0; k < MAX_NO_DECORR_CHANNELS; k++) {
+    pstr_mps_state->ap_decor[k]->delay_buffer_real =
+        (WORD32 **)ALIGN_SIZE64((SIZE_T)(decorr_persistent));
+    decorr_persistent = (WORD8 *)decorr_persistent + 8 * hybrid_bands;
+    for (i = 0; i < hybrid_bands; i++) {
+      pstr_mps_state->ap_decor[k]->delay_buffer_real[i] =
+          (WORD32 *)ALIGN_SIZE64((SIZE_T)(decorr_persistent));
+
+      decorr_persistent =
+          (WORD8 *)decorr_persistent + 4 * (MAX_TIME_SLOTS + MAX_NO_TIME_SLOTS_DELAY);
+    }
+
+    pstr_mps_state->ap_decor[k]->delay_buffer_imag =
+        (WORD32 **)ALIGN_SIZE64((SIZE_T)(decorr_persistent));
+    decorr_persistent = (WORD8 *)decorr_persistent + 8 * hybrid_bands;
+
+    for (i = 0; i < hybrid_bands; i++) {
+      pstr_mps_state->ap_decor[k]->delay_buffer_imag[i] =
+          (WORD32 *)ALIGN_SIZE64((SIZE_T)(decorr_persistent));
+
+      decorr_persistent =
+          (WORD8 *)decorr_persistent + 4 * (MAX_TIME_SLOTS + MAX_NO_TIME_SLOTS_DELAY);
+    }
+  }
+}
+
+VOID ixheaacd_bs_frame_init(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_spatial_bs_frame_struct *bs_frame = pstr_mps_state->bs_frame;
+
+  memset(bs_frame->ott_cld_idx_prev, 0,
+         MAX_NUM_OTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->ott_cld_idx_prev[0][0]));
+  memset(bs_frame->ott_icc_idx_prev, 0,
+         MAX_NUM_OTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->ott_icc_idx_prev[0][0]));
+  memset(bs_frame->cmp_ott_cld_idx_prev, 0,
+         MAX_NUM_OTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->cmp_ott_cld_idx_prev[0][0]));
+  memset(bs_frame->cmp_ott_icc_idx_prev, 0,
+         MAX_NUM_OTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->cmp_ott_icc_idx_prev[0][0]));
+
+  memset(bs_frame->ttt_cpc_1_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->ttt_cpc_1_idx_prev[0][0]));
+  memset(bs_frame->ttt_cpc_2_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->ttt_cpc_2_idx_prev[0][0]));
+  memset(bs_frame->ttt_cld_1_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->ttt_cld_1_idx_prev[0][0]));
+  memset(bs_frame->ttt_cld_2_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->ttt_cld_2_idx_prev[0][0]));
+  memset(bs_frame->ttt_icc_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->ttt_icc_idx_prev[0][0]));
+  memset(bs_frame->cmp_ttt_cpc_1_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->cmp_ttt_cpc_1_idx_prev[0][0]));
+  memset(bs_frame->cmp_ttt_cpc_2_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->cmp_ttt_cpc_2_idx_prev[0][0]));
+  memset(bs_frame->cmp_ttt_cld_1_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->cmp_ttt_cld_1_idx_prev[0][0]));
+  memset(bs_frame->cmp_ttt_cld_2_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->cmp_ttt_cld_2_idx_prev[0][0]));
+  memset(bs_frame->cmp_ttt_icc_idx_prev, 0,
+         MAX_NUM_TTT * MAX_PARAMETER_BANDS * sizeof(bs_frame->cmp_ttt_icc_idx_prev[0][0]));
+
+  memset(bs_frame->arbdmx_gain_idx_prev, 0,
+         MAX_INPUT_CHANNELS_MPS * MAX_PARAMETER_BANDS *
+             sizeof(bs_frame->arbdmx_gain_idx_prev[0][0]));
+  memset(bs_frame->cmp_arbdmx_gain_idx_prev, 0,
+         MAX_INPUT_CHANNELS_MPS * MAX_PARAMETER_BANDS *
+             sizeof(bs_frame->cmp_arbdmx_gain_idx_prev[0][0]));
+}
+
+IA_ERRORCODE ixheaacd_modules_init(ia_heaac_mps_state_struct *pstr_mps_state) {
+  IA_ERRORCODE err_code = IA_NO_ERROR;
+  ia_mps_dec_thyb_filter_state_struct *hyb_filter_state =
+      pstr_mps_state->mps_persistent_mem.hyb_filter_state;
+  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
+  WORD32 in_channels = pstr_mps_state->num_input_channels;
+  WORD32 n_ch;
+  if (pstr_mps_state->smooth_config) ixheaacd_init_tonality(pstr_mps_state);
+
+  if (up_mix_type != 2) {
+    if (pstr_mps_state->temp_shape_config == 2) {
+      ixheaacd_init_bb_env(pstr_mps_state);
+    }
+  }
+
+  if (pstr_mps_state->scaling_enable == 1) ixheaacd_sb_tp_init(pstr_mps_state);
+
+  err_code = ixheaacd_syn_filt_bank_init(pstr_mps_state->syn, pstr_mps_state->qmf_bands);
+
+  if (err_code != IA_NO_ERROR) return err_code;
+
+  for (n_ch = 0; n_ch < in_channels; n_ch++) {
+    ixheaacd_init_ana_hyb_filt_bank(&hyb_filter_state[n_ch]);
+  }
+
+  for (n_ch = 0; n_ch < in_channels; n_ch++) {
+    pstr_mps_state->aux_struct->arbdmx_alpha[n_ch] = 0;
+  }
+
+  memset(&pstr_mps_state->aux_struct->ttt_cld_1[0], 0, 8 * 28 * sizeof(WORD32));
+
+  if (pstr_mps_state->residual_coding) {
+    WORD32 offset = in_channels;
+    for (n_ch = 0; n_ch < pstr_mps_state->num_ott_boxes + pstr_mps_state->num_ttt_boxes; n_ch++) {
+      if (pstr_mps_state->res_bands[n_ch] > 0) {
+        ixheaacd_init_ana_hyb_filt_bank(&hyb_filter_state[offset + n_ch]);
+      }
+    }
+  }
+
+  if (pstr_mps_state->arbitrary_downmix == 2) {
+    WORD32 offset = in_channels + pstr_mps_state->num_ott_boxes + pstr_mps_state->num_ttt_boxes;
+    for (n_ch = 0; n_ch < in_channels; n_ch++) {
+      ixheaacd_init_ana_hyb_filt_bank(&hyb_filter_state[offset + n_ch]);
+    }
+  }
+  if (up_mix_type == 1) {
+    ixheaacd_init_blind(pstr_mps_state);
+  }
+
+  pstr_mps_state->parse_next_bitstream_frame = 1;
+
+  ixheaacd_bs_frame_init(pstr_mps_state);
+
+  return err_code;
+}
+
+IA_ERRORCODE ixheaacd_header_parse(ia_heaac_mps_state_struct *pstr_mps_state) {
+  IA_ERRORCODE err_code = IA_NO_ERROR;
+  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
+  WORD32 sac_header_len, alignment_bits = 0;
+  ia_bit_buf_struct *mps_bit_buf = pstr_mps_state->ptr_mps_bit_buff;
+
+  if (up_mix_type != 1) {
+    pstr_mps_state->sac_time_align_flag = ixheaacd_read_bits_buf(mps_bit_buf, 1);
+
+    sac_header_len = ixheaacd_read_bits_buf(mps_bit_buf, 7);
+    if (sac_header_len == 127) {
+      sac_header_len += ixheaacd_read_bits_buf(mps_bit_buf, 16);
+    }
+
+    err_code = ixheaacd_parse_specific_config(pstr_mps_state, sac_header_len);
+    if (err_code != IA_NO_ERROR) return err_code;
+
+    if (pstr_mps_state->bs_config.bs_temp_shape_config == 1) pstr_mps_state->scaling_enable = 1;
+
+    ixheaacd_byte_align(mps_bit_buf, &alignment_bits);
+  } else {
+    err_code = ixheaacd_default_specific_config(pstr_mps_state, pstr_mps_state->sampling_freq);
+    if (err_code != IA_NO_ERROR) return err_code;
+  }
+  return err_code;
+}
+
+IA_ERRORCODE ixheaacd_aac_mps_create(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 i, j, k;
+  WORD32 *prev_gain_at = pstr_mps_state->mps_persistent_mem.prev_gain_at;
+  IA_ERRORCODE err_code = IA_NO_ERROR;
+  WORD32 dec_type = pstr_mps_state->dec_type;
+  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
+  WORD32 in_channels = pstr_mps_state->num_input_channels;
+
+  if (pstr_mps_state == 0) return IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL;
+
+  pstr_mps_state->num_parameter_sets = 1;
+
+  for (i = 0; i < MAX_OUTPUT_CHANNELS_AT_MPS; i++) {
+    for (j = 0; j < MAX_PARAMETER_BANDS; j++) {
+      *prev_gain_at++ = ONE_IN_Q15;
+    }
+  }
+
+  for (i = 0; i < in_channels; i++) {
+    ixheaacd_ana_filter_bank_init(pstr_mps_state, &(pstr_mps_state->qmf_bank[i]));
+  }
+
+  ixheaacd_syn_filter_bank_create(pstr_mps_state);
+
+  err_code = ixheaacd_set_current_state_parameters(pstr_mps_state);
+  if (err_code != IA_NO_ERROR) return err_code;
+
+  err_code = ixheaacd_set_m2_params(pstr_mps_state);
+  if (err_code != IA_NO_ERROR) return err_code;
+
+  err_code = ixheaacd_mdct2qmf_create(pstr_mps_state);
+  if (err_code != IA_NO_ERROR) return err_code;
+
+  ixheaacd_decorr_init(pstr_mps_state);
+
+  for (k = 0; k < MAX_NO_DECORR_CHANNELS; k++) {
+    WORD32 idec;
+
+    if (up_mix_type == 3) {
+      idec = 0;
+    } else {
+      idec = k;
+    }
+
+    err_code = ixheaacd_decorr_create((pstr_mps_state->ap_decor[k]), pstr_mps_state->hybrid_bands,
+                                      idec, dec_type, pstr_mps_state->decorr_config,
+                                      &(pstr_mps_state->ia_mps_dec_mps_table));
+    if (err_code != IA_NO_ERROR) return err_code;
+  }
+
+  err_code = ixheaacd_modules_init(pstr_mps_state);
+
+  return err_code;
+}
+
+VOID ixheaacd_wf_table_init(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 const **wf = pstr_mps_state->wf_tab.wf;
+  ia_mps_dec_mps_tables_struct *mps_table_ptr = &pstr_mps_state->ia_mps_dec_mps_table;
+
+  wf[0] = NULL;
+  wf[1] = ixheaacd_mps_dec_wf_tables.wf_02;
+  wf[2] = ixheaacd_mps_dec_wf_tables.wf_03;
+  wf[3] = ixheaacd_mps_dec_wf_tables.wf_04;
+  wf[4] = NULL;
+  wf[5] = NULL;
+  wf[6] = NULL;
+  wf[7] = NULL;
+  wf[8] = NULL;
+  wf[9] = NULL;
+  wf[10] = NULL;
+  wf[11] = NULL;
+  wf[12] = NULL;
+  wf[13] = NULL;
+  wf[14] = ixheaacd_mps_dec_wf_tables.wf_15;
+  wf[15] = ixheaacd_mps_dec_wf_tables.wf_16;
+  wf[16] = NULL;
+  wf[17] = ixheaacd_mps_dec_wf_tables.wf_18;
+  wf[18] = NULL;
+  wf[19] = NULL;
+  wf[20] = NULL;
+  wf[21] = NULL;
+  wf[22] = NULL;
+  wf[23] = ixheaacd_mps_dec_wf_tables.wf_24;
+  wf[24] = NULL;
+  wf[25] = NULL;
+  wf[26] = NULL;
+  wf[27] = NULL;
+  wf[28] = NULL;
+  wf[29] = ixheaacd_mps_dec_wf_tables.wf_30;
+  wf[30] = NULL;
+  wf[31] = ixheaacd_mps_dec_wf_tables.wf_32;
+
+  mps_table_ptr->wf_tab_ptr = &(pstr_mps_state->wf_tab);
+}
+
+VOID ixheaacd_res_huff_tables_init(ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr) {
+  aac_tables_ptr->code_book[0] = 0;
+  aac_tables_ptr->code_book[1] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_1;
+  aac_tables_ptr->code_book[2] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_2;
+  aac_tables_ptr->code_book[3] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_3;
+  aac_tables_ptr->code_book[4] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_4;
+  aac_tables_ptr->code_book[5] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_5;
+  aac_tables_ptr->code_book[6] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_6;
+  aac_tables_ptr->code_book[7] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_7;
+  aac_tables_ptr->code_book[8] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_8;
+  aac_tables_ptr->code_book[9] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_9;
+  aac_tables_ptr->code_book[10] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_10;
+  aac_tables_ptr->code_book[11] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_10;
+  aac_tables_ptr->code_book[12] = aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_10;
+
+  aac_tables_ptr->scale_factor_bands_short[0] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_128;
+  aac_tables_ptr->scale_factor_bands_short[1] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_128;
+  aac_tables_ptr->scale_factor_bands_short[2] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_128;
+  aac_tables_ptr->scale_factor_bands_short[3] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_128;
+  aac_tables_ptr->scale_factor_bands_short[4] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_128;
+  aac_tables_ptr->scale_factor_bands_short[5] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_128;
+  aac_tables_ptr->scale_factor_bands_short[6] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_24_128;
+  aac_tables_ptr->scale_factor_bands_short[7] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_24_128;
+  aac_tables_ptr->scale_factor_bands_short[8] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_128;
+  aac_tables_ptr->scale_factor_bands_short[9] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_128;
+  aac_tables_ptr->scale_factor_bands_short[10] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_128;
+  aac_tables_ptr->scale_factor_bands_short[11] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_8_128;
+  aac_tables_ptr->scale_factor_bands_short[12] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_120;
+  aac_tables_ptr->scale_factor_bands_short[13] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_120;
+  aac_tables_ptr->scale_factor_bands_short[14] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_120;
+  aac_tables_ptr->scale_factor_bands_short[15] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_120;
+  aac_tables_ptr->scale_factor_bands_short[16] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_120;
+  aac_tables_ptr->scale_factor_bands_short[17] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_120;
+  aac_tables_ptr->scale_factor_bands_short[18] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_24_120;
+  aac_tables_ptr->scale_factor_bands_short[19] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_24_120;
+  aac_tables_ptr->scale_factor_bands_short[20] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_120;
+  aac_tables_ptr->scale_factor_bands_short[21] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_120;
+  aac_tables_ptr->scale_factor_bands_short[22] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_120;
+  aac_tables_ptr->scale_factor_bands_short[23] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_8_120;
+
+  aac_tables_ptr->scale_factor_bands_long[0] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_1024;
+  aac_tables_ptr->scale_factor_bands_long[1] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_1024;
+  aac_tables_ptr->scale_factor_bands_long[2] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_64_1024;
+  aac_tables_ptr->scale_factor_bands_long[3] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_1024;
+  aac_tables_ptr->scale_factor_bands_long[4] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_1024;
+  aac_tables_ptr->scale_factor_bands_long[5] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_32_1024;
+  aac_tables_ptr->scale_factor_bands_long[6] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_24_1024;
+  aac_tables_ptr->scale_factor_bands_long[7] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_24_1024;
+  aac_tables_ptr->scale_factor_bands_long[8] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_1024;
+  aac_tables_ptr->scale_factor_bands_long[9] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_1024;
+  aac_tables_ptr->scale_factor_bands_long[10] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_1024;
+  aac_tables_ptr->scale_factor_bands_long[11] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_8_1024;
+  aac_tables_ptr->scale_factor_bands_long[12] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_960;
+  aac_tables_ptr->scale_factor_bands_long[13] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_96_960;
+  aac_tables_ptr->scale_factor_bands_long[14] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_64_960;
+  aac_tables_ptr->scale_factor_bands_long[15] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_960;
+  aac_tables_ptr->scale_factor_bands_long[16] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_960;
+  aac_tables_ptr->scale_factor_bands_long[17] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_48_960;
+  aac_tables_ptr->scale_factor_bands_long[18] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_24_960;
+  aac_tables_ptr->scale_factor_bands_long[19] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_24_960;
+  aac_tables_ptr->scale_factor_bands_long[20] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_960;
+  aac_tables_ptr->scale_factor_bands_long[21] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_960;
+  aac_tables_ptr->scale_factor_bands_long[22] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_16_960;
+  aac_tables_ptr->scale_factor_bands_long[23] =
+      aac_tables_ptr->res_huffmann_tables_ptr->sfb_8_960;
+}
+
+static VOID ixheaacd_table_ptr_init(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_mps_tables_struct *mps_table_ptr = &pstr_mps_state->ia_mps_dec_mps_table;
+  ia_mps_dec_residual_aac_tables_struct *aac_table_ptr = &pstr_mps_state->aac_table;
+
+  mps_table_ptr->qmf_table_ptr = (ia_mps_dec_qmf_tables_struct *)&ixheaacd_mps_dec_qmf_tables;
+  mps_table_ptr->common_table_ptr =
+      (ia_mps_dec_common_tables_struct *)&ixheaacd_mps_dec_common_tables;
+  mps_table_ptr->hybrid_table_ptr =
+      (ia_mps_dec_hybrid_tables_struct *)&ixheaacd_mps_dec_hybrid_tables;
+  mps_table_ptr->m1_m2_table_ptr =
+      (ia_mps_dec_m1_m2_tables_struct *)&ixheaacd_mps_dec_m1_m2_tables;
+  mps_table_ptr->decor_table_ptr =
+      (ia_mps_dec_decorr_tables_struct *)&ixheaacd_mps_dec_decorr_tables;
+  mps_table_ptr->tp_process_table_ptr =
+      (ia_mps_dec_tp_process_tables_struct *)&ixheaacd_mps_dec_tp_process_tables;
+
+  mps_table_ptr->mdct2qmf_table_ptr =
+      (ia_mps_dec_mdct2qmf_table_struct *)&ixheaacd_mps_dec_mdct2qmf_table;
+
+  mps_table_ptr->tonality_table_ptr =
+      (ia_mps_dec_tonality_tables_struct *)&ixheaacd_mps_dec_tonality_tables;
+
+  mps_table_ptr->bitdec_table_ptr =
+      (ia_mps_dec_bitdec_tables_struct *)&ixheaacd_mps_dec_bitdec_tables;
+  mps_table_ptr->blind_table_ptr =
+      (ia_mps_dec_blind_tables_struct *)&ixheaacd_mps_dec_blind_tables;
+
+  mps_table_ptr->mdct2qmfcos_table_ptr =
+      (ia_mps_dec_mdct2qmf_tables_struct *)&ixheaacd_mps_dec_mdct2qmf_tables;
+  mps_table_ptr->mdct2qmfcos_tab_ptr =
+      (ia_mps_dec_mdct2qmf_cos_table_struct *)&pstr_mps_state->ia_mps_dec_mdct2qmfcos_table;
+  aac_table_ptr->res_huffmann_tables_ptr =
+      (ia_mps_dec_res_huffmann_tables_struct *)&ixheaacd_mps_dec_res_huffmann_tables;
+  aac_table_ptr->res_block_tables_ptr =
+      (ia_mps_dec_res_block_tables_struct *)&ixheaacd_mps_dec_res_block_tables;
+
+  ixheaacd_res_huff_tables_init(aac_table_ptr);
+
+  mps_table_ptr->aac_tab = aac_table_ptr;
+
+  ixheaacd_wf_table_init(pstr_mps_state);
+}
+
+IA_ERRORCODE ixheaacd_aac_mps_init(ia_exhaacplus_dec_api_struct *p_obj_mps_dec, UWORD8 *databuf,
+                                   WORD32 buffer_size, WORD32 sample_rate) {
+  WORD32 i;
+
+  VOID *buf_ptr;
+  ia_mps_persistent_mem *persistent_mem =
+      &p_obj_mps_dec->p_state_aac->heaac_mps_handle.mps_persistent_mem;
+
+  IA_ERRORCODE err_code = IA_NO_ERROR;
+  ia_heaac_mps_state_struct *curr_state = &p_obj_mps_dec->p_state_aac->heaac_mps_handle;
+  ia_mps_spatial_bs_config_struct *p_bs_config = &curr_state->bs_config;
+  curr_state->ec_flag = p_obj_mps_dec->p_state_aac->ec_enable;
+  ixheaacd_table_ptr_init(curr_state);
+
+  curr_state->ptr_mps_bit_buff =
+      ixheaacd_create_bit_buf(&curr_state->mps_bit_buf, (UWORD8 *)databuf, buffer_size);
+  curr_state->ptr_mps_bit_buff->cnt_bits += (8 * buffer_size);
+
+  curr_state->ptr_mps_bit_buff->xaac_jmp_buf = &p_obj_mps_dec->p_state_aac->xaac_jmp_buf;
+
+  if (sample_rate < 27713) {
+    curr_state->qmf_bands = 32;
+  } else if (sample_rate >= 55426) {
+    curr_state->qmf_bands = 128;
+  } else {
+    curr_state->qmf_bands = 64;
+  }
+
+  curr_state->sampling_freq = sample_rate;
+  curr_state->num_input_channels = p_obj_mps_dec->p_state_aac->p_config->ui_n_channels;
+  curr_state->bits_per_sample = p_obj_mps_dec->p_state_aac->p_config->ui_pcm_wdsz;
+  curr_state->dec_type = p_bs_config->ui_dec_type;
+  curr_state->up_mix_type = p_bs_config->ui_upmix_type;
+  curr_state->binaural_quality = p_bs_config->ui_binaural_quality;
+  curr_state->hrtf_model = p_bs_config->ui_hrtf_model;
+  curr_state->is_buried_flag = p_bs_config->ui_bs_is_buried;
+
+  curr_state->bs_frame = persistent_mem->p_bs_frame;
+
+  buf_ptr = persistent_mem->syn_qmf_states_buffer;
+  curr_state->syn = buf_ptr;
+
+  curr_state->syn_qmf_bank.sbr_qmf_states_synthesis =
+      (WORD32 *)((WORD8 *)buf_ptr + sizeof(ia_mps_dec_synthesis_interface));
+
+  buf_ptr = persistent_mem->ana_qmf_states_buffer;
+
+  memset(curr_state->m2_param_present, 0,
+         MAX_M2_OUTPUT * MAX_M2_INPUT * sizeof(curr_state->m2_param_present[0][0]));
+  memset(&(curr_state->bs_config), 0, sizeof(ia_mps_spatial_bs_config_struct));
+  memset(&(curr_state->res_block_type), 0,
+         sizeof(WORD32) * MAX_RESIDUAL_CHANNELS_MPS * MAX_RESIDUAL_FRAMES);
+
+  curr_state->bs_config.ui_pcm_wdsz = 16;
+  curr_state->bs_config.ui_samp_freq = 48000;
+  curr_state->bs_config.ui_in_channels = 2;
+  curr_state->bs_config.ui_qmf_bands = 64;
+
+  err_code = ixheaacd_header_parse(curr_state);
+  if (err_code != IA_NO_ERROR) return err_code;
+
+  for (i = 0; i < curr_state->num_input_channels; i++) {
+    curr_state->qmf_bank[i].qmf_states_buffer = buf_ptr;
+    buf_ptr = (WORD8 *)buf_ptr + QMF_FILTER_STATE_ANA_SIZE_MPS * sizeof(WORD32);
+  }
+
+  curr_state->i_bytes_consumed_mps = (WORD32)(curr_state->ptr_mps_bit_buff->ptr_read_next -
+                                              curr_state->ptr_mps_bit_buff->ptr_bit_buf_base);
+
+  curr_state->bytes_remaining = buffer_size - curr_state->i_bytes_consumed_mps;
+
+  if (curr_state->bytes_remaining != 0) {
+    for (WORD32 ii = 0; ii < curr_state->bytes_remaining; ii++) {
+      curr_state->temp_buf[ii] = databuf[ii + curr_state->i_bytes_consumed_mps];
+    }
+  }
+
+  err_code = ixheaacd_aac_mps_create(curr_state);
+  if (err_code != IA_NO_ERROR) return err_code;
+
+  curr_state->mps_init_done = 1;
+  curr_state->first_frame = 1;
+
+  return err_code;
+}
diff --git a/decoder/ixheaacd_mps_interface.h b/decoder/ixheaacd_mps_interface.h
index 0ca9892..664c60b 100644
--- a/decoder/ixheaacd_mps_interface.h
+++ b/decoder/ixheaacd_mps_interface.h
@@ -20,15 +20,21 @@
 #ifndef IXHEAACD_MPS_INTERFACE_H
 #define IXHEAACD_MPS_INTERFACE_H
 
-WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len,
+#define FIVE_POINT_ONE_CHANNEL_MASK (0x3F)
+#define SEVEN_POINT_ONE_CHANNEL_MASK1 (0xFF)
+#define SEVEN_POINT_ONE_CHANNEL_MASK2 (0x33F)
+
+IA_ERRORCODE ixheaacd_parse_frame(ia_heaac_mps_state_struct *pstr_mps_state);
+
+WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct *self, WORD32 bs_frame_len,
                            WORD32 residual_coding,
-                           ia_usac_dec_mps_config_struct* usac_mps_config);
+                           ia_usac_dec_mps_config_struct *usac_mps_config);
 
 IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct* self,
                                         WORD32 independency_flag,
-                                        ia_handle_bit_buf_struct it_bit_buff);
+                                        ia_bit_buf_struct *it_bit_buff);
 
-WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, FLOAT32** pointers[4],
+WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct *self, FLOAT32 **pointers[4],
                           FLOAT32 (*out_samples)[4096]);
 
-#endif
+#endif /* IXHEAACD_MPS_INTERFACE_H */
diff --git a/decoder/ixheaacd_mps_m1m2.h b/decoder/ixheaacd_mps_m1m2.h
new file mode 100644
index 0000000..3cceed5
--- /dev/null
+++ b/decoder/ixheaacd_mps_m1m2.h
@@ -0,0 +1,33 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_M1M2_H
+#define IXHEAACD_MPS_M1M2_H
+
+VOID ixheaacd_calc_m1m2(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_mps_apply_m1(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_apply_m2(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_buffer_m1(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_buffer_m2(ia_heaac_mps_state_struct *pstr_mps_state);
+
+#endif /* IXHEAACD_MPS_M1M2_H */
diff --git a/decoder/ixheaacd_mps_m1m2_common.c b/decoder/ixheaacd_mps_m1m2_common.c
new file mode 100644
index 0000000..3febb98
--- /dev/null
+++ b/decoder/ixheaacd_mps_m1m2_common.c
@@ -0,0 +1,281 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_bitdec.h"
+#include "ixheaacd_mps_calc_m1m2_tree_config.h"
+
+VOID ixheaacd_buffer_m1(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 pb, row, col;
+
+  ia_mps_persistent_mem *persistent_mem = &pstr_mps_state->mps_persistent_mem;
+  WORD32 *m1_param_real_prev = persistent_mem->m1_param_real_prev;
+  WORD32 *m1_param_imag_prev = persistent_mem->m1_param_imag_prev;
+
+  WORD32 *m1_param_real, *m1_param_imag;
+
+  WORD32 *p_m1_param_real, *p_m1_param_re;
+
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 num_v_channels = pstr_mps_state->num_v_channels;
+  WORD32 num_x_channels = pstr_mps_state->num_x_channels;
+  WORD32 m1_param_imag_present = pstr_mps_state->m1_param_imag_present;
+
+  WORD32 num_parameter_sets_prev;
+
+  pstr_mps_state->num_parameter_sets_prev = pstr_mps_state->num_parameter_sets;
+  num_parameter_sets_prev = pstr_mps_state->num_parameter_sets_prev;
+
+  if (m1_param_imag_present) {
+    WORD32 *p_m1_param_imag = &m1_param->m1_param_imag[0][0][0][0];
+    p_m1_param_real = &m1_param->m1_param_real[0][0][0][0];
+    for (row = 0; row < num_v_channels; row++) {
+      WORD32 *p_m1_param_im = p_m1_param_imag;
+      p_m1_param_re = p_m1_param_real;
+
+      for (col = 0; col < num_x_channels; col++) {
+        m1_param_real = p_m1_param_re + (num_parameter_sets_prev - 1) * MAX_PARAMETER_BANDS;
+        m1_param_imag = p_m1_param_im + (num_parameter_sets_prev - 1) * MAX_PARAMETER_BANDS;
+
+        for (pb = 0; pb < num_parameter_bands; pb++) {
+          *m1_param_real_prev++ = *m1_param_real++;
+          *m1_param_imag_prev++ = *m1_param_imag++;
+        }
+        p_m1_param_re += PBXPS;
+        p_m1_param_im += PBXPS;
+      }
+      p_m1_param_real += MAX_INPUT_CHANNELS_MPS * PBXPS;
+      p_m1_param_imag += MAX_INPUT_CHANNELS_MPS * PBXPS;
+    }
+  } else {
+    p_m1_param_real = &m1_param->m1_param_real[0][0][0][0];
+    for (row = 0; row < num_v_channels; row++) {
+      p_m1_param_re = p_m1_param_real;
+      for (col = 0; col < num_x_channels; col++) {
+        m1_param_real = p_m1_param_re + (num_parameter_sets_prev - 1) * MAX_PARAMETER_BANDS;
+        for (pb = 0; pb < num_parameter_bands; pb++) *m1_param_real_prev++ = *m1_param_real++;
+
+        p_m1_param_re += PBXPS;
+      }
+      p_m1_param_real += MAX_INPUT_CHANNELS_MPS * PBXPS;
+    }
+  }
+}
+
+VOID ixheaacd_buffer_m2(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 num_direct_signals = pstr_mps_state->num_direct_signals;
+  WORD32 pb, row, col, col_counter = num_direct_signals + pstr_mps_state->num_decor_signals;
+
+  ia_mps_persistent_mem *persistent_mem = &pstr_mps_state->mps_persistent_mem;
+  ia_mps_dec_m2_param_struct *m2_param = pstr_mps_state->aux_struct->m2_param;
+
+  WORD32 *m2_decor_real_prev = persistent_mem->m2_decor_real_prev;
+  WORD32 *m2_decor_imag_prev = persistent_mem->m2_decor_imag_prev;
+
+  WORD32 *m2_resid_real_prev = persistent_mem->m2_resid_real_prev;
+  WORD32 *m2_resid_imag_prev = persistent_mem->m2_resid_imag_prev;
+
+  WORD32 *m2_decor_real, *m2_decor_imag, *m2_resid_real, *m2_resid_imag;
+  WORD32 idx = -1;
+
+  WORD32 resid_col_counter;
+
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 num_output_channels = pstr_mps_state->num_output_channels;
+  WORD32 num_parameter_sets_prev = pstr_mps_state->num_parameter_sets_prev;
+
+  if (pstr_mps_state->residual_coding)
+    resid_col_counter = col_counter;
+  else
+    resid_col_counter = num_direct_signals;
+
+  if (pstr_mps_state->m2_param_imag_present) {
+    for (row = 0; row < num_output_channels; row++) {
+      for (col = num_direct_signals; col < col_counter; col++) {
+        if (pstr_mps_state->m2_param_present[row][col] & 1) {
+          idx++;
+          m2_decor_real = &m2_param->m2_decor_real[idx][num_parameter_sets_prev - 1][0];
+
+          for (pb = 0; pb < num_parameter_bands; pb++) *m2_decor_real_prev++ = *m2_decor_real++;
+
+          m2_decor_imag = &m2_param->m2_decor_imag[idx][num_parameter_sets_prev - 1][0];
+
+          for (pb = 0; pb < num_parameter_bands; pb++) *m2_decor_imag_prev++ = *m2_decor_imag++;
+        }
+      }
+    }
+
+    idx = -1;
+    for (row = 0; row < num_output_channels; row++) {
+      for (col = 0; col < resid_col_counter; col++) {
+        if (pstr_mps_state->m2_param_present[row][col] & 2) {
+          idx++;
+          m2_resid_real = &m2_param->m2_resid_real[idx][num_parameter_sets_prev - 1][0];
+
+          for (pb = 0; pb < num_parameter_bands; pb++) *m2_resid_real_prev++ = *m2_resid_real++;
+          m2_resid_imag = &m2_param->m2_resid_imag[idx][num_parameter_sets_prev - 1][0];
+          for (pb = 0; pb < num_parameter_bands; pb++) *m2_resid_imag_prev++ = *m2_resid_imag++;
+        }
+      }
+    }
+  } else {
+    for (row = 0; row < num_output_channels; row++) {
+      for (col = num_direct_signals; col < col_counter; col++) {
+        if (pstr_mps_state->m2_param_present[row][col] & 1) {
+          idx++;
+          m2_decor_real = &m2_param->m2_decor_real[idx][num_parameter_sets_prev - 1][0];
+
+          for (pb = 0; pb < num_parameter_bands; pb++) *m2_decor_real_prev++ = *m2_decor_real++;
+        }
+      }
+    }
+
+    idx = -1;
+    for (row = 0; row < num_output_channels; row++) {
+      for (col = 0; col < resid_col_counter; col++) {
+        if (pstr_mps_state->m2_param_present[row][col] & 2) {
+          idx++;
+          m2_resid_real = &m2_param->m2_resid_real[idx][num_parameter_sets_prev - 1][0];
+
+          for (pb = 0; pb < num_parameter_bands; pb++) *m2_resid_real_prev++ = *m2_resid_real++;
+        }
+      }
+    }
+  }
+}
+
+static VOID ixheaacd_update_alpha(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 alpha;
+
+  WORD32 *arbdmx_alpha_prev = pstr_mps_state->mps_persistent_mem.arbdmx_alpha_prev;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 *arbdmx_alpha = p_aux_struct->arbdmx_alpha;
+
+  WORD32 n_ch_in = pstr_mps_state->num_input_channels;
+  WORD32 ch;
+
+  for (ch = 0; ch < n_ch_in; ch++) {
+    *arbdmx_alpha_prev++ = arbdmx_alpha[ch];
+
+    if (pstr_mps_state->arbitrary_downmix == 2) {
+      alpha = arbdmx_alpha[ch];
+
+      if (p_aux_struct->arbdmx_residual_abs[ch]) {
+        alpha -= POINT_THREE_THREE_Q15;
+
+        if (alpha < 0) alpha = 0;
+      } else {
+        alpha += POINT_THREE_THREE_Q15;
+
+        if (alpha > ONE_IN_Q15) alpha = ONE_IN_Q15;
+      }
+    } else {
+      alpha = ONE_IN_Q15;
+    }
+
+    arbdmx_alpha[ch] = alpha;
+  }
+}
+
+VOID ixheaacd_calc_m1m2(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
+  WORD32 binaural_quality = pstr_mps_state->binaural_quality;
+
+  if (pstr_mps_state->arbitrary_downmix != 0) {
+    ixheaacd_update_alpha(pstr_mps_state);
+  }
+
+  switch (pstr_mps_state->tree_config) {
+    case TREE_5151: {
+      if (up_mix_type == 3) {
+        ixheaacd_calc_m1m2_51s1(pstr_mps_state);
+      } else {
+        ixheaacd_calc_m1m2_5151(pstr_mps_state);
+      }
+    } break;
+    case TREE_5152: {
+      if (up_mix_type == 3) {
+        ixheaacd_calc_m1m2_51s2(pstr_mps_state);
+      } else {
+        ixheaacd_calc_m1m2_5152(pstr_mps_state);
+      }
+    } break;
+    case TREE_525:
+      if (up_mix_type == 1) {
+        ixheaacd_calc_m1m2_emm(pstr_mps_state);
+      } else if (up_mix_type == 2) {
+        if (binaural_quality == 1) {
+          ixheaacd_calc_m1m2_5227(pstr_mps_state);
+        }
+      } else {
+        ixheaacd_calc_m1m2_5251(pstr_mps_state);
+      }
+      break;
+    case TREE_7271:
+      if (up_mix_type == 0) {
+        ixheaacd_calc_m1m2_7271(pstr_mps_state);
+      } else if (up_mix_type == 2) {
+        if (binaural_quality == 1) {
+          ixheaacd_calc_m1m2_5227(pstr_mps_state);
+        }
+      }
+      break;
+    case TREE_7272:
+      if (up_mix_type == 0) {
+        ixheaacd_calc_m1m2_7272(pstr_mps_state);
+      } else if (up_mix_type == 2) {
+        if (binaural_quality == 1) {
+          ixheaacd_calc_m1m2_5227(pstr_mps_state);
+        }
+      }
+      break;
+    case TREE_7571:
+      ixheaacd_calc_m1m2_7571(pstr_mps_state);
+      break;
+    case TREE_7572:
+      ixheaacd_calc_m1m2_7572(pstr_mps_state);
+      break;
+    default:
+      break;
+  };
+
+  return;
+}
diff --git a/decoder/ixheaacd_mps_macro_def.h b/decoder/ixheaacd_mps_macro_def.h
new file mode 100644
index 0000000..1501716
--- /dev/null
+++ b/decoder/ixheaacd_mps_macro_def.h
@@ -0,0 +1,216 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_MACRO_DEF_H
+#define IXHEAACD_MPS_MACRO_DEF_H
+
+#define SQRT_TWO_Q15 (46341)
+#define SQRT_THREE_Q15 (56784)
+
+#define ONE_BY_THREE_Q15 (10923)
+#define TWO_BY_THREE_Q15 (21845)
+#define MINUS_ONE_BY_THREE_Q15 (-10923)
+#define ONE_BY_SQRT_2_Q15 (23170)
+#define ONE_BY_SQRT_8_Q15 (11585)
+#define ONE_BY_FIVE_Q16 (13107)
+#define TWO_PI_IN_Q15 (205887)
+#define MINUS_PI_BY_EIGHT_Q15 (-12868)
+#define TWO_PI_BY_FIFTEEN_Q15 (13726)
+#define THIRTYONE_BY_TWO_IN_Q25 (520093696)
+
+#define MINUS_ONE_IN_Q15 (-32768)
+#define MINUS_ONE_IN_Q14 (-16384)
+#define ONE_IN_Q13 (8192)
+#define ONE_IN_Q14 (16384)
+#define ONE_IN_Q15 (32768)
+#define ONE_IN_Q16 (65536)
+#define ONE_IN_Q30 (1073741824)
+#define FOUR_IN_Q15 (131072)
+#define ONE_BY_SQRT_3_Q15 (18919)
+#define ONE_BY_NINE_Q16 (7282)
+#define MINUS_SQRT_2_Q30 (-1518500250)
+#define THIRTY_IN_Q16 (1966080)
+
+#define ONE_IN_Q28 (268435456)
+
+#define ONE_IN_Q25 (33554432)
+
+#define ONE_FORTYNINE_Q15 (4882432)
+
+#define MINUS_POINT_NINE_EIGHT_Q15 (-32113)
+
+#define MINUS_POINT_NINE_NINE_Q15 (-32440)
+
+#define POINT_THREE_THREE_Q15 (10813)
+
+#define POINT_EIGHT_Q15 (26214)
+
+#define ONE_BY_SQRT_TWO_Q30 (759250125)
+
+#define POINT_FOUR_TWO_Q15 (13763)
+
+#define POINT_ONE_Q15 (3277)
+
+#define POINT_NINE_Q15 (29491)
+
+#define SUM_SIZE (2048)
+
+#define RES_CHXQMFXTSX4 (184320)
+
+#define RES_CHXQMFXTS (46080)
+
+#define NR_QMF_BANDS_LFXTS (216)
+
+#define QMF_BANDSXTSX6 (27648)
+
+#define LOOP_COUNTER (32)
+
+#define MAX_PSXPB (224)
+
+#define SYN_BUFFER_SIZE (18432)
+
+#define QBXTSX2 (9216)
+
+#define PARAMETER_BANDSX2 (56)
+
+#define PARAMETER_BANDSX3 (84)
+
+#define PARAMETER_BANDSX1_5 (42)
+
+#define QMF_BANDSX8 (512)
+
+#define QBXTS (4608)
+
+#define QBXTSX3 (13824)
+
+#define TWO_BY_TWENTYFIVE_Q16 (5243)
+
+#define QBX48 (3072)
+
+#define TSXHB (5112)
+
+#define MAX_TIMESLOTSX2 (144)
+
+#define RESHAPE_OFFSET_1 (18)
+
+#define RESHAPE_OFFSET_2 (54)
+
+#define PB_OFFSET (9)
+
+#define SCRATCH_OFFSET_SMOOTHING (176)
+
+#define MAX_TIME_SLOTSX12 (864)
+
+#define INPUT_CHX2 (12)
+
+#define INPUT_CHX1_5 (9)
+
+#define OUTPUT_CHX1_5 (20)
+
+#define OUTPUT_CHX3 (41)
+
+#define IN_CH_2XOUT_CH (32)
+
+#define IN_CHXBP_SIZE (150)
+
+#define OUT_CHXQB (512)
+
+#define MAX_PARAMETER_BANDS_PLUS_1 (29)
+
+#define PARAMETER_BANDSX52 (1456)
+
+#define PARAMETER_BANDSX16 (448)
+
+#define PARAMETER_BANDSX18 (504)
+
+#define PARAMETER_BANDSX15 (420)
+
+#define PARAMETER_BANDSX32 (896)
+
+#define PARAMETER_BANDSX12 (336)
+
+#define PARAMETER_BANDSX56 (1568)
+
+#define PARAMETER_BANDSX24 (672)
+
+#define PREV_GAINAT (5824)
+
+#define ARBDMX_ALPHA (24)
+
+#define M1_PREV (5376)
+
+#define M2_PREV_RESID (2128)
+
+#define M2_PREV_DECOR (1680)
+
+#define QMF_DELAY_INPUT (7680)
+
+#define ANA_BUF_SIZE (15360)
+
+#define SYN_BUF_SIZE (18432 + sizeof(ia_mps_dec_synthesis_interface))
+
+#define PBXPS (224)
+
+#define MAX_NUM_DEN_LENGTH (21)
+
+#define HYB_FILTER_STATE_SIZE sizeof(ia_mps_dec_thyb_filter_state_struct) * 16
+
+#define TONALITY_STATE_SIZE sizeof(ia_mps_dec_tonality_state_struct)
+
+#define SMOOTHING_STATE_SIZE sizeof(ia_mps_dec_smoothing_state_struct)
+
+#define RESHAPE_STATE_SIZE sizeof(ia_mps_dec_reshape_bb_env_state_struct)
+
+#define SUBBAND_TP_SIZE sizeof(ia_mps_dec_subband_tp_params_struct)
+
+#define BLIND_DECODER_SIZE sizeof(ia_mps_dec_blind_decoder_struct)
+
+#define ARRAY_STRUCT_SIZE sizeof(ia_mps_dec_reuse_array_struct)
+
+#define QMF_RES_BUF_SIZE (368640)
+
+#define QMF_BUF_SIZE (110592)
+
+#define BUF_SIZE (163584)
+
+#define MDCT_RES_BUF_SIZE (327680)
+
+#define PCXQB (320)
+
+#define RFX2XMDCTCOEF (8192)
+
+#define MDCTCOEFX2 (2048)
+
+#define TSXHBX5 (25560)
+
+#define INCHXPBXPS (1344)
+
+#define ONE_BIT_MASK (0x00000001)
+#define TWO_BIT_MASK (0x00000003)
+#define THREE_BIT_MASK (0x00000007)
+#define FOUR_BIT_MASK (0x0000000F)
+#define FIVE_BIT_MASK (0x0000001F)
+#define SIX_BIT_MASK (0x0000003F)
+#define SEVEN_BIT_MASK (0x0000007F)
+#define WORD_LENGTH (32)
+
+#define COS_PI_BY_8 (0x7642)
+#define SIN_PI_BY_8 (0x30fc)
+
+#endif /* IXHEAACD_MPS_MACRO_DEF_H */
diff --git a/decoder/ixheaacd_mps_mdct_2_qmf.c b/decoder/ixheaacd_mps_mdct_2_qmf.c
new file mode 100644
index 0000000..aa7a555
--- /dev/null
+++ b/decoder/ixheaacd_mps_mdct_2_qmf.c
@@ -0,0 +1,1848 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_mdct_2_qmf.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+
+IA_ERRORCODE ixheaacd_mdct2qmf_tables_init(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 time_slots;
+
+  time_slots = pstr_mps_state->upd_qmf;
+
+  if (32 == time_slots) {
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[0] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_00;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[1] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_01;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[2] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_02;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[3] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_03;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[4] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_04;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[5] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_05;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[6] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_06;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[7] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_07;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[8] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_08;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[9] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_09;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[10] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_10;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[11] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_11;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[12] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_12;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[13] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_13;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[14] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_14;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[15] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_15;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[16] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_15;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[17] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_14;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[18] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_13;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[19] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_12;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[20] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_11;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[21] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_10;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[22] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_09;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[23] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_08;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[24] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_07;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[25] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_06;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[26] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_05;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[27] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_04;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[28] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_03;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[29] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_02;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[30] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_01;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[31] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_00;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[32] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_16;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[33] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_17;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[34] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_18;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[35] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_19;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[36] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_20;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[37] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_21;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[38] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_22;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[39] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_23;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[40] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_24;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[41] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_25;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[42] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_26;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[43] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_27;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[44] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_28;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[45] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_29;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[46] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_30;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[47] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_31;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[48] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_31;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[49] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_30;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[50] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_29;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[51] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_28;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[52] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_27;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[53] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_26;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[54] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_25;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[55] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_24;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[56] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_23;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[57] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_22;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[58] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_21;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[59] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_20;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[60] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_19;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[61] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_18;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[62] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_17;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[63] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_32_16;
+
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[0] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_4_00;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[1] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_4_01;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[2] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_4_01;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[3] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_4_00;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[4] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_4_02;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[5] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_4_03;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[6] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_4_03;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[7] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_4_02;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[8] = NULL;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[9] = NULL;
+  } else {
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[0] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_2_00;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[1] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_2_00;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[2] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_2_01;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[3] =
+        pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_2_01;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[4] = NULL;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[5] = NULL;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[6] = NULL;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[7] = NULL;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[8] = NULL;
+    pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[9] = NULL;
+
+    if (30 == time_slots) {
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[0] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[1] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[2] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[3] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[4] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[5] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[6] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[7] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[8] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[9] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[10] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[11] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[12] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[13] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[14] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[15] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[16] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[17] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[18] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[19] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[20] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[21] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[22] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[23] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[24] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[25] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[26] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[27] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[28] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[29] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[30] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_15;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[31] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_16;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[32] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_17;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[33] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_18;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[34] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_19;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[35] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_20;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[36] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_21;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[37] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_22;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[38] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_23;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[39] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_24;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[40] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_25;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[41] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_26;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[42] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_27;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[43] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_28;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[44] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_29;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[45] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_29;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[46] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_28;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[47] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_27;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[48] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_26;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[49] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_25;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[50] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_24;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[51] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_23;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[52] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_22;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[53] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_21;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[54] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_20;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[55] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_19;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[56] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_18;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[57] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_17;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[58] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_16;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[59] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_30_15;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[60] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[61] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[62] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[63] = NULL;
+    } else if (24 == time_slots) {
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[0] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[1] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[2] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[3] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[4] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[5] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[6] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[7] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[8] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[9] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[10] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[11] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[12] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[13] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[14] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[15] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[16] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[17] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[18] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[19] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[20] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[21] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[22] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[23] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[24] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[25] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[26] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[27] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_15;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[28] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_16;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[29] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_17;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[30] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_18;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[31] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_19;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[32] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_20;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[33] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_21;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[34] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_22;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[35] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_23;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[36] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_23;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[37] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_22;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[38] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_21;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[39] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_20;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[40] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_19;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[41] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_18;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[42] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_17;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[43] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_16;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[44] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_15;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[45] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[46] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[47] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_24_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[48] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[49] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[50] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[51] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[52] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[53] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[54] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[55] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[56] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[57] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[58] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[59] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[60] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[61] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[62] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[63] = NULL;
+    } else if (18 == time_slots) {
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[0] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[1] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[2] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[3] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[4] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[5] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[6] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[7] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[8] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[9] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[10] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[11] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[12] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[13] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[14] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[15] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[16] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[17] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[18] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[19] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[20] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[21] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[22] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[23] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[24] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_15;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[25] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_16;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[26] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_17;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[27] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_17;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[28] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_16;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[29] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_15;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[30] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[31] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[32] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[33] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[34] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[35] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_18_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[36] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[37] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[38] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[39] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[40] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[41] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[42] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[43] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[44] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[45] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[46] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[47] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[48] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[49] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[50] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[51] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[52] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[53] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[54] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[55] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[56] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[57] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[58] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[59] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[60] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[61] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[62] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[63] = NULL;
+    } else if (16 == time_slots) {
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[0] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[1] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[2] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[3] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[4] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[5] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[6] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[7] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[8] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[9] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[10] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[11] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[12] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[13] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[14] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[15] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[16] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[17] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[18] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[19] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[20] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[21] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[22] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[23] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_15;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[24] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_15;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[25] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[26] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[27] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[28] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[29] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[30] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[31] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_16_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[32] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[33] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[34] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[35] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[36] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[37] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[38] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[39] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[40] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[41] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[42] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[43] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[44] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[45] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[46] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[47] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[48] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[49] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[50] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[51] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[52] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[53] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[54] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[55] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[56] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[57] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[58] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[59] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[60] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[61] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[62] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[63] = NULL;
+    } else if (15 == time_slots) {
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[0] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[1] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[2] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[3] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[4] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[5] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[6] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[7] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_06;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[8] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_05;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[9] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_04;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[10] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_03;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[11] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[12] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[13] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[14] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[15] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[16] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[17] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[18] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[19] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[20] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[21] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[22] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_14;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[23] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_13;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[24] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_12;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[25] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_11;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[26] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_10;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[27] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_09;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[28] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_08;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[29] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_long_15_07;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[30] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[31] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[32] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[33] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[34] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[35] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[36] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[37] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[38] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[39] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[40] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[41] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[42] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[43] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[44] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[45] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[46] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[47] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[48] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[49] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[50] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[51] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[52] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[53] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[54] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[55] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[56] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[57] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[58] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[59] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[60] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[61] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[62] = NULL;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_long[63] = NULL;
+
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[4] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_3_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[5] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_3_00;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[6] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_3_01;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[7] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_3_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[8] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_3_02;
+      pstr_mps_state->ia_mps_dec_mdct2qmfcos_table.cos_table_short[9] =
+          pstr_mps_state->ia_mps_dec_mps_table.mdct2qmfcos_table_ptr->cos_table_short_3_01;
+    } else {
+      if (pstr_mps_state->residual_coding) return IA_XHEAAC_MPS_DEC_EXE_FATAL_INVALID_TIMESLOTS;
+    }
+  }
+
+  return IA_NO_ERROR;
+}
+
+IA_ERRORCODE ixheaacd_mdct2qmf_create(ia_heaac_mps_state_struct *pstr_mps_state) {
+  IA_ERRORCODE error_code = IA_NO_ERROR;
+
+  WORD32 *qmf_residual_real = pstr_mps_state->array_struct->qmf_residual_real_pre;
+  WORD32 *qmf_residual_imag = pstr_mps_state->array_struct->qmf_residual_imag_pre;
+
+  memset(qmf_residual_real, 0, RES_CHXQMFXTSX4);
+  memset(qmf_residual_imag, 0, RES_CHXQMFXTSX4);
+
+  error_code = ixheaacd_mdct2qmf_tables_init(pstr_mps_state);
+
+  return error_code;
+}
+
+static VOID ixheaacd_local_zero(WORD32 const l, WORD32 *const b) {
+  WORD32 i;
+
+  for (i = 0; i < l; i++) {
+    b[i] = 0;
+  }
+}
+
+static VOID ixheaacd_local_fold_out(WORD32 *const s, WORD32 const lv, WORD32 *const w,
+                                    WORD32 const l_w, WORD32 *const v_main,
+                                    WORD32 *const v_slave) {
+  WORD32 n;
+  WORD32 i;
+  WORD32 j;
+  WORD32 k;
+
+  WORD32 temp_1;
+
+  WORD32 *w1;
+  WORD32 *w2;
+  WORD32 *w3;
+  WORD32 *w4;
+  WORD32 *ptr1, *ptr2, *ptr3;
+
+  WORD32 m = l_w >> 1;
+  WORD32 l = lv / m;
+  WORD32 m2w = m >> 1;
+  WORD32 m2a = m - m2w;
+
+  for (i = m; i < lv; i += l_w) {
+    for (n = i + l_w; i < n; i++) {
+      s[i] = -s[i];
+    }
+  }
+
+  w1 = &w[-m2a];
+  w2 = &w[m2w];
+  w3 = &w[m2w];
+  w4 = &w[m + m2w];
+
+  for (n = 0, j = 0, k = m; n < l - 1; n++) {
+    for (i = 0; i < m2a; i++, j++, k++) {
+      v_main[k] = ixheaacd_mps_mult32_shr_30(w2[i], s[k]);
+      v_slave[j] = ixheaacd_mps_mult32_shr_30(w4[i], s[k]);
+    }
+
+    for (; i < m; i++, j++, k++) {
+      v_main[j] = ixheaacd_mps_mult32_shr_30(w3[i], s[j]);
+      v_slave[k] = ixheaacd_mps_mult32_shr_30(w1[i], s[j]);
+    }
+  }
+
+  ptr1 = v_main;
+  ptr2 = v_slave + m - 1;
+  ptr3 = s;
+  for (i = 0; i < m2a; i++) {
+    temp_1 = *ptr3++;
+    *ptr1++ = ixheaacd_mps_mult32_shr_30(*w2++, temp_1);
+    *ptr2-- = ixheaacd_mps_mult32_shr_30(*w4++, temp_1);
+  }
+
+  j = l * m - m2w;
+  k = l * m - m2a - 1;
+  ptr3 = s + l * m - m;
+  ptr1 = v_main + j;
+  ptr2 = v_slave + k;
+
+  w1 += m2a;
+  for (; i < m; i++, j++) {
+    temp_1 = *ptr3++;
+    *ptr1++ = ixheaacd_mps_mult32_shr_30(*w2++, temp_1);
+    *ptr2-- = ixheaacd_mps_mult32_shr_30(*w1++, temp_1);
+  }
+}
+
+static VOID ixheaacd_local_imdet(
+    WORD32 *x1, WORD32 *x2, WORD32 *const scale1, WORD32 const val, WORD32 *z_real,
+    WORD32 *z_imag, const ia_mps_dec_mdct2qmf_cos_table_struct *ia_mps_dec_mdct2qmfcos_tab,
+    WORD32 is_long, VOID *scratch) {
+  WORD32 lw = val << 1;
+  WORD32 offset = val - (val >> 1);
+
+  WORD32 temp_1, temp3, temp_2;
+  WORD32 *z_real_2, *z_imag_2;
+  WORD32 *px1, *px2, *px3, *px4;
+  const WORD16 *cp, *sp;
+  WORD32 *scale;
+  WORD32 cnt = val + (val >> 1);
+
+  WORD32 k;
+  WORD32 n, j;
+
+  WORD32 l;
+
+  WORD32 *p_sum = scratch;
+  WORD32 *p_diff = (WORD32 *)scratch + SUM_SIZE;
+
+  z_real_2 = z_real + lw;
+  z_imag_2 = z_imag + lw;
+
+  for (l = 0; l < LOOP_COUNTER; l++) {
+    WORD32 *sum = p_sum;
+    WORD32 *diff = p_diff;
+
+    px1 = x1;
+    px2 = x2 + val - 1;
+    px3 = x2 + val;
+    px4 = x1 + 2 * val - 1;
+
+    for (n = 0; n < val; n++) {
+      *sum++ = *px1 + *px2;
+      *sum++ = *px3 + *px4;
+      *diff++ = *px1++ - *px2--;
+      *diff++ = *px3++ - *px4--;
+    }
+
+    scale = scale1;
+    for (k = 0; k < cnt; k++) {
+      if (1 == is_long) {
+        cp = ia_mps_dec_mdct2qmfcos_tab->cos_table_long[k];
+        sp = cp + val;
+      } else {
+        cp = ia_mps_dec_mdct2qmfcos_tab->cos_table_short[k + is_long];
+        sp = cp + val;
+      }
+
+      sum = p_sum;
+      diff = p_diff;
+
+      temp_1 = *cp++;
+      temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *sum);
+      sum++;
+      *z_real = temp_2;
+
+      temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *sum);
+      sum++;
+      *z_real_2 = temp_2;
+
+      temp_1 = *--sp;
+      temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *diff);
+      diff++;
+      *z_imag = temp_2;
+
+      temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *diff);
+      diff++;
+      *z_imag_2 = temp_2;
+      for (n = 1; n < val; n++) {
+        temp_1 = *cp++;
+        temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *sum);
+        sum++;
+        *z_real += temp_2;
+
+        temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *sum);
+        sum++;
+        *z_real_2 += temp_2;
+
+        temp_1 = *--sp;
+        temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *diff);
+        diff++;
+        *z_imag += temp_2;
+
+        temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, *diff);
+        diff++;
+        *z_imag_2 += temp_2;
+      }
+      z_real++;
+      z_imag++;
+      z_real_2++;
+      z_imag_2++;
+    }
+    z_real -= cnt;
+    z_real_2 -= cnt;
+    z_imag -= cnt;
+    z_imag_2 -= cnt;
+
+    for (j = 0; j < (cnt); j++) {
+      *z_real = ixheaacd_mps_mult32_shr_15(*z_real, *scale);
+      z_real++;
+      *z_imag = ixheaacd_mps_mult32_shr_15(*z_imag, *scale);
+      z_imag++;
+      *z_real_2 = ixheaacd_mps_mult32_shr_15(*z_real_2, *scale);
+      z_real_2++;
+      *z_imag_2 = ixheaacd_mps_mult32_shr_15(*z_imag_2, *scale);
+      scale++;
+      z_imag_2++;
+    }
+
+    for (; k < lw; k++) {
+      if (1 == is_long) {
+        cp = ia_mps_dec_mdct2qmfcos_tab->cos_table_long[k];
+        sp = cp + val;
+      } else {
+        cp = ia_mps_dec_mdct2qmfcos_tab->cos_table_short[k + is_long];
+        sp = cp + val;
+      }
+
+      sum = p_sum;
+      diff = p_diff;
+
+      temp_1 = *cp++;
+
+      temp3 = ixheaacd_mps_mult32_shr_15(temp_1, *sum);
+      sum++;
+      *z_real = temp3;
+
+      temp3 = ixheaacd_mps_mult32_shr_15(temp_1, *sum);
+      sum++;
+      *z_real_2 = temp3;
+
+      temp_1 = *--sp;
+      temp3 = ixheaacd_mps_mult32_shr_15(temp_1, *diff);
+      diff++;
+      *z_imag = temp3;
+
+      temp3 = ixheaacd_mps_mult32_shr_15(temp_1, *diff);
+      diff++;
+      *z_imag_2 = temp3;
+
+      for (n = 1; n < val; n++) {
+        temp_1 = *cp++;
+        temp3 = ixheaacd_mps_mult32_shr_15(temp_1, *sum);
+        sum++;
+        *z_real += temp3;
+
+        temp3 = ixheaacd_mps_mult32_shr_15(temp_1, *sum);
+        sum++;
+        *z_real_2 += temp3;
+
+        temp_1 = *--sp;
+        temp3 = ixheaacd_mps_mult32_shr_15(temp_1, *diff);
+        diff++;
+        *z_imag += temp3;
+
+        temp3 = ixheaacd_mps_mult32_shr_15(temp_1, *diff);
+        diff++;
+        *z_imag_2 += temp3;
+      }
+
+      z_real++;
+      z_imag++;
+      z_real_2++;
+      z_imag_2++;
+    }
+    z_real -= offset;
+    z_real_2 -= offset;
+    z_imag -= offset;
+    z_imag_2 -= offset;
+
+    for (j = 0; j < (offset); j++) {
+      temp_1 = (*scale++) * -1;
+      *z_real = ixheaacd_mps_mult32_shr_15(*z_real, temp_1);
+      z_real++;
+      *z_imag = ixheaacd_mps_mult32_shr_15(*z_imag, temp_1);
+      z_imag++;
+      *z_real_2 = ixheaacd_mps_mult32_shr_15(*z_real_2, temp_1);
+      z_real_2++;
+      *z_imag_2 = ixheaacd_mps_mult32_shr_15(*z_imag_2, temp_1);
+      z_imag_2++;
+    }
+
+    x1 += lw;
+    x2 += lw;
+
+    z_real += lw;
+    z_imag += lw;
+    z_imag_2 += lw;
+    z_real_2 += lw;
+  }
+}
+
+static VOID ixheaacd_local_hybcmdct2qmf(
+    WORD32 *const v_main, WORD32 *const v_slave, WORD32 *const w, WORD32 const lw, WORD32 *z_real,
+    WORD32 *z_imag, const ia_mps_dec_mdct2qmf_cos_table_struct *ia_mps_dec_mdct2qmfcos_tab,
+    VOID *scratch, WORD32 is_long) {
+  WORD32 i, start = 0;
+  WORD32 m = lw >> 1;
+
+  switch (lw) {
+    case TSX2_4:
+    case TSX2_6:
+    case TSX2_30:
+    case TSX2_36:
+    case TSX2_60:
+      start = 1;
+      break;
+
+    case TSX2_8:
+    case TSX2_32:
+    case TSX2_48:
+    case TSX2_64:
+      start = 0;
+      break;
+
+    default:
+      break;
+  }
+
+  ixheaacd_local_imdet(v_slave, v_main, w, m, z_real, z_imag, ia_mps_dec_mdct2qmfcos_tab, is_long,
+                       scratch);
+
+  for (i = start; i < (m << 7); i += 2) {
+    z_imag[i] = -(z_imag[i]);
+  }
+
+  return;
+}
+
+static VOID ixheaacd_local_p_zero_ts15(WORD32 *const b, WORD32 *src, WORD32 l) {
+  WORD32 i;
+
+  for (i = 0; i < 15; i++) {
+    b[i] = *src++;
+  }
+  if (l != 15) {
+    src--;
+    for (; i < l; i++) {
+      b[i] = *--src;
+    }
+  }
+}
+
+static VOID ixheaacd_local_p_nonzero(WORD32 *const b, WORD32 *src, WORD32 l) {
+  WORD32 i;
+
+  for (i = 0; i < l; i++) {
+    b[i] = *src--;
+  }
+}
+
+static VOID ixheaacd_local_p_zero(WORD32 *const b, WORD32 *src, WORD32 l, WORD32 upd_qmf) {
+  WORD32 i;
+
+  for (i = 0; i < upd_qmf; i++) {
+    b[i] = *src++;
+  }
+  if (l != upd_qmf) {
+    for (; i < l; i++) {
+      b[i] = *--src;
+    }
+  }
+}
+
+static VOID ixheaacd_local_sin(WORD32 const t, WORD32 const p, WORD32 const l, WORD32 *const b,
+                               ia_mps_dec_mdct2qmf_table_struct *mdct2qmf_tab) {
+  WORD32 *sin_ptr;
+
+  switch (t) {
+    case TS_2:
+      switch (p) {
+        case ZERO:
+          b[0] = 12540;
+          b[1] = 30274;
+          if (l == TSX2_4) {
+            b[2] = b[1];
+            b[3] = b[0];
+          }
+          break;
+        case TS_2:
+          b[0] = 30274;
+          b[1] = 12540;
+          break;
+        default:
+          break;
+      }
+      break;
+    case TS_4:
+      switch (p) {
+        case ZERO:
+          sin_ptr = mdct2qmf_tab->local_sin_4;
+          b[0] = *sin_ptr++;
+          b[1] = *sin_ptr++;
+          b[2] = *sin_ptr++;
+          b[3] = *sin_ptr;
+          if (l == TSX2_8) {
+            b[4] = *sin_ptr--;
+            b[5] = *sin_ptr--;
+            b[6] = *sin_ptr--;
+            b[7] = *sin_ptr;
+          }
+          break;
+        case TS_4:
+          sin_ptr = &(mdct2qmf_tab->local_sin_4[TS_MINUS_ONE_4]);
+          b[0] = *sin_ptr--;
+          b[1] = *sin_ptr--;
+          b[2] = *sin_ptr--;
+          b[3] = *sin_ptr;
+          break;
+        default:
+          break;
+      }
+      break;
+    case UPD_QMF_15:
+      switch (p) {
+        case ZERO:
+          sin_ptr = &(mdct2qmf_tab->local_sin_15[1]);
+          ixheaacd_local_p_zero_ts15(b, sin_ptr, l);
+          break;
+        case UPD_QMF_15:
+          sin_ptr = &(mdct2qmf_tab->local_sin_15[TS_MINUS_ONE_15]);
+          ixheaacd_local_p_nonzero(b, sin_ptr, l);
+          break;
+        default:
+          break;
+      }
+      break;
+    case UPD_QMF_16:
+      switch (p) {
+        case ZERO:
+          sin_ptr = mdct2qmf_tab->local_sin_16;
+          ixheaacd_local_p_zero(b, sin_ptr, l, UPD_QMF_16);
+          break;
+        case UPD_QMF_16:
+          sin_ptr = &(mdct2qmf_tab->local_sin_16[TS_MINUS_ONE_16]);
+          ixheaacd_local_p_nonzero(b, sin_ptr, l);
+          break;
+        default:
+          break;
+      }
+      break;
+    case UPD_QMF_18:
+      switch (p) {
+        case ZERO:
+          sin_ptr = mdct2qmf_tab->local_sin_18;
+          ixheaacd_local_p_zero(b, sin_ptr, l, UPD_QMF_18);
+          break;
+        case UPD_QMF_18:
+          sin_ptr = &(mdct2qmf_tab->local_sin_18[TS_MINUS_ONE_18]);
+          ixheaacd_local_p_nonzero(b, sin_ptr, l);
+          break;
+        default:
+          break;
+      }
+      break;
+    case UPD_QMF_24:
+      switch (p) {
+        case ZERO:
+          sin_ptr = mdct2qmf_tab->local_sin_24;
+          ixheaacd_local_p_zero(b, sin_ptr, l, UPD_QMF_24);
+          break;
+        case UPD_QMF_24:
+          sin_ptr = &(mdct2qmf_tab->local_sin_24[TS_MINUS_ONE_24]);
+          ixheaacd_local_p_nonzero(b, sin_ptr, l);
+          break;
+        default:
+          break;
+      }
+      break;
+    case UPD_QMF_30:
+      switch (p) {
+        case ZERO:
+          sin_ptr = mdct2qmf_tab->local_sin_30;
+          ixheaacd_local_p_zero(b, sin_ptr, l, UPD_QMF_30);
+          break;
+        case UPD_QMF_30:
+          sin_ptr = &(mdct2qmf_tab->local_sin_30[TS_MINUS_ONE_30]);
+          ixheaacd_local_p_nonzero(b, sin_ptr, l);
+          break;
+        default:
+          break;
+      }
+      break;
+    case UPD_QMF_32:
+      switch (p) {
+        case ZERO:
+          sin_ptr = mdct2qmf_tab->local_sin_32;
+          ixheaacd_local_p_zero(b, sin_ptr, l, UPD_QMF_32);
+          break;
+        case UPD_QMF_32:
+          sin_ptr = &(mdct2qmf_tab->local_sin_32[TS_MINUS_ONE_32]);
+          ixheaacd_local_p_nonzero(b, sin_ptr, l);
+
+          break;
+        default:
+          break;
+      }
+      break;
+    default:
+      break;
+  }
+  return;
+}
+
+static VOID ixheaacd_local_one(WORD32 const l, WORD32 *const b) {
+  WORD32 i;
+
+  for (i = 0; i < l; i++) {
+    b[i] = ONE_IN_Q15;
+  }
+}
+
+static VOID ixheaacd_local_freq_win(WORD32 const l, WORD32 *const b, const WORD32 **wf) {
+  WORD32 i;
+  WORD32 odd_length = (l & ONE_BIT_MASK);
+  WORD32 temp_1;
+  WORD32 *b_start, *b_end;
+  b_start = b;
+  b_end = b + 2 * l - 1 - odd_length;
+
+  for (i = 0; i < l - odd_length; i++) {
+    temp_1 = wf[l - 1][i];
+    *b_start++ = temp_1;
+    *b_end-- = temp_1;
+  }
+
+  if (odd_length == 1) {
+    *b_start = wf[l - 1][l - 1];
+    *(b_start + l) = 0;
+  }
+}
+
+static VOID ixheaacd_local_mdct_win(WORD32 upd_qmf, WORD32 const window_type, WORD32 *const wf,
+                                    WORD32 const **wf_tab, WORD32 *const wt,
+                                    ia_mps_dec_mdct2qmf_table_struct *mdct2qmf_tab) {
+  WORD32 length = 0;
+  WORD32 length_right = 0;
+  WORD32 length_left = 0;
+  WORD32 length_const1 = 0;
+  WORD32 length_const2 = 0;
+
+  switch (window_type) {
+    case ONLY_LONG_SEQUENCE:
+      length = upd_qmf;
+      ixheaacd_local_sin(upd_qmf, 0, (length << 1), &wt[0], mdct2qmf_tab);
+      break;
+    case LONG_START_SEQUENCE:
+      switch (upd_qmf) {
+        case UPD_QMF_15:
+          length_const1 = 6;
+          length_const2 = 7;
+          length_right = 2;
+          break;
+        case UPD_QMF_16:
+        case UPD_QMF_32:
+          length_const1 = 7 * (upd_qmf >> 4);
+          length_const2 = length_const1;
+          length_right = upd_qmf >> 3;
+          break;
+        case UPD_QMF_18:
+          length_const1 = 8;
+          length_const2 = length_const1;
+          length_right = 2;
+          break;
+        case UPD_QMF_24:
+          length_const1 = 11;
+          length_const2 = length_const1;
+          length_right = 2;
+          break;
+        case UPD_QMF_30:
+          length_const1 = 14;
+          length_const2 = length_const1;
+          length_right = 2;
+          break;
+        default:
+          length_const1 = 6;
+          length_const2 = 7;
+          length_right = 2;
+          break;
+      }
+
+      ixheaacd_local_sin(upd_qmf, 0, upd_qmf, &wt[0], mdct2qmf_tab);
+      ixheaacd_local_one(length_const1, &wt[upd_qmf]);
+      ixheaacd_local_sin(length_right, length_right, length_right, &wt[upd_qmf + length_const1],
+                         mdct2qmf_tab);
+
+      ixheaacd_local_zero(length_const2, &wt[upd_qmf + length_const1 + length_right]);
+      length = upd_qmf;
+      break;
+    case EIGHT_SHORT_SEQUENCE:
+      switch (upd_qmf) {
+        case UPD_QMF_16:
+        case UPD_QMF_32:
+          length = upd_qmf >> 3;
+          break;
+        case UPD_QMF_15:
+        case UPD_QMF_18:
+        case UPD_QMF_30:
+        case UPD_QMF_24:
+          length = 2;
+          break;
+        default:
+          break;
+      }
+      ixheaacd_local_sin(length, 0, 2 * length, &wt[0], mdct2qmf_tab);
+      break;
+    case LONG_STOP_SEQUENCE:
+      switch (upd_qmf) {
+        case UPD_QMF_15:
+          length_const1 = 6;
+          length_const2 = 7;
+          length_left = 2;
+          break;
+        case UPD_QMF_16:
+        case UPD_QMF_32:
+          length_const1 = 7 * (upd_qmf >> 4);
+          length_const2 = length_const1;
+          length_left = upd_qmf >> 3;
+          break;
+        case UPD_QMF_18:
+          length_const1 = 8;
+          length_const2 = length_const1;
+          length_left = 2;
+          break;
+        case UPD_QMF_24:
+          length_const1 = 11;
+          length_const2 = length_const1;
+          length_left = 2;
+          break;
+        case UPD_QMF_30:
+          length_const1 = 14;
+          length_const2 = length_const1;
+          length_left = 2;
+          break;
+        default:
+          break;
+      }
+
+      ixheaacd_local_zero(length_const1, &wt[0]);
+      ixheaacd_local_sin(length_left, 0, length_left, &wt[length_const1], mdct2qmf_tab);
+      ixheaacd_local_one(length_const2, &wt[length_const1 + length_left]);
+      ixheaacd_local_sin(upd_qmf, upd_qmf, upd_qmf,
+                         &wt[length_const1 + length_left + length_const2], mdct2qmf_tab);
+      length = upd_qmf;
+      break;
+    default:
+      break;
+  }
+
+  ixheaacd_local_freq_win(length, &wf[0], wf_tab);
+
+  if ((upd_qmf == UPD_QMF_15) && (window_type == EIGHT_SHORT_SEQUENCE)) {
+    WORD32 length2 = 3;
+
+    ixheaacd_local_sin(length, 0, length, &wt[(length << 1)], mdct2qmf_tab);
+    ixheaacd_local_one(1, &wt[3 * length]);
+    ixheaacd_local_sin(length, length, length, &wt[3 * length + 1], mdct2qmf_tab);
+    ixheaacd_local_zero(1, &wt[(length << 2) + 1]);
+
+    ixheaacd_local_freq_win(length2, &wf[(length << 1)], wf_tab);
+  }
+  return;
+}
+
+static VOID ixheaacd_get_gain(WORD32 l, WORD32 *gain) {
+  switch (l) {
+    case TSX2_4:
+      *gain = 16384;
+      break;
+
+    case TSX2_6:
+      *gain = 13377;
+      break;
+
+    case TSX2_8:
+      *gain = 11585;
+      break;
+
+    case TSX2_30:
+      *gain = 5982;
+      break;
+
+    case TSX2_32:
+      *gain = 5792;
+      break;
+
+    case TSX2_36:
+      *gain = 5461;
+      break;
+
+    case TSX2_48:
+      *gain = 4729;
+      break;
+
+    case TSX2_60:
+      *gain = 4230;
+      break;
+
+    case TSX2_64:
+      *gain = 4096;
+      break;
+
+    default:
+      break;
+  }
+
+  return;
+}
+
+VOID ixheaacd_mdct2qmf_process(WORD32 upd_qmf, WORD32 *const mdct_in, WORD32 *qmf_real_pre,
+                               WORD32 *qmf_real_post, WORD32 *qmf_imag_pre, WORD32 *qmf_imag_post,
+                               WORD32 const window_type, WORD32 qmf_global_offset,
+                               ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr,
+                               VOID *scratch, WORD32 time_slots) {
+  WORD32 i;
+  WORD32 j;
+  WORD32 k;
+
+  WORD32 l = (upd_qmf << 1);
+
+  WORD32 n = 0;
+  WORD32 *wf;
+  WORD32 *wt;
+
+  WORD32 *v1;
+  WORD32 *v2;
+
+  WORD32 *z1_real;
+  WORD32 *z1_imag;
+
+  WORD32 *twipost_real;
+  WORD32 *twipost_imag;
+
+  WORD32 *mdct_sf, *mdct_sf_ptr;
+  WORD32 *mdct_p, *mdct_p2;
+
+  WORD32 temp_2, temp3, temp4;
+
+  WORD32 *p_qmf_real_pre = qmf_real_pre;
+  WORD32 *p_qmf_real_post = qmf_real_post;
+  WORD32 *p_qmf_imag_pre = qmf_imag_pre;
+  WORD32 *p_qmf_imag_post = qmf_imag_post;
+
+  VOID *free_scratch;
+
+  WORD32 const **wf_tab = ia_mps_dec_mps_table_ptr->wf_tab_ptr->wf;
+
+  WORD32 window_offset = 0;
+
+  WORD32 mdct_offset = 0;
+  WORD32 mdct_shift = AAC_SHORT_FRAME_LENGTH;
+
+  WORD32 qmf_offset = 0;
+  WORD32 qmf_shift = 0;
+
+  WORD32 n_windows = 0;
+
+  WORD32 mdct_length = MDCT_LENGTH_LO;
+
+  WORD32 qmf_bands = 64;
+  const WORD32 *ptr1, *ptr2;
+  WORD32 is_long;
+  WORD32 *zr, *zi;
+
+  WORD32 *a, *scale;
+  WORD32 gain = 0;
+  WORD32 *wp;
+
+  wf = scratch;
+  wt = wf + MAX_TIMESLOTSX2;
+  v1 = wt + MAX_TIMESLOTSX2;
+  v2 = v1 + MDCT_LENGTH_HI;
+  twipost_real = v2 + MDCT_LENGTH_HI;
+  twipost_imag = twipost_real + MAX_NUM_QMF_BANDS;
+  mdct_sf = twipost_imag + MAX_NUM_QMF_BANDS;
+  z1_real = mdct_sf + MDCT_LENGTH_SF;
+  z1_imag = z1_real + QBXTSX2;
+  a = z1_imag + QBXTSX2;
+  free_scratch = (VOID *)((WORD32 *)a + MAX_NUM_QMF_BANDS);
+
+  scale = a;
+
+  ixheaacd_local_mdct_win(upd_qmf, window_type, wf, wf_tab, wt,
+                          ia_mps_dec_mps_table_ptr->mdct2qmf_table_ptr);
+
+  switch (window_type) {
+    case ONLY_LONG_SEQUENCE:
+    case LONG_START_SEQUENCE:
+    case LONG_STOP_SEQUENCE:
+
+      n = upd_qmf * qmf_bands - MDCT_LENGTH_LO;
+
+      if (n > 0) {
+        ixheaacd_local_zero(n, &mdct_in[MDCT_LENGTH_LO]);
+      }
+      mdct_length += n;
+
+      ixheaacd_local_fold_out(mdct_in, mdct_length, wf, l, v1, v2);
+
+      wp = wt;
+
+      ixheaacd_get_gain(l, &gain);
+
+      for (k = 0; k < l; k++) {
+        *scale++ = ixheaacd_mps_mult32_shr_15(gain, *wp);
+        wp++;
+      }
+      ixheaacd_local_hybcmdct2qmf(v1, v2, a, l, z1_real, z1_imag,
+                                  ia_mps_dec_mps_table_ptr->mdct2qmfcos_tab_ptr, free_scratch, 1);
+
+      ptr1 = ia_mps_dec_mps_table_ptr->mdct2qmf_table_ptr->twi_post_cos;
+      ptr2 = ia_mps_dec_mps_table_ptr->mdct2qmf_table_ptr->twi_post_sin;
+
+      if (qmf_global_offset < time_slots) {
+        if (qmf_global_offset + l < time_slots) {
+          for (i = 0; i < qmf_bands; i++) {
+            WORD32 cos_twi = *ptr1++;
+            WORD32 sin_twi = *ptr2++;
+            for (j = 0; j < l; j++) {
+              temp3 = *z1_real++;
+              temp4 = *z1_imag++;
+
+              temp_2 = j + qmf_global_offset;
+              p_qmf_real_pre[temp_2] += cos_twi * temp3;
+              p_qmf_real_pre[temp_2] -= sin_twi * temp4;
+              p_qmf_imag_pre[temp_2] += cos_twi * temp4;
+              p_qmf_imag_pre[temp_2] += sin_twi * temp3;
+            }
+            p_qmf_real_pre += MAX_TIME_SLOTS;
+            p_qmf_imag_pre += MAX_TIME_SLOTS;
+          }
+        } else {
+          for (i = 0; i < qmf_bands; i++) {
+            WORD32 cos_twi = *ptr1++;
+            WORD32 sin_twi = *ptr2++;
+            for (j = 0; j < l; j++) {
+              temp3 = *z1_real++;
+              temp4 = *z1_imag++;
+
+              temp_2 = j + qmf_global_offset;
+              if (temp_2 < time_slots) {
+                p_qmf_real_pre[temp_2] += cos_twi * temp3;
+                p_qmf_real_pre[temp_2] -= sin_twi * temp4;
+                p_qmf_imag_pre[temp_2] += cos_twi * temp4;
+                p_qmf_imag_pre[temp_2] += sin_twi * temp3;
+              } else {
+                p_qmf_real_post[temp_2 - time_slots] += cos_twi * temp3;
+                p_qmf_real_post[temp_2 - time_slots] -= sin_twi * temp4;
+                p_qmf_imag_post[temp_2 - time_slots] += cos_twi * temp4;
+                p_qmf_imag_post[temp_2 - time_slots] += sin_twi * temp3;
+              }
+            }
+            p_qmf_real_pre += MAX_TIME_SLOTS;
+            p_qmf_real_post += MAX_TIME_SLOTS;
+
+            p_qmf_imag_pre += MAX_TIME_SLOTS;
+            p_qmf_imag_post += MAX_TIME_SLOTS;
+          }
+        }
+      } else {
+        for (i = 0; i < qmf_bands; i++) {
+          WORD32 cos_twi = *ptr1++;
+          WORD32 sin_twi = *ptr2++;
+          for (j = 0; j < l; j++) {
+            temp3 = *z1_real++;
+            temp4 = *z1_imag++;
+
+            temp_2 = j + qmf_global_offset;
+
+            p_qmf_real_post[temp_2 - time_slots] += cos_twi * temp3;
+            p_qmf_real_post[temp_2 - time_slots] -= sin_twi * temp4;
+            p_qmf_imag_post[temp_2 - time_slots] += cos_twi * temp4;
+            p_qmf_imag_post[temp_2 - time_slots] += sin_twi * temp3;
+          }
+          p_qmf_real_post += MAX_TIME_SLOTS;
+          p_qmf_imag_post += MAX_TIME_SLOTS;
+        }
+      }
+      break;
+    case EIGHT_SHORT_SEQUENCE:
+
+      switch (upd_qmf) {
+        case UPD_QMF_15:
+          l = 4;
+          mdct_length = AAC_SHORT_FRAME_LENGTH;
+          qmf_offset = 6;
+          qmf_shift = 2;
+          n_windows = 7;
+          break;
+        case UPD_QMF_16:
+        case UPD_QMF_32:
+          n = (upd_qmf - UPD_QMF_16) * 8;
+          mdct_length = AAC_SHORT_FRAME_LENGTH + n;
+          l = 2 * (upd_qmf >> 3);
+          qmf_offset = 7 * upd_qmf >> 4;
+          qmf_shift = upd_qmf >> 3;
+          n_windows = 8;
+          break;
+        case UPD_QMF_18:
+          l = 4;
+          mdct_length = AAC_SHORT_FRAME_LENGTH;
+          qmf_offset = 8;
+          qmf_shift = 2;
+          n_windows = 9;
+          break;
+        case UPD_QMF_24:
+          l = 4;
+          mdct_length = AAC_SHORT_FRAME_LENGTH;
+          qmf_offset = 11;
+          qmf_shift = 2;
+          n_windows = 12;
+          break;
+        case UPD_QMF_30:
+          l = 4;
+          mdct_length = AAC_SHORT_FRAME_LENGTH;
+          qmf_offset = 14;
+          qmf_shift = 2;
+          n_windows = 15;
+          break;
+        default:
+          l = 4;
+          mdct_length = AAC_SHORT_FRAME_LENGTH;
+          qmf_offset = 6;
+          qmf_shift = 2;
+          n_windows = 7;
+          break;
+      }
+
+      wp = wt;
+      ixheaacd_get_gain(l, &gain);
+
+      for (k = 0; k < l; k++) {
+        *scale++ = ixheaacd_mps_mult32_shr_15(gain, *wp);
+        wp++;
+      }
+
+      for (k = 0; k < n_windows; k++) {
+        is_long = 0;
+        mdct_sf_ptr = mdct_sf;
+        switch (upd_qmf) {
+          case UPD_QMF_16:
+          case UPD_QMF_32:
+            mdct_p = mdct_in + mdct_offset;
+            for (i = 0; i < AAC_SHORT_FRAME_LENGTH; i++) {
+              *mdct_sf_ptr++ = *mdct_p++;
+            }
+
+            ixheaacd_local_zero(n, &mdct_sf[AAC_SHORT_FRAME_LENGTH]);
+            break;
+          case UPD_QMF_15:
+            if (k < n_windows - 1) {
+              mdct_p = mdct_in + mdct_offset;
+              for (i = 0; i < AAC_SHORT_FRAME_LENGTH; i++) {
+                *mdct_sf_ptr++ = *mdct_p++;
+              }
+            } else {
+              window_offset = l;
+              l = 6;
+              mdct_length = 192;
+              is_long = 4;
+              gain = 13377;
+              scale = a;
+              wp = wt + window_offset;
+
+              for (k = 0; k < l; k++) {
+                *scale++ = ixheaacd_mps_mult32_shr_15(gain, *wp);
+                wp++;
+              }
+
+              mdct_p = mdct_in + mdct_offset;
+              mdct_p2 = mdct_in + mdct_offset + AAC_SHORT_FRAME_LENGTH;
+
+              for (i = 0, j = 0; i < mdct_length / 2; i++) {
+                *mdct_sf_ptr++ = *mdct_p++;
+                *mdct_sf_ptr++ = *mdct_p2++;
+              }
+            }
+            break;
+          case UPD_QMF_18:
+          case UPD_QMF_24:
+          case UPD_QMF_30:
+
+            mdct_p = mdct_in + mdct_offset;
+            for (i = 0; i < AAC_SHORT_FRAME_LENGTH; i++) {
+              *mdct_sf_ptr++ = *mdct_p++;
+            }
+            break;
+          default:
+            break;
+        }
+        ixheaacd_local_fold_out(mdct_sf, mdct_length, &wf[window_offset], l, v1, v2);
+
+        ixheaacd_local_hybcmdct2qmf(v1, v2, a, l, z1_real, z1_imag,
+                                    ia_mps_dec_mps_table_ptr->mdct2qmfcos_tab_ptr, free_scratch,
+                                    is_long);
+
+        zr = z1_real;
+        zi = z1_imag;
+
+        ptr1 = ia_mps_dec_mps_table_ptr->mdct2qmf_table_ptr->twi_post_cos;
+        ptr2 = ia_mps_dec_mps_table_ptr->mdct2qmf_table_ptr->twi_post_sin;
+        temp_2 = qmf_offset + qmf_global_offset;
+
+        if (temp_2 < time_slots) {
+          if ((temp_2 + l) < time_slots) {
+            p_qmf_real_pre = qmf_real_pre;
+            p_qmf_imag_pre = qmf_imag_pre;
+
+            for (i = 0; i < qmf_bands; i++) {
+              WORD32 cos_twi = *ptr1++;
+              WORD32 sin_twi = *ptr2++;
+
+              for (j = 0; j < l; j++) {
+                temp3 = *zr++;
+                temp4 = (*zi++);
+
+                p_qmf_real_pre[temp_2 + j] += cos_twi * temp3;
+                p_qmf_real_pre[temp_2 + j] -= sin_twi * temp4;
+                p_qmf_imag_pre[temp_2 + j] += cos_twi * temp4;
+                p_qmf_imag_pre[temp_2 + j] += sin_twi * temp3;
+              }
+              p_qmf_real_pre += MAX_TIME_SLOTS;
+              p_qmf_imag_pre += MAX_TIME_SLOTS;
+            }
+          } else {
+            p_qmf_real_pre = qmf_real_pre;
+            p_qmf_real_post = qmf_real_post;
+            p_qmf_imag_pre = qmf_imag_pre;
+            p_qmf_imag_post = qmf_imag_post;
+
+            for (i = 0; i < qmf_bands; i++) {
+              WORD32 cos_twi = *ptr1++;
+              WORD32 sin_twi = *ptr2++;
+
+              for (j = 0; j < l; j++) {
+                temp3 = *zr++;
+                temp4 = (*zi++);
+
+                if ((temp_2 + j) < time_slots) {
+                  p_qmf_real_pre[temp_2 + j] += cos_twi * temp3;
+                  p_qmf_real_pre[temp_2 + j] -= sin_twi * temp4;
+                  p_qmf_imag_pre[temp_2 + j] += cos_twi * temp4;
+                  p_qmf_imag_pre[temp_2 + j] += sin_twi * temp3;
+                } else {
+                  p_qmf_real_post[temp_2 + j - time_slots] += cos_twi * temp3;
+                  p_qmf_real_post[temp_2 + j - time_slots] -= sin_twi * temp4;
+                  p_qmf_imag_post[temp_2 + j - time_slots] += cos_twi * temp4;
+                  p_qmf_imag_post[temp_2 + j - time_slots] += sin_twi * temp3;
+                }
+              }
+              p_qmf_real_pre += MAX_TIME_SLOTS;
+              p_qmf_imag_pre += MAX_TIME_SLOTS;
+
+              p_qmf_real_post += MAX_TIME_SLOTS;
+              p_qmf_imag_post += MAX_TIME_SLOTS;
+            }
+          }
+        } else {
+          p_qmf_real_post = qmf_real_post;
+          p_qmf_imag_post = qmf_imag_post;
+
+          for (i = 0; i < qmf_bands; i++) {
+            WORD32 cos_twi = *ptr1++;
+            WORD32 sin_twi = *ptr2++;
+
+            for (j = 0; j < l; j++) {
+              temp3 = *zr++;
+              temp4 = (*zi++);
+              {
+                p_qmf_real_post[temp_2 + j - time_slots] += cos_twi * temp3;
+                p_qmf_real_post[temp_2 + j - time_slots] -= sin_twi * temp4;
+                p_qmf_imag_post[temp_2 + j - time_slots] += cos_twi * temp4;
+                p_qmf_imag_post[temp_2 + j - time_slots] += sin_twi * temp3;
+              }
+            }
+            p_qmf_real_post += MAX_TIME_SLOTS;
+            p_qmf_imag_post += MAX_TIME_SLOTS;
+          }
+        }
+
+        mdct_offset += mdct_shift;
+        qmf_offset += qmf_shift;
+      }
+      break;
+    default:
+      break;
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_mdct_2_qmf.h b/decoder/ixheaacd_mps_mdct_2_qmf.h
new file mode 100644
index 0000000..fb602ab
--- /dev/null
+++ b/decoder/ixheaacd_mps_mdct_2_qmf.h
@@ -0,0 +1,65 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_MDCT_2_QMF_H
+#define IXHEAACD_MPS_MDCT_2_QMF_H
+
+#define AAC_FRAME_LENGTH (1024)
+#define AAC_SHORT_FRAME_LENGTH (128)
+
+#define MDCT_LENGTH_LO (AAC_FRAME_LENGTH)
+#define MDCT_LENGTH_HI (AAC_FRAME_LENGTH << 1)
+#define MDCT_LENGTH_SF (3 * AAC_SHORT_FRAME_LENGTH)
+
+#define UPD_QMF_15 (15)
+#define UPD_QMF_16 (16)
+#define UPD_QMF_18 (18)
+#define UPD_QMF_24 (24)
+#define UPD_QMF_30 (30)
+#define UPD_QMF_32 (32)
+
+#define TSX2_4 (4)
+#define TSX2_6 (6)
+#define TSX2_8 (8)
+#define TSX2_30 (30)
+#define TSX2_32 (32)
+#define TSX2_36 (36)
+#define TSX2_48 (48)
+#define TSX2_60 (60)
+#define TSX2_64 (64)
+#define TS_2 (2)
+#define TS_4 (4)
+#define TS_MINUS_ONE_4 (3)
+#define TS_MINUS_ONE_15 (14)
+#define TS_MINUS_ONE_16 (15)
+#define TS_MINUS_ONE_18 (17)
+#define TS_MINUS_ONE_24 (23)
+#define TS_MINUS_ONE_30 (29)
+#define TS_MINUS_ONE_32 (31)
+#define ZERO (0)
+
+IA_ERRORCODE ixheaacd_mdct2qmf_create(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_mdct2qmf_process(WORD32 upd_qmf, WORD32 *const mdct_in, WORD32 *qmf_real_pre,
+                               WORD32 *qmf_real_post, WORD32 *qmf_imag_pre, WORD32 *qmf_imag_post,
+                               WORD32 const window_type, WORD32 qmf_global_offset,
+                               ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr,
+                               VOID *scratch, WORD32 time_slots);
+
+#endif /* IXHEAACD_MPS_MDCT_2_QMF_H */
diff --git a/decoder/ixheaacd_mps_nlc_dec.h b/decoder/ixheaacd_mps_nlc_dec.h
index e210f6c..786c6a3 100644
--- a/decoder/ixheaacd_mps_nlc_dec.h
+++ b/decoder/ixheaacd_mps_nlc_dec.h
@@ -23,6 +23,7 @@
 #define CLD (0)
 #define ICC (1)
 #define IPD (2)
+#define CPC (3)
 
 #define BACKWARDS (0)
 #define FORWARDS (1)
@@ -42,19 +43,19 @@
 #define PCM_PLT 0x2
 
 #define MAXPARAM MAX_NUM_PARAMS
-#define MAXSETS MAX_PARAMETER_SETS
 #define MAXBANDS MAX_PARAMETER_BANDS
 
 #define ia_huff_node_struct const WORD32(*)[][2]
 
-WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct strm,
-                                  WORD32 aa_out_data[][MAXBANDS],
-                                  WORD32 a_history[MAXBANDS], WORD32 data_type,
-                                  WORD32 set_idx, WORD32 data_bands,
-                                  WORD32 pair_flag, WORD32 coarse_flag,
-                                  WORD32 independency_flag);
+WORD32 ixheaacd_mps_ecdatapairdec(ia_bit_buf_struct *it_bit_buf, WORD32 aa_out_data[][MAXBANDS],
+                                  WORD32 a_history[MAXBANDS], WORD32 data_type, WORD32 set_idx,
+                                  WORD32 start_band, WORD32 data_bands, WORD32 pair_flag,
+                                  WORD32 coarse_flag, WORD32 independency_flag, WORD32 ldmps_flag,
+                                  WORD32 heaac_mps_present, WORD32 ec_flag);
 
-VOID ixheaacd_mps_huff_decode(ia_handle_bit_buf_struct strm, WORD32 *out_data,
+VOID ixheaacd_mps_huff_decode(ia_bit_buf_struct *it_bit_buf, WORD32 *out_data,
                               WORD32 num_val);
 
-#endif
+enum { LAV_3 = 3, LAV_5 = 5, LAV_6 = 6, LAV_7 = 7, LAV_9 = 9, LAV_12 = 12 };
+
+#endif /* IXHEAACD_MPS_NLC_DEC_H */
diff --git a/decoder/ixheaacd_mps_parse.c b/decoder/ixheaacd_mps_parse.c
index 81a8592..6b41088 100644
--- a/decoder/ixheaacd_mps_parse.c
+++ b/decoder/ixheaacd_mps_parse.c
@@ -18,97 +18,157 @@
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
 #include <math.h>
-#include <assert.h>
-#include <stdio.h>
 #include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
 #include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_defines.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
 #include "ixheaacd_mps_nlc_dec.h"
-#include "ixheaacd_mps_hybfilter.h"
 #include "ixheaacd_error_standards.h"
 
-#define min(a, b) ((a) < (b) ? (a) : (b))
+static const WORD32 ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4};
 
-#define max(a, b) ((a) > (b) ? (a) : (b))
+static const WORD32 ixheaacd_freq_res_table_ld[] = {0, 23, 15, 12, 9, 7, 5, 4};
 
-static const int ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4};
-
-static const int
+static const WORD32
     ixheaacd_hybrid_band_71_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] = {
         0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
         2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
         3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
 
-static const int
+static const WORD32
     ixheaacd_hybrid_band_71_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] = {
         0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
         3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
         4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4};
 
-static const int
+static const WORD32
     ixheaacd_hybrid_band_71_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] = {
         0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5,
         5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
         6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6};
 
-static const int
+static const WORD32
     ixheaacd_hybrid_band_71_to_processing_band_10_map[MAX_HYBRID_BANDS_MPS] = {
         0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8,
         8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
         9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
 
-static const int
+static const WORD32
     ixheaacd_hybrid_band_71_to_processing_band_14_map[MAX_HYBRID_BANDS_MPS] = {
         0,  0,  0,  0,  1,  1,  2,  3,  4,  4,  5,  6,  6,  7,  7,  8,  8,  8,
         9,  9,  9,  10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
         12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
         13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13};
 
-const int
+const WORD32
     ixheaacd_hybrid_band_71_to_processing_band_20_map[MAX_HYBRID_BANDS_MPS] = {
         1,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 14,
         15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
         18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
         19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19};
 
-const int
+const WORD32
     ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS] = {
         1,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
         16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23,
         23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,
         26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27};
 
-static const float ixheaacd_mps_clip_gain_table[] = {
+const WORD32
+    ixheaacd_hybrid_band_64_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] =
+        {0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+         2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+         3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+         3, 3, 3, 3, 3};
+
+const WORD32
+    ixheaacd_hybrid_band_64_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] =
+        {0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+         3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+         4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+         4, 4, 4, 4, 4};
+
+const WORD32
+    ixheaacd_hybrid_band_64_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] =
+        {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
+         5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+         6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+         6, 6, 6, 6, 6};
+
+const WORD32
+    ixheaacd_hybrid_band_64_to_processing_band_9_map[MAX_HYBRID_BANDS_MPS] =
+        {0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,
+         7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+         8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+         8, 8, 8, 8, 8};
+
+const WORD32
+    ixheaacd_hybrid_band_64_to_processing_band_12_map[MAX_HYBRID_BANDS_MPS] =
+        {0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  8,  8,
+         8,  8,  9,  9,  9,  9,  9,  10, 10, 10, 10, 10, 10, 10, 10, 10,
+         10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+         11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+         11, 11, 11, 11, 11, 11, 11};
+
+const WORD32
+    ixheaacd_hybrid_band_64_to_processing_band_15_map[MAX_HYBRID_BANDS_MPS] =
+        {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  9,  10, 10, 10, 11, 11,
+         11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+         13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+         14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+         14, 14, 14, 14, 14, 14, 14};
+
+const WORD32
+    ixheaacd_hybrid_band_64_to_processing_band_23_map[MAX_HYBRID_BANDS_MPS] =
+        {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 12, 13, 13,
+         14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19,
+         19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21,
+         22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+         22, 22, 22, 22, 22, 22, 22};
+
+static const FLOAT32 ixheaacd_mps_clip_gain_table[] = {
     1.000000f, 1.189207f, 1.414213f, 1.681792f,
     2.000000f, 2.378414f, 2.828427f, 4.000000f};
 
-static const int ixheaacd_mps_stride_table[] = {1, 2, 5, 28};
+static const WORD32 ixheaacd_mps_stride_table[] = {1, 2, 5, 28};
 
-static const float ixheaacd_cld_de_quant_table[] = {
+static const FLOAT32 ixheaacd_cld_de_quant_table[] = {
     -150.0, -45.0, -40.0, -35.0, -30.0, -25.0, -22.0, -19.0,
     -16.0,  -13.0, -10.0, -8.0,  -6.0,  -4.0,  -2.0,  0.0,
     2.0,    4.0,   6.0,   8.0,   10.0,  13.0,  16.0,  19.0,
     22.0,   25.0,  30.0,  35.0,  40.0,  45.0,  150.0};
 
-static const float ixheaacd_icc_de_quant_table[] = {
+static const FLOAT32 ixheaacd_icc_de_quant_table[] = {
     1.0000f, 0.9370f, 0.84118f, 0.60092f, 0.36764f, 0.0f, -0.5890f, -0.9900f};
 
-const float ixheaacd_ipd_de_quant_table[] = {
+const FLOAT32 ixheaacd_ipd_de_quant_table[] = {
     0.f,          0.392699082f, 0.785398163f, 1.178097245f,
     1.570796327f, 1.963495408f, 2.35619449f,  2.748893572f,
     3.141592654f, 3.534291735f, 3.926990817f, 4.319689899f,
     4.71238898f,  5.105088062f, 5.497787144f, 5.890486225f};
-const int ixheaacd_ipd_de_quant_table_q28[] = {
+const WORD32 ixheaacd_ipd_de_quant_table_q28[] = {
     0,          105414360,  210828720,  316243072, 421657440,  527071776,
     632486144,  737900480,  843314880,  948729216, 1054143552, 1159557888,
     1264972288, 1370386688, 1475800960, 1581215360};
-static const int ixheaacd_smoothing_time_table[] = {64, 128, 256, 512};
+static const WORD32 ixheaacd_smoothing_time_table[] = {64, 128, 256, 512};
 
-static const int ixheaacd_inverse_smoothing_time_table_q30[] = {
-    16777216, 8388608, 4194304, 2097152};
+static const FLOAT32 ixheaacd_inverse_smoothing_time_table[] = {
+    1.0f / 64.0f, 1.0f / 128.0f, 1.0f / 256.0f, 1.0f / 512.0f};
 
 static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) {
   var = min(var, upper_bound);
@@ -116,29 +176,30 @@
   return var;
 }
 
-static VOID ixheaacd_longmult1(unsigned short a[], unsigned short b,
-                               unsigned short d[], int len) {
-  int k;
+static VOID ixheaacd_longmult1(UWORD16 a[], UWORD16 b,
+                               UWORD16 d[], WORD32 len) {
+  WORD32 k;
   UWORD32 tmp;
   UWORD32 b0 = (UWORD32)b;
 
   tmp = ((UWORD32)a[0]) * b0;
-  d[0] = (unsigned short)tmp;
+  d[0] = (UWORD16)tmp;
 
   for (k = 1; k < len; k++) {
     tmp = (tmp >> 16) + ((UWORD32)a[k]) * b0;
-    d[k] = (unsigned short)tmp;
+    d[k] = (UWORD16)tmp;
   }
 }
 
-static VOID ixheaacd_longdiv(unsigned short b[], unsigned short a,
-                             unsigned short d[], unsigned short *pr, int len) {
+static VOID ixheaacd_longdiv(UWORD16 b[], UWORD16 a,
+                             UWORD16 d[], UWORD16 *pr, WORD32 len) {
   UWORD32 r;
   UWORD32 tmp;
   UWORD32 temp;
-  int k;
+  WORD32 k;
 
-  assert(a != 0);
+  if (a == 0)
+    return;
 
   r = 0;
 
@@ -146,41 +207,44 @@
     tmp = ((UWORD32)b[k]) + (r << 16);
 
     if (tmp) {
-      d[k] = (unsigned short)(tmp / a);
+      d[k] = (UWORD16)(tmp / a);
       temp = d[k] * a;
       r = tmp - temp;
     } else {
       d[k] = 0;
     }
   }
-  *pr = (unsigned short)r;
+  *pr = (UWORD16)r;
 }
 
-static VOID ixheaacd_longsub(unsigned short a[], unsigned short b[], int lena,
-                             int lenb) {
-  int h;
+static VOID ixheaacd_longsub(UWORD16 a[], UWORD16 b[], WORD32 lena,
+                             WORD32 lenb) {
+  WORD32 h;
   WORD32 carry = 0;
 
-  assert(lena >= lenb);
+  if (lenb > lena)
+    return;
+
   for (h = 0; h < lenb; h++) {
     carry = carry + (WORD32)(a[h] - b[h]);
-    a[h] = (unsigned short)carry;
+    a[h] = (UWORD16)carry;
     carry = carry >> 16;
   }
 
   for (; h < lena; h++) {
     carry = ((UWORD32)a[h]) + carry;
-    a[h] = (unsigned short)carry;
+    a[h] = (UWORD16)carry;
     carry = carry >> 16;
   }
 
-  assert(carry == 0);
+  if (carry != 0)
+    return;
   return;
 }
 
-static int ixheaacd_longcompare(unsigned short a[], unsigned short b[],
-                                int len) {
-  int i;
+static WORD32 ixheaacd_longcompare(UWORD16 a[], UWORD16 b[],
+                                WORD32 len) {
+  WORD32 i;
 
   for (i = len - 1; i > 0; i--) {
     if (a[i] != b[i]) break;
@@ -188,9 +252,9 @@
   return (a[i] >= b[i]) ? 1 : 0;
 }
 
-static VOID ixheaacd_mps_coarse2fine(int *data, WORD32 data_type,
-                                     int band_start, int ixheaacd_num_bands) {
-  int i;
+static VOID ixheaacd_mps_coarse2fine(WORD32 *data, WORD32 data_type,
+                                     WORD32 band_start, WORD32 ixheaacd_num_bands) {
+  WORD32 i;
 
   for (i = band_start; i < band_start + ixheaacd_num_bands; i++) {
     data[i] <<= 1;
@@ -206,17 +270,17 @@
   }
 }
 
-static VOID ixheaacd_mps_fine2coarse(int *data, int ixheaacd_num_bands) {
-  int i;
+static VOID ixheaacd_mps_fine2coarse(WORD32 *data, WORD32 ixheaacd_num_bands) {
+  WORD32 i;
 
   for (i = 0; i < ixheaacd_num_bands; i++) {
     data[i] /= 2;
   }
 }
 
-static int ixheaacd_mps_getstridemap(int freq_res_stride, int band_start,
-                                     int band_stop, int *strides) {
-  int i, pb, ch_fac, data_bands, start_offset;
+static WORD32 ixheaacd_mps_getstridemap(WORD32 freq_res_stride, WORD32 band_start,
+                                     WORD32 band_stop, WORD32 *strides) {
+  WORD32 i, pb, ch_fac, data_bands, start_offset;
 
   ch_fac = ixheaacd_mps_stride_table[freq_res_stride];
   data_bands = (band_stop - band_start - 1) / ch_fac + 1;
@@ -241,15 +305,15 @@
 }
 
 static IA_ERRORCODE ixheaacd_mps_ecdata_decoding(
-    ia_mps_dec_state_struct *self, ia_handle_bit_buf_struct bitstream,
-    int data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], int datatype) {
-  int i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
-  int strides[MAX_PARAMETER_BANDS + 1] = {0};
-  int band_stop = 0;
+    ia_mps_dec_state_struct *self, ia_bit_buf_struct *bitstream,
+    WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype) {
+  WORD32 i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx;
+  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
+  WORD32 band_stop = 0;
 
-  int *lastdata = NULL;
+  WORD32 *lastdata = NULL;
   ia_mps_data_struct *frame_xxx_data = NULL;
-  int default_val = 0;
+  WORD32 default_val = 0;
   IA_ERRORCODE err = IA_NO_ERROR;
 
   ia_mps_bs_frame *frame = &(self->bs_frame);
@@ -317,9 +381,9 @@
         }
 
         err = ixheaacd_mps_ecdatapairdec(
-            bitstream, data, lastdata, datatype, set_index, data_bands,
-            bs_data_pair, frame_xxx_data->bs_quant_coarse_xxx[set_index],
-            frame->independency_flag && (i == 0));
+            bitstream, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
+            frame_xxx_data->bs_quant_coarse_xxx[set_index],
+            !(frame->independency_flag && (i == 0)) || (set_index > 0), 0, 0, self->ec_flag);
         if (err) return err;
 
         for (pb = 0; pb < data_bands; pb++) {
@@ -352,13 +416,13 @@
 }
 
 IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self,
-                                        int usac_independency_flag,
-                                        ia_handle_bit_buf_struct bitstream) {
-  int i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch;
-  int ps, pg, ts, pb;
-  int env_shape_data[MAX_TIME_SLOTS];
+                                        WORD32 usac_independency_flag,
+                                        ia_bit_buf_struct *bitstream) {
+  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch;
+  WORD32 ps, pg, ts, pb;
+  WORD32 env_shape_data[MAX_TIME_SLOTS];
 
-  int bits_param_slot = 0;
+  WORD32 bits_param_slot = 0;
 
   ia_mps_bs_frame *frame = &(self->bs_frame);
   IA_ERRORCODE err = IA_NO_ERROR;
@@ -487,8 +551,8 @@
               ixheaacd_mps_huff_decode(bitstream, env_shape_data,
                                        self->time_slots);
               for (ts = 0; ts < self->time_slots; ts++) {
-                self->env_shape_data[i][ts] = (float)pow(
-                    2, (float)env_shape_data[ts] /
+                self->env_shape_data[i][ts] = (FLOAT32)pow(
+                    2, (FLOAT32)env_shape_data[ts] /
                                (self->config->bs_env_quant_mode + 2) -
                            1);
               }
@@ -496,26 +560,26 @@
           }
           break;
         default:
-          assert(0);
+          return -1;
       }
     }
   }
 
   if (self->bs_tsd_enable) {
-    unsigned short s[4];
+    UWORD16 s[4];
     UWORD64 s_64;
-    unsigned short c[5];
+    UWORD16 c[5];
     UWORD64 c_64;
-    unsigned short b;
-    unsigned short r[1];
-    static const unsigned short table_64[] = {
+    UWORD16 b;
+    UWORD16 r[1];
+    static const UWORD16 table_64[] = {
         6,  11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49,
         51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61};
-    static const unsigned short table_32[] = {5,  9,  13, 16, 18, 20, 22, 24,
+    static const UWORD16 table_32[] = {5,  9,  13, 16, 18, 20, 22, 24,
                                               25, 26, 27, 28, 29, 29, 30, 30};
     unsigned const short *tab = NULL;
-    int k;
-    unsigned short h;
+    WORD32 k;
+    UWORD16 h;
     WORD32 nbits_tr_slots = 0;
 
     if (self->time_slots == 32) {
@@ -569,7 +633,7 @@
     }
 
     {
-      int p = self->tsd_num_tr_slots;
+      WORD32 p = self->tsd_num_tr_slots;
 
       for (i = 0; i < self->time_slots; i++) self->bs_tsd_sep_data[i] = 0;
 
@@ -610,11 +674,255 @@
   return err;
 }
 
-static VOID ixheaacd_mps_createmapping(int map[MAX_PARAMETER_BANDS + 1],
-                                       int band_start, int band_stop,
-                                       int ch_fac) {
-  int input_bands, out_bands, bands_achived, bands_diff, incr, k, i;
-  int vdk[MAX_PARAMETER_BANDS + 1];
+static VOID ixheaacd_ld_mps_ecdata_decoding(
+    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff,
+    WORD32 data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], WORD32 datatype,
+    WORD32 start_band) {
+  WORD32 i, j, pb, data_set, set_index, bs_data_pair, data_bands,
+      old_quant_coarse_xxx;
+  WORD32 strides[MAX_PARAMETER_BANDS + 1] = {0};
+  WORD32 band_stop = 0;
+
+  WORD32 *lastdata = NULL;
+  ia_mps_data_struct *frame_xxx_data = NULL;
+  WORD32 default_val = 0;
+
+  ia_mps_bs_frame *frame = &(self->bs_frame);
+
+  if (datatype == CLD) {
+    frame_xxx_data = &frame->cld_data;
+    lastdata = frame->cmp_cld_idx_prev;
+    band_stop = self->bs_param_bands;
+  } else if (datatype == ICC) {
+    frame_xxx_data = &frame->icc_data;
+    lastdata = frame->cmp_icc_idx_prev;
+    band_stop = self->bs_param_bands;
+  } else if (datatype == IPD) {
+    frame_xxx_data = &frame->ipd_data;
+    lastdata = frame->ipd_idx_data_prev;
+    band_stop = self->num_bands_ipd;
+  } else {
+    frame_xxx_data = &frame->cld_data;
+    lastdata = frame->cmp_cld_idx_prev;
+    band_stop = self->bs_param_bands;
+  }
+  data_set = 0;
+  for (i = 0; i < self->num_parameter_sets; i++) {
+    frame_xxx_data->bs_xxx_data_mode[i] =
+        ixheaacd_read_bits_buf(it_bit_buff, 2);
+    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
+      data_set++;
+    }
+  }
+
+  set_index = 0;
+  bs_data_pair = 0;
+  old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx_prev;
+
+  for (i = 0; i < self->num_parameter_sets; i++) {
+    if (frame_xxx_data->bs_xxx_data_mode[i] == 0) {
+      for (pb = 0; pb < band_stop; pb++) {
+        lastdata[pb] = default_val;
+      }
+
+      old_quant_coarse_xxx = 0;
+    }
+
+    if (frame_xxx_data->bs_xxx_data_mode[i] == 3) {
+      if (bs_data_pair) {
+        bs_data_pair = 0;
+      } else {
+        bs_data_pair = ixheaacd_read_bits_buf(it_bit_buff, 1);
+        frame_xxx_data->bs_quant_coarse_xxx[set_index] =
+            ixheaacd_read_bits_buf(it_bit_buff, 1);
+        frame_xxx_data->bs_freq_res_stride_xxx[set_index] =
+            ixheaacd_read_bits_buf(it_bit_buff, 2);
+
+        if (frame_xxx_data->bs_quant_coarse_xxx[set_index] !=
+            old_quant_coarse_xxx) {
+          if (old_quant_coarse_xxx) {
+            ixheaacd_mps_coarse2fine(lastdata, datatype, 0, band_stop - 0);
+          } else {
+            ixheaacd_mps_fine2coarse(lastdata, band_stop);
+          }
+        }
+
+        data_bands = ixheaacd_mps_getstridemap(
+            frame_xxx_data->bs_freq_res_stride_xxx[set_index], start_band,
+            band_stop, strides);
+        for (pb = 0; pb < data_bands; pb++) {
+          lastdata[pb] = lastdata[strides[pb]];
+        }
+
+        ixheaacd_mps_ecdatapairdec(
+            it_bit_buff, data, lastdata, datatype, set_index, 0, data_bands, bs_data_pair,
+            frame_xxx_data->bs_quant_coarse_xxx[set_index],
+            !(frame->independency_flag && (i == 0)) || (set_index > 0), 1, 0, self->ec_flag);
+
+        for (pb = 0; pb < data_bands; pb++) {
+          for (j = strides[pb]; j < strides[pb + 1]; j++) {
+            if (datatype == IPD) {
+              if (frame_xxx_data->bs_quant_coarse_xxx[set_index]) {
+                lastdata[j] = data[set_index + bs_data_pair][pb] & 7;
+              } else {
+                lastdata[j] = data[set_index + bs_data_pair][pb] & 15;
+              }
+            } else {
+              lastdata[j] = data[set_index + bs_data_pair][pb];
+            }
+          }
+        }
+
+        old_quant_coarse_xxx = frame_xxx_data->bs_quant_coarse_xxx[set_index];
+
+        if (bs_data_pair) {
+          frame_xxx_data->bs_quant_coarse_xxx[set_index + 1] =
+              frame_xxx_data->bs_quant_coarse_xxx[set_index];
+          frame_xxx_data->bs_freq_res_stride_xxx[set_index + 1] =
+              frame_xxx_data->bs_freq_res_stride_xxx[set_index];
+        }
+        set_index += bs_data_pair + 1;
+      }
+    }
+  }
+}
+
+IA_ERRORCODE ixheaacd_ld_mps_frame_parsing(
+    ia_mps_dec_state_struct *self, ia_bit_buf_struct *it_bit_buff) {
+  WORD32 i, bs_frame_type, data_bands, bs_temp_shape_enable,
+      num_of_temp_shape_ch;
+  WORD32 ps, pg, ts, ic;
+  WORD32 env_shape_data[MAX_TIME_SLOTS];
+  WORD32 alignment;
+  WORD32 bits_param_slot = 0;
+
+  ia_mps_bs_frame *frame = &(self->bs_frame);
+  alignment = it_bit_buff->cnt_bits;
+  if (self->parse_nxt_frame == 0) return IA_NO_ERROR;
+
+  self->num_parameter_sets_prev = self->num_parameter_sets;
+
+  bs_frame_type = ixheaacd_read_bits_buf(it_bit_buff, 1);
+  self->num_parameter_sets = ixheaacd_read_bits_buf(it_bit_buff, 1) + 1;
+
+  if (self->time_slots == 32)
+    bits_param_slot = 5;
+  else if (self->time_slots == 64)
+    bits_param_slot = 6;
+  else if (self->time_slots == 8)
+    bits_param_slot = 3;
+  else if (self->time_slots == 16 || self->time_slots == 15)
+    bits_param_slot = 4;
+
+  if (bs_frame_type) {
+    for (i = 0; i < self->num_parameter_sets; i++) {
+      self->param_slots[i] =
+          ixheaacd_read_bits_buf(it_bit_buff, bits_param_slot);
+    }
+  } else {
+    self->param_slots[0] = self->time_slots - 1;
+  }
+
+  frame->independency_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+  for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
+    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx, CLD,
+                                    0);
+  }
+
+  if (self->ldmps_config.bs_one_icc) {
+    ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx, ICC,
+                                    0);
+  } else {
+    for (i = 0; i < self->ldmps_config.num_ott_boxes; i++) {
+      if (!self->ldmps_config.ott_mode_lfe[i])
+        ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_icc_idx,
+                                        ICC, 0);
+    }
+  }
+
+  for (ps = 0; ps < self->num_parameter_sets; ps++) {
+    frame->bs_smooth_mode[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
+    if (frame->bs_smooth_mode[ps] >= 2) {
+      frame->bs_smooth_time[ps] = ixheaacd_read_bits_buf(it_bit_buff, 2);
+    }
+    if (frame->bs_smooth_mode[ps] == 3) {
+      frame->bs_freq_res_stride_smg[ps] =
+          ixheaacd_read_bits_buf(it_bit_buff, 2);
+      data_bands =
+          (ixheaacd_freq_res_table_ld[self->ldmps_config.bs_freq_res] - 1) /
+              ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]] +
+          1;
+      for (pg = 0; pg < data_bands; pg++) {
+        frame->bs_smg_data[ps][pg] = ixheaacd_read_bits_buf(it_bit_buff, 1);
+      }
+    }
+  }
+
+  for (i = 0; i < 2; i++) {
+    self->temp_shape_enable_ch_stp[i] = 0;
+    self->temp_shape_enable_ch_ges[i] = 0;
+  }
+
+  if (self->ldmps_config.bs_temp_shape_config != 0) {
+    bs_temp_shape_enable = ixheaacd_read_bits_buf(it_bit_buff, 1);
+    if (bs_temp_shape_enable) {
+      num_of_temp_shape_ch = 2;
+      switch (self->ldmps_config.bs_temp_shape_config) {
+        case 1:
+          for (i = 0; i < num_of_temp_shape_ch; i++) {
+            self->temp_shape_enable_ch_stp[i] =
+                ixheaacd_read_bits_buf(it_bit_buff, 1);
+          }
+          break;
+        case 2:
+          for (i = 0; i < num_of_temp_shape_ch; i++) {
+            self->temp_shape_enable_ch_ges[i] =
+                ixheaacd_read_bits_buf(it_bit_buff, 1);
+          }
+          for (i = 0; i < num_of_temp_shape_ch; i++) {
+            if (self->temp_shape_enable_ch_ges[i]) {
+              ixheaacd_mps_huff_decode(it_bit_buff, env_shape_data,
+                                       self->time_slots);
+              for (ts = 0; ts < self->time_slots; ts++) {
+                self->env_shape_data[i][ts] = (FLOAT32)pow(
+                    2, (FLOAT32)env_shape_data[ts] /
+                               (self->ldmps_config.bs_env_quant_mode + 2) -
+                           1);
+              }
+            }
+          }
+          break;
+        default:
+          if (self->ec_flag == 0) {
+          return IA_FATAL_ERROR;
+      }
+          break;
+      }
+    }
+  }
+
+  if (self->ldmps_config.bs_arbitrary_downmix != 0) {
+    for (ic = 0; ic < self->ldmps_config.num_input_channels; ic++) {
+      ixheaacd_ld_mps_ecdata_decoding(self, it_bit_buff, frame->cmp_cld_idx,
+                                      CLD, 0);
+    }
+  }
+
+  ixheaacd_byte_align(it_bit_buff, &alignment);
+
+  while (it_bit_buff->cnt_bits > 8) {
+    ixheaacd_read_bits_buf(it_bit_buff, 8);
+  }
+  ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
+  return IA_NO_ERROR;
+}
+
+static VOID ixheaacd_mps_createmapping(WORD32 map[MAX_PARAMETER_BANDS + 1],
+                                       WORD32 band_start, WORD32 band_stop,
+                                       WORD32 ch_fac) {
+  WORD32 input_bands, out_bands, bands_achived, bands_diff, incr, k, i;
+  WORD32 vdk[MAX_PARAMETER_BANDS + 1];
   input_bands = band_stop - band_start;
   out_bands = (input_bands - 1) / ch_fac + 1;
   if (out_bands < 1) {
@@ -653,10 +961,10 @@
   }
 }
 
-static VOID ixheaacd_mps_mapfrequency(int *in, int *out, int *map,
-                                      int data_bands) {
-  int i, j, band_start, band_stop, value;
-  int start_band_0 = map[0];
+static VOID ixheaacd_mps_mapfrequency(WORD32 *in, WORD32 *out, WORD32 *map,
+                                      WORD32 data_bands) {
+  WORD32 i, j, band_start, band_stop, value;
+  WORD32 start_band_0 = map[0];
 
   for (i = 0; i < data_bands; i++) {
     value = in[i + start_band_0];
@@ -669,10 +977,10 @@
   }
 }
 
-static float ixheaacd_mps_de_quantize(int value, int param_type) {
+static FLOAT32 ixheaacd_mps_de_quantize(WORD32 value, WORD32 param_type) {
   switch (param_type) {
     case CLD:
-      return ixheaacd_cld_de_quant_table[value + 15];
+      return ixheaacd_cld_de_quant_table[(value + 15)];
 
     case ICC:
       return ixheaacd_icc_de_quant_table[value];
@@ -681,31 +989,31 @@
       return ixheaacd_ipd_de_quant_table[(value & 15)];
 
     default:
-      assert(0);
-      return 0.0;
+      return 0;
+      return 0;
   }
 }
 
-static WORD32 ixheaacd_mps_mapindexdata(
+static IA_ERRORCODE ixheaacd_mps_mapindexdata(
     ia_mps_dec_state_struct *self, ia_mps_data_struct *frame_xxx_data,
-    float out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
-    int out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
-    int cmp_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
-    int idx_prev[MAX_PARAMETER_BANDS], int param_type) {
-  int interpolate_local[MAX_PARAMETER_SETS_MPS] = {0};
-  int map[MAX_PARAMETER_BANDS + 1];
+    FLOAT32 out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
+    WORD32 out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
+    WORD32 cmp_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS],
+    WORD32 idx_prev[MAX_PARAMETER_BANDS], WORD32 param_type) {
+  WORD32 interpolate_local[MAX_PARAMETER_SETS_MPS] = {0};
+  WORD32 map[MAX_PARAMETER_BANDS + 1];
 
-  int set_index, i, band, parm_slot;
-  int data_bands, ch_fac;
-  int ps;
+  WORD32 set_index, i, band, parm_slot;
+  WORD32 data_bands, ch_fac;
+  WORD32 ps;
 
-  int i1, i2, x1, xi, x2;
-  int band_start = 0;
-  int ext_frame_flag = self->ext_frame_flag;
-  int *param_slots = self->param_slots;
-  int num_parameter_sets = self->num_parameter_sets;
-  int band_stop = self->bs_param_bands;
-  int default_val = 0;
+  WORD32 i1, i2, x1, xi, x2;
+  WORD32 band_start = 0;
+  WORD32 ext_frame_flag = self->ext_frame_flag;
+  WORD32 *param_slots = self->param_slots;
+  WORD32 num_parameter_sets = self->num_parameter_sets;
+  WORD32 band_stop = self->bs_param_bands;
+  WORD32 default_val = 0;
 
   set_index = 0;
 
@@ -794,10 +1102,13 @@
 
     if (interpolate_local[i] == 1) {
       if (i2 < num_parameter_sets) {
-        return -1;
+        if (self->ec_flag == 0) {
+          return IA_FATAL_ERROR;
+        }
       }
+
       for (band = band_start; band < band_stop; band++) {
-        int yi, y1, y2;
+        WORD32 yi, y1, y2;
         yi = 0;
         y1 = out_idx_data[i1][band];
         y2 = out_idx_data[i2][band];
@@ -805,9 +1116,7 @@
           if (y2 - y1 > 8) y1 += 16;
           if (y1 - y2 > 8) y2 += 16;
 
-          if (x2 != x1) {
-            yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16;
-          }
+          if (x2 != x1) yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16;
         } else {
           if (x2 != x1) {
             yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1);
@@ -822,7 +1131,7 @@
     for (band = band_start; band < band_stop; band++) {
       if (param_type == CLD) {
         out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], -15, 15);
-      } else if (param_type == ICC)  // param_type is ICC
+      } else if (param_type == ICC)
       {
         out_idx_data[ps][band] = bound_check(out_idx_data[ps][band], 0, 7);
       }
@@ -839,46 +1148,44 @@
           out_idx_data[num_parameter_sets - 1][band];
     }
   }
-
-  return 0;
+  return IA_NO_ERROR;
 }
 
-static WORD32 ixheaacd_mps_dec_and_mapframeott(ia_mps_dec_state_struct *self) {
+static IA_ERRORCODE ixheaacd_mps_dec_and_mapframeott(
+    ia_mps_dec_state_struct *self) {
   ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame);
-  WORD32 err_code = 0;
+  IA_ERRORCODE err_code = 0;
 
   err_code = ixheaacd_mps_mapindexdata(
       self, &cur_bit_stream_ptr->cld_data, self->cld_data,
       cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx,
       cur_bit_stream_ptr->cld_idx_pre, CLD);
-  if (err_code != 0) return err_code;
-
+  if (err_code != IA_NO_ERROR) return err_code;
   err_code = ixheaacd_mps_mapindexdata(
       self, &cur_bit_stream_ptr->icc_data, self->icc_data,
       cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx,
       cur_bit_stream_ptr->icc_idx_pre, ICC);
-  if (err_code != 0) return err_code;
+  if (err_code != IA_NO_ERROR) return err_code;
   if ((self->config->bs_phase_coding)) {
     err_code = ixheaacd_mps_mapindexdata(
         self, &cur_bit_stream_ptr->ipd_data, self->ipd_data,
         cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data,
         cur_bit_stream_ptr->ipd_idx_prev, IPD);
 
-    if (err_code != 0) return err_code;
+    if (err_code != IA_NO_ERROR) return err_code;
   }
-
-  return 0;
+  return IA_NO_ERROR;
 }
 
 static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) {
-  int ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop,
+  WORD32 ps, pb, pg, ch_fac, data_bands, param_band_start, param_band_stop,
       group_to_band[MAX_PARAMETER_BANDS + 1];
   ia_mps_bs_frame *frame = &(self->bs_frame);
   for (ps = 0; ps < self->num_parameter_sets; ps++) {
     switch (frame->bs_smooth_mode[ps]) {
       case 0:
         self->smoothing_time[ps] = 256;
-        self->inv_smoothing_time[ps] = 4194304;
+        self->inv_smoothing_time[ps] = (FLOAT32)(1.0f / 256.0f);
 
         for (pb = 0; pb < self->bs_param_bands; pb++) {
           self->smoothing_data[ps][pb] = 0;
@@ -908,8 +1215,7 @@
         self->smoothing_time[ps] =
             ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
         self->inv_smoothing_time[ps] =
-            ixheaacd_inverse_smoothing_time_table_q30[frame
-                                                          ->bs_smooth_time[ps]];
+            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
         for (pb = 0; pb < self->bs_param_bands; pb++) {
           self->smoothing_data[ps][pb] = 1;
         }
@@ -919,8 +1225,7 @@
         self->smoothing_time[ps] =
             ixheaacd_smoothing_time_table[frame->bs_smooth_time[ps]];
         self->inv_smoothing_time[ps] =
-            ixheaacd_inverse_smoothing_time_table_q30[frame
-                                                          ->bs_smooth_time[ps]];
+            ixheaacd_inverse_smoothing_time_table[frame->bs_smooth_time[ps]];
 
         ch_fac = ixheaacd_mps_stride_table[frame->bs_freq_res_stride_smg[ps]];
         data_bands = (self->bs_param_bands - 1) / ch_fac + 1;
@@ -958,20 +1263,18 @@
   }
 }
 
-WORD32 ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) {
-  int i;
-  WORD32 err_code = 0;
-  if (self->parse_nxt_frame == 1) return 0;
-
+IA_ERRORCODE ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) {
+  WORD32 i;
+  IA_ERRORCODE err_code = 0;
+  if (self->ldmps_config.ldmps_present_flag != 1)
+    if (self->parse_nxt_frame == 1) return err_code;
   self->ext_frame_flag = 0;
   if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) {
     self->ext_frame_flag = 1;
   }
 
   err_code = ixheaacd_mps_dec_and_mapframeott(self);
-
-  if (err_code != 0) return err_code;
-
+  if (err_code != IA_NO_ERROR) return err_code;
   ixheaacd_mps_dec_and_mapframesmg(self);
 
   if (self->ext_frame_flag) {
@@ -979,68 +1282,149 @@
     self->param_slots[self->num_parameter_sets - 1] = self->time_slots - 1;
   }
   self->param_slot_diff[0] = self->param_slots[0] + 1;
-  self->inv_param_slot_diff[0] = (float)1 / self->param_slot_diff[0];
+  if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) {
+    if (self->ec_flag == 0) {
+      return -1;
+    } else {
+      self->param_slot_diff[0] = MAX_TIME_SLOTS;
+    }
+  }
+  self->inv_param_slot_diff[0] = (FLOAT32)1 / self->param_slot_diff[0];
   self->inv_param_slot_diff_Q30[0] =
-      (int)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5);
+      (WORD32)floor(self->inv_param_slot_diff[0] * 1073741824 + 0.5);
   for (i = 1; i < self->num_parameter_sets; i++) {
     self->param_slot_diff[i] = self->param_slots[i] - self->param_slots[i - 1];
-    self->inv_param_slot_diff[i] = (float)1 / self->param_slot_diff[i];
+    if (MAX_TIME_SLOTS < (self->param_slot_diff[0] + self->param_slot_diff[i])) {
+      if (self->ec_flag == 0) {
+        return -1;
+      } else {
+        self->param_slot_diff[i] = 1;
+        self->inv_param_slot_diff[i] = 1;
+      }
+    }
+    self->inv_param_slot_diff[i] = (FLOAT32)1 / self->param_slot_diff[i];
     self->inv_param_slot_diff_Q30[i] =
-        (int)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5);
+        (WORD32)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5);
   }
-
-  return 0;
+  return IA_NO_ERROR;
 }
 
 WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) {
-  self->time_slots = self->frame_length;
-  self->frame_len = self->time_slots * self->qmf_band_count;
+  WORD32 samp_freq;
+  WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000,
+                                24000, 22050, 16000, 12000, 11025, 8000,
+                                7350,  0,     0,     0};
+
+  if (self->ldmps_config.ldmps_present_flag == 1)
+    self->time_slots = self->frame_length + 1;
+  else
+    self->time_slots = self->frame_length;
+
   self->bs_param_bands = ixheaacd_freq_res_table[self->config->bs_freq_res];
 
-  self->hyb_band_count = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
+  if (self->ldmps_config.ldmps_present_flag == 1) {
+    if (self->ldmps_config.bs_sampling_freq_index == 15) {
+      samp_freq = self->ldmps_config.bs_fampling_frequency;
+    } else {
+      samp_freq = sampling_rate_tbl[self->ldmps_config.bs_sampling_freq_index];
+    }
 
-  switch (self->bs_param_bands) {
-    case 4:
+    if (samp_freq < 27713.0) {
+      self->qmf_band_count = 32;
+    } else if (samp_freq >= 55426.0) {
+      self->qmf_band_count = 128;
+    } else {
+      self->qmf_band_count = 64;
+    }
+  }
 
-      self->hyb_band_to_processing_band_table =
-          ixheaacd_hybrid_band_71_to_processing_band_4_map;
-      break;
-    case 5:
+  if (self->object_type == AOT_ER_AAC_ELD ||
+      self->object_type == AOT_ER_AAC_LD) {
+    self->bs_param_bands =
+        ixheaacd_freq_res_table_ld[self->config->bs_freq_res];
+    self->hyb_band_count_max = self->qmf_band_count;
+  } else
+    self->hyb_band_count_max = self->qmf_band_count - QMF_BANDS_TO_HYBRID + 10;
 
-      self->hyb_band_to_processing_band_table =
-          ixheaacd_hybrid_band_71_to_processing_band_5_map;
-      break;
-    case 7:
+  if (self->object_type == AOT_ER_AAC_ELD ||
+      self->object_type == AOT_ER_AAC_LD) {
+    switch (self->bs_param_bands) {
+      case 4:
 
-      self->hyb_band_to_processing_band_table =
-          ixheaacd_hybrid_band_71_to_processing_band_7_map;
-      break;
-    case 10:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_64_to_processing_band_4_map;
+        break;
+      case 5:
 
-      self->hyb_band_to_processing_band_table =
-          ixheaacd_hybrid_band_71_to_processing_band_10_map;
-      break;
-    case 14:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_64_to_processing_band_5_map;
+        break;
+      case 7:
 
-      self->hyb_band_to_processing_band_table =
-          ixheaacd_hybrid_band_71_to_processing_band_14_map;
-      break;
-    case 20:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_64_to_processing_band_7_map;
+        break;
+      case 9:
 
-      self->hyb_band_to_processing_band_table =
-          ixheaacd_hybrid_band_71_to_processing_band_20_map;
-      break;
-    case 28:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_64_to_processing_band_9_map;
+        break;
+      case 12:
 
-      self->hyb_band_to_processing_band_table =
-          ixheaacd_hybrid_band_71_to_processing_band_28_map;
-      break;
-    default:
-      self->hyb_band_to_processing_band_table = NULL;
-      return -1;
-      break;
-  };
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_64_to_processing_band_12_map;
+        break;
+      case 15:
 
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_64_to_processing_band_15_map;
+        break;
+      case 23:
+
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_64_to_processing_band_23_map;
+        break;
+      default:
+        self->hyb_band_to_processing_band_table = NULL;
+        return -1;
+        break;
+    }
+  } else {
+    switch (self->bs_param_bands) {
+      case 4:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_71_to_processing_band_4_map;
+        break;
+      case 5:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_71_to_processing_band_5_map;
+        break;
+      case 7:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_71_to_processing_band_7_map;
+        break;
+      case 10:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_71_to_processing_band_10_map;
+        break;
+      case 14:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_71_to_processing_band_14_map;
+        break;
+      case 20:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_71_to_processing_band_20_map;
+        break;
+      case 28:
+        self->hyb_band_to_processing_band_table =
+            ixheaacd_hybrid_band_71_to_processing_band_28_map;
+        break;
+      default:
+        self->hyb_band_to_processing_band_table = NULL;
+        return -1;
+        break;
+    }
+  }
   self->in_ch_count = 1;
   self->out_ch_count = 2;
 
@@ -1050,27 +1434,30 @@
   if (self->config->bs_ott_bands_phase_present) {
     self->num_bands_ipd = self->config->bs_ott_bands_phase;
   } else {
-    switch (self->bs_param_bands) {
-      case 4:
-      case 5:
-        self->num_bands_ipd = 2;
-        break;
-      case 7:
-        self->num_bands_ipd = 3;
-        break;
-      case 10:
-        self->num_bands_ipd = 5;
-        break;
-      case 14:
-        self->num_bands_ipd = 7;
-        break;
-      case 20:
-      case 28:
-        self->num_bands_ipd = 10;
-        break;
-      default:
-        assert(0);
-        break;
+    if (!(self->object_type == AOT_ER_AAC_ELD ||
+          self->object_type == AOT_ER_AAC_LD)) {
+      switch (self->bs_param_bands) {
+        case 4:
+        case 5:
+          self->num_bands_ipd = 2;
+          break;
+        case 7:
+          self->num_bands_ipd = 3;
+          break;
+        case 10:
+          self->num_bands_ipd = 5;
+          break;
+        case 14:
+          self->num_bands_ipd = 7;
+          break;
+        case 20:
+        case 28:
+          self->num_bands_ipd = 10;
+          break;
+        default:
+          return -1;
+          break;
+      }
     }
   }
 
@@ -1093,6 +1480,7 @@
   self->decor_sig_count = 1;
 
   self->bs_high_rate_mode = self->config->bs_high_rate_mode;
+  self->pre_mix_req = 1;
 
   return 0;
 }
diff --git a/decoder/ixheaacd_mps_poly_filt.c b/decoder/ixheaacd_mps_poly_filt.c
index 315f0c7..c1db952 100644
--- a/decoder/ixheaacd_mps_poly_filt.c
+++ b/decoder/ixheaacd_mps_poly_filt.c
@@ -18,102 +18,59 @@
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
 #include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
 #include "ixheaacd_type_def.h"
-#include "ixheaacd_interface.h"
-#include "ixheaacd_mps_polyphase.h"
-#include "ixheaacd_bitbuffer.h"
-#include "ixheaacd_config.h"
-#include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
 #include "ixheaacd_constants.h"
-#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_interface.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_dec.h"
 #include "ixheaacd_function_selector.h"
 
-extern const WORD32
-    ixheaacd_mps_polyphase_filter_coeff_fix[10 * MAX_NUM_QMF_BANDS_SAC / 2];
-extern const WORD32 ixheaacd_mps_pre_re[64];
-extern const WORD32 ixheaacd_mps_pre_im[64];
-extern const WORD32 ixheaacd_mps_post_re[128];
-extern const WORD32 ixheaacd_mps_post_im[128];
+extern const FLOAT32
+    ixheaacd_mps_polyphase_filter_coeff[10 * MAX_NUM_QMF_BANDS_SAC / 2];
+extern const FLOAT32 ixheaacd_mps_post_twid[30];
+extern const FLOAT32 ixheaacd_mps_pre_twid[64];
 
-static PLATFORM_INLINE WORD32 ixheaacd_mult32(WORD32 a, WORD32 b) {
-  WORD32 result;
-  WORD64 temp_result;
+extern const FLOAT32 ixheaacd_ldmps_polyphase_filter_coeff[1280];
 
-  temp_result = (WORD64)a * (WORD64)b;
-  result = (WORD32)(temp_result >> 31);
+extern const FLOAT32 ixheaacd_ldmps_pre_twid[32];
+extern const FLOAT32 ixheaacd_mps_post_re_32[64];
+extern const FLOAT32 ixheaacd_mps_post_im_32[64];
 
-  return (result);
+
+VOID ixheaacd_mps_synt_init(FLOAT32 state[POLY_PHASE_SYNTH_SIZE]) {
+  memset(state, 0, sizeof(FLOAT32) * POLY_PHASE_SYNTH_SIZE);
 }
 
-VOID ixheaacd_mps_synt_create(ia_mps_poly_phase_struct *kernel,
-                              WORD32 resolution) {
-  kernel->resolution = resolution;
-}
-
-VOID ixheaacd_mps_synt_init(ia_mps_poly_phase_synth_struct *self) {
-  memset(self->state, 0, sizeof(WORD32) * 64 * 20);
-}
-
-static VOID ixheaacd_float_to_int32(FLOAT32 *in, WORD32 *out, WORD32 q_factor,
-                                    WORD32 sample) {
-  WORD32 loop;
-  UWORD32 temp = (1 << q_factor);
-
-  for (loop = 0; loop < sample; loop++) out[loop] = (WORD32)(in[loop] * temp);
-}
-
-VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re,
-                                       const WORD32 *table_im,
-                                       WORD32 resolution) {
-  WORD32 tmp, k;
-  for (k = 0; k < 2 * resolution; k += 2) {
-    tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k >> 1]),
-                             ixheaacd_mult32(ptr_in[k + 1], table_im[k >> 1]));
-    ptr_in[k + 1] = ixheaacd_add32_sat(
-        ixheaacd_mult32(ixheaacd_negate32_sat(ptr_in[k]), table_im[k >> 1]),
-        ixheaacd_mult32(ptr_in[k + 1], table_re[k >> 1]));
-
-    ptr_in[k] = tmp;
-  }
-}
-
-VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re,
-                                        const WORD32 *table_im,
-                                        WORD32 resolution) {
-  WORD32 tmp, k;
-  for (k = 0; k < 2 * resolution; k += 2) {
-    tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k]),
-                             ixheaacd_mult32(ptr_in[k + 1], table_im[k]));
-
-    ptr_in[k + 1] = ixheaacd_add32_sat(
-        ixheaacd_mult32(ixheaacd_negate32_sat(ptr_in[k]), table_im[k]),
-        ixheaacd_mult32(ptr_in[k + 1], table_re[k]));
-
-    ptr_in[k] = tmp;
-  }
-}
-
-VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, WORD32 *fin_re,
-                                            WORD32 *fin_im,
-                                            const WORD32 *table_re,
-                                            const WORD32 *table_im,
-                                            WORD32 *state) {
+VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, FLOAT32 *fin_re,
+  FLOAT32 *fin_im,
+  const FLOAT32 *table_re,
+  const FLOAT32 *table_im,
+  FLOAT32 *state) {
   WORD32 l;
   for (l = 0; l < 2 * resolution; l++) {
     state[2 * resolution - l - 1] =
-        ixheaacd_add32_sat(ixheaacd_mult32(fin_re[l], table_re[l]),
-                           ixheaacd_mult32(fin_im[l], table_im[l]));
+      ((fin_re[l] * table_re[l]) + (fin_im[l] * table_im[l]));
   }
 }
 
-VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out,
-                                    WORD32 *state, const WORD32 *filter_coeff) {
+VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, FLOAT32 *out,
+                                    FLOAT32 *state,
+                                    const FLOAT32 *filter_coeff) {
   WORD32 l, k;
-  WORD32 *out1, *out2, *state1, *state2;
+  FLOAT32 *out1, *out2, *state1, *state2;
   out1 = out;
   out2 = out + resolution;
   state1 = state;
@@ -121,8 +78,8 @@
 
   for (k = 0; k < 5; k++) {
     for (l = 0; l < resolution; l++) {
-      *out1++ = (WORD32)(((WORD64)(*state1++) * (*filter_coeff++)) >> 31);
-      *out2++ = (WORD32)(((WORD64)(*state2++) * (*filter_coeff++)) >> 31);
+      *out1++ = (*state1++) * (*filter_coeff++);
+      *out2++ = (*state2++) * (*filter_coeff++);
     }
     out1 += resolution;
     out2 += resolution;
@@ -131,64 +88,304 @@
   }
 }
 
-VOID ixheaacd_mps_synt_calc(ia_mps_dec_state_struct *self) {
-  WORD32 k, l, ts, ch;
-  WORD64 acc;
-  WORD32 ptr_in[128];
-  WORD32 fin_re[128];
-  WORD32 fin_im[128];
-  FLOAT32 temp;
-  WORD32 *state, *tmp_state, *out;
-  const WORD32 *filt_coeff;
-  WORD32 *tmp_buf = self->tmp_buf;
+VOID ixheaacd_mps_synt_out_calc_dec_ldmps(WORD32 resolution, FLOAT32 *out,
+  FLOAT32 *state, const FLOAT32 *filter_coeff) {
+  WORD32 l, k;
+  FLOAT32 *out1, *out2, *state1, *state2;
+  const FLOAT32 *filter1, *filter2;
+  filter1 = filter_coeff;
+  filter2 = filter_coeff + resolution;
+  out1 = out;
+  out2 = out + resolution;
+  state1 = state;
+  state2 = state + (3 * resolution);
 
-  ia_mps_poly_phase_struct kernel = self->poly_phase_filt_kernel;
-  WORD32 resolution = kernel.resolution;
-  for (ch = 0; ch < self->out_ch_count; ch++) {
-    tmp_state = (&self->qmf_filt_state[ch])->state;
-    state = &tmp_buf[self->time_slots * 2 * resolution];
-    memcpy(state, tmp_state, sizeof(WORD32) * 20 * resolution);
-    out = &tmp_buf[74 * MAX_NUM_QMF_BANDS_SAC];
+  for (k = 0; k < 5; k++) {
+    for (l = 0; l < resolution; l++) {
+      *out1++ = (*state1++) * (*filter1++);
+      *out2++ = (*state2++) * (*filter2++);
+    }
+    filter1 += resolution;
+    filter2 += resolution;
+    out1 += resolution;
+    out2 += resolution;
+    state1 += (3 * resolution);
+    state2 += (3 * resolution);
+  }
+}
 
-    for (ts = 0; ts < self->time_slots; ts++) {
-      ixheaacd_float_to_int32(&self->qmf_out_dir[ch][ts][0].re, ptr_in, 10,
-                              resolution * 2);
+VOID ixheaacd_mps_synt_out_calc_dec_ldmps_32(WORD32 resolution, FLOAT32 *out,
+  FLOAT32 *state, const FLOAT32 *filter_coeff) {
+  WORD32 l, k;
+  FLOAT32 *out1, *out2, *state1, *state2;
+  const FLOAT32 *filter1, *filter2;
+  filter1 = filter_coeff;
+  filter2 = filter_coeff + 2 * resolution;
+  out1 = out;
+  out2 = out + resolution;
+  state1 = state;
+  state2 = state + (3 * resolution);
 
-      filt_coeff = ixheaacd_mps_polyphase_filter_coeff_fix;
+  for (k = 0; k < 5; k++) {
+    for (l = 0; l < resolution; l++) {
+      *out1++ = ((*state1++) * (filter1[2*l] + filter1[2*l+1])/2);
+      *out2++ = ((*state2++) *  (filter2[2 * l] + filter2[2 * l + 1])/2);
+    }
+    filter1 += 4 * resolution;
+    filter2 += 4 * resolution;
+    out1 += resolution;
+    out2 += resolution;
+    state1 += (3 * resolution);
+    state2 += (3 * resolution);
+  }
+}
 
-      state -= (2 * resolution);
-      (*ixheaacd_mps_synt_pre_twiddle)(ptr_in, ixheaacd_mps_pre_re,
-                                       ixheaacd_mps_pre_im, resolution);
+VOID ixheaacd_mps_synth_pre_twidle(FLOAT32 *out_re, FLOAT32 *out_im,
+                                   FLOAT32 *c_in, WORD32 len) {
+  WORD32 i;
+  FLOAT32 *c_s = c_in;
+  FLOAT32 *p_re_s = out_re;
+  FLOAT32 *p_im_s = out_im;
+  FLOAT32 *c_e = c_in + (len << 1) - 1;
+  FLOAT32 *p_im_e = out_im + len - 1;
+  FLOAT32 *p_re_e = out_re + len - 1;
+  const FLOAT32 *prtw = ixheaacd_mps_pre_twid;
 
-      (*ixheaacd_mps_complex_fft_64)(ptr_in, fin_re, fin_im, resolution);
+  for (i = 0; i < len; i += 4) {
+    *p_re_s = ((*c_s++) * (*prtw));
+    p_re_s++;
+    *p_im_s = -((*c_s--) * (*prtw));
+    p_im_s++;
+    *p_im_s = ((*c_e--) * (*prtw));
+    p_im_s--;
+    *p_re_s = ((*c_e++) * (*prtw++));
+    p_re_s--;
+    *p_im_s += ((*c_e--) * (*prtw));
+    p_im_s++;
+    *p_re_s += ((*c_e--) * (*prtw));
+    p_re_s++;
+    *p_re_s -= ((*c_s++) * (*prtw));
+    p_re_s++;
+    *p_im_s += ((*c_s++) * (*prtw++));
+    p_im_s++;
+    *p_im_e = ((*c_e--) * (*prtw));
+    p_im_e--;
+    *p_re_e = -((*c_e++) * (*prtw));
+    p_re_e--;
+    *p_re_e = ((*c_s++) * (*prtw));
+    p_re_e++;
+    *p_im_e = ((*c_s--) * (*prtw++));
+    p_im_e++;
+    *p_re_e += ((*c_s++) * (*prtw));
+    p_re_e--;
+    *p_im_e += ((*c_s++) * (*prtw));
+    p_im_e--;
+    *p_im_e -= ((*c_e--) * (*prtw));
+    p_im_e--;
+    *p_re_e += ((*c_e--) * (*prtw++));
+    p_re_e--;
+  }
+}
 
-      (*ixheaacd_mps_synt_post_twiddle)(ptr_in, ixheaacd_mps_post_re,
-                                        ixheaacd_mps_post_im, resolution);
+VOID ixheaacd_mps_synth_post_twidle(FLOAT32 *state, FLOAT32 *out_re,
+                                    FLOAT32 *out_im, WORD32 len) {
+  WORD32 i;
+  {
+    FLOAT32 x_0, x_1, x_2, x_3;
+    FLOAT32 *p_re_e, *p_im_e;
+    const FLOAT32 *potw = ixheaacd_mps_post_twid;
+    FLOAT32 *p_re_s = out_re;
+    FLOAT32 *p_im_s = out_im;
 
-      (*ixheaacd_mps_complex_fft_64)(ptr_in, &fin_re[1], &fin_im[1],
-                                     resolution);
+    p_re_e = p_re_s + (len - 2);
+    p_im_e = p_im_s + (len - 2);
+    x_0 = *p_re_e;
+    x_1 = *(p_re_e + 1);
+    x_2 = *p_im_e;
+    x_3 = *(p_im_e + 1);
 
-      (*ixheaacd_mps_synt_post_fft_twiddle)(resolution, fin_re, fin_im,
-                                            ixheaacd_mps_post_re,
-                                            ixheaacd_mps_post_im, state);
-      (*ixheaacd_mps_synt_out_calc)(resolution, out, state, filt_coeff);
+    *(p_re_e + 1) = -*(p_re_s + 1);
+    *(p_im_e + 1) = -*p_im_s;
+    *p_im_s = *(p_im_s + 1);
 
-      for (k = 0; k < resolution; k++) {
-        acc = 0;
-        for (l = 0; l < 10; l++) {
-          acc = acc + out[resolution * l + k];
-        }
-        if (acc >= 2147483647)
-          temp = 1.0;
-        else if (acc <= -2147483647 - 1)
-          temp = -1.0f;
-        else
-          temp = (FLOAT32)((WORD32)acc) / ((FLOAT32)(1 << 10));
+    for (i = 5; i < len; i += 4) {
+      FLOAT32 twdr = *potw++;
+      FLOAT32 twdi = *potw++;
+      FLOAT32 tmp;
 
-        self->output_buffer[ch][self->qmf_band_count * ts + k] = (FLOAT32)temp;
-      }
+      *p_re_e = (x_0 * twdi);
+      *p_re_e += (x_1 * twdr);
+      p_re_e--;
+      p_re_s++;
+      *p_re_s = (x_0 * twdr);
+      *p_re_s -= (x_1 * twdi);
+      p_re_s++;
+      x_1 = *p_re_e--;
+      x_0 = *p_re_e++;
+      *p_re_e = (*p_re_s++ * twdi);
+      *p_re_e += -(*p_re_s * twdr);
+      p_re_e--;
+      tmp = (*p_re_s-- * twdi);
+      *p_re_s = tmp + (*p_re_s * twdr);
+
+      *p_im_e = -(x_2 * twdr);
+      *p_im_e += (x_3 * twdi);
+      p_im_e--;
+      p_im_s++;
+      *p_im_s = -(x_2 * twdi);
+      *p_im_s -= (x_3 * twdr);
+      p_im_s++;
+      x_3 = *p_im_e--;
+      x_2 = *p_im_e++;
+      *p_im_e = -(*p_im_s++ * twdr);
+      *p_im_e -= (*p_im_s * twdi);
+      p_im_e--;
+      tmp = (*p_im_s-- * twdr);
+      *p_im_s = tmp - (*p_im_s * twdi);
     }
 
-    memcpy(tmp_state, state, sizeof(WORD32) * 20 * resolution);
+    *p_re_e = 0.7071067f * (x_1 + x_0);
+    *p_im_e = 0.7071067f * (x_3 - x_2);
+    *(p_re_s + 1) = -0.7071067f * (x_1 - x_0);
+    *(p_im_s + 1) = -0.7071067f * (x_3 + x_2);
+  }
+
+  for (i = 0; i < len; i++) {
+    state[i] = out_im[i] - out_re[i];
+    state[len + i] = out_im[len - i - 1] + out_re[len - i - 1];
+    state[len - i - 1] = out_im[len - i - 1] - out_re[len - i - 1];
+    state[2 * len - i - 1] = out_im[i] + out_re[i];
+  }
+}
+
+VOID ixheaacd_mps_synt_pre_twiddle_dec(FLOAT32 *ptr_in, const FLOAT32 *table,
+  FLOAT32 *fin_re, FLOAT32 *fin_im,
+  WORD32 resolution) {
+  WORD32 k;
+  FLOAT32 *c_s = ptr_in;
+  FLOAT32 *p_re_s = fin_re;
+  FLOAT32 *p_im_s = fin_im;
+  FLOAT32 *c_e = ptr_in + (resolution << 1) - 1;
+  FLOAT32 *p_im_e = fin_im + resolution - 1;
+  FLOAT32 *p_re_e = fin_re + resolution - 1;
+
+  for (k = 0; k < resolution; k += 2) {
+    *p_re_s = (*c_s++) * (*table);
+    *p_im_s = (*c_s) * (*table);
+
+    *p_re_e = (*c_e--) * (*table);
+    *p_im_e = -(*c_e) * (*table++);
+
+    *p_re_s += (*c_s--) * (*table);
+    *p_im_s += -(*c_s++) * (*table);
+    p_re_s++;
+    p_im_s++;
+    c_s++;
+
+    *p_re_e += (*c_e++) * (*table);
+    *p_im_e += (*c_e--) * (*table++);
+    p_re_e--;
+    p_im_e--;
+    c_e--;
+  }
+}
+
+VOID ixheaacd_mps_synt_calc(ia_mps_dec_state_struct *self) {
+  WORD32 k, l, ts, ch;
+  FLOAT32 *state, *tmp_state, *out;
+  const FLOAT32 *filt_coeff;
+  FLOAT32 *tmp_buf = self->tmp_buf;
+  FLOAT32 fin_re[64] = {0};
+  FLOAT32 fin_im[64] = {0};
+
+  WORD32 resolution = self->resolution;
+  WORD32 m_resolution = resolution >> 1;
+  const FLOAT32 *ixheaacd_mps_post_re, *ixheaacd_mps_post_im;
+  VOID(*ixheaacd_mps_synt_out_calc_pointer)
+  (WORD32 resolution, FLOAT32 *out, FLOAT32 *state, const FLOAT32 *filter_coeff);
+
+  if (self->ldmps_config.ldmps_present_flag)
+  {
+    ixheaacd_mps_synt_out_calc_pointer = &ixheaacd_mps_synt_out_calc_dec_ldmps;
+    filt_coeff = ixheaacd_ldmps_polyphase_filter_coeff;
+  }
+  else
+  {
+    ixheaacd_mps_synt_out_calc_pointer = ixheaacd_mps_synt_out_calc;
+    filt_coeff = ixheaacd_mps_polyphase_filter_coeff;
+  }
+  if (self->qmf_band_count == 32)
+  {
+    for (ch = 0; ch < self->out_ch_count; ch++) {
+      tmp_state = self->qmf_filt_state[ch];
+      state = &tmp_buf[self->time_slots * 2 * resolution];
+      memcpy(state, tmp_state, sizeof(FLOAT32) * 18 * resolution);
+      out = &tmp_buf[74 * MAX_NUM_QMF_BANDS_SAC];
+
+      ixheaacd_mps_post_re = ixheaacd_mps_post_re_32;
+      ixheaacd_mps_post_im = ixheaacd_mps_post_im_32;
+
+      for (ts = 0; ts < self->time_slots; ts++) {
+
+        state -= (2 * resolution);
+
+        ixheaacd_mps_synt_pre_twiddle_dec(&self->qmf_out_dir[ch][ts][0].re,
+            ixheaacd_ldmps_pre_twid, fin_re, fin_im, resolution);
+
+        for (k = resolution; k < 2 * resolution; k++)
+        {
+          fin_re[k] = 0;
+          fin_im[k] = 0;
+        }
+
+        ixheaacd_mps_complex_fft(fin_re, fin_im, 2 * resolution);
+
+        ixheaacd_mps_synt_post_fft_twiddle_dec(resolution, fin_re, fin_im,
+                                              ixheaacd_mps_post_re,
+                                              ixheaacd_mps_post_im, state);
+
+        ixheaacd_mps_synt_out_calc_dec_ldmps_32(resolution, out, state, filt_coeff);
+
+        for (k = 0; k < resolution; k++) {
+          FLOAT32 acc = out[k];
+          for (l = 1; l < 10; l++) {
+            acc += out[resolution * l + k];
+          }
+          self->output_buffer[ch][self->qmf_band_count * ts + k] = acc;
+        }
+      }
+      memcpy(tmp_state, state, sizeof(FLOAT32) * 18 * resolution);
+    }
+  }
+  else
+  {
+    for (ch = 0; ch < self->out_ch_count; ch++) {
+      tmp_state = self->qmf_filt_state[ch];
+      state = &tmp_buf[self->time_slots * 2 * resolution];
+      memcpy(state, tmp_state, sizeof(FLOAT32) * 18 * resolution);
+      out = &tmp_buf[74 * MAX_NUM_QMF_BANDS_SAC];
+
+      for (ts = 0; ts < self->time_slots; ts++) {
+
+        state -= (2 * resolution);
+
+        ixheaacd_mps_synth_pre_twidle(
+          fin_re, fin_im, &self->qmf_out_dir[ch][ts][0].re, resolution);
+
+        ixheaacd_mps_synth_calc_fft(fin_re, fin_im, m_resolution);
+
+        ixheaacd_mps_synth_post_twidle(state, fin_re, fin_im, resolution);
+        (*ixheaacd_mps_synt_out_calc_pointer)(resolution, out, state, filt_coeff);
+
+        for (k = 0; k < resolution; k++) {
+          FLOAT32 acc = out[k];
+          for (l = 1; l < 10; l++) {
+            acc += out[resolution * l + k];
+          }
+          self->output_buffer[ch][self->qmf_band_count * ts + k] = acc;
+        }
+      }
+      memcpy(tmp_state, state, sizeof(FLOAT32) * 18 * resolution);
+    }
   }
 }
diff --git a/decoder/ixheaacd_mps_polyphase.c b/decoder/ixheaacd_mps_polyphase.c
new file mode 100644
index 0000000..62aae1d
--- /dev/null
+++ b/decoder/ixheaacd_mps_polyphase.c
@@ -0,0 +1,1182 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_defines.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_error_standards.h"
+
+static VOID ixheaacd_fft32(WORD32 *vec, const WORD16 *fft_c) {
+  WORD32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, tmp10, tmp11, tmp12, tmp13,
+      tmp14, tmp15;
+  WORD32 temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18, temp19, temp110,
+      temp111, temp112, temp113, temp114, temp115;
+  WORD32 temp20, temp21, temp22, temp23, temp24, temp25, temp26, temp27, temp28, temp29, temp210,
+      temp211, temp212, temp213, temp214, temp215;
+  WORD32 temp30, temp31, temp32, temp33, temp34, temp35, temp36, temp37, temp38, temp39, temp310,
+      temp311, temp312, temp313, temp314, temp315;
+  WORD32 temp316, temp317, temp318, temp319, temp320, temp321, temp322, temp323, temp324, temp325,
+      temp326, temp327, temp328, temp329, temp330, temp331;
+  WORD32 temp40, temp41, temp42, temp43, temp44, temp45, temp46, temp47, temp48, temp49, temp410,
+      temp411, temp412, temp413, temp414, temp415;
+
+  temp20 = ixheaacd_sub32_sat(vec[2], vec[34]);
+  temp21 = ixheaacd_sub32_sat(vec[3], vec[35]);
+  temp30 = ixheaacd_add32_sat(vec[0], vec[32]);
+  temp31 = ixheaacd_add32_sat(vec[1], vec[33]);
+  temp32 = ixheaacd_add32_sat(vec[2], vec[34]);
+  temp33 = ixheaacd_add32_sat(vec[3], vec[35]);
+
+  temp22 = ixheaacd_sub32_sat(vec[6], vec[38]);
+  temp23 = ixheaacd_sub32_sat(vec[7], vec[39]);
+  temp34 = ixheaacd_add32_sat(vec[4], vec[36]);
+  temp35 = ixheaacd_add32_sat(vec[5], vec[37]);
+  temp36 = ixheaacd_add32_sat(vec[6], vec[38]);
+  temp37 = ixheaacd_add32_sat(vec[7], vec[39]);
+
+  temp24 = ixheaacd_sub32_sat(vec[10], vec[42]);
+  temp25 = ixheaacd_sub32_sat(vec[11], vec[43]);
+  temp38 = ixheaacd_add32_sat(vec[8], vec[40]);
+  temp39 = ixheaacd_add32_sat(vec[9], vec[41]);
+  temp310 = ixheaacd_add32_sat(vec[10], vec[42]);
+  temp311 = ixheaacd_add32_sat(vec[11], vec[43]);
+
+  temp26 = ixheaacd_sub32_sat(vec[14], vec[46]);
+  temp27 = ixheaacd_sub32_sat(vec[15], vec[47]);
+  temp312 = ixheaacd_add32_sat(vec[12], vec[44]);
+  temp313 = ixheaacd_add32_sat(vec[13], vec[45]);
+  temp314 = ixheaacd_add32_sat(vec[14], vec[46]);
+  temp315 = ixheaacd_add32_sat(vec[15], vec[47]);
+
+  temp28 = ixheaacd_sub32_sat(vec[18], vec[50]);
+  temp29 = ixheaacd_sub32_sat(vec[19], vec[51]);
+  temp316 = ixheaacd_add32_sat(vec[16], vec[48]);
+  temp317 = ixheaacd_add32_sat(vec[17], vec[49]);
+  temp318 = ixheaacd_add32_sat(vec[18], vec[50]);
+  temp319 = ixheaacd_add32_sat(vec[19], vec[51]);
+
+  temp210 = ixheaacd_sub32_sat(vec[22], vec[54]);
+  temp211 = ixheaacd_sub32_sat(vec[23], vec[55]);
+  temp320 = ixheaacd_add32_sat(vec[20], vec[52]);
+  temp321 = ixheaacd_add32_sat(vec[21], vec[53]);
+  temp322 = ixheaacd_add32_sat(vec[22], vec[54]);
+  temp323 = ixheaacd_add32_sat(vec[23], vec[55]);
+
+  temp212 = ixheaacd_sub32_sat(vec[26], vec[58]);
+  temp213 = ixheaacd_sub32_sat(vec[27], vec[59]);
+  temp324 = ixheaacd_add32_sat(vec[24], vec[56]);
+  temp325 = ixheaacd_add32_sat(vec[25], vec[57]);
+  temp326 = ixheaacd_add32_sat(vec[26], vec[58]);
+  temp327 = ixheaacd_add32_sat(vec[27], vec[59]);
+
+  temp214 = ixheaacd_sub32_sat(vec[30], vec[62]);
+  temp215 = ixheaacd_sub32_sat(vec[31], vec[63]);
+  temp328 = ixheaacd_add32_sat(vec[28], vec[60]);
+  temp329 = ixheaacd_add32_sat(vec[29], vec[61]);
+  temp330 = ixheaacd_add32_sat(vec[30], vec[62]);
+  temp331 = ixheaacd_add32_sat(vec[31], vec[63]);
+
+  temp41 = -ixheaacd_add32_sat(temp20, temp214);
+  temp42 = ixheaacd_sub32_sat(temp20, temp214);
+  temp40 = ixheaacd_add32_sat(temp21, temp215);
+  temp43 = ixheaacd_sub32_sat(temp21, temp215);
+  temp45 = -ixheaacd_add32_sat(temp22, temp212);
+  temp46 = ixheaacd_sub32_sat(temp22, temp212);
+  temp44 = ixheaacd_add32_sat(temp23, temp213);
+  temp47 = ixheaacd_sub32_sat(temp23, temp213);
+  temp49 = -ixheaacd_add32_sat(temp24, temp210);
+  temp410 = ixheaacd_sub32_sat(temp24, temp210);
+  temp48 = ixheaacd_add32_sat(temp25, temp211);
+  temp411 = ixheaacd_sub32_sat(temp25, temp211);
+  temp413 = -ixheaacd_add32_sat(temp26, temp28);
+  temp414 = ixheaacd_sub32_sat(temp26, temp28);
+  temp412 = ixheaacd_add32_sat(temp27, temp29);
+  temp415 = ixheaacd_sub32_sat(temp27, temp29);
+
+  temp20 = ixheaacd_add32_sat(ixheaacd_add32_sat(ixheaacd_add32_sat(
+           ixheaacd_mult32x16in32_shl(temp40, fft_c[3]),
+           ixheaacd_mult32x16in32_shl(temp44, fft_c[2])),
+           ixheaacd_mult32x16in32_shl(temp48, fft_c[1])),
+           ixheaacd_mult32x16in32_shl(temp412, fft_c[0]));
+
+  temp24 = ixheaacd_sub32_sat(ixheaacd_add32_sat(ixheaacd_add32_sat(
+           ixheaacd_mult32x16in32_shl(temp40, fft_c[2]),
+           ixheaacd_mult32x16in32_shl(temp44, fft_c[0])),
+           ixheaacd_mult32x16in32_shl(temp48, fft_c[3])),
+           ixheaacd_mult32x16in32_shl(temp412, fft_c[1]));
+
+  temp28 = ixheaacd_add32_sat(ixheaacd_sub32_sat(ixheaacd_add32_sat(
+           ixheaacd_mult32x16in32_shl(temp40, fft_c[1]),
+           ixheaacd_mult32x16in32_shl(temp44, fft_c[3])),
+           ixheaacd_mult32x16in32_shl(temp48, fft_c[0])),
+           ixheaacd_mult32x16in32_shl(temp412, fft_c[2]));
+
+  temp212 = ixheaacd_sub32_sat(ixheaacd_add32_sat(ixheaacd_sub32_sat(
+            ixheaacd_mult32x16in32_shl(temp40, fft_c[0]),
+            ixheaacd_mult32x16in32_shl(temp44, fft_c[1])),
+            ixheaacd_mult32x16in32_shl(temp48, fft_c[2])),
+            ixheaacd_mult32x16in32_shl(temp412, fft_c[3]));
+
+  temp21 = ixheaacd_add32_sat(ixheaacd_add32_sat(ixheaacd_add32_sat(
+           ixheaacd_mult32x16in32_shl(temp41, fft_c[3]),
+           ixheaacd_mult32x16in32_shl(temp45, fft_c[2])),
+           ixheaacd_mult32x16in32_shl(temp49, fft_c[1])),
+           ixheaacd_mult32x16in32_shl(temp413, fft_c[0]));
+
+  temp25 = ixheaacd_sub32_sat(ixheaacd_add32_sat(ixheaacd_add32_sat(
+           ixheaacd_mult32x16in32_shl(temp41, fft_c[2]),
+           ixheaacd_mult32x16in32_shl(temp45, fft_c[0])),
+           ixheaacd_mult32x16in32_shl(temp49, fft_c[3])),
+           ixheaacd_mult32x16in32_shl(temp413, fft_c[1]));
+
+  temp29 = ixheaacd_add32_sat(ixheaacd_sub32_sat(ixheaacd_add32_sat(
+           ixheaacd_mult32x16in32_shl(temp41, fft_c[1]),
+           ixheaacd_mult32x16in32_shl(temp45, fft_c[3])),
+           ixheaacd_mult32x16in32_shl(temp49, fft_c[0])),
+           ixheaacd_mult32x16in32_shl(temp413, fft_c[2]));
+
+  temp213 = ixheaacd_sub32_sat(ixheaacd_add32_sat(ixheaacd_sub32_sat(
+            ixheaacd_mult32x16in32_shl(temp41, fft_c[0]),
+            ixheaacd_mult32x16in32_shl(temp45, fft_c[1])),
+            ixheaacd_mult32x16in32_shl(temp49, fft_c[2])),
+            ixheaacd_mult32x16in32_shl(temp413, fft_c[3]));
+
+  temp22 = ixheaacd_add32_sat(ixheaacd_add32_sat(ixheaacd_add32_sat(
+           ixheaacd_mult32x16in32_shl(temp42, fft_c[0]),
+           ixheaacd_mult32x16in32_shl(temp46, fft_c[1])),
+           ixheaacd_mult32x16in32_shl(temp410, fft_c[2])),
+           ixheaacd_mult32x16in32_shl(temp414, fft_c[3]));
+
+  temp26 = ixheaacd_sub32_sat(ixheaacd_sub32_sat(ixheaacd_sub32_sat(
+           ixheaacd_mult32x16in32_shl(temp42, fft_c[1]),
+           ixheaacd_mult32x16in32_shl(temp46, fft_c[3])),
+           ixheaacd_mult32x16in32_shl(temp410, fft_c[0])),
+           ixheaacd_mult32x16in32_shl(temp414, fft_c[2]));
+
+  temp210 = ixheaacd_add32_sat(ixheaacd_add32_sat(ixheaacd_sub32_sat(
+            ixheaacd_mult32x16in32_shl(temp42, fft_c[2]),
+            ixheaacd_mult32x16in32_shl(temp46, fft_c[0])),
+            ixheaacd_mult32x16in32_shl(temp410, fft_c[3])),
+            ixheaacd_mult32x16in32_shl(temp414, fft_c[1]));
+
+  temp214 = ixheaacd_sub32_sat(ixheaacd_add32_sat(ixheaacd_sub32_sat(
+            ixheaacd_mult32x16in32_shl(temp42, fft_c[3]),
+            ixheaacd_mult32x16in32_shl(temp46, fft_c[2])),
+            ixheaacd_mult32x16in32_shl(temp410, fft_c[1])),
+            ixheaacd_mult32x16in32_shl(temp414, fft_c[0]));
+
+  temp23 = ixheaacd_add32_sat(ixheaacd_add32_sat(ixheaacd_add32_sat(
+           ixheaacd_mult32x16in32_shl(temp43, fft_c[0]),
+           ixheaacd_mult32x16in32_shl(temp47, fft_c[1])),
+           ixheaacd_mult32x16in32_shl(temp411, fft_c[2])),
+           ixheaacd_mult32x16in32_shl(temp415, fft_c[3]));
+
+  temp27 = ixheaacd_sub32_sat(ixheaacd_sub32_sat(ixheaacd_sub32_sat(
+           ixheaacd_mult32x16in32_shl(temp43, fft_c[1]),
+           ixheaacd_mult32x16in32_shl(temp47, fft_c[3])),
+           ixheaacd_mult32x16in32_shl(temp411, fft_c[0])),
+           ixheaacd_mult32x16in32_shl(temp415, fft_c[2]));
+
+  temp211 = ixheaacd_add32_sat(ixheaacd_add32_sat(ixheaacd_sub32_sat(
+            ixheaacd_mult32x16in32_shl(temp43, fft_c[2]),
+            ixheaacd_mult32x16in32_shl(temp47, fft_c[0])),
+            ixheaacd_mult32x16in32_shl(temp411, fft_c[3])),
+            ixheaacd_mult32x16in32_shl(temp415, fft_c[1]));
+
+  temp215 = ixheaacd_sub32_sat(ixheaacd_add32_sat(ixheaacd_sub32_sat(
+            ixheaacd_mult32x16in32_shl(temp43, fft_c[3]),
+            ixheaacd_mult32x16in32_shl(temp47, fft_c[2])),
+            ixheaacd_mult32x16in32_shl(temp411, fft_c[1])),
+            ixheaacd_mult32x16in32_shl(temp415, fft_c[0]));
+
+  temp40 = ixheaacd_add32_sat(temp20, temp22);
+  temp414 = ixheaacd_sub32_sat(temp20, temp22);
+  temp41 = ixheaacd_add32_sat(temp21, temp23);
+  temp415 = ixheaacd_sub32_sat(temp21, temp23);
+  temp42 = ixheaacd_add32_sat(temp24, temp26);
+  temp412 = ixheaacd_sub32_sat(temp24, temp26);
+  temp43 = ixheaacd_add32_sat(temp25, temp27);
+  temp413 = ixheaacd_sub32_sat(temp25, temp27);
+  temp44 = ixheaacd_add32_sat(temp28, temp210);
+  temp410 = ixheaacd_sub32_sat(temp28, temp210);
+  temp45 = ixheaacd_add32_sat(temp29, temp211);
+  temp411 = ixheaacd_sub32_sat(temp29, temp211);
+  temp46 = ixheaacd_add32_sat(temp212, temp214);
+  temp48 = ixheaacd_sub32_sat(temp212, temp214);
+  temp47 = ixheaacd_add32_sat(temp213, temp215);
+  temp49 = ixheaacd_sub32_sat(temp213, temp215);
+
+  temp10 = ixheaacd_add32_sat(temp30, temp316);
+  temp11 = ixheaacd_add32_sat(temp31, temp317);
+  temp12 = ixheaacd_add32_sat(temp32, temp318);
+  temp13 = ixheaacd_add32_sat(temp33, temp319);
+  temp14 = ixheaacd_add32_sat(temp34, temp320);
+  temp15 = ixheaacd_add32_sat(temp35, temp321);
+  temp16 = ixheaacd_add32_sat(temp36, temp322);
+  temp17 = ixheaacd_add32_sat(temp37, temp323);
+  temp18 = ixheaacd_add32_sat(temp38, temp324);
+  temp19 = ixheaacd_add32_sat(temp39, temp325);
+  temp110 = ixheaacd_add32_sat(temp310, temp326);
+  temp111 = ixheaacd_add32_sat(temp311, temp327);
+  temp112 = ixheaacd_add32_sat(temp312, temp328);
+  temp113 = ixheaacd_add32_sat(temp313, temp329);
+  temp114 = ixheaacd_add32_sat(temp314, temp330);
+  temp115 = ixheaacd_add32_sat(temp315, temp331);
+
+  tmp0 = ixheaacd_add32_sat(temp10, temp18);
+  tmp2 = ixheaacd_sub32_sat(temp10, temp18);
+  tmp1 = ixheaacd_add32_sat(temp11, temp19);
+  tmp3 = ixheaacd_sub32_sat(temp11, temp19);
+  tmp4 = ixheaacd_add32_sat(temp12, temp110);
+  tmp6 = ixheaacd_sub32_sat(temp12, temp110);
+  tmp5 = ixheaacd_add32_sat(temp13, temp111);
+  tmp7 = ixheaacd_sub32_sat(temp13, temp111);
+  tmp8 = ixheaacd_add32_sat(temp14, temp112);
+  tmp10 = ixheaacd_sub32_sat(temp14, temp112);
+  tmp9 = ixheaacd_add32_sat(temp15, temp113);
+  tmp11 = ixheaacd_sub32_sat(temp15, temp113);
+  tmp12 = ixheaacd_add32_sat(temp16, temp114);
+  tmp14 = ixheaacd_sub32_sat(temp16, temp114);
+  tmp13 = ixheaacd_add32_sat(temp17, temp115);
+  tmp15 = ixheaacd_sub32_sat(temp17, temp115);
+
+  temp20 = ixheaacd_add32_sat(tmp0, tmp8);
+  temp24 = ixheaacd_sub32_sat(tmp0, tmp8);
+  temp21 = ixheaacd_add32_sat(tmp1, tmp9);
+  temp25 = ixheaacd_sub32_sat(tmp1, tmp9);
+  temp28 = ixheaacd_sub32_sat(tmp2, tmp11);
+  temp210 = ixheaacd_add32_sat(tmp2, tmp11);
+  temp29 = ixheaacd_add32_sat(tmp3, tmp10);
+  temp211 = ixheaacd_sub32_sat(tmp3, tmp10);
+  temp22 = ixheaacd_add32_sat(tmp4, tmp12);
+  temp27 = ixheaacd_sub32_sat(tmp4, tmp12);
+  temp23 = ixheaacd_add32_sat(tmp5, tmp13);
+  temp26 = ixheaacd_sub32_sat(tmp13, tmp5);
+
+  tmp1 = ixheaacd_add32_sat(tmp6, tmp14);
+  tmp2 = ixheaacd_sub32_sat(tmp6, tmp14);
+  tmp0 = ixheaacd_add32_sat(tmp7, tmp15);
+  tmp3 = ixheaacd_sub32_sat(tmp7, tmp15);
+
+  temp212 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(tmp0, tmp2), INV_SQRT2_Q15);
+  temp214 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(tmp0, tmp2), INV_SQRT2_Q15);
+  temp213 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(tmp3, tmp1), INV_SQRT2_Q15);
+  temp215 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(tmp1, tmp3), -INV_SQRT2_Q15);
+
+  temp10 = ixheaacd_sub32_sat(temp30, temp316);
+  temp11 = ixheaacd_sub32_sat(temp31, temp317);
+  temp12 = ixheaacd_sub32_sat(temp32, temp318);
+  temp13 = ixheaacd_sub32_sat(temp33, temp319);
+  temp14 = ixheaacd_sub32_sat(temp34, temp320);
+  temp15 = ixheaacd_sub32_sat(temp35, temp321);
+  temp16 = ixheaacd_sub32_sat(temp36, temp322);
+  temp17 = ixheaacd_sub32_sat(temp37, temp323);
+  temp18 = ixheaacd_sub32_sat(temp38, temp324);
+  temp19 = ixheaacd_sub32_sat(temp39, temp325);
+  temp110 = ixheaacd_sub32_sat(temp310, temp326);
+  temp111 = ixheaacd_sub32_sat(temp311, temp327);
+  temp112 = ixheaacd_sub32_sat(temp312, temp328);
+  temp113 = ixheaacd_sub32_sat(temp313, temp329);
+  temp114 = ixheaacd_sub32_sat(temp314, temp330);
+  temp115 = ixheaacd_sub32_sat(temp315, temp331);
+
+  temp30 = ixheaacd_add32_sat(temp20, temp22);
+  temp316 = ixheaacd_sub32_sat(temp20, temp22);
+  temp31 = ixheaacd_add32_sat(temp21, temp23);
+  temp317 = ixheaacd_sub32_sat(temp21, temp23);
+  temp38 = ixheaacd_sub32_sat(temp24, temp26);
+  temp324 = ixheaacd_add32_sat(temp24, temp26);
+  temp39 = ixheaacd_sub32_sat(temp25, temp27);
+  temp325 = ixheaacd_add32_sat(temp25, temp27);
+  temp312 = ixheaacd_add32_sat(temp28, temp214);
+  temp328 = ixheaacd_sub32_sat(temp28, temp214);
+  temp313 = ixheaacd_add32_sat(temp29, temp215);
+  temp329 = ixheaacd_sub32_sat(temp29, temp215);
+  temp34 = ixheaacd_add32_sat(temp210, temp212);
+  temp320 = ixheaacd_sub32_sat(temp210, temp212);
+  temp35 = ixheaacd_add32_sat(temp211, temp213);
+  temp321 = ixheaacd_sub32_sat(temp211, temp213);
+
+  tmp9 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp12, temp114), -COS_3PI_BY_8_Q15);
+  tmp10 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp12, temp114), COS_PI_BY_8_Q15);
+  tmp8 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp13, temp115), COS_3PI_BY_8_Q15);
+  tmp11 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp13, temp115), COS_PI_BY_8_Q15);
+  tmp5 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp14, temp112), -INV_SQRT2_Q15);
+  tmp6 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp14, temp112), INV_SQRT2_Q15);
+  tmp4 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp15, temp113), INV_SQRT2_Q15);
+  tmp7 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp15, temp113), INV_SQRT2_Q15);
+  tmp13 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp16, temp110), -COS_PI_BY_8_Q15);
+  tmp14 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp16, temp110), COS_3PI_BY_8_Q15);
+  tmp12 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp17, temp111), COS_PI_BY_8_Q15);
+  tmp15 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp17, temp111), COS_3PI_BY_8_Q15);
+
+  temp12 = ixheaacd_sub32_sat(ixheaacd_shl32(ixheaacd_mult32x16in32(tmp8, SQRT2PLUS1_Q13), 3),
+           ixheaacd_mult32x16in32_shl(tmp12, SQRT2MINUS1_Q15));
+  temp13 = ixheaacd_sub32_sat(ixheaacd_shl32(ixheaacd_mult32x16in32(tmp9, SQRT2PLUS1_Q13), 3),
+           ixheaacd_mult32x16in32_shl(tmp13, SQRT2MINUS1_Q15));
+  temp14 = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(tmp10, SQRT2MINUS1_Q15),
+           ixheaacd_shl32(ixheaacd_mult32x16in32(tmp14, SQRT2PLUS1_Q13), 3));
+  temp15 = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(tmp11, SQRT2MINUS1_Q15),
+           ixheaacd_shl32(ixheaacd_mult32x16in32(tmp15, SQRT2PLUS1_Q13), 3));
+
+  tmp8 = ixheaacd_add32_sat(tmp8, tmp12);
+  tmp9 = ixheaacd_add32_sat(tmp9, tmp13);
+  tmp10 = ixheaacd_add32_sat(tmp10, tmp14);
+  tmp11 = ixheaacd_add32_sat(tmp11, tmp15);
+  temp16 = ixheaacd_add32_sat(temp10, tmp4);
+  temp110 = ixheaacd_sub32_sat(temp10, tmp4);
+  temp17 = ixheaacd_add32_sat(temp11, tmp5);
+  temp111 = ixheaacd_sub32_sat(temp11, tmp5);
+
+  temp112 = ixheaacd_sub32_sat(tmp6, temp19);
+  temp114 = ixheaacd_add32_sat(tmp6, temp19);
+  temp113 = ixheaacd_add32_sat(temp18, tmp7);
+  temp115 = ixheaacd_sub32_sat(temp18, tmp7);
+
+  tmp0 = ixheaacd_sub32_sat(temp16, temp114);
+  tmp2 = ixheaacd_add32_sat(temp16, temp114);
+  tmp1 = ixheaacd_add32_sat(temp17, temp115);
+  tmp3 = ixheaacd_sub32_sat(temp17, temp115);
+  tmp4 = ixheaacd_add32_sat(temp110, temp112);
+  tmp6 = ixheaacd_sub32_sat(temp110, temp112);
+  tmp5 = ixheaacd_add32_sat(temp111, temp113);
+  tmp7 = ixheaacd_sub32_sat(temp111, temp113);
+
+  temp110 = ixheaacd_add32_sat(tmp8, tmp10);
+  tmp10 = ixheaacd_sub32_sat(tmp8, tmp10);
+  temp111 = ixheaacd_add32_sat(tmp9, tmp11);
+  tmp11 = ixheaacd_sub32_sat(tmp9, tmp11);
+
+  tmp12 = ixheaacd_add32_sat(temp12, temp14);
+  tmp14 = ixheaacd_sub32_sat(temp12, temp14);
+  tmp13 = ixheaacd_add32_sat(temp13, temp15);
+  tmp15 = ixheaacd_sub32_sat(temp13, temp15);
+
+  temp32 = ixheaacd_add32_sat(tmp2, temp110);
+  temp318 = ixheaacd_sub32_sat(tmp2, temp110);
+  temp33 = ixheaacd_add32_sat(tmp3, temp111);
+  temp319 = ixheaacd_sub32_sat(tmp3, temp111);
+  temp36 = ixheaacd_add32_sat(tmp0, tmp12);
+  temp322 = ixheaacd_sub32_sat(tmp0, tmp12);
+  temp37 = ixheaacd_add32_sat(tmp1, tmp13);
+  temp323 = ixheaacd_sub32_sat(tmp1, tmp13);
+  temp314 = ixheaacd_add32_sat(tmp4, tmp10);
+  temp330 = ixheaacd_sub32_sat(tmp4, tmp10);
+  temp315 = ixheaacd_add32_sat(tmp5, tmp11);
+  temp331 = ixheaacd_sub32_sat(tmp5, tmp11);
+  temp310 = ixheaacd_add32_sat(tmp6, tmp14);
+  temp326 = ixheaacd_sub32_sat(tmp6, tmp14);
+  temp311 = ixheaacd_add32_sat(tmp7, tmp15);
+  temp327 = ixheaacd_sub32_sat(tmp7, tmp15);
+
+  temp10 = ixheaacd_sub32_sat(vec[0], vec[32]);
+  temp11 = ixheaacd_sub32_sat(vec[1], vec[33]);
+  temp12 = ixheaacd_sub32_sat(vec[4], vec[36]);
+  temp13 = ixheaacd_sub32_sat(vec[5], vec[37]);
+  temp14 = ixheaacd_sub32_sat(vec[8], vec[40]);
+  temp15 = ixheaacd_sub32_sat(vec[9], vec[41]);
+  temp16 = ixheaacd_sub32_sat(vec[12], vec[44]);
+  temp17 = ixheaacd_sub32_sat(vec[13], vec[45]);
+  temp18 = ixheaacd_sub32_sat(vec[16], vec[48]);
+  temp19 = ixheaacd_sub32_sat(vec[17], vec[49]);
+  temp110 = ixheaacd_sub32_sat(vec[20], vec[52]);
+  temp111 = ixheaacd_sub32_sat(vec[21], vec[53]);
+  temp112 = ixheaacd_sub32_sat(vec[24], vec[56]);
+  temp113 = ixheaacd_sub32_sat(vec[25], vec[57]);
+  temp114 = ixheaacd_sub32_sat(vec[28], vec[60]);
+  temp115 = ixheaacd_sub32_sat(vec[29], vec[61]);
+
+  tmp9 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp12, temp114), -COS_3PI_BY_8_Q15);
+  tmp10 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp12, temp114), COS_PI_BY_8_Q15);
+  tmp8 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp13, temp115), COS_3PI_BY_8_Q15);
+  tmp11 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp13, temp115), COS_PI_BY_8_Q15);
+  tmp5 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp14, temp112), -INV_SQRT2_Q15);
+  tmp6 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp14, temp112), INV_SQRT2_Q15);
+  tmp4 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp15, temp113), INV_SQRT2_Q15);
+  tmp7 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp15, temp113), INV_SQRT2_Q15);
+  tmp13 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp16, temp110), -COS_PI_BY_8_Q15);
+  tmp14 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp16, temp110), COS_3PI_BY_8_Q15);
+  tmp12 = ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(temp17, temp111), COS_PI_BY_8_Q15);
+  tmp15 = ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(temp17, temp111), COS_3PI_BY_8_Q15);
+
+  temp12 = ixheaacd_sub32_sat(ixheaacd_shl32(ixheaacd_mult32x16in32(tmp8, SQRT2PLUS1_Q13), 3),
+           ixheaacd_mult32x16in32_shl(tmp12, SQRT2MINUS1_Q15));
+  temp13 = ixheaacd_sub32_sat(ixheaacd_shl32(ixheaacd_mult32x16in32(tmp9, SQRT2PLUS1_Q13), 3),
+           ixheaacd_mult32x16in32_shl(tmp13, SQRT2MINUS1_Q15));
+  temp14 = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(tmp10, SQRT2MINUS1_Q15),
+           ixheaacd_shl32(ixheaacd_mult32x16in32(tmp14, SQRT2PLUS1_Q13), 3));
+  temp15 = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(tmp11, SQRT2MINUS1_Q15),
+           ixheaacd_shl32(ixheaacd_mult32x16in32(tmp15, SQRT2PLUS1_Q13), 3));
+
+  tmp8 = ixheaacd_add32_sat(tmp8, tmp12);
+  tmp9 = ixheaacd_add32_sat(tmp9, tmp13);
+  tmp10 = ixheaacd_add32_sat(tmp10, tmp14);
+  tmp11 = ixheaacd_add32_sat(tmp11, tmp15);
+  temp16 = ixheaacd_add32_sat(temp10, tmp4);
+  temp110 = ixheaacd_sub32_sat(temp10, tmp4);
+  temp17 = ixheaacd_add32_sat(temp11, tmp5);
+  temp111 = ixheaacd_sub32_sat(temp11, tmp5);
+
+  temp112 = ixheaacd_sub32_sat(tmp6, temp19);
+  temp114 = ixheaacd_add32_sat(tmp6, temp19);
+  temp113 = ixheaacd_add32_sat(temp18, tmp7);
+  temp115 = ixheaacd_sub32_sat(temp18, tmp7);
+
+  tmp0 = ixheaacd_sub32_sat(temp16, temp114);
+  tmp2 = ixheaacd_add32_sat(temp16, temp114);
+  tmp1 = ixheaacd_add32_sat(temp17, temp115);
+  tmp3 = ixheaacd_sub32_sat(temp17, temp115);
+  tmp4 = ixheaacd_add32_sat(temp110, temp112);
+  tmp6 = ixheaacd_sub32_sat(temp110, temp112);
+  tmp5 = ixheaacd_add32_sat(temp111, temp113);
+  tmp7 = ixheaacd_sub32_sat(temp111, temp113);
+
+  temp110 = ixheaacd_add32_sat(tmp8, tmp10);
+  tmp10 = ixheaacd_sub32_sat(tmp8, tmp10);
+  temp111 = ixheaacd_add32_sat(tmp9, tmp11);
+  tmp11 = ixheaacd_sub32_sat(tmp9, tmp11);
+
+  tmp12 = ixheaacd_add32_sat(temp12, temp14);
+  tmp14 = ixheaacd_sub32_sat(temp12, temp14);
+  tmp13 = ixheaacd_add32_sat(temp13, temp15);
+  tmp15 = ixheaacd_sub32_sat(temp13, temp15);
+
+  temp10 = ixheaacd_add32_sat(tmp2, temp110);
+  temp18 = ixheaacd_sub32_sat(tmp2, temp110);
+  temp11 = ixheaacd_add32_sat(tmp3, temp111);
+  temp19 = ixheaacd_sub32_sat(tmp3, temp111);
+  temp12 = ixheaacd_add32_sat(tmp0, tmp12);
+  temp110 = ixheaacd_sub32_sat(tmp0, tmp12);
+  temp13 = ixheaacd_add32_sat(tmp1, tmp13);
+  temp111 = ixheaacd_sub32_sat(tmp1, tmp13);
+  temp16 = ixheaacd_add32_sat(tmp4, tmp10);
+  temp114 = ixheaacd_sub32_sat(tmp4, tmp10);
+  temp17 = ixheaacd_add32_sat(tmp5, tmp11);
+  temp115 = ixheaacd_sub32_sat(tmp5, tmp11);
+  temp14 = ixheaacd_add32_sat(tmp6, tmp14);
+  temp112 = ixheaacd_sub32_sat(tmp6, tmp14);
+  temp15 = ixheaacd_add32_sat(tmp7, tmp15);
+  temp113 = ixheaacd_sub32_sat(tmp7, tmp15);
+
+  *vec++ = temp30;
+  *vec++ = temp31;
+  *vec++ = ixheaacd_add32_sat(temp10, temp40);
+  *vec++ = ixheaacd_add32_sat(temp11, temp41);
+  *vec++ = temp32;
+  *vec++ = temp33;
+  *vec++ = ixheaacd_add32_sat(temp12, temp42);
+  *vec++ = ixheaacd_add32_sat(temp13, temp43);
+  *vec++ = temp34;
+  *vec++ = temp35;
+  *vec++ = ixheaacd_add32_sat(temp14, temp44);
+  *vec++ = ixheaacd_add32_sat(temp15, temp45);
+  *vec++ = temp36;
+  *vec++ = temp37;
+  *vec++ = ixheaacd_add32_sat(temp16, temp46);
+  *vec++ = ixheaacd_add32_sat(temp17, temp47);
+  *vec++ = temp38;
+  *vec++ = temp39;
+  *vec++ = ixheaacd_add32_sat(temp18, temp48);
+  *vec++ = ixheaacd_add32_sat(temp19, temp49);
+  *vec++ = temp310;
+  *vec++ = temp311;
+  *vec++ = ixheaacd_add32_sat(temp110, temp410);
+  *vec++ = ixheaacd_add32_sat(temp111, temp411);
+  *vec++ = temp312;
+  *vec++ = temp313;
+  *vec++ = ixheaacd_add32_sat(temp112, temp412);
+  *vec++ = ixheaacd_add32_sat(temp113, temp413);
+  *vec++ = temp314;
+  *vec++ = temp315;
+  *vec++ = ixheaacd_add32_sat(temp114, temp414);
+  *vec++ = ixheaacd_add32_sat(temp115, temp415);
+  *vec++ = temp316;
+  *vec++ = temp317;
+  *vec++ = ixheaacd_sub32_sat(temp10, temp40);
+  *vec++ = ixheaacd_sub32_sat(temp11, temp41);
+  *vec++ = temp318;
+  *vec++ = temp319;
+  *vec++ = ixheaacd_sub32_sat(temp12, temp42);
+  *vec++ = ixheaacd_sub32_sat(temp13, temp43);
+  *vec++ = temp320;
+  *vec++ = temp321;
+  *vec++ = ixheaacd_sub32_sat(temp14, temp44);
+  *vec++ = ixheaacd_sub32_sat(temp15, temp45);
+  *vec++ = temp322;
+  *vec++ = temp323;
+  *vec++ = ixheaacd_sub32_sat(temp16, temp46);
+  *vec++ = ixheaacd_sub32_sat(temp17, temp47);
+  *vec++ = temp324;
+  *vec++ = temp325;
+  *vec++ = ixheaacd_sub32_sat(temp18, temp48);
+  *vec++ = ixheaacd_sub32_sat(temp19, temp49);
+  *vec++ = temp326;
+  *vec++ = temp327;
+  *vec++ = ixheaacd_sub32_sat(temp110, temp410);
+  *vec++ = ixheaacd_sub32_sat(temp111, temp411);
+  *vec++ = temp328;
+  *vec++ = temp329;
+  *vec++ = ixheaacd_sub32_sat(temp112, temp412);
+  *vec++ = ixheaacd_sub32_sat(temp113, temp413);
+  *vec++ = temp330;
+  *vec++ = temp331;
+  *vec++ = ixheaacd_sub32_sat(temp114, temp414);
+  *vec++ = ixheaacd_sub32_sat(temp115, temp415);
+}
+
+static VOID ixheaacd_cos_mod(WORD32 *subband, ia_mps_dec_qmf_tables_struct *qmf_table_ptr) {
+  WORD32 i, m;
+  WORD16 wim, wre;
+  WORD32 temp_1;
+  const WORD16 *ptr1, *ptr2, *ptr3, *ptr4;
+  WORD32 re1, im1, re2, im2;
+
+  m = WORD_LENGTH;
+  ptr1 = qmf_table_ptr->sbr_sin_twiddle;
+  ptr2 = qmf_table_ptr->sbr_cos_twiddle;
+  ptr3 = qmf_table_ptr->sbr_sin_twiddle + 31;
+  ptr4 = qmf_table_ptr->sbr_cos_twiddle + 31;
+  for (i = 0; i < 16; i++) {
+    temp_1 = (i << 1);
+    re1 = subband[temp_1];
+    im2 = subband[temp_1 + 1];
+    re2 = subband[62 - temp_1];
+    im1 = subband[63 - temp_1];
+
+    wim = *ptr1++;
+    wre = *ptr2++;
+
+    subband[temp_1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(im1, wim), ixheaacd_mult32x16in32_shl(re1, wre));
+    subband[temp_1 + 1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(im1, wre), ixheaacd_mult32x16in32_shl(re1, wim));
+
+    wim = *ptr3--;
+    wre = *ptr4--;
+
+    subband[62 - temp_1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(im2, wim), ixheaacd_mult32x16in32_shl(re2, wre));
+    subband[63 - temp_1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(im2, wre), ixheaacd_mult32x16in32_shl(re2, wim));
+  }
+
+  ixheaacd_fft32(subband, qmf_table_ptr->fft_c);
+
+  ptr1 = qmf_table_ptr->sbr_alt_sin_twiddle;
+  ptr2 = qmf_table_ptr->sbr_alt_sin_twiddle + m;
+  wim = *ptr1++;
+  wre = *ptr2--;
+
+  for (i = 0; i < 16; i++) {
+    temp_1 = (i << 1);
+    re1 = subband[temp_1];
+    im1 = subband[temp_1 + 1];
+    re2 = subband[62 - temp_1];
+    im2 = subband[63 - temp_1];
+
+    subband[temp_1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(re1, wre), ixheaacd_mult32x16in32_shl(im1, wim));
+    subband[63 - temp_1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(re1, wim), ixheaacd_mult32x16in32_shl(im1, wre));
+
+    wim = *ptr1++;
+    wre = *ptr2--;
+
+    subband[62 - temp_1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(re2, wim), ixheaacd_mult32x16in32_shl(im2, wre));
+    subband[temp_1 + 1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(re2, wre), ixheaacd_mult32x16in32_shl(im2, wim));
+  }
+}
+
+static VOID ixheaacd_sin_mod(WORD32 *subband, ia_mps_dec_qmf_tables_struct *qmf_table_ptr) {
+  WORD32 i, m;
+  WORD16 wre, wim;
+  WORD32 temp_1;
+  WORD32 re1, im1, re2, im2;
+  const WORD16 *ptr1, *ptr2, *ptr3, *ptr4;
+
+  ptr1 = qmf_table_ptr->sbr_sin_twiddle;
+  ptr2 = qmf_table_ptr->sbr_cos_twiddle;
+  ptr3 = qmf_table_ptr->sbr_sin_twiddle + 31;
+  ptr4 = qmf_table_ptr->sbr_cos_twiddle + 31;
+
+  m = WORD_LENGTH;
+
+  for (i = 0; i < 16; i++) {
+    temp_1 = (i << 1);
+
+    re1 = subband[temp_1];
+    im2 = subband[temp_1 + 1];
+    re2 = subband[62 - temp_1];
+    im1 = subband[63 - temp_1];
+
+    wre = *ptr1++;
+    wim = *ptr2++;
+
+    subband[temp_1 + 1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(im1, wim), ixheaacd_mult32x16in32_shl(re1, wre));
+    subband[temp_1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(im1, wre), ixheaacd_mult32x16in32_shl(re1, wim));
+
+    wre = *ptr3--;
+    wim = *ptr4--;
+
+    subband[63 - temp_1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(im2, wim), ixheaacd_mult32x16in32_shl(re2, wre));
+    subband[62 - temp_1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(im2, wre), ixheaacd_mult32x16in32_shl(re2, wim));
+  }
+
+  ixheaacd_fft32(subband, qmf_table_ptr->fft_c);
+
+  ptr1 = qmf_table_ptr->sbr_alt_sin_twiddle;
+  ptr2 = qmf_table_ptr->sbr_alt_sin_twiddle + m;
+
+  wim = *ptr1++;
+  wre = *ptr2--;
+
+  for (i = 0; i < 16; i++) {
+    temp_1 = (i << 1);
+    re1 = subband[temp_1];
+    im1 = subband[temp_1 + 1];
+    re2 = subband[62 - temp_1];
+    im2 = subband[63 - temp_1];
+
+    subband[63 - temp_1] = -ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(re1, wre), ixheaacd_mult32x16in32_shl(im1, wim));
+    subband[temp_1] = -ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(re1, wim), ixheaacd_mult32x16in32_shl(im1, wre));
+
+    wim = *ptr1++;
+    wre = *ptr2--;
+
+    subband[temp_1 + 1] = -ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(re2, wim), ixheaacd_mult32x16in32_shl(im2, wre));
+    subband[62 - temp_1] = -ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(re2, wre), ixheaacd_mult32x16in32_shl(im2, wim));
+  }
+}
+
+static VOID ixheaacd_inverse_modulation(WORD32 *qmf_real, WORD32 *qmf_imag,
+                                        ia_mps_dec_qmf_tables_struct *qmf_table_ptr) {
+  WORD32 i;
+
+  const WORD16 *ptr1, *ptr2, *ptr3, *ptr4;
+  const WORD16 *fft = qmf_table_ptr->fft_c;
+  WORD16 wre, wim;
+  WORD32 re1, im1, re2, im2;
+  WORD32 re12, im12, re22, im22;
+  WORD32 temp_1;
+
+  ptr1 = qmf_table_ptr->sbr_sin_twiddle;
+  ptr2 = qmf_table_ptr->sbr_cos_twiddle;
+  ptr3 = ptr1 + 31;
+  ptr4 = ptr2 + 31;
+
+  for (i = 0; i < 16; i++) {
+    temp_1 = (i << 1);
+
+    re1 = qmf_real[temp_1];
+    im1 = qmf_real[63 - temp_1];
+
+    wim = *ptr1++;
+    wre = *ptr2++;
+
+    qmf_real[temp_1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(im1, wim), ixheaacd_mult32x16in32_shl(re1, wre));
+
+    re12 = qmf_imag[temp_1];
+    im12 = qmf_imag[63 - temp_1];
+
+    qmf_imag[temp_1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(im12, wim), ixheaacd_mult32x16in32_shl(re12, wre));
+
+    im2 = qmf_real[temp_1 + 1];
+
+    qmf_real[temp_1 + 1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(im1, wre), ixheaacd_mult32x16in32_shl(re1, wim));
+
+    im22 = qmf_imag[temp_1 + 1];
+
+    qmf_imag[temp_1 + 1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(im12, wre), ixheaacd_mult32x16in32_shl(re12, wim));
+
+    wim = *ptr3--;
+    wre = *ptr4--;
+
+    re2 = qmf_real[62 - temp_1];
+
+    qmf_real[62 - temp_1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(im2, wim), ixheaacd_mult32x16in32_shl(re2, wre));
+
+    re22 = qmf_imag[62 - temp_1];
+
+    qmf_imag[62 - temp_1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(im22, wim), ixheaacd_mult32x16in32_shl(re22, wre));
+
+    qmf_real[63 - temp_1] = ixheaacd_sub32_sat(
+        ixheaacd_mult32x16in32_shl(im2, wre), ixheaacd_mult32x16in32_shl(re2, wim));
+    qmf_imag[63 - temp_1] = ixheaacd_add32_sat(
+        ixheaacd_mult32x16in32_shl(im22, wre), ixheaacd_mult32x16in32_shl(re22, wim));
+  }
+
+  ixheaacd_fft32(qmf_real, fft);
+  ixheaacd_fft32(qmf_imag, fft);
+
+  ptr1 = qmf_table_ptr->sbr_alt_sin_twiddle;
+  ptr2 = ptr1 + 32;
+
+  wim = *ptr1++;
+  wre = *ptr2--;
+  for (i = 0; i < 16; i++) {
+    temp_1 = (i << 1);
+    re1 = qmf_real[temp_1];
+    im1 = qmf_real[temp_1 + 1];
+    re12 = qmf_imag[temp_1];
+    im12 = qmf_imag[temp_1 + 1];
+
+    qmf_real[temp_1] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(
+        im12, re1), wre), ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(im1, re12), wim));
+    qmf_imag[temp_1] = ixheaacd_add32_sat(ixheaacd_mult32x16in32_shl((ixheaacd_add32_sat(
+        im12, re1)), wre), ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(im1, re12), wim));
+
+    im2 = qmf_real[63 - temp_1];
+    im22 = qmf_imag[63 - temp_1];
+
+    qmf_real[63 - temp_1] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(
+        im1, re12), wre), ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(im12, re1), wim));
+    qmf_imag[63 - temp_1] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(
+        re1, im12), wim), ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(im1, re12), wre));
+
+    wim = *ptr1++;
+    wre = *ptr2--;
+    re2 = qmf_real[62 - temp_1];
+    re22 = qmf_imag[62 - temp_1];
+
+    qmf_real[temp_1 + 1] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(
+        im2, re22), wim), ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(im22, re2), wre));
+    qmf_imag[temp_1 + 1] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(
+        re2, im22), wre), ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(im2, re22), wim));
+
+    qmf_real[62 - temp_1] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(
+        im22, re2), wim), ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(im2, re22), wre));
+    qmf_imag[62 - temp_1] = ixheaacd_add32_sat(ixheaacd_mult32x16in32_shl(ixheaacd_add32_sat(
+        re2, im22), wim), ixheaacd_mult32x16in32_shl(ixheaacd_sub32_sat(im2, re22), wre));
+  }
+}
+
+VOID ixheaacd_calculate_syn_filt_bank_res64(ia_mps_dec_qmf_syn_filter_bank *syn, WORD32 *sr,
+                                            WORD32 *si, WORD32 *time_sig, WORD32 channel,
+                                            WORD32 resolution, WORD32 nr_samples,
+                                            ia_mps_dec_qmf_tables_struct *qmf_table_ptr) {
+  WORD32 j, k;
+  WORD32 *synth_buf;
+  WORD32 *syn_buf_p1, *syn_buf_p2, *syn_buf_p3;
+  WORD32 val;
+  const WORD32 *p_filter_1, *p_filter_6;
+  const WORD32 *p_filter_2, *p_filter_7;
+  const WORD32 *p_filter_3, *p_filter_8;
+  const WORD32 *p_filter_4, *p_filter_9;
+  const WORD32 *p_filter_5, *p_filter_10;
+
+  WORD32 *p_sr, *p_si;
+
+  WORD32 *sbr_qmf_states_synthesis = syn->sbr_qmf_states_synthesis;
+  synth_buf = &(sbr_qmf_states_synthesis[channel * QMF_FILTER_STATE_SYN_SIZE_MPS]);
+
+  p_sr = sr;
+  p_si = si;
+  for (k = 0; k < nr_samples; k++) {
+    WORD32 *new_samp = p_si;
+    WORD32 *new_samp1, *new_samp2;
+
+    ixheaacd_inverse_modulation(p_sr, p_si, qmf_table_ptr);
+
+    p_filter_1 = syn->p_filter_syn;
+    p_filter_2 = p_filter_1 + 64;
+    p_filter_3 = p_filter_2 + 65;
+    p_filter_4 = p_filter_3 + 65;
+    p_filter_5 = p_filter_4 + 65;
+
+    syn_buf_p1 = &synth_buf[63];
+    val = *(p_sr);
+
+    {
+      WORD32 val1 = *(p_si + 63);
+      syn_buf_p2 = &synth_buf[63];
+
+      *time_sig++ = ixheaacd_add32_sat(syn_buf_p1[512],
+                        ixheaacd_mps_mult32_shr_30(*(p_filter_5 + 65), val));
+      syn_buf_p1[512] = ixheaacd_add32_sat(syn_buf_p2[448],
+                            ixheaacd_mps_mult32_shr_30(*(p_filter_5 + 64), val1));
+      syn_buf_p2[448] = ixheaacd_add32_sat(syn_buf_p1[384],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_5++, val));
+      syn_buf_p1[384] = ixheaacd_add32_sat(syn_buf_p2[320],
+                            ixheaacd_mps_mult32_shr_30(*(p_filter_4 + 64), val1));
+      syn_buf_p2[320] = ixheaacd_add32_sat(syn_buf_p1[256],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_4++, val));
+      syn_buf_p1[256] = ixheaacd_add32_sat(syn_buf_p2[192],
+                            ixheaacd_mps_mult32_shr_30(*(p_filter_3 + 64), val1));
+      syn_buf_p2[192] = ixheaacd_add32_sat(syn_buf_p1[128],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_3++, val));
+      syn_buf_p1[128] = ixheaacd_add32_sat(syn_buf_p2[64],
+                            ixheaacd_mps_mult32_shr_30(*(p_filter_2 + 64), val1));
+      syn_buf_p2[64] = ixheaacd_add32_sat(syn_buf_p1[0],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_2++, val));
+      syn_buf_p1[0] = ixheaacd_mps_mult32_shr_30(*(p_filter_1 + 63), val1);
+    }
+    p_filter_6 = p_filter_1 + 62;
+    p_filter_7 = p_filter_2 + 62;
+    p_filter_8 = p_filter_3 + 62;
+    p_filter_9 = p_filter_4 + 62;
+    p_filter_10 = p_filter_5 + 62;
+    time_sig += 62;
+
+    syn_buf_p2 = synth_buf;
+    syn_buf_p3 = syn_buf_p2;
+    new_samp1 = p_sr + 1;
+    new_samp2 = p_sr + 63;
+    for (j = 0; j < resolution - 1; j++) {
+      *time_sig-- = ixheaacd_add32_sat(syn_buf_p3[512],
+                        ixheaacd_mps_mult32_shr_30(*p_filter_6--, (*new_samp2)));
+      syn_buf_p3[512] = ixheaacd_add32_sat(syn_buf_p2[448],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_5++, (*new_samp)));
+      syn_buf_p2[448] = ixheaacd_add32_sat(syn_buf_p3[384],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_7--, (*new_samp2)));
+      syn_buf_p3[384] = ixheaacd_add32_sat(syn_buf_p2[320],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_4++, (*new_samp)));
+      syn_buf_p2[320] = ixheaacd_add32_sat(syn_buf_p3[256],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_8--, (*new_samp2)));
+      syn_buf_p3[256] = ixheaacd_add32_sat(syn_buf_p2[192],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_3++, (*new_samp)));
+      syn_buf_p2[192] = ixheaacd_add32_sat(syn_buf_p3[128],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_9--, (*new_samp2)));
+      syn_buf_p3[128] = ixheaacd_add32_sat(syn_buf_p2[64],
+                            ixheaacd_mps_mult32_shr_30(*p_filter_2++, (*new_samp)));
+      syn_buf_p2[64] = ixheaacd_add32_sat(syn_buf_p3[0],
+                           ixheaacd_mps_mult32_shr_30(*p_filter_10--, (*new_samp2)));
+      syn_buf_p3[0] = ixheaacd_mps_mult32_shr_30(*p_filter_1++, (*new_samp));
+
+      new_samp++;
+      syn_buf_p2++;
+
+      new_samp1++;
+      new_samp2--;
+      syn_buf_p3++;
+    }
+
+    time_sig += 64;
+
+    p_sr += MAX_HYBRID_BANDS;
+    p_si += MAX_HYBRID_BANDS;
+  }
+}
+
+VOID ixheaacd_calculate_syn_filt_bank(ia_mps_dec_qmf_syn_filter_bank *syn, WORD32 *sr, WORD32 *si,
+                                      WORD32 *time_sig, WORD32 channel, WORD32 resolution,
+                                      WORD32 nr_samples,
+                                      ia_mps_dec_qmf_tables_struct *qmf_table_ptr) {
+  WORD32 j, k;
+  WORD32 *synth_buf;
+  WORD32 *p_sr, *p_si;
+  WORD32 *buf_ptr;
+  WORD32 resx2 = resolution << 1;
+  WORD32 *sbr_qmf_states_synthesis = syn->sbr_qmf_states_synthesis;
+
+  synth_buf = &(sbr_qmf_states_synthesis[channel * QMF_FILTER_STATE_SYN_SIZE_MPS]);
+
+  p_sr = sr;
+  p_si = si;
+  for (k = 0; k < nr_samples; k++) {
+    WORD32 *new_samp = p_si + 63;
+
+    const WORD32 *p_filter_1 = syn->p_filter_syn;
+    const WORD32 *p_filter_2 = p_filter_1 + 65;
+    const WORD32 *p_filter_3 = p_filter_2 + 65;
+    const WORD32 *p_filter_4 = p_filter_3 + 65;
+    const WORD32 *p_filter_5 = p_filter_4 + 65;
+
+    ixheaacd_inverse_modulation(p_sr, p_si, qmf_table_ptr);
+
+    for (j = 0; j < resolution; j++) {
+      synth_buf[j] = ixheaacd_mps_mult32_shr_30(*p_filter_1++, (*new_samp));
+      synth_buf[resx2 + j] = ixheaacd_add32_sat(synth_buf[resx2 + j],
+                                 ixheaacd_mps_mult32_shr_30(*p_filter_2++, (*new_samp)));
+      synth_buf[resx2 * 2 + j] = ixheaacd_add32_sat(synth_buf[resx2 * 2 + j],
+                                     ixheaacd_mps_mult32_shr_30(*p_filter_3++, (*new_samp)));
+      synth_buf[resx2 * 3 + j] = ixheaacd_add32_sat(synth_buf[resx2 * 3 + j],
+                                     ixheaacd_mps_mult32_shr_30(*p_filter_4++, (*new_samp)));
+      synth_buf[resx2 * 4 + j] = ixheaacd_add32_sat(synth_buf[resx2 * 4 + j],
+                                     ixheaacd_mps_mult32_shr_30(*p_filter_5++, (*new_samp)));
+
+      new_samp--;
+    }
+
+    synth_buf[resx2 - 1] = ixheaacd_add32_sat(synth_buf[resx2 - 1],
+                               ixheaacd_mps_mult32_shr_30(*p_filter_1++, *p_sr));
+    synth_buf[resx2 * 2 - 1] = ixheaacd_add32_sat(synth_buf[resx2 * 2 - 1],
+                                   ixheaacd_mps_mult32_shr_30(*p_filter_2++, *p_sr));
+    synth_buf[3 * resx2 - 1] = ixheaacd_add32_sat(synth_buf[3 * resx2 - 1],
+                                   ixheaacd_mps_mult32_shr_30(*p_filter_3++, *p_sr));
+    synth_buf[4 * resx2 - 1] = ixheaacd_add32_sat(synth_buf[4 * resx2 - 1],
+                                   ixheaacd_mps_mult32_shr_30(*p_filter_4++, *p_sr));
+    *time_sig++ = ixheaacd_add32_sat(synth_buf[5 * resx2 - 1],
+                      ixheaacd_mps_mult32_shr_30(*p_filter_5++, *p_sr));
+
+    p_filter_1 -= 2;
+    p_filter_2 -= 2;
+    p_filter_3 -= 2;
+    p_filter_4 -= 2;
+    p_filter_5 -= 2;
+
+    new_samp = p_sr + resolution - 1;
+
+    for (j = 0; j < resolution - 1; j++) {
+      synth_buf[resolution + j] = ixheaacd_add32_sat(synth_buf[resolution + j],
+                                      ixheaacd_mps_mult32_shr_30(*--p_filter_5, (*new_samp)));
+      synth_buf[resolution * (3) + j] =
+          ixheaacd_add32_sat(synth_buf[resolution * (3) + j],
+              ixheaacd_mps_mult32_shr_30(*--p_filter_4, (*new_samp)));
+      synth_buf[resolution * (5) + j] =
+          ixheaacd_add32_sat(synth_buf[resolution * (5) + j],
+              ixheaacd_mps_mult32_shr_30(*--p_filter_3, (*new_samp)));
+      synth_buf[resolution * (7) + j] =
+          ixheaacd_add32_sat(synth_buf[resolution * (7) + j],
+              ixheaacd_mps_mult32_shr_30(*--p_filter_2, (*new_samp)));
+      synth_buf[resolution * (9) + j] =
+          ixheaacd_add32_sat(synth_buf[resolution * (9) + j],
+              ixheaacd_mps_mult32_shr_30(*--p_filter_1, (*new_samp)));
+      new_samp--;
+    }
+
+    buf_ptr = synth_buf + 9 * resolution + resolution - 2;
+    for (j = 0; j < resolution - 1; j++) {
+      *time_sig++ = *buf_ptr--;
+    }
+
+    memmove((synth_buf + resolution), synth_buf, (9 * resolution) * sizeof(WORD32));
+
+    p_sr += MAX_HYBRID_BANDS;
+    p_si += MAX_HYBRID_BANDS;
+  }
+}
+
+IA_ERRORCODE
+ixheaacd_syn_filt_bank_init(ia_mps_dec_synthesis_interface_handle self, WORD32 resolution) {
+  switch (resolution) {
+    case QMF_BANDS_32:
+      self->syn_filter_bank = ixheaacd_calculate_syn_filt_bank;
+      break;
+    case QMF_BANDS_64:
+      self->syn_filter_bank = ixheaacd_calculate_syn_filt_bank_res64;
+      break;
+    case QMF_BANDS_128:
+      self->syn_filter_bank = ixheaacd_calculate_syn_filt_bank;
+      break;
+    default:
+      return IA_XHEAAC_MPS_DEC_INIT_NONFATAL_INVALID_QMF_BAND;
+      break;
+  }
+  return IA_NO_ERROR;
+}
+
+static VOID ia_mps_enc_fwd_mod(WORD32 *time_in, WORD32 *r_subband, WORD32 *i_subband,
+                               ia_mps_dec_qmf_tables_struct *qmf_table_ptr) {
+  WORD32 i;
+
+  for (i = 0; i < 64; i++) {
+    r_subband[i] = time_in[i] - time_in[127 - i];
+    i_subband[i] = time_in[i] + time_in[127 - i];
+  }
+  ixheaacd_cos_mod(r_subband, qmf_table_ptr);
+  ixheaacd_sin_mod(i_subband, qmf_table_ptr);
+}
+
+VOID ixheaacd_calc_ana_filt_bank(ia_heaac_mps_state_struct *pstr_mps_state, WORD16 *time_in,
+                                 WORD32 *r_analysis, WORD32 *i_analysis, WORD32 channel) {
+  ia_mps_dec_qmf_ana_filter_bank *qmf_bank = &pstr_mps_state->qmf_bank[channel];
+  ia_mps_dec_qmf_tables_struct *qmf_table_ptr =
+      pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr;
+  WORD32 i, k, m;
+
+  WORD32 *syn_buffer = pstr_mps_state->mps_scratch_mem_v;
+  WORD64 accu1 = 0, accu2 = 0;
+  WORD16 flag;
+  WORD32 *fp1;
+  WORD32 *fp2;
+  WORD32 *temp;
+  const WORD32 *start_co_eff_ptr_l;
+  const WORD32 *start_co_eff_ptr_r;
+  const WORD32 *ptr_pf_l, *ptr_pf_r;
+  WORD32 *qmf_states_curr_pos;
+  WORD32 offset = 0;
+  WORD32 n_channels = pstr_mps_state->num_input_channels;
+  WORD32 nr_samples = pstr_mps_state->time_slots;
+  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
+  WORD32 shift = pstr_mps_state->bits_per_sample - 16;
+  WORD32 gain = pstr_mps_state->clip_protect_gain;
+
+  WORD32 *p_ana_real = r_analysis;
+  WORD32 *p_ana_imag = i_analysis;
+
+  WORD32 *p_ana_re, *p_ana_im;
+
+  flag = qmf_bank->flag;
+  if (!flag) {
+    fp1 = qmf_bank->qmf_states_buffer;
+    fp2 = qmf_bank->qmf_states_buffer + qmf_bands;
+  } else {
+    fp2 = qmf_bank->qmf_states_buffer;
+    fp1 = qmf_bank->qmf_states_buffer + qmf_bands;
+  }
+
+  qmf_bank->qmf_states_curr_pos =
+      ((WORD32 *)(qmf_bank->qmf_states_buffer) + (qmf_bank->offset * qmf_bands));
+
+  offset = qmf_bank->offset;
+  start_co_eff_ptr_l = qmf_bank->ref_co_eff_ptr_l + qmf_bank->offset_l;
+  start_co_eff_ptr_r = qmf_bank->ref_co_eff_ptr_r - qmf_bank->offset_r;
+
+  for (i = 0; i < nr_samples; i++) {
+    const WORD16 *pcoz = qmf_table_ptr->ia_qmf_anl_addt_cos,
+                 *psin = qmf_table_ptr->ia_qmf_anl_addt_sin;
+    qmf_states_curr_pos = qmf_bank->qmf_states_curr_pos;
+
+    p_ana_re = p_ana_real;
+    p_ana_im = p_ana_imag;
+
+    temp = fp1;
+    fp1 = fp2;
+    fp2 = temp;
+
+    if (flag) {
+      start_co_eff_ptr_l--;
+
+      if (start_co_eff_ptr_l == qmf_bank->ref_co_eff_ptr_l) start_co_eff_ptr_l += 5;
+    } else {
+      start_co_eff_ptr_r++;
+      if (start_co_eff_ptr_r == qmf_bank->ref_co_eff_ptr_r) start_co_eff_ptr_r -= 5;
+    }
+
+    flag++;
+    if ((flag & ONE_BIT_MASK) == 0) flag = 0;
+
+    if (shift == 0) {
+      for (k = 0; k < qmf_bands; k++) {
+        qmf_states_curr_pos[k] = ixheaacd_mps_mult32_shr_15(
+            (WORD32)time_in[n_channels * (i * qmf_bands + k) + channel], gain);
+      }
+    } else {
+      for (k = 0; k < qmf_bands; k++) {
+        WORD32 temp;
+        temp = ixheaacd_mps_mult32_shr_15(
+            (WORD32)time_in[n_channels * (i * qmf_bands + k) + channel], gain);
+
+        qmf_states_curr_pos[k] = temp >> shift;
+      }
+    }
+
+    ptr_pf_l = start_co_eff_ptr_l;
+    ptr_pf_r = start_co_eff_ptr_r;
+
+    for (k = 0; k < qmf_bands; k++) {
+      {
+        accu1 = (WORD64)((WORD64)ptr_pf_l[0] * (WORD64)fp1[k]);
+        accu1 += (WORD64)((WORD64)ptr_pf_l[1] * (WORD64)fp1[128 + k]);
+        accu1 += (WORD64)((WORD64)ptr_pf_l[2] * (WORD64)fp1[256 + k]);
+        accu1 += (WORD64)((WORD64)ptr_pf_l[3] * (WORD64)fp1[384 + k]);
+        accu1 += (WORD64)((WORD64)ptr_pf_l[4] * (WORD64)fp1[512 + k]);
+
+        accu2 = (WORD64)((WORD64)ptr_pf_r[-1] * (WORD64)fp2[k]);
+        accu2 += (WORD64)((WORD64)ptr_pf_r[-2] * (WORD64)fp2[128 + k]);
+        accu2 += (WORD64)((WORD64)ptr_pf_r[-3] * (WORD64)fp2[256 + k]);
+        accu2 += (WORD64)((WORD64)ptr_pf_r[-4] * (WORD64)fp2[384 + k]);
+        accu2 += (WORD64)((WORD64)ptr_pf_r[-5] * (WORD64)fp2[512 + k]);
+      }
+      syn_buffer[(qmf_bands << 1) - 1 - k] = (WORD32)((WORD64)accu1 >> 21);
+      syn_buffer[qmf_bands - 1 - k] = (WORD32)((WORD64)accu2 >> 21);
+      ptr_pf_l += 10;
+      ptr_pf_r -= 10;
+    }
+
+    ia_mps_enc_fwd_mod(syn_buffer, p_ana_re, p_ana_im, qmf_table_ptr);
+
+    for (m = 0; m < (qmf_bands >> 1); m++) {
+      WORD32 a_cos, b_cos, a_sin, b_sin;
+      WORD32 a_cos1, b_cos1, a_sin1, b_sin1;
+
+      WORD16 coz = *pcoz++, sin = *psin++;
+
+      a_cos = ixheaacd_mult32x16in32(p_ana_re[m], coz);
+      b_sin = ixheaacd_mult32x16in32(p_ana_im[m], sin);
+      b_cos = ixheaacd_mult32x16in32(p_ana_im[m], coz);
+      a_sin = ixheaacd_mult32x16in32(p_ana_re[m], sin);
+
+      p_ana_re[m] = ((a_cos + b_sin) << 1);
+      p_ana_im[m] = ((b_cos - a_sin) << 1);
+
+      a_cos1 = ixheaacd_mult32x16in32(p_ana_re[qmf_bands - 1 - m], coz);
+      b_sin1 = ixheaacd_mult32x16in32(p_ana_im[qmf_bands - 1 - m], sin);
+
+      a_sin1 = ixheaacd_mult32x16in32(p_ana_re[qmf_bands - 1 - m], sin);
+      p_ana_re[qmf_bands - 1 - m] = ((-a_cos1 + b_sin1) << 1);
+      b_cos1 = ixheaacd_mult32x16in32(p_ana_im[qmf_bands - 1 - m], coz);
+
+      p_ana_im[qmf_bands - 1 - m] = ((-b_cos1 - a_sin1) << 1);
+    }
+
+    qmf_bank->qmf_states_curr_pos = qmf_bank->qmf_states_curr_pos + qmf_bands;
+    offset++;
+    if (offset == 10) {
+      offset = 0;
+      qmf_bank->qmf_states_curr_pos = qmf_bank->qmf_states_buffer;
+    }
+
+    p_ana_real += MAX_NUM_QMF_BANDS;
+    p_ana_imag += MAX_NUM_QMF_BANDS;
+  }
+
+  qmf_bank->offset_l = (WORD32)(start_co_eff_ptr_l - qmf_bank->ref_co_eff_ptr_l);
+  qmf_bank->offset_r = (WORD32)(qmf_bank->ref_co_eff_ptr_r - start_co_eff_ptr_r);
+
+  qmf_bank->flag = flag;
+  qmf_bank->offset = offset;
+}
diff --git a/decoder/ixheaacd_mps_polyphase.h b/decoder/ixheaacd_mps_polyphase.h
index dcc6f10..8144455 100644
--- a/decoder/ixheaacd_mps_polyphase.h
+++ b/decoder/ixheaacd_mps_polyphase.h
@@ -21,18 +21,11 @@
 #define IXHEAACD_MPS_POLYPHASE_H
 
 #define MAX_NUM_QMF_BANDS_SAC (128)
+#define POLY_PHASE_SYNTH_SIZE (1280)
+#define QMF_BANDS_32 (32)
+#define QMF_BANDS_64 (64)
+#define QMF_BANDS_128 (128)
 
-typedef struct ia_mps_poly_phase_synth_struct {
-  WORD32 state[1280];
-} ia_mps_poly_phase_synth_struct;
+VOID ixheaacd_mps_synt_init(FLOAT32 state[POLY_PHASE_SYNTH_SIZE]);
 
-typedef struct ia_mps_poly_phase_struct {
-  int resolution;
-} ia_mps_poly_phase_struct;
-
-VOID ixheaacd_mps_synt_create(ia_mps_poly_phase_struct *kernel,
-                              WORD32 resolution);
-
-VOID ixheaacd_mps_synt_init(ia_mps_poly_phase_synth_struct *self);
-
-#endif
+#endif /* IXHEAACD_MPS_POLYPHASE_H */
diff --git a/decoder/ixheaacd_mps_pre_mix.c b/decoder/ixheaacd_mps_pre_mix.c
index c490e78..1406973 100644
--- a/decoder/ixheaacd_mps_pre_mix.c
+++ b/decoder/ixheaacd_mps_pre_mix.c
@@ -18,51 +18,47 @@
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
 #include <math.h>
-#include <memory.h>
+#include <string.h>
 
 #include <assert.h>
 #include "ixheaacd_type_def.h"
 #include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_mps_polyphase.h"
-
-#include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
-
 #include "ixheaacd_constants.h"
-#include "ixheaacd_basic_ops32.h"
-#include "ixheaacd_basic_ops40.h"
-
-#undef ABS_THR
-#define ABS_THR 1.0e-9f
-
-#define ICC_FIX
-#define UNSINGULARIZE_FIX
-#define QUANTIZE_PARS_FIX
-
-#define PI 3.14159265358979f
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_dec.h"
 
 #define ONE_IN_Q28 (268435456)
-#define MINUS_ONE_IN_Q28 (-268435456)
-#define PI_Q28 (843314856)
-#define PI_Q27 (421657428)
 #define PI_BY_8_Q28 (105414352)
+#define P_PI 3.1415926535897932
+#define PI_IN_Q28 843314880
+#define MULT(a, b) (a * b)
+#define Q28_FLOAT_VAL ((FLOAT32)(1 << 28))
+#define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL)
 
-extern const WORD32 ixheaacd_im_weight_Q28[16][8][31];
-extern const WORD32 ixheaacd_re_weight_Q28[16][8][31];
-extern const WORD32 ixheaacd_beta_Q28[16][8][31];
-extern const WORD32 ixheaacd_weight_Q28[16][8][31];
-extern const WORD32 ixheaacd_c_l_table_Q31[31];
-extern const WORD32 ixheaacd_sin_table_Q31[8][31];
-extern const WORD32 ixheaacd_cos_table_Q31[8][31];
 extern const WORD32 ixheaacd_atan_table_Q28[16][8][31];
 extern const WORD32 ixheaacd_ipd_de_quant_table_q28[16];
 
-#define P_PI 3.1415926535897932
-#define PI_IN_Q28 843314880
+extern const FLOAT32 ixheaacd_im_weight[16][8][31];
+extern const FLOAT32 ixheaacd_re_weight[16][8][31];
+extern const FLOAT32 ixheaacd_beta[16][8][31];
+extern const FLOAT32 ixheaacd_weight[16][8][31];
+extern const FLOAT32 ixheaacd_c_l_table[31];
+extern const FLOAT32 ixheaacd_sin_table[8][31];
+extern const FLOAT32 ixheaacd_cos_table[8][31];
 
-#define P_PI 3.1415926535897932
-#define PI_IN_Q28 843314880
+extern const WORD32 ixheaacd_mps_gain_set_indx[29];
 
 static WORD32 ixheaacd_mps_phase_wraping(WORD32 phase) {
   const WORD32 pi_2 = 2 * PI_IN_Q28;
@@ -105,28 +101,20 @@
   }
 }
 
-VOID ixheaacd_fix_to_float_int(WORD32 *inp, FLOAT32 *out, WORD32 length,
-                               FLOAT32 q_fac) {
-  WORD32 i;
-  FLOAT32 m_qfac = 1.0f / q_fac;
-
-  for (i = 0; i < length; i++) out[i] = (FLOAT32)(inp[i]) * m_qfac;
-}
-
 VOID ixheaacd_pre_and_mix_matrix_calculation(ia_mps_dec_state_struct *self) {
   WORD32 ps, pb;
   ia_mps_bs_frame *curr_bit_stream = &(self->bs_frame);
-  WORD32 h_imag[2 * MAX_PARAMETER_BANDS];
-  WORD32
-  h_real[6 * MAX_PARAMETER_BANDS];
+  FLOAT32 h_imag[2 * MAX_PARAMETER_BANDS];
+  FLOAT32 h_real[6 * MAX_PARAMETER_BANDS];
 
   ixheaacd_mps_buffer_pre_and_mix_matrix(self);
 
   for (ps = 0; ps < self->num_parameter_sets; ps++) {
-    WORD32 *h_im = &h_imag[0];
-    WORD32 *h_re = &h_real[0];
-    memset(h_real, 0, 6 * MAX_PARAMETER_BANDS * sizeof(WORD32));
-    memset(h_imag, 0, 2 * MAX_PARAMETER_BANDS * sizeof(WORD32));
+    FLOAT32 *h_im = &h_imag[0];
+    FLOAT32 *h_re = &h_real[0];
+
+    memset(h_real, 0, 6 * MAX_PARAMETER_BANDS * sizeof(FLOAT32));
+    memset(h_imag, 0, 2 * MAX_PARAMETER_BANDS * sizeof(FLOAT32));
 
     switch (self->config->bs_phase_coding) {
       case 0:
@@ -148,8 +136,8 @@
     }
 
     for (pb = 0; pb < self->bs_param_bands; pb++) {
-      self->m1_param_re[ps][pb][0][0] = 1073741824;
-      self->m1_param_re[ps][pb][1][0] = 1073741824;
+      self->m1_param_re[ps][pb][0][0] = 1.0f;
+      self->m1_param_re[ps][pb][1][0] = 1.0f;
 
       self->m1_param_im[ps][pb][0][0] = 0;
       self->m1_param_im[ps][pb][1][0] = 0;
@@ -177,21 +165,15 @@
     }
   }
   ixheaacd_mps_smoothing_opd(self);
-
-  ixheaacd_fix_to_float_int(&self->phase_l_fix[0][0], &self->phase_l[0][0],
-                            MAX_PARAMETER_SETS_MPS * MAX_PARAMETER_BANDS,
-                            268435456.0f);
-  ixheaacd_fix_to_float_int(&self->phase_r_fix[0][0], &self->phase_r[0][0],
-                            MAX_PARAMETER_SETS_MPS * MAX_PARAMETER_BANDS,
-                            268435456.0f);
 }
 
 static VOID ixheaacd_mps_par2umx_ps_core(WORD32 cld[MAX_PARAMETER_BANDS],
                                          WORD32 icc[MAX_PARAMETER_BANDS],
                                          WORD32 ott_band_count,
-                                         WORD32 *h_real) {
+                                         FLOAT32 *h_real) {
   WORD32 band;
-  WORD32 c_l_temp, c_r_temp, cld_idx, icc_idx, temp;
+  FLOAT32 c_l_temp, c_r_temp, temp;
+  WORD32 cld_idx, icc_idx;
 
   for (band = 0; band < ott_band_count; band++) {
     cld_idx = *cld++ + 15;
@@ -199,27 +181,27 @@
 
     icc_idx = icc_idx & 7;
 
-    c_l_temp = (ixheaacd_c_l_table_Q31[cld_idx]);
-    c_r_temp = (ixheaacd_c_l_table_Q31[30 - cld_idx]);
+    c_l_temp = (ixheaacd_c_l_table[cld_idx]);
+    c_r_temp = (ixheaacd_c_l_table[30 - cld_idx]);
 
-    temp = ixheaacd_cos_table_Q31[icc_idx][cld_idx];
-    *h_real++ = ixheaacd_mult32(temp, c_l_temp) >> 2;
+    temp = ixheaacd_cos_table[icc_idx][cld_idx];
+    *h_real++ = MULT(temp, c_l_temp);
 
-    temp = ixheaacd_cos_table_Q31[icc_idx][30 - cld_idx];
-    *h_real++ = ixheaacd_mult32(temp, c_r_temp) >> 2;
+    temp = ixheaacd_cos_table[icc_idx][30 - cld_idx];
+    *h_real++ = MULT(temp, c_r_temp);
 
-    temp = ixheaacd_sin_table_Q31[icc_idx][cld_idx];
-    *h_real++ = ixheaacd_mult32(temp, c_l_temp) >> 2;
+    temp = ixheaacd_sin_table[icc_idx][cld_idx];
+    *h_real++ = MULT(temp, c_l_temp);
 
-    temp = -ixheaacd_sin_table_Q31[icc_idx][30 - cld_idx];
-    *h_real++ = ixheaacd_mult32(temp, c_r_temp) >> 2;
+    temp = -ixheaacd_sin_table[icc_idx][30 - cld_idx];
+    *h_real++ = MULT(temp, c_r_temp);
 
     h_real += 2;
   }
 }
 
 VOID ixheaacd_mps_par2umx_ps(ia_mps_dec_state_struct *self,
-                             ia_mps_bs_frame *curr_bit_stream, WORD32 *h_real,
+                             ia_mps_bs_frame *curr_bit_stream, FLOAT32 *h_real,
                              WORD32 param_set_idx) {
   ixheaacd_mps_par2umx_ps_core(curr_bit_stream->cld_idx[param_set_idx],
                                curr_bit_stream->icc_idx[param_set_idx],
@@ -246,7 +228,7 @@
 
 VOID ixheaacd_mps_par2umx_ps_ipd_opd(ia_mps_dec_state_struct *self,
                                      ia_mps_bs_frame *curr_bit_stream,
-                                     WORD32 *h_real, WORD32 param_set_idx) {
+                                     FLOAT32 *h_real, WORD32 param_set_idx) {
   WORD32 opd[MAX_PARAMETER_BANDS];
   WORD32 ott_band_count = self->bs_param_bands;
   WORD32 num_bands_ipd = self->num_bands_ipd;
@@ -263,25 +245,25 @@
       WORD32 ipd_idx = curr_bit_stream->ipd_idx[param_set_idx][band] & 15;
       WORD32 ipd = ixheaacd_ipd_de_quant_table_q28[ipd_idx];
 
-      self->phase_l_fix[param_set_idx][band] =
-          ixheaacd_mps_phase_wraping(opd[band]);
-      self->phase_r_fix[param_set_idx][band] =
-          ixheaacd_mps_phase_wraping(opd[band] - ipd);
+      self->phase_l[param_set_idx][band] =
+          ixheaacd_mps_phase_wraping(opd[band]) * ONE_BY_Q28_FLOAT_VAL;
+      self->phase_r[param_set_idx][band] =
+          ixheaacd_mps_phase_wraping(opd[band] - ipd) * ONE_BY_Q28_FLOAT_VAL;
     }
   } else {
     num_bands_ipd = 0;
   }
 
   for (band = num_bands_ipd; band < ott_band_count; band++) {
-    self->phase_l_fix[param_set_idx][band] = 0;
-    self->phase_r_fix[param_set_idx][band] = 0;
+    self->phase_l[param_set_idx][band] = 0;
+    self->phase_r[param_set_idx][band] = 0;
   }
 }
 
 VOID ixheaacd_mps_par2umx_pred(ia_mps_dec_state_struct *self,
-                               ia_mps_bs_frame *curr_bit_stream, WORD32 *h_imag,
-                               WORD32 *h_real, WORD32 param_set_idx,
-                               WORD32 res_bands) {
+                               ia_mps_bs_frame *curr_bit_stream,
+                               FLOAT32 *h_imag, FLOAT32 *h_real,
+                               WORD32 param_set_idx, WORD32 res_bands) {
   WORD32 band;
 
   for (band = 0; band < self->bs_param_bands; band++) {
@@ -291,7 +273,7 @@
 
     if ((band < self->num_bands_ipd) && (cld_idx == 15) && (icc_idx == 0) &&
         (ipd_idx == 8)) {
-      WORD32 gain = 111848107;
+      FLOAT32 gain = 0.416666667f;
       *h_imag++ = 0;
       *h_imag++ = 0;
 
@@ -309,34 +291,34 @@
         h_real += 4;
       }
     } else {
-      WORD32 weight_fix, re_weight_fix, im_weight_fix;
+      FLOAT32 weight, re_weight, im_weight;
 
-      weight_fix = ixheaacd_weight_Q28[ipd_idx][icc_idx][cld_idx];
-      re_weight_fix = ixheaacd_re_weight_Q28[ipd_idx][icc_idx][cld_idx];
-      im_weight_fix = ixheaacd_im_weight_Q28[ipd_idx][icc_idx][cld_idx];
+      weight = ixheaacd_weight[ipd_idx][icc_idx][cld_idx];
+      re_weight = ixheaacd_re_weight[ipd_idx][icc_idx][cld_idx];
+      im_weight = ixheaacd_im_weight[ipd_idx][icc_idx][cld_idx];
 
       if (band < self->num_bands_ipd) {
-        weight_fix = ixheaacd_weight_Q28[ipd_idx][icc_idx][cld_idx];
-        re_weight_fix = ixheaacd_re_weight_Q28[ipd_idx][icc_idx][cld_idx];
-        im_weight_fix = ixheaacd_im_weight_Q28[ipd_idx][icc_idx][cld_idx];
+        weight = ixheaacd_weight[ipd_idx][icc_idx][cld_idx];
+        re_weight = ixheaacd_re_weight[ipd_idx][icc_idx][cld_idx];
+        im_weight = ixheaacd_im_weight[ipd_idx][icc_idx][cld_idx];
       } else {
-        weight_fix = ixheaacd_weight_Q28[0][icc_idx][cld_idx];
-        re_weight_fix = ixheaacd_re_weight_Q28[0][icc_idx][cld_idx];
-        im_weight_fix = ixheaacd_im_weight_Q28[0][icc_idx][cld_idx];
+        weight = ixheaacd_weight[0][icc_idx][cld_idx];
+        re_weight = ixheaacd_re_weight[0][icc_idx][cld_idx];
+        im_weight = ixheaacd_im_weight[0][icc_idx][cld_idx];
       }
 
-      *h_real++ = weight_fix - re_weight_fix;
-      *h_imag++ = -im_weight_fix;
-      *h_real++ = weight_fix + re_weight_fix;
-      *h_imag++ = im_weight_fix;
+      *h_real++ = weight - re_weight;
+      *h_imag++ = -im_weight;
+      *h_real++ = weight + re_weight;
+      *h_imag++ = im_weight;
 
       if (band < res_bands) {
         h_real += 2;
 
-        *h_real++ = weight_fix;
-        *h_real++ = -weight_fix;
+        *h_real++ = weight;
+        *h_real++ = -weight;
       } else {
-        WORD32 beta = ixheaacd_beta_Q28[ipd_idx][icc_idx][cld_idx];
+        FLOAT32 beta = ixheaacd_beta[ipd_idx][icc_idx][cld_idx];
 
         *h_real++ = beta;
         *h_real++ = -beta;
@@ -346,123 +328,77 @@
   }
 }
 
-WORD32 ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self) {
-  WORD32 ts, qs, row, col = 0;
-  WORD32 err = 0;
-  err = ixheaacd_mps_upmix_interp(
-      self->m1_param_re, self->r_out_re_scratch_m1, self->m1_param_re_prev,
-      (self->dir_sig_count + self->decor_sig_count), 1, self);
-  if (err < 0) return err;
-  err = ixheaacd_mps_upmix_interp(
-      self->m1_param_im, self->r_out_im_scratch_m1, self->m1_param_im_prev,
-      (self->dir_sig_count + self->decor_sig_count), 1, self);
-  if (err < 0) return err;
+VOID ixheaacd_mps_apply_pre_matrix(ia_mps_dec_state_struct *self) {
+  WORD32 ts, qs, row;
+  if (self->pre_mix_req) {
+    ixheaacd_mps_upmix_interp_type1(
+        self->m1_param_re, self->r_out_re_in_m1, self->m1_param_re_prev,
+        (self->dir_sig_count + self->decor_sig_count), 1, self, self->bs_high_rate_mode);
 
-  ixheaacd_fix_to_float_int(
-      (WORD32 *)(self->r_out_re_scratch_m1), (FLOAT32 *)(self->r_out_re_in_m1),
-      MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-      1073741824);
-  ixheaacd_fix_to_float_int(
-      (WORD32 *)self->r_out_im_scratch_m1, (FLOAT32 *)self->r_out_im_in_m1,
-      MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-      1073741824);
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < 2; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
 
-  for (ts = 0; ts < self->time_slots; ts++) {
-    for (qs = 0; qs < 2; qs++) {
-      WORD32 sign = -1;
-      WORD32 indx = self->hyb_band_to_processing_band_table[qs];
-      for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
-           row++) {
-        FLOAT32 sum_real = 0.0f;
-        FLOAT32 sum_imag = 0.0f;
-
-        {
-          FLOAT32 real = self->hyb_in[0][ts][qs].re *
-                             self->r_out_re_in_m1[ts][indx][row][col] -
-                         self->hyb_in[0][ts][qs].im *
-                             self->r_out_im_in_m1[ts][indx][row][col] * sign;
-          FLOAT32 imag = self->hyb_in[0][ts][qs].re *
-                             self->r_out_im_in_m1[ts][indx][row][col] * sign +
-                         self->hyb_in[0][ts][qs].im *
-                             self->r_out_re_in_m1[ts][indx][row][col];
-          sum_real += real;
-          sum_imag += imag;
+        FLOAT32 real =
+            self->hyb_in[0][qs][ts].re * self->r_out_re_in_m1[ts][indx][0][0];
+        FLOAT32 imag =
+            self->hyb_in[0][qs][ts].im * self->r_out_re_in_m1[ts][indx][0][0];
+        for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
+             row++) {
+          self->v[row][ts][qs].re = real;
+          self->v[row][ts][qs].im = imag;
         }
-        self->v[row][ts][qs].re = sum_real;
-        self->v[row][ts][qs].im = sum_imag;
+      }
+      for (qs = 2; qs < self->hyb_band_count[0]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        FLOAT32 real =
+            self->hyb_in[0][qs][ts].re * self->r_out_re_in_m1[ts][indx][0][0];
+        FLOAT32 imag =
+            self->hyb_in[0][qs][ts].im * self->r_out_re_in_m1[ts][indx][0][0];
+        for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
+             row++) {
+          self->v[row][ts][qs].re = real;
+          self->v[row][ts][qs].im = imag;
+        }
       }
     }
-    for (qs = 2; qs < self->hyb_band_count; qs++) {
-      WORD32 sign = 1;
-      WORD32 indx = self->hyb_band_to_processing_band_table[qs];
-      for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
-           row++) {
-        FLOAT32 sum_real = 0.0f;
-        FLOAT32 sum_imag = 0.0f;
-
-        {
-          FLOAT32 real = self->hyb_in[0][ts][qs].re *
-                             self->r_out_re_in_m1[ts][indx][row][col] -
-                         self->hyb_in[0][ts][qs].im *
-                             self->r_out_im_in_m1[ts][indx][row][col] * sign;
-          FLOAT32 imag = self->hyb_in[0][ts][qs].re *
-                             self->r_out_im_in_m1[ts][indx][row][col] * sign +
-                         self->hyb_in[0][ts][qs].im *
-                             self->r_out_re_in_m1[ts][indx][row][col];
-          sum_real += real;
-          sum_imag += imag;
+  } else {
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
+        FLOAT32 real = self->hyb_in[0][qs][ts].re;
+        FLOAT32 imag = self->hyb_in[0][qs][ts].im;
+        for (row = 0; row < (self->dir_sig_count + self->decor_sig_count);
+             row++) {
+          self->v[row][ts][qs].re = real;
+          self->v[row][ts][qs].im = imag;
         }
-        self->v[row][ts][qs].re = sum_real;
-        self->v[row][ts][qs].im = sum_imag;
       }
     }
   }
-  return 0;
+  return;
 }
 
-WORD32 ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self) {
+VOID ixheaacd_mps_apply_mix_matrix(ia_mps_dec_state_struct *self) {
   WORD32 ts, qs, row, col;
   WORD32 complex_m2 = ((self->config->bs_phase_coding != 0));
   WORD32 phase_interpolation = (self->config->bs_phase_coding == 1);
-  WORD32 err = 0;
-  err = ixheaacd_mps_upmix_interp(
-      self->m2_decor_re, self->r_diff_out_re_fix_in_m2, self->m2_decor_re_prev,
-      self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self);
-  if (err < 0) return err;
-  err = ixheaacd_mps_upmix_interp(
-      self->m2_resid_re, self->r_out_re_fix_in_m2, self->m2_resid_re_prev,
-      self->out_ch_count, (self->dir_sig_count + self->decor_sig_count), self);
-  if (err < 0) return err;
-  ixheaacd_fix_to_float_int(
-      (WORD32 *)self->r_out_re_fix_in_m2, (FLOAT32 *)self->r_out_re_in_m2,
-      MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-      268435456);
-  ixheaacd_fix_to_float_int(
-      (WORD32 *)self->r_diff_out_re_fix_in_m2,
-      (FLOAT32 *)self->r_out_diff_re_in_m2,
-      MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-      268435456);
+  WORD32 num_col_iters = 0;
+
+  ixheaacd_mps_upmix_interp(self->m2_decor_re, self->r_out_diff_re_in_m2, self->m2_decor_re_prev,
+                            self->out_ch_count, (self->dir_sig_count + self->decor_sig_count),
+                            self, 1);
+
+  ixheaacd_mps_upmix_interp(self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
+                            self->out_ch_count, (self->dir_sig_count + self->decor_sig_count),
+                            self, 1);
 
   if (complex_m2 && !phase_interpolation) {
-    err = ixheaacd_mps_upmix_interp(
-        self->m2_decor_im, self->r_diff_out_im_fix_in_m2,
-        self->m2_decor_im_prev, self->out_ch_count,
-        (self->dir_sig_count + self->decor_sig_count), self);
-    if (err < 0) return err;
-    err = ixheaacd_mps_upmix_interp(
-        self->m2_resid_im, self->r_out_im_fix_in_m2, self->m2_resid_im_prev,
-        self->out_ch_count, (self->dir_sig_count + self->decor_sig_count),
-        self);
-    if (err < 0) return err;
-    ixheaacd_fix_to_float_int(
-        (WORD32 *)self->r_diff_out_im_fix_in_m2,
-        (FLOAT32 *)self->r_out_diff_im_in_m2,
-        MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-        268435456);
-    ixheaacd_fix_to_float_int(
-        (WORD32 *)self->r_out_im_fix_in_m2, (FLOAT32 *)self->r_out_im_in_m2,
-        MAX_TIME_SLOTS * MAX_PARAMETER_BANDS * MAX_M_OUTPUT * MAX_M_INPUT,
-        268435456);
+    ixheaacd_mps_upmix_interp(self->m2_decor_im, self->r_out_diff_im_in_m2,
+                              self->m2_decor_im_prev, self->out_ch_count,
+                              (self->dir_sig_count + self->decor_sig_count), self, 1);
+    ixheaacd_mps_upmix_interp(self->m2_resid_im, self->r_out_im_in_m2, self->m2_resid_im_prev,
+                              self->out_ch_count, (self->dir_sig_count + self->decor_sig_count),
+                              self, 1);
   }
 
   if (phase_interpolation) {
@@ -473,170 +409,909 @@
     for (ts = 0; ts < self->time_slots; ts++) {
       WORD32 pb;
       for (pb = 0; pb < self->bs_param_bands; pb++) {
-        for (row = 0; row < self->out_ch_count; row++) {
-          for (col = 0; col < (self->dir_sig_count + self->decor_sig_count);
-               col++) {
-            self->r_out_im_in_m2[ts][pb][row][col] =
-                self->r_out_re_in_m2[ts][pb][row][col] *
-                self->r_out_ph_im_in_m2[ts][pb][row];
-            self->r_out_re_in_m2[ts][pb][row][col] =
-                self->r_out_re_in_m2[ts][pb][row][col] *
-                self->r_out_ph_re_in_m2[ts][pb][row];
+        self->r_out_im_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
 
-            self->r_out_diff_im_in_m2[ts][pb][row][col] =
-                self->r_out_diff_re_in_m2[ts][pb][row][col] *
-                self->r_out_ph_im_in_m2[ts][pb][row];
-            self->r_out_diff_re_in_m2[ts][pb][row][col] =
-                self->r_out_diff_re_in_m2[ts][pb][row][col] *
-                self->r_out_ph_re_in_m2[ts][pb][row];
-          }
-        }
+        self->r_out_im_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+        self->r_out_im_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_im_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_re_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_re_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_re_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+        self->r_out_re_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+        self->r_out_diff_im_in_m2[ts][pb][0][0] = 0;
+        self->r_out_diff_im_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+        self->r_out_diff_im_in_m2[ts][pb][1][0] = 0;
+        self->r_out_diff_im_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_diff_re_in_m2[ts][pb][0][0] = 0;
+        self->r_out_diff_re_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_diff_re_in_m2[ts][pb][1][0] = 0;
+        self->r_out_diff_re_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
       }
     }
   }
+  if (self->res_bands == 0) {
+    num_col_iters = self->dir_sig_count;
+  }
+  else {
+    num_col_iters = (self->dir_sig_count + self->decor_sig_count);
+  }
 
   for (ts = 0; ts < self->time_slots; ts++) {
-    for (qs = 0; qs < self->hyb_band_count; qs++) {
+    for (qs = 0; qs < self->hyb_band_count_max; qs++) {
       WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+
       for (row = 0; row < self->out_ch_count; row++) {
-        FLOAT32 sum_re_dir = 0;
-        FLOAT32 sum_re_diff = 0;
-        FLOAT32 sum_im_dir = 0;
-        FLOAT32 sum_im_diff = 0;
-        for (col = 0; col < (self->dir_sig_count + self->decor_sig_count);
-             col++) {
-          sum_re_dir += self->w_dir[col][ts][qs].re *
-                        self->r_out_re_in_m2[ts][indx][row][col];
-          sum_im_dir += self->w_dir[col][ts][qs].im *
-                        self->r_out_re_in_m2[ts][indx][row][col];
-          sum_re_diff += self->w_diff[col][ts][qs].re *
-                         self->r_out_diff_re_in_m2[ts][indx][row][col];
-          sum_im_diff += self->w_diff[col][ts][qs].im *
-                         self->r_out_diff_re_in_m2[ts][indx][row][col];
-        }
-        self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
-        self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
-        self->hyb_diff_out[row][ts][qs].re = sum_re_diff;
-        self->hyb_diff_out[row][ts][qs].im = sum_im_diff;
+          FLOAT32 sum_re_dir = 0;
+          FLOAT32 sum_im_dir = 0;
+          for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir += self->w_dir[col][ts][qs].re *
+                  self->r_out_re_in_m2[ts][indx][row][col];
+              sum_im_dir += self->w_dir[col][ts][qs].im *
+                  self->r_out_re_in_m2[ts][indx][row][col];
+          }
+          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+
+          self->hyb_diff_out[row][ts][qs].re =
+              self->w_diff[1][ts][qs].re *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+          self->hyb_diff_out[row][ts][qs].im =
+              self->w_diff[1][ts][qs].im *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
       }
     }
   }
 
   if (complex_m2) {
-    for (ts = 0; ts < self->time_slots; ts++) {
-      for (qs = 0; qs < 2; qs++) {
-        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
-        for (row = 0; row < self->out_ch_count; row++) {
-          FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
-          FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
-          FLOAT32 sum_re_diff = self->hyb_diff_out[row][ts][qs].re;
-          FLOAT32 sum_im_diff = self->hyb_diff_out[row][ts][qs].im;
-          for (col = 0; col < (self->dir_sig_count + self->decor_sig_count);
-               col++) {
-            sum_re_dir += self->w_dir[col][ts][qs].im *
-                          self->r_out_im_in_m2[ts][indx][row][col];
-            sum_im_dir -= self->w_dir[col][ts][qs].re *
-                          self->r_out_im_in_m2[ts][indx][row][col];
-            sum_re_diff += self->w_diff[col][ts][qs].im *
-                           self->r_out_diff_im_in_m2[ts][indx][row][col];
-            sum_im_diff -= self->w_diff[col][ts][qs].re *
-                           self->r_out_diff_im_in_m2[ts][indx][row][col];
+    if (phase_interpolation) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+              FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+              FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+              for (col = 0; col < num_col_iters; col++) {
+                  sum_re_dir += self->w_dir[col][ts][qs].im *
+                      self->r_out_im_in_m2[ts][indx][row][col];
+                  sum_im_dir -= self->w_dir[col][ts][qs].re *
+                      self->r_out_im_in_m2[ts][indx][row][col];
+              }
+              self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+              self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+              self->hyb_diff_out[row][ts][qs].re +=
+                  self->w_diff[1][ts][qs].im *
+                  self->r_out_diff_im_in_m2[ts][indx][row][1];
+              self->hyb_diff_out[row][ts][qs].im -=
+                  self->w_diff[1][ts][qs].re *
+                  self->r_out_diff_im_in_m2[ts][indx][row][1];
           }
-          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
-          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
-          self->hyb_diff_out[row][ts][qs].re = sum_re_diff;
-          self->hyb_diff_out[row][ts][qs].im = sum_im_diff;
+        }
+        for (qs = 2; qs < self->hyb_band_count_max; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+              FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+              FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+              for (col = 0; col < num_col_iters; col++) {
+                  sum_re_dir -= self->w_dir[col][ts][qs].im *
+                      self->r_out_im_in_m2[ts][indx][row][col];
+                  sum_im_dir += self->w_dir[col][ts][qs].re *
+                      self->r_out_im_in_m2[ts][indx][row][col];
+              }
+              self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+              self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+              self->hyb_diff_out[row][ts][qs].re -=
+                  self->w_diff[1][ts][qs].im *
+                  self->r_out_diff_im_in_m2[ts][indx][row][1];
+              self->hyb_diff_out[row][ts][qs].im +=
+                  self->w_diff[1][ts][qs].re *
+                  self->r_out_diff_im_in_m2[ts][indx][row][1];
+          }
         }
       }
-      for (qs = 2; qs < self->hyb_band_count; qs++) {
-        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
-        for (row = 0; row < self->out_ch_count; row++) {
-          FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
-          FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
-          FLOAT32 sum_re_diff = self->hyb_diff_out[row][ts][qs].re;
-          FLOAT32 sum_im_diff = self->hyb_diff_out[row][ts][qs].im;
-          for (col = 0; col < (self->dir_sig_count + self->decor_sig_count);
-               col++) {
-            sum_re_dir -= self->w_dir[col][ts][qs].im *
-                          self->r_out_im_in_m2[ts][indx][row][col];
-            sum_im_dir += self->w_dir[col][ts][qs].re *
-                          self->r_out_im_in_m2[ts][indx][row][col];
-            sum_re_diff -= self->w_diff[col][ts][qs].im *
-                           self->r_out_diff_im_in_m2[ts][indx][row][col];
-            sum_im_diff += self->w_diff[col][ts][qs].re *
-                           self->r_out_diff_im_in_m2[ts][indx][row][col];
+    }
+    else {
+      WORD32 num_cols = (self->dir_sig_count + self->decor_sig_count) > 1
+              ? 1
+              : (self->dir_sig_count + self->decor_sig_count);
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir += self->w_dir[0][ts][qs].im *
+                  self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir -= self->w_dir[0][ts][qs].re *
+                  self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
           }
-          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
-          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
-          self->hyb_diff_out[row][ts][qs].re = sum_re_diff;
-          self->hyb_diff_out[row][ts][qs].im = sum_im_diff;
+        }
+        for (qs = 2; qs < self->hyb_band_count_max; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir -= self->w_dir[0][ts][qs].im *
+                              self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir += self->w_dir[0][ts][qs].re *
+                              self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          }
         }
       }
     }
   }
-  return 0;
+  return;
 }
 
-static PLATFORM_INLINE WORD32 ixheaacd_mult32_shl2(WORD32 a, WORD32 b) {
-  WORD32 result;
-  WORD64 temp_result;
+VOID ixheaacd_mps_apply_mix_matrix_type1(ia_mps_dec_state_struct *self) {
+  WORD32 ts, qs, row;
 
-  temp_result = (WORD64)a * (WORD64)b;
-  result = (WORD32)(temp_result >> 30);
+  ixheaacd_mps_upmix_interp_type2(self->m2_decor_re, self->r_out_diff_re_in_m2,
+                                  self->m2_decor_re_prev, self->out_ch_count, self, 1);
 
-  return (result);
+  ixheaacd_mps_upmix_interp_type2(self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
+                                  self->out_ch_count, self, 0);
+
+  for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
+    WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (row = 0; row < self->out_ch_count; row++) {
+        self->hyb_dir_out[row][ts][qs].re =
+            self->w_dir[0][ts][qs].re * self->r_out_re_in_m2[ts][indx][row][0];
+        self->hyb_dir_out[row][ts][qs].im =
+            self->w_dir[0][ts][qs].im * self->r_out_re_in_m2[ts][indx][row][0];
+        self->hyb_diff_out[row][ts][qs].re =
+            self->w_diff[1][ts][qs].re *
+            self->r_out_diff_re_in_m2[ts][indx][row][1];
+        self->hyb_diff_out[row][ts][qs].im =
+            self->w_diff[1][ts][qs].im *
+            self->r_out_diff_re_in_m2[ts][indx][row][1];
+      }
+    }
+  }
+  return;
 }
 
-WORD32 ixheaacd_mps_upmix_interp(
-    WORD32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                   [MAX_M_INPUT],
-    WORD32 r_matrix[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT]
-                   [MAX_M_INPUT],
-    WORD32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
-    WORD32 num_rows, WORD32 num_cols, ia_mps_dec_state_struct *self) {
+VOID ixheaacd_mps_apply_mix_matrix_type2(ia_mps_dec_state_struct *self) {
+  WORD32 ts, qs, row, col;
+  WORD32 complex_m2 = ((self->config->bs_phase_coding != 0));
+  WORD32 phase_interpolation = (self->config->bs_phase_coding == 1);
+  WORD32 num_col_iters = 0;
+
+  ixheaacd_mps_upmix_interp_type1(self->m2_decor_re, self->r_out_diff_re_in_m2,
+                                  self->m2_decor_re_prev, self->out_ch_count,
+                                  (self->dir_sig_count + self->decor_sig_count), self, 1);
+  ixheaacd_mps_upmix_interp_type1(self->m2_resid_re, self->r_out_re_in_m2, self->m2_resid_re_prev,
+                                  self->out_ch_count,
+                                  (self->dir_sig_count + self->decor_sig_count), self, 1);
+
+  if (complex_m2 && !phase_interpolation) {
+    ixheaacd_mps_upmix_interp_type1(self->m2_decor_im, self->r_out_diff_im_in_m2,
+                                    self->m2_decor_im_prev, self->out_ch_count,
+                                    (self->dir_sig_count + self->decor_sig_count), self, 1);
+    ixheaacd_mps_upmix_interp_type1(self->m2_resid_im, self->r_out_im_in_m2,
+                                    self->m2_resid_im_prev, self->out_ch_count,
+                                    (self->dir_sig_count + self->decor_sig_count), self, 1);
+  }
+
+  if (phase_interpolation) {
+    ixheaacd_mps_phase_interpolation(
+        self->phase_l, self->phase_r, self->phase_l_prev, self->phase_r_prev,
+        self->r_out_ph_re_in_m2, self->r_out_ph_im_in_m2, self);
+
+    for (ts = 0; ts < self->time_slots; ts++) {
+      WORD32 pb;
+      for (pb = 0; pb < self->bs_param_bands; pb++) {
+        self->r_out_im_in_m2[ts][pb][0][0] =
+            self->r_out_re_in_m2[ts][pb][0][0] *
+            self->r_out_ph_im_in_m2[ts][pb][0];
+
+        self->r_out_im_in_m2[ts][pb][0][1] =
+            self->r_out_re_in_m2[ts][pb][0][1] *
+            self->r_out_ph_im_in_m2[ts][pb][0];
+        self->r_out_im_in_m2[ts][pb][1][0] =
+            self->r_out_re_in_m2[ts][pb][1][0] *
+            self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_im_in_m2[ts][pb][1][1] =
+            self->r_out_re_in_m2[ts][pb][1][1] *
+            self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_re_in_m2[ts][pb][0][0] =
+            self->r_out_re_in_m2[ts][pb][0][0] *
+            self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_re_in_m2[ts][pb][0][1] =
+            self->r_out_re_in_m2[ts][pb][0][1] *
+            self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_re_in_m2[ts][pb][1][0] =
+            self->r_out_re_in_m2[ts][pb][1][0] *
+            self->r_out_ph_re_in_m2[ts][pb][1];
+
+        self->r_out_re_in_m2[ts][pb][1][1] =
+            self->r_out_re_in_m2[ts][pb][1][1] *
+            self->r_out_ph_re_in_m2[ts][pb][1];
+
+        self->r_out_diff_im_in_m2[ts][pb][0][0] = 0;
+        self->r_out_diff_im_in_m2[ts][pb][0][1] =
+            self->r_out_diff_re_in_m2[ts][pb][0][1] *
+            self->r_out_ph_im_in_m2[ts][pb][0];
+
+        self->r_out_diff_im_in_m2[ts][pb][1][0] = 0;
+        self->r_out_diff_im_in_m2[ts][pb][1][1] =
+            self->r_out_diff_re_in_m2[ts][pb][1][1] *
+            self->r_out_ph_im_in_m2[ts][pb][1];
+
+        self->r_out_diff_re_in_m2[ts][pb][0][0] = 0;
+        self->r_out_diff_re_in_m2[ts][pb][0][1] =
+            self->r_out_diff_re_in_m2[ts][pb][0][1] *
+            self->r_out_ph_re_in_m2[ts][pb][0];
+
+        self->r_out_diff_re_in_m2[ts][pb][1][0] = 0;
+        self->r_out_diff_re_in_m2[ts][pb][1][1] =
+            self->r_out_diff_re_in_m2[ts][pb][1][1] *
+            self->r_out_ph_re_in_m2[ts][pb][1];
+      }
+    }
+  }
+  if (self->res_bands == 0) {
+    num_col_iters = self->dir_sig_count;
+  } else {
+    num_col_iters = (self->dir_sig_count + self->decor_sig_count);
+  }
+  for (ts = 0; ts < self->time_slots; ts++) {
+    for (qs = 0; qs < self->hyb_band_count_max; qs++) {
+      WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+
+      for (row = 0; row < self->out_ch_count; row++) {
+        FLOAT32 sum_re_dir = 0;
+        FLOAT32 sum_im_dir = 0;
+        for (col = 0; col < num_col_iters; col++) {
+          sum_re_dir += self->w_dir[col][ts][qs].re *
+                        self->r_out_re_in_m2[ts][indx][row][col];
+          sum_im_dir += self->w_dir[col][ts][qs].im *
+                        self->r_out_re_in_m2[ts][indx][row][col];
+        }
+        self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+        self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+
+        self->hyb_diff_out[row][ts][qs].re =
+            self->w_diff[1][ts][qs].re *
+            self->r_out_diff_re_in_m2[ts][indx][row][1];
+        self->hyb_diff_out[row][ts][qs].im =
+            self->w_diff[1][ts][qs].im *
+            self->r_out_diff_re_in_m2[ts][indx][row][1];
+      }
+    }
+  }
+
+  if (complex_m2) {
+    if (phase_interpolation) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir += self->w_dir[col][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+              sum_im_dir -= self->w_dir[col][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+            self->hyb_diff_out[row][ts][qs].re +=
+                self->w_diff[1][ts][qs].im *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+            self->hyb_diff_out[row][ts][qs].im -=
+                self->w_diff[1][ts][qs].re *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+          }
+        }
+        for (qs = 2; qs < self->hyb_band_count_max; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir -= self->w_dir[col][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+              sum_im_dir += self->w_dir[col][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+            self->hyb_diff_out[row][ts][qs].re -=
+                self->w_diff[1][ts][qs].im *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+            self->hyb_diff_out[row][ts][qs].im +=
+                self->w_diff[1][ts][qs].re *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+          }
+        }
+      }
+    } else {
+      WORD32 num_cols = (self->dir_sig_count + self->decor_sig_count) > 1
+                         ? 1
+                         : (self->dir_sig_count + self->decor_sig_count);
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir += self->w_dir[0][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir -= self->w_dir[0][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          }
+        }
+        for (qs = 2; qs < self->hyb_band_count_max; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir -= self->w_dir[0][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir += self->w_dir[0][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_mps_apply_mix_matrix_type3(ia_mps_dec_state_struct *self) {
+  WORD32 ts, qs, row, col;
+  WORD32 complex_m2 = ((self->config->bs_phase_coding != 0));
+  WORD32 phase_interpolation = (self->config->bs_phase_coding == 1);
+  WORD32 num_col_iters = 0;
+
+  if (self->res_bands != 28) {
+    ixheaacd_mps_upmix_interp_type2(self->m2_decor_re, self->r_out_diff_re_in_m2,
+                                    self->m2_decor_re_prev, self->out_ch_count, self, 1);
+  }
+  if (self->res_bands == 0) {
+    num_col_iters = self->dir_sig_count;
+    ixheaacd_mps_upmix_interp_type2(self->m2_resid_re, self->r_out_re_in_m2,
+                                    self->m2_resid_re_prev, self->out_ch_count, self, 0);
+  } else {
+    num_col_iters = (self->dir_sig_count + self->decor_sig_count);
+    ixheaacd_mps_upmix_interp_type1(self->m2_resid_re, self->r_out_re_in_m2,
+                                    self->m2_resid_re_prev, self->out_ch_count,
+                                    (self->dir_sig_count + self->decor_sig_count), self, 1);
+  }
+
+  if (complex_m2 && !phase_interpolation) {
+    ixheaacd_mps_upmix_interp_type2(self->m2_resid_im, self->r_out_im_in_m2,
+                                    self->m2_resid_im_prev, self->out_ch_count, self, 0);
+  }
+
+  if (phase_interpolation) {
+    ixheaacd_mps_phase_interpolation(
+        self->phase_l, self->phase_r, self->phase_l_prev, self->phase_r_prev,
+        self->r_out_ph_re_in_m2, self->r_out_ph_im_in_m2, self);
+
+    if (self->res_bands == 0) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        WORD32 pb;
+        for (pb = 0; pb < self->bs_param_bands; pb++) {
+          self->r_out_im_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+          self->r_out_diff_im_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_diff_im_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_diff_re_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_diff_re_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+        }
+      }
+    } else if (self->res_bands == 28) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        WORD32 pb;
+        for (pb = 0; pb < self->bs_param_bands; pb++) {
+          self->r_out_im_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_im_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+        }
+      }
+    } else {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        WORD32 pb;
+        for (pb = 0; pb < self->bs_param_bands; pb++) {
+          self->r_out_im_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_im_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_im_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][0][0] =
+              self->r_out_re_in_m2[ts][pb][0][0] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][0][1] =
+              self->r_out_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_re_in_m2[ts][pb][1][0] =
+              self->r_out_re_in_m2[ts][pb][1][0] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+          self->r_out_re_in_m2[ts][pb][1][1] =
+              self->r_out_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+
+          self->r_out_diff_im_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_im_in_m2[ts][pb][0];
+
+          self->r_out_diff_im_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_im_in_m2[ts][pb][1];
+
+          self->r_out_diff_re_in_m2[ts][pb][0][1] =
+              self->r_out_diff_re_in_m2[ts][pb][0][1] *
+              self->r_out_ph_re_in_m2[ts][pb][0];
+
+          self->r_out_diff_re_in_m2[ts][pb][1][1] =
+              self->r_out_diff_re_in_m2[ts][pb][1][1] *
+              self->r_out_ph_re_in_m2[ts][pb][1];
+        }
+      }
+    }
+  }
+  if (self->res_bands == 0) {
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < self->hyb_band_count[0]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          self->hyb_dir_out[row][ts][qs].re =
+              self->w_dir[0][ts][qs].re *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_dir_out[row][ts][qs].im =
+              self->w_dir[0][ts][qs].im *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_diff_out[row][ts][qs].re =
+              self->w_diff[1][ts][qs].re *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+          self->hyb_diff_out[row][ts][qs].im =
+              self->w_diff[1][ts][qs].im *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+        }
+      }
+    }
+  } else if (self->res_bands == 28) {
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < self->hyb_band_count[1]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          FLOAT32 sum_re_dir = 0;
+          FLOAT32 sum_im_dir = 0;
+          for (col = 0; col < num_col_iters; col++) {
+            sum_re_dir += self->w_dir[col][ts][qs].re *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+            sum_im_dir += self->w_dir[col][ts][qs].im *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+          }
+          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+        }
+      }
+      for (; qs < self->hyb_band_count[0]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          self->hyb_dir_out[row][ts][qs].re =
+              self->w_dir[0][ts][qs].re *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_dir_out[row][ts][qs].im =
+              self->w_dir[0][ts][qs].im *
+              self->r_out_re_in_m2[ts][indx][row][0];
+        }
+      }
+    }
+  } else {
+    WORD32 dif_s = ixheaacd_mps_gain_set_indx[self->res_bands];
+    for (ts = 0; ts < self->time_slots; ts++) {
+      for (qs = 0; qs < dif_s; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          FLOAT32 sum_re_dir = 0;
+          FLOAT32 sum_im_dir = 0;
+          for (col = 0; col < num_col_iters; col++) {
+            sum_re_dir += self->w_dir[col][ts][qs].re *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+            sum_im_dir += self->w_dir[col][ts][qs].im *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+          }
+          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+        }
+      }
+      for (; qs < self->hyb_band_count[1]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          FLOAT32 sum_re_dir = 0;
+          FLOAT32 sum_im_dir = 0;
+          for (col = 0; col < num_col_iters; col++) {
+            sum_re_dir += self->w_dir[col][ts][qs].re *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+            sum_im_dir += self->w_dir[col][ts][qs].im *
+                          self->r_out_re_in_m2[ts][indx][row][col];
+          }
+          self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+          self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          self->hyb_diff_out[row][ts][qs].re =
+              self->w_diff[1][ts][qs].re *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+          self->hyb_diff_out[row][ts][qs].im =
+              self->w_diff[1][ts][qs].im *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+        }
+      }
+      for (; qs < self->hyb_band_count[0]; qs++) {
+        WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+        for (row = 0; row < self->out_ch_count; row++) {
+          self->hyb_dir_out[row][ts][qs].re =
+              self->w_dir[0][ts][qs].re *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_dir_out[row][ts][qs].im =
+              self->w_dir[0][ts][qs].im *
+              self->r_out_re_in_m2[ts][indx][row][0];
+          self->hyb_diff_out[row][ts][qs].re =
+              self->w_diff[1][ts][qs].re *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+          self->hyb_diff_out[row][ts][qs].im =
+              self->w_diff[1][ts][qs].im *
+              self->r_out_diff_re_in_m2[ts][indx][row][1];
+        }
+      }
+    }
+  }
+
+  if (complex_m2) {
+    if (phase_interpolation) {
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir += self->w_dir[col][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+              sum_im_dir -= self->w_dir[col][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+            self->hyb_diff_out[row][ts][qs].re +=
+                self->w_diff[1][ts][qs].im *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+            self->hyb_diff_out[row][ts][qs].im -=
+                self->w_diff[1][ts][qs].re *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+          }
+        }
+        for (qs = 2; qs < self->hyb_band_count_max; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            for (col = 0; col < num_col_iters; col++) {
+              sum_re_dir -= self->w_dir[col][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+              sum_im_dir += self->w_dir[col][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][col];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+            self->hyb_diff_out[row][ts][qs].re -=
+                self->w_diff[1][ts][qs].im *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+            self->hyb_diff_out[row][ts][qs].im +=
+                self->w_diff[1][ts][qs].re *
+                self->r_out_diff_im_in_m2[ts][indx][row][1];
+          }
+        }
+      }
+    } else {
+      WORD32 num_cols = (self->dir_sig_count + self->decor_sig_count) > 1
+                         ? 1
+                         : (self->dir_sig_count + self->decor_sig_count);
+      for (ts = 0; ts < self->time_slots; ts++) {
+        for (qs = 0; qs < 2; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir += self->w_dir[0][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir -= self->w_dir[0][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          }
+        }
+        for (qs = 2; qs < self->hyb_band_count_max; qs++) {
+          WORD32 indx = self->hyb_band_to_processing_band_table[qs];
+          for (row = 0; row < self->out_ch_count; row++) {
+            FLOAT32 sum_re_dir = self->hyb_dir_out[row][ts][qs].re;
+            FLOAT32 sum_im_dir = self->hyb_dir_out[row][ts][qs].im;
+            if (num_cols > 0) {
+              sum_re_dir -= self->w_dir[0][ts][qs].im *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+              sum_im_dir += self->w_dir[0][ts][qs].re *
+                            self->r_out_im_in_m2[ts][indx][row][0];
+            }
+            self->hyb_dir_out[row][ts][qs].re = sum_re_dir;
+            self->hyb_dir_out[row][ts][qs].im = sum_im_dir;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_mps_upmix_interp(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], WORD32 num_rows,
+    WORD32 num_cols, ia_mps_dec_state_struct *self, WORD32 bs_high_rate_mode) {
   WORD32 ts, ps, pb, row, col, i;
+  FLOAT32 ks, ms, ls;
+  FLOAT32 fl_step, fl_base;
 
   for (pb = 0; pb < self->bs_param_bands; pb++) {
     for (row = 0; row < num_rows; row++) {
       for (col = 0; col < num_cols; col++) {
-        ps = 0;
         ts = 0;
-        if (MAX_TIME_SLOTS < (self->param_slot_diff[0])) return -1;
+        ps = 0;
+        ks = self->inv_param_slot_diff[ps];
+        ms = m_matrix[ps][pb][row][col];
+        ls = m_matrix_prev[pb][row][col];
+        fl_step = ks * (ms - ls);
+        fl_base = ls + fl_step;
+
         for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) {
-          WORD32 alpha = i * self->inv_param_slot_diff_Q30[ps];
-          WORD32 one_minus_alpha = 1073741824 - alpha;
-          r_matrix[ts][pb][row][col] =
-              ((ixheaacd_mult32_shl2(m_matrix_prev[pb][row][col],
-                                     one_minus_alpha) +
-                ixheaacd_mult32_shl2(alpha, m_matrix[ps][pb][row][col])));
+          r_matrix_float[ts][pb][row][col] = fl_base;
+          fl_base += fl_step;
           ts++;
         }
+        if (bs_high_rate_mode) {
+          for (ps = 1; ps < self->num_parameter_sets; ps++) {
+            ks = self->inv_param_slot_diff[ps];
+            ms = m_matrix[ps][pb][row][col];
+            ls = m_matrix[ps - 1][pb][row][col];
+            fl_step = ks * (ms - ls);
+            fl_base = ls + fl_step;
 
-        for (ps = 1; ps < self->num_parameter_sets; ps++) {
-          if (MAX_TIME_SLOTS < (ts + self->param_slot_diff[ps])) return -1;
-          for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) {
-            WORD32 alpha = i * self->inv_param_slot_diff_Q30[ps];
-            WORD32 one_minus_alpha = 1073741824 - alpha;
-            r_matrix[ts][pb][row][col] =
-                ((ixheaacd_mult32_shl2(m_matrix[ps - 1][pb][row][col],
-                                       one_minus_alpha) +
-                  ixheaacd_mult32_shl2(alpha, m_matrix[ps][pb][row][col])));
-            ts++;
+            for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) {
+              r_matrix_float[ts][pb][row][col] = fl_base;
+              fl_base += fl_step;
+              ts++;
+            }
           }
         }
       }
     }
   }
-  return 0;
+  return;
+}
+
+VOID ixheaacd_mps_upmix_interp_type1(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], WORD32 num_rows,
+    WORD32 num_cols, ia_mps_dec_state_struct *self, WORD32 bs_high_rate_mode) {
+  WORD32 ts, ps, pb, row, col, i;
+  FLOAT32 ks, ms, ls;
+  FLOAT32 fl_step, fl_base;
+
+  for (pb = 0; pb < self->bs_param_bands; pb++) {
+    for (row = 0; row < num_rows; row++) {
+      for (col = 0; col < num_cols; col++) {
+        ts = 0;
+        ps = 0;
+        ks = self->inv_param_slot_diff[ps];
+        ms = m_matrix[ps][pb][row][col];
+        ls = m_matrix_prev[pb][row][col];
+        fl_step = ks * (ms - ls);
+        fl_base = ls + fl_step;
+
+        for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) {
+          r_matrix_float[ts][pb][row][col] = fl_base;
+          fl_base += fl_step;
+          ts++;
+        }
+        if (bs_high_rate_mode) {
+          for (ps = 1; ps < self->num_parameter_sets; ps++) {
+            ks = self->inv_param_slot_diff[ps];
+            ms = m_matrix[ps][pb][row][col];
+            ls = m_matrix[ps - 1][pb][row][col];
+            fl_step = ks * (ms - ls);
+            fl_base = ls + fl_step;
+
+            for (i = 1; i <= self->param_slot_diff[ps]; i++) {
+              r_matrix_float[ts][pb][row][col] = fl_base;
+              fl_base += fl_step;
+              ts++;
+            }
+          }
+        }
+      }
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_mps_upmix_interp_type2(
+    FLOAT32 m_matrix[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    FLOAT32 r_matrix_float[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT],
+    FLOAT32 m_matrix_prev[MAX_PARAMETER_BANDS][MAX_M_OUTPUT][MAX_M_INPUT], WORD32 num_rows,
+    ia_mps_dec_state_struct *self, WORD32 col) {
+  WORD32 ts, ps, pb, row, i;
+  FLOAT32 ks, ms, ls;
+  FLOAT32 fl_step, fl_base;
+
+  for (pb = 0; pb < self->bs_param_bands; pb++) {
+    for (row = 0; row < num_rows; row++) {
+      ts = 0;
+      ps = 0;
+      ks = self->inv_param_slot_diff[ps];
+      ms = m_matrix[ps][pb][row][col];
+      ls = m_matrix_prev[pb][row][col];
+      fl_step = ks * (ms - ls);
+      fl_base = ls + fl_step;
+
+      for (i = 1; i <= (WORD32)self->param_slot_diff[0]; i++) {
+        r_matrix_float[ts][pb][row][col] = fl_base;
+        fl_base += fl_step;
+        ts++;
+      }
+      for (ps = 1; ps < self->num_parameter_sets; ps++) {
+        ks = self->inv_param_slot_diff[ps];
+        ms = m_matrix[ps][pb][row][col];
+        ls = m_matrix[ps - 1][pb][row][col];
+        fl_step = ks * (ms - ls);
+        fl_base = ls + fl_step;
+
+        for (i = 1; i <= (WORD32)self->param_slot_diff[ps]; i++) {
+          r_matrix_float[ts][pb][row][col] = fl_base;
+          fl_base += fl_step;
+          ts++;
+        }
+      }
+    }
+  }
+  return;
 }
 
 static FLOAT32 ixheaacd_mps_angle_interpolation(FLOAT32 angle1, FLOAT32 angle2,
-                                                FLOAT32 alpha) {
-  while (angle2 - angle1 > (FLOAT32)P_PI)
+                                                FLOAT32 alpha, FLOAT32 *step) {
+  while (angle2 - angle1 > (FLOAT32)P_PI) {
     angle1 = angle1 + 2.0f * (FLOAT32)P_PI;
-  while (angle1 - angle2 > (FLOAT32)P_PI)
+  }
+  while (angle1 - angle2 > (FLOAT32)P_PI) {
     angle2 = angle2 + 2.0f * (FLOAT32)P_PI;
-
+  }
+  *step = angle2 - angle1;
   return (1 - alpha) * angle1 + alpha * angle2;
 }
 
@@ -647,37 +1322,48 @@
     FLOAT32 r_re[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],
     FLOAT32 r_im[MAX_TIME_SLOTS][MAX_PARAMETER_BANDS][2],
     ia_mps_dec_state_struct *self) {
-  WORD32 ts, ps, pb;
-  WORD32 i;
+  WORD32 i, ts, ps, pb;
+  FLOAT32 step_l, step_r, alpha, tl, tr;
   for (pb = 0; pb < self->bs_param_bands; pb++) {
     ps = 0;
     ts = 0;
+    alpha = (FLOAT32)self->inv_param_slot_diff[ps];
+    tl = ixheaacd_mps_angle_interpolation(pl_prev[pb], pl[ps][pb], alpha,
+                                          &step_l);
+    tr = ixheaacd_mps_angle_interpolation(pr_prev[pb], pr[ps][pb], alpha,
+                                          &step_r);
+    step_l *= alpha;
+    step_r *= alpha;
+
     for (i = 1; i <= self->param_slot_diff[ps]; i++) {
-      FLOAT32 alpha = (FLOAT32)i * self->inv_param_slot_diff[ps];
-      FLOAT32 t;
+      r_re[ts][pb][0] = (FLOAT32)cos(tl);
+      r_im[ts][pb][0] = (FLOAT32)sin(tl);
+      tl += step_l;
 
-      t = ixheaacd_mps_angle_interpolation(pl_prev[pb], pl[ps][pb], alpha);
-      r_re[ts][pb][0] = (FLOAT32)cos(t);
-      r_im[ts][pb][0] = (FLOAT32)sin(t);
-
-      t = ixheaacd_mps_angle_interpolation(pr_prev[pb], pr[ps][pb], alpha);
-      r_re[ts][pb][1] = (FLOAT32)cos(t);
-      r_im[ts][pb][1] = (FLOAT32)sin(t);
+      r_re[ts][pb][1] = (FLOAT32)cos(tr);
+      r_im[ts][pb][1] = (FLOAT32)sin(tr);
+      tr += step_r;
       ts++;
     }
 
     for (ps = 1; ps < self->num_parameter_sets; ps++) {
+      FLOAT32 alpha = self->inv_param_slot_diff[ps];
+      tl = ixheaacd_mps_angle_interpolation(pl[ps - 1][pb], pl[ps][pb], alpha,
+                                            &step_l);
+      tr = ixheaacd_mps_angle_interpolation(pr[ps - 1][pb], pr[ps][pb], alpha,
+                                            &step_r);
+      step_l *= alpha;
+      step_r *= alpha;
       for (i = 1; i <= self->param_slot_diff[ps]; i++) {
-        FLOAT32 alpha = (FLOAT32)i * self->inv_param_slot_diff[ps];
-        FLOAT32 t;
+        if (ts < 72 && pb < 28) {
+          r_re[ts][pb][0] = (FLOAT32)cos(tl);
+          r_im[ts][pb][0] = (FLOAT32)sin(tl);
+          tl += step_l;
 
-        t = ixheaacd_mps_angle_interpolation(pl[ps - 1][pb], pl[ps][pb], alpha);
-        r_re[ts][pb][0] = (FLOAT32)cos(t);
-        r_im[ts][pb][0] = (FLOAT32)sin(t);
-
-        t = ixheaacd_mps_angle_interpolation(pr[ps - 1][pb], pr[ps][pb], alpha);
-        r_re[ts][pb][1] = (FLOAT32)cos(t);
-        r_im[ts][pb][1] = (FLOAT32)sin(t);
+          r_re[ts][pb][1] = (FLOAT32)cos(tr);
+          r_im[ts][pb][1] = (FLOAT32)sin(tr);
+          tr += step_r;
+        }
         ts++;
 
         if (ts > 71) {
diff --git a/decoder/ixheaacd_mps_process.c b/decoder/ixheaacd_mps_process.c
new file mode 100644
index 0000000..5a4a5dd
--- /dev/null
+++ b/decoder/ixheaacd_mps_process.c
@@ -0,0 +1,379 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_memory_standards.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_decor.h"
+#include "ixheaacd_mps_hybfilter.h"
+#include "ixheaacd_mps_mdct_2_qmf.h"
+#include "ixheaacd_mps_get_index.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_error_standards.h"
+
+VOID ixheaacd_mdct_2_qmf(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+  WORD32 ch, rfpsf, qb;
+  WORD32 qmf_global_offset;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 time_slots_x4 = (time_slots << 2);
+  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
+  WORD32 *p_qmf_residual_real_post, *p_qmf_residual_imag_post;
+  VOID *scratch = pstr_mps_state->mps_scratch_mem_v;
+
+  if (pstr_mps_state->up_mix_type != 2) {
+    WORD32 num_ch = pstr_mps_state->num_ott_boxes + pstr_mps_state->num_ttt_boxes;
+    WORD32 rfpsf_max = pstr_mps_state->residual_frames_per_spatial_frame;
+    WORD32 upd_qmf = pstr_mps_state->upd_qmf;
+
+    WORD32 *qmf_residual_real_pre = p_array_struct->qmf_residual_real_pre;
+    WORD32 *qmf_residual_real_post = p_array_struct->qmf_residual_real_post;
+
+    WORD32 *qmf_residual_imag_pre = p_array_struct->qmf_residual_imag_pre;
+    WORD32 *qmf_residual_imag_post = p_array_struct->qmf_residual_imag_post;
+
+    WORD32 *p_res_mdct = p_array_struct->res_mdct;
+
+    for (ch = 0; ch < num_ch; ch++) {
+      if (pstr_mps_state->bs_config.bs_residual_present[ch]) {
+        WORD32 *res_mdct = p_res_mdct;
+        qmf_global_offset = 0;
+
+        p_qmf_residual_real_post = qmf_residual_real_post;
+        p_qmf_residual_imag_post = qmf_residual_imag_post;
+        for (qb = 0; qb < qmf_bands; qb++) {
+          memset(p_qmf_residual_real_post, 0, time_slots_x4);
+          memset(p_qmf_residual_imag_post, 0, time_slots_x4);
+
+          p_qmf_residual_real_post += MAX_TIME_SLOTS;
+          p_qmf_residual_imag_post += MAX_TIME_SLOTS;
+        }
+
+        for (rfpsf = 0; rfpsf < rfpsf_max; rfpsf++) {
+          ixheaacd_mdct2qmf_process(upd_qmf, res_mdct, qmf_residual_real_pre,
+                                    qmf_residual_real_post, qmf_residual_imag_pre,
+                                    qmf_residual_imag_post,
+                                    pstr_mps_state->res_block_type[ch][rfpsf], qmf_global_offset,
+                                    &(pstr_mps_state->ia_mps_dec_mps_table), scratch, time_slots);
+          qmf_global_offset += upd_qmf;
+          res_mdct += MDCTCOEFX2;
+        }
+      }
+
+      qmf_residual_real_pre += QBXTS;
+      qmf_residual_imag_pre += QBXTS;
+
+      qmf_residual_real_post += QBXTS;
+      qmf_residual_imag_post += QBXTS;
+
+      p_res_mdct += RFX2XMDCTCOEF;
+    }
+  }
+
+  if (pstr_mps_state->arbitrary_downmix == 2) {
+    WORD32 arbdmx_upd_qmf = pstr_mps_state->arbdmx_upd_qmf;
+    WORD32 offset = pstr_mps_state->num_ott_boxes + pstr_mps_state->num_ttt_boxes;
+    WORD32 in_ch = pstr_mps_state->num_input_channels;
+    WORD32 rfpsf_max = pstr_mps_state->arbdmx_frames_per_spatial_frame;
+
+    WORD32 *qmf_residual_real_pre = p_array_struct->qmf_residual_real_pre + offset * QBXTS;
+    WORD32 *qmf_residual_imag_pre = p_array_struct->qmf_residual_imag_pre + offset * QBXTS;
+
+    WORD32 *qmf_residual_real_post = p_array_struct->qmf_residual_real_post + offset * QBXTS;
+    WORD32 *qmf_residual_imag_post = p_array_struct->qmf_residual_imag_post + offset * QBXTS;
+
+    WORD32 *p_res_mdct = p_array_struct->res_mdct + offset * RFX2XMDCTCOEF;
+
+    for (ch = 0; ch < in_ch; ch++) {
+      WORD32 *res_mdct = p_res_mdct;
+      qmf_global_offset = 0;
+
+      p_qmf_residual_real_post = qmf_residual_real_post;
+      p_qmf_residual_imag_post = qmf_residual_imag_post;
+      for (qb = 0; qb < qmf_bands; qb++) {
+        memset(p_qmf_residual_real_post, 0, time_slots_x4);
+        memset(p_qmf_residual_imag_post, 0, time_slots_x4);
+
+        p_qmf_residual_real_post += MAX_TIME_SLOTS;
+        p_qmf_residual_imag_post += MAX_TIME_SLOTS;
+      }
+
+      for (rfpsf = 0; rfpsf < rfpsf_max; rfpsf++) {
+        ixheaacd_mdct2qmf_process(
+            arbdmx_upd_qmf, res_mdct, qmf_residual_real_pre, qmf_residual_real_post,
+            qmf_residual_imag_pre, qmf_residual_imag_post,
+            pstr_mps_state->res_block_type[offset + ch][rfpsf], qmf_global_offset,
+            &(pstr_mps_state->ia_mps_dec_mps_table), scratch, time_slots);
+        qmf_global_offset += arbdmx_upd_qmf;
+        res_mdct += MDCTCOEFX2;
+      }
+
+      qmf_residual_real_pre += QBXTS;
+      qmf_residual_imag_pre += QBXTS;
+
+      qmf_residual_imag_post += QBXTS;
+      qmf_residual_real_post += QBXTS;
+
+      p_res_mdct += RFX2XMDCTCOEF;
+    }
+  }
+  return;
+}
+
+VOID ixheaacd_hybrid_qmf_analysis(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 ch;
+  WORD32 in_ch = pstr_mps_state->num_input_channels;
+  WORD32 num_ott_boxes = pstr_mps_state->num_ott_boxes;
+  WORD32 num_ttt_boxes = pstr_mps_state->num_ttt_boxes;
+  WORD32 num_input_channels = in_ch;
+  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  SIZE_T *kernels = pstr_mps_state->kernels;
+  WORD32 *res_bands = pstr_mps_state->res_bands;
+  WORD32 *index = pstr_mps_state->index;
+
+  ia_mps_dec_thyb_filter_state_struct *hyb_filter_state =
+      pstr_mps_state->mps_persistent_mem.hyb_filter_state;
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+
+  ia_mps_dec_hybrid_tables_struct *hybrid_table_ptr =
+      pstr_mps_state->ia_mps_dec_mps_table.hybrid_table_ptr;
+
+  WORD32 *p_buf_real = p_array_struct->buf_real;
+  WORD32 *p_buf_imag = p_array_struct->buf_imag;
+
+  WORD32 *p_x_real = p_array_struct->x_real;
+  WORD32 *p_x_imag = p_array_struct->x_imag;
+
+  for (ch = 0; ch < in_ch; ch++) {
+    ixheaacd_apply_ana_hyb_filt_bank_create_x(&hyb_filter_state[ch], p_buf_real, p_buf_imag,
+                                              qmf_bands, time_slots, p_x_real, p_x_imag,
+                                              hybrid_table_ptr);
+    pstr_mps_state->index[ch] = hybrid_bands;
+
+    p_buf_real += TSXHB;
+    p_buf_imag += TSXHB;
+
+    p_x_real += TSXHB;
+    p_x_imag += TSXHB;
+  }
+
+  if ((pstr_mps_state->residual_coding) && (pstr_mps_state->up_mix_type != 2)) {
+    WORD32 *qmf_residual_real = p_array_struct->qmf_residual_real_pre;
+    WORD32 *qmf_residual_imag = p_array_struct->qmf_residual_imag_pre;
+
+    WORD32 *p_dry_real = p_array_struct->w_dry_real;
+    WORD32 *p_dry_imag = p_array_struct->w_dry_imag;
+
+    for (ch = 0; ch < num_ott_boxes; ch++) {
+      if (res_bands[ch] > 0) {
+        ixheaacd_apply_ana_hyb_filt_bank_merge_res_decor(
+            &hyb_filter_state[ch + num_input_channels], qmf_residual_real, qmf_residual_imag,
+            qmf_bands, time_slots, p_dry_real, p_dry_imag, hybrid_table_ptr);
+      }
+      qmf_residual_real += QBXTS;
+      qmf_residual_imag += QBXTS;
+
+      p_dry_real += TSXHB;
+      p_dry_imag += TSXHB;
+    }
+
+    for (ch = num_ott_boxes; ch < num_ott_boxes + num_ttt_boxes; ch++, in_ch++) {
+      if (res_bands[ch] > 0) {
+        ixheaacd_apply_ana_hyb_filt_bank_create_x_res(
+            &hyb_filter_state[ch + num_input_channels], qmf_residual_real, qmf_residual_imag,
+            qmf_bands, time_slots, p_x_real, p_x_imag, kernels, res_bands[ch], hybrid_bands,
+            num_parameter_bands, &index[in_ch], hybrid_table_ptr);
+      } else
+        index[in_ch] = 0;
+
+      qmf_residual_real += QBXTS;
+      qmf_residual_imag += QBXTS;
+
+      p_x_real += TSXHB;
+      p_x_imag += TSXHB;
+    }
+  }
+
+  in_ch = num_input_channels + num_ttt_boxes;
+  if (pstr_mps_state->arbitrary_downmix == 2) {
+    WORD32 offset = num_ott_boxes + num_ttt_boxes;
+
+    WORD32 *qmf_residual_real = p_array_struct->qmf_residual_real_pre + offset * QBXTS;
+    WORD32 *qmf_residual_imag = p_array_struct->qmf_residual_imag_pre + offset * QBXTS;
+
+    p_x_real = p_array_struct->x_real + in_ch * TSXHB;
+    p_x_imag = p_array_struct->x_imag + in_ch * TSXHB;
+    for (ch = 0; ch < num_input_channels; ch++, in_ch++) {
+      ixheaacd_apply_ana_hyb_filt_bank_create_x_res(
+          &hyb_filter_state[offset + ch + num_input_channels], qmf_residual_real,
+          qmf_residual_imag, qmf_bands, time_slots, p_x_real, p_x_imag, kernels,
+          pstr_mps_state->arbdmx_residual_bands, hybrid_bands, num_parameter_bands, &index[in_ch],
+          hybrid_table_ptr);
+
+      qmf_residual_real += QBXTS;
+      qmf_residual_imag += QBXTS;
+
+      p_x_real += TSXHB;
+      p_x_imag += TSXHB;
+    }
+  }
+}
+
+VOID ixheaacd_merge_res_decor(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 ts, qs, row, res;
+
+  WORD32 temp_1;
+  SIZE_T *idx;
+
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
+  WORD32 num_direct_signals = pstr_mps_state->num_direct_signals;
+  WORD32 num_w_channels = pstr_mps_state->num_w_channels;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  SIZE_T *kernels_ptr = pstr_mps_state->kernels;
+
+  WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
+  WORD32 *buf_real_ch4, *buf_imag_ch4;
+  WORD32 *buf_real_ch3, *buf_imag_ch3;
+
+  p_buf_real = p_array_struct->buffer_real + TSXHBX5;
+  p_buf_imag = p_array_struct->buffer_imag + TSXHBX5;
+
+  for (ts = 0; ts < time_slots; ts++) {
+    p_buf_re = p_buf_real;
+    p_buf_im = p_buf_imag;
+
+    buf_real_ch4 = p_buf_real - TSXHB;
+    buf_imag_ch4 = p_buf_imag - TSXHB;
+
+    buf_real_ch3 = buf_real_ch4 - TSXHB;
+    buf_imag_ch3 = buf_imag_ch4 - TSXHB;
+
+    for (qs = 0; qs < hybrid_bands; qs++) {
+      if ((kernels_ptr[qs] < ((UWORD32)(p_aux_struct->ttt_config[0][0].stop_band)) &&
+           p_aux_struct->ttt_config[0][0].use_ttt_decorr) ||
+          (kernels_ptr[qs] >= ((UWORD32)p_aux_struct->ttt_config[1][0].start_band) &&
+           p_aux_struct->ttt_config[1][0].use_ttt_decorr)) {
+        temp_1 = (WORD32)ONE_BY_SQRT_TWO_Q30;
+
+        *p_buf_re = ixheaacd_mps_mult32_shr_30(*p_buf_re, temp_1);
+        *p_buf_re += (*buf_real_ch3 + *buf_real_ch4);
+
+        *p_buf_im = ixheaacd_mps_mult32_shr_30(*p_buf_im, temp_1);
+        *p_buf_im += (*buf_imag_ch3 + *buf_imag_ch4);
+      }
+      p_buf_re++;
+      p_buf_im++;
+
+      buf_real_ch4++;
+      buf_imag_ch4++;
+
+      buf_real_ch3++;
+      buf_imag_ch3++;
+    }
+    p_buf_real += MAX_HYBRID_BANDS;
+    p_buf_imag += MAX_HYBRID_BANDS;
+  }
+
+  if (pstr_mps_state->residual_coding) {
+    for (row = num_direct_signals; row < num_w_channels; row++) {
+      WORD32 resband;
+      res = ixheaacd_get_res_idx(pstr_mps_state, row);
+      resband = pstr_mps_state->res_bands[res];
+
+      if (resband == 1 && (num_parameter_bands == 20 || num_parameter_bands == 28))
+        pstr_mps_state->index[res] = 3;
+      else {
+        idx = &kernels_ptr[0];
+        for (qs = 0; qs < hybrid_bands; qs++) {
+          if (*idx++ >= (SIZE_T)resband) {
+            pstr_mps_state->index[res] = qs;
+            qs = hybrid_bands;
+          }
+        }
+      }
+    }
+  }
+}
+
+VOID ixheaacd_create_w(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 k;
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+  WORD32 num_direct_signals = pstr_mps_state->num_direct_signals;
+  WORD32 counter = num_direct_signals + pstr_mps_state->num_decor_signals;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 offset = num_direct_signals * TSXHB;
+  WORD32 *p_buffer_real = p_array_struct->buf_real + offset;
+  WORD32 *p_buffer_imag = p_array_struct->buf_imag + offset;
+
+  WORD32 *p_buf_real = p_array_struct->buffer_real + offset;
+  WORD32 *p_buf_imag = p_array_struct->buffer_imag + offset;
+
+  for (k = num_direct_signals; k < counter; k++) {
+    ixheaacd_decorr_apply(pstr_mps_state, time_slots, p_buffer_real, p_buffer_imag, p_buf_real,
+                          p_buf_imag, k);
+
+    p_buffer_real += TSXHB;
+    p_buffer_imag += TSXHB;
+
+    p_buf_real += TSXHB;
+    p_buf_imag += TSXHB;
+  }
+  ixheaacd_merge_res_decor(pstr_mps_state);
+}
+
+VOID ixheaacd_update_buffers(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+  WORD32 *temp_addr = p_array_struct->qmf_residual_real_post;
+  p_array_struct->qmf_residual_real_post = p_array_struct->qmf_residual_real_pre;
+  p_array_struct->qmf_residual_real_pre = temp_addr;
+
+  temp_addr = p_array_struct->qmf_residual_imag_post;
+  p_array_struct->qmf_residual_imag_post = p_array_struct->qmf_residual_imag_pre;
+  p_array_struct->qmf_residual_imag_pre = temp_addr;
+
+  p_array_struct->buffer_real = p_array_struct->qmf_residual_real_post;
+  p_array_struct->buffer_imag = p_array_struct->qmf_residual_imag_post;
+
+  p_array_struct->m1_param = (ia_mps_dec_m1_param_struct *)p_array_struct->buffer_real;
+}
diff --git a/decoder/ixheaacd_mps_process.h b/decoder/ixheaacd_mps_process.h
index 97b7090..edf0580 100644
--- a/decoder/ixheaacd_mps_process.h
+++ b/decoder/ixheaacd_mps_process.h
@@ -20,14 +20,18 @@
 #ifndef IXHEAACD_MPS_PROCESS_H
 #define IXHEAACD_MPS_PROCESS_H
 
-VOID ixheaacd_mps_res_buf_copy(ia_mps_dec_state_struct* self);
-VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct* self);
-VOID ixheaacd_mps_qmf_hyb_synthesis(ia_mps_dec_state_struct* self);
-VOID ixheaacd_mps_decor(ia_mps_dec_state_struct* self);
-VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self);
-VOID ixheaacd_mps_create_x(ia_mps_dec_state_struct* self);
-VOID ixheaacd_mps_mix_res_decor(ia_mps_dec_state_struct* self);
-VOID ixheaacd_mps_buffer_update(ia_mps_dec_state_struct* self);
-VOID ixheaacd_mps_synt_calc(ia_mps_dec_state_struct* self);
+VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_qmf_hyb_analysis_no_pre_mix(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_qmf_hyb_synthesis(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_decor(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_mix_res_decor(ia_mps_dec_state_struct *self);
+VOID ixheaacd_mps_synt_calc(ia_mps_dec_state_struct *self);
 
-#endif
+VOID ixheaacd_mdct_2_qmf(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_hybrid_qmf_analysis(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_create_w(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_merge_res_decor(ia_heaac_mps_state_struct *pstr_mps_state);
+VOID ixheaacd_update_buffers(ia_heaac_mps_state_struct *pstr_mps_state);
+
+#endif /* IXHEAACD_MPS_PROCESS_H */
diff --git a/decoder/ixheaacd_mps_res.h b/decoder/ixheaacd_mps_res.h
new file mode 100644
index 0000000..b84043b
--- /dev/null
+++ b/decoder/ixheaacd_mps_res.h
@@ -0,0 +1,34 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RES_H
+#define IXHEAACD_MPS_RES_H
+
+#include "ixheaacd_error_codes.h"
+
+#define AAC_DEC_OK IA_XHEAAC_DEC_API_NONFATAL_NO_ERROR
+#define AAC_DEC_INVALID_CODE_BOOK IA_XHEAAC_DEC_EXE_NONFATAL_INVALID_CODE_BOOK
+#define AAC_DEC_PREDICTION_NOT_SUPPORTED_IN_LC_AAC \
+  IA_XHEAAC_DEC_EXE_NONFATAL_PREDICTION_DATA_PRESENT
+#define AAC_DEC_UNIMPLEMENTED_GAIN_CONTROL_DATA \
+  IA_XHEAAC_DEC_EXE_NONFATAL_GAIN_CONTROL_DATA_PRESENT
+#define AAC_DEC_TNS_RANGE_ERROR IA_XHEAAC_DEC_EXE_FATAL_TNS_RANGE_ERROR
+#define AAC_DEC_TNS_ORDER_ERROR IA_XHEAAC_DEC_EXE_NONFATAL_TNS_ORDER_ERROR
+
+#endif /* IXHEAACD_MPS_RES_H */
diff --git a/decoder/ixheaacd_mps_res_block.c b/decoder/ixheaacd_mps_res_block.c
new file mode 100644
index 0000000..e4444fd
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_block.c
@@ -0,0 +1,1064 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_basic_ops.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_basic_op.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_res_block.h"
+#include "ixheaacd_mps_res_huffman.h"
+
+static PLATFORM_INLINE WORD32 ixheaacd_res_extract_symbol(WORD32 value, WORD32 l_shift,
+                                                          WORD32 r_shift, WORD32 *pow_table_q17) {
+  WORD32 out;
+  out = (WORD16)((value << l_shift) >> r_shift);
+
+  if (out < 0) {
+    out = -out;
+    out = pow_table_q17[out];
+    out = -out;
+  } else
+    out = pow_table_q17[out];
+
+  return out;
+}
+
+static PLATFORM_INLINE WORD32 ixheaacd_res_extract_signed_symbol(WORD32 value, WORD32 l_shift,
+                                                                 WORD32 r_shift,
+                                                                 WORD32 *pow_table_q17,
+                                                                 WORD32 *temp_word,
+                                                                 WORD32 *pr_bit_pos) {
+  WORD32 out;
+  out = ixheaacd_extu(value, l_shift, r_shift);
+  if (out) {
+    WORD32 bit_pos = *pr_bit_pos;
+    out = pow_table_q17[out];
+    if (*temp_word & 0x80000000) {
+      out = -out;
+    }
+    *temp_word = *temp_word << 1;
+    bit_pos++;
+    *pr_bit_pos = bit_pos;
+  }
+  return out;
+}
+
+VOID ixheaacd_res_inverse_quant_lb(WORD32 *x_invquant, WORD t_bands, WORD32 *pow_table_q17,
+                                   WORD8 *pulse_data) {
+  WORD32 j;
+  WORD32 temp;
+  WORD32 q_abs;
+
+  for (j = t_bands - 1; j >= 0; j--) {
+    q_abs = *pulse_data++;
+    temp = (pow_table_q17[q_abs]);
+    *x_invquant++ = -temp;
+  }
+}
+
+static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word1(
+    ia_bit_buf_struct *it_bit_buf, WORD32 *qp, WORD16 *offsets, WORD no_bands, WORD group_no,
+    const UWORD16 *h_ori, WORD32 *pow_table_q17, WORD32 maximum_bins_short) {
+  WORD32 sp1, sp2;
+  WORD32 flush_cw;
+  WORD32 i, value, norm_val, off;
+  WORD idx, grp_idx;
+  WORD32 out1, out2;
+  WORD32 err_code = 0;
+  WORD len_idx = 0;
+  UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
+  WORD32 bit_pos = it_bit_buf->bit_pos;
+  WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
+  ptr_read_next += 4;
+
+  do {
+    len_idx = offsets[1] - offsets[0];
+    grp_idx = group_no;
+    do {
+      qp = qp + offsets[0];
+      idx = len_idx;
+      do {
+        {
+          UWORD16 first_offset;
+          WORD16 sign_ret_val;
+          UWORD32 read_word1;
+          UWORD16 *h;
+
+          read_word1 = read_word << bit_pos;
+
+          h = (UWORD16 *)h_ori;
+          h += (read_word1) >> (27);
+          sign_ret_val = *h;
+
+          first_offset = 5;
+          while (sign_ret_val > 0) {
+            bit_pos += first_offset;
+            ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                        it_bit_buf->ptr_bit_buf_end);
+            read_word1 = (read_word1) << (first_offset);
+            first_offset = (sign_ret_val >> 11);
+            h += sign_ret_val & (0x07FF);
+            h += (read_word1) >> (32 - first_offset);
+            sign_ret_val = *h;
+          }
+          bit_pos += ((sign_ret_val & 0x7fff) >> 11);
+          value = sign_ret_val & (0x07FF);
+        }
+        out1 = (value & 0x3E0) >> 5;
+        out2 = value & 0x1F;
+
+        flush_cw = read_word << bit_pos;
+
+        sp1 = out1;
+        sp2 = out2;
+
+        if (out1) {
+          if (flush_cw & 0x80000000) {
+            out1 = -out1;
+          }
+          bit_pos++;
+          flush_cw = (WORD32)flush_cw << 1;
+        }
+
+        if (out2) {
+          bit_pos++;
+          if (flush_cw & 0x80000000) {
+            out2 = -out2;
+          }
+        }
+
+        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                    it_bit_buf->ptr_bit_buf_end);
+        if (sp1 == 16) {
+          i = 4;
+          value = ixheaacd_extu(read_word, bit_pos, 23);
+          value = value | 0xfffffe00;
+          norm_val = ixheaacd_norm32(value);
+
+          i += (norm_val - 22);
+          bit_pos += (norm_val - 21);
+
+          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                      it_bit_buf->ptr_bit_buf_end);
+
+          off = ixheaacd_extu(read_word, bit_pos, 32 - i);
+
+          bit_pos += i;
+
+          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                      it_bit_buf->ptr_bit_buf_end);
+
+          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                      it_bit_buf->ptr_bit_buf_end);
+
+          i = off + ((WORD32)1 << i);
+
+          if (i <= IQ_TABLE_SIZE_HALF)
+            i = pow_table_q17[i];
+          else {
+            err_code |= ixheaacd_res_inv_quant(&i, pow_table_q17);
+          }
+
+          if (out1 < 0) {
+            out1 = -i;
+          } else {
+            out1 = i;
+          }
+          *qp++ = out1;
+        } else {
+          if (out1 <= 0) {
+            out1 = -out1;
+            out1 = pow_table_q17[out1];
+            *qp++ = -out1;
+          } else {
+            out1 = pow_table_q17[out1];
+            *qp++ = out1;
+          }
+        }
+        if (sp2 == 16) {
+          i = 4;
+          value = ixheaacd_extu(read_word, bit_pos, 23);
+          value = value | 0xfffffe00;
+          norm_val = ixheaacd_norm32(value);
+
+          i += (norm_val - 22);
+
+          bit_pos += (norm_val - 21);
+
+          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                      it_bit_buf->ptr_bit_buf_end);
+
+          off = ixheaacd_extu(read_word, bit_pos, 32 - i);
+
+          bit_pos += i;
+
+          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                      it_bit_buf->ptr_bit_buf_end);
+
+          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                      it_bit_buf->ptr_bit_buf_end);
+
+          i = off + ((WORD32)1 << i);
+
+          if (i <= IQ_TABLE_SIZE_HALF)
+            i = pow_table_q17[i];
+          else {
+            err_code |= ixheaacd_res_inv_quant(&i, pow_table_q17);
+          }
+
+          if (out2 < 0) {
+            out2 = -i;
+          } else {
+            out2 = i;
+          }
+          *qp++ = out2;
+        } else {
+          if (out2 <= 0) {
+            out2 = -out2;
+            out2 = pow_table_q17[out2];
+            *qp++ = -out2;
+          } else {
+            out2 = pow_table_q17[out2];
+            *qp++ = out2;
+          }
+        }
+
+        idx -= 2;
+      } while (idx != 0);
+
+      qp += (maximum_bins_short - offsets[1]);
+      grp_idx--;
+    } while (grp_idx != 0);
+
+    offsets++;
+    qp -= (maximum_bins_short * group_no);
+    no_bands--;
+  } while (no_bands >= 0);
+
+  it_bit_buf->bit_pos = bit_pos;
+  it_bit_buf->ptr_read_next = ptr_read_next - 4;
+
+  return err_code;
+}
+
+static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word1_lb(
+    ia_bit_buf_struct *it_bif_buf, WORD32 len, const UWORD16 *h_ori, WORD32 *x_invquant,
+    WORD32 *pow_table_q17, WORD8 *p_pul_arr) {
+  WORD32 sp1, sp2;
+  WORD32 flush_cw;
+  WORD32 i, value, norm_val, off;
+  WORD idx;
+  WORD32 out1, out2;
+  WORD32 err_code = 0;
+  UWORD8 *ptr_read_next = it_bif_buf->ptr_read_next;
+  WORD32 bit_pos = it_bif_buf->bit_pos;
+  WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
+  ptr_read_next += 4;
+
+  for (idx = len; idx != 0; idx -= 2) {
+    {
+      UWORD16 first_offset;
+      WORD16 sign_ret_val;
+      UWORD32 read_word1;
+      UWORD16 *h;
+
+      read_word1 = read_word << bit_pos;
+
+      h = (UWORD16 *)h_ori;
+      h += (read_word1) >> (27);
+      sign_ret_val = *h;
+
+      first_offset = 5;
+      while (sign_ret_val > 0) {
+        bit_pos += first_offset;
+        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                    it_bif_buf->ptr_bit_buf_end);
+        read_word1 = (read_word1) << (first_offset);
+
+        first_offset = (sign_ret_val >> 11);
+        h += sign_ret_val & (0x07FF);
+
+        h += (read_word1) >> (32 - first_offset);
+        sign_ret_val = *h;
+      }
+      bit_pos += ((sign_ret_val & 0x7fff) >> 11);
+      value = sign_ret_val & (0x07FF);
+    }
+
+    flush_cw = read_word << bit_pos;
+
+    out1 = (value & 0x3E0) >> 5;
+    out2 = value & 0x1F;
+
+    sp1 = out1;
+
+    if (out1) {
+      if (flush_cw & 0x80000000) {
+        out1 = -out1;
+      }
+
+      bit_pos++;
+      flush_cw = (WORD32)flush_cw << 1;
+    }
+
+    sp2 = out2;
+    if (out2) {
+      bit_pos++;
+      if (flush_cw & 0x80000000) {
+        out2 = -out2;
+      }
+    }
+
+    ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                it_bif_buf->ptr_bit_buf_end);
+
+    if (sp1 == 16) {
+      i = 4;
+      value = ixheaacd_extu(read_word, bit_pos, 23);
+      value = value | 0xfffffe00;
+      norm_val = ixheaacd_norm32(value);
+      i += (norm_val - 22);
+      bit_pos += (norm_val - 21);
+
+      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                  it_bif_buf->ptr_bit_buf_end);
+
+      off = ixheaacd_extu(read_word, bit_pos, 32 - i);
+
+      bit_pos += i;
+
+      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                  it_bif_buf->ptr_bit_buf_end);
+      value = *p_pul_arr++;
+      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                  it_bif_buf->ptr_bit_buf_end);
+      i = off + ((WORD32)1 << i);
+      i = add_d(i, value);
+
+      if (i <= IQ_TABLE_SIZE_HALF)
+        i = pow_table_q17[i];
+      else {
+        err_code |= ixheaacd_res_inv_quant(&i, pow_table_q17);
+      }
+      if (out1 < 0) {
+        i = -i;
+      }
+      *x_invquant++ = i;
+    } else {
+      WORD8 temp = *p_pul_arr++;
+      if (out1 <= 0) {
+        out1 = sub_d(temp, out1);
+        out1 = pow_table_q17[out1];
+        *x_invquant++ = -out1;
+      } else {
+        out1 = add_d(out1, temp);
+        out1 = pow_table_q17[out1];
+        *x_invquant++ = out1;
+      }
+    }
+
+    if (sp2 == 16) {
+      i = 4;
+      value = ixheaacd_extu(read_word, bit_pos, 23);
+      value = value | 0xfffffe00;
+      norm_val = ixheaacd_norm32(value);
+
+      i += (norm_val - 22);
+
+      bit_pos += (norm_val - 21);
+
+      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                  it_bif_buf->ptr_bit_buf_end);
+
+      off = ixheaacd_extu(read_word, bit_pos, 32 - i);
+
+      bit_pos += i;
+
+      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                  it_bif_buf->ptr_bit_buf_end);
+      value = *p_pul_arr++;
+      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                  it_bif_buf->ptr_bit_buf_end);
+
+      i = off + ((WORD32)1 << i);
+      i = add_d(i, value);
+      if (i <= IQ_TABLE_SIZE_HALF)
+        i = pow_table_q17[i];
+      else {
+        err_code |= ixheaacd_res_inv_quant(&i, pow_table_q17);
+      }
+
+      if (out2 < 0) {
+        i = -i;
+      }
+      *x_invquant++ = i;
+    } else {
+      WORD8 temp = *p_pul_arr++;
+      if (out2 <= 0) {
+        out2 = sub_d(temp, out2);
+        out2 = pow_table_q17[out2];
+        *x_invquant++ = -out2;
+      } else {
+        out2 = add_d(out2, temp);
+        out2 = pow_table_q17[out2];
+        *x_invquant++ = out2;
+      }
+    }
+  }
+
+  it_bif_buf->ptr_read_next = ptr_read_next - 4;
+  it_bif_buf->bit_pos = bit_pos;
+
+  return err_code;
+}
+
+static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word2_4(
+    ia_bit_buf_struct *it_bit_buf, WORD32 *qp, WORD16 *offsets, WORD no_bands, WORD group_no,
+    const UWORD16 *h_ori, WORD32 *pow_table_q17, WORD32 sign, WORD32 maximum_bins_short) {
+  WORD32 value;
+  WORD idx, grp_idx;
+  WORD idx_len;
+  WORD32 *qp_org;
+
+  UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
+  WORD32 bit_pos = it_bit_buf->bit_pos;
+  WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
+  ptr_read_next += 4;
+  qp_org = qp;
+  do {
+    idx_len = offsets[1] - offsets[0];
+    grp_idx = group_no;
+
+    do {
+      qp = qp + offsets[0];
+      idx = idx_len;
+      do {
+        UWORD16 first_offset;
+        WORD16 sign_ret_val;
+        UWORD32 read_word1;
+        UWORD16 *h;
+
+        read_word1 = read_word << bit_pos;
+
+        h = (UWORD16 *)h_ori;
+        h += (read_word1) >> (27);
+        sign_ret_val = *h;
+
+        first_offset = 5;
+        while (sign_ret_val > 0) {
+          bit_pos += first_offset;
+          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                      it_bit_buf->ptr_bit_buf_end);
+          read_word1 = (read_word1) << (first_offset);
+
+          first_offset = (sign_ret_val >> 11);
+          h += sign_ret_val & (0x07FF);
+
+          h += (read_word1) >> (32 - first_offset);
+          sign_ret_val = *h;
+        }
+        bit_pos += ((sign_ret_val & 0x7fff) >> 11);
+        value = sign_ret_val & (0x07FF);
+
+        if (sign) {
+          WORD32 temp_word;
+          temp_word = read_word << bit_pos;
+
+          *qp++ = ixheaacd_res_extract_signed_symbol(value, 24, 30, pow_table_q17, &temp_word,
+                                                     &bit_pos);
+          *qp++ = ixheaacd_res_extract_signed_symbol(value, 26, 30, pow_table_q17, &temp_word,
+                                                     &bit_pos);
+          *qp++ = ixheaacd_res_extract_signed_symbol(value, 28, 30, pow_table_q17, &temp_word,
+                                                     &bit_pos);
+          *qp++ = ixheaacd_res_extract_signed_symbol(value, 30, 30, pow_table_q17, &temp_word,
+                                                     &bit_pos);
+        } else {
+          *qp++ = ixheaacd_res_extract_symbol(value, 24, 30, pow_table_q17);
+          *qp++ = ixheaacd_res_extract_symbol(value, 26, 30, pow_table_q17);
+          *qp++ = ixheaacd_res_extract_symbol(value, 28, 30, pow_table_q17);
+          *qp++ = ixheaacd_res_extract_symbol(value, 30, 30, pow_table_q17);
+        }
+
+        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                    it_bit_buf->ptr_bit_buf_end);
+        idx -= 4;
+      } while (idx != 0);
+
+      qp += (maximum_bins_short - offsets[1]);
+      grp_idx--;
+    } while (grp_idx != 0);
+    offsets++;
+    qp = qp_org;
+    no_bands--;
+  } while (no_bands >= 0);
+
+  it_bit_buf->ptr_read_next = ptr_read_next - 4;
+  it_bit_buf->bit_pos = bit_pos;
+
+  return 0;
+}
+
+static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word2_4_lb(
+    ia_bit_buf_struct *it_bit_buf, WORD32 len, const UWORD16 *h_ori, WORD32 *x_invquant,
+    WORD32 *pow_table_q17, WORD8 *p_pul_arr, WORD32 sign) {
+  WORD32 value;
+  WORD idx;
+
+  UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
+  WORD32 bit_pos = it_bit_buf->bit_pos;
+  WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
+  ptr_read_next += 4;
+
+  for (idx = len; idx != 0; idx -= 4) {
+    WORD32 res;
+    WORD32 ampres, ampres1;
+    WORD32 ampres2, ampres3;
+    UWORD16 first_offset;
+    WORD16 sign_ret_val;
+    UWORD32 read_word1;
+    UWORD16 *h;
+
+    read_word1 = read_word << bit_pos;
+
+    h = (UWORD16 *)h_ori;
+    h += (read_word1) >> (27);
+    sign_ret_val = *h;
+
+    first_offset = 5;
+    while (sign_ret_val > 0) {
+      bit_pos += first_offset;
+      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                  it_bit_buf->ptr_bit_buf_end);
+      read_word1 = (read_word1) << (first_offset);
+
+      first_offset = (sign_ret_val >> 11);
+      h += sign_ret_val & (0x07FF);
+
+      h += (read_word1) >> (32 - first_offset);
+      sign_ret_val = *h;
+    }
+    bit_pos += ((sign_ret_val & 0x7fff) >> 11);
+
+    value = sign_ret_val & (0x07FF);
+
+    if (sign) {
+      WORD32 out0, out1, out2, out3;
+      WORD32 ampout0, ampout1, ampout2, ampout3;
+      WORD32 temp_word;
+      temp_word = read_word << bit_pos;
+
+      out0 = (ixheaacd_extu(value, 24, 30));
+      ampout0 = add_d(out0, *p_pul_arr++);
+      ampout0 = pow_table_q17[ampout0];
+
+      if (out0) {
+        if (temp_word & 0x80000000) {
+          ampout0 = -ampout0;
+        }
+        temp_word = temp_word << 1;
+        bit_pos++;
+      } else {
+        ampout0 = -ampout0;
+      }
+
+      out1 = (ixheaacd_extu(value, 26, 30));
+      ampout1 = add_d(out1, *p_pul_arr++);
+      ampout1 = pow_table_q17[ampout1];
+      if (out1) {
+        if (temp_word & 0x80000000) {
+          ampout1 = -(ampout1);
+        }
+        temp_word = temp_word << 1;
+        bit_pos++;
+      } else {
+        ampout1 = -ampout1;
+      }
+      out2 = (ixheaacd_extu(value, 28, 30));
+      ampout2 = add_d(out2, *p_pul_arr++);
+      ampout2 = pow_table_q17[ampout2];
+      if (out2) {
+        if (temp_word & 0x80000000) {
+          ampout2 = -(ampout2);
+        }
+        temp_word = temp_word << 1;
+        bit_pos++;
+      } else {
+        ampout2 = -ampout2;
+      }
+
+      *x_invquant++ = ampout0;
+      *x_invquant++ = ampout1;
+      *x_invquant++ = ampout2;
+
+      out3 = (ixheaacd_extu(value, 30, 30));
+      ampout3 = add_d(out3, *p_pul_arr++);
+      ampout3 = pow_table_q17[ampout3];
+      if (out3) {
+        if (temp_word & 0x80000000) {
+          ampout3 = -(ampout3);
+        }
+        temp_word = temp_word << 1;
+        bit_pos++;
+      } else {
+        ampout3 = -ampout3;
+      }
+
+      *x_invquant++ = ampout3;
+    } else {
+      ampres = *p_pul_arr++;
+      res = (ixheaacd_res_exts(value, 24, 30));
+      if (res > 0) {
+        ampres = add_d(res, ampres);
+        ampres = pow_table_q17[ampres];
+      } else {
+        ampres = sub_d(ampres, res);
+        ampres = pow_table_q17[ampres];
+        ampres = -ampres;
+      }
+      res = (ixheaacd_res_exts(value, 26, 30));
+      ampres1 = *p_pul_arr++;
+      if (res > 0) {
+        ampres1 = add_d(res, ampres1);
+        ampres1 = pow_table_q17[ampres1];
+      } else {
+        ampres1 = sub_d(ampres1, res);
+        ampres1 = pow_table_q17[ampres1];
+        ampres1 = -ampres1;
+      }
+      res = (ixheaacd_res_exts(value, 28, 30));
+      ampres2 = *p_pul_arr++;
+      if (res > 0) {
+        ampres2 = add_d(res, ampres2);
+        ampres2 = pow_table_q17[ampres2];
+      } else {
+        ampres2 = sub_d(ampres2, res);
+        ampres2 = pow_table_q17[ampres2];
+        ampres2 = -ampres2;
+      }
+      res = (ixheaacd_res_exts(value, 30, 30));
+      ampres3 = *p_pul_arr++;
+      if (res > 0) {
+        ampres3 = add_d(res, ampres3);
+        ampres3 = pow_table_q17[ampres3];
+      } else {
+        ampres3 = sub_d(ampres3, res);
+        ampres3 = pow_table_q17[ampres3];
+        ampres3 = -ampres3;
+      }
+      *x_invquant++ = ampres;
+      *x_invquant++ = ampres1;
+      *x_invquant++ = ampres2;
+      *x_invquant++ = ampres3;
+    }
+    ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                it_bit_buf->ptr_bit_buf_end);
+  }
+
+  it_bit_buf->ptr_read_next = ptr_read_next - 4;
+  it_bit_buf->bit_pos = bit_pos;
+
+  return 0;
+}
+
+static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word2_2(
+    ia_bit_buf_struct *it_bif_buf, WORD32 *qp, WORD16 *offsets, WORD no_bands, WORD group_no,
+    const UWORD16 *h_ori, WORD32 *pow_table_q17, WORD32 sign, WORD32 maximum_bins_short)
+
+{
+  WORD32 value;
+  WORD idx, grp_idx;
+  WORD len_idx;
+
+  WORD32 *qp_org = qp;
+
+  UWORD8 *ptr_read_next = it_bif_buf->ptr_read_next;
+  WORD32 bit_pos = it_bif_buf->bit_pos;
+  WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
+  ptr_read_next += 4;
+
+  do {
+    len_idx = offsets[1] - offsets[0];
+    grp_idx = group_no;
+    do {
+      qp += offsets[0];
+      idx = len_idx;
+      do {
+        UWORD16 first_offset;
+        WORD16 sign_ret_val;
+        UWORD32 read_word1;
+        UWORD16 *h;
+
+        read_word1 = read_word << bit_pos;
+
+        h = (UWORD16 *)h_ori;
+        h += (read_word1) >> (27);
+        sign_ret_val = *h;
+
+        first_offset = 5;
+        while (sign_ret_val > 0) {
+          bit_pos += first_offset;
+          ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                      it_bif_buf->ptr_bit_buf_end);
+          read_word1 = (read_word1) << (first_offset);
+
+          first_offset = (sign_ret_val >> 11);
+          h += sign_ret_val & (0x07FF);
+
+          h += (read_word1) >> (32 - first_offset);
+          sign_ret_val = *h;
+        }
+        bit_pos += ((sign_ret_val & 0x7fff) >> 11);
+        value = sign_ret_val & (0x07FF);
+
+        if (sign) {
+          WORD32 temp_word;
+          temp_word = read_word << bit_pos;
+
+          *qp++ = ixheaacd_res_extract_signed_symbol(value, 24, 28, pow_table_q17, &temp_word,
+                                                     &bit_pos);
+          *qp++ = ixheaacd_res_extract_signed_symbol(value, 28, 28, pow_table_q17, &temp_word,
+                                                     &bit_pos);
+        } else {
+          *qp++ = ixheaacd_res_extract_symbol(value, 24, 28, pow_table_q17);
+          *qp++ = ixheaacd_res_extract_symbol(value, 28, 28, pow_table_q17);
+        }
+
+        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                    it_bif_buf->ptr_bit_buf_end);
+        idx -= 2;
+      } while (idx != 0);
+
+      qp += (maximum_bins_short - offsets[1]);
+      grp_idx--;
+    } while (grp_idx != 0);
+
+    offsets++;
+    qp = qp_org;
+    no_bands--;
+  } while (no_bands >= 0);
+
+  it_bif_buf->ptr_read_next = ptr_read_next - 4;
+  it_bif_buf->bit_pos = bit_pos;
+
+  return 0;
+}
+
+static PLATFORM_INLINE WORD ixheaacd_res_c_block_decode_huff_word2_2_lb(
+    ia_bit_buf_struct *it_bit_buf, WORD32 len, const UWORD16 *h_ori, WORD32 *x_invquant,
+    WORD32 *pow_table_q17, WORD8 *p_pul_arr, WORD32 sign) {
+  WORD32 value, res, ampres;
+  WORD idx;
+
+  UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
+  WORD32 bit_pos = it_bit_buf->bit_pos;
+  WORD32 read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
+  ptr_read_next += 4;
+
+  for (idx = len; idx != 0; idx -= 2) {
+    {
+      UWORD16 first_offset;
+      WORD16 sign_ret_val;
+      UWORD32 read_word1;
+      UWORD16 *h;
+
+      read_word1 = read_word << bit_pos;
+
+      h = (UWORD16 *)h_ori;
+      h += (read_word1) >> (27);
+      sign_ret_val = *h;
+
+      first_offset = 5;
+      while (sign_ret_val > 0) {
+        bit_pos += first_offset;
+        ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                    it_bit_buf->ptr_bit_buf_end);
+        read_word1 = (read_word1) << (first_offset);
+
+        first_offset = (sign_ret_val >> 11);
+        h += sign_ret_val & (0x07FF);
+
+        h += (read_word1) >> (32 - first_offset);
+        sign_ret_val = *h;
+      }
+      bit_pos += ((sign_ret_val & 0x7fff) >> 11);
+
+      value = sign_ret_val & (0x07FF);
+    }
+
+    if (sign) {
+      WORD32 out0, out1, temp_word;
+      WORD32 ampout0, ampout1;
+
+      ampout0 = *p_pul_arr++;
+      ampout1 = *p_pul_arr++;
+
+      out0 = value & 0xf0;
+
+      ampout0 = add_d(ampout0, (UWORD32)out0 >> 4);
+      ampout0 = pow_table_q17[ampout0];
+
+      out1 = value & 0xf;
+      ampout1 = add_d(out1, ampout1);
+      ampout1 = pow_table_q17[ampout1];
+
+      temp_word = read_word << bit_pos;
+      if (out0) {
+        if (temp_word & 0x80000000) {
+          ampout0 = -(ampout0);
+        }
+        bit_pos++;
+        temp_word = temp_word << 1;
+      } else {
+        ampout0 = -(ampout0);
+      }
+      if (out1) {
+        if (temp_word & 0x80000000) {
+          ampout1 = -(ampout1);
+        }
+        bit_pos++;
+      } else {
+        ampout1 = -(ampout1);
+      }
+      ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                  it_bit_buf->ptr_bit_buf_end);
+      *x_invquant++ = ampout0;
+      *x_invquant++ = ampout1;
+    } else {
+      res = ((value << 24) >> 28);
+      ampres = *p_pul_arr++;
+      if (res > 0) {
+        ampres = add_d(res, ampres);
+        *x_invquant++ = pow_table_q17[ampres];
+      } else {
+        ampres = sub_d(ampres, res);
+        ampres = pow_table_q17[ampres];
+        *x_invquant++ = -ampres;
+      }
+
+      res = ((value << 28) >> 28);
+      value = *p_pul_arr++;
+      if (res > 0) {
+        ampres = add_d(res, value);
+        *x_invquant++ = pow_table_q17[ampres];
+      } else {
+        ampres = sub_d(value, res);
+        ampres = pow_table_q17[ampres];
+        *x_invquant++ = -ampres;
+      }
+    }
+    ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                it_bit_buf->ptr_bit_buf_end);
+  }
+  it_bit_buf->ptr_read_next = ptr_read_next - 4;
+  it_bit_buf->bit_pos = bit_pos;
+
+  return 0;
+}
+
+WORD ixheaacd_res_c_block_decode_huff_word_all(
+    ia_bit_buf_struct *it_bit_buf, WORD32 code_no, WORD32 *quantized_coef, WORD16 *band_offsets,
+    WORD start, WORD band, WORD group_no, ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr,
+    WORD32 maximum_bins_short) {
+  WORD ret_val = 0;
+  WORD start_bit_pos = it_bit_buf->bit_pos;
+  UWORD8 *start_read_pos = it_bit_buf->ptr_read_next;
+  const UWORD16 *h_ori = (UWORD16 *)(aac_tables_ptr->code_book[code_no]);
+  WORD32 *pow_table = (WORD32 *)aac_tables_ptr->res_block_tables_ptr->pow_table_q17;
+  WORD32 no_bands = band - start - 1;
+  WORD16 *p_band_off = band_offsets + start;
+
+  if (code_no == 11) {
+    const UWORD16 *h_ori = aac_tables_ptr->res_huffmann_tables_ptr->huffman_codebook_11;
+    ret_val =
+        ixheaacd_res_c_block_decode_huff_word1(it_bit_buf, quantized_coef, p_band_off, no_bands,
+                                               group_no, h_ori, pow_table, maximum_bins_short);
+  } else if (code_no <= 4) {
+    WORD32 sign = 0;
+
+    if (code_no > 2) sign = 1;
+    ret_val = ixheaacd_res_c_block_decode_huff_word2_4(it_bit_buf, quantized_coef, p_band_off,
+                                                       no_bands, group_no, h_ori, pow_table, sign,
+                                                       maximum_bins_short);
+  }
+
+  else if (code_no <= 10) {
+    WORD32 sign = 0;
+
+    if (code_no > 6) sign = 1;
+    ret_val = ixheaacd_res_c_block_decode_huff_word2_2(it_bit_buf, quantized_coef, p_band_off,
+                                                       no_bands, group_no, h_ori, pow_table, sign,
+                                                       maximum_bins_short);
+  }
+  {
+    WORD bits_cons;
+    bits_cons = (WORD)(((it_bit_buf->ptr_read_next - start_read_pos) << 3) +
+                       (it_bit_buf->bit_pos - start_bit_pos));
+    it_bit_buf->cnt_bits -= bits_cons;
+  }
+  return ret_val;
+}
+
+WORD ixheaacd_res_c_block_decode_huff_word_all_lb(
+    ia_bit_buf_struct *it_bit_buf, WORD32 code_no, WORD32 len,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr, WORD32 *x_invquant, WORD8 *p_pul_arr) {
+  WORD ret_val = 0;
+  WORD start_bit_pos = it_bit_buf->bit_pos;
+  WORD32 *pow_table = (WORD32 *)aac_tables_ptr->res_block_tables_ptr->pow_table_q17;
+  UWORD8 *start_read_pos = it_bit_buf->ptr_read_next;
+
+  const UWORD16 *h_ori = (UWORD16 *)(aac_tables_ptr->code_book[code_no]);
+
+  if (code_no == 11) {
+    const UWORD16 *h_ori = aac_tables_ptr->res_huffmann_tables_ptr->huffman_codebook_11;
+    ret_val = ixheaacd_res_c_block_decode_huff_word1_lb(it_bit_buf, len, h_ori, x_invquant,
+                                                        pow_table, p_pul_arr);
+  } else if (code_no <= 4) {
+    WORD32 sign = 0;
+    if (code_no > 2) sign = 1;
+    ret_val = ixheaacd_res_c_block_decode_huff_word2_4_lb(it_bit_buf, len, h_ori, x_invquant,
+                                                          pow_table, p_pul_arr, sign);
+  } else if (code_no <= 10) {
+    WORD32 sign = 0;
+    if (code_no > 6) sign = 1;
+    ret_val = ixheaacd_res_c_block_decode_huff_word2_2_lb(it_bit_buf, len, h_ori, x_invquant,
+                                                          pow_table, p_pul_arr, sign);
+  }
+
+  {
+    WORD bits_cons;
+    if (it_bit_buf->bit_pos <= 7) {
+      bits_cons = (WORD)(((it_bit_buf->ptr_read_next - start_read_pos) << 3) +
+                         (it_bit_buf->bit_pos - start_bit_pos));
+      it_bit_buf->cnt_bits -= bits_cons;
+    } else {
+      it_bit_buf->ptr_read_next += (it_bit_buf->bit_pos) >> 3;
+      it_bit_buf->bit_pos = it_bit_buf->bit_pos & 0x7;
+
+      bits_cons = (WORD)(((it_bit_buf->ptr_read_next - start_read_pos) << 3) +
+                         ((it_bit_buf->bit_pos - start_bit_pos)));
+      it_bit_buf->cnt_bits -= bits_cons;
+    }
+  }
+  return ret_val;
+}
+
+static VOID ixheaacd_res_apply_one_scf(WORD32 scale_factor, WORD32 *x_invquant, WORD32 end,
+                                       WORD32 *scale_table_ptr) {
+  WORD32 j;
+
+  WORD32 temp_1;
+  WORD32 q_factor;
+  WORD32 buffer1;
+  WORD16 scale_short;
+
+  if (scale_factor < 24) {
+    for (j = end; j > 0; j--) {
+      *x_invquant++ = 0;
+    }
+  } else {
+    WORD32 shift;
+    q_factor = 37 - (scale_factor >> 2);
+
+    scale_short = scale_table_ptr[(scale_factor & 0x0003)];
+
+    shift = q_factor;
+
+    if (shift > 0) {
+      if (scale_short == (WORD16)0x8000) {
+        for (j = end; j > 0; j--) {
+          temp_1 = *x_invquant;
+
+          buffer1 = ixheaacd_mult32x16in32_shl_sat(temp_1, scale_short);
+          buffer1 = ixheaacd_shr32(buffer1, shift);
+          *x_invquant++ = buffer1;
+        }
+      } else {
+        for (j = end; j > 0; j--) {
+          temp_1 = *x_invquant;
+
+          buffer1 = ixheaacd_mult32x16in32_shl(temp_1, scale_short);
+
+          buffer1 = ixheaacd_shr32(buffer1, shift);
+          *x_invquant++ = buffer1;
+        }
+      }
+    } else {
+      shift = -shift;
+      if (shift > 0) {
+        if (scale_short == (WORD16)0x8000) {
+          for (j = end; j > 0; j--) {
+            temp_1 = *x_invquant;
+            temp_1 = ixheaacd_shl32(temp_1, shift - 1);
+
+            buffer1 = ixheaacd_mult32x16in32_shl_sat(temp_1, scale_short);
+
+            buffer1 = ixheaacd_shl32(buffer1, 1);
+            *x_invquant++ = buffer1;
+          }
+        } else {
+          for (j = end; j > 0; j--) {
+            temp_1 = *x_invquant;
+            temp_1 = ixheaacd_shl32(temp_1, shift - 1);
+
+            buffer1 = ixheaacd_mult32x16in32_shl(temp_1, scale_short);
+
+            buffer1 = ixheaacd_shl32(buffer1, 1);
+            *x_invquant++ = buffer1;
+          }
+        }
+      } else {
+        if (scale_short == (WORD16)0x8000) {
+          for (j = end; j > 0; j--) {
+            temp_1 = *x_invquant;
+
+            buffer1 = ixheaacd_mult32x16in32_shl_sat(temp_1, scale_short);
+
+            *x_invquant++ = buffer1;
+          }
+        } else {
+          for (j = end; j > 0; j--) {
+            temp_1 = *x_invquant;
+
+            buffer1 = ixheaacd_mult32x16in32_shl(temp_1, scale_short);
+
+            *x_invquant++ = buffer1;
+          }
+        }
+      }
+    }
+  }
+}
+
+VOID ixheaacd_res_apply_scfs(WORD32 *x_invquant, WORD16 *sc_factor, WORD t_bands, WORD8 *offset,
+                             WORD32 *scale_table_ptr) {
+  WORD32 i;
+  WORD16 scale_factor;
+
+  for (i = t_bands - 1; i >= 0; i--) {
+    scale_factor = *sc_factor++;
+    ixheaacd_res_apply_one_scf(scale_factor, x_invquant, *offset, scale_table_ptr);
+    x_invquant += *offset;
+    offset++;
+  }
+}
diff --git a/decoder/ixheaacd_mps_res_block.h b/decoder/ixheaacd_mps_res_block.h
new file mode 100644
index 0000000..f3b56b5
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_block.h
@@ -0,0 +1,56 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RES_BLOCK_H
+#define IXHEAACD_MPS_RES_BLOCK_H
+
+#define IQ_TABLE_SIZE_HALF 128
+
+VOID ixheaacd_res_inverse_quant_lb(WORD32 *x_invquant, WORD t_bands, WORD32 *pow_table_q17,
+                                   WORD8 *pulse_data);
+
+VOID ixheaacd_res_apply_scfs(WORD32 *x_invquant, WORD16 *sc_factor, WORD t_bands, WORD8 *offset,
+                             WORD32 *scale_tables_ptr);
+
+WORD ixheaacd_res_c_block_decode_huff_word_all(
+    ia_bit_buf_struct *it_bit_buf, WORD32 code_no, WORD32 *qp, WORD16 *offsets, WORD start_band,
+    WORD endBand, WORD group_no, ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr,
+    WORD32 maximum_bins_short);
+
+WORD ixheaacd_res_c_block_decode_huff_word_all_lb(
+    ia_bit_buf_struct *it_bit_buf, WORD32 code_no, WORD32 len,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr, WORD32 *x_invquant, WORD8 *p_pul_arr);
+
+VOID ixheaacd_res_c_block_read_scf_data(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info, WORD16 global_gain,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr);
+
+WORD16 ixheaacd_res_c_block_read_spec_data(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr);
+
+WORD16 ixheaacd_c_block_read_section_data(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info);
+
+WORD32 ixheaacd_res_inv_quant(WORD32 *x_quant, WORD32 *pow_table_q17);
+
+#endif /* IXHEAACD_MPS_RES_BLOCK_H */
diff --git a/decoder/ixheaacd_mps_res_channel.c b/decoder/ixheaacd_mps_res_channel.c
new file mode 100644
index 0000000..a4c1c2f
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_channel.c
@@ -0,0 +1,393 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_basic_ops.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_res_pulsedata.h"
+#include "ixheaacd_mps_res_channelinfo.h"
+#include "ixheaacd_mps_res_block.h"
+#include "ixheaacd_defines.h"
+#include "ixheaacd_mps_res_channel.h"
+#include "ixheaacd_basic_op.h"
+#include "ixheaacd_mps_res_tns.h"
+#include "ixheaacd_mps_res.h"
+#include "ixheaacd_mps_res_huffman.h"
+
+UWORD32 ixheaacd_res_aac_showbits_32(UWORD8 *p_read_next) {
+  UWORD8 *v = p_read_next;
+  UWORD32 b = 0;
+
+  _SWAP(v, b);
+  return b;
+}
+
+static WORD16 ixheaacd_res_c_block_read(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info, WORD16 global_gain,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr)
+
+{
+  FLAG gain_control_data_present;
+  WORD16 error_status = AAC_DEC_OK;
+
+  if (p_aac_decoder_channel_info->ics_info.window_sequence == EIGHT_SHORT_SEQUENCE) {
+    memset(p_aac_decoder_channel_info->p_scale_factor, 0, MAX_WINDOWS * MAX_SFB_SHORT * 3);
+  }
+
+  error_status = ixheaacd_c_block_read_section_data(it_bit_buf, p_aac_decoder_channel_info);
+
+  if (error_status) return error_status;
+
+  ixheaacd_res_c_block_read_scf_data(it_bit_buf, p_aac_decoder_channel_info, global_gain,
+                                     aac_tables_ptr);
+
+  error_status = ixheaacd_res_c_pulse_data_read(
+      it_bit_buf, &p_aac_decoder_channel_info->pulse_data, aac_tables_ptr);
+  if (error_status) return error_status;
+
+  p_aac_decoder_channel_info->tns_data.tns_data_present =
+      (FLAG)ixheaacd_read_bits_buf(it_bit_buf, 1);
+
+  error_status = ixheaacd_res_c_tns_read(it_bit_buf, p_aac_decoder_channel_info);
+  if (error_status) {
+    return error_status;
+  }
+
+  gain_control_data_present = ixheaacd_read_bits_buf(it_bit_buf, 1);
+
+  if (gain_control_data_present) {
+    return (WORD16)((WORD32)AAC_DEC_UNIMPLEMENTED_GAIN_CONTROL_DATA);
+  }
+
+  {
+    it_bit_buf->bit_pos = (7 - it_bit_buf->bit_pos);
+
+    error_status = ixheaacd_res_c_block_read_spec_data(it_bit_buf, p_aac_decoder_channel_info,
+                                                       aac_tables_ptr);
+
+    it_bit_buf->bit_pos = (7 - it_bit_buf->bit_pos);
+  }
+
+  return error_status;
+}
+
+WORD16 ixheaacd_res_read_ics(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info[CHANNELS], WORD32 num_ch,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr, WORD8 tot_sf_bands_ls[2]) {
+  WORD16 error_status = AAC_DEC_OK;
+  WORD32 ch;
+
+  for (ch = 0; ch < num_ch; ch++) {
+    ia_mps_dec_residual_channel_info_struct *p_aac_dec_ch_info = p_aac_decoder_channel_info[ch];
+    ia_mps_dec_residual_ics_info_struct *p_ics_info = &p_aac_dec_ch_info->ics_info;
+
+    p_aac_dec_ch_info->global_gain = (WORD16)ixheaacd_read_bits_buf(it_bit_buf, 8);
+
+    if (!p_aac_decoder_channel_info[LEFT]->common_window) {
+      error_status = ixheaacd_res_ics_read(it_bit_buf, p_ics_info, tot_sf_bands_ls);
+      if (error_status) {
+        if (it_bit_buf->cnt_bits < 0)
+          error_status = (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+        return error_status;
+      }
+    }
+
+    error_status = ixheaacd_res_c_block_read(it_bit_buf, p_aac_dec_ch_info,
+                                             p_aac_dec_ch_info->global_gain, aac_tables_ptr);
+    if (error_status) {
+      if (it_bit_buf->cnt_bits < 0)
+        error_status = (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+
+      return error_status;
+    }
+  }
+
+  return error_status;
+}
+
+VOID ixheaacd_res_c_pulse_data_apply(ia_mps_dec_residual_pulse_data_struct *pulse_data,
+                                     WORD8 *p_pulse_arr,
+                                     const WORD16 *p_scale_factor_band_offsets) {
+  WORD i, number_pulse;
+  WORD32 k;
+
+  memset(p_pulse_arr, 0, sizeof(WORD32) * 256);
+
+  if (pulse_data->pulse_data_present) {
+    k = p_scale_factor_band_offsets[pulse_data->pulse_start_band];
+    number_pulse = pulse_data->number_pulse;
+
+    for (i = 0; i <= number_pulse; i++) {
+      k = add_d(k, pulse_data->pulse_offset[i]);
+      p_pulse_arr[k] = pulse_data->pulse_amp[i];
+    }
+  }
+}
+
+WORD16 ixheaacd_res_c_block_read_spec_data(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr) {
+  WORD band, tot_bands, tot_groups = 0;
+  WORD group, groupwin, groupoffset;
+
+  WORD index;
+  WORD8 *p_code_book, *p_codebook_tmp;
+  WORD16 *p_scale_factor;
+  WORD32 *p_spectral_coefficient;
+  ia_mps_dec_residual_ics_info_struct *p_ics_info = &p_aac_decoder_channel_info->ics_info;
+  WORD16 *band_offsets;
+  WORD32 maximum_bins_short = ixheaacd_shr16_dir_sat(p_ics_info->frame_length, 3);
+
+  WORD32 *p_spec_coeff_out;
+
+  p_code_book = p_aac_decoder_channel_info->p_code_book;
+  p_scale_factor = p_aac_decoder_channel_info->p_scale_factor;
+  p_spectral_coefficient = p_aac_decoder_channel_info->p_spectral_coefficient;
+  tot_groups = p_ics_info->window_groups;
+  tot_bands = p_ics_info->max_sf_bands;
+  band_offsets = (WORD16 *)ixheaacd_res_get_sfb_offsets(p_ics_info, aac_tables_ptr);
+
+  if (p_aac_decoder_channel_info->ics_info.window_sequence != EIGHT_SHORT_SEQUENCE) {
+    WORD8 *p_pul_arr = (WORD8 *)p_aac_decoder_channel_info->p_tns_scratch;
+    ixheaacd_res_c_pulse_data_apply(&p_aac_decoder_channel_info->pulse_data, p_pul_arr,
+                                    band_offsets);
+
+    p_spec_coeff_out = &p_spectral_coefficient[0];
+    for (band = 0; band < tot_bands;) {
+      WORD ret_val;
+      WORD32 len;
+      WORD32 code_no = p_code_book[band];
+      WORD start = band;
+
+      for (; band < tot_bands && (p_code_book[band] == code_no); band++)
+        ;
+
+      len = band_offsets[band] - band_offsets[start];
+
+      if (code_no > ZERO_HCB && (code_no < NOISE_HCB)) {
+        ret_val = ixheaacd_res_c_block_decode_huff_word_all_lb(
+            it_bit_buf, code_no, len, aac_tables_ptr, p_spec_coeff_out, p_pul_arr);
+
+        if (ret_val != 0)
+          return (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL);
+      } else {
+        if (p_aac_decoder_channel_info->pulse_data.pulse_data_present)
+          ixheaacd_res_inverse_quant_lb(
+              p_spec_coeff_out, len,
+              (WORD32 *)aac_tables_ptr->res_block_tables_ptr->pow_table_q17, p_pul_arr);
+        else
+          memset(p_spec_coeff_out, 0, sizeof(WORD32) * len);
+      }
+      p_pul_arr += len;
+      p_spec_coeff_out += len;
+    }
+
+    index = 1024 - band_offsets[tot_bands];
+    memset(p_spec_coeff_out, 0, sizeof(WORD32) * index);
+  } else {
+    memset(p_spectral_coefficient, 0, sizeof(WORD32) * 1024);
+
+    groupoffset = 0;
+
+    for (group = 0; group < tot_groups; group++) {
+      WORD grp_win = p_ics_info->window_group_length[group];
+      p_codebook_tmp = &p_code_book[group * MAX_SFB_SHORT];
+      p_spec_coeff_out = &p_spectral_coefficient[groupoffset * maximum_bins_short];
+
+      for (band = 0; band < tot_bands;) {
+        WORD code_no = *p_codebook_tmp;
+        WORD start = band;
+        WORD ret_val;
+
+        for (; band < tot_bands && (*p_codebook_tmp == code_no); band++, p_codebook_tmp++)
+          ;
+
+        if (code_no > ZERO_HCB && (code_no < NOISE_HCB)) {
+          ret_val = ixheaacd_res_c_block_decode_huff_word_all(
+              it_bit_buf, code_no, p_spec_coeff_out, (WORD16 *)band_offsets, start, band, grp_win,
+              aac_tables_ptr, maximum_bins_short);
+
+          if (ret_val != 0)
+            return (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL);
+        }
+      }
+      groupoffset = (groupoffset + grp_win);
+    }
+  }
+
+  {
+    WORD8 *p_win_grp_len = &p_ics_info->window_group_length[0];
+    WORD8 *psfb_width = (WORD8 *)ixheaacd_res_get_sfb_width(p_ics_info, aac_tables_ptr);
+    WORD32 *scale_table_ptr;
+    if (120 == maximum_bins_short) {
+      scale_table_ptr = aac_tables_ptr->res_block_tables_ptr->scale_table_960;
+    } else {
+      scale_table_ptr = aac_tables_ptr->res_block_tables_ptr->scale_table;
+    }
+    do {
+      groupwin = *p_win_grp_len++;
+      do {
+        ixheaacd_res_apply_scfs(&p_spectral_coefficient[0], &p_scale_factor[0], tot_bands,
+                                (WORD8 *)psfb_width, scale_table_ptr);
+
+        p_spectral_coefficient += maximum_bins_short;
+        groupwin--;
+      } while (groupwin != 0);
+
+      p_scale_factor += MAX_SFB_SHORT;
+      tot_groups--;
+    } while (tot_groups != 0);
+  }
+
+  return AAC_DEC_OK;
+}
+
+WORD16
+ixheaacd_res_c_tns_read(ia_bit_buf_struct *it_bit_buf,
+                        ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info) {
+  WORD window, window_per_frame;
+  WORD n_filt_bits, len_bits, order_bits;
+  WORD32 next_stop_band_tmp;
+
+  ia_mps_dec_residual_ics_info_struct *p_ics_info = &p_aac_decoder_channel_info->ics_info;
+  ia_mps_dec_residual_tns_data *p_tns_data = &p_aac_decoder_channel_info->tns_data;
+
+  if (!p_tns_data->tns_data_present) return AAC_DEC_OK;
+
+  if (p_ics_info->window_sequence != EIGHT_SHORT_SEQUENCE) {
+    n_filt_bits = 2;
+    len_bits = 6;
+    order_bits = 5;
+    window_per_frame = 1;
+  } else {
+    n_filt_bits = 1;
+    len_bits = 4;
+    order_bits = 3;
+    window_per_frame = 8;
+  }
+
+  next_stop_band_tmp = p_ics_info->total_sf_bands;
+
+  for (window = 0; window < window_per_frame; window++) {
+    WORD n_filt;
+    WORD length, coef_res;
+    p_tns_data->number_of_filters[window] = n_filt =
+        (WORD16)ixheaacd_read_bits_buf(it_bit_buf, n_filt_bits);
+
+    if (n_filt) {
+      WORD32 accu;
+      WORD index;
+      WORD nextstopband;
+
+      coef_res = ixheaacd_read_bits_buf(it_bit_buf, 1);
+
+      nextstopband = next_stop_band_tmp;
+      for (index = 0; index < n_filt; index++) {
+        WORD order;
+        ia_mps_dec_residual_filter_struct *filter = &p_tns_data->filter[window][index];
+        length = ixheaacd_read_bits_buf(it_bit_buf, len_bits);
+
+        filter->start_band = nextstopband - length;
+        filter->stop_band = nextstopband;
+
+        nextstopband = filter->start_band;
+
+        if (filter->start_band < 0) {
+          filter->order = -1;
+          return (WORD16)((WORD32)AAC_DEC_TNS_RANGE_ERROR);
+        }
+
+        filter->order = order = ixheaacd_read_bits_buf(it_bit_buf, order_bits);
+        accu = order - MAX_ORDER_LONG;
+
+        if (accu > 0) return (WORD16)((WORD32)AAC_DEC_TNS_ORDER_ERROR);
+
+        if (order) {
+          WORD i;
+          WORD32 coef, coef_compress;
+          WORD resolution, shift;
+
+          filter->direction = (WORD8)(ixheaacd_read_bits_buf(it_bit_buf, 1) ? -1 : 1);
+
+          coef_compress = ixheaacd_read_bits_buf(it_bit_buf, 1);
+
+          filter->resolution = coef_res;
+          resolution = coef_res + 3 - coef_compress;
+          shift = 32 - resolution;
+
+          for (i = 0; i < order; i++) {
+            coef = ixheaacd_read_bits_buf(it_bit_buf, resolution);
+            coef = coef << shift;
+            filter->coeff[i] = (WORD8)(coef >> shift);
+          }
+        }
+      }
+    }
+  }
+  return AAC_DEC_OK;
+}
+
+WORD32 ixheaacd_res_inv_quant(WORD32 *px_quant, WORD32 *pow_table_q17)
+
+{
+  WORD32 q1;
+  WORD32 temp;
+  WORD32 q_abs;
+  WORD16 interp;
+  WORD32 shift;
+
+  q_abs = *px_quant;
+
+  if (q_abs > (8191 + 32)) return IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_MAX_HUFFDEC_VAL;
+
+  if (q_abs < 1024)
+    shift = 3;
+  else
+    shift = 6;
+
+  q1 = (q_abs) >> shift;
+
+  interp = q_abs - (q1 << shift);
+
+  temp = pow_table_q17[q1 + 1] - pow_table_q17[q1];
+
+  temp = (WORD32)(temp * (WORD32)interp);
+
+  temp = temp + (pow_table_q17[q1] << shift);
+
+  if (shift == 3)
+    temp = temp << 1;
+  else
+    temp = temp << 2;
+
+  *px_quant = temp;
+
+  return 0;
+}
diff --git a/decoder/ixheaacd_mps_res_channel.h b/decoder/ixheaacd_mps_res_channel.h
new file mode 100644
index 0000000..d5adf2c
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_channel.h
@@ -0,0 +1,30 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RES_CHANNEL_H
+#define IXHEAACD_MPS_RES_CHANNEL_H
+
+#define LEFT 0
+
+WORD16 ixheaacd_res_read_ics(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info[CHANNELS], WORD32 num_ch,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr, WORD8 tot_sf_bands_ls[2]);
+
+#endif /* IXHEAACD_MPS_RES_CHANNEL_H */
diff --git a/decoder/ixheaacd_mps_res_channel_info.c b/decoder/ixheaacd_mps_res_channel_info.c
new file mode 100644
index 0000000..543ab03
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_channel_info.c
@@ -0,0 +1,97 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_basic_op.h"
+#include "ixheaacd_mps_res.h"
+
+const WORD16 *ixheaacd_res_get_sfb_offsets(
+    ia_mps_dec_residual_ics_info_struct *p_ics_info,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr) {
+  if (p_ics_info->window_sequence != EIGHT_SHORT_SEQUENCE) {
+    return aac_tables_ptr->sfb_index_long;
+  } else {
+    return aac_tables_ptr->sfb_index_short;
+  }
+}
+
+const WORD8 *ixheaacd_res_get_sfb_width(ia_mps_dec_residual_ics_info_struct *p_ics_info,
+                                        ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr) {
+  if (p_ics_info->window_sequence != EIGHT_SHORT_SEQUENCE) {
+    return aac_tables_ptr->sfb_index_long_width;
+  } else {
+    return aac_tables_ptr->sfb_index_short_width;
+  }
+}
+
+WORD16 ixheaacd_res_ics_read(ia_bit_buf_struct *it_bif_buf,
+                             ia_mps_dec_residual_ics_info_struct *p_ics_info,
+                             WORD8 tot_sf_bands_ls[2]) {
+  WORD i;
+  WORD mask;
+  WORD tmp = 0;
+
+  tmp = ixheaacd_read_bits_buf(it_bif_buf, 4);
+  p_ics_info->window_sequence = (WORD16)((tmp & 0x6) >> 1);
+
+  if (p_ics_info->window_sequence != EIGHT_SHORT_SEQUENCE) {
+    p_ics_info->total_sf_bands = tot_sf_bands_ls[0];
+
+    p_ics_info->window_groups = 1;
+    p_ics_info->window_group_length[0] = 1;
+
+    tmp = ixheaacd_read_bits_buf(it_bif_buf, 7);
+    p_ics_info->max_sf_bands = (tmp & 0x7E) >> 1;
+
+    if (tmp & 1) {
+      return (WORD16)((WORD32)AAC_DEC_PREDICTION_NOT_SUPPORTED_IN_LC_AAC);
+    }
+  } else {
+    WORD32 win_grp = 0, tmp2;
+    p_ics_info->total_sf_bands = tot_sf_bands_ls[1];
+
+    tmp = ixheaacd_read_bits_buf(it_bif_buf, 11);
+    p_ics_info->max_sf_bands = (tmp & 0x780) >> 7;
+
+    tmp2 = (tmp & 0x7F);
+
+    for (i = 0; i < 7; i++) {
+      mask = (1 << sub_d(6, i));
+      p_ics_info->window_group_length[i] = 1;
+      if (tmp2 & mask) {
+        p_ics_info->window_group_length[win_grp] =
+            add_d(p_ics_info->window_group_length[win_grp], 1);
+      } else {
+        win_grp = add_d(win_grp, 1);
+      }
+    }
+
+    p_ics_info->window_group_length[7] = 1;
+    p_ics_info->window_groups = add_d(win_grp, 1);
+  }
+
+  if (p_ics_info->max_sf_bands > p_ics_info->total_sf_bands)
+    return (WORD16)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED;
+
+  return AAC_DEC_OK;
+}
diff --git a/decoder/ixheaacd_mps_res_channelinfo.h b/decoder/ixheaacd_mps_res_channelinfo.h
new file mode 100644
index 0000000..c4fb24f
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_channelinfo.h
@@ -0,0 +1,33 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RES_CHANNELINFO_H
+#define IXHEAACD_MPS_RES_CHANNELINFO_H
+
+WORD16 ixheaacd_res_ics_read(ia_bit_buf_struct *it_bit_buf,
+                             ia_mps_dec_residual_ics_info_struct *p_ics_info,
+                             WORD8 tot_sf_bands_ls[2]);
+
+const WORD16 *ixheaacd_res_get_sfb_offsets(ia_mps_dec_residual_ics_info_struct *p_ics_info,
+                                           ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr);
+
+const WORD8 *ixheaacd_res_get_sfb_width(ia_mps_dec_residual_ics_info_struct *p_ics_info,
+                                        ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr);
+
+#endif /* IXHEAACD_MPS_RES_CHANNELINFO_H */
diff --git a/decoder/ixheaacd_mps_res_huffman.h b/decoder/ixheaacd_mps_res_huffman.h
new file mode 100644
index 0000000..b062a2c
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_huffman.h
@@ -0,0 +1,59 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RES_HUFFMAN_H
+#define IXHEAACD_MPS_RES_HUFFMAN_H
+
+#define _SWAP(a, b) \
+  (b = (((WORD32)a[0] << 24) | ((WORD32)a[1] << 16) | ((WORD32)a[2] << 8) | ((WORD32)a[3])))
+
+extern UWORD32 ixheaacd_res_aac_showbits_32(UWORD8 *p_read_next);
+
+static PLATFORM_INLINE WORD32 ixheaacd_res_exts(UWORD32 a, WORD32 shift_left,
+                                                WORD32 shift_right) {
+  WORD32 x;
+  x = (UWORD32)a << shift_left;
+  x = (WORD32)x >> shift_right;
+
+  return x;
+}
+
+static PLATFORM_INLINE UWORD32 ixheaacd_aac_read_2bytes(UWORD8 **p_read_next, WORD32 *r_bit_pos,
+                                                        WORD32 *readword) {
+  UWORD8 *v = *p_read_next;
+  WORD32 bits_consumed = *r_bit_pos;
+
+  if ((bits_consumed - 16) >= 0) {
+    *readword = (*readword << 8) | *v;
+    v++;
+    *readword = (*readword << 8) | *v;
+    v++;
+    bits_consumed -= 16;
+  } else if ((bits_consumed - 8) >= 0) {
+    *readword = (*readword << 8) | *v;
+    v++;
+    bits_consumed -= 8;
+  }
+
+  *r_bit_pos = bits_consumed;
+  *p_read_next = v;
+  return 1;
+}
+
+#endif /* IXHEAACD_MPS_RES_HUFFMAN_H */
diff --git a/decoder/ixheaacd_mps_res_longblock.c b/decoder/ixheaacd_mps_res_longblock.c
new file mode 100644
index 0000000..eb755f7
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_longblock.c
@@ -0,0 +1,233 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_res.h"
+#include "ixheaacd_mps_res_huffman.h"
+
+#define LONG_BLOCK_SECT_LEN 5
+#define SHORT_BLOCK_SECT_LEN 3
+
+WORD16 ixheaacd_c_block_read_section_data(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info) {
+  WORD band;
+  WORD sect_cb;
+  WORD sect_len;
+  WORD sect_len_incr;
+  WORD sect_esc_val;
+  ia_mps_dec_residual_ics_info_struct *p_ics_info = &p_aac_decoder_channel_info->ics_info;
+  WORD sfb_transmitted = p_ics_info->max_sf_bands;
+  WORD win_group = p_ics_info->window_groups;
+
+  WORD8 *p_code_book = p_aac_decoder_channel_info->p_code_book;
+  WORD8 *p_code_book_temp = p_code_book;
+  WORD32 sect_bitlen = LONG_BLOCK_SECT_LEN;
+
+  if (p_aac_decoder_channel_info->ics_info.window_sequence == EIGHT_SHORT_SEQUENCE)
+    sect_bitlen = SHORT_BLOCK_SECT_LEN;
+
+  sect_esc_val = (1 << sect_bitlen) - 1;
+
+  do {
+    band = 0;
+
+    while (band < sfb_transmitted) {
+      WORD32 temp_word;
+      sect_len = 0;
+      temp_word = ixheaacd_read_bits_buf(it_bit_buf, 4 + sect_bitlen);
+      sect_cb = temp_word >> sect_bitlen;
+      sect_len_incr = temp_word & sect_esc_val;
+
+      while (sect_len_incr == sect_esc_val) {
+        sect_len = (sect_len + sect_esc_val);
+        sect_len_incr = ixheaacd_read_bits_buf(it_bit_buf, sect_bitlen);
+      }
+
+      sect_len = (sect_len + sect_len_incr);
+
+      band = (band + sect_len);
+      if (band > sfb_transmitted) {
+        return (WORD16)((WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_EXCEEDS_SFB_TRANSMITTED);
+      }
+
+      if (sect_cb == BOOKSCL) {
+        return (WORD16)((WORD32)AAC_DEC_INVALID_CODE_BOOK);
+      }
+
+      sect_len = sect_len - 1;
+      for (; sect_len >= 0; sect_len--) {
+        *p_code_book_temp++ = sect_cb;
+      }
+    }
+    p_code_book += MAX_SFB_SHORT;
+    p_code_book_temp = p_code_book;
+    win_group--;
+  } while (win_group != 0);
+  return AAC_DEC_OK;
+}
+
+VOID ixheaacd_res_c_block_read_scf_data(
+    ia_bit_buf_struct *it_bit_buf,
+    ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info, WORD16 global_gain,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr) {
+  WORD band;
+  WORD16 position = 0;
+  WORD group;
+  WORD16 factor = global_gain;
+  WORD8 *p_code_book, *p_codebook_tmp;
+  WORD16 *p_scale_factor, *p_scale_factor_tmp;
+  WORD16 norm_value;
+  ia_mps_dec_residual_ics_info_struct *p_ics_info;
+  WORD window_groups, sfb_transmitted;
+  UWORD16 *h;
+
+  const UWORD16 *hscf = &aac_tables_ptr->res_huffmann_tables_ptr->huffman_code_book_scl[1];
+
+  WORD start_bit_pos = it_bit_buf->bit_pos;
+  UWORD8 *start_read_pos = it_bit_buf->ptr_read_next;
+  UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
+  WORD32 bit_pos = 7 - it_bit_buf->bit_pos;
+
+  WORD32 read_word;
+  WORD32 diffbytes;
+
+  diffbytes = (WORD32)(it_bit_buf->ptr_bit_buf_end - ptr_read_next);
+  diffbytes++;
+  if (diffbytes >= 4) {
+    read_word = ixheaacd_res_aac_showbits_32(ptr_read_next);
+    diffbytes = 4;
+    ptr_read_next = it_bit_buf->ptr_read_next + 4;
+  } else {
+    WORD32 ii;
+    read_word = 0;
+    for (ii = 0; ii < diffbytes; ii++) {
+      read_word = (read_word << 8) | (*ptr_read_next);
+      ptr_read_next++;
+    }
+    read_word <<= ((4 - diffbytes) << 3);
+  }
+  p_code_book = p_aac_decoder_channel_info->p_code_book;
+
+  p_ics_info = &p_aac_decoder_channel_info->ics_info;
+  sfb_transmitted = p_ics_info->max_sf_bands;
+
+  p_scale_factor = p_aac_decoder_channel_info->p_scale_factor;
+  window_groups = p_ics_info->window_groups;
+  band = sfb_transmitted - 1;
+
+  for (group = 0; group < window_groups; group++) {
+    p_codebook_tmp = &p_code_book[group * MAX_SFB_SHORT];
+    p_scale_factor_tmp = &p_scale_factor[group * MAX_SFB_SHORT];
+    for (band = sfb_transmitted - 1; band >= 0; band--) {
+      WORD32 cb_num = *p_codebook_tmp++;
+
+      if (cb_num == ZERO_HCB)
+        *p_scale_factor_tmp++ = 0;
+      else {
+        {
+          WORD32 flag = 1;
+          WORD pns_band;
+          ia_mps_dec_residual_pns_data_struct *p_pns_data = &p_aac_decoder_channel_info->pns_data;
+          if (cb_num == NOISE_HCB && (p_pns_data->pns_active != 1)) flag = 0;
+
+          if (flag) {
+            UWORD16 first_offset;
+            WORD16 sign_ret_val;
+            UWORD32 read_word1;
+
+            read_word1 = read_word << bit_pos;
+            h = (UWORD16 *)(hscf);
+            first_offset = 7;
+            h += (read_word1) >> (32 - first_offset);
+            sign_ret_val = *h;
+
+            while (sign_ret_val > 0) {
+              bit_pos += first_offset;
+
+              ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                          it_bit_buf->ptr_bit_buf_end);
+              read_word1 = (read_word1) << (first_offset);
+
+              first_offset = (sign_ret_val >> 11);
+              first_offset = (sign_ret_val >> 11);
+              h += sign_ret_val & (0x07FF);
+              h += (read_word1) >> (32 - first_offset);
+              sign_ret_val = *h;
+            }
+
+            bit_pos += ((sign_ret_val & 0x7fff) >> 11);
+
+            ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word,
+                                        it_bit_buf->ptr_bit_buf_end);
+            norm_value = (sign_ret_val & (0x07FF)) - 60;
+          } else {
+            WORD32 noise_start_value;
+            UWORD32 temp;
+            temp = (read_word << bit_pos);
+            temp = ((UWORD32)temp >> (32 - 9));
+            noise_start_value = temp;
+            bit_pos += 9;
+
+            ixheaacd_aac_read_2bytes(&ptr_read_next, &bit_pos, &read_word);
+
+            norm_value = noise_start_value - 256;
+            p_pns_data->pns_active = 1;
+
+            p_pns_data->current_energy = global_gain - NOISE_OFFSET;
+          }
+
+          if (cb_num > NOISE_HCB) {
+            position = position + norm_value;
+            *p_scale_factor_tmp++ = -position;
+          } else if (cb_num < NOISE_HCB) {
+            factor = factor + norm_value;
+            *p_scale_factor_tmp++ = factor;
+          } else {
+            p_pns_data->current_energy =
+                ixheaacd_add16_sat(p_pns_data->current_energy, norm_value);
+
+            pns_band = (group << 4) + sfb_transmitted - band - 1;
+            p_aac_decoder_channel_info->p_scale_factor[pns_band] = p_pns_data->current_energy;
+
+            p_pns_data->pns_used[pns_band] = 1;
+            p_scale_factor_tmp++;
+          }
+        }
+      }
+    }
+  }
+
+  it_bit_buf->ptr_read_next = ptr_read_next - diffbytes;
+
+  it_bit_buf->bit_pos = 7 - bit_pos;
+  {
+    WORD bits_cons;
+    bits_cons = (WORD)(((it_bit_buf->ptr_read_next - start_read_pos) << 3) +
+                       (start_bit_pos - it_bit_buf->bit_pos));
+    it_bit_buf->cnt_bits -= bits_cons;
+  }
+}
diff --git a/decoder/ixheaacd_mps_res_pns_js_thumb.c b/decoder/ixheaacd_mps_res_pns_js_thumb.c
new file mode 100644
index 0000000..dc45f73
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_pns_js_thumb.c
@@ -0,0 +1,175 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_res_channelinfo.h"
+#include "ixheaacd_mps_res_tns.h"
+
+static PLATFORM_INLINE WORD16 ixheaacd_res_get_maximum_tns_bands(
+    ia_mps_dec_residual_ics_info_struct *p_ics_info,
+    ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr, WORD32 *win_len) {
+  WORD32 i = 0;
+  *win_len = 1;
+
+  if (p_ics_info->window_sequence == EIGHT_SHORT_SEQUENCE) {
+    *win_len = 8;
+    i = 1;
+  }
+
+  return aac_tables_ptr->res_block_tables_ptr
+      ->tns_max_bands_tbl[p_ics_info->sampling_rate_index][i];
+}
+
+VOID ixheaacd_res_tns_decode_coeffs_32x16(const ia_mps_dec_residual_filter_struct *filter,
+                                          WORD16 *a,
+                                          ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr) {
+  WORD tmp;
+  WORD16 *aptr = a;
+  WORD16 *tns_coeff_ptr;
+  WORD8 offset = 4;
+  WORD8 *p_coeff = (WORD8 *)&filter->coeff[0];
+  WORD32 tmp1;
+
+  tmp = filter->resolution;
+  tns_coeff_ptr = aac_tables_ptr->res_block_tables_ptr->tns_coeff3_16;
+  if (tmp) {
+    tns_coeff_ptr = aac_tables_ptr->res_block_tables_ptr->tns_coeff4_16;
+    offset = offset << 1;
+  }
+  tmp1 = filter->order;
+  do {
+    WORD8 temp = *p_coeff++;
+    *aptr++ = tns_coeff_ptr[temp + offset];
+    tmp1--;
+  } while (tmp1 != 0);
+}
+
+VOID ixheaacd_res_ctns_apply(ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info,
+                             WORD16 max_sfb,
+                             ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr) {
+  WORD i;
+  WORD16 scale_lpc;
+
+  ia_mps_dec_residual_tns_data *p_tns_data = &p_aac_decoder_channel_info->tns_data;
+  WORD32 *p_spectrum = p_aac_decoder_channel_info->p_spectral_coefficient;
+
+  WORD window, index, start, stop, size, scale_spec;
+  ia_mps_dec_residual_ics_info_struct *p_ics_info = &p_aac_decoder_channel_info->ics_info;
+  WORD win_len, tns_max_bands;
+  WORD16 maximum_bins_short = ixheaacd_shr16_dir_sat(p_ics_info->frame_length, 3);
+
+  WORD32 coeff_parc[MAX_ORDER + 1];
+  WORD32 lpc[MAX_ORDER + 1];
+
+  const WORD16 *scale_factor_bands_tbl;
+
+  if (!p_tns_data->tns_data_present) return;
+
+  tns_max_bands = ixheaacd_res_get_maximum_tns_bands(p_ics_info, aac_tables_ptr, &win_len);
+
+  scale_factor_bands_tbl =
+      ixheaacd_res_get_sfb_offsets(&p_aac_decoder_channel_info->ics_info, aac_tables_ptr);
+
+  for (window = 0; window < win_len; window++) {
+    WORD ind_len = p_tns_data->number_of_filters[window];
+
+    for (index = 0; index < ind_len; index++) {
+      ia_mps_dec_residual_filter_struct *filter = &p_tns_data->filter[window][index];
+
+      if (filter->order <= 0) continue;
+
+      ixheaacd_res_tns_decode_coeffs_32x16(filter, (WORD16 *)coeff_parc, aac_tables_ptr);
+
+      start = ixheaacd_min32(ixheaacd_min32(filter->start_band, tns_max_bands), max_sfb);
+
+      start = scale_factor_bands_tbl[start];
+
+      stop = ixheaacd_min32(ixheaacd_min32(filter->stop_band, tns_max_bands), max_sfb);
+
+      stop = scale_factor_bands_tbl[stop];
+
+      size = (stop - start);
+      if (size <= 0) continue;
+
+      ixheaacd_res_tns_parcor_2_lpc_32x16((WORD16 *)coeff_parc, (WORD16 *)lpc, &scale_lpc,
+                                          filter->order);
+      {
+        WORD32 *p_tmp = p_spectrum + (window * maximum_bins_short) + start;
+        scale_spec = ixheaacd_res_calc_max_spectral_line(p_tmp, size);
+      }
+
+      scale_spec = ((scale_spec - 4) - scale_lpc);
+
+      if (scale_spec > 0) {
+        WORD shift;
+
+        scale_spec = ixheaacd_min32(scale_spec, 31);
+
+        if (filter->direction == -1)
+          shift = stop - 1;
+        else
+          shift = start;
+
+        ixheaacd_res_tns_ar_filter_fixed_32x16(&p_spectrum[(window * maximum_bins_short) + shift],
+                                               size, filter->direction, (WORD16 *)lpc,
+                                               filter->order, (WORD32)scale_lpc, scale_spec);
+      } else {
+        WORD shift;
+        WORD32 *p_tmp = p_spectrum + (window * maximum_bins_short) + start;
+
+        scale_spec = -scale_spec;
+        scale_spec = ixheaacd_min32(scale_spec, 31);
+
+        for (i = size; i != 0; i--) {
+          *p_tmp = (*p_tmp >> scale_spec);
+          p_tmp++;
+        }
+
+        if (filter->direction == -1)
+          shift = stop - 1;
+        else
+          shift = start;
+
+        {
+          WORD32 shift_val = scale_lpc;
+
+          ixheaacd_res_tns_ar_filter_fixed_32x16(
+              &p_spectrum[(window * maximum_bins_short) + shift], size, filter->direction,
+              (WORD16 *)lpc, filter->order, shift_val, 0);
+        }
+        {
+          p_tmp = p_spectrum + (window * maximum_bins_short) + start;
+          i = size;
+          do {
+            *p_tmp = (*p_tmp << scale_spec);
+            p_tmp++;
+            i--;
+          } while (i != 0);
+        }
+      }
+    }
+  }
+}
diff --git a/decoder/ixheaacd_mps_res_pulsedata.c b/decoder/ixheaacd_mps_res_pulsedata.c
new file mode 100644
index 0000000..4cd2662
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_pulsedata.c
@@ -0,0 +1,54 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_error_codes.h"
+
+WORD32 ixheaacd_res_c_pulse_data_read(ia_bit_buf_struct *it_bit_buf,
+                                      ia_mps_dec_residual_pulse_data_struct *pulse_data,
+                                      ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr) {
+  WORD32 i, k;
+  WORD32 error = 0;
+  pulse_data->pulse_data_present = (FLAG)ixheaacd_read_bits_buf(it_bit_buf, 1);
+  if (pulse_data->pulse_data_present) {
+    WORD32 tmp = ixheaacd_read_bits_buf(it_bit_buf, 8);
+    pulse_data->number_pulse = tmp >> 6;
+    pulse_data->pulse_start_band = tmp & 0x3F;
+
+    if (pulse_data->pulse_start_band >= 52) {
+      return (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_PULSEDATA_ERROR;
+    }
+
+    k = aac_tables_ptr->sfb_index_long[pulse_data->pulse_start_band];
+
+    for (i = 0; i <= pulse_data->number_pulse; i++) {
+      WORD32 tmp = ixheaacd_read_bits_buf(it_bit_buf, 9);
+      pulse_data->pulse_offset[i] = tmp >> 4;
+      pulse_data->pulse_amp[i] = tmp & 0xF;
+
+      k += pulse_data->pulse_offset[i];
+      if (k >= 1024) error = (WORD32)IA_XHEAAC_DEC_EXE_NONFATAL_PULSEDATA_ERROR;
+    }
+  }
+
+  return error;
+}
diff --git a/decoder/ixheaacd_mps_res_pulsedata.h b/decoder/ixheaacd_mps_res_pulsedata.h
new file mode 100644
index 0000000..ccc3079
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_pulsedata.h
@@ -0,0 +1,27 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RES_PULSEDATA_H
+#define IXHEAACD_MPS_RES_PULSEDATA_H
+
+WORD32 ixheaacd_res_c_pulse_data_read(ia_bit_buf_struct *it_bit_buf,
+                                      ia_mps_dec_residual_pulse_data_struct *pulse_data,
+                                      ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr);
+
+#endif /* IXHEAACD_MPS_RES_PULSEDATA_H */
diff --git a/decoder/ixheaacd_mps_res_rom.h b/decoder/ixheaacd_mps_res_rom.h
new file mode 100644
index 0000000..cc60be7
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_rom.h
@@ -0,0 +1,89 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RES_ROM_H
+#define IXHEAACD_MPS_RES_ROM_H
+
+typedef struct {
+  WORD32 pow_table_q17[129];
+  WORD32 scale_table[4];
+  WORD32 scale_table_960[4];
+  WORD8 tns_max_bands_tbl[12][2];
+  WORD16 tns_coeff3_16[8];
+  WORD16 tns_coeff4_16[16];
+} ia_mps_dec_res_block_tables_struct;
+
+extern const ia_mps_dec_res_block_tables_struct ixheaacd_mps_dec_res_block_tables;
+
+typedef struct {
+  WORD8 sfb_96_1024[42 + 1];
+  WORD8 sfb_96_128[13 + 1];
+  WORD8 sfb_64_1024[48 + 1];
+  WORD8 sfb_48_1024[50 + 1];
+  WORD8 sfb_48_128[15 + 1];
+  WORD8 sfb_32_1024[52 + 1];
+  WORD8 sfb_24_1024[48 + 1];
+  WORD8 sfb_24_128[16 + 1];
+  WORD8 sfb_16_1024[44 + 1];
+  WORD8 sfb_16_128[16 + 1];
+  WORD8 sfb_8_1024[41 + 1];
+  WORD8 sfb_8_128[16 + 1];
+  WORD8 sfb_96_960[40 + 1];
+  WORD8 sfb_96_120[12 + 1];
+  WORD8 sfb_64_960[46 + 1];
+  WORD8 sfb_48_960[49 + 1];
+  WORD8 sfb_48_120[14 + 1];
+  WORD8 sfb_24_960[46 + 1];
+  WORD8 sfb_24_120[15 + 1];
+  WORD8 sfb_16_960[42 + 1];
+  WORD8 sfb_16_120[15 + 1];
+  WORD8 sfb_8_960[40 + 1];
+  WORD8 sfb_8_120[15 + 1];
+
+  UWORD16 huffman_code_book_1[108];
+  UWORD16 huffman_code_book_2[110];
+  UWORD16 huffman_code_book_3[136];
+  UWORD16 huffman_code_book_4[116];
+  UWORD16 huffman_code_book_5[126];
+  UWORD16 huffman_code_book_6[120];
+  UWORD16 huffman_code_book_7[112];
+  UWORD16 huffman_code_book_8[92];
+  UWORD16 huffman_code_book_9[236];
+  UWORD16 huffman_code_book_10[218];
+  UWORD16 huffman_codebook_11[344];
+  UWORD16 huffman_code_book_scl[273];
+
+} ia_mps_dec_res_huffmann_tables_struct;
+
+extern const ia_mps_dec_res_huffmann_tables_struct ixheaacd_mps_dec_res_huffmann_tables;
+
+typedef struct {
+  ia_mps_dec_res_block_tables_struct *res_block_tables_ptr;
+  ia_mps_dec_res_huffmann_tables_struct *res_huffmann_tables_ptr;
+  WORD8 *scale_factor_bands_long[24];
+  WORD8 *scale_factor_bands_short[24];
+  WORD16 *sfb_index_long;
+  WORD16 *sfb_index_short;
+  WORD8 *sfb_index_long_width;
+  WORD8 *sfb_index_short_width;
+  UWORD16 *code_book[13];
+
+} ia_mps_dec_residual_aac_tables_struct;
+
+#endif /* IXHEAACD_MPS_RES_ROM_H */
diff --git a/decoder/ixheaacd_mps_res_tns.c b/decoder/ixheaacd_mps_res_tns.c
new file mode 100644
index 0000000..b34414c
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_tns.c
@@ -0,0 +1,152 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_basic_ops.h"
+#include "ixheaacd_defines.h"
+
+VOID ixheaacd_res_tns_parcor_2_lpc_32x16(WORD16 *parcor, WORD16 *lpc, WORD16 *scale, WORD order)
+
+{
+  WORD i, j, status;
+  WORD32 z1;
+  WORD16 z[MAX_ORDER + 1];
+  WORD16 w[MAX_ORDER + 1];
+  WORD32 accu1, accu2;
+
+  status = 1;
+  *scale = 0;
+  while (status) {
+    status = 0;
+
+    for (i = MAX_ORDER; i >= 0; i--) {
+      z[i] = 0;
+      w[i] = 0;
+    }
+
+    accu1 = (0x7fffffff >> *scale);
+
+    for (i = 0; i <= order; i++) {
+      z1 = accu1;
+
+      for (j = 0; j < order; j++) {
+        w[j] = ixheaacd_round16(accu1);
+
+        accu1 = ixheaacd_mac16x16in32_shl_sat(accu1, parcor[j], z[j]);
+        if (ixheaacd_abs32_sat(accu1) == 0x7fffffff) status = 1;
+      }
+      for (j = (order - 1); j >= 0; j--) {
+        accu2 = ixheaacd_deposit16h_in32(z[j]);
+        accu2 = ixheaacd_mac16x16in32_shl_sat(accu2, parcor[j], w[j]);
+        z[j + 1] = ixheaacd_round16(accu2);
+        if (ixheaacd_abs32_sat(accu2) == 0x7fffffff) status = 1;
+      }
+
+      z[0] = ixheaacd_round16(z1);
+      lpc[i] = ixheaacd_round16(accu1);
+      accu1 = 0;
+    }
+    accu1 = (status - 1);
+    if (accu1 == 0) {
+      *scale = *scale + 1;
+    }
+  }
+}
+
+VOID ixheaacd_res_tns_ar_filter_fixed_32x16(WORD32 *spectrum, WORD32 size, WORD32 inc,
+                                            WORD16 *lpc, WORD32 order, WORD32 shift_value,
+                                            WORD scale_spec) {
+  WORD32 i, j;
+  WORD32 y, state[MAX_ORDER + 1];
+
+  if ((order & 3) != 0) {
+    for (i = order + 1; i < ((WORD32)(order & 0xfffffffc) + 4); i++) {
+      lpc[i] = 0;
+    }
+    lpc[i] = 0;
+    order = ((order & 0xfffffffc) + 4);
+    order = order & 31;
+  }
+
+  for (i = 0; i < order; i++) {
+    y = (*spectrum) << scale_spec;
+    for (j = i; j > 0; j--) {
+      y = ixheaacd_sub32_sat(y, ixheaacd_mult32x16in32_shl_sat(state[j - 1], lpc[j]));
+      state[j] = state[j - 1];
+    }
+
+    state[0] = ixheaacd_shl32_dir_sat_limit(y, shift_value);
+    *spectrum = y >> scale_spec;
+    spectrum += inc;
+  }
+
+  for (i = order; i < size; i++) {
+    y = (*spectrum) << scale_spec;
+
+    for (j = order; j > 0; j--) {
+      y = ixheaacd_sub32_sat(y, ixheaacd_mult32x16in32_shl_sat(state[j - 1], lpc[j]));
+      state[j] = state[j - 1];
+    }
+
+    state[0] = ixheaacd_shl32_dir_sat_limit(y, shift_value);
+    *spectrum = y >> scale_spec;
+    spectrum += inc;
+  }
+}
+
+WORD32 ixheaacd_res_calc_max_spectral_line(WORD32 *p_tmp, WORD32 size) {
+  WORD32 max_spectral_line = 0, i;
+  WORD count, remaining, temp_1, temp_2, temp3, temp4;
+
+  count = size >> 3;
+  for (i = count; i--;) {
+    temp_1 = *p_tmp++;
+    temp_2 = *p_tmp++;
+    temp3 = *p_tmp++;
+    temp4 = *p_tmp++;
+
+    max_spectral_line = ixheaacd_abs32_nrm(temp_1) | max_spectral_line;
+    max_spectral_line = ixheaacd_abs32_nrm(temp_2) | max_spectral_line;
+    max_spectral_line = ixheaacd_abs32_nrm(temp3) | max_spectral_line;
+    max_spectral_line = ixheaacd_abs32_nrm(temp4) | max_spectral_line;
+    temp_1 = *p_tmp++;
+    temp_2 = *p_tmp++;
+    temp3 = *p_tmp++;
+    temp4 = *p_tmp++;
+
+    max_spectral_line = ixheaacd_abs32_nrm(temp_1) | max_spectral_line;
+    max_spectral_line = ixheaacd_abs32_nrm(temp_2) | max_spectral_line;
+    max_spectral_line = ixheaacd_abs32_nrm(temp3) | max_spectral_line;
+    max_spectral_line = ixheaacd_abs32_nrm(temp4) | max_spectral_line;
+  }
+
+  remaining = size - (count << 3);
+  if (remaining) {
+    for (i = remaining; i--;) {
+      max_spectral_line = ixheaacd_abs32_nrm(*p_tmp) | max_spectral_line;
+      p_tmp++;
+    }
+  }
+
+  return ixheaacd_norm32(max_spectral_line);
+}
diff --git a/decoder/ixheaacd_mps_res_tns.h b/decoder/ixheaacd_mps_res_tns.h
new file mode 100644
index 0000000..3ef5346
--- /dev/null
+++ b/decoder/ixheaacd_mps_res_tns.h
@@ -0,0 +1,39 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RES_TNS_H
+#define IXHEAACD_MPS_RES_TNS_H
+
+VOID ixheaacd_res_ctns_apply(ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info,
+                             WORD16 max_sfb,
+                             ia_mps_dec_residual_aac_tables_struct *aac_tables_ptr);
+
+WORD16
+ixheaacd_res_c_tns_read(ia_bit_buf_struct *it_bit_buf,
+                        ia_mps_dec_residual_channel_info_struct *p_aac_decoder_channel_info);
+
+WORD32 ixheaacd_res_calc_max_spectral_line(WORD32 *p_tmp, WORD32 size);
+
+VOID ixheaacd_res_tns_parcor_2_lpc_32x16(WORD16 *parcor, WORD16 *lpc, WORD16 *scale, WORD order);
+
+VOID ixheaacd_res_tns_ar_filter_fixed_32x16(WORD32 *spectrum, WORD32 size, WORD32 inc,
+                                            WORD16 *lpc, WORD32 order, WORD32 shift_value,
+                                            WORD scale_spec);
+
+#endif /* IXHEAACD_MPS_RES_TNS_H */
diff --git a/decoder/ixheaacd_mps_reshape_bb_env.c b/decoder/ixheaacd_mps_reshape_bb_env.c
new file mode 100644
index 0000000..773722a
--- /dev/null
+++ b/decoder/ixheaacd_mps_reshape_bb_env.c
@@ -0,0 +1,587 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_bitdec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_reshape_bb_env.h"
+#include "ixheaacd_error_standards.h"
+
+#define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
+
+VOID ixheaacd_init_bb_env(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 k, j;
+  ia_mps_dec_reshape_bb_env_state_struct *reshape_bb_env_state =
+      pstr_mps_state->mps_persistent_mem.reshape_bb_env_state;
+
+  for (k = 0; k < 2 * MAX_OUTPUT_CHANNELS_MPS + MAX_INPUT_CHANNELS_MPS; k++) {
+    reshape_bb_env_state->norm_nrg_prev[k] = ONE_IN_Q30;
+    reshape_bb_env_state->frame_nrg_prev[k] = 0;
+    reshape_bb_env_state->q_frame_nrg_prev[k] = 30;
+    reshape_bb_env_state->q_norm_nrg_prev[k] = 30;
+    for (j = 0; j < MAX_PARAMETER_BANDS; j++) {
+      reshape_bb_env_state->part_nrg_prev[k][j] = 0;
+      reshape_bb_env_state->q_part_nrg_prev[k][j] = 30;
+    }
+  }
+}
+
+static VOID ixheaacd_extract_bb_env(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 inp,
+                                            WORD32 ch, WORD32 *env, VOID *scratch, WORD32 flag) {
+  ia_mps_dec_reshape_bb_env_state_struct *reshape_bb_env_state =
+      pstr_mps_state->mps_persistent_mem.reshape_bb_env_state;
+  WORD64 *slot_nrg_fix, *slot_nrg;
+  WORD16 *q_slot_nrg_fix, *q_slot_nrg;
+  WORD32 *part_nrg_fix;
+  WORD16 *q_part_nrg_fix;
+
+  WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
+  WORD32 ts, qs, pb;
+
+  WORD32 start_p = 10;
+  WORD32 end_p = 18;
+  WORD32 env_fix_l;
+  WORD16 q_env_fix_l;
+
+  WORD16 alpha_fix = ALPHA_Q15;
+  WORD16 beta_fix = BETA_Q15;
+
+  WORD16 one_min_alpha_fix = ONE_MINUS_ALPHA_Q16;
+  WORD16 one_min_beta_fix = ONE_MINUS_BETA_Q16;
+  WORD16 one_by_nine = ONE_BY_NINE_Q16;
+  WORD32 frame_nrg_fix = 0;
+  WORD32 *norm_nrg_fix;
+  WORD16 q_frame_nrg_fix = 0;
+  WORD16 *q_norm_nrg_fix;
+  WORD32 temp_1, temp4;
+  WORD16 qtemp1, q_env;
+
+  WORD32 prev_ch_offs;
+  WORD32 cnt = min(42, pstr_mps_state->hybrid_bands);
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+  WORD32 *hyb_output_real_dry, *n_slot_nrg;
+  WORD32 *hyb_output_imag_dry;
+
+  const WORD32 *bb_env_kernels =
+      pstr_mps_state->ia_mps_dec_mps_table.bitdec_table_ptr->kernel_table.bb_env_kernels;
+
+  q_slot_nrg_fix = (WORD16 *)scratch;
+  n_slot_nrg = (WORD32 *)((WORD8 *)scratch + RESHAPE_OFFSET_1);
+  slot_nrg_fix = (WORD64 *)ALIGN_SIZE64((SIZE_T)((WORD8 *)scratch + RESHAPE_OFFSET_2));
+  switch (inp) {
+    WORD32 frame_nrg_prev;
+    WORD16 q_frame_nrg_prev;
+    WORD32 *p_hyb_out_dry_real, *p_hyb_out_dry_imag;
+
+    case INP_DRY_WET:
+      frame_nrg_prev = reshape_bb_env_state->frame_nrg_prev[ch];
+      q_frame_nrg_prev = reshape_bb_env_state->q_frame_nrg_prev[ch];
+
+      part_nrg_fix = &reshape_bb_env_state->part_nrg_prev[ch][0];
+      q_part_nrg_fix = &reshape_bb_env_state->q_part_nrg_prev[ch][0];
+
+      norm_nrg_fix = &reshape_bb_env_state->norm_nrg_prev[ch];
+      q_norm_nrg_fix = &reshape_bb_env_state->q_norm_nrg_prev[ch];
+
+      p_buffer_real = pstr_mps_state->array_struct->buf_real + ch * TSXHB + 12;
+      p_buffer_imag = pstr_mps_state->array_struct->buf_imag + ch * TSXHB + 12;
+
+      p_hyb_out_dry_real = pstr_mps_state->array_struct->hyb_output_real_dry + ch * TSXHB + 12;
+      p_hyb_out_dry_imag = pstr_mps_state->array_struct->hyb_output_imag_dry + ch * TSXHB + 12;
+
+      for (ts = 0; ts < time_slots; ts++) {
+        WORD32 prev_idx = 10;
+
+        slot_nrg = slot_nrg_fix + 4;
+        for (pb = 14; pb <= end_p; pb++) *slot_nrg++ = 0;
+
+        slot_nrg = slot_nrg_fix;
+
+        p_buffer_re = p_buffer_real;
+        p_buffer_im = p_buffer_imag;
+
+        hyb_output_real_dry = p_hyb_out_dry_real;
+        hyb_output_imag_dry = p_hyb_out_dry_imag;
+
+        for (qs = 12; qs < 16; qs++) {
+          temp_1 = (*hyb_output_real_dry + *p_buffer_re);
+          temp4 = (*hyb_output_imag_dry + *p_buffer_im);
+
+          *slot_nrg++ = (WORD64)temp_1 * (WORD64)temp_1 + (WORD64)temp4 * (WORD64)temp4;
+
+          p_buffer_re++;
+          p_buffer_im++;
+          hyb_output_real_dry++;
+          hyb_output_imag_dry++;
+        }
+        prev_idx = 14;
+        for (; qs < 30; qs++) {
+          WORD32 idx = bb_env_kernels[qs];
+          if (prev_idx != idx) {
+            slot_nrg++;
+            prev_idx = idx;
+          }
+          temp_1 = (*hyb_output_real_dry + *p_buffer_re);
+          temp4 = (*hyb_output_imag_dry + *p_buffer_im);
+
+          *slot_nrg += (WORD64)temp_1 * (WORD64)temp_1 + (WORD64)temp4 * (WORD64)temp4;
+
+          p_buffer_re++;
+          p_buffer_im++;
+          hyb_output_real_dry++;
+          hyb_output_imag_dry++;
+        }
+        slot_nrg++;
+        for (; qs < cnt; qs++) {
+          temp_1 = (*hyb_output_real_dry + *p_buffer_re);
+          temp4 = (*hyb_output_imag_dry + *p_buffer_im);
+
+          *slot_nrg += (WORD64)temp_1 * (WORD64)temp_1 + (WORD64)temp4 * (WORD64)temp4;
+
+          p_buffer_re++;
+          p_buffer_im++;
+          hyb_output_real_dry++;
+          hyb_output_imag_dry++;
+        }
+
+        slot_nrg = slot_nrg_fix;
+        q_slot_nrg = q_slot_nrg_fix;
+
+        frame_nrg_fix = 0;
+        q_frame_nrg_fix = 30;
+        for (pb = start_p; pb <= end_p; pb++) {
+          *n_slot_nrg = ixheaacd_mps_narrow(*slot_nrg, q_slot_nrg);
+          slot_nrg++;
+          temp_1 = ixheaacd_mult32x16in32(*n_slot_nrg, one_min_alpha_fix);
+          temp4 = ixheaacd_mult32x16in32((part_nrg_fix[pb]) << 1, alpha_fix);
+          part_nrg_fix[pb] =
+              ixheaacd_mps_reshape_add32(temp4, temp_1, &q_part_nrg_fix[pb], *q_slot_nrg);
+
+          frame_nrg_fix = ixheaacd_mps_reshape_add32(frame_nrg_fix, *n_slot_nrg++,
+                                                     &q_frame_nrg_fix, *q_slot_nrg++);
+        }
+
+        frame_nrg_fix = ixheaacd_mult32x16in32(frame_nrg_fix, one_by_nine);
+
+        temp_1 = ixheaacd_mult32x16in32(frame_nrg_fix, one_min_alpha_fix);
+        temp4 = ixheaacd_mult32x16in32((frame_nrg_prev) << 1, alpha_fix);
+        frame_nrg_fix =
+            ixheaacd_mps_reshape_add32(temp_1, temp4, &q_frame_nrg_fix, q_frame_nrg_prev);
+
+        frame_nrg_prev = frame_nrg_fix;
+        q_frame_nrg_prev = q_frame_nrg_fix;
+
+        env_fix_l = 0;
+        q_env_fix_l = 30;
+        q_slot_nrg = q_slot_nrg_fix;
+
+        n_slot_nrg -= PB_OFFSET;
+        for (pb = start_p; pb <= end_p; pb++) {
+          temp_1 = ixheaacd_mps_div_32(*n_slot_nrg++, part_nrg_fix[pb], &qtemp1);
+          qtemp1 = *q_slot_nrg++ + qtemp1 - q_part_nrg_fix[pb];
+          env_fix_l = ixheaacd_mps_reshape_add32(env_fix_l, temp_1, &q_env_fix_l, qtemp1);
+        }
+        n_slot_nrg -= PB_OFFSET;
+
+        env_fix_l =
+            ixheaacd_mps_mult32x32(env_fix_l, frame_nrg_fix, &q_env_fix_l, q_frame_nrg_fix);
+
+        temp_1 = ixheaacd_mult32x16in32(env_fix_l, one_min_beta_fix);
+        temp4 = ixheaacd_mult32x16in32((*norm_nrg_fix) << 1, beta_fix);
+        *norm_nrg_fix = ixheaacd_mps_reshape_add32(temp4, temp_1, q_norm_nrg_fix, q_env_fix_l);
+
+        if (flag) {
+          temp_1 = ixheaacd_mps_div_32(env_fix_l, *norm_nrg_fix, &qtemp1);
+          q_env = q_env_fix_l + qtemp1 - *q_norm_nrg_fix;
+          env[ts] = ixheaacd_mps_sqrt(temp_1, &(q_env), sqrt_tab);
+          env[ts] = ixheaacd_mps_convert_to_qn(env[ts], q_env, 15);
+        }
+
+        p_buffer_real += MAX_HYBRID_BANDS;
+        p_buffer_imag += MAX_HYBRID_BANDS;
+
+        p_hyb_out_dry_real += MAX_HYBRID_BANDS;
+        p_hyb_out_dry_imag += MAX_HYBRID_BANDS;
+      }
+      reshape_bb_env_state->frame_nrg_prev[ch] = frame_nrg_prev;
+      reshape_bb_env_state->q_frame_nrg_prev[ch] = q_frame_nrg_prev;
+
+      break;
+    case INP_DMX:
+      prev_ch_offs = ch + pstr_mps_state->num_output_channels;
+
+      frame_nrg_prev = reshape_bb_env_state->frame_nrg_prev[prev_ch_offs];
+      q_frame_nrg_prev = reshape_bb_env_state->q_frame_nrg_prev[prev_ch_offs];
+
+      part_nrg_fix = &reshape_bb_env_state->part_nrg_prev[prev_ch_offs][0];
+      q_part_nrg_fix = &reshape_bb_env_state->q_part_nrg_prev[prev_ch_offs][0];
+
+      norm_nrg_fix = &reshape_bb_env_state->norm_nrg_prev[prev_ch_offs];
+      q_norm_nrg_fix = &reshape_bb_env_state->q_norm_nrg_prev[prev_ch_offs];
+
+      p_buffer_real = pstr_mps_state->array_struct->x_real + ch * TSXHB + 12;
+      p_buffer_imag = pstr_mps_state->array_struct->x_imag + ch * TSXHB + 12;
+      for (ts = 0; ts < time_slots; ts++) {
+        WORD32 prev_idx;
+
+        slot_nrg = slot_nrg_fix + 4;
+        for (pb = 14; pb <= end_p; pb++) *slot_nrg++ = 0;
+
+        slot_nrg = slot_nrg_fix;
+
+        hyb_output_real_dry = p_buffer_real;
+        hyb_output_imag_dry = p_buffer_imag;
+
+        for (qs = 12; qs < 16; qs++) {
+          *slot_nrg++ = ((WORD64)(*hyb_output_real_dry) * (WORD64)(*hyb_output_real_dry)) +
+                        ((WORD64)(*hyb_output_imag_dry) * (WORD64)(*hyb_output_imag_dry));
+
+          hyb_output_real_dry++;
+          hyb_output_imag_dry++;
+        }
+        prev_idx = 14;
+        for (; qs < 30; qs++) {
+          WORD32 idx = bb_env_kernels[qs];
+          if (prev_idx != idx) {
+            slot_nrg++;
+            prev_idx = idx;
+          }
+
+          *slot_nrg += ((WORD64)(*hyb_output_real_dry) * (WORD64)(*hyb_output_real_dry)) +
+                       ((WORD64)(*hyb_output_imag_dry) * (WORD64)(*hyb_output_imag_dry));
+
+          hyb_output_real_dry++;
+          hyb_output_imag_dry++;
+        }
+        slot_nrg++;
+        for (; qs < cnt; qs++) {
+          *slot_nrg += ((WORD64)(*hyb_output_real_dry) * (WORD64)(*hyb_output_real_dry)) +
+                       ((WORD64)(*hyb_output_imag_dry) * (WORD64)(*hyb_output_imag_dry));
+
+          hyb_output_real_dry++;
+          hyb_output_imag_dry++;
+        }
+
+        slot_nrg = slot_nrg_fix;
+        q_slot_nrg = q_slot_nrg_fix;
+
+        frame_nrg_fix = 0;
+        q_frame_nrg_fix = 30;
+        for (pb = start_p; pb <= end_p; pb++) {
+          *n_slot_nrg = ixheaacd_mps_narrow(*slot_nrg, q_slot_nrg);
+          slot_nrg++;
+          temp_1 = ixheaacd_mult32x16in32(*n_slot_nrg, one_min_alpha_fix);
+          temp4 = ixheaacd_mult32x16in32((part_nrg_fix[pb]) << 1, alpha_fix);
+          part_nrg_fix[pb] =
+              ixheaacd_mps_reshape_add32(temp4, temp_1, &q_part_nrg_fix[pb], *q_slot_nrg);
+          frame_nrg_fix = ixheaacd_mps_reshape_add32(frame_nrg_fix, *n_slot_nrg++,
+                                                     &q_frame_nrg_fix, *q_slot_nrg++);
+        }
+
+        frame_nrg_fix = ixheaacd_mult32x16in32(frame_nrg_fix, one_by_nine);
+
+        temp_1 = ixheaacd_mult32x16in32(frame_nrg_fix, one_min_alpha_fix);
+        temp4 = ixheaacd_mult32x16in32((frame_nrg_prev) << 1, alpha_fix);
+        frame_nrg_fix =
+            ixheaacd_mps_reshape_add32(temp_1, temp4, &q_frame_nrg_fix, q_frame_nrg_prev);
+
+        frame_nrg_prev = frame_nrg_fix;
+        q_frame_nrg_prev = q_frame_nrg_fix;
+
+        env_fix_l = 0;
+        q_env_fix_l = 30;
+
+        q_slot_nrg = q_slot_nrg_fix;
+        n_slot_nrg -= PB_OFFSET;
+        for (pb = start_p; pb <= end_p; pb++) {
+          temp_1 = ixheaacd_mps_div_32(*n_slot_nrg++, part_nrg_fix[pb], &qtemp1);
+          qtemp1 = *q_slot_nrg++ + qtemp1 - q_part_nrg_fix[pb];
+          env_fix_l = ixheaacd_mps_reshape_add32(env_fix_l, temp_1, &q_env_fix_l, qtemp1);
+        }
+        n_slot_nrg -= PB_OFFSET;
+
+        env_fix_l =
+            ixheaacd_mps_mult32x32(env_fix_l, frame_nrg_fix, &q_env_fix_l, q_frame_nrg_fix);
+
+        temp_1 = ixheaacd_mult32x16in32(env_fix_l, one_min_beta_fix);
+        temp4 = ixheaacd_mult32x16in32((*norm_nrg_fix) << 1, beta_fix);
+        *norm_nrg_fix = ixheaacd_mps_reshape_add32(temp4, temp_1, q_norm_nrg_fix, q_env_fix_l);
+
+        temp_1 = ixheaacd_mps_div_32(env_fix_l, *norm_nrg_fix, &qtemp1);
+        q_env = q_env_fix_l + qtemp1 - *q_norm_nrg_fix;
+        env[ts] = ixheaacd_mps_sqrt(temp_1, &(q_env), sqrt_tab);
+        env[ts] = ixheaacd_mps_convert_to_qn(env[ts], q_env, 15);
+
+        p_buffer_real += MAX_HYBRID_BANDS;
+        p_buffer_imag += MAX_HYBRID_BANDS;
+      }
+      reshape_bb_env_state->frame_nrg_prev[prev_ch_offs] = frame_nrg_prev;
+      reshape_bb_env_state->q_frame_nrg_prev[prev_ch_offs] = q_frame_nrg_prev;
+
+      break;
+    default:
+      break;
+  }
+  return;
+}
+
+VOID ixheaacd_reshape_bb_env(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 *env_dry;
+  WORD32 *env_dmx_0, *env_dmx_1;
+
+  WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
+  WORD32 *hyb_output_real_wet, *hyb_output_imag_wet;
+
+  WORD32 temp_1, temp_2;
+  WORD16 qtemp1, qtemp2;
+  WORD32 tmp, dry_fac, slot_amp_dry, slot_amp_wet;
+  WORD16 q_dry_fac, q_slot_amp_dry, q_slot_amp_wet;
+
+  WORD32 slot_amp_ratio;
+  WORD16 q_slot_amp_ratio;
+  WORD32 ch, ch2, ts, qs;
+  WORD32 *hyb_output_real_dry, *hyb_out_dry_real;
+  WORD32 *hyb_output_imag_dry, *hyb_out_dry_imag;
+  WORD64 *inter;
+
+  VOID *free_scratch;
+  const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  WORD32 *temp_shape_enable_channel_ges = p_aux_struct->temp_shape_enable_channel_ges;
+
+  WORD32 start_hsb;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 num_output_channels = pstr_mps_state->num_output_channels;
+  WORD32 tree_config = pstr_mps_state->tree_config;
+  WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
+
+  const WORD32 *ch_idx = &pstr_mps_state->ia_mps_dec_mps_table.m1_m2_table_ptr->idx_table
+                              .row_2_channel_ges[tree_config][0];
+  WORD64 acc, acc2;
+  start_hsb = 6;
+
+  free_scratch = pstr_mps_state->mps_scratch_mem_v;
+  env_dry = free_scratch;
+  env_dmx_0 = pstr_mps_state->array_struct->env_dmx_0;
+  env_dmx_1 = pstr_mps_state->array_struct->env_dmx_1;
+  inter = (WORD64 *)((WORD8 *)free_scratch + MAX_TIME_SLOTSX12);
+  free_scratch = inter + MAX_TIME_SLOTS;
+
+  p_buffer_real = pstr_mps_state->array_struct->buf_real + start_hsb;
+  p_buffer_imag = pstr_mps_state->array_struct->buf_imag + start_hsb;
+
+  for (ch = 0; ch < num_output_channels; ch++) {
+    ch2 = ch_idx[ch];
+
+    if (ch2 == -1) continue;
+
+    p_buffer_re = p_buffer_real;
+    p_buffer_im = p_buffer_imag;
+
+    ixheaacd_extract_bb_env(pstr_mps_state, INP_DRY_WET, ch, env_dry, free_scratch,
+                                         temp_shape_enable_channel_ges[ch2]);
+
+    if (temp_shape_enable_channel_ges[ch2]) {
+      WORD32 *env = &p_aux_struct->env_shape_data[ch2][0];
+      switch (tree_config) {
+        case TREE_5151:
+        case TREE_5152:
+          for (ts = 0; ts < time_slots; ts++) {
+            inter[ts] = (WORD64)((WORD64)*env++ * (WORD64)env_dmx_0[ts]);
+          }
+          break;
+
+        case TREE_525:
+        case TREE_7271:
+        case TREE_7272:
+
+          switch (ch2) {
+            case 0:
+            case 3:
+            case 5:
+
+              for (ts = 0; ts < time_slots; ts++) {
+                inter[ts] = (WORD64)((WORD64)*env++ * (WORD64)env_dmx_0[ts]);
+              }
+              break;
+            case 1:
+            case 4:
+            case 6:
+
+              for (ts = 0; ts < time_slots; ts++) {
+                inter[ts] = (WORD64)((WORD64)*env++ * (WORD64)env_dmx_1[ts]);
+              }
+              break;
+            case 2:
+
+              for (ts = 0; ts < time_slots; ts++) {
+                temp_2 = (env_dmx_0[ts] + env_dmx_1[ts]) >> 1;
+                inter[ts] = (WORD64)((WORD64)*env++ * (WORD64)temp_2);
+              }
+              break;
+            default:
+              break;
+          }
+          break;
+
+        case TREE_7571:
+        case TREE_7572:
+          switch (ch2) {
+            case 0:
+            case 2:
+              for (ts = 0; ts < time_slots; ts++) {
+                inter[ts] = (WORD64)((WORD64)*env++ * (WORD64)env_dmx_0[ts]);
+              }
+
+              break;
+            case 1:
+            case 3:
+              for (ts = 0; ts < time_slots; ts++) {
+                inter[ts] = (WORD64)((WORD64)*env++ * (WORD64)env_dmx_1[ts]);
+              }
+              break;
+            default:
+              break;
+          }
+        default:
+          break;
+      }
+
+      hyb_out_dry_real =
+          pstr_mps_state->array_struct->hyb_output_real_dry + ch * TSXHB + start_hsb;
+      hyb_out_dry_imag =
+          pstr_mps_state->array_struct->hyb_output_imag_dry + ch * TSXHB + start_hsb;
+
+      for (ts = 0; ts < time_slots; ts++) {
+        tmp = ixheaacd_mps_narrow(inter[ts], &qtemp1);
+
+        if (env_dry[ts] == 0) {
+          q_dry_fac = 0;
+          dry_fac = MAX_32;
+        } else {
+          dry_fac = ixheaacd_mps_div_32(tmp, env_dry[ts], &q_dry_fac);
+          q_dry_fac += qtemp1 - 5;
+        }
+
+        hyb_output_real_wet = p_buffer_re;
+        hyb_output_imag_wet = p_buffer_im;
+
+        hyb_output_real_dry = hyb_out_dry_real;
+        hyb_output_imag_dry = hyb_out_dry_imag;
+        acc = 0;
+        acc2 = 0;
+
+        for (qs = start_hsb; qs < hybrid_bands; qs++) {
+          acc += (WORD64)(*hyb_output_real_dry) * (WORD64)(*hyb_output_real_dry);
+          hyb_output_real_dry++;
+          acc += (WORD64)(*hyb_output_imag_dry) * (WORD64)(*hyb_output_imag_dry);
+          hyb_output_imag_dry++;
+
+          acc2 += (WORD64)(*hyb_output_real_wet) * (WORD64)(*hyb_output_real_wet);
+          hyb_output_real_wet++;
+          acc2 += (WORD64)(*hyb_output_imag_wet) * (WORD64)(*hyb_output_imag_wet);
+          hyb_output_imag_wet++;
+        }
+        slot_amp_dry = ixheaacd_mps_narrow(acc, &q_slot_amp_dry);
+        slot_amp_wet = ixheaacd_mps_narrow(acc2, &q_slot_amp_wet);
+
+        qtemp1 = q_slot_amp_dry;
+
+        temp_1 = ixheaacd_mps_add32(slot_amp_dry, ABS_THR_FIX, &qtemp1, 15);
+        temp_2 = ixheaacd_mps_div_32(slot_amp_wet, temp_1, &qtemp2);
+        q_slot_amp_ratio = qtemp2 + q_slot_amp_wet - qtemp1;
+        slot_amp_ratio = ixheaacd_mps_sqrt(temp_2, &q_slot_amp_ratio, sqrt_tab);
+
+        temp_1 = ixheaacd_mps_convert_to_qn(dry_fac, q_dry_fac, 15);
+        temp_1 -= ONE_IN_Q15;
+        temp_1 = ixheaacd_mps_mult32_shr_16(temp_1, slot_amp_ratio);
+        q_slot_amp_ratio -= 1;
+
+        temp_1 = ixheaacd_mps_add32(temp_1, dry_fac, &q_slot_amp_ratio, q_dry_fac);
+
+        temp_1 = ixheaacd_mps_convert_to_qn(temp_1, q_slot_amp_ratio, 15);
+        temp_1 = max(ONE_IN_Q13, temp_1);
+        dry_fac = min(FOUR_IN_Q15, temp_1);
+
+        hyb_output_real_dry = hyb_out_dry_real;
+        hyb_output_imag_dry = hyb_out_dry_imag;
+
+        for (qs = start_hsb; qs < hybrid_bands; qs++) {
+          *hyb_output_real_dry = ixheaacd_mps_mult32_shr_15(*hyb_output_real_dry, dry_fac);
+          hyb_output_real_dry++;
+          *hyb_output_imag_dry = ixheaacd_mps_mult32_shr_15(*hyb_output_imag_dry, dry_fac);
+          hyb_output_imag_dry++;
+        }
+        p_buffer_re += MAX_HYBRID_BANDS;
+        p_buffer_im += MAX_HYBRID_BANDS;
+        hyb_out_dry_real += MAX_HYBRID_BANDS;
+        hyb_out_dry_imag += MAX_HYBRID_BANDS;
+      }
+    }
+    p_buffer_real += TSXHB;
+    p_buffer_imag += TSXHB;
+  }
+  return;
+}
+
+VOID ixheaacd_pre_reshape_bb_env(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 *env_dmx_0, *env_dmx_1;
+
+  VOID *free_scratch;
+
+  WORD32 tree_config = pstr_mps_state->tree_config;
+
+  free_scratch = pstr_mps_state->mps_scratch_mem_v;
+  env_dmx_0 = pstr_mps_state->array_struct->env_dmx_0;
+  env_dmx_1 = pstr_mps_state->array_struct->env_dmx_1;
+
+  switch (tree_config) {
+    case TREE_7572:
+      ixheaacd_extract_bb_env(pstr_mps_state, INP_DMX, 0 + 4, env_dmx_0, free_scratch, 0);
+      ixheaacd_extract_bb_env(pstr_mps_state, INP_DMX, 1 + 4, env_dmx_1, free_scratch, 0);
+      break;
+    default:
+      ixheaacd_extract_bb_env(pstr_mps_state, INP_DMX, 0, env_dmx_0, free_scratch, 0);
+      if (min(pstr_mps_state->num_input_channels, 2) == 2) {
+        ixheaacd_extract_bb_env(pstr_mps_state, INP_DMX, 1, env_dmx_1, free_scratch, 0);
+      }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_reshape_bb_env.h b/decoder/ixheaacd_mps_reshape_bb_env.h
new file mode 100644
index 0000000..ca92d44
--- /dev/null
+++ b/decoder/ixheaacd_mps_reshape_bb_env.h
@@ -0,0 +1,40 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_RESHAPE_BB_ENV_H
+#define IXHEAACD_MPS_RESHAPE_BB_ENV_H
+
+#define INP_DRY_WET (0)
+#define INP_DMX (1)
+
+#define ALPHA_Q15 (32649)
+#define BETA_Q15 (31600)
+#define ONE_MINUS_ALPHA_Q16 (238)
+#define ONE_MINUS_BETA_Q16 (2336)
+
+#define SHAPE_STP (1)
+#define SHAPE_GES (2)
+
+VOID ixheaacd_init_bb_env(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_reshape_bb_env(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_pre_reshape_bb_env(ia_heaac_mps_state_struct *pstr_mps_state);
+
+#endif /* IXHEAACD_MPS_RESHAPE_BB_ENV_H */
diff --git a/decoder/ixheaacd_mps_rom.c b/decoder/ixheaacd_mps_rom.c
index 6dd2ded..a73f255 100644
--- a/decoder/ixheaacd_mps_rom.c
+++ b/decoder/ixheaacd_mps_rom.c
@@ -17,39 +17,38 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-
 #include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_mps_struct_def.h"
 #include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_config.h"
-
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
-
-#include "ixheaacd_mps_nlc_dec.h"
 #include "ixheaacd_mps_huff_tab.h"
 
 const ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes = {
-    {{{{-1, 1},   {-2, 2},   {-3, 3},    {-4, 4},    {-5, 5},    {-6, 6},
-       {-7, 7},   {-8, 8},   {-9, 9},    {-10, 10},  {-11, 11},  {-12, 12},
-       {-13, 13}, {15, 14},  {-14, 16},  {-15, 17},  {-16, 18},  {-17, 19},
-       {-18, 20}, {-19, 21}, {-20, -21}, {-23, 22},  {-22, 23},  {-24, 24},
-       {-25, 25}, {27, 26},  {29, 28},   {-30, -31}, {-28, -29}, {-26, -27}}},
-     {{{-1, 1},   {-2, 2},    {-3, 3},   {-4, 4},    {-5, 5},    {-6, 6},
-       {-7, 7},   {9, 8},     {-8, 10},  {-9, 11},   {-10, 12},  {-11, 13},
-       {-12, 14}, {-13, 15},  {-14, 16}, {-15, 17},  {-16, 18},  {-17, 19},
-       {-18, 20}, {-19, -20}, {-21, 21}, {-22, 22},  {-23, 23},  {25, 24},
-       {-24, 26}, {-25, 27},  {29, 28},  {-26, -31}, {-29, -30}, {-27, -28}}},
-     {{{-1, 1},   {-2, 2},    {-3, 3},   {-4, 4},    {-5, 5},    {-6, 6},
-       {-7, 7},   {9, 8},     {-8, 10},  {-9, 11},   {-10, 12},  {-11, 13},
-       {-12, 14}, {-13, 15},  {-14, 16}, {-15, 17},  {-16, 18},  {-17, 19},
-       {-18, 20}, {-19, -20}, {-21, 21}, {-22, 22},  {-23, 23},  {25, 24},
-       {-24, 26}, {-25, 27},  {29, 28},  {-26, -31}, {-29, -30}, {-27, -28}}}},
+    {{{{-1, 1},   {-2, 2},   {-3, 3},   {-4, 4},    {-5, 5},    {-6, 6},   {-7, 7},   {-8, 8},
+       {-9, 9},   {-10, 10}, {-11, 11}, {-12, 12},  {-13, 13},  {15, 14},  {-14, 16}, {-15, 17},
+       {-16, 18}, {-17, 19}, {-18, 20}, {-19, 21},  {-20, -21}, {-23, 22}, {-22, 23}, {-24, 24},
+       {-25, 25}, {27, 26},  {29, 28},  {-30, -31}, {-28, -29}, {-26, -27}}},
+     {{{-1, 1},   {-2, 2},   {-3, 3},   {-4, 4},    {-5, 5},    {-6, 6},   {-7, 7},   {9, 8},
+       {-8, 10},  {-9, 11},  {-10, 12}, {-11, 13},  {-12, 14},  {-13, 15}, {-14, 16}, {-15, 17},
+       {-16, 18}, {-17, 19}, {-18, 20}, {-19, -20}, {-21, 21},  {-22, 22}, {-23, 23}, {25, 24},
+       {-24, 26}, {-25, 27}, {29, 28},  {-26, -31}, {-29, -30}, {-27, -28}}},
+     {{{-1, 1},   {-2, 2},   {-3, 3},   {-4, 4},    {-5, 5},    {-6, 6},   {-7, 7},   {9, 8},
+       {-8, 10},  {-9, 11},  {-10, 12}, {-11, 13},  {-12, 14},  {-13, 15}, {-14, 16}, {-15, 17},
+       {-16, 18}, {-17, 19}, {-18, 20}, {-19, -20}, {-21, 21},  {-22, 22}, {-23, 23}, {25, 24},
+       {-24, 26}, {-25, 27}, {29, 28},  {-26, -31}, {-29, -30}, {-27, -28}}}},
     {{{{{2, 1},
         {-1, -52},
         {4, 3},
@@ -65,45 +64,37 @@
         {-4, 13},
         {-33, 14},
         {-20, -49}},
-       {{2, 1},     {4, 3},     {-86, 5},  {7, 6},    {9, 8},     {-1, -2},
-        {-85, 10},  {-18, 11},  {-17, 12}, {14, 13},  {-70, 15},  {17, 16},
-        {-19, -69}, {-84, 18},  {-3, 19},  {21, 20},  {-34, -68}, {-20, 22},
-        {-35, 23},  {-83, 24},  {-33, 25}, {-4, 26},  {-53, 27},  {-54, -67},
-        {-36, 28},  {-21, -52}, {-82, 29}, {-5, -50}, {-51, 30},  {-38, 31},
-        {-37, -49}, {-6, 32},   {-66, 33}, {-65, 34}, {-22, -81}},
-       {{2, 1},      {4, 3},     {-120, 5},   {7, 6},      {9, 8},
-        {11, 10},    {-1, 12},   {-18, -119}, {-2, 13},    {15, 14},
-        {-17, 16},   {-104, 17}, {19, 18},    {-19, 20},   {-103, 21},
-        {-118, 22},  {24, 23},   {-3, 25},    {27, 26},    {-34, 28},
-        {-102, 29},  {-20, 30},  {-35, 31},   {33, 32},    {-117, 34},
-        {-33, 35},   {-88, 36},  {-4, 37},    {-87, 38},   {40, 39},
-        {-36, -101}, {-86, 41},  {-21, -37},  {-85, -100}, {-52, 42},
-        {-22, 43},   {-116, 44}, {-50, 45},   {47, 46},    {-5, -51},
-        {-115, 48},  {-70, 49},  {-84, 50},   {-38, -49},  {-72, -99},
-        {-53, 51},   {-69, -71}, {-23, 52},   {-6, -67},   {-114, 53},
-        {-7, 54},    {-66, -68}, {-55, 55},   {57, 56},    {-54, -65},
-        {-8, -56},   {-82, -83}, {59, 58},    {-39, -40},  {-81, 60},
-        {-98, 61},   {-97, 62},  {-24, -113}},
-       {{2, 1},      {4, 3},      {6, 5},      {-154, 7},    {9, 8},
-        {11, 10},    {13, 12},    {15, 14},    {-18, 16},    {-153, 17},
-        {-1, -2},    {19, 18},    {-138, 20},  {-17, 21},    {23, 22},
-        {25, 24},    {-19, -137}, {27, 26},    {-152, 28},   {30, 29},
-        {-3, -34},   {32, 31},    {34, 33},    {36, 35},     {-136, 37},
-        {-35, 38},   {-20, 39},   {-122, 40},  {-151, 41},   {-33, 42},
-        {-121, 43},  {45, 44},    {47, 46},    {-4, 48},     {-36, -120},
-        {-135, 49},  {51, 50},    {-21, 52},   {54, 53},     {56, 55},
-        {-50, -150}, {58, 57},    {-51, 59},   {61, 60},     {-119, 62},
-        {-52, 63},   {-5, 64},    {-37, 65},   {-117, -134}, {-39, -54},
-        {-22, 66},   {-106, 67},  {-69, -102}, {-132, 68},   {-105, 69},
-        {-49, 70},   {-149, 71},  {-24, -104}, {73, 72},     {-53, 74},
-        {-38, -118}, {-103, 75},  {-6, 76},    {-66, -87},   {-133, -147},
-        {-23, 77},   {-67, 78},   {-68, -86},  {-70, -101},  {-40, -148},
-        {-116, 79},  {-55, 80},   {-84, -131}, {82, 81},     {-89, -90},
-        {-7, -25},   {-85, -88},  {-65, 83},   {-72, -146},  {85, 84},
-        {-9, -71},   {-83, 86},   {-82, 87},   {-8, 88},     {-100, 89},
-        {-74, -99},  {-73, 90},   {-10, -81},  {-56, 91},    {-57, -98},
-        {93, 92},    {-58, -114}, {-97, -115}, {95, 94},     {-41, 96},
-        {-42, 97},   {-26, -129}, {-113, 98},  {-130, -145}}},
+       {{2, 1},    {4, 3},    {-86, 5},   {7, 6},    {9, 8},     {-1, -2},   {-85, 10},
+        {-18, 11}, {-17, 12}, {14, 13},   {-70, 15}, {17, 16},   {-19, -69}, {-84, 18},
+        {-3, 19},  {21, 20},  {-34, -68}, {-20, 22}, {-35, 23},  {-83, 24},  {-33, 25},
+        {-4, 26},  {-53, 27}, {-54, -67}, {-36, 28}, {-21, -52}, {-82, 29},  {-5, -50},
+        {-51, 30}, {-38, 31}, {-37, -49}, {-6, 32},  {-66, 33},  {-65, 34},  {-22, -81}},
+       {{2, 1},      {4, 3},     {-120, 5},   {7, 6},     {9, 8},     {11, 10},    {-1, 12},
+        {-18, -119}, {-2, 13},   {15, 14},    {-17, 16},  {-104, 17}, {19, 18},    {-19, 20},
+        {-103, 21},  {-118, 22}, {24, 23},    {-3, 25},   {27, 26},   {-34, 28},   {-102, 29},
+        {-20, 30},   {-35, 31},  {33, 32},    {-117, 34}, {-33, 35},  {-88, 36},   {-4, 37},
+        {-87, 38},   {40, 39},   {-36, -101}, {-86, 41},  {-21, -37}, {-85, -100}, {-52, 42},
+        {-22, 43},   {-116, 44}, {-50, 45},   {47, 46},   {-5, -51},  {-115, 48},  {-70, 49},
+        {-84, 50},   {-38, -49}, {-72, -99},  {-53, 51},  {-69, -71}, {-23, 52},   {-6, -67},
+        {-114, 53},  {-7, 54},   {-66, -68},  {-55, 55},  {57, 56},   {-54, -65},  {-8, -56},
+        {-82, -83},  {59, 58},   {-39, -40},  {-81, 60},  {-98, 61},  {-97, 62},   {-24, -113}},
+       {{2, 1},       {4, 3},      {6, 5},      {-154, 7},   {9, 8},       {11, 10},
+        {13, 12},     {15, 14},    {-18, 16},   {-153, 17},  {-1, -2},     {19, 18},
+        {-138, 20},   {-17, 21},   {23, 22},    {25, 24},    {-19, -137},  {27, 26},
+        {-152, 28},   {30, 29},    {-3, -34},   {32, 31},    {34, 33},     {36, 35},
+        {-136, 37},   {-35, 38},   {-20, 39},   {-122, 40},  {-151, 41},   {-33, 42},
+        {-121, 43},   {45, 44},    {47, 46},    {-4, 48},    {-36, -120},  {-135, 49},
+        {51, 50},     {-21, 52},   {54, 53},    {56, 55},    {-50, -150},  {58, 57},
+        {-51, 59},    {61, 60},    {-119, 62},  {-52, 63},   {-5, 64},     {-37, 65},
+        {-117, -134}, {-39, -54},  {-22, 66},   {-106, 67},  {-69, -102},  {-132, 68},
+        {-105, 69},   {-49, 70},   {-149, 71},  {-24, -104}, {73, 72},     {-53, 74},
+        {-38, -118},  {-103, 75},  {-6, 76},    {-66, -87},  {-133, -147}, {-23, 77},
+        {-67, 78},    {-68, -86},  {-70, -101}, {-40, -148}, {-116, 79},   {-55, 80},
+        {-84, -131},  {82, 81},    {-89, -90},  {-7, -25},   {-85, -88},   {-65, 83},
+        {-72, -146},  {85, 84},    {-9, -71},   {-83, 86},   {-82, 87},    {-8, 88},
+        {-100, 89},   {-74, -99},  {-73, 90},   {-10, -81},  {-56, 91},    {-57, -98},
+        {93, 92},     {-58, -114}, {-97, -115}, {95, 94},    {-41, 96},    {-42, 97},
+        {-26, -129},  {-113, 98},  {-130, -145}}},
       {{{-1, 1},
         {-52, 2},
         {-17, 3},
@@ -119,45 +110,37 @@
         {-19, 13},
         {-3, 14},
         {-4, -50}},
-       {{2, 1},    {4, 3},     {-86, 5},  {-1, 6},   {-17, 7},   {-70, 8},
-        {10, 9},   {-18, 11},  {-33, 12}, {-54, 13}, {-2, 14},   {-34, 15},
-        {-38, 16}, {-49, 17},  {-85, 18}, {-50, 19}, {-69, 20},  {-53, -65},
-        {-22, 21}, {-66, 22},  {-19, 23}, {-37, 24}, {-35, -81}, {-3, 25},
-        {-51, 26}, {-68, -84}, {-52, 27}, {29, 28},  {-20, 30},  {-4, -36},
-        {-83, 31}, {-67, 32},  {-21, 33}, {-5, 34},  {-6, -82}},
-       {{2, 1},      {4, 3},     {6, 5},       {-120, 7},  {-17, 8},
-        {-1, -104},  {10, 9},    {12, 11},     {-18, 13},  {-33, -88},
-        {15, 14},    {17, 16},   {-2, 18},     {-34, 19},  {-72, 20},
-        {-49, 21},   {-119, 22}, {-50, 23},    {-103, 24}, {-56, 25},
-        {-65, 26},   {28, 27},   {-40, -87},   {-66, 29},  {-82, 30},
-        {32, 31},    {-19, -81}, {-71, 33},    {-97, 34},  {-35, -55},
-        {-24, 35},   {37, 36},   {-3, -98},    {-51, 38},  {-67, 39},
-        {-39, -118}, {-113, 40}, {-102, 41},   {-86, 42},  {-70, -83},
-        {44, 43},    {-20, -54}, {-52, 45},    {-36, 46},  {-4, 47},
-        {-68, 48},   {-85, 49},  {-101, -117}, {-69, 50},  {52, 51},
-        {-21, -37},  {-53, 53},  {55, 54},     {-5, -100}, {-116, 56},
-        {-84, 57},   {-38, 58},  {-22, -99},   {-115, 59}, {-6, 60},
-        {-23, 61},   {-7, 62},   {-114, 0}},
-       {{2, 1},      {4, 3},       {6, 5},       {-154, 7},    {9, 8},
-        {-17, 10},   {-138, 11},   {-1, 12},     {14, 13},     {16, 15},
-        {-33, -122}, {-18, 17},    {19, 18},     {-34, 20},    {-2, 21},
-        {-106, 22},  {-49, 23},    {25, 24},     {-50, 26},    {-153, 27},
-        {-90, 28},   {-137, 29},   {-65, 30},    {32, 31},     {-66, 33},
-        {-121, 34},  {-74, 35},    {-81, 36},    {38, 37},     {-42, 39},
-        {-82, 40},   {-105, 41},   {-19, -114},  {-58, 42},    {-35, 43},
-        {-97, 44},   {46, 45},     {-129, 47},   {-26, -89},   {-57, -98},
-        {-51, 48},   {-3, 49},     {-113, 50},   {-130, 51},   {-152, 52},
-        {-67, -73},  {-99, -136},  {-145, 53},   {-120, 54},   {-41, 55},
-        {-83, 56},   {-72, 57},    {-104, 58},   {-115, 59},   {-20, 60},
-        {62, 61},    {-36, -88},   {-84, 63},    {-52, -56},   {65, 64},
-        {-4, -87},   {-68, 66},    {-151, 67},   {-100, -135}, {69, 68},
-        {-69, -119}, {-103, 70},   {-71, 71},    {73, 72},     {-21, 74},
-        {-85, 75},   {-37, -53},   {-86, 76},    {78, 77},     {-102, -150},
-        {-5, 79},    {-134, 80},   {-118, 81},   {-54, -117},  {83, 82},
-        {-38, -70},  {-22, 84},    {-6, 85},     {87, 86},     {-55, 88},
-        {-101, 89},  {-133, -149}, {-24, -39},   {91, 90},     {-132, 92},
-        {-23, 93},   {-7, 94},     {-147, -148}, {-116, -131}, {-25, 95},
-        {-40, 0},    {0, 0},       {0, 0},       {0, 0}}}},
+       {{2, 1},    {4, 3},     {-86, 5},  {-1, 6},    {-17, 7},   {-70, 8},  {10, 9},
+        {-18, 11}, {-33, 12},  {-54, 13}, {-2, 14},   {-34, 15},  {-38, 16}, {-49, 17},
+        {-85, 18}, {-50, 19},  {-69, 20}, {-53, -65}, {-22, 21},  {-66, 22}, {-19, 23},
+        {-37, 24}, {-35, -81}, {-3, 25},  {-51, 26},  {-68, -84}, {-52, 27}, {29, 28},
+        {-20, 30}, {-4, -36},  {-83, 31}, {-67, 32},  {-21, 33},  {-5, 34},  {-6, -82}},
+       {{2, 1},      {4, 3},     {6, 5},     {-120, 7}, {-17, 8},   {-1, -104},   {10, 9},
+        {12, 11},    {-18, 13},  {-33, -88}, {15, 14},  {17, 16},   {-2, 18},     {-34, 19},
+        {-72, 20},   {-49, 21},  {-119, 22}, {-50, 23}, {-103, 24}, {-56, 25},    {-65, 26},
+        {28, 27},    {-40, -87}, {-66, 29},  {-82, 30}, {32, 31},   {-19, -81},   {-71, 33},
+        {-97, 34},   {-35, -55}, {-24, 35},  {37, 36},  {-3, -98},  {-51, 38},    {-67, 39},
+        {-39, -118}, {-113, 40}, {-102, 41}, {-86, 42}, {-70, -83}, {44, 43},     {-20, -54},
+        {-52, 45},   {-36, 46},  {-4, 47},   {-68, 48}, {-85, 49},  {-101, -117}, {-69, 50},
+        {52, 51},    {-21, -37}, {-53, 53},  {55, 54},  {-5, -100}, {-116, 56},   {-84, 57},
+        {-38, 58},   {-22, -99}, {-115, 59}, {-6, 60},  {-23, 61},  {-7, 62},     {-114, 0}},
+       {{2, 1},      {4, 3},     {6, 5},       {-154, 7},    {9, 8},      {-17, 10},
+        {-138, 11},  {-1, 12},   {14, 13},     {16, 15},     {-33, -122}, {-18, 17},
+        {19, 18},    {-34, 20},  {-2, 21},     {-106, 22},   {-49, 23},   {25, 24},
+        {-50, 26},   {-153, 27}, {-90, 28},    {-137, 29},   {-65, 30},   {32, 31},
+        {-66, 33},   {-121, 34}, {-74, 35},    {-81, 36},    {38, 37},    {-42, 39},
+        {-82, 40},   {-105, 41}, {-19, -114},  {-58, 42},    {-35, 43},   {-97, 44},
+        {46, 45},    {-129, 47}, {-26, -89},   {-57, -98},   {-51, 48},   {-3, 49},
+        {-113, 50},  {-130, 51}, {-152, 52},   {-67, -73},   {-99, -136}, {-145, 53},
+        {-120, 54},  {-41, 55},  {-83, 56},    {-72, 57},    {-104, 58},  {-115, 59},
+        {-20, 60},   {62, 61},   {-36, -88},   {-84, 63},    {-52, -56},  {65, 64},
+        {-4, -87},   {-68, 66},  {-151, 67},   {-100, -135}, {69, 68},    {-69, -119},
+        {-103, 70},  {-71, 71},  {73, 72},     {-21, 74},    {-85, 75},   {-37, -53},
+        {-86, 76},   {78, 77},   {-102, -150}, {-5, 79},     {-134, 80},  {-118, 81},
+        {-54, -117}, {83, 82},   {-38, -70},   {-22, 84},    {-6, 85},    {87, 86},
+        {-55, 88},   {-101, 89}, {-133, -149}, {-24, -39},   {91, 90},    {-132, 92},
+        {-23, 93},   {-7, 94},   {-147, -148}, {-116, -131}, {-25, 95},   {-40, 0},
+        {0, 0},      {0, 0},     {0, 0}}}},
      {{{{-1, 1},
         {-52, 2},
         {-17, 3},
@@ -173,45 +156,37 @@
         {-3, 13},
         {-49, 14},
         {-4, -50}},
-       {{2, 1},     {-86, 3},   {-1, 4},   {-17, 5},   {7, 6},    {-70, 8},
-        {-2, -18},  {10, 9},    {12, 11},  {-85, 13},  {-33, 14}, {-34, -54},
-        {16, 15},   {-69, 17},  {19, 18},  {-50, -53}, {-19, 20}, {-38, 21},
-        {-35, -49}, {-3, 22},   {24, 23},  {-68, 25},  {-84, 26}, {-65, 27},
-        {-51, -66}, {-22, -37}, {-52, 28}, {-20, 29},  {-36, 30}, {-81, 31},
-        {-4, -83},  {-67, 32},  {-21, 33}, {-5, 34},   {-6, -82}},
-       {{2, 1},     {-120, 3},  {-1, 4},     {6, 5},      {-17, 7},
-        {-104, 8},  {-18, 9},   {-2, 10},    {12, 11},    {14, 13},
-        {-119, 15}, {-33, 16},  {-34, -88},  {-103, 17},  {19, 18},
-        {21, 20},   {23, 22},   {25, 24},    {-19, -72},  {-50, 26},
-        {-49, 27},  {-87, 28},  {30, 29},    {32, 31},    {-3, -35},
-        {34, 33},   {-56, 35},  {-65, -66},  {-40, 36},   {-82, -118},
-        {-71, 37},  {-55, 38},  {-67, -102}, {-51, 39},   {-70, 40},
-        {42, 41},   {-81, 43},  {-86, 44},   {-52, -97},  {-98, 45},
-        {-24, -39}, {-20, 46},  {-54, -83},  {-36, 47},   {-85, 48},
-        {-68, 49},  {-4, 50},   {-69, -113}, {-117, 51},  {-37, -101},
-        {-53, 52},  {-21, 53},  {55, 54},    {-84, -100}, {-5, 56},
-        {-116, 57}, {-22, 58},  {-38, -115}, {60, 59},    {-6, -99},
-        {-23, 61},  {-114, 62}, {-7, -8}},
-       {{2, 1},     {-154, 3},    {5, 4},      {-1, 6},      {8, 7},
-        {-17, 9},   {-138, 10},   {-18, 11},   {-2, 12},     {14, 13},
-        {16, 15},   {-153, 17},   {-34, 18},   {-33, -122},  {20, 19},
-        {22, 21},   {-137, 23},   {25, 24},    {27, 26},     {-106, 28},
-        {30, 29},   {-50, 31},    {-19, 32},   {-49, -121},  {34, 33},
-        {36, 35},   {-35, 37},    {-90, 38},   {-66, 39},    {-3, 40},
-        {42, 41},   {-65, 43},    {-105, 44},  {46, 45},     {-74, 47},
-        {-51, 48},  {-82, -152},  {-136, 49},  {-81, 50},    {-42, -89},
-        {-114, 51}, {53, 52},     {-57, -58},  {-120, 54},   {-98, 55},
-        {-67, 56},  {-97, 57},    {59, 58},    {-99, 60},    {-73, -104},
-        {-72, 61},  {-113, 62},   {-20, -83},  {-84, -130},  {-36, 63},
-        {-26, 64},  {-41, 65},    {-52, -129}, {-87, -88},   {67, 66},
-        {-115, 68}, {-68, 69},    {-56, -69},  {-4, -100},   {-151, 70},
-        {-135, 71}, {-103, -119}, {73, 72},    {-71, -145},  {-102, 74},
-        {76, 75},   {-53, -85},   {-37, 77},   {-21, -86},   {79, 78},
-        {-5, 80},   {-54, -134},  {-150, 81},  {-118, 82},   {-70, 83},
-        {-117, 84}, {-22, -38},   {-101, 85},  {-55, 86},    {-149, 87},
-        {-39, 88},  {-133, 89},   {-6, 90},    {-116, 91},   {-24, 92},
-        {-7, -132}, {-23, 93},    {-40, 94},   {-131, -148}, {-25, 95},
-        {-147, 96}, {-146, 97},   {-8, 0},     {0, 0}}},
+       {{2, 1},    {-86, 3},   {-1, 4},   {-17, 5},   {7, 6},     {-70, 8},  {-2, -18},
+        {10, 9},   {12, 11},   {-85, 13}, {-33, 14},  {-34, -54}, {16, 15},  {-69, 17},
+        {19, 18},  {-50, -53}, {-19, 20}, {-38, 21},  {-35, -49}, {-3, 22},  {24, 23},
+        {-68, 25}, {-84, 26},  {-65, 27}, {-51, -66}, {-22, -37}, {-52, 28}, {-20, 29},
+        {-36, 30}, {-81, 31},  {-4, -83}, {-67, 32},  {-21, 33},  {-5, 34},  {-6, -82}},
+       {{2, 1},      {-120, 3},   {-1, 4},   {6, 5},     {-17, 7},    {-104, 8},   {-18, 9},
+        {-2, 10},    {12, 11},    {14, 13},  {-119, 15}, {-33, 16},   {-34, -88},  {-103, 17},
+        {19, 18},    {21, 20},    {23, 22},  {25, 24},   {-19, -72},  {-50, 26},   {-49, 27},
+        {-87, 28},   {30, 29},    {32, 31},  {-3, -35},  {34, 33},    {-56, 35},   {-65, -66},
+        {-40, 36},   {-82, -118}, {-71, 37}, {-55, 38},  {-67, -102}, {-51, 39},   {-70, 40},
+        {42, 41},    {-81, 43},   {-86, 44}, {-52, -97}, {-98, 45},   {-24, -39},  {-20, 46},
+        {-54, -83},  {-36, 47},   {-85, 48}, {-68, 49},  {-4, 50},    {-69, -113}, {-117, 51},
+        {-37, -101}, {-53, 52},   {-21, 53}, {55, 54},   {-84, -100}, {-5, 56},    {-116, 57},
+        {-22, 58},   {-38, -115}, {60, 59},  {-6, -99},  {-23, 61},   {-114, 62},  {-7, -8}},
+       {{2, 1},       {-154, 3},   {5, 4},      {-1, 6},      {8, 7},      {-17, 9},
+        {-138, 10},   {-18, 11},   {-2, 12},    {14, 13},     {16, 15},    {-153, 17},
+        {-34, 18},    {-33, -122}, {20, 19},    {22, 21},     {-137, 23},  {25, 24},
+        {27, 26},     {-106, 28},  {30, 29},    {-50, 31},    {-19, 32},   {-49, -121},
+        {34, 33},     {36, 35},    {-35, 37},   {-90, 38},    {-66, 39},   {-3, 40},
+        {42, 41},     {-65, 43},   {-105, 44},  {46, 45},     {-74, 47},   {-51, 48},
+        {-82, -152},  {-136, 49},  {-81, 50},   {-42, -89},   {-114, 51},  {53, 52},
+        {-57, -58},   {-120, 54},  {-98, 55},   {-67, 56},    {-97, 57},   {59, 58},
+        {-99, 60},    {-73, -104}, {-72, 61},   {-113, 62},   {-20, -83},  {-84, -130},
+        {-36, 63},    {-26, 64},   {-41, 65},   {-52, -129},  {-87, -88},  {67, 66},
+        {-115, 68},   {-68, 69},   {-56, -69},  {-4, -100},   {-151, 70},  {-135, 71},
+        {-103, -119}, {73, 72},    {-71, -145}, {-102, 74},   {76, 75},    {-53, -85},
+        {-37, 77},    {-21, -86},  {79, 78},    {-5, 80},     {-54, -134}, {-150, 81},
+        {-118, 82},   {-70, 83},   {-117, 84},  {-22, -38},   {-101, 85},  {-55, 86},
+        {-149, 87},   {-39, 88},   {-133, 89},  {-6, 90},     {-116, 91},  {-24, 92},
+        {-7, -132},   {-23, 93},   {-40, 94},   {-131, -148}, {-25, 95},   {-147, 96},
+        {-146, 97},   {-8, 0},     {0, 0}}},
       {{{-1, 1},
         {-52, 2},
         {4, 3},
@@ -227,45 +202,37 @@
         {-20, 13},
         {-50, 14},
         {-4, -49}},
-       {{2, 1},    {-86, 3},   {5, 4},     {-1, 6},   {8, 7},    {-17, -18},
-        {-2, 9},   {-70, 10},  {-85, 11},  {13, 12},  {-69, 14}, {-34, 15},
-        {17, 16},  {-19, 18},  {-33, -35}, {-54, 19}, {-53, 20}, {-3, 21},
-        {-68, 22}, {-84, 23},  {-50, 24},  {-52, 25}, {-51, 26}, {-20, -36},
-        {-49, 27}, {-38, 28},  {-37, 29},  {-4, -83}, {-67, 30}, {-66, 31},
-        {-21, 32}, {-22, -65}, {-5, 33},   {-82, 34}, {-6, -81}},
-       {{2, 1},      {4, 3},     {-120, 5},  {7, 6},      {9, 8},
-        {-1, 10},    {-18, 11},  {-17, 12},  {-2, -104},  {-119, 13},
-        {15, 14},    {-103, 16}, {18, 17},   {-34, 19},   {-19, 20},
-        {22, 21},    {-35, 23},  {-33, 24},  {-88, 25},   {-87, 26},
-        {28, 27},    {-3, -102}, {-86, 29},  {-52, -118}, {31, 30},
-        {-50, 32},   {-51, 33},  {-70, 34},  {-36, 35},   {-85, 36},
-        {-20, 37},   {39, 38},   {-69, -71}, {-72, 40},   {-49, -67},
-        {42, 41},    {-68, 43},  {-4, -101}, {-53, -117}, {-37, 44},
-        {-66, 45},   {-55, 46},  {48, 47},   {-54, 49},   {-21, 50},
-        {-84, -100}, {-56, -65}, {52, 51},   {-82, -83},  {54, 53},
-        {-5, -116},  {-22, 55},  {-38, 56},  {-39, -40},  {58, 57},
-        {-81, -115}, {-98, -99}, {-6, 59},   {-23, 60},   {-24, 61},
-        {-7, -97},   {-114, 62}, {-8, -113}},
-       {{2, 1},       {4, 3},      {-154, 5},    {7, 6},      {9, 8},
-        {11, 10},     {-1, 12},    {-18, 13},    {-17, 14},   {-2, -138},
-        {16, 15},     {-153, 17},  {-137, 18},   {20, 19},    {22, 21},
-        {-34, 23},    {-19, 24},   {-35, 25},    {27, 26},    {29, 28},
-        {-121, 30},   {-120, 31},  {-136, 32},   {-33, -122}, {34, 33},
-        {-152, 35},   {-3, 36},    {-51, 37},    {-52, 38},   {-69, 39},
-        {-36, 40},    {-50, 41},   {43, 42},     {-20, 44},   {-104, 45},
-        {-103, 46},   {-87, 47},   {-119, 48},   {-105, 49},  {-86, 50},
-        {-102, 51},   {-106, 52},  {-49, -135},  {-68, 53},   {55, 54},
-        {-53, 56},    {-67, -151}, {-4, 57},     {-84, 58},   {-85, 59},
-        {-66, 60},    {-37, 61},   {-70, 62},    {-54, -88},  {-21, 63},
-        {65, 64},     {-89, 66},   {-118, 67},   {-72, 68},   {-90, 69},
-        {-71, 70},    {-65, -134}, {-150, 71},   {-83, 72},   {-5, 73},
-        {-101, -117}, {-82, 74},   {76, 75},     {-99, 77},   {-38, 78},
-        {-100, 79},   {-22, 80},   {-73, 81},    {-39, -74},  {83, 82},
-        {-55, -81},   {-57, 84},   {-133, -149}, {-56, 85},   {-6, 86},
-        {-98, 87},    {-132, 88},  {-23, 89},    {-114, 90},  {-116, 91},
-        {-58, -115},  {-24, 92},   {-97, -148},  {-40, -41},  {-7, -42},
-        {-147, 93},   {95, 94},    {-131, 96},   {-8, -130},  {-25, -113},
-        {-9, 97},     {-26, -129}, {-146, 98},   {-10, -145}}}},
+       {{2, 1},     {-86, 3},  {5, 4},     {-1, 6},    {8, 7},    {-17, -18}, {-2, 9},
+        {-70, 10},  {-85, 11}, {13, 12},   {-69, 14},  {-34, 15}, {17, 16},   {-19, 18},
+        {-33, -35}, {-54, 19}, {-53, 20},  {-3, 21},   {-68, 22}, {-84, 23},  {-50, 24},
+        {-52, 25},  {-51, 26}, {-20, -36}, {-49, 27},  {-38, 28}, {-37, 29},  {-4, -83},
+        {-67, 30},  {-66, 31}, {-21, 32},  {-22, -65}, {-5, 33},  {-82, 34},  {-6, -81}},
+       {{2, 1},     {4, 3},     {-120, 5},   {7, 6},      {9, 8},     {-1, 10},   {-18, 11},
+        {-17, 12},  {-2, -104}, {-119, 13},  {15, 14},    {-103, 16}, {18, 17},   {-34, 19},
+        {-19, 20},  {22, 21},   {-35, 23},   {-33, 24},   {-88, 25},  {-87, 26},  {28, 27},
+        {-3, -102}, {-86, 29},  {-52, -118}, {31, 30},    {-50, 32},  {-51, 33},  {-70, 34},
+        {-36, 35},  {-85, 36},  {-20, 37},   {39, 38},    {-69, -71}, {-72, 40},  {-49, -67},
+        {42, 41},   {-68, 43},  {-4, -101},  {-53, -117}, {-37, 44},  {-66, 45},  {-55, 46},
+        {48, 47},   {-54, 49},  {-21, 50},   {-84, -100}, {-56, -65}, {52, 51},   {-82, -83},
+        {54, 53},   {-5, -116}, {-22, 55},   {-38, 56},   {-39, -40}, {58, 57},   {-81, -115},
+        {-98, -99}, {-6, 59},   {-23, 60},   {-24, 61},   {-7, -97},  {-114, 62}, {-8, -113}},
+       {{2, 1},      {4, 3},      {-154, 5},  {7, 6},      {9, 8},      {11, 10},
+        {-1, 12},    {-18, 13},   {-17, 14},  {-2, -138},  {16, 15},    {-153, 17},
+        {-137, 18},  {20, 19},    {22, 21},   {-34, 23},   {-19, 24},   {-35, 25},
+        {27, 26},    {29, 28},    {-121, 30}, {-120, 31},  {-136, 32},  {-33, -122},
+        {34, 33},    {-152, 35},  {-3, 36},   {-51, 37},   {-52, 38},   {-69, 39},
+        {-36, 40},   {-50, 41},   {43, 42},   {-20, 44},   {-104, 45},  {-103, 46},
+        {-87, 47},   {-119, 48},  {-105, 49}, {-86, 50},   {-102, 51},  {-106, 52},
+        {-49, -135}, {-68, 53},   {55, 54},   {-53, 56},   {-67, -151}, {-4, 57},
+        {-84, 58},   {-85, 59},   {-66, 60},  {-37, 61},   {-70, 62},   {-54, -88},
+        {-21, 63},   {65, 64},    {-89, 66},  {-118, 67},  {-72, 68},   {-90, 69},
+        {-71, 70},   {-65, -134}, {-150, 71}, {-83, 72},   {-5, 73},    {-101, -117},
+        {-82, 74},   {76, 75},    {-99, 77},  {-38, 78},   {-100, 79},  {-22, 80},
+        {-73, 81},   {-39, -74},  {83, 82},   {-55, -81},  {-57, 84},   {-133, -149},
+        {-56, 85},   {-6, 86},    {-98, 87},  {-132, 88},  {-23, 89},   {-114, 90},
+        {-116, 91},  {-58, -115}, {-24, 92},  {-97, -148}, {-40, -41},  {-7, -42},
+        {-147, 93},  {95, 94},    {-131, 96}, {-8, -130},  {-25, -113}, {-9, 97},
+        {-26, -129}, {-146, 98},  {-10, -145}}}},
      {{{{-1, 1},
         {-52, 2},
         {-17, 3},
@@ -281,45 +248,37 @@
         {-19, 13},
         {-3, 14},
         {-4, -50}},
-       {{2, 1},    {4, 3},     {-86, 5},  {-1, 6},   {-17, 7},   {-70, 8},
-        {10, 9},   {-18, 11},  {-33, 12}, {-54, 13}, {-2, 14},   {-34, 15},
-        {-38, 16}, {-49, 17},  {-85, 18}, {-50, 19}, {-69, 20},  {-53, -65},
-        {-22, 21}, {-66, 22},  {-19, 23}, {-37, 24}, {-35, -81}, {-3, 25},
-        {-51, 26}, {-68, -84}, {-52, 27}, {29, 28},  {-20, 30},  {-4, -36},
-        {-83, 31}, {-67, 32},  {-21, 33}, {-5, 34},  {-6, -82}},
-       {{2, 1},      {4, 3},     {6, 5},       {-120, 7},  {-17, 8},
-        {-1, -104},  {10, 9},    {12, 11},     {-18, 13},  {-33, -88},
-        {15, 14},    {17, 16},   {-2, 18},     {-34, 19},  {-72, 20},
-        {-49, 21},   {-119, 22}, {-50, 23},    {-103, 24}, {-56, 25},
-        {-65, 26},   {28, 27},   {-40, -87},   {-66, 29},  {-82, 30},
-        {32, 31},    {-19, -81}, {-71, 33},    {-97, 34},  {-35, -55},
-        {-24, 35},   {37, 36},   {-3, -98},    {-51, 38},  {-67, 39},
-        {-39, -118}, {-113, 40}, {-102, 41},   {-86, 42},  {-70, -83},
-        {44, 43},    {-20, -54}, {-52, 45},    {-36, 46},  {-4, 47},
-        {-68, 48},   {-85, 49},  {-101, -117}, {-69, 50},  {52, 51},
-        {-21, -37},  {-53, 53},  {55, 54},     {-5, -100}, {-116, 56},
-        {-84, 57},   {-38, 58},  {-22, -99},   {-115, 59}, {-6, 60},
-        {-23, 61},   {-7, 62},   {-114, 0}},
-       {{2, 1},      {4, 3},       {6, 5},       {-154, 7},    {9, 8},
-        {-17, 10},   {-138, 11},   {-1, 12},     {14, 13},     {16, 15},
-        {-33, -122}, {-18, 17},    {19, 18},     {-34, 20},    {-2, 21},
-        {-106, 22},  {-49, 23},    {25, 24},     {-50, 26},    {-153, 27},
-        {-90, 28},   {-137, 29},   {-65, 30},    {32, 31},     {-66, 33},
-        {-121, 34},  {-74, 35},    {-81, 36},    {38, 37},     {-42, 39},
-        {-82, 40},   {-105, 41},   {-19, -114},  {-58, 42},    {-35, 43},
-        {-97, 44},   {46, 45},     {-129, 47},   {-26, -89},   {-57, -98},
-        {-51, 48},   {-3, 49},     {-113, 50},   {-130, 51},   {-152, 52},
-        {-67, -73},  {-99, -136},  {-145, 53},   {-120, 54},   {-41, 55},
-        {-83, 56},   {-72, 57},    {-104, 58},   {-115, 59},   {-20, 60},
-        {62, 61},    {-36, -88},   {-84, 63},    {-52, -56},   {65, 64},
-        {-4, -87},   {-68, 66},    {-151, 67},   {-100, -135}, {69, 68},
-        {-69, -119}, {-103, 70},   {-71, 71},    {73, 72},     {-21, 74},
-        {-85, 75},   {-37, -53},   {-86, 76},    {78, 77},     {-102, -150},
-        {-5, 79},    {-134, 80},   {-118, 81},   {-54, -117},  {83, 82},
-        {-38, -70},  {-22, 84},    {-6, 85},     {87, 86},     {-55, 88},
-        {-101, 89},  {-133, -149}, {-24, -39},   {91, 90},     {-132, 92},
-        {-23, 93},   {-7, 94},     {-147, -148}, {-116, -131}, {-25, 95},
-        {-40, 0},    {0, 0},       {0, 0},       {0, 0}}},
+       {{2, 1},    {4, 3},     {-86, 5},  {-1, 6},    {-17, 7},   {-70, 8},  {10, 9},
+        {-18, 11}, {-33, 12},  {-54, 13}, {-2, 14},   {-34, 15},  {-38, 16}, {-49, 17},
+        {-85, 18}, {-50, 19},  {-69, 20}, {-53, -65}, {-22, 21},  {-66, 22}, {-19, 23},
+        {-37, 24}, {-35, -81}, {-3, 25},  {-51, 26},  {-68, -84}, {-52, 27}, {29, 28},
+        {-20, 30}, {-4, -36},  {-83, 31}, {-67, 32},  {-21, 33},  {-5, 34},  {-6, -82}},
+       {{2, 1},      {4, 3},     {6, 5},     {-120, 7}, {-17, 8},   {-1, -104},   {10, 9},
+        {12, 11},    {-18, 13},  {-33, -88}, {15, 14},  {17, 16},   {-2, 18},     {-34, 19},
+        {-72, 20},   {-49, 21},  {-119, 22}, {-50, 23}, {-103, 24}, {-56, 25},    {-65, 26},
+        {28, 27},    {-40, -87}, {-66, 29},  {-82, 30}, {32, 31},   {-19, -81},   {-71, 33},
+        {-97, 34},   {-35, -55}, {-24, 35},  {37, 36},  {-3, -98},  {-51, 38},    {-67, 39},
+        {-39, -118}, {-113, 40}, {-102, 41}, {-86, 42}, {-70, -83}, {44, 43},     {-20, -54},
+        {-52, 45},   {-36, 46},  {-4, 47},   {-68, 48}, {-85, 49},  {-101, -117}, {-69, 50},
+        {52, 51},    {-21, -37}, {-53, 53},  {55, 54},  {-5, -100}, {-116, 56},   {-84, 57},
+        {-38, 58},   {-22, -99}, {-115, 59}, {-6, 60},  {-23, 61},  {-7, 62},     {-114, 0}},
+       {{2, 1},      {4, 3},     {6, 5},       {-154, 7},    {9, 8},      {-17, 10},
+        {-138, 11},  {-1, 12},   {14, 13},     {16, 15},     {-33, -122}, {-18, 17},
+        {19, 18},    {-34, 20},  {-2, 21},     {-106, 22},   {-49, 23},   {25, 24},
+        {-50, 26},   {-153, 27}, {-90, 28},    {-137, 29},   {-65, 30},   {32, 31},
+        {-66, 33},   {-121, 34}, {-74, 35},    {-81, 36},    {38, 37},    {-42, 39},
+        {-82, 40},   {-105, 41}, {-19, -114},  {-58, 42},    {-35, 43},   {-97, 44},
+        {46, 45},    {-129, 47}, {-26, -89},   {-57, -98},   {-51, 48},   {-3, 49},
+        {-113, 50},  {-130, 51}, {-152, 52},   {-67, -73},   {-99, -136}, {-145, 53},
+        {-120, 54},  {-41, 55},  {-83, 56},    {-72, 57},    {-104, 58},  {-115, 59},
+        {-20, 60},   {62, 61},   {-36, -88},   {-84, 63},    {-52, -56},  {65, 64},
+        {-4, -87},   {-68, 66},  {-151, 67},   {-100, -135}, {69, 68},    {-69, -119},
+        {-103, 70},  {-71, 71},  {73, 72},     {-21, 74},    {-85, 75},   {-37, -53},
+        {-86, 76},   {78, 77},   {-102, -150}, {-5, 79},     {-134, 80},  {-118, 81},
+        {-54, -117}, {83, 82},   {-38, -70},   {-22, 84},    {-6, 85},    {87, 86},
+        {-55, 88},   {-101, 89}, {-133, -149}, {-24, -39},   {91, 90},    {-132, 92},
+        {-23, 93},   {-7, 94},   {-147, -148}, {-116, -131}, {-25, 95},   {-40, 0},
+        {0, 0},      {0, 0},     {0, 0}}},
       {{{-1, 1},
         {-52, 2},
         {-17, 3},
@@ -335,45 +294,37 @@
         {-19, 13},
         {-3, 14},
         {-4, -50}},
-       {{2, 1},    {4, 3},     {-86, 5},  {-1, 6},   {-17, 7},   {-70, 8},
-        {10, 9},   {-18, 11},  {-33, 12}, {-54, 13}, {-2, 14},   {-34, 15},
-        {-38, 16}, {-49, 17},  {-85, 18}, {-50, 19}, {-69, 20},  {-53, -65},
-        {-22, 21}, {-66, 22},  {-19, 23}, {-37, 24}, {-35, -81}, {-3, 25},
-        {-51, 26}, {-68, -84}, {-52, 27}, {29, 28},  {-20, 30},  {-4, -36},
-        {-83, 31}, {-67, 32},  {-21, 33}, {-5, 34},  {-6, -82}},
-       {{2, 1},      {4, 3},     {6, 5},       {-120, 7},  {-17, 8},
-        {-1, -104},  {10, 9},    {12, 11},     {-18, 13},  {-33, -88},
-        {15, 14},    {17, 16},   {-2, 18},     {-34, 19},  {-72, 20},
-        {-49, 21},   {-119, 22}, {-50, 23},    {-103, 24}, {-56, 25},
-        {-65, 26},   {28, 27},   {-40, -87},   {-66, 29},  {-82, 30},
-        {32, 31},    {-19, -81}, {-71, 33},    {-97, 34},  {-35, -55},
-        {-24, 35},   {37, 36},   {-3, -98},    {-51, 38},  {-67, 39},
-        {-39, -118}, {-113, 40}, {-102, 41},   {-86, 42},  {-70, -83},
-        {44, 43},    {-20, -54}, {-52, 45},    {-36, 46},  {-4, 47},
-        {-68, 48},   {-85, 49},  {-101, -117}, {-69, 50},  {52, 51},
-        {-21, -37},  {-53, 53},  {55, 54},     {-5, -100}, {-116, 56},
-        {-84, 57},   {-38, 58},  {-22, -99},   {-115, 59}, {-6, 60},
-        {-23, 61},   {-7, 62},   {-114, 0}},
-       {{2, 1},      {4, 3},       {6, 5},       {-154, 7},    {9, 8},
-        {-17, 10},   {-138, 11},   {-1, 12},     {14, 13},     {16, 15},
-        {-33, -122}, {-18, 17},    {19, 18},     {-34, 20},    {-2, 21},
-        {-106, 22},  {-49, 23},    {25, 24},     {-50, 26},    {-153, 27},
-        {-90, 28},   {-137, 29},   {-65, 30},    {32, 31},     {-66, 33},
-        {-121, 34},  {-74, 35},    {-81, 36},    {38, 37},     {-42, 39},
-        {-82, 40},   {-105, 41},   {-19, -114},  {-58, 42},    {-35, 43},
-        {-97, 44},   {46, 45},     {-129, 47},   {-26, -89},   {-57, -98},
-        {-51, 48},   {-3, 49},     {-113, 50},   {-130, 51},   {-152, 52},
-        {-67, -73},  {-99, -136},  {-145, 53},   {-120, 54},   {-41, 55},
-        {-83, 56},   {-72, 57},    {-104, 58},   {-115, 59},   {-20, 60},
-        {62, 61},    {-36, -88},   {-84, 63},    {-52, -56},   {65, 64},
-        {-4, -87},   {-68, 66},    {-151, 67},   {-100, -135}, {69, 68},
-        {-69, -119}, {-103, 70},   {-71, 71},    {73, 72},     {-21, 74},
-        {-85, 75},   {-37, -53},   {-86, 76},    {78, 77},     {-102, -150},
-        {-5, 79},    {-134, 80},   {-118, 81},   {-54, -117},  {83, 82},
-        {-38, -70},  {-22, 84},    {-6, 85},     {87, 86},     {-55, 88},
-        {-101, 89},  {-133, -149}, {-24, -39},   {91, 90},     {-132, 92},
-        {-23, 93},   {-7, 94},     {-147, -148}, {-116, -131}, {-25, 95},
-        {-40, 0},    {0, 0},       {0, 0},       {0, 0}}}}}};
+       {{2, 1},    {4, 3},     {-86, 5},  {-1, 6},    {-17, 7},   {-70, 8},  {10, 9},
+        {-18, 11}, {-33, 12},  {-54, 13}, {-2, 14},   {-34, 15},  {-38, 16}, {-49, 17},
+        {-85, 18}, {-50, 19},  {-69, 20}, {-53, -65}, {-22, 21},  {-66, 22}, {-19, 23},
+        {-37, 24}, {-35, -81}, {-3, 25},  {-51, 26},  {-68, -84}, {-52, 27}, {29, 28},
+        {-20, 30}, {-4, -36},  {-83, 31}, {-67, 32},  {-21, 33},  {-5, 34},  {-6, -82}},
+       {{2, 1},      {4, 3},     {6, 5},     {-120, 7}, {-17, 8},   {-1, -104},   {10, 9},
+        {12, 11},    {-18, 13},  {-33, -88}, {15, 14},  {17, 16},   {-2, 18},     {-34, 19},
+        {-72, 20},   {-49, 21},  {-119, 22}, {-50, 23}, {-103, 24}, {-56, 25},    {-65, 26},
+        {28, 27},    {-40, -87}, {-66, 29},  {-82, 30}, {32, 31},   {-19, -81},   {-71, 33},
+        {-97, 34},   {-35, -55}, {-24, 35},  {37, 36},  {-3, -98},  {-51, 38},    {-67, 39},
+        {-39, -118}, {-113, 40}, {-102, 41}, {-86, 42}, {-70, -83}, {44, 43},     {-20, -54},
+        {-52, 45},   {-36, 46},  {-4, 47},   {-68, 48}, {-85, 49},  {-101, -117}, {-69, 50},
+        {52, 51},    {-21, -37}, {-53, 53},  {55, 54},  {-5, -100}, {-116, 56},   {-84, 57},
+        {-38, 58},   {-22, -99}, {-115, 59}, {-6, 60},  {-23, 61},  {-7, 62},     {-114, 0}},
+       {{2, 1},      {4, 3},     {6, 5},       {-154, 7},    {9, 8},      {-17, 10},
+        {-138, 11},  {-1, 12},   {14, 13},     {16, 15},     {-33, -122}, {-18, 17},
+        {19, 18},    {-34, 20},  {-2, 21},     {-106, 22},   {-49, 23},   {25, 24},
+        {-50, 26},   {-153, 27}, {-90, 28},    {-137, 29},   {-65, 30},   {32, 31},
+        {-66, 33},   {-121, 34}, {-74, 35},    {-81, 36},    {38, 37},    {-42, 39},
+        {-82, 40},   {-105, 41}, {-19, -114},  {-58, 42},    {-35, 43},   {-97, 44},
+        {46, 45},    {-129, 47}, {-26, -89},   {-57, -98},   {-51, 48},   {-3, 49},
+        {-113, 50},  {-130, 51}, {-152, 52},   {-67, -73},   {-99, -136}, {-145, 53},
+        {-120, 54},  {-41, 55},  {-83, 56},    {-72, 57},    {-104, 58},  {-115, 59},
+        {-20, 60},   {62, 61},   {-36, -88},   {-84, 63},    {-52, -56},  {65, 64},
+        {-4, -87},   {-68, 66},  {-151, 67},   {-100, -135}, {69, 68},    {-69, -119},
+        {-103, 70},  {-71, 71},  {73, 72},     {-21, 74},    {-85, 75},   {-37, -53},
+        {-86, 76},   {78, 77},   {-102, -150}, {-5, 79},     {-134, 80},  {-118, 81},
+        {-54, -117}, {83, 82},   {-38, -70},   {-22, 84},    {-6, 85},    {87, 86},
+        {-55, 88},   {-101, 89}, {-133, -149}, {-24, -39},   {91, 90},    {-132, 92},
+        {-23, 93},   {-7, 94},   {-147, -148}, {-116, -131}, {-25, 95},   {-40, 0},
+        {0, 0},      {0, 0},     {0, 0}}}}}};
 
 const ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes = {
     {{{{-1, 1}, {-2, 2}, {-3, 3}, {-4, 4}, {-5, 5}, {-6, 6}, {-7, -8}}},
@@ -395,23 +346,20 @@
         {-34, 13},
         {-33, 14},
         {-20, -49}},
-       {{2, 1},     {-86, 3},  {-1, 4},   {6, 5},     {-2, 7},    {-85, 8},
-        {-18, 9},   {11, 10},  {-17, 12}, {14, 13},   {-70, 15},  {-3, -19},
-        {-69, 16},  {-84, 17}, {-68, 18}, {-20, -35}, {-34, -83}, {20, 19},
-        {-4, 21},   {-33, 22}, {-5, 23},  {-53, 24},  {-36, -52}, {-67, 25},
-        {-21, -82}, {-54, 26}, {-6, 27},  {-51, 28},  {-50, 29},  {-49, 30},
-        {-37, 31},  {-38, 0},  {0, 0},    {0, 0},     {0, 0}},
-       {{2, 1},     {4, 3},     {-1, -120}, {6, 5},      {8, 7},     {-18, 9},
-        {-2, 10},   {12, 11},   {14, 13},   {-17, -119}, {16, 15},   {-103, 17},
-        {-104, 18}, {-52, 19},  {21, 20},   {-69, 22},   {24, 23},   {-3, -35},
-        {-19, 25},  {-34, -85}, {27, 26},   {-86, 28},   {-118, 29}, {-37, 30},
-        {32, 31},   {-102, 33}, {-20, -22}, {-4, -117},  {-87, 34},  {-100, 35},
-        {-33, -36}, {37, 36},   {-70, -88}, {-101, 38},  {-5, 39},   {-51, -53},
-        {-50, 40},  {-115, 41}, {-21, 42},  {-116, 43},  {-38, 44},  {-23, -84},
-        {-49, -99}, {46, 45},   {-6, -114}, {-7, -72},   {-71, 47},  {-8, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0}}},
+       {{2, 1},    {-86, 3},   {-1, 4},    {6, 5},     {-2, 7},   {-85, 8},  {-18, 9},
+        {11, 10},  {-17, 12},  {14, 13},   {-70, 15},  {-3, -19}, {-69, 16}, {-84, 17},
+        {-68, 18}, {-20, -35}, {-34, -83}, {20, 19},   {-4, 21},  {-33, 22}, {-5, 23},
+        {-53, 24}, {-36, -52}, {-67, 25},  {-21, -82}, {-54, 26}, {-6, 27},  {-51, 28},
+        {-50, 29}, {-49, 30},  {-37, 31},  {-38, 0},   {0, 0},    {0, 0},    {0, 0}},
+       {{2, 1},     {4, 3},     {-1, -120},  {6, 5},    {8, 7},     {-18, 9},   {-2, 10},
+        {12, 11},   {14, 13},   {-17, -119}, {16, 15},  {-103, 17}, {-104, 18}, {-52, 19},
+        {21, 20},   {-69, 22},  {24, 23},    {-3, -35}, {-19, 25},  {-34, -85}, {27, 26},
+        {-86, 28},  {-118, 29}, {-37, 30},   {32, 31},  {-102, 33}, {-20, -22}, {-4, -117},
+        {-87, 34},  {-100, 35}, {-33, -36},  {37, 36},  {-70, -88}, {-101, 38}, {-5, 39},
+        {-51, -53}, {-50, 40},  {-115, 41},  {-21, 42}, {-116, 43}, {-38, 44},  {-23, -84},
+        {-49, -99}, {46, 45},   {-6, -114},  {-7, -72}, {-71, 47},  {-8, 0},    {0, 0},
+        {0, 0},     {0, 0},     {0, 0},      {0, 0},    {0, 0},     {0, 0},     {0, 0},
+        {0, 0},     {0, 0},     {0, 0},      {0, 0},    {0, 0},     {0, 0},     {0, 0}}},
       {{{-1, 1}, {-18, 2}, {-2, -17}},
        {{2, 1},
         {-1, -52},
@@ -428,25 +376,20 @@
         {-19, 13},
         {-3, 14},
         {-4, -50}},
-       {{2, 1},     {-86, 3},   {-1, 4},   {-17, 5},   {7, 6},    {-70, 8},
-        {-33, 9},   {-18, 10},  {-2, 11},  {-54, 12},  {-49, 13}, {-38, 14},
-        {-34, -65}, {-85, 15},  {-50, 16}, {-69, 17},  {-22, 18}, {-53, 19},
-        {21, 20},   {-19, -81}, {-66, 22}, {-3, -35},  {24, 23},  {-37, 25},
-        {-68, -84}, {-51, 26},  {28, 27},  {-20, -52}, {30, 29},  {-4, -36},
-        {-83, 31},  {-67, 32},  {-82, 33}, {-21, 34},  {-5, -6}},
-       {{2, 1},     {-1, 3},     {-120, 4},   {-17, 5},   {7, 6},
-        {-104, 8},  {-33, 9},    {11, 10},    {13, 12},   {-49, 14},
-        {-88, 15},  {-18, -97},  {-65, 16},   {-40, 17},  {-2, -72},
-        {19, 18},   {-113, 20},  {-34, 21},   {-56, -81}, {23, 22},
-        {-50, 24},  {-82, -119}, {-24, -103}, {26, 25},   {28, 27},
-        {30, 29},   {-55, -87},  {-66, 31},   {33, 32},   {-98, 34},
-        {-35, -67}, {-19, 35},   {-70, 36},   {-71, 37},  {-51, -52},
-        {-3, 38},   {40, 39},    {-86, -118}, {42, 41},   {-39, -69},
-        {-54, -83}, {44, 43},    {-102, 45},  {-101, 46}, {-68, -85},
-        {-36, -53}, {-5, 0},     {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0}}}},
+       {{2, 1},    {-86, 3},  {-1, 4},   {-17, 5},   {7, 6},    {-70, 8},   {-33, 9},
+        {-18, 10}, {-2, 11},  {-54, 12}, {-49, 13},  {-38, 14}, {-34, -65}, {-85, 15},
+        {-50, 16}, {-69, 17}, {-22, 18}, {-53, 19},  {21, 20},  {-19, -81}, {-66, 22},
+        {-3, -35}, {24, 23},  {-37, 25}, {-68, -84}, {-51, 26}, {28, 27},   {-20, -52},
+        {30, 29},  {-4, -36}, {-83, 31}, {-67, 32},  {-82, 33}, {-21, 34},  {-5, -6}},
+       {{2, 1},      {-1, 3},     {-120, 4},   {-17, 5},   {7, 6},     {-104, 8},  {-33, 9},
+        {11, 10},    {13, 12},    {-49, 14},   {-88, 15},  {-18, -97}, {-65, 16},  {-40, 17},
+        {-2, -72},   {19, 18},    {-113, 20},  {-34, 21},  {-56, -81}, {23, 22},   {-50, 24},
+        {-82, -119}, {-24, -103}, {26, 25},    {28, 27},   {30, 29},   {-55, -87}, {-66, 31},
+        {33, 32},    {-98, 34},   {-35, -67},  {-19, 35},  {-70, 36},  {-71, 37},  {-51, -52},
+        {-3, 38},    {40, 39},    {-86, -118}, {42, 41},   {-39, -69}, {-54, -83}, {44, 43},
+        {-102, 45},  {-101, 46},  {-68, -85},  {-36, -53}, {-5, 0},    {0, 0},     {0, 0},
+        {0, 0},      {0, 0},      {0, 0},      {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},      {0, 0},      {0, 0},      {0, 0},     {0, 0},     {0, 0},     {0, 0}}}},
      {{{{-1, 1}, {-18, 2}, {-2, -17}},
        {{-52, 1},
         {-1, 2},
@@ -463,25 +406,20 @@
         {-3, 13},
         {-49, 14},
         {-4, -50}},
-       {{-1, 1},    {-86, 2},  {4, 3},     {-17, 5},  {-2, 6},    {-18, 7},
-        {-70, 8},   {-85, 9},  {11, 10},   {13, 12},  {-33, 14},  {16, 15},
-        {-34, -54}, {-69, 17}, {-38, 18},  {-50, 19}, {-35, -53}, {-49, 20},
-        {-19, 21},  {-3, 22},  {-65, 23},  {-68, 24}, {-22, 25},  {-81, -84},
-        {-66, 26},  {-37, 27}, {-20, -51}, {29, 28},  {-52, 30},  {-4, -83},
-        {-36, 31},  {-67, 32}, {-5, 33},   {-82, 34}, {-21, 0}},
-       {{-1, 1},   {-120, 2},   {4, 3},     {-17, 5},   {-2, 6},
-        {8, 7},    {-18, 9},    {-104, 10}, {12, 11},   {14, 13},
-        {16, 15},  {-119, 17},  {-81, 18},  {20, 19},   {-33, 21},
-        {-88, 22}, {-103, 23},  {-34, 24},  {-56, 25},  {-72, 26},
-        {-49, 27}, {-82, 28},   {-50, 29},  {-65, 30},  {-55, -87},
-        {-19, 31}, {-67, 32},   {-35, -40}, {34, 33},   {-52, -71},
-        {-66, 35}, {-70, 36},   {38, 37},   {-51, -97}, {-86, -102},
-        {-3, 39},  {-118, 40},  {42, 41},   {-24, -85}, {-54, 43},
-        {-39, 44}, {-98, -113}, {-36, -37}, {-20, -69}, {-4, 45},
-        {-5, 46},  {-21, 0},    {0, 0},     {0, 0},     {0, 0},
-        {0, 0},    {0, 0},      {0, 0},     {0, 0},     {0, 0},
-        {0, 0},    {0, 0},      {0, 0},     {0, 0},     {0, 0},
-        {0, 0},    {0, 0},      {0, 0}}},
+       {{-1, 1},   {-86, 2},  {4, 3},     {-17, 5},  {-2, 6},   {-18, 7},   {-70, 8},
+        {-85, 9},  {11, 10},  {13, 12},   {-33, 14}, {16, 15},  {-34, -54}, {-69, 17},
+        {-38, 18}, {-50, 19}, {-35, -53}, {-49, 20}, {-19, 21}, {-3, 22},   {-65, 23},
+        {-68, 24}, {-22, 25}, {-81, -84}, {-66, 26}, {-37, 27}, {-20, -51}, {29, 28},
+        {-52, 30}, {-4, -83}, {-36, 31},  {-67, 32}, {-5, 33},  {-82, 34},  {-21, 0}},
+       {{-1, 1},    {-120, 2},  {4, 3},     {-17, 5},   {-2, 6},    {8, 7},     {-18, 9},
+        {-104, 10}, {12, 11},   {14, 13},   {16, 15},   {-119, 17}, {-81, 18},  {20, 19},
+        {-33, 21},  {-88, 22},  {-103, 23}, {-34, 24},  {-56, 25},  {-72, 26},  {-49, 27},
+        {-82, 28},  {-50, 29},  {-65, 30},  {-55, -87}, {-19, 31},  {-67, 32},  {-35, -40},
+        {34, 33},   {-52, -71}, {-66, 35},  {-70, 36},  {38, 37},   {-51, -97}, {-86, -102},
+        {-3, 39},   {-118, 40}, {42, 41},   {-24, -85}, {-54, 43},  {-39, 44},  {-98, -113},
+        {-36, -37}, {-20, -69}, {-4, 45},   {-5, 46},   {-21, 0},   {0, 0},     {0, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0}}},
       {{{-1, 1}, {-18, 2}, {-2, -17}},
        {{-52, 1},
         {-1, 2},
@@ -498,23 +436,20 @@
         {-50, 13},
         {-20, 14},
         {-4, -49}},
-       {{2, 1},    {-86, 3},   {-1, 4},    {6, 5},     {-18, 7},  {-2, -17},
-        {9, 8},    {-70, 10},  {-69, -85}, {-35, 11},  {13, 12},  {-34, 14},
-        {-19, 15}, {-53, 16},  {-68, 17},  {-33, 18},  {-3, -52}, {20, 19},
-        {-54, 21}, {-84, 22},  {-50, 23},  {-20, -51}, {-36, 24}, {26, 25},
-        {-83, 27}, {-4, -38},  {-49, 28},  {-37, 29},  {-67, 30}, {-5, 31},
-        {-21, 32}, {-65, -66}, {-82, 33},  {-22, 34},  {-6, -81}},
-       {{2, 1},     {-1, -120}, {4, 3},     {6, 5},     {-18, 7},    {9, 8},
-        {-17, 10},  {-2, 11},   {-103, 12}, {-52, 13},  {-35, -104}, {-119, 14},
-        {16, 15},   {-69, -86}, {18, 17},   {-34, 19},  {-19, 20},   {22, 21},
-        {-70, 23},  {-87, 24},  {-102, 25}, {-85, 26},  {-33, 27},   {-36, 28},
-        {-3, 29},   {-88, 30},  {-51, 31},  {-118, 32}, {34, 33},    {-68, 35},
-        {-53, 36},  {-67, 37},  {-20, 38},  {-101, 39}, {-50, 40},   {42, 41},
-        {-37, 43},  {-116, 44}, {-117, 45}, {-49, 46},  {-21, -100}, {48, 47},
-        {-55, -71}, {-4, 49},   {-22, -84}, {-115, 50}, {-66, -82},  {-72, 51},
-        {-5, -6},   {-54, 52},  {-38, 53},  {-83, 54},  {-40, 55},   {-39, 56},
-        {-99, 57},  {-23, -56}, {-7, 58},   {-65, -97}, {-8, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0}}}},
+       {{2, 1},     {-86, 3},   {-1, 4},   {6, 5},     {-18, 7},  {-2, -17}, {9, 8},
+        {-70, 10},  {-69, -85}, {-35, 11}, {13, 12},   {-34, 14}, {-19, 15}, {-53, 16},
+        {-68, 17},  {-33, 18},  {-3, -52}, {20, 19},   {-54, 21}, {-84, 22}, {-50, 23},
+        {-20, -51}, {-36, 24},  {26, 25},  {-83, 27},  {-4, -38}, {-49, 28}, {-37, 29},
+        {-67, 30},  {-5, 31},   {-21, 32}, {-65, -66}, {-82, 33}, {-22, 34}, {-6, -81}},
+       {{2, 1},     {-1, -120}, {4, 3},     {6, 5},      {-18, 7},   {9, 8},      {-17, 10},
+        {-2, 11},   {-103, 12}, {-52, 13},  {-35, -104}, {-119, 14}, {16, 15},    {-69, -86},
+        {18, 17},   {-34, 19},  {-19, 20},  {22, 21},    {-70, 23},  {-87, 24},   {-102, 25},
+        {-85, 26},  {-33, 27},  {-36, 28},  {-3, 29},    {-88, 30},  {-51, 31},   {-118, 32},
+        {34, 33},   {-68, 35},  {-53, 36},  {-67, 37},   {-20, 38},  {-101, 39},  {-50, 40},
+        {42, 41},   {-37, 43},  {-116, 44}, {-117, 45},  {-49, 46},  {-21, -100}, {48, 47},
+        {-55, -71}, {-4, 49},   {-22, -84}, {-115, 50},  {-66, -82}, {-72, 51},   {-5, -6},
+        {-54, 52},  {-38, 53},  {-83, 54},  {-40, 55},   {-39, 56},  {-99, 57},   {-23, -56},
+        {-7, 58},   {-65, -97}, {-8, 0},    {0, 0},      {0, 0},     {0, 0},      {0, 0}}}},
      {{{{-1, 1}, {-18, 2}, {-2, -17}},
        {{2, 1},
         {-1, -52},
@@ -531,25 +466,20 @@
         {-19, 13},
         {-3, 14},
         {-4, -50}},
-       {{2, 1},     {-86, 3},   {-1, 4},   {-17, 5},   {7, 6},    {-70, 8},
-        {-33, 9},   {-18, 10},  {-2, 11},  {-54, 12},  {-49, 13}, {-38, 14},
-        {-34, -65}, {-85, 15},  {-50, 16}, {-69, 17},  {-22, 18}, {-53, 19},
-        {21, 20},   {-19, -81}, {-66, 22}, {-3, -35},  {24, 23},  {-37, 25},
-        {-68, -84}, {-51, 26},  {28, 27},  {-20, -52}, {30, 29},  {-4, -36},
-        {-83, 31},  {-67, 32},  {-82, 33}, {-21, 34},  {-5, -6}},
-       {{2, 1},     {-1, 3},     {-120, 4},   {-17, 5},   {7, 6},
-        {-104, 8},  {-33, 9},    {11, 10},    {13, 12},   {-49, 14},
-        {-88, 15},  {-18, -97},  {-65, 16},   {-40, 17},  {-2, -72},
-        {19, 18},   {-113, 20},  {-34, 21},   {-56, -81}, {23, 22},
-        {-50, 24},  {-82, -119}, {-24, -103}, {26, 25},   {28, 27},
-        {30, 29},   {-55, -87},  {-66, 31},   {33, 32},   {-98, 34},
-        {-35, -67}, {-19, 35},   {-70, 36},   {-71, 37},  {-51, -52},
-        {-3, 38},   {40, 39},    {-86, -118}, {42, 41},   {-39, -69},
-        {-54, -83}, {44, 43},    {-102, 45},  {-101, 46}, {-68, -85},
-        {-36, -53}, {-5, 0},     {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0}}},
+       {{2, 1},    {-86, 3},  {-1, 4},   {-17, 5},   {7, 6},    {-70, 8},   {-33, 9},
+        {-18, 10}, {-2, 11},  {-54, 12}, {-49, 13},  {-38, 14}, {-34, -65}, {-85, 15},
+        {-50, 16}, {-69, 17}, {-22, 18}, {-53, 19},  {21, 20},  {-19, -81}, {-66, 22},
+        {-3, -35}, {24, 23},  {-37, 25}, {-68, -84}, {-51, 26}, {28, 27},   {-20, -52},
+        {30, 29},  {-4, -36}, {-83, 31}, {-67, 32},  {-82, 33}, {-21, 34},  {-5, -6}},
+       {{2, 1},      {-1, 3},     {-120, 4},   {-17, 5},   {7, 6},     {-104, 8},  {-33, 9},
+        {11, 10},    {13, 12},    {-49, 14},   {-88, 15},  {-18, -97}, {-65, 16},  {-40, 17},
+        {-2, -72},   {19, 18},    {-113, 20},  {-34, 21},  {-56, -81}, {23, 22},   {-50, 24},
+        {-82, -119}, {-24, -103}, {26, 25},    {28, 27},   {30, 29},   {-55, -87}, {-66, 31},
+        {33, 32},    {-98, 34},   {-35, -67},  {-19, 35},  {-70, 36},  {-71, 37},  {-51, -52},
+        {-3, 38},    {40, 39},    {-86, -118}, {42, 41},   {-39, -69}, {-54, -83}, {44, 43},
+        {-102, 45},  {-101, 46},  {-68, -85},  {-36, -53}, {-5, 0},    {0, 0},     {0, 0},
+        {0, 0},      {0, 0},      {0, 0},      {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},      {0, 0},      {0, 0},      {0, 0},     {0, 0},     {0, 0},     {0, 0}}},
       {{{-1, 1}, {-18, 2}, {-2, -17}},
        {{2, 1},
         {-1, -52},
@@ -566,25 +496,20 @@
         {-19, 13},
         {-3, 14},
         {-4, -50}},
-       {{2, 1},     {-86, 3},   {-1, 4},   {-17, 5},   {7, 6},    {-70, 8},
-        {-33, 9},   {-18, 10},  {-2, 11},  {-54, 12},  {-49, 13}, {-38, 14},
-        {-34, -65}, {-85, 15},  {-50, 16}, {-69, 17},  {-22, 18}, {-53, 19},
-        {21, 20},   {-19, -81}, {-66, 22}, {-3, -35},  {24, 23},  {-37, 25},
-        {-68, -84}, {-51, 26},  {28, 27},  {-20, -52}, {30, 29},  {-4, -36},
-        {-83, 31},  {-67, 32},  {-82, 33}, {-21, 34},  {-5, -6}},
-       {{2, 1},     {-1, 3},     {-120, 4},   {-17, 5},   {7, 6},
-        {-104, 8},  {-33, 9},    {11, 10},    {13, 12},   {-49, 14},
-        {-88, 15},  {-18, -97},  {-65, 16},   {-40, 17},  {-2, -72},
-        {19, 18},   {-113, 20},  {-34, 21},   {-56, -81}, {23, 22},
-        {-50, 24},  {-82, -119}, {-24, -103}, {26, 25},   {28, 27},
-        {30, 29},   {-55, -87},  {-66, 31},   {33, 32},   {-98, 34},
-        {-35, -67}, {-19, 35},   {-70, 36},   {-71, 37},  {-51, -52},
-        {-3, 38},   {40, 39},    {-86, -118}, {42, 41},   {-39, -69},
-        {-54, -83}, {44, 43},    {-102, 45},  {-101, 46}, {-68, -85},
-        {-36, -53}, {-5, 0},     {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0},      {0, 0},     {0, 0},
-        {0, 0},     {0, 0},      {0, 0}}}}}};
+       {{2, 1},    {-86, 3},  {-1, 4},   {-17, 5},   {7, 6},    {-70, 8},   {-33, 9},
+        {-18, 10}, {-2, 11},  {-54, 12}, {-49, 13},  {-38, 14}, {-34, -65}, {-85, 15},
+        {-50, 16}, {-69, 17}, {-22, 18}, {-53, 19},  {21, 20},  {-19, -81}, {-66, 22},
+        {-3, -35}, {24, 23},  {-37, 25}, {-68, -84}, {-51, 26}, {28, 27},   {-20, -52},
+        {30, 29},  {-4, -36}, {-83, 31}, {-67, 32},  {-82, 33}, {-21, 34},  {-5, -6}},
+       {{2, 1},      {-1, 3},     {-120, 4},   {-17, 5},   {7, 6},     {-104, 8},  {-33, 9},
+        {11, 10},    {13, 12},    {-49, 14},   {-88, 15},  {-18, -97}, {-65, 16},  {-40, 17},
+        {-2, -72},   {19, 18},    {-113, 20},  {-34, 21},  {-56, -81}, {23, 22},   {-50, 24},
+        {-82, -119}, {-24, -103}, {26, 25},    {28, 27},   {30, 29},   {-55, -87}, {-66, 31},
+        {33, 32},    {-98, 34},   {-35, -67},  {-19, 35},  {-70, 36},  {-71, 37},  {-51, -52},
+        {-3, 38},    {40, 39},    {-86, -118}, {42, 41},   {-39, -69}, {-54, -83}, {44, 43},
+        {-102, 45},  {-101, 46},  {-68, -85},  {-36, -53}, {-5, 0},    {0, 0},     {0, 0},
+        {0, 0},      {0, 0},      {0, 0},      {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},      {0, 0},      {0, 0},      {0, 0},     {0, 0},     {0, 0},     {0, 0}}}}}};
 
 const ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes = {
     {{{-1, 1}, {-8, 2}, {-2, 3}, {5, 4}, {-7, 6}, {-3, -5}, {-4, -6}}},
@@ -607,23 +532,20 @@
         {0, 0},
         {0, 0},
         {0, 0}},
-       {{-1, 1},    {3, 2},    {5, 4},     {-86, 6},   {-66, 7},  {9, 8},
-        {11, 10},   {-18, 12}, {-51, 13},  {-37, -52}, {-69, 14}, {-38, 15},
-        {-53, 16},  {-35, 17}, {-50, -70}, {-22, -49}, {-33, 18}, {-17, 19},
-        {-34, -65}, {-81, 20}, {-54, 0},   {0, 0},     {0, 0},    {0, 0},
-        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0}},
-       {{2, 1},    {4, 3},       {-1, 5},    {-69, 6},   {-120, 7}, {-68, 8},
-        {10, 9},   {12, 11},     {14, 13},   {-52, -54}, {-18, 15}, {-70, 16},
-        {-67, 17}, {19, 18},     {-17, 20},  {-113, 21}, {23, 22},  {-83, 24},
-        {-24, 25}, {-103, -104}, {-51, -55}, {27, 26},   {-71, 28}, {-86, 29},
-        {-35, 30}, {-66, 31},    {-39, -50}, {-82, -98}, {-72, 32}, {-56, -87},
-        {-34, 33}, {-33, -88},   {-40, -97}, {-65, 34},  {-49, 35}, {-81, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0}}},
+       {{-1, 1},    {3, 2},     {5, 4},     {-86, 6},  {-66, 7},   {9, 8},    {11, 10},
+        {-18, 12},  {-51, 13},  {-37, -52}, {-69, 14}, {-38, 15},  {-53, 16}, {-35, 17},
+        {-50, -70}, {-22, -49}, {-33, 18},  {-17, 19}, {-34, -65}, {-81, 20}, {-54, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},     {0, 0},    {0, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},     {0, 0},    {0, 0}},
+       {{2, 1},    {4, 3},     {-1, 5},    {-69, 6},   {-120, 7},  {-68, 8},     {10, 9},
+        {12, 11},  {14, 13},   {-52, -54}, {-18, 15},  {-70, 16},  {-67, 17},    {19, 18},
+        {-17, 20}, {-113, 21}, {23, 22},   {-83, 24},  {-24, 25},  {-103, -104}, {-51, -55},
+        {27, 26},  {-71, 28},  {-86, 29},  {-35, 30},  {-66, 31},  {-39, -50},   {-82, -98},
+        {-72, 32}, {-56, -87}, {-34, 33},  {-33, -88}, {-40, -97}, {-65, 34},    {-49, 35},
+        {-81, 0},  {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0}}},
       {{{-1, 1}, {-18, 2}, {-17, 0}},
        {{-1, 1},
         {-36, 2},
@@ -640,23 +562,20 @@
         {0, 0},
         {0, 0},
         {0, 0}},
-       {{-1, 1},    {3, 2},    {5, 4},     {-86, 6},   {-66, 7},  {9, 8},
-        {11, 10},   {-18, 12}, {-51, 13},  {-37, -52}, {-69, 14}, {-38, 15},
-        {-53, 16},  {-35, 17}, {-50, -70}, {-22, -49}, {-33, 18}, {-17, 19},
-        {-34, -65}, {-81, 20}, {-54, 0},   {0, 0},     {0, 0},    {0, 0},
-        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0}},
-       {{2, 1},    {4, 3},       {-1, 5},    {-69, 6},   {-120, 7}, {-68, 8},
-        {10, 9},   {12, 11},     {14, 13},   {-52, -54}, {-18, 15}, {-70, 16},
-        {-67, 17}, {19, 18},     {-17, 20},  {-113, 21}, {23, 22},  {-83, 24},
-        {-24, 25}, {-103, -104}, {-51, -55}, {27, 26},   {-71, 28}, {-86, 29},
-        {-35, 30}, {-66, 31},    {-39, -50}, {-82, -98}, {-72, 32}, {-56, -87},
-        {-34, 33}, {-33, -88},   {-40, -97}, {-65, 34},  {-49, 35}, {-81, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0}}}},
+       {{-1, 1},    {3, 2},     {5, 4},     {-86, 6},  {-66, 7},   {9, 8},    {11, 10},
+        {-18, 12},  {-51, 13},  {-37, -52}, {-69, 14}, {-38, 15},  {-53, 16}, {-35, 17},
+        {-50, -70}, {-22, -49}, {-33, 18},  {-17, 19}, {-34, -65}, {-81, 20}, {-54, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},     {0, 0},    {0, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},     {0, 0},    {0, 0}},
+       {{2, 1},    {4, 3},     {-1, 5},    {-69, 6},   {-120, 7},  {-68, 8},     {10, 9},
+        {12, 11},  {14, 13},   {-52, -54}, {-18, 15},  {-70, 16},  {-67, 17},    {19, 18},
+        {-17, 20}, {-113, 21}, {23, 22},   {-83, 24},  {-24, 25},  {-103, -104}, {-51, -55},
+        {27, 26},  {-71, 28},  {-86, 29},  {-35, 30},  {-66, 31},  {-39, -50},   {-82, -98},
+        {-72, 32}, {-56, -87}, {-34, 33},  {-33, -88}, {-40, -97}, {-65, 34},    {-49, 35},
+        {-81, 0},  {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0}}}},
      {{{{-1, 1}, {-18, 2}, {-17, 0}},
        {{-1, 1},
         {3, 2},
@@ -673,23 +592,20 @@
         {0, 0},
         {0, 0},
         {0, 0}},
-       {{-1, 1},    {3, 2},   {-52, 4},   {-86, 5}, {-35, 6},   {-53, 7},
-        {-70, 8},   {-17, 9}, {-37, 10},  {12, 11}, {-38, -66}, {-18, 13},
-        {-51, 14},  {16, 15}, {-34, -69}, {18, 17}, {-54, -65}, {-50, 19},
-        {-33, -49}, {-22, 0}, {0, 0},     {0, 0},   {0, 0},     {0, 0},
-        {0, 0},     {0, 0},   {0, 0},     {0, 0},   {0, 0},     {0, 0},
-        {0, 0},     {0, 0},   {0, 0},     {0, 0},   {0, 0}},
-       {{-1, 1},    {-69, 2},   {4, 3},     {-120, 5},  {7, 6},     {-113, 8},
-        {-68, 9},   {11, 10},   {-17, 12},  {-52, 13},  {-24, 14},  {-18, 15},
-        {17, 16},   {-104, 18}, {20, 19},   {-54, -70}, {22, 21},   {24, 23},
-        {-86, -97}, {-103, 25}, {-83, 26},  {-35, 27},  {-34, -98}, {-40, 28},
-        {-39, -67}, {30, 29},   {-33, -51}, {-87, 31},  {-88, 32},  {-82, 33},
-        {-55, -81}, {-56, -71}, {-72, 34},  {-50, -66}, {-65, 35},  {-49, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0}}},
+       {{-1, 1},    {3, 2},    {-52, 4},   {-86, 5},   {-35, 6},   {-53, 7},  {-70, 8},
+        {-17, 9},   {-37, 10}, {12, 11},   {-38, -66}, {-18, 13},  {-51, 14}, {16, 15},
+        {-34, -69}, {18, 17},  {-54, -65}, {-50, 19},  {-33, -49}, {-22, 0},  {0, 0},
+        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},
+        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0}},
+       {{-1, 1},   {-69, 2},   {4, 3},     {-120, 5},  {7, 6},     {-113, 8},  {-68, 9},
+        {11, 10},  {-17, 12},  {-52, 13},  {-24, 14},  {-18, 15},  {17, 16},   {-104, 18},
+        {20, 19},  {-54, -70}, {22, 21},   {24, 23},   {-86, -97}, {-103, 25}, {-83, 26},
+        {-35, 27}, {-34, -98}, {-40, 28},  {-39, -67}, {30, 29},   {-33, -51}, {-87, 31},
+        {-88, 32}, {-82, 33},  {-55, -81}, {-56, -71}, {-72, 34},  {-50, -66}, {-65, 35},
+        {-49, 0},  {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0}}},
       {{{-1, 1}, {-18, 2}, {-17, 0}},
        {{-1, 1},
         {3, 2},
@@ -706,23 +622,20 @@
         {0, 0},
         {0, 0},
         {0, 0}},
-       {{-1, 1},    {3, 2},   {-52, 4},   {-86, 5}, {-35, 6},   {-53, 7},
-        {-70, 8},   {-17, 9}, {-37, 10},  {12, 11}, {-38, -66}, {-18, 13},
-        {-51, 14},  {16, 15}, {-34, -69}, {18, 17}, {-54, -65}, {-50, 19},
-        {-33, -49}, {-22, 0}, {0, 0},     {0, 0},   {0, 0},     {0, 0},
-        {0, 0},     {0, 0},   {0, 0},     {0, 0},   {0, 0},     {0, 0},
-        {0, 0},     {0, 0},   {0, 0},     {0, 0},   {0, 0}},
-       {{-1, 1},    {-69, 2},   {4, 3},     {-120, 5},  {7, 6},     {-113, 8},
-        {-68, 9},   {11, 10},   {-17, 12},  {-52, 13},  {-24, 14},  {-18, 15},
-        {17, 16},   {-104, 18}, {20, 19},   {-54, -70}, {22, 21},   {24, 23},
-        {-86, -97}, {-103, 25}, {-83, 26},  {-35, 27},  {-34, -98}, {-40, 28},
-        {-39, -67}, {30, 29},   {-33, -51}, {-87, 31},  {-88, 32},  {-82, 33},
-        {-55, -81}, {-56, -71}, {-72, 34},  {-50, -66}, {-65, 35},  {-49, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
-        {0, 0},     {0, 0},     {0, 0}}}},
+       {{-1, 1},    {3, 2},    {-52, 4},   {-86, 5},   {-35, 6},   {-53, 7},  {-70, 8},
+        {-17, 9},   {-37, 10}, {12, 11},   {-38, -66}, {-18, 13},  {-51, 14}, {16, 15},
+        {-34, -69}, {18, 17},  {-54, -65}, {-50, 19},  {-33, -49}, {-22, 0},  {0, 0},
+        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},
+        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0}},
+       {{-1, 1},   {-69, 2},   {4, 3},     {-120, 5},  {7, 6},     {-113, 8},  {-68, 9},
+        {11, 10},  {-17, 12},  {-52, 13},  {-24, 14},  {-18, 15},  {17, 16},   {-104, 18},
+        {20, 19},  {-54, -70}, {22, 21},   {24, 23},   {-86, -97}, {-103, 25}, {-83, 26},
+        {-35, 27}, {-34, -98}, {-40, 28},  {-39, -67}, {30, 29},   {-33, -51}, {-87, 31},
+        {-88, 32}, {-82, 33},  {-55, -81}, {-56, -71}, {-72, 34},  {-50, -66}, {-65, 35},
+        {-49, 0},  {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0}}}},
      {{{{-1, 1}, {-18, 2}, {-17, 0}},
        {{-1, 1},
         {-36, 2},
@@ -739,23 +652,20 @@
         {0, 0},
         {0, 0},
         {0, 0}},
-       {{-1, 1},    {3, 2},    {5, 4},     {-86, 6},   {-66, 7},  {9, 8},
-        {11, 10},   {-18, 12}, {-51, 13},  {-37, -52}, {-69, 14}, {-38, 15},
-        {-53, 16},  {-35, 17}, {-50, -70}, {-22, -49}, {-33, 18}, {-17, 19},
-        {-34, -65}, {-81, 20}, {-54, 0},   {0, 0},     {0, 0},    {0, 0},
-        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0}},
-       {{2, 1},    {4, 3},       {-1, 5},    {-69, 6},   {-120, 7}, {-68, 8},
-        {10, 9},   {12, 11},     {14, 13},   {-52, -54}, {-18, 15}, {-70, 16},
-        {-67, 17}, {19, 18},     {-17, 20},  {-113, 21}, {23, 22},  {-83, 24},
-        {-24, 25}, {-103, -104}, {-51, -55}, {27, 26},   {-71, 28}, {-86, 29},
-        {-35, 30}, {-66, 31},    {-39, -50}, {-82, -98}, {-72, 32}, {-56, -87},
-        {-34, 33}, {-33, -88},   {-40, -97}, {-65, 34},  {-49, 35}, {-81, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0}}},
+       {{-1, 1},    {3, 2},     {5, 4},     {-86, 6},  {-66, 7},   {9, 8},    {11, 10},
+        {-18, 12},  {-51, 13},  {-37, -52}, {-69, 14}, {-38, 15},  {-53, 16}, {-35, 17},
+        {-50, -70}, {-22, -49}, {-33, 18},  {-17, 19}, {-34, -65}, {-81, 20}, {-54, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},     {0, 0},    {0, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},     {0, 0},    {0, 0}},
+       {{2, 1},    {4, 3},     {-1, 5},    {-69, 6},   {-120, 7},  {-68, 8},     {10, 9},
+        {12, 11},  {14, 13},   {-52, -54}, {-18, 15},  {-70, 16},  {-67, 17},    {19, 18},
+        {-17, 20}, {-113, 21}, {23, 22},   {-83, 24},  {-24, 25},  {-103, -104}, {-51, -55},
+        {27, 26},  {-71, 28},  {-86, 29},  {-35, 30},  {-66, 31},  {-39, -50},   {-82, -98},
+        {-72, 32}, {-56, -87}, {-34, 33},  {-33, -88}, {-40, -97}, {-65, 34},    {-49, 35},
+        {-81, 0},  {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0}}},
       {{{-1, 1}, {-18, 2}, {-17, 0}},
        {{-1, 1},
         {-36, 2},
@@ -772,3009 +682,3443 @@
         {0, 0},
         {0, 0},
         {0, 0}},
-       {{-1, 1},    {3, 2},    {5, 4},     {-86, 6},   {-66, 7},  {9, 8},
-        {11, 10},   {-18, 12}, {-51, 13},  {-37, -52}, {-69, 14}, {-38, 15},
-        {-53, 16},  {-35, 17}, {-50, -70}, {-22, -49}, {-33, 18}, {-17, 19},
-        {-34, -65}, {-81, 20}, {-54, 0},   {0, 0},     {0, 0},    {0, 0},
-        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},     {0, 0},    {0, 0},     {0, 0},     {0, 0}},
-       {{2, 1},    {4, 3},       {-1, 5},    {-69, 6},   {-120, 7}, {-68, 8},
-        {10, 9},   {12, 11},     {14, 13},   {-52, -54}, {-18, 15}, {-70, 16},
-        {-67, 17}, {19, 18},     {-17, 20},  {-113, 21}, {23, 22},  {-83, 24},
-        {-24, 25}, {-103, -104}, {-51, -55}, {27, 26},   {-71, 28}, {-86, 29},
-        {-35, 30}, {-66, 31},    {-39, -50}, {-82, -98}, {-72, 32}, {-56, -87},
-        {-34, 33}, {-33, -88},   {-40, -97}, {-65, 34},  {-49, 35}, {-81, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0},     {0, 0},     {0, 0},    {0, 0},
-        {0, 0},    {0, 0},       {0, 0}}}}}};
+       {{-1, 1},    {3, 2},     {5, 4},     {-86, 6},  {-66, 7},   {9, 8},    {11, 10},
+        {-18, 12},  {-51, 13},  {-37, -52}, {-69, 14}, {-38, 15},  {-53, 16}, {-35, 17},
+        {-50, -70}, {-22, -49}, {-33, 18},  {-17, 19}, {-34, -65}, {-81, 20}, {-54, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},     {0, 0},    {0, 0},
+        {0, 0},     {0, 0},     {0, 0},     {0, 0},    {0, 0},     {0, 0},    {0, 0}},
+       {{2, 1},    {4, 3},     {-1, 5},    {-69, 6},   {-120, 7},  {-68, 8},     {10, 9},
+        {12, 11},  {14, 13},   {-52, -54}, {-18, 15},  {-70, 16},  {-67, 17},    {19, 18},
+        {-17, 20}, {-113, 21}, {23, 22},   {-83, 24},  {-24, 25},  {-103, -104}, {-51, -55},
+        {27, 26},  {-71, 28},  {-86, 29},  {-35, 30},  {-66, 31},  {-39, -50},   {-82, -98},
+        {-72, 32}, {-56, -87}, {-34, 33},  {-33, -88}, {-40, -97}, {-65, 34},    {-49, 35},
+        {-81, 0},  {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0},
+        {0, 0},    {0, 0},     {0, 0},     {0, 0},     {0, 0},     {0, 0},       {0, 0}}}}}};
 
 const ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes = {
-    {{2, 1},     {4, 3},     {6, 5},     {8, 7},    {10, 9},    {12, 11},
-     {14, 13},   {-8, 15},   {-9, 16},   {-10, 17}, {-18, 18},  {-17, -19},
-     {-16, 19},  {-11, -20}, {-15, -21}, {-7, 20},  {-22, 21},  {-12, -14},
-     {-13, -23}, {23, 22},   {-24, -31}, {-6, 24},  {-25, -26}, {26, 25},
-     {-5, -27},  {-28, 27},  {-4, 28},   {-29, 29}, {-1, -30},  {-2, -3}},
+    {{2, 1},    {4, 3},     {6, 5},     {8, 7},     {10, 9},    {12, 11},   {14, 13},   {-8, 15},
+     {-9, 16},  {-10, 17},  {-18, 18},  {-17, -19}, {-16, 19},  {-11, -20}, {-15, -21}, {-7, 20},
+     {-22, 21}, {-12, -14}, {-13, -23}, {23, 22},   {-24, -31}, {-6, 24},   {-25, -26}, {26, 25},
+     {-5, -27}, {-28, 27},  {-4, 28},   {-29, 29},  {-1, -30},  {-2, -3}},
     {{2, 1}, {-5, 3}, {-4, -6}, {-3, 4}, {-2, 5}, {-1, 6}, {-7, -8}},
-    {{2, 1},    {4, 3},    {6, 5},     {-15, 7},  {-14, -16},
-     {-13, 8},  {-12, 9},  {-11, 10},  {-10, 11}, {-8, -9},
-     {-17, 12}, {14, 13},  {-7, 15},   {-18, 16}, {-6, 17},
-     {-5, 18},  {-4, -19}, {-3, 19},   {-1, 20},  {-2, -20},
-     {22, 21},  {-21, 23}, {-22, -26}, {-23, 24}, {-24, -25}}};
+    {{2, 1},    {4, 3},     {6, 5},    {-15, 7},  {-14, -16}, {-13, 8},  {-12, 9},
+     {-11, 10}, {-10, 11},  {-8, -9},  {-17, 12}, {14, 13},   {-7, 15},  {-18, 16},
+     {-6, 17},  {-5, 18},   {-4, -19}, {-3, 19},  {-1, 20},   {-2, -20}, {22, 21},
+     {-21, 23}, {-22, -26}, {-23, 24}, {-24, -25}}};
 
 const ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes = {
-    {{2, 1},     {4, 3},     {6, 5},     {8, 7},    {10, 9},    {12, 11},
-     {14, 13},   {-8, 15},   {-9, 16},   {-10, 17}, {-18, 18},  {-17, -19},
-     {-16, 19},  {-11, -20}, {-15, -21}, {-7, 20},  {-22, 21},  {-12, -14},
-     {-13, -23}, {23, 22},   {-24, -31}, {-6, 24},  {-25, -26}, {26, 25},
-     {-5, -27},  {-28, 27},  {-4, 28},   {-29, 29}, {-1, -30},  {-2, -3}},
+    {{2, 1},    {4, 3},     {6, 5},     {8, 7},     {10, 9},    {12, 11},   {14, 13},   {-8, 15},
+     {-9, 16},  {-10, 17},  {-18, 18},  {-17, -19}, {-16, 19},  {-11, -20}, {-15, -21}, {-7, 20},
+     {-22, 21}, {-12, -14}, {-13, -23}, {23, 22},   {-24, -31}, {-6, 24},   {-25, -26}, {26, 25},
+     {-5, -27}, {-28, 27},  {-4, 28},   {-29, 29},  {-1, -30},  {-2, -3}},
     {{2, 1}, {-5, 3}, {-4, -6}, {-3, 4}, {-2, 5}, {-1, 6}, {-7, -8}},
-    {{2, 1},    {4, 3},    {6, 5},     {-15, 7},  {-14, -16},
-     {-13, 8},  {-12, 9},  {-11, 10},  {-10, 11}, {-8, -9},
-     {-17, 12}, {14, 13},  {-7, 15},   {-18, 16}, {-6, 17},
-     {-5, 18},  {-4, -19}, {-3, 19},   {-1, 20},  {-2, -20},
-     {22, 21},  {-21, 23}, {-22, -26}, {-23, 24}, {-24, -25}}};
+    {{2, 1},    {4, 3},     {6, 5},    {-15, 7},  {-14, -16}, {-13, 8},  {-12, 9},
+     {-11, 10}, {-10, 11},  {-8, -9},  {-17, 12}, {14, 13},   {-7, 15},  {-18, 16},
+     {-6, 17},  {-5, 18},   {-4, -19}, {-3, 19},  {-1, 20},   {-2, -20}, {22, 21},
+     {-21, 23}, {-22, -26}, {-23, 24}, {-24, -25}}};
 
-const ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes = {
-    {{-1, 1}, {-2, 2}, {-3, -4}}};
+const ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes = {{{-1, 1}, {-2, 2}, {-3, -4}}};
 
 const ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes = {
-    {{2, 1},    {4, 3},     {6, 5},     {-33, 7},  {-17, 8},  {-49, 9},
-     {-34, 10}, {12, 11},   {-18, -35}, {-50, 13}, {15, 14},  {-40, 16},
-     {-36, 17}, {-19, 18},  {-1, -37},  {-51, 19}, {21, 20},  {-38, -65},
-     {-2, -39}, {-20, 22},  {-52, 23},  {25, 24},  {-21, 26}, {-66, 27},
-     {-53, 28}, {-3, 29},   {31, 30},   {-22, 32}, {-54, 33}, {-4, 34},
-     {-56, 35}, {-24, -67}, {-23, -55}, {-8, -72}, {-5, 36},  {-68, 37},
-     {-6, 38},  {-7, -69},  {-70, -71}}};
+    {{2, 1},     {4, 3},     {6, 5},    {-33, 7},  {-17, 8},  {-49, 9},  {-34, 10}, {12, 11},
+     {-18, -35}, {-50, 13},  {15, 14},  {-40, 16}, {-36, 17}, {-19, 18}, {-1, -37}, {-51, 19},
+     {21, 20},   {-38, -65}, {-2, -39}, {-20, 22}, {-52, 23}, {25, 24},  {-21, 26}, {-66, 27},
+     {-53, 28},  {-3, 29},   {31, 30},  {-22, 32}, {-54, 33}, {-4, 34},  {-56, 35}, {-24, -67},
+     {-23, -55}, {-8, -72},  {-5, 36},  {-68, 37}, {-6, 38},  {-7, -69}, {-70, -71}}};
 
-const WORD32 ixheaacd_im_weight_Q28[16][8][31] = {
+const FLOAT32 ixheaacd_im_weight[16][8][31] = {
     {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f}},
     {
-        {-3,        -574674,   -1017796,  -1796901,  -3154468,  -5481590,
-         -7575016,  -10370478, -14006830, -18549081, -23865573, -27607851,
-         -31193408, -34233661, -36296902, -37030589, -36296902, -34233661,
-         -31193411, -27607851, -23865573, -18549082, -14006829, -10370478,
-         -7575017,  -5481590,  -3154468,  -1796901,  -1017796,  -574674,
-         -3},
-        {-3,        -538644,   -954220,   -1685385,  -2960885,  -5151503,
-         -7126422,  -9769580,  -13217236, -17537304, -22610489, -26190951,
-         -29627877, -32546501, -34529291, -35234746, -34529291, -32546501,
-         -29627879, -26190951, -22610489, -17537304, -13217236, -9769579,
-         -7126423,  -5151503,  -2960885,  -1685385,  -954220,   -538644,
-         -3},
-        {-3,        -483799,   -857386,   -1515349,  -2665174,  -4645760,
-         -6437353,  -8843606,  -11995831, -15965514, -20652239, -23974316,
-         -27173122, -29896409, -31749795, -32409817, -31749798, -29896409,
-         -27173122, -23974316, -20652241, -15965512, -11995831, -8843606,
-         -6437353,  -4645760,  -2665174,  -1515349,  -857386,   -483799,
-         -3},
-        {-2,        -346044,   -613840,   -1086712,  -1916795,  -3357478,
-         -4672194,  -6454555,  -8816980,  -11833773, -15450674, -18047554,
-         -20571857, -22737959, -24220523, -24750059, -24220526, -22737954,
-         -20571860, -18047555, -15450674, -11833774, -8816980,  -6454555,
-         -4672195,  -3357477,  -1916795,  -1086712,  -613840,   -346044,
-         -2},
-        {-1,        -211963,   -376347,   -667357,   -1180477,  -2077857,
-         -2904213,  -4035616,  -5554462,  -7524805,  -9930552,  -11685604,
-         -13412726, -14910621, -15943947, -16314578, -15943948, -14910621,
-         -13412728, -11685605, -9930552,  -7524805,  -5554462,  -4035615,
-         -2904213,  -2077857,  -1180477,  -667357,   -376347,   -211963,
-         -1},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {2,        341283,   608313,   1086175,  1945172,  3500199,  4995375,
-         7149357,  10257166, 14719094, 21095209, 27678683, 35807499, 44718702,
-         52254129, 55306472, 52254135, 44718696, 35807506, 27678683, 21095208,
-         14719092, 10257166, 7149356,  4995375,  3500199,  1945172,  1086175,
-         608313,   341283,   2},
-        {3,         574839,    1026313,   1838046,   3309837,   6017789,
-         8678530,   12620302,  18566315,  29617673,  51387069,  78419391,
-         127027624, 219233261, 378389618, 496423988, 378389858, 219233221,
-         127027637, 78419391,  51387075,  29617673,  18566315,  12620301,
-         8678531,   6017788,   3309837,   1838046,   1026313,   574839,
-         3},
-    },
+
+        {-0.0000000112f, -0.0021408275f, -0.0037915856f, -0.0066939779f, -0.0117513090f,
+         -0.0204205140f, -0.0282191336f, -0.0386330411f, -0.0521795079f, -0.0691007078f,
+         -0.0889061838f, -0.1028472632f, -0.1162045002f, -0.1275303215f, -0.1352165043f,
+         -0.1379496902f, -0.1352165043f, -0.1275303215f, -0.1162045151f, -0.1028472632f,
+         -0.0889061838f, -0.0691007152f, -0.0521795042f, -0.0386330411f, -0.0282191373f,
+         -0.0204205140f, -0.0117513090f, -0.0066939779f, -0.0037915856f, -0.0021408275f,
+         -0.0000000112f},
+        {-0.0000000112f, -0.0020066053f, -0.0035547465f, -0.0062785484f, -0.0110301562f,
+         -0.0191908441f, -0.0265479907f, -0.0363945216f, -0.0492380410f, -0.0653315485f,
+         -0.0842306316f, -0.0975688994f, -0.1103724390f, -0.1212451607f, -0.1286316365f,
+         -0.1312596500f, -0.1286316365f, -0.1212451607f, -0.1103724539f, -0.0975688994f,
+         -0.0842306316f, -0.0653315485f, -0.0492380410f, -0.0363945179f, -0.0265479945f,
+         -0.0191908441f, -0.0110301562f, -0.0062785484f, -0.0035547465f, -0.0020066053f,
+         -0.0000000112f},
+        {-0.0000000112f, -0.0018022917f, -0.0031940117f, -0.0056451149f, -0.0099285468f,
+         -0.0173068047f, -0.0239810087f, -0.0329449996f, -0.0446879528f, -0.0594761744f,
+         -0.0769355893f, -0.0893112868f, -0.1012277678f, -0.1113727987f, -0.1182772070f,
+         -0.1207359731f, -0.1182772145f, -0.1113727987f, -0.1012277678f, -0.0893112868f,
+         -0.0769355893f, -0.0594761670f, -0.0446879528f, -0.0329449996f, -0.0239810087f,
+         -0.0173068047f, -0.0099285468f, -0.0056451149f, -0.0031940117f, -0.0018022917f,
+         -0.0000000112f},
+        {-0.0000000075f, -0.0012891144f, -0.0022867322f, -0.0040483177f, -0.0071406178f,
+         -0.0125075802f, -0.0174052790f, -0.0240450911f, -0.0328458101f, -0.0440842398f,
+         -0.0575582460f, -0.0672323778f, -0.0766361356f, -0.0847055018f, -0.0902284831f,
+         -0.0922011584f, -0.0902284905f, -0.0847054794f, -0.0766361505f, -0.0672323853f,
+         -0.0575582460f, -0.0440842435f, -0.0328458101f, -0.0240450911f, -0.0174052827f,
+         -0.0125075765f, -0.0071406178f, -0.0040483177f, -0.0022867322f, -0.0012891144f,
+         -0.0000000075f},
+        {-0.0000000037f, -0.0007896237f, -0.0014020018f, -0.0024860986f, -0.0043976195f,
+         -0.0077406205f, -0.0108190365f, -0.0150338411f, -0.0206919834f, -0.0280320831f,
+         -0.0369941890f, -0.0435322672f, -0.0499662980f, -0.0555463918f, -0.0593958311f,
+         -0.0607765391f, -0.0593958348f, -0.0555463918f, -0.0499663055f, -0.0435322709f,
+         -0.0369941890f, -0.0280320831f, -0.0206919834f, -0.0150338374f, -0.0108190365f,
+         -0.0077406205f, -0.0043976195f, -0.0024860986f, -0.0014020018f, -0.0007896237f,
+         -0.0000000037f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000075f, 0.0012713782f, 0.0022661425f, 0.0040463172f, 0.0072463304f, 0.0130392574f,
+         0.0186092220f, 0.0266334303f, 0.0382109210f, 0.0548328981f, 0.0785857737f, 0.1031111330f,
+         0.1333933324f, 0.1665901542f, 0.1946617961f, 0.2060326636f, 0.1946618259f, 0.1665901244f,
+         0.1333933473f, 0.1031111330f, 0.0785857737f, 0.0548328906f, 0.0382109210f, 0.0266334265f,
+         0.0186092220f, 0.0130392574f, 0.0072463304f, 0.0040463172f, 0.0022661425f, 0.0012713782f,
+         0.0000000075f},
+        {0.0000000112f, 0.0021414421f, 0.0038233139f, 0.0068472549f, 0.0123301037f, 0.0224180110f,
+         0.0323300436f, 0.0470142886f, 0.0691649169f, 0.1103344262f, 0.1914317459f, 0.2921350002f,
+         0.4732147753f, 0.8167075515f, 1.4096112251f, 1.8493235111f, 1.4096120596f, 0.8167073727f,
+         0.4732148349f, 0.2921350002f, 0.1914317757f, 0.1103344262f, 0.0691649169f, 0.0470142849f,
+         0.0323300473f, 0.0224180073f, 0.0123301037f, 0.0068472549f, 0.0038233139f, 0.0021414421f,
+         0.0000000112f}},
     {
-        {-6,        -1063142,  -1884657,  -3332697,  -5866780,  -10242061,
-         -14210618, -19556015, -26583487, -35470365, -46010122, -53508848,
-         -60748872, -66926406, -71137302, -72638110, -71137307, -66926401,
-         -60748877, -53508853, -46010127, -35470363, -26583487, -19556013,
-         -14210619, -10242061, -5866781,  -3332697,  -1884657,  -1063142,
-         -6},
-        {-6,        -996411,   -1766700,  -3125152,  -5504594,  -9619093,
-         -13357671, -18402686, -25050704, -33480939, -43509452, -50662425,
-         -57581404, -63494074, -67528860, -68967732, -67528865, -63494073,
-         -57581409, -50662430, -43509452, -33480939, -25050704, -18402684,
-         -13357672, -9619093,  -5504594,  -3125152,  -1766700,  -996411,
-         -6},
-        {-5,        -894854,   -1587094,  -2808873,  -4951863,  -8666114,
-         -12050168, -16630008, -22687068, -30401449, -39622947, -46227133,
-         -52634601, -58124037, -61876858, -63216462, -61876863, -58124037,
-         -52634607, -46227138, -39622951, -30401449, -22687068, -16630007,
-         -12050168, -8666115,  -4951864,  -2808873,  -1587094,  -894854,
-         -5},
-        {-4,        -639871,   -1135692,  -2012557,  -3555941,  -6246900,
-         -8715879,  -12082768, -16579119, -22374143, -29395763, -34483541,
-         -39463815, -43763084, -46718677, -47776809, -46718677, -43763084,
-         -39463820, -34483541, -29395763, -22374143, -16579119, -12082768,
-         -8715880,  -6246900,  -3555941,  -2012557,  -1135692,  -639871,
-         -4},
-        {-2,        -391832,   -695950,   -1234845,  -2186633,  -3856009,
-         -5398614,  -7518849,  -10379694, -14115081, -18711418, -22088179,
-         -25429852, -28342454, -30359291, -31084156, -30359294, -28342454,
-         -25429854, -22088179, -18711418, -14115079, -10379693, -7518848,
-         -5398615,  -3856009,  -2186633,  -1234845,  -695950,   -391832,
-         -2},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {4,        630153,   1122569,  2002361,  3579289,  6418784,  9130132,
-         13002758, 18518363, 26281774, 36854214, 45475090, 56006939, 67371285,
-         76348185, 79832098, 76348185, 67371278, 56006945, 45475094, 36854219,
-         26281774, 18518363, 13002756, 9130133,  6418784,  3579289,  2002361,
-         1122569,  630153,   4},
-        {6,         1060871,   1892248,   3382951,   6072244,   10973302,
-         15727473,  22653420,  32821245,  47830061,  75342938,  103710864,
-         142829663, 191958022, 239742154, 261023300, 239742208, 191958009,
-         142829663, 103710864, 75342952,  47830061,  32821243,  22653418,
-         15727475,  10973302,  6072245,   3382952,   1892248,   1060871,
-         6},
-    },
+
+        {-0.0000000224f, -0.0039605126f, -0.0070208944f, -0.0124152638f, -0.0218554586f,
+         -0.0381546505f, -0.0529386774f, -0.0728518367f, -0.0990312099f, -0.1321374029f,
+         -0.1714010537f, -0.1993359923f, -0.2263071835f, -0.2493202984f, -0.2650071084f,
+         -0.2705980539f, -0.2650071084f, -0.2493202686f, -0.2263071984f, -0.1993360072f,
+         -0.1714010835f, -0.1321374029f, -0.0990312099f, -0.0728518218f, -0.0529386811f,
+         -0.0381546505f, -0.0218554623f, -0.0124152638f, -0.0070208944f, -0.0039605126f,
+         -0.0000000224f},
+        {-0.0000000224f, -0.0037119202f, -0.0065814704f, -0.0116420984f, -0.0205062106f,
+         -0.0358339138f, -0.0497612022f, -0.0685553476f, -0.0933211446f, -0.1247262210f,
+         -0.1620853394f, -0.1887322366f, -0.2145074457f, -0.2365338504f, -0.2515646219f,
+         -0.2569248080f, -0.2515646219f, -0.2365338504f, -0.2145074606f, -0.1887322664f,
+         -0.1620853394f, -0.1247262210f, -0.0933211446f, -0.0685553402f, -0.0497612059f,
+         -0.0358339138f, -0.0205062106f, -0.0116420984f, -0.0065814704f, -0.0037119202f,
+         -0.0000000224f},
+        {-0.0000000186f, -0.0033335909f, -0.0059123859f, -0.0104638673f, -0.0184471272f,
+         -0.0322837904f, -0.0448903739f, -0.0619516075f, -0.0845159143f, -0.1132542193f,
+         -0.1476069838f, -0.1722094864f, -0.1960791647f, -0.2165289074f, -0.2305092514f,
+         -0.2354996800f, -0.2305092812f, -0.2165289074f, -0.1960791945f, -0.1722095013f,
+         -0.1476069987f, -0.1132542193f, -0.0845159143f, -0.0619516037f, -0.0448903739f,
+         -0.0322837941f, -0.0184471309f, -0.0104638673f, -0.0059123859f, -0.0033335909f,
+         -0.0000000186f},
+        {-0.0000000149f, -0.0023837052f, -0.0042307824f, -0.0074973591f, -0.0132469125f,
+         -0.0232715160f, -0.0324691795f, -0.0450118184f, -0.0617620312f, -0.0833501816f,
+         -0.1095077544f, -0.1284611970f, -0.1470141709f, -0.1630301923f, -0.1740406305f,
+         -0.1779824793f, -0.1740406305f, -0.1630301923f, -0.1470141858f, -0.1284611970f,
+         -0.1095077544f, -0.0833501816f, -0.0617620312f, -0.0450118184f, -0.0324691832f,
+         -0.0232715160f, -0.0132469125f, -0.0074973591f, -0.0042307824f, -0.0023837052f,
+         -0.0000000149f},
+        {-0.0000000075f, -0.0014596879f, -0.0025926158f, -0.0046001561f, -0.0081458427f,
+         -0.0143647529f, -0.0201114044f, -0.0280098952f, -0.0386673734f, -0.0525827743f,
+         -0.0697054639f, -0.0822848827f, -0.0947335809f, -0.1055838689f, -0.1130971760f,
+         -0.1157975048f, -0.1130971834f, -0.1055838689f, -0.0947335884f, -0.0822848827f,
+         -0.0697054639f, -0.0525827669f, -0.0386673696f, -0.0280098915f, -0.0201114081f,
+         -0.0143647529f, -0.0081458427f, -0.0046001561f, -0.0025926158f, -0.0014596879f,
+         -0.0000000075f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000149f, 0.0023475029f, 0.0041818954f, 0.0074593760f, 0.0133338906f, 0.0239118338f,
+         0.0340123922f, 0.0484390482f, 0.0689862818f, 0.0979072377f, 0.1372926533f, 0.1694079041f,
+         0.2086421102f, 0.2509776056f, 0.2844191492f, 0.2973977327f, 0.2844191492f, 0.2509775758f,
+         0.2086421251f, 0.1694079340f, 0.1372926682f, 0.0979072377f, 0.0689862818f, 0.0484390408f,
+         0.0340123959f, 0.0239118338f, 0.0133338906f, 0.0074593760f, 0.0041818954f, 0.0023475029f,
+         0.0000000149f},
+        {0.0000000224f, 0.0039520524f, 0.0070491731f, 0.0126024745f, 0.0226208717f, 0.0408787355f,
+         0.0585894026f, 0.0843905658f, 0.1222686619f, 0.1781808585f, 0.2806743085f, 0.3863530755f,
+         0.5320819616f, 0.7150993347f, 0.8931091428f, 0.9723875523f, 0.8931093216f, 0.7150993347f,
+         0.5320819616f, 0.3863530755f, 0.2806743681f, 0.1781808585f, 0.1222686619f, 0.0843905583f,
+         0.0585894100f, 0.0408787355f, 0.0226208754f, 0.0126024783f, 0.0070491731f, 0.0039520524f,
+         0.0000000224f}},
     {
-        {-8,        -1391582,  -2470337,   -4379084,   -7741644,   -13613250,
-         -19010161, -26384297, -36257343,  -49022548,  -64547243,  -75833181,
-         -86908862, -96491301, -103089782, -105454184, -103089782, -96491301,
-         -86908862, -75833172, -64547240,  -49022548,  -36257343,  -26384295,
-         -19010165, -13613251, -7741645,   -4379084,   -2470337,   -1391582,
-         -8},
-        {-7,        -1304089,  -2315260,  -4104938,  -7259321,  -12772177,
-         -17844573, -24783192, -34086929, -46138449, -60827308, -71526414,
-         -82042251, -91152504, -97432108, -99683455, -97432108, -91152495,
-         -82042260, -71526418, -60827312, -46138449, -34086931, -24783188,
-         -17844578, -12772178, -7259321,  -4104938,  -2315260,  -1304089,
-         -7},
-        {-7,        -1170970,  -2079253,  -3687531,  -6524359,  -11488788,
-         -16063810, -22333022, -30758491, -41703962, -55090554, -64871119,
-         -74507479, -82873672, -88649676, -90722278, -88649676, -82873672,
-         -74507487, -64871119, -55090554, -41703962, -30758489, -22333018,
-         -16063811, -11488789, -6524359,  -3687531,  -2079253,  -1170970,
-         -7},
-        {-5,        -836946,   -1486730,  -2638556,  -4674179,  -8248466,
-         -11555711, -16108121, -22262876, -30319528, -40263731, -47590055,
-         -54856837, -61203595, -65605308, -67188665, -65605308, -61203586,
-         -54856842, -47590059, -40263731, -30319526, -22262874, -16108120,
-         -11555711, -8248465,  -4674180,  -2638556,  -1486730,  -836946,
-         -5},
-        {-3,        -512296,   -910384,   -1616803,  -2867623,  -5071172,
-         -7118298,  -9948960,  -13799297, -18879453, -25211247, -29918728,
-         -34622928, -38759529, -41643508, -42683912, -41643508, -38759525,
-         -34622930, -29918732, -25211249, -18879451, -13799296, -9948958,
-         -7118299,  -5071172,  -2867624,  -1616803,  -910384,   -512296,
-         -3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {5,        822447,   1463889,  2607236,  4647839,  8293870,  11741041,
-         16605976, 23414447, 32754663, 45010872, 54604473, 64638836, 73862135,
-         80529788, 82985438, 80529795, 73862128, 64638850, 54604473, 45010872,
-         32754663, 23414449, 16605974, 11741042, 8293870,  4647839,  2607237,
-         1463889,  822447,   5},
-        {8,         1383579,   2464328,   4394383,   7850862,   14065144,
-         19987153,  28424960,  40399126,  57162281,  79807987,  98105864,
-         117845260, 140317143, 157927636, 164697609, 157927650, 140317143,
-         117845274, 98105858,  79807994,  57162273,  40399123,  28424958,
-         19987155,  14065143,  7850864,   4394383,   2464328,   1383579,
-         8},
-    },
+
+        {-0.0000000298f, -0.0051840469f, -0.0092027225f, -0.0163133591f, -0.0288398713f,
+         -0.0507133082f, -0.0708183646f, -0.0982891619f, -0.1350691319f, -0.1826232225f,
+         -0.2404572219f, -0.2825006247f, -0.3237607479f, -0.3594581187f, -0.3840393722f,
+         -0.3928474486f, -0.3840393722f, -0.3594581187f, -0.3237607479f, -0.2825005651f,
+         -0.2404572070f, -0.1826232225f, -0.1350691319f, -0.0982891619f, -0.0708183795f,
+         -0.0507133119f, -0.0288398750f, -0.0163133591f, -0.0092027225f, -0.0051840469f,
+         -0.0000000298f},
+        {-0.0000000261f, -0.0048581101f, -0.0086250156f, -0.0152920857f, -0.0270430781f,
+         -0.0475800671f, -0.0664762110f, -0.0923245847f, -0.1269837022f, -0.1718791127f,
+         -0.2265993804f, -0.2664566636f, -0.3056311905f, -0.3395695388f, -0.3629629016f,
+         -0.3713498116f, -0.3629629016f, -0.3395695090f, -0.3056312203f, -0.2664566636f,
+         -0.2265993953f, -0.1718791127f, -0.1269837171f, -0.0923245698f, -0.0664762333f,
+         -0.0475800708f, -0.0270430781f, -0.0152920857f, -0.0086250156f, -0.0048581101f,
+         -0.0000000261f},
+        {-0.0000000261f, -0.0043622032f, -0.0077458210f, -0.0137371235f, -0.0243051313f,
+         -0.0427990705f, -0.0598423555f, -0.0831969902f, -0.1145843118f, -0.1553593576f,
+         -0.2052282989f, -0.2416637540f, -0.2775619924f, -0.3087284863f, -0.3302457929f,
+         -0.3379668295f, -0.3302457929f, -0.3087284863f, -0.2775620222f, -0.2416637540f,
+         -0.2052282989f, -0.1553593576f, -0.1145842969f, -0.0831969753f, -0.0598423593f,
+         -0.0427990742f, -0.0243051313f, -0.0137371235f, -0.0077458210f, -0.0043622032f,
+         -0.0000000261f},
+        {-0.0000000186f, -0.0031178668f, -0.0055385008f, -0.0098293871f, -0.0174126737f,
+         -0.0307279304f, -0.0430483781f, -0.0600074269f, -0.0829356760f, -0.1129490435f,
+         -0.1499940902f, -0.1772867739f, -0.2043576390f, -0.2280011624f, -0.2443988174f,
+         -0.2502972782f, -0.2443988174f, -0.2280011177f, -0.2043576539f, -0.1772867888f,
+         -0.1499940902f, -0.1129490361f, -0.0829356685f, -0.0600074232f, -0.0430483781f,
+         -0.0307279266f, -0.0174126774f, -0.0098293871f, -0.0055385008f, -0.0031178668f,
+         -0.0000000186f},
+        {-0.0000000112f, -0.0019084513f, -0.0033914447f, -0.0060230605f, -0.0106827281f,
+         -0.0188915879f, -0.0265177265f, -0.0370627642f, -0.0514063872f, -0.0703314394f,
+         -0.0939192176f, -0.1114559472f, -0.1289804578f, -0.1443904936f, -0.1551341563f,
+         -0.1590099633f, -0.1551341563f, -0.1443904787f, -0.1289804578f, -0.1114559621f,
+         -0.0939192176f, -0.0703314394f, -0.0514063835f, -0.0370627567f, -0.0265177302f,
+         -0.0188915879f, -0.0106827319f, -0.0060230605f, -0.0033914447f, -0.0019084513f,
+         -0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000186f, 0.0030638538f, 0.0054534115f, 0.0097127110f, 0.0173145495f, 0.0308970734f,
+         0.0437387861f, 0.0618620813f, 0.0872256160f, 0.1220206320f, 0.1676785648f, 0.2034175098f,
+         0.2407984287f, 0.2751578987f, 0.2999968529f, 0.3091448545f, 0.2999968529f, 0.2751578689f,
+         0.2407984734f, 0.2034175098f, 0.1676785648f, 0.1220206320f, 0.0872256160f, 0.0618620738f,
+         0.0437387899f, 0.0308970734f, 0.0173145495f, 0.0097127147f, 0.0054534115f, 0.0030638538f,
+         0.0000000186f},
+        {0.0000000298f, 0.0051542334f, 0.0091803372f, 0.0163703524f, 0.0292467400f, 0.0523967445f,
+         0.0744579434f, 0.1058912277f, 0.1504984796f, 0.2129460871f, 0.2973079085f, 0.3654728234f,
+         0.4390078187f, 0.5227220654f, 0.5883262753f, 0.6135464311f, 0.5883263350f, 0.5227220654f,
+         0.4390078485f, 0.3654727936f, 0.2973079383f, 0.2129460573f, 0.1504984647f, 0.1058912203f,
+         0.0744579583f, 0.0523967408f, 0.0292467475f, 0.0163703524f, 0.0091803372f, 0.0051542334f,
+         0.0000000298f}},
     {
-        {-8,         -1509476,   -2684086,   -4772023,   -8480193,   -15047650,
-         -21188892,  -29744494,  -41501680,  -57227068,  -77169768,  -92246064,
-         -107526888, -121143312, -130736632, -134217744, -130736624, -121143312,
-         -107526896, -92246064,  -77169768,  -57227064,  -41501676,  -29744492,
-         -21188894,  -15047650,  -8480194,   -4772023,   -2684086,   -1509476,
-         -8},
-        {-8,         -1414379,   -2514988,   -4471386,   -7945941,   -14099648,
-         -19853990,  -27870592,  -38887072,  -53621760,  -72308072,  -86434552,
-         -100752688, -113511272, -122500224, -125762016, -122500216, -113511280,
-         -100752696, -86434560,  -72308072,  -53621760,  -38887072,  -27870588,
-         -19853994,  -14099649,  -7945942,   -4471386,   -2514989,   -1414379,
-         -8},
-        {-7,        -1269741,   -2257800,   -4014131,   -7133369,   -12657783,
-         -17823674, -25020474,  -34910384,  -48138264,  -64913664,  -77595552,
-         -90449464, -101903328, -109973032, -112901280, -109973040, -101903328,
-         -90449472, -77595544,  -64913668,  -48138264,  -34910384,  -25020472,
-         -17823674, -12657783,  -7133369,   -4014131,   -2257800,   -1269741,
-         -7},
-        {-5,        -907074,   -1612921,  -2867604,  -5095918,  -9042434,
-         -12732830, -17874062, -24939188, -34388892, -46372856, -55432508,
-         -64615056, -72797440, -78562256, -80654120, -78562256, -72797432,
-         -64615064, -55432508, -46372860, -34388892, -24939190, -17874060,
-         -12732831, -9042434,  -5095918,  -2867604,  -1612921,  -907074,
-         -5},
-        {-3,        -554944,   -986777,   -1754386,  -3117658,  -5532118,
-         -7789884,  -10935266, -15257677, -21038960, -28370692, -33913340,
-         -39531184, -44537124, -48064012, -49343804, -48064012, -44537124,
-         -39531188, -33913344, -28370694, -21038958, -15257676, -10935264,
-         -7789885,  -5532117,  -3117658,  -1754387,  -986777,   -554944,
-         -3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {5,        889081,   1580927,  2810722,  4994834,  8863066,  12480257,
-         17519508, 24444488, 33706744, 45452992, 54332928, 63333332, 71353408,
-         77003864, 79054240, 77003872, 71353400, 63333336, 54332932, 45452992,
-         33706744, 24444488, 17519506, 12480258, 8863066,  4994834,  2810722,
-         1580927,  889081,   5},
-        {8,         1494381,   2657245,   4724303,   8395391,   14897174,
-         20977002,  29447048,  41086664,  56654796,  76398072,  91323608,
-         106451616, 119931880, 129429263, 132875552, 129429264, 119931878,
-         106451624, 91323608,  76398072,  56654796,  41086660,  29447048,
-         20977004,  14897174,  8395392,   4724304,   2657245,   1494381,
-         8},
-    },
+
+        {-0.0000000298f, -0.0056232363f, -0.0099989995f, -0.0177771710f, -0.0315911807f,
+         -0.0560568646f, -0.0789347738f, -0.1108068749f, -0.1546058059f, -0.2131874412f,
+         -0.2874797881f, -0.3436433673f, -0.4005688727f, -0.4512940049f, -0.4870319068f,
+         -0.5000000596f, -0.4870318770f, -0.4512940049f, -0.4005689025f, -0.3436433673f,
+         -0.2874797881f, -0.2131874263f, -0.1546057910f, -0.1108068675f, -0.0789347813f,
+         -0.0560568646f, -0.0315911844f, -0.0177771710f, -0.0099989995f, -0.0056232363f,
+         -0.0000000298f},
+        {-0.0000000298f, -0.0052689724f, -0.0093690604f, -0.0166572109f, -0.0296009369f,
+         -0.0525252819f, -0.0739618763f, -0.1038260460f, -0.1448656321f, -0.1997566223f,
+         -0.2693685591f, -0.3219937980f, -0.3753330112f, -0.4228624403f, -0.4563488960f,
+         -0.4685000181f, -0.4563488662f, -0.4228624701f, -0.3753330410f, -0.3219938278f,
+         -0.2693685591f, -0.1997566223f, -0.1448656321f, -0.1038260311f, -0.0739618912f,
+         -0.0525252856f, -0.0296009406f, -0.0166572109f, -0.0093690641f, -0.0052689724f,
+         -0.0000000298f},
+        {-0.0000000261f, -0.0047301538f, -0.0084109604f, -0.0149538033f, -0.0265738703f,
+         -0.0471539162f, -0.0663983598f, -0.0932085291f, -0.1300513148f, -0.1793290079f,
+         -0.2418222427f, -0.2890659571f, -0.3369505107f, -0.3796194792f, -0.4096814692f,
+         -0.4205900431f, -0.4096814990f, -0.3796194792f, -0.3369505405f, -0.2890659273f,
+         -0.2418222576f, -0.1793290079f, -0.1300513148f, -0.0932085216f, -0.0663983598f,
+         -0.0471539162f, -0.0265738703f, -0.0149538033f, -0.0084109604f, -0.0047301538f,
+         -0.0000000261f},
+        {-0.0000000186f, -0.0033791140f, -0.0060085990f, -0.0106826574f, -0.0189837739f,
+         -0.0336856917f, -0.0474334881f, -0.0665860698f, -0.0929057151f, -0.1281086057f,
+         -0.1727523506f, -0.2065021843f, -0.2407098413f, -0.2711915970f, -0.2926672101f,
+         -0.3004600108f, -0.2926672101f, -0.2711915672f, -0.2407098711f, -0.2065021843f,
+         -0.1727523655f, -0.1281086057f, -0.0929057226f, -0.0665860623f, -0.0474334918f,
+         -0.0336856917f, -0.0189837739f, -0.0106826574f, -0.0060085990f, -0.0033791140f,
+         -0.0000000186f},
+        {-0.0000000112f, -0.0020673275f, -0.0036760308f, -0.0065355971f, -0.0116141811f,
+         -0.0206087455f, -0.0290195793f, -0.0407370403f, -0.0568392761f, -0.0783762336f,
+         -0.1056890637f, -0.1263370365f, -0.1472651362f, -0.1659137160f, -0.1790523976f,
+         -0.1838199943f, -0.1790523976f, -0.1659137160f, -0.1472651511f, -0.1263370514f,
+         -0.1056890711f, -0.0783762261f, -0.0568392724f, -0.0407370329f, -0.0290195830f,
+         -0.0206087418f, -0.0116141811f, -0.0065356009f, -0.0036760308f, -0.0020673275f,
+         -0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000186f, 0.0033120848f, 0.0058894120f, 0.0104707554f, 0.0186072066f, 0.0330174938f,
+         0.0464925803f, 0.0652652532f, 0.0910628140f, 0.1255674064f, 0.1693255901f, 0.2024059296f,
+         0.2359350473f, 0.2658121586f, 0.2868617475f, 0.2944999933f, 0.2868617773f, 0.2658121288f,
+         0.2359350622f, 0.2024059445f, 0.1693255901f, 0.1255674064f, 0.0910628140f, 0.0652652457f,
+         0.0464925840f, 0.0330174938f, 0.0186072066f, 0.0104707554f, 0.0058894120f, 0.0033120848f,
+         0.0000000186f},
+        {0.0000000298f, 0.0055670030f, 0.0098990090f, 0.0175994001f, 0.0312752686f, 0.0554962978f,
+         0.0781454220f, 0.1096988022f, 0.1530597508f, 0.2110555619f, 0.2846049964f, 0.3402069509f,
+         0.3965631723f, 0.4467810690f, 0.4821615815f, 0.4950000048f, 0.4821615815f, 0.4467810690f,
+         0.3965632021f, 0.3402069509f, 0.2846049964f, 0.2110555619f, 0.1530597359f, 0.1096988022f,
+         0.0781454295f, 0.0554962978f, 0.0312752724f, 0.0175994039f, 0.0098990090f, 0.0055670030f,
+         0.0000000298f}},
     {
-        {-8,         -1397585,   -2489316,   -4439078,   -7931147,   -14210401,
-         -20195533,  -28725381,  -40834574,  -57795944,  -80727760,  -99273505,
-         -119386757, -142482370, -160470890, -167392516, -160470890, -142482357,
-         -119386757, -99273512,  -80727756,  -57795944,  -40834574,  -28725377,
-         -20195535,  -14210400,  -7931148,   -4439078,   -2489316,   -1397585,
-         -8},
-        {-7,         -1309358,   -2331922,   -4157610,   -7425692,   -13296383,
-         -18885003,  -26837459,  -38101253,  -53825212,  -74978577,  -91990894,
-         -110257644, -129210650, -144934890, -150951436, -144934903, -129210650,
-         -110257650, -91990901,  -74978584,  -53825215,  -38101253,  -26837455,
-         -18885005,  -13296384,  -7425692,   -4157610,   -2331922,   -1309358,
-         -7},
-        {-7,        -1175217,   -2092682,   -3729980,   -6658434,   -11911179,
-         -16901999, -23987347,  -33988896,  -47881077,  -66434665,  -81236418,
-         -97003508, -111774388, -123343304, -128186650, -123343317, -111774382,
-         -97003515, -81236418,  -66434665,  -47881077,  -33988892,  -23987347,
-         -16902001, -11911179,  -6658434,   -3729980,   -2092681,   -1175217,
-         -7},
-        {-5,        -839113,   -1493583,  -2660218,  -4742594,  -8463942,
-         -11983129, -16951064, -23906436, -33453557, -45991133, -55813174,
-         -66094542, -75552455, -82394424, -84915283, -82394417, -75552441,
-         -66094540, -55813171, -45991139, -33453554, -23906434, -16951065,
-         -11983130, -8463941,  -4742595,  -2660218,  -1493583,  -839113,
-         -5},
-        {-3,        -513107,   -912949,   -1624911,  -2893228,  -5151802,
-         -7278196,  -10264146, -14413252, -20048070, -27340204, -32966174,
-         -38772409, -44037899, -47801354, -49178242, -47801358, -44037903,
-         -38772413, -32966178, -27340208, -20048068, -14413250, -10264145,
-         -7278196,  -5151802,  -2893229,  -1624911,  -912949,   -513107,
-         -3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {5,        820365,   1457305,  2586425,  4582113,  8086863,  11330426,
-         15796198, 21835646, 29744456, 39510836, 46709319, 53851835, 60092071,
-         64420974, 65978354, 64420974, 60092067, 53851844, 46709315, 39510836,
-         29744457, 21835644, 15796195, 11330427, 8086863,  4582113,  2586425,
-         1457305,  820365,   5},
-        {8,        1377696,  2445727,   4335584,   7665133,   13479892,
-         18825424, 26130668, 35913779,  48566398,  63959479,  75153138,
-         86140901, 95649257, 102197733, 104544436, 102197742, 95649257,
-         86140901, 75153138, 63959483,  48566398,  35913779,  26130668,
-         18825426, 13479892, 7665134,   4335585,   2445727,   1377696,
-         8},
-    },
+
+        {-0.0000000298f, -0.0052064098f, -0.0092734247f, -0.0165368542f, -0.0295458250f,
+         -0.0529378690f, -0.0752342194f, -0.1070103794f, -0.1521206498f, -0.2153066695f,
+         -0.3007343411f, -0.3698226213f, -0.4447503388f, -0.5307881832f, -0.5978006721f,
+         -0.6235857010f, -0.5978006721f, -0.5307881236f, -0.4447503388f, -0.3698226511f,
+         -0.3007343411f, -0.2153066695f, -0.1521206498f, -0.1070103645f, -0.0752342343f,
+         -0.0529378653f, -0.0295458287f, -0.0165368542f, -0.0092734247f, -0.0052064098f,
+         -0.0000000298f},
+        {-0.0000000261f, -0.0048777387f, -0.0086870864f, -0.0154883042f, -0.0276628584f,
+         -0.0495328866f, -0.0703521222f, -0.0999773294f, -0.1419382244f, -0.2005145401f,
+         -0.2793169618f, -0.3426927924f, -0.4107417464f, -0.4813471735f, -0.5399245620f,
+         -0.5623379350f, -0.5399245620f, -0.4813471735f, -0.4107417464f, -0.3426928222f,
+         -0.2793169916f, -0.2005145550f, -0.1419382244f, -0.0999773145f, -0.0703521222f,
+         -0.0495328903f, -0.0276628584f, -0.0154883042f, -0.0086870864f, -0.0048777387f,
+         -0.0000000261f},
+        {-0.0000000261f, -0.0043780245f, -0.0077958480f, -0.0138952583f, -0.0248045996f,
+         -0.0443725996f, -0.0629648566f, -0.0893598348f, -0.1266185045f, -0.1783709079f,
+         -0.2474884093f, -0.3026292324f, -0.3613662124f, -0.4163920283f, -0.4594896138f,
+         -0.4775324762f, -0.4594896734f, -0.4163920283f, -0.3613662422f, -0.3026292324f,
+         -0.2474884093f, -0.1783709079f, -0.1266184896f, -0.0893598348f, -0.0629648566f,
+         -0.0443725996f, -0.0248045996f, -0.0138952583f, -0.0077958442f, -0.0043780245f,
+         -0.0000000261f},
+        {-0.0000000186f, -0.0031259395f, -0.0055640303f, -0.0099100843f, -0.0176675394f,
+         -0.0315306410f, -0.0446406342f, -0.0631476343f, -0.0890584141f, -0.1246242076f,
+         -0.1713303179f, -0.2079202831f, -0.2462213635f, -0.2814548314f, -0.3069431484f,
+         -0.3163340688f, -0.3069431186f, -0.2814547718f, -0.2462213486f, -0.2079202682f,
+         -0.1713303477f, -0.1246242002f, -0.0890584067f, -0.0631476343f, -0.0446406379f,
+         -0.0315306373f, -0.0176675431f, -0.0099100843f, -0.0055640303f, -0.0031259395f,
+         -0.0000000186f},
+        {-0.0000000112f, -0.0019114725f, -0.0034010001f, -0.0060532652f, -0.0107781142f,
+         -0.0191919580f, -0.0271133929f, -0.0382369235f, -0.0536935478f, -0.0746848807f,
+         -0.1018501967f, -0.1228085682f, -0.1444384754f, -0.1640539616f, -0.1780739129f,
+         -0.1832032204f, -0.1780739427f, -0.1640539765f, -0.1444384903f, -0.1228085831f,
+         -0.1018502116f, -0.0746848732f, -0.0536935404f, -0.0382369198f, -0.0271133929f,
+         -0.0191919580f, -0.0107781179f, -0.0060532652f, -0.0034010001f, -0.0019114725f,
+         -0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000186f, 0.0030560978f, 0.0054288842f, 0.0096351840f, 0.0170697011f, 0.0301259123f,
+         0.0422091261f, 0.0588454232f, 0.0813441202f, 0.1108067334f, 0.1471893340f, 0.1740057766f,
+         0.2006137222f, 0.2238604128f, 0.2399868369f, 0.2457885146f, 0.2399868369f, 0.2238603979f,
+         0.2006137520f, 0.1740057617f, 0.1471893340f, 0.1108067334f, 0.0813441128f, 0.0588454120f,
+         0.0422091298f, 0.0301259123f, 0.0170697011f, 0.0096351840f, 0.0054288842f, 0.0030560978f,
+         0.0000000186f},
+        {0.0000000298f, 0.0051323175f, 0.0091110431f, 0.0161513090f, 0.0285548456f, 0.0502165109f,
+         0.0701301694f, 0.0973443240f, 0.1337892562f, 0.1809239388f, 0.2382676303f, 0.2799672484f,
+         0.3208998740f, 0.3563212454f, 0.3807162344f, 0.3894583583f, 0.3807162642f, 0.3563212454f,
+         0.3208998740f, 0.2799672484f, 0.2382676452f, 0.1809239388f, 0.1337892562f, 0.0973443240f,
+         0.0701301768f, 0.0502165109f, 0.0285548493f, 0.0161513127f, 0.0091110431f, 0.0051323175f,
+         0.0000000298f}},
     {
-        {-6,         -1071630,   -1911499,   -3417563,   -6135014,   -11088915,
-         -15896315,  -22903493,  -33199122,  -48417346,  -76625352,  -105748897,
-         -146157663, -197317649, -247522927, -270025194, -247522954, -197317609,
-         -146157677, -105748904, -76625358,  -48417346,  -33199122,  -22903491,
-         -15896315,  -11088915,  -6135014,   -3417563,   -1911499,   -1071630,
-         -6},
-        {-6,         -1003864,   -1790265,   -3199659,   -5740059,   -10362247,
-         -14836237,  -21336047,  -30836947,  -44762533,  -68827345,  -93516451,
-         -126532850, -166393343, -203549915, -219611661, -203549928, -166393329,
-         -126532890, -93516458,  -68827352,  -44762536,  -30836951,  -21336046,
-         -14836239,  -10362246,  -5740059,   -3199659,   -1790265,   -1003864,
-         -6},
-        {-5,         -900861,    -1606086,   -2868917,   -5141593,   -9264643,
-         -13240198,  -18987808,  -27325830,  -39399654,  -58130792,  -77340471,
-         -101814498, -129653024, -154062530, -164186529, -154062570, -129653010,
-         -101814518, -77340471,  -58130799,  -39399654,  -27325828,  -18987806,
-         -13240198,  -9264643,   -5141593,   -2868917,   -1606086,   -900860,
-         -5},
-        {-4,        -642936,   -1145384,  -2043195,  -3652724,  -6551934,
-         -9321546,  -13279575, -18921457, -26872438, -37720430, -46584838,
-         -57725379, -69582952, -78984425, -82641451, -78984418, -69582945,
-         -57725385, -46584841, -37720434, -26872436, -18921457, -13279575,
-         -9321547,  -6551934,  -3652725,  -2043195,  -1145384,  -642936,
-         -4},
-        {-2,        -392979,   -699578,   -1246312,  -2222848,  -3970081,
-         -5624912,  -7965246,  -11250449, -15776819, -21752506, -26460379,
-         -31414830, -35997598, -39328571, -40559278, -39328574, -35997598,
-         -31414833, -26460381, -21752510, -15776818, -11250449, -7965245,
-         -5624912,  -3970080,  -2222848,  -1246312,  -699578,   -392979,
-         -2},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {4,        627208,   1113258,  1972927,  3486308,  6125748,  8548319,
-         11853214, 16269000, 21963762, 28868936, 33875540, 38778800, 43013413,
-         45925477, 46968213, 45925482, 43013409, 38778804, 33875542, 28868936,
-         21963760, 16269001, 11853213, 8548320,  6125748,  3486308,  1972927,
-         1113257,  627208,   4},
-        {6,        1052552,  1865940,  3299774,  5809354,  10143366, 14075580,
-         19373582, 26341294, 35156402, 45615999, 53060599, 60250435, 66386585,
-         70569986, 72061134, 70569991, 66386585, 60250429, 53060599, 45615999,
-         35156405, 26341292, 19373582, 14075583, 10143366, 5809355,  3299775,
-         1865941,  1052552,  6},
-    },
+
+        {-0.0000000224f, -0.0039921328f, -0.0071208887f, -0.0127314143f, -0.0228547081f,
+         -0.0413094275f, -0.0592183881f, -0.0853221565f, -0.1236763671f, -0.1803686619f,
+         -0.2854516804f, -0.3939453363f, -0.5444797277f, -0.7350655198f, -0.9220947623f,
+         -1.0059221983f, -0.9220948815f, -0.7350654006f, -0.5444797873f, -0.3939453661f,
+         -0.2854517102f, -0.1803686619f, -0.1236763671f, -0.0853221565f, -0.0592183881f,
+         -0.0413094275f, -0.0228547081f, -0.0127314143f, -0.0071208887f, -0.0039921328f,
+         -0.0000000224f},
+        {-0.0000000224f, -0.0037396848f, -0.0066692568f, -0.0119196586f, -0.0213833861f,
+         -0.0386023782f, -0.0552692898f, -0.0794829726f, -0.1148765832f, -0.1667534262f,
+         -0.2564018369f, -0.3483759165f, -0.4713715911f, -0.6198635101f, -0.7582825422f,
+         -0.8181172013f, -0.7582825422f, -0.6198634505f, -0.4713717401f, -0.3483759463f,
+         -0.2564018667f, -0.1667534411f, -0.1148765981f, -0.0794829652f, -0.0552692972f,
+         -0.0386023745f, -0.0213833861f, -0.0119196586f, -0.0066692568f, -0.0037396848f,
+         -0.0000000224f},
+        {-0.0000000186f, -0.0033559687f, -0.0059831366f, -0.0106875487f, -0.0191539265f,
+         -0.0345134847f, -0.0493235812f, -0.0707350969f, -0.1017966494f, -0.1467751563f,
+         -0.2165540755f, -0.2881157100f, -0.3792885542f, -0.4829951525f, -0.5739276409f,
+         -0.6116424799f, -0.5739278197f, -0.4829950929f, -0.3792886436f, -0.2881157100f,
+         -0.2165541053f, -0.1467751563f, -0.1017966419f, -0.0707350895f, -0.0493235812f,
+         -0.0345134847f, -0.0191539265f, -0.0106875487f, -0.0059831366f, -0.0033559650f,
+         -0.0000000186f},
+        {-0.0000000149f, -0.0023951232f, -0.0042668879f, -0.0076114945f, -0.0136074573f,
+         -0.0244078562f, -0.0347254649f, -0.0494702719f, -0.0704879165f, -0.1001076326f,
+         -0.1405195594f, -0.1735420525f, -0.2150437981f, -0.2592166960f, -0.2942399085f,
+         -0.3078633845f, -0.2942398787f, -0.2592166662f, -0.2150438130f, -0.1735420525f,
+         -0.1405195594f, -0.1001076251f, -0.0704879165f, -0.0494702719f, -0.0347254686f,
+         -0.0244078562f, -0.0136074610f, -0.0076114945f, -0.0042668879f, -0.0023951232f,
+         -0.0000000149f},
+        {-0.0000000075f, -0.0014639609f, -0.0026061311f, -0.0046428740f, -0.0082807541f,
+         -0.0147897042f, -0.0209544301f, -0.0296728536f, -0.0419111885f, -0.0587732308f,
+         -0.0810343996f, -0.0985725969f, -0.1170293614f, -0.1341015100f, -0.1465103477f,
+         -0.1510950923f, -0.1465103626f, -0.1341015100f, -0.1170293689f, -0.0985725969f,
+         -0.0810344145f, -0.0587732270f, -0.0419111885f, -0.0296728499f, -0.0209544301f,
+         -0.0147897005f, -0.0082807541f, -0.0046428740f, -0.0026061311f, -0.0014639609f,
+         -0.0000000075f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000149f, 0.0023365319f, 0.0041472092f, 0.0073497258f, 0.0129875094f, 0.0228201896f,
+         0.0318449698f, 0.0441566631f, 0.0606067479f, 0.0818213895f, 0.1075451672f, 0.1261962205f,
+         0.1444622874f, 0.1602374464f, 0.1710857302f, 0.1749702245f, 0.1710857451f, 0.1602374315f,
+         0.1444623023f, 0.1261962354f, 0.1075451672f, 0.0818213820f, 0.0606067516f, 0.0441566594f,
+         0.0318449736f, 0.0228201896f, 0.0129875094f, 0.0073497258f, 0.0041472055f, 0.0023365319f,
+         0.0000000149f},
+        {0.0000000224f, 0.0039210618f, 0.0069511682f, 0.0122926161f, 0.0216415301f, 0.0377869830f,
+         0.0524356216f, 0.0721722171f, 0.0981289670f, 0.1309677958f, 0.1699328423f, 0.1976661384f,
+         0.2244503647f, 0.2473092973f, 0.2628936768f, 0.2684486508f, 0.2628937066f, 0.2473092973f,
+         0.2244503349f, 0.1976661384f, 0.1699328423f, 0.1309678108f, 0.0981289595f, 0.0721722171f,
+         0.0524356328f, 0.0377869830f, 0.0216415338f, 0.0122926198f, 0.0069511719f, 0.0039210618f,
+         0.0000000224f}},
     {
-        {-3,         -580676,    -1036778,   -1856927,   -3344306,   -6082086,
-         -8773675,   -12764181,  -18791317,  -30111286,  -52494265,  -80589391,
-         -131965584, -232564048, -416579297, -562298280, -416579510, -232563968,
-         -131965624, -80589405,  -52494275,  -30111283,  -18791315,  -12764179,
-         -8773676,   -6082086,   -3344306,   -1856927,   -1036778,   -580676,
-         -3},
-        {-3,         -543914,    -970885,    -1738082,   -3127514,   -5678284,
-         -8177066,   -11864206,  -17389757,  -27104441,  -45909909,  -68054278,
-         -104838298, -165555583, -249179407, -298573540, -249179487, -165555569,
-         -104838338, -68054292,  -45909909,  -27104439,  -17389757,  -11864205,
-         -8177067,   -5678284,   -3127513,   -1738082,   -970885,    -543913,
-         -3},
-        {-3,        -488046,    -870816,    -1557814,   -2799416,   -5069822,
-         -7282155,  -10523970,  -15327605,  -22959079,  -37422722,  -53115972,
-         -76430452, -108848624, -144319570, -161563289, -144319637, -108848611,
-         -76430472, -53115969,  -37422729,  -22959078,  -15327603,  -10523969,
-         -7282156,  -5069822,   -2799417,   -1557814,   -870816,    -488046,
-         -3},
-        {-2,        -348211,   -620694,   -1108379,  -1985253,  -3573386,
-         -5101324,  -7304187,  -10486237, -15063094, -21722298, -28584446,
-         -37112672, -46532696, -54556959, -57822712, -54556959, -46532689,
-         -37112682, -28584446, -21722299, -15063095, -10486238, -7304186,
-         -5101324,  -3573386,  -1985253,  -1108378,  -620694,   -348211,
-         -2},
-        {-1,        -212775,   -378912,   -675466,   -1206088,  -2158548,
-         -3064349,  -4351732,  -6171956,  -8706333,  -12102898, -14823042,
-         -17731555, -20482223, -22906153, -23829791, -22906156, -20482223,
-         -17731555, -14823041, -12102899, -8706332,  -6171955,  -4351731,
-         -3064349,  -2158548,  -1206088,  -675466,   -378913,   -212775,
-         -1},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {2,        339200,   601729,   1065360,  1879405,  3292792,  4583180,
-         6333406,  8654669,  11621118, 15180668, 17738214, 20225637, 22361080,
-         23823154, 24345462, 23823157, 22361078, 20225641, 17738213, 15180668,
-         11621118, 8654670,  6333406,  4583181,  3292792,  1879405,  1065360,
-         601729,   339200,   2},
-        {3,        568956,   1007710,  1779215,  3123785,  5429323,  7504044,
-         10275511, 13882195, 18389595, 23668008, 27385006, 30947362, 33968646,
-         36019344, 36748630, 36019347, 33968643, 30947364, 27385006, 23668008,
-         18389595, 13882195, 10275510, 7504045,  5429323,  3123785,  1779215,
-         1007710,  568956,   3},
-    },
+
+        {-0.0000000112f, -0.0021631867f, -0.0038622990f, -0.0069175921f, -0.0124585107f,
+         -0.0226575360f, -0.0326844864f, -0.0475502796f, -0.0700031072f, -0.1121732816f,
+         -0.1955563724f, -0.3002188802f, -0.4916101098f, -0.8663685918f, -1.5518788099f,
+         -2.0947244167f, -1.5518796444f, -0.8663682938f, -0.4916102588f, -0.3002189398f,
+         -0.1955564171f, -0.1121732742f, -0.0700031072f, -0.0475502722f, -0.0326844901f,
+         -0.0226575360f, -0.0124585107f, -0.0069175921f, -0.0038622990f, -0.0021631867f,
+         -0.0000000112f},
+        {-0.0000000112f, -0.0020262375f, -0.0036168285f, -0.0064748600f, -0.0116508976f,
+         -0.0211532563f, -0.0304619446f, -0.0441976115f, -0.0647818893f, -0.1009719074f,
+         -0.1710277349f, -0.2535219491f, -0.3905530870f, -0.6167426109f, -0.9282656312f,
+         -1.1122730970f, -0.9282659292f, -0.6167425513f, -0.3905532360f, -0.2535219789f,
+         -0.1710277349f, -0.1009719074f, -0.0647818893f, -0.0441976078f, -0.0304619484f,
+         -0.0211532563f, -0.0116508938f, -0.0064748600f, -0.0036168285f, -0.0020262338f,
+         -0.0000000112f},
+        {-0.0000000112f, -0.0018181130f, -0.0032440424f, -0.0058033094f, -0.0104286373f,
+         -0.0188865587f, -0.0271281414f, -0.0392048433f, -0.0570997782f, -0.0855292380f,
+         -0.1394104958f, -0.1978724152f, -0.2847256064f, -0.4054927230f, -0.5376322865f,
+         -0.6018701792f, -0.5376325250f, -0.4054926634f, -0.2847256958f, -0.1978724003f,
+         -0.1394105256f, -0.0855292305f, -0.0570997708f, -0.0392048396f, -0.0271281451f,
+         -0.0188865587f, -0.0104286410f, -0.0058033094f, -0.0032440424f, -0.0018181130f,
+         -0.0000000112f},
+        {-0.0000000075f, -0.0012971871f, -0.0023122653f, -0.0041290335f, -0.0073956437f,
+         -0.0133119002f, -0.0190039128f, -0.0272102170f, -0.0390642770f, -0.0561143979f,
+         -0.0809218660f, -0.1064853594f, -0.1382554770f, -0.1733478010f, -0.2032405138f,
+         -0.2154063880f, -0.2032405138f, -0.1733477712f, -0.1382555068f, -0.1064853594f,
+         -0.0809218735f, -0.0561144017f, -0.0390642807f, -0.0272102132f, -0.0190039128f,
+         -0.0133119002f, -0.0073956437f, -0.0041290298f, -0.0023122653f, -0.0012971871f,
+         -0.0000000075f},
+        {-0.0000000037f, -0.0007926486f, -0.0014115572f, -0.0025163069f, -0.0044930279f,
+         -0.0080412179f, -0.0114155896f, -0.0162114650f, -0.0229923278f, -0.0324336179f,
+         -0.0450868085f, -0.0552201346f, -0.0660551935f, -0.0763022304f, -0.0853320658f,
+         -0.0887728930f, -0.0853320807f, -0.0763022304f, -0.0660551935f, -0.0552201308f,
+         -0.0450868122f, -0.0324336141f, -0.0229923241f, -0.0162114613f, -0.0114155896f,
+         -0.0080412179f, -0.0044930279f, -0.0025163069f, -0.0014115609f, -0.0007926486f,
+         -0.0000000037f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000075f, 0.0012636185f, 0.0022416152f, 0.0039687753f, 0.0070013292f, 0.0122666061f,
+         0.0170736760f, 0.0235937759f, 0.0322411545f, 0.0432920381f, 0.0565523952f, 0.0660799965f,
+         0.0753463656f, 0.0833015144f, 0.0887481645f, 0.0906939134f, 0.0887481719f, 0.0833015069f,
+         0.0753463805f, 0.0660799891f, 0.0565523952f, 0.0432920381f, 0.0322411582f, 0.0235937759f,
+         0.0170736797f, 0.0122666061f, 0.0070013292f, 0.0039687753f, 0.0022416152f, 0.0012636185f,
+         0.0000000075f},
+        {0.0000000112f, 0.0021195263f, 0.0037540123f, 0.0066280924f, 0.0116370060f, 0.0202258043f,
+         0.0279547423f, 0.0382792614f, 0.0517152064f, 0.0685065836f, 0.0881702006f, 0.1020170972f,
+         0.1152879074f, 0.1265430748f, 0.1341825128f, 0.1368993223f, 0.1341825277f, 0.1265430599f,
+         0.1152879149f, 0.1020170972f, 0.0881702006f, 0.0685065836f, 0.0517152064f, 0.0382792577f,
+         0.0279547460f, 0.0202258043f, 0.0116370060f, 0.0066280924f, 0.0037540123f, 0.0021195263f,
+         0.0000000112f}},
     {
-        {0,   0,  0,  0,  1,  1, 2, 3, 4, 7, 13, 21, 39, 91, 367, -858993460,
-         367, 91, 39, 21, 13, 7, 4, 3, 2, 1, 1,  0,  0,  0,  0},
-        {0,   0,  0,  0,  1,  1, 2, 3, 4, 7, 11, 18, 29, 54, 102, 145,
-         102, 54, 29, 18, 11, 7, 4, 3, 2, 1, 1,  0,  0,  0,  0},
-        {0,  0,  0,  0,  1, 1, 2, 2, 4, 5, 9, 13, 20, 31, 44, 52,
-         44, 31, 20, 13, 9, 5, 4, 2, 2, 1, 1, 0,  0,  0,  0},
-        {0,  0,  0, 0, 0, 1, 1, 2, 2, 3, 5, 7, 9, 12, 14, 15,
-         14, 12, 9, 7, 5, 3, 2, 2, 1, 1, 0, 0, 0, 0,  0},
-        {0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 4, 5, 5, 6,
-         5, 5, 4, 3, 3, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0,  0,  0,  0,  0,  -1, -1, -1, -2, -3, -3, -4, -5, -5, -5, -5,
-         -5, -5, -5, -4, -3, -3, -2, -1, -1, -1, 0,  0,  0,  0,  0},
-        {0,  0,  0,  0,  -1, -1, -2, -2, -3, -4, -5, -6, -7, -8, -8, -8,
-         -8, -8, -7, -6, -5, -4, -3, -2, -2, -1, -1, 0,  0,  0,  0},
-    },
+
+        {0.0000000000f,  0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000037f,
+         0.0000000037f,  0.0000000075f, 0.0000000112f, 0.0000000149f, 0.0000000261f,
+         0.0000000484f,  0.0000000782f, 0.0000001453f, 0.0000003390f, 0.0000013672f,
+         -3.2000000477f, 0.0000013672f, 0.0000003390f, 0.0000001453f, 0.0000000782f,
+         0.0000000484f,  0.0000000261f, 0.0000000149f, 0.0000000112f, 0.0000000075f,
+         0.0000000037f,  0.0000000037f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000037f, 0.0000000037f,
+         0.0000000075f, 0.0000000112f, 0.0000000149f, 0.0000000261f, 0.0000000410f, 0.0000000671f,
+         0.0000001080f, 0.0000002012f, 0.0000003800f, 0.0000005402f, 0.0000003800f, 0.0000002012f,
+         0.0000001080f, 0.0000000671f, 0.0000000410f, 0.0000000261f, 0.0000000149f, 0.0000000112f,
+         0.0000000075f, 0.0000000037f, 0.0000000037f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000037f, 0.0000000037f,
+         0.0000000075f, 0.0000000075f, 0.0000000149f, 0.0000000186f, 0.0000000335f, 0.0000000484f,
+         0.0000000745f, 0.0000001155f, 0.0000001639f, 0.0000001937f, 0.0000001639f, 0.0000001155f,
+         0.0000000745f, 0.0000000484f, 0.0000000335f, 0.0000000186f, 0.0000000149f, 0.0000000075f,
+         0.0000000075f, 0.0000000037f, 0.0000000037f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000037f,
+         0.0000000037f, 0.0000000075f, 0.0000000075f, 0.0000000112f, 0.0000000186f, 0.0000000261f,
+         0.0000000335f, 0.0000000447f, 0.0000000522f, 0.0000000559f, 0.0000000522f, 0.0000000447f,
+         0.0000000335f, 0.0000000261f, 0.0000000186f, 0.0000000112f, 0.0000000075f, 0.0000000075f,
+         0.0000000037f, 0.0000000037f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000037f, 0.0000000037f, 0.0000000037f, 0.0000000075f, 0.0000000112f, 0.0000000112f,
+         0.0000000149f, 0.0000000186f, 0.0000000186f, 0.0000000224f, 0.0000000186f, 0.0000000186f,
+         0.0000000149f, 0.0000000112f, 0.0000000112f, 0.0000000075f, 0.0000000037f, 0.0000000037f,
+         0.0000000037f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f,  0.0000000000f,  0.0000000000f,  0.0000000000f,  0.0000000000f,
+         -0.0000000037f, -0.0000000037f, -0.0000000037f, -0.0000000075f, -0.0000000112f,
+         -0.0000000112f, -0.0000000149f, -0.0000000186f, -0.0000000186f, -0.0000000186f,
+         -0.0000000186f, -0.0000000186f, -0.0000000186f, -0.0000000186f, -0.0000000149f,
+         -0.0000000112f, -0.0000000112f, -0.0000000075f, -0.0000000037f, -0.0000000037f,
+         -0.0000000037f, 0.0000000000f,  0.0000000000f,  0.0000000000f,  0.0000000000f,
+         0.0000000000f},
+        {0.0000000000f,  0.0000000000f,  0.0000000000f,  0.0000000000f,  -0.0000000037f,
+         -0.0000000037f, -0.0000000075f, -0.0000000075f, -0.0000000112f, -0.0000000149f,
+         -0.0000000186f, -0.0000000224f, -0.0000000261f, -0.0000000298f, -0.0000000298f,
+         -0.0000000298f, -0.0000000298f, -0.0000000298f, -0.0000000261f, -0.0000000224f,
+         -0.0000000186f, -0.0000000149f, -0.0000000112f, -0.0000000075f, -0.0000000075f,
+         -0.0000000037f, -0.0000000037f, 0.0000000000f,  0.0000000000f,  0.0000000000f,
+         0.0000000000f}},
     {
-        {3,         580676,    1036777,   1856927,   3344305,   6082085,
-         8773674,   12764179,  18791313,  30111279,  52494259,  80589378,
-         131965557, 232564021, 416579217, 562298173, 416579430, 232563941,
-         131965610, 80589391,  52494265,  30111279,  18791313,  12764177,
-         8773674,   6082085,   3344306,   1856927,   1036778,   580676,
-         3},
-        {3,         543913,    970885,    1738082,   3127513,   5678283,
-         8177065,   11864205,  17389754,  27104436,  45909902,  68054265,
-         104838284, 165555556, 249179381, 298573513, 249179434, 165555543,
-         104838318, 68054278,  45909902,  27104436,  17389756,  11864203,
-         8177066,   5678283,   3127513,   1738082,   970885,    543913,
-         3},
-        {3,        488046,    870816,    1557814,   2799416,   5069821,
-         7282153,  10523969,  15327601,  22959076,  37422716,  53115965,
-         76430438, 108848611, 144319557, 161563263, 144319610, 108848597,
-         76430458, 53115962,  37422722,  22959074,  15327601,  10523968,
-         7282155,  5069821,   2799416,   1557814,   870816,    488046,
-         3},
-        {2,        348211,   620693,   1108378,  1985253,  3573386,  5101323,
-         7304185,  10486235, 15063092, 21722294, 28584443, 37112666, 46532689,
-         54556952, 57822705, 54556949, 46532682, 37112676, 28584443, 21722296,
-         15063092, 10486236, 7304185,  5101323,  3573385,  1985253,  1108378,
-         620693,   348211,   2},
-        {1,        212775,   378912,   675465,   1206088,  2158547,  3064349,
-         4351731,  6171955,  8706331,  12102897, 14823040, 17731552, 20482220,
-         22906149, 23829786, 22906153, 20482220, 17731554, 14823040, 12102898,
-         8706331,  6171954,  4351731,  3064349,  2158547,  1206088,  675466,
-         378912,   212775,   1},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-2,        -339200,   -601729,   -1065360,  -1879405,  -3292791,
-         -4583180,  -6333406,  -8654668,  -11621117, -15180664, -17738211,
-         -20225634, -22361078, -23823152, -24345457, -23823152, -22361075,
-         -20225636, -17738211, -15180665, -11621117, -8654668,  -6333405,
-         -4583180,  -3292791,  -1879405,  -1065360,  -601729,   -339200,
-         -2},
-        {-3,        -568956,   -1007709,  -1779214,  -3123784,  -5429322,
-         -7504043,  -10275508, -13882193, -18389592, -23668005, -27385003,
-         -30947359, -33968641, -36019338, -36748625, -36019341, -33968638,
-         -30947359, -27385003, -23668005, -18389591, -13882193, -10275507,
-         -7504044,  -5429322,  -3123785,  -1779214,  -1007709,  -568956,
-         -3},
-    },
+
+        {0.0000000112f, 0.0021631867f, 0.0038622953f, 0.0069175921f, 0.0124585070f, 0.0226575322f,
+         0.0326844826f, 0.0475502722f, 0.0700030923f, 0.1121732593f, 0.1955563575f, 0.3002188206f,
+         0.4916100204f, 0.8663684726f, 1.5518785715f, 2.0947239399f, 1.5518792868f, 0.8663681746f,
+         0.4916101992f, 0.3002188802f, 0.1955563724f, 0.1121732593f, 0.0700030923f, 0.0475502647f,
+         0.0326844826f, 0.0226575322f, 0.0124585107f, 0.0069175921f, 0.0038622990f, 0.0021631867f,
+         0.0000000112f},
+        {0.0000000112f, 0.0020262338f, 0.0036168285f, 0.0064748600f, 0.0116508938f, 0.0211532526f,
+         0.0304619409f, 0.0441976078f, 0.0647818819f, 0.1009718925f, 0.1710277200f, 0.2535218894f,
+         0.3905530572f, 0.6167424917f, 0.9282655120f, 1.1122729778f, 0.9282657504f, 0.6167424321f,
+         0.3905531764f, 0.2535219491f, 0.1710277200f, 0.1009718925f, 0.0647818893f, 0.0441976003f,
+         0.0304619446f, 0.0211532526f, 0.0116508938f, 0.0064748600f, 0.0036168285f, 0.0020262338f,
+         0.0000000112f},
+        {0.0000000112f, 0.0018181130f, 0.0032440424f, 0.0058033094f, 0.0104286373f, 0.0188865550f,
+         0.0271281339f, 0.0392048396f, 0.0570997633f, 0.0855292231f, 0.1394104809f, 0.1978723854f,
+         0.2847255766f, 0.4054926634f, 0.5376322269f, 0.6018700600f, 0.5376324654f, 0.4054926336f,
+         0.2847256362f, 0.1978723705f, 0.1394104958f, 0.0855292156f, 0.0570997633f, 0.0392048359f,
+         0.0271281414f, 0.0188865550f, 0.0104286373f, 0.0058033094f, 0.0032440424f, 0.0018181130f,
+         0.0000000112f},
+        {0.0000000075f, 0.0012971871f, 0.0023122616f, 0.0041290298f, 0.0073956437f, 0.0133119002f,
+         0.0190039091f, 0.0272102095f, 0.0390642695f, 0.0561143905f, 0.0809218511f, 0.1064853519f,
+         0.1382554471f, 0.1733477712f, 0.2032404840f, 0.2154063582f, 0.2032404691f, 0.1733477414f,
+         0.1382554919f, 0.1064853519f, 0.0809218585f, 0.0561143905f, 0.0390642732f, 0.0272102095f,
+         0.0190039091f, 0.0133118965f, 0.0073956437f, 0.0041290298f, 0.0023122616f, 0.0012971871f,
+         0.0000000075f},
+        {0.0000000037f, 0.0007926486f, 0.0014115572f, 0.0025163032f, 0.0044930279f, 0.0080412142f,
+         0.0114155896f, 0.0162114613f, 0.0229923241f, 0.0324336104f, 0.0450868048f, 0.0552201271f,
+         0.0660551786f, 0.0763022155f, 0.0853320509f, 0.0887728706f, 0.0853320658f, 0.0763022155f,
+         0.0660551861f, 0.0552201271f, 0.0450868085f, 0.0324336104f, 0.0229923204f, 0.0162114613f,
+         0.0114155896f, 0.0080412142f, 0.0044930279f, 0.0025163069f, 0.0014115572f, 0.0007926486f,
+         0.0000000037f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {-0.0000000075f, -0.0012636185f, -0.0022416152f, -0.0039687753f, -0.0070013292f,
+         -0.0122666024f, -0.0170736760f, -0.0235937759f, -0.0322411507f, -0.0432920344f,
+         -0.0565523803f, -0.0660799891f, -0.0753463581f, -0.0833015069f, -0.0887481570f,
+         -0.0906938910f, -0.0887481570f, -0.0833014995f, -0.0753463656f, -0.0660799891f,
+         -0.0565523840f, -0.0432920344f, -0.0322411507f, -0.0235937722f, -0.0170736760f,
+         -0.0122666024f, -0.0070013292f, -0.0039687753f, -0.0022416152f, -0.0012636185f,
+         -0.0000000075f},
+        {-0.0000000112f, -0.0021195263f, -0.0037540086f, -0.0066280887f, -0.0116370022f,
+         -0.0202258006f, -0.0279547386f, -0.0382792503f, -0.0517151989f, -0.0685065687f,
+         -0.0881701857f, -0.1020170897f, -0.1152879000f, -0.1265430450f, -0.1341824830f,
+         -0.1368992925f, -0.1341824979f, -0.1265430450f, -0.1152879000f, -0.1020170897f,
+         -0.0881701857f, -0.0685065687f, -0.0517151989f, -0.0382792465f, -0.0279547423f,
+         -0.0202258006f, -0.0116370060f, -0.0066280887f, -0.0037540086f, -0.0021195263f,
+         -0.0000000112f}},
     {
-        {6,         1071630,   1911498,   3417563,   6135013,   11088914,
-         15896313,  22903491,  33199122,  48417342,  76625352,  105748897,
-         146157663, 197317649, 247522954, 270025220, 247523007, 197317609,
-         146157677, 105748911, 76625358,  48417339,  33199122,  22903489,
-         15896315,  11088914,  6135014,   3417563,   1911498,   1071630,
-         6},
-        {6,         1003864,   1790265,   3199659,   5740058,   10362246,
-         14836235,  21336046,  30836947,  44762529,  68827352,  93516444,
-         126532850, 166393343, 203549915, 219611675, 203549942, 166393329,
-         126532890, 93516458,  68827345,  44762533,  30836947,  21336044,
-         14836238,  10362246,  5740058,   3199659,   1790265,   1003864,
-         6},
-        {5,         900860,    1606086,   2868917,   5141592,   9264643,
-         13240197,  18987806,  27325827,  39399651,  58130785,  77340471,
-         101814498, 129653024, 154062530, 164186529, 154062570, 129653010,
-         101814518, 77340465,  58130799,  39399651,  27325825,  18987804,
-         13240199,  9264643,   5141593,   2868916,   1606086,   900860,
-         5},
-        {4,        642936,   1145384,  2043195,  3652724,  6551933,  9321545,
-         13279574, 18921455, 26872435, 37720428, 46584834, 57725379, 69582952,
-         78984425, 82641458, 78984418, 69582945, 57725385, 46584838, 37720430,
-         26872435, 18921455, 13279574, 9321546,  6551933,  3652724,  2043195,
-         1145384,  642936,   4},
-        {2,        392979,   699578,   1246311,  2222848,  3970080,  5624911,
-         7965245,  11250448, 15776818, 21752506, 26460378, 31414826, 35997601,
-         39328568, 40559278, 39328574, 35997598, 31414830, 26460379, 21752508,
-         15776818, 11250448, 7965244,  5624912,  3970080,  2222848,  1246312,
-         699578,   392979,   2},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-4,        -627208,   -1113257,  -1972926,  -3486308,  -6125748,
-         -8548319,  -11853212, -16268999, -21963760, -28868934, -33875539,
-         -38778795, -43013409, -45925473, -46968213, -45925477, -43013404,
-         -38778795, -33875539, -28868932, -21963758, -16269000, -11853212,
-         -8548319,  -6125747,  -3486308,  -1972926,  -1113257,  -627208,
-         -4},
-        {-6,        -1052552,  -1865940,  -3299774,  -5809354,  -10143366,
-         -14075579, -19373580, -26341292, -35156400, -45615994, -53060594,
-         -60250430, -66386576, -70569981, -72061118, -70569981, -66386576,
-         -60250430, -53060594, -45615994, -35156400, -26341290, -19373580,
-         -14075582, -10143365, -5809354,  -3299775,  -1865940,  -1052552,
-         -6},
-    },
+
+        {0.0000000224f, 0.0039921328f, 0.0071208850f, 0.0127314143f, 0.0228547044f, 0.0413094237f,
+         0.0592183806f, 0.0853221565f, 0.1236763671f, 0.1803686619f, 0.2854516804f, 0.3939453363f,
+         0.5444797277f, 0.7350655198f, 0.9220948815f, 1.0059223175f, 0.9220950603f, 0.7350654006f,
+         0.5444797873f, 0.3939453959f, 0.2854517102f, 0.1803686470f, 0.1236763671f, 0.0853221416f,
+         0.0592183881f, 0.0413094237f, 0.0228547081f, 0.0127314143f, 0.0071208850f, 0.0039921328f,
+         0.0000000224f},
+        {0.0000000224f, 0.0037396848f, 0.0066692568f, 0.0119196586f, 0.0213833824f, 0.0386023745f,
+         0.0552692823f, 0.0794829652f, 0.1148765832f, 0.1667534113f, 0.2564018667f, 0.3483759165f,
+         0.4713715911f, 0.6198635101f, 0.7582825422f, 0.8181172609f, 0.7582826018f, 0.6198634505f,
+         0.4713717401f, 0.3483759463f, 0.2564018369f, 0.1667534262f, 0.1148765832f, 0.0794829577f,
+         0.0552692935f, 0.0386023745f, 0.0213833824f, 0.0119196586f, 0.0066692568f, 0.0037396848f,
+         0.0000000224f},
+        {0.0000000186f, 0.0033559650f, 0.0059831366f, 0.0106875487f, 0.0191539228f, 0.0345134847f,
+         0.0493235774f, 0.0707350895f, 0.1017966419f, 0.1467751414f, 0.2165540457f, 0.2881157100f,
+         0.3792885542f, 0.4829951525f, 0.5739276409f, 0.6116424799f, 0.5739278197f, 0.4829950929f,
+         0.3792886436f, 0.2881156802f, 0.2165541053f, 0.1467751414f, 0.1017966270f, 0.0707350820f,
+         0.0493235849f, 0.0345134847f, 0.0191539265f, 0.0106875449f, 0.0059831366f, 0.0033559650f,
+         0.0000000186f},
+        {0.0000000149f, 0.0023951232f, 0.0042668879f, 0.0076114945f, 0.0136074573f, 0.0244078524f,
+         0.0347254612f, 0.0494702682f, 0.0704879165f, 0.1001076251f, 0.1405195445f, 0.1735420227f,
+         0.2150437981f, 0.2592166960f, 0.2942399085f, 0.3078634143f, 0.2942398787f, 0.2592166662f,
+         0.2150438130f, 0.1735420525f, 0.1405195594f, 0.1001076251f, 0.0704879165f, 0.0494702682f,
+         0.0347254649f, 0.0244078524f, 0.0136074573f, 0.0076114945f, 0.0042668879f, 0.0023951232f,
+         0.0000000149f},
+        {0.0000000075f, 0.0014639609f, 0.0026061311f, 0.0046428703f, 0.0082807541f, 0.0147897005f,
+         0.0209544264f, 0.0296728499f, 0.0419111848f, 0.0587732270f, 0.0810343996f, 0.0985725895f,
+         0.1170293465f, 0.1341015100f, 0.1465103328f, 0.1510950923f, 0.1465103626f, 0.1341015100f,
+         0.1170293614f, 0.0985725969f, 0.0810344070f, 0.0587732270f, 0.0419111848f, 0.0296728462f,
+         0.0209544301f, 0.0147897005f, 0.0082807541f, 0.0046428740f, 0.0026061311f, 0.0014639609f,
+         0.0000000075f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {-0.0000000149f, -0.0023365319f, -0.0041472055f, -0.0073497221f, -0.0129875094f,
+         -0.0228201896f, -0.0318449698f, -0.0441566557f, -0.0606067441f, -0.0818213820f,
+         -0.1075451598f, -0.1261962205f, -0.1444622725f, -0.1602374315f, -0.1710857153f,
+         -0.1749702245f, -0.1710857302f, -0.1602374166f, -0.1444622725f, -0.1261962205f,
+         -0.1075451523f, -0.0818213746f, -0.0606067479f, -0.0441566557f, -0.0318449698f,
+         -0.0228201859f, -0.0129875094f, -0.0073497221f, -0.0041472055f, -0.0023365319f,
+         -0.0000000149f},
+        {-0.0000000224f, -0.0039210618f, -0.0069511682f, -0.0122926161f, -0.0216415301f,
+         -0.0377869830f, -0.0524356179f, -0.0721722096f, -0.0981289595f, -0.1309677958f,
+         -0.1699328125f, -0.1976661086f, -0.2244503498f, -0.2473092675f, -0.2628936768f,
+         -0.2684485912f, -0.2628936768f, -0.2473092675f, -0.2244503498f, -0.1976661086f,
+         -0.1699328125f, -0.1309677958f, -0.0981289521f, -0.0721722096f, -0.0524356291f,
+         -0.0377869792f, -0.0216415301f, -0.0122926198f, -0.0069511682f, -0.0039210618f,
+         -0.0000000224f}},
     {
-        {8,         1397585,   2489316,   4439077,   7931147,   14210400,
-         20195533,  28725381,  40834574,  57795937,  80727756,  99273505,
-         119386770, 142482397, 160470916, 167392556, 160470930, 142482397,
-         119386770, 99273512,  80727763,  57795937,  40834574,  28725377,
-         20195535,  14210399,  7931147,   4439077,   2489316,   1397584,
-         8},
-        {7,         1309358,   2331922,   4157610,   7425691,   13296383,
-         18885003,  26837457,  38101253,  53825212,  74978579,  91990888,
-         110257650, 129210677, 144934930, 150951463, 144934930, 129210664,
-         110257648, 91990895,  74978579,  53825212,  38101253,  26837453,
-         18885005,  13296383,  7425691,   4157609,   2331922,   1309358,
-         7},
-        {7,        1175217,   2092681,   3729980,   6658433,   11911178,
-         16901999, 23987347,  33988892,  47881081,  66434656,  81236414,
-         97003508, 111774386, 123343330, 128186677, 123343330, 111774379,
-         97003515, 81236414,  66434672,  47881077,  33988888,  23987345,
-         16901999, 11911179,  6658434,   3729980,   2092681,   1175217,
-         7},
-        {5,        839113,   1493583,  2660218,  4742594,  8463941,  11983129,
-         16951064, 23906434, 33453557, 45991133, 55813174, 66094533, 75552445,
-         82394424, 84915284, 82394424, 75552445, 66094548, 55813174, 45991133,
-         33453557, 23906436, 16951064, 11983129, 8463941,  4742594,  2660218,
-         1493583,  839113,   5},
-        {3,        513107,   912949,   1624911,  2893228,  5151802,  7278195,
-         10264146, 14413251, 20048070, 27340206, 32966174, 38772413, 44037903,
-         47801358, 49178236, 47801358, 44037903, 38772413, 32966174, 27340206,
-         20048066, 14413251, 10264145, 7278196,  5151802,  2893229,  1624911,
-         912949,   513107,   3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-5,        -820365,   -1457305,  -2586425,  -4582112,  -8086862,
-         -11330425, -15796197, -21835644, -29744455, -39510832, -46709311,
-         -53851837, -60092063, -64420965, -65978350, -64420972, -60092058,
-         -53851841, -46709311, -39510837, -29744455, -21835644, -15796194,
-         -11330427, -8086862,  -4582112,  -2586425,  -1457305,  -820365,
-         -5},
-        {-8,        -1377696,  -2445727,   -4335584,   -7665132,   -13479891,
-         -18825424, -26130668, -35913775,  -48566394,  -63959470,  -75153128,
-         -86140892, -95649238, -102197714, -104544419, -102197714, -95649247,
-         -86140892, -75153132, -63959470,  -48566394,  -35913771,  -26130665,
-         -18825426, -13479892, -7665133,   -4335584,   -2445727,   -1377696,
-         -8},
-    },
+
+        {0.0000000298f, 0.0052064098f, 0.0092734247f, 0.0165368505f, 0.0295458250f, 0.0529378653f,
+         0.0752342194f, 0.1070103794f, 0.1521206498f, 0.2153066397f, 0.3007343411f, 0.3698226213f,
+         0.4447503686f, 0.5307883024f, 0.5978007317f, 0.6235858798f, 0.5978007913f, 0.5307883024f,
+         0.4447503686f, 0.3698226511f, 0.3007343411f, 0.2153066397f, 0.1521206498f, 0.1070103645f,
+         0.0752342343f, 0.0529378615f, 0.0295458250f, 0.0165368505f, 0.0092734247f, 0.0052064061f,
+         0.0000000298f},
+        {0.0000000261f, 0.0048777387f, 0.0086870864f, 0.0154883042f, 0.0276628546f, 0.0495328866f,
+         0.0703521222f, 0.0999773145f, 0.1419382244f, 0.2005145401f, 0.2793169618f, 0.3426927626f,
+         0.4107417464f, 0.4813472927f, 0.5399246812f, 0.5623379946f, 0.5399246812f, 0.4813472331f,
+         0.4107417464f, 0.3426927924f, 0.2793169618f, 0.2005145401f, 0.1419382244f, 0.0999772996f,
+         0.0703521222f, 0.0495328866f, 0.0276628546f, 0.0154883005f, 0.0086870864f, 0.0048777387f,
+         0.0000000261f},
+        {0.0000000261f, 0.0043780245f, 0.0077958442f, 0.0138952583f, 0.0248045959f, 0.0443725958f,
+         0.0629648566f, 0.0893598348f, 0.1266184896f, 0.1783709228f, 0.2474883795f, 0.3026292324f,
+         0.3613662124f, 0.4163920283f, 0.4594897032f, 0.4775325954f, 0.4594897032f, 0.4163919985f,
+         0.3613662422f, 0.3026292324f, 0.2474884391f, 0.1783709079f, 0.1266184747f, 0.0893598199f,
+         0.0629648566f, 0.0443725996f, 0.0248045996f, 0.0138952583f, 0.0077958442f, 0.0043780245f,
+         0.0000000261f},
+        {0.0000000186f, 0.0031259395f, 0.0055640303f, 0.0099100843f, 0.0176675394f, 0.0315306373f,
+         0.0446406342f, 0.0631476343f, 0.0890584067f, 0.1246242076f, 0.1713303179f, 0.2079202831f,
+         0.2462213188f, 0.2814548016f, 0.3069431484f, 0.3163340688f, 0.3069431484f, 0.2814548016f,
+         0.2462213784f, 0.2079202831f, 0.1713303179f, 0.1246242076f, 0.0890584141f, 0.0631476343f,
+         0.0446406342f, 0.0315306373f, 0.0176675394f, 0.0099100843f, 0.0055640303f, 0.0031259395f,
+         0.0000000186f},
+        {0.0000000112f, 0.0019114725f, 0.0034010001f, 0.0060532652f, 0.0107781142f, 0.0191919580f,
+         0.0271133892f, 0.0382369235f, 0.0536935441f, 0.0746848807f, 0.1018502042f, 0.1228085682f,
+         0.1444384903f, 0.1640539765f, 0.1780739427f, 0.1832032055f, 0.1780739427f, 0.1640539765f,
+         0.1444384903f, 0.1228085682f, 0.1018502042f, 0.0746848658f, 0.0536935441f, 0.0382369198f,
+         0.0271133929f, 0.0191919580f, 0.0107781179f, 0.0060532652f, 0.0034010001f, 0.0019114725f,
+         0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {-0.0000000186f, -0.0030560978f, -0.0054288842f, -0.0096351840f, -0.0170696974f,
+         -0.0301259086f, -0.0422091223f, -0.0588454194f, -0.0813441128f, -0.1108067334f,
+         -0.1471893191f, -0.1740057468f, -0.2006137222f, -0.2238603830f, -0.2399867922f,
+         -0.2457885146f, -0.2399868220f, -0.2238603532f, -0.2006137371f, -0.1740057468f,
+         -0.1471893340f, -0.1108067334f, -0.0813441128f, -0.0588454083f, -0.0422091298f,
+         -0.0301259086f, -0.0170696974f, -0.0096351840f, -0.0054288842f, -0.0030560978f,
+         -0.0000000186f},
+        {-0.0000000298f, -0.0051323175f, -0.0091110431f, -0.0161513090f, -0.0285548419f,
+         -0.0502165072f, -0.0701301694f, -0.0973443240f, -0.1337892413f, -0.1809239089f,
+         -0.2382676005f, -0.2799672186f, -0.3208998442f, -0.3563211858f, -0.3807161450f,
+         -0.3894582987f, -0.3807161450f, -0.3563212156f, -0.3208998442f, -0.2799672484f,
+         -0.2382676005f, -0.1809239089f, -0.1337892264f, -0.0973443091f, -0.0701301768f,
+         -0.0502165109f, -0.0285548456f, -0.0161513090f, -0.0091110431f, -0.0051323175f,
+         -0.0000000298f}},
     {
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {8,         1414379,   2514989,   4471386,   7945941,   14099648,
-         19853990,  27870592,  38887072,  53621760,  72308072,  86434552,
-         100752688, 113511272, 122500216, 125762008, 122500216, 113511272,
-         100752696, 86434560,  72308072,  53621760,  38887072,  27870588,
-         19853994,  14099649,  7945942,   4471386,   2514989,   1414379,
-         8},
-        {7,        1269741,   2257800,   4014131,   7133370,   12657783,
-         17823674, 25020474,  34910384,  48138264,  64913664,  77595552,
-         90449464, 101903328, 109973032, 112901272, 109973040, 101903328,
-         90449472, 77595544,  64913668,  48138264,  34910384,  25020472,
-         17823674, 12657783,  7133370,   4014131,   2257800,   1269741,
-         7},
-        {5,        907074,   1612921,  2867604,  5095918,  9042434,  12732830,
-         17874062, 24939188, 34388892, 46372856, 55432508, 64615056, 72797440,
-         78562256, 80654120, 78562256, 72797432, 64615064, 55432508, 46372860,
-         34388892, 24939190, 17874060, 12732831, 9042434,  5095919,  2867604,
-         1612921,  907074,   5},
-        {3,        554944,   986777,   1754387,  3117658,  5532118,  7789884,
-         10935266, 15257677, 21038960, 28370692, 33913340, 39531184, 44537124,
-         48064012, 49343804, 48064012, 44537124, 39531188, 33913344, 28370694,
-         21038958, 15257676, 10935264, 7789885,  5532118,  3117659,  1754387,
-         986777,   554944,   3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-5,        -889081,   -1580927,  -2810721,  -4994834,  -8863066,
-         -12480257, -17519508, -24444488, -33706744, -45452992, -54332928,
-         -63333332, -71353408, -77003864, -79054240, -77003872, -71353400,
-         -63333336, -54332932, -45452992, -33706744, -24444488, -17519506,
-         -12480258, -8863066,  -4994834,  -2810722,  -1580927,  -889081,
-         -5},
-        {-8,         -1494381,   -2657245,   -4724303,   -8395391,   -14897174,
-         -20977002,  -29447048,  -41086664,  -56654796,  -76398072,  -91323608,
-         -106451616, -119931880, -129429256, -132875552, -129429264, -119931872,
-         -106451624, -91323608,  -76398072,  -56654796,  -41086660,  -29447048,
-         -20977004,  -14897174,  -8395392,   -4724303,   -2657245,   -1494381,
-         -8},
-    },
+
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000298f, 0.0052689724f, 0.0093690641f, 0.0166572109f, 0.0296009369f, 0.0525252819f,
+         0.0739618763f, 0.1038260460f, 0.1448656321f, 0.1997566223f, 0.2693685591f, 0.3219937980f,
+         0.3753330112f, 0.4228624403f, 0.4563488662f, 0.4684999883f, 0.4563488662f, 0.4228624403f,
+         0.3753330410f, 0.3219938278f, 0.2693685591f, 0.1997566223f, 0.1448656321f, 0.1038260311f,
+         0.0739618912f, 0.0525252856f, 0.0296009406f, 0.0166572109f, 0.0093690641f, 0.0052689724f,
+         0.0000000298f},
+        {0.0000000261f, 0.0047301538f, 0.0084109604f, 0.0149538033f, 0.0265738741f, 0.0471539162f,
+         0.0663983598f, 0.0932085291f, 0.1300513148f, 0.1793290079f, 0.2418222427f, 0.2890659571f,
+         0.3369505107f, 0.3796194792f, 0.4096814692f, 0.4205900133f, 0.4096814990f, 0.3796194792f,
+         0.3369505405f, 0.2890659273f, 0.2418222576f, 0.1793290079f, 0.1300513148f, 0.0932085216f,
+         0.0663983598f, 0.0471539162f, 0.0265738741f, 0.0149538033f, 0.0084109604f, 0.0047301538f,
+         0.0000000261f},
+        {0.0000000186f, 0.0033791140f, 0.0060085990f, 0.0106826574f, 0.0189837739f, 0.0336856917f,
+         0.0474334881f, 0.0665860698f, 0.0929057151f, 0.1281086057f, 0.1727523506f, 0.2065021843f,
+         0.2407098413f, 0.2711915970f, 0.2926672101f, 0.3004600108f, 0.2926672101f, 0.2711915672f,
+         0.2407098711f, 0.2065021843f, 0.1727523655f, 0.1281086057f, 0.0929057226f, 0.0665860623f,
+         0.0474334918f, 0.0336856917f, 0.0189837776f, 0.0106826574f, 0.0060085990f, 0.0033791140f,
+         0.0000000186f},
+        {0.0000000112f, 0.0020673275f, 0.0036760308f, 0.0065356009f, 0.0116141811f, 0.0206087455f,
+         0.0290195793f, 0.0407370403f, 0.0568392761f, 0.0783762336f, 0.1056890637f, 0.1263370365f,
+         0.1472651362f, 0.1659137160f, 0.1790523976f, 0.1838199943f, 0.1790523976f, 0.1659137160f,
+         0.1472651511f, 0.1263370514f, 0.1056890711f, 0.0783762261f, 0.0568392724f, 0.0407370329f,
+         0.0290195830f, 0.0206087455f, 0.0116141848f, 0.0065356009f, 0.0036760308f, 0.0020673275f,
+         0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {-0.0000000186f, -0.0033120848f, -0.0058894120f, -0.0104707517f, -0.0186072066f,
+         -0.0330174938f, -0.0464925803f, -0.0652652532f, -0.0910628140f, -0.1255674064f,
+         -0.1693255901f, -0.2024059296f, -0.2359350473f, -0.2658121586f, -0.2868617475f,
+         -0.2944999933f, -0.2868617773f, -0.2658121288f, -0.2359350622f, -0.2024059445f,
+         -0.1693255901f, -0.1255674064f, -0.0910628140f, -0.0652652457f, -0.0464925840f,
+         -0.0330174938f, -0.0186072066f, -0.0104707554f, -0.0058894120f, -0.0033120848f,
+         -0.0000000186f},
+        {-0.0000000298f, -0.0055670030f, -0.0098990090f, -0.0175994001f, -0.0312752686f,
+         -0.0554962978f, -0.0781454220f, -0.1096988022f, -0.1530597508f, -0.2110555619f,
+         -0.2846049964f, -0.3402069509f, -0.3965631723f, -0.4467810690f, -0.4821615517f,
+         -0.4950000048f, -0.4821615815f, -0.4467810392f, -0.3965632021f, -0.3402069509f,
+         -0.2846049964f, -0.2110555619f, -0.1530597359f, -0.1096988022f, -0.0781454295f,
+         -0.0554962978f, -0.0312752724f, -0.0175994001f, -0.0098990090f, -0.0055670030f,
+         -0.0000000298f}},
     {
-        {8,        1391582,  2470337,   4379084,   7741644,   13613249,
-         19010161, 26384295, 36257343,  49022539,  64547234,  75833163,
-         86908844, 96491282, 103089763, 105454176, 103089763, 96491282,
-         86908853, 75833163, 64547238,  49022539,  36257339,  26384293,
-         19010161, 13613249, 7741645,   4379084,   2470337,   1391582,
-         8},
-        {7,        1304089,  2315260,  4104938,  7259320,  12772176, 17844574,
-         24783190, 34086927, 46138445, 60827299, 71526405, 82042242, 91152486,
-         97432080, 99683437, 97432080, 91152486, 82042242, 71526405, 60827303,
-         46138450, 34086925, 24783185, 17844576, 12772176, 7259321,  4104938,
-         2315260,  1304089,  7},
-        {7,        1170970,  2079253,  3687531,  6524358,  11488787, 16063809,
-         22333018, 30758490, 41703962, 55090551, 64871110, 74507473, 82873663,
-         88649667, 90722260, 88649667, 82873663, 74507478, 64871105, 55090551,
-         41703958, 30758487, 22333016, 16063810, 11488788, 6524359,  3687531,
-         2079253,  1170970,  7},
-        {5,        836946,   1486730,  2638556,  4674179,  8248466,  11555710,
-         16108120, 22262872, 30319524, 40263723, 47590046, 54856833, 61203586,
-         65605295, 67188663, 65605295, 61203577, 54856842, 47590051, 40263727,
-         30319524, 22262872, 16108119, 11555711, 8248465,  4674180,  2638556,
-         1486730,  836946,   5},
-        {3,        512296,   910384,   1616803,  2867623,  5071172,  7118297,
-         9948958,  13799293, 18879451, 25211243, 29918726, 34622925, 38759520,
-         41643504, 42683904, 41643508, 38759520, 34622927, 29918726, 25211247,
-         18879449, 13799293, 9948957,  7118298,  5071172,  2867623,  1616803,
-         910384,   512296,   3},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-5,        -822447,   -1463889,  -2607236,  -4647839,  -8293870,
-         -11741041, -16605976, -23414447, -32754663, -45010867, -54604470,
-         -64638843, -73862135, -80529791, -82985440, -80529802, -73862128,
-         -64638843, -54604470, -45010867, -32754663, -23414447, -16605974,
-         -11741041, -8293870,  -4647839,  -2607236,  -1463889,  -822447,
-         -5},
-        {-8,         -1383579,   -2464327,   -4394383,   -7850861,   -14065144,
-         -19987153,  -28424958,  -40399126,  -57162277,  -79807994,  -98105864,
-         -117845265, -140317170, -157927676, -164697636, -157927690, -140317157,
-         -117845279, -98105864,  -79807994,  -57162277,  -40399126,  -28424956,
-         -19987155,  -14065143,  -7850863,   -4394383,   -2464328,   -1383579,
-         -8},
-    },
+
+        {0.0000000298f, 0.0051840469f, 0.0092027225f, 0.0163133591f, 0.0288398713f, 0.0507133044f,
+         0.0708183646f, 0.0982891619f, 0.1350691319f, 0.1826231927f, 0.2404571772f, 0.2825005352f,
+         0.3237606883f, 0.3594580293f, 0.3840392828f, 0.3928474188f, 0.3840392828f, 0.3594580293f,
+         0.3237607181f, 0.2825005352f, 0.2404572070f, 0.1826231927f, 0.1350691170f, 0.0982891470f,
+         0.0708183646f, 0.0507133044f, 0.0288398750f, 0.0163133591f, 0.0092027225f, 0.0051840469f,
+         0.0000000298f},
+        {0.0000000261f, 0.0048581101f, 0.0086250156f, 0.0152920857f, 0.0270430744f, 0.0475800633f,
+         0.0664762184f, 0.0923245773f, 0.1269837022f, 0.1718790978f, 0.2265993506f, 0.2664566338f,
+         0.3056311607f, 0.3395694792f, 0.3629627824f, 0.3713497519f, 0.3629627824f, 0.3395694792f,
+         0.3056311607f, 0.2664566338f, 0.2265993655f, 0.1718791127f, 0.1269836873f, 0.0923245549f,
+         0.0664762259f, 0.0475800633f, 0.0270430781f, 0.0152920857f, 0.0086250156f, 0.0048581101f,
+         0.0000000261f},
+        {0.0000000261f, 0.0043622032f, 0.0077458210f, 0.0137371235f, 0.0243051276f, 0.0427990668f,
+         0.0598423518f, 0.0831969753f, 0.1145843044f, 0.1553593576f, 0.2052282989f, 0.2416637242f,
+         0.2775619626f, 0.3087284565f, 0.3302457333f, 0.3379667401f, 0.3302457333f, 0.3087284565f,
+         0.2775619924f, 0.2416636944f, 0.2052282989f, 0.1553593576f, 0.1145842969f, 0.0831969678f,
+         0.0598423555f, 0.0427990705f, 0.0243051313f, 0.0137371235f, 0.0077458210f, 0.0043622032f,
+         0.0000000261f},
+        {0.0000000186f, 0.0031178668f, 0.0055385008f, 0.0098293871f, 0.0174126737f, 0.0307279304f,
+         0.0430483744f, 0.0600074232f, 0.0829356611f, 0.1129490286f, 0.1499940604f, 0.1772867441f,
+         0.2043576241f, 0.2280011177f, 0.2443987727f, 0.2502972782f, 0.2443987727f, 0.2280010879f,
+         0.2043576539f, 0.1772867590f, 0.1499940753f, 0.1129490286f, 0.0829356611f, 0.0600074194f,
+         0.0430483781f, 0.0307279266f, 0.0174126774f, 0.0098293871f, 0.0055385008f, 0.0031178668f,
+         0.0000000186f},
+        {0.0000000112f, 0.0019084513f, 0.0033914447f, 0.0060230605f, 0.0106827281f, 0.0188915879f,
+         0.0265177228f, 0.0370627567f, 0.0514063723f, 0.0703314394f, 0.0939192027f, 0.1114559397f,
+         0.1289804429f, 0.1443904638f, 0.1551341414f, 0.1590099335f, 0.1551341563f, 0.1443904638f,
+         0.1289804578f, 0.1114559397f, 0.0939192176f, 0.0703314245f, 0.0514063723f, 0.0370627530f,
+         0.0265177265f, 0.0188915879f, 0.0106827281f, 0.0060230605f, 0.0033914447f, 0.0019084513f,
+         0.0000000112f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {-0.0000000186f, -0.0030638538f, -0.0054534115f, -0.0097127110f, -0.0173145495f,
+         -0.0308970734f, -0.0437387861f, -0.0618620813f, -0.0872256160f, -0.1220206320f,
+         -0.1676785499f, -0.2034175098f, -0.2407984585f, -0.2751578987f, -0.2999968529f,
+         -0.3091448545f, -0.2999968827f, -0.2751578689f, -0.2407984585f, -0.2034175098f,
+         -0.1676785499f, -0.1220206320f, -0.0872256160f, -0.0618620738f, -0.0437387861f,
+         -0.0308970734f, -0.0173145495f, -0.0097127110f, -0.0054534115f, -0.0030638538f,
+         -0.0000000186f},
+        {-0.0000000298f, -0.0051542334f, -0.0091803335f, -0.0163703524f, -0.0292467363f,
+         -0.0523967445f, -0.0744579434f, -0.1058912203f, -0.1504984796f, -0.2129460722f,
+         -0.2973079383f, -0.3654728234f, -0.4390078187f, -0.5227221847f, -0.5883264542f,
+         -0.6135464907f, -0.5883265138f, -0.5227221251f, -0.4390078783f, -0.3654728234f,
+         -0.2973079383f, -0.2129460722f, -0.1504984796f, -0.1058912128f, -0.0744579583f,
+         -0.0523967408f, -0.0292467438f, -0.0163703524f, -0.0091803372f, -0.0051542334f,
+         -0.0000000298f}},
     {
-        {6,        1063142,  1884657,  3332697,  5866781,  10242063, 14210621,
-         19556019, 26583493, 35470370, 46010131, 53508858, 60748887, 66926417,
-         71137316, 72638124, 71137318, 66926416, 60748892, 53508858, 46010131,
-         35470372, 26583491, 19556017, 14210622, 10242063, 5866782,  3332697,
-         1884657,  1063142,  6},
-        {6,        996412,   1766700,  3125152,  5504595,  9619094,  13357673,
-         18402690, 25050711, 33480946, 43509461, 50662435, 57581418, 63494088,
-         67528881, 68967747, 67528880, 63494088, 57581423, 50662440, 43509461,
-         33480946, 25050711, 18402688, 13357674, 9619095,  5504595,  3125152,
-         1766700,  996411,   6},
-        {5,        894855,   1587095,  2808874,  4951864,  8666115,  12050171,
-         16630010, 22687072, 30401455, 39622952, 46227143, 52634611, 58124051,
-         61876873, 63216472, 61876878, 58124046, 52634616, 46227147, 39622956,
-         30401453, 22687072, 16630009, 12050171, 8666116,  4951865,  2808874,
-         1587094,  894855,   5},
-        {4,        639871,   1135693,  2012557,  3555941,  6246901,  8715881,
-         12082770, 16579122, 22374147, 29395768, 34483545, 39463825, 43763098,
-         46718682, 47776819, 46718682, 43763093, 39463829, 34483548, 29395770,
-         22374147, 16579122, 12082770, 8715881,  6246901,  3555942,  2012557,
-         1135693,  639871,   4},
-        {2,        391832,   695950,   1234845,  2186633,  3856010,  5398615,
-         7518850,  10379695, 14115083, 18711422, 22088181, 25429856, 28342458,
-         30359295, 31084165, 30359297, 28342458, 25429858, 22088183, 18711424,
-         14115081, 10379695, 7518850,  5398616,  3856010,  2186634,  1234845,
-         695950,   391832,   2},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-4,        -630153,   -1122569,  -2002361,  -3579289,  -6418785,
-         -9130134,  -13002760, -18518365, -26281781, -36854217, -45475104,
-         -56006945, -67371285, -76348185, -79832098, -76348192, -67371278,
-         -56006952, -45475104, -36854222, -26281779, -18518367, -13002758,
-         -9130135,  -6418785,  -3579289,  -2002362,  -1122569,  -630153,
-         -4},
-        {-6,         -1060871,   -1892248,   -3382952,   -6072245,   -10973304,
-         -15727476,  -22653422,  -32821252,  -47830065,  -75342945,  -103710871,
-         -142829663, -191958009, -239742101, -261023247, -239742154, -191957982,
-         -142829663, -103710864, -75342952,  -47830065,  -32821248,  -22653422,
-         -15727478,  -10973304,  -6072246,   -3382952,   -1892248,   -1060871,
-         -6},
-    },
+
+        {0.0000000224f, 0.0039605126f, 0.0070208944f, 0.0124152638f, 0.0218554623f, 0.0381546579f,
+         0.0529386885f, 0.0728518516f, 0.0990312248f, 0.1321374178f, 0.1714010984f, 0.1993360221f,
+         0.2263072431f, 0.2493203282f, 0.2650071383f, 0.2705981135f, 0.2650071681f, 0.2493203282f,
+         0.2263072580f, 0.1993360221f, 0.1714010984f, 0.1321374327f, 0.0990312248f, 0.0728518367f,
+         0.0529386923f, 0.0381546579f, 0.0218554661f, 0.0124152638f, 0.0070208944f, 0.0039605126f,
+         0.0000000224f},
+        {0.0000000224f, 0.0037119240f, 0.0065814704f, 0.0116420984f, 0.0205062144f, 0.0358339176f,
+         0.0497612096f, 0.0685553625f, 0.0933211744f, 0.1247262433f, 0.1620853692f, 0.1887322813f,
+         0.2145074904f, 0.2365339100f, 0.2515646815f, 0.2569248676f, 0.2515646815f, 0.2365339100f,
+         0.2145075202f, 0.1887322962f, 0.1620853692f, 0.1247262433f, 0.0933211744f, 0.0685553551f,
+         0.0497612134f, 0.0358339213f, 0.0205062144f, 0.0116420984f, 0.0065814704f, 0.0037119202f,
+         0.0000000224f},
+        {0.0000000186f, 0.0033335947f, 0.0059123896f, 0.0104638711f, 0.0184471309f, 0.0322837941f,
+         0.0448903851f, 0.0619516149f, 0.0845159292f, 0.1132542491f, 0.1476069987f, 0.1722095311f,
+         0.1960792094f, 0.2165289670f, 0.2305093110f, 0.2354997098f, 0.2305093408f, 0.2165289521f,
+         0.1960792243f, 0.1722095460f, 0.1476070136f, 0.1132542342f, 0.0845159292f, 0.0619516112f,
+         0.0448903851f, 0.0322837979f, 0.0184471346f, 0.0104638711f, 0.0059123859f, 0.0033335947f,
+         0.0000000186f},
+        {0.0000000149f, 0.0023837052f, 0.0042307861f, 0.0074973591f, 0.0132469125f, 0.0232715197f,
+         0.0324691869f, 0.0450118259f, 0.0617620423f, 0.0833501965f, 0.1095077693f, 0.1284612119f,
+         0.1470142007f, 0.1630302370f, 0.1740406454f, 0.1779825240f, 0.1740406454f, 0.1630302221f,
+         0.1470142156f, 0.1284612268f, 0.1095077768f, 0.0833501965f, 0.0617620423f, 0.0450118259f,
+         0.0324691869f, 0.0232715197f, 0.0132469162f, 0.0074973591f, 0.0042307861f, 0.0023837052f,
+         0.0000000149f},
+        {0.0000000075f, 0.0014596879f, 0.0025926158f, 0.0046001561f, 0.0081458427f, 0.0143647566f,
+         0.0201114081f, 0.0280098990f, 0.0386673771f, 0.0525827818f, 0.0697054788f, 0.0822848827f,
+         0.0947335958f, 0.1055838838f, 0.1130971909f, 0.1157975346f, 0.1130971909f, 0.1055838838f,
+         0.0947336033f, 0.0822848976f, 0.0697054863f, 0.0525827743f, 0.0386673771f, 0.0280098990f,
+         0.0201114118f, 0.0143647566f, 0.0081458464f, 0.0046001561f, 0.0025926158f, 0.0014596879f,
+         0.0000000075f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {-0.0000000149f, -0.0023475029f, -0.0041818954f, -0.0074593760f, -0.0133338906f,
+         -0.0239118375f, -0.0340123996f, -0.0484390557f, -0.0689862818f, -0.0979072601f,
+         -0.1372926533f, -0.1694079638f, -0.2086421251f, -0.2509776056f, -0.2844191492f,
+         -0.2973977327f, -0.2844191790f, -0.2509775758f, -0.2086421549f, -0.1694079638f,
+         -0.1372926831f, -0.0979072601f, -0.0689862967f, -0.0484390482f, -0.0340124033f,
+         -0.0239118375f, -0.0133338906f, -0.0074593797f, -0.0041818954f, -0.0023475029f,
+         -0.0000000149f},
+        {-0.0000000224f, -0.0039520524f, -0.0070491731f, -0.0126024783f, -0.0226208754f,
+         -0.0408787429f, -0.0585894138f, -0.0843905732f, -0.1222686917f, -0.1781808734f,
+         -0.2806743383f, -0.3863531053f, -0.5320819616f, -0.7150993347f, -0.8931089044f,
+         -0.9723873734f, -0.8931091428f, -0.7150992155f, -0.5320819616f, -0.3863530755f,
+         -0.2806743681f, -0.1781808734f, -0.1222686768f, -0.0843905732f, -0.0585894212f,
+         -0.0408787429f, -0.0226208791f, -0.0126024783f, -0.0070491731f, -0.0039520524f,
+         -0.0000000224f}},
     {
-        {3,        574674,   1017796,  1796900,  3154467,  5481590,  7575015,
-         10370478, 14006828, 18549080, 23865568, 27607848, 31193405, 34233658,
-         36296899, 37030586, 36296899, 34233658, 31193408, 27607848, 23865571,
-         18549080, 14006828, 10370477, 7575016,  5481590,  3154468,  1796900,
-         1017796,  574674,   3},
-        {3,        538644,   954220,   1685385,  2960884,  5151503,  7126421,
-         9769579,  13217235, 17537303, 22610486, 26190946, 29627874, 32546498,
-         34529288, 35234744, 34529288, 32546498, 29627877, 26190948, 22610486,
-         17537303, 13217235, 9769578,  7126422,  5151503,  2960885,  1685385,
-         954220,   538644,   3},
-        {3,        483799,   857386,   1515349,  2665173,  4645760,  6437352,
-         8843606,  11995830, 15965511, 20652239, 23974315, 27173119, 29896409,
-         31749793, 32409812, 31749796, 29896409, 27173119, 23974315, 20652239,
-         15965511, 11995830, 8843605,  6437353,  4645760,  2665173,  1515349,
-         857386,   483799,   3},
-        {2,        346044,   613840,   1086712,  1916795,  3357477,  4672194,
-         6454554,  8816978,  11833772, 15450673, 18047553, 20571855, 22737956,
-         24220523, 24750056, 24220523, 22737954, 20571857, 18047553, 15450673,
-         11833773, 8816979,  6454554,  4672195,  3357477,  1916795,  1086712,
-         613840,   346044,   2},
-        {1,        211963,   376347,   667357,   1180477,  2077857,  2904213,
-         4035615,  5554462,  7524805,  9930550,  11685603, 13412725, 14910620,
-         15943945, 16314576, 15943947, 14910620, 13412727, 11685603, 9930550,
-         7524804,  5554462,  4035615,  2904213,  2077857,  1180477,  667357,
-         376347,   211963,   1},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {-2,        -341283,   -608313,   -1086175,  -1945172,  -3500199,
-         -4995375,  -7149356,  -10257165, -14719092, -21095208, -27678681,
-         -35807499, -44718702, -52254129, -55306469, -52254132, -44718696,
-         -35807502, -27678681, -21095206, -14719093, -10257165, -7149355,
-         -4995375,  -3500199,  -1945172,  -1086175,  -608313,   -341283,
-         -2},
-        {-3,         -574839,    -1026313,   -1838045,   -3309836,   -6017788,
-         -8678530,   -12620301,  -18566315,  -29617669,  -51387072,  -78419391,
-         -127027637, -219233301, -378389804, -496424308, -378390018, -219233261,
-         -127027650, -78419391,  -51387075,  -29617669,  -18566313,  -12620300,
-         -8678531,   -6017788,   -3309837,   -1838046,   -1026313,   -574839,
-         -3},
-    },
+
+        {0.0000000112f, 0.0021408275f, 0.0037915856f, 0.0066939741f, 0.0117513053f, 0.0204205140f,
+         0.0282191299f, 0.0386330411f, 0.0521795005f, 0.0691007078f, 0.0889061689f, 0.1028472483f,
+         0.1162044853f, 0.1275303066f, 0.1352164894f, 0.1379496753f, 0.1352164894f, 0.1275303066f,
+         0.1162045002f, 0.1028472483f, 0.0889061838f, 0.0691007078f, 0.0521795005f, 0.0386330374f,
+         0.0282191336f, 0.0204205140f, 0.0117513090f, 0.0066939741f, 0.0037915856f, 0.0021408275f,
+         0.0000000112f},
+        {0.0000000112f, 0.0020066053f, 0.0035547465f, 0.0062785484f, 0.0110301524f, 0.0191908441f,
+         0.0265479870f, 0.0363945179f, 0.0492380373f, 0.0653315485f, 0.0842306241f, 0.0975688770f,
+         0.1103724316f, 0.1212451532f, 0.1286316216f, 0.1312596500f, 0.1286316216f, 0.1212451532f,
+         0.1103724390f, 0.0975688845f, 0.0842306241f, 0.0653315485f, 0.0492380373f, 0.0363945141f,
+         0.0265479907f, 0.0191908441f, 0.0110301562f, 0.0062785484f, 0.0035547465f, 0.0020066053f,
+         0.0000000112f},
+        {0.0000000112f, 0.0018022917f, 0.0031940117f, 0.0056451149f, 0.0099285431f, 0.0173068047f,
+         0.0239810050f, 0.0329449996f, 0.0446879491f, 0.0594761632f, 0.0769355893f, 0.0893112868f,
+         0.1012277603f, 0.1113727987f, 0.1182771921f, 0.1207359582f, 0.1182772070f, 0.1113727987f,
+         0.1012277603f, 0.0893112868f, 0.0769355893f, 0.0594761632f, 0.0446879491f, 0.0329449959f,
+         0.0239810087f, 0.0173068047f, 0.0099285431f, 0.0056451149f, 0.0031940117f, 0.0018022917f,
+         0.0000000112f},
+        {0.0000000075f, 0.0012891144f, 0.0022867322f, 0.0040483177f, 0.0071406178f, 0.0125075765f,
+         0.0174052790f, 0.0240450874f, 0.0328458026f, 0.0440842360f, 0.0575582422f, 0.0672323704f,
+         0.0766361356f, 0.0847054869f, 0.0902284831f, 0.0922011435f, 0.0902284831f, 0.0847054794f,
+         0.0766361356f, 0.0672323704f, 0.0575582422f, 0.0440842398f, 0.0328458063f, 0.0240450874f,
+         0.0174052827f, 0.0125075765f, 0.0071406178f, 0.0040483177f, 0.0022867322f, 0.0012891144f,
+         0.0000000075f},
+        {0.0000000037f, 0.0007896237f, 0.0014020018f, 0.0024860986f, 0.0043976195f, 0.0077406205f,
+         0.0108190365f, 0.0150338374f, 0.0206919834f, 0.0280320831f, 0.0369941816f, 0.0435322635f,
+         0.0499662943f, 0.0555463880f, 0.0593958236f, 0.0607765317f, 0.0593958311f, 0.0555463880f,
+         0.0499663018f, 0.0435322635f, 0.0369941816f, 0.0280320793f, 0.0206919834f, 0.0150338374f,
+         0.0108190365f, 0.0077406205f, 0.0043976195f, 0.0024860986f, 0.0014020018f, 0.0007896237f,
+         0.0000000037f},
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {-0.0000000075f, -0.0012713782f, -0.0022661425f, -0.0040463172f, -0.0072463304f,
+         -0.0130392574f, -0.0186092220f, -0.0266334265f, -0.0382109173f, -0.0548328906f,
+         -0.0785857737f, -0.1031111181f, -0.1333933324f, -0.1665901542f, -0.1946617961f,
+         -0.2060326487f, -0.1946618110f, -0.1665901244f, -0.1333933473f, -0.1031111181f,
+         -0.0785857663f, -0.0548328944f, -0.0382109173f, -0.0266334228f, -0.0186092220f,
+         -0.0130392574f, -0.0072463304f, -0.0040463172f, -0.0022661425f, -0.0012713782f,
+         -0.0000000075f},
+        {-0.0000000112f, -0.0021414421f, -0.0038233139f, -0.0068472512f, -0.0123300999f,
+         -0.0224180073f, -0.0323300436f, -0.0470142849f, -0.0691649169f, -0.1103344113f,
+         -0.1914317608f, -0.2921350002f, -0.4732148349f, -0.8167076707f, -1.4096118212f,
+         -1.8493247032f, -1.4096126556f, -0.8167075515f, -0.4732148647f, -0.2921350002f,
+         -0.1914317757f, -0.1103344113f, -0.0691649020f, -0.0470142812f, -0.0323300473f,
+         -0.0224180073f, -0.0123301037f, -0.0068472549f, -0.0038233139f, -0.0021414421f,
+         -0.0000000112f}}};
+
+const FLOAT32 ixheaacd_re_weight[16][8][31] = {
+
+    {
+
+        {0.5000000000f,  0.4971804619f,  0.4949752390f,  0.4910309315f,  0.4839466512f,
+         0.4711385369f,  0.4588382840f,  0.4411309958f,  0.4155683815f,  0.3786902130f,
+         0.3259756267f,  0.2796038389f,  0.2229698598f,  0.1560545117f,  0.0805236399f,
+         0.0000000000f,  -0.0805236399f, -0.1560545266f, -0.2229698896f, -0.2796038687f,
+         -0.3259756267f, -0.3786902130f, -0.4155683815f, -0.4411309958f, -0.4588383138f,
+         -0.4711385369f, -0.4839466512f, -0.4910309613f, -0.4949752688f, -0.4971804321f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4973547161f,  0.4952812195f,  0.4915628731f,  0.4848551154f,
+         0.4726418555f,  0.4608217478f,  0.4436736703f,  0.4186950922f,  0.3823071420f,
+         0.3297900558f,  0.2832620144f,  0.2261611372f,  0.1584401429f,  0.0818051845f,
+         0.0000000000f,  -0.0818051845f, -0.1584401578f, -0.2261611372f, -0.2832620144f,
+         -0.3297900856f, -0.3823071420f, -0.4186950922f, -0.4436736703f, -0.4608217478f,
+         -0.4726418853f, -0.4848551452f, -0.4915628731f, -0.4952812195f, -0.4973546565f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4976201355f,  0.4957476556f,  0.4923752248f,  0.4862467945f,
+         0.4749561548f,  0.4638883471f,  0.4476265609f,  0.4235888422f,  0.3880125880f,
+         0.3358573616f,  0.2891118824f,  0.2312888801f,  0.1622879505f,  0.0838772804f,
+         0.0000000000f,  -0.0838772804f, -0.1622879654f, -0.2312888950f, -0.2891118526f,
+         -0.3358573914f, -0.3880126476f, -0.4235888422f, -0.4476265907f, -0.4638883471f,
+         -0.4749561548f, -0.4862467945f, -0.4923752248f, -0.4957476854f, -0.4976201057f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4982874393f,  0.4969230890f,  0.4944299161f,  0.4897895753f,
+         0.4809119105f,  0.4718552828f,  0.4580222666f,  0.4366562366f,  0.4035232663f,
+         0.3526770473f,  0.3055384457f,  0.2458558977f,  0.1733215600f,  0.0898552686f,
+         0.0000000000f,  -0.0898552686f, -0.1733215749f, -0.2458558679f, -0.3055384457f,
+         -0.3526770473f, -0.4035232663f, -0.4366561770f, -0.4580222666f, -0.4718553126f,
+         -0.4809119105f, -0.4897895753f, -0.4944299459f, -0.4969231188f, -0.4982874393f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4989379942f,  0.4980724454f,  0.4964498281f,  0.4933045506f,
+         0.4869143069f,  0.4799970984f,  0.4688419700f,  0.4505754411f,  0.4205142260f,
+         0.3716892004f,  0.3245028853f,  0.2630047202f,  0.1865197271f,  0.0970816985f,
+         0.0000000000f,  -0.0970816985f, -0.1865197271f, -0.2630047202f, -0.3245028257f,
+         -0.3716892302f, -0.4205142260f, -0.4505754411f, -0.4688419998f, -0.4799970984f,
+         -0.4869143367f, -0.4933045506f, -0.4964498281f, -0.4980724454f, -0.4989379644f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000596f,  0.5016326308f,  0.5028703809f,  0.5049995780f,  0.5085534453f,
+         0.5141122937f,  0.5184206367f,  0.5228864551f,  0.5257800817f,  0.5226357579f,
+         0.5154753923f,  0.5085130334f,  0.4721691608f,  0.3829773664f,  0.2211726457f,
+         0.0000000000f,  -0.2211726457f, -0.3829773664f, -0.4721692204f, -0.5085130334f,
+         -0.5154754519f, -0.5226357579f, -0.5257800817f, -0.5228864551f, -0.5184206963f,
+         -0.5141122937f, -0.5085535049f, -0.5049996376f, -0.5028703809f, -0.5016326308f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5027751923f,  0.5049232244f,  0.5087171793f,  0.5153799057f,
+         0.5269514322f,  0.5375180840f,  0.5518481731f,  0.5710597038f,  0.6521918178f,
+         0.7913578749f,  0.9470402002f,  1.2054057121f,  1.6852766275f,  2.6426265240f,
+         0.0000000000f,  -2.6426310539f, -1.6852763891f, -1.2054058313f, -0.9470402002f,
+         -0.7913579345f, -0.6521918178f, -0.5710596442f, -0.5518481135f, -0.5375181437f,
+         -0.5269514322f, -0.5153799057f, -0.5087171793f, -0.5049232244f, -0.5027751923f,
+         -0.5000000596f}},
+    {
+
+        {0.5000000000f,  0.4973910451f,  0.4953450263f,  0.4916738272f,  0.4850449860f,
+         0.4729567766f,  0.4612380564f,  0.4442087412f,  0.4193551540f,  0.3830735385f,
+         0.3306015134f,  0.2840420902f,  0.2268431634f,  0.1589508802f,  0.0820798650f,
+         0.0000000000f,  -0.0820798576f, -0.1589508951f, -0.2268431783f, -0.2840420902f,
+         -0.3306015134f, -0.3830735683f, -0.4193551242f, -0.4442086816f, -0.4612380862f,
+         -0.4729567766f, -0.4850450158f, -0.4916738570f, -0.4953449965f, -0.4973909855f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4975522459f,  0.4956282973f,  0.4921671450f,  0.4858898818f,
+         0.4743613005f,  0.4630986154f,  0.4466060102f,  0.4223214984f,  0.3865298629f,
+         0.3342745602f,  0.2875820398f,  0.2299449295f,  0.1612776965f,  0.0833326429f,
+         0.0000000000f,  -0.0833326355f, -0.1612777114f, -0.2299449295f, -0.2875820100f,
+         -0.3342745602f, -0.3865298331f, -0.4223214984f, -0.4466060400f, -0.4630986452f,
+         -0.4743613005f, -0.4858898818f, -0.4921671748f, -0.4956283271f, -0.4975521863f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4977977276f,  0.4960601032f,  0.4929202795f,  0.4871834517f,
+         0.4765217602f,  0.4659720957f,  0.4503277540f,  0.4269563556f,  0.3919708133f,
+         0.3401035368f,  0.2932292819f,  0.2349164933f,  0.1650211811f,  0.0853530467f,
+         0.0000000000f,  -0.0853530392f, -0.1650211811f, -0.2349164784f, -0.2932292819f,
+         -0.3401035368f, -0.3919707835f, -0.4269563556f, -0.4503277540f, -0.4659721255f,
+         -0.4765217602f, -0.4871834517f, -0.4929203391f, -0.4960601330f, -0.4977976680f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4984147847f,  0.4971478283f,  0.4948240519f,  0.4904728234f,
+         0.4820713699f,  0.4734190702f,  0.4600848258f,  0.4392839074f,  0.4066926241f,
+         0.3561752141f,  0.3089951873f,  0.2489543557f,  0.1756889224f,  0.0911452249f,
+         0.0000000000f,  -0.0911452249f, -0.1756889224f, -0.2489543557f, -0.3089951873f,
+         -0.3561752439f, -0.4066926539f, -0.4392838776f, -0.4600848556f, -0.4734191597f,
+         -0.4820713401f, -0.4904728830f, -0.4948240817f, -0.4971478581f, -0.4984148145f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4990161359f,  0.4982108474f,  0.4966937900f,  0.4937312901f,
+         0.4876496494f,  0.4810023904f,  0.4701921344f,  0.4523362219f,  0.4227000475f,
+         0.3741825819f,  0.3270231485f,  0.2653121948f,  0.1883139759f,  0.0980708972f,
+         0.0000000000f,  -0.0980708972f, -0.1883139908f, -0.2653121948f, -0.3270231485f,
+         -0.3741825819f, -0.4227000475f, -0.4523362219f, -0.4701920748f, -0.4810024500f,
+         -0.4876496494f, -0.4937313497f, -0.4966937602f, -0.4982108474f, -0.4990161359f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000596f,  0.5015053153f,  0.5026424527f,  0.5045889616f,  0.5078070164f,
+         0.5127342939f,  0.5164096355f,  0.5199240446f,  0.5213798285f,  0.5160900950f,
+         0.4961368442f,  0.4834818840f,  0.4421011508f,  0.3525197506f,  0.2006191462f,
+         0.0000000000f,  -0.2006191611f, -0.3525197506f, -0.4421012104f, -0.4834818840f,
+         -0.4961368442f, -0.5160900354f, -0.5213798285f, -0.5199240446f, -0.5164096951f,
+         -0.5127342939f, -0.5078070164f, -0.5045889020f, -0.5026424527f, -0.5015053153f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5025598407f,  0.5045354366f,  0.5080122352f,  0.5140760541f,
+         0.5244651437f,  0.5337679982f,  0.5460379124f,  0.5614778399f,  0.6178392172f,
+         0.7190375924f,  0.8149638772f,  0.9330949783f,  1.0282076597f,  0.8643130064f,
+         0.0000000000f,  -0.8643135428f, -1.0282076597f, -0.9330950975f, -0.8149638772f,
+         -0.7190377116f, -0.6178392172f, -0.5614778399f, -0.5460379124f, -0.5337680578f,
+         -0.5244650841f, -0.5140760541f, -0.5080122352f, -0.5045354962f, -0.5025598407f,
+         -0.5000000596f}},
+    {
+
+        {0.5000000000f,  0.4979922175f,  0.4964025617f,  0.4935186803f,  0.4882142544f,
+         0.4782521725f,  0.4682838917f,  0.4533392787f,  0.4307335615f,  0.3964424431f,
+         0.3449379802f,  0.2979410589f,  0.2390869260f,  0.1681751311f,  0.0870600939f,
+         0.0000000000f,  -0.0870600939f, -0.1681751609f, -0.2390869260f, -0.2979410589f,
+         -0.3449379802f, -0.3964424133f, -0.4307335615f, -0.4533392191f, -0.4682839215f,
+         -0.4782522023f, -0.4882142544f, -0.4935186505f, -0.4964025617f, -0.4979921579f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4981160462f,  0.4966207743f,  0.4939002991f,  0.4888732731f,
+         0.4793626070f,  0.4697723091f,  0.4552863240f,  0.4331887662f,  0.3993673325f,
+         0.3481221497f,  0.3010586798f,  0.2418578863f,  0.1702777445f,  0.0882006139f,
+         0.0000000000f,  -0.0882006139f, -0.1702777445f, -0.2418578863f, -0.3010587096f,
+         -0.3481221497f, -0.3993673027f, -0.4331887662f, -0.4552863240f, -0.4697723091f,
+         -0.4793626070f, -0.4888732731f, -0.4939003289f, -0.4966207743f, -0.4981160164f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4983044863f,  0.4969531596f,  0.4944825768f,  0.4898807108f,
+         0.4810664356f,  0.4720634520f,  0.4582964182f,  0.4370048046f,  0.4039427042f,
+         0.3531388044f,  0.3059939146f,  0.2462634444f,  0.1736325473f,  0.0900245756f,
+         0.0000000000f,  -0.0900245681f, -0.1736325473f, -0.2462634742f, -0.3059939146f,
+         -0.3531388342f, -0.4039427042f, -0.4370048046f, -0.4582964182f, -0.4720634818f,
+         -0.4810664058f, -0.4898807704f, -0.4944825768f, -0.4969531298f, -0.4983044863f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4987780154f,  0.4977895021f,  0.4959515929f,  0.4924345016f,
+         0.4854198098f,  0.4779591858f,  0.4661146402f,  0.4470350742f,  0.4161445498f,
+         0.3667378426f,  0.3195213675f,  0.2584639788f,  0.1830018759f,  0.0951471180f,
+         0.0000000000f,  -0.0951471031f, -0.1830018908f, -0.2584639490f, -0.3195213974f,
+         -0.3667378426f, -0.4161445200f, -0.4470350742f, -0.4661146402f, -0.4779591858f,
+         -0.4854198396f, -0.4924345613f, -0.4959515929f, -0.4977895021f, -0.4987780452f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4992391467f,  0.4986056089f,  0.4973905385f,  0.4949527979f,
+         0.4897618592f,  0.4839001894f,  0.4741017818f,  0.4574657679f,  0.4291163385f,
+         0.3815677166f,  0.3345352709f,  0.2722316980f,  0.1937220246f,  0.1010626405f,
+         0.0000000000f,  -0.1010626331f, -0.1937220395f, -0.2722316980f, -0.3345352709f,
+         -0.3815677166f, -0.4291163385f, -0.4574657679f, -0.4741017818f, -0.4839001894f,
+         -0.4897618592f, -0.4949527979f, -0.4973905683f, -0.4986056685f, -0.4992391169f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5011434555f,  0.5019949079f,  0.5034251213f,  0.5056989789f,
+         0.5088702440f,  0.5108083487f,  0.5117562413f,  0.5094295144f,  0.4987166524f,
+         0.4690935910f,  0.4298956990f,  0.3742347956f,  0.2874245048f,  0.1586372554f,
+         0.0000000000f,  -0.1586372554f, -0.2874245346f, -0.3742347956f, -0.4298956990f,
+         -0.4690936506f, -0.4987166524f, -0.5094294548f, -0.5117561817f, -0.5108084679f,
+         -0.5088702440f, -0.5056990385f, -0.5034251213f, -0.5019949675f, -0.5011434555f,
+         -0.5000000000f},
+        {0.5000000596f,  0.5019482374f,  0.5034363270f,  0.5060207844f,  0.5104164481f,
+         0.5175731182f,  0.5235039592f,  0.5304464698f,  0.5371760726f,  0.5399831533f,
+         0.5705516934f,  0.5833024383f,  0.5678070188f,  0.4872314930f,  0.2963677347f,
+         0.0000000000f,  -0.2963677943f, -0.4872314930f, -0.5678070784f, -0.5833024383f,
+         -0.5705517530f, -0.5399830937f, -0.5371760130f, -0.5304464102f, -0.5235040188f,
+         -0.5175731182f, -0.5104165077f, -0.5060207844f, -0.5034362674f, -0.5019482374f,
+         -0.5000000596f}},
+    {
+
+        {0.5000000000f,  0.4988959730f,  0.4979980290f,  0.4963187873f,  0.4930755794f,
+         0.4865204096f,  0.4794592559f,  0.4681210220f,  0.4496374130f,  0.4193532467f,
+         0.3703693151f,  0.3231719732f,  0.2617889345f,  0.1855761409f,  0.0965621769f,
+         0.0000000000f,  -0.0965621769f, -0.1855761558f, -0.2617889643f, -0.3231719434f,
+         -0.3703693151f, -0.4193532169f, -0.4496374130f, -0.4681210220f, -0.4794593155f,
+         -0.4865204692f, -0.4930756390f, -0.4963187873f, -0.4979980290f, -0.4988959432f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4989632964f,  0.4981172681f,  0.4965288043f,  0.4934426546f,
+         0.4871520996f,  0.4803220332f,  0.4692780674f,  0.4511435628f,  0.4212186337f,
+         0.3724914491f,  0.3253129125f,  0.2637456059f,  0.1870953441f,  0.0973988697f,
+         0.0000000000f,  -0.0973988622f, -0.1870953441f, -0.2637456357f, -0.3253129125f,
+         -0.3724914491f, -0.4212185740f, -0.4511435628f, -0.4692780375f, -0.4803220928f,
+         -0.4871521592f, -0.4934426844f, -0.4965288043f, -0.4981172979f, -0.4989632666f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4990658462f,  0.4982986450f,  0.4968487024f,  0.4940025806f,
+         0.4881176353f,  0.4816432893f,  0.4710545242f,  0.4534637034f,  0.4241041243f,
+         0.3757902384f,  0.3286524117f,  0.2668075860f,  0.1894792169f,  0.0987142026f,
+         0.0000000000f,  -0.0987141877f, -0.1894792318f, -0.2668076158f, -0.3286524117f,
+         -0.3757902086f, -0.4241041243f, -0.4534636736f, -0.4710544348f, -0.4816432893f,
+         -0.4881176651f, -0.4940025806f, -0.4968487322f, -0.4982987046f, -0.4990658164f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4993230999f,  0.4987545311f,  0.4976536036f,  0.4954148531f,
+         0.4905641079f,  0.4850046337f,  0.4755989015f,  0.4594423771f,  0.4316084087f,
+         0.3844630718f,  0.3375001550f,  0.2749801576f,  0.1958818436f,  0.1022618562f,
+         0.0000000000f,  -0.1022618562f, -0.1958818585f, -0.2749801576f, -0.3375001550f,
+         -0.3844630718f, -0.4316083491f, -0.4594423175f, -0.4755989015f, -0.4850046337f,
+         -0.4905640781f, -0.4954148829f, -0.4976535738f, -0.4987545311f, -0.4993230700f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4995733500f,  0.4991982579f,  0.4984387755f,  0.4967978001f,
+         0.4929749966f,  0.4883366227f,  0.4801396132f,  0.4654795825f,  0.4392894208f,
+         0.3934856355f,  0.3468125761f,  0.2836796939f,  0.2027634680f,  0.1061001420f,
+         0.0000000000f,  -0.1061001420f, -0.2027634680f, -0.2836797237f, -0.3468125761f,
+         -0.3934856355f, -0.4392894208f, -0.4654795825f, -0.4801395833f, -0.4883366823f,
+         -0.4929749668f, -0.4967978299f, -0.4984387755f, -0.4991982877f, -0.4995733202f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5006032586f,  0.5010305047f,  0.5016981363f,  0.5025926232f,
+         0.5032470226f,  0.5027559996f,  0.5002208352f,  0.4929866195f,  0.4757096469f,
+         0.4384897351f,  0.3950820863f,  0.3305715621f,  0.2411795557f,  0.1280656606f,
+         0.0000000000f,  -0.1280656606f, -0.2411795706f, -0.3305716217f, -0.3950820863f,
+         -0.4384897351f, -0.4757096469f, -0.4929866195f, -0.5002207756f, -0.5027559996f,
+         -0.5032470226f, -0.5025926232f, -0.5016981959f, -0.5010305047f, -0.5006032586f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5010370016f,  0.5018045902f,  0.5030835867f,  0.5050826669f,
+         0.5077480078f,  0.5091921091f,  0.5094215274f,  0.5060614347f,  0.4939221144f,
+         0.4625603855f,  0.4223127365f,  0.3585619032f,  0.2725897431f,  0.1494219303f,
+         0.0000000000f,  -0.1494219303f, -0.2725897431f, -0.3585619330f, -0.4223127365f,
+         -0.4625604451f, -0.4939220548f, -0.5060613751f, -0.5094215274f, -0.5091921091f,
+         -0.5077479482f, -0.5050827861f, -0.5030835867f, -0.5018045902f, -0.5010369420f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368354f,
+         0.0000000000f,  -0.1131368279f, -0.2152527720f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368354f,
+         0.0000000000f,  -0.1131368279f, -0.2152527720f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368354f,
+         0.0000000000f,  -0.1131368279f, -0.2152527869f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.5010477901f,  0.5018239021f,  0.5031182766f,  0.5051452518f,
+         0.5078617930f,  0.5093557239f,  0.5096575022f,  0.5064008832f,  0.4944033921f,
+         0.4632124305f,  0.4230656624f,  0.3596195877f,  0.2740280628f,  0.1503099203f,
+         0.0000000000f,  -0.1503099054f, -0.2740280628f, -0.3596195877f, -0.4230656624f,
+         -0.4632123709f, -0.4944033921f, -0.5064008832f, -0.5096574426f, -0.5093557239f,
+         -0.5078617930f, -0.5051453114f, -0.5031182766f, -0.5018239021f, -0.5010477304f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5009795427f,  0.5017020702f,  0.5028998852f,  0.5047514439f,
+         0.5071461797f,  0.5083272457f,  0.5081763268f,  0.5042734742f,  0.4913944900f,
+         0.4591502845f,  0.4183884561f,  0.3544511199f,  0.2652116716f,  0.1448854357f,
+         0.0000000000f,  -0.1448854357f, -0.2652117014f, -0.3544511199f, -0.4183884561f,
+         -0.4591503441f, -0.4913944900f, -0.5042734742f, -0.5081762671f, -0.5083272457f,
+         -0.5071461797f, -0.5047514439f, -0.5028998852f, -0.5017020702f, -0.5009795427f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5008758903f,  0.5015168786f,  0.5025681257f,  0.5041542053f,
+         0.5060635209f,  0.5067747831f,  0.5059480071f,  0.5010886192f,  0.4869216383f,
+         0.4531719685f,  0.4115628898f,  0.3473646939f,  0.2555567026f,  0.1373466253f,
+         0.0000000000f,  -0.1373466253f, -0.2555567324f, -0.3473647237f, -0.4115628898f,
+         -0.4531719685f, -0.4869215786f, -0.5010885596f, -0.5059480071f, -0.5067747831f,
+         -0.5060635209f, -0.5041542053f, -0.5025681257f, -0.5015168786f, -0.5008758307f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5006161928f,  0.5010534525f,  0.5017392039f,  0.5026661158f,
+         0.5033791661f,  0.5029437542f,  0.5004871488f,  0.4933607578f,  0.4762222767f,
+         0.4391518533f,  0.3958169818f,  0.3313112259f,  0.2418053150f,  0.1284317821f,
+         0.0000000000f,  -0.1284317672f, -0.2418053150f, -0.3313111961f, -0.3958169818f,
+         -0.4391519129f, -0.4762222767f, -0.4933606982f, -0.5004870892f, -0.5029437542f,
+         -0.5033791065f, -0.5026661158f, -0.5017392635f, -0.5010534525f, -0.5006161332f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5003644228f,  0.5006047487f,  0.5009382963f,  0.5012336969f,
+         0.5008131266f,  0.4993060529f,  0.4953505993f,  0.4861895740f,  0.4664809406f,
+         0.4267134070f,  0.3821379840f,  0.3176780939f,  0.2303762883f,  0.1217892319f,
+         0.0000000000f,  -0.1217892170f, -0.2303763181f, -0.3176780939f, -0.3821379840f,
+         -0.4267134368f, -0.4664809406f, -0.4861895442f, -0.4953505993f, -0.4993061125f,
+         -0.5008131266f, -0.5012336969f, -0.5009382963f, -0.5006047487f, -0.5003644228f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4993358850f,  0.4987771511f,  0.4976935983f,  0.4954852760f,
+         0.4906864166f,  0.4851732254f,  0.4758279026f,  0.4597451985f,  0.4319911301f,
+         0.3849090934f,  0.3379579186f,  0.2754054368f,  0.1962166280f,  0.1024479866f,
+         0.0000000000f,  -0.1024479717f, -0.1962166429f, -0.2754054368f, -0.3379579186f,
+         -0.3849091232f, -0.4319911599f, -0.4597451687f, -0.4758278131f, -0.4851732850f,
+         -0.4906864166f, -0.4954852760f, -0.4976935983f, -0.4987771511f, -0.4993358552f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4989066720f,  0.4980169535f,  0.4963521063f,  0.4931337833f,
+         0.4866205156f,  0.4795958996f,  0.4683040977f,  0.4498755038f,  0.4196476638f,
+         0.3707037568f,  0.3235089481f,  0.2620966136f,  0.1858148128f,  0.0966935381f,
+         0.0000000000f,  -0.0966935307f, -0.1858148277f, -0.2620966136f, -0.3235089481f,
+         -0.3707037866f, -0.4196476638f, -0.4498754740f, -0.4683040380f, -0.4795959294f,
+         -0.4866205454f, -0.4931338131f, -0.4963521063f, -0.4980169237f, -0.4989066422f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5019683242f,  0.5034724474f,  0.5060860515f,  0.5105357766f,
+         0.5177959800f,  0.5238327980f,  0.5309391022f,  0.5379270315f,  0.5411472321f,
+         0.5744604468f,  0.5888173580f,  0.5752269030f,  0.4958270490f,  0.3029264808f,
+         0.0000000000f,  -0.3029264808f, -0.4958269894f, -0.5752269030f, -0.5888173580f,
+         -0.5744604468f, -0.5411472321f, -0.5379270315f, -0.5309391022f, -0.5238327980f,
+         -0.5177959800f, -0.5105358362f, -0.5060860515f, -0.5034723878f, -0.5019683242f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5018416047f,  0.5032451153f,  0.5056754351f,  0.5097854137f,
+         0.5163972378f,  0.5217715502f,  0.5278583169f,  0.5332472920f,  0.5339364409f,
+         0.5506924391f,  0.5557163954f,  0.5314731002f,  0.4462319613f,  0.2658600509f,
+         0.0000000000f,  -0.2658600509f, -0.4462319613f, -0.5314732194f, -0.5557163954f,
+         -0.5506924391f, -0.5339364409f, -0.5332472920f, -0.5278582573f, -0.5217716098f,
+         -0.5163972378f, -0.5097853541f, -0.5056754351f, -0.5032451153f, -0.5018416047f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5016490817f,  0.5028999448f,  0.5050527453f,  0.5086503625f,
+         0.5142914653f,  0.5186827183f,  0.5232735872f,  0.5263579488f,  0.5235015154f,
+         0.5180896521f,  0.5119441748f,  0.4763633013f,  0.3873093724f,  0.2241453975f,
+         0.0000000000f,  -0.2241454273f, -0.3873093724f, -0.4763633311f, -0.5119441748f,
+         -0.5180897117f, -0.5235014558f, -0.5263578892f, -0.5232735872f, -0.5186827183f,
+         -0.5142914653f, -0.5086504221f, -0.5050527453f, -0.5028999448f, -0.5016490817f,
+         -0.5000000596f},
+        {0.5000000000f,  0.5011672974f,  0.5020375848f,  0.5035016537f,  0.5058373213f,
+         0.5091226101f,  0.5111725330f,  0.5122836232f,  0.5101932287f,  0.4998099208f,
+         0.4705953598f,  0.4316509366f,  0.3780660629f,  0.2909714878f,  0.1608594358f,
+         0.0000000000f,  -0.1608594209f, -0.2909714878f, -0.3780660927f, -0.4316509366f,
+         -0.4705953598f, -0.4998098612f, -0.5101932287f, -0.5122836232f, -0.5111725926f,
+         -0.5091226101f, -0.5058373213f, -0.5035016537f, -0.5020375848f, -0.5011672974f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5007008314f,  0.5012044907f,  0.5020091534f,  0.5031501055f,
+         0.5042502880f,  0.5041841865f,  0.5022494197f,  0.4958427250f,  0.4796353579f,
+         0.4435822964f,  0.4007542133f,  0.3363020420f,  0.2460453212f,  0.1309203655f,
+         0.0000000000f,  -0.1309203506f, -0.2460453212f, -0.3363020718f, -0.4007542133f,
+         -0.4435823560f, -0.4796352983f, -0.4958426654f, -0.5022494197f, -0.5041842461f,
+         -0.5042502880f, -0.5031501651f, -0.5020092130f, -0.5012044907f, -0.5007008314f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4988015890f,  0.4978311360f,  0.4960248172f,  0.4925622642f,
+         0.4856388867f,  0.4782574177f,  0.4665130377f,  0.4475508630f,  0.4167790711f,
+         0.3674541414f,  0.3202401102f,  0.2591174543f,  0.1835071146f,  0.0954245627f,
+         0.0000000000f,  -0.0954245627f, -0.1835071146f, -0.2591174543f, -0.3202401102f,
+         -0.3674541414f, -0.4167790413f, -0.4475508630f, -0.4665130079f, -0.4782574475f,
+         -0.4856388569f, -0.4925622940f, -0.4960248470f, -0.4978311062f, -0.4988015294f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4980117977f,  0.4964371324f,  0.4935791790f,  0.4883186519f,
+         0.4784279168f,  0.4685191810f,  0.4536466599f,  0.4311205149f,  0.3969023824f,
+         0.3454375863f,  0.2984294593f,  0.2395204306f,  0.1685037017f,  0.0872381777f,
+         0.0000000000f,  -0.0872381777f, -0.1685037017f, -0.2395204306f, -0.2984294891f,
+         -0.3454375863f, -0.3969023824f, -0.4311204851f, -0.4536466599f, -0.4685192108f,
+         -0.4784279168f, -0.4883186519f, -0.4935792387f, -0.4964371920f, -0.4980118275f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5025862455f,  0.5045830011f,  0.5080985427f,  0.5142353773f,
+         0.5247681141f,  0.5342236161f,  0.5467404723f,  0.5625994205f,  0.6218548417f,
+         0.7271847725f,  0.8291400671f,  0.9596735835f,  1.0798219442f,  0.9420299530f,
+         0.0000000000f,  -0.9420303106f, -1.0798217058f, -0.9596738815f, -0.8291401863f,
+         -0.7271848917f, -0.6218547821f, -0.5625994205f, -0.5467404127f, -0.5342236161f,
+         -0.5247680545f, -0.5142353773f, -0.5080985427f, -0.5045830011f, -0.5025862455f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5024200678f,  0.5042841434f,  0.5075557828f,  0.5132341385f,
+         0.5228683949f,  0.5313730240f,  0.5423596501f,  0.5556432009f,  0.5973936319f,
+         0.6787342429f,  0.7472499609f,  0.8136605620f,  0.8203776479f,  0.6013670564f,
+         0.0000000000f,  -0.6013671160f, -0.8203776479f, -0.8136607409f, -0.7472500801f,
+         -0.6787342429f, -0.5973935723f, -0.5556432009f, -0.5423595905f, -0.5313730240f,
+         -0.5228683949f, -0.5132341385f, -0.5075558424f, -0.5042841434f, -0.5024200678f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5021677613f,  0.5038304925f,  0.5067336559f,  0.5117224455f,
+         0.5200182796f,  0.5271236300f,  0.5358940363f,  0.5455409884f,  0.5636704564f,
+         0.6162818074f,  0.6496601105f,  0.6607547998f,  0.6008188725f,  0.3879746199f,
+         0.0000000000f,  -0.3879747093f, -0.6008188725f, -0.6607549191f, -0.6496600509f,
+         -0.6162818670f, -0.5636703968f, -0.5455409288f, -0.5358939767f, -0.5271236897f,
+         -0.5200182796f, -0.5117224455f, -0.5067337155f, -0.5038304925f, -0.5021677017f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5015365481f,  0.5026984215f,  0.5046897531f,  0.5079899430f,
+         0.5130717754f,  0.5169013739f,  0.5206471086f,  0.5224504471f,  0.5176750422f,
+         0.5007511973f,  0.4893990755f,  0.4491262436f,  0.3595432043f,  0.2053054571f,
+         0.0000000000f,  -0.2053054571f, -0.3595432043f, -0.4491263032f, -0.4893990755f,
+         -0.5007511973f, -0.5176750422f, -0.5224504471f, -0.5206470490f, -0.5169014335f,
+         -0.5130717754f, -0.5079900026f, -0.5046896935f, -0.5026984215f, -0.5015365481f,
+         -0.5000000596f},
+        {0.5000000000f,  0.5009260774f,  0.5016064644f,  0.5027285814f,  0.5044430494f,
+         0.5065867305f,  0.5075244904f,  0.5070229173f,  0.5026227236f,  0.4890713692f,
+         0.4560364485f,  0.4148247242f,  0.3507413268f,  0.2586806417f,  0.1408952773f,
+         0.0000000000f,  -0.1408952773f, -0.2586806417f, -0.3507413268f, -0.4148246944f,
+         -0.4560364783f, -0.4890713692f, -0.5026226640f, -0.5070229173f, -0.5075244904f,
+         -0.5065867305f, -0.5044430494f, -0.5027285814f, -0.5016064644f, -0.5009260178f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4984455407f,  0.4972019792f,  0.4949190915f,  0.4906377792f,
+         0.4823517799f,  0.4737979174f,  0.4605855942f,  0.4399236441f,  0.4074669182f,
+         0.3570330739f,  0.3098451197f,  0.2497179806f,  0.1762735248f,  0.0914641768f,
+         0.0000000000f,  -0.0914641768f, -0.1762735248f, -0.2497179955f, -0.3098450899f,
+         -0.3570331335f, -0.4074669182f, -0.4399236441f, -0.4605855346f, -0.4737979472f,
+         -0.4823517799f, -0.4906377792f, -0.4949190915f, -0.4972020090f, -0.4984455109f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4974165857f,  0.4953899384f,  0.4917520583f,  0.4851788282f,
+         0.4731788635f,  0.4615318775f,  0.4445866942f,  0.4198218584f,  0.3836160004f,
+         0.3311764300f,  0.2845952809f,  0.2273271382f,  0.1593134999f,  0.0822749436f,
+         0.0000000000f,  -0.0822749436f, -0.1593135148f, -0.2273271531f, -0.2845952809f,
+         -0.3311764300f, -0.3836159706f, -0.4198218286f, -0.4445866644f, -0.4615319073f,
+         -0.4731788635f, -0.4851788580f, -0.4917520583f, -0.4953899384f, -0.4974165857f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5028037429f,  0.5049747825f,  0.5088109374f,  0.5155536532f,
+         0.5272840858f,  0.5380216837f,  0.5526331663f,  0.5736158490f,  0.6570396423f,
+         0.8020626903f,  0.9678543210f,  1.2539665699f,  1.8414286375f,  3.6350917816f,
+         -3.2000000477f, -3.6350977421f, -1.8414278030f, -1.2539669275f, -0.9678544402f,
+         -0.8020627499f, -0.6570395231f, -0.5736158490f, -0.5526331663f, -0.5380217433f,
+         -0.5272840261f, -0.5155536532f, -0.5088109374f, -0.5049747825f, -0.5028037429f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5026236773f,  0.5046505332f,  0.5082210898f,  0.5144618750f,
+         0.5251991153f,  0.5348724723f,  0.5477427244f,  0.5642039180f,  0.6276481748f,
+         0.7390776277f,  0.8501415253f,  1.0001310110f,  1.1627105474f,  1.0799337626f,
+         0.0000000000f,  -1.0799342394f, -1.1627105474f, -1.0001313686f, -0.8501416445f,
+         -0.7390776873f, -0.6276481152f, -0.5642039180f, -0.5477426648f, -0.5348724723f,
+         -0.5251991153f, -0.5144618750f, -0.5082210898f, -0.5046504736f, -0.5026236773f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5023502707f,  0.5041584373f,  0.5073279142f,  0.5128144622f,
+         0.5220750570f,  0.5301869512f,  0.5405472517f,  0.5527920127f,  0.5876652598f,
+         0.6602216363f,  0.7174301744f,  0.7646963000f,  0.7450429201f,  0.5219343901f,
+         0.0000000000f,  -0.5219346285f, -0.7450428605f, -0.7646964192f, -0.7174301744f,
+         -0.6602216959f, -0.5876652002f, -0.5527919531f, -0.5405471921f, -0.5301870108f,
+         -0.5220750570f, -0.5128144622f, -0.5073279142f, -0.5041584969f, -0.5023502111f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5016664267f,  0.5029309988f,  0.5051088333f,  0.5087524056f,
+         0.5144805312f,  0.5189592838f,  0.5236825943f,  0.5269688368f,  0.5244184136f,
+         0.5208731890f,  0.5156101584f,  0.4808640778f,  0.3919814229f,  0.2273655832f,
+         0.0000000000f,  -0.2273655832f, -0.3919814229f, -0.4808641970f, -0.5156101584f,
+         -0.5208732486f, -0.5244183540f, -0.5269688368f, -0.5236825347f, -0.5189592838f,
+         -0.5144804716f, -0.5087524652f, -0.5051088929f, -0.5029310584f, -0.5016664267f,
+         -0.5000000596f},
+        {0.5000000000f,  0.5010051727f,  0.5017478466f,  0.5029819608f,  0.5048993826f,
+         0.5074149370f,  0.5087133050f,  0.5087317824f,  0.5050703287f,  0.4925194979f,
+         0.4606651962f,  0.4201289415f,  0.3562709987f,  0.2684594989f,  0.1468786299f,
+         0.0000000000f,  -0.1468786299f, -0.2684595585f, -0.3562710285f, -0.4201289117f,
+         -0.4606651962f, -0.4925194383f, -0.5050702691f, -0.5087317824f, -0.5087133050f,
+         -0.5074148774f, -0.5048993826f, -0.5029820204f, -0.5017478466f, -0.5010051727f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4983206391f,  0.4969816804f,  0.4945325255f,  0.4899673164f,
+         0.4812132120f,  0.4722613096f,  0.4585570693f,  0.4373364151f,  0.4043420255f,
+         0.3535786867f,  0.3064280450f,  0.2466521561f,  0.1739292294f,  0.0901861414f,
+         0.0000000000f,  -0.0901861340f, -0.1739292443f, -0.2466521412f, -0.3064280450f,
+         -0.3535786867f, -0.4043420255f, -0.4373364449f, -0.4585570395f, -0.4722613096f,
+         -0.4812132120f, -0.4899673462f, -0.4945325553f, -0.4969816506f, -0.4983206391f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4972080886f,  0.4950237870f,  0.4911153018f,  0.4840905368f,
+         0.4713762403f,  0.4591514468f,  0.4415317178f,  0.4160600305f,  0.3792575300f,
+         0.3265722692f,  0.2801750302f,  0.2234674245f,  0.1564260125f,  0.0807230473f,
+         0.0000000000f,  -0.0807230398f, -0.1564260125f, -0.2234674245f, -0.2801750600f,
+         -0.3265722394f, -0.3792575002f, -0.4160600007f, -0.4415317178f, -0.4591514468f,
+         -0.4713762403f, -0.4840905368f, -0.4911153018f, -0.4950237870f, -0.4972080886f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5025862455f,  0.5045830011f,  0.5080985427f,  0.5142353773f,
+         0.5247681141f,  0.5342236161f,  0.5467404723f,  0.5625994205f,  0.6218548417f,
+         0.7271847725f,  0.8291400671f,  0.9596735835f,  1.0798219442f,  0.9420299530f,
+         0.0000000000f,  -0.9420303106f, -1.0798217058f, -0.9596738815f, -0.8291401863f,
+         -0.7271848917f, -0.6218547821f, -0.5625994205f, -0.5467404127f, -0.5342236161f,
+         -0.5247680545f, -0.5142353773f, -0.5080985427f, -0.5045830011f, -0.5025862455f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5024200678f,  0.5042841434f,  0.5075557828f,  0.5132341385f,
+         0.5228683949f,  0.5313730240f,  0.5423596501f,  0.5556432009f,  0.5973936319f,
+         0.6787342429f,  0.7472499609f,  0.8136605620f,  0.8203776479f,  0.6013670564f,
+         0.0000000000f,  -0.6013671160f, -0.8203776479f, -0.8136607409f, -0.7472500801f,
+         -0.6787342429f, -0.5973935723f, -0.5556432009f, -0.5423595905f, -0.5313730240f,
+         -0.5228683949f, -0.5132341385f, -0.5075558424f, -0.5042841434f, -0.5024200678f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5021677613f,  0.5038304925f,  0.5067336559f,  0.5117224455f,
+         0.5200182796f,  0.5271236300f,  0.5358940363f,  0.5455409884f,  0.5636704564f,
+         0.6162818074f,  0.6496601105f,  0.6607547998f,  0.6008188725f,  0.3879746199f,
+         0.0000000000f,  -0.3879747093f, -0.6008188725f, -0.6607549191f, -0.6496600509f,
+         -0.6162818670f, -0.5636703968f, -0.5455409288f, -0.5358939767f, -0.5271236897f,
+         -0.5200182796f, -0.5117224455f, -0.5067337155f, -0.5038304925f, -0.5021677017f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5015365481f,  0.5026984215f,  0.5046897531f,  0.5079899430f,
+         0.5130717754f,  0.5169013739f,  0.5206471086f,  0.5224504471f,  0.5176750422f,
+         0.5007511973f,  0.4893990755f,  0.4491262436f,  0.3595432043f,  0.2053054571f,
+         0.0000000000f,  -0.2053054571f, -0.3595432043f, -0.4491263032f, -0.4893990755f,
+         -0.5007511973f, -0.5176750422f, -0.5224504471f, -0.5206470490f, -0.5169014335f,
+         -0.5130717754f, -0.5079900026f, -0.5046896935f, -0.5026984215f, -0.5015365481f,
+         -0.5000000596f},
+        {0.5000000000f,  0.5009260774f,  0.5016064644f,  0.5027285814f,  0.5044430494f,
+         0.5065867305f,  0.5075244904f,  0.5070229173f,  0.5026227236f,  0.4890713692f,
+         0.4560364485f,  0.4148247242f,  0.3507413268f,  0.2586806417f,  0.1408952773f,
+         0.0000000000f,  -0.1408952773f, -0.2586806417f, -0.3507413268f, -0.4148246944f,
+         -0.4560364783f, -0.4890713692f, -0.5026226640f, -0.5070229173f, -0.5075244904f,
+         -0.5065867305f, -0.5044430494f, -0.5027285814f, -0.5016064644f, -0.5009260178f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4984455407f,  0.4972019792f,  0.4949190915f,  0.4906377792f,
+         0.4823517799f,  0.4737979174f,  0.4605855942f,  0.4399236441f,  0.4074669182f,
+         0.3570330739f,  0.3098451197f,  0.2497179806f,  0.1762735248f,  0.0914641768f,
+         0.0000000000f,  -0.0914641768f, -0.1762735248f, -0.2497179955f, -0.3098450899f,
+         -0.3570331335f, -0.4074669182f, -0.4399236441f, -0.4605855346f, -0.4737979472f,
+         -0.4823517799f, -0.4906377792f, -0.4949190915f, -0.4972020090f, -0.4984455109f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4974165857f,  0.4953899384f,  0.4917520583f,  0.4851788282f,
+         0.4731788635f,  0.4615318775f,  0.4445866942f,  0.4198218584f,  0.3836160004f,
+         0.3311764300f,  0.2845952809f,  0.2273271382f,  0.1593134999f,  0.0822749436f,
+         0.0000000000f,  -0.0822749436f, -0.1593135148f, -0.2273271531f, -0.2845952809f,
+         -0.3311764300f, -0.3836159706f, -0.4198218286f, -0.4445866644f, -0.4615319073f,
+         -0.4731788635f, -0.4851788580f, -0.4917520583f, -0.4953899384f, -0.4974165857f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000596f,  0.5019683242f,  0.5034724474f,  0.5060860515f,  0.5105357766f,
+         0.5177959800f,  0.5238327980f,  0.5309391022f,  0.5379270911f,  0.5411472321f,
+         0.5744605064f,  0.5888174176f,  0.5752269030f,  0.4958270788f,  0.3029264808f,
+         0.0000000000f,  -0.3029265106f, -0.4958270490f, -0.5752269626f, -0.5888174772f,
+         -0.5744605064f, -0.5411472321f, -0.5379270911f, -0.5309391022f, -0.5238327980f,
+         -0.5177959800f, -0.5105358362f, -0.5060860515f, -0.5034723878f, -0.5019683242f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5018416047f,  0.5032451153f,  0.5056754351f,  0.5097854137f,
+         0.5163972378f,  0.5217715502f,  0.5278583169f,  0.5332472920f,  0.5339364409f,
+         0.5506924391f,  0.5557163954f,  0.5314732194f,  0.4462319911f,  0.2658600807f,
+         0.0000000000f,  -0.2658601105f, -0.4462319911f, -0.5314732790f, -0.5557164550f,
+         -0.5506924391f, -0.5339364409f, -0.5332472920f, -0.5278582573f, -0.5217716098f,
+         -0.5163972378f, -0.5097853541f, -0.5056754351f, -0.5032451153f, -0.5018416047f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5016490817f,  0.5028999448f,  0.5050527453f,  0.5086503625f,
+         0.5142914653f,  0.5186827183f,  0.5232735872f,  0.5263579488f,  0.5235015154f,
+         0.5180896521f,  0.5119442344f,  0.4763633311f,  0.3873094022f,  0.2241454273f,
+         0.0000000000f,  -0.2241454422f, -0.3873094022f, -0.4763633311f, -0.5119441748f,
+         -0.5180897117f, -0.5235014558f, -0.5263578892f, -0.5232735872f, -0.5186827779f,
+         -0.5142914653f, -0.5086504221f, -0.5050527453f, -0.5028999448f, -0.5016490817f,
+         -0.5000000596f},
+        {0.5000000000f,  0.5011672974f,  0.5020375848f,  0.5035016537f,  0.5058373213f,
+         0.5091226101f,  0.5111725330f,  0.5122836232f,  0.5101932287f,  0.4998099208f,
+         0.4705953300f,  0.4316509366f,  0.3780660927f,  0.2909715176f,  0.1608594507f,
+         0.0000000000f,  -0.1608594358f, -0.2909715474f, -0.3780661225f, -0.4316509366f,
+         -0.4705953598f, -0.4998098910f, -0.5101932287f, -0.5122836232f, -0.5111725926f,
+         -0.5091226101f, -0.5058373213f, -0.5035016537f, -0.5020375848f, -0.5011672974f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5007008314f,  0.5012044907f,  0.5020091534f,  0.5031501055f,
+         0.5042502880f,  0.5041841865f,  0.5022494197f,  0.4958427250f,  0.4796353281f,
+         0.4435823262f,  0.4007542133f,  0.3363020718f,  0.2460453361f,  0.1309203655f,
+         0.0000000000f,  -0.1309203655f, -0.2460453361f, -0.3363020718f, -0.4007542133f,
+         -0.4435823560f, -0.4796353281f, -0.4958426654f, -0.5022494197f, -0.5041842461f,
+         -0.5042502880f, -0.5031501651f, -0.5020092130f, -0.5012044907f, -0.5007008314f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4988015890f,  0.4978311360f,  0.4960248172f,  0.4925622642f,
+         0.4856388867f,  0.4782574177f,  0.4665130079f,  0.4475508630f,  0.4167790711f,
+         0.3674541414f,  0.3202401102f,  0.2591174543f,  0.1835071146f,  0.0954245627f,
+         0.0000000000f,  -0.0954245627f, -0.1835071146f, -0.2591174543f, -0.3202401102f,
+         -0.3674541116f, -0.4167790413f, -0.4475508630f, -0.4665130079f, -0.4782574475f,
+         -0.4856388569f, -0.4925622940f, -0.4960248470f, -0.4978311062f, -0.4988015294f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4980117977f,  0.4964371324f,  0.4935791790f,  0.4883186519f,
+         0.4784279168f,  0.4685191810f,  0.4536466300f,  0.4311205149f,  0.3969023824f,
+         0.3454375863f,  0.2984294593f,  0.2395204306f,  0.1685037017f,  0.0872381777f,
+         0.0000000000f,  -0.0872381777f, -0.1685037017f, -0.2395204306f, -0.2984294593f,
+         -0.3454375863f, -0.3969023526f, -0.4311204851f, -0.4536466599f, -0.4685192108f,
+         -0.4784279168f, -0.4883186519f, -0.4935792387f, -0.4964371920f, -0.4980118275f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.5010477901f,  0.5018239021f,  0.5031182766f,  0.5051453114f,
+         0.5078617930f,  0.5093557239f,  0.5096575022f,  0.5064009428f,  0.4944033921f,
+         0.4632124305f,  0.4230656624f,  0.3596196771f,  0.2740281522f,  0.1503099501f,
+         0.0000000000f,  -0.1503099501f, -0.2740281820f, -0.3596196771f, -0.4230656624f,
+         -0.4632124305f, -0.4944033921f, -0.5064008832f, -0.5096575022f, -0.5093557835f,
+         -0.5078617930f, -0.5051452518f, -0.5031182766f, -0.5018239021f, -0.5010477304f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5009795427f,  0.5017020702f,  0.5028998852f,  0.5047514439f,
+         0.5071461797f,  0.5083272457f,  0.5081763268f,  0.5042734742f,  0.4913944900f,
+         0.4591503739f,  0.4183884263f,  0.3544511497f,  0.2652117610f,  0.1448854804f,
+         0.0000000000f,  -0.1448854804f, -0.2652117610f, -0.3544511199f, -0.4183884561f,
+         -0.4591503739f, -0.4913944900f, -0.5042735338f, -0.5081762671f, -0.5083272457f,
+         -0.5071461797f, -0.5047514439f, -0.5028998256f, -0.5017020702f, -0.5009795427f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5008758903f,  0.5015168786f,  0.5025681257f,  0.5041542053f,
+         0.5060635209f,  0.5067747831f,  0.5059480071f,  0.5010885596f,  0.4869216979f,
+         0.4531719685f,  0.4115628898f,  0.3473647535f,  0.2555567026f,  0.1373466700f,
+         0.0000000000f,  -0.1373466551f, -0.2555567324f, -0.3473647535f, -0.4115628600f,
+         -0.4531720281f, -0.4869216383f, -0.5010885596f, -0.5059480071f, -0.5067747831f,
+         -0.5060635209f, -0.5041542649f, -0.5025681257f, -0.5015168786f, -0.5008758307f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5006161928f,  0.5010533929f,  0.5017392039f,  0.5026661158f,
+         0.5033791661f,  0.5029437542f,  0.5004872084f,  0.4933607578f,  0.4762223363f,
+         0.4391518831f,  0.3958170116f,  0.3313111961f,  0.2418053001f,  0.1284317970f,
+         0.0000000000f,  -0.1284317821f, -0.2418053001f, -0.3313112259f, -0.3958170116f,
+         -0.4391518831f, -0.4762222767f, -0.4933607578f, -0.5004871488f, -0.5029437542f,
+         -0.5033791065f, -0.5026661158f, -0.5017392635f, -0.5010534525f, -0.5006161332f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5003644228f,  0.5006047487f,  0.5009382963f,  0.5012336969f,
+         0.5008131266f,  0.4993060529f,  0.4953506589f,  0.4861895740f,  0.4664809704f,
+         0.4267134368f,  0.3821379840f,  0.3176781237f,  0.2303763181f,  0.1217892319f,
+         0.0000000000f,  -0.1217892319f, -0.2303763330f, -0.3176781535f, -0.3821379840f,
+         -0.4267134368f, -0.4664809406f, -0.4861895740f, -0.4953505993f, -0.4993061125f,
+         -0.5008131266f, -0.5012336969f, -0.5009382963f, -0.5006047487f, -0.5003644228f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4993358850f,  0.4987771511f,  0.4976935983f,  0.4954852164f,
+         0.4906864166f,  0.4851732254f,  0.4758279026f,  0.4597451985f,  0.4319911599f,
+         0.3849090934f,  0.3379579186f,  0.2754054070f,  0.1962166131f,  0.1024479717f,
+         0.0000000000f,  -0.1024479717f, -0.1962166280f, -0.2754054070f, -0.3379579186f,
+         -0.3849091530f, -0.4319911599f, -0.4597451687f, -0.4758278131f, -0.4851732850f,
+         -0.4906864166f, -0.4954852462f, -0.4976935983f, -0.4987771511f, -0.4993358850f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4989066720f,  0.4980169535f,  0.4963521063f,  0.4931337833f,
+         0.4866205156f,  0.4795958996f,  0.4683040977f,  0.4498754740f,  0.4196476638f,
+         0.3707037270f,  0.3235089183f,  0.2620966136f,  0.1858147979f,  0.0966935307f,
+         0.0000000000f,  -0.0966935158f, -0.1858148128f, -0.2620966136f, -0.3235089481f,
+         -0.3707037270f, -0.4196476340f, -0.4498754442f, -0.4683040380f, -0.4795959294f,
+         -0.4866205454f, -0.4931338131f, -0.4963521063f, -0.4980169237f, -0.4989066422f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.4988959730f,  0.4979980290f,  0.4963187873f,  0.4930755794f,
+         0.4865204096f,  0.4794592559f,  0.4681210220f,  0.4496374130f,  0.4193531871f,
+         0.3703692853f,  0.3231719136f,  0.2617889047f,  0.1855761111f,  0.0965621620f,
+         0.0000000000f,  -0.0965621546f, -0.1855761409f, -0.2617889345f, -0.3231719136f,
+         -0.3703693151f, -0.4193531871f, -0.4496374130f, -0.4681210220f, -0.4794592857f,
+         -0.4865204096f, -0.4930756390f, -0.4963187873f, -0.4979980290f, -0.4988959432f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4989632964f,  0.4981172681f,  0.4965288043f,  0.4934426546f,
+         0.4871520996f,  0.4803220332f,  0.4692780674f,  0.4511435628f,  0.4212186337f,
+         0.3724914193f,  0.3253129125f,  0.2637456059f,  0.1870953143f,  0.0973988548f,
+         0.0000000000f,  -0.0973988473f, -0.1870953292f, -0.2637456059f, -0.3253128827f,
+         -0.3724914193f, -0.4212186038f, -0.4511435330f, -0.4692780375f, -0.4803220928f,
+         -0.4871520996f, -0.4934426844f, -0.4965288043f, -0.4981172979f, -0.4989632666f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4990658462f,  0.4982986450f,  0.4968487024f,  0.4940025806f,
+         0.4881176353f,  0.4816432595f,  0.4710544348f,  0.4534637332f,  0.4241041243f,
+         0.3757902384f,  0.3286523819f,  0.2668075860f,  0.1894792318f,  0.0987142026f,
+         0.0000000000f,  -0.0987141877f, -0.1894792318f, -0.2668075860f, -0.3286523819f,
+         -0.3757902384f, -0.4241040945f, -0.4534636736f, -0.4710544348f, -0.4816432893f,
+         -0.4881176651f, -0.4940026104f, -0.4968487322f, -0.4982987046f, -0.4990658164f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4993230999f,  0.4987545311f,  0.4976536036f,  0.4954148531f,
+         0.4905641079f,  0.4850046337f,  0.4755989015f,  0.4594423175f,  0.4316083491f,
+         0.3844630420f,  0.3375000954f,  0.2749801576f,  0.1958818436f,  0.1022618562f,
+         0.0000000000f,  -0.1022618413f, -0.1958818436f, -0.2749801576f, -0.3375000954f,
+         -0.3844630718f, -0.4316083491f, -0.4594423175f, -0.4755989015f, -0.4850046337f,
+         -0.4905640781f, -0.4954148829f, -0.4976535738f, -0.4987545311f, -0.4993230700f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4995733500f,  0.4991982579f,  0.4984387755f,  0.4967978001f,
+         0.4929749966f,  0.4883366227f,  0.4801396132f,  0.4654795229f,  0.4392894208f,
+         0.3934856057f,  0.3468125761f,  0.2836797237f,  0.2027634382f,  0.1061001420f,
+         0.0000000000f,  -0.1061001420f, -0.2027634382f, -0.2836797237f, -0.3468125463f,
+         -0.3934856355f, -0.4392894208f, -0.4654795229f, -0.4801395833f, -0.4883366823f,
+         -0.4929749668f, -0.4967978299f, -0.4984387755f, -0.4991982877f, -0.4995733202f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5006032586f,  0.5010305047f,  0.5016981363f,  0.5025926232f,
+         0.5032470226f,  0.5027559996f,  0.5002208352f,  0.4929866195f,  0.4757096469f,
+         0.4384897351f,  0.3950820863f,  0.3305716217f,  0.2411795706f,  0.1280656755f,
+         0.0000000000f,  -0.1280656755f, -0.2411796004f, -0.3305716217f, -0.3950820863f,
+         -0.4384897351f, -0.4757096469f, -0.4929866195f, -0.5002207756f, -0.5027559996f,
+         -0.5032470226f, -0.5025926828f, -0.5016981959f, -0.5010305047f, -0.5006032586f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5010370016f,  0.5018045902f,  0.5030835867f,  0.5050826669f,
+         0.5077480078f,  0.5091921091f,  0.5094215274f,  0.5060614347f,  0.4939221144f,
+         0.4625604451f,  0.4223127663f,  0.3585619628f,  0.2725898027f,  0.1494219899f,
+         0.0000000000f,  -0.1494219750f, -0.2725898027f, -0.3585619926f, -0.4223127961f,
+         -0.4625605047f, -0.4939221144f, -0.5060614347f, -0.5094215274f, -0.5091921091f,
+         -0.5077480078f, -0.5050827861f, -0.5030835867f, -0.5018045902f, -0.5010369420f,
+         -0.5000000000f}},
+    {
+
+        {0.5000000000f,  0.4979922175f,  0.4964025617f,  0.4935186803f,  0.4882142544f,
+         0.4782521725f,  0.4682838917f,  0.4533392787f,  0.4307336509f,  0.3964424431f,
+         0.3449379802f,  0.2979410589f,  0.2390869260f,  0.1681751311f,  0.0870600939f,
+         0.0000000000f,  -0.0870600939f, -0.1681751460f, -0.2390869558f, -0.2979410589f,
+         -0.3449379802f, -0.3964424431f, -0.4307335615f, -0.4533392787f, -0.4682839215f,
+         -0.4782521725f, -0.4882142544f, -0.4935186505f, -0.4964025617f, -0.4979921579f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4981160462f,  0.4966207743f,  0.4939002991f,  0.4888732731f,
+         0.4793626070f,  0.4697723091f,  0.4552863240f,  0.4331888258f,  0.3993673325f,
+         0.3481221795f,  0.3010587096f,  0.2418579161f,  0.1702777445f,  0.0882006139f,
+         0.0000000000f,  -0.0882006139f, -0.1702777743f, -0.2418579161f, -0.3010587096f,
+         -0.3481221795f, -0.3993673027f, -0.4331887960f, -0.4552863240f, -0.4697723091f,
+         -0.4793626070f, -0.4888732731f, -0.4939003289f, -0.4966207743f, -0.4981160164f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4983044863f,  0.4969531596f,  0.4944825768f,  0.4898807108f,
+         0.4810664356f,  0.4720634520f,  0.4582964182f,  0.4370048046f,  0.4039427638f,
+         0.3531388044f,  0.3059939146f,  0.2462634593f,  0.1736325473f,  0.0900245756f,
+         0.0000000000f,  -0.0900245681f, -0.1736325473f, -0.2462634593f, -0.3059939146f,
+         -0.3531388342f, -0.4039427042f, -0.4370048046f, -0.4582964182f, -0.4720634818f,
+         -0.4810664356f, -0.4898807704f, -0.4944825768f, -0.4969531298f, -0.4983044863f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4987780154f,  0.4977895021f,  0.4959515929f,  0.4924345016f,
+         0.4854198098f,  0.4779591858f,  0.4661146402f,  0.4470350742f,  0.4161445498f,
+         0.3667378426f,  0.3195213675f,  0.2584639788f,  0.1830018908f,  0.0951471180f,
+         0.0000000000f,  -0.0951471031f, -0.1830018908f, -0.2584639788f, -0.3195213974f,
+         -0.3667378724f, -0.4161445200f, -0.4470350742f, -0.4661146402f, -0.4779591858f,
+         -0.4854198396f, -0.4924345613f, -0.4959515929f, -0.4977895319f, -0.4987780452f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4992391467f,  0.4986056089f,  0.4973905385f,  0.4949527979f,
+         0.4897618592f,  0.4839001894f,  0.4741017818f,  0.4574657679f,  0.4291163385f,
+         0.3815677166f,  0.3345352709f,  0.2722316682f,  0.1937220246f,  0.1010626405f,
+         0.0000000000f,  -0.1010626331f, -0.1937220395f, -0.2722316980f, -0.3345352709f,
+         -0.3815677166f, -0.4291163385f, -0.4574657679f, -0.4741017818f, -0.4839001894f,
+         -0.4897618592f, -0.4949527979f, -0.4973905683f, -0.4986056685f, -0.4992391169f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000000f,  0.5011434555f,  0.5019949079f,  0.5034251213f,  0.5056989789f,
+         0.5088702440f,  0.5108084083f,  0.5117562413f,  0.5094295144f,  0.4987166524f,
+         0.4690935910f,  0.4298956990f,  0.3742347658f,  0.2874245048f,  0.1586372405f,
+         0.0000000000f,  -0.1586372405f, -0.2874245048f, -0.3742347956f, -0.4298956990f,
+         -0.4690936506f, -0.4987166524f, -0.5094294548f, -0.5117561817f, -0.5108084679f,
+         -0.5088702440f, -0.5056990385f, -0.5034251213f, -0.5019949675f, -0.5011434555f,
+         -0.5000000000f},
+        {0.5000000596f,  0.5019482374f,  0.5034363270f,  0.5060207844f,  0.5104164481f,
+         0.5175731182f,  0.5235039592f,  0.5304464102f,  0.5371760726f,  0.5399830937f,
+         0.5705516338f,  0.5833023787f,  0.5678069592f,  0.4872313440f,  0.2963676453f,
+         0.0000000000f,  -0.2963677049f, -0.4872313440f, -0.5678069592f, -0.5833023787f,
+         -0.5705516338f, -0.5399830341f, -0.5371760726f, -0.5304464102f, -0.5235040188f,
+         -0.5175731182f, -0.5104165077f, -0.5060207844f, -0.5034362674f, -0.5019482374f,
+         -0.5000000596f}},
+    {
+
+        {0.5000000000f,  0.4973910451f,  0.4953450263f,  0.4916738272f,  0.4850449860f,
+         0.4729567766f,  0.4612380564f,  0.4442087412f,  0.4193551242f,  0.3830735385f,
+         0.3306014538f,  0.2840420604f,  0.2268431634f,  0.1589508802f,  0.0820798650f,
+         0.0000000000f,  -0.0820798576f, -0.1589508951f, -0.2268431783f, -0.2840420604f,
+         -0.3306014538f, -0.3830735683f, -0.4193551242f, -0.4442086816f, -0.4612380564f,
+         -0.4729567766f, -0.4850450158f, -0.4916738570f, -0.4953449965f, -0.4973909855f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4975522459f,  0.4956282973f,  0.4921671450f,  0.4858898818f,
+         0.4743613005f,  0.4630986154f,  0.4466060102f,  0.4223214984f,  0.3865298629f,
+         0.3342745304f,  0.2875820100f,  0.2299449295f,  0.1612776965f,  0.0833326429f,
+         0.0000000000f,  -0.0833326355f, -0.1612777114f, -0.2299449295f, -0.2875820100f,
+         -0.3342745602f, -0.3865298331f, -0.4223214984f, -0.4466060400f, -0.4630986452f,
+         -0.4743613005f, -0.4858898818f, -0.4921671748f, -0.4956283271f, -0.4975521863f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4977977276f,  0.4960601032f,  0.4929202795f,  0.4871834517f,
+         0.4765217602f,  0.4659720957f,  0.4503277540f,  0.4269563556f,  0.3919707835f,
+         0.3401035368f,  0.2932292819f,  0.2349164933f,  0.1650211811f,  0.0853530467f,
+         0.0000000000f,  -0.0853530392f, -0.1650211811f, -0.2349164784f, -0.2932292819f,
+         -0.3401035368f, -0.3919707835f, -0.4269563556f, -0.4503277242f, -0.4659721255f,
+         -0.4765217602f, -0.4871834517f, -0.4929203391f, -0.4960601330f, -0.4977976680f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4984147847f,  0.4971478283f,  0.4948240519f,  0.4904728234f,
+         0.4820713699f,  0.4734190702f,  0.4600848258f,  0.4392839074f,  0.4066926241f,
+         0.3561752141f,  0.3089951873f,  0.2489543557f,  0.1756889224f,  0.0911452249f,
+         0.0000000000f,  -0.0911452249f, -0.1756889224f, -0.2489543557f, -0.3089951873f,
+         -0.3561752439f, -0.4066926539f, -0.4392838776f, -0.4600848556f, -0.4734191597f,
+         -0.4820713401f, -0.4904728830f, -0.4948240817f, -0.4971478581f, -0.4984148145f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4990161359f,  0.4982108474f,  0.4966937900f,  0.4937312901f,
+         0.4876496494f,  0.4810023904f,  0.4701921344f,  0.4523362219f,  0.4227000475f,
+         0.3741825819f,  0.3270231485f,  0.2653121948f,  0.1883139759f,  0.0980708972f,
+         0.0000000000f,  -0.0980708972f, -0.1883139908f, -0.2653121948f, -0.3270231187f,
+         -0.3741825819f, -0.4227000475f, -0.4523362219f, -0.4701920748f, -0.4810024500f,
+         -0.4876495600f, -0.4937313497f, -0.4966937602f, -0.4982108474f, -0.4990161359f,
+         -0.5000000000f},
+        {0.5000000000f,  0.4999683797f,  0.4999000132f,  0.4996838570f,  0.4990009665f,
+         0.4968476892f,  0.4937299490f,  0.4875672758f,  0.4754966497f,  0.4522733092f,
+         0.4090909064f,  0.3631930947f,  0.2992399931f,  0.2152527571f,  0.1131368279f,
+         0.0000000000f,  -0.1131368279f, -0.2152527571f, -0.2992399931f, -0.3631930947f,
+         -0.4090909064f, -0.4522732794f, -0.4754966199f, -0.4875672758f, -0.4937299788f,
+         -0.4968476892f, -0.4990009964f, -0.4996838868f, -0.4999000132f, -0.4999683797f,
+         -0.5000000000f},
+        {0.5000000596f,  0.5015053153f,  0.5026424527f,  0.5045889616f,  0.5078070164f,
+         0.5127342939f,  0.5164096355f,  0.5199240446f,  0.5213798285f,  0.5160900950f,
+         0.4961368442f,  0.4834818840f,  0.4421011508f,  0.3525198102f,  0.2006191760f,
+         0.0000000000f,  -0.2006191611f, -0.3525197804f, -0.4421012104f, -0.4834818840f,
+         -0.4961368442f, -0.5160900950f, -0.5213798285f, -0.5199240446f, -0.5164096951f,
+         -0.5127342939f, -0.5078070164f, -0.5045889616f, -0.5026424527f, -0.5015053153f,
+         -0.5000000596f},
+        {0.5000000596f,  0.5025598407f,  0.5045354962f,  0.5080122352f,  0.5140760541f,
+         0.5244651437f,  0.5337679982f,  0.5460379124f,  0.5614778399f,  0.6178392172f,
+         0.7190376520f,  0.8149639368f,  0.9330952168f,  1.0282080173f,  0.8643135428f,
+         0.0000000000f,  -0.8643140197f, -1.0282078981f, -0.9330952764f, -0.8149639368f,
+         -0.7190377116f, -0.6178392172f, -0.5614778399f, -0.5460379124f, -0.5337680578f,
+         -0.5244650841f, -0.5140760541f, -0.5080122352f, -0.5045354962f, -0.5025598407f,
+         -0.5000000596f}}
+
 };
 
-const WORD32 ixheaacd_re_weight_Q28[16][8][31] = {
+const FLOAT32 ixheaacd_beta[16][8][31] = {
     {
-        {134217728,  133460863,  132868901,  131810111,  129908442,  126470291,
-         123168465,  118415202,  111553289,  101653880,  87503416,   75055587,
-         59853017,   41890564,   21615401,   0,          -21615400,  -41890567,
-         -59853022,  -75055592,  -87503416,  -101653880, -111553289, -118415202,
-         -123168474, -126470291, -129908442, -131810119, -132868916, -133460855,
-         -134217736},
-        {134217728,  133507641,  132951036,  131952906,  130152305,  126873835,
-         123700894,  119097743,  112392608,  102624793,  88527346,   76037569,
-         60709668,   42530952,   21959413,   0,          -21959412,  -42530956,
-         -60709668,  -76037567,  -88527354,  -102624793, -112392608, -119097743,
-         -123700897, -126873843, -130152314, -131952906, -132951044, -133507625,
-         -134217736},
-        {134217728,  133578889,  133076245,  132170971,  130525880,  127495076,
-         124524084,  120158840,  113706267,  104156340,  90156022,   77607879,
-         62086135,   43563841,   22515636,   0,          -22515635,  -43563843,
-         -62086140,  -77607874,  -90156032,  -104156349, -113706267, -120158844,
-         -124524084, -127495076, -130525880, -132170971, -133076253, -133578881,
-         -134217736},
-        {134217728,  133758012,  133391773,  132722523,  131476888,  129093806,
-         126662688,  122949415,  117214012,  108319953,  94671025,   82017354,
-         65996439,   46525651,   24120340,   0,          -24120340,  -46525655,
-         -65996434,  -82017354,  -94671025,  -108319953, -117214003, -122949415,
-         -126662696, -129093806, -131476888, -132722531, -133391781, -133758012,
-         -134217736},
-        {134217728,  133932649,  133700308,  133264733,  132420429,  130705061,
-         128848242,  125853808,  120950424,  112880929,  99774559,   87108077,
-         70599795,   50068507,   26060170,   0,          -26060170,  -50068507,
-         -70599792,  -87108068,  -99774568,  -112880929, -120950424, -125853814,
-         -128848243, -130705069, -132420430, -133264733, -133700308, -133932641,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217744,  134655979,  134988239,  135559790,  136513776,  138005964,
-         139162482,  140361258,  141138020,  140293965,  138371877,  136502930,
-         126746944,  102804704,  59370579,   0,          -59370579,  -102804704,
-         -126746957, -136502930, -138371890, -140293970, -141138020, -140361258,
-         -139162497, -138005964, -136513792, -135559805, -134988239, -134655979,
-         -134217744},
-        {134217744,  134962683,  135539295,  136557732,  138346233,  141452453,
-         144288910,  148135620,  153292676,  175071409,  212428515,  254219167,
-         323573619,  452387989,  709374650,  0,          -709375876, -452387936,
-         -323573672, -254219167, -212428528, -175071409, -153292663, -148135606,
-         -144288924, -141452453, -138346233, -136557732, -135539295, -134962683,
-         -134217744},
-    },
-    {
-        {134217728,  133517388,  132968168,  131982689,  130203271,  126958371,
-         123812646,  119241372,  112569794,  102830521,  88745164,   76246965,
-         60892748,   42668052,   22033146,   0,          -22033144,  -42668057,
-         -60892753,  -76246965,  -88745164,  -102830531, -112569785, -119241363,
-         -123812654, -126958371, -130203280, -131982697, -132968160, -133517380,
-         -134217736},
-        {134217728,  133560667,  133044207,  132115111,  130430074,  127335394,
-         124312090,  119884885,  113366063,  103758318,  89731143,   77197214,
-         61725371,   43292653,   22369435,   0,          -22369434,  -43292655,
-         -61725371,  -77197209,  -89731143,  -103758309, -113366063, -119884894,
-         -124312098, -127335394, -130430074, -132115119, -133044215, -133560651,
-         -134217736},
-        {134217728,  133626556,  133160120,  132317284,  130777308,  127915335,
-         125083431,  120883935,  114610226,  105218864,  91295851,   78713132,
-         63059915,   44297538,   22911785,   0,          -22911782,  -44297538,
-         -63059910,  -78713137,  -91295851,  -105218855, -114610226, -120883935,
-         -125083440, -127915335, -130777308, -132317293, -133160128, -133626540,
-         -134217736},
-        {134217728,  133792202,  133452102,  132828323,  131660297,  129405046,
-         127082463,  123503081,  117919375,  109170723,  95610055,   82945267,
-         66828178,   47161136,   24466610,   0,          -24466610,  -47161136,
-         -66828178,  -82945267,  -95610064,  -109170725, -117919366, -123503090,
-         -127082486, -129405039, -131660312, -132828331, -133452110, -133792210,
-         -134217736},
-        {134217728,  133953625,  133737455,  133330222,  132534982,  130902453,
-         129118100,  126216242,  121423078,  113467678,  100443871,  87784612,
-         71219199,   50550149,   26325706,   0,          -26325706,  -50550154,
-         -71219202,  -87784612,  -100443871, -113467678, -121423078, -126216226,
-         -129118109, -130902453, -132534997, -133330214, -133737456, -133953625,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217744,  134621813,  134927051,  135449572,  136313400,  137636071,
-         138622650,  139566056,  139956832,  138536878,  133180717,  129783677,
-         118675624,  94628804,   53853292,   0,          -53853295,  -94628804,
-         -118675637, -129783677, -133180717, -138536864, -139956832, -139566056,
-         -138622666, -137636071, -136313400, -135449556, -134927051, -134621813,
-         -134217744},
-        {134217744,  134904883,  135435203,  136368502,  137996233,  140785045,
-         143282261,  146575942,  150720567,  165849956,  193015182,  218765195,
-         250475781,  276007380,  232012261,  0,          -232012394, -276007380,
-         -250475807, -218765195, -193015209, -165849956, -150720553, -146575942,
-         -143282270, -140785029, -137996233, -136368502, -135435219, -134904883,
-         -134217744},
-    },
-    {
-        {134217728,  133678764,  133252044,  132477911,  131054012,  128379841,
-         125703998,  121692333,  115624163,  106419205,  92593586,   79977946,
-         64179408,   45144170,   23370016,   0,          -23370016,  -45144175,
-         -64179408,  -79977946,  -92593586,  -106419196, -115624163, -121692324,
-         -125704006, -128379848, -131054020, -132477902, -133252052, -133678756,
-         -134217736},
-        {134217728,  133712005,  133310620,  132580354,  131230923,  128677921,
-         126103542,  122214988,  116283221,  107204353,  93448326,   80814826,
-         64923233,   45708586,   23676171,   0,          -23676171,  -45708586,
-         -64923233,  -80814831,  -93448326,  -107204344, -116283221, -122214988,
-         -126103542, -128677921, -131230923, -132580362, -133310620, -133711997,
-         -134217736},
-        {134217728,  133762594,  133399847,  132736656,  131501355,  129135285,
-         126718571,  123023009,  117307580,  108432548,  94794977,   82139614,
-         66105841,   46609132,   24165789,   0,          -24165786,  -46609132,
-         -66105847,  -82139614,  -94794987,  -108432548, -117307580, -123023009,
-         -126718574, -129135283, -131501371, -132736656, -133399839, -133762594,
-         -134217736},
-        {134217728,  133889704,  133624356,  133130995,  132186884,  130303885,
-         128301191,  125121697,  120000061,  111707953,  98445440,   85770865,
-         69380893,   49124191,   25540859,   0,          -25540857,  -49124196,
-         -69380888,  -85770874,  -98445440,  -111707944, -120000061, -125121697,
-         -128301191, -130303893, -132186900, -133130995, -133624356, -133889712,
-         -134217728},
-        {134217728,  134013488,  133843425,  133517257,  132862879,  131469447,
-         129895964,  127265729,  122800030,  115190043,  102426301,  89801131,
-         73076637,   52001860,   27128796,   0,          -27128794,  -52001864,
-         -73076641,  -89801131,  -102426301, -115190039, -122800030, -127265729,
-         -129895972, -131469447, -132862879, -133517265, -133843441, -134013480,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134524667,  134753225,  135137152,  135747532,  136598811,
-         137119080,  137373516,  136748951,  133873231,  125921352,  115399244,
-         100457884,  77154931,   42583862,   0,          -42583862,  -77154938,
-         -100457891, -115399244, -125921369, -133873231, -136748936, -137373501,
-         -137119096, -136598811, -135747548, -135137152, -134753241, -134524667,
-         -134217728},
-        {134217744,  134740697,  135140165,  135833916,  137013874,  138934982,
-         140527025,  142390637,  144197099,  144950624,  153156303,  156579063,
-         152419543,  130790210,  79555611,   0,          -79555625,  -130790210,
-         -152419556, -156579063, -153156316, -144950610, -144197089, -142390622,
-         -140527040, -138934982, -137013890, -135833916, -135140150, -134740697,
-         -134217744},
-    },
-    {
-        {134217728,  133921369,  133680325,  133229561,  132358967,  130599331,
-         128703866,  125660282,  120698624,  112569282,  99420258,   86750815,
-         70273432,   49815216,   25920711,   0,          -25920711,  -49815221,
-         -70273437,  -86750806,  -99420256,  -112569274, -120698624, -125660282,
-         -128703883, -130599348, -132358983, -133229561, -133680325, -133921361,
-         -134217728},
-        {134217728,  133939441,  133712333,  133285932,  132457505,  130768900,
-         128935466,  125970874,  121102931,  113070012,  99989913,   87325519,
-         70798672,   50223025,   26145310,   0,          -26145308,  -50223025,
-         -70798677,  -87325519,  -99989913,  -113070003, -121102931, -125970860,
-         -128935481, -130768908, -132457513, -133285932, -133712341, -133939433,
-         -134217728},
-        {134217728,  133966965,  133761027,  133371807,  132607806,  131028081,
-         129290134,  126447733,  121725737,  113844587,  100875426,  88221963,
-         71620613,   50862941,   26498391,   0,          -26498388,  -50862946,
-         -71620620,  -88221963,  -100875417, -113844587, -121725728, -126447716,
-         -129290134, -131028089, -132607807, -133371815, -133761036, -133966957,
-         -134217728},
-        {134217728,  134036022,  133883399,  133587872,  132986916,  131684800,
-         130192440,  127667609,  123330628,  115859003,  103203522,  90597004,
-         73814421,   52581631,   27450709,   0,          -27450709,  -52581635,
-         -73814421,  -90597004,  -103203522, -115858986, -123330612, -127667609,
-         -130192441, -131684792, -132986917, -133587864, -133883399, -134036014,
-         -134217728},
-        {134217728,  134103202,  134002513,  133798640,  133358145,  132331971,
-         131086862,  128886498,  124951227,  117920856,  105625498,  93096793,
-         76149690,   54428903,   28481041,   0,          -28481039,  -54428903,
-         -76149698,  -93096793,  -105625498, -117920856, -124951227, -128886489,
-         -131086879, -132331963, -133358153, -133798640, -134002521, -134103194,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134379666,  134494354,  134673574,  134913679,  135089351,
-         134957528,  134277005,  132335084,  127697337,  117706196,  106054041,
-         88737129,   64741142,   34377364,   0,          -34377364,  -64741149,
-         -88737144,  -106054041, -117706196, -127697337, -132335084, -134276990,
-         -134957528, -135089351, -134913679, -134673590, -134494354, -134379666,
-         -134217728},
-        {134217728,  134496089,  134702142,  135045469,  135582090,  136297572,
-         136685209,  136746798,  135844838,  132586209,  124167611,  113363711,
-         96250730,   73172752,   40110146,   0,          -40110146,  -73172752,
-         -96250737,  -113363711, -124167625, -132586192, -135844823, -136746798,
-         -136685224, -136297557, -135582122, -135045469, -134702142, -134496073,
-         -134217728},
-    },
-    {
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369938,   0,          -30369936,  -57781476,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369938,   0,          -30369936,  -57781476,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369938,   0,          -30369936,  -57781479,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-    },
-    {
-        {134217728,  134498993,  134707335,  135054789,  135598900,  136328115,
-         136729141,  136810142,  135935959,  132715402,  124342638,  113565820,
-         96534651,   73558852,   40348512,   0,          -40348509,  -73558852,
-         -96534651,  -113565820, -124342622, -132715402, -135935959, -136810127,
-         -136729141, -136328115, -135598916, -135054789, -134707335, -134498977,
-         -134217728},
-        {134217728,  134480680,  134674623,  134996162,  135493192,  136136017,
-         136453048,  136412541,  135364880,  131907703,  123252219,  112310293,
-         95147250,   71192218,   38892389,   0,          -38892389,  -71192225,
-         -95147244,  -112310293, -123252233, -131907703, -135364880, -136412525,
-         -136453064, -136136017, -135493192, -134996162, -134674623, -134480664,
-         -134217728},
-        {134217728,  134452852,  134624907,  134907111,  135332868,  135845392,
-         136036318,  135814387,  134509950,  130707034,  121647428,  110478072,
-         93245003,   68600479,   36868706,   0,          -36868706,  -68600486,
-         -93245010,  -110478072, -121647428, -130707019, -134509933, -135814387,
-         -136036318, -135845392, -135332868, -134907111, -134624907, -134452836,
-         -134217728},
-        {134217728,  134383129,  134500515,  134684594,  134933403,  135124815,
-         135007943,  134348491,  132435517,  127834944,  117883926,  106251314,
-         88935676,   64909118,   34475644,   0,          -34475641,  -64909118,
-         -88935672,  -106251314, -117883941, -127834944, -132435502, -134348484,
-         -135007943, -135124799, -134933403, -134684610, -134500515, -134383113,
-         -134217728},
-        {134217728,  134315558,  134380057,  134469604,  134548899,  134436000,
-         134031448,  132969665,  130510521,  125220021,  114545007,  102579384,
-         85276062,   61841165,   32692547,   0,          -32692543,  -61841172,
-         -85276062,  -102579384, -114545015, -125220021, -130510514, -132969665,
-         -134031463, -134436000, -134548899, -134469604, -134380057, -134315558,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134039455,  133889472,  133598612,  133005816,  131717634,
-         130237695,  127729079,  123411911,  115961736,  103323251,  90719885,
-         73928581,   52671501,   27500671,   0,          -27500669,  -52671505,
-         -73928581,  -90719885,  -103323259, -115961741, -123411903, -127729055,
-         -130237711, -131717634, -133005816, -133598612, -133889472, -134039447,
-         -134217728},
-        {134217728,  133924242,  133685411,  133238504,  132374593,  130626201,
-         128740547,  125709420,  120762534,  112648312,  99510030,   86841272,
-         70356024,   49879283,   25955974,   0,          -25955971,  -49879287,
-         -70356024,  -86841272,  -99510039,  -112648312, -120762526, -125709412,
-         -128740555, -130626209, -132374601, -133238504, -133685403, -133924234,
-         -134217728},
-    },
-    {
-        {134217744,  134746091,  135149853,  135851434,  137045902,  138994799,
-         140615296,  142522879,  144398695,  145263100,  154205556,  158059463,
-         154411290,  133097557,  81316205,   0,          -81316205,  -133097543,
-         -154411303, -158059463, -154205556, -145263100, -144398695, -142522879,
-         -140615296, -138994799, -137045918, -135851434, -135149837, -134746091,
-         -134217744},
-        {134217744,  134712087,  135088825,  135741208,  136844475,  138619336,
-         140061990,  141695888,  143142475,  143327466,  147825370,  149173983,
-         142666223,  119784477,  71366265,   0,          -71366265,  -119784477,
-         -142666263, -149173983, -147825383, -143327466, -143142475, -141695873,
-         -140062006, -138619320, -136844467, -135741224, -135088825, -134712087,
-         -134217744},
-        {134217744,  134660400,  134996180,  135574064,  136539790,  138054064,
-         139232828,  140465192,  141293136,  140526367,  139073637,  137423970,
-         127872797,  103967564,  60168572,   0,          -60168579,  -103967564,
-         -127872810, -137423970, -139073650, -140526353, -141293121, -140465192,
-         -139232828, -138054064, -136539805, -135574064, -134996180, -134660400,
-         -134217744},
-        {134217728,  134531071,  134764682,  135157698,  135784674,  136666568,
-         137216832,  137515087,  136953956,  134166704,  126324479,  115870417,
-         101486338,  78107065,   43180376,   0,          -43180372,  -78107065,
-         -101486344, -115870417, -126324479, -134166690, -136953956, -137515087,
-         -137216847, -136666568, -135784674, -135157698, -134764682, -134531071,
-         -134217728},
-        {134217728,  134405853,  134541061,  134757061,  135063333,  135358653,
-         135340907,  134821548,  133101766,  128751135,  119073216,  107576641,
-         90275394,   66047286,   35143667,   0,          -35143664,  -66047286,
-         -90275401,  -107576641, -119073231, -128751120, -133101751, -134821548,
-         -135340923, -135358653, -135063349, -134757077, -134541061, -134405853,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133896028,  133635530,  133150648,  132221176,  130362696,
-         128381245,  125228644,  120138520,  111878277,  98637718,   85963798,
-         69556315,   49259814,   25615335,   0,          -25615335,  -49259818,
-         -69556315,  -85963798,  -98637718,  -111878269, -120138520, -125228635,
-         -128381253, -130362689, -132221184, -133150656, -133635522, -133896020,
-         -134217728},
-        {134217728,  133684024,  133261330,  132494150,  131082043,  128427016,
-         125767162,  121774846,  115728035,  106542671,  92727700,   80109047,
-         64295775,   45232367,   23417819,   0,          -23417819,  -45232367,
-         -64295774,  -80109052,  -92727700,  -106542671, -115728027, -121774851,
-         -125767170, -128427016, -131082043, -132494166, -133261346, -133684032,
-         -134217736},
-    },
-    {
-        {134217744,  134911968,  135447966,  136391663,  138039000,  140866367,
-         143404554,  146764521,  151021632,  166927889,  195202182,  222570595,
-         257610421,  289862500,  252874234,  0,          -252874341, -289862420,
-         -257610501, -222570621, -195202209, -166927876, -151021632, -146764507,
-         -143404554, -140866352, -138039000, -136391663, -135447966, -134911968,
-         -134217744},
-        {134217744,  134867355,  135367738,  136245965,  137770239,  140356424,
-         142639355,  145588557,  149154344,  160361636,  182196342,  200588382,
-         218415341,  220218448,  161428236,  0,          -161428263, -220218448,
-         -218415395, -200588409, -182196329, -160361623, -149154344, -145588542,
-         -142639355, -140356409, -137770238, -136245981, -135367738, -134867355,
-         -134217744},
-        {134217744,  134799630,  135245963,  136025282,  137364449,  139591338,
-         141498666,  143852961,  146442545,  151309130,  165431889,  174391809,
-         177370022,  161281089,  104146144,  0,          -104146171, -161281089,
-         -177370049, -174391796, -165431903, -151309116, -146442531, -143852947,
-         -141498681, -139591338, -137364449, -136025297, -135245963, -134799614,
-         -134217744},
-        {134217744,  134630198,  134942075,  135476620,  136362516,  137726655,
-         138754657,  139760139,  140244217,  138962344,  134419383,  131372064,
-         120561410,  96514144,   55111265,   0,          -55111262,  -96514144,
-         -120561424, -131372064, -134419383, -138962344, -140244217, -139760124,
-         -138754673, -137726655, -136362532, -135476604, -134942075, -134630198,
-         -134217744},
-        {134217728,  134466320,  134648961,  134950176,  135410401,  135985835,
-         136237563,  136102933,  134921759,  131284100,  122416352,  111353663,
-         94151405,   69439052,   37821289,   0,          -37821289,  -69439058,
-         -94151405,  -111353655, -122416359, -131284100, -134921744, -136102933,
-         -136237563, -135985836, -135410401, -134950176, -134648961, -134466304,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133800456,  133466639,  132853833,  131704577,  129480322,
-         127184162,  123637500,  118091100,  109378569,  95840339,   83173415,
-         67033158,   47318062,   24552229,   0,          -24552227,  -47318062,
-         -67033165,  -83173405,  -95840348,  -109378569, -118091100, -123637492,
-         -127184170, -129480322, -131704577, -132853833, -133466647, -133800448,
-         -134217736},
-        {134217728,  133524250,  132980227,  132003691,  130239201,  127017985,
-         123891524,  119342831,  112695071,  102976138,  88899495,   76395462,
-         61022664,   42765392,   22085513,   0,          -22085512,  -42765395,
-         -61022669,  -76395462,  -88899495,  -102976129, -112695062, -119342822,
-         -123891527, -127017985, -130239210, -132003691, -132980227, -133524250,
-         -134217736},
-    },
-    {
-        {134217744,  134970359,  135553135,  136582894,  138392877,  141541743,
-         144424094,  148346340,  153978836,  176372729,  215302062,  259806420,
-         336609085,  494304735,  975787497,  -858993460, -975789097, -494304522,
-         -336609192, -259806447, -215302075, -176372702, -153978836, -148346340,
-         -144424109, -141541728, -138392877, -136582894, -135553135, -134970359,
-         -134217744},
-        {134217744,  134922022,  135466091,  136424566,  138099800,  140982070,
-         143578731,  147033572,  151452343,  168483023,  198394635,  228208128,
-         268470634,  312112739,  289892500,  0,          -289892633, -312112739,
-         -268470714, -228208155, -198394649, -168483009, -151452340, -147033558,
-         -143578731, -140982070, -138099815, -136424566, -135466075, -134922022,
-         -134217744},
-        {134217744,  134848627,  135333994,  136184803,  137657591,  140143456,
-         142320970,  145102040,  148388972,  157750196,  177226889,  192583689,
-         205271595,  199995929,  140105690,  0,          -140105757, -199995915,
-         -205271635, -192583689, -177226916, -157750183, -148388958, -145102025,
-         -142320985, -140143456, -137657591, -136184803, -135334009, -134848611,
-         -134217744},
-        {134217744,  134665058,  135004509,  135589124,  136567188,  138104822,
-         139307072,  140574980,  141457125,  140772491,  139820837,  138408050,
-         129080970,  105221711,  61032985,   0,          -61032985,  -105221711,
-         -129080997, -138408050, -139820850, -140772477, -141457125, -140574962,
-         -139307072, -138104806, -136567205, -135589140, -135004525, -134665058,
-         -134217744},
-        {134217728,  134487552,  134686918,  135018188,  135532903,  136208162,
-         136556685,  136561648,  135578778,  132209698,  123658874,  112777500,
-         95635765,   72064052,   39427432,   0,          -39427432,  -72064065,
-         -95635772,  -112777498, -123658874, -132209683, -135578762, -136561648,
-         -136556685, -136208146, -135532903, -135018204, -134686918, -134487552,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133766932,  133407501,  132750065,  131524599,  129174690,
-         126771678,  123092977,  117396601,  108539737,  94913060,   82256151,
-         66210183,   46688771,   24209158,   0,          -24209156,  -46688776,
-         -66210179,  -82256150,  -94913060,  -108539737, -117396605, -123092969,
-         -126771680, -129174690, -131524607, -132750073, -133407493, -133766932,
-         -134217736},
-        {134217728,  133468277,  132881938,  131832762,  129947063,  126534099,
-         123252524,  118522767,  111685262,  101806166,  87663578,   75208916,
-         59986579,   41990286,   21668928,   0,          -21668926,  -41990288,
-         -59986579,  -75208922,  -87663568,  -101806156, -111685259, -118522767,
-         -123252524, -126534093, -129947064, -131832762, -132881938, -133468277,
-         -134217736},
-    },
-    {
-        {134217744,  134911968,  135447966,  136391663,  138039000,  140866367,
-         143404554,  146764521,  151021632,  166927889,  195202182,  222570595,
-         257610421,  289862500,  252874234,  0,          -252874341, -289862420,
-         -257610501, -222570621, -195202209, -166927876, -151021632, -146764507,
-         -143404554, -140866352, -138039000, -136391663, -135447966, -134911968,
-         -134217744},
-        {134217744,  134867355,  135367738,  136245965,  137770239,  140356424,
-         142639355,  145588557,  149154344,  160361636,  182196342,  200588382,
-         218415341,  220218448,  161428236,  0,          -161428263, -220218448,
-         -218415395, -200588409, -182196329, -160361623, -149154344, -145588542,
-         -142639355, -140356409, -137770238, -136245981, -135367738, -134867355,
-         -134217744},
-        {134217744,  134799630,  135245963,  136025282,  137364449,  139591338,
-         141498666,  143852961,  146442545,  151309130,  165431889,  174391809,
-         177370022,  161281089,  104146144,  0,          -104146171, -161281089,
-         -177370049, -174391796, -165431903, -151309116, -146442531, -143852947,
-         -141498681, -139591338, -137364449, -136025297, -135245963, -134799614,
-         -134217744},
-        {134217744,  134630198,  134942075,  135476620,  136362516,  137726655,
-         138754657,  139760139,  140244217,  138962344,  134419383,  131372064,
-         120561410,  96514144,   55111265,   0,          -55111262,  -96514144,
-         -120561424, -131372064, -134419383, -138962344, -140244217, -139760124,
-         -138754673, -137726655, -136362532, -135476604, -134942075, -134630198,
-         -134217744},
-        {134217728,  134466320,  134648961,  134950176,  135410401,  135985835,
-         136237563,  136102933,  134921759,  131284100,  122416352,  111353663,
-         94151405,   69439052,   37821289,   0,          -37821289,  -69439058,
-         -94151405,  -111353655, -122416359, -131284100, -134921744, -136102933,
-         -136237563, -135985836, -135410401, -134950176, -134648961, -134466304,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133800456,  133466639,  132853833,  131704577,  129480322,
-         127184162,  123637500,  118091100,  109378569,  95840339,   83173415,
-         67033158,   47318062,   24552229,   0,          -24552227,  -47318062,
-         -67033165,  -83173405,  -95840348,  -109378569, -118091100, -123637492,
-         -127184170, -129480322, -131704577, -132853833, -133466647, -133800448,
-         -134217736},
-        {134217728,  133524250,  132980227,  132003691,  130239201,  127017985,
-         123891524,  119342831,  112695071,  102976138,  88899495,   76395462,
-         61022664,   42765392,   22085513,   0,          -22085512,  -42765395,
-         -61022669,  -76395462,  -88899495,  -102976129, -112695062, -119342822,
-         -123891527, -127017985, -130239210, -132003691, -132980227, -133524250,
-         -134217736},
-    },
-    {
-        {134217744,  134746091,  135149853,  135851434,  137045902,  138994799,
-         140615296,  142522879,  144398709,  145263103,  154205570,  158059476,
-         154411303,  133097570,  81316211,   0,          -81316218,  -133097557,
-         -154411316, -158059490, -154205570, -145263103, -144398709, -142522879,
-         -140615296, -138994799, -137045918, -135851434, -135149837, -134746091,
-         -134217744},
-        {134217744,  134712087,  135088825,  135741208,  136844475,  138619336,
-         140061990,  141695888,  143142475,  143327470,  147825383,  149173983,
-         142666250,  119784490,  71366272,   0,          -71366278,  -119784490,
-         -142666277, -149173996, -147825383, -143327466, -143142475, -141695873,
-         -140062006, -138619320, -136844467, -135741224, -135088825, -134712087,
-         -134217744},
-        {134217744,  134660400,  134996180,  135574064,  136539790,  138054064,
-         139232828,  140465192,  141293136,  140526367,  139073637,  137423983,
-         127872810,  103967578,  60168579,   0,          -60168585,  -103967578,
-         -127872810, -137423970, -139073650, -140526353, -141293121, -140465192,
-         -139232843, -138054064, -136539805, -135574064, -134996180, -134660400,
-         -134217744},
-        {134217728,  134531071,  134764682,  135157698,  135784674,  136666568,
-         137216832,  137515087,  136953956,  134166704,  126324470,  115870417,
-         101486344,  78107071,   43180379,   0,          -43180376,  -78107078,
-         -101486351, -115870417, -126324479, -134166695, -136953956, -137515087,
-         -137216847, -136666568, -135784674, -135157698, -134764682, -134531071,
-         -134217728},
-        {134217728,  134405853,  134541061,  134757061,  135063333,  135358653,
-         135340907,  134821548,  133101766,  128751127,  119073224,  107576641,
-         90275401,   66047293,   35143667,   0,          -35143667,  -66047293,
-         -90275401,  -107576641, -119073231, -128751127, -133101751, -134821548,
-         -135340923, -135358653, -135063349, -134757077, -134541061, -134405853,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  133896028,  133635530,  133150648,  132221176,  130362696,
-         128381245,  125228635,  120138520,  111878281,  98637718,   85963798,
-         69556315,   49259814,   25615335,   0,          -25615335,  -49259818,
-         -69556310,  -85963798,  -98637709,  -111878269, -120138520, -125228635,
-         -128381253, -130362689, -132221184, -133150656, -133635522, -133896020,
-         -134217728},
-        {134217728,  133684024,  133261330,  132494150,  131082043,  128427016,
-         125767162,  121774843,  115728035,  106542671,  92727700,   80109047,
-         64295775,   45232366,   23417819,   0,          -23417819,  -45232366,
-         -64295775,  -80109047,  -92727700,  -106542662, -115728027, -121774851,
-         -125767170, -128427016, -131082043, -132494166, -133261346, -133684032,
-         -134217736},
-    },
-    {
-        {134217728,  134498993,  134707335,  135054789,  135598916,  136328115,
-         136729141,  136810142,  135935974,  132715400,  124342636,  113565825,
-         96534671,   73558872,   40348522,   0,          -40348522,  -73558878,
-         -96534671,  -113565825, -124342636, -132715400, -135935959, -136810142,
-         -136729157, -136328114, -135598899, -135054789, -134707335, -134498977,
-         -134217728},
-        {134217728,  134480680,  134674623,  134996162,  135493192,  136136017,
-         136453048,  136412541,  135364880,  131907703,  123252239,  112310291,
-         95147257,   71192238,   38892402,   0,          -38892399,  -71192238,
-         -95147250,  -112310298, -123252239, -131907703, -135364895, -136412525,
-         -136453064, -136136017, -135493192, -134996146, -134674623, -134480664,
-         -134217728},
-        {134217728,  134452852,  134624907,  134907111,  135332868,  135845392,
-         136036318,  135814387,  134509933,  130707049,  121647427,  110478071,
-         93245017,   68600483,   36868716,   0,          -36868712,  -68600489,
-         -93245017,  -110478064, -121647443, -130707034, -134509933, -135814387,
-         -136036318, -135845392, -135332883, -134907111, -134624907, -134452836,
-         -134217728},
-        {134217728,  134383129,  134500499,  134684594,  134933403,  135124815,
-         135007943,  134348507,  132435517,  127834959,  117883933,  106251321,
-         88935672,   64909116,   34475648,   0,          -34475644,  -64909116,
-         -88935679,  -106251321, -117883933, -127834944, -132435517, -134348491,
-         -135007943, -135124799, -134933403, -134684610, -134500515, -134383113,
-         -134217728},
-        {134217728,  134315558,  134380057,  134469604,  134548899,  134436000,
-         134031448,  132969681,  130510521,  125220028,  114545015,  102579384,
-         85276069,   61841172,   32692547,   0,          -32692547,  -61841176,
-         -85276077,  -102579384, -114545015, -125220021, -130510521, -132969665,
-         -134031463, -134436000, -134548899, -134469604, -134380057, -134315558,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134039455,  133889472,  133598612,  133005800,  131717634,
-         130237695,  127729079,  123411911,  115961741,  103323251,  90719885,
-         73928580,   52671496,   27500669,   0,          -27500669,  -52671501,
-         -73928580,  -90719885,  -103323262, -115961741, -123411903, -127729055,
-         -130237711, -131717634, -133005808, -133598612, -133889472, -134039455,
-         -134217728},
-        {134217728,  133924242,  133685411,  133238504,  132374593,  130626201,
-         128740547,  125709420,  120762531,  112648312,  99510021,   86841264,
-         70356022,   49879278,   25955971,   0,          -25955969,  -49879283,
-         -70356027,  -86841273,  -99510021,  -112648303, -120762517, -125709412,
-         -128740555, -130626208, -132374601, -133238504, -133685403, -133924234,
-         -134217728},
-    },
-    {
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-    },
-    {
-        {134217728,  133921369,  133680325,  133229561,  132358967,  130599331,
-         128703866,  125660282,  120698624,  112569265,  99420249,   86750797,
-         70273427,   49815207,   25920708,   0,          -25920706,  -49815216,
-         -70273432,  -86750797,  -99420258,  -112569265, -120698624, -125660282,
-         -128703874, -130599331, -132358983, -133229561, -133680325, -133921361,
-         -134217728},
-        {134217728,  133939441,  133712333,  133285932,  132457505,  130768900,
-         128935465,  125970874,  121102931,  113070012,  99989904,   87325519,
-         70798668,   50223016,   26145306,   0,          -26145303,  -50223020,
-         -70798668,  -87325510,  -99989904,  -113070007, -121102923, -125970860,
-         -128935481, -130768900, -132457513, -133285939, -133712341, -133939433,
-         -134217728},
-        {134217728,  133966965,  133761027,  133371807,  132607806,  131028081,
-         129290132,  126447716,  121725742,  113844587,  100875428,  88221954,
-         71620616,   50862942,   26498391,   0,          -26498387,  -50862942,
-         -71620616,  -88221954,  -100875420, -113844579, -121725728, -126447716,
-         -129290134, -131028089, -132607814, -133371815, -133761036, -133966957,
-         -134217728},
-        {134217728,  134036022,  133883399,  133587872,  132986916,  131684800,
-         130192440,  127667609,  123330612,  115858986,  103203513,  90596996,
-         73814421,   52581631,   27450707,   0,          -27450704,  -52581631,
-         -73814421,  -90596996,  -103203522, -115858986, -123330612, -127667609,
-         -130192441, -131684792, -132986917, -133587864, -133883399, -134036014,
-         -134217728},
-        {134217728,  134103202,  134002513,  133798640,  133358145,  132331971,
-         131086862,  128886498,  124951211,  117920856,  105625489,  93096793,
-         76149699,   54428898,   28481041,   0,          -28481039,  -54428898,
-         -76149699,  -93096785,  -105625498, -117920856, -124951211, -128886489,
-         -131086879, -132331963, -133358153, -133798640, -134002521, -134103194,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134379666,  134494354,  134673574,  134913679,  135089351,
-         134957528,  134277005,  132335084,  127697337,  117706188,  106054041,
-         88737144,   64741149,   34377366,   0,          -34377367,  -64741156,
-         -88737144,  -106054041, -117706196, -127697337, -132335084, -134276990,
-         -134957528, -135089351, -134913695, -134673590, -134494354, -134379666,
-         -134217728},
-        {134217728,  134496089,  134702142,  135045469,  135582090,  136297572,
-         136685224,  136746798,  135844838,  132586207,  124167625,  113363717,
-         96250743,   73172765,   40110159,   0,          -40110156,  -73172772,
-         -96250750,  -113363724, -124167639, -132586207, -135844838, -136746798,
-         -136685224, -136297572, -135582122, -135045469, -134702142, -134496073,
-         -134217728},
-    },
-    {
-        {134217728,  133678764,  133252044,  132477911,  131054012,  128379841,
-         125703998,  121692333,  115624181,  106419205,  92593586,   79977943,
-         64179408,   45144170,   23370016,   0,          -23370016,  -45144171,
-         -64179414,  -79977946,  -92593586,  -106419205, -115624163, -121692333,
-         -125704006, -128379841, -131054020, -132477902, -133252052, -133678756,
-         -134217736},
-        {134217728,  133712005,  133310620,  132580354,  131230923,  128677921,
-         126103542,  122214988,  116283239,  107204353,  93448335,   80814831,
-         64923238,   45708586,   23676173,   0,          -23676171,  -45708591,
-         -64923238,  -80814831,  -93448335,  -107204344, -116283230, -122214988,
-         -126103542, -128677921, -131230923, -132580362, -133310620, -133711997,
-         -134217736},
-        {134217728,  133762594,  133399847,  132736656,  131501355,  129135285,
-         126718565,  123023009,  117307580,  108432557,  94794977,   82139615,
-         66105845,   46609132,   24165789,   0,          -24165786,  -46609132,
-         -66105845,  -82139614,  -94794987,  -108432548, -117307580, -123023009,
-         -126718574, -129135285, -131501371, -132736656, -133399839, -133762594,
-         -134217736},
-        {134217728,  133889704,  133624356,  133130995,  132186884,  130303885,
-         128301191,  125121697,  120000061,  111707953,  98445440,   85770865,
-         69380893,   49124196,   25540859,   0,          -25540856,  -49124196,
-         -69380893,  -85770874,  -98445449,  -111707944, -120000061, -125121697,
-         -128301191, -130303893, -132186900, -133130995, -133624357, -133889712,
-         -134217728},
-        {134217728,  134013488,  133843425,  133517257,  132862879,  131469448,
-         129895964,  127265729,  122800030,  115190043,  102426301,  89801131,
-         73076634,   52001860,   27128796,   0,          -27128794,  -52001864,
-         -73076638,  -89801131,  -102426301, -115190039, -122800030, -127265729,
-         -129895972, -131469447, -132862879, -133517265, -133843441, -134013480,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217728,  134524667,  134753225,  135137152,  135747532,  136598811,
-         137119081,  137373516,  136748951,  133873234,  125921352,  115399246,
-         100457878,  77154925,   42583859,   0,          -42583859,  -77154925,
-         -100457884, -115399246, -125921369, -133873234, -136748936, -137373501,
-         -137119096, -136598811, -135747548, -135137152, -134753241, -134524667,
-         -134217728},
-        {134217744,  134740697,  135140165,  135833916,  137013874,  138934982,
-         140527025,  142390622,  144197099,  144950610,  153156290,  156579036,
-         152419516,  130790170,  79555585,   0,          -79555598,  -130790170,
-         -152419516, -156579036, -153156290, -144950597, -144197099, -142390622,
-         -140527040, -138934982, -137013891, -135833916, -135140150, -134740697,
-         -134217744},
-    },
-    {
-        {134217728,  133517388,  132968168,  131982689,  130203271,  126958371,
-         123812646,  119241372,  112569785,  102830521,  88745154,   76246960,
-         60892748,   42668052,   22033146,   0,          -22033144,  -42668058,
-         -60892753,  -76246960,  -88745154,  -102830531, -112569785, -119241363,
-         -123812646, -126958371, -130203280, -131982697, -132968160, -133517380,
-         -134217736},
-        {134217728,  133560667,  133044207,  132115111,  130430074,  127335394,
-         124312090,  119884885,  113366063,  103758318,  89731133,   77197209,
-         61725371,   43292651,   22369435,   0,          -22369434,  -43292655,
-         -61725371,  -77197209,  -89731143,  -103758309, -113366066, -119884894,
-         -124312098, -127335394, -130430074, -132115119, -133044215, -133560651,
-         -134217736},
-        {134217728,  133626556,  133160120,  132317284,  130777308,  127915335,
-         125083431,  120883935,  114610226,  105218855,  91295851,   78713135,
-         63059915,   44297538,   22911785,   0,          -22911782,  -44297538,
-         -63059910,  -78713135,  -91295851,  -105218855, -114610226, -120883926,
-         -125083440, -127915335, -130777308, -132317293, -133160128, -133626540,
-         -134217736},
-        {134217728,  133792202,  133452102,  132828323,  131660297,  129405046,
-         127082463,  123503081,  117919375,  109170723,  95610055,   82945267,
-         66828178,   47161136,   24466610,   0,          -24466610,  -47161136,
-         -66828178,  -82945267,  -95610064,  -109170725, -117919366, -123503090,
-         -127082486, -129405039, -131660312, -132828331, -133452110, -133792210,
-         -134217736},
-        {134217728,  133953625,  133737455,  133330222,  132534982,  130902453,
-         129118100,  126216242,  121423078,  113467678,  100443871,  87784612,
-         71219202,   50550149,   26325706,   0,          -26325706,  -50550154,
-         -71219202,  -87784603,  -100443871, -113467678, -121423078, -126216226,
-         -129118109, -130902436, -132534997, -133330214, -133737456, -133953625,
-         -134217728},
-        {134217728,  134209240,  134190888,  134132864,  133949552,  133371536,
-         132534624,  130880344,  127640160,  121406192,  109814504,  97493904,
-         80326624,   57781472,   30369936,   0,          -30369936,  -57781472,
-         -80326624,  -97493904,  -109814504, -121406184, -127640152, -130880344,
-         -132534632, -133371536, -133949560, -134132872, -134190888, -134209240,
-         -134217728},
-        {134217744,  134621813,  134927051,  135449572,  136313400,  137636071,
-         138622650,  139566056,  139956832,  138536878,  133180717,  129783677,
-         118675624,  94628818,   53853299,   0,          -53853295,  -94628811,
-         -118675637, -129783677, -133180717, -138536882, -139956832, -139566056,
-         -138622666, -137636071, -136313400, -135449572, -134927051, -134621813,
-         -134217744},
-        {134217744,  134904883,  135435219,  136368502,  137996233,  140785045,
-         143282261,  146575942,  150720567,  165849956,  193015195,  218765208,
-         250475834,  276007487,  232012394,  0,          -232012528, -276007460,
-         -250475861, -218765208, -193015222, -165849956, -150720553, -146575942,
-         -143282275, -140785029, -137996233, -136368502, -135435219, -134904883,
-         -134217744},
-    },
-};
 
-const WORD32 ixheaacd_beta_Q28[16][8][31] = {
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019540936f, 0.0034606718f, 0.0061091632f, 0.0107228868f, 0.0186282881f,
+         0.0257363543f, 0.0352233760f, 0.0475566611f, 0.0629518107f, 0.0809580833f, 0.0936254412f,
+         0.1057573855f, 0.1160409376f, 0.1230182052f, 0.1254990250f, 0.1230182126f, 0.1160409376f,
+         0.1057573855f, 0.0936254412f, 0.0809580907f, 0.0629518107f, 0.0475566611f, 0.0352233723f,
+         0.0257363543f, 0.0186282881f, 0.0107228868f, 0.0061091632f, 0.0034606718f, 0.0019540936f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030265115f, 0.0053620972f, 0.0094724931f, 0.0166464634f, 0.0289774239f,
+         0.0401044935f, 0.0550108925f, 0.0744772330f, 0.0989024863f, 0.1276271343f, 0.1479234397f,
+         0.1674221754f, 0.1839915216f, 0.1952533126f, 0.1992611140f, 0.1952533126f, 0.1839915067f,
+         0.1674221903f, 0.1479234397f, 0.1276271492f, 0.0989024863f, 0.0744772330f, 0.0550108925f,
+         0.0401044972f, 0.0289774239f, 0.0166464634f, 0.0094724931f, 0.0053620972f, 0.0030265115f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044795908f, 0.0079446994f, 0.0140600502f, 0.0247849934f, 0.0433696434f,
+         0.0602979437f, 0.0832019523f, 0.1134835035f, 0.1520351619f, 0.1980977207f, 0.2310739607f,
+         0.2630588710f, 0.2904545665f, 0.3091802299f, 0.3158638775f, 0.3091802299f, 0.2904545665f,
+         0.2630588710f, 0.2310739756f, 0.1980977207f, 0.1520351619f, 0.1134835035f, 0.0832019523f,
+         0.0602979474f, 0.0433696434f, 0.0247849971f, 0.0140600502f, 0.0079446994f, 0.0044795908f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052186511f, 0.0092647560f, 0.0164252073f, 0.0290434174f, 0.0510888547f,
+         0.0713650510f, 0.0990892947f, 0.1362429261f, 0.1843356937f, 0.2429044843f, 0.2855334580f,
+         0.3274079263f, 0.3636668324f, 0.3886501491f, 0.3976052999f, 0.3886501789f, 0.3636668026f,
+         0.3274079263f, 0.2855334580f, 0.2429044992f, 0.1843357086f, 0.1362429261f, 0.0990892947f,
+         0.0713650584f, 0.0510888584f, 0.0290434174f, 0.0164252073f, 0.0092647560f, 0.0052186511f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045594499f, 0.0081285350f, 0.0145191513f, 0.0260186046f, 0.0468755513f,
+         0.0669798329f, 0.0960334241f, 0.1381545961f, 0.1990868747f, 0.2927374542f, 0.3888260126f,
+         0.5107848644f, 0.6488836408f, 0.7694273591f, 0.8192751408f, 0.7694274187f, 0.6488835216f,
+         0.5107849240f, 0.3888260126f, 0.2927374840f, 0.1990868896f, 0.1381545961f, 0.0960334167f,
+         0.0669798404f, 0.0468755476f, 0.0260186046f, 0.0145191513f, 0.0081285350f, 0.0045594499f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007977076f, 0.0014247037f, 0.0025531128f, 0.0046027601f, 0.0083869211f,
+         0.0121226721f, 0.0176920481f, 0.0261930563f, 0.0433672927f, 0.0784488842f, 0.1264052540f,
+         0.2276235074f, 0.4984348118f, 1.6047799587f, 5.8778095245f, 1.6047828197f, 0.4984346628f,
+         0.2276235521f, 0.1264052540f, 0.0784488916f, 0.0433672965f, 0.0261930563f, 0.0176920481f,
+         0.0121226721f, 0.0083869211f, 0.0046027601f, 0.0025531128f, 0.0014247037f, 0.0007977076f,
+         0.0000000037f}},
     {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        524548,   928967,   1639916,  2878403,  5000493,  6908550,
-         9455203,  12765894, 16898498, 21732020, 25132388, 28389032, 31149502,
-         33022448, 33688388, 33022450, 31149502, 28389032, 25132388, 21732022,
-         16898498, 12765894, 9455202,  6908550,  5000493,  2878403,  1639916,
-         928967,   524548,   3},
-        {5,        812423,   1439377,  2542753,  4468501,  7778568,  10765468,
-         14766874, 19992330, 26548934, 34259648, 39707896, 44942048, 49389848,
-         52412912, 53488748, 52412912, 49389844, 44942052, 39707896, 34259652,
-         26548934, 19992330, 14766874, 10765469, 7778568,  4468501,  2542753,
-         1439377,  812423,   5},
-        {7,        1202481,  2132639,  3774216,  6653171,  11641950, 16186106,
-         22334354, 30462996, 40811628, 53176452, 62028444, 70614328, 77968304,
-         82994936, 84789064, 82994936, 77968304, 70614328, 62028448, 53176452,
-         40811628, 30462996, 22334354, 16186107, 11641950, 6653172,  3774216,
-         2132639,  1202481,  7},
-        {8,        1400871,  2486989,   4409108,   7796283,   13714060,
-         19156910, 26599080, 36572432,  49482236,  65204176,  76647304,
-         87887896, 97621072, 104327480, 106731360, 104327488, 97621064,
-         87887896, 76647304, 65204180,  49482240,  36572432,  26599080,
-         19156912, 13714061, 7796283,   4409108,   2486989,   1400871,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1223918,   2181987,   3897455,   6984316,   12583060,
-         17979762,  25778776,  37085592,  53441976,  78581112,  104374688,
-         137112768, 174183376, 206541584, 219922496, 206541600, 174183344,
-         137112784, 104374688, 78581120,  53441980,  37085592,  25778774,
-         17979764,  12583059,  6984316,   3897455,   2181987,   1223918,
-         7},
-        {1,        214133,    382441,    685346,     1235544,   2251347,
-         3254155,  4749173,   7031145,   11641319,   21058462,  33931652,
-         61102220, 133797576, 430779840, 1577812480, 430780608, 133797536,
-         61102232, 33931652,  21058464,  11641320,   7031145,   4749173,
-         3254155,  2251347,   1235544,   685346,     382441,    214133,
-         1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        524756,   929618,   1641931,  2884546,  5018684,  6942684,
-         9517694,  12876462, 17085148, 22027532, 25515680, 28863994, 31707368,
-         33639036, 34326304, 33639036, 31707366, 28863996, 25515680, 22027532,
-         17085148, 12876462, 9517694,  6942685,  5018684,  2884546,  1641932,
-         929618,   524756,   3},
-        {5,        812713,   1440285,  2545568,  4477108,  7804208,  10813826,
-         14855985, 20151268, 26819764, 34692788, 40273396, 45646932, 50221664,
-         53335084, 54443828, 53335084, 50221660, 45646932, 40273396, 34692788,
-         26819762, 20151268, 14855984, 10813826, 7804208,  4477108,  2545568,
-         1440285,  812713,   5},
-        {7,        1202789,  2133603,  3777225,  6662453,  11670018, 16239749,
-         22434930, 30646316, 41132172, 53703904, 62730216, 71504264, 79033256,
-         84186408, 86026976, 84186408, 79033248, 71504272, 62730216, 53703904,
-         41132176, 30646314, 22434930, 16239752, 11670018, 6662454,  3777225,
-         2133603,  1202789,  7},
-        {8,        1401091,  2487681,   4411274,   7803027,   13734770,
-         19197032, 26675680, 36715348,  49739444,  65641580,  77242592,
-         88658976, 98560160, 105390504, 107840400, 105390512, 98560152,
-         88658992, 77242592, 65641576,  49739444,  36715348,  26675674,
-         19197034, 13734770, 7803028,   4411274,   2487680,   1401091,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1223607,   2180998,   3894286,   6974063,   12549334,
-         17910016,  25632730,  36775224,  52772652,  75633064,  99236928,
-         128381344, 160330848, 187347760, 198291376, 187347792, 160330816,
-         128381360, 99236928,  75633072,  52772648,  36775220,  25632728,
-         17910018,  12549334,  6974064,   3894286,   2180998,   1223607,
-         7},
-        {1,        214041,   382148,    684396,    1232418,   2240724,
-         3231452,  4699171,  6913169,   11028142,  19133978,  29199466,
-         47298748, 81631520, 140893408, 184843504, 140893488, 81631504,
-         47298752, 29199468, 19133982,  11028142,  6913169,   4699170,
-         3231452,  2240724,  1232418,   684397,    382148,    214041,
-         1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        525351,   931480,   1647714,  2902257,  5071597,  7042735,
-         9702682,  13207802, 17652582, 22940042, 26711396, 30359376, 33476790,
-         35604100, 36362732, 35604100, 33476786, 30359378, 26711396, 22940042,
-         17652582, 13207802, 9702681,  7042735,  5071597,  2902257,  1647714,
-         931480,   525351,   3},
-        {5,        813540,   1442877,  2553636,  4501896,  7878638,  10955188,
-         15118865, 20625528, 27638916, 36022472, 42026548, 47851776, 52842400,
-         56254208, 57472080, 56254208, 52842396, 47851784, 42026548, 36022476,
-         27638918, 20625528, 15118864, 10955189, 7878638,  4501896,  2553636,
-         1442877,  813540,   5},
-        {7,        1203665,  2136357,  3785832,  6689100,  11751078, 16395488,
-         22728960, 31187070, 42088120, 55296528, 64867172, 74235600, 82322976,
-         87882752, 89873216, 87882752, 82322968, 74235600, 64867176, 55296532,
-         42088120, 31187070, 22728958, 16395489, 11751078, 6689101,  3785832,
-         2136357,  1203665,  7},
-        {8,        1401717,   2489652,   4417463,   7822332,   13794262,
-         19312684, 26897488,  37131704,  50494456,  66937128,  79016952,
-         90971256, 101390632, 108605536, 111198632, 108605544, 101390624,
-         90971264, 79016952,  66937124,  50494456,  37131704,  26897486,
-         19312686, 13794262,  7822333,   4417463,   2489652,   1401717,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1222724,   2178188,   3885304,   6945113,   12454759,
-         17715754,  25230046,  35932316,  50996136,  71510480,  88238104,
-         108673696, 130724624, 148143056, 154903104, 148143056, 130724616,
-         108673712, 88238104,  71510496,  50996136,  35932312,  25230042,
-         17715758,  12454758,  6945114,   3885304,   2178189,   1222724,
-         7},
-        {1,        213781,   381315,   681714,   1223645,  2211279,  3169313,
-         4564991,  6613954,  9638447,  15182689, 20899234, 28782236, 38682308,
-         48311500, 52599960, 48311512, 38682304, 28782238, 20899234, 15182691,
-         9638447,  6613954,  4564991,  3169313,  2211279,  1223645,  681714,
-         381315,   213781,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        526244,   934286,   1656482,  2929383,  5154009,  7200895,
-         10000863, 13755239, 18618438, 24545894, 28863348, 33106848, 36783144,
-         39317176, 40225672, 39317176, 36783140, 33106852, 28863350, 24545894,
-         18618438, 13755239, 10000861, 7200896,  5154009,  2929384,  1656483,
-         934287,   526244,   3},
-        {5,        814783,   1446784,  2565855,  4539774,  7994119,  11177507,
-         15539745, 21402348, 29018418, 38333064, 45138568, 51843732, 57665092,
-         61684144, 63126300, 61684144, 57665092, 51843740, 45138568, 38333064,
-         29018418, 21402346, 15539743, 11177508, 7994120,  4539775,  2565855,
-         1446784,  814783,   5},
-        {7,        1204981,  2140499,  3798824,  6729584,  11875611, 16637170,
-         23191438, 32052658, 43652108, 57969132, 68517104, 78979352, 88117000,
-         94454304, 96733920, 94454304, 88116992, 78979352, 68517104, 57969132,
-         43652104, 32052654, 23191436, 16637170, 11875611, 6729584,  3798824,
-         2140499,  1204981,  7},
-        {8,        1402655,   2492611,   4426772,   7851491,   13884761,
-         19489746, 27240036,  37782176,  51691532,  69027848,  81916832,
-         94796824, 106122752, 114019032, 116867632, 114019032, 106122744,
-         94796832, 81916840,  69027848,  51691532,  37782172,  27240034,
-         19489748, 13884760,  7851492,   4426772,   2492611,   1402655,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1221406,   2174004,   3871976,   6902451,   12317130,
-         17436482, 24661340,  34772520,  48643564,  66845116,  81092456,
-         95994376, 109691784, 119593840, 123240696, 119593848, 109691776,
-         95994392, 81092456,  66845116,  48643564,  34772520,  24661336,
-         17436482, 12317130,  6902452,   3871976,   2174004,   1221406,
-         7},
-        {1,        213393,   380079,   677757,   1210858,  2169302,  3082668,
-         4384052,  6230857,  8816279,  12308982, 15131108, 18175564, 21641460,
-         24357568, 25401718, 24357570, 21641458, 18175566, 15131109, 12308983,
-         8816278,  6230857,  4384051,  3082668,  2169302,  1210858,  677757,
-         380079,   213393,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        527304,   937630,   1667008,  2962381,  5256587,  7401904,
-         10390627, 14497757, 19991098, 26957670, 32224264, 37562304, 42318920,
-         45670152, 46886204, 45670152, 42318924, 37562308, 32224264, 26957670,
-         19991098, 14497757, 10390626, 7401904,  5256587,  2962381,  1667008,
-         937630,   527304,   3},
-        {5,        816257,   1451433,  2580496,  4585709,  8137095,  11458003,
-         16084489, 22442248, 30945832, 41729952, 49882536, 58145720, 65508872,
-         70696504, 72578936, 70696512, 65508868, 58145724, 49882536, 41729952,
-         30945832, 22442248, 16084488, 11458004, 8137095,  4585709,  2580496,
-         1451434,  816257,   5},
-        {7,        1206538,  2145415,   3814322,   6778296,   12027725,
-         16936476, 23775046, 33172672,  45742120,  61682500,  73733120,
-         85947224, 96830952, 104498976, 107281456, 104498984, 96830952,
-         85947232, 73733128, 61682504,  45742116,  33172670,  23775044,
-         16936476, 12027724, 6778297,   3814322,   2145415,   1206538,
-         7},
-        {8,        1403765,   2496115,   4437830,   7886310,   13993836,
-         19704996, 27661434,  38595240,  53219352,  71765424,  85785904,
-         99996584, 112659424, 121580896, 124818216, 121580904, 112659416,
-         99996592, 85785904,  71765432,  53219352,  38595240,  27661430,
-         19704998, 13993836,  7886311,   4437830,   2496115,   1403764,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1219857,  2169099,   3856430,   6853125,   12160503,
-         17123444, 24037508, 33538878,  46247084,  62363436,  74547088,
-         86896032, 97899912, 105652584, 108465784, 105652592, 97899904,
-         86896032, 74547096, 62363440,  46247084,  33538876,  24037506,
-         17123446, 12160503, 6853125,   3856430,   2169099,   1219857,
-         7},
-        {1,        212938,   378637,   673176,   1196278,  2122731,  2989060,
-         4195976,  5854530,  8072868,  10886130, 13012902, 15168527, 17089358,
-         18442662, 18933732, 18442662, 17089358, 15168528, 13012903, 10886130,
-         8072867,  5854530,  4195975,  2989060,  2122731,  1196278,  673176,
-         378637,   212938,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        528371,   941010,   1677737,  2996520,  5365544,  7620743,
-         10829829, 15375154, 21720308, 30256412, 37121464, 44492716, 52140904,
-         58486168, 60914048, 58486172, 52140900, 44492720, 37121464, 30256412,
-         21720308, 15375154, 10829827, 7620744,  5365544,  2996520,  1677737,
-         941010,   528371,   3},
-        {5,        817738,   1456128,  2595392,  4633066,  8288027,  11760734,
-         16690856, 23650124, 33316570, 46226512, 56525852, 67496896, 77774760,
-         85824632, 89194720, 85824640, 77774752, 67496904, 56525856, 46226512,
-         33316570, 23650120, 16690854, 11760735, 8288027,  4633066,  2595392,
-         1456128,  817738,   5},
-        {7,        1208101,   2150365,   3830012,   6828082,   12185838,
-         17252538, 24405052,  34418948,  48164280,  66215072,  80356216,
-         95158664, 108775560, 118626184, 122255560, 118626184, 108775544,
-         95158664, 80356216,  66215080,  48164276,  34418944,  24405050,
-         17252540, 12185838,  6828083,   3830012,   2150365,   1208101,
-         7},
-        {8,         1404877,   2499634,   4448971,   7921597,   14105523,
-         19927540,  28103010,  39463168,  54891176,  74856880,  90260672,
-         106158016, 120574816, 130879072, 134648960, 130879072, 120574816,
-         106158024, 90260672,  74856888,  54891176,  39463164,  28103008,
-         19927542,  14105523,  7921598,   4448971,   2499634,   1404876,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1218314,  2164227,  3841070,  6804841,  12009704, 16826680,
-         23458746, 32427858, 44173136, 58677072, 69367448, 79974728, 89242016,
-         95670824, 97983664, 95670824, 89242016, 79974736, 69367448, 58677072,
-         44173140, 32427856, 23458742, 16826682, 12009704, 6804841,  3841070,
-         2164227,  1218314,  7},
-        {1,        212485,   377211,   668688,   1182212,  2079037,  2903492,
-         4030197,  5539070,  7490515,  9864627,  11591052, 13285722, 14752220,
-         15762207, 16124145, 15762208, 14752220, 13285722, 11591053, 9864628,
-         7490515,  5539070,  4030197,  2903492,  2079037,  1182212,  668688,
-         377210,   212485,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        529280,   943904,    1686997,   3026404,   5463419,
-         7822298,  11249275, 16258557,  23600720,  36288716,  49305868,
-         66713524, 87729680, 107320208, 115788648, 107320216, 87729672,
-         66713540, 49305872, 36288720,  23600720,  16258558,  11249274,
-         7822299,  5463419,  3026404,   1686997,   943904,    529280,
-         3},
-        {5,        819001,    1460144,   2608223,   4674384,   8422779,
-         12037082, 17262416,  24842774,  35819472,  52848540,  70312664,
-         92562776, 117871664, 140063104, 149267152, 140063136, 117871648,
-         92562792, 70312664,  52848544,  35819468,  24842772,  17262414,
-         12037082, 8422779,   4674385,   2608223,   1460144,   819001,
-         5},
-        {7,         1209431,   2154588,   3843465,   6871159,   12324878,
-         17534810,  24980280,  35593252,  50549888,  70956104,  87630984,
-         108587520, 130892864, 148578016, 155457280, 148578016, 130892848,
-         108587528, 87630992,  70956112,  50549884,  35593252,  24980278,
-         17534812,  12324878,  6871160,   3843465,   2154588,   1209431,
-         7},
-        {8,         1405821,   2502628,   4458482,   7951885,   14202332,
-         20122228,  28494402,  40246696,  56439064,  77816136,  94657800,
-         112381552, 128775696, 140691712, 145094384, 140691728, 128775688,
-         112381568, 94657808,  77816144,  56439060,  40246696,  28494400,
-         20122230,  14202331,  7951885,   4458482,   2502629,   1405821,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1217010,  2160122,  3828190,  6764697,  11886164, 16586827,
-         22999516, 31567738, 42617632, 56016164, 65730784, 75244880, 83461560,
-         89112016, 91135304, 89112024, 83461552, 75244888, 65730788, 56016164,
-         42617628, 31567738, 22999514, 16586829, 11886164, 6764698,  3828190,
-         2160122,  1217010,  7},
-        {1,        212104,   376014,   664952,   1170669,  2044035,  2836433,
-         3904056,  5308151,  7084523,  9192281,  10692476, 12141331, 13377854,
-         14220870, 14521357, 14220870, 13377854, 12141331, 10692476, 9192281,
-         7084523,  5308151,  3904056,  2836433,  2044035,  1170669,  664952,
-         376014,   212104,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,         529890,    945853,    1693270,   3046878,   5531883,
-         7966241,   11558316,  16941404,  26405616,  44726228,  66299660,
-         102135296, 161287136, 242754912, 290875520, 242754976, 161287104,
-         102135328, 66299668,  44726228,  26405616,  16941404,  11558314,
-         7966241,   5531883,   3046878,   1693270,   945853,    529890,
-         3},
-        {5,         819848,    1462845,   2616904,   4702616,   8516569,
-         12232970,  17678754,  25748164,  38567944,  62864780,  89227176,
-         128392144, 182850000, 242436080, 271403040, 242436160, 182849968,
-         128392176, 89227168,  62864788,  38567940,  25748164,  17678752,
-         12232972,  8516569,   4702617,   2616904,   1462845,   819848,
-         5},
-        {7,         1210322,   2157425,   3852534,   6900401,   12420479,
-         17731328,  25388104,  36448364,  52356736,  75502992,  99354648,
-         128997304, 161739680, 189630656, 200981856, 189630656, 161739664,
-         128997328, 99354648,  75503000,  52356740,  36448368,  25388100,
-         17731330,  12420478,  6900402,   3852534,   2157425,   1210322,
-         7},
-        {8,         1406453,   2504636,   4464871,   7972318,   14268137,
-         20255542,  28765222,  40797016,  57549412,  80000928,  97981248,
-         117206704, 135388800, 151411120, 157516432, 151411136, 135388784,
-         117206704, 97981248,  80000928,  57549412,  40797012,  28765220,
-         20255542,  14268138,  7972319,   4464871,   2504636,   1406453,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1216142,  2157392,  3819657,  6738267,  11805711, 16432165,
-         22707286, 31029754, 41665420, 54427540, 63597164, 72515376, 80171616,
-         85413624, 87286256, 85413624, 80171608, 72515384, 63597164, 54427544,
-         41665420, 31029756, 22707284, 16432167, 11805712, 6738268,  3819657,
-         2157392,  1216142,  7},
-        {1,        211851,   375221,   662491,   1163142,  2021609,  2794131,
-         3826087,  5169036,  6847367,  8812784,  10196808, 11523252, 12648227,
-         13411804, 13683354, 13411805, 12648226, 11523253, 10196809, 8812784,
-         6847366,  5169036,  3826086,  2794132,  2021609,  1163142,  662491,
-         375221,   211851,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -858993460,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,         530105,    946540,    1695490,   3054166,   5556542,
-         8018704,   11673036,  17202416,  27742908,  48702648,  75428704,
-         125542128, 228590144, 435938784, 620187584, 435939008, 228590112,
-         125542176, 75428712,  48702652,  27742906,  17202416,  11673035,
-         8018704,   5556542,   3054167,   1695490,   946540,    530105,
-         3},
-        {5,         820146,    1463798,   2619972,   4712652,   8550255,
-         12304061,  17832260,  26090394,  40209740,  67346928,  98535008,
-         148589136, 226742368, 326144352, 380823904, 326144512, 226742336,
-         148589184, 98535016,  67346936,  40209736,  26090392,  17832256,
-         12304062,  8550254,   4712652,   2619972,   1463798,   820145,
-         5},
-        {7,         1210636,   2158423,   3855734,   6910758,   12454582,
-         17801918,  25536124,  36763592,  53038744,  78536976,  104675848,
-         138113008, 176331952, 210006528, 224018288, 210006544, 176331920,
-         138113024, 104675856, 78536984,  53038744,  36763592,  25536118,
-         17801920,  12454581,  6910759,   3855734,   2158423,   1210636,
-         7},
-        {8,         1406676,   2505341,   4467122,   7979530,   14291465,
-         20302986,  28862170,  40995684,  57955156,  80812936,  99234096,
-         119054544, 140506896, 157841056, 164487296, 157841072, 140506896,
-         119054552, 99234096,  80812936,  57955148,  40995680,  28862168,
-         20302988,  14291464,  7979531,   4467122,   2505342,   1406676,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1215837,  2156436,  3816673,  6729059,  11777845, 16378872,
-         22607278, 30847268, 41345884, 53900940, 62895796, 71625096, 79105408,
-         84220136, 86046016, 84220136, 79105408, 71625096, 62895796, 53900940,
-         41345884, 30847270, 22607276, 16378873, 11777844, 6729060,  3816673,
-         2156436,  1215837,  7},
-        {1,        211762,   374943,   661633,   1160533,  2013907,  2779720,
-         3799796,  5122719,  6769570,  8690265,  10038436, 11327602, 12418982,
-         13158826, 13421767, 13158826, 12418981, 11327602, 10038436, 8690264,
-         6769570,  5122719,  3799796,  2779720,  2013907,  1160533,  661633,
-         374943,   211762,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,         529890,    945853,    1693270,   3046878,   5531883,
-         7966241,   11558316,  16941404,  26405616,  44726228,  66299660,
-         102135296, 161287136, 242754912, 290875520, 242754976, 161287104,
-         102135328, 66299668,  44726228,  26405616,  16941404,  11558314,
-         7966241,   5531883,   3046878,   1693270,   945853,    529890,
-         3},
-        {5,         819848,    1462845,   2616904,   4702616,   8516569,
-         12232970,  17678754,  25748164,  38567944,  62864780,  89227176,
-         128392144, 182850000, 242436080, 271403040, 242436160, 182849968,
-         128392176, 89227168,  62864788,  38567940,  25748164,  17678752,
-         12232972,  8516569,   4702617,   2616904,   1462845,   819848,
-         5},
-        {7,         1210322,   2157425,   3852534,   6900401,   12420479,
-         17731328,  25388104,  36448364,  52356736,  75502992,  99354648,
-         128997304, 161739680, 189630656, 200981856, 189630656, 161739664,
-         128997328, 99354648,  75503000,  52356740,  36448368,  25388100,
-         17731330,  12420478,  6900402,   3852534,   2157425,   1210322,
-         7},
-        {8,         1406453,   2504636,   4464871,   7972318,   14268137,
-         20255542,  28765222,  40797016,  57549412,  80000928,  97981248,
-         117206704, 135388800, 151411120, 157516432, 151411136, 135388784,
-         117206704, 97981248,  80000928,  57549412,  40797012,  28765220,
-         20255542,  14268138,  7972319,   4464871,   2504636,   1406453,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1216142,  2157392,  3819657,  6738267,  11805711, 16432165,
-         22707286, 31029754, 41665420, 54427540, 63597164, 72515376, 80171616,
-         85413624, 87286256, 85413624, 80171608, 72515384, 63597164, 54427544,
-         41665420, 31029756, 22707284, 16432167, 11805712, 6738268,  3819657,
-         2157392,  1216142,  7},
-        {1,        211851,   375221,   662491,   1163142,  2021609,  2794131,
-         3826087,  5169036,  6847367,  8812784,  10196808, 11523252, 12648227,
-         13411804, 13683354, 13411805, 12648226, 11523253, 10196809, 8812784,
-         6847366,  5169036,  3826086,  2794132,  2021609,  1163142,  662491,
-         375221,   211851,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        529280,   943904,    1686997,   3026404,   5463419,
-         7822298,  11249275, 16258558,  23600720,  36288720,  49305868,
-         66713532, 87729688, 107320216, 115788672, 107320232, 87729680,
-         66713548, 49305876, 36288720,  23600720,  16258558,  11249274,
-         7822299,  5463419,  3026404,   1686997,   943904,    529280,
-         3},
-        {5,        819001,    1460144,   2608223,   4674384,   8422779,
-         12037082, 17262416,  24842774,  35819472,  52848540,  70312672,
-         92562784, 117871672, 140063120, 149267168, 140063152, 117871656,
-         92562800, 70312664,  52848548,  35819468,  24842772,  17262414,
-         12037084, 8422779,   4674385,   2608223,   1460144,   819001,
-         5},
-        {7,         1209431,   2154588,   3843465,   6871159,   12324878,
-         17534810,  24980280,  35593252,  50549888,  70956104,  87630984,
-         108587528, 130892872, 148578032, 155457296, 148578032, 130892856,
-         108587536, 87630992,  70956112,  50549884,  35593252,  24980278,
-         17534812,  12324878,  6871160,   3843465,   2154588,   1209431,
-         7},
-        {8,         1405821,   2502628,   4458482,   7951885,   14202332,
-         20122228,  28494402,  40246696,  56439064,  77816144,  94657800,
-         112381560, 128775712, 140691712, 145094384, 140691728, 128775696,
-         112381568, 94657808,  77816144,  56439064,  40246696,  28494400,
-         20122230,  14202331,  7951885,   4458482,   2502629,   1405821,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1217010,  2160122,  3828190,  6764697,  11886164, 16586827,
-         22999514, 31567738, 42617632, 56016164, 65730788, 75244880, 83461560,
-         89112016, 91135304, 89112024, 83461552, 75244880, 65730788, 56016160,
-         42617628, 31567738, 22999514, 16586829, 11886164, 6764698,  3828190,
-         2160122,  1217010,  7},
-        {1,        212104,   376014,   664952,   1170669,  2044035,  2836433,
-         3904056,  5308151,  7084523,  9192281,  10692476, 12141331, 13377854,
-         14220870, 14521356, 14220870, 13377854, 12141332, 10692476, 9192281,
-         7084522,  5308151,  3904056,  2836433,  2044035,  1170669,  664952,
-         376014,   212104,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        528371,   941010,   1677737,  2996520,  5365544,  7620743,
-         10829829, 15375155, 21720310, 30256414, 37121464, 44492724, 52140916,
-         58486184, 60914064, 58486188, 52140912, 44492720, 37121464, 30256414,
-         21720308, 15375156, 10829827, 7620744,  5365544,  2996520,  1677737,
-         941010,   528371,   3},
-        {5,        817738,   1456128,  2595392,  4633066,  8288027,  11760734,
-         16690856, 23650122, 33316574, 46226512, 56525852, 67496904, 77774760,
-         85824656, 89194744, 85824656, 77774760, 67496904, 56525852, 46226516,
-         33316574, 23650120, 16690854, 11760735, 8288027,  4633067,  2595392,
-         1456128,  817738,   5},
-        {7,        1208101,   2150365,   3830012,   6828082,   12185838,
-         17252538, 24405054,  34418948,  48164280,  66215076,  80356216,
-         95158664, 108775560, 118626192, 122255568, 118626200, 108775552,
-         95158672, 80356216,  66215080,  48164280,  34418948,  24405052,
-         17252540, 12185838,  6828083,   3830012,   2150365,   1208101,
-         7},
-        {8,         1404877,   2499634,   4448971,   7921597,   14105523,
-         19927540,  28103012,  39463168,  54891176,  74856888,  90260672,
-         106158024, 120574824, 130879080, 134648944, 130879088, 120574824,
-         106158032, 90260672,  74856888,  54891176,  39463168,  28103008,
-         19927542,  14105523,  7921598,   4448971,   2499634,   1404876,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1218314,  2164227,  3841070,  6804840,  12009704, 16826680,
-         23458746, 32427858, 44173136, 58677072, 69367448, 79974728, 89242016,
-         95670816, 97983664, 95670824, 89242008, 79974736, 69367448, 58677076,
-         44173140, 32427856, 23458742, 16826682, 12009704, 6804841,  3841070,
-         2164227,  1218314,  7},
-        {1,        212485,   377211,   668688,   1182212,  2079037,  2903492,
-         4030197,  5539070,  7490515,  9864626,  11591052, 13285722, 14752218,
-         15762206, 16124144, 15762206, 14752218, 13285723, 11591053, 9864626,
-         7490515,  5539070,  4030197,  2903492,  2079037,  1182212,  668688,
-         377210,   212485,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        527304,   937630,   1667008,  2962381,  5256587,  7401904,
-         10390627, 14497757, 19991098, 26957670, 32224264, 37562304, 42318920,
-         45670148, 46886200, 45670152, 42318920, 37562308, 32224264, 26957670,
-         19991098, 14497757, 10390626, 7401904,  5256587,  2962381,  1667008,
-         937630,   527304,   3},
-        {5,        816257,   1451433,  2580496,  4585709,  8137095,  11458003,
-         16084489, 22442248, 30945832, 41729952, 49882536, 58145720, 65508872,
-         70696504, 72578928, 70696512, 65508868, 58145724, 49882536, 41729952,
-         30945832, 22442248, 16084488, 11458004, 8137095,  4585709,  2580496,
-         1451434,  816257,   5},
-        {7,        1206538,  2145415,   3814322,   6778296,   12027725,
-         16936476, 23775046, 33172672,  45742120,  61682500,  73733120,
-         85947224, 96830952, 104498976, 107281456, 104498984, 96830952,
-         85947232, 73733128, 61682504,  45742116,  33172670,  23775044,
-         16936476, 12027724, 6778297,   3814322,   2145415,   1206538,
-         7},
-        {8,        1403765,   2496115,   4437830,   7886310,   13993836,
-         19704996, 27661434,  38595240,  53219352,  71765424,  85785904,
-         99996584, 112659424, 121580896, 124818216, 121580904, 112659416,
-         99996592, 85785904,  71765432,  53219352,  38595240,  27661430,
-         19704998, 13993836,  7886311,   4437830,   2496115,   1403764,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1219857,  2169099,   3856430,   6853125,   12160503,
-         17123444, 24037508, 33538878,  46247084,  62363436,  74547088,
-         86896032, 97899912, 105652584, 108465784, 105652592, 97899904,
-         86896032, 74547096, 62363440,  46247084,  33538876,  24037506,
-         17123446, 12160503, 6853125,   3856430,   2169099,   1219857,
-         7},
-        {1,        212938,   378637,   673176,   1196278,  2122731,  2989060,
-         4195976,  5854530,  8072868,  10886130, 13012902, 15168527, 17089358,
-         18442662, 18933732, 18442662, 17089358, 15168528, 13012903, 10886130,
-         8072867,  5854530,  4195975,  2989060,  2122731,  1196278,  673176,
-         378637,   212938,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        526244,   934286,   1656482,  2929383,  5154009,  7200895,
-         10000863, 13755239, 18618438, 24545892, 28863346, 33106846, 36783140,
-         39317168, 40225668, 39317172, 36783136, 33106846, 28863346, 24545892,
-         18618438, 13755238, 10000861, 7200896,  5154009,  2929384,  1656483,
-         934287,   526244,   3},
-        {5,        814783,   1446784,  2565855,  4539774,  7994119,  11177507,
-         15539743, 21402348, 29018418, 38333064, 45138564, 51843736, 57665092,
-         61684144, 63126296, 61684144, 57665088, 51843736, 45138564, 38333064,
-         29018416, 21402346, 15539743, 11177508, 7994120,  4539775,  2565855,
-         1446784,  814783,   5},
-        {7,        1204981,  2140499,  3798824,  6729584,  11875611, 16637170,
-         23191438, 32052656, 43652104, 57969124, 68517096, 78979352, 88116992,
-         94454288, 96733928, 94454296, 88116984, 78979352, 68517096, 57969132,
-         43652104, 32052654, 23191436, 16637170, 11875611, 6729584,  3798824,
-         2140499,  1204981,  7},
-        {8,        1402655,   2492611,   4426772,   7851491,   13884761,
-         19489746, 27240036,  37782168,  51691532,  69027848,  81916832,
-         94796824, 106122744, 114019024, 116867616, 114019032, 106122736,
-         94796832, 81916832,  69027848,  51691532,  37782168,  27240034,
-         19489748, 13884760,  7851492,   4426772,   2492611,   1402655,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,        1221406,   2174004,   3871976,   6902451,   12317130,
-         17436482, 24661340,  34772524,  48643564,  66845112,  81092456,
-         95994392, 109691792, 119593848, 123240712, 119593864, 109691784,
-         95994392, 81092456,  66845116,  48643564,  34772520,  24661336,
-         17436482, 12317130,  6902452,   3871976,   2174004,   1221406,
-         7},
-        {1,        213393,   380079,   677757,   1210858,  2169302,  3082668,
-         4384052,  6230858,  8816279,  12308984, 15131109, 18175568, 21641464,
-         24357576, 25401724, 24357578, 21641462, 18175570, 15131110, 12308985,
-         8816279,  6230857,  4384051,  3082668,  2169302,  1210858,  677757,
-         380079,   213393,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        525351,   931480,   1647714,  2902257,  5071597,  7042735,
-         9702682,  13207803, 17652582, 22940042, 26711398, 30359378, 33476790,
-         35604104, 36362736, 35604104, 33476788, 30359380, 26711396, 22940042,
-         17652582, 13207803, 9702681,  7042735,  5071597,  2902257,  1647714,
-         931480,   525351,   3},
-        {5,        813540,   1442877,  2553636,  4501896,  7878638,  10955188,
-         15118865, 20625528, 27638920, 36022472, 42026544, 47851780, 52842400,
-         56254208, 57472080, 56254208, 52842396, 47851784, 42026548, 36022476,
-         27638918, 20625528, 15118864, 10955189, 7878638,  4501896,  2553636,
-         1442877,  813540,   5},
-        {7,        1203665,  2136357,  3785832,  6689100,  11751078, 16395488,
-         22728960, 31187070, 42088120, 55296528, 64867172, 74235600, 82322976,
-         87882752, 89873216, 87882752, 82322968, 74235600, 64867176, 55296532,
-         42088120, 31187070, 22728958, 16395489, 11751078, 6689101,  3785832,
-         2136357,  1203665,  7},
-        {8,        1401717,   2489652,   4417463,   7822332,   13794261,
-         19312684, 26897488,  37131704,  50494456,  66937128,  79016952,
-         90971256, 101390632, 108605536, 111198640, 108605544, 101390624,
-         90971264, 79016952,  66937132,  50494456,  37131704,  26897486,
-         19312686, 13794262,  7822333,   4417463,   2489652,   1401717,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1222724,   2178188,   3885304,   6945113,   12454759,
-         17715756,  25230046,  35932312,  50996136,  71510480,  88238112,
-         108673688, 130724608, 148143040, 154903072, 148143056, 130724600,
-         108673704, 88238112,  71510496,  50996136,  35932312,  25230042,
-         17715758,  12454758,  6945114,   3885304,   2178189,   1222724,
-         7},
-        {1,        213781,   381315,   681714,   1223645,  2211279,  3169313,
-         4564991,  6613954,  9638446,  15182688, 20899232, 28782230, 38682300,
-         48311484, 52599940, 48311496, 38682296, 28782232, 20899232, 15182688,
-         9638446,  6613954,  4564991,  3169313,  2211279,  1223645,  681714,
-         381315,   213781,   1},
-    },
-    {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {3,        524756,   929618,   1641931,  2884546,  5018684,  6942684,
-         9517694,  12876462, 17085148, 22027530, 25515680, 28863994, 31707368,
-         33639036, 34326304, 33639036, 31707366, 28863994, 25515680, 22027532,
-         17085148, 12876462, 9517694,  6942685,  5018684,  2884546,  1641932,
-         929618,   524756,   3},
-        {5,        812713,   1440285,  2545568,  4477108,  7804208,  10813826,
-         14855985, 20151268, 26819762, 34692788, 40273396, 45646932, 50221664,
-         53335084, 54443824, 53335084, 50221660, 45646932, 40273400, 34692788,
-         26819762, 20151268, 14855983, 10813826, 7804208,  4477108,  2545568,
-         1440285,  812713,   5},
-        {7,        1202789,  2133603,  3777225,  6662453,  11670018, 16239749,
-         22434930, 30646316, 41132172, 53703904, 62730216, 71504264, 79033256,
-         84186408, 86026976, 84186408, 79033248, 71504272, 62730216, 53703904,
-         41132176, 30646314, 22434930, 16239752, 11670018, 6662454,  3777225,
-         2133603,  1202789,  7},
-        {8,        1401091,  2487681,   4411274,   7803027,   13734770,
-         19197032, 26675680, 36715348,  49739444,  65641580,  77242592,
-         88658984, 98560160, 105390504, 107840400, 105390512, 98560152,
-         88658992, 77242584, 65641576,  49739444,  36715348,  26675674,
-         19197034, 13734769, 7803028,   4411274,   2487680,   1401091,
-         8},
-        {8,         1509476,   2684086,   4772024,   8480193,   15047650,
-         21188892,  29744494,  41501680,  57227068,  77169768,  92246064,
-         107526888, 121143312, 130736624, 134217728, 130736624, 121143304,
-         107526896, 92246064,  77169768,  57227064,  41501676,  29744492,
-         21188894,  15047650,  8480194,   4772024,   2684086,   1509476,
-         8},
-        {7,         1223607,   2180998,   3894286,   6974063,   12549334,
-         17910016,  25632730,  36775224,  52772652,  75633064,  99236928,
-         128381352, 160330848, 187347776, 198291392, 187347792, 160330832,
-         128381360, 99236928,  75633072,  52772652,  36775220,  25632728,
-         17910018,  12549334,  6974064,   3894286,   2180998,   1223607,
-         7},
-        {1,        214041,   382148,    684396,    1232418,   2240724,
-         3231452,  4699171,  6913169,   11028142,  19133980,  29199468,
-         47298756, 81631544, 140893488, 184843632, 140893568, 81631528,
-         47298760, 29199470, 19133982,  11028142,  6913169,   4699170,
-         3231452,  2240724,  1232418,   684397,    382148,    214041,
-         1},
-    },
-};
 
-const WORD32 ixheaacd_weight_Q28[16][8][31] = {
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019548684f, 0.0034630969f, 0.0061166696f, 0.0107457712f, 0.0186960548f,
+         0.0258635134f, 0.0354561731f, 0.0479685590f, 0.0636471361f, 0.0820589513f, 0.0950533152f,
+         0.1075267568f, 0.1181191504f, 0.1253151745f, 0.1278754473f, 0.1253151745f, 0.1181191429f,
+         0.1075267643f, 0.0950533152f, 0.0820589513f, 0.0636471361f, 0.0479685590f, 0.0354561731f,
+         0.0258635171f, 0.0186960548f, 0.0107457712f, 0.0061166734f, 0.0034630969f, 0.0019548684f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030275919f, 0.0053654797f, 0.0094829798f, 0.0166785270f, 0.0290729403f,
+         0.0402846411f, 0.0553428568f, 0.0750693232f, 0.0999114066f, 0.1292407066f, 0.1500300914f,
+         0.1700480729f, 0.1870902777f, 0.1986886710f, 0.2028190643f, 0.1986886710f, 0.1870902628f,
+         0.1700480729f, 0.1500300914f, 0.1292407066f, 0.0999113992f, 0.0750693232f, 0.0553428531f,
+         0.0402846411f, 0.0290729403f, 0.0166785270f, 0.0094829798f, 0.0053654797f, 0.0030275919f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044807382f, 0.0079482906f, 0.0140712596f, 0.0248195715f, 0.0434742048f,
+         0.0604977794f, 0.0835766271f, 0.1141664237f, 0.1532292813f, 0.2000626326f, 0.2336882651f,
+         0.2663741410f, 0.2944218218f, 0.3136188090f, 0.3204754591f, 0.3136188090f, 0.2944217920f,
+         0.2663741708f, 0.2336882651f, 0.2000626326f, 0.1532292962f, 0.1141664162f, 0.0835766271f,
+         0.0604977906f, 0.0434742048f, 0.0248195753f, 0.0140712596f, 0.0079482906f, 0.0044807382f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052194707f, 0.0092673339f, 0.0164332762f, 0.0290685408f, 0.0511660054f,
+         0.0715145171f, 0.0993746519f, 0.1367753297f, 0.1852938682f, 0.2445339411f, 0.2877510786f,
+         0.3302804232f, 0.3671652079f, 0.3926102221f, 0.4017367959f, 0.3926102519f, 0.3671651781f,
+         0.3302804828f, 0.2877510786f, 0.2445339262f, 0.1852938682f, 0.1367753297f, 0.0993746296f,
+         0.0715145245f, 0.0511660054f, 0.0290685445f, 0.0164332762f, 0.0092673302f, 0.0052194707f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045582913f, 0.0081248507f, 0.0145073459f, 0.0259804092f, 0.0467499122f,
+         0.0667200089f, 0.0954893604f, 0.1369983852f, 0.1965934485f, 0.2817551196f, 0.3696863651f,
+         0.4782577753f, 0.5972789526f, 0.6979247928f, 0.7386929393f, 0.6979249120f, 0.5972788334f,
+         0.4782578349f, 0.3696863651f, 0.2817551494f, 0.1965934336f, 0.1369983703f, 0.0954893529f,
+         0.0667200163f, 0.0467499122f, 0.0259804130f, 0.0145073459f, 0.0081248507f, 0.0045582913f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007973649f, 0.0014236122f, 0.0025495738f, 0.0045911148f, 0.0083473474f,
+         0.0120380968f, 0.0175057761f, 0.0257535614f, 0.0410830304f, 0.0712796226f, 0.1087764874f,
+         0.1762015671f, 0.3041011095f, 0.5248688459f, 0.6885957122f, 0.5248691440f, 0.3041010499f,
+         0.1762015820f, 0.1087764949f, 0.0712796375f, 0.0410830304f, 0.0257535614f, 0.0175057724f,
+         0.0120380968f, 0.0083473474f, 0.0045911148f, 0.0025495775f, 0.0014236122f, 0.0007973649f,
+         0.0000000037f}},
     {
-        {134217744, 134970352, 135553120, 136582896, 138392880, 141541712,
-         144424112, 148346336, 153572976, 160297488, 168439744, 174342928,
-         180128864, 185132320, 188577760, 189812528, 188577760, 185132320,
-         180128880, 174342928, 168439744, 160297488, 153572976, 148346336,
-         144424112, 141541712, 138392880, 136582896, 135553136, 134970352,
-         134217744},
-        {134217728, 134923056, 135469392, 136435104, 138133568, 141091536,
-         143802496, 147496192, 152426160, 158780944, 166491504, 172091408,
-         177587152, 182344784, 185623536, 186799072, 185623552, 182344800,
-         177587152, 172091392, 166491520, 158780944, 152426160, 147496192,
-         143802480, 141091536, 138133568, 136435104, 135469392, 134923056,
-         134217744},
-        {134217728, 134851104, 135341920, 136210016, 137738240, 140404048,
-         142851840, 146193664, 150665168, 156446176, 163483824, 168609296,
-         173650000, 178021440, 181037920, 182120160, 181037920, 178021424,
-         173650000, 168609296, 163483824, 156446176, 150665168, 146193680,
-         142851840, 140404048, 137738240, 136210000, 135341920, 134851104,
-         134217744},
-        {134217728, 134670496, 135021776, 135643952, 136741952, 138665264,
-         140439920, 142875520, 146156352, 150432704, 155687056, 159544432,
-         163361216, 166688640, 168993616, 169822288, 168993632, 166688656,
-         163361216, 159544432, 155687056, 150432704, 146156352, 142875520,
-         140439920, 138665264, 136741952, 135643952, 135021776, 134670496,
-         134217744},
-        {134217728, 134494912, 134710224, 135092080, 135767616, 136955856,
-         138057744, 139578304, 141641264, 144354416, 147723552, 150220400,
-         152709488, 154893744, 156414336, 156962448, 156414336, 154893744,
-         152709472, 150220400, 147723552, 144354416, 141641264, 139578320,
-         138057728, 136955856, 135767600, 135092080, 134710224, 134494912,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133772440, 133424920, 132804936, 131696632, 129710520,
-         127825384, 125151792, 121381688, 116147984, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 116148000, 121381688, 125151792,
-         127825384, 129710520, 131696632, 132804936, 133424920, 133772456,
-         134217728},
-        {134217728, 133468448, 132882456, 131834416, 129952248, 126550128,
-         123283864, 118583656, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 118583656,
-         123283864, 126550128, 129952248, 131834416, 132882456, 133468448,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019570850f, 0.0034700334f, 0.0061382130f, 0.0108117498f, 0.0188931711f,
+         0.0262362324f, 0.0361453071f, 0.0492028967f, 0.0657609925f, 0.0854583159f, 0.0995077044f,
+         0.1130974889f, 0.1247107610f, 0.1326356083f, 0.1354617327f, 0.1326356083f, 0.1247107461f,
+         0.1130974963f, 0.0995077044f, 0.0854583159f, 0.0657609925f, 0.0492028967f, 0.0361453034f,
+         0.0262362324f, 0.0188931711f, 0.0108117498f, 0.0061382130f, 0.0034700334f, 0.0019570850f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030306727f, 0.0053751357f, 0.0095130354f, 0.0167708695f, 0.0293502137f,
+         0.0408112556f, 0.0563221611f, 0.0768360794f, 0.1029629856f, 0.1341941655f, 0.1565610915f,
+         0.1782617569f, 0.1968532801f, 0.2095632553f, 0.2141001821f, 0.2095632553f, 0.1968532652f,
+         0.1782617867f, 0.1565610915f, 0.1341941804f, 0.1029629931f, 0.0768360794f, 0.0563221574f,
+         0.0408112593f, 0.0293502137f, 0.0167708695f, 0.0095130354f, 0.0053751357f, 0.0030306727f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044840015f, 0.0079585500f, 0.0141033232f, 0.0249188393f, 0.0437761769f,
+         0.0610779524f, 0.0846719742f, 0.1161808893f, 0.1567904651f, 0.2059956193f, 0.2416490465f,
+         0.2765491605f, 0.3066769838f, 0.3273887634f, 0.3348038197f, 0.3273887634f, 0.3066769540f,
+         0.2765491605f, 0.2416490614f, 0.2059956342f, 0.1567904651f, 0.1161808893f, 0.0846719667f,
+         0.0610779561f, 0.0437761769f, 0.0249188431f, 0.0141033232f, 0.0079585500f, 0.0044840015f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052218027f, 0.0092746764f, 0.0164563321f, 0.0291404575f, 0.0513876304f,
+         0.0719453543f, 0.1002009511f, 0.1383263767f, 0.1881065071f, 0.2493602335f, 0.2943610847f,
+         0.3388943374f, 0.3777095377f, 0.4045871496f, 0.4142471850f, 0.4045871794f, 0.3777095079f,
+         0.3388943672f, 0.2943610847f, 0.2493602186f, 0.1881065071f, 0.1383263767f, 0.1002009436f,
+         0.0719453618f, 0.0513876304f, 0.0291404612f, 0.0164563321f, 0.0092746764f, 0.0052218027f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045550019f, 0.0081143826f, 0.0144738853f, 0.0258725621f, 0.0463975929f,
+         0.0659963265f, 0.0939892456f, 0.1338583082f, 0.1899754107f, 0.2663972974f, 0.3287125528f,
+         0.4048410654f, 0.4869871736f, 0.5518758893f, 0.5770590305f, 0.5518758893f, 0.4869871438f,
+         0.4048411250f, 0.3287125528f, 0.2663973570f, 0.1899754107f, 0.1338582933f, 0.0939892307f,
+         0.0659963414f, 0.0463975891f, 0.0258725658f, 0.0144738853f, 0.0081143863f, 0.0045550019f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007963963f, 0.0014205091f, 0.0025395826f, 0.0045584328f, 0.0082376562f,
+         0.0118066110f, 0.0170059167f, 0.0246388987f, 0.0359060131f, 0.0565599240f, 0.0778557137f,
+         0.1072221845f, 0.1441028267f, 0.1799743623f, 0.1959501207f, 0.1799744070f, 0.1441028118f,
+         0.1072221920f, 0.0778557137f, 0.0565599315f, 0.0359060131f, 0.0246388987f, 0.0170059167f,
+         0.0118066110f, 0.0082376562f, 0.0045584328f, 0.0025395826f, 0.0014205091f, 0.0007963963f,
+         0.0000000037f}},
     {
-        {134217728, 134913216, 135451936, 136404304, 138079504, 140997600,
-         143672688, 147318512, 152186224, 158463280, 166082896, 171618768,
-         177053216, 181758880, 185002352, 186165328, 185002352, 181758880,
-         177053216, 171618768, 166082896, 158463296, 152186224, 147318512,
-         143672688, 140997600, 138079504, 136404304, 135451936, 134913216,
-         134217744},
-        {134217728, 134869504, 135374512, 136267584, 137839408, 140580112,
-         143095472, 146527744, 151117280, 157046336, 164257936, 169506256,
-         174664912, 179136560, 182221168, 183327616, 182221168, 179136560,
-         174664912, 169506256, 164257936, 157046336, 151117280, 146527744,
-         143095472, 140580112, 137839408, 136267584, 135374512, 134869504,
-         134217744},
-        {134217728, 134802992, 135256672, 136059376, 137473424, 139942768,
-         142213056, 145316768, 149476832, 154866368, 161442736, 166241760,
-         170968496, 175072880, 177907744, 178925312, 177907744, 175072880,
-         170968496, 166241760, 161442736, 154866368, 149476832, 145316768,
-         142213056, 139942768, 137473424, 136059376, 135256672, 134802992,
-         134217744},
-        {134217728, 134636080, 134960736, 135535920, 136551440, 138331744,
-         139976000, 142235024, 145282080, 149260352, 154157968, 157759584,
-         161328032, 164442560, 166601920, 167378576, 166601920, 164442544,
-         161328032, 157759584, 154157968, 149260368, 145282080, 142235024,
-         139976016, 138331728, 136551456, 135535920, 134960736, 134636096,
-         134217744},
-        {134217728, 134473824, 134672800, 135025728, 135650240, 136749360,
-         137769200, 139177520, 141089920, 143607984, 146739200, 149062688,
-         151381312, 153417872, 154836624, 155348256, 154836640, 153417872,
-         151381328, 149062688, 146739200, 143607984, 141089920, 139177520,
-         137769200, 136749360, 135650256, 135025712, 134672784, 134473824,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133806400, 133485440, 132913000, 131890240, 130059096,
-         128323168, 125864856, 122406120, 117621128, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 117621128, 122406120, 125864856,
-         128323168, 130059096, 131890240, 132913000, 133485440, 133806400,
-         134217728},
-        {134217728, 133525632, 132984568, 132017344, 130281848, 127150040,
-         124150024, 119845456, 113664464, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113664464, 119845456,
-         124150032, 127150040, 130281848, 132017344, 132984568, 133525632,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019604117f, 0.0034804866f, 0.0061708763f, 0.0109128021f, 0.0192001797f,
+         0.0268254243f, 0.0372561179f, 0.0512422584f, 0.0693590865f, 0.0914405808f, 0.1075243503f,
+         0.1233326197f, 0.1370278895f, 0.1464678943f, 0.1498523057f, 0.1464678943f, 0.1370278746f,
+         0.1233326346f, 0.1075243577f, 0.0914405808f, 0.0693590865f, 0.0512422584f, 0.0372561105f,
+         0.0268254280f, 0.0192001797f, 0.0109128058f, 0.0061708800f, 0.0034804903f, 0.0019604117f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030353032f, 0.0053896904f, 0.0095585547f, 0.0169119760f, 0.0297804140f,
+         0.0416394584f, 0.0578900613f, 0.0797299594f, 0.1081020311f, 0.1428017914f, 0.1681542695f,
+         0.1931329519f, 0.2148192078f, 0.2297913432f, 0.2351637930f, 0.2297913432f, 0.2148192078f,
+         0.1931329817f, 0.1681542695f, 0.1428017914f, 0.1081020311f, 0.0797299519f, 0.0578900538f,
+         0.0416394621f, 0.0297804177f, 0.0169119798f, 0.0095585547f, 0.0053896904f, 0.0030353032f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044889040f, 0.0079739802f, 0.0141517222f, 0.0250696540f, 0.0442400984f,
+         0.0619782880f, 0.0863948390f, 0.1194054559f, 0.1626167744f, 0.2159518450f, 0.2552461028f,
+         0.2942210138f, 0.3282614052f, 0.3518697023f, 0.3603619337f, 0.3518697023f, 0.3282613754f,
+         0.2942210138f, 0.2552461028f, 0.2159518450f, 0.1626167595f, 0.1194054410f, 0.0863948315f,
+         0.0619782880f, 0.0442400984f, 0.0250696540f, 0.0141517222f, 0.0079739802f, 0.0044889040f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052252971f, 0.0092856996f, 0.0164910108f, 0.0292490833f, 0.0517247654f,
+         0.0726049617f, 0.1014770418f, 0.1407495737f, 0.1925659627f, 0.2571487725f, 0.3051639795f,
+         0.3531456888f, 0.3953380585f, 0.4247539937f, 0.4353658557f, 0.4247539937f, 0.3953380287f,
+         0.3531457186f, 0.3051640093f, 0.2571487725f, 0.1925659627f, 0.1407495588f, 0.1014770344f,
+         0.0726049691f, 0.0517247617f, 0.0292490870f, 0.0164910108f, 0.0092856996f, 0.0052252971f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045500919f, 0.0080987960f, 0.0144242346f, 0.0257136337f, 0.0458848849f,
+         0.0649559572f, 0.0918706506f, 0.1295377314f, 0.1812113971f, 0.2490174621f, 0.3020929396f,
+         0.3576069176f, 0.4086337388f, 0.4455217719f, 0.4591073692f, 0.4455218017f, 0.4086337090f,
+         0.3576069772f, 0.3020929396f, 0.2490174621f, 0.1812113971f, 0.1295377314f, 0.0918706357f,
+         0.0649559572f, 0.0458848849f, 0.0257136375f, 0.0144242346f, 0.0080987960f, 0.0045500919f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007949509f, 0.0014159046f, 0.0025248416f, 0.0045107976f, 0.0080812797f,
+         0.0114838332f, 0.0163318664f, 0.0232117511f, 0.0328431986f, 0.0458545312f, 0.0563677698f,
+         0.0677092522f, 0.0806207210f, 0.0907390118f, 0.0946287736f, 0.0907390192f, 0.0806207135f,
+         0.0677092597f, 0.0563677736f, 0.0458545350f, 0.0328431949f, 0.0232117511f, 0.0163318627f,
+         0.0114838332f, 0.0080812797f, 0.0045107976f, 0.0025248416f, 0.0014159046f, 0.0007949509f,
+         0.0000000037f}},
     {
-        {134217728, 134750352, 135163360, 135894416, 137183168, 139436416,
-         141510976, 144351440, 148166016, 153119584, 159180064, 163612736,
-         167986224, 171789568, 174419392, 175363920, 174419392, 171789568,
-         167986224, 163612736, 159180064, 153119584, 148166016, 144351440,
-         141510976, 139436432, 137183168, 135894416, 135163360, 134750352,
-         134217744},
-        {134217728, 134716864, 135103984, 135789392, 136998240, 139113424,
-         141062640, 143734096, 147326256, 151998160, 157724080, 161918432,
-         166061616, 169668304, 172163984, 173060688, 172163984, 169668288,
-         166061616, 161918432, 157724080, 151998160, 147326256, 143734096,
-         141062640, 139113424, 136998240, 135789392, 135103984, 134716864,
-         134217744},
-        {134217728, 134665904, 135013632, 135629504, 136716496, 138620704,
-         140377984, 142790048, 146039760, 150276480, 155483472, 159306944,
-         163090832, 166390096, 168675808, 169497600, 168675808, 166390096,
-         163090848, 159306944, 155483488, 150276480, 146039760, 142790048,
-         140377968, 138620720, 136716496, 135629504, 135013616, 134665904,
-         134217744},
-        {134217728, 134538048, 134786784, 135227776, 136007472, 137377520,
-         138646400, 140395008, 142763040, 145870208, 149717968, 152562416,
-         155392320, 157871248, 159594640, 160215424, 159594640, 157871248,
-         155392320, 152562416, 149717968, 145870208, 142763040, 140395008,
-         138646400, 137377520, 136007472, 135227776, 134786784, 134538048,
-         134217728},
-        {134217728, 134413792, 134566144, 134836576, 135315504, 136159584,
-         136944176, 138029792, 139507872, 141460704, 143899120, 145715424,
-         147533584, 149135008, 150253024, 150656672, 150253040, 149135008,
-         147533584, 145715424, 143899120, 141460688, 139507872, 138029792,
-         136944176, 136159584, 135315504, 134836576, 134566160, 134413792,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133903024, 133657608, 133220288, 132440008, 131046696,
-         129730264, 127873712, 125277552, 121718592, 117049664, 113392512,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 113392512, 117049680, 121718592, 125277552, 127873712,
-         129730280, 131046696, 132440024, 133220288, 133657624, 133903024,
-         134217728},
-        {134217728, 133688336, 133274944, 132536912, 131215936, 128843168,
-         126584160, 123368104, 118806640, 112416656, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 112416656, 118806632, 123368104,
-         126584160, 128843168, 131215936, 132536912, 133274944, 133688336,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019643605f, 0.0034929439f, 0.0062100887f, 0.0110357292f, 0.0195823126f,
+         0.0275742412f, 0.0387081020f, 0.0540083535f, 0.0744726434f, 0.1004251465f, 0.1200447381f,
+         0.1399304867f, 0.1576502621f, 0.1701345742f, 0.1746647209f, 0.1701345742f, 0.1576502770f,
+         0.1399305016f, 0.1200447381f, 0.1004251465f, 0.0744726434f, 0.0540083535f, 0.0387080982f,
+         0.0275742412f, 0.0195823126f, 0.0110357292f, 0.0062100887f, 0.0034929439f, 0.0019643605f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030407943f, 0.0054070093f, 0.0096130967f, 0.0170830972f, 0.0303130411f,
+         0.0426843874f, 0.0599193908f, 0.0836038888f, 0.1152822077f, 0.1554561853f, 0.1858269274f,
+         0.2166096866f, 0.2440395653f, 0.2633650005f, 0.2703776062f, 0.2633650303f, 0.2440395504f,
+         0.2166097015f, 0.1858269274f, 0.1554561853f, 0.1152822077f, 0.0836038888f, 0.0599193871f,
+         0.0426843911f, 0.0303130411f, 0.0170830972f, 0.0096130967f, 0.0054070130f, 0.0030407943f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044947043f, 0.0079922937f, 0.0142094567f, 0.0252511203f, 0.0448067673f,
+         0.0630932897f, 0.0885689482f, 0.1235778332f, 0.1704026759f, 0.2297852188f, 0.2746772766f,
+         0.3201783597f, 0.3607234061f, 0.3892890215f, 0.3996545672f, 0.3892890513f, 0.3607234061f,
+         0.3201783895f, 0.2746773064f, 0.2297852337f, 0.1704026610f, 0.1235778257f, 0.0885689408f,
+         0.0630932897f, 0.0448067635f, 0.0252511241f, 0.0142094567f, 0.0079922937f, 0.0044947043f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052294321f, 0.0092987530f, 0.0165322050f, 0.0293787941f, 0.0521311015f,
+         0.0734068304f, 0.1030468717f, 0.1437784731f, 0.1982575357f, 0.2673470378f, 0.3195773959f,
+         0.3725163043f, 0.4196890593f, 0.4529241323f, 0.4649840891f, 0.4529241621f, 0.4196890295f,
+         0.3725163341f, 0.3195773959f, 0.2673470676f, 0.1982575357f, 0.1437784731f, 0.1030468568f,
+         0.0734068379f, 0.0521311015f, 0.0293787979f, 0.0165322050f, 0.0092987530f, 0.0052294284f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045443214f, 0.0080805235f, 0.0143663213f, 0.0255298801f, 0.0453014039f,
+         0.0637897998f, 0.0895466954f, 0.1249420568f, 0.1722838134f, 0.2323219031f, 0.2777095437f,
+         0.3237129450f, 0.3647055924f, 0.3935865462f, 0.4040665329f, 0.3935865760f, 0.3647055626f,
+         0.3237129450f, 0.2777095735f, 0.2323219180f, 0.1722838134f, 0.1249420494f, 0.0895466879f,
+         0.0637898073f, 0.0453014039f, 0.0255298801f, 0.0143663213f, 0.0080805235f, 0.0045443214f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007932559f, 0.0014105327f, 0.0025077760f, 0.0044564828f, 0.0079077892f,
+         0.0111351162f, 0.0156312287f, 0.0218098238f, 0.0300737768f, 0.0405539945f, 0.0484768376f,
+         0.0565071665f, 0.0636628196f, 0.0687042698f, 0.0705336481f, 0.0687042698f, 0.0636628196f,
+         0.0565071702f, 0.0484768413f, 0.0405539945f, 0.0300737731f, 0.0218098238f, 0.0156312250f,
+         0.0111351162f, 0.0079077892f, 0.0044564828f, 0.0025077760f, 0.0014105327f, 0.0007932559f,
+         0.0000000037f}},
     {
-        {134217728, 134506240, 134730320, 135127728, 135830656, 137066736,
-         138212592, 139793296, 141936768, 144754096, 148250000, 150839072,
-         153418688, 155681312, 157255888, 157823344, 157255888, 155681312,
-         153418688, 150839072, 148249984, 144754096, 141936768, 139793296,
-         138212592, 137066736, 135830656, 135127728, 134730320, 134506240,
-         134217728},
-        {134217728, 134488080, 134698096, 135070576, 135729600, 136888992,
-         137964320, 139448608, 141462896, 144113040, 147405392, 149846352,
-         152280496, 154417184, 155904992, 156441360, 155904992, 154417184,
-         152280496, 149846352, 147405392, 144113040, 141462896, 139448592,
-         137964336, 136888992, 135729600, 135070576, 134698096, 134488080,
-         134217728},
-        {134217728, 134460464, 134649040, 134983616, 135575776, 136618224,
-         137585872, 138922720, 140739104, 143132528, 146111440, 148323744,
-         150532864, 152474416, 153827600, 154315696, 153827600, 152474432,
-         150532880, 148323744, 146111440, 143132528, 140739104, 138922720,
-         137585872, 136618224, 135575760, 134983616, 134649040, 134460464,
-         134217728},
-        {134217728, 134391168, 134526000, 134765312, 135189280, 135936912,
-         136632336, 137595280, 138907696, 140643920, 142815424, 144435360,
-         146058944, 147490640, 148491024, 148852368, 148491024, 147490640,
-         146058944, 144435360, 142815424, 140643920, 138907696, 137595280,
-         136632320, 135936912, 135189264, 134765312, 134526000, 134391168,
-         134217728},
-        {134217728, 134323872, 134406416, 134552992, 134812944, 135272112,
-         135700080, 136294032, 137106080, 138184736, 139540672, 140557056,
-         141579776, 142484928, 143119200, 143348672, 143119200, 142484928,
-         141579776, 140557056, 139540672, 138184736, 137106080, 136294032,
-         135700080, 135272112, 134812944, 134552992, 134406416, 134323872,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134047496, 133914896, 133678832, 133258584, 132511008,
-         131808096, 130822576, 129456008, 127605336, 125219016, 123384368,
-         121496560, 119789320, 118571736, 118126816, 118571736, 119789320,
-         121496560, 123384368, 125219016, 127605336, 129456008, 130822576,
-         131808096, 132511008, 133258584, 133678848, 133914896, 134047496,
-         134217728},
-        {134217728, 133931488, 133708328, 133310696, 132601600, 131336352,
-         130142072, 128459768, 126111336, 122900144, 118702864, 115428560,
-         112012208, 111848104, 111848104, 111848104, 111848104, 111848104,
-         112012208, 115428560, 118702864, 122900128, 126111336, 128459768,
-         130142072, 131336352, 132601616, 133310696, 133708328, 133931488,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019683354f, 0.0035055354f, 0.0062500574f, 0.0111629069f, 0.0199882090f,
+         0.0283894800f, 0.0403442569f, 0.0572769120f, 0.0809144527f, 0.1127139181f, 0.1382882297f,
+         0.1657482833f, 0.1942400038f, 0.2178779542f, 0.2269225121f, 0.2178779691f, 0.1942399889f,
+         0.1657482982f, 0.1382882297f, 0.1127139181f, 0.0809144527f, 0.0572769120f, 0.0403442495f,
+         0.0283894837f, 0.0199882090f, 0.0111629069f, 0.0062500574f, 0.0035055354f, 0.0019683354f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030463114f, 0.0054244995f, 0.0096685886f, 0.0172595158f, 0.0308753066f,
+         0.0438121483f, 0.0621782839f, 0.0881035775f, 0.1241138950f, 0.1722071767f, 0.2105752081f,
+         0.2514455318f, 0.2897335589f, 0.3197216690f, 0.3322762251f, 0.3197216988f, 0.2897335291f,
+         0.2514455616f, 0.2105752230f, 0.1722071767f, 0.1241138950f, 0.0881035626f, 0.0621782765f,
+         0.0438121520f, 0.0308753066f, 0.0172595158f, 0.0096685886f, 0.0054244995f, 0.0030463114f,
+         0.0000000186f},
+        {0.0000000261f, 0.0045005269f, 0.0080107339f, 0.0142679065f, 0.0254365876f, 0.0453957841f,
+         0.0642707124f, 0.0909159034f, 0.1282205731f, 0.1794259250f, 0.2466703653f, 0.2993502319f,
+         0.3544936478f, 0.4052205384f, 0.4419169724f, 0.4554374516f, 0.4419169724f, 0.4052204788f,
+         0.3544936478f, 0.2993502319f, 0.2466703951f, 0.1794259101f, 0.1282205582f, 0.0909158960f,
+         0.0642707199f, 0.0453957841f, 0.0254365914f, 0.0142679065f, 0.0080107339f, 0.0045005269f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052335747f, 0.0093118623f, 0.0165737085f, 0.0295102485f, 0.0525471680f,
+         0.0742358714f, 0.1046918705f, 0.1470117569f, 0.2044855654f, 0.2788636088f, 0.3362472057f,
+         0.3954694271f, 0.4491761923f, 0.4875625372f, 0.5016064644f, 0.4875625372f, 0.4491761923f,
+         0.3954694569f, 0.3362472057f, 0.2788636386f, 0.2044855654f, 0.1470117420f, 0.1046918631f,
+         0.0742358789f, 0.0525471680f, 0.0295102522f, 0.0165737085f, 0.0093118623f, 0.0052335709f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045385733f, 0.0080623738f, 0.0143091008f, 0.0253500082f, 0.0447396338f,
+         0.0626842678f, 0.0873906389f, 0.1208031848f, 0.1645577550f, 0.2185891271f, 0.2584138811f,
+         0.2979290783f, 0.3324524164f, 0.3564015925f, 0.3650175929f, 0.3564015925f, 0.3324524164f,
+         0.2979291081f, 0.2584138811f, 0.2185891271f, 0.1645577699f, 0.1208031774f, 0.0873906240f,
+         0.0626842752f, 0.0447396338f, 0.0253500082f, 0.0143091008f, 0.0080623738f, 0.0045385733f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007915683f, 0.0014052205f, 0.0024910569f, 0.0044040829f, 0.0077450164f,
+         0.0108163506f, 0.0150136538f, 0.0206346437f, 0.0279043429f, 0.0367485993f, 0.0431800336f,
+         0.0494931713f, 0.0549563020f, 0.0587187968f, 0.0600671209f, 0.0587188005f, 0.0549563020f,
+         0.0494931713f, 0.0431800373f, 0.0367486030f, 0.0279043429f, 0.0206346437f, 0.0150136538f,
+         0.0108163506f, 0.0077450164f, 0.0044040829f, 0.0024910569f, 0.0014052168f, 0.0007915683f,
+         0.0000000037f}},
     {
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217744, 134217728, 134217728, 134217744,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019717216f, 0.0035163164f, 0.0062845536f, 0.0112742335f, 0.0203528218f,
+         0.0291403309f, 0.0419068150f, 0.0605678447f, 0.0879195333f, 0.1351860017f, 0.1836786717f,
+         0.2485272437f, 0.3268185258f, 0.3997989297f, 0.4313463271f, 0.3997989595f, 0.3268184960f,
+         0.2485273033f, 0.1836786866f, 0.1351860166f, 0.0879195333f, 0.0605678484f, 0.0419068113f,
+         0.0291403346f, 0.0203528218f, 0.0112742335f, 0.0062845536f, 0.0035163164f, 0.0019717216f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030510165f, 0.0054394603f, 0.0097163878f, 0.0174134374f, 0.0313772969f,
+         0.0448416248f, 0.0643075109f, 0.0925465450f, 0.1334379315f, 0.1968761533f, 0.2619350851f,
+         0.3448232114f, 0.4391061664f, 0.5217757225f, 0.5560634732f, 0.5217758417f, 0.4391061068f,
+         0.3448232710f, 0.2619350851f, 0.1968761683f, 0.1334379166f, 0.0925465375f, 0.0643075034f,
+         0.0448416248f, 0.0313772969f, 0.0174134411f, 0.0097163878f, 0.0054394603f, 0.0030510165f,
+         0.0000000186f},
+        {0.0000000261f, 0.0045054816f, 0.0080264658f, 0.0143180229f, 0.0255970620f, 0.0459137484f,
+         0.0653222576f, 0.0930587947f, 0.1325951964f, 0.1883130074f, 0.2643320858f, 0.3264508545f,
+         0.4045200348f, 0.4876139164f, 0.5534962416f, 0.5791234970f, 0.5534962416f, 0.4876138568f,
+         0.4045200646f, 0.3264508843f, 0.2643321157f, 0.1883129925f, 0.1325951964f, 0.0930587873f,
+         0.0653222650f, 0.0459137484f, 0.0255970657f, 0.0143180229f, 0.0080264658f, 0.0045054816f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052370913f, 0.0093230158f, 0.0166091397f, 0.0296230800f, 0.0529078096f,
+         0.0749611408f, 0.1061499193f, 0.1499306262f, 0.2102518976f, 0.2898876965f, 0.3526277840f,
+         0.4186539054f, 0.4797268510f, 0.5241174698f, 0.5405187011f, 0.5241175294f, 0.4797268212f,
+         0.4186539650f, 0.3526278138f, 0.2898877263f, 0.2102518827f, 0.1499306262f, 0.1061499119f,
+         0.0749611482f, 0.0529078059f, 0.0296230800f, 0.0166091397f, 0.0093230195f, 0.0052370913f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045337155f, 0.0080470815f, 0.0142611191f, 0.0252004601f, 0.0442794114f,
+         0.0617907457f, 0.0856798738f, 0.1175989881f, 0.1587630510f, 0.2086764723f, 0.2448662519f,
+         0.2803090215f, 0.3109185398f, 0.3319681287f, 0.3395054638f, 0.3319681585f, 0.3109185100f,
+         0.2803090513f, 0.2448662668f, 0.2086764723f, 0.1587630361f, 0.1175989881f, 0.0856798664f,
+         0.0617907532f, 0.0442794114f, 0.0252004638f, 0.0142611191f, 0.0080470815f, 0.0045337155f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007901490f, 0.0014007613f, 0.0024771392f, 0.0043610819f, 0.0076146238f,
+         0.0105665363f, 0.0145437419f, 0.0197744034f, 0.0263919048f, 0.0342439152f, 0.0398325771f,
+         0.0452299826f, 0.0498363897f, 0.0529768690f, 0.0540962704f, 0.0529768690f, 0.0498363897f,
+         0.0452299826f, 0.0398325771f, 0.0342439152f, 0.0263919048f, 0.0197744034f, 0.0145437419f,
+         0.0105665363f, 0.0076146238f, 0.0043610819f, 0.0024771392f, 0.0014007613f, 0.0007901490f,
+         0.0000000037f}},
     {
-        {134217728, 133928592, 133703168, 133301512, 132585192, 131306928,
-         130100248, 128400288, 126026792, 122780504, 118535808, 115223152,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 115223152, 118535792, 122780504, 126026792, 128400288,
-         130100248, 131306928, 132585192, 133301512, 133703168, 133928592,
-         134217728},
-        {134217728, 133946816, 133735640, 133359432, 132688632, 131492208,
-         130363488, 128774544, 126558464, 123532296, 119584472, 116511248,
-         113311296, 111848104, 111848104, 111848104, 111848104, 111848104,
-         113311288, 116511248, 119584472, 123532296, 126558464, 128774544,
-         130363488, 131492208, 132688632, 133359432, 133735640, 133946816,
-         134217728},
-        {134217728, 133974552, 133785016, 133447456, 132845800, 131773512,
-         130762848, 129341696, 127362872, 124667064, 121162064, 118443520,
-         115622880, 113050208, 111848104, 111848104, 111848104, 113050208,
-         115622880, 118443520, 121162064, 124667064, 127362856, 129341696,
-         130762848, 131773512, 132845800, 133447456, 133785016, 133974552,
-         134217728},
-        {134217728, 134044048, 133908760, 133667912, 133239096, 132476240,
-         131758880, 130752952, 129357832, 127467976, 125030208, 123155288,
-         121225344, 119479336, 118233720, 117778472, 118233720, 119479336,
-         121225328, 123155288, 125030224, 127467976, 129357832, 130752960,
-         131758880, 132476240, 133239096, 133667912, 133908760, 134044048,
-         134217728},
-        {134217728, 134111512, 134028776, 133881624, 133619856, 133154992,
-         132718832, 132108784, 131265840, 130129840, 128674776, 127563760,
-         126427688, 125406704, 124682360, 124418480, 124682360, 125406704,
-         126427688, 127563760, 128674776, 130129840, 131265840, 132108784,
-         132718832, 133154992, 133619856, 133881608, 134028776, 134111512,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134387728, 134519888, 134754464, 135170064, 135903024,
-         136584848, 137529104, 138816208, 140519296, 142649904, 144239712,
-         145833392, 147238976, 148221248, 148576080, 148221248, 147238976,
-         145833392, 144239712, 142649904, 140519312, 138816208, 137529088,
-         136584848, 135903024, 135170064, 134754464, 134519888, 134387728,
-         134217728},
-        {134217728, 134503360, 134725216, 135118656, 135814608, 137038528,
-         138173216, 139738624, 141861648, 144652528, 148116256, 150681920,
-         153238576, 155481344, 157042224, 157604800, 157042224, 155481344,
-         153238576, 150681920, 148116256, 144652528, 141861648, 139738624,
-         138173216, 137038528, 135814608, 135118656, 134725200, 134503360,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019739941f, 0.0035235770f, 0.0063079223f, 0.0113505051f, 0.0206078701f,
+         0.0296765603f, 0.0430580825f, 0.0631116480f, 0.0983685851f, 0.1666181833f, 0.2469854802f,
+         0.3804836273f, 0.6008414030f, 0.9043325186f, 1.0835957527f, 0.9043327570f, 0.6008412838f,
+         0.3804837465f, 0.2469855100f, 0.1666181833f, 0.0983685851f, 0.0631116480f, 0.0430580750f,
+         0.0296765603f, 0.0206078701f, 0.0113505051f, 0.0063079223f, 0.0035235770f, 0.0019739941f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030541718f, 0.0054495223f, 0.0097487271f, 0.0175186098f, 0.0317266919f,
+         0.0455713645f, 0.0658584908f, 0.0959193856f, 0.1436767876f, 0.2341895550f, 0.3323971331f,
+         0.4782980084f, 0.6811693311f, 0.9031447768f, 1.0110551119f, 0.9031450748f, 0.6811692119f,
+         0.4782981277f, 0.3323971033f, 0.2341895849f, 0.1436767727f, 0.0959193856f, 0.0658584833f,
+         0.0455713719f, 0.0317266919f, 0.0175186135f, 0.0097487271f, 0.0054495223f, 0.0030541718f,
+         0.0000000186f},
+        {0.0000000261f, 0.0045088008f, 0.0080370344f, 0.0143518075f, 0.0257059969f, 0.0462698899f,
+         0.0660543442f, 0.0945780575f, 0.1357807368f, 0.1950440407f, 0.2812705636f, 0.3701249063f,
+         0.4805524051f, 0.6025272608f, 0.7064292431f, 0.7487157583f, 0.7064292431f, 0.6025272012f,
+         0.4805524945f, 0.3701249063f, 0.2812705934f, 0.1950440556f, 0.1357807517f, 0.0945780426f,
+         0.0660543516f, 0.0462698862f, 0.0257060006f, 0.0143518075f, 0.0080370344f, 0.0045088008f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052394457f, 0.0093304962f, 0.0166329406f, 0.0296991989f, 0.0531529523f,
+         0.0754577741f, 0.1071588024f, 0.1519807279f, 0.2143882662f, 0.2980266809f, 0.3650085926f,
+         0.4366289973f, 0.5043625832f, 0.5640503764f, 0.5867944360f, 0.5640504360f, 0.5043625236f,
+         0.4366289973f, 0.3650085926f, 0.2980266809f, 0.2143882662f, 0.1519807130f, 0.1071587950f,
+         0.0754577741f, 0.0531529561f, 0.0296992026f, 0.0166329406f, 0.0093304962f, 0.0052394457f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045304820f, 0.0080369115f, 0.0142293312f, 0.0251020007f, 0.0439797007f,
+         0.0612145849f, 0.0845912322f, 0.1155948415f, 0.1552157849f, 0.2027583867f, 0.2369178981f,
+         0.2701408267f, 0.2986625433f, 0.3181905448f, 0.3251666427f, 0.3181905448f, 0.2986625135f,
+         0.2701408565f, 0.2369178981f, 0.2027584016f, 0.1552157849f, 0.1155948490f, 0.0845912248f,
+         0.0612145923f, 0.0439797044f, 0.0251020044f, 0.0142293312f, 0.0080369115f, 0.0045304820f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007892065f, 0.0013978072f, 0.0024679713f, 0.0043330416f, 0.0075310804f,
+         0.0104089491f, 0.0142532848f, 0.0192561597f, 0.0255084299f, 0.0328301787f, 0.0379860699f,
+         0.0429274589f, 0.0471183173f, 0.0499628633f, 0.0509744659f, 0.0499628671f, 0.0471183136f,
+         0.0429274626f, 0.0379860736f, 0.0328301787f, 0.0255084261f, 0.0192561597f, 0.0142532811f,
+         0.0104089528f, 0.0075310804f, 0.0043330416f, 0.0024679713f, 0.0013978072f, 0.0007892065f,
+         0.0000000037f}},
     {
-        {134217728, 133682984, 133265384, 132519816, 131185264, 128787744,
-         126504696, 123253640, 118640752, 112174832, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 112174832, 118640752, 123253640,
-         126504696, 128787744, 131185264, 132519816, 133265384, 133682984,
-         134217728},
-        {134217728, 133716728, 133325584, 132627440, 131378384, 129136568,
-         127004448, 123973008, 119681960, 113689744, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 113689744, 119681960, 123973008,
-         127004448, 129136568, 131378376, 132627440, 133325584, 133716744,
-         134217728},
-        {134217728, 133768056, 133417096, 132790928, 131671560, 129665320,
-         127760792, 125059176, 121248440, 115955928, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 115955928, 121248440, 125059176,
-         127760792, 129665320, 131671560, 132790928, 133417096, 133768056,
-         134217728},
-        {134217728, 133896640, 133646248, 133200016, 132403792, 130981736,
-         129637848, 127742080, 125090024, 121452368, 116676152, 112931424,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 112931424, 116676152, 121452368, 125090024, 127742080,
-         129637848, 130981736, 132403792, 133200016, 133646248, 133896640,
-         134217728},
-        {134217728, 134021376, 133868400, 133596016, 133110896, 132247376,
-         131434736, 130294184, 128710328, 126560936, 123781432, 121638024,
-         119426296, 117420384, 115986304, 115461520, 115986304, 117420384,
-         119426296, 121638024, 123781432, 126560936, 128710328, 130294184,
-         131434736, 132247360, 133110896, 133596016, 133868400, 134021376,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134531696, 134775520, 135207824, 135972192, 137315552,
-         138559920, 140275120, 142598512, 145648128, 149426144, 152220016,
-         155000416, 157436608, 159130592, 159740864, 159130592, 157436608,
-         155000416, 152220016, 149426144, 145648128, 142598512, 140275120,
-         138559920, 137315536, 135972192, 135207824, 134775504, 134531696,
-         134217728},
-        {134217728, 134745024, 135153936, 135877760, 137153824, 139385200,
-         141439904, 144253616, 148033040, 152942128, 158949856, 163344976,
-         167682224, 171454608, 174063344, 175000352, 174063344, 171454608,
-         167682208, 163344976, 158949856, 152942128, 148033040, 144253632,
-         141439904, 139385200, 137153824, 135877760, 135153936, 134745040,
-         134217744},
-    },
+
+        {0.0000000000f,  0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f,  0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f,  0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         -3.2000000477f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f,  0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f,  0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019747950f, 0.0035261363f, 0.0063161924f, 0.0113776550f, 0.0206997320f,
+         0.0298720002f, 0.0434854478f, 0.0640839934f, 0.1033503860f, 0.1814315021f, 0.2809938192f,
+         0.4676808715f, 0.8515646458f, 1.6239985228f, 2.3103787899f, 1.6239993572f, 0.8515645266f,
+         0.4676810503f, 0.2809938490f, 0.1814315170f, 0.1033503786f, 0.0640839934f, 0.0434854440f,
+         0.0298720002f, 0.0206997320f, 0.0113776587f, 0.0063161924f, 0.0035261363f, 0.0019747950f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030552819f, 0.0054530725f, 0.0097601563f, 0.0175559968f, 0.0318521820f,
+         0.0458361991f, 0.0664303452f, 0.0971942917f, 0.1497929543f, 0.2508868575f, 0.3670715094f,
+         0.5535376668f, 0.8446811438f, 1.2149823904f, 1.4186795950f, 1.2149829865f, 0.8446810246f,
+         0.5535378456f, 0.3670715392f, 0.2508868873f, 0.1497929394f, 0.0971942842f, 0.0664303303f,
+         0.0458362028f, 0.0318521783f, 0.0175559968f, 0.0097601563f, 0.0054530725f, 0.0030552782f,
+         0.0000000186f},
+        {0.0000000261f, 0.0045099705f, 0.0080407523f, 0.0143637285f, 0.0257445797f, 0.0463969335f,
+         0.0663173124f, 0.0951294750f, 0.1369550526f, 0.1975847185f, 0.2925730348f, 0.3899479210f,
+         0.5145110488f, 0.6568877101f, 0.7823352814f, 0.8345331550f, 0.7823353410f, 0.6568875909f,
+         0.5145111084f, 0.3899479508f, 0.2925730646f, 0.1975847185f, 0.1369550526f, 0.0951294526f,
+         0.0663173199f, 0.0463969298f, 0.0257445835f, 0.0143637285f, 0.0080407523f, 0.0045099705f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052402765f, 0.0093331225f, 0.0166413262f, 0.0297260657f, 0.0532398559f,
+         0.0756345168f, 0.1075199619f, 0.1527208239f, 0.2158997804f, 0.3010516465f, 0.3696758151f,
+         0.4435127378f, 0.5234289765f, 0.5880037546f, 0.6127629280f, 0.5880038142f, 0.5234289765f,
+         0.4435127676f, 0.3696758151f, 0.3010516465f, 0.2158997506f, 0.1527208090f, 0.1075199544f,
+         0.0756345242f, 0.0532398522f, 0.0297260694f, 0.0166413262f, 0.0093331262f, 0.0052402765f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045293458f, 0.0080333501f, 0.0142182149f, 0.0250676982f, 0.0438758917f,
+         0.0610160530f, 0.0842186734f, 0.1149150282f, 0.1540254205f, 0.2007966489f, 0.2343050987f,
+         0.2668242753f, 0.2946906090f, 0.3137444556f, 0.3205463886f, 0.3137444556f, 0.2946906090f,
+         0.2668242753f, 0.2343050987f, 0.2007966489f, 0.1540254205f, 0.1149150357f, 0.0842186660f,
+         0.0610160567f, 0.0438758880f, 0.0250677019f, 0.0142182149f, 0.0080333501f, 0.0045293458f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007888749f, 0.0013967715f, 0.0024647750f, 0.0043233223f, 0.0075023882f,
+         0.0103552639f, 0.0141553432f, 0.0190836154f, 0.0252186134f, 0.0323737599f, 0.0373960882f,
+         0.0421986058f, 0.0462643132f, 0.0490204468f, 0.0499999784f, 0.0490204468f, 0.0462643094f,
+         0.0421986058f, 0.0373960882f, 0.0323737562f, 0.0252186134f, 0.0190836154f, 0.0141553432f,
+         0.0103552639f, 0.0075023882f, 0.0043233223f, 0.0024647750f, 0.0013967715f, 0.0007888749f,
+         0.0000000037f}},
     {
-        {134217728, 133518624, 132972056, 131994936, 130241488, 127076656,
-         124044168, 119691480, 113437856, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113437856, 119691480,
-         124044168, 127076656, 130241488, 131994936, 132972056, 133518624,
-         134217728},
-        {134217728, 133562760, 133050888, 132136072, 130495576, 127538336,
-         124709592, 120658264, 114858008, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 114858008, 120658264,
-         124709592, 127538336, 130495560, 132136072, 133050888, 133562760,
-         134217728},
-        {134217728, 133629896, 133170680, 132350456, 130881064, 128237360,
-         125714928, 122114032, 116984936, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 116984936, 122114032,
-         125714928, 128237360, 130881064, 132350456, 133170680, 133629896,
-         134217728},
-        {134217728, 133798056, 133470584, 132886472, 131842704, 129973568,
-         128201072, 125690088, 122155288, 117261000, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 117261000, 122155288, 125690088,
-         128201072, 129973568, 131842704, 132886456, 133470584, 133798056,
-         134217728},
-        {134217728, 133961128, 133761128, 133404840, 132769744, 131637408,
-         130569696, 129067480, 126974144, 124119080, 120401016, 117512176,
-         114509792, 111848104, 111848104, 111848104, 111848104, 111848104,
-         114509792, 117512160, 120401008, 124119080, 126974144, 129067480,
-         130569696, 131637424, 132769744, 133404840, 133761128, 133961128,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134627808, 134946048, 135509888, 136505536, 138251328,
-         139864096, 142080384, 145070800, 148976736, 153787568, 157326848,
-         160834672, 163897216, 166020960, 166784896, 166020960, 163897200,
-         160834688, 157326848, 153787568, 148976736, 145070800, 142080384,
-         139864096, 138251328, 136505536, 135509888, 134946048, 134627808,
-         134217744},
-        {134217728, 134906272, 135439648, 136382608, 138041424, 140931408,
-         143581232, 147193280, 152017056, 158239216, 165794560, 171285200,
-         176676288, 181345168, 184563696, 185717792, 184563696, 181345168,
-         176676272, 171285200, 165794560, 158239216, 152017056, 147193280,
-         143581216, 140931408, 138041424, 136382608, 135439648, 134906272,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019739941f, 0.0035235770f, 0.0063079223f, 0.0113505051f, 0.0206078701f,
+         0.0296765603f, 0.0430580825f, 0.0631116480f, 0.0983685851f, 0.1666181833f, 0.2469854802f,
+         0.3804836273f, 0.6008414030f, 0.9043325186f, 1.0835957527f, 0.9043327570f, 0.6008412838f,
+         0.3804837465f, 0.2469855100f, 0.1666181833f, 0.0983685851f, 0.0631116480f, 0.0430580750f,
+         0.0296765603f, 0.0206078701f, 0.0113505051f, 0.0063079223f, 0.0035235770f, 0.0019739941f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030541718f, 0.0054495223f, 0.0097487271f, 0.0175186098f, 0.0317266919f,
+         0.0455713645f, 0.0658584908f, 0.0959193856f, 0.1436767876f, 0.2341895550f, 0.3323971331f,
+         0.4782980084f, 0.6811693311f, 0.9031447768f, 1.0110551119f, 0.9031450748f, 0.6811692119f,
+         0.4782981277f, 0.3323971033f, 0.2341895849f, 0.1436767727f, 0.0959193856f, 0.0658584833f,
+         0.0455713719f, 0.0317266919f, 0.0175186135f, 0.0097487271f, 0.0054495223f, 0.0030541718f,
+         0.0000000186f},
+        {0.0000000261f, 0.0045088008f, 0.0080370344f, 0.0143518075f, 0.0257059969f, 0.0462698899f,
+         0.0660543442f, 0.0945780575f, 0.1357807368f, 0.1950440407f, 0.2812705636f, 0.3701249063f,
+         0.4805524051f, 0.6025272608f, 0.7064292431f, 0.7487157583f, 0.7064292431f, 0.6025272012f,
+         0.4805524945f, 0.3701249063f, 0.2812705934f, 0.1950440556f, 0.1357807517f, 0.0945780426f,
+         0.0660543516f, 0.0462698862f, 0.0257060006f, 0.0143518075f, 0.0080370344f, 0.0045088008f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052394457f, 0.0093304962f, 0.0166329406f, 0.0296991989f, 0.0531529523f,
+         0.0754577741f, 0.1071588024f, 0.1519807279f, 0.2143882662f, 0.2980266809f, 0.3650085926f,
+         0.4366289973f, 0.5043625832f, 0.5640503764f, 0.5867944360f, 0.5640504360f, 0.5043625236f,
+         0.4366289973f, 0.3650085926f, 0.2980266809f, 0.2143882662f, 0.1519807130f, 0.1071587950f,
+         0.0754577741f, 0.0531529561f, 0.0296992026f, 0.0166329406f, 0.0093304962f, 0.0052394457f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045304820f, 0.0080369115f, 0.0142293312f, 0.0251020007f, 0.0439797007f,
+         0.0612145849f, 0.0845912322f, 0.1155948415f, 0.1552157849f, 0.2027583867f, 0.2369178981f,
+         0.2701408267f, 0.2986625433f, 0.3181905448f, 0.3251666427f, 0.3181905448f, 0.2986625135f,
+         0.2701408565f, 0.2369178981f, 0.2027584016f, 0.1552157849f, 0.1155948490f, 0.0845912248f,
+         0.0612145923f, 0.0439797044f, 0.0251020044f, 0.0142293312f, 0.0080369115f, 0.0045304820f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007892065f, 0.0013978072f, 0.0024679713f, 0.0043330416f, 0.0075310804f,
+         0.0104089491f, 0.0142532848f, 0.0192561597f, 0.0255084299f, 0.0328301787f, 0.0379860699f,
+         0.0429274589f, 0.0471183173f, 0.0499628633f, 0.0509744659f, 0.0499628671f, 0.0471183136f,
+         0.0429274626f, 0.0379860736f, 0.0328301787f, 0.0255084261f, 0.0192561597f, 0.0142532811f,
+         0.0104089528f, 0.0075310804f, 0.0043330416f, 0.0024679713f, 0.0013978072f, 0.0007892065f,
+         0.0000000037f}},
     {
-        {134217728, 133460856, 132868912, 131810120, 129908448, 126470312,
-         123168472, 118415200, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 0,         111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 118415200,
-         123168472, 126470312, 129908448, 131810120, 132868912, 133460856,
-         134217728},
-        {134217728, 133508664, 132954296, 131963096, 130184144, 126972336,
-         123893664, 119472480, 113115264, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113115272, 119472480,
-         123893664, 126972336, 130184144, 131963096, 132954280, 133508664,
-         134217728},
-        {134217728, 133581352, 133084040, 132195432, 130602352, 127732136,
-         124988584, 121062824, 115450448, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 115450448, 121062824,
-         124988584, 127732136, 130602352, 132195432, 133084040, 133581352,
-         134217728},
-        {134217728, 133763416, 133408824, 132776176, 131645104, 129617688,
-         127692704, 124961536, 121107872, 115753192, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 115753192, 121107872, 124961520,
-         127692704, 129617688, 131645120, 132776176, 133408840, 133763416,
-         134217728},
-        {134217728, 133939968, 133723424, 133337648, 132649736, 131422568,
-         130264576, 128633952, 126358808, 123250144, 119191232, 116028568,
-         112732488, 111848104, 111848104, 111848104, 111848104, 111848104,
-         112732488, 116028552, 119191232, 123250144, 126358808, 128633952,
-         130264576, 131422568, 132649736, 133337648, 133723424, 133939968,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134661536, 135005888, 135615808, 136692320, 138578416,
-         140319184, 142708880, 145929024, 150128080, 155290032, 159081232,
-         162833824, 166106272, 168373648, 169188880, 168373648, 166106272,
-         162833824, 159081248, 155290032, 150128080, 145929040, 142708880,
-         140319168, 138578416, 136692320, 135615808, 135005872, 134661536,
-         134217744},
-        {134217744, 134962848, 135539840, 136559456, 138351760, 141470368,
-         144325616, 148211728, 153391520, 160057728, 168132016, 173987488,
-         179727840, 184692672, 188111936, 189337408, 188111936, 184692672,
-         179727824, 173987488, 168132016, 160057728, 153391504, 148211728,
-         144325616, 141470352, 138351744, 136559456, 135539840, 134962848,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019717216f, 0.0035163164f, 0.0062845536f, 0.0112742335f, 0.0203528218f,
+         0.0291403309f, 0.0419068150f, 0.0605678484f, 0.0879195333f, 0.1351860166f, 0.1836786717f,
+         0.2485272735f, 0.3268185556f, 0.3997989595f, 0.4313464165f, 0.3997990191f, 0.3268185258f,
+         0.2485273331f, 0.1836787015f, 0.1351860166f, 0.0879195333f, 0.0605678484f, 0.0419068113f,
+         0.0291403346f, 0.0203528218f, 0.0112742335f, 0.0062845536f, 0.0035163164f, 0.0019717216f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030510165f, 0.0054394603f, 0.0097163878f, 0.0174134374f, 0.0313772969f,
+         0.0448416248f, 0.0643075109f, 0.0925465450f, 0.1334379315f, 0.1968761533f, 0.2619351149f,
+         0.3448232412f, 0.4391061962f, 0.5217757821f, 0.5560635328f, 0.5217759013f, 0.4391061366f,
+         0.3448233008f, 0.2619350851f, 0.1968761832f, 0.1334379166f, 0.0925465375f, 0.0643075034f,
+         0.0448416322f, 0.0313772969f, 0.0174134411f, 0.0097163878f, 0.0054394603f, 0.0030510165f,
+         0.0000000186f},
+        {0.0000000261f, 0.0045054816f, 0.0080264658f, 0.0143180229f, 0.0255970620f, 0.0459137484f,
+         0.0653222576f, 0.0930587947f, 0.1325951964f, 0.1883130074f, 0.2643320858f, 0.3264508545f,
+         0.4045200646f, 0.4876139462f, 0.5534963012f, 0.5791235566f, 0.5534963012f, 0.4876138866f,
+         0.4045200944f, 0.3264508843f, 0.2643321157f, 0.1883129925f, 0.1325951964f, 0.0930587873f,
+         0.0653222650f, 0.0459137484f, 0.0255970657f, 0.0143180229f, 0.0080264658f, 0.0045054816f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052370913f, 0.0093230158f, 0.0166091397f, 0.0296230800f, 0.0529078096f,
+         0.0749611408f, 0.1061499193f, 0.1499306262f, 0.2102518976f, 0.2898877263f, 0.3526277840f,
+         0.4186539352f, 0.4797269106f, 0.5241174698f, 0.5405187011f, 0.5241175294f, 0.4797268510f,
+         0.4186539650f, 0.3526278138f, 0.2898877263f, 0.2102518976f, 0.1499306262f, 0.1061499119f,
+         0.0749611482f, 0.0529078059f, 0.0296230800f, 0.0166091397f, 0.0093230195f, 0.0052370913f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045337155f, 0.0080470815f, 0.0142611191f, 0.0252004601f, 0.0442794114f,
+         0.0617907457f, 0.0856798664f, 0.1175989881f, 0.1587630510f, 0.2086764723f, 0.2448662668f,
+         0.2803090215f, 0.3109185398f, 0.3319681287f, 0.3395054638f, 0.3319681585f, 0.3109185100f,
+         0.2803090215f, 0.2448662668f, 0.2086764574f, 0.1587630361f, 0.1175989881f, 0.0856798664f,
+         0.0617907532f, 0.0442794114f, 0.0252004638f, 0.0142611191f, 0.0080470815f, 0.0045337155f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007901490f, 0.0014007613f, 0.0024771392f, 0.0043610819f, 0.0076146238f,
+         0.0105665363f, 0.0145437419f, 0.0197744034f, 0.0263919048f, 0.0342439152f, 0.0398325771f,
+         0.0452299826f, 0.0498363897f, 0.0529768690f, 0.0540962666f, 0.0529768690f, 0.0498363897f,
+         0.0452299863f, 0.0398325771f, 0.0342439152f, 0.0263919011f, 0.0197744034f, 0.0145437419f,
+         0.0105665363f, 0.0076146238f, 0.0043610819f, 0.0024771392f, 0.0014007613f, 0.0007901490f,
+         0.0000000037f}},
     {
-        {134217728, 133518624, 132972056, 131994936, 130241488, 127076656,
-         124044168, 119691480, 113437856, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113437856, 119691480,
-         124044168, 127076656, 130241488, 131994936, 132972056, 133518624,
-         134217728},
-        {134217728, 133562760, 133050888, 132136072, 130495576, 127538336,
-         124709592, 120658264, 114858008, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 114858008, 120658264,
-         124709592, 127538336, 130495560, 132136072, 133050888, 133562760,
-         134217728},
-        {134217728, 133629896, 133170680, 132350456, 130881064, 128237360,
-         125714928, 122114032, 116984936, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 116984936, 122114032,
-         125714928, 128237360, 130881064, 132350456, 133170680, 133629896,
-         134217728},
-        {134217728, 133798056, 133470584, 132886472, 131842704, 129973568,
-         128201072, 125690088, 122155288, 117261000, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 117261000, 122155288, 125690088,
-         128201072, 129973568, 131842704, 132886456, 133470584, 133798056,
-         134217728},
-        {134217728, 133961128, 133761128, 133404840, 132769744, 131637408,
-         130569696, 129067480, 126974144, 124119080, 120401016, 117512176,
-         114509792, 111848104, 111848104, 111848104, 111848104, 111848104,
-         114509792, 117512160, 120401008, 124119080, 126974144, 129067480,
-         130569696, 131637424, 132769744, 133404840, 133761128, 133961128,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134627808, 134946048, 135509888, 136505536, 138251328,
-         139864096, 142080384, 145070800, 148976736, 153787568, 157326848,
-         160834672, 163897216, 166020960, 166784896, 166020960, 163897200,
-         160834688, 157326848, 153787568, 148976736, 145070800, 142080384,
-         139864096, 138251328, 136505536, 135509888, 134946048, 134627808,
-         134217744},
-        {134217728, 134906272, 135439648, 136382608, 138041424, 140931408,
-         143581232, 147193280, 152017056, 158239216, 165794560, 171285200,
-         176676288, 181345168, 184563696, 185717792, 184563696, 181345168,
-         176676272, 171285200, 165794560, 158239216, 152017056, 147193280,
-         143581216, 140931408, 138041424, 136382608, 135439648, 134906272,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019683354f, 0.0035055354f, 0.0062500574f, 0.0111629069f, 0.0199882090f,
+         0.0283894800f, 0.0403442569f, 0.0572769158f, 0.0809144601f, 0.1127139255f, 0.1382882297f,
+         0.1657483131f, 0.1942400485f, 0.2178780138f, 0.2269225717f, 0.2178780288f, 0.1942400336f,
+         0.1657482982f, 0.1382882297f, 0.1127139255f, 0.0809144527f, 0.0572769195f, 0.0403442495f,
+         0.0283894837f, 0.0199882090f, 0.0111629069f, 0.0062500574f, 0.0035055354f, 0.0019683354f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030463114f, 0.0054244995f, 0.0096685886f, 0.0172595158f, 0.0308753066f,
+         0.0438121483f, 0.0621782839f, 0.0881035700f, 0.1241139099f, 0.1722071767f, 0.2105752081f,
+         0.2514455616f, 0.2897335589f, 0.3197217584f, 0.3322763145f, 0.3197217584f, 0.2897335589f,
+         0.2514455616f, 0.2105752081f, 0.1722071916f, 0.1241139099f, 0.0881035626f, 0.0621782765f,
+         0.0438121520f, 0.0308753066f, 0.0172595195f, 0.0096685886f, 0.0054244995f, 0.0030463114f,
+         0.0000000186f},
+        {0.0000000261f, 0.0045005269f, 0.0080107339f, 0.0142679065f, 0.0254365876f, 0.0453957841f,
+         0.0642707124f, 0.0909159109f, 0.1282205731f, 0.1794259250f, 0.2466703802f, 0.2993502319f,
+         0.3544936478f, 0.4052205384f, 0.4419170022f, 0.4554374814f, 0.4419170320f, 0.4052205086f,
+         0.3544936776f, 0.2993502319f, 0.2466703951f, 0.1794259250f, 0.1282205731f, 0.0909159034f,
+         0.0642707199f, 0.0453957841f, 0.0254365914f, 0.0142679065f, 0.0080107339f, 0.0045005269f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052335747f, 0.0093118623f, 0.0165737085f, 0.0295102485f, 0.0525471680f,
+         0.0742358714f, 0.1046918780f, 0.1470117569f, 0.2044855654f, 0.2788636386f, 0.3362472057f,
+         0.3954694569f, 0.4491762221f, 0.4875625670f, 0.5016064048f, 0.4875625968f, 0.4491762221f,
+         0.3954694867f, 0.3362472057f, 0.2788636386f, 0.2044855654f, 0.1470117569f, 0.1046918631f,
+         0.0742358789f, 0.0525471680f, 0.0295102522f, 0.0165737085f, 0.0093118623f, 0.0052335709f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045385733f, 0.0080623738f, 0.0143091008f, 0.0253500044f, 0.0447396338f,
+         0.0626842678f, 0.0873906389f, 0.1208031848f, 0.1645577550f, 0.2185891271f, 0.2584138811f,
+         0.2979290783f, 0.3324524164f, 0.3564015627f, 0.3650175929f, 0.3564015925f, 0.3324523866f,
+         0.2979291081f, 0.2584138811f, 0.2185891420f, 0.1645577699f, 0.1208031774f, 0.0873906240f,
+         0.0626842752f, 0.0447396338f, 0.0253500082f, 0.0143091008f, 0.0080623738f, 0.0045385733f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007915683f, 0.0014052205f, 0.0024910569f, 0.0044040829f, 0.0077450164f,
+         0.0108163506f, 0.0150136538f, 0.0206346437f, 0.0279043429f, 0.0367485955f, 0.0431800336f,
+         0.0494931713f, 0.0549562946f, 0.0587187931f, 0.0600671172f, 0.0587187931f, 0.0549562946f,
+         0.0494931750f, 0.0431800373f, 0.0367485955f, 0.0279043429f, 0.0206346437f, 0.0150136538f,
+         0.0108163506f, 0.0077450164f, 0.0044040829f, 0.0024910569f, 0.0014052168f, 0.0007915683f,
+         0.0000000037f}},
     {
-        {134217728, 133682984, 133265384, 132519816, 131185264, 128787744,
-         126504696, 123253640, 118640752, 112174824, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 112174824, 118640752, 123253640,
-         126504696, 128787744, 131185264, 132519816, 133265384, 133682984,
-         134217728},
-        {134217728, 133716728, 133325584, 132627440, 131378384, 129136568,
-         127004448, 123973008, 119681960, 113689736, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 113689744, 119681960, 123973008,
-         127004448, 129136568, 131378376, 132627440, 133325584, 133716744,
-         134217728},
-        {134217728, 133768056, 133417096, 132790928, 131671560, 129665320,
-         127760792, 125059176, 121248440, 115955928, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 115955928, 121248440, 125059176,
-         127760792, 129665320, 131671560, 132790928, 133417096, 133768056,
-         134217728},
-        {134217728, 133896640, 133646248, 133200016, 132403792, 130981736,
-         129637848, 127742080, 125090024, 121452368, 116676144, 112931424,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 112931424, 116676152, 121452360, 125090024, 127742080,
-         129637848, 130981736, 132403792, 133200016, 133646248, 133896640,
-         134217728},
-        {134217728, 134021376, 133868400, 133596016, 133110896, 132247376,
-         131434736, 130294184, 128710328, 126560928, 123781432, 121638024,
-         119426296, 117420384, 115986304, 115461520, 115986304, 117420384,
-         119426296, 121638024, 123781432, 126560928, 128710328, 130294184,
-         131434736, 132247360, 133110896, 133596016, 133868400, 134021376,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134531696, 134775520, 135207824, 135972192, 137315552,
-         138559920, 140275120, 142598512, 145648144, 149426144, 152220032,
-         155000416, 157436608, 159130592, 159740864, 159130592, 157436608,
-         155000416, 152220032, 149426144, 145648128, 142598512, 140275120,
-         138559920, 137315536, 135972192, 135207824, 134775504, 134531696,
-         134217728},
-        {134217728, 134745024, 135153936, 135877760, 137153824, 139385200,
-         141439904, 144253632, 148033040, 152942128, 158949856, 163344976,
-         167682224, 171454624, 174063344, 175000352, 174063344, 171454624,
-         167682224, 163344976, 158949856, 152942128, 148033040, 144253632,
-         141439904, 139385200, 137153824, 135877760, 135153936, 134745040,
-         134217744},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019643605f, 0.0034929439f, 0.0062100887f, 0.0110357292f, 0.0195823126f,
+         0.0275742412f, 0.0387081020f, 0.0540083535f, 0.0744726434f, 0.1004251465f, 0.1200447381f,
+         0.1399304867f, 0.1576502621f, 0.1701345593f, 0.1746647060f, 0.1701345742f, 0.1576502621f,
+         0.1399305016f, 0.1200447381f, 0.1004251465f, 0.0744726434f, 0.0540083535f, 0.0387080982f,
+         0.0275742412f, 0.0195823126f, 0.0110357292f, 0.0062100887f, 0.0034929439f, 0.0019643605f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030407943f, 0.0054070093f, 0.0096130967f, 0.0170830972f, 0.0303130411f,
+         0.0426843874f, 0.0599193908f, 0.0836038888f, 0.1152822077f, 0.1554561853f, 0.1858269274f,
+         0.2166096866f, 0.2440395653f, 0.2633650005f, 0.2703775764f, 0.2633650303f, 0.2440395504f,
+         0.2166097015f, 0.1858269274f, 0.1554561853f, 0.1152822077f, 0.0836038888f, 0.0599193871f,
+         0.0426843911f, 0.0303130411f, 0.0170830972f, 0.0096130967f, 0.0054070130f, 0.0030407943f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044947043f, 0.0079922937f, 0.0142094567f, 0.0252511203f, 0.0448067673f,
+         0.0630932897f, 0.0885689482f, 0.1235778332f, 0.1704026759f, 0.2297852188f, 0.2746772766f,
+         0.3201783597f, 0.3607234061f, 0.3892890215f, 0.3996545672f, 0.3892890513f, 0.3607234061f,
+         0.3201783895f, 0.2746773064f, 0.2297852337f, 0.1704026610f, 0.1235778257f, 0.0885689408f,
+         0.0630932897f, 0.0448067635f, 0.0252511241f, 0.0142094567f, 0.0079922937f, 0.0044947043f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052294321f, 0.0092987530f, 0.0165322050f, 0.0293787941f, 0.0521311015f,
+         0.0734068304f, 0.1030468717f, 0.1437784731f, 0.1982575357f, 0.2673470378f, 0.3195773959f,
+         0.3725163043f, 0.4196890593f, 0.4529241323f, 0.4649840891f, 0.4529241621f, 0.4196890295f,
+         0.3725163341f, 0.3195773959f, 0.2673470676f, 0.1982575357f, 0.1437784731f, 0.1030468568f,
+         0.0734068379f, 0.0521311015f, 0.0293787979f, 0.0165322050f, 0.0092987530f, 0.0052294284f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045443214f, 0.0080805235f, 0.0143663213f, 0.0255298801f, 0.0453014039f,
+         0.0637897998f, 0.0895466954f, 0.1249420568f, 0.1722838134f, 0.2323219031f, 0.2777095437f,
+         0.3237129450f, 0.3647055924f, 0.3935865462f, 0.4040665329f, 0.3935865760f, 0.3647055626f,
+         0.3237129450f, 0.2777095735f, 0.2323219180f, 0.1722838134f, 0.1249420494f, 0.0895466879f,
+         0.0637898073f, 0.0453014039f, 0.0255298801f, 0.0143663213f, 0.0080805235f, 0.0045443214f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007932559f, 0.0014105327f, 0.0025077760f, 0.0044564828f, 0.0079077892f,
+         0.0111351162f, 0.0156312287f, 0.0218098238f, 0.0300737768f, 0.0405539945f, 0.0484768376f,
+         0.0565071665f, 0.0636628196f, 0.0687042698f, 0.0705336481f, 0.0687042698f, 0.0636628196f,
+         0.0565071702f, 0.0484768413f, 0.0405539945f, 0.0300737731f, 0.0218098238f, 0.0156312250f,
+         0.0111351162f, 0.0079077892f, 0.0044564828f, 0.0025077760f, 0.0014105327f, 0.0007932559f,
+         0.0000000037f}},
     {
-        {134217728, 133928592, 133703168, 133301512, 132585192, 131306928,
-         130100248, 128400288, 126026792, 122780488, 118535792, 115223136,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 115223136, 118535792, 122780488, 126026792, 128400288,
-         130100248, 131306912, 132585176, 133301512, 133703168, 133928592,
-         134217728},
-        {134217728, 133946816, 133735640, 133359432, 132688632, 131492208,
-         130363488, 128774544, 126558464, 123532296, 119584464, 116511232,
-         113311288, 111848104, 111848104, 111848104, 111848104, 111848104,
-         113311272, 116511232, 119584464, 123532296, 126558464, 128774544,
-         130363488, 131492208, 132688632, 133359416, 133735640, 133946816,
-         134217728},
-        {134217728, 133974552, 133785016, 133447456, 132845800, 131773512,
-         130762848, 129341696, 127362856, 124667064, 121162048, 118443504,
-         115622880, 113050192, 111848104, 111848104, 111848104, 113050192,
-         115622872, 118443504, 121162064, 124667064, 127362856, 129341696,
-         130762848, 131773512, 132845800, 133447456, 133785016, 133974552,
-         134217728},
-        {134217728, 134044048, 133908744, 133667912, 133239096, 132476240,
-         131758880, 130752952, 129357832, 127467976, 125030208, 123155288,
-         121225328, 119479320, 118233720, 117778464, 118233720, 119479320,
-         121225328, 123155288, 125030208, 127467976, 129357832, 130752952,
-         131758880, 132476240, 133239096, 133667912, 133908760, 134044048,
-         134217728},
-        {134217728, 134111512, 134028776, 133881624, 133619856, 133154992,
-         132718832, 132108784, 131265840, 130129840, 128674776, 127563760,
-         126427688, 125406704, 124682360, 124418464, 124682360, 125406704,
-         126427688, 127563760, 128674776, 130129840, 131265840, 132108784,
-         132718832, 133154992, 133619856, 133881608, 134028776, 134111512,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134387728, 134519888, 134754464, 135170064, 135903024,
-         136584848, 137529104, 138816208, 140519312, 142649904, 144239712,
-         145833408, 147238976, 148221248, 148576080, 148221264, 147238976,
-         145833408, 144239712, 142649920, 140519312, 138816208, 137529088,
-         136584848, 135903024, 135170064, 134754464, 134519888, 134387744,
-         134217728},
-        {134217728, 134503360, 134725216, 135118656, 135814608, 137038528,
-         138173216, 139738624, 141861664, 144652528, 148116256, 150681936,
-         153238592, 155481344, 157042224, 157604816, 157042224, 155481344,
-         153238592, 150681936, 148116256, 144652528, 141861648, 139738624,
-         138173216, 137038544, 135814624, 135118656, 134725200, 134503360,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019604117f, 0.0034804866f, 0.0061708763f, 0.0109128021f, 0.0192001797f,
+         0.0268254243f, 0.0372561179f, 0.0512422584f, 0.0693590865f, 0.0914405733f, 0.1075243428f,
+         0.1233326122f, 0.1370278746f, 0.1464678645f, 0.1498522907f, 0.1464678794f, 0.1370278597f,
+         0.1233326122f, 0.1075243428f, 0.0914405733f, 0.0693590865f, 0.0512422547f, 0.0372561105f,
+         0.0268254280f, 0.0192001797f, 0.0109128058f, 0.0061708800f, 0.0034804903f, 0.0019604117f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030353032f, 0.0053896904f, 0.0095585547f, 0.0169119760f, 0.0297804140f,
+         0.0416394584f, 0.0578900538f, 0.0797299594f, 0.1081020311f, 0.1428017914f, 0.1681542546f,
+         0.1931329668f, 0.2148192078f, 0.2297913432f, 0.2351637781f, 0.2297913432f, 0.2148191929f,
+         0.1931329668f, 0.1681542546f, 0.1428017914f, 0.1081020236f, 0.0797299519f, 0.0578900538f,
+         0.0416394621f, 0.0297804177f, 0.0169119798f, 0.0095585547f, 0.0053896904f, 0.0030353032f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044889040f, 0.0079739802f, 0.0141517222f, 0.0250696540f, 0.0442400984f,
+         0.0619782880f, 0.0863948390f, 0.1194054484f, 0.1626167595f, 0.2159518152f, 0.2552460730f,
+         0.2942210138f, 0.3282613754f, 0.3518696427f, 0.3603619635f, 0.3518696725f, 0.3282613456f,
+         0.2942210138f, 0.2552460730f, 0.2159518450f, 0.1626167595f, 0.1194054410f, 0.0863948315f,
+         0.0619782880f, 0.0442400984f, 0.0250696540f, 0.0141517222f, 0.0079739802f, 0.0044889040f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052252971f, 0.0092856996f, 0.0164910108f, 0.0292490833f, 0.0517247654f,
+         0.0726049617f, 0.1014770418f, 0.1407495439f, 0.1925659627f, 0.2571487725f, 0.3051639795f,
+         0.3531456888f, 0.3953380287f, 0.4247539639f, 0.4353657961f, 0.4247539937f, 0.3953379989f,
+         0.3531457186f, 0.3051639795f, 0.2571487725f, 0.1925659627f, 0.1407495439f, 0.1014770344f,
+         0.0726049691f, 0.0517247617f, 0.0292490870f, 0.0164910108f, 0.0092856996f, 0.0052252971f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045500919f, 0.0080987960f, 0.0144242346f, 0.0257136337f, 0.0458848849f,
+         0.0649559572f, 0.0918706506f, 0.1295377463f, 0.1812113971f, 0.2490174472f, 0.3020929396f,
+         0.3576069772f, 0.4086337686f, 0.4455218017f, 0.4591074288f, 0.4455218613f, 0.4086337388f,
+         0.3576069772f, 0.3020929396f, 0.2490174621f, 0.1812113971f, 0.1295377314f, 0.0918706357f,
+         0.0649559572f, 0.0458848849f, 0.0257136375f, 0.0144242346f, 0.0080987960f, 0.0045500919f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007949509f, 0.0014159046f, 0.0025248416f, 0.0045107976f, 0.0080812797f,
+         0.0114838332f, 0.0163318664f, 0.0232117549f, 0.0328431986f, 0.0458545387f, 0.0563677736f,
+         0.0677092671f, 0.0806207359f, 0.0907390416f, 0.0946287960f, 0.0907390490f, 0.0806207284f,
+         0.0677092746f, 0.0563677773f, 0.0458545424f, 0.0328431986f, 0.0232117511f, 0.0163318627f,
+         0.0114838332f, 0.0080812797f, 0.0045107976f, 0.0025248416f, 0.0014159046f, 0.0007949509f,
+         0.0000000037f}},
     {
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019570850f, 0.0034700334f, 0.0061382130f, 0.0108117498f, 0.0188931711f,
+         0.0262362324f, 0.0361453071f, 0.0492029004f, 0.0657609925f, 0.0854583159f, 0.0995077118f,
+         0.1130974963f, 0.1247107610f, 0.1326356232f, 0.1354617476f, 0.1326356232f, 0.1247107536f,
+         0.1130975038f, 0.0995077044f, 0.0854583159f, 0.0657609925f, 0.0492029004f, 0.0361453034f,
+         0.0262362324f, 0.0188931711f, 0.0108117498f, 0.0061382130f, 0.0034700334f, 0.0019570850f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030306727f, 0.0053751357f, 0.0095130354f, 0.0167708695f, 0.0293502137f,
+         0.0408112556f, 0.0563221611f, 0.0768360794f, 0.1029630005f, 0.1341941655f, 0.1565610766f,
+         0.1782617718f, 0.1968532801f, 0.2095632553f, 0.2141001821f, 0.2095632553f, 0.1968532652f,
+         0.1782617867f, 0.1565610915f, 0.1341941804f, 0.1029629931f, 0.0768360794f, 0.0563221574f,
+         0.0408112593f, 0.0293502137f, 0.0167708695f, 0.0095130354f, 0.0053751357f, 0.0030306727f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044840015f, 0.0079585500f, 0.0141033232f, 0.0249188393f, 0.0437761769f,
+         0.0610779524f, 0.0846719742f, 0.1161808893f, 0.1567904651f, 0.2059956193f, 0.2416490465f,
+         0.2765491605f, 0.3066769838f, 0.3273887634f, 0.3348038197f, 0.3273887634f, 0.3066769540f,
+         0.2765491605f, 0.2416490614f, 0.2059956342f, 0.1567904651f, 0.1161808893f, 0.0846719667f,
+         0.0610779561f, 0.0437761769f, 0.0249188431f, 0.0141033232f, 0.0079585500f, 0.0044840015f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052218027f, 0.0092746764f, 0.0164563321f, 0.0291404575f, 0.0513876267f,
+         0.0719453543f, 0.1002009511f, 0.1383263767f, 0.1881065071f, 0.2493602335f, 0.2943610847f,
+         0.3388943374f, 0.3777095377f, 0.4045871496f, 0.4142472148f, 0.4045871794f, 0.3777095079f,
+         0.3388943672f, 0.2943610847f, 0.2493602484f, 0.1881065071f, 0.1383263767f, 0.1002009436f,
+         0.0719453618f, 0.0513876304f, 0.0291404612f, 0.0164563321f, 0.0092746764f, 0.0052218027f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045550019f, 0.0081143826f, 0.0144738853f, 0.0258725621f, 0.0463975929f,
+         0.0659963340f, 0.0939892456f, 0.1338582933f, 0.1899754107f, 0.2663972974f, 0.3287125826f,
+         0.4048410356f, 0.4869871140f, 0.5518758297f, 0.5770589113f, 0.5518758893f, 0.4869870842f,
+         0.4048410952f, 0.3287125826f, 0.2663973570f, 0.1899754107f, 0.1338582933f, 0.0939892307f,
+         0.0659963414f, 0.0463975891f, 0.0258725658f, 0.0144738853f, 0.0081143863f, 0.0045550019f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007963963f, 0.0014205091f, 0.0025395826f, 0.0045584328f, 0.0082376562f,
+         0.0118066110f, 0.0170059167f, 0.0246388987f, 0.0359060094f, 0.0565599203f, 0.0778557062f,
+         0.1072221622f, 0.1441027969f, 0.1799743026f, 0.1959500462f, 0.1799743474f, 0.1441027820f,
+         0.1072221696f, 0.0778557062f, 0.0565599203f, 0.0359060094f, 0.0246388987f, 0.0170059167f,
+         0.0118066110f, 0.0082376562f, 0.0045584328f, 0.0025395826f, 0.0014205091f, 0.0007963963f,
+         0.0000000037f}},
     {
-        {134217728, 134506240, 134730320, 135127728, 135830656, 137066736,
-         138212592, 139793296, 141936768, 144754096, 148250000, 150839072,
-         153418688, 155681312, 157255888, 157823360, 157255888, 155681312,
-         153418688, 150839072, 148250000, 144754096, 141936768, 139793296,
-         138212592, 137066736, 135830656, 135127728, 134730320, 134506240,
-         134217728},
-        {134217728, 134488080, 134698096, 135070576, 135729600, 136888992,
-         137964336, 139448608, 141462896, 144113040, 147405392, 149846352,
-         152280496, 154417184, 155904992, 156441360, 155904992, 154417184,
-         152280496, 149846352, 147405392, 144113056, 141462896, 139448592,
-         137964336, 136888992, 135729600, 135070592, 134698096, 134488080,
-         134217728},
-        {134217728, 134460464, 134649040, 134983616, 135575776, 136618224,
-         137585888, 138922720, 140739120, 143132528, 146111456, 148323744,
-         150532880, 152474432, 153827616, 154315712, 153827616, 152474432,
-         150532880, 148323744, 146111456, 143132528, 140739104, 138922720,
-         137585872, 136618224, 135575776, 134983616, 134649040, 134460464,
-         134217728},
-        {134217728, 134391168, 134526000, 134765312, 135189280, 135936912,
-         136632336, 137595280, 138907696, 140643920, 142815424, 144435360,
-         146058944, 147490640, 148491024, 148852384, 148491024, 147490640,
-         146058944, 144435360, 142815424, 140643920, 138907696, 137595280,
-         136632320, 135936912, 135189264, 134765312, 134526000, 134391168,
-         134217728},
-        {134217728, 134323872, 134406416, 134552992, 134812944, 135272112,
-         135700080, 136294032, 137106080, 138184736, 139540672, 140557056,
-         141579792, 142484928, 143119200, 143348672, 143119200, 142484928,
-         141579792, 140557056, 139540672, 138184736, 137106080, 136294032,
-         135700080, 135272112, 134812944, 134552992, 134406416, 134323872,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 134047496, 133914896, 133678832, 133258584, 132511008,
-         131808096, 130822576, 129456008, 127605336, 125219000, 123384360,
-         121496560, 119789320, 118571720, 118126808, 118571736, 119789320,
-         121496560, 123384360, 125219000, 127605336, 129456008, 130822576,
-         131808096, 132511008, 133258584, 133678848, 133914896, 134047496,
-         134217728},
-        {134217728, 133931488, 133708328, 133310696, 132601600, 131336352,
-         130142072, 128459768, 126111336, 122900128, 118702864, 115428552,
-         112012200, 111848104, 111848104, 111848104, 111848104, 111848104,
-         112012200, 115428552, 118702864, 122900128, 126111336, 128459768,
-         130142072, 131336352, 132601616, 133310696, 133708328, 133931488,
-         134217728},
-    },
+
+        {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+         0.0000000000f},
+        {0.0000000112f, 0.0019548684f, 0.0034630969f, 0.0061166696f, 0.0107457712f, 0.0186960548f,
+         0.0258635134f, 0.0354561731f, 0.0479685590f, 0.0636471361f, 0.0820589438f, 0.0950533152f,
+         0.1075267568f, 0.1181191504f, 0.1253151745f, 0.1278754473f, 0.1253151745f, 0.1181191429f,
+         0.1075267568f, 0.0950533152f, 0.0820589513f, 0.0636471361f, 0.0479685590f, 0.0354561731f,
+         0.0258635171f, 0.0186960548f, 0.0107457712f, 0.0061166734f, 0.0034630969f, 0.0019548684f,
+         0.0000000112f},
+        {0.0000000186f, 0.0030275919f, 0.0053654797f, 0.0094829798f, 0.0166785270f, 0.0290729403f,
+         0.0402846411f, 0.0553428568f, 0.0750693232f, 0.0999113992f, 0.1292407066f, 0.1500300914f,
+         0.1700480729f, 0.1870902777f, 0.1986886710f, 0.2028190494f, 0.1986886710f, 0.1870902628f,
+         0.1700480729f, 0.1500301063f, 0.1292407066f, 0.0999113992f, 0.0750693232f, 0.0553428493f,
+         0.0402846411f, 0.0290729403f, 0.0166785270f, 0.0094829798f, 0.0053654797f, 0.0030275919f,
+         0.0000000186f},
+        {0.0000000261f, 0.0044807382f, 0.0079482906f, 0.0140712596f, 0.0248195715f, 0.0434742048f,
+         0.0604977794f, 0.0835766271f, 0.1141664237f, 0.1532292813f, 0.2000626326f, 0.2336882651f,
+         0.2663741410f, 0.2944218218f, 0.3136188090f, 0.3204754591f, 0.3136188090f, 0.2944217920f,
+         0.2663741708f, 0.2336882651f, 0.2000626326f, 0.1532292962f, 0.1141664162f, 0.0835766271f,
+         0.0604977906f, 0.0434742048f, 0.0248195753f, 0.0140712596f, 0.0079482906f, 0.0044807382f,
+         0.0000000261f},
+        {0.0000000298f, 0.0052194707f, 0.0092673339f, 0.0164332762f, 0.0290685408f, 0.0511660054f,
+         0.0715145171f, 0.0993746519f, 0.1367753297f, 0.1852938682f, 0.2445339411f, 0.2877510786f,
+         0.3302804530f, 0.3671652079f, 0.3926102221f, 0.4017367959f, 0.3926102519f, 0.3671651781f,
+         0.3302804828f, 0.2877510488f, 0.2445339262f, 0.1852938682f, 0.1367753297f, 0.0993746296f,
+         0.0715145245f, 0.0511660017f, 0.0290685445f, 0.0164332762f, 0.0092673302f, 0.0052194707f,
+         0.0000000298f},
+        {0.0000000298f, 0.0056232363f, 0.0099989995f, 0.0177771747f, 0.0315911807f, 0.0560568646f,
+         0.0789347738f, 0.1108068749f, 0.1546058059f, 0.2131874412f, 0.2874797881f, 0.3436433673f,
+         0.4005688727f, 0.4512940049f, 0.4870318770f, 0.5000000000f, 0.4870318770f, 0.4512939751f,
+         0.4005689025f, 0.3436433673f, 0.2874797881f, 0.2131874263f, 0.1546057910f, 0.1108068675f,
+         0.0789347813f, 0.0560568646f, 0.0315911844f, 0.0177771747f, 0.0099989995f, 0.0056232363f,
+         0.0000000298f},
+        {0.0000000261f, 0.0045582913f, 0.0081248507f, 0.0145073459f, 0.0259804092f, 0.0467499122f,
+         0.0667200089f, 0.0954893604f, 0.1369983852f, 0.1965934485f, 0.2817551196f, 0.3696863651f,
+         0.4782578051f, 0.5972789526f, 0.6979248524f, 0.7386929989f, 0.6979249120f, 0.5972788930f,
+         0.4782578349f, 0.3696863651f, 0.2817551494f, 0.1965934485f, 0.1369983703f, 0.0954893529f,
+         0.0667200163f, 0.0467499122f, 0.0259804130f, 0.0145073459f, 0.0081248507f, 0.0045582913f,
+         0.0000000261f},
+        {0.0000000037f, 0.0007973649f, 0.0014236122f, 0.0025495738f, 0.0045911148f, 0.0083473474f,
+         0.0120380968f, 0.0175057761f, 0.0257535614f, 0.0410830304f, 0.0712796301f, 0.1087764949f,
+         0.1762015969f, 0.3041011989f, 0.5248691440f, 0.6885961890f, 0.5248694420f, 0.3041011393f,
+         0.1762016118f, 0.1087765023f, 0.0712796375f, 0.0410830304f, 0.0257535614f, 0.0175057724f,
+         0.0120380968f, 0.0083473474f, 0.0045911148f, 0.0025495775f, 0.0014236122f, 0.0007973649f,
+         0.0000000037f}}};
+
+const FLOAT32 ixheaacd_weight[16][8][31] = {
     {
-        {134217728, 134750352, 135163360, 135894416, 137183168, 139436416,
-         141510976, 144351440, 148166016, 153119584, 159180064, 163612720,
-         167986224, 171789568, 174419376, 175363904, 174419392, 171789552,
-         167986224, 163612736, 159180064, 153119584, 148166016, 144351440,
-         141510976, 139436416, 137183168, 135894416, 135163360, 134750352,
-         134217744},
-        {134217728, 134716864, 135103984, 135789392, 136998240, 139113424,
-         141062640, 143734096, 147326256, 151998160, 157724080, 161918432,
-         166061616, 169668288, 172163984, 173060688, 172163968, 169668288,
-         166061616, 161918432, 157724080, 151998160, 147326256, 143734096,
-         141062640, 139113424, 136998240, 135789392, 135103984, 134716864,
-         134217744},
-        {134217728, 134665904, 135013632, 135629504, 136716496, 138620704,
-         140377968, 142790048, 146039760, 150276480, 155483472, 159306928,
-         163090832, 166390080, 168675792, 169497600, 168675792, 166390080,
-         163090832, 159306944, 155483488, 150276480, 146039760, 142790048,
-         140377968, 138620704, 136716496, 135629504, 135013616, 134665904,
-         134217744},
-        {134217728, 134538048, 134786784, 135227776, 136007472, 137377520,
-         138646400, 140395008, 142763040, 145870208, 149717968, 152562416,
-         155392320, 157871248, 159594640, 160215424, 159594624, 157871248,
-         155392320, 152562416, 149717968, 145870208, 142763040, 140395008,
-         138646400, 137377520, 136007472, 135227776, 134786768, 134538048,
-         134217728},
-        {134217728, 134413792, 134566144, 134836576, 135315504, 136159568,
-         136944176, 138029792, 139507872, 141460704, 143899120, 145715424,
-         147533568, 149135008, 150253024, 150656672, 150253024, 149135008,
-         147533568, 145715424, 143899120, 141460688, 139507872, 138029792,
-         136944176, 136159584, 135315504, 134836576, 134566160, 134413792,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133903024, 133657608, 133220288, 132440008, 131046696,
-         129730280, 127873712, 125277552, 121718608, 117049664, 113392528,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 113392528, 117049680, 121718608, 125277552, 127873712,
-         129730280, 131046696, 132440024, 133220288, 133657624, 133903024,
-         134217728},
-        {134217728, 133688336, 133274944, 132536912, 131215936, 128843168,
-         126584160, 123368104, 118806640, 112416656, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 112416656, 118806640, 123368104,
-         126584160, 128843168, 131215952, 132536912, 133274944, 133688336,
-         134217728},
-    },
+
+        {0.5000000596f, 0.5028037429f, 0.5049747229f, 0.5088109374f, 0.5155536532f, 0.5272839665f,
+         0.5380217433f, 0.5526331663f, 0.5721039176f, 0.5971546769f, 0.6274869442f, 0.6494780183f,
+         0.6710323095f, 0.6896716356f, 0.7025068998f, 0.7071067691f, 0.7025068998f, 0.6896716356f,
+         0.6710323691f, 0.6494780183f, 0.6274869442f, 0.5971546769f, 0.5721039176f, 0.5526331663f,
+         0.5380217433f, 0.5272839665f, 0.5155536532f, 0.5088109374f, 0.5049747825f, 0.5028037429f,
+         0.5000000596f},
+        {0.5000000000f, 0.5026275516f, 0.5046628118f, 0.5082603693f, 0.5145876408f, 0.5256069303f,
+         0.5357060432f, 0.5494661331f, 0.5678316951f, 0.5915051103f, 0.6202291846f, 0.6410904527f,
+         0.6615636945f, 0.6792872548f, 0.6915015578f, 0.6958807707f, 0.6915016174f, 0.6792873144f,
+         0.6615636945f, 0.6410903931f, 0.6202292442f, 0.5915051103f, 0.5678316951f, 0.5494661331f,
+         0.5357059836f, 0.5256069303f, 0.5145876408f, 0.5082603693f, 0.5046628118f, 0.5026275516f,
+         0.5000000596f},
+        {0.5000000000f, 0.5023595095f, 0.5041879416f, 0.5074218512f, 0.5131149292f, 0.5230458379f,
+         0.5321645737f, 0.5446138382f, 0.5612714887f, 0.5828074217f, 0.6090247035f, 0.6281185746f,
+         0.6468966603f, 0.6631815434f, 0.6744188070f, 0.6784504652f, 0.6744188070f, 0.6631814837f,
+         0.6468966603f, 0.6281185746f, 0.6090247035f, 0.5828074217f, 0.5612714887f, 0.5446138978f,
+         0.5321645737f, 0.5230458379f, 0.5131149292f, 0.5074217916f, 0.5041879416f, 0.5023595095f,
+         0.5000000596f},
+        {0.5000000000f, 0.5016866922f, 0.5029953122f, 0.5053130984f, 0.5094034672f, 0.5165683627f,
+         0.5231794715f, 0.5322527885f, 0.5444748402f, 0.5604054928f, 0.5799794793f, 0.5943493247f,
+         0.6085679531f, 0.6209635735f, 0.6295502782f, 0.6326373219f, 0.6295503378f, 0.6209636331f,
+         0.6085679531f, 0.5943493247f, 0.5799794793f, 0.5604054928f, 0.5444748402f, 0.5322527885f,
+         0.5231794715f, 0.5165683627f, 0.5094034672f, 0.5053130984f, 0.5029953122f, 0.5016866922f,
+         0.5000000596f},
+        {0.5000000000f, 0.5010325909f, 0.5018346906f, 0.5032572150f, 0.5057737827f, 0.5102003217f,
+         0.5143051744f, 0.5199697018f, 0.5276548266f, 0.5377621055f, 0.5503131151f, 0.5596145988f,
+         0.5688871741f, 0.5770241618f, 0.5826888084f, 0.5847306848f, 0.5826888084f, 0.5770241618f,
+         0.5688871145f, 0.5596145988f, 0.5503131151f, 0.5377621055f, 0.5276548266f, 0.5199697614f,
+         0.5143051147f, 0.5102003217f, 0.5057737231f, 0.5032572150f, 0.5018346906f, 0.5010325909f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4983411729f, 0.4970465600f, 0.4947369397f, 0.4906081855f, 0.4832093418f,
+         0.4761866629f, 0.4662267566f, 0.4521820247f, 0.4326849580f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4326850176f, 0.4521820247f, 0.4662267566f,
+         0.4761866629f, 0.4832093418f, 0.4906081855f, 0.4947369397f, 0.4970465600f, 0.4983412325f,
+         0.5000000000f},
+        {0.5000000000f, 0.4972087145f, 0.4950257242f, 0.4911214709f, 0.4841098487f, 0.4714359641f,
+         0.4592681825f, 0.4417585433f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4417585433f,
+         0.4592681825f, 0.4714359641f, 0.4841098487f, 0.4911214709f, 0.4950257242f, 0.4972087145f,
+         0.5000000000f}},
     {
-        {134217728, 134913216, 135451936, 136404304, 138079504, 140997600,
-         143672688, 147318512, 152186224, 158463280, 166082896, 171618768,
-         177053216, 181758880, 185002352, 186165344, 185002352, 181758896,
-         177053216, 171618768, 166082896, 158463296, 152186224, 147318512,
-         143672688, 140997600, 138079504, 136404304, 135451936, 134913216,
-         134217744},
-        {134217728, 134869504, 135374512, 136267584, 137839408, 140580112,
-         143095472, 146527744, 151117280, 157046336, 164257936, 169506256,
-         174664912, 179136576, 182221168, 183327616, 182221168, 179136560,
-         174664928, 169506256, 164257936, 157046336, 151117296, 146527744,
-         143095472, 140580112, 137839408, 136267584, 135374512, 134869504,
-         134217744},
-        {134217728, 134802992, 135256672, 136059376, 137473424, 139942768,
-         142213056, 145316768, 149476832, 154866368, 161442736, 166241776,
-         170968496, 175072880, 177907744, 178925312, 177907760, 175072880,
-         170968496, 166241776, 161442736, 154866368, 149476832, 145316768,
-         142213056, 139942768, 137473424, 136059376, 135256672, 134802992,
-         134217744},
-        {134217728, 134636080, 134960736, 135535920, 136551440, 138331744,
-         139976000, 142235024, 145282080, 149260352, 154157968, 157759584,
-         161328032, 164442560, 166601920, 167378576, 166601920, 164442544,
-         161328032, 157759584, 154157968, 149260368, 145282080, 142235024,
-         139976016, 138331728, 136551456, 135535920, 134960736, 134636096,
-         134217744},
-        {134217728, 134473824, 134672800, 135025728, 135650240, 136749360,
-         137769200, 139177520, 141089920, 143607984, 146739200, 149062688,
-         151381328, 153417872, 154836624, 155348256, 154836640, 153417872,
-         151381328, 149062688, 146739200, 143607984, 141089920, 139177520,
-         137769200, 136749360, 135650256, 135025712, 134672784, 134473824,
-         134217728},
-        {134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728, 134217728, 134217728, 134217728, 134217728, 134217728,
-         134217728},
-        {134217728, 133806400, 133485440, 132913000, 131890240, 130059096,
-         128323168, 125864856, 122406120, 117621128, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 117621120, 122406120, 125864856,
-         128323168, 130059096, 131890240, 132913000, 133485440, 133806400,
-         134217728},
-        {134217728, 133525632, 132984568, 132017344, 130281848, 127150040,
-         124150024, 119845456, 113664464, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 111848104, 111848104,
-         111848104, 111848104, 111848104, 111848104, 113664464, 119845456,
-         124150024, 127150040, 130281848, 132017344, 132984568, 133525632,
-         134217728},
-    },
-};
+
+        {0.5000000000f, 0.5025908947f, 0.5045977831f, 0.5081456304f, 0.5143862367f, 0.5252569914f,
+         0.5352224708f, 0.5488042235f, 0.5669378638f, 0.5903217196f, 0.6187070012f, 0.6393297315f,
+         0.6595746279f, 0.6771045923f, 0.6891874671f, 0.6935198903f, 0.6891874671f, 0.6771045923f,
+         0.6595746279f, 0.6393297315f, 0.6187070012f, 0.5903217793f, 0.5669378638f, 0.5488042235f,
+         0.5352224708f, 0.5252569914f, 0.5143862367f, 0.5081456304f, 0.5045977831f, 0.5025908947f,
+         0.5000000596f},
+        {0.5000000000f, 0.5024280548f, 0.5043093562f, 0.5076363087f, 0.5134918094f, 0.5237017274f,
+         0.5330721736f, 0.5458583832f, 0.5629557371f, 0.5850431919f, 0.6119084954f, 0.6314600110f,
+         0.6506775022f, 0.6673356891f, 0.6788267493f, 0.6829485893f, 0.6788267493f, 0.6673356891f,
+         0.6506775022f, 0.6314600110f, 0.6119084954f, 0.5850431919f, 0.5629557371f, 0.5458583832f,
+         0.5330721736f, 0.5237017274f, 0.5134918094f, 0.5076363087f, 0.5043093562f, 0.5024280548f,
+         0.5000000596f},
+        {0.5000000000f, 0.5021802783f, 0.5038703680f, 0.5068606734f, 0.5121284127f, 0.5213274360f,
+         0.5297849178f, 0.5413471460f, 0.5568445921f, 0.5769221783f, 0.6014210582f, 0.6192988157f,
+         0.6369072795f, 0.6521973014f, 0.6627579927f, 0.6665487289f, 0.6627579927f, 0.6521973014f,
+         0.6369072795f, 0.6192988157f, 0.6014210582f, 0.5769221783f, 0.5568445921f, 0.5413471460f,
+         0.5297849178f, 0.5213274360f, 0.5121284127f, 0.5068606734f, 0.5038703680f, 0.5021802783f,
+         0.5000000596f},
+        {0.5000000000f, 0.5015584826f, 0.5027679205f, 0.5049106479f, 0.5086937547f, 0.5153259039f,
+         0.5214512348f, 0.5298667550f, 0.5412179232f, 0.5560381413f, 0.5742831826f, 0.5877002478f,
+         0.6009937525f, 0.6125962734f, 0.6206405163f, 0.6235337853f, 0.6206405163f, 0.6125962138f,
+         0.6009937525f, 0.5877002478f, 0.5742831826f, 0.5560382009f, 0.5412179232f, 0.5298667550f,
+         0.5214512944f, 0.5153258443f, 0.5086938143f, 0.5049106479f, 0.5027679205f, 0.5015585423f,
+         0.5000000596f},
+        {0.5000000000f, 0.5009540319f, 0.5016952753f, 0.5030100346f, 0.5053365231f, 0.5094310641f,
+         0.5132302642f, 0.5184766650f, 0.5256009102f, 0.5349814296f, 0.5466461182f, 0.5553017855f,
+         0.5639393330f, 0.5715261102f, 0.5768113732f, 0.5787173510f, 0.5768114328f, 0.5715261102f,
+         0.5639393926f, 0.5553017855f, 0.5466461182f, 0.5349814296f, 0.5256009102f, 0.5184766650f,
+         0.5132302642f, 0.5094310641f, 0.5053365827f, 0.5030099750f, 0.5016952157f, 0.5009540319f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4984676838f, 0.4972720146f, 0.4951395094f, 0.4913294315f, 0.4845078886f,
+         0.4780410528f, 0.4688831270f, 0.4559983313f, 0.4381728470f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4381728470f, 0.4559983313f, 0.4688831270f,
+         0.4780410528f, 0.4845078886f, 0.4913294315f, 0.4951395094f, 0.4972720146f, 0.4984676838f,
+         0.5000000000f},
+        {0.5000000000f, 0.4974217415f, 0.4954061210f, 0.4918029308f, 0.4853377044f, 0.4736708105f,
+         0.4624948800f, 0.4464591146f, 0.4234331250f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4234331250f, 0.4464591146f,
+         0.4624949098f, 0.4736708105f, 0.4853377044f, 0.4918029308f, 0.4954061210f, 0.4974217415f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5019841790f, 0.5035227537f, 0.5062461495f, 0.5110471249f, 0.5194411278f,
+         0.5271694660f, 0.5377510190f, 0.5519614220f, 0.5704149008f, 0.5929919481f, 0.6095049381f,
+         0.6257974505f, 0.6399660110f, 0.6497628689f, 0.6532815099f, 0.6497628689f, 0.6399660110f,
+         0.6257974505f, 0.6095049381f, 0.5929919481f, 0.5704149008f, 0.5519614220f, 0.5377510190f,
+         0.5271694660f, 0.5194411874f, 0.5110471249f, 0.5062461495f, 0.5035227537f, 0.5019841790f,
+         0.5000000596f},
+        {0.5000000000f, 0.5018594265f, 0.5033015609f, 0.5058549047f, 0.5103582144f, 0.5182378888f,
+         0.5254992843f, 0.5354512334f, 0.5488330722f, 0.5662372708f, 0.5875679851f, 0.6031931639f,
+         0.6186277270f, 0.6320636868f, 0.6413608193f, 0.6447013021f, 0.6413608193f, 0.6320636272f,
+         0.6186277270f, 0.6031931639f, 0.5875679851f, 0.5662372708f, 0.5488330722f, 0.5354512334f,
+         0.5254992843f, 0.5182378888f, 0.5103582144f, 0.5058549047f, 0.5033015609f, 0.5018594265f,
+         0.5000000596f},
+        {0.5000000000f, 0.5016695857f, 0.5029649734f, 0.5052592754f, 0.5093086362f, 0.5164023638f,
+         0.5229487419f, 0.5319343805f, 0.5440405011f, 0.5598235130f, 0.5792210698f, 0.5934646130f,
+         0.6075606942f, 0.6198514104f, 0.6283663511f, 0.6314277649f, 0.6283663511f, 0.6198514104f,
+         0.6075607538f, 0.5934646130f, 0.5792211294f, 0.5598235130f, 0.5440405011f, 0.5319343805f,
+         0.5229486823f, 0.5164024234f, 0.5093086362f, 0.5052592754f, 0.5029649138f, 0.5016695857f,
+         0.5000000596f},
+        {0.5000000000f, 0.5011932850f, 0.5021198988f, 0.5037627220f, 0.5066673160f, 0.5117711425f,
+         0.5164980888f, 0.5230121613f, 0.5318337679f, 0.5434088707f, 0.5577428937f, 0.5683392882f,
+         0.5788815022f, 0.5881162286f, 0.5945363641f, 0.5968489647f, 0.5945363641f, 0.5881162286f,
+         0.5788815022f, 0.5683392882f, 0.5577428937f, 0.5434088707f, 0.5318337679f, 0.5230121613f,
+         0.5164980888f, 0.5117711425f, 0.5066673160f, 0.5037627220f, 0.5021198988f, 0.5011932850f,
+         0.5000000000f},
+        {0.5000000000f, 0.5007303953f, 0.5012979507f, 0.5023053885f, 0.5040895343f, 0.5072339773f,
+         0.5101568103f, 0.5142010450f, 0.5197073221f, 0.5269821882f, 0.5360659957f, 0.5428322554f,
+         0.5496054292f, 0.5555711985f, 0.5597361326f, 0.5612398386f, 0.5597361922f, 0.5555711985f,
+         0.5496054292f, 0.5428322554f, 0.5360659957f, 0.5269821286f, 0.5197073221f, 0.5142010450f,
+         0.5101568103f, 0.5072339773f, 0.5040895343f, 0.5023053885f, 0.5012980103f, 0.5007303953f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4988276362f, 0.4979133904f, 0.4962842464f, 0.4933774769f, 0.4881869853f,
+         0.4832828939f, 0.4763666987f, 0.4666952491f, 0.4534370899f, 0.4360439777f, 0.4224200249f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4224200249f, 0.4360440373f, 0.4534370899f, 0.4666952491f, 0.4763666987f,
+         0.4832829535f, 0.4881869853f, 0.4933775365f, 0.4962842464f, 0.4979134500f, 0.4988276362f,
+         0.5000000000f},
+        {0.5000000000f, 0.4980278611f, 0.4964878559f, 0.4937384725f, 0.4888174534f, 0.4799782038f,
+         0.4715627432f, 0.4595820010f, 0.4425892234f, 0.4187846780f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4187846780f, 0.4425891936f, 0.4595820010f,
+         0.4715627432f, 0.4799782038f, 0.4888174534f, 0.4937384725f, 0.4964878559f, 0.4980278611f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5010747910f, 0.5019095540f, 0.5033900142f, 0.5060086250f, 0.5106133819f,
+         0.5148820281f, 0.5207706094f, 0.5287556648f, 0.5392510295f, 0.5522742867f, 0.5619193316f,
+         0.5715291500f, 0.5799580812f, 0.5858238339f, 0.5879377723f, 0.5858238339f, 0.5799580812f,
+         0.5715291500f, 0.5619193316f, 0.5522742271f, 0.5392510295f, 0.5287556648f, 0.5207706094f,
+         0.5148820281f, 0.5106133819f, 0.5060086250f, 0.5033900142f, 0.5019095540f, 0.5010747910f,
+         0.5000000000f},
+        {0.5000000000f, 0.5010071397f, 0.5017895103f, 0.5031771064f, 0.5056321621f, 0.5099512339f,
+         0.5139571428f, 0.5194865465f, 0.5269903541f, 0.5368629098f, 0.5491278768f, 0.5582211614f,
+         0.5672890544f, 0.5752488375f, 0.5807913542f, 0.5827894807f, 0.5807913542f, 0.5752488375f,
+         0.5672890544f, 0.5582211614f, 0.5491278768f, 0.5368629098f, 0.5269903541f, 0.5194864869f,
+         0.5139572024f, 0.5099512339f, 0.5056321621f, 0.5031771064f, 0.5017895103f, 0.5010071397f,
+         0.5000000000f},
+        {0.5000000000f, 0.5009042621f, 0.5016067624f, 0.5028531551f, 0.5050591230f, 0.5089425445f,
+         0.5125473142f, 0.5175274611f, 0.5242940187f, 0.5332102180f, 0.5443075299f, 0.5525490046f,
+         0.5607786179f, 0.5680114627f, 0.5730524659f, 0.5748707652f, 0.5730524659f, 0.5680115223f,
+         0.5607786775f, 0.5525490046f, 0.5443075299f, 0.5332102180f, 0.5242940187f, 0.5175274611f,
+         0.5125473142f, 0.5089425445f, 0.5050590634f, 0.5028531551f, 0.5016067624f, 0.5009042621f,
+         0.5000000000f},
+        {0.5000000000f, 0.5006461143f, 0.5011484027f, 0.5020399094f, 0.5036193132f, 0.5064044595f,
+         0.5089951158f, 0.5125823617f, 0.5174714923f, 0.5239394307f, 0.5320289135f, 0.5380636454f,
+         0.5441119671f, 0.5494454503f, 0.5531721711f, 0.5545182824f, 0.5531721711f, 0.5494454503f,
+         0.5441119671f, 0.5380636454f, 0.5320289135f, 0.5239394307f, 0.5174714923f, 0.5125823617f,
+         0.5089950562f, 0.5064044595f, 0.5036192536f, 0.5020399094f, 0.5011484027f, 0.5006461143f,
+         0.5000000000f},
+        {0.5000000000f, 0.5003954172f, 0.5007029176f, 0.5012489557f, 0.5022173524f, 0.5039278865f,
+         0.5055221915f, 0.5077348351f, 0.5107599497f, 0.5147782564f, 0.5198295116f, 0.5236158371f,
+         0.5274257660f, 0.5307977200f, 0.5331605673f, 0.5340154171f, 0.5331605673f, 0.5307977200f,
+         0.5274257660f, 0.5236158371f, 0.5198295116f, 0.5147782564f, 0.5107599497f, 0.5077348351f,
+         0.5055221915f, 0.5039278865f, 0.5022173524f, 0.5012489557f, 0.5007029176f, 0.5003954172f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4993658364f, 0.4988718629f, 0.4979924560f, 0.4964269102f, 0.4936419725f,
+         0.4910234213f, 0.4873520732f, 0.4822612107f, 0.4753669202f, 0.4664771855f, 0.4596425891f,
+         0.4526099563f, 0.4462499917f, 0.4417141378f, 0.4400566816f, 0.4417141378f, 0.4462499917f,
+         0.4526099563f, 0.4596425891f, 0.4664771855f, 0.4753669202f, 0.4822612107f, 0.4873520732f,
+         0.4910234213f, 0.4936419725f, 0.4964269102f, 0.4979925156f, 0.4988718629f, 0.4993658364f,
+         0.5000000000f},
+        {0.5000000000f, 0.4989336729f, 0.4981023371f, 0.4966210425f, 0.4939794540f, 0.4892660379f,
+         0.4848169982f, 0.4785499275f, 0.4698013365f, 0.4578387141f, 0.4422026277f, 0.4300048947f,
+         0.4172779918f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4172779918f, 0.4300048947f, 0.4422026277f, 0.4578386545f, 0.4698013365f, 0.4785499275f,
+         0.4848169982f, 0.4892660379f, 0.4939795136f, 0.4966210425f, 0.4981023371f, 0.4989336729f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000596f, 0.5000000000f, 0.5000000000f, 0.5000000596f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.4989228845f, 0.4980831146f, 0.4965868294f, 0.4939183295f, 0.4891564250f,
+         0.4846611917f, 0.4783283472f, 0.4694863856f, 0.4573930204f, 0.4415802956f, 0.4292396903f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4292396903f, 0.4415802360f, 0.4573930204f, 0.4694863856f, 0.4783283472f,
+         0.4846611917f, 0.4891564250f, 0.4939183295f, 0.4965868294f, 0.4980831146f, 0.4989228845f,
+         0.5000000000f},
+        {0.5000000000f, 0.4989907742f, 0.4982040823f, 0.4968025982f, 0.4943036735f, 0.4898466468f,
+         0.4856418371f, 0.4797225595f, 0.4714670181f, 0.4601936638f, 0.4454868734f, 0.4340382218f,
+         0.4221174717f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4221174419f, 0.4340382218f, 0.4454868734f, 0.4601936638f, 0.4714670181f, 0.4797225595f,
+         0.4856418371f, 0.4898466468f, 0.4943036735f, 0.4968025982f, 0.4982040823f, 0.4989907742f,
+         0.5000000000f},
+        {0.5000000000f, 0.4990940988f, 0.4983880222f, 0.4971305132f, 0.4948891699f, 0.4908945858f,
+         0.4871295691f, 0.4818353653f, 0.4744636714f, 0.4644210041f, 0.4513638616f, 0.4412364960f,
+         0.4307287931f, 0.4211448431f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4211448431f,
+         0.4307287931f, 0.4412364960f, 0.4513638616f, 0.4644210041f, 0.4744636118f, 0.4818353653f,
+         0.4871295691f, 0.4908945858f, 0.4948891699f, 0.4971305132f, 0.4983880222f, 0.4990940988f,
+         0.5000000000f},
+        {0.5000000000f, 0.4993529916f, 0.4988490045f, 0.4979517758f, 0.4963543117f, 0.4935124516f,
+         0.4908400774f, 0.4870927036f, 0.4818954766f, 0.4748552144f, 0.4657738209f, 0.4587891996f,
+         0.4515995979f, 0.4450952113f, 0.4404549301f, 0.4387589991f, 0.4404549301f, 0.4450952113f,
+         0.4515995383f, 0.4587891996f, 0.4657738805f, 0.4748552144f, 0.4818954766f, 0.4870927334f,
+         0.4908400774f, 0.4935124516f, 0.4963543117f, 0.4979517758f, 0.4988490045f, 0.4993529916f,
+         0.5000000000f},
+        {0.5000000000f, 0.4996043146f, 0.4992960989f, 0.4987479150f, 0.4977727532f, 0.4960409999f,
+         0.4944161773f, 0.4921435714f, 0.4890033603f, 0.4847714305f, 0.4793508947f, 0.4752120376f,
+         0.4709798396f, 0.4671763778f, 0.4644779861f, 0.4634949565f, 0.4644779861f, 0.4671763778f,
+         0.4709798396f, 0.4752120376f, 0.4793508947f, 0.4847714305f, 0.4890033603f, 0.4921435714f,
+         0.4944161773f, 0.4960409999f, 0.4977727532f, 0.4987478554f, 0.4992960989f, 0.4996043146f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5006332994f, 0.5011256337f, 0.5019994974f, 0.5035477281f, 0.5062782168f,
+         0.5088182092f, 0.5123358369f, 0.5171306729f, 0.5234751701f, 0.5314123034f, 0.5373347998f,
+         0.5432717204f, 0.5485079288f, 0.5521671772f, 0.5534890294f, 0.5521671772f, 0.5485079288f,
+         0.5432717204f, 0.5373347998f, 0.5314123034f, 0.5234752297f, 0.5171306729f, 0.5123357773f,
+         0.5088182092f, 0.5062782168f, 0.5035477281f, 0.5019994974f, 0.5011256337f, 0.5006332994f,
+         0.5000000000f},
+        {0.5000000000f, 0.5010640621f, 0.5018905401f, 0.5033562183f, 0.5059488416f, 0.5105082989f,
+         0.5147353411f, 0.5205669403f, 0.5284758210f, 0.5388726592f, 0.5517760515f, 0.5613338947f,
+         0.5708581805f, 0.5792131424f, 0.5850278735f, 0.5871236324f, 0.5850278735f, 0.5792131424f,
+         0.5708581805f, 0.5613338947f, 0.5517760515f, 0.5388726592f, 0.5284758210f, 0.5205669403f,
+         0.5147353411f, 0.5105082989f, 0.5059488416f, 0.5033562183f, 0.5018904805f, 0.5010640621f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.4980079234f, 0.4964522421f, 0.4936747849f, 0.4887031913f, 0.4797717333f,
+         0.4712667167f, 0.4591555893f, 0.4419712424f, 0.4178838134f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4178838134f, 0.4419712424f, 0.4591555893f,
+         0.4712667167f, 0.4797717333f, 0.4887031913f, 0.4936747849f, 0.4964522421f, 0.4980079234f,
+         0.5000000000f},
+        {0.5000000000f, 0.4981336296f, 0.4966765046f, 0.4940757155f, 0.4894226193f, 0.4810712039f,
+         0.4731284380f, 0.4618354440f, 0.4458500445f, 0.4235273004f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4235273004f, 0.4458500445f, 0.4618354440f,
+         0.4731284380f, 0.4810712039f, 0.4894225895f, 0.4940757155f, 0.4966765046f, 0.4981336892f,
+         0.5000000000f},
+        {0.5000000000f, 0.4983248413f, 0.4970174134f, 0.4946847558f, 0.4905147851f, 0.4830409586f,
+         0.4759460390f, 0.4658817351f, 0.4516856372f, 0.4319694936f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4319694936f, 0.4516856372f, 0.4658817351f,
+         0.4759460390f, 0.4830409586f, 0.4905147851f, 0.4946847558f, 0.4970174134f, 0.4983248413f,
+         0.5000000000f},
+        {0.5000000000f, 0.4988038540f, 0.4978710711f, 0.4962087274f, 0.4932425618f, 0.4879449904f,
+         0.4829386175f, 0.4758763313f, 0.4659966528f, 0.4524453282f, 0.4346525371f, 0.4207023382f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4207023382f, 0.4346525371f, 0.4524453282f, 0.4659966528f, 0.4758763313f,
+         0.4829386175f, 0.4879449904f, 0.4932425618f, 0.4962087274f, 0.4978710711f, 0.4988038540f,
+         0.5000000000f},
+        {0.5000000000f, 0.4992685318f, 0.4986986518f, 0.4976839423f, 0.4958767295f, 0.4926598668f,
+         0.4896325469f, 0.4853836596f, 0.4794833362f, 0.4714762270f, 0.4611217678f, 0.4531369507f,
+         0.4448976219f, 0.4374250174f, 0.4320826530f, 0.4301276803f, 0.4320826530f, 0.4374250174f,
+         0.4448976219f, 0.4531369507f, 0.4611217678f, 0.4714762270f, 0.4794833362f, 0.4853836596f,
+         0.4896325469f, 0.4926598072f, 0.4958767295f, 0.4976839423f, 0.4986986518f, 0.4992685318f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5011696219f, 0.5020779371f, 0.5036883950f, 0.5065358877f, 0.5115402937f,
+         0.5161759257f, 0.5225655437f, 0.5312208533f, 0.5425815582f, 0.5566557646f, 0.5670637488f,
+         0.5774215460f, 0.5864970684f, 0.5928076506f, 0.5950810909f, 0.5928076506f, 0.5864970684f,
+         0.5774215460f, 0.5670637488f, 0.5566557646f, 0.5425815582f, 0.5312208533f, 0.5225655437f,
+         0.5161759257f, 0.5115402341f, 0.5065358877f, 0.5036883950f, 0.5020778775f, 0.5011696219f,
+         0.5000000000f},
+        {0.5000000000f, 0.5019643307f, 0.5034876466f, 0.5061841011f, 0.5109378099f, 0.5192503333f,
+         0.5269047022f, 0.5373865962f, 0.5514660478f, 0.5697538257f, 0.5921343565f, 0.6085074544f,
+         0.6246649623f, 0.6387181878f, 0.6484364867f, 0.6519271135f, 0.6484364867f, 0.6387181878f,
+         0.6246649027f, 0.6085074544f, 0.5921343565f, 0.5697538257f, 0.5514660478f, 0.5373866558f,
+         0.5269047022f, 0.5192503333f, 0.5109378099f, 0.5061841011f, 0.5034876466f, 0.5019643903f,
+         0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4973956347f, 0.4953595102f, 0.4917194545f, 0.4851873517f, 0.4733974338f,
+         0.4621005356f, 0.4458855093f, 0.4225889444f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4225889444f, 0.4458855093f,
+         0.4621005356f, 0.4733974338f, 0.4851873517f, 0.4917194545f, 0.4953595102f, 0.4973956347f,
+         0.5000000000f},
+        {0.5000000000f, 0.4975600541f, 0.4956531823f, 0.4922452271f, 0.4861339033f, 0.4751173258f,
+         0.4645794332f, 0.4494870603f, 0.4278794229f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4278794229f, 0.4494870603f,
+         0.4645794332f, 0.4751173258f, 0.4861338437f, 0.4922452271f, 0.4956531823f, 0.4975600541f,
+         0.5000000000f},
+        {0.5000000000f, 0.4978101552f, 0.4960994422f, 0.4930438697f, 0.4875699580f, 0.4777213931f,
+         0.4683246017f, 0.4549102187f, 0.4358028471f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4358028471f, 0.4549102187f,
+         0.4683246017f, 0.4777213931f, 0.4875699580f, 0.4930438697f, 0.4960994422f, 0.4978101552f,
+         0.5000000000f},
+        {0.5000000000f, 0.4984366000f, 0.4972166717f, 0.4950406849f, 0.4911523461f, 0.4841892719f,
+         0.4775862098f, 0.4682320654f, 0.4550639093f, 0.4368312657f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4368312657f, 0.4550639093f, 0.4682320654f,
+         0.4775862098f, 0.4841892719f, 0.4911523461f, 0.4950406253f, 0.4972166717f, 0.4984366000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4990440905f, 0.4982990324f, 0.4969717562f, 0.4946058393f, 0.4903875589f,
+         0.4864100218f, 0.4808138311f, 0.4730155468f, 0.4623796046f, 0.4485287368f, 0.4377669692f,
+         0.4265822172f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4265822172f, 0.4377669096f, 0.4485287070f, 0.4623796046f, 0.4730155468f, 0.4808138311f,
+         0.4864100218f, 0.4903876185f, 0.4946058393f, 0.4969717562f, 0.4982990324f, 0.4990440905f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5015276670f, 0.5027132034f, 0.5048136711f, 0.5085227489f, 0.5150263309f,
+         0.5210343599f, 0.5292906761f, 0.5404308438f, 0.5549815893f, 0.5729033351f, 0.5860881805f,
+         0.5991558433f, 0.6105647087f, 0.6184762716f, 0.6213221550f, 0.6184762716f, 0.6105646491f,
+         0.5991559029f, 0.5860881805f, 0.5729033351f, 0.5549815893f, 0.5404308438f, 0.5292906761f,
+         0.5210343599f, 0.5150263309f, 0.5085227489f, 0.5048136711f, 0.5027132034f, 0.5015276670f,
+         0.5000000596f},
+        {0.5000000000f, 0.5025650263f, 0.5045520067f, 0.5080648065f, 0.5142443776f, 0.5250104070f,
+         0.5348817706f, 0.5483376980f, 0.5663076639f, 0.5894870162f, 0.6176328659f, 0.6380870938f,
+         0.6581704617f, 0.6755633950f, 0.6875533462f, 0.6918526888f, 0.6875533462f, 0.6755633950f,
+         0.6581704021f, 0.6380870938f, 0.6176328659f, 0.5894870162f, 0.5663076639f, 0.5483376980f,
+         0.5348817110f, 0.5250104070f, 0.5142443776f, 0.5080648065f, 0.5045520067f, 0.5025650263f,
+         0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4971804321f, 0.4949752688f, 0.4910309613f, 0.4839466810f, 0.4711386263f,
+         0.4588383138f, 0.4411309958f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.0000000000f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4411309958f,
+         0.4588383138f, 0.4711386263f, 0.4839466810f, 0.4910309613f, 0.4949752688f, 0.4971804321f,
+         0.5000000000f},
+        {0.5000000000f, 0.4973585308f, 0.4952933490f, 0.4916008413f, 0.4849737287f, 0.4730088115f,
+         0.4615398645f, 0.4450696707f, 0.4213871956f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4213872254f, 0.4450696707f,
+         0.4615398645f, 0.4730088115f, 0.4849737287f, 0.4916008413f, 0.4952932894f, 0.4973585308f,
+         0.5000000000f},
+        {0.5000000000f, 0.4976293147f, 0.4957766831f, 0.4924663603f, 0.4865316749f, 0.4758392870f,
+         0.4656187594f, 0.4509941638f, 0.4300864339f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4300864339f, 0.4509941638f,
+         0.4656187594f, 0.4758392870f, 0.4865316749f, 0.4924663603f, 0.4957766831f, 0.4976293147f,
+         0.5000000000f},
+        {0.5000000000f, 0.4983075559f, 0.4969865978f, 0.4946298003f, 0.4904162288f, 0.4828635156f,
+         0.4756923914f, 0.4655179977f, 0.4511619806f, 0.4312142432f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4312142432f, 0.4511619806f, 0.4655179381f,
+         0.4756923914f, 0.4828635156f, 0.4904162884f, 0.4946298003f, 0.4969866574f, 0.4983075559f,
+         0.5000000000f},
+        {0.5000000000f, 0.4989652634f, 0.4981585741f, 0.4967214465f, 0.4941587746f, 0.4895872176f,
+         0.4852733612f, 0.4791988134f, 0.4707232416f, 0.4591425657f, 0.4440219402f, 0.4322400987f,
+         0.4199612439f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4199612439f, 0.4322400391f, 0.4440219402f, 0.4591425657f, 0.4707232416f, 0.4791988134f,
+         0.4852733612f, 0.4895872176f, 0.4941587746f, 0.4967214465f, 0.4981585741f, 0.4989652634f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5016533136f, 0.5029361248f, 0.5052082539f, 0.5092185736f, 0.5162448287f,
+         0.5227296948f, 0.5316320062f, 0.5436279774f, 0.5592706800f, 0.5785004497f, 0.5926237702f,
+         0.6066032648f, 0.6187940836f, 0.6272407174f, 0.6302776933f, 0.6272407174f, 0.6187940836f,
+         0.6066032648f, 0.5926238298f, 0.5785004497f, 0.5592706800f, 0.5436280370f, 0.5316320062f,
+         0.5227296352f, 0.5162448287f, 0.5092185736f, 0.5052082539f, 0.5029360652f, 0.5016533136f,
+         0.5000000596f},
+        {0.5000000596f, 0.5027757883f, 0.5049252510f, 0.5087236166f, 0.5154004693f, 0.5270181894f,
+         0.5376548171f, 0.5521317124f, 0.5714279413f, 0.5962615013f, 0.6263405681f, 0.6481539011f,
+         0.6695383787f, 0.6880338192f, 0.7007715702f, 0.7053368092f, 0.7007715702f, 0.6880338192f,
+         0.6695383191f, 0.6481539011f, 0.6263405681f, 0.5962615013f, 0.5714278817f, 0.5521317124f,
+         0.5376548171f, 0.5270181298f, 0.5154004097f, 0.5087236166f, 0.5049252510f, 0.5027757883f,
+         0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4973956347f, 0.4953595102f, 0.4917194545f, 0.4851873517f, 0.4733974338f,
+         0.4621005356f, 0.4458855093f, 0.4225889444f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4225889444f, 0.4458855093f,
+         0.4621005356f, 0.4733974338f, 0.4851873517f, 0.4917194545f, 0.4953595102f, 0.4973956347f,
+         0.5000000000f},
+        {0.5000000000f, 0.4975600541f, 0.4956531823f, 0.4922452271f, 0.4861339033f, 0.4751173258f,
+         0.4645794332f, 0.4494870603f, 0.4278794229f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4278794229f, 0.4494870603f,
+         0.4645794332f, 0.4751173258f, 0.4861338437f, 0.4922452271f, 0.4956531823f, 0.4975600541f,
+         0.5000000000f},
+        {0.5000000000f, 0.4978101552f, 0.4960994422f, 0.4930438697f, 0.4875699580f, 0.4777213931f,
+         0.4683246017f, 0.4549102187f, 0.4358028471f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4358028471f, 0.4549102187f,
+         0.4683246017f, 0.4777213931f, 0.4875699580f, 0.4930438697f, 0.4960994422f, 0.4978101552f,
+         0.5000000000f},
+        {0.5000000000f, 0.4984366000f, 0.4972166717f, 0.4950406849f, 0.4911523461f, 0.4841892719f,
+         0.4775862098f, 0.4682320654f, 0.4550639093f, 0.4368312657f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4368312657f, 0.4550639093f, 0.4682320654f,
+         0.4775862098f, 0.4841892719f, 0.4911523461f, 0.4950406253f, 0.4972166717f, 0.4984366000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4990440905f, 0.4982990324f, 0.4969717562f, 0.4946058393f, 0.4903875589f,
+         0.4864100218f, 0.4808138311f, 0.4730155468f, 0.4623796046f, 0.4485287368f, 0.4377669692f,
+         0.4265822172f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4265822172f, 0.4377669096f, 0.4485287070f, 0.4623796046f, 0.4730155468f, 0.4808138311f,
+         0.4864100218f, 0.4903876185f, 0.4946058393f, 0.4969717562f, 0.4982990324f, 0.4990440905f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5015276670f, 0.5027132034f, 0.5048136711f, 0.5085227489f, 0.5150263309f,
+         0.5210343599f, 0.5292906761f, 0.5404308438f, 0.5549815893f, 0.5729033351f, 0.5860881805f,
+         0.5991558433f, 0.6105647087f, 0.6184762716f, 0.6213221550f, 0.6184762716f, 0.6105646491f,
+         0.5991559029f, 0.5860881805f, 0.5729033351f, 0.5549815893f, 0.5404308438f, 0.5292906761f,
+         0.5210343599f, 0.5150263309f, 0.5085227489f, 0.5048136711f, 0.5027132034f, 0.5015276670f,
+         0.5000000596f},
+        {0.5000000000f, 0.5025650263f, 0.5045520067f, 0.5080648065f, 0.5142443776f, 0.5250104070f,
+         0.5348817706f, 0.5483376980f, 0.5663076639f, 0.5894870162f, 0.6176328659f, 0.6380870938f,
+         0.6581704617f, 0.6755633950f, 0.6875533462f, 0.6918526888f, 0.6875533462f, 0.6755633950f,
+         0.6581704021f, 0.6380870938f, 0.6176328659f, 0.5894870162f, 0.5663076639f, 0.5483376980f,
+         0.5348817110f, 0.5250104070f, 0.5142443776f, 0.5080648065f, 0.5045520067f, 0.5025650263f,
+         0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4980079234f, 0.4964522421f, 0.4936747849f, 0.4887031913f, 0.4797717333f,
+         0.4712667167f, 0.4591555893f, 0.4419712424f, 0.4178837836f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4178837836f, 0.4419712424f, 0.4591555893f,
+         0.4712667167f, 0.4797717333f, 0.4887031913f, 0.4936747849f, 0.4964522421f, 0.4980079234f,
+         0.5000000000f},
+        {0.5000000000f, 0.4981336296f, 0.4966765046f, 0.4940757155f, 0.4894226193f, 0.4810712039f,
+         0.4731284380f, 0.4618354440f, 0.4458500445f, 0.4235272706f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4235273004f, 0.4458500445f, 0.4618354440f,
+         0.4731284380f, 0.4810712039f, 0.4894225895f, 0.4940757155f, 0.4966765046f, 0.4981336892f,
+         0.5000000000f},
+        {0.5000000000f, 0.4983248413f, 0.4970174134f, 0.4946847558f, 0.4905147851f, 0.4830409586f,
+         0.4759460390f, 0.4658817351f, 0.4516856372f, 0.4319694936f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4319694936f, 0.4516856372f, 0.4658817351f,
+         0.4759460390f, 0.4830409586f, 0.4905147851f, 0.4946847558f, 0.4970174134f, 0.4983248413f,
+         0.5000000000f},
+        {0.5000000000f, 0.4988038540f, 0.4978710711f, 0.4962087274f, 0.4932425618f, 0.4879449904f,
+         0.4829386175f, 0.4758763313f, 0.4659966528f, 0.4524453282f, 0.4346525073f, 0.4207023382f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4207023382f, 0.4346525371f, 0.4524452984f, 0.4659966528f, 0.4758763313f,
+         0.4829386175f, 0.4879449904f, 0.4932425618f, 0.4962087274f, 0.4978710711f, 0.4988038540f,
+         0.5000000000f},
+        {0.5000000000f, 0.4992685318f, 0.4986986518f, 0.4976839423f, 0.4958767295f, 0.4926598668f,
+         0.4896325469f, 0.4853836596f, 0.4794833362f, 0.4714761972f, 0.4611217678f, 0.4531369507f,
+         0.4448976219f, 0.4374250174f, 0.4320826530f, 0.4301276803f, 0.4320826530f, 0.4374250174f,
+         0.4448976219f, 0.4531369507f, 0.4611217678f, 0.4714761972f, 0.4794833362f, 0.4853836596f,
+         0.4896325469f, 0.4926598072f, 0.4958767295f, 0.4976839423f, 0.4986986518f, 0.4992685318f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5011696219f, 0.5020779371f, 0.5036883950f, 0.5065358877f, 0.5115402937f,
+         0.5161759257f, 0.5225655437f, 0.5312208533f, 0.5425816178f, 0.5566557646f, 0.5670638084f,
+         0.5774215460f, 0.5864970684f, 0.5928076506f, 0.5950810909f, 0.5928076506f, 0.5864970684f,
+         0.5774215460f, 0.5670638084f, 0.5566557646f, 0.5425815582f, 0.5312208533f, 0.5225655437f,
+         0.5161759257f, 0.5115402341f, 0.5065358877f, 0.5036883950f, 0.5020778775f, 0.5011696219f,
+         0.5000000000f},
+        {0.5000000000f, 0.5019643307f, 0.5034876466f, 0.5061841011f, 0.5109378099f, 0.5192503333f,
+         0.5269047022f, 0.5373866558f, 0.5514660478f, 0.5697538257f, 0.5921343565f, 0.6085074544f,
+         0.6246649623f, 0.6387182474f, 0.6484364867f, 0.6519271135f, 0.6484364867f, 0.6387182474f,
+         0.6246649623f, 0.6085074544f, 0.5921343565f, 0.5697538257f, 0.5514660478f, 0.5373866558f,
+         0.5269047022f, 0.5192503333f, 0.5109378099f, 0.5061841011f, 0.5034876466f, 0.5019643903f,
+         0.5000000596f}},
+    {
+
+        {0.5000000000f, 0.4989228845f, 0.4980831146f, 0.4965868294f, 0.4939183295f, 0.4891564250f,
+         0.4846611917f, 0.4783283472f, 0.4694863856f, 0.4573929608f, 0.4415802360f, 0.4292396307f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4292396307f, 0.4415802360f, 0.4573929608f, 0.4694863856f, 0.4783283472f,
+         0.4846611917f, 0.4891563654f, 0.4939182699f, 0.4965868294f, 0.4980831146f, 0.4989228845f,
+         0.5000000000f},
+        {0.5000000000f, 0.4989907742f, 0.4982040823f, 0.4968025982f, 0.4943036735f, 0.4898466468f,
+         0.4856418371f, 0.4797225595f, 0.4714670181f, 0.4601936638f, 0.4454868436f, 0.4340381622f,
+         0.4221174419f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4221173823f, 0.4340381622f, 0.4454868436f, 0.4601936638f, 0.4714670181f, 0.4797225595f,
+         0.4856418371f, 0.4898466468f, 0.4943036735f, 0.4968025386f, 0.4982040823f, 0.4989907742f,
+         0.5000000000f},
+        {0.5000000000f, 0.4990940988f, 0.4983880222f, 0.4971305132f, 0.4948891699f, 0.4908945858f,
+         0.4871295691f, 0.4818353653f, 0.4744636118f, 0.4644210041f, 0.4513638020f, 0.4412364364f,
+         0.4307287931f, 0.4211447835f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4211447835f,
+         0.4307287633f, 0.4412364364f, 0.4513638616f, 0.4644210041f, 0.4744636118f, 0.4818353653f,
+         0.4871295691f, 0.4908945858f, 0.4948891699f, 0.4971305132f, 0.4983880222f, 0.4990940988f,
+         0.5000000000f},
+        {0.5000000000f, 0.4993529916f, 0.4988489449f, 0.4979517758f, 0.4963543117f, 0.4935124516f,
+         0.4908400774f, 0.4870927036f, 0.4818954766f, 0.4748552144f, 0.4657738209f, 0.4587891996f,
+         0.4515995383f, 0.4450951517f, 0.4404549301f, 0.4387589693f, 0.4404549301f, 0.4450951517f,
+         0.4515995383f, 0.4587891996f, 0.4657738209f, 0.4748552144f, 0.4818954766f, 0.4870927036f,
+         0.4908400774f, 0.4935124516f, 0.4963543117f, 0.4979517758f, 0.4988490045f, 0.4993529916f,
+         0.5000000000f},
+        {0.5000000000f, 0.4996043146f, 0.4992960989f, 0.4987479150f, 0.4977727532f, 0.4960409999f,
+         0.4944161773f, 0.4921435714f, 0.4890033603f, 0.4847714305f, 0.4793508947f, 0.4752120376f,
+         0.4709798396f, 0.4671763778f, 0.4644779861f, 0.4634948969f, 0.4644779861f, 0.4671763778f,
+         0.4709798396f, 0.4752120376f, 0.4793508947f, 0.4847714305f, 0.4890033603f, 0.4921435714f,
+         0.4944161773f, 0.4960409999f, 0.4977727532f, 0.4987478554f, 0.4992960989f, 0.4996043146f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5006332994f, 0.5011256337f, 0.5019994974f, 0.5035477281f, 0.5062782168f,
+         0.5088182092f, 0.5123358369f, 0.5171306729f, 0.5234752297f, 0.5314123034f, 0.5373347998f,
+         0.5432717800f, 0.5485079288f, 0.5521671772f, 0.5534890294f, 0.5521672368f, 0.5485079288f,
+         0.5432717800f, 0.5373347998f, 0.5314123631f, 0.5234752297f, 0.5171306729f, 0.5123357773f,
+         0.5088182092f, 0.5062782168f, 0.5035477281f, 0.5019994974f, 0.5011256337f, 0.5006333590f,
+         0.5000000000f},
+        {0.5000000000f, 0.5010640621f, 0.5018905401f, 0.5033562183f, 0.5059488416f, 0.5105082989f,
+         0.5147353411f, 0.5205669403f, 0.5284758806f, 0.5388726592f, 0.5517760515f, 0.5613339543f,
+         0.5708582401f, 0.5792131424f, 0.5850278735f, 0.5871236920f, 0.5850278735f, 0.5792131424f,
+         0.5708582401f, 0.5613339543f, 0.5517760515f, 0.5388726592f, 0.5284758210f, 0.5205669403f,
+         0.5147353411f, 0.5105083585f, 0.5059489012f, 0.5033562183f, 0.5018904805f, 0.5010640621f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5010747910f, 0.5019095540f, 0.5033900142f, 0.5060086250f, 0.5106133819f,
+         0.5148820281f, 0.5207706094f, 0.5287556648f, 0.5392510295f, 0.5522742867f, 0.5619193316f,
+         0.5715291500f, 0.5799580812f, 0.5858238339f, 0.5879378319f, 0.5858238339f, 0.5799580812f,
+         0.5715291500f, 0.5619193316f, 0.5522742867f, 0.5392510295f, 0.5287556648f, 0.5207706094f,
+         0.5148820281f, 0.5106133819f, 0.5060086250f, 0.5033900142f, 0.5019095540f, 0.5010747910f,
+         0.5000000000f},
+        {0.5000000000f, 0.5010071397f, 0.5017895103f, 0.5031771064f, 0.5056321621f, 0.5099512339f,
+         0.5139572024f, 0.5194865465f, 0.5269903541f, 0.5368629098f, 0.5491278768f, 0.5582211614f,
+         0.5672890544f, 0.5752488375f, 0.5807913542f, 0.5827894807f, 0.5807913542f, 0.5752488375f,
+         0.5672890544f, 0.5582211614f, 0.5491278768f, 0.5368629694f, 0.5269903541f, 0.5194864869f,
+         0.5139572024f, 0.5099512339f, 0.5056321621f, 0.5031771660f, 0.5017895103f, 0.5010071397f,
+         0.5000000000f},
+        {0.5000000000f, 0.5009042621f, 0.5016067624f, 0.5028531551f, 0.5050591230f, 0.5089425445f,
+         0.5125473738f, 0.5175274611f, 0.5242940784f, 0.5332102180f, 0.5443075895f, 0.5525490046f,
+         0.5607786775f, 0.5680115223f, 0.5730525255f, 0.5748708248f, 0.5730525255f, 0.5680115223f,
+         0.5607786775f, 0.5525490046f, 0.5443075895f, 0.5332102180f, 0.5242940187f, 0.5175274611f,
+         0.5125473142f, 0.5089425445f, 0.5050591230f, 0.5028531551f, 0.5016067624f, 0.5009042621f,
+         0.5000000000f},
+        {0.5000000000f, 0.5006461143f, 0.5011484027f, 0.5020399094f, 0.5036193132f, 0.5064044595f,
+         0.5089951158f, 0.5125823617f, 0.5174714923f, 0.5239394307f, 0.5320289135f, 0.5380636454f,
+         0.5441119671f, 0.5494454503f, 0.5531721711f, 0.5545183420f, 0.5531721711f, 0.5494454503f,
+         0.5441119671f, 0.5380636454f, 0.5320289135f, 0.5239394307f, 0.5174714923f, 0.5125823617f,
+         0.5089950562f, 0.5064044595f, 0.5036192536f, 0.5020399094f, 0.5011484027f, 0.5006461143f,
+         0.5000000000f},
+        {0.5000000000f, 0.5003954172f, 0.5007029176f, 0.5012489557f, 0.5022173524f, 0.5039278865f,
+         0.5055221915f, 0.5077348351f, 0.5107599497f, 0.5147782564f, 0.5198295116f, 0.5236158371f,
+         0.5274258256f, 0.5307977200f, 0.5331605673f, 0.5340154171f, 0.5331605673f, 0.5307977200f,
+         0.5274258256f, 0.5236158371f, 0.5198295116f, 0.5147782564f, 0.5107599497f, 0.5077348351f,
+         0.5055221915f, 0.5039278865f, 0.5022173524f, 0.5012489557f, 0.5007029176f, 0.5003954172f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4993658364f, 0.4988718629f, 0.4979924560f, 0.4964269102f, 0.4936419725f,
+         0.4910234213f, 0.4873520732f, 0.4822612107f, 0.4753669202f, 0.4664771259f, 0.4596425593f,
+         0.4526099563f, 0.4462499917f, 0.4417140782f, 0.4400566518f, 0.4417141378f, 0.4462499917f,
+         0.4526099563f, 0.4596425593f, 0.4664771259f, 0.4753669202f, 0.4822612107f, 0.4873520732f,
+         0.4910234213f, 0.4936419725f, 0.4964269102f, 0.4979925156f, 0.4988718629f, 0.4993658364f,
+         0.5000000000f},
+        {0.5000000000f, 0.4989336729f, 0.4981023371f, 0.4966210425f, 0.4939794540f, 0.4892660379f,
+         0.4848169982f, 0.4785499275f, 0.4698013365f, 0.4578386545f, 0.4422026277f, 0.4300048649f,
+         0.4172779620f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4172779620f, 0.4300048649f, 0.4422026277f, 0.4578386545f, 0.4698013365f, 0.4785499275f,
+         0.4848169982f, 0.4892660379f, 0.4939795136f, 0.4966210425f, 0.4981023371f, 0.4989336729f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5019841790f, 0.5035227537f, 0.5062461495f, 0.5110471249f, 0.5194411278f,
+         0.5271694660f, 0.5377510190f, 0.5519614220f, 0.5704149008f, 0.5929919481f, 0.6095048785f,
+         0.6257974505f, 0.6399660110f, 0.6497628093f, 0.6532814503f, 0.6497628689f, 0.6399659514f,
+         0.6257974505f, 0.6095049381f, 0.5929919481f, 0.5704149008f, 0.5519614220f, 0.5377510190f,
+         0.5271694660f, 0.5194411278f, 0.5110471249f, 0.5062461495f, 0.5035227537f, 0.5019841790f,
+         0.5000000596f},
+        {0.5000000000f, 0.5018594265f, 0.5033015609f, 0.5058549047f, 0.5103582144f, 0.5182378888f,
+         0.5254992843f, 0.5354512334f, 0.5488330722f, 0.5662372708f, 0.5875679851f, 0.6031931639f,
+         0.6186277270f, 0.6320636272f, 0.6413608193f, 0.6447013021f, 0.6413607597f, 0.6320636272f,
+         0.6186277270f, 0.6031931639f, 0.5875679851f, 0.5662372708f, 0.5488330722f, 0.5354512334f,
+         0.5254992843f, 0.5182378888f, 0.5103582144f, 0.5058549047f, 0.5033015609f, 0.5018594265f,
+         0.5000000596f},
+        {0.5000000000f, 0.5016695857f, 0.5029649734f, 0.5052592754f, 0.5093086362f, 0.5164023638f,
+         0.5229486823f, 0.5319343805f, 0.5440405011f, 0.5598235130f, 0.5792210698f, 0.5934645534f,
+         0.6075606942f, 0.6198513508f, 0.6283662915f, 0.6314277649f, 0.6283662915f, 0.6198513508f,
+         0.6075606942f, 0.5934646130f, 0.5792211294f, 0.5598235130f, 0.5440405011f, 0.5319343805f,
+         0.5229486823f, 0.5164023638f, 0.5093086362f, 0.5052592754f, 0.5029649138f, 0.5016695857f,
+         0.5000000596f},
+        {0.5000000000f, 0.5011932850f, 0.5021198988f, 0.5037627220f, 0.5066673160f, 0.5117711425f,
+         0.5164980888f, 0.5230121613f, 0.5318337679f, 0.5434088707f, 0.5577428937f, 0.5683392882f,
+         0.5788815022f, 0.5881162286f, 0.5945363641f, 0.5968489647f, 0.5945363045f, 0.5881162286f,
+         0.5788815022f, 0.5683392882f, 0.5577428937f, 0.5434088707f, 0.5318337679f, 0.5230121613f,
+         0.5164980888f, 0.5117711425f, 0.5066673160f, 0.5037627220f, 0.5021198392f, 0.5011932850f,
+         0.5000000000f},
+        {0.5000000000f, 0.5007303953f, 0.5012979507f, 0.5023053885f, 0.5040895343f, 0.5072339177f,
+         0.5101568103f, 0.5142010450f, 0.5197073221f, 0.5269821882f, 0.5360659957f, 0.5428322554f,
+         0.5496053696f, 0.5555711985f, 0.5597361326f, 0.5612398386f, 0.5597361326f, 0.5555711985f,
+         0.5496053696f, 0.5428322554f, 0.5360659957f, 0.5269821286f, 0.5197073221f, 0.5142010450f,
+         0.5101568103f, 0.5072339773f, 0.5040895343f, 0.5023053885f, 0.5012980103f, 0.5007303953f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4988276362f, 0.4979133904f, 0.4962842464f, 0.4933774769f, 0.4881869853f,
+         0.4832829535f, 0.4763666987f, 0.4666952491f, 0.4534371495f, 0.4360439777f, 0.4224200845f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4224200845f, 0.4360440373f, 0.4534371495f, 0.4666952491f, 0.4763666987f,
+         0.4832829535f, 0.4881869853f, 0.4933775365f, 0.4962842464f, 0.4979134500f, 0.4988276362f,
+         0.5000000000f},
+        {0.5000000000f, 0.4980278611f, 0.4964878559f, 0.4937384725f, 0.4888174534f, 0.4799782038f,
+         0.4715627432f, 0.4595820010f, 0.4425892234f, 0.4187846780f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4187846780f, 0.4425892234f, 0.4595820010f,
+         0.4715627432f, 0.4799782038f, 0.4888175130f, 0.4937384725f, 0.4964878559f, 0.4980278611f,
+         0.5000000000f}},
+    {
+
+        {0.5000000000f, 0.5025908947f, 0.5045977831f, 0.5081456304f, 0.5143862367f, 0.5252569914f,
+         0.5352224708f, 0.5488042235f, 0.5669378638f, 0.5903217196f, 0.6187070012f, 0.6393297315f,
+         0.6595746279f, 0.6771045923f, 0.6891874671f, 0.6935199499f, 0.6891874671f, 0.6771046519f,
+         0.6595746279f, 0.6393297315f, 0.6187070012f, 0.5903217793f, 0.5669378638f, 0.5488042235f,
+         0.5352224708f, 0.5252569914f, 0.5143862367f, 0.5081456304f, 0.5045977831f, 0.5025908947f,
+         0.5000000596f},
+        {0.5000000000f, 0.5024280548f, 0.5043093562f, 0.5076363087f, 0.5134918094f, 0.5237017274f,
+         0.5330721736f, 0.5458583832f, 0.5629557371f, 0.5850431919f, 0.6119084954f, 0.6314600110f,
+         0.6506775022f, 0.6673357487f, 0.6788267493f, 0.6829485893f, 0.6788267493f, 0.6673356891f,
+         0.6506775618f, 0.6314600110f, 0.6119084954f, 0.5850431919f, 0.5629557967f, 0.5458583832f,
+         0.5330721736f, 0.5237017274f, 0.5134918094f, 0.5076363087f, 0.5043093562f, 0.5024280548f,
+         0.5000000596f},
+        {0.5000000000f, 0.5021802783f, 0.5038703680f, 0.5068606734f, 0.5121284127f, 0.5213274360f,
+         0.5297849178f, 0.5413471460f, 0.5568445921f, 0.5769221783f, 0.6014210582f, 0.6192988753f,
+         0.6369072795f, 0.6521973014f, 0.6627579927f, 0.6665487289f, 0.6627580523f, 0.6521973014f,
+         0.6369072795f, 0.6192988753f, 0.6014210582f, 0.5769221783f, 0.5568445921f, 0.5413471460f,
+         0.5297849178f, 0.5213274360f, 0.5121284127f, 0.5068606734f, 0.5038703680f, 0.5021802783f,
+         0.5000000596f},
+        {0.5000000000f, 0.5015584826f, 0.5027679205f, 0.5049106479f, 0.5086937547f, 0.5153259039f,
+         0.5214512348f, 0.5298667550f, 0.5412179232f, 0.5560381413f, 0.5742831826f, 0.5877002478f,
+         0.6009937525f, 0.6125962734f, 0.6206405163f, 0.6235337853f, 0.6206405163f, 0.6125962138f,
+         0.6009937525f, 0.5877002478f, 0.5742831826f, 0.5560382009f, 0.5412179232f, 0.5298667550f,
+         0.5214512944f, 0.5153258443f, 0.5086938143f, 0.5049106479f, 0.5027679205f, 0.5015585423f,
+         0.5000000596f},
+        {0.5000000000f, 0.5009540319f, 0.5016952753f, 0.5030100346f, 0.5053365231f, 0.5094310641f,
+         0.5132302642f, 0.5184766650f, 0.5256009102f, 0.5349814296f, 0.5466461182f, 0.5553017855f,
+         0.5639393926f, 0.5715261102f, 0.5768113732f, 0.5787173510f, 0.5768114328f, 0.5715261102f,
+         0.5639393926f, 0.5553017855f, 0.5466461182f, 0.5349814296f, 0.5256009102f, 0.5184766650f,
+         0.5132302642f, 0.5094310641f, 0.5053365827f, 0.5030099750f, 0.5016952157f, 0.5009540319f,
+         0.5000000000f},
+        {0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f, 0.5000000000f,
+         0.5000000000f},
+        {0.5000000000f, 0.4984676838f, 0.4972720146f, 0.4951395094f, 0.4913294315f, 0.4845078886f,
+         0.4780410528f, 0.4688831270f, 0.4559983313f, 0.4381728470f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4381728172f, 0.4559983313f, 0.4688831270f,
+         0.4780410528f, 0.4845078886f, 0.4913294315f, 0.4951395094f, 0.4972720146f, 0.4984676838f,
+         0.5000000000f},
+        {0.5000000000f, 0.4974217415f, 0.4954061210f, 0.4918029308f, 0.4853377044f, 0.4736708105f,
+         0.4624948800f, 0.4464591146f, 0.4234331250f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f,
+         0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4166666567f, 0.4234331250f, 0.4464591146f,
+         0.4624948800f, 0.4736708105f, 0.4853377044f, 0.4918029308f, 0.4954061210f, 0.4974217415f,
+         0.5000000000f}}};
 
 const WORD32 ixheaacd_atan_table_Q28[16][8][31] = {
     {
@@ -3796,1134 +4140,4147 @@
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     },
     {
-        {105414360, 104839440, 104395760, 103614856, 102251296, 99903616,
-         97777528,  94910424,  91113928,  86209256,  80075696,  75298264,
-         70016792,  64317196,  58324216,  52191708,  46086824,  40171656,
-         34586568,  29438704,  24797036,  18844526,  14076835,  10372791,
-         7563109,   5470589,   3149178,   1794887,   1017097,   574441,
-         3},
-        {105414360, 104839456, 104395808, 103614992, 102251712, 99904768,
-         97779568,  94913880,  91119464,  86217496,  80086976,  75311480,
-         70031656,  64333272,  58341012,  52208712,  46103544,  40187596,
-         34601260,  29451742,  24808156,  18852650,  14082295,  10376209,
-         7565131,   5471733,   3149591,   1795028,   1017143,   574456,
-         3},
-        {105414360, 104839480, 104395880, 103615208, 102252344, 99906552,
-         97782736,  94919288,  91128192,  86230640,  80105168,  75332944,
-         70055936,  64359672,  58368684,  52236768,  46131100,  40213788,
-         34625280,  29472930,  24826096,  18865614,  14090922,  10381562,
-         7568273,   5473501,   3150225,   1795244,   1017214,   574479,
-         3},
-        {105414360, 104839536, 104396064, 103615760, 102253976, 99911160,
-         97791048,  94933704,  91151936,  86267232,  80157136,  75395312,
-         70127632,  64438612,  58452120,  52321616,  46214224,  40292168,
-         34696284,  29534604,  24877446,  18901780,  14114422,  10395857,
-         7576530,   5478088,   3151847,   1795790,   1017394,   574537,
-         3},
-        {105414360, 104839592, 104396240, 103616296, 102255600, 99915856,
-         97799664,  94949000,  91177904,  86308736,  80218568,  75471136,
-         70217072,  64539228,  58560004,  52431916,  46321792,  40392248,
-         34785076,  29609790,  24938336,  18942938,  14140199,  10411065,
-         7585108,   5482768,   3153468,   1796330,   1017569,   574594,
-         3},
-        {105414360, 104839680, 104396520, 103617168, 102258248, 99923736,
-         97814472,  94976184,  91226104,  86390216,  80347528,  75638144,
-         70423488,  64780944,  58826448,  52707184,  46587916,  40633420,
-         34990876,  29776224,  25066838,  19024148,  14188262,  10438183,
-         7599892,   5490633,   3156118,   1797198,   1017849,   574683,
-         3},
-        {105414360, 104839824, 104396976, 103618608, 102262752, 99937728,
-         97841960,  95029816,  91329816,  86588048,  80716144,  76183448,
-         71203432,  65834132,  60122612,  54107316,  47891724,  41697008,
-         35779764,  30327720,  25439258,  19223604,  14292623,  10492064,
-         7627470,   5504663,   3160627,   1798637,   1018307,   574828,
-         3},
-        {105414360, 104839928, 104397288, 103619616, 102266008, 99948384,
-         97863952,  95076024,  91429712,  86814424,  81270904,  77262808,
-         73480384,  71228240,  75154792,  90330880,  64216388,  47491216,
-         38190000,  31457082,  26014456,  19455916,  14394385,  10538885,
-         7649673,   5515393,   3163899,   1799652,   1018625,   574928,
-         3},
+        {105414360, 104839440, 104395760, 103614856, 102251296, 99903616, 97777528, 94910424,
+         91113928,  86209256,  80075696,  75298264,  70016792,  64317196, 58324216, 52191708,
+         46086824,  40171656,  34586568,  29438704,  24797036,  18844526, 14076835, 10372791,
+         7563109,   5470589,   3149178,   1794887,   1017097,   574441,   3},
+        {105414360, 104839456, 104395808, 103614992, 102251712, 99904768, 97779568, 94913880,
+         91119464,  86217496,  80086976,  75311480,  70031656,  64333272, 58341012, 52208712,
+         46103544,  40187596,  34601260,  29451742,  24808156,  18852650, 14082295, 10376209,
+         7565131,   5471733,   3149591,   1795028,   1017143,   574456,   3},
+        {105414360, 104839480, 104395880, 103615208, 102252344, 99906552, 97782736, 94919288,
+         91128192,  86230640,  80105168,  75332944,  70055936,  64359672, 58368684, 52236768,
+         46131100,  40213788,  34625280,  29472930,  24826096,  18865614, 14090922, 10381562,
+         7568273,   5473501,   3150225,   1795244,   1017214,   574479,   3},
+        {105414360, 104839536, 104396064, 103615760, 102253976, 99911160, 97791048, 94933704,
+         91151936,  86267232,  80157136,  75395312,  70127632,  64438612, 58452120, 52321616,
+         46214224,  40292168,  34696284,  29534604,  24877446,  18901780, 14114422, 10395857,
+         7576530,   5478088,   3151847,   1795790,   1017394,   574537,   3},
+        {105414360, 104839592, 104396240, 103616296, 102255600, 99915856, 97799664, 94949000,
+         91177904,  86308736,  80218568,  75471136,  70217072,  64539228, 58560004, 52431916,
+         46321792,  40392248,  34785076,  29609790,  24938336,  18942938, 14140199, 10411065,
+         7585108,   5482768,   3153468,   1796330,   1017569,   574594,   3},
+        {105414360, 104839680, 104396520, 103617168, 102258248, 99923736, 97814472, 94976184,
+         91226104,  86390216,  80347528,  75638144,  70423488,  64780944, 58826448, 52707184,
+         46587916,  40633420,  34990876,  29776224,  25066838,  19024148, 14188262, 10438183,
+         7599892,   5490633,   3156118,   1797198,   1017849,   574683,   3},
+        {105414360, 104839824, 104396976, 103618608, 102262752, 99937728, 97841960, 95029816,
+         91329816,  86588048,  80716144,  76183448,  71203432,  65834132, 60122612, 54107316,
+         47891724,  41697008,  35779764,  30327720,  25439258,  19223604, 14292623, 10492064,
+         7627470,   5504663,   3160627,   1798637,   1018307,   574828,   3},
+        {105414360, 104839928, 104397288, 103619616, 102266008, 99948384, 97863952, 95076024,
+         91429712,  86814424,  81270904,  77262808,  73480384,  71228240, 75154792, 90330880,
+         64216388,  47491216,  38190000,  31457082,  26014456,  19455916, 14394385, 10538885,
+         7649673,   5515393,   3163899,   1799652,   1018625,   574928,   3},
     },
     {
-        {210828704, 209763824, 208938560, 207478752, 204908032, 200419760,
-         196290896, 190633616, 183000672, 172937648, 160110704, 149997200,
-         138756608, 126624216, 113938336, 101099072, 88510592,  76526288,
-         65413280,  55341428,  46391316,  35074004,  26116856,  19208962,
-         13991278,  10114556,  5820107,   3316738,   1879389,   1061436,
-         6},
-        {210828704, 209763936, 208938896, 207479776, 204911072, 200428368,
-         196306384, 190660432, 183044720, 173005232, 160205968, 150110720,
-         138885968, 126765280, 114085952, 101247824, 88655264,  76662112,
-         65536160,  55448352,  46480712,  35137556,  26158596,  19234612,
-         14006231,  10122925,  5823092,   3317749,   1879722,   1061544,
-         6},
-        {210828704, 209764096, 208939392, 207481328, 204915728, 200441616,
-         196330368, 190702240, 183113968, 173112496, 160358752, 150294096,
-         139096288, 126995848, 114328120, 101492232, 88892824,  76884520,
-         65736460,  55621620,  46624620,  35238800,  26224436,  19274734,
-         14029455,  10135852,  5827674,   3319296,   1880230,   1061707,
-         6},
-        {210828704, 209764512, 208940688, 207485280, 204927584, 200475808,
-         196392960, 190812912, 183300576, 173407904, 160790096, 150820544,
-         139709584, 127677032, 115050024, 102223720, 89602656,  77544544,
-         66324264,  56122904,  47034384,  35520108,  26403298,  19381644,
-         14090386,  10169363,  5839388,   3323218,   1881511,   1062120,
-         6},
-        {210828704, 209764912, 208941952, 207489168, 204939376, 200510416,
-         196457296, 190929072, 183501872, 173737520, 161290464, 151447920,
-         140459456, 128528208, 115965984, 103158064, 90506880,  78375576,
-         67050572,  56727860,  47516240,  35838300,  26598646,  19495050,
-         14153544,  10203491,  5851081,   3327087,   1882766,   1062523,
-         6},
-        {210828704, 209765552, 208943952, 207495408, 204958528, 200567968,
-         196566624, 191132320, 183868128, 174368352, 162309120, 152784192,
-         142129632, 130500344, 118149712, 105414360, 92679000,  80328360,
-         68699080,  58044528,  48519584,  36460364,  26960592,  19696396,
-         14262089,  10260740,  5870181,   3333310,   1884767,   1063161,
-         6},
-        {210828704, 209766592, 208947200, 207505680, 204990800, 200668800,
-         196765424, 191522096, 184625504, 175818192, 165011728, 156772288,
-         147807440, 138128784, 127521456, 115591336, 102270680, 88260824,
-         74642472,  62217964,  51336324,  37958764,  27737034,  20093352,
-         14463533,  10362519,  5902623,   3343611,   1888032,   1064195,
-         6},
-        {210828704, 209767296, 208949456, 207512880, 205013952, 200744336,
-         196920864, 191846656, 185318832, 177353312, 168608176, 163416640,
-         160727504, 165029712, 189073968, 241456736, 178005808, 122049624,
-         90479408,  70104040,  55475472,  39658732,  28482874,  20435210,
-         14624799,  10440064,  5926123,   3350871,   1890298,   1064906,
-         6},
+        {210828704, 209763824, 208938560, 207478752, 204908032, 200419760, 196290896, 190633616,
+         183000672, 172937648, 160110704, 149997200, 138756608, 126624216, 113938336, 101099072,
+         88510592,  76526288,  65413280,  55341428,  46391316,  35074004,  26116856,  19208962,
+         13991278,  10114556,  5820107,   3316738,   1879389,   1061436,   6},
+        {210828704, 209763936, 208938896, 207479776, 204911072, 200428368, 196306384, 190660432,
+         183044720, 173005232, 160205968, 150110720, 138885968, 126765280, 114085952, 101247824,
+         88655264,  76662112,  65536160,  55448352,  46480712,  35137556,  26158596,  19234612,
+         14006231,  10122925,  5823092,   3317749,   1879722,   1061544,   6},
+        {210828704, 209764096, 208939392, 207481328, 204915728, 200441616, 196330368, 190702240,
+         183113968, 173112496, 160358752, 150294096, 139096288, 126995848, 114328120, 101492232,
+         88892824,  76884520,  65736460,  55621620,  46624620,  35238800,  26224436,  19274734,
+         14029455,  10135852,  5827674,   3319296,   1880230,   1061707,   6},
+        {210828704, 209764512, 208940688, 207485280, 204927584, 200475808, 196392960, 190812912,
+         183300576, 173407904, 160790096, 150820544, 139709584, 127677032, 115050024, 102223720,
+         89602656,  77544544,  66324264,  56122904,  47034384,  35520108,  26403298,  19381644,
+         14090386,  10169363,  5839388,   3323218,   1881511,   1062120,   6},
+        {210828704, 209764912, 208941952, 207489168, 204939376, 200510416, 196457296, 190929072,
+         183501872, 173737520, 161290464, 151447920, 140459456, 128528208, 115965984, 103158064,
+         90506880,  78375576,  67050572,  56727860,  47516240,  35838300,  26598646,  19495050,
+         14153544,  10203491,  5851081,   3327087,   1882766,   1062523,   6},
+        {210828704, 209765552, 208943952, 207495408, 204958528, 200567968, 196566624, 191132320,
+         183868128, 174368352, 162309120, 152784192, 142129632, 130500344, 118149712, 105414360,
+         92679000,  80328360,  68699080,  58044528,  48519584,  36460364,  26960592,  19696396,
+         14262089,  10260740,  5870181,   3333310,   1884767,   1063161,   6},
+        {210828704, 209766592, 208947200, 207505680, 204990800, 200668800, 196765424, 191522096,
+         184625504, 175818192, 165011728, 156772288, 147807440, 138128784, 127521456, 115591336,
+         102270680, 88260824,  74642472,  62217964,  51336324,  37958764,  27737034,  20093352,
+         14463533,  10362519,  5902623,   3343611,   1888032,   1064195,   6},
+        {210828704, 209767296, 208949456, 207512880, 205013952, 200744336, 196920864, 191846656,
+         185318832, 177353312, 168608176, 163416640, 160727504, 165029712, 189073968, 241456736,
+         178005808, 122049624, 90479408,  70104040,  55475472,  39658732,  28482874,  20435210,
+         14624799,  10440064,  5926123,   3350871,   1890298,   1064906,   6},
     },
     {
-        {316243072, 314846656, 313757568, 311816384, 308352896, 302171040,
-         296337664, 288127488, 276678912, 261007920, 240267568, 223492192,
-         204621200, 184231600, 163158624, 142328864, 122556352, 104403376,
-         88154704,  73876200,  61498028,  46182704,  34260640,  25149108,
-         18299352,  13222145,  7605578,   4333750,   2455581,   1386840,
-         8},
-        {316243072, 314846976, 313758496, 311819264, 308361632, 302196576,
-         296384960, 288212480, 276825088, 261244544, 240620416, 223927248,
-         205130368, 184795488, 163749776, 142917424, 123115312, 104911608,
-         88598136,  74247992,  61798064,  46386176,  34389240,  25225820,
-         18343072,  13246210,  7614005,   4336575,   2456504,   1387138,
-         8},
-        {316243072, 314847424, 313759936, 311823680, 308374976, 302235808,
-         296457920, 288344224, 277053216, 261616816, 241180800, 224622832,
-         205949680, 185708032, 164710624, 143876432, 124026392, 105738528,
-         89317024,  74847744,  62279204,  46709404,  34591704,  25345632,
-         18410910,  13283357,  7626934,   4340894,   2457913,   1387591,
-         8},
-        {316243072, 314848576, 313763520, 311834784, 308408896, 302336352,
-         296646528, 288688608, 277658208, 262622336, 242727504, 226572640,
-         208281664, 188341088, 167512304, 146689696, 126701240, 108155720,
-         91400008,  76564704,  63637504,  47602004,  35139296,  25663918,
-         18588502,  13379501,  7659962,   4351840,   2461468,   1388732,
-         8},
-        {316243072, 314849696, 313767008, 311845696, 308442400, 302437088,
-         296837792, 289043680, 278295680, 263711664, 244460352, 228811376,
-         211025776, 191509408, 170942688, 150169152, 130013904, 111127336,
-         93923424,  78603792,  65214388,  48602512,  35733560,  26000040,
-         18772012,  13477197,  7692890,   4362631,   2464949,   1389845,
-         8},
-        {316243072, 314851456, 313772576, 311863104, 308496480, 302602432,
-         297156960, 289649728, 279417792, 265709120, 247806384, 233308320,
-         216768720, 198401536, 178640624, 158121536, 137602432, 117841520,
-         99474352,  82934752,  68436688,  50533952,  36825288,  26593334,
-         19086120,  13640627,  7746590,   4379971,   2470496,   1391611,
-         8},
-        {316243072, 314854304, 313781600, 311891584, 308586432, 302885824,
-         297719616, 290762432, 281600928, 269929056, 255733744, 245043360,
-         233506176, 220942800, 206510464, 188780448, 167001392, 142516720,
-         118085768, 95972968,  77157136,  55082256,  39133424,  27751766,
-         19665234,  13929855,  7837575,   4408639,   2479541,   1394467,
-         8},
-        {316243072, 314856256, 313787808, 311911392, 308650144, 303093152,
-         298144768, 291644096, 283459968, 273946560, 264748512, 260980608,
-         262699168, 277087168, 321151200, 394123840, 324055360, 228764272,
-         162653280, 119096696, 89459480,  60122168,  41317836,  28739580,
-         20125738,  14149189,  7903307,   4428811,   2485814,   1396432,
-         8},
+        {316243072, 314846656, 313757568, 311816384, 308352896, 302171040, 296337664, 288127488,
+         276678912, 261007920, 240267568, 223492192, 204621200, 184231600, 163158624, 142328864,
+         122556352, 104403376, 88154704,  73876200,  61498028,  46182704,  34260640,  25149108,
+         18299352,  13222145,  7605578,   4333750,   2455581,   1386840,   8},
+        {316243072, 314846976, 313758496, 311819264, 308361632, 302196576, 296384960, 288212480,
+         276825088, 261244544, 240620416, 223927248, 205130368, 184795488, 163749776, 142917424,
+         123115312, 104911608, 88598136,  74247992,  61798064,  46386176,  34389240,  25225820,
+         18343072,  13246210,  7614005,   4336575,   2456504,   1387138,   8},
+        {316243072, 314847424, 313759936, 311823680, 308374976, 302235808, 296457920, 288344224,
+         277053216, 261616816, 241180800, 224622832, 205949680, 185708032, 164710624, 143876432,
+         124026392, 105738528, 89317024,  74847744,  62279204,  46709404,  34591704,  25345632,
+         18410910,  13283357,  7626934,   4340894,   2457913,   1387591,   8},
+        {316243072, 314848576, 313763520, 311834784, 308408896, 302336352, 296646528, 288688608,
+         277658208, 262622336, 242727504, 226572640, 208281664, 188341088, 167512304, 146689696,
+         126701240, 108155720, 91400008,  76564704,  63637504,  47602004,  35139296,  25663918,
+         18588502,  13379501,  7659962,   4351840,   2461468,   1388732,   8},
+        {316243072, 314849696, 313767008, 311845696, 308442400, 302437088, 296837792, 289043680,
+         278295680, 263711664, 244460352, 228811376, 211025776, 191509408, 170942688, 150169152,
+         130013904, 111127336, 93923424,  78603792,  65214388,  48602512,  35733560,  26000040,
+         18772012,  13477197,  7692890,   4362631,   2464949,   1389845,   8},
+        {316243072, 314851456, 313772576, 311863104, 308496480, 302602432, 297156960, 289649728,
+         279417792, 265709120, 247806384, 233308320, 216768720, 198401536, 178640624, 158121536,
+         137602432, 117841520, 99474352,  82934752,  68436688,  50533952,  36825288,  26593334,
+         19086120,  13640627,  7746590,   4379971,   2470496,   1391611,   8},
+        {316243072, 314854304, 313781600, 311891584, 308586432, 302885824, 297719616, 290762432,
+         281600928, 269929056, 255733744, 245043360, 233506176, 220942800, 206510464, 188780448,
+         167001392, 142516720, 118085768, 95972968,  77157136,  55082256,  39133424,  27751766,
+         19665234,  13929855,  7837575,   4408639,   2479541,   1394467,   8},
+        {316243072, 314856256, 313787808, 311911392, 308650144, 303093152, 298144768, 291644096,
+         283459968, 273946560, 264748512, 260980608, 262699168, 277087168, 321151200, 394123840,
+         324055360, 228764272, 162653280, 119096696, 89459480,  60122168,  41317836,  28739580,
+         20125738,  14149189,  7903307,   4428811,   2485814,   1396432,   8},
     },
     {
-        {421657440, 420139488, 418946528, 416800672, 412909824, 405768000,
-         398798528, 388615200, 373701408, 352009344, 321306208, 295197120,
-         265052208, 232374288, 199428848, 168474672, 140988912, 117445760,
-         97614400,  80976864,  67001780,  50094056,  37102532,  27221784,
-         19805402,  14310412,  8231902,   4690748,   2657888,   1501102,
-         8},
-        {421657440, 420140000, 418948192, 416805888, 412925952, 405817184,
-         398893152, 388794176, 374031200, 352591488, 322263552, 296453088,
-         266595344, 234127472, 201261264, 170245184, 142589072, 118816240,
-         98738176,  81865128,  67681552,  50525452,  37361620,  27370528,
-         19887816,  14354855,  8247121,   4695786,   2659523,   1501627,
-         8},
-        {421657440, 420140832, 418950752, 416813824, 412950592, 405892416,
-         399038240, 389069504, 374540352, 353494496, 323757792, 298423616,
-         269031008, 236912448, 204189776, 173088128, 145165408, 121023688,
-         100545224, 83288680,  68766080,  51208348,  37768500,  27602440,
-         20015536,  14423394,  8270460,   4703485,   2662016,   1502426,
-         8},
-        {421657440, 420142848, 418957120, 416833824, 413012864, 406083584,
-         399408640, 389776736, 375859200, 355859264, 327727040, 303720672,
-         275669600, 244617728, 212408608, 181157024, 152524352, 127334264,
-         105689200, 87307640,  71794608,  53080056,  38863244,  28216278,
-         20349054,  14600477,  8330018,   4722985,   2668305,   1504437,
-         8},
-        {421657440, 420144832, 418963328, 416853376, 413073952, 406272672,
-         399777696, 390488160, 377202752, 358308992, 331931552, 309437728,
-         282992896, 253322832, 221909888, 190657120, 161278448, 134848896,
-         111768392, 91990440,  75259304,  55157184,  40043144,  28861386,
-         20692490,  14779977,  8389313,   4742194,   2674461,   1506398,
-         8},
-        {421657440, 420147936, 418973184, 416884416, 413171584, 406578080,
-         400379520, 391663936, 379464224, 362537056, 339441728, 319954336,
-         296943136, 270562688, 241463968, 210828720, 180193472, 151094752,
-         124714296, 101703104, 82215704,  59120396,  42193204,  29993510,
-         21277910,  15079353,  8485847,   4773030,   2684265,   1509508,
-         8},
-        {421657440, 420152960, 418989056, 416934784, 413331648, 407087776,
-         401401312, 393709888, 383542496, 370571008, 354857280, 343114528,
-         330489120, 316523552, 299496928, 276320320, 244582704, 205903744,
-         165901392, 130010112, 100638336, 68322528,  46691836,  32186576,
-         22350768,  15606794,  8648967,   4823931,   2700238,   1514536,
-         8},
-        {421657440, 420156384, 418999936, 416969536, 413443296, 407450528,
-         402143200, 395241024, 386740992, 377366336, 369662080, 368527968,
-         375197056, 397609792, 449444704, 516205376, 465462368, 362087840,
-         258438672, 179525856, 126554704, 78481920,  50925604,  34045784,
-         23199528,  16005132,  8766508,   4859691,   2711304,   1517993,
-         8},
+        {421657440, 420139488, 418946528, 416800672, 412909824, 405768000, 398798528, 388615200,
+         373701408, 352009344, 321306208, 295197120, 265052208, 232374288, 199428848, 168474672,
+         140988912, 117445760, 97614400,  80976864,  67001780,  50094056,  37102532,  27221784,
+         19805402,  14310412,  8231902,   4690748,   2657888,   1501102,   8},
+        {421657440, 420140000, 418948192, 416805888, 412925952, 405817184, 398893152, 388794176,
+         374031200, 352591488, 322263552, 296453088, 266595344, 234127472, 201261264, 170245184,
+         142589072, 118816240, 98738176,  81865128,  67681552,  50525452,  37361620,  27370528,
+         19887816,  14354855,  8247121,   4695786,   2659523,   1501627,   8},
+        {421657440, 420140832, 418950752, 416813824, 412950592, 405892416, 399038240, 389069504,
+         374540352, 353494496, 323757792, 298423616, 269031008, 236912448, 204189776, 173088128,
+         145165408, 121023688, 100545224, 83288680,  68766080,  51208348,  37768500,  27602440,
+         20015536,  14423394,  8270460,   4703485,   2662016,   1502426,   8},
+        {421657440, 420142848, 418957120, 416833824, 413012864, 406083584, 399408640, 389776736,
+         375859200, 355859264, 327727040, 303720672, 275669600, 244617728, 212408608, 181157024,
+         152524352, 127334264, 105689200, 87307640,  71794608,  53080056,  38863244,  28216278,
+         20349054,  14600477,  8330018,   4722985,   2668305,   1504437,   8},
+        {421657440, 420144832, 418963328, 416853376, 413073952, 406272672, 399777696, 390488160,
+         377202752, 358308992, 331931552, 309437728, 282992896, 253322832, 221909888, 190657120,
+         161278448, 134848896, 111768392, 91990440,  75259304,  55157184,  40043144,  28861386,
+         20692490,  14779977,  8389313,   4742194,   2674461,   1506398,   8},
+        {421657440, 420147936, 418973184, 416884416, 413171584, 406578080, 400379520, 391663936,
+         379464224, 362537056, 339441728, 319954336, 296943136, 270562688, 241463968, 210828720,
+         180193472, 151094752, 124714296, 101703104, 82215704,  59120396,  42193204,  29993510,
+         21277910,  15079353,  8485847,   4773030,   2684265,   1509508,   8},
+        {421657440, 420152960, 418989056, 416934784, 413331648, 407087776, 401401312, 393709888,
+         383542496, 370571008, 354857280, 343114528, 330489120, 316523552, 299496928, 276320320,
+         244582704, 205903744, 165901392, 130010112, 100638336, 68322528,  46691836,  32186576,
+         22350768,  15606794,  8648967,   4823931,   2700238,   1514536,   8},
+        {421657440, 420156384, 418999936, 416969536, 413443296, 407450528, 402143200, 395241024,
+         386740992, 377366336, 369662080, 368527968, 375197056, 397609792, 449444704, 516205376,
+         465462368, 362087840, 258438672, 179525856, 126554704, 78481920,  50925604,  34045784,
+         23199528,  16005132,  8766508,   4859691,   2711304,   1517993,   8},
     },
     {
-        {527071776, 525663296, 524547840, 522522432, 518787424, 511719680,
-         504553280, 493592128, 476455264, 449151072, 405692192, 364814688,
-         314764480, 260204640, 208654512, 165799504, 132838864, 107993088,
-         88864512,  73593016,  61016300,  45833920,  34080076,  25068088,
-         18265786,  13208915,  7602957,   4333255,   2455490,   1386823,
-         8},
-        {527071776, 525663968, 524550016, 522529280, 518809216, 511789088,
-         504692864, 493873536, 477023936, 450294176, 407912896, 368083040,
-         319153344, 265360480, 213877824, 170466944, 136659360, 110950480,
-         91074048,  75204000,  62168492,  46509388,  34462976,  25278940,
-         18379172,  13268763,  7622987,   4339800,   2457598,   1387497,
-         8},
-        {527071776, 525665024, 524553312, 522539712, 518842368, 511894848,
-         504905440, 494302048, 477888864, 452029248, 411276832, 373037344,
-         325837408, 273286560, 222000448, 177798416, 142702912, 115647968,
-         94588960,  77764896,  63995604,  47574420,  35062716,  25607106,
-         18554672,  13360983,  7653688,   4349799,   2460814,   1388524,
-         8},
-        {527071776, 525667616, 524561568, 522565952, 518925728, 512160800,
-         505440320, 495379776, 480060704, 456371808, 419671424, 385428736,
-         342733856, 293748832, 243537984, 197712496, 159394864, 128736152,
-         104401184, 84889304,  69041664,  50472228,  36668388,  26472714,
-         19011836,  13598833,  7731958,   4375112,   2468920,   1391105,
-         8},
-        {527071776, 525670144, 524569600, 522591456, 519006944, 512420320,
-         505962656, 496432544, 482180128, 460599008, 427832576, 397536000,
-         359516736, 314728096, 266563520, 219861040, 178476000, 143891040,
-         115765904, 93067576,  74749312,  53662744,  38389064,  27378586,
-         19481140,  13839382,  7809780,   4400025,   2476852,   1393623,
-         8},
-        {527071776, 525674176, 524582304, 522631776, 519135520, 512832256,
-         506793344, 498109984, 485562304, 467353856, 440933088, 417176416,
-         387412832, 351185728, 309140992, 263535888, 217930800, 175886048,
-         139658944, 109895352, 86138704,  59717932,  41509480,  28961788,
-         20278430,  14239528,  7936269,   4439982,   2489476,   1397613,
-         8},
-        {527071776, 525680576, 524602688, 522696672, 519343104, 513501216,
-         508149376, 500867616, 491177920, 478742400, 463639360, 452372192,
-         440252448, 426573952, 408733792, 381475072, 338855168, 280525408,
-         216504432, 159999104, 116811992, 73859864,  48033652,  32018526,
-         21734042,  14942109,  8149504,   4505844,   2510026,   1404063,
-         8},
-        {527071776, 525684960, 524616608, 522741088, 519485728, 513964384,
-         509095872, 502817408, 495235360, 487294368, 481973920, 483250624,
-         492921600, 517327296, 563364480, 613069184, 582305664, 502086528,
-         381071808, 253160960, 162730896, 89940184,  54233516,  34613092,
-         22883530,  15471362,  8302829,   4552048,   2524252,   1408495,
-         8},
+        {527071776, 525663296, 524547840, 522522432, 518787424, 511719680, 504553280, 493592128,
+         476455264, 449151072, 405692192, 364814688, 314764480, 260204640, 208654512, 165799504,
+         132838864, 107993088, 88864512,  73593016,  61016300,  45833920,  34080076,  25068088,
+         18265786,  13208915,  7602957,   4333255,   2455490,   1386823,   8},
+        {527071776, 525663968, 524550016, 522529280, 518809216, 511789088, 504692864, 493873536,
+         477023936, 450294176, 407912896, 368083040, 319153344, 265360480, 213877824, 170466944,
+         136659360, 110950480, 91074048,  75204000,  62168492,  46509388,  34462976,  25278940,
+         18379172,  13268763,  7622987,   4339800,   2457598,   1387497,   8},
+        {527071776, 525665024, 524553312, 522539712, 518842368, 511894848, 504905440, 494302048,
+         477888864, 452029248, 411276832, 373037344, 325837408, 273286560, 222000448, 177798416,
+         142702912, 115647968, 94588960,  77764896,  63995604,  47574420,  35062716,  25607106,
+         18554672,  13360983,  7653688,   4349799,   2460814,   1388524,   8},
+        {527071776, 525667616, 524561568, 522565952, 518925728, 512160800, 505440320, 495379776,
+         480060704, 456371808, 419671424, 385428736, 342733856, 293748832, 243537984, 197712496,
+         159394864, 128736152, 104401184, 84889304,  69041664,  50472228,  36668388,  26472714,
+         19011836,  13598833,  7731958,   4375112,   2468920,   1391105,   8},
+        {527071776, 525670144, 524569600, 522591456, 519006944, 512420320, 505962656, 496432544,
+         482180128, 460599008, 427832576, 397536000, 359516736, 314728096, 266563520, 219861040,
+         178476000, 143891040, 115765904, 93067576,  74749312,  53662744,  38389064,  27378586,
+         19481140,  13839382,  7809780,   4400025,   2476852,   1393623,   8},
+        {527071776, 525674176, 524582304, 522631776, 519135520, 512832256, 506793344, 498109984,
+         485562304, 467353856, 440933088, 417176416, 387412832, 351185728, 309140992, 263535888,
+         217930800, 175886048, 139658944, 109895352, 86138704,  59717932,  41509480,  28961788,
+         20278430,  14239528,  7936269,   4439982,   2489476,   1397613,   8},
+        {527071776, 525680576, 524602688, 522696672, 519343104, 513501216, 508149376, 500867616,
+         491177920, 478742400, 463639360, 452372192, 440252448, 426573952, 408733792, 381475072,
+         338855168, 280525408, 216504432, 159999104, 116811992, 73859864,  48033652,  32018526,
+         21734042,  14942109,  8149504,   4505844,   2510026,   1404063,   8},
+        {527071776, 525684960, 524616608, 522741088, 519485728, 513964384, 509095872, 502817408,
+         495235360, 487294368, 481973920, 483250624, 492921600, 517327296, 563364480, 613069184,
+         582305664, 502086528, 381071808, 253160960, 162730896, 89940184,  54233516,  34613092,
+         22883530,  15471362,  8302829,   4552048,   2524252,   1408495,   8},
     },
     {
-        {632486144, 631404160, 630541632, 628962560, 626006848, 620254784,
-         614202752, 604493888, 588124864, 558622016, 501272640, 434361248,
-         339721664, 238866928, 162754096, 116484152, 89986864,  73763176,
-         62238744,  52877240,  44742032,  34289616,  25778564,  19071620,
-         13937721,  10094245,  5816231,   3316020,   1879259,   1061412,
-         6},
-        {632486144, 631404800, 630543680, 628969216, 626028480, 620326592,
-         614353408, 604818816, 588856448, 560378560, 505802368, 442767520,
-         353024832, 254136256, 175962480, 126430968, 96994048,  78520456,
-         65419852,  54997780,  46155356,  35055980,  26190098,  19289814,
-         14051970,  10153425,  5835647,   3322294,   1881268,   1062052,
-         6},
-        {632486144, 631405824, 630546880, 628979392, 626061312, 620435456,
-         614581376, 605308288, 589949440, 562964736, 512317856, 454700768,
-         372074880, 276762944, 196044128, 141682288, 107802384, 85920168,
-         70405200,  58335116,  48381672,  36259776,  26833198,  19628898,
-         14228628,  10244553,  5865397,   3331877,   1884330,   1063026,
-         6},
-        {632486144, 631408256, 630554752, 629004736, 626143360, 620706752,
-         615146880, 606512512, 592597440, 569059456, 527028256, 480971968,
-         414517856, 330765376, 247566576, 182256848, 137009328, 106116024,
-         84093808,  67506720,  54475932,  39516588,  28548308,  20520860,
-         14687895,  10479249,  5941177,   3356125,   1892049,   1065476,
-         6},
-        {632486144, 631410688, 630562432, 629029312, 626222784, 620968128,
-         615688640, 607654336, 595061824, 574547584, 539620928, 502759456,
-         449954304, 379751840, 300289600, 227398144, 170699200, 129631024,
-         99970280,  78022152,  61351280,  43090368,  30380256,  21451668,
-         15158278,  10716186,  6016439,   3379975,   1899599,   1067865,
-         6},
-        {632486144, 631414464, 630574528, 629067968, 626347520, 621376512,
-         616530368, 609410496, 598784192, 582583360, 557211968, 532248416,
-         497725888, 450454656, 388712384, 316243072, 243773744, 182031456,
-         134760256, 100237736, 75274184,  49902756,  33701968,  23075620,
-         15955780,  11109605,  6138617,   3418196,   1911610,   1071650,
-         6},
-        {632486144, 631420544, 630593856, 629129728, 626546304, 622024256,
-         617857472, 612152256, 604500352, 594592960, 582468992, 573393728,
-         563597248, 552304000, 536529024, 509232736, 458470464, 373144992,
-         265980880, 175277520, 115809552, 66314040,  40717416,  26216598,
-         17410064,  11799018,  6344228,   3481124,   1931149,   1077765,
-         6},
-        {632486144, 631424704, 630607040, 629171712, 626681152, 622462336,
-         618753152, 613998592, 608344384, 602686208, 599701056, 602055040,
-         611306560, 631195136, 663846400, 695665664, 678745600, 629219584,
-         527619200, 345921568, 187985760, 86310936,  47549656,  28903180,
-         18560056,  12317920,  6491857,   3525223,   1944665,   1081966,
-         6},
+        {632486144, 631404160, 630541632, 628962560, 626006848, 620254784, 614202752, 604493888,
+         588124864, 558622016, 501272640, 434361248, 339721664, 238866928, 162754096, 116484152,
+         89986864,  73763176,  62238744,  52877240,  44742032,  34289616,  25778564,  19071620,
+         13937721,  10094245,  5816231,   3316020,   1879259,   1061412,   6},
+        {632486144, 631404800, 630543680, 628969216, 626028480, 620326592, 614353408, 604818816,
+         588856448, 560378560, 505802368, 442767520, 353024832, 254136256, 175962480, 126430968,
+         96994048,  78520456,  65419852,  54997780,  46155356,  35055980,  26190098,  19289814,
+         14051970,  10153425,  5835647,   3322294,   1881268,   1062052,   6},
+        {632486144, 631405824, 630546880, 628979392, 626061312, 620435456, 614581376, 605308288,
+         589949440, 562964736, 512317856, 454700768, 372074880, 276762944, 196044128, 141682288,
+         107802384, 85920168,  70405200,  58335116,  48381672,  36259776,  26833198,  19628898,
+         14228628,  10244553,  5865397,   3331877,   1884330,   1063026,   6},
+        {632486144, 631408256, 630554752, 629004736, 626143360, 620706752, 615146880, 606512512,
+         592597440, 569059456, 527028256, 480971968, 414517856, 330765376, 247566576, 182256848,
+         137009328, 106116024, 84093808,  67506720,  54475932,  39516588,  28548308,  20520860,
+         14687895,  10479249,  5941177,   3356125,   1892049,   1065476,   6},
+        {632486144, 631410688, 630562432, 629029312, 626222784, 620968128, 615688640, 607654336,
+         595061824, 574547584, 539620928, 502759456, 449954304, 379751840, 300289600, 227398144,
+         170699200, 129631024, 99970280,  78022152,  61351280,  43090368,  30380256,  21451668,
+         15158278,  10716186,  6016439,   3379975,   1899599,   1067865,   6},
+        {632486144, 631414464, 630574528, 629067968, 626347520, 621376512, 616530368, 609410496,
+         598784192, 582583360, 557211968, 532248416, 497725888, 450454656, 388712384, 316243072,
+         243773744, 182031456, 134760256, 100237736, 75274184,  49902756,  33701968,  23075620,
+         15955780,  11109605,  6138617,   3418196,   1911610,   1071650,   6},
+        {632486144, 631420544, 630593856, 629129728, 626546304, 622024256, 617857472, 612152256,
+         604500352, 594592960, 582468992, 573393728, 563597248, 552304000, 536529024, 509232736,
+         458470464, 373144992, 265980880, 175277520, 115809552, 66314040,  40717416,  26216598,
+         17410064,  11799018,  6344228,   3481124,   1931149,   1077765,   6},
+        {632486144, 631424704, 630607040, 629171712, 626681152, 622462336, 618753152, 613998592,
+         608344384, 602686208, 599701056, 602055040, 611306560, 631195136, 663846400, 695665664,
+         678745600, 629219584, 527619200, 345921568, 187985760, 86310936,  47549656,  28903180,
+         18560056,  12317920,  6491857,   3525223,   1944665,   1081966,   6},
     },
     {
-        {737900480, 737313472, 736843456, 735978112, 734341632, 731092416,
-         727578432, 721723200, 711172416, 689515200, 632898368, 524671456,
-         291627872, 124282568, 61909856,  39166204,  32726406,  30782714,
-         28778620,  26053694,  22893106,  18076024,  13777827,  10259417,
-         7520912,   5455094,   3146319,   1794368,   1017003,   574424,
-         3},
-        {737900480, 737313856, 736844736, 735982272, 734355200, 731139072,
-         727679616, 721953472, 711743296, 691176960, 639550656, 546400448,
-         337176160, 153194576, 79696616,  51414392,  40409976,  35288896,
-         31462072,  27703048,  23931236,  18606918,  14052068,  10401011,
-         7593699,   5492314,   3158367,   1798231,   1018235,   574816,
-         3},
-        {737900480, 737314496, 736846656, 735988544, 734375872, 731209600,
-         727831808, 722297216, 712582592, 693540736, 648325568, 572924864,
-         400936960, 201170544, 106893592, 68502096,  51196844,  41932300,
-         35558792,  30265664,  25555562,  19438326,  14479913,  10620826,
-         7706165,   5549599,   3176820,   1804132,   1020113,   575412,
-         3},
-        {737900480, 737315968, 736851520, 736004224, 734427392, 731384128,
-         728205504, 723128192, 714552448, 698767168, 665389440, 617851520,
-         518249088, 341071744, 189979888, 115866720, 79793448,  59627348,
-         46625756,  37240340,  29975502,  21679968,  15618320,  11198082,
-         7998192,   5697000,   3223802,   1819057,   1024845,   576910,
-         3},
-        {737900480, 737317504, 736856256, 736019456, 734476992, 731550720,
-         728558400, 723898048, 716313280, 703122688, 677714048, 645514624,
-         585425152, 469729280, 304799264, 181937120, 116903752, 81417144,
-         59804904,  45335940,  34988372,  24141316,  16833072,  11799646,
-         8296896,   5845648,   3270431,   1833731,   1029473,   578371,
-         3},
-        {737900480, 737319808, 736863680, 736043264, 734554432, 731808256,
-         729097600, 725051328, 718858688, 709018048, 692447360, 674422272,
-         645810304, 597029312, 509281120, 368950240, 228619376, 140871152,
-         92090184,  63478204,  45453116,  28882404,  19041826,  12849181,
-         8802888,   6092218,   3346065,   1857236,   1036832,   580686,
-         3},
-        {737900480, 737323520, 736875456, 736081088, 734676800, 732210048,
-         729927424, 726786624, 722546496, 717012160, 710183424, 705045120,
-         699473920, 692939328, 683288384, 664622720, 621866048, 513176832,
-         298800288, 144682432, 80228568,  40814640,  23774754,  14887523,
-         9725975,   6523960,   3473221,   1895906,   1048798,   584424,
-         3},
-        {737900480, 737326016, 736883520, 736106688, 734759040, 732477632,
-         730474944, 727916992, 724904832, 721986304, 720753536, 722497344,
-         728061952, 739005568, 755619392, 771010688, 763544704, 740635136,
-         685348544, 485060256, 169322848, 56755684,  28517764,  16647276,
-         10457803,  6848975,   3564451,   1922987,   1057072,   586991,
-         3},
+        {737900480, 737313472, 736843456, 735978112, 734341632, 731092416, 727578432, 721723200,
+         711172416, 689515200, 632898368, 524671456, 291627872, 124282568, 61909856,  39166204,
+         32726406,  30782714,  28778620,  26053694,  22893106,  18076024,  13777827,  10259417,
+         7520912,   5455094,   3146319,   1794368,   1017003,   574424,    3},
+        {737900480, 737313856, 736844736, 735982272, 734355200, 731139072, 727679616, 721953472,
+         711743296, 691176960, 639550656, 546400448, 337176160, 153194576, 79696616,  51414392,
+         40409976,  35288896,  31462072,  27703048,  23931236,  18606918,  14052068,  10401011,
+         7593699,   5492314,   3158367,   1798231,   1018235,   574816,    3},
+        {737900480, 737314496, 736846656, 735988544, 734375872, 731209600, 727831808, 722297216,
+         712582592, 693540736, 648325568, 572924864, 400936960, 201170544, 106893592, 68502096,
+         51196844,  41932300,  35558792,  30265664,  25555562,  19438326,  14479913,  10620826,
+         7706165,   5549599,   3176820,   1804132,   1020113,   575412,    3},
+        {737900480, 737315968, 736851520, 736004224, 734427392, 731384128, 728205504, 723128192,
+         714552448, 698767168, 665389440, 617851520, 518249088, 341071744, 189979888, 115866720,
+         79793448,  59627348,  46625756,  37240340,  29975502,  21679968,  15618320,  11198082,
+         7998192,   5697000,   3223802,   1819057,   1024845,   576910,    3},
+        {737900480, 737317504, 736856256, 736019456, 734476992, 731550720, 728558400, 723898048,
+         716313280, 703122688, 677714048, 645514624, 585425152, 469729280, 304799264, 181937120,
+         116903752, 81417144,  59804904,  45335940,  34988372,  24141316,  16833072,  11799646,
+         8296896,   5845648,   3270431,   1833731,   1029473,   578371,    3},
+        {737900480, 737319808, 736863680, 736043264, 734554432, 731808256, 729097600, 725051328,
+         718858688, 709018048, 692447360, 674422272, 645810304, 597029312, 509281120, 368950240,
+         228619376, 140871152, 92090184,  63478204,  45453116,  28882404,  19041826,  12849181,
+         8802888,   6092218,   3346065,   1857236,   1036832,   580686,    3},
+        {737900480, 737323520, 736875456, 736081088, 734676800, 732210048, 729927424, 726786624,
+         722546496, 717012160, 710183424, 705045120, 699473920, 692939328, 683288384, 664622720,
+         621866048, 513176832, 298800288, 144682432, 80228568,  40814640,  23774754,  14887523,
+         9725975,   6523960,   3473221,   1895906,   1048798,   584424,    3},
+        {737900480, 737326016, 736883520, 736106688, 734759040, 732477632, 730474944, 727916992,
+         724904832, 721986304, 720753536, 722497344, 728061952, 739005568, 755619392, 771010688,
+         763544704, 740635136, 685348544, 485060256, 169322848, 56755684,  28517764,  16647276,
+         10457803,  6848975,   3564451,   1922987,   1057072,   586991,    3},
     },
     {
-        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314752,
-         -99,        -23,        -8,         0,          -5,         -6,
-         -6,         -6,         -5,         -4,         -3,         -2,
-         -2,         -1,         -1,         0,          0,          0,
-         0},
-        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314752,
-         -180,       -33,        -14,        -9,         -7,         -7,
-         -7,         -6,         -5,         -4,         -3,         -2,
-         -2,         -1,         -1,         0,          0,          0,
-         0},
-        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314752,
-         -3092,      -53,        -23,        -14,        -11,        -9,
-         -8,         -7,         -6,         -4,         -3,         -2,
-         -2,         -1,         -1,         0,          0,          0,
-         0},
-        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314752, -298,       -55,        -28,        -19,        -14,
-         -11,        -9,         -7,         -5,         -4,         -3,
-         -2,         -1,         -1,         0,          0,          0,
-         0},
-        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314688, -193,       -55,        -30,        -20,
-         -14,        -11,        -8,         -6,         -4,         -3,
-         -2,         -1,         -1,         0,          0,          0,
-         0},
-        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314752, -421657440, -91,        -40,
-         -24,        -16,        -11,        -7,         -4,         -3,
-         -2,         -1,         -1,         0,          0,          0,
-         0},
-        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314752,
-         -252,       -43,        -21,        -10,        -6,         -3,
-         -2,         -2,         -1,         0,          0,          0,
-         0},
-        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
-         -843314816, -843314752, -56,        -14,        -7,         -4,
-         -2,         -2,         -1,         0,          0,          0,
-         0},
+        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314752, -99,        -23,
+         -8,         0,          -5,         -6,         -6,         -6,         -5,
+         -4,         -3,         -2,         -2,         -1,         -1,         0,
+         0,          0,          0},
+        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314752, -180,       -33,
+         -14,        -9,         -7,         -7,         -7,         -6,         -5,
+         -4,         -3,         -2,         -2,         -1,         -1,         0,
+         0,          0,          0},
+        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314752, -3092,      -53,
+         -23,        -14,        -11,        -9,         -8,         -7,         -6,
+         -4,         -3,         -2,         -2,         -1,         -1,         0,
+         0,          0,          0},
+        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314816, -843314752, -298,
+         -55,        -28,        -19,        -14,        -11,        -9,         -7,
+         -5,         -4,         -3,         -2,         -1,         -1,         0,
+         0,          0,          0},
+        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314688,
+         -193,       -55,        -30,        -20,        -14,        -11,        -8,
+         -6,         -4,         -3,         -2,         -1,         -1,         0,
+         0,          0,          0},
+        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314752, -421657440, -91,        -40,        -24,        -16,        -11,
+         -7,         -4,         -3,         -2,         -1,         -1,         0,
+         0,          0,          0},
+        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314752, -252,       -43,        -21,
+         -10,        -6,         -3,         -2,         -2,         -1,         0,
+         0,          0,          0},
+        {-843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314816, -843314816, -843314816,
+         -843314816, -843314816, -843314816, -843314816, -843314816, -843314752, -56,
+         -14,        -7,         -4,         -2,         -2,         -1,         0,
+         0,          0,          0},
     },
     {
-        {-737900480, -737313472, -736843456, -735978176, -734341632, -731092480,
-         -727578496, -721723200, -711172416, -689515200, -632898368, -524671488,
-         -291627872, -124282552, -61909848,  -39166196,  -32726402,  -30782708,
-         -28778616,  -26053690,  -22893104,  -18076022,  -13777825,  -10259415,
-         -7520911,   -5455092,   -3146318,   -1794368,   -1017003,   -574424,
-         -3},
-        {-737900480, -737313856, -736844736, -735982272, -734355264, -731139072,
-         -727679616, -721953472, -711743360, -691176960, -639550656, -546400448,
-         -337176160, -153194560, -79696608,  -51414384,  -40409972,  -35288892,
-         -31462068,  -27703042,  -23931232,  -18606916,  -14052066,  -10401010,
-         -7593697,   -5492313,   -3158366,   -1798231,   -1018235,   -574816,
-         -3},
-        {-737900480, -737314496, -736846656, -735988544, -734375872, -731209600,
-         -727831808, -722297216, -712582592, -693540736, -648325568, -572924928,
-         -400936960, -201170512, -106893576, -68502088,  -51196836,  -41932292,
-         -35558788,  -30265660,  -25555558,  -19438322,  -14479910,  -10620825,
-         -7706164,   -5549598,   -3176819,   -1804131,   -1020113,   -575412,
-         -3},
-        {-737900480, -737316032, -736851520, -736004288, -734427392, -731384128,
-         -728205504, -723128192, -714552448, -698767168, -665389504, -617851520,
-         -518249088, -341071712, -189979872, -115866704, -79793440,  -59627336,
-         -46625748,  -37240336,  -29975498,  -21679964,  -15618318,  -11198080,
-         -7998190,   -5696998,   -3223801,   -1819057,   -1024845,   -576910,
-         -3},
-        {-737900480, -737317504, -736856256, -736019456, -734476992, -731550784,
-         -728558400, -723898112, -716313280, -703122688, -677714048, -645514624,
-         -585425152, -469729280, -304799232, -181937104, -116903736, -81417128,
-         -59804896,  -45335932,  -34988368,  -24141312,  -16833070,  -11799644,
-         -8296895,   -5845647,   -3270430,   -1833731,   -1029472,   -578371,
-         -3},
-        {-737900480, -737319808, -736863680, -736043264, -734554432, -731808256,
-         -729097600, -725051328, -718858688, -709018112, -692447360, -674422272,
-         -645810304, -597029312, -509281120, -368950240, -228619360, -140871136,
-         -92090168,  -63478192,  -45453108,  -28882400,  -19041824,  -12849179,
-         -8802887,   -6092216,   -3346064,   -1857235,   -1036832,   -580686,
-         -3},
-        {-737900480, -737323520, -736875520, -736081152, -734676800, -732210112,
-         -729927424, -726786624, -722546560, -717012224, -710183488, -705045120,
-         -699473920, -692939328, -683288448, -664622784, -621866048, -513176832,
-         -298800256, -144682416, -80228552,  -40814632,  -23774750,  -14887520,
-         -9725973,   -6523959,   -3473220,   -1895905,   -1048798,   -584424,
-         -3},
-        {-737900480, -737326080, -736883520, -736106752, -734759104, -732477632,
-         -730474944, -727917056, -724904896, -721986368, -720753536, -722497344,
-         -728061952, -739005568, -755619456, -771010688, -763544704, -740635136,
-         -685348544, -485060256, -169322832, -56755676,  -28517758,  -16647273,
-         -10457802,  -6848973,   -3564450,   -1922987,   -1057072,   -586991,
-         -3},
+        {-737900480, -737313472, -736843456, -735978176, -734341632, -731092480, -727578496,
+         -721723200, -711172416, -689515200, -632898368, -524671488, -291627872, -124282552,
+         -61909848,  -39166196,  -32726402,  -30782708,  -28778616,  -26053690,  -22893104,
+         -18076022,  -13777825,  -10259415,  -7520911,   -5455092,   -3146318,   -1794368,
+         -1017003,   -574424,    -3},
+        {-737900480, -737313856, -736844736, -735982272, -734355264, -731139072, -727679616,
+         -721953472, -711743360, -691176960, -639550656, -546400448, -337176160, -153194560,
+         -79696608,  -51414384,  -40409972,  -35288892,  -31462068,  -27703042,  -23931232,
+         -18606916,  -14052066,  -10401010,  -7593697,   -5492313,   -3158366,   -1798231,
+         -1018235,   -574816,    -3},
+        {-737900480, -737314496, -736846656, -735988544, -734375872, -731209600, -727831808,
+         -722297216, -712582592, -693540736, -648325568, -572924928, -400936960, -201170512,
+         -106893576, -68502088,  -51196836,  -41932292,  -35558788,  -30265660,  -25555558,
+         -19438322,  -14479910,  -10620825,  -7706164,   -5549598,   -3176819,   -1804131,
+         -1020113,   -575412,    -3},
+        {-737900480, -737316032, -736851520, -736004288, -734427392, -731384128, -728205504,
+         -723128192, -714552448, -698767168, -665389504, -617851520, -518249088, -341071712,
+         -189979872, -115866704, -79793440,  -59627336,  -46625748,  -37240336,  -29975498,
+         -21679964,  -15618318,  -11198080,  -7998190,   -5696998,   -3223801,   -1819057,
+         -1024845,   -576910,    -3},
+        {-737900480, -737317504, -736856256, -736019456, -734476992, -731550784, -728558400,
+         -723898112, -716313280, -703122688, -677714048, -645514624, -585425152, -469729280,
+         -304799232, -181937104, -116903736, -81417128,  -59804896,  -45335932,  -34988368,
+         -24141312,  -16833070,  -11799644,  -8296895,   -5845647,   -3270430,   -1833731,
+         -1029472,   -578371,    -3},
+        {-737900480, -737319808, -736863680, -736043264, -734554432, -731808256, -729097600,
+         -725051328, -718858688, -709018112, -692447360, -674422272, -645810304, -597029312,
+         -509281120, -368950240, -228619360, -140871136, -92090168,  -63478192,  -45453108,
+         -28882400,  -19041824,  -12849179,  -8802887,   -6092216,   -3346064,   -1857235,
+         -1036832,   -580686,    -3},
+        {-737900480, -737323520, -736875520, -736081152, -734676800, -732210112, -729927424,
+         -726786624, -722546560, -717012224, -710183488, -705045120, -699473920, -692939328,
+         -683288448, -664622784, -621866048, -513176832, -298800256, -144682416, -80228552,
+         -40814632,  -23774750,  -14887520,  -9725973,   -6523959,   -3473220,   -1895905,
+         -1048798,   -584424,    -3},
+        {-737900480, -737326080, -736883520, -736106752, -734759104, -732477632, -730474944,
+         -727917056, -724904896, -721986368, -720753536, -722497344, -728061952, -739005568,
+         -755619456, -771010688, -763544704, -740635136, -685348544, -485060256, -169322832,
+         -56755676,  -28517758,  -16647273,  -10457802,  -6848973,   -3564450,   -1922987,
+         -1057072,   -586991,    -3},
     },
     {
-        {-632486144, -631404160, -630541632, -628962624, -626006912, -620254848,
-         -614202752, -604493888, -588124928, -558622016, -501272672, -434361280,
-         -339721664, -238866896, -162754096, -116484128, -89986864,  -73763168,
-         -62238740,  -52877228,  -44742028,  -34289608,  -25778562,  -19071618,
-         -13937720,  -10094244,  -5816230,   -3316020,   -1879259,   -1061412,
-         -6},
-        {-632486144, -631404800, -630543744, -628969280, -626028480, -620326656,
-         -614353408, -604818880, -588856448, -560378624, -505802400, -442767552,
-         -353024864, -254136224, -175962480, -126430968, -96994048,  -78520448,
-         -65419836,  -54997768,  -46155352,  -35055976,  -26190096,  -19289814,
-         -14051969,  -10153424,  -5835646,   -3322294,   -1881267,   -1062052,
-         -6},
-        {-632486144, -631405824, -630546880, -628979392, -626061312, -620435456,
-         -614581376, -605308352, -589949440, -562964800, -512317888, -454700800,
-         -372074880, -276762944, -196044080, -141682256, -107802384, -85920168,
-         -70405192,  -58335112,  -48381668,  -36259772,  -26833196,  -19628898,
-         -14228625,  -10244552,  -5865396,   -3331876,   -1884330,   -1063026,
-         -6},
-        {-632486144, -631408320, -630554816, -629004736, -626143424, -620706752,
-         -615146880, -606512512, -592597440, -569059456, -527028288, -480972000,
-         -414517888, -330765376, -247566576, -182256848, -137009312, -106116016,
-         -84093792,  -67506712,  -54475932,  -39516584,  -28548306,  -20520858,
-         -14687894,  -10479248,  -5941176,   -3356124,   -1892049,   -1065476,
-         -6},
-        {-632486144, -631410688, -630562496, -629029312, -626222848, -620968128,
-         -615688640, -607654400, -595061824, -574547648, -539620928, -502759488,
-         -449954304, -379751872, -300289600, -227398144, -170699200, -129631024,
-         -99970272,  -78022152,  -61351276,  -43090364,  -30380254,  -21451666,
-         -15158277,  -10716185,  -6016438,   -3379975,   -1899599,   -1067865,
-         -6},
-        {-632486144, -631414528, -630574528, -629067968, -626347520, -621376576,
-         -616530368, -609410560, -598784192, -582583424, -557211968, -532248448,
-         -497725920, -450454688, -388712416, -316243072, -243773744, -182031456,
-         -134760256, -100237728, -75274176,  -49902756,  -33701964,  -23075618,
-         -15955779,  -11109604,  -6138616,   -3418196,   -1911610,   -1071650,
-         -6},
-        {-632486144, -631420608, -630593920, -629129728, -626546368, -622024256,
-         -617857472, -612152256, -604500352, -594593024, -582468992, -573393792,
-         -563597248, -552304000, -536529056, -509232736, -458470496, -373144992,
-         -265980880, -175277520, -115809544, -66314036,  -40717412,  -26216596,
-         -17410062,  -11799017,  -6344227,   -3481124,   -1931149,   -1077765,
-         -6},
-        {-632486144, -631424704, -630607040, -629171712, -626681152, -622462336,
-         -618753152, -613998656, -608344384, -602686272, -599701056, -602055040,
-         -611306560, -631195136, -663846464, -695665728, -678745600, -629219648,
-         -527619232, -345921600, -187985760, -86310936,  -47549652,  -28903178,
-         -18560056,  -12317919,  -6491856,   -3525223,   -1944664,   -1081966,
-         -6},
+        {-632486144, -631404160, -630541632, -628962624, -626006912, -620254848, -614202752,
+         -604493888, -588124928, -558622016, -501272672, -434361280, -339721664, -238866896,
+         -162754096, -116484128, -89986864,  -73763168,  -62238740,  -52877228,  -44742028,
+         -34289608,  -25778562,  -19071618,  -13937720,  -10094244,  -5816230,   -3316020,
+         -1879259,   -1061412,   -6},
+        {-632486144, -631404800, -630543744, -628969280, -626028480, -620326656, -614353408,
+         -604818880, -588856448, -560378624, -505802400, -442767552, -353024864, -254136224,
+         -175962480, -126430968, -96994048,  -78520448,  -65419836,  -54997768,  -46155352,
+         -35055976,  -26190096,  -19289814,  -14051969,  -10153424,  -5835646,   -3322294,
+         -1881267,   -1062052,   -6},
+        {-632486144, -631405824, -630546880, -628979392, -626061312, -620435456, -614581376,
+         -605308352, -589949440, -562964800, -512317888, -454700800, -372074880, -276762944,
+         -196044080, -141682256, -107802384, -85920168,  -70405192,  -58335112,  -48381668,
+         -36259772,  -26833196,  -19628898,  -14228625,  -10244552,  -5865396,   -3331876,
+         -1884330,   -1063026,   -6},
+        {-632486144, -631408320, -630554816, -629004736, -626143424, -620706752, -615146880,
+         -606512512, -592597440, -569059456, -527028288, -480972000, -414517888, -330765376,
+         -247566576, -182256848, -137009312, -106116016, -84093792,  -67506712,  -54475932,
+         -39516584,  -28548306,  -20520858,  -14687894,  -10479248,  -5941176,   -3356124,
+         -1892049,   -1065476,   -6},
+        {-632486144, -631410688, -630562496, -629029312, -626222848, -620968128, -615688640,
+         -607654400, -595061824, -574547648, -539620928, -502759488, -449954304, -379751872,
+         -300289600, -227398144, -170699200, -129631024, -99970272,  -78022152,  -61351276,
+         -43090364,  -30380254,  -21451666,  -15158277,  -10716185,  -6016438,   -3379975,
+         -1899599,   -1067865,   -6},
+        {-632486144, -631414528, -630574528, -629067968, -626347520, -621376576, -616530368,
+         -609410560, -598784192, -582583424, -557211968, -532248448, -497725920, -450454688,
+         -388712416, -316243072, -243773744, -182031456, -134760256, -100237728, -75274176,
+         -49902756,  -33701964,  -23075618,  -15955779,  -11109604,  -6138616,   -3418196,
+         -1911610,   -1071650,   -6},
+        {-632486144, -631420608, -630593920, -629129728, -626546368, -622024256, -617857472,
+         -612152256, -604500352, -594593024, -582468992, -573393792, -563597248, -552304000,
+         -536529056, -509232736, -458470496, -373144992, -265980880, -175277520, -115809544,
+         -66314036,  -40717412,  -26216596,  -17410062,  -11799017,  -6344227,   -3481124,
+         -1931149,   -1077765,   -6},
+        {-632486144, -631424704, -630607040, -629171712, -626681152, -622462336, -618753152,
+         -613998656, -608344384, -602686272, -599701056, -602055040, -611306560, -631195136,
+         -663846464, -695665728, -678745600, -629219648, -527619232, -345921600, -187985760,
+         -86310936,  -47549652,  -28903178,  -18560056,  -12317919,  -6491856,   -3525223,
+         -1944664,   -1081966,   -6},
     },
     {
-        {-527071808, -525663328, -524547904, -522522464, -518787456, -511719712,
-         -504553344, -493592160, -476455328, -449151136, -405692224, -364814720,
-         -314764512, -260204640, -208654496, -165799488, -132838856, -107993080,
-         -88864496,  -73593008,  -61016300,  -45833920,  -34080072,  -25068086,
-         -18265786,  -13208914,  -7602956,   -4333254,   -2455489,   -1386823,
-         -8},
-        {-527071808, -525664032, -524550048, -522529344, -518809248, -511789152,
-         -504692896, -493873600, -477024000, -450294240, -407912928, -368083072,
-         -319153344, -265360496, -213877824, -170466928, -136659360, -110950464,
-         -91074040,  -75203984,  -62168492,  -46509388,  -34462972,  -25278938,
-         -18379172,  -13268760,  -7622986,   -4339799,   -2457598,   -1387497,
-         -8},
-        {-527071808, -525665056, -524553344, -522539776, -518842432, -511894880,
-         -504905472, -494302080, -477888896, -452029312, -411276864, -373037408,
-         -325837408, -273286560, -222000464, -177798416, -142702912, -115647952,
-         -94588960,  -77764888,  -63995600,  -47574416,  -35062712,  -25607104,
-         -18554672,  -13360983,  -7653687,   -4349798,   -2460813,   -1388524,
-         -8},
-        {-527071808, -525667680, -524561632, -522566016, -518925792, -512160864,
-         -505440352, -495379840, -480060736, -456371840, -419671488, -385428768,
-         -342733888, -293748864, -243538000, -197712512, -159394864, -128736136,
-         -104401192, -84889288,  -69041664,  -50472220,  -36668384,  -26472714,
-         -19011836,  -13598832,  -7731957,   -4375111,   -2468919,   -1391105,
-         -8},
-        {-527071808, -525670208, -524569664, -522591520, -519007008, -512420384,
-         -505962688, -496432608, -482180192, -460599072, -427832640, -397536032,
-         -359516800, -314728128, -266563552, -219861056, -178475984, -143891040,
-         -115765912, -93067576,  -74749312,  -53662744,  -38389064,  -27378586,
-         -19481138,  -13839381,  -7809779,   -4400024,   -2476851,   -1393623,
-         -8},
-        {-527071808, -525674208, -524582336, -522631840, -519135552, -512832288,
-         -506793408, -498110048, -485562336, -467353888, -440933120, -417176480,
-         -387412896, -351185760, -309141024, -263535920, -217930816, -175886064,
-         -139658944, -109895352, -86138704,  -59717932,  -41509480,  -28961786,
-         -20278428,  -14239527,  -7936268,   -4439981,   -2489476,   -1397613,
-         -8},
-        {-527071808, -525680640, -524602720, -522696736, -519343168, -513501280,
-         -508149440, -500867680, -491177984, -478742432, -463639424, -452372288,
-         -440252512, -426573984, -408733888, -381475168, -338855200, -280525440,
-         -216504464, -159999152, -116811992, -73859864,  -48033648,  -32018524,
-         -21734040,  -14942109,  -8149503,   -4505843,   -2510026,   -1404062,
-         -8},
-        {-527071808, -525685024, -524616640, -522741120, -519485760, -513964448,
-         -509095936, -502817440, -495235424, -487294400, -481973952, -483250688,
-         -492921664, -517327360, -563364544, -613069184, -582305664, -502086560,
-         -381071904, -253160976, -162730944, -89940184,  -54233516,  -34613092,
-         -22883530,  -15471361,  -8302828,   -4552048,   -2524252,   -1408494,
-         -8},
+        {-527071808, -525663328, -524547904, -522522464, -518787456, -511719712, -504553344,
+         -493592160, -476455328, -449151136, -405692224, -364814720, -314764512, -260204640,
+         -208654496, -165799488, -132838856, -107993080, -88864496,  -73593008,  -61016300,
+         -45833920,  -34080072,  -25068086,  -18265786,  -13208914,  -7602956,   -4333254,
+         -2455489,   -1386823,   -8},
+        {-527071808, -525664032, -524550048, -522529344, -518809248, -511789152, -504692896,
+         -493873600, -477024000, -450294240, -407912928, -368083072, -319153344, -265360496,
+         -213877824, -170466928, -136659360, -110950464, -91074040,  -75203984,  -62168492,
+         -46509388,  -34462972,  -25278938,  -18379172,  -13268760,  -7622986,   -4339799,
+         -2457598,   -1387497,   -8},
+        {-527071808, -525665056, -524553344, -522539776, -518842432, -511894880, -504905472,
+         -494302080, -477888896, -452029312, -411276864, -373037408, -325837408, -273286560,
+         -222000464, -177798416, -142702912, -115647952, -94588960,  -77764888,  -63995600,
+         -47574416,  -35062712,  -25607104,  -18554672,  -13360983,  -7653687,   -4349798,
+         -2460813,   -1388524,   -8},
+        {-527071808, -525667680, -524561632, -522566016, -518925792, -512160864, -505440352,
+         -495379840, -480060736, -456371840, -419671488, -385428768, -342733888, -293748864,
+         -243538000, -197712512, -159394864, -128736136, -104401192, -84889288,  -69041664,
+         -50472220,  -36668384,  -26472714,  -19011836,  -13598832,  -7731957,   -4375111,
+         -2468919,   -1391105,   -8},
+        {-527071808, -525670208, -524569664, -522591520, -519007008, -512420384, -505962688,
+         -496432608, -482180192, -460599072, -427832640, -397536032, -359516800, -314728128,
+         -266563552, -219861056, -178475984, -143891040, -115765912, -93067576,  -74749312,
+         -53662744,  -38389064,  -27378586,  -19481138,  -13839381,  -7809779,   -4400024,
+         -2476851,   -1393623,   -8},
+        {-527071808, -525674208, -524582336, -522631840, -519135552, -512832288, -506793408,
+         -498110048, -485562336, -467353888, -440933120, -417176480, -387412896, -351185760,
+         -309141024, -263535920, -217930816, -175886064, -139658944, -109895352, -86138704,
+         -59717932,  -41509480,  -28961786,  -20278428,  -14239527,  -7936268,   -4439981,
+         -2489476,   -1397613,   -8},
+        {-527071808, -525680640, -524602720, -522696736, -519343168, -513501280, -508149440,
+         -500867680, -491177984, -478742432, -463639424, -452372288, -440252512, -426573984,
+         -408733888, -381475168, -338855200, -280525440, -216504464, -159999152, -116811992,
+         -73859864,  -48033648,  -32018524,  -21734040,  -14942109,  -8149503,   -4505843,
+         -2510026,   -1404062,   -8},
+        {-527071808, -525685024, -524616640, -522741120, -519485760, -513964448, -509095936,
+         -502817440, -495235424, -487294400, -481973952, -483250688, -492921664, -517327360,
+         -563364544, -613069184, -582305664, -502086560, -381071904, -253160976, -162730944,
+         -89940184,  -54233516,  -34613092,  -22883530,  -15471361,  -8302828,   -4552048,
+         -2524252,   -1408494,   -8},
     },
     {
-        {-421657408, -420139456, -418946528, -416800672, -412909824, -405768000,
-         -398798528, -388615168, -373701408, -352009344, -321306208, -295197120,
-         -265052192, -232374288, -199428848, -168474672, -140988896, -117445752,
-         -97614400,  -80976864,  -67001780,  -50094052,  -37102532,  -27221788,
-         -19805402,  -14310412,  -8231902,   -4690747,   -2657887,   -1501102,
-         -8},
-        {-421657408, -420140000, -418948192, -416805888, -412925952, -405817184,
-         -398893120, -388794176, -374031200, -352591488, -322263520, -296453056,
-         -266595328, -234127456, -201261264, -170245168, -142589072, -118816232,
-         -98738176,  -81865128,  -67681552,  -50525456,  -37361620,  -27370528,
-         -19887816,  -14354855,  -8247121,   -4695785,   -2659522,   -1501627,
-         -8},
-        {-421657408, -420140800, -418950720, -416813824, -412950592, -405892416,
-         -399038240, -389069472, -374540320, -353494496, -323757792, -298423616,
-         -269030976, -236912448, -204189776, -173088112, -145165408, -121023680,
-         -100545224, -83288680,  -68766080,  -51208344,  -37768500,  -27602440,
-         -20015536,  -14423394,  -8270459,   -4703484,   -2662016,   -1502426,
-         -8},
-        {-421657408, -420142816, -418957120, -416833824, -413012832, -406083552,
-         -399408640, -389776736, -375859200, -355859232, -327727008, -303720672,
-         -275669600, -244617712, -212408608, -181157008, -152524352, -127334256,
-         -105689208, -87307640,  -71794608,  -53080056,  -38863244,  -28216278,
-         -20349054,  -14600477,  -8330017,   -4722985,   -2668305,   -1504437,
-         -8},
-        {-421657408, -420144800, -418963328, -416853344, -413073952, -406272672,
-         -399777664, -390488160, -377202752, -358308960, -331931552, -309437728,
-         -282992896, -253322816, -221909888, -190657120, -161278432, -134848896,
-         -111768392, -91990440,  -75259304,  -55157184,  -40043144,  -28861386,
-         -20692490,  -14779979,  -8389313,   -4742193,   -2674461,   -1506398,
-         -8},
-        {-421657408, -420147904, -418973152, -416884384, -413171584, -406578080,
-         -400379520, -391663904, -379464224, -362537024, -339441728, -319954336,
-         -296943136, -270562688, -241463968, -210828720, -180193456, -151094736,
-         -124714296, -101703096, -82215704,  -59120396,  -42193204,  -29993510,
-         -21277910,  -15079353,  -8485847,   -4773029,   -2684265,   -1509508,
-         -8},
-        {-421657408, -420152928, -418989024, -416934752, -413331616, -407087776,
-         -401401280, -393709888, -383542496, -370571008, -354857280, -343114528,
-         -330489120, -316523520, -299496896, -276320320, -244582704, -205903728,
-         -165901376, -130010112, -100638328, -68322528,  -46691836,  -32186576,
-         -22350768,  -15606794,  -8648966,   -4823931,   -2700238,   -1514536,
-         -8},
-        {-421657408, -420156352, -418999936, -416969504, -413443264, -407450528,
-         -402143200, -395241024, -386740960, -377366304, -369662048, -368527936,
-         -375197024, -397609792, -449444704, -516205344, -465462368, -362087840,
-         -258438672, -179525856, -126554704, -78481920,  -50925604,  -34045784,
-         -23199528,  -16005132,  -8766508,   -4859691,   -2711304,   -1517993,
-         -8},
+        {-421657408, -420139456, -418946528, -416800672, -412909824, -405768000, -398798528,
+         -388615168, -373701408, -352009344, -321306208, -295197120, -265052192, -232374288,
+         -199428848, -168474672, -140988896, -117445752, -97614400,  -80976864,  -67001780,
+         -50094052,  -37102532,  -27221788,  -19805402,  -14310412,  -8231902,   -4690747,
+         -2657887,   -1501102,   -8},
+        {-421657408, -420140000, -418948192, -416805888, -412925952, -405817184, -398893120,
+         -388794176, -374031200, -352591488, -322263520, -296453056, -266595328, -234127456,
+         -201261264, -170245168, -142589072, -118816232, -98738176,  -81865128,  -67681552,
+         -50525456,  -37361620,  -27370528,  -19887816,  -14354855,  -8247121,   -4695785,
+         -2659522,   -1501627,   -8},
+        {-421657408, -420140800, -418950720, -416813824, -412950592, -405892416, -399038240,
+         -389069472, -374540320, -353494496, -323757792, -298423616, -269030976, -236912448,
+         -204189776, -173088112, -145165408, -121023680, -100545224, -83288680,  -68766080,
+         -51208344,  -37768500,  -27602440,  -20015536,  -14423394,  -8270459,   -4703484,
+         -2662016,   -1502426,   -8},
+        {-421657408, -420142816, -418957120, -416833824, -413012832, -406083552, -399408640,
+         -389776736, -375859200, -355859232, -327727008, -303720672, -275669600, -244617712,
+         -212408608, -181157008, -152524352, -127334256, -105689208, -87307640,  -71794608,
+         -53080056,  -38863244,  -28216278,  -20349054,  -14600477,  -8330017,   -4722985,
+         -2668305,   -1504437,   -8},
+        {-421657408, -420144800, -418963328, -416853344, -413073952, -406272672, -399777664,
+         -390488160, -377202752, -358308960, -331931552, -309437728, -282992896, -253322816,
+         -221909888, -190657120, -161278432, -134848896, -111768392, -91990440,  -75259304,
+         -55157184,  -40043144,  -28861386,  -20692490,  -14779979,  -8389313,   -4742193,
+         -2674461,   -1506398,   -8},
+        {-421657408, -420147904, -418973152, -416884384, -413171584, -406578080, -400379520,
+         -391663904, -379464224, -362537024, -339441728, -319954336, -296943136, -270562688,
+         -241463968, -210828720, -180193456, -151094736, -124714296, -101703096, -82215704,
+         -59120396,  -42193204,  -29993510,  -21277910,  -15079353,  -8485847,   -4773029,
+         -2684265,   -1509508,   -8},
+        {-421657408, -420152928, -418989024, -416934752, -413331616, -407087776, -401401280,
+         -393709888, -383542496, -370571008, -354857280, -343114528, -330489120, -316523520,
+         -299496896, -276320320, -244582704, -205903728, -165901376, -130010112, -100638328,
+         -68322528,  -46691836,  -32186576,  -22350768,  -15606794,  -8648966,   -4823931,
+         -2700238,   -1514536,   -8},
+        {-421657408, -420156352, -418999936, -416969504, -413443264, -407450528, -402143200,
+         -395241024, -386740960, -377366304, -369662048, -368527936, -375197024, -397609792,
+         -449444704, -516205344, -465462368, -362087840, -258438672, -179525856, -126554704,
+         -78481920,  -50925604,  -34045784,  -23199528,  -16005132,  -8766508,   -4859691,
+         -2711304,   -1517993,   -8},
     },
     {
-        {-316243008, -314846624, -313757504, -311816352, -308352832, -302171008,
-         -296337632, -288127456, -276678880, -261007888, -240267536, -223492144,
-         -204621168, -184231584, -163158624, -142328848, -122556336, -104403368,
-         -88154688,  -73876192,  -61498028,  -46182700,  -34260636,  -25149106,
-         -18299350,  -13222144,  -7605577,   -4333749,   -2455580,   -1386840,
-         -8},
-        {-316243008, -314846912, -313758464, -311819232, -308361568, -302196544,
-         -296384928, -288212416, -276825056, -261244496, -240620368, -223927216,
-         -205130336, -184795472, -163749760, -142917408, -123115296, -104911600,
-         -88598128,  -74247992,  -61798056,  -46386168,  -34389244,  -25225818,
-         -18343070,  -13246209,  -7614004,   -4336575,   -2456504,   -1387137,
-         -8},
-        {-316243008, -314847392, -313759872, -311823616, -308374912, -302235744,
-         -296457888, -288344192, -277053152, -261616784, -241180768, -224622800,
-         -205949648, -185708016, -164710592, -143876416, -124026376, -105738512,
-         -89317016,  -74847736,  -62279196,  -46709404,  -34591708,  -25345634,
-         -18410908,  -13283356,  -7626933,   -4340893,   -2457913,   -1387591,
-         -8},
-        {-316243008, -314848512, -313763456, -311834752, -308408832, -302336288,
-         -296646464, -288688576, -277658176, -262622288, -242727472, -226572608,
-         -208281632, -188341072, -167512272, -146689680, -126701224, -108155704,
-         -91399992,  -76564696,  -63637496,  -47602000,  -35139292,  -25663914,
-         -18588502,  -13379500,  -7659961,   -4351839,   -2461468,   -1388732,
-         -8},
-        {-316243008, -314849632, -313766976, -311845632, -308442368, -302437024,
-         -296837728, -289043648, -278295616, -263711632, -244460304, -228811328,
-         -211025744, -191509376, -170942672, -150169120, -130013896, -111127320,
-         -93923416,  -78603784,  -65214380,  -48602508,  -35733556,  -26000038,
-         -18772010,  -13477196,  -7692889,   -4362630,   -2464949,   -1389845,
-         -8},
-        {-316243008, -314851424, -313772512, -311863040, -308496416, -302602400,
-         -297156896, -289649696, -279417728, -265709072, -247806336, -233308272,
-         -216768688, -198401504, -178640608, -158121504, -137602416, -117841504,
-         -99474336,  -82934744,  -68436680,  -50533948,  -36825284,  -26593332,
-         -19086118,  -13640626,  -7746589,   -4379970,   -2470496,   -1391610,
-         -8},
-        {-316243008, -314854272, -313781536, -311891520, -308586368, -302885760,
-         -297719584, -290762368, -281600896, -269929024, -255733712, -245043328,
-         -233506144, -220942752, -206510416, -188780416, -167001360, -142516672,
-         -118085752, -95972952,  -77157128,  -55082252,  -39133420,  -27751764,
-         -19665234,  -13929854,  -7837574,   -4408639,   -2479541,   -1394467,
-         -8},
-        {-316243008, -314856224, -313787744, -311911360, -308650080, -303093120,
-         -298144704, -291644064, -283459904, -273946496, -264748464, -260980560,
-         -262699104, -277087104, -321151136, -394123776, -324055296, -228764208,
-         -162653232, -119096664, -89459472,  -60122148,  -41317832,  -28739578,
-         -20125736,  -14149188,  -7903306,   -4428810,   -2485814,   -1396432,
-         -8},
+        {-316243008, -314846624, -313757504, -311816352, -308352832, -302171008, -296337632,
+         -288127456, -276678880, -261007888, -240267536, -223492144, -204621168, -184231584,
+         -163158624, -142328848, -122556336, -104403368, -88154688,  -73876192,  -61498028,
+         -46182700,  -34260636,  -25149106,  -18299350,  -13222144,  -7605577,   -4333749,
+         -2455580,   -1386840,   -8},
+        {-316243008, -314846912, -313758464, -311819232, -308361568, -302196544, -296384928,
+         -288212416, -276825056, -261244496, -240620368, -223927216, -205130336, -184795472,
+         -163749760, -142917408, -123115296, -104911600, -88598128,  -74247992,  -61798056,
+         -46386168,  -34389244,  -25225818,  -18343070,  -13246209,  -7614004,   -4336575,
+         -2456504,   -1387137,   -8},
+        {-316243008, -314847392, -313759872, -311823616, -308374912, -302235744, -296457888,
+         -288344192, -277053152, -261616784, -241180768, -224622800, -205949648, -185708016,
+         -164710592, -143876416, -124026376, -105738512, -89317016,  -74847736,  -62279196,
+         -46709404,  -34591708,  -25345634,  -18410908,  -13283356,  -7626933,   -4340893,
+         -2457913,   -1387591,   -8},
+        {-316243008, -314848512, -313763456, -311834752, -308408832, -302336288, -296646464,
+         -288688576, -277658176, -262622288, -242727472, -226572608, -208281632, -188341072,
+         -167512272, -146689680, -126701224, -108155704, -91399992,  -76564696,  -63637496,
+         -47602000,  -35139292,  -25663914,  -18588502,  -13379500,  -7659961,   -4351839,
+         -2461468,   -1388732,   -8},
+        {-316243008, -314849632, -313766976, -311845632, -308442368, -302437024, -296837728,
+         -289043648, -278295616, -263711632, -244460304, -228811328, -211025744, -191509376,
+         -170942672, -150169120, -130013896, -111127320, -93923416,  -78603784,  -65214380,
+         -48602508,  -35733556,  -26000038,  -18772010,  -13477196,  -7692889,   -4362630,
+         -2464949,   -1389845,   -8},
+        {-316243008, -314851424, -313772512, -311863040, -308496416, -302602400, -297156896,
+         -289649696, -279417728, -265709072, -247806336, -233308272, -216768688, -198401504,
+         -178640608, -158121504, -137602416, -117841504, -99474336,  -82934744,  -68436680,
+         -50533948,  -36825284,  -26593332,  -19086118,  -13640626,  -7746589,   -4379970,
+         -2470496,   -1391610,   -8},
+        {-316243008, -314854272, -313781536, -311891520, -308586368, -302885760, -297719584,
+         -290762368, -281600896, -269929024, -255733712, -245043328, -233506144, -220942752,
+         -206510416, -188780416, -167001360, -142516672, -118085752, -95972952,  -77157128,
+         -55082252,  -39133420,  -27751764,  -19665234,  -13929854,  -7837574,   -4408639,
+         -2479541,   -1394467,   -8},
+        {-316243008, -314856224, -313787744, -311911360, -308650080, -303093120, -298144704,
+         -291644064, -283459904, -273946496, -264748464, -260980560, -262699104, -277087104,
+         -321151136, -394123776, -324055296, -228764208, -162653232, -119096664, -89459472,
+         -60122148,  -41317832,  -28739578,  -20125736,  -14149188,  -7903306,   -4428810,
+         -2485814,   -1396432,   -8},
     },
     {
-        {-210828752, -209763872, -208938592, -207478800, -204908080, -200419808,
-         -196290928, -190633648, -183000704, -172937696, -160110736, -149997216,
-         -138756640, -126624232, -113938360, -101099096, -88510608,  -76526296,
-         -65413292,  -55341440,  -46391320,  -35074012,  -26116860,  -19208966,
-         -13991280,  -10114557,  -5820108,   -3316738,   -1879390,   -1061436,
-         -6},
-        {-210828752, -209763984, -208938928, -207479824, -204911120, -200428400,
-         -196306416, -190660464, -183044768, -173005280, -160206000, -150110752,
-         -138886000, -126765304, -114085976, -101247840, -88655288,  -76662120,
-         -65536172,  -55448360,  -46480720,  -35137564,  -26158602,  -19234616,
-         -14006233,  -10122926,  -5823093,   -3317749,   -1879722,   -1061544,
-         -6},
-        {-210828752, -209764144, -208939440, -207481376, -204915760, -200441648,
-         -196330416, -190702288, -183114016, -173112528, -160358784, -150294128,
-         -139096320, -126995880, -114328144, -101492256, -88892840,  -76884536,
-         -65736472,  -55621628,  -46624628,  -35238804,  -26224440,  -19274738,
-         -14029458,  -10135854,  -5827674,   -3319296,   -1880230,   -1061707,
-         -6},
-        {-210828752, -209764560, -208940736, -207485328, -204927632, -200475856,
-         -196392992, -190812944, -183300624, -173407952, -160790128, -150820560,
-         -139709616, -127677056, -115050048, -102223736, -89602680,  -77544552,
-         -66324276,  -56122908,  -47034392,  -35520116,  -26403304,  -19381648,
-         -14090389,  -10169365,  -5839389,   -3323218,   -1881511,   -1062120,
-         -6},
-        {-210828752, -209764960, -208941984, -207489216, -204939424, -200510464,
-         -196457344, -190929120, -183501920, -173737552, -161290496, -151447952,
-         -140459488, -128528240, -115966008, -103158080, -90506904,  -78375592,
-         -67050588,  -56727872,  -47516252,  -35838308,  -26598652,  -19495052,
-         -14153547,  -10203492,  -5851082,   -3327087,   -1882766,   -1062523,
-         -6},
-        {-210828752, -209765600, -208944000, -207495456, -204958576, -200568016,
-         -196566672, -191132352, -183868160, -174368384, -162309168, -152784224,
-         -142129664, -130500376, -118149736, -105414376, -92679024,  -80328376,
-         -68699096,  -58044540,  -48519596,  -36460372,  -26960598,  -19696400,
-         -14262092,  -10260742,  -5870182,   -3333310,   -1884767,   -1063161,
-         -6},
-        {-210828752, -209766624, -208947248, -207505712, -204990848, -200668832,
-         -196765472, -191522144, -184625552, -175818224, -165011760, -156772320,
-         -147807488, -138128816, -127521488, -115591360, -102270704, -88260840,
-         -74642488,  -62217976,  -51336332,  -37958768,  -27737038,  -20093356,
-         -14463535,  -10362521,  -5902624,   -3343612,   -1888032,   -1064195,
-         -6},
-        {-210828752, -209767344, -208949504, -207512928, -205014000, -200744384,
-         -196920912, -191846704, -185318880, -177353360, -168608208, -163416672,
-         -160727552, -165029760, -189074016, -241456784, -178005872, -122049664,
-         -90479424,  -70104056,  -55475480,  -39658748,  -28482878,  -20435214,
-         -14624802,  -10440065,  -5926123,   -3350872,   -1890299,   -1064907,
-         -6},
+        {-210828752, -209763872, -208938592, -207478800, -204908080, -200419808, -196290928,
+         -190633648, -183000704, -172937696, -160110736, -149997216, -138756640, -126624232,
+         -113938360, -101099096, -88510608,  -76526296,  -65413292,  -55341440,  -46391320,
+         -35074012,  -26116860,  -19208966,  -13991280,  -10114557,  -5820108,   -3316738,
+         -1879390,   -1061436,   -6},
+        {-210828752, -209763984, -208938928, -207479824, -204911120, -200428400, -196306416,
+         -190660464, -183044768, -173005280, -160206000, -150110752, -138886000, -126765304,
+         -114085976, -101247840, -88655288,  -76662120,  -65536172,  -55448360,  -46480720,
+         -35137564,  -26158602,  -19234616,  -14006233,  -10122926,  -5823093,   -3317749,
+         -1879722,   -1061544,   -6},
+        {-210828752, -209764144, -208939440, -207481376, -204915760, -200441648, -196330416,
+         -190702288, -183114016, -173112528, -160358784, -150294128, -139096320, -126995880,
+         -114328144, -101492256, -88892840,  -76884536,  -65736472,  -55621628,  -46624628,
+         -35238804,  -26224440,  -19274738,  -14029458,  -10135854,  -5827674,   -3319296,
+         -1880230,   -1061707,   -6},
+        {-210828752, -209764560, -208940736, -207485328, -204927632, -200475856, -196392992,
+         -190812944, -183300624, -173407952, -160790128, -150820560, -139709616, -127677056,
+         -115050048, -102223736, -89602680,  -77544552,  -66324276,  -56122908,  -47034392,
+         -35520116,  -26403304,  -19381648,  -14090389,  -10169365,  -5839389,   -3323218,
+         -1881511,   -1062120,   -6},
+        {-210828752, -209764960, -208941984, -207489216, -204939424, -200510464, -196457344,
+         -190929120, -183501920, -173737552, -161290496, -151447952, -140459488, -128528240,
+         -115966008, -103158080, -90506904,  -78375592,  -67050588,  -56727872,  -47516252,
+         -35838308,  -26598652,  -19495052,  -14153547,  -10203492,  -5851082,   -3327087,
+         -1882766,   -1062523,   -6},
+        {-210828752, -209765600, -208944000, -207495456, -204958576, -200568016, -196566672,
+         -191132352, -183868160, -174368384, -162309168, -152784224, -142129664, -130500376,
+         -118149736, -105414376, -92679024,  -80328376,  -68699096,  -58044540,  -48519596,
+         -36460372,  -26960598,  -19696400,  -14262092,  -10260742,  -5870182,   -3333310,
+         -1884767,   -1063161,   -6},
+        {-210828752, -209766624, -208947248, -207505712, -204990848, -200668832, -196765472,
+         -191522144, -184625552, -175818224, -165011760, -156772320, -147807488, -138128816,
+         -127521488, -115591360, -102270704, -88260840,  -74642488,  -62217976,  -51336332,
+         -37958768,  -27737038,  -20093356,  -14463535,  -10362521,  -5902624,   -3343612,
+         -1888032,   -1064195,   -6},
+        {-210828752, -209767344, -208949504, -207512928, -205014000, -200744384, -196920912,
+         -191846704, -185318880, -177353360, -168608208, -163416672, -160727552, -165029760,
+         -189074016, -241456784, -178005872, -122049664, -90479424,  -70104056,  -55475480,
+         -39658748,  -28482878,  -20435214,  -14624802,  -10440065,  -5926123,   -3350872,
+         -1890299,   -1064907,   -6},
     },
     {
-        {-105414352, -104839424, -104395752, -103614840, -102251280, -99903608,
-         -97777512,  -94910408,  -91113920,  -86209240,  -80075680,  -75298248,
-         -70016784,  -64317188,  -58324212,  -52191704,  -46086820,  -40171652,
-         -34586568,  -29438702,  -24797034,  -18844524,  -14076834,  -10372790,
-         -7563107,   -5470588,   -3149178,   -1794887,   -1017097,   -574441,
-         -3},
-        {-105414352, -104839440, -104395800, -103614984, -102251696, -99904760,
-         -97779552,  -94913864,  -91119448,  -86217488,  -80086968,  -75311472,
-         -70031648,  -64333264,  -58341004,  -52208708,  -46103540,  -40187592,
-         -34601256,  -29451740,  -24808154,  -18852650,  -14082296,  -10376208,
-         -7565130,   -5471732,   -3149590,   -1795028,   -1017143,   -574456,
-         -3},
-        {-105414352, -104839464, -104395864, -103615200, -102252328, -99906536,
-         -97782720,  -94919272,  -91128184,  -86230632,  -80105160,  -75332928,
-         -70055928,  -64359668,  -58368680,  -52236764,  -46131096,  -40213784,
-         -34625276,  -29472926,  -24826094,  -18865612,  -14090921,  -10381562,
-         -7568272,   -5473500,   -3150225,   -1795243,   -1017214,   -574479,
-         -3},
-        {-105414352, -104839520, -104396048, -103615744, -102253960, -99911152,
-         -97791032,  -94933688,  -91151920,  -86267216,  -80157128,  -75395304,
-         -70127624,  -64438604,  -58452116,  -52321612,  -46214216,  -40292164,
-         -34696280,  -29534602,  -24877444,  -18901780,  -14114420,  -10395856,
-         -7576529,   -5478088,   -3151847,   -1795790,   -1017393,   -574537,
-         -3},
-        {-105414352, -104839576, -104396224, -103616288, -102255584, -99915840,
-         -97799648,  -94948992,  -91177888,  -86308728,  -80218552,  -75471128,
-         -70217064,  -64539224,  -58559996,  -52431912,  -46321788,  -40392244,
-         -34785072,  -29609788,  -24938334,  -18942936,  -14140198,  -10411064,
-         -7585107,   -5482767,   -3153468,   -1796330,   -1017569,   -574593,
-         -3},
-        {-105414352, -104839672, -104396504, -103617152, -102258232, -99923720,
-         -97814464,  -94976168,  -91226088,  -86390208,  -80347520,  -75638136,
-         -70423480,  -64780936,  -58826440,  -52707176,  -46587912,  -40633416,
-         -34990872,  -29776222,  -25066836,  -19024146,  -14188261,  -10438183,
-         -7599891,   -5490632,   -3156117,   -1797198,   -1017849,   -574683,
-         -3},
-        {-105414352, -104839816, -104396960, -103618592, -102262736, -99937720,
-         -97841944,  -95029800,  -91329808,  -86588032,  -80716136,  -76183440,
-         -71203424,  -65834124,  -60122608,  -54107304,  -47891720,  -41697004,
-         -35779764,  -30327718,  -25439256,  -19223604,  -14292622,  -10492064,
-         -7627469,   -5504662,   -3160627,   -1798637,   -1018307,   -574828,
-         -3},
-        {-105414352, -104839912, -104397280, -103619608, -102266000, -99948376,
-         -97863944,  -95076008,  -91429704,  -86814408,  -81270896,  -77262800,
-         -73480376,  -71228232,  -75154784,  -90330848,  -64216360,  -47491208,
-         -38189996,  -31457080,  -26014454,  -19455914,  -14394384,  -10538884,
-         -7649672,   -5515392,   -3163898,   -1799652,   -1018624,   -574928,
-         -3},
+        {-105414352, -104839424, -104395752, -103614840, -102251280, -99903608, -97777512,
+         -94910408,  -91113920,  -86209240,  -80075680,  -75298248,  -70016784, -64317188,
+         -58324212,  -52191704,  -46086820,  -40171652,  -34586568,  -29438702, -24797034,
+         -18844524,  -14076834,  -10372790,  -7563107,   -5470588,   -3149178,  -1794887,
+         -1017097,   -574441,    -3},
+        {-105414352, -104839440, -104395800, -103614984, -102251696, -99904760, -97779552,
+         -94913864,  -91119448,  -86217488,  -80086968,  -75311472,  -70031648, -64333264,
+         -58341004,  -52208708,  -46103540,  -40187592,  -34601256,  -29451740, -24808154,
+         -18852650,  -14082296,  -10376208,  -7565130,   -5471732,   -3149590,  -1795028,
+         -1017143,   -574456,    -3},
+        {-105414352, -104839464, -104395864, -103615200, -102252328, -99906536, -97782720,
+         -94919272,  -91128184,  -86230632,  -80105160,  -75332928,  -70055928, -64359668,
+         -58368680,  -52236764,  -46131096,  -40213784,  -34625276,  -29472926, -24826094,
+         -18865612,  -14090921,  -10381562,  -7568272,   -5473500,   -3150225,  -1795243,
+         -1017214,   -574479,    -3},
+        {-105414352, -104839520, -104396048, -103615744, -102253960, -99911152, -97791032,
+         -94933688,  -91151920,  -86267216,  -80157128,  -75395304,  -70127624, -64438604,
+         -58452116,  -52321612,  -46214216,  -40292164,  -34696280,  -29534602, -24877444,
+         -18901780,  -14114420,  -10395856,  -7576529,   -5478088,   -3151847,  -1795790,
+         -1017393,   -574537,    -3},
+        {-105414352, -104839576, -104396224, -103616288, -102255584, -99915840, -97799648,
+         -94948992,  -91177888,  -86308728,  -80218552,  -75471128,  -70217064, -64539224,
+         -58559996,  -52431912,  -46321788,  -40392244,  -34785072,  -29609788, -24938334,
+         -18942936,  -14140198,  -10411064,  -7585107,   -5482767,   -3153468,  -1796330,
+         -1017569,   -574593,    -3},
+        {-105414352, -104839672, -104396504, -103617152, -102258232, -99923720, -97814464,
+         -94976168,  -91226088,  -86390208,  -80347520,  -75638136,  -70423480, -64780936,
+         -58826440,  -52707176,  -46587912,  -40633416,  -34990872,  -29776222, -25066836,
+         -19024146,  -14188261,  -10438183,  -7599891,   -5490632,   -3156117,  -1797198,
+         -1017849,   -574683,    -3},
+        {-105414352, -104839816, -104396960, -103618592, -102262736, -99937720, -97841944,
+         -95029800,  -91329808,  -86588032,  -80716136,  -76183440,  -71203424, -65834124,
+         -60122608,  -54107304,  -47891720,  -41697004,  -35779764,  -30327718, -25439256,
+         -19223604,  -14292622,  -10492064,  -7627469,   -5504662,   -3160627,  -1798637,
+         -1018307,   -574828,    -3},
+        {-105414352, -104839912, -104397280, -103619608, -102266000, -99948376, -97863944,
+         -95076008,  -91429704,  -86814408,  -81270896,  -77262800,  -73480376, -71228232,
+         -75154784,  -90330848,  -64216360,  -47491208,  -38189996,  -31457080, -26014454,
+         -19455914,  -14394384,  -10538884,  -7649672,   -5515392,   -3163898,  -1799652,
+         -1018624,   -574928,    -3},
     }};
 
-const WORD32 ixheaacd_c_l_table_Q31[31] = {
-    68,         12075997,   21473763,   38182223,   67875466,   120571390,
-    170045077,  239449100,  336157459,  469148859,  647490682,  794298694,
-    962206904,  1145934076, 1335698887, 1518500250, 1681545272, 1816183116,
-    1919855175, 1995188112, 2047545319, 2095610977, 2121010179, 2134092347,
-    2140740687, 2144096210, 2146410711, 2147144182, 2147376282, 2147449694,
-    2147483647};
+const FLOAT32 ixheaacd_c_l_table[31] = {
+    0.0000000317f, 0.0056233243f, 0.0099995006f, 0.0177799836f, 0.0316069759f, 0.0561454296f,
+    0.0791834071f, 0.1115021780f, 0.1565355211f, 0.2184644639f, 0.3015113473f, 0.3698741496f,
+    0.4480625093f, 0.5336171389f, 0.6219832897f, 0.7071067691f, 0.7830305099f, 0.8457261920f,
+    0.8940022588f, 0.9290818572f, 0.9534626007f, 0.9758449197f, 0.9876723289f, 0.9937641621f,
+    0.9968600869f, 0.9984226227f, 0.9995003939f, 0.9998419285f, 0.9999499917f, 0.9999842048f,
+    1.0000000000f};
 
-const WORD32 ixheaacd_sin_table_Q31[8][31] = {
-    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-    {750179061, 746245580, 743210706, 737870331, 728548620, 712505595,
-     697979429, 678386783, 652421439, 618809885, 576615606, 543587743,
-     506876195, 466993926, 424737371, 381140538, 337380886, 294653248,
-     254039878, 216406178, 182341865, 138534277, 103401830, 76116249,
-     55442477,  40067134,  23038730,  13121396,  7432107,   4196447,
-     24},
-    {1161262961, 1155790434, 1151559607, 1144096867, 1131016382, 1108345689,
-     1087649071, 1059486043, 1021740286, 972201548,  909011376,  858841310,
-     802424715,  740453756,  674139243,  605156167,  535487835,  467194735,
-     402165023,  341910884,  287454637,  217648816,  161934922,  118876289,
-     86395037,   62326858,   35765878,   20345239,   11515596,   6499487,
-     37},
-    {1716503346, 1710705303, 1706196326, 1698186767, 1683975371, 1658827737,
-     1635302807, 1602433676, 1556860619, 1494490287, 1410930784, 1341611885,
-     1260794215, 1168902519, 1067487796, 959278806,  847935697,  737527629,
-     631893965,  534105311,  446175490,  334574700,  246745780,  179796016,
-     129896719,  93282739,   53251977,   30198506,   17061963,   9620003,
-     54},
-    {1997091453, 1992944085, 1989690856, 1983852214, 1973306896, 1954076825,
-     1935447004, 1908416859, 1869093029, 1812001456, 1730062329, 1657802892,
-     1569207783, 1463537141, 1341868672, 1207527592, 1065884173, 923429508,
-     786466908,  659983219,  547093745,  405656596,  296231282,  214127893,
-     153738020,  109885815,  62401443,   35278435,   19896909,   11207148,
-     63},
-    {2147483647, 2147449694, 2147376282, 2147144182, 2146410711, 2144096210,
-     2140740687, 2134092347, 2121010179, 2095610977, 2047545319, 1995188112,
-     1919855175, 1816183116, 1681545272, 1518500250, 1335698887, 1145934076,
-     962206904,  794298694,  647490682,  469148859,  336157459,  239449100,
-     170045077,  120571390,  67875466,   38182223,   21473763,   12075997,
-     68},
-    {1735452507, 1741201627, 1745677174, 1753637197, 1767790913, 1792923770,
-     1816518097, 1849561983, 1895318984, 1957003931, 2034703322, 2089967744,
-     2134916861, 2144595142, 2081353083, 1914153740, 1653277521, 1353148056,
-     1069993076, 832031145,  643429686,  438118607,  300387816,  207524268,
-     144291161,  100823513,  55902457,   31184569,   17456772,   9791496,
-     55},
-    {302939858, 304635714, 305968630,  308367663,  312727041, 320788003,
-     328771547, 340741324, 359192238,  388879484,  440075553, 497870534,
-     595446097, 785304289, 1255861595, 2142108211, 997566324, 495493509,
-     298429982, 198205829, 139164109,  87059272,   56928133,  38231805,
-     26115252,  18039235,  9889297,    5483639,    3059686,   1713093,
-     10}};
+const FLOAT32 ixheaacd_sin_table[8][31] = {
+    {0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f, 0.0000000000f,
+     0.0000000000f},
+    {0.3493293524f, 0.3474976718f, 0.3460844457f, 0.3435976505f, 0.3392568827f, 0.3317862749f,
+     0.3250220120f, 0.3158984482f, 0.3038074076f, 0.2881557941f, 0.2685075700f, 0.2531277537f,
+     0.2360326201f, 0.2174609900f, 0.1977837533f, 0.1774823964f, 0.1571052223f, 0.1372086108f,
+     0.1182965338f, 0.1007719785f, 0.0849095508f, 0.0645100474f, 0.0481502302f, 0.0354443900f,
+     0.0258174147f, 0.0186577141f, 0.0107282447f, 0.0061101262f, 0.0034608445f, 0.0019541229f,
+     0.0000000112f},
+    {0.5407552123f, 0.5382068753f, 0.5362367034f, 0.5327616334f, 0.5266705155f, 0.5161136985f,
+     0.5064760447f, 0.4933616221f, 0.4757848978f, 0.4527166188f, 0.4232914150f, 0.3999291360f,
+     0.3736581206f, 0.3448006511f, 0.3139205575f, 0.2817977965f, 0.2493559569f, 0.2175544947f,
+     0.1872726828f, 0.1592146605f, 0.1338564903f, 0.1013506278f, 0.0754068270f, 0.0553560853f,
+     0.0402308255f, 0.0290232040f, 0.0166547857f, 0.0094739906f, 0.0053623673f, 0.0030265595f,
+     0.0000000172f},
+    {0.7993091345f, 0.7966092229f, 0.7945095897f, 0.7907798290f, 0.7841621637f, 0.7724518776f,
+     0.7614971995f, 0.7461913228f, 0.7249697447f, 0.6959262490f, 0.6570158601f, 0.6247367263f,
+     0.5871030688f, 0.5443126559f, 0.4970877469f, 0.4466989934f, 0.3948508203f, 0.3434380591f,
+     0.2942485511f, 0.2487121671f, 0.2077666521f, 0.1557984799f, 0.1148999557f, 0.0837240443f,
+     0.0604878739f, 0.0434381589f, 0.0247973837f, 0.0140622752f, 0.0079450961f, 0.0044796630f,
+     0.0000000251f},
+    {0.9299681783f, 0.9280369282f, 0.9265220165f, 0.9238031507f, 0.9188926220f, 0.9099379182f,
+     0.9012627602f, 0.8886758685f, 0.8703642488f, 0.8437789083f, 0.8056230545f, 0.7719746232f,
+     0.7307193279f, 0.6815125942f, 0.6248562932f, 0.5622988343f, 0.4963409901f, 0.4300053716f,
+     0.3662271798f, 0.3073286414f, 0.2547603846f, 0.1888985783f, 0.1379434466f, 0.0997110680f,
+     0.0715898424f, 0.0511695705f, 0.0290579367f, 0.0164278019f, 0.0092652198f, 0.0052187350f,
+     0.0000000293f},
+    {1.0000000000f, 0.9999842048f, 0.9999499917f, 0.9998419285f, 0.9995003939f, 0.9984226227f,
+     0.9968600869f, 0.9937641621f, 0.9876723289f, 0.9758449197f, 0.9534626007f, 0.9290818572f,
+     0.8940022588f, 0.8457261920f, 0.7830305099f, 0.7071067691f, 0.6219832897f, 0.5336171389f,
+     0.4480625093f, 0.3698741496f, 0.3015113473f, 0.2184644639f, 0.1565355211f, 0.1115021780f,
+     0.0791834071f, 0.0561454296f, 0.0316069759f, 0.0177799836f, 0.0099995006f, 0.0056233243f,
+     0.0000000317f},
+    {0.8081330657f, 0.8108102083f, 0.8128942847f, 0.8166009784f, 0.8231918216f, 0.8348951936f,
+     0.8458821774f, 0.8612694144f, 0.8825767040f, 0.9113009572f, 0.9474825859f, 0.9732170701f,
+     0.9941481352f, 0.9986549616f, 0.9692055583f, 0.8913472891f, 0.7698673606f, 0.6301086545f,
+     0.4982543588f, 0.3874447048f, 0.2996203005f, 0.2040148675f, 0.1398789734f, 0.0966360196f,
+     0.0671908110f, 0.0469496064f, 0.0260316096f, 0.0145214461f, 0.0081289429f, 0.0045595206f,
+     0.0000000256f},
+    {0.1410673708f, 0.1418570578f, 0.1424777508f, 0.1435948759f, 0.1456248760f, 0.1493785530f,
+     0.1530961841f, 0.1586700380f, 0.1672619134f, 0.1810861230f, 0.2049261481f, 0.2318390310f,
+     0.2772761881f, 0.3656858206f, 0.5848061442f, 0.9974968433f, 0.4645280242f, 0.2307321429f,
+     0.1389672905f, 0.0922967792f, 0.0648033395f, 0.0405401327f, 0.0265092272f, 0.0178030711f,
+     0.0121608619f, 0.0084001739f, 0.0046050628f, 0.0025535184f, 0.0014247773f, 0.0007977211f,
+     0.0000000047f}};
 
-const WORD32 ixheaacd_cos_table_Q31[8][31] = {
-    {2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647, 2147483647, 2147483647, 2147483647, 2147483647, 2147483647,
-     2147483647},
-    {2012192186, 2013654279, 2014776381, 2016738305, 2020124483, 2025838542,
-     2030889149, 2037517458, 2045979541, 2056394987, 2068622842, 2077546241,
-     2086806781, 2096092243, 2105061563, 2113390146, 2120815918, 2127173120,
-     2132404689, 2136551985, 2139728362, 2143010563, 2144992793, 2146134277,
-     2146767838, 2147109835, 2147360062, 2147443561, 2147470787, 2147479548,
-     2147483647},
-    {1806420315, 1809926653, 1812621442, 1817341018, 1825510329, 1839362893,
-     1851676407, 1867933442, 1888844304, 1914813351, 1945606419, 1968267671,
-     1991933883, 2015791223, 2038926752, 2060454327, 2079648720, 2096047494,
-     2109490297, 2120090320, 2128157854, 2136425756, 2141369445, 2144190861,
-     2145745072, 2146578995, 2147185791, 2147387271, 2147452772, 2147473812,
-     2147483647},
-    {1290465917, 1298142282, 1304062927, 1314476217, 1332633846, 1363809575,
-     1391930582, 1429647625, 1479145371, 1542136441, 1618938029, 1676831408,
-     1738414210, 1801486309, 1863372164, 1921319908, 1972990388, 2016863658,
-     2052412248, 2080004215, 2100622158, 2121260425, 2133261010, 2139943787,
-     2143551460, 2145456676, 2146823292, 2147271308, 2147415867, 2147462101,
-     2147483647},
-    {789500947,  799912428,  807970493,  822202171,  847198862,  890656938,
-     930446620,  984698487,  1057439013, 1152534920, 1272230465, 1365055160,
-     1466039887, 1571542254, 1676625923, 1775827450, 1864289931, 1938804777,
-     1998288223, 2043552830, 2076625737, 2108821648, 2126953936, 2136781520,
-     2141973538, 2144670400, 2146576828, 2147193855, 2147391471, 2147454404,
-     2147483647},
-    {68,         12075997,   21473763,   38182223,   67875466,   120571390,
-     170045077,  239449100,  336157459,  469148859,  647490682,  794298694,
-     962206904,  1145934076, 1335698887, 1518500250, 1681545272, 1816183116,
-     1919855175, 1995188112, 2047545319, 2095610977, 2121010179, 2134092347,
-     2140740687, 2144096210, 2146410711, 2147144182, 2147376282, 2147449694,
-     2147483647},
-    {-1264867824, -1256941889, -1250718683, -1239533218, -1219262608,
-     -1181994236, -1145402996, -1091240803, -1009679140, -884206781,
-     -686781195,  -493680916,  -231982790,  111344931,   528824509,
-     973499603,   1370532546,  1667536014,  1861934703,  1979750033,
-     2048825092,  2102317318,  2126370894,  2137432969,  2142630645,
-     2145115530,  2146755909,  2147257214,  2147412694,  2147461326,
-     2147483647},
-    {-2126008810, -2125766474, -2125575032, -2125228318, -2124591212,
-     -2123389054, -2122167592, -2120278606, -2117230964, -2111979821,
-     -2101908544, -2088973660, -2063281359, -1998745405, -1741980962,
-     151850025,   1901722232,  2089538753,  2126646554,  2138317205,
-     2142969755,  2145718225,  2146728955,  2147143299,  2147324850,
-     2147407880,  2147460877,  2147476647,  2147481468,  2147482965,
-     2147483647}};
+const FLOAT32 ixheaacd_cos_table[8][31] = {
+    {1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+     1.0000000000f},
+    {0.9369999766f, 0.9376808405f, 0.9382033348f, 0.9391169548f, 0.9406937957f, 0.9433546066f,
+     0.9457064271f, 0.9487929940f, 0.9527334571f, 0.9575835466f, 0.9632775784f, 0.9674328566f,
+     0.9717451334f, 0.9760690331f, 0.9802456498f, 0.9841240048f, 0.9875818491f, 0.9905421734f,
+     0.9929783344f, 0.9949095249f, 0.9963886738f, 0.9979170561f, 0.9988400936f, 0.9993716478f,
+     0.9996666908f, 0.9998259544f, 0.9999424219f, 0.9999813437f, 0.9999940395f, 0.9999980927f,
+     1.0000000000f},
+    {0.8411800265f, 0.8428127766f, 0.8440676332f, 0.8462653756f, 0.8500694633f, 0.8565201163f,
+     0.8622540236f, 0.8698242903f, 0.8795616627f, 0.8916544318f, 0.9059935808f, 0.9165460467f,
+     0.9275664687f, 0.9386759400f, 0.9494492412f, 0.9594737887f, 0.9684119225f, 0.9760481715f,
+     0.9823079705f, 0.9872440100f, 0.9910007119f, 0.9948507547f, 0.9971528649f, 0.9984666705f,
+     0.9991903901f, 0.9995787144f, 0.9998613000f, 0.9999551177f, 0.9999856353f, 0.9999954104f,
+     1.0000000000f},
+    {0.6009200215f, 0.6044946313f, 0.6072516441f, 0.6121006608f, 0.6205559969f, 0.6350733042f,
+     0.6481682062f, 0.6657315493f, 0.6887807250f, 0.7181132436f, 0.7538767457f, 0.7808354497f,
+     0.8095121980f, 0.8388824463f, 0.8677002788f, 0.8946843147f, 0.9187452197f, 0.9391753078f,
+     0.9557289481f, 0.9685774446f, 0.9781784415f, 0.9877888560f, 0.9933770895f, 0.9964889884f,
+     0.9981689453f, 0.9990561008f, 0.9996924996f, 0.9999011159f, 0.9999684095f, 0.9999899864f,
+     1.0000000000f},
+    {0.3676400185f, 0.3724882603f, 0.3762405813f, 0.3828677237f, 0.3945077062f, 0.4147444665f,
+     0.4332729578f, 0.4585359693f, 0.4924084246f, 0.5366908908f, 0.5924285054f, 0.6356533170f,
+     0.6826780438f, 0.7318063974f, 0.7807397842f, 0.8269340992f, 0.8681276441f, 0.9028263092f,
+     0.9305254817f, 0.9516034126f, 0.9670042396f, 0.9819965959f, 0.9904401302f, 0.9950164557f,
+     0.9974341393f, 0.9986900091f, 0.9995777011f, 0.9998650551f, 0.9999570847f, 0.9999864101f,
+     1.0000000000f},
+    {0.0000000317f, 0.0056233243f, 0.0099995006f, 0.0177799836f, 0.0316069759f, 0.0561454296f,
+     0.0791834071f, 0.1115021780f, 0.1565355211f, 0.2184644639f, 0.3015113473f, 0.3698741496f,
+     0.4480625093f, 0.5336171389f, 0.6219832897f, 0.7071067691f, 0.7830305099f, 0.8457261920f,
+     0.8940022588f, 0.9290818572f, 0.9534626007f, 0.9758449197f, 0.9876723289f, 0.9937641621f,
+     0.9968600869f, 0.9984226227f, 0.9995003939f, 0.9998419285f, 0.9999499917f, 0.9999842048f,
+     1.0000000000f},
+    {-0.5889999866f, -0.5853092074f, -0.5824112892f, -0.5772026181f, -0.5677633882f,
+     -0.5504089594f, -0.5333698392f, -0.5081486106f, -0.4701685011f, -0.4117408693f,
+     -0.3198074102f, -0.2298880965f, -0.1080254018f, 0.0518490225f,  0.2462531030f,
+     0.4533210695f,  0.6382039785f,  0.7765069604f,  0.8670309186f,  0.9218929410f,
+     0.9540585279f,  0.9789677858f,  0.9901686311f,  0.9953197837f,  0.9977401495f,
+     0.9988972545f,  0.9996611476f,  0.9998945594f,  0.9999669790f,  0.9999896288f,
+     1.0000000000f},
+    {-0.9900000095f, -0.9898871779f, -0.9897980094f, -0.9896365404f, -0.9893398881f,
+     -0.9887800813f, -0.9882112741f, -0.9873316884f, -0.9859125018f, -0.9834672213f,
+     -0.9787774086f, -0.9727541804f, -0.9607902765f, -0.9307383299f, -0.8111730814f,
+     0.0707106814f,  0.8855584264f,  0.9730173349f,  0.9902969599f,  0.9957315326f,
+     0.9978980422f,  0.9991779327f,  0.9996485710f,  0.9998415112f,  0.9999260306f,
+     0.9999647141f,  0.9999893904f,  0.9999967217f,  0.9999989867f,  0.9999997020f,
+     1.0000000000f}};
 
-const WORD32
-    ixheaacd_mps_polyphase_filter_coeff_fix[10 * MAX_NUM_QMF_BANDS_SAC / 2] = {
-        0x00000000, 0x0055dba0, 0xffede50e, 0x005b5370, 0xffed978a, 0x006090c3,
-        0xffefc9b9, 0x0065fde5, 0xfff0065d, 0x006b47fa, 0xffeff6cb, 0x0070c8a4,
-        0xffef7b8b, 0x0075fdec, 0xffeedfa4, 0x007b3874, 0xffee1650, 0x00807993,
-        0xffed651e, 0x0085c217, 0xffecc31c, 0x008a7dd6, 0xffebe77b, 0x008f4bfc,
-        0xffeb50b3, 0x009424c5, 0xffea9193, 0x0098b855, 0xffe9ca76, 0x009d10bf,
-        0xffe940f4, 0x00a1039c, 0xffe88ba8, 0x00a520bb, 0xffe83a08, 0x00a8739d,
-        0xffe79e16, 0x00abe79d, 0xffe7746f, 0x00af374c, 0xffe6d466, 0x00b1978d,
-        0xffe6afee, 0x00b3d15b, 0xffe65416, 0x00b5c866, 0xffe681c6, 0x00b74c36,
-        0xffe66dd0, 0x00b8394b, 0xffe66fac, 0x00b8fe0d, 0xffe69424, 0x00b8c6b0,
-        0xffe6fed4, 0x00b85f70, 0xffe75361, 0x00b73aaf, 0xffe80415, 0x00b58c8c,
-        0xffe85b4b, 0x00b36acd, 0xffe954d1, 0x00b06b68, 0xffea353b, 0x00acbd2e,
-        0xffeb3849, 0x00a85e93, 0xffec8409, 0x00a3508f, 0xffedc419, 0x009da525,
-        0xffef2395, 0x0096dcc1, 0xfff0e7f0, 0x008f87aa, 0xfff294c4, 0x00872c62,
-        0xfff48701, 0x007e0392, 0xfff681d7, 0x007400b7, 0xfff91fca, 0x006928a0,
-        0xfffb42b1, 0x005d36de, 0xfffdfa25, 0x00504f40, 0x00007134, 0x00426f36,
-        0x00039608, 0x0033b926, 0x0006b1ce, 0x0023b989, 0x0009aa3e, 0x00131c75,
-        0x000d31b4, 0x0000e790, 0x0010bc63, 0xffee183b, 0x001471f7, 0xffda17f2,
-        0x0018703e, 0xffc4e365, 0x001c3549, 0xffaea5d6, 0x002064f7, 0xff975c02,
-        0x0024dd50, 0xff7ee3f2, 0x00293718, 0xff6542d1, 0x002d8e42, 0xff4aabc9,
-        0x00329ab6, 0xff2ef726, 0x003745f9, 0xff120d71, 0x003c1fa3, 0xfef3f6ac,
-        0x004103f4, 0xfed4bec3, 0x00465347, 0xfeb48d0d, 0x004b6c45, 0xfe933dc1,
-        0x0050b176, 0xfe70b8d1, 0x01b2e41c, 0x09015651, 0x01d78bfb, 0x08d3e41b,
-        0x01fd3ba0, 0x08a24899, 0x02244a24, 0x086b1eeb, 0x024bf7a1, 0x082f552e,
-        0x0274ba42, 0x07ee507b, 0x029e35b4, 0x07a8127c, 0x02c89900, 0x075ca90c,
-        0x02f3e48d, 0x070bbf58, 0x03201115, 0x06b559c3, 0x034d01f0, 0x06593911,
-        0x037ad437, 0x05f7fb90, 0x03a966bb, 0x0590a67d, 0x03d8afe6, 0x05237f9c,
-        0x04083fec, 0x04b0adcb, 0x043889c5, 0x0437fb0a, 0x04694101, 0x03b8f8db,
-        0x049aa82e, 0x03343533, 0x04cc2fce, 0x02a99097, 0x04fe20bd, 0x02186a91,
-        0x05303f87, 0x01816e05, 0x05626209, 0x00e42fa2, 0x05950122, 0x0040c496,
-        0x05c76fec, 0xff96db90, 0x05f9c050, 0xfee723c7, 0x062bf5eb, 0xfe310658,
-        0x065dd569, 0xfd7475d8, 0x068f8b44, 0xfcb1d740, 0x06c0f0c0, 0xfbe8f5be,
-        0x06f1825c, 0xfb19b7be, 0x0721bf21, 0xfa44a06a, 0x075112a1, 0xf96916f5,
-        0x077fedb2, 0xf887507c, 0x07ad8c26, 0xf79fa13b, 0x07da2b7f, 0xf6b1f3c3,
-        0x08061671, 0xf5be0fa9, 0x08303897, 0xf4c473c6, 0x08594887, 0xf3c4e887,
-        0x0880ffdc, 0xf2bf6ea5, 0x08a75da4, 0xf1b461ab, 0x08cb4e22, 0xf0a395a0,
-        0x08edfeaa, 0xef8d4d7c, 0x090ec1fc, 0xee71b2ff, 0x092d796f, 0xed50a31e,
-        0x0949eaac, 0xec2a3f60, 0x0963ed46, 0xeafee7f2, 0x097c1ee8, 0xe9cea84b,
-        0x099140a6, 0xe89971b7, 0x09a3e163, 0xe75f8bb8, 0x09b3d77f, 0xe620c476,
-        0x09c0e59e, 0xe4de0cb0, 0x09cab9f1, 0xe396a45e, 0x09d19ca8, 0xe24b8f67,
-        0x09d52709, 0xe0fc421f, 0x09d5560a, 0xdfa93ab5, 0x09d1fa22, 0xde529087,
-        0x09caeb0e, 0xdcf898fb, 0x09c018ce, 0xdb9b5b13, 0x09b18a1c, 0xda3b176b,
-        0x099ec3db, 0xd8d7f220, 0x09881dc5, 0xd7722f05, 0x096d0e21, 0xd60a46e6,
-        0x094d7ec2, 0xd49fd55f, 0x09299ead, 0xd3337b3e, 0x2e3a7532, 0x6d474e1d,
-        0x2faa221c, 0x6d41d963, 0x311af3a4, 0x6d32730f, 0x328cc6f0, 0x6d18520d,
-        0x33ff670e, 0x6cf4073e, 0x3572ec70, 0x6cc59baa, 0x36e69691, 0x6c8c4c7a,
-        0x385a49c3, 0x6c492216, 0x39ce0477, 0x6bfbdd97, 0x3b415115, 0x6ba4629e,
-        0x3cb41218, 0x6b42a863, 0x3e25b17e, 0x6ad73e8d, 0x3f962fb8, 0x6a619c5e,
-        0x41058bc5, 0x69e29784, 0x4272a385, 0x6959709d, 0x43de620a, 0x68c7269b,
-        0x4547daea, 0x682b39a3, 0x46aea856, 0x6785c24d, 0x4812f848, 0x66d76725,
-        0x4973fef1, 0x661fd6b7, 0x4ad237a2, 0x655f63f1, 0x4c2ca3df, 0x64964062,
-        0x4d83976c, 0x63c45243, 0x4ed62be2, 0x62ea6473, 0x5024d70e, 0x6207f21f,
-        0x516eefb9, 0x611d58a2, 0x52b449dd, 0x602b0c7f, 0x53f495a9, 0x5f30ff5f,
-        0x552f8ff6, 0x5e2f6366, 0x56654bdd, 0x5d26be9b, 0x579505f5, 0x5c16d0ae,
-        0x58befacd, 0x5b001db7, 0x59e2f69e, 0x59e2f69e, 0x5b001db7, 0x58befacd,
-        0x5c16d0ae, 0x579505f5, 0x5d26be9b, 0x56654bdd, 0x5e2f6366, 0x552f8ff6,
-        0x5f30ff5f, 0x53f495a9, 0x602b0c7f, 0x52b449dd, 0x611d58a2, 0x516eefb9,
-        0x6207f21f, 0x5024d70e, 0x62ea6473, 0x4ed62be2, 0x63c45243, 0x4d83976c,
-        0x64964062, 0x4c2ca3df, 0x655f63f1, 0x4ad237a2, 0x661fd6b7, 0x4973fef1,
-        0x66d76725, 0x4812f848, 0x6785c24d, 0x46aea856, 0x682b39a3, 0x4547daea,
-        0x68c7269b, 0x43de620a, 0x6959709d, 0x4272a385, 0x69e29784, 0x41058bc5,
-        0x6a619c5e, 0x3f962fb8, 0x6ad73e8d, 0x3e25b17e, 0x6b42a863, 0x3cb41218,
-        0x6ba4629e, 0x3b415115, 0x6bfbdd97, 0x39ce0477, 0x6c492216, 0x385a49c3,
-        0x6c8c4c7a, 0x36e69691, 0x6cc59baa, 0x3572ec70, 0x6cf4073e, 0x33ff670e,
-        0x6d18520d, 0x328cc6f0, 0x6d32730f, 0x311af3a4, 0x6d41d963, 0x2faa221c,
-        0xd1c58ace, 0x09015651, 0xd3337b3e, 0x09299ead, 0xd49fd55f, 0x094d7ec2,
-        0xd60a46e6, 0x096d0e21, 0xd7722f05, 0x09881dc5, 0xd8d7f220, 0x099ec3db,
-        0xda3b176b, 0x09b18a1c, 0xdb9b5b13, 0x09c018ce, 0xdcf898fb, 0x09caeb0e,
-        0xde529087, 0x09d1fa22, 0xdfa93ab5, 0x09d5560a, 0xe0fc421f, 0x09d52709,
-        0xe24b8f67, 0x09d19ca8, 0xe396a45e, 0x09cab9f1, 0xe4de0cb0, 0x09c0e59e,
-        0xe620c476, 0x09b3d77f, 0xe75f8bb8, 0x09a3e163, 0xe89971b7, 0x099140a6,
-        0xe9cea84b, 0x097c1ee8, 0xeafee7f2, 0x0963ed46, 0xec2a3f60, 0x0949eaac,
-        0xed50a31e, 0x092d796f, 0xee71b2ff, 0x090ec1fc, 0xef8d4d7c, 0x08edfeaa,
-        0xf0a395a0, 0x08cb4e22, 0xf1b461ab, 0x08a75da4, 0xf2bf6ea5, 0x0880ffdc,
-        0xf3c4e887, 0x08594887, 0xf4c473c6, 0x08303897, 0xf5be0fa9, 0x08061671,
-        0xf6b1f3c3, 0x07da2b7f, 0xf79fa13b, 0x07ad8c26, 0xf887507c, 0x077fedb2,
-        0xf96916f5, 0x075112a1, 0xfa44a06a, 0x0721bf21, 0xfb19b7be, 0x06f1825c,
-        0xfbe8f5be, 0x06c0f0c0, 0xfcb1d740, 0x068f8b44, 0xfd7475d8, 0x065dd569,
-        0xfe310658, 0x062bf5eb, 0xfee723c7, 0x05f9c050, 0xff96db90, 0x05c76fec,
-        0x0040c496, 0x05950122, 0x00e42fa2, 0x05626209, 0x01816e05, 0x05303f87,
-        0x02186a91, 0x04fe20bd, 0x02a99097, 0x04cc2fce, 0x03343533, 0x049aa82e,
-        0x03b8f8db, 0x04694101, 0x0437fb0a, 0x043889c5, 0x04b0adcb, 0x04083fec,
-        0x05237f9c, 0x03d8afe6, 0x0590a67d, 0x03a966bb, 0x05f7fb90, 0x037ad437,
-        0x06593911, 0x034d01f0, 0x06b559c3, 0x03201115, 0x070bbf58, 0x02f3e48d,
-        0x075ca90c, 0x02c89900, 0x07a8127c, 0x029e35b4, 0x07ee507b, 0x0274ba42,
-        0x082f552e, 0x024bf7a1, 0x086b1eeb, 0x02244a24, 0x08a24899, 0x01fd3ba0,
-        0x08d3e41b, 0x01d78bfb, 0xfe4d1be4, 0x0055dba0, 0xfe70b8d1, 0x0050b176,
-        0xfe933dc1, 0x004b6c45, 0xfeb48d0d, 0x00465347, 0xfed4bec3, 0x004103f4,
-        0xfef3f6ac, 0x003c1fa3, 0xff120d71, 0x003745f9, 0xff2ef726, 0x00329ab6,
-        0xff4aabc9, 0x002d8e42, 0xff6542d1, 0x00293718, 0xff7ee3f2, 0x0024dd50,
-        0xff975c02, 0x002064f7, 0xffaea5d6, 0x001c3549, 0xffc4e365, 0x0018703e,
-        0xffda17f2, 0x001471f7, 0xffee183b, 0x0010bc63, 0x0000e790, 0x000d31b4,
-        0x00131c75, 0x0009aa3e, 0x0023b989, 0x0006b1ce, 0x0033b926, 0x00039608,
-        0x00426f36, 0x00007134, 0x00504f40, 0xfffdfa25, 0x005d36de, 0xfffb42b1,
-        0x006928a0, 0xfff91fca, 0x007400b7, 0xfff681d7, 0x007e0392, 0xfff48701,
-        0x00872c62, 0xfff294c4, 0x008f87aa, 0xfff0e7f0, 0x0096dcc1, 0xffef2395,
-        0x009da525, 0xffedc419, 0x00a3508f, 0xffec8409, 0x00a85e93, 0xffeb3849,
-        0x00acbd2e, 0xffea353b, 0x00b06b68, 0xffe954d1, 0x00b36acd, 0xffe85b4b,
-        0x00b58c8c, 0xffe80415, 0x00b73aaf, 0xffe75361, 0x00b85f70, 0xffe6fed4,
-        0x00b8c6b0, 0xffe69424, 0x00b8fe0d, 0xffe66fac, 0x00b8394b, 0xffe66dd0,
-        0x00b74c36, 0xffe681c6, 0x00b5c866, 0xffe65416, 0x00b3d15b, 0xffe6afee,
-        0x00b1978d, 0xffe6d466, 0x00af374c, 0xffe7746f, 0x00abe79d, 0xffe79e16,
-        0x00a8739d, 0xffe83a08, 0x00a520bb, 0xffe88ba8, 0x00a1039c, 0xffe940f4,
-        0x009d10bf, 0xffe9ca76, 0x0098b855, 0xffea9193, 0x009424c5, 0xffeb50b3,
-        0x008f4bfc, 0xffebe77b, 0x008a7dd6, 0xffecc31c, 0x0085c217, 0xffed651e,
-        0x00807993, 0xffee1650, 0x007b3874, 0xffeedfa4, 0x0075fdec, 0xffef7b8b,
-        0x0070c8a4, 0xffeff6cb, 0x006b47fa, 0xfff0065d, 0x0065fde5, 0xffefc9b9,
-        0x006090c3, 0xffed978a, 0x005b5370, 0xffede50e};
+const FLOAT32 ixheaacd_mps_polyphase_filter_coeff[10 * MAX_NUM_QMF_BANDS_SAC / 2] = {
+    0.000000f,  0.002620f,  -0.000553f, 0.002787f,  -0.000562f, 0.002947f,  -0.000495f,
+    0.003113f,  -0.000488f, 0.003274f,  -0.000489f, 0.003442f,  -0.000504f, 0.003601f,
+    -0.000523f, 0.003760f,  -0.000547f, 0.003921f,  -0.000568f, 0.004082f,  -0.000587f,
+    0.004226f,  -0.000613f, 0.004373f,  -0.000631f, 0.004521f,  -0.000654f, 0.004661f,
+    -0.000678f, 0.004793f,  -0.000694f, 0.004914f,  -0.000716f, 0.005039f,  -0.000726f,
+    0.005141f,  -0.000744f, 0.005246f,  -0.000749f, 0.005347f,  -0.000768f, 0.005420f,
+    -0.000772f, 0.005488f,  -0.000783f, 0.005548f,  -0.000778f, 0.005594f,  -0.000780f,
+    0.005622f,  -0.000780f, 0.005646f,  -0.000776f, 0.005639f,  -0.000763f, 0.005627f,
+    -0.000753f, 0.005592f,  -0.000732f, 0.005540f,  -0.000722f, 0.005475f,  -0.000692f,
+    0.005384f,  -0.000665f, 0.005272f,  -0.000634f, 0.005138f,  -0.000595f, 0.004984f,
+    -0.000556f, 0.004811f,  -0.000515f, 0.004604f,  -0.000461f, 0.004380f,  -0.000410f,
+    0.004125f,  -0.000350f, 0.003846f,  -0.000290f, 0.003540f,  -0.000210f, 0.003209f,
+    -0.000145f, 0.002845f,  -0.000062f, 0.002451f,  0.000013f,  0.002027f,  0.000109f,
+    0.001578f,  0.000204f,  0.001090f,  0.000295f,  0.000583f,  0.000403f,  0.000028f,
+    0.000511f,  -0.000546f, 0.000624f,  -0.001157f, 0.000746f,  -0.001804f, 0.000861f,
+    -0.002483f, 0.000989f,  -0.003193f, 0.001125f,  -0.003940f, 0.001258f,  -0.004722f,
+    0.001390f,  -0.005534f, 0.001544f,  -0.006379f, 0.001687f,  -0.007262f, 0.001835f,
+    -0.008180f, 0.001984f,  -0.009133f, 0.002146f,  -0.010115f, 0.002302f,  -0.011132f,
+    0.002463f,  -0.012185f, 0.013272f,  0.070353f,  0.014390f,  0.068966f,  0.015541f,
+    0.067453f,  0.016732f,  0.065769f,  0.017943f,  0.063944f,  0.019187f,  0.061960f,
+    0.020453f,  0.059817f,  0.021747f,  0.057515f,  0.023068f,  0.055046f,  0.024416f,
+    0.052409f,  0.025788f,  0.049598f,  0.027186f,  0.046630f,  0.028607f,  0.043477f,
+    0.030050f,  0.040146f,  0.031502f,  0.036642f,  0.032975f,  0.032958f,  0.034462f,
+    0.029082f,  0.035970f,  0.025031f,  0.037481f,  0.020800f,  0.039005f,  0.016370f,
+    0.040535f,  0.011762f,  0.042065f,  0.006964f,  0.043610f,  0.001977f,  0.045149f,
+    -0.003209f, 0.046684f,  -0.008571f, 0.048217f,  -0.014129f, 0.049739f,  -0.019883f,
+    0.051256f,  -0.025823f, 0.052763f,  -0.031953f, 0.054245f,  -0.038278f, 0.055717f,
+    -0.044781f, 0.057162f,  -0.051480f, 0.058592f,  -0.058371f, 0.059984f,  -0.065441f,
+    0.061346f,  -0.072694f, 0.062686f,  -0.080137f, 0.063972f,  -0.087755f, 0.065225f,
+    -0.095553f, 0.066437f,  -0.103533f, 0.067608f,  -0.111683f, 0.068704f,  -0.120008f,
+    0.069763f,  -0.128500f, 0.070763f,  -0.137155f, 0.071700f,  -0.145977f, 0.072568f,
+    -0.154961f, 0.073362f,  -0.164096f, 0.074100f,  -0.173381f, 0.074745f,  -0.182817f,
+    0.075314f,  -0.192397f, 0.075801f,  -0.202125f, 0.076199f,  -0.211974f, 0.076499f,
+    -0.221965f, 0.076709f,  -0.232069f, 0.076817f,  -0.242302f, 0.076823f,  -0.252648f,
+    0.076720f,  -0.263105f, 0.076505f,  -0.273663f, 0.076175f,  -0.284321f, 0.075731f,
+    -0.295072f, 0.075158f,  -0.305910f, 0.074466f,  -0.316828f, 0.073641f,  -0.327811f,
+    0.072677f,  -0.338872f, 0.071583f,  -0.349991f, 0.361159f,  0.853739f,  0.372380f,
+    0.853572f,  0.383635f,  0.853102f,  0.394921f,  0.852305f,  0.406232f,  0.851197f,
+    0.417570f,  0.849780f,  0.428912f,  0.848032f,  0.440255f,  0.845982f,  0.451600f,
+    0.843624f,  0.462931f,  0.840954f,  0.474245f,  0.837972f,  0.485525f,  0.834694f,
+    0.496771f,  0.831104f,  0.507982f,  0.827228f,  0.519123f,  0.823042f,  0.530224f,
+    0.818578f,  0.541255f,  0.813819f,  0.552205f,  0.808770f,  0.563079f,  0.803449f,
+    0.573852f,  0.797847f,  0.584540f,  0.791974f,  0.595112f,  0.785835f,  0.605578f,
+    0.779429f,  0.615911f,  0.772778f,  0.626124f,  0.765867f,  0.636198f,  0.758708f,
+    0.646127f,  0.751314f,  0.655902f,  0.743683f,  0.665514f,  0.735821f,  0.674966f,
+    0.727745f,  0.684235f,  0.719446f,  0.693328f,  0.710941f,  0.702239f,  0.702239f,
+    0.710941f,  0.693328f,  0.719446f,  0.684235f,  0.727745f,  0.674966f,  0.735821f,
+    0.665514f,  0.743683f,  0.655902f,  0.751314f,  0.646127f,  0.758708f,  0.636198f,
+    0.765867f,  0.626124f,  0.772778f,  0.615911f,  0.779429f,  0.605578f,  0.785835f,
+    0.595112f,  0.791974f,  0.584540f,  0.797847f,  0.573852f,  0.803449f,  0.563079f,
+    0.808770f,  0.552205f,  0.813819f,  0.541255f,  0.818578f,  0.530224f,  0.823042f,
+    0.519123f,  0.827228f,  0.507982f,  0.831104f,  0.496771f,  0.834694f,  0.485525f,
+    0.837972f,  0.474245f,  0.840954f,  0.462931f,  0.843624f,  0.451600f,  0.845982f,
+    0.440255f,  0.848032f,  0.428912f,  0.849780f,  0.417570f,  0.851197f,  0.406232f,
+    0.852305f,  0.394921f,  0.853102f,  0.383635f,  0.853572f,  0.372380f,  -0.361159f,
+    0.070353f,  -0.349991f, 0.071583f,  -0.338872f, 0.072677f,  -0.327811f, 0.073641f,
+    -0.316828f, 0.074466f,  -0.305910f, 0.075158f,  -0.295072f, 0.075731f,  -0.284321f,
+    0.076175f,  -0.273663f, 0.076505f,  -0.263105f, 0.076720f,  -0.252648f, 0.076823f,
+    -0.242302f, 0.076817f,  -0.232069f, 0.076709f,  -0.221965f, 0.076499f,  -0.211974f,
+    0.076199f,  -0.202125f, 0.075801f,  -0.192397f, 0.075314f,  -0.182817f, 0.074745f,
+    -0.173381f, 0.074100f,  -0.164096f, 0.073362f,  -0.154961f, 0.072568f,  -0.145977f,
+    0.071700f,  -0.137155f, 0.070763f,  -0.128500f, 0.069763f,  -0.120008f, 0.068704f,
+    -0.111683f, 0.067608f,  -0.103533f, 0.066437f,  -0.095553f, 0.065225f,  -0.087755f,
+    0.063972f,  -0.080137f, 0.062686f,  -0.072694f, 0.061346f,  -0.065441f, 0.059984f,
+    -0.058371f, 0.058592f,  -0.051480f, 0.057162f,  -0.044781f, 0.055717f,  -0.038278f,
+    0.054245f,  -0.031953f, 0.052763f,  -0.025823f, 0.051256f,  -0.019883f, 0.049739f,
+    -0.014129f, 0.048217f,  -0.008571f, 0.046684f,  -0.003209f, 0.045149f,  0.001977f,
+    0.043610f,  0.006964f,  0.042065f,  0.011762f,  0.040535f,  0.016370f,  0.039005f,
+    0.020800f,  0.037481f,  0.025031f,  0.035970f,  0.029082f,  0.034462f,  0.032958f,
+    0.032975f,  0.036642f,  0.031502f,  0.040146f,  0.030050f,  0.043477f,  0.028607f,
+    0.046630f,  0.027186f,  0.049598f,  0.025788f,  0.052409f,  0.024416f,  0.055046f,
+    0.023068f,  0.057515f,  0.021747f,  0.059817f,  0.020453f,  0.061960f,  0.019187f,
+    0.063944f,  0.017943f,  0.065769f,  0.016732f,  0.067453f,  0.015541f,  0.068966f,
+    0.014390f,  -0.013272f, 0.002620f,  -0.012185f, 0.002463f,  -0.011132f, 0.002302f,
+    -0.010115f, 0.002146f,  -0.009133f, 0.001984f,  -0.008180f, 0.001835f,  -0.007262f,
+    0.001687f,  -0.006379f, 0.001544f,  -0.005534f, 0.001390f,  -0.004722f, 0.001258f,
+    -0.003940f, 0.001125f,  -0.003193f, 0.000989f,  -0.002483f, 0.000861f,  -0.001804f,
+    0.000746f,  -0.001157f, 0.000624f,  -0.000546f, 0.000511f,  0.000028f,  0.000403f,
+    0.000583f,  0.000295f,  0.001090f,  0.000204f,  0.001578f,  0.000109f,  0.002027f,
+    0.000013f,  0.002451f,  -0.000062f, 0.002845f,  -0.000145f, 0.003209f,  -0.000210f,
+    0.003540f,  -0.000290f, 0.003846f,  -0.000350f, 0.004125f,  -0.000410f, 0.004380f,
+    -0.000461f, 0.004604f,  -0.000515f, 0.004811f,  -0.000556f, 0.004984f,  -0.000595f,
+    0.005138f,  -0.000634f, 0.005272f,  -0.000665f, 0.005384f,  -0.000692f, 0.005475f,
+    -0.000722f, 0.005540f,  -0.000732f, 0.005592f,  -0.000753f, 0.005627f,  -0.000763f,
+    0.005639f,  -0.000776f, 0.005646f,  -0.000780f, 0.005622f,  -0.000780f, 0.005594f,
+    -0.000778f, 0.005548f,  -0.000783f, 0.005488f,  -0.000772f, 0.005420f,  -0.000768f,
+    0.005347f,  -0.000749f, 0.005246f,  -0.000744f, 0.005141f,  -0.000726f, 0.005039f,
+    -0.000716f, 0.004914f,  -0.000694f, 0.004793f,  -0.000678f, 0.004661f,  -0.000654f,
+    0.004521f,  -0.000631f, 0.004373f,  -0.000613f, 0.004226f,  -0.000587f, 0.004082f,
+    -0.000568f, 0.003921f,  -0.000547f, 0.003760f,  -0.000523f, 0.003601f,  -0.000504f,
+    0.003442f,  -0.000489f, 0.003274f,  -0.000488f, 0.003113f,  -0.000495f, 0.002947f,
+    -0.000562f, 0.002787f,  -0.000553f};
 
-const WORD32 ixheaacd_mps_pre_re[64] = {
-    0x01fff621, 0x01ffa72e, 0x01ff0956, 0x01fe1caf, 0x01fce15f, 0x01fb5797,
-    0x01f97f92, 0x01f7599a, 0x01f4e603, 0x01f2252f, 0x01ef178a, 0x01ebbd8c,
-    0x01e817ba, 0x01e426a4, 0x01dfeae6, 0x01db6526, 0x01d69617, 0x01d17e77,
-    0x01cc1f0f, 0x01c678b3, 0x01c08c42, 0x01ba5aa6, 0x01b3e4d3, 0x01ad2bc9,
-    0x01a63091, 0x019ef43e, 0x019777ee, 0x018fbcc9, 0x0187c400, 0x017f8ecd,
-    0x01771e75, 0x016e7444, 0x01659191, 0x015c77bb, 0x01532828, 0x0149a449,
-    0x013fed94, 0x0136058a, 0x012bedb1, 0x0121a798, 0x011734d5, 0x010c9704,
-    0x0101cfc7, 0x00f6e0c9, 0x00ebcbb9, 0x00e0924d, 0x00d53640, 0x00c9b952,
-    0x00be1d48, 0x00b263ed, 0x00a68f10, 0x009aa084, 0x008e9a20, 0x00827dbf,
-    0x00764d3e, 0x006a0a7f, 0x005db766, 0x005155d9, 0x0044e7c1, 0x00386f0a,
-    0x002bed9e, 0x001f656d, 0x0012d864, 0x00064873};
+const FLOAT32 ixheaacd_mps_post_twid[30] = {
+    0.998795f, 0.049068f, 0.995185f, 0.098017f, 0.989177f, 0.146730f, 0.980785f, 0.195090f,
+    0.970031f, 0.242980f, 0.956940f, 0.290285f, 0.941544f, 0.336890f, 0.923880f, 0.382683f,
+    0.903989f, 0.427555f, 0.881921f, 0.471397f, 0.857729f, 0.514103f, 0.831470f, 0.555570f,
+    0.803208f, 0.595699f, 0.773010f, 0.634393f, 0.740951f, 0.671559f};
 
-const WORD32 ixheaacd_mps_pre_im[64] = {
-    0x00064874, 0x0012d865, 0x001f656e, 0x002beda0, 0x00386f0b, 0x0044e7c3,
-    0x005155da, 0x005db767, 0x006a0a80, 0x00764d3f, 0x00827dc0, 0x008e9a22,
-    0x009aa086, 0x00a68f12, 0x00b263ef, 0x00be1d49, 0x00c9b953, 0x00d53641,
-    0x00e0924f, 0x00ebcbbb, 0x00f6e0cb, 0x0101cfc8, 0x010c9705, 0x011734d6,
-    0x0121a79a, 0x012bedb2, 0x0136058b, 0x013fed95, 0x0149a44a, 0x01532829,
-    0x015c77bc, 0x01659192, 0x016e7445, 0x01771e76, 0x017f8ece, 0x0187c401,
-    0x018fbcca, 0x019777ef, 0x019ef43f, 0x01a63092, 0x01ad2bca, 0x01b3e4d4,
-    0x01ba5aa6, 0x01c08c42, 0x01c678b3, 0x01cc1f0f, 0x01d17e77, 0x01d69617,
-    0x01db6526, 0x01dfeae6, 0x01e426a5, 0x01e817bb, 0x01ebbd8c, 0x01ef178a,
-    0x01f2252f, 0x01f4e603, 0x01f7599a, 0x01f97f92, 0x01fb5797, 0x01fce15f,
-    0x01fe1caf, 0x01ff0956, 0x01ffa72f, 0x01fff621};
+const FLOAT32 ixheaacd_ldmps_pre_twid[32] = {
+    0.0156202940f, 0.0003834558f, 0.0155826630f, 0.0011494453f, 0.0155074932f, 0.0019126660f,
+    0.0153949633f, 0.0026712785f, 0.0152453454f, 0.0034234561f, 0.0150590008f, 0.0041673859f,
+    0.0148363775f, 0.0049012764f, 0.0145780127f, 0.0056233592f, 0.0142845269f, 0.0063318950f,
+    0.0139566287f, 0.0070251762f, 0.0135951089f, 0.0077015338f, 0.0132008363f, 0.0083593372f,
+    0.0127747618f, 0.0089970026f, 0.0123179127f, 0.0096129924f, 0.0118313879f, 0.0102058258f,
+    0.0113163600f, 0.0107740704f};
 
-const WORD32 ixheaacd_mps_post_re[128] = {
-    0x7fffffff, 0x7ff62182, 0x7fd8878d, 0x7fa736b3, 0x7f62368e, 0x7f0991c2,
-    0x7e9d55fa, 0x7e1d93e8, 0x7d8a5f3d, 0x7ce3ceae, 0x7c29fbea, 0x7b5d0399,
-    0x7a7d0555, 0x798a23ab, 0x7884840c, 0x776c4ed3, 0x7641af33, 0x7504d33b,
-    0x73b5ebc5, 0x72552c78, 0x70e2cbb8, 0x6f5f02a2, 0x6dca0d03, 0x6c24294e,
-    0x6a6d9890, 0x68a69e6b, 0x66cf8109, 0x64e8890d, 0x62f20192, 0x60ec3814,
-    0x5ed77c6c, 0x5cb420c0, 0x5a827978, 0x5842dd31, 0x55f5a4ad, 0x539b2ac8,
-    0x5133cc6b, 0x4ebfe879, 0x4c3fdfc6, 0x49b41504, 0x471cecb5, 0x447acd1d,
-    0x41ce1e2f, 0x3f174981, 0x3c56ba37, 0x398cdcf7, 0x36ba1fd6, 0x33def248,
-    0x30fbc50c, 0x2e110a1e, 0x2b1f34a6, 0x2826b8e1, 0x25280c14, 0x2223a47a,
-    0x1f19f92e, 0x1c0b821b, 0x18f8b7eb, 0x15e213f2, 0x12c8101a, 0x0fab26d5,
-    0x0c8bd306, 0x096a8ff0, 0x0647d921, 0x03242a62, 0xffffffa3, 0xfcdbd4e2,
-    0xf9b82624, 0xf6956f55, 0xf3742c3f, 0xf054d871, 0xed37ef2c, 0xea1deb55,
-    0xe707475d, 0xe3f47d2e, 0xe0e6061c, 0xdddc5ad1, 0xdad7f338, 0xd7d9466d,
-    0xd4e0caa9, 0xd1eef532, 0xcf043a47, 0xcc210d0d, 0xc945df80, 0xc6732261,
-    0xc3a94524, 0xc0e8b5dc, 0xbe31e130, 0xbb853244, 0xb8e312ae, 0xb64bea62,
-    0xb3c01fa3, 0xb14016f3, 0xaecc3304, 0xac64d4aa, 0xaa0a5ac8, 0xa7bd2247,
-    0xa57d8603, 0xa34bdebf, 0xa1288316, 0x9f13c772, 0x9d0dfdf7, 0x9b17767f,
-    0x99307e88, 0x97596128, 0x95926708, 0x93dbd64e, 0x9235f29c, 0x90a0fd01,
-    0x8f1d33f0, 0x8daad334, 0x8c4a13eb, 0x8afb2c79, 0x89be5085, 0x8893b0ea,
-    0x877b7bb4, 0x8675dc1a, 0x8582fa74, 0x84a2fc35, 0x83d603e8, 0x831c3129,
-    0x8275a09e, 0x81e26bf8, 0x8162a9ea, 0x80f66e27, 0x809dc95f, 0x8058c93f,
-    0x8027786a, 0x8009de7a};
+const FLOAT32 ixheaacd_mps_post_re_32[64] = {
+    1.0000000000f,  0.9987954497f,  0.9951847196f,  0.9891765118f,  0.9807852507f,
+    0.9700312614f,  0.9569403529f,  0.9415440559f,  0.9238795042f,  0.9039893150f,
+    0.8819212317f,  0.8577286005f,  0.8314695954f,  0.8032075167f,  0.7730104327f,
+    0.7409511209f,  0.7071067691f,  0.6715589166f,  0.6343932748f,  0.5956993103f,
+    0.5555701852f,  0.5141026974f,  0.4713966548f,  0.4275551140f,  0.3826834261f,
+    0.3368898332f,  0.2902846336f,  0.2429801226f,  0.1950902343f,  0.1467304826f,
+    0.0980171338f,  0.0490676500f,  -0.0000000433f, -0.0490677357f, -0.0980172232f,
+    -0.1467305720f, -0.1950903237f, -0.2429801971f, -0.2902847230f, -0.3368899226f,
+    -0.3826835155f, -0.4275550842f, -0.4713968337f, -0.5141027570f, -0.5555703640f,
+    -0.5956993699f, -0.6343932748f, -0.6715590358f, -0.7071067691f, -0.7409512401f,
+    -0.7730104923f, -0.8032076359f, -0.8314696550f, -0.8577286005f, -0.8819213510f,
+    -0.9039893150f, -0.9238796234f, -0.9415441155f, -0.9569403529f, -0.9700312614f,
+    -0.9807853103f, -0.9891765118f, -0.9951847196f, -0.9987954497f};
 
-const WORD32 ixheaacd_mps_post_im[128] = {
-    0x00000000, 0x03242ac0, 0x0647d97f, 0x096a904d, 0x0c8bd363, 0x0fab2732,
-    0x12c81077, 0x15e2144e, 0x18f8b847, 0x1c0b8277, 0x1f19f989, 0x2223a4d4,
-    0x25280c6e, 0x2826b93a, 0x2b1f34fe, 0x2e110a76, 0x30fbc563, 0x33def29e,
-    0x36ba202b, 0x398cdd4b, 0x3c56ba89, 0x3f1749d2, 0x41ce1e80, 0x447acd6c,
-    0x471ced03, 0x49b41551, 0x4c3fe012, 0x4ebfe8c3, 0x5133ccb3, 0x539b2b0f,
-    0x55f5a4f2, 0x5842dd75, 0x5a8279bb, 0x5cb42101, 0x5ed77cab, 0x60ec3851,
-    0x62f201cd, 0x64e88947, 0x66cf8141, 0x68a69ea2, 0x6a6d98c4, 0x6c242980,
-    0x6dca0d34, 0x6f5f02d0, 0x70e2cbe4, 0x72552ca2, 0x73b5ebed, 0x7504d361,
-    0x7641af57, 0x776c4ef5, 0x7884842c, 0x798a23c8, 0x7a7d0571, 0x7b5d03b2,
-    0x7c29fc01, 0x7ce3cec3, 0x7d8a5f4f, 0x7e1d93f8, 0x7e9d5608, 0x7f0991ce,
-    0x7f623697, 0x7fa736ba, 0x7fd88792, 0x7ff62184, 0x7fffffff, 0x7ff6217f,
-    0x7fd88789, 0x7fa736ac, 0x7f623685, 0x7f0991b7, 0x7e9d55ed, 0x7e1d93d7,
-    0x7d8a5f2b, 0x7ce3ce9a, 0x7c29fbd3, 0x7b5d0380, 0x7a7d053a, 0x798a238d,
-    0x788483ed, 0x776c4eb1, 0x7641af0f, 0x7504d315, 0x73b5eb9d, 0x72552c4e,
-    0x70e2cb8b, 0x6f5f0274, 0x6dca0cd3, 0x6c24291c, 0x6a6d985c, 0x68a69e35,
-    0x66cf80d1, 0x64e888d4, 0x62f20156, 0x60ec37d6, 0x5ed77c2d, 0x5cb4207f,
-    0x5a827936, 0x5842dced, 0x55f5a467, 0x539b2a81, 0x5133cc22, 0x4ebfe82f,
-    0x4c3fdf7b, 0x49b414b7, 0x471cec67, 0x447accce, 0x41ce1ddf, 0x3f17492f,
-    0x3c56b9e4, 0x398cdca3, 0x36ba1f81, 0x33def1f2, 0x30fbc4b5, 0x2e1109c7,
-    0x2b1f344d, 0x2826b888, 0x25280bba, 0x2223a420, 0x1f19f8d3, 0x1c0b81c0,
-    0x18f8b78f, 0x15e21395, 0x12c80fbd, 0x0fab2678, 0x0c8bd2a9, 0x096a8f92,
-    0x0647d8c3, 0x03242a04};
+const FLOAT32 ixheaacd_mps_post_im_32[64] = {
+    0.0000000000f, 0.0490676761f, 0.0980171412f, 0.1467304677f, 0.1950903237f, 0.2429801822f,
+    0.2902846634f, 0.3368898630f, 0.3826834559f, 0.4275550842f, 0.4713967443f, 0.5141027570f,
+    0.5555702448f, 0.5956993103f, 0.6343933344f, 0.6715589762f, 0.7071067691f, 0.7409511805f,
+    0.7730104327f, 0.8032075167f, 0.8314696550f, 0.8577286601f, 0.8819212914f, 0.9039893150f,
+    0.9238795042f, 0.9415440559f, 0.9569403529f, 0.9700312614f, 0.9807853103f, 0.9891765118f,
+    0.9951847196f, 0.9987954497f, 1.0000000000f, 0.9987954497f, 0.9951847196f, 0.9891765118f,
+    0.9807852507f, 0.9700312614f, 0.9569402933f, 0.9415440559f, 0.9238795042f, 0.9039893150f,
+    0.8819212317f, 0.8577286005f, 0.8314695358f, 0.8032075167f, 0.7730104923f, 0.7409510612f,
+    0.7071067691f, 0.6715588570f, 0.6343932748f, 0.5956991315f, 0.5555701852f, 0.5141027570f,
+    0.4713966250f, 0.4275550544f, 0.3826832771f, 0.3368898034f, 0.2902846932f, 0.2429800779f,
+    0.1950903088f, 0.1467303336f, 0.0980170965f, 0.0490674861f,
+};
 
-const WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER] = {
-    8011005,   24378459,  48821601, 78019304, 106140545, 126634002, 134217728,
-    126634002, 106140545, 78019304, 48821601, 24378459,  8011805};
+const FLOAT32 ixheaacd_mps_pre_twid[64] = {
+    0.015624f, 0.000192f, 0.015614f, 0.000575f, 0.015596f, 0.000958f, 0.015567f, 0.001341f,
+    0.015530f, 0.001722f, 0.015483f, 0.002103f, 0.015427f, 0.002482f, 0.015361f, 0.002860f,
+    0.015286f, 0.003236f, 0.015202f, 0.003610f, 0.015109f, 0.003982f, 0.015007f, 0.004352f,
+    0.014895f, 0.004719f, 0.014775f, 0.005083f, 0.014646f, 0.005444f, 0.014508f, 0.005802f,
+    0.014361f, 0.006156f, 0.014206f, 0.006507f, 0.014042f, 0.006853f, 0.013869f, 0.007196f,
+    0.013689f, 0.007534f, 0.013500f, 0.007868f, 0.013302f, 0.008197f, 0.013097f, 0.008521f,
+    0.012884f, 0.008840f, 0.012663f, 0.009153f, 0.012435f, 0.009461f, 0.012199f, 0.009763f,
+    0.011956f, 0.010060f, 0.011705f, 0.010350f, 0.011448f, 0.010634f, 0.011183f, 0.010912f};
 
-const WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER] = {
-    0,         20395592, 0,         -78309485, 0,        328528819, 536870911,
-    328528819, 0,        -78309485, 0,         20395592, 0};
+const FLOAT32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER] = {
+    0.007461f, 0.022704f, 0.045469f, 0.072661f, 0.098851f, 0.117937f, 0.125000f,
+    0.117937f, 0.098851f, 0.072661f, 0.045469f, 0.022704f, 0.007462f};
 
-const WORD32 ixheaacd_cosine[8][13] = {
-    {
-        -759250175, -410903263, -46, 410903167, 759250111, 992008063,
-        1073741823, 992008063, 759250111, 410903167, -46, -410903263,
-        -759250175,
-    },
-    {
-        759249983, 992008191, 140, -992008063, -759250175, 410903167,
-        1073741823, 410903167, -759250175, -992008063, 140, 992008191,
-        759249983,
-    },
-    {
-        759250367, -992007999, -234, 992008191, -759250047, -410903263,
-        1073741823, -410903263, -759250047, 992008191, -234, -992007999,
-        759250367,
-    },
-    {
-        -759249791, 410902815, 328, -410903423, 759250239, -992008127,
-        1073741823, -992008127, 759250239, -410903423, 328, 410902815,
-        -759249791,
-    },
-    {
-        -759250559, 410903679, -422, -410902911, 759249983, -992008063,
-        1073741823, -992008063, 759249983, -410902911, -422, 410903679,
-        -759250559,
-    },
-    {
-        759249599, -992008319, 516, 992007935, -759250303, -410903071,
-        1073741823, -410903071, -759250303, 992007935, 516, -992008319,
-        759249599,
-    },
-    {
-        759250751, 992007807, -610, -992008255, -759249919, 410903359,
-        1073741823, 410903359, -759249919, -992008255, -610, 992007807,
-        759250751,
-    },
-    {-759249407, -410902399, 704, 410903679, 759250367, 992008191, 1073741823,
-     992008191, 759250367, 410903679, 704, -410902399, -759249407}};
+const FLOAT32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER] = {
+    0.000000f, 0.018995f, 0.000000f,  -0.072931f, 0.000000f, 0.305966f, 0.500000f,
+    0.305966f, 0.000000f, -0.072931f, 0.000000f,  0.018995f, 0.000000f};
 
-const WORD32 ixheaacd_sine[8][13] = {
-    {
-        759250047, 992008063, 1073741823, 992008127, 759250111, 410903231, 0,
-        -410903231, -759250111, -992008127, -1073741823, -992008063, -759250047,
-    },
-    {
-        759250303, -410903039, -1073741823, -410903295, 759250047, 992008127, 0,
-        -992008127, -759250047, 410903295, 1073741823, 410903039, -759250303,
-    },
-    {
-        -759249855, -410903487, 1073741823, -410903039, -759250175, 992008063,
-        0, -992008063, 759250175, 410903039, -1073741823, 410903487, 759249855,
-    },
-    {
-        -759250495, 992008255, -1073741823, 992007999, -759249983, 410903135, 0,
-        -410903135, 759249983, -992007999, 1073741823, -992008255, 759250495,
-    },
-    {
-        759249663, -992007871, 1073741823, -992008191, 759250303, -410903295, 0,
-        410903295, -759250303, 992008191, -1073741823, 992007871, -759249663,
-    },
-    {
-        759250687, 410902623, -1073741823, 410903551, 759249919, -992008127, 0,
-        992008127, -759249919, -410903551, 1073741823, -410902623, -759250687,
-    },
-    {
-        -759249471, 410903903, 1073741823, 410902783, -759250367, -992008063, 0,
-        992008063, 759250367, -410902783, -1073741823, -410903903, 759249471,
-    },
-    {-759250879, -992008447, -1073741823, -992007871, -759249855, -410903039, 0,
-     410903039, 759249855, 992007871, 1073741823, 992008447, 759250879}};
+const FLOAT32 ixheaacd_sine[8][8] = {
+    {0.000000f, -0.382683f, -0.707107f, -0.923880f, -1.000000f, -0.923880f, -0.707107f,
+     -0.382683f},
+    {0.000000f, -0.923880f, -0.707107f, 0.382684f, 1.000000f, 0.382683f, -0.707107f, -0.923880f},
+    {0.000000f, -0.923880f, 0.707107f, 0.382683f, -1.000000f, 0.382684f, 0.707107f, -0.923880f},
+    {0.000000f, -0.382683f, 0.707107f, -0.923879f, 1.000000f, -0.923880f, 0.707107f, -0.382683f},
+    {0.000000f, 0.382684f, -0.707107f, 0.923880f, -1.000000f, 0.923879f, -0.707106f, 0.382684f},
+    {0.000000f, 0.923880f, -0.707107f, -0.382684f, 1.000000f, -0.382683f, -0.707107f, 0.923880f},
+    {0.000000f, 0.923880f, 0.707107f, -0.382683f, -1.000000f, -0.382684f, 0.707106f, 0.923880f},
+    {0.000000f, 0.382683f, 0.707107f, 0.923879f, 1.000000f, 0.923880f, 0.707107f, 0.382683f}};
+
+const FLOAT32 ixheaacd_cosine[8][8] = {
+    {1.000000f, 0.923880f, 0.707107f, 0.382683f, -46.000000f, -0.382683f, -0.707107f, -0.923880f},
+    {1.000000f, 0.382683f, -0.707107f, -0.923880f, 140.000000f, 0.923880f, 0.707107f, -0.382683f},
+    {1.000000f, -0.382683f, -0.707107f, 0.923880f, -234.000000f, -0.923879f, 0.707107f,
+     0.382683f},
+    {1.000000f, -0.923880f, 0.707107f, -0.382684f, 328.000000f, 0.382683f, -0.707106f, 0.923880f},
+    {1.000000f, -0.923880f, 0.707107f, -0.382683f, -422.000000f, 0.382684f, -0.707107f,
+     0.923880f},
+    {1.000000f, -0.382683f, -0.707107f, 0.923879f, 516.000000f, -0.923880f, 0.707106f, 0.382683f},
+    {1.000000f, 0.382684f, -0.707107f, -0.923880f, -610.000000f, 0.923879f, 0.707107f,
+     -0.382684f},
+    {1.000000f, 0.923880f, 0.707107f, 0.382684f, 704.000000f, -0.382683f, -0.707106f,
+     -0.923880f}};
 
 const WORD32 ixheaacd_cosine2[2][13] = {
     {
+        1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823,
         1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823,
-        1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823,
-        1073741823,
     },
     {
-        1073741823, -1073741823, 1073741823, -1073741823, 1073741823,
-        -1073741823, 1073741823, -1073741823, 1073741823, -1073741823,
-        1073741823, -1073741823, 1073741823,
+        1073741823, -1073741823, 1073741823, -1073741823, 1073741823, -1073741823, 1073741823,
+        -1073741823, 1073741823, -1073741823, 1073741823, -1073741823, 1073741823,
     },
 };
+
+const WORD32 ixheaacd_mps_gain_set_indx[29] = {1,  0,  4,  5,  6,  7,  8,  9,  10, 11,
+                                               12, 13, 14, 15, 16, 17, 18, 19, 21, 23,
+                                               25, 27, 30, 33, 37, 42, 48, 55, 70};
+
+const FLOAT32 ixheaacd_ldmps_polyphase_filter_coeff[1280] = {
+    -0.0007949257f, -0.0012320746f, -0.0016010543f, -0.0019807201f, -0.0023975046f,
+    -0.0028387094f, -0.0033147549f, -0.0038251812f, -0.0043653073f, -0.0049372604f,
+    -0.0055373814f, -0.0061642416f, -0.0068165790f, -0.0074901022f, -0.0081837112f,
+    -0.0088949297f, -0.0096200043f, -0.0103569683f, -0.0111023858f, -0.0118535860f,
+    -0.0126076927f, -0.0133608067f, -0.0141103314f, -0.0148531627f, -0.0155855091f,
+    -0.0163043682f, -0.0170061402f, -0.0176877063f, -0.0183456801f, -0.0189761259f,
+    -0.0195760578f, -0.0201421324f, -0.0206706170f, -0.0211581476f, -0.0216013081f,
+    -0.0219969619f, -0.0223416910f, -0.0226317085f, -0.0228641648f, -0.0230358951f,
+    -0.0231434479f, -0.0231835246f, -0.0231529772f, -0.0230491832f, -0.0228686444f,
+    -0.0226079077f, -0.0222644433f, -0.0218351875f, -0.0213169195f, -0.0207061488f,
+    -0.0199998133f, -0.0191956628f, -0.0182893611f, -0.0172771178f, -0.0161564853f,
+    -0.0149233583f, -0.0135741979f, -0.0121037029f, -0.0105075520f, -0.0087857461f,
+    -0.0069273291f, -0.0049293786f, -0.0028003342f, -0.0004685577f, 0.0022103144f,
+    0.0051832944f,  0.0083509637f,  0.0116611840f,  0.0151316673f,  0.0187726468f,
+    0.0225889906f,  0.0265906155f,  0.0307808779f,  0.0351639129f,  0.0397467501f,
+    0.0445330814f,  0.0495262593f,  0.0547302663f,  0.0601483546f,  0.0657841489f,
+    0.0716395080f,  0.0777165666f,  0.0840179473f,  0.0905451626f,  0.0972988978f,
+    0.1042804047f,  0.1114900783f,  0.1189284250f,  0.1265947521f,  0.1344885528f,
+    0.1426091045f,  0.1509550363f,  0.1595243514f,  0.1683151573f,  0.1773250401f,
+    0.1865511388f,  0.1959902197f,  0.2056386322f,  0.2154925913f,  0.2255475521f,
+    0.2357989848f,  0.2462418824f,  0.2568709552f,  0.2676805258f,  0.2786645591f,
+    0.2898168266f,  0.3011307418f,  0.3125994802f,  0.3242157102f,  0.3359722793f,
+    0.3478614092f,  0.3598752320f,  0.3720056713f,  0.3842444420f,  0.3965831101f,
+    0.4090129435f,  0.4215250909f,  0.4341109097f,  0.4467608333f,  0.4594659507f,
+    0.4722166657f,  0.4850038290f,  0.4978178144f,  0.5106483698f,  0.5234865546f,
+    0.5363218188f,  0.5491440296f,  0.5619440079f,  -0.5746001601f, -0.5872559547f,
+    -0.5998619199f, -0.6123980284f, -0.6248505116f, -0.6372103095f, -0.6494654417f,
+    -0.6616044044f, -0.6736174226f, -0.6854929924f, -0.6972201467f, -0.7087881565f,
+    -0.7201859951f, -0.7314035296f, -0.7424294949f, -0.7532534599f, -0.7638649344f,
+    -0.7742537856f, -0.7844095230f, -0.7943222523f, -0.8039818406f, -0.8133789897f,
+    -0.8225036860f, -0.8313468695f, -0.8398991823f, -0.8481519818f, -0.8560963273f,
+    -0.8637239933f, -0.8710266352f, -0.8779965043f, -0.8846257925f, -0.8909071684f,
+    -0.8968337178f, -0.9023985267f, -0.9075955749f, -0.9124187231f, -0.9168621302f,
+    -0.9209204316f, -0.9245886207f, -0.9278619289f, -0.9307362437f, -0.9332075119f,
+    -0.9352724552f, -0.9369278550f, -0.9381709695f, -0.9389997125f, -0.9394121170f,
+    -0.9394068122f, -0.9389829040f, -0.9381397963f, -0.9368773103f, -0.9351961017f,
+    -0.9330966473f, -0.9305803180f, -0.9276487827f, -0.9243040681f, -0.9205487967f,
+    -0.9163856506f, -0.9118180275f, -0.9068503380f, -0.9014858603f, -0.8957295418f,
+    -0.8895882368f, -0.8830582500f, -0.8761259913f, -0.8688043952f, -0.8611140251f,
+    -0.8530684114f, -0.8446723223f, -0.8359322548f, -0.8268554807f, -0.8174491525f,
+    -0.8077214956f, -0.7976809740f, -0.7873360515f, -0.7766956687f, -0.7657692432f,
+    -0.7545663714f, -0.7430967689f, -0.7313705087f, -0.7193979621f, -0.7071895599f,
+    -0.6947561502f, -0.6821083426f, -0.6692573428f, -0.6562142968f, -0.6429904699f,
+    -0.6295973659f, -0.6160464287f, -0.6023493409f, -0.5885176659f, -0.5745630264f,
+    -0.5604973435f, -0.5463322401f, -0.5320795774f, -0.5177509785f, -0.5033583045f,
+    -0.4889132082f, -0.4744274616f, -0.4599125087f, -0.4453800321f, -0.4308412969f,
+    -0.4163077474f, -0.4017905891f, -0.3873008788f, -0.3728497028f, -0.3584479988f,
+    -0.3441060781f, -0.3298346698f, -0.3156442046f, -0.3015447557f, -0.2875462472f,
+    -0.2736584544f, -0.2598909736f, -0.2462531626f, -0.2327540070f, -0.2194025517f,
+    -0.2062072009f, -0.1931765229f, -0.1803186089f, -0.1676410586f, -0.1551517546f,
+    -0.1428578347f, -0.1307662129f, -0.1188837960f, -0.1072167307f, -0.0957711190f,
+    -0.0845528170f, 0.0735579357f,  0.0628051385f,  0.0522958934f,  0.0420338102f,
+    0.0320230126f,  0.0222672001f,  0.0127700046f,  0.0035346728f,  -0.0054356726f,
+    -0.0141385710f, -0.0225714780f, -0.0307325479f, -0.0386199504f, -0.0462324508f,
+    -0.0535687581f, -0.0606284477f, -0.0674108788f, -0.0739159212f, -0.0801439285f,
+    -0.0860951766f, -0.0917705968f, -0.0971711874f, -0.1022983864f, -0.1071535870f,
+    -0.1117390916f, -0.1160565540f, -0.1201089993f, -0.1238986105f, -0.1274286509f,
+    -0.1307021976f, -0.1337226629f, -0.1364936531f, -0.1390190870f, -0.1413030326f,
+    -0.1433497667f, -0.1451636255f, -0.1467494071f, -0.1481117010f, -0.1492556185f,
+    -0.1501862854f, -0.1509089023f, -0.1514289081f, -0.1517517567f, -0.1518831998f,
+    -0.1518289149f, -0.1515947729f, -0.1511866748f, -0.1506105959f, -0.1498726010f,
+    -0.1489787102f, -0.1479352117f, -0.1467481852f, -0.1454239190f, -0.1439685971f,
+    -0.1423884183f, -0.1406896859f, -0.1388785988f, -0.1369612068f, -0.1349437684f,
+    -0.1328323931f, -0.1306331158f, -0.1283520460f, -0.1259952188f, -0.1235680804f,
+    -0.1210755706f, -0.1185237169f, -0.1159184426f, -0.1132654399f, -0.1105698794f,
+    -0.1078369170f, -0.1050716117f, -0.1022789180f, -0.0994636714f, -0.0966306925f,
+    -0.0937845483f, -0.0909297019f, -0.0880705118f, -0.0852110758f, -0.0823556259f,
+    -0.0795079023f, -0.0766717792f, -0.0738509223f, -0.0710486695f, -0.0682684705f,
+    -0.0655134097f, -0.0627865866f, -0.0600909144f, -0.0574291982f, -0.0548038296f,
+    -0.0522173792f, -0.0496721379f, -0.0471702330f, -0.0447136387f, -0.0423043817f,
+    -0.0399438478f, -0.0376337133f, -0.0353754386f, -0.0331703536f, -0.0310197119f,
+    -0.0289245304f, -0.0268857535f, -0.0249042176f, -0.0229805857f, -0.0211154576f,
+    -0.0193092767f, -0.0175623931f, -0.0158751141f, -0.0142475078f, -0.0126795555f,
+    -0.0111712581f, -0.0097224051f, -0.0083327051f, -0.0070017893f, -0.0057292255f,
+    -0.0045145033f, -0.0033569466f, -0.0022558495f, -0.0012104595f, -0.0002199477f,
+    0.0007167263f,  0.0016004397f,  0.0024323659f,  0.0032136049f,  0.0039453004f,
+    0.0046286648f,  0.0052649761f,  0.0058556525f,  0.0064016338f,  -0.0069030458f,
+    -0.0073645366f, -0.0077859173f, -0.0081687812f, -0.0085145105f, -0.0088245263f,
+    -0.0091004446f, -0.0093438197f, -0.0095560895f, -0.0097389296f, -0.0098937284f,
+    -0.0100222183f, -0.0101256752f, -0.0102057597f, -0.0102638984f, -0.0103016300f,
+    -0.0103203785f, -0.0103215463f, -0.0103065800f, -0.0102768280f, -0.0102336034f,
+    -0.0101782102f, -0.0101119522f, -0.0100360261f, -0.0099515645f, -0.0098597351f,
+    -0.0097616902f, -0.0096583357f, -0.0095505062f, -0.0094392402f, -0.0093253115f,
+    -0.0092095714f, -0.0090927295f, -0.0089755040f, -0.0088585643f, -0.0087425476f,
+    -0.0086279176f, -0.0085152360f, -0.0084048351f, -0.0082970457f, -0.0081921816f,
+    -0.0080905585f, -0.0079923403f, -0.0078977877f, -0.0078069791f, -0.0077200048f,
+    -0.0076368991f, -0.0075576920f, -0.0074823610f, -0.0074108820f, -0.0073430836f,
+    -0.0072789183f, -0.0072182063f, -0.0071608433f, -0.0071066003f, -0.0070552491f,
+    -0.0070065912f, -0.0069604507f, -0.0069165546f, -0.0068746237f, -0.0068344427f,
+    -0.0067957863f, -0.0067584766f, -0.0067221262f, -0.0066861408f, -0.0066502281f,
+    -0.0066143544f, -0.0065783206f, -0.0065418649f, -0.0065047294f, -0.0064666905f,
+    -0.0064275563f, -0.0063871238f, -0.0063452618f, -0.0063017663f, -0.0062565422f,
+    -0.0062093716f, -0.0061602155f, -0.0061089024f, -0.0060553551f, -0.0059994739f,
+    -0.0059412112f, -0.0058804955f, -0.0058172857f, -0.0057515362f, -0.0056832312f,
+    -0.0056123761f, -0.0055389581f, -0.0054629631f, -0.0053843958f, -0.0053033372f,
+    -0.0052197399f, -0.0051336233f, -0.0050450461f, -0.0049540084f, -0.0048605883f,
+    -0.0047647208f, -0.0046664691f, -0.0045659458f, -0.0044631511f, -0.0043581501f,
+    -0.0042509669f, -0.0041416343f, -0.0040301653f, -0.0039165970f, -0.0038009947f,
+    -0.0036834506f, -0.0035639144f, -0.0034424895f, -0.0033192560f, -0.0031942502f,
+    -0.0030675260f, -0.0029391386f, -0.0028091520f, -0.0026777033f, -0.0025448306f,
+    -0.0024106177f, -0.0022751903f, -0.0021385867f, -0.0020008814f, -0.0018621609f,
+    -0.0017228508f, -0.0015830053f, -0.0014426354f, -0.0013017356f, -0.0011605313f,
+    -0.0010187104f, -0.0008753659f, 0.0007250868f,  0.0005901512f,  0.0004571248f,
+    0.0003254497f,  0.0001951829f,  0.0000666175f,  -0.0000600275f, -0.0001845164f,
+    -0.0003065709f, -0.0004259665f, -0.0005424777f, -0.0006558085f, -0.0007659104f,
+    -0.0008724863f, -0.0009753527f, -0.0010743001f, -0.0011691442f, -0.0012597255f,
+    -0.0013458347f, -0.0014273394f, -0.0015040794f, -0.0015758807f, -0.0016426332f,
+    -0.0017042002f, -0.0017605145f, -0.0018114587f, -0.0018569818f, -0.0018970286f,
+    -0.0019315863f, -0.0019606268f, -0.0019841781f, -0.0020022886f, -0.0020149164f,
+    -0.0020221891f, -0.0020242548f, -0.0020211563f, -0.0020131115f, -0.0020002127f,
+    -0.0019826870f, -0.0019606939f, -0.0019344082f, -0.0019041235f, -0.0018700724f,
+    -0.0018325197f, -0.0017917566f, -0.0017479789f, -0.0017015412f, -0.0016526897f,
+    -0.0016016904f, -0.0015489543f, -0.0014947094f, -0.0014391905f, -0.0013827635f,
+    -0.0013256427f, -0.0012681838f, -0.0012105964f, -0.0011530248f, -0.0010959618f,
+    -0.0010395534f, -0.0009838343f, -0.0009290278f, -0.0008749813f, -0.0008215802f,
+    -0.0007706117f, -0.0007240456f, -0.0006849431f, -0.0006499495f, -0.0006169267f,
+    -0.0005864026f, -0.0005585561f, -0.0005332623f, -0.0005106712f, -0.0004907669f,
+    -0.0004734583f, -0.0004585870f, -0.0004460039f, -0.0004356373f, -0.0004273243f,
+    -0.0004208330f, -0.0004159436f, -0.0004123962f, -0.0004100222f, -0.0004085470f,
+    -0.0004077079f, -0.0004073251f, -0.0004070932f, -0.0004067607f, -0.0004061488f,
+    -0.0004050555f, -0.0004033837f, -0.0004008813f, -0.0003973767f, -0.0003928188f,
+    -0.0003870558f, -0.0003799992f, -0.0003715968f, -0.0003617546f, -0.0003505340f,
+    -0.0003378810f, -0.0003237817f, -0.0003083795f, -0.0002916576f, -0.0002737129f,
+    -0.0002546264f, -0.0002344782f, -0.0002134573f, -0.0001916261f, -0.0001692856f,
+    -0.0001466954f, -0.0001236852f, -0.0001005735f, -0.0000775065f, -0.0000546696f,
+    -0.0000325590f, -0.0000109682f, 0.0000098813f,  0.0000295145f,  0.0000481009f,
+    0.0000651376f,  0.0000805138f,  0.0000942973f,  0.0001058290f,  0.0001155818f,
+    0.0001229653f,  0.0001266878f,  0.0001279376f,  0.0001216913f,  0.0000938624f,
+    -0.0007949257f, -0.0012320746f, -0.0016010543f, -0.0019807201f, -0.0023975046f,
+    -0.0028387094f, -0.0033147549f, -0.0038251812f, -0.0043653073f, -0.0049372604f,
+    -0.0055373814f, -0.0061642416f, -0.0068165790f, -0.0074901022f, -0.0081837112f,
+    -0.0088949297f, -0.0096200043f, -0.0103569683f, -0.0111023858f, -0.0118535860f,
+    -0.0126076927f, -0.0133608067f, -0.0141103314f, -0.0148531627f, -0.0155855091f,
+    -0.0163043682f, -0.0170061402f, -0.0176877063f, -0.0183456801f, -0.0189761259f,
+    -0.0195760578f, -0.0201421324f, -0.0206706170f, -0.0211581476f, -0.0216013081f,
+    -0.0219969619f, -0.0223416910f, -0.0226317085f, -0.0228641648f, -0.0230358951f,
+    -0.0231434479f, -0.0231835246f, -0.0231529772f, -0.0230491832f, -0.0228686444f,
+    -0.0226079077f, -0.0222644433f, -0.0218351875f, -0.0213169195f, -0.0207061488f,
+    -0.0199998133f, -0.0191956628f, -0.0182893611f, -0.0172771178f, -0.0161564853f,
+    -0.0149233583f, -0.0135741979f, -0.0121037029f, -0.0105075520f, -0.0087857461f,
+    -0.0069273291f, -0.0049293786f, -0.0028003342f, -0.0004685577f, 0.0022103144f,
+    0.0051832944f,  0.0083509637f,  0.0116611840f,  0.0151316673f,  0.0187726468f,
+    0.0225889906f,  0.0265906155f,  0.0307808779f,  0.0351639129f,  0.0397467501f,
+    0.0445330814f,  0.0495262593f,  0.0547302663f,  0.0601483546f,  0.0657841489f,
+    0.0716395080f,  0.0777165666f,  0.0840179473f,  0.0905451626f,  0.0972988978f,
+    0.1042804047f,  0.1114900783f,  0.1189284250f,  0.1265947521f,  0.1344885528f,
+    0.1426091045f,  0.1509550363f,  0.1595243514f,  0.1683151573f,  0.1773250401f,
+    0.1865511388f,  0.1959902197f,  0.2056386322f,  0.2154925913f,  0.2255475521f,
+    0.2357989848f,  0.2462418824f,  0.2568709552f,  0.2676805258f,  0.2786645591f,
+    0.2898168266f,  0.3011307418f,  0.3125994802f,  0.3242157102f,  0.3359722793f,
+    0.3478614092f,  0.3598752320f,  0.3720056713f,  0.3842444420f,  0.3965831101f,
+    0.4090129435f,  0.4215250909f,  0.4341109097f,  0.4467608333f,  0.4594659507f,
+    0.4722166657f,  0.4850038290f,  0.4978178144f,  0.5106483698f,  0.5234865546f,
+    0.5363218188f,  0.5491440296f,  0.5619440079f,  -0.5746001601f, -0.5872559547f,
+    -0.5998619199f, -0.6123980284f, -0.6248505116f, -0.6372103095f, -0.6494654417f,
+    -0.6616044044f, -0.6736174226f, -0.6854929924f, -0.6972201467f, -0.7087881565f,
+    -0.7201859951f, -0.7314035296f, -0.7424294949f, -0.7532534599f, -0.7638649344f,
+    -0.7742537856f, -0.7844095230f, -0.7943222523f, -0.8039818406f, -0.8133789897f,
+    -0.8225036860f, -0.8313468695f, -0.8398991823f, -0.8481519818f, -0.8560963273f,
+    -0.8637239933f, -0.8710266352f, -0.8779965043f, -0.8846257925f, -0.8909071684f,
+    -0.8968337178f, -0.9023985267f, -0.9075955749f, -0.9124187231f, -0.9168621302f,
+    -0.9209204316f, -0.9245886207f, -0.9278619289f, -0.9307362437f, -0.9332075119f,
+    -0.9352724552f, -0.9369278550f, -0.9381709695f, -0.9389997125f, -0.9394121170f,
+    -0.9394068122f, -0.9389829040f, -0.9381397963f, -0.9368773103f, -0.9351961017f,
+    -0.9330966473f, -0.9305803180f, -0.9276487827f, -0.9243040681f, -0.9205487967f,
+    -0.9163856506f, -0.9118180275f, -0.9068503380f, -0.9014858603f, -0.8957295418f,
+    -0.8895882368f, -0.8830582500f, -0.8761259913f, -0.8688043952f, -0.8611140251f,
+    -0.8530684114f, -0.8446723223f, -0.8359322548f, -0.8268554807f, -0.8174491525f,
+    -0.8077214956f, -0.7976809740f, -0.7873360515f, -0.7766956687f, -0.7657692432f,
+    -0.7545663714f, -0.7430967689f, -0.7313705087f, -0.7193979621f, -0.7071895599f,
+    -0.6947561502f, -0.6821083426f, -0.6692573428f, -0.6562142968f, -0.6429904699f,
+    -0.6295973659f, -0.6160464287f, -0.6023493409f, -0.5885176659f, -0.5745630264f,
+    -0.5604973435f, -0.5463322401f, -0.5320795774f, -0.5177509785f, -0.5033583045f,
+    -0.4889132082f, -0.4744274616f, -0.4599125087f, -0.4453800321f, -0.4308412969f,
+    -0.4163077474f, -0.4017905891f, -0.3873008788f, -0.3728497028f, -0.3584479988f,
+    -0.3441060781f, -0.3298346698f, -0.3156442046f, -0.3015447557f, -0.2875462472f,
+    -0.2736584544f, -0.2598909736f, -0.2462531626f, -0.2327540070f, -0.2194025517f,
+    -0.2062072009f, -0.1931765229f, -0.1803186089f, -0.1676410586f, -0.1551517546f,
+    -0.1428578347f, -0.1307662129f, -0.1188837960f, -0.1072167307f, -0.0957711190f,
+    -0.0845528170f, 0.0735579357f,  0.0628051385f,  0.0522958934f,  0.0420338102f,
+    0.0320230126f,  0.0222672001f,  0.0127700046f,  0.0035346728f,  -0.0054356726f,
+    -0.0141385710f, -0.0225714780f, -0.0307325479f, -0.0386199504f, -0.0462324508f,
+    -0.0535687581f, -0.0606284477f, -0.0674108788f, -0.0739159212f, -0.0801439285f,
+    -0.0860951766f, -0.0917705968f, -0.0971711874f, -0.1022983864f, -0.1071535870f,
+    -0.1117390916f, -0.1160565540f, -0.1201089993f, -0.1238986105f, -0.1274286509f,
+    -0.1307021976f, -0.1337226629f, -0.1364936531f, -0.1390190870f, -0.1413030326f,
+    -0.1433497667f, -0.1451636255f, -0.1467494071f, -0.1481117010f, -0.1492556185f,
+    -0.1501862854f, -0.1509089023f, -0.1514289081f, -0.1517517567f, -0.1518831998f,
+    -0.1518289149f, -0.1515947729f, -0.1511866748f, -0.1506105959f, -0.1498726010f,
+    -0.1489787102f, -0.1479352117f, -0.1467481852f, -0.1454239190f, -0.1439685971f,
+    -0.1423884183f, -0.1406896859f, -0.1388785988f, -0.1369612068f, -0.1349437684f,
+    -0.1328323931f, -0.1306331158f, -0.1283520460f, -0.1259952188f, -0.1235680804f,
+    -0.1210755706f, -0.1185237169f, -0.1159184426f, -0.1132654399f, -0.1105698794f,
+    -0.1078369170f, -0.1050716117f, -0.1022789180f, -0.0994636714f, -0.0966306925f,
+    -0.0937845483f, -0.0909297019f, -0.0880705118f, -0.0852110758f, -0.0823556259f,
+    -0.0795079023f, -0.0766717792f, -0.0738509223f, -0.0710486695f, -0.0682684705f,
+    -0.0655134097f, -0.0627865866f, -0.0600909144f, -0.0574291982f, -0.0548038296f,
+    -0.0522173792f, -0.0496721379f, -0.0471702330f, -0.0447136387f, -0.0423043817f,
+    -0.0399438478f, -0.0376337133f, -0.0353754386f, -0.0331703536f, -0.0310197119f,
+    -0.0289245304f, -0.0268857535f, -0.0249042176f, -0.0229805857f, -0.0211154576f,
+    -0.0193092767f, -0.0175623931f, -0.0158751141f, -0.0142475078f, -0.0126795555f,
+    -0.0111712581f, -0.0097224051f, -0.0083327051f, -0.0070017893f, -0.0057292255f,
+    -0.0045145033f, -0.0033569466f, -0.0022558495f, -0.0012104595f, -0.0002199477f,
+    0.0007167263f,  0.0016004397f,  0.0024323659f,  0.0032136049f,  0.0039453004f,
+    0.0046286648f,  0.0052649761f,  0.0058556525f,  0.0064016338f,  -0.0069030458f,
+    -0.0073645366f, -0.0077859173f, -0.0081687812f, -0.0085145105f, -0.0088245263f,
+    -0.0091004446f, -0.0093438197f, -0.0095560895f, -0.0097389296f, -0.0098937284f,
+    -0.0100222183f, -0.0101256752f, -0.0102057597f, -0.0102638984f, -0.0103016300f,
+    -0.0103203785f, -0.0103215463f, -0.0103065800f, -0.0102768280f, -0.0102336034f,
+    -0.0101782102f, -0.0101119522f, -0.0100360261f, -0.0099515645f, -0.0098597351f,
+    -0.0097616902f, -0.0096583357f, -0.0095505062f, -0.0094392402f, -0.0093253115f,
+    -0.0092095714f, -0.0090927295f, -0.0089755040f, -0.0088585643f, -0.0087425476f,
+    -0.0086279176f, -0.0085152360f, -0.0084048351f, -0.0082970457f, -0.0081921816f,
+    -0.0080905585f, -0.0079923403f, -0.0078977877f, -0.0078069791f, -0.0077200048f,
+    -0.0076368991f, -0.0075576920f, -0.0074823610f, -0.0074108820f, -0.0073430836f,
+    -0.0072789183f, -0.0072182063f, -0.0071608433f, -0.0071066003f, -0.0070552491f,
+    -0.0070065912f, -0.0069604507f, -0.0069165546f, -0.0068746237f, -0.0068344427f,
+    -0.0067957863f, -0.0067584766f, -0.0067221262f, -0.0066861408f, -0.0066502281f,
+    -0.0066143544f, -0.0065783206f, -0.0065418649f, -0.0065047294f, -0.0064666905f,
+    -0.0064275563f, -0.0063871238f, -0.0063452618f, -0.0063017663f, -0.0062565422f,
+    -0.0062093716f, -0.0061602155f, -0.0061089024f, -0.0060553551f, -0.0059994739f,
+    -0.0059412112f, -0.0058804955f, -0.0058172857f, -0.0057515362f, -0.0056832312f,
+    -0.0056123761f, -0.0055389581f, -0.0054629631f, -0.0053843958f, -0.0053033372f,
+    -0.0052197399f, -0.0051336233f, -0.0050450461f, -0.0049540084f, -0.0048605883f,
+    -0.0047647208f, -0.0046664691f, -0.0045659458f, -0.0044631511f, -0.0043581501f,
+    -0.0042509669f, -0.0041416343f, -0.0040301653f, -0.0039165970f, -0.0038009947f,
+    -0.0036834506f, -0.0035639144f, -0.0034424895f, -0.0033192560f, -0.0031942502f,
+    -0.0030675260f, -0.0029391386f, -0.0028091520f, -0.0026777033f, -0.0025448306f,
+    -0.0024106177f, -0.0022751903f, -0.0021385867f, -0.0020008814f, -0.0018621609f,
+    -0.0017228508f, -0.0015830053f, -0.0014426354f, -0.0013017356f, -0.0011605313f,
+    -0.0010187104f, -0.0008753659f, 0.0007250868f,  0.0005901512f,  0.0004571248f,
+    0.0003254497f,  0.0001951829f,  0.0000666175f,  -0.0000600275f, -0.0001845164f,
+    -0.0003065709f, -0.0004259665f, -0.0005424777f, -0.0006558085f, -0.0007659104f,
+    -0.0008724863f, -0.0009753527f, -0.0010743001f, -0.0011691442f, -0.0012597255f,
+    -0.0013458347f, -0.0014273394f, -0.0015040794f, -0.0015758807f, -0.0016426332f,
+    -0.0017042002f, -0.0017605145f, -0.0018114587f, -0.0018569818f, -0.0018970286f,
+    -0.0019315863f, -0.0019606268f, -0.0019841781f, -0.0020022886f, -0.0020149164f,
+    -0.0020221891f, -0.0020242548f, -0.0020211563f, -0.0020131115f, -0.0020002127f,
+    -0.0019826870f, -0.0019606939f, -0.0019344082f, -0.0019041235f, -0.0018700724f,
+    -0.0018325197f, -0.0017917566f, -0.0017479789f, -0.0017015412f, -0.0016526897f,
+    -0.0016016904f, -0.0015489543f, -0.0014947094f, -0.0014391905f, -0.0013827635f,
+    -0.0013256427f, -0.0012681838f, -0.0012105964f, -0.0011530248f, -0.0010959618f,
+    -0.0010395534f, -0.0009838343f, -0.0009290278f, -0.0008749813f, -0.0008215802f,
+    -0.0007706117f, -0.0007240456f, -0.0006849431f, -0.0006499495f, -0.0006169267f,
+    -0.0005864026f, -0.0005585561f, -0.0005332623f, -0.0005106712f, -0.0004907669f,
+    -0.0004734583f, -0.0004585870f, -0.0004460039f, -0.0004356373f, -0.0004273243f,
+    -0.0004208330f, -0.0004159436f, -0.0004123962f, -0.0004100222f, -0.0004085470f,
+    -0.0004077079f, -0.0004073251f, -0.0004070932f, -0.0004067607f, -0.0004061488f,
+    -0.0004050555f, -0.0004033837f, -0.0004008813f, -0.0003973767f, -0.0003928188f,
+    -0.0003870558f, -0.0003799992f, -0.0003715968f, -0.0003617546f, -0.0003505340f,
+    -0.0003378810f, -0.0003237817f, -0.0003083795f, -0.0002916576f, -0.0002737129f,
+    -0.0002546264f, -0.0002344782f, -0.0002134573f, -0.0001916261f, -0.0001692856f,
+    -0.0001466954f, -0.0001236852f, -0.0001005735f, -0.0000775065f, -0.0000546696f,
+    -0.0000325590f, -0.0000109682f, 0.0000098813f,  0.0000295145f,  0.0000481009f,
+    0.0000651376f,  0.0000805138f,  0.0000942973f,  0.0001058290f,  0.0001155818f,
+    0.0001229653f,  0.0001266878f,  0.0001279376f,  0.0001216913f,  0.0000938624f};
+const WORD32 ixheaacd_ldmps_polyphase_filter_coeff_fix[1280] = {
+    -853545,     -1322930,    -1719119,    -2126782,    -2574301,    -3048041,    -3559191,
+    -4107257,    -4687213,    -5301343,    -5945718,    -6618804,    -7319246,    -8042436,
+    -8787193,    -9550858,    -10329401,   -11120710,   -11921096,   -12727691,   -13537407,
+    -14346057,   -15150853,   -15948462,   -16734813,   -17506682,   -18260204,   -18992030,
+    -19698524,   -20375460,   -21019632,   -21627450,   -22194906,   -22718388,   -23194228,
+    -23619058,   -23989208,   -24300612,   -24550210,   -24734604,   -24850088,   -24893120,
+    -24860320,   -24748872,   -24555020,   -24275056,   -23906264,   -23445354,   -22888868,
+    -22233058,   -21474636,   -20611186,   -19638052,   -18551164,   -17347894,   -16023834,
+    -14575184,   -12996252,   -11282398,   -9433623,    -7438163,    -5292880,    -3006836,
+    -503110,     2373307,     5565520,     8966779,     12521101,    16247504,    20156977,
+    24254745,    28551455,    33050715,    37756963,    42677747,    47817031,    53178415,
+    58766175,    64583803,    70635191,    76922335,    83447527,    90213583,    97222127,
+    104473895,   111970231,   119711559,   127698423,   135930079,   144405983,   153125359,
+    162086735,   171287967,   180727023,   190401311,   200307759,   210442895,   220802799,
+    231383407,   242179839,   253187231,   264400207,   275813087,   287419775,   299213791,
+    311188447,   323336671,   335651135,   348123967,   360747487,   373513343,   386413087,
+    399438047,   412579327,   425827871,   439174303,   452609119,   466123039,   479705791,
+    493347807,   507038783,   520768895,   534527807,   548304511,   562089407,   575871167,
+    589638911,   603382783,   -616972224,  -630561280,  -644096832,  -657557376,  -670928128,
+    -684199360,  -697358208,  -710392320,  -723291200,  -736042496,  -748634432,  -761055488,
+    -773293824,  -785338560,  -797177600,  -808799744,  -820193728,  -831348672,  -842253312,
+    -852897024,  -863268928,  -873359040,  -883156608,  -892651904,  -901834880,  -910696256,
+    -919226432,  -927416576,  -935257728,  -942741568,  -949859712,  -956604288,  -962967872,
+    -968943040,  -974523328,  -979702144,  -984473216,  -988830784,  -992769472,  -996284160,
+    -999370432,  -1002023936, -1004241152, -1006018624, -1007353408, -1008243264, -1008686080,
+    -1008680384, -1008225216, -1007319936, -1005964352, -1004159168, -1001904896, -999203008,
+    -996055296,  -992463936,  -988431744,  -983961600,  -979057152,  -973723136,  -967963072,
+    -961782272,  -955188096,  -948176576,  -940733120,  -932871616,  -924614144,  -915975232,
+    -906960000,  -897575424,  -887829312,  -877729344,  -867284352,  -856503424,  -845395648,
+    -833970624,  -822238464,  -810209472,  -797894080,  -785303104,  -772447680,  -759339008,
+    -745988736,  -732408256,  -718609600,  -704604736,  -690405760,  -676025024,  -661474816,
+    -646767680,  -631916032,  -616932352,  -601829440,  -586619776,  -571316096,  -555930880,
+    -540476864,  -524966560,  -509412608,  -493827296,  -478223168,  -462612320,  -447007040,
+    -431419360,  -415861152,  -400344320,  -384880608,  -369481088,  -354157280,  -338920384,
+    -323781216,  -308750432,  -293838528,  -279055808,  -264412320,  -249917712,  -235581696,
+    -221413296,  -207421712,  -193615632,  -180003216,  -166592928,  -153392432,  -140409152,
+    -127650504,  -115123088,  -102833456,  -90787896,   78982231,    67436503,    56152287,
+    45133459,    34384447,    23909225,    13711688,    3795326,     -5836509,    -15181175,
+    -24235940,   -32998822,   -41467856,   -49641716,   -57519016,   -65099300,   -72381880,
+    -79366616,   -86053888,   -92443992,   -98537928,   -104336768,  -109842056,  -115055288,
+    -119978936,  -124614776,  -128966056,  -133035120,  -136825472,  -140340416,  -143583616,
+    -146558944,  -149270608,  -151722976,  -153920640,  -155868256,  -157570976,  -159033728,
+    -160262000,  -161261296,  -162037200,  -162595552,  -162942208,  -163083344,  -163025056,
+    -162773648,  -162335456,  -161716896,  -160924480,  -159964672,  -158844224,  -157569664,
+    -156147744,  -154585104,  -152888400,  -151064400,  -149119760,  -147060976,  -144894768,
+    -142627696,  -140266240,  -137816960,  -135286336,  -132680216,  -130003904,  -127263872,
+    -124466480,  -121617840,  -118723504,  -115789008,  -112819784,  -109821152,  -106798304,
+    -103756416,  -100700392,  -97635024,   -94564992,   -91494696,   -88428680,   -85370960,
+    -82325696,   -79296824,   -76287928,   -73302712,   -70344488,   -67416584,   -64522128,
+    -61664132,   -58845164,   -56067984,   -53335052,   -50648652,   -48010904,   -45423984,
+    -42889380,   -40408892,   -37984088,   -35616396,   -33307162,   -31057478,   -28868358,
+    -26740700,   -24675216,   -22672550,   -20733178,   -18857476,   -17045774,   -15298145,
+    -13614569,   -11995047,   -10439353,   -8947174,    -7518114,    -6151709,    -4847411,
+    -3604494,    -2422200,    -1299721,    -236167,     769579,      1718459,     2611733,
+    3450582,     4236234,     4969991,     5653225,     6287459,     6873702,     -7412089,
+    -7907611,    -8360065,    -8771162,    -9142386,    -9475263,    -9771528,    -10032850,
+    -10260773,   -10457096,   -10623310,   -10761275,   -10872361,   -10958351,   -11020777,
+    -11061291,   -11081422,   -11082676,   -11066606,   -11034660,   -10988248,   -10928770,
+    -10857626,   -10776101,   -10685411,   -10586810,   -10481535,   -10370559,   -10254778,
+    -10135307,   -10012977,   -9888702,    -9763244,    -9637374,    -9511811,    -9387239,
+    -9264156,    -9143165,    -9024623,    -8908885,    -8796288,    -8687171,    -8581710,
+    -8480185,    -8382680,    -8289292,    -8200058,    -8115010,    -8034124,    -7957374,
+    -7884576,    -7815679,    -7750490,    -7688897,    -7630654,    -7575516,    -7523270,
+    -7473727,    -7426594,    -7381571,    -7338427,    -7296920,    -7256859,    -7217828,
+    -7179189,    -7140628,    -7102109,    -7063418,    -7024274,    -6984400,    -6943556,
+    -6901536,    -6858122,    -6813173,    -6766470,    -6717911,    -6667262,    -6614481,
+    -6559384,    -6501888,    -6441886,    -6379327,    -6314134,    -6246263,    -6175665,
+    -6102323,    -6026243,    -5947411,    -5865812,    -5781451,    -5694415,    -5604653,
+    -5512186,    -5417077,    -5319326,    -5219017,    -5116080,    -5010583,    -4902647,
+    -4792272,    -4679528,    -4564441,    -4447046,    -4327357,    -4205414,    -4081287,
+    -3955075,    -3826724,    -3696345,    -3564024,    -3429800,    -3293731,    -3155876,
+    -3016304,    -2875162,    -2732491,    -2588381,    -2442967,    -2296290,    -2148430,
+    -1999480,    -1849897,    -1699739,    -1549018,    -1397728,    -1246111,    -1093832,
+    -939917,     778556,      633670,      490834,      349449,      209576,      71530,
+    -64454,      -198123,     -329178,     -457378,     -582481,     -704169,     -822390,
+    -936825,     -1047277,    -1153521,    -1255359,    -1352620,    -1445079,    -1532594,
+    -1614993,    -1692089,    -1763764,    -1829871,    -1890338,    -1945039,    -1993919,
+    -2036919,    -2074025,    -2105207,    -2130495,    -2149941,    -2163500,    -2171309,
+    -2173527,    -2170200,    -2161562,    -2147712,    -2128894,    -2105279,    -2077055,
+    -2044537,    -2007975,    -1967653,    -1923884,    -1876878,    -1827016,    -1774562,
+    -1719802,    -1663177,    -1604932,    -1545319,    -1484731,    -1423398,    -1361702,
+    -1299868,    -1238051,    -1176780,    -1116212,    -1056384,    -997536,     -939504,
+    -882165,     -827438,     -777438,     -735452,     -697878,     -662420,     -629645,
+    -599745,     -572586,     -548329,     -526957,     -508372,     -492404,     -478893,
+    -467762,     -458836,     -451866,     -446616,     -442807,     -440258,     -438674,
+    -437773,     -437362,     -437113,     -436756,     -436099,     -434925,     -433130,
+    -430443,     -426680,     -421786,     -415598,     -408021,     -398999,     -388431,
+    -376383,     -362797,     -347658,     -331120,     -313165,     -293897,     -273403,
+    -251769,     -229198,     -205757,     -181769,     -157513,     -132806,     -107990,
+    -83222,      -58701,      -34960,      -11777,      10610,       31691,       51648,
+    69941,       86451,       101251,      113633,      124105,      132033,      136030,
+    137372,      130665,      100784,      -853545,     -1322930,    -1719119,    -2126782,
+    -2574301,    -3048041,    -3559191,    -4107257,    -4687213,    -5301343,    -5945718,
+    -6618804,    -7319246,    -8042436,    -8787193,    -9550858,    -10329401,   -11120710,
+    -11921096,   -12727691,   -13537407,   -14346057,   -15150853,   -15948462,   -16734813,
+    -17506682,   -18260204,   -18992030,   -19698524,   -20375460,   -21019632,   -21627450,
+    -22194906,   -22718388,   -23194228,   -23619058,   -23989208,   -24300612,   -24550210,
+    -24734604,   -24850088,   -24893120,   -24860320,   -24748872,   -24555020,   -24275056,
+    -23906264,   -23445354,   -22888868,   -22233058,   -21474636,   -20611186,   -19638052,
+    -18551164,   -17347894,   -16023834,   -14575184,   -12996252,   -11282398,   -9433623,
+    -7438163,    -5292880,    -3006836,    -503110,     2373307,     5565520,     8966779,
+    12521101,    16247504,    20156977,    24254745,    28551455,    33050715,    37756963,
+    42677747,    47817031,    53178415,    58766175,    64583803,    70635191,    76922335,
+    83447527,    90213583,    97222127,    104473895,   111970231,   119711559,   127698423,
+    135930079,   144405983,   153125359,   162086735,   171287967,   180727023,   190401311,
+    200307759,   210442895,   220802799,   231383407,   242179839,   253187231,   264400207,
+    275813087,   287419775,   299213791,   311188447,   323336671,   335651135,   348123967,
+    360747487,   373513343,   386413087,   399438047,   412579327,   425827871,   439174303,
+    452609119,   466123039,   479705791,   493347807,   507038783,   520768895,   534527807,
+    548304511,   562089407,   575871167,   589638911,   603382783,   -616972224,  -630561280,
+    -644096832,  -657557376,  -670928128,  -684199360,  -697358208,  -710392320,  -723291200,
+    -736042496,  -748634432,  -761055488,  -773293824,  -785338560,  -797177600,  -808799744,
+    -820193728,  -831348672,  -842253312,  -852897024,  -863268928,  -873359040,  -883156608,
+    -892651904,  -901834880,  -910696256,  -919226432,  -927416576,  -935257728,  -942741568,
+    -949859712,  -956604288,  -962967872,  -968943040,  -974523328,  -979702144,  -984473216,
+    -988830784,  -992769472,  -996284160,  -999370432,  -1002023936, -1004241152, -1006018624,
+    -1007353408, -1008243264, -1008686080, -1008680384, -1008225216, -1007319936, -1005964352,
+    -1004159168, -1001904896, -999203008,  -996055296,  -992463936,  -988431744,  -983961600,
+    -979057152,  -973723136,  -967963072,  -961782272,  -955188096,  -948176576,  -940733120,
+    -932871616,  -924614144,  -915975232,  -906960000,  -897575424,  -887829312,  -877729344,
+    -867284352,  -856503424,  -845395648,  -833970624,  -822238464,  -810209472,  -797894080,
+    -785303104,  -772447680,  -759339008,  -745988736,  -732408256,  -718609600,  -704604736,
+    -690405760,  -676025024,  -661474816,  -646767680,  -631916032,  -616932352,  -601829440,
+    -586619776,  -571316096,  -555930880,  -540476864,  -524966560,  -509412608,  -493827296,
+    -478223168,  -462612320,  -447007040,  -431419360,  -415861152,  -400344320,  -384880608,
+    -369481088,  -354157280,  -338920384,  -323781216,  -308750432,  -293838528,  -279055808,
+    -264412320,  -249917712,  -235581696,  -221413296,  -207421712,  -193615632,  -180003216,
+    -166592928,  -153392432,  -140409152,  -127650504,  -115123088,  -102833456,  -90787896,
+    78982231,    67436503,    56152287,    45133459,    34384447,    23909225,    13711688,
+    3795326,     -5836509,    -15181175,   -24235940,   -32998822,   -41467856,   -49641716,
+    -57519016,   -65099300,   -72381880,   -79366616,   -86053888,   -92443992,   -98537928,
+    -104336768,  -109842056,  -115055288,  -119978936,  -124614776,  -128966056,  -133035120,
+    -136825472,  -140340416,  -143583616,  -146558944,  -149270608,  -151722976,  -153920640,
+    -155868256,  -157570976,  -159033728,  -160262000,  -161261296,  -162037200,  -162595552,
+    -162942208,  -163083344,  -163025056,  -162773648,  -162335456,  -161716896,  -160924480,
+    -159964672,  -158844224,  -157569664,  -156147744,  -154585104,  -152888400,  -151064400,
+    -149119760,  -147060976,  -144894768,  -142627696,  -140266240,  -137816960,  -135286336,
+    -132680216,  -130003904,  -127263872,  -124466480,  -121617840,  -118723504,  -115789008,
+    -112819784,  -109821152,  -106798304,  -103756416,  -100700392,  -97635024,   -94564992,
+    -91494696,   -88428680,   -85370960,   -82325696,   -79296824,   -76287928,   -73302712,
+    -70344488,   -67416584,   -64522128,   -61664132,   -58845164,   -56067984,   -53335052,
+    -50648652,   -48010904,   -45423984,   -42889380,   -40408892,   -37984088,   -35616396,
+    -33307162,   -31057478,   -28868358,   -26740700,   -24675216,   -22672550,   -20733178,
+    -18857476,   -17045774,   -15298145,   -13614569,   -11995047,   -10439353,   -8947174,
+    -7518114,    -6151709,    -4847411,    -3604494,    -2422200,    -1299721,    -236167,
+    769579,      1718459,     2611733,     3450582,     4236234,     4969991,     5653225,
+    6287459,     6873702,     -7412089,    -7907611,    -8360065,    -8771162,    -9142386,
+    -9475263,    -9771528,    -10032850,   -10260773,   -10457096,   -10623310,   -10761275,
+    -10872361,   -10958351,   -11020777,   -11061291,   -11081422,   -11082676,   -11066606,
+    -11034660,   -10988248,   -10928770,   -10857626,   -10776101,   -10685411,   -10586810,
+    -10481535,   -10370559,   -10254778,   -10135307,   -10012977,   -9888702,    -9763244,
+    -9637374,    -9511811,    -9387239,    -9264156,    -9143165,    -9024623,    -8908885,
+    -8796288,    -8687171,    -8581710,    -8480185,    -8382680,    -8289292,    -8200058,
+    -8115010,    -8034124,    -7957374,    -7884576,    -7815679,    -7750490,    -7688897,
+    -7630654,    -7575516,    -7523270,    -7473727,    -7426594,    -7381571,    -7338427,
+    -7296920,    -7256859,    -7217828,    -7179189,    -7140628,    -7102109,    -7063418,
+    -7024274,    -6984400,    -6943556,    -6901536,    -6858122,    -6813173,    -6766470,
+    -6717911,    -6667262,    -6614481,    -6559384,    -6501888,    -6441886,    -6379327,
+    -6314134,    -6246263,    -6175665,    -6102323,    -6026243,    -5947411,    -5865812,
+    -5781451,    -5694415,    -5604653,    -5512186,    -5417077,    -5319326,    -5219017,
+    -5116080,    -5010583,    -4902647,    -4792272,    -4679528,    -4564441,    -4447046,
+    -4327357,    -4205414,    -4081287,    -3955075,    -3826724,    -3696345,    -3564024,
+    -3429800,    -3293731,    -3155876,    -3016304,    -2875162,    -2732491,    -2588381,
+    -2442967,    -2296290,    -2148430,    -1999480,    -1849897,    -1699739,    -1549018,
+    -1397728,    -1246111,    -1093832,    -939917,     778556,      633670,      490834,
+    349449,      209576,      71530,       -64454,      -198123,     -329178,     -457378,
+    -582481,     -704169,     -822390,     -936825,     -1047277,    -1153521,    -1255359,
+    -1352620,    -1445079,    -1532594,    -1614993,    -1692089,    -1763764,    -1829871,
+    -1890338,    -1945039,    -1993919,    -2036919,    -2074025,    -2105207,    -2130495,
+    -2149941,    -2163500,    -2171309,    -2173527,    -2170200,    -2161562,    -2147712,
+    -2128894,    -2105279,    -2077055,    -2044537,    -2007975,    -1967653,    -1923884,
+    -1876878,    -1827016,    -1774562,    -1719802,    -1663177,    -1604932,    -1545319,
+    -1484731,    -1423398,    -1361702,    -1299868,    -1238051,    -1176780,    -1116212,
+    -1056384,    -997536,     -939504,     -882165,     -827438,     -777438,     -735452,
+    -697878,     -662420,     -629645,     -599745,     -572586,     -548329,     -526957,
+    -508372,     -492404,     -478893,     -467762,     -458836,     -451866,     -446616,
+    -442807,     -440258,     -438674,     -437773,     -437362,     -437113,     -436756,
+    -436099,     -434925,     -433130,     -430443,     -426680,     -421786,     -415598,
+    -408021,     -398999,     -388431,     -376383,     -362797,     -347658,     -331120,
+    -313165,     -293897,     -273403,     -251769,     -229198,     -205757,     -181769,
+    -157513,     -132806,     -107990,     -83222,      -58701,      -34960,      -11777,
+    10610,       31691,       51648,       69941,       86451,       101251,      113633,
+    124105,      132033,      136030,      137372,      130665,      100784};
+
+const ia_mps_dec_res_huffmann_tables_struct ixheaacd_mps_dec_res_huffmann_tables = {
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  12, 12,
+     12, 12, 12, 16, 16, 24, 28, 36, 44, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -1},
+    {4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36, -1},
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,
+     8,  8,  12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36, 40, 40, 40,
+     40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, -1},
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8,
+     12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 32, 32, 32,
+     32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96, -1},
+    {4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16, -1},
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8,  12,
+     12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 32, 32, 32, 32, 32,
+     32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -1},
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24,
+     28, 28, 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64, -1},
+    {4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20, -1},
+    {8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16,
+     16, 16, 20, 20, 20, 24, 24, 28, 28, 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64, -1},
+    {4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20, -1},
+    {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 20,
+     20, 20, 20, 24, 24, 24, 28, 28, 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80, -1},
+    {4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20, -1},
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  12, 12,
+     12, 12, 12, 16, 16, 24, 28, 36, 44, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -1},
+    {4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 28, -1},
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,
+     8,  8,  12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36, 40, 40, 40,
+     40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 16, -1},
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8,  8,
+     12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 32, 32, 32,
+     32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -1},
+    {4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 8, -1},
+    {4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,
+     8,  8,  8,  8,  8,  12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24,
+     28, 28, 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, -1},
+    {4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 12, -1},
+    {8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16,
+     16, 16, 20, 20, 20, 24, 24, 28, 28, 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, -1},
+    {4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 12, -1},
+    {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 20,
+     20, 20, 20, 24, 24, 24, 28, 28, 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 16, -1},
+    {4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 12, -1},
+
+    /* huffman_code_book_1 */
+    {
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800,
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xa840, 0xa8c0, 0xa803, 0xa810, 0xa801, 0xa80c,
+        0xa804, 0xa830, 0x1008, 0x100b, 0x100e, 0x1011, 0x1014, 0x1017, 0x201a, 0x1029, 0x9070,
+        0x90d0, 0x900d, 0x901c, 0x9034, 0x9007, 0x9050, 0x900f, 0x90f0, 0x903c, 0x904c, 0x9013,
+        0x90c4, 0x9005, 0x9044, 0x9031, 0x9014, 0x9011, 0x90cc, 0x9041, 0x90c3, 0x9043, 0x90c1,
+        0x9033, 0xa05c, 0xa0dc, 0xa074, 0xa017, 0xa01d, 0xa035, 0xa037, 0xa07c, 0xa04d, 0xa01f,
+        0xa0d4, 0xa0c7, 0xa0f4, 0xa03d, 0xa071, 0xa073, 0x1004, 0x1007, 0x180a, 0x2011, 0x90d3,
+        0x90fc, 0x903f, 0x9015, 0x9047, 0x9051, 0x90d1, 0x9054, 0x98f1, 0x98cf, 0x9853, 0x984f,
+        0x98cd, 0x98f3, 0x98c5, 0x9845, 0xa077, 0xa0dd, 0xa0d7, 0xa07d, 0xa055, 0xa0f5, 0xa05f,
+        0xa0f7, 0xa0ff, 0xa05d, 0xa075, 0xa0d5, 0xa0df, 0xa0fd, 0xa07f, 0xa057,
+    },
+    /* huffman_code_book_2 */
+    {
+        0x9800, 0x9800, 0x9800, 0x9800, 0xa040, 0xa040, 0xa8c0, 0xa801, 0xa80c, 0xa803, 0xa830,
+        0xa804, 0xa810, 0x0813, 0x0814, 0x0815, 0x0816, 0x0817, 0x0818, 0x0819, 0x081a, 0x081b,
+        0x081c, 0x081d, 0x081e, 0x101f, 0x1022, 0x1025, 0x1028, 0x182d, 0x1834, 0x103b, 0x8834,
+        0x88d0, 0x881c, 0x8807, 0x8813, 0x880d, 0x88c3, 0x8870, 0x884c, 0x88f0, 0x880f, 0x8844,
+        0x8841, 0x8831, 0x88c4, 0x8811, 0x883c, 0x88c1, 0x8833, 0x88cc, 0x8850, 0x8814, 0x8805,
+        0x8843, 0x901d, 0x904d, 0x90dc, 0x9037, 0x9074, 0x9053, 0x9045, 0x90d4, 0x903d, 0x9054,
+        0x90c7, 0x90fc, 0x90cd, 0x907c, 0x905c, 0x0801, 0x8871, 0x88d3, 0x98f4, 0x98c5, 0x98f1,
+        0x98f3, 0x983f, 0x9847, 0x984f, 0x981f, 0x9815, 0x98d1, 0x98cf, 0x9817, 0x9873, 0x9835,
+        0x9851, 0x9877, 0x1004, 0x1007, 0x100a, 0x100d, 0x88dd, 0x88dd, 0x907d, 0x90ff, 0x90d7,
+        0x90d5, 0x9055, 0x90f7, 0x9075, 0x90df, 0x90f5, 0x905f, 0x907f, 0x90fd, 0x905d, 0x9057,
+    },
+    /* huffman_code_book_3 */
+    {
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800,
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xa040, 0xa040, 0xa001, 0xa001, 0xa010, 0xa010,
+        0xa004, 0xa004, 0xa850, 0xa805, 0x0806, 0x0807, 0x0808, 0x1009, 0x100e, 0x101f, 0x8814,
+        0x8811, 0x8844, 0x8815, 0x8841, 0x8854, 0x9055, 0x9045, 0x9051, 0x0801, 0x8880, 0x8802,
+        0x0804, 0x1005, 0x1008, 0x100b, 0x8806, 0x8890, 0x8864, 0x8864, 0x9009, 0x9019, 0x9060,
+        0x9016, 0x9094, 0x9008, 0x9024, 0x9018, 0x9020, 0x9012, 0x1004, 0x1007, 0x1810, 0x1017,
+        0x9084, 0x9065, 0x9025, 0x9058, 0x9059, 0x0803, 0x0804, 0x0805, 0x8861, 0x8848, 0x8849,
+        0x8821, 0x8895, 0x8856, 0x9891, 0x9846, 0x980a, 0x981a, 0x98a4, 0x9868, 0x9842, 0x9881,
+        0x1004, 0x1007, 0x100a, 0x1011, 0x8829, 0x8829, 0x90a0, 0x9069, 0x9052, 0x9085, 0x905a,
+        0x90a5, 0x9028, 0x9026, 0x0802, 0x0803, 0x884a, 0x88a1, 0x8898, 0x88a8, 0x0804, 0x0805,
+        0x1006, 0x1009, 0x882a, 0x88a9, 0x8899, 0x8866, 0x886a, 0x886a, 0x9022, 0x9088, 0x9062,
+        0x0803, 0x1004, 0x1007, 0x8889, 0x8896, 0x8892, 0x8892, 0x90aa, 0x90a6, 0x909a, 0x9086,
+        0x9082, 0x0801, 0x88a2, 0x888a,
+    },
+    /* huffman_code_book_4 */
+    {
+        0xa055, 0xa055, 0xa015, 0xa015, 0xa051, 0xa051, 0xa054, 0xa054, 0xa045, 0xa045, 0xa040,
+        0xa040, 0xa050, 0xa050, 0xa000, 0xa000, 0xa005, 0xa005, 0xa044, 0xa044, 0xa841, 0xa814,
+        0xa801, 0xa811, 0xa804, 0xa810, 0x1006, 0x1009, 0x100c, 0x1815, 0x101c, 0x1029, 0x9095,
+        0x9059, 0x9065, 0x9056, 0x9094, 0x9091, 0x9064, 0x9085, 0x9019, 0x0803, 0x0804, 0x0805,
+        0x8816, 0x8858, 0x8825, 0x8846, 0x8861, 0x8852, 0x9849, 0x9890, 0x9884, 0x9860, 0x9881,
+        0x9812, 0x9824, 0x9806, 0x0804, 0x0805, 0x0806, 0x1007, 0x8818, 0x8821, 0x8842, 0x8809,
+        0x8848, 0x8880, 0x8802, 0x8802, 0x9020, 0x9008, 0x1004, 0x1007, 0x180e, 0x1015, 0x9069,
+        0x90a5, 0x9099, 0x905a, 0x9066, 0x9096, 0x0802, 0x0803, 0x8868, 0x88a4, 0x8898, 0x8829,
+        0x981a, 0x98a1, 0x9826, 0x9889, 0x984a, 0x98a9, 0x9862, 0x9886, 0x0804, 0x1005, 0x1008,
+        0x100b, 0x8892, 0x886a, 0x909a, 0x90a6, 0x9028, 0x90a0, 0x900a, 0x9088, 0x9022, 0x9082,
+        0x90aa, 0x902a, 0x90a8, 0x0801, 0x88a2, 0x888a,
+    },
+    /* huffman_code_book_5 */
+    {
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800,
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xa0f0, 0xa0f0, 0xa010, 0xa010, 0xa001, 0xa001,
+        0xa00f, 0xa00f, 0xa81f, 0xa8f1, 0xa8ff, 0xa811, 0x1004, 0x1807, 0x100e, 0x101d, 0x90e0,
+        0x9002, 0x9020, 0x900e, 0x98ef, 0x9821, 0x98fe, 0x9812, 0x98e1, 0x982f, 0x98f2, 0x981e,
+        0x0804, 0x0805, 0x1006, 0x1009, 0x88d0, 0x8830, 0x880d, 0x8803, 0x90df, 0x9013, 0x9031,
+        0x90fd, 0x90d1, 0x903f, 0x901d, 0x90f3, 0x1004, 0x1807, 0x100e, 0x101d, 0x90e2, 0x9022,
+        0x90ee, 0x902e, 0x98de, 0x983e, 0x98e3, 0x982d, 0x9832, 0x9823, 0x98d2, 0x98ed, 0x0804,
+        0x0805, 0x1006, 0x1009, 0x880c, 0x88c0, 0x8841, 0x8840, 0x90cf, 0x9004, 0x904f, 0x90fc,
+        0x9014, 0x90f4, 0x90c1, 0x901c, 0x1004, 0x1007, 0x100a, 0x1011, 0x903d, 0x90dd, 0x90d3,
+        0x90e4, 0x90ce, 0x9042, 0x902c, 0x9024, 0x9033, 0x90c2, 0x0802, 0x0803, 0x88ec, 0x884e,
+        0x883c, 0x88cd, 0x0804, 0x0805, 0x0806, 0x1007, 0x88c3, 0x8834, 0x88d4, 0x8843, 0x884d,
+        0x88dc, 0x904c, 0x90c4, 0x9044, 0x90cc,
+    },
+    /* huffman_code_book_6 */
+    {
+        0xa000, 0xa000, 0xa010, 0xa010, 0xa00f, 0xa00f, 0xa001, 0xa001, 0xa0f0, 0xa0f0, 0xa011,
+        0xa011, 0xa0f1, 0xa0f1, 0xa01f, 0xa01f, 0xa0ff, 0xa0ff, 0x080e, 0x080f, 0x0810, 0x0811,
+        0x0812, 0x0813, 0x0814, 0x0815, 0x1016, 0x1019, 0x101c, 0x101f, 0x1028, 0x1039, 0x882f,
+        0x8821, 0x88e1, 0x88ef, 0x88e0, 0x88f2, 0x8820, 0x881e, 0x8812, 0x880e, 0x88fe, 0x8802,
+        0x882e, 0x88e2, 0x88ee, 0x8822, 0x90d1, 0x9031, 0x903f, 0x90f3, 0x90df, 0x9013, 0x901d,
+        0x90fd, 0x9030, 0x90d0, 0x900d, 0x9003, 0x9032, 0x0803, 0x0804, 0x0805, 0x88de, 0x88e3,
+        0x8823, 0x883e, 0x882d, 0x88ed, 0x0804, 0x1005, 0x1008, 0x100b, 0x88d2, 0x8833, 0x903d,
+        0x90dd, 0x90d3, 0x901c, 0x90fc, 0x9041, 0x90c1, 0x90cf, 0x9014, 0x904f, 0x90f4, 0x900c,
+        0x1004, 0x1007, 0x100a, 0x100f, 0x90c2, 0x90ce, 0x9024, 0x90ec, 0x90c0, 0x9042, 0x904e,
+        0x90e4, 0x9040, 0x902c, 0x9004, 0x0801, 0x88dc, 0x88d4, 0x0804, 0x0805, 0x0806, 0x1007,
+        0x883c, 0x884d, 0x8834, 0x8843, 0x88c3, 0x88cd, 0x9044, 0x90c4, 0x90cc, 0x904c,
+    },
+    /* huffman_code_book_7 */
+    {
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800,
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9810, 0x9810, 0x9810, 0x9810, 0x9801, 0x9801,
+        0x9801, 0x9801, 0xa011, 0xa011, 0x0806, 0x0807, 0x1008, 0x100b, 0x1014, 0x1023, 0x8821,
+        0x8812, 0x8820, 0x8802, 0x9031, 0x9013, 0x9022, 0x9030, 0x9003, 0x0803, 0x0804, 0x0805,
+        0x8823, 0x8832, 0x8814, 0x8841, 0x8815, 0x8851, 0x0804, 0x0805, 0x1006, 0x1009, 0x8833,
+        0x8824, 0x8804, 0x8840, 0x9042, 0x9025, 0x9052, 0x9005, 0x9061, 0x9050, 0x9016, 0x9043,
+        0x1004, 0x1007, 0x180e, 0x1015, 0x9035, 0x9034, 0x9053, 0x9026, 0x9062, 0x9017, 0x0802,
+        0x0803, 0x8836, 0x8806, 0x8860, 0x8844, 0x9871, 0x9845, 0x9872, 0x9854, 0x9863, 0x9827,
+        0x9873, 0x9864, 0x0804, 0x1005, 0x1008, 0x100b, 0x8855, 0x8846, 0x8837, 0x8837, 0x9070,
+        0x9007, 0x9065, 0x9056, 0x9074, 0x9047, 0x9057, 0x9075, 0x0802, 0x0803, 0x8876, 0x8866,
+        0x8867, 0x8877,
+    },
+    /* huffman_code_book_8 */
+    {
+        0x9811, 0x9811, 0x9811, 0x9811, 0xa021, 0xa021, 0xa010, 0xa010, 0xa012, 0xa012, 0xa001,
+        0xa001, 0xa022, 0xa022, 0xa800, 0xa820, 0xa802, 0xa831, 0xa813, 0xa832, 0xa823, 0x080b,
+        0x080c, 0x080d, 0x080e, 0x080f, 0x1010, 0x1013, 0x1016, 0x1019, 0x1820, 0x1027, 0x8833,
+        0x8841, 0x8814, 0x8842, 0x8824, 0x8830, 0x8803, 0x8843, 0x8834, 0x8852, 0x9051, 0x9025,
+        0x9015, 0x9053, 0x9035, 0x9044, 0x9054, 0x9004, 0x9045, 0x9040, 0x9026, 0x9062, 0x9061,
+        0x9016, 0x0802, 0x0803, 0x8836, 0x8863, 0x8855, 0x8850, 0x9864, 0x9805, 0x9846, 0x9871,
+        0x9872, 0x9827, 0x9865, 0x9873, 0x0804, 0x1005, 0x1008, 0x100b, 0x8817, 0x8856, 0x8837,
+        0x8837, 0x9066, 0x9074, 0x9060, 0x9047, 0x9006, 0x9075, 0x9076, 0x9067, 0x0802, 0x0803,
+        0x8857, 0x8870, 0x8807, 0x8877,
+    },
+    /* huffman_code_book_9 */
+    {
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800,
+        0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9810, 0x9810, 0x9810, 0x9810, 0x9801, 0x9801,
+        0x9801, 0x9801, 0xa011, 0xa011, 0x0806, 0x0807, 0x1008, 0x100d, 0x101a, 0x1037, 0x8821,
+        0x8812, 0x8820, 0x8802, 0x9031, 0x9022, 0x9013, 0x0801, 0x8830, 0x8803, 0x0804, 0x0805,
+        0x0806, 0x1007, 0x8823, 0x8832, 0x8814, 0x8841, 0x8824, 0x8815, 0x9042, 0x9033, 0x9004,
+        0x9040, 0x1004, 0x1007, 0x180c, 0x1813, 0x9051, 0x9025, 0x9016, 0x9034, 0x9052, 0x9061,
+        0x9043, 0x0801, 0x8805, 0x8826, 0x9850, 0x9817, 0x9835, 0x9818, 0x9881, 0x9844, 0x9853,
+        0x9862, 0x9871, 0x9806, 0x9882, 0x9828, 0x9836, 0x9827, 0x9845, 0x9891, 0x1004, 0x2015,
+        0x1024, 0x1045, 0x0804, 0x1005, 0x1008, 0x100b, 0x8819, 0x8872, 0x9060, 0x9054, 0x9063,
+        0x9083, 0x9007, 0x9092, 0x9038, 0x9046, 0x9037, 0x9008, 0x90a1, 0x9064, 0xa029, 0xa055,
+        0xa080, 0xa070, 0xa073, 0xa0a2, 0xa093, 0xa084, 0xa01a, 0xa074, 0xa065, 0xa056, 0xa048,
+        0xa047, 0xa039, 0xa0b1, 0x1004, 0x1809, 0x1810, 0x1817, 0x9058, 0x9090, 0x9085, 0x0801,
+        0x88a3, 0x882a, 0x9809, 0x98b2, 0x9894, 0x9866, 0x98c1, 0x9849, 0x9886, 0x981b, 0x9895,
+        0x98a4, 0x9857, 0x9875, 0x982b, 0x981c, 0x98c2, 0x98b3, 0x983a, 0x9859, 0x9867, 0x9887,
+        0x98b4, 0x980a, 0x9876, 0x98c3, 0x1804, 0x100b, 0x201a, 0x1029, 0x98a0, 0x98a5, 0x984a,
+        0x9868, 0x982c, 0x9896, 0x9897, 0x984b, 0x0804, 0x0805, 0x1006, 0x1009, 0x88b0, 0x8869,
+        0x883b, 0x885a, 0x9088, 0x9078, 0x90c5, 0x903c, 0x90b5, 0x9077, 0x90c4, 0x90b6, 0xa0a6,
+        0xa04c, 0xa079, 0xa05b, 0xa00b, 0xa0c6, 0xa06a, 0xa0c0, 0xa0a7, 0xa05c, 0xa07a, 0xa098,
+        0xa00c, 0xa0b7, 0xa089, 0xa099, 0x1004, 0x1007, 0x180a, 0x1011, 0x90a8, 0x907b, 0x90c7,
+        0x906b, 0x908b, 0x90b8, 0x907c, 0x906c, 0x988a, 0x98a9, 0x988c, 0x989a, 0x989b, 0x989c,
+        0x98ab, 0x98c9, 0x0804, 0x0805, 0x0806, 0x1007, 0x88aa, 0x88b9, 0x88c8, 0x88ba, 0x88ca,
+        0x88cb, 0x90ac, 0x90bb, 0x90bc, 0x90cc,
+    },
+    /* huffman_code_book_10 */
+    {
+        0xa011, 0xa011, 0xa012, 0xa012, 0xa021, 0xa021, 0xa822, 0xa810, 0xa801, 0xa813, 0xa832,
+        0xa831, 0xa823, 0xa833, 0x0812, 0x0813, 0x0814, 0x0815, 0x0816, 0x0817, 0x0818, 0x1019,
+        0x101c, 0x101f, 0x1022, 0x1025, 0x182e, 0x1835, 0x103c, 0x204d, 0x105c, 0x107d, 0x8820,
+        0x8802, 0x8824, 0x8842, 0x8814, 0x8841, 0x8800, 0x8843, 0x8834, 0x8830, 0x8803, 0x8844,
+        0x8825, 0x8852, 0x9015, 0x9051, 0x9053, 0x9035, 0x9054, 0x9045, 0x9062, 0x9026, 0x9063,
+        0x9040, 0x9061, 0x9004, 0x9016, 0x9036, 0x9055, 0x9064, 0x9046, 0x0803, 0x0804, 0x0805,
+        0x8865, 0x8872, 0x8837, 0x8827, 0x8856, 0x8882, 0x9873, 0x9850, 0x9871, 0x9805, 0x9881,
+        0x9817, 0x9883, 0x9874, 0x9847, 0x9828, 0x9866, 0x9875, 0x9818, 0x9838, 0x9884, 0x9848,
+        0x0804, 0x1005, 0x1008, 0x100b, 0x8857, 0x8885, 0x8858, 0x8858, 0x9076, 0x9067, 0x9092,
+        0x9060, 0x9068, 0x9093, 0x9039, 0x9091, 0x9029, 0x9006, 0xa086, 0xa094, 0xa049, 0xa0a2,
+        0xa019, 0xa077, 0xa087, 0xa095, 0xa078, 0xa0a3, 0xa059, 0xa0a4, 0xa02a, 0xa0a1, 0xa03a,
+        0xa096, 0x1004, 0x1007, 0x1810, 0x1817, 0x9069, 0x9080, 0x904a, 0x9070, 0x90b2, 0x0803,
+        0x0804, 0x0805, 0x8879, 0x88b3, 0x88a6, 0x881a, 0x88b1, 0x8897, 0x9807, 0x9888, 0x98a5,
+        0x983b, 0x985a, 0x9889, 0x98b5, 0x9808, 0x98b4, 0x982b, 0x987a, 0x986a, 0x98a7, 0x984b,
+        0x981b, 0x98c2, 0x1804, 0x180b, 0x1012, 0x1023, 0x9898, 0x98c3, 0x98b6, 0x985b, 0x98c4,
+        0x98b7, 0x98c5, 0x983c, 0x986b, 0x9890, 0x98a8, 0x98a0, 0x98c1, 0x9809, 0x984c, 0x9899,
+        0x0804, 0x1005, 0x1008, 0x100b, 0x88c6, 0x882c, 0x888a, 0x888a, 0x909a, 0x901c, 0x90b8,
+        0x90c7, 0x907b, 0x905c, 0x906c, 0x90a9, 0x908b, 0x90c8, 0x1004, 0x1007, 0x100a, 0x180d,
+        0x900a, 0x907c, 0x90b0, 0x90aa, 0x90b9, 0x90ba, 0x900b, 0x90bb, 0x909b, 0x90ab, 0x90c0,
+        0x908c, 0x98c9, 0x98ac, 0x989c, 0x98bc, 0x98cb, 0x980c, 0x98ca, 0x98cc,
+    },
+    /* huffman_codebook_11[290] = */
+    {
+        0xa000, 0xa000, 0xa021, 0xa021, 0xaa10, 0xa820, 0xa801, 0xa841, 0xa822, 0xa842, 0x0816,
+        0x0817, 0x0818, 0x1019, 0x101c, 0x101f, 0x1022, 0x1025, 0x182c, 0x1833, 0x183a, 0x1841,
+        0x1848, 0x184f, 0x1056, 0x2063, 0x2072, 0x2081, 0x1090, 0x28b1, 0x28d0, 0x10ef, 0x8823,
+        0x8861, 0x8862, 0x8840, 0x8843, 0x8802, 0x8863, 0x8863, 0x9081, 0x9024, 0x9082, 0x9044,
+        0x9083, 0x9064, 0x9060, 0x9003, 0x90a1, 0x90a2, 0x9045, 0x9084, 0x9025, 0x90a3, 0x9065,
+        0x90a4, 0x0802, 0x0803, 0x8885, 0x88c2, 0x8846, 0x88c1, 0x98c3, 0x9866, 0x9826, 0x9890,
+        0x9870, 0x9a05, 0x9a03, 0x9a04, 0x98c4, 0x9a06, 0x9880, 0x9886, 0x9804, 0x9850, 0x98a5,
+        0x98b0, 0x9a07, 0x9a02, 0x9a08, 0x9847, 0x98e2, 0x9867, 0x98c5, 0x98a6, 0x98d0, 0x9a0a,
+        0x98e3, 0x98e1, 0x9a09, 0x98f0, 0x9830, 0x9827, 0x9887, 0x9a0b, 0x98e4, 0x9a0c, 0x9910,
+        0x9a01, 0x98c6, 0x9930, 0x9848, 0x98a7, 0x9950, 0x9a0d, 0x9903, 0x9902, 0x9868, 0x98a0,
+        0x0804, 0x0805, 0x0806, 0x1007, 0x8a0e, 0x8970, 0x88e5, 0x8888, 0x88c7, 0x88e6, 0x8805,
+        0x8805, 0x9104, 0x920f, 0xa190, 0xa028, 0xa101, 0xa1d0, 0xa0a8, 0xa1b0, 0xa069, 0xa105,
+        0xa0e7, 0xa049, 0xa106, 0xa122, 0xa123, 0xa1f0, 0xa089, 0xa0c8, 0xa0c0, 0xa124, 0xa0a9,
+        0xa107, 0xa0e8, 0xa029, 0xa143, 0xa006, 0xa142, 0xa121, 0xa125, 0xa08a, 0xa04a, 0xa126,
+        0xa06a, 0xa0c9, 0xa144, 0xa108, 0xa145, 0xa127, 0xa163, 0xa02a, 0xa0e0, 0xa146, 0xa0e9,
+        0xa06b, 0xa0aa, 0xa141, 0xa08b, 0xa162, 0xa1a2, 0xa0ca, 0x1004, 0x1007, 0x1810, 0x1817,
+        0x91a3, 0x904b, 0x9200, 0x90ab, 0x9165, 0x0803, 0x0804, 0x0805, 0x8964, 0x8928, 0x88ea,
+        0x8909, 0x8810, 0x888d, 0x9807, 0x986d, 0x9966, 0x99a1, 0x99a4, 0x9983, 0x984d, 0x99a5,
+        0x990a, 0x98cb, 0x9948, 0x9947, 0x99c2, 0x9984, 0x982b, 0x988c, 0xa961, 0xa86c, 0xa82d,
+        0xa982, 0xa8eb, 0xa86e, 0xa8ac, 0xa8ad, 0xa9c4, 0xa88e, 0xa967, 0xa9c3, 0xa985, 0xa9a6,
+        0xa986, 0xa900, 0xa968, 0xa84c, 0xa929, 0xa9c5, 0xa8cd, 0xa94a, 0xa9e2, 0xa90b, 0xa92a,
+        0xa9c6, 0xa949, 0xa8ae, 0xa969, 0xa9c1, 0xa84e, 0xa8cc, 0xa82c, 0xa9a8, 0xa808, 0xa9a7,
+        0xa8ec, 0xa987, 0xa8ed, 0xa9e3, 0xa981, 0xa8ce, 0xa84f, 0xa9e5, 0xa9e4, 0xa82e, 0xa92b,
+        0xa88f, 0xa9c7, 0xa90d, 0xa9a9, 0xa90c, 0xa8af, 0xa86f, 0xa94b, 0xa96a, 0xa988, 0xa9e6,
+        0xa9e7, 0xa90e, 0xa9e1, 0xa8ee, 0xa920, 0xa809, 0x1804, 0x100b, 0x201e, 0x102d, 0x992d,
+        0x992c, 0x9989, 0x99c8, 0x994d, 0x99c9, 0x998a, 0x98cf, 0x1004, 0x1007, 0x100a, 0x100d,
+        0x88ef, 0x88ef, 0x912e, 0x91e8, 0x916b, 0x916e, 0x902f, 0x914c, 0x914e, 0x91ab, 0x91aa,
+        0x916d, 0x916c, 0x910f, 0x91cb, 0x91ac, 0xa18d, 0xa1e9, 0xa1ca, 0xa140, 0xa18b, 0xa12f,
+        0xa00a, 0xa18c, 0xa160, 0xa18e, 0xa14f, 0xa1ad, 0xa00d, 0xa1cc, 0xa1ea, 0xa1eb, 0x1004,
+        0x1007, 0x100a, 0x100d, 0x916f, 0x91cd, 0x91a0, 0x900b, 0x91ae, 0x91ec, 0x91ed, 0x918f,
+        0x91c0, 0x91ce, 0x91af, 0x9180, 0x91cf, 0x0803, 0x0804, 0x0805, 0x880e, 0x880c, 0x89ee,
+        0x89e0, 0x880f, 0x89ef,
+    },
+    /* huffman_code_book_scl */
+    {
+        7,      0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c,
+        0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c,
+        0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c,
+        0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c,
+        0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c,
+        0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x883c, 0x983b,
+        0x983b, 0x983b, 0x983b, 0x983b, 0x983b, 0x983b, 0x983b, 0x983b, 0x983b, 0x983b, 0x983b,
+        0x983b, 0x983b, 0x983b, 0x983b, 0xa03d, 0xa03d, 0xa03d, 0xa03d, 0xa03d, 0xa03d, 0xa03d,
+        0xa03d, 0xa03a, 0xa03a, 0xa03a, 0xa03a, 0xa03a, 0xa03a, 0xa03a, 0xa03a, 0xa03e, 0xa03e,
+        0xa03e, 0xa03e, 0xa03e, 0xa03e, 0xa03e, 0xa03e, 0xa839, 0xa839, 0xa839, 0xa839, 0xa83f,
+        0xa83f, 0xa83f, 0xa83f, 0xb038, 0xb038, 0xb040, 0xb040, 0xb037, 0xb037, 0xb041, 0xb041,
+        0xb842, 0xb836, 0xb843, 0x0805, 0x0806, 0x1007, 0x100a, 0x1011, 0x8835, 0x8844, 0x8834,
+        0x8845, 0x8833, 0x8833, 0x9046, 0x9032, 0x9031, 0x9047, 0x0802, 0x0803, 0x8848, 0x8830,
+        0x8849, 0x882f, 0x0804, 0x1005, 0x1008, 0x100f, 0x884a, 0x882e, 0x904c, 0x904b, 0x904d,
+        0x904e, 0x902d, 0x902b, 0x0802, 0x0803, 0x882c, 0x884f, 0x882a, 0x8829, 0x0804, 0x1005,
+        0x1008, 0x1011, 0x8850, 0x8828, 0x9051, 0x9027, 0x9052, 0x9026, 0x9053, 0x0803, 0x0804,
+        0x0805, 0x8825, 0x8823, 0x8855, 0x8821, 0x8824, 0x8822, 0x0804, 0x1005, 0x1008, 0x1015,
+        0x8854, 0x8820, 0x9057, 0x9059, 0x901e, 0x901f, 0x0804, 0x0805, 0x0806, 0x1007, 0x8856,
+        0x881d, 0x881a, 0x881b, 0x881c, 0x8818, 0x8858, 0x8858, 0x9019, 0x9016, 0x1004, 0x100d,
+        0x2020, 0x202f, 0x9017, 0x0803, 0x0804, 0x0805, 0x885a, 0x8815, 0x8813, 0x8803, 0x8801,
+        0x8802, 0x1004, 0x1007, 0x100a, 0x100d, 0x8800, 0x8800, 0x9062, 0x9063, 0x9064, 0x9065,
+        0x9066, 0x9075, 0x9061, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9068, 0xa06f,
+        0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa06e, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d,
+        0xa076, 0xa006, 0xa008, 0xa009, 0xa00a, 0xa005, 0xa067, 0xa078, 0xa077, 0xa004, 0xa007,
+        0xa00f, 0xa010, 0xa012, 0xa014, 0xa011, 0xa00b, 0xa00c, 0xa00e, 0xa00d,
+
+    }}; /* END OF ia_mps_dec_res_huffmann_tables_struct */
+
+const ia_mps_dec_res_block_tables_struct ixheaacd_mps_dec_res_block_tables = {
+    {0 >> 4,        131072 >> 4,   330281 >> 4,   567116 >> 4,   832256 >> 4,   1120650 >> 4,
+     1429042 >> 4,  1755122 >> 4,  2097152 >> 4,  2453767 >> 4,  2823861 >> 4,  3206517 >> 4,
+     3600960 >> 4,  4006524 >> 4,  4422631 >> 4,  4848770 >> 4,  5284492 >> 4,  5729392 >> 4,
+     6183105 >> 4,  6645302 >> 4,  7115683 >> 4,  7593972 >> 4,  8079916 >> 4,  8573281 >> 4,
+     9073850 >> 4,  9581422 >> 4,  10095808 >> 4, 10616832 >> 4, 11144330 >> 4, 11678147 >> 4,
+     12218136 >> 4, 12764159 >> 4, 13316085 >> 4, 13873792 >> 4, 14437162 >> 4, 15006082 >> 4,
+     15580448 >> 4, 16160157 >> 4, 16745112 >> 4, 17335222 >> 4, 17930398 >> 4, 18530554 >> 4,
+     19135610 >> 4, 19745488 >> 4, 20360112 >> 4, 20979411 >> 4, 21603314 >> 4, 22231755 >> 4,
+     22864669 >> 4, 23501994 >> 4, 24143669 >> 4, 24789637 >> 4, 25439841 >> 4, 26094226 >> 4,
+     26752740 >> 4, 27415332 >> 4, 28081952 >> 4, 28752552 >> 4, 29427086 >> 4, 30105507 >> 4,
+     30787772 >> 4, 31473838 >> 4, 32163664 >> 4, 32857208 >> 4, 33554432 >> 4, 34255297 >> 4,
+     34959765 >> 4, 35667801 >> 4, 36379368 >> 4, 37094431 >> 4, 37812958 >> 4, 38534914 >> 4,
+     39260268 >> 4, 39988988 >> 4, 40721043 >> 4, 41456403 >> 4, 42195038 >> 4, 42936921 >> 4,
+     43682022 >> 4, 44430314 >> 4, 45181770 >> 4, 45936364 >> 4, 46694070 >> 4, 47454862 >> 4,
+     48218716 >> 4, 48985607 >> 4, 49755512 >> 4, 50528406 >> 4, 51304267 >> 4, 52083073 >> 4,
+     52864802 >> 4, 53649431 >> 4, 54436939 >> 4, 55227306 >> 4, 56020511 >> 4, 56816534 >> 4,
+     57615355 >> 4, 58416954 >> 4, 59221313 >> 4, 60028412 >> 4, 60838233 >> 4, 61650759 >> 4,
+     62465970 >> 4, 63283850 >> 4, 64104381 >> 4, 64927547 >> 4, 65753329 >> 4, 66581713 >> 4,
+     67412681 >> 4, 68246218 >> 4, 69082308 >> 4, 69920936 >> 4, 70762086 >> 4, 71605743 >> 4,
+     72451892 >> 4, 73300519 >> 4, 74151609 >> 4, 75005149 >> 4, 75861124 >> 4, 76719520 >> 4,
+     77580324 >> 4, 78443523 >> 4, 79309103 >> 4, 80177051 >> 4, 81047354 >> 4, 81920000 >> 4,
+     82794977 >> 4, 83672271 >> 4, 84551871 >> 4},
+    {16384, 19484, 23171, 27555},
+    {16385, 19486, 23172, 27557},
+
+    /* conceal_n_tns_tables */
+    {{31, 9},
+     {31, 9},
+     {34, 10},
+     {40, 14},
+     {42, 14},
+     {51, 14},
+     {46, 14},
+     {46, 14},
+     {42, 14},
+     {42, 14},
+     {42, 14},
+     {39, 14}},
+    {(WORD16)-0x7e0e, (WORD16)-0x6eda, (WORD16)-0x5247, (WORD16)-0x2bc7, (WORD16)0x0000,
+     (WORD16)0x378a, (WORD16)0x6413, (WORD16)0x7cca},
+    {(WORD16)-0x7f74, (WORD16)-0x7b1d, (WORD16)-0x7295, (WORD16)-0x6625, (WORD16)-0x563c,
+     (WORD16)-0x4362, (WORD16)-0x2e3d, (WORD16)-0x1785, (WORD16)0x0000, (WORD16)0x1a9d,
+     (WORD16)0x3410, (WORD16)0x4b3d, (WORD16)0x5f1f, (WORD16)0x6eda, (WORD16)0x79bc,
+     (WORD16)0x7f4c},
+}; /* END OF ia_mps_dec_res_block_tables_struct */
+
+const ia_mps_dec_common_tables_struct ixheaacd_mps_dec_common_tables = {
+    {1073741824, 1074789888, 1075836928, 1076882944, 1077927936, 1078971904, 1080014976,
+     1081056896, 1082097920, 1083137920, 1084176896, 1085214848, 1086251904, 1087287808,
+     1088322944, 1089356928, 1090390016, 1091422080, 1092453120, 1093483264, 1094512512,
+     1095540608, 1096567936, 1097594112, 1098619392, 1099643776, 1100667264, 1101689600,
+     1102711168, 1103731712, 1104751360, 1105769984, 1106787712, 1107804544, 1108820352,
+     1109835392, 1110849408, 1111862400, 1112874624, 1113885824, 1114896128, 1115905536,
+     1116914048, 1117921664, 1118928384, 1119934208, 1120939008, 1121943040, 1122946048,
+     1123948288, 1124949504, 1125949952, 1126949504, 1127948032, 1128945792, 1129942656,
+     1130938624, 1131933824, 1132928000, 1133921408, 1134913920, 1135905536, 1136896256,
+     1137886208, 1138875136, 1139863424, 1140850688, 1141837184, 1142822784, 1143807488,
+     1144791424, 1145774592, 1146756736, 1147738112, 1148718720, 1149698432, 1150677376,
+     1151655424, 1152632576, 1153608960, 1154584576, 1155559296, 1156533248, 1157506304,
+     1158478592, 1159450112, 1160420736, 1161390592, 1162359680, 1163327872, 1164295296,
+     1165261952, 1166227712, 1167192704, 1168156928, 1169120384, 1170083072, 1171044864,
+     1172005888, 1172966144, 1173925632, 1174884352, 1175842304, 1176799488, 1177755776,
+     1178711424, 1179666176, 1180620160, 1181573504, 1182525952, 1183477760, 1184428672,
+     1185378816, 1186328320, 1187277056, 1188224896, 1189172096, 1190118528, 1191064192,
+     1192009088, 1192953216, 1193896704, 1194839296, 1195781248, 1196722432, 1197662976,
+     1198602624, 1199541632, 1200479872, 1201417344, 1202354176, 1203290240, 1204225536,
+     1205160064, 1206093952, 1207027072, 1207959552, 1208891264, 1209822208, 1210752512,
+     1211682048, 1212610944, 1213539072, 1214466560, 1215393280, 1216319232, 1217244544,
+     1218169088, 1219092992, 1220016256, 1220938752, 1221860608, 1222781696, 1223702144,
+     1224621824, 1225540864, 1226459264, 1227376896, 1228293888, 1229210240, 1230125824,
+     1231040768, 1231954944, 1232868608, 1233781504, 1234693632, 1235605248, 1236516096,
+     1237426304, 1238335872, 1239244672, 1240152960, 1241060480, 1241967360, 1242873600,
+     1243779072, 1244684032, 1245588224, 1246491776, 1247394816, 1248297088, 1249198592,
+     1250099584, 1250999936, 1251899648, 1252798592, 1253697024, 1254594816, 1255491840,
+     1256388352, 1257284224, 1258179328, 1259073920, 1259967744, 1260861056, 1261753728,
+     1262645760, 1263537152, 1264427904, 1265318016, 1266207488, 1267096448, 1267984640,
+     1268872320, 1269759232, 1270645632, 1271531520, 1272416640, 1273301120, 1274185088,
+     1275068416, 1275951104, 1276833280, 1277714688, 1278595584, 1279475840, 1280355584,
+     1281234560, 1282113024, 1282990848, 1283868160, 1284744832, 1285620864, 1286496384,
+     1287371264, 1288245504, 1289119232, 1289992320, 1290864768, 1291736704, 1292608000,
+     1293478784, 1294348928, 1295218432, 1296087424, 1296955904, 1297823616, 1298690944,
+     1299557504, 1300423680, 1301289216, 1302154112, 1303018496, 1303882240, 1304745472,
+     1305608064, 1306470144, 1307331712, 1308192640, 1309052928, 1309912704, 1310771968,
+     1311630720, 1312488832, 1313346304, 1314203392, 1315059840, 1315915648, 1316770944,
+     1317625728, 1318480000, 1319333632, 1320186752, 1321039360, 1321891328, 1322742784,
+     1323593728, 1324444032, 1325293824, 1326143104, 1326991872, 1327840128, 1328687744,
+     1329534848, 1330381440, 1331227392, 1332072960, 1332917888, 1333762304, 1334606208,
+     1335449472, 1336292352, 1337134592, 1337976448, 1338817664, 1339658368, 1340498560,
+     1341338112, 1342177280, 1343015936, 1343853952, 1344691456, 1345528576, 1346365056,
+     1347201024, 1348036480, 1348871424, 1349705856, 1350539776, 1351373184, 1352206080,
+     1353038464, 1353870336, 1354701696, 1355532544, 1356363008, 1357192832, 1358022144,
+     1358850944, 1359679232, 1360507008, 1361334400, 1362161152, 1362987520, 1363813248,
+     1364638592, 1365463424, 1366287744, 1367111552, 1367934848, 1368757632, 1369579904,
+     1370401792, 1371223168, 1372043904, 1372864384, 1373684224, 1374503552, 1375322496,
+     1376140800, 1376958720, 1377776256, 1378593152, 1379409536, 1380225536, 1381041024,
+     1381856128, 1382670592, 1383484672, 1384298240, 1385111296, 1385923968, 1386736128,
+     1387547776, 1388358912, 1389169664, 1389979904, 1390789760, 1391598976, 1392407808,
+     1393216256, 1394024064, 1394831488, 1395638528, 1396445056, 1397251072, 1398056576,
+     1398861696, 1399666304, 1400470528, 1401274240, 1402077440, 1402880256, 1403682560,
+     1404484480, 1405285888, 1406086912, 1406887296, 1407687424, 1408487040, 1409286144,
+     1410084864, 1410883072, 1411680896, 1412478208, 1413275136, 1414071552, 1414867456,
+     1415662976, 1416458112, 1417252736, 1418046976, 1418840704, 1419634048, 1420426880,
+     1421219328, 1422011392, 1422802816, 1423593984, 1424384640, 1425174912, 1425964672,
+     1426754048, 1427542912, 1428331392, 1429119488, 1429907072, 1430694272, 1431480960,
+     1432267264, 1433053184, 1433838592, 1434623616, 1435408256, 1436192384, 1436976128,
+     1437759488, 1438542336, 1439324800, 1440106752, 1440888448, 1441669632, 1442450304,
+     1443230720, 1444010624, 1444790144, 1445569152, 1446347776, 1447126016, 1447903872,
+     1448681216, 1449458304, 1450234880, 1451010944, 1451786752, 1452562048, 1453336960,
+     1454111360, 1454885504, 1455659136, 1456432384, 1457205248, 1457977728, 1458749696,
+     1459521408, 1460292608, 1461063424, 1461833728, 1462603776, 1463373312, 1464142592,
+     1464911360, 1465679744, 1466447744, 1467215232, 1467982464, 1468749184, 1469515520,
+     1470281600, 1471047168, 1471812352, 1472577024, 1473341440, 1474105472, 1474868992,
+     1475632256, 1476395008, 1477157376, 1477919360, 1478681088, 1479442304, 1480203136,
+     1480963584, 1481723648, 1482483200, 1483242496, 1484001408, 1484759936, 1485518080,
+     1486275712, 1487033088, 1487790080, 1488546560, 1489302784, 1490058624, 1490813952,
+     1491569024, 1492323712, 1493078016, 1493831808, 1494585344, 1495338496, 1496091264,
+     1496843648, 1497595648, 1498347264, 1499098496, 1499849344, 1500599808, 1501349888,
+     1502099712, 1502849024, 1503598080, 1504346624, 1505094912, 1505842816, 1506590208,
+     1507337344, 1508084096, 1508830592, 1509576576, 1510322176, 1511067520, 1511812480,
+     1512556928, 1513301120, 1514044928, 1514788480, 1515531520, 1516274304, 1517016576,
+     1517758592, 1518500249
+
+    }}; /* END OF ia_mps_dec_common_tables_struct */
+
+const ia_mps_dec_qmf_tables_struct ixheaacd_mps_dec_qmf_tables = {
+    {
+        0,          28501019,   775583039,  -775583039, -28501019,  0,          28501019,
+        775583039,  -775583039, -28501019,  -1186546,   30903291,   799678975,  -751600831,
+        -26167087,  -1186546,   30903291,   799678975,  -751600831, -26167087,  -1206390,
+        33373087,   823849919,  -727722687, -23904831,  -1206390,   33373087,   823849919,
+        -727722687, -23904831,  -1062471,   35932707,   848086783,  -703969535, -21721843,
+        -1062471,   35932707,   848086783,  -703969535, -21721843,  -1046947,   38533023,
+        872376063,  -680382719, -19611965,  -1046947,   38533023,   872376063,  -680382719,
+        -19611965,  -1050933,   41204291,   896724095,  -656936447, -17566035,  -1050933,
+        41204291,   896724095,  -656936447, -17566035,  -1082485,   43922867,   921081471,
+        -633661567, -15594127,  -1082485,   43922867,   921081471,  -633661567, -15594127,
+        -1122396,   46700799,   945441215,  -610575615, -13699290,  -1122396,   46700799,
+        945441215,  -610575615, -13699290,  -1173935,   49538187,   969802879,  -587687679,
+        -11883575,  -1173935,   49538187,   969802879,  -587687679, -11883575,  -1219298,
+        52433171,   994136319,  -565014399, -10140974,  -1219298,   52433171,   994136319,
+        -565014399, -10140974,  -1260772,   55378415,   1018434047, -542557503, -8461326,
+        -1260772,   55378415,   1018434047, -542557503, -8461326,   -1316997,   58381367,
+        1042657663, -520338911, -6857726,   -1316997,   58381367,   1042657663, -520338911,
+        -6857726,   -1355597,   61433531,   1066807231, -498364575, -5331498,   -1355597,
+        61433531,   1066807231, -498364575, -5331498,   -1404525,   64532455,   1090882559,
+        -476666783, -3873947,   -1404525,   64532455,   1090882559, -476666783, -3873947,
+        -1455497,   67649519,   1114809215, -455209823, -2484238,   -1455497,   67649519,
+        1114809215, -455209823, -2484238,   -1490700,   70814151,   1138647551, -434060159,
+        -1173445,   -1490700,   70814151,   1138647551, -434060159, -1173445,   -1537112,
+        74006783,   1162337023, -413168703, 59280,      -1537112,   74006783,   1162337023,
+        -413168703, 59280,      -1558008,   77244463,   1185851519, -392597055, 1252469,
+        -1558008,   77244463,   1185851519, -392597055, 1252469,    -1597930,   80490447,
+        1209202815, -372332479, 2341257,    -1597930,   80490447,   1209202815, -372332479,
+        2341257,    -1608593,   83763391,   1232338687, -352393215, 3389734,    -1608593,
+        83763391,   1232338687, -352393215, 3389734,    -1649561,   87048071,   1255290751,
+        -332775583, 4353845,    -1649561,   87048071,   1255290751, -332775583, 4353845,
+        -1658898,   90333703,   1277993983, -313482463, 5263168,    -1658898,   90333703,
+        1277993983, -313482463, 5263168,    -1682409,   93651231,   1300469631, -294538495,
+        6108894,    -1682409,   93651231,   1300469631, -294538495, 6108894,    -1670714,
+        96956399,   1322658815, -275952255, 6891679,    -1670714,   96956399,   1322658815,
+        -275952255, 6891679,    -1675824,   100253775,  1344591615, -257714783, 7602359,
+        -1675824,   100253775,  1344591615, -257714783, 7602359,    -1675348,   103544295,
+        1366224767, -239836751, 8258450,    -1675348,   103544295,  1366224767, -239836751,
+        8258450,    -1666012,   106812775,  1387547135, -222335327, 8858722,    -1666012,
+        106812775,  1387547135, -222335327, 8858722,    -1638700,   110070599,  1408537983,
+        -205199231, 9406377,    -1638700,   110070599,  1408537983, -205199231, 9406377,
+        -1617055,   113307839,  1429180415, -188451903, 9886913,    -1617055,   113307839,
+        1429180415, -188451903, 9886913,    -1571819,   116490847,  1449479167, -172093519,
+        10331429,   -1571819,   116490847,  1449479167, -172093519, 10331429,   -1549493,
+        119652127,  1469384191, -156109887, 10702990,   -1549493,   119652127,  1469384191,
+        -156109887, 10702990,   -1485615,   122753695,  1488911103, -140533439, 11034259,
+        -1485615,   122753695,  1488911103, -140533439, 11034259,   -1428165,   125824431,
+        1508046463, -125349767, 11320622,   -1428165,   125824431,  1508046463, -125349767,
+        11320622,   -1361847,   128814119,  1526734207, -110553351, 11561831,   -1361847,
+        128814119,  1526734207, -110553351, 11561831,   -1276919,   131738495,  1544999039,
+        -96165783,  11758284,   -1276919,   131738495,  1544999039, -96165783,  11758284,
+        -1194983,   134616687,  1562820223, -82200639,  11897996,   -1194983,   134616687,
+        1562820223, -82200639,  11897996,   -1105003,   137377935,  1580163967, -68618815,
+        12008111,   -1105003,   137377935,  1580163967, -68618815,  12008111,   -989200,
+        140068991,  1597046655, -55453887,  12083055,   -989200,    140068991,  1597046655,
+        -55453887,  12083055,   -879420,    142671839,  1613433983, -42699303,  12109487,
+        -879420,    142671839,  1613433983, -42699303,  12109487,   -751871,    145186207,
+        1629313151, -30341543,  12123660,   -751871,    145186207,  1629313151, -30341543,
+        12123660,   -622121,    147541535,  1644687871, -18406457,  12073290,   -622121,
+        147541535,  1644687871, -18406457,  12073290,   -450614,    149814959,  1659528319,
+        -6890608,   12012598,   -450614,    149814959,  1659528319, -6890608,   12012598,
+        -310607,    151962111,  1673810559, 4244630,    11913318,   -310607,    151962111,
+        1673810559, 4244630,    11913318,   -132571,    153975151,  1687568511, 14954401,
+        11784539,   -132571,    153975151,  1687568511, 14954401,   11784539,   28980,
+        155839151,  1700750335, 25259525,   11638668,   28980,      155839151,  1700750335,
+        25259525,   11638668,   235016,     157543743,  1713362559, 35154575,   11482955,
+        235016,     157543743,  1713362559, 35154575,   11482955,   438734,     159129327,
+        1725392639, 44667031,   11265949,   438734,     159129327,  1725392639, 44667031,
+        11265949,   633406,     160514207,  1736819327, 53753139,   11039644,   633406,
+        160514207,  1736819327, 53753139,   11039644,   864692,     161735007,  1747663231,
+        62453979,   10821818,   864692,     161735007,  1747663231, 62453979,   10821818,
+        1096803,    162781055,  1757881983, 70777607,   10552219,   1096803,    162781055,
+        1757881983, 70777607,   10552219,   1339895,    163636639,  1767469183, 78687687,
+        10293438,   1339895,    163636639,  1767469183, 78687687,   10293438,   1601598,
+        164280815,  1776457599, 86212511,   10008660,   1601598,    164280815,  1776457599,
+        86212511,   10008660,   1848649,    164732079,  1784781951, 93365887,   9708741,
+        1848649,    164732079,  1784781951, 93365887,   9708741,    2122999,    164964111,
+        1792491135, 100137871,  9391100,    2122999,    164964111,  1792491135, 100137871,
+        9391100,    2415952,    164976143,  1799530623, 106510607,  9076182,    2415952,
+        164976143,  1799530623, 106510607,  9076182,    2701080,    164755999,  1805935231,
+        112548287,  8765974,    2701080,    164755999,  1805935231, 112548287,  8765974,
+        2985537,    164293391,  1811668351, 118210391,  8419731,    2985537,    164293391,
+        1811668351, 118210391,  8419731,    3316406,    163584207,  1816732159, 123513103,
+        8075380,    3316406,    163584207,  1816732159, 123513103,  8075380,    3622393,
+        162630175,  1821133951, 128455295,  7732716,    3622393,    162630175,  1821133951,
+        128455295,  7732716,    3940259,    161399775,  1824889727, 133058679,  7391396,
+        3940259,    161399775,  1824889727, 133058679,  7391396,    4260852,    159915455,
+        1827931903, 137319727,  7030778,    4260852,    159915455,  1827931903, 137319727,
+        7030778,    4608839,    158141983,  1830310399, 141237999,  6684132,    4608839,
+        158141983,  1830310399, 141237999,  6684132,    4942917,    156073663,  1832022783,
+        144853151,  6328515,    4942917,    156073663,  1832022783, 144853151,  6328515,
+        5288310,    153722543,  1833032063, 148104223,  5985136,    5288310,    153722543,
+        1833032063, 148104223,  5985136,    5626784,    151082575,  1833389567, 151082575,
+        5626784,    5626784,    151082575,  1833389567, 151082575,  5626784,
+    },
+    {
+        0x0000, 0x0648, 0x0c8c, 0x12c8, 0x18f9, 0x1f1a, 0x2528, 0x2b1f, 0x30fc, 0x36ba, 0x3c57,
+        0x41ce, 0x471d, 0x4c40, 0x5134, 0x55f6, 0x5a82, 0x5ed7, 0x62f2, 0x66d0, 0x6a6e, 0x6dca,
+        0x70e3, 0x73b6, 0x7642, 0x7885, 0x7a7d, 0x7c2a, 0x7d8a, 0x7e9d, 0x7f62, 0x7fd9, 0x7fff,
+    },
+    {
+        0x7ffe, 0x7fc2, 0x7f38, 0x7e60, 0x7d3a, 0x7bc6, 0x7a06, 0x77fb, 0x75a6, 0x7308, 0x7023,
+        0x6cf9, 0x698c, 0x65de, 0x61f1, 0x5dc8, 0x5964, 0x54ca, 0x4ffb, 0x4afb, 0x45cd, 0x4074,
+        0x3af3, 0x354e, 0x2f87, 0x29a4, 0x23a7, 0x1d93, 0x176e, 0x113a, 0x0afb, 0x04b6,
+    },
+    {
+        0x0192, 0x07d9, 0x0e1c, 0x1455, 0x1a83, 0x209f, 0x26a8, 0x2c99, 0x326e, 0x3825, 0x3db8,
+        0x4326, 0x486a, 0x4d81, 0x5269, 0x571e, 0x5b9d, 0x5fe4, 0x63ef, 0x67bd, 0x6b4b, 0x6e97,
+        0x719e, 0x7460, 0x76d9, 0x790a, 0x7aef, 0x7c89, 0x7dd6, 0x7ed6, 0x7f87, 0x7fea,
+    },
+    {
+        0x7D89, 0x6a6d, 0x471c, 0x18f9,
+    },
+    {
+        0x7FF5, 0x7FA6, 0x7F09, 0x7E1D, 0x7CE3, 0x7B5C, 0x7989, 0x776B, 0x7504, 0x7254, 0x6F5E,
+        0x6C23, 0x68A6, 0x64E8, 0x60EB, 0x5CB3, 0x5842, 0x539B, 0x4EBF, 0x49B4, 0x447A, 0x3F17,
+        0x398C, 0x33DF, 0x2E11, 0x2826, 0x2223, 0x1C0B, 0x15E2, 0xFAB,  0x096A, 0x0324,
+    },
+    {
+        0x0324, 0x096A, 0x0FAB, 0x15E2, 0x1C0B, 0x2223, 0x2826, 0x2E11, 0x33DF, 0x398C, 0x3F17,
+        0x447A, 0x49B4, 0x4EBF, 0x539B, 0x5842, 0x5CB3, 0x60EB, 0x64E8, 0x68A6, 0x6C23, 0x6F5E,
+        0x7254, 0x7504, 0x776B, 0x7989, 0x7B5C, 0x7CE3, 0x7E1D, 0x7F09, 0x7FA6, 0x7FF5,
+
+    },
+
+}; /* END OF ia_mps_dec_qmf_tables_struct */
+
+const ia_mps_dec_hybrid_tables_struct ixheaacd_mps_dec_hybrid_tables = {
+    {
+        -692, -2976, -5960, -9524, -9162, 15458, 16384, 15458, 9162, 9524,
+        5960, 2976,  692,   14281, 5916,  -2749, -1404, 8799,  3645,
+
+    },
+
+    {
+        1245, -4780, 20052, 20052, -4780, 1245,
+
+    },
+
+    {0,      101,    201,    302,    402,    503,    603,    704,    804,    905,    1005,
+     1106,   1206,   1307,   1407,   1507,   1608,   1708,   1809,   1909,   2009,   2110,
+     2210,   2310,   2411,   2511,   2611,   2711,   2811,   2912,   3012,   3112,   3212,
+     3312,   3412,   3512,   3612,   3712,   3812,   3911,   4011,   4111,   4211,   4310,
+     4410,   4510,   4609,   4709,   4808,   4907,   5007,   5106,   5205,   5305,   5404,
+     5503,   5602,   5701,   5800,   5899,   5998,   6097,   6195,   6294,   6393,   6491,
+     6590,   6688,   6787,   6885,   6983,   7081,   7180,   7278,   7376,   7473,   7571,
+     7669,   7767,   7864,   7962,   8059,   8157,   8254,   8351,   8449,   8546,   8643,
+     8740,   8836,   8933,   9030,   9127,   9223,   9319,   9416,   9512,   9608,   9704,
+     9800,   9896,   9992,   10088,  10183,  10279,  10374,  10469,  10565,  10660,  10755,
+     10850,  10945,  11039,  11134,  11228,  11323,  11417,  11511,  11605,  11699,  11793,
+     11887,  11980,  12074,  12167,  12261,  12354,  12447,  12540,  12633,  12725,  12818,
+     12910,  13003,  13095,  13187,  13279,  13371,  13463,  13554,  13646,  13737,  13828,
+     13919,  14010,  14101,  14192,  14282,  14373,  14463,  14553,  14643,  14733,  14823,
+     14912,  15002,  15091,  15180,  15269,  15358,  15447,  15535,  15624,  15712,  15800,
+     15888,  15976,  16064,  16151,  16239,  16326,  16413,  16500,  16587,  16673,  16760,
+     16846,  16932,  17018,  17104,  17190,  17275,  17361,  17446,  17531,  17616,  17700,
+     17785,  17869,  17953,  18037,  18121,  18205,  18288,  18372,  18455,  18538,  18621,
+     18703,  18786,  18868,  18950,  19032,  19114,  19195,  19277,  19358,  19439,  19520,
+     19601,  19681,  19761,  19841,  19921,  20001,  20081,  20160,  20239,  20318,  20397,
+     20475,  20554,  20632,  20710,  20788,  20865,  20943,  21020,  21097,  21174,  21251,
+     21327,  21403,  21479,  21555,  21631,  21706,  21781,  21856,  21931,  22006,  22080,
+     22154,  22228,  22302,  22375,  22449,  22522,  22595,  22668,  22740,  22812,  22884,
+     22956,  23028,  23099,  23170,  23241,  23312,  23383,  23453,  23523,  23593,  23663,
+     23732,  23801,  23870,  23939,  24008,  24076,  24144,  24212,  24279,  24347,  24414,
+     24481,  24548,  24614,  24680,  24746,  24812,  24878,  24943,  25008,  25073,  25138,
+     25202,  25266,  25330,  25394,  25457,  25520,  25583,  25646,  25708,  25771,  25833,
+     25894,  25956,  26017,  26078,  26139,  26199,  26259,  26320,  26379,  26439,  26498,
+     26557,  26616,  26674,  26733,  26791,  26848,  26906,  26963,  27020,  27077,  27133,
+     27190,  27246,  27301,  27357,  27412,  27467,  27522,  27576,  27630,  27684,  27738,
+     27791,  27844,  27897,  27950,  28002,  28054,  28106,  28158,  28209,  28260,  28311,
+     28361,  28411,  28461,  28511,  28560,  28610,  28658,  28707,  28755,  28803,  28851,
+     28899,  28946,  28993,  29040,  29086,  29132,  29178,  29224,  29269,  29314,  29359,
+     29404,  29448,  29492,  29535,  29579,  29622,  29665,  29707,  29750,  29792,  29833,
+     29875,  29916,  29957,  29997,  30038,  30078,  30118,  30157,  30196,  30235,  30274,
+     30312,  30350,  30388,  30425,  30462,  30499,  30536,  30572,  30608,  30644,  30680,
+     30715,  30750,  30784,  30819,  30853,  30886,  30920,  30953,  30986,  31018,  31050,
+     31082,  31114,  31146,  31177,  31207,  31238,  31268,  31298,  31328,  31357,  31386,
+     31415,  31443,  31471,  31499,  31527,  31554,  31581,  31608,  31634,  31660,  31686,
+     31711,  31737,  31761,  31786,  31810,  31834,  31858,  31881,  31904,  31927,  31950,
+     31972,  31994,  32015,  32037,  32058,  32078,  32099,  32119,  32138,  32158,  32177,
+     32196,  32214,  32233,  32251,  32268,  32286,  32303,  32319,  32336,  32352,  32368,
+     32383,  32398,  32413,  32428,  32442,  32456,  32470,  32483,  32496,  32509,  32522,
+     32534,  32546,  32557,  32568,  32579,  32590,  32600,  32610,  32620,  32629,  32638,
+     32647,  32656,  32664,  32672,  32679,  32686,  32693,  32700,  32706,  32712,  32718,
+     32723,  32729,  32733,  32738,  32742,  32746,  32749,  32753,  32756,  32758,  32760,
+     32762,  32764,  32766,  32767,  32767,  32767,  32767,  32767,  32767,  32767,  32766,
+     32764,  32762,  32760,  32758,  32756,  32753,  32749,  32746,  32742,  32738,  32733,
+     32729,  32723,  32718,  32712,  32706,  32700,  32693,  32686,  32679,  32672,  32664,
+     32656,  32647,  32638,  32629,  32620,  32610,  32600,  32590,  32579,  32568,  32557,
+     32546,  32534,  32522,  32509,  32496,  32483,  32470,  32456,  32442,  32428,  32413,
+     32398,  32383,  32368,  32352,  32336,  32319,  32303,  32286,  32268,  32251,  32233,
+     32214,  32196,  32177,  32158,  32138,  32119,  32099,  32078,  32058,  32037,  32015,
+     31994,  31972,  31950,  31927,  31904,  31881,  31858,  31834,  31810,  31786,  31761,
+     31737,  31711,  31686,  31660,  31634,  31608,  31581,  31554,  31527,  31499,  31471,
+     31443,  31415,  31386,  31357,  31328,  31298,  31268,  31238,  31207,  31177,  31146,
+     31114,  31082,  31050,  31018,  30986,  30953,  30920,  30886,  30853,  30819,  30784,
+     30750,  30715,  30680,  30644,  30608,  30572,  30536,  30499,  30462,  30425,  30388,
+     30350,  30312,  30274,  30235,  30196,  30157,  30118,  30078,  30038,  29997,  29957,
+     29916,  29875,  29833,  29792,  29750,  29707,  29665,  29622,  29579,  29535,  29492,
+     29448,  29404,  29359,  29314,  29269,  29224,  29178,  29132,  29086,  29040,  28993,
+     28946,  28899,  28851,  28803,  28755,  28707,  28658,  28610,  28560,  28511,  28461,
+     28411,  28361,  28311,  28260,  28209,  28158,  28106,  28054,  28002,  27950,  27897,
+     27844,  27791,  27738,  27684,  27630,  27576,  27522,  27467,  27412,  27357,  27301,
+     27246,  27190,  27133,  27077,  27020,  26963,  26906,  26848,  26791,  26733,  26674,
+     26616,  26557,  26498,  26439,  26379,  26320,  26259,  26199,  26139,  26078,  26017,
+     25956,  25894,  25833,  25771,  25708,  25646,  25583,  25520,  25457,  25394,  25330,
+     25266,  25202,  25138,  25073,  25008,  24943,  24878,  24812,  24746,  24680,  24614,
+     24548,  24481,  24414,  24347,  24279,  24212,  24144,  24076,  24008,  23939,  23870,
+     23801,  23732,  23663,  23593,  23523,  23453,  23383,  23312,  23241,  23170,  23099,
+     23028,  22956,  22884,  22812,  22740,  22668,  22595,  22522,  22449,  22375,  22302,
+     22228,  22154,  22080,  22006,  21931,  21856,  21781,  21706,  21631,  21555,  21479,
+     21403,  21327,  21251,  21174,  21097,  21020,  20943,  20865,  20788,  20710,  20632,
+     20554,  20475,  20397,  20318,  20239,  20160,  20081,  20001,  19921,  19841,  19761,
+     19681,  19601,  19520,  19439,  19358,  19277,  19195,  19114,  19032,  18950,  18868,
+     18786,  18703,  18621,  18538,  18455,  18372,  18288,  18205,  18121,  18037,  17953,
+     17869,  17785,  17700,  17616,  17531,  17446,  17361,  17275,  17190,  17104,  17018,
+     16932,  16846,  16760,  16673,  16587,  16500,  16413,  16326,  16239,  16151,  16064,
+     15976,  15888,  15800,  15712,  15624,  15535,  15447,  15358,  15269,  15180,  15091,
+     15002,  14912,  14823,  14733,  14643,  14553,  14463,  14373,  14282,  14192,  14101,
+     14010,  13919,  13828,  13737,  13646,  13554,  13463,  13371,  13279,  13187,  13095,
+     13003,  12910,  12818,  12725,  12633,  12540,  12447,  12354,  12261,  12167,  12074,
+     11980,  11887,  11793,  11699,  11605,  11511,  11417,  11323,  11228,  11134,  11039,
+     10945,  10850,  10755,  10660,  10565,  10469,  10374,  10279,  10183,  10088,  9992,
+     9896,   9800,   9704,   9608,   9512,   9416,   9319,   9223,   9127,   9030,   8933,
+     8836,   8740,   8643,   8546,   8449,   8351,   8254,   8157,   8059,   7962,   7864,
+     7767,   7669,   7571,   7473,   7376,   7278,   7180,   7081,   6983,   6885,   6787,
+     6688,   6590,   6491,   6393,   6294,   6195,   6097,   5998,   5899,   5800,   5701,
+     5602,   5503,   5404,   5305,   5205,   5106,   5007,   4907,   4808,   4709,   4609,
+     4510,   4410,   4310,   4211,   4111,   4011,   3911,   3812,   3712,   3612,   3512,
+     3412,   3312,   3212,   3112,   3012,   2912,   2811,   2711,   2611,   2511,   2411,
+     2310,   2210,   2110,   2009,   1909,   1809,   1708,   1608,   1507,   1407,   1307,
+     1206,   1106,   1005,   905,    804,    704,    603,    503,    402,    302,    201,
+     101,    0,      -101,   -201,   -302,   -402,   -503,   -603,   -704,   -804,   -905,
+     -1005,  -1106,  -1206,  -1307,  -1407,  -1507,  -1608,  -1708,  -1809,  -1909,  -2009,
+     -2110,  -2210,  -2310,  -2411,  -2511,  -2611,  -2711,  -2811,  -2912,  -3012,  -3112,
+     -3212,  -3312,  -3412,  -3512,  -3612,  -3712,  -3812,  -3911,  -4011,  -4111,  -4211,
+     -4310,  -4410,  -4510,  -4609,  -4709,  -4808,  -4907,  -5007,  -5106,  -5205,  -5305,
+     -5404,  -5503,  -5602,  -5701,  -5800,  -5899,  -5998,  -6097,  -6195,  -6294,  -6393,
+     -6491,  -6590,  -6688,  -6787,  -6885,  -6983,  -7081,  -7180,  -7278,  -7376,  -7473,
+     -7571,  -7669,  -7767,  -7864,  -7962,  -8059,  -8157,  -8254,  -8351,  -8449,  -8546,
+     -8643,  -8740,  -8836,  -8933,  -9030,  -9127,  -9223,  -9319,  -9416,  -9512,  -9608,
+     -9704,  -9800,  -9896,  -9992,  -10088, -10183, -10279, -10374, -10469, -10565, -10660,
+     -10755, -10850, -10945, -11039, -11134, -11228, -11323, -11417, -11511, -11605, -11699,
+     -11793, -11887, -11980, -12074, -12167, -12261, -12354, -12447, -12540, -12633, -12725,
+     -12818, -12910, -13003, -13095, -13187, -13279, -13371, -13463, -13554, -13646, -13737,
+     -13828, -13919, -14010, -14101, -14192, -14282, -14373, -14463, -14553, -14643, -14733,
+     -14823, -14912, -15002, -15091, -15180, -15269, -15358, -15447, -15535, -15624, -15712,
+     -15800, -15888, -15976, -16064, -16151, -16239, -16326, -16413, -16500, -16587, -16673,
+     -16760, -16846, -16932, -17018, -17104, -17190, -17275, -17361, -17446, -17531, -17616,
+     -17700, -17785, -17869, -17953, -18037, -18121, -18205, -18288, -18372, -18455, -18538,
+     -18621, -18703, -18786, -18868, -18950, -19032, -19114, -19195, -19277, -19358, -19439,
+     -19520, -19601, -19681, -19761, -19841, -19921, -20001, -20081, -20160, -20239, -20318,
+     -20397, -20475, -20554, -20632, -20710, -20788, -20865, -20943, -21020, -21097, -21174,
+     -21251, -21327, -21403, -21479, -21555, -21631, -21706, -21781, -21856, -21931, -22006,
+     -22080, -22154, -22228, -22302, -22375, -22449, -22522, -22595, -22668, -22740, -22812,
+     -22884, -22956, -23028, -23099, -23170, -23241, -23312, -23383, -23453, -23523, -23593,
+     -23663, -23732, -23801, -23870, -23939, -24008, -24076, -24144, -24212, -24279, -24347,
+     -24414, -24481, -24548, -24614, -24680, -24746, -24812, -24878, -24943, -25008, -25073,
+     -25138, -25202, -25266, -25330, -25394, -25457, -25520, -25583, -25646, -25708, -25771,
+     -25833, -25894, -25956, -26017, -26078, -26139, -26199, -26259, -26320, -26379, -26439,
+     -26498, -26557, -26616, -26674, -26733, -26791, -26848, -26906, -26963, -27020, -27077,
+     -27133, -27190, -27246, -27301, -27357, -27412, -27467, -27522, -27576, -27630, -27684,
+     -27738, -27791, -27844, -27897, -27950, -28002, -28054, -28106, -28158, -28209, -28260,
+     -28311, -28361, -28411, -28461, -28511, -28560, -28610, -28658, -28707, -28755, -28803,
+     -28851, -28899, -28946, -28993, -29040, -29086, -29132, -29178, -29224, -29269, -29314,
+     -29359, -29404, -29448, -29492, -29535, -29579, -29622, -29665, -29707, -29750, -29792,
+     -29833, -29875, -29916, -29957, -29997, -30038, -30078, -30118, -30157, -30196, -30235,
+     -30274, -30312, -30350, -30388, -30425, -30462, -30499, -30536, -30572, -30608, -30644,
+     -30680, -30715, -30750, -30784, -30819, -30853, -30886, -30920, -30953, -30986, -31018,
+     -31050, -31082, -31114, -31146, -31177, -31207, -31238, -31268, -31298, -31328, -31357,
+     -31386, -31415, -31443, -31471, -31499, -31527, -31554, -31581, -31608, -31634, -31660,
+     -31686, -31711, -31737, -31761, -31786, -31810, -31834, -31858, -31881, -31904, -31927,
+     -31950, -31972, -31994, -32015, -32037, -32058, -32078, -32099, -32119, -32138, -32158,
+     -32177, -32196, -32214, -32233, -32251, -32268, -32286, -32303, -32319, -32336, -32352,
+     -32368, -32383, -32398, -32413, -32428, -32442, -32456, -32470, -32483, -32496, -32509,
+     -32522, -32534, -32546, -32557, -32568, -32579, -32590, -32600, -32610, -32620, -32629,
+     -32638, -32647, -32656, -32664, -32672, -32679, -32686, -32693, -32700, -32706, -32712,
+     -32718, -32723, -32729, -32733, -32738, -32742, -32746, -32749, -32753, -32756, -32758,
+     -32760, -32762, -32764, -32766, -32767, -32767, -32767, -32767, -32767, -32767, -32767,
+     -32766, -32764, -32762, -32760, -32758, -32756, -32753, -32749, -32746, -32742, -32738,
+     -32733, -32729, -32723, -32718, -32712, -32706, -32700, -32693, -32686, -32679, -32672,
+     -32664, -32656, -32647, -32638, -32629, -32620, -32610, -32600, -32590, -32579, -32568,
+     -32557, -32546, -32534, -32522, -32509, -32496, -32483, -32470, -32456, -32442, -32428,
+     -32413, -32398, -32383, -32368, -32352, -32336, -32319, -32303, -32286, -32268, -32251,
+     -32233, -32214, -32196, -32177, -32158, -32138, -32119, -32099, -32078, -32058, -32037,
+     -32015, -31994, -31972, -31950, -31927, -31904, -31881, -31858, -31834, -31810, -31786,
+     -31761, -31737, -31711, -31686, -31660, -31634, -31608, -31581, -31554, -31527, -31499,
+     -31471, -31443, -31415, -31386, -31357, -31328, -31298, -31268, -31238, -31207, -31177,
+     -31146, -31114, -31082, -31050, -31018, -30986, -30953, -30920, -30886, -30853, -30819,
+     -30784, -30750, -30715, -30680, -30644, -30608, -30572, -30536, -30499, -30462, -30425,
+     -30388, -30350, -30312, -30274, -30235, -30196, -30157, -30118, -30078, -30038, -29997,
+     -29957, -29916, -29875, -29833, -29792, -29750, -29707, -29665, -29622, -29579, -29535,
+     -29492, -29448, -29404, -29359, -29314, -29269, -29224, -29178, -29132, -29086, -29040,
+     -28993, -28946, -28899, -28851, -28803, -28755, -28707, -28658, -28610, -28560, -28511,
+     -28461, -28411, -28361, -28311, -28260, -28209, -28158, -28106, -28054, -28002, -27950,
+     -27897, -27844, -27791, -27738, -27684, -27630, -27576, -27522, -27467, -27412, -27357,
+     -27301, -27246, -27190, -27133, -27077, -27020, -26963, -26906, -26848, -26791, -26733,
+     -26674, -26616, -26557, -26498, -26439, -26379, -26320, -26259, -26199, -26139, -26078,
+     -26017, -25956, -25894, -25833, -25771, -25708, -25646, -25583, -25520, -25457, -25394,
+     -25330, -25266, -25202, -25138, -25073, -25008, -24943, -24878, -24812, -24746, -24680,
+     -24614, -24548, -24481, -24414, -24347, -24279, -24212, -24144, -24076, -24008, -23939,
+     -23870, -23801, -23732, -23663, -23593, -23523, -23453, -23383, -23312, -23241, -23170,
+     -23099, -23028, -22956, -22884, -22812, -22740, -22668, -22595, -22522, -22449, -22375,
+     -22302, -22228, -22154, -22080, -22006, -21931, -21856, -21781, -21706, -21631, -21555,
+     -21479, -21403, -21327, -21251, -21174, -21097, -21020, -20943, -20865, -20788, -20710,
+     -20632, -20554, -20475, -20397, -20318, -20239, -20160, -20081, -20001, -19921, -19841,
+     -19761, -19681, -19601, -19520, -19439, -19358, -19277, -19195, -19114, -19032, -18950,
+     -18868, -18786, -18703, -18621, -18538, -18455, -18372, -18288, -18205, -18121, -18037,
+     -17953, -17869, -17785, -17700, -17616, -17531, -17446, -17361, -17275, -17190, -17104,
+     -17018, -16932, -16846, -16760, -16673, -16587, -16500, -16413, -16326, -16239, -16151,
+     -16064, -15976, -15888, -15800, -15712, -15624, -15535, -15447, -15358, -15269, -15180,
+     -15091, -15002, -14912, -14823, -14733, -14643, -14553, -14463, -14373, -14282, -14192,
+     -14101, -14010, -13919, -13828, -13737, -13646, -13554, -13463, -13371, -13279, -13187,
+     -13095, -13003, -12910, -12818, -12725, -12633, -12540, -12447, -12354, -12261, -12167,
+     -12074, -11980, -11887, -11793, -11699, -11605, -11511, -11417, -11323, -11228, -11134,
+     -11039, -10945, -10850, -10755, -10660, -10565, -10469, -10374, -10279, -10183, -10088,
+     -9992,  -9896,  -9800,  -9704,  -9608,  -9512,  -9416,  -9319,  -9223,  -9127,  -9030,
+     -8933,  -8836,  -8740,  -8643,  -8546,  -8449,  -8351,  -8254,  -8157,  -8059,  -7962,
+     -7864,  -7767,  -7669,  -7571,  -7473,  -7376,  -7278,  -7180,  -7081,  -6983,  -6885,
+     -6787,  -6688,  -6590,  -6491,  -6393,  -6294,  -6195,  -6097,  -5998,  -5899,  -5800,
+     -5701,  -5602,  -5503,  -5404,  -5305,  -5205,  -5106,  -5007,  -4907,  -4808,  -4709,
+     -4609,  -4510,  -4410,  -4310,  -4211,  -4111,  -4011,  -3911,  -3812,  -3712,  -3612,
+     -3512,  -3412,  -3312,  -3212,  -3112,  -3012,  -2912,  -2811,  -2711,  -2611,  -2511,
+     -2411,  -2310,  -2210,  -2110,  -2009,  -1909,  -1809,  -1708,  -1608,  -1507,  -1407,
+     -1307,  -1206,  -1106,  -1005,  -905,   -804,   -704,   -603,   -503,   -402,   -302,
+     -201,   -101},
+
+    {32767,  32767,  32767,  32767,  32766,  32764,  32762,  32760,  32758,  32756,  32753,
+     32749,  32746,  32742,  32738,  32733,  32729,  32723,  32718,  32712,  32706,  32700,
+     32693,  32686,  32679,  32672,  32664,  32656,  32647,  32638,  32629,  32620,  32610,
+     32600,  32590,  32579,  32568,  32557,  32546,  32534,  32522,  32509,  32496,  32483,
+     32470,  32456,  32442,  32428,  32413,  32398,  32383,  32368,  32352,  32336,  32319,
+     32303,  32286,  32268,  32251,  32233,  32214,  32196,  32177,  32158,  32138,  32119,
+     32099,  32078,  32058,  32037,  32015,  31994,  31972,  31950,  31927,  31904,  31881,
+     31858,  31834,  31810,  31786,  31761,  31737,  31711,  31686,  31660,  31634,  31608,
+     31581,  31554,  31527,  31499,  31471,  31443,  31415,  31386,  31357,  31328,  31298,
+     31268,  31238,  31207,  31177,  31146,  31114,  31082,  31050,  31018,  30986,  30953,
+     30920,  30886,  30853,  30819,  30784,  30750,  30715,  30680,  30644,  30608,  30572,
+     30536,  30499,  30462,  30425,  30388,  30350,  30312,  30274,  30235,  30196,  30157,
+     30118,  30078,  30038,  29997,  29957,  29916,  29875,  29833,  29792,  29750,  29707,
+     29665,  29622,  29579,  29535,  29492,  29448,  29404,  29359,  29314,  29269,  29224,
+     29178,  29132,  29086,  29040,  28993,  28946,  28899,  28851,  28803,  28755,  28707,
+     28658,  28610,  28560,  28511,  28461,  28411,  28361,  28311,  28260,  28209,  28158,
+     28106,  28054,  28002,  27950,  27897,  27844,  27791,  27738,  27684,  27630,  27576,
+     27522,  27467,  27412,  27357,  27301,  27246,  27190,  27133,  27077,  27020,  26963,
+     26906,  26848,  26791,  26733,  26674,  26616,  26557,  26498,  26439,  26379,  26320,
+     26259,  26199,  26139,  26078,  26017,  25956,  25894,  25833,  25771,  25708,  25646,
+     25583,  25520,  25457,  25394,  25330,  25266,  25202,  25138,  25073,  25008,  24943,
+     24878,  24812,  24746,  24680,  24614,  24548,  24481,  24414,  24347,  24279,  24212,
+     24144,  24076,  24008,  23939,  23870,  23801,  23732,  23663,  23593,  23523,  23453,
+     23383,  23312,  23241,  23170,  23099,  23028,  22956,  22884,  22812,  22740,  22668,
+     22595,  22522,  22449,  22375,  22302,  22228,  22154,  22080,  22006,  21931,  21856,
+     21781,  21706,  21631,  21555,  21479,  21403,  21327,  21251,  21174,  21097,  21020,
+     20943,  20865,  20788,  20710,  20632,  20554,  20475,  20397,  20318,  20239,  20160,
+     20081,  20001,  19921,  19841,  19761,  19681,  19601,  19520,  19439,  19358,  19277,
+     19195,  19114,  19032,  18950,  18868,  18786,  18703,  18621,  18538,  18455,  18372,
+     18288,  18205,  18121,  18037,  17953,  17869,  17785,  17700,  17616,  17531,  17446,
+     17361,  17275,  17190,  17104,  17018,  16932,  16846,  16760,  16673,  16587,  16500,
+     16413,  16326,  16239,  16151,  16064,  15976,  15888,  15800,  15712,  15624,  15535,
+     15447,  15358,  15269,  15180,  15091,  15002,  14912,  14823,  14733,  14643,  14553,
+     14463,  14373,  14282,  14192,  14101,  14010,  13919,  13828,  13737,  13646,  13554,
+     13463,  13371,  13279,  13187,  13095,  13003,  12910,  12818,  12725,  12633,  12540,
+     12447,  12354,  12261,  12167,  12074,  11980,  11887,  11793,  11699,  11605,  11511,
+     11417,  11323,  11228,  11134,  11039,  10945,  10850,  10755,  10660,  10565,  10469,
+     10374,  10279,  10183,  10088,  9992,   9896,   9800,   9704,   9608,   9512,   9416,
+     9319,   9223,   9127,   9030,   8933,   8836,   8740,   8643,   8546,   8449,   8351,
+     8254,   8157,   8059,   7962,   7864,   7767,   7669,   7571,   7473,   7376,   7278,
+     7180,   7081,   6983,   6885,   6787,   6688,   6590,   6491,   6393,   6294,   6195,
+     6097,   5998,   5899,   5800,   5701,   5602,   5503,   5404,   5305,   5205,   5106,
+     5007,   4907,   4808,   4709,   4609,   4510,   4410,   4310,   4211,   4111,   4011,
+     3911,   3812,   3712,   3612,   3512,   3412,   3312,   3212,   3112,   3012,   2912,
+     2811,   2711,   2611,   2511,   2411,   2310,   2210,   2110,   2009,   1909,   1809,
+     1708,   1608,   1507,   1407,   1307,   1206,   1106,   1005,   905,    804,    704,
+     603,    503,    402,    302,    201,    101,    0,      -101,   -201,   -302,   -402,
+     -503,   -603,   -704,   -804,   -905,   -1005,  -1106,  -1206,  -1307,  -1407,  -1507,
+     -1608,  -1708,  -1809,  -1909,  -2009,  -2110,  -2210,  -2310,  -2411,  -2511,  -2611,
+     -2711,  -2811,  -2912,  -3012,  -3112,  -3212,  -3312,  -3412,  -3512,  -3612,  -3712,
+     -3812,  -3911,  -4011,  -4111,  -4211,  -4310,  -4410,  -4510,  -4609,  -4709,  -4808,
+     -4907,  -5007,  -5106,  -5205,  -5305,  -5404,  -5503,  -5602,  -5701,  -5800,  -5899,
+     -5998,  -6097,  -6195,  -6294,  -6393,  -6491,  -6590,  -6688,  -6787,  -6885,  -6983,
+     -7081,  -7180,  -7278,  -7376,  -7473,  -7571,  -7669,  -7767,  -7864,  -7962,  -8059,
+     -8157,  -8254,  -8351,  -8449,  -8546,  -8643,  -8740,  -8836,  -8933,  -9030,  -9127,
+     -9223,  -9319,  -9416,  -9512,  -9608,  -9704,  -9800,  -9896,  -9992,  -10088, -10183,
+     -10279, -10374, -10469, -10565, -10660, -10755, -10850, -10945, -11039, -11134, -11228,
+     -11323, -11417, -11511, -11605, -11699, -11793, -11887, -11980, -12074, -12167, -12261,
+     -12354, -12447, -12540, -12633, -12725, -12818, -12910, -13003, -13095, -13187, -13279,
+     -13371, -13463, -13554, -13646, -13737, -13828, -13919, -14010, -14101, -14192, -14282,
+     -14373, -14463, -14553, -14643, -14733, -14823, -14912, -15002, -15091, -15180, -15269,
+     -15358, -15447, -15535, -15624, -15712, -15800, -15888, -15976, -16064, -16151, -16239,
+     -16326, -16413, -16500, -16587, -16673, -16760, -16846, -16932, -17018, -17104, -17190,
+     -17275, -17361, -17446, -17531, -17616, -17700, -17785, -17869, -17953, -18037, -18121,
+     -18205, -18288, -18372, -18455, -18538, -18621, -18703, -18786, -18868, -18950, -19032,
+     -19114, -19195, -19277, -19358, -19439, -19520, -19601, -19681, -19761, -19841, -19921,
+     -20001, -20081, -20160, -20239, -20318, -20397, -20475, -20554, -20632, -20710, -20788,
+     -20865, -20943, -21020, -21097, -21174, -21251, -21327, -21403, -21479, -21555, -21631,
+     -21706, -21781, -21856, -21931, -22006, -22080, -22154, -22228, -22302, -22375, -22449,
+     -22522, -22595, -22668, -22740, -22812, -22884, -22956, -23028, -23099, -23170, -23241,
+     -23312, -23383, -23453, -23523, -23593, -23663, -23732, -23801, -23870, -23939, -24008,
+     -24076, -24144, -24212, -24279, -24347, -24414, -24481, -24548, -24614, -24680, -24746,
+     -24812, -24878, -24943, -25008, -25073, -25138, -25202, -25266, -25330, -25394, -25457,
+     -25520, -25583, -25646, -25708, -25771, -25833, -25894, -25956, -26017, -26078, -26139,
+     -26199, -26259, -26320, -26379, -26439, -26498, -26557, -26616, -26674, -26733, -26791,
+     -26848, -26906, -26963, -27020, -27077, -27133, -27190, -27246, -27301, -27357, -27412,
+     -27467, -27522, -27576, -27630, -27684, -27738, -27791, -27844, -27897, -27950, -28002,
+     -28054, -28106, -28158, -28209, -28260, -28311, -28361, -28411, -28461, -28511, -28560,
+     -28610, -28658, -28707, -28755, -28803, -28851, -28899, -28946, -28993, -29040, -29086,
+     -29132, -29178, -29224, -29269, -29314, -29359, -29404, -29448, -29492, -29535, -29579,
+     -29622, -29665, -29707, -29750, -29792, -29833, -29875, -29916, -29957, -29997, -30038,
+     -30078, -30118, -30157, -30196, -30235, -30274, -30312, -30350, -30388, -30425, -30462,
+     -30499, -30536, -30572, -30608, -30644, -30680, -30715, -30750, -30784, -30819, -30853,
+     -30886, -30920, -30953, -30986, -31018, -31050, -31082, -31114, -31146, -31177, -31207,
+     -31238, -31268, -31298, -31328, -31357, -31386, -31415, -31443, -31471, -31499, -31527,
+     -31554, -31581, -31608, -31634, -31660, -31686, -31711, -31737, -31761, -31786, -31810,
+     -31834, -31858, -31881, -31904, -31927, -31950, -31972, -31994, -32015, -32037, -32058,
+     -32078, -32099, -32119, -32138, -32158, -32177, -32196, -32214, -32233, -32251, -32268,
+     -32286, -32303, -32319, -32336, -32352, -32368, -32383, -32398, -32413, -32428, -32442,
+     -32456, -32470, -32483, -32496, -32509, -32522, -32534, -32546, -32557, -32568, -32579,
+     -32590, -32600, -32610, -32620, -32629, -32638, -32647, -32656, -32664, -32672, -32679,
+     -32686, -32693, -32700, -32706, -32712, -32718, -32723, -32729, -32733, -32738, -32742,
+     -32746, -32749, -32753, -32756, -32758, -32760, -32762, -32764, -32766, -32767, -32767,
+     -32767, -32767, -32767, -32767, -32767, -32766, -32764, -32762, -32760, -32758, -32756,
+     -32753, -32749, -32746, -32742, -32738, -32733, -32729, -32723, -32718, -32712, -32706,
+     -32700, -32693, -32686, -32679, -32672, -32664, -32656, -32647, -32638, -32629, -32620,
+     -32610, -32600, -32590, -32579, -32568, -32557, -32546, -32534, -32522, -32509, -32496,
+     -32483, -32470, -32456, -32442, -32428, -32413, -32398, -32383, -32368, -32352, -32336,
+     -32319, -32303, -32286, -32268, -32251, -32233, -32214, -32196, -32177, -32158, -32138,
+     -32119, -32099, -32078, -32058, -32037, -32015, -31994, -31972, -31950, -31927, -31904,
+     -31881, -31858, -31834, -31810, -31786, -31761, -31737, -31711, -31686, -31660, -31634,
+     -31608, -31581, -31554, -31527, -31499, -31471, -31443, -31415, -31386, -31357, -31328,
+     -31298, -31268, -31238, -31207, -31177, -31146, -31114, -31082, -31050, -31018, -30986,
+     -30953, -30920, -30886, -30853, -30819, -30784, -30750, -30715, -30680, -30644, -30608,
+     -30572, -30536, -30499, -30462, -30425, -30388, -30350, -30312, -30274, -30235, -30196,
+     -30157, -30118, -30078, -30038, -29997, -29957, -29916, -29875, -29833, -29792, -29750,
+     -29707, -29665, -29622, -29579, -29535, -29492, -29448, -29404, -29359, -29314, -29269,
+     -29224, -29178, -29132, -29086, -29040, -28993, -28946, -28899, -28851, -28803, -28755,
+     -28707, -28658, -28610, -28560, -28511, -28461, -28411, -28361, -28311, -28260, -28209,
+     -28158, -28106, -28054, -28002, -27950, -27897, -27844, -27791, -27738, -27684, -27630,
+     -27576, -27522, -27467, -27412, -27357, -27301, -27246, -27190, -27133, -27077, -27020,
+     -26963, -26906, -26848, -26791, -26733, -26674, -26616, -26557, -26498, -26439, -26379,
+     -26320, -26259, -26199, -26139, -26078, -26017, -25956, -25894, -25833, -25771, -25708,
+     -25646, -25583, -25520, -25457, -25394, -25330, -25266, -25202, -25138, -25073, -25008,
+     -24943, -24878, -24812, -24746, -24680, -24614, -24548, -24481, -24414, -24347, -24279,
+     -24212, -24144, -24076, -24008, -23939, -23870, -23801, -23732, -23663, -23593, -23523,
+     -23453, -23383, -23312, -23241, -23170, -23099, -23028, -22956, -22884, -22812, -22740,
+     -22668, -22595, -22522, -22449, -22375, -22302, -22228, -22154, -22080, -22006, -21931,
+     -21856, -21781, -21706, -21631, -21555, -21479, -21403, -21327, -21251, -21174, -21097,
+     -21020, -20943, -20865, -20788, -20710, -20632, -20554, -20475, -20397, -20318, -20239,
+     -20160, -20081, -20001, -19921, -19841, -19761, -19681, -19601, -19520, -19439, -19358,
+     -19277, -19195, -19114, -19032, -18950, -18868, -18786, -18703, -18621, -18538, -18455,
+     -18372, -18288, -18205, -18121, -18037, -17953, -17869, -17785, -17700, -17616, -17531,
+     -17446, -17361, -17275, -17190, -17104, -17018, -16932, -16846, -16760, -16673, -16587,
+     -16500, -16413, -16326, -16239, -16151, -16064, -15976, -15888, -15800, -15712, -15624,
+     -15535, -15447, -15358, -15269, -15180, -15091, -15002, -14912, -14823, -14733, -14643,
+     -14553, -14463, -14373, -14282, -14192, -14101, -14010, -13919, -13828, -13737, -13646,
+     -13554, -13463, -13371, -13279, -13187, -13095, -13003, -12910, -12818, -12725, -12633,
+     -12540, -12447, -12354, -12261, -12167, -12074, -11980, -11887, -11793, -11699, -11605,
+     -11511, -11417, -11323, -11228, -11134, -11039, -10945, -10850, -10755, -10660, -10565,
+     -10469, -10374, -10279, -10183, -10088, -9992,  -9896,  -9800,  -9704,  -9608,  -9512,
+     -9416,  -9319,  -9223,  -9127,  -9030,  -8933,  -8836,  -8740,  -8643,  -8546,  -8449,
+     -8351,  -8254,  -8157,  -8059,  -7962,  -7864,  -7767,  -7669,  -7571,  -7473,  -7376,
+     -7278,  -7180,  -7081,  -6983,  -6885,  -6787,  -6688,  -6590,  -6491,  -6393,  -6294,
+     -6195,  -6097,  -5998,  -5899,  -5800,  -5701,  -5602,  -5503,  -5404,  -5305,  -5205,
+     -5106,  -5007,  -4907,  -4808,  -4709,  -4609,  -4510,  -4410,  -4310,  -4211,  -4111,
+     -4011,  -3911,  -3812,  -3712,  -3612,  -3512,  -3412,  -3312,  -3212,  -3112,  -3012,
+     -2912,  -2811,  -2711,  -2611,  -2511,  -2411,  -2310,  -2210,  -2110,  -2009,  -1909,
+     -1809,  -1708,  -1608,  -1507,  -1407,  -1307,  -1206,  -1106,  -1005,  -905,   -804,
+     -704,   -603,   -503,   -402,   -302,   -201,   -101,   0,      101,    201,    302,
+     402,    503,    603,    704,    804,    905,    1005,   1106,   1206,   1307,   1407,
+     1507,   1608,   1708,   1809,   1909,   2009,   2110,   2210,   2310,   2411,   2511,
+     2611,   2711,   2811,   2912,   3012,   3112,   3212,   3312,   3412,   3512,   3612,
+     3712,   3812,   3911,   4011,   4111,   4211,   4310,   4410,   4510,   4609,   4709,
+     4808,   4907,   5007,   5106,   5205,   5305,   5404,   5503,   5602,   5701,   5800,
+     5899,   5998,   6097,   6195,   6294,   6393,   6491,   6590,   6688,   6787,   6885,
+     6983,   7081,   7180,   7278,   7376,   7473,   7571,   7669,   7767,   7864,   7962,
+     8059,   8157,   8254,   8351,   8449,   8546,   8643,   8740,   8836,   8933,   9030,
+     9127,   9223,   9319,   9416,   9512,   9608,   9704,   9800,   9896,   9992,   10088,
+     10183,  10279,  10374,  10469,  10565,  10660,  10755,  10850,  10945,  11039,  11134,
+     11228,  11323,  11417,  11511,  11605,  11699,  11793,  11887,  11980,  12074,  12167,
+     12261,  12354,  12447,  12540,  12633,  12725,  12818,  12910,  13003,  13095,  13187,
+     13279,  13371,  13463,  13554,  13646,  13737,  13828,  13919,  14010,  14101,  14192,
+     14282,  14373,  14463,  14553,  14643,  14733,  14823,  14912,  15002,  15091,  15180,
+     15269,  15358,  15447,  15535,  15624,  15712,  15800,  15888,  15976,  16064,  16151,
+     16239,  16326,  16413,  16500,  16587,  16673,  16760,  16846,  16932,  17018,  17104,
+     17190,  17275,  17361,  17446,  17531,  17616,  17700,  17785,  17869,  17953,  18037,
+     18121,  18205,  18288,  18372,  18455,  18538,  18621,  18703,  18786,  18868,  18950,
+     19032,  19114,  19195,  19277,  19358,  19439,  19520,  19601,  19681,  19761,  19841,
+     19921,  20001,  20081,  20160,  20239,  20318,  20397,  20475,  20554,  20632,  20710,
+     20788,  20865,  20943,  21020,  21097,  21174,  21251,  21327,  21403,  21479,  21555,
+     21631,  21706,  21781,  21856,  21931,  22006,  22080,  22154,  22228,  22302,  22375,
+     22449,  22522,  22595,  22668,  22740,  22812,  22884,  22956,  23028,  23099,  23170,
+     23241,  23312,  23383,  23453,  23523,  23593,  23663,  23732,  23801,  23870,  23939,
+     24008,  24076,  24144,  24212,  24279,  24347,  24414,  24481,  24548,  24614,  24680,
+     24746,  24812,  24878,  24943,  25008,  25073,  25138,  25202,  25266,  25330,  25394,
+     25457,  25520,  25583,  25646,  25708,  25771,  25833,  25894,  25956,  26017,  26078,
+     26139,  26199,  26259,  26320,  26379,  26439,  26498,  26557,  26616,  26674,  26733,
+     26791,  26848,  26906,  26963,  27020,  27077,  27133,  27190,  27246,  27301,  27357,
+     27412,  27467,  27522,  27576,  27630,  27684,  27738,  27791,  27844,  27897,  27950,
+     28002,  28054,  28106,  28158,  28209,  28260,  28311,  28361,  28411,  28461,  28511,
+     28560,  28610,  28658,  28707,  28755,  28803,  28851,  28899,  28946,  28993,  29040,
+     29086,  29132,  29178,  29224,  29269,  29314,  29359,  29404,  29448,  29492,  29535,
+     29579,  29622,  29665,  29707,  29750,  29792,  29833,  29875,  29916,  29957,  29997,
+     30038,  30078,  30118,  30157,  30196,  30235,  30274,  30312,  30350,  30388,  30425,
+     30462,  30499,  30536,  30572,  30608,  30644,  30680,  30715,  30750,  30784,  30819,
+     30853,  30886,  30920,  30953,  30986,  31018,  31050,  31082,  31114,  31146,  31177,
+     31207,  31238,  31268,  31298,  31328,  31357,  31386,  31415,  31443,  31471,  31499,
+     31527,  31554,  31581,  31608,  31634,  31660,  31686,  31711,  31737,  31761,  31786,
+     31810,  31834,  31858,  31881,  31904,  31927,  31950,  31972,  31994,  32015,  32037,
+     32058,  32078,  32099,  32119,  32138,  32158,  32177,  32196,  32214,  32233,  32251,
+     32268,  32286,  32303,  32319,  32336,  32352,  32368,  32383,  32398,  32413,  32428,
+     32442,  32456,  32470,  32483,  32496,  32509,  32522,  32534,  32546,  32557,  32568,
+     32579,  32590,  32600,  32610,  32620,  32629,  32638,  32647,  32656,  32664,  32672,
+     32679,  32686,  32693,  32700,  32706,  32712,  32718,  32723,  32729,  32733,  32738,
+     32742,  32746,  32749,  32753,  32756,  32758,  32760,  32762,  32764,  32766,  32767,
+     32767,  32767},
+
+}; /* END OF ia_mps_dec_hybrid_tables_struct */
+
+const ia_mps_dec_mdct2qmf_tables_struct ixheaacd_mps_dec_mdct2qmf_tables = {
+    /* cos_table_long_32_00[32] */
+    {-22594, -24811, 20160,  26791,  -17530, -28510, 14733,  29957,  -11792, -31113, 8740,
+     31972,  -5601,  -32521, 2411,   32758,  804,    -32678, -4010,  32286,  7180,   -31580,
+     -10278, 30572,  13279,  -29268, -16150, 27684,  18868,  -25832, -21402, 23732},
+    /* cos_table_long_32_01[32] */
+    {21403,  27684,  -13278, -31580, 4011,  32758,  5602,  -31113, -14732, 26791,  22595,
+     -20159, -28510, 11793,  31972,  -2410, -32678, -7179, 30572,  16151,  -25832, -23731,
+     18868,  29269,  -10278, -32285, 804,   32522,  8740,  -29956, -17530, 24812},
+    /* cos_table_long_32_02[32] */
+    {-20159, -29956, 5602,   32679,  10279,  -27683, -23731, 16151,  31581,  -803,   -31971,
+     -14732, 24812,  26791,  -11792, -32521, -4010,  30572,  18868,  -21402, -29268, 7179,
+     32758,  8740,   -28510, -22594, 17531,  31114,  -2410,  -32285, -13278, 25833},
+    /* cos_table_long_32_03[32] */
+    {18868, 31581,  2411,   -29956, -22594, 14733, 32522,  7180,   -27683, -25832, 10279,
+     32758, 11793,  -24811, -28510, 5602,   32286, 16151,  -21402, -30571, 804,    31114,
+     20160, -17530, -31971, -4010,  29269,  23732, -13278, -32678, -8739,  26791},
+    /* cos_table_long_32_04[32] */
+    {-17530, -32521, -10278, 23732, 30572, 2411,  -28510, -26790, 5602,  31581, 21403,
+     -13278, -32757, -14732, 20160, 31972, 7180,  -25832, -29268, 804,   29957, 24812,
+     -8739,  -32285, -18867, 16151, 32679, 11793, -22594, -31113, -4010, 27684},
+    /* cos_table_long_32_05[32] */
+    {16151,  32758,  17531, -14732, -32678, -18867, 13279,  32522,  20160, -11792, -32285,
+     -21402, 10279,  31972, 22595,  -8739,  -31580, -23731, 7179,   31114, 24812,  -5601,
+     -30571, -25832, 4011,  29957,  26791,  -2410,  -29268, -27683, 804,   28511},
+    /* cos_table_long_32_06[32] */
+    {-14732, -32285, -23731, 4011,   28511,  29957,  7180,   -21402, -32678, -17530, 11793,
+     31581,  25833,  -803,   -26790, -31113, -10278, 18868,  32758,  20160,  -8739,  -30571,
+     -27683, -2410,  24812,  31972,  13279,  -16150, -32521, -22594, 5602,   29269},
+    /* cos_table_long_32_07[32] */
+    {13279, 31114,  28511,  7180,   -18867, -32521, -24811, -803,   23732,  32679,  20160,
+     -5601, -27683, -31580, -14732, 11793,  30572,  29269,  8740,   -17530, -32285, -25832,
+     -2410, 22595,  32758,  21403,  -4010,  -26790, -31971, -16150, 10279,  29957},
+    /* cos_table_long_32_08[32] */
+    {-11792, -29268, -31580, -17530, 5602,   25833,  32679,  22595,  804,    -21402, -32521,
+     -26790, -7179,  16151,  31114,  29957,  13279,  -10278, -28510, -31971, -18867, 4011,
+     24812,  32758,  23732,  2411,   -20159, -32285, -27683, -8739,  14733,  30572},
+    /* cos_table_long_32_09[32] */
+    {10279, 26791, 32758, 25833,  8740,   -11792, -27683, -32678, -24811, -7179, 13279,
+     28511, 32522, 23732, 5602,   -14732, -29268, -32285, -22594, -4010,  16151, 29957,
+     31972, 21403, 2411,  -17530, -30571, -31580, -20159, -803,   18868,  31114},
+    /* cos_table_long_32_10[32] */
+    {-8739, -23731, -31971, -31113, -21402, -5601,  11793,  25833, 32522, 29957, 18868,
+     2411,  -14732, -27683, -32757, -28510, -16150, 804,    17531, 29269, 32679, 26791,
+     13279, -4010,  -20159, -30571, -32285, -24811, -10278, 7180,  22595, 31581},
+    /* cos_table_long_32_11[32] */
+    {7179,   20160,  29269,  32758,  29957,  21403,  8740,  -5601, -18867, -28510, -32678,
+     -30571, -22594, -10278, 4011,   17531,  27684,  32522, 31114, 23732,  11793,  -2410,
+     -16150, -26790, -32285, -31580, -24811, -13278, 804,   14733, 25833,  31972},
+    /* cos_table_long_32_12[32] */
+    {-5601,  -16150, -24811, -30571, -32757, -31113, -25832, -17530, -7179,  4011,   14733,
+     23732,  29957,  32679,  31581,  26791,  18868,  8740,   -2410,  -13278, -22594, -29268,
+     -32521, -31971, -27683, -20159, -10278, 804,    11793,  21403,  28511,  32286},
+    /* cos_table_long_32_13[32] */
+    {4011,   11793,  18868, 24812,  29269,  31972,  32758,  31581,  28511,  23732,  17531,
+     10279,  2411,   -5601, -13278, -20159, -25832, -29956, -32285, -32678, -31113, -27683,
+     -22594, -16150, -8739, -803,   7180,   14733,  21403,  26791,  30572,  32522},
+    /* cos_table_long_32_14[32] */
+    {-2410,  -7178,  -11792, -16150, -20159, -23731, -26790, -29268, -31113, -32285, -32757,
+     -32521, -31580, -29956, -27683, -24811, -21402, -17530, -13278, -8739,  -4010,  804,
+     5602,   10279,  14733,  18868,  22595,  25833,  28511,  30572,  31972,  32679},
+    /* cos_table_long_32_15[32] */
+    {804,   2411,  4011,  5602,  7180,  8740,  10279, 11793, 13279, 14733, 16151,
+     17531, 18868, 20160, 21403, 22595, 23732, 24812, 25833, 26791, 27684, 28511,
+     29269, 29957, 30572, 31114, 31581, 31972, 32286, 32522, 32679, 32758},
+    /* cos_table_long_32_16[32] */
+    {23732,  21403, -25831, -18867, 27684,  16151, -29268, -13278, 30572,  10279, -31580,
+     -7179,  32286, 4011,   -32678, -803,   32758, -2410,  -32521, 5602,   31972, -8739,
+     -31113, 11793, 29957,  -14732, -28510, 17531, 26791,  -20159, -24811, 22595},
+    /* cos_table_long_32_17[32] */
+    {-24811, -17530, 29957, 8740, -32521, 804,  32286, -10278, -29268, 18868, 23732,
+     -25832, -16150, 30572, 7180, -32678, 2411, 31972, -11792, -28510, 20160, 22595,
+     -26790, -14732, 31114, 5602, -32757, 4011, 31581, -13278, -27683, 21403},
+    /* cos_table_long_32_18[32] */
+    {25832, 13279,  -32285, 2411,  31114,  -17530, -22594, 28511, 8740,   -32757, 7180,
+     29269, -21402, -18867, 30572, 4011,   -32521, 11793,  26791, -24811, -14732, 31972,
+     -803,  -31580, 16151,  23732, -27683, -10278, 32679,  -5601, -29956, 20160},
+    /* cos_table_long_32_19[32] */
+    {-26790, -8739,  32679,  -13278, -23731, 29269,  4011,   -31971, 17531,  20160,  -31113,
+     804,    30572,  -21402, -16150, 32286,  -5601,  -28510, 24812,  11793,  -32757, 10279,
+     25833,  -27683, -7179,  32522,  -14732, -22594, 29957,  2411,   -31580, 18868},
+    /* cos_table_long_32_20[32] */
+    {27684,  4011,  -31113, 22595,  11793, -32678, 16151,  18868,  -32285, 8740,   24812,
+     -29956, 804,   29269,  -25832, -7179, 31972,  -20159, -14732, 32758,  -13278, -21402,
+     31581,  -5601, -26790, 28511,  2411,  -30571, 23732,  10279,  -32521, 17531},
+    /* cos_table_long_32_21[32] */
+    {-28510, 804,    27684,  -29268, 2411,   26791,  -29956, 4011,   25833,  -30571, 5602,
+     24812,  -31113, 7180,   23732,  -31580, 8740,   22595,  -31971, 10279,  21403,  -32285,
+     11793,  20160,  -32521, 13279,  18868,  -32678, 14733,  17531,  -32757, 16151},
+    /* cos_table_long_32_22[32] */
+    {29269,  -5601, -22594, 32522, -16150, -13278, 31972, -24811, -2410,  27684, -30571,
+     8740,   20160, -32757, 18868, 10279,  -31113, 26791, -803,   -25832, 31581, -11792,
+     -17530, 32679, -21402, -7179, 29957,  -28510, 4011,  23732,  -32285, 14733},
+    /* cos_table_long_32_23[32] */
+    {-29956, 10279, 16151, -31971, 26791, -4010,  -21402, 32758, -22594, -2410, 25833,
+     -32285, 17531, 8740,  -29268, 30572, -11792, -14732, 31581, -27683, 5602,  20160,
+     -32678, 23732, 804,   -24811, 32522, -18867, -7179,  28511, -31113, 13279},
+    /* cos_table_long_32_24[32] */
+    {30572,  -14732, -8739, 27684,  -32285, 20160, 2411,   -23731, 32758,  -24811, 4011,
+     18868,  -31971, 28511, -10278, -13278, 29957, -31113, 16151,  7180,   -26790, 32522,
+     -21402, -803,   22595, -32678, 25833,  -5601, -17530, 31581,  -29268, 11793},
+    /* cos_table_long_32_25[32] */
+    {-31113, 18868,  804,    -20159, 31581,  -30571, 17531,  2411,   -21402, 31972,  -29956,
+     16151,  4011,   -22594, 32286,  -29268, 14733,  5602,   -23731, 32522,  -28510, 13279,
+     7180,   -24811, 32679,  -27683, 11793,  8740,   -25832, 32758,  -26790, 10279},
+    /* cos_table_long_32_26[32] */
+    {31581,  -22594, 7179,   10279,  -24811, 32286,  -30571, 20160,  -4010,  -13278, 26791,
+     -32678, 29269,  -17530, 804,    16151,  -28510, 32758,  -27683, 14733,  2411,   -18867,
+     29957,  -32521, 25833,  -11792, -5601,  21403,  -31113, 31972,  -23731, 8740},
+    /* cos_table_long_32_27[32] */
+    {-31971, 25832,  -14732, 804,    13279,  -24811, 31581,  -32285, 26791,  -16150, 2411,
+     11793,  -23731, 31114,  -32521, 27684,  -17530, 4011,   10279,  -22594, 30572,  -32678,
+     28511,  -18867, 5602,   8740,   -21402, 29957,  -32757, 29269,  -20159, 7180},
+    /* cos_table_long_32_28[32] */
+    {32286, -28510, 21403,  -11792, 804,    10279, -20159, 27684, -31971, 32522, -29268,
+     22595, -13278, 2411,   8740,   -18867, 26791, -31580, 32679, -29956, 23732, -14732,
+     4011,  7180,   -17530, 25833,  -31113, 32758, -30571, 24812, -16150, 5602},
+    /* cos_table_long_32_29[32] */
+    {-32521, 30572, -26790, 21403, -14732, 7179,  804,    -8739, 16151,  -22594, 27684,
+     -31113, 32679, -32285, 29957, -25831, 20160, -13278, 5602,  2411,   -10278, 17531,
+     -23731, 28511, -31580, 32758, -31971, 29269, -24811, 18868, -11792, 4011},
+    /* cos_table_long_32_30[32] */
+    {32679,  -31971, 30572,  -28510, 25832,  -22594, 18868,  -14732, 10279, -5601,  804,
+     4011,   -8739,  13279,  -17530, 21403,  -24811, 27684,  -29956, 31581, -32521, 32758,
+     -32285, 31114,  -29268, 26791,  -23731, 20160,  -16150, 11793,  -7178, 2411},
+    /* cos_table_long_32_31[32] */
+    {-32757, 32679,  -32521, 32286,  -31971, 31581,  -31113, 30572,  -29956, 29269,  -28510,
+     27684,  -26790, 25832,  -24811, 23732,  -22594, 21403,  -20159, 18868,  -17530, 16151,
+     -14732, 13279,  -11792, 10279,  -8739,  7179,   -5601,  4011,   -2410,  804},
+
+    /* cos_table_long_30_00[30] */
+    {22556, 24917,  -19947, -27004, 17121,  28797,  -14106, -30273, 10938,  31419,
+     -7649, -32218, 4277,   32667,  -857,   -32756, -2570,  32488,  5971,   -31862,
+     -9306, 30888,  12540,  -29575, -15635, 27939,  18560,  -25996, -21280, 23769},
+    /* cos_table_long_30_01[30] */
+    {-21280, -27938, 12540,  31863,  -2570,  -32666, -7649, 30274,  17121,  -24916,
+     -24916, 17121,  30274,  -7649,  -32666, -2570,  31863, 12540,  -27938, -21280,
+     21281,  27939,  -12539, -31862, 2571,   32667,  7650,  -30273, -17120, 24917},
+    /* cos_table_long_30_02[30] */
+    {19948, 30274, -4276,  -32487, -12539, 25997, 25997, -12539, -32487, -4276,
+     30274, 19948, -19947, -30273, 4277,   32488, 12540, -25996, -25996, 12540,
+     32488, 4277,  -30273, -19947, 19948,  30274, -4276, -32487, -12539, 25997},
+    /* cos_table_long_30_03[30] */
+    {-18559, -31862, -4276,  28797, 24917, -10937, -32756, -12539, 23769, 29576,
+     -2570,  -31418, -19947, 17121, 32219, 5971,   -27938, -25996, 9307,  32667,
+     14107,  -22555, -30273, 858,   30888, 21281,  -15635, -32487, -7649, 27005},
+    /* cos_table_long_30_04[30] */
+    {17121,  32667,  12540,  -21280, -31862, -7649,  24917,  30274,  2571,  -27938,
+     -27938, 2571,   30274,  24917,  -7649,  -31862, -21280, 12540,  32667, 17121,
+     -17120, -32666, -12539, 21281,  31863,  7650,   -24916, -30273, -2570, 27939},
+    /* cos_table_long_30_05[30] */
+    {-15635, -32666, -19947, 10938,  31863,  23769, -5970,  -30273, -27004, 858,
+     27939,  29576,  4277,   -24916, -31418, -9306, 21281,  32488,  14107,  -17120,
+     -32756, -18559, 12540,  32219,  22556,  -7649, -30887, -25996, 2571,   28797},
+    /* cos_table_long_30_06[30] */
+    {14107,  31863,  25997,  858,    -24916, -32218, -15635, 12540,  31419,  27005,
+     2571,   -23768, -32487, -17120, 10938,  30888,  27939,  4277,   -22555, -32666,
+     -18559, 9307,   30274,  28797,  5971,   -21280, -32756, -19947, 7650,   29576},
+    /* cos_table_long_30_07[30] */
+    {-12539, -30273, -30273, -12539, 12540,  30274,  30274,  12540,  -12539, -30273,
+     -30273, -12539, 12540,  30274,  30274,  12540,  -12539, -30273, -30273, -12539,
+     12540,  30274,  30274,  12540,  -12539, -30273, -30273, -12539, 12540,  30274},
+    /* cos_table_long_30_08[30] */
+    {10938, 27939, 32488, 22556, 2571,   -18559, -31418, -30273, -15635, 5972,
+     24917, 32757, 25997, 7650,  -14106, -29575, -31862, -19947, 858,    21281,
+     32219, 28797, 12540, -9306, -27004, -32666, -23768, -4276,  17121,  30888},
+    /* cos_table_long_30_09[30] */
+    {-9306, -24916, -32487, -29575, -17120, 858,    18560,  30274, 32219, 23769,
+     7650,  -10937, -25996, -32666, -28796, -15635, 2571,   19948, 30888, 31863,
+     22556, 5971,   -12539, -27004, -32756, -27938, -14106, 4277,  21281, 31419},
+    /* cos_table_long_30_10[30] */
+    {7650,   21281,  30274,  32667,  27939,  17121,  2571,  -12539, -24916, -31862,
+     -31862, -24916, -12539, 2571,   17121,  27939,  32667, 30274,  21281,  7650,
+     -7649,  -21280, -30273, -32666, -27938, -17120, -2570, 12540,  24917,  31863},
+    /* cos_table_long_30_11[30] */
+    {-5970,  -17120, -25996, -31418, -32666, -29575, -22555, -12539, -857,   10938,
+     21281,  28797,  32488,  31863,  27005,  18560,  7650,   -4276,  -15635, -24916,
+     -30887, -32756, -30273, -23768, -14106, -2570,  9307,   19948,  27939,  32219},
+    /* cos_table_long_30_12[30] */
+    {4277,   12540,  19948,  25997,  30274,  32488,  32488,  30274,  25997,  19948,
+     12540,  4277,   -4276,  -12539, -19947, -25996, -30273, -32487, -32487, -30273,
+     -25996, -19947, -12539, -4276,  4277,   12540,  19948,  25997,  30274,  32488},
+    /* cos_table_long_30_13[30] */
+    {-2570,  -7649,  -12539, -17120, -21280, -24916, -27938, -30273, -31862, -32666,
+     -32666, -31862, -30273, -27938, -24916, -21280, -17120, -12539, -7649,  -2570,
+     2571,   7650,   12540,  17121,  21281,  24917,  27939,  30274,  31863,  32667},
+    /* cos_table_long_30_14[30] */
+    {858,   2571,  4277,  5971,  7650,  9307,  10938, 12540, 14107, 15636,
+     17121, 18560, 19948, 21281, 22556, 23769, 24917, 25997, 27005, 27939,
+     28797, 29576, 30274, 30888, 31419, 31863, 32219, 32488, 32667, 32757},
+    /* cos_table_long_30_15[30] */
+    {-23768, -21280, 25997,  18560,  -27938, -15635, 29576,  12540,  -30887, -9306,
+     31863,  5972,   -32487, -2570,  32757,  -857,   -32666, 4277,   32219,  -7649,
+     -31418, 10938,  30274,  -14106, -28796, 17121,  27005,  -19947, -24916, 22556},
+    /* cos_table_long_30_16[30] */
+    {24917,  17121,  -30273, -7648,  32667,  -2570, -31862, 12540,  27939,  -21280,
+     -21280, 27939,  12540,  -31862, -2570,  32667, -7649,  -30273, 17121,  24917,
+     -24916, -17120, 30274,  7650,   -32666, 2571,  31863,  -12539, -27938, 21281},
+    /* cos_table_long_30_17[30] */
+    {-25996, -12539, 32488, -4276, -30273, 19948,  19948, -30273, -4276,  32488,
+     -12539, -25996, 25997, 12540, -32487, 4277,   30274, -19947, -19947, 30274,
+     4277,   -32487, 12540, 25997, -25996, -12539, 32488, -4276,  -30273, 19948},
+    /* cos_table_long_30_18[30] */
+    {27005, 7650,   -32487, 15635, 21281,  -30887, 858,   30274, -22555, -14106,
+     32667, -9306,  -25996, 27939, 5972,   -32218, 17121, 19948, -31418, 2571,
+     29576, -23768, -12539, 32757, -10937, -24916, 28797, 4277,  -31862, 18560},
+    /* cos_table_long_30_19[30] */
+    {-27938, -2570, 30274,  -24916, -7649, 31863,  -21280, -12539, 32667,  -17120,
+     -17120, 32667, -12539, -21280, 31863, -7649,  -24916, 30274,  -2570,  -27938,
+     27939,  2571,  -30273, 24917,  7650,  -31862, 21281,  12540,  -32666, 17121},
+    /* cos_table_long_30_20[30] */
+    {28797,  -2570,  -25996, 30888,  -7649, -22555, 32219,  -12539, -18559, 32757,
+     -17120, -14106, 32488,  -21280, -9306, 31419,  -24916, -4276,  29576,  -27938,
+     858,    27005,  -30273, 5972,   23769, -31862, 10938,  19948,  -32666, 15636},
+    /* cos_table_long_30_21[30] */
+    {-29575, 7650,   19948,  -32756, 21281,  5972,   -28796, 30274,  -9305,  -18559,
+     32667,  -22555, -4276,  27939,  -30887, 10938,  17121,  -32487, 23769,  2571,
+     -27004, 31419,  -12539, -15635, 32219,  -24916, -857,   25997,  -31862, 14107},
+    /* cos_table_long_30_22[30] */
+    {30274,  -12539, -12539, 30274,  -30273, 12540,  12540,  -30273, 30274,  -12539,
+     -12539, 30274,  -30273, 12540,  12540,  -30273, 30274,  -12539, -12539, 30274,
+     -30273, 12540,  12540,  -30273, 30274,  -12539, -12539, 30274,  -30273, 12540},
+    /* cos_table_long_30_23[30] */
+    {-30887, 17121,  4277,  -23768, 32667, -27004, 9307,   12540, -28796, 32219,
+     -21280, 858,    19948, -31862, 29576, -14106, -7649,  25997, -32756, 24917,
+     -5970,  -15635, 30274, -31418, 18560, 2571,   -22555, 32488, -27938, 10938},
+    /* cos_table_long_30_24[30] */
+    {31419, -21280, 4277,  14107,  -27938, 32757, -27004, 12540, 5972,   -22555,
+     31863, -30887, 19948, -2570,  -15635, 28797, -32666, 25997, -10937, -7649,
+     23769, -32218, 30274, -18559, 858,    17121, -29575, 32488, -24916, 9307},
+    /* cos_table_long_30_25[30] */
+    {-31862, 24917,  -12539, -2570, 17121,  -27938, 32667,  -30273, 21281,  -7649,
+     -7649,  21281,  -30273, 32667, -27938, 17121,  -2570,  -12539, 24917,  -31862,
+     31863,  -24916, 12540,  2571,  -17120, 27939,  -32666, 30274,  -21280, 7650},
+    /* cos_table_long_30_26[30] */
+    {32219,  -27938, 19948,  -9306, -2570,  14107,  -23768, 30274,  -32756, 30888,
+     -24916, 15635,  -4276,  -7648, 18560,  -27004, 31863,  -32487, 28797,  -21280,
+     10938,  858,    -12539, 22556, -29575, 32667,  -31418, 25997,  -17120, 5971},
+    /* cos_table_long_30_27[30] */
+    {-32487, 30274,  -25995, 19948,  -12539, 4277,   4277,   -12539, 19948,  -25996,
+     30274,  -32487, 32488,  -30273, 25997,  -19947, 12540,  -4276,  -4276,  12540,
+     -19947, 25997,  -30273, 32488,  -32487, 30274,  -25996, 19948,  -12539, 4277},
+    /* cos_table_long_30_28[30] */
+    {32667,  -31862, 30274,  -27938, 24917,  -21280, 17121,  -12539, 7650,   -2570,
+     -2570,  7650,   -12539, 17121,  -21280, 24917,  -27938, 30274,  -31862, 32667,
+     -32666, 31863,  -30273, 27939,  -24916, 21281,  -17120, 12540,  -7649,  2571},
+    /* cos_table_long_30_29[30] */
+    {-32756, 32667, -32487, 32219, -31862, 31419, -30887, 30274, -29575, 28797,
+     -27938, 27005, -25996, 24917, -23768, 22556, -21280, 19948, -18559, 17121,
+     -15635, 14107, -12539, 10938, -9306,  7650,  -5970,  4277,  -2570,  858},
+
+    /* cos_table_long_24_00[24] */
+    {-22399, -25329, 19087, 27827, -15446, -29846, 11542,  31357, -7440, -32329, 3212,   32750,
+     1072,   -32609, -5337, 31912, 9512,   -30667, -13523, 28899, 17304, -26634, -20787, 23916},
+    /* cos_table_long_24_01[24] */
+    {20788,  28899, -9511, -32609, -3211,  31357,  15447, -25329, -25329, 15447,  31357,  -3211,
+     -32609, -9511, 28899, 20788,  -20787, -28898, 9512,  32610,  3212,   -31356, -15446, 25330},
+    /* cos_table_long_24_02[24] */
+    {-19086, -31356, -1071, 30668,  20788,  -17303, -31911, -3211, 29847,  22400,  -15446, -32329,
+     -5337,  28899,  23916, -13523, -32609, -7440,  27827,  25330, -11542, -32749, -9511,  26635},
+    /* cos_table_long_24_03[24] */
+    {17304, 32610, 11543,  -22399, -31356, -5337, 26635, 28899, -1071,  -29846, -25329, 7441,
+     31912, 20788, -13523, -32749, -15446, 19087, 32330, 9512,  -23915, -30667, -3211,  27827},
+    /* cos_table_long_24_04[24] */
+    {-15446, -32609, -20787, 9512,   31357, 25330, -3211, -28898, -28898, -3211,  25330, 31357,
+     9512,   -20787, -32609, -15446, 15447, 32610, 20788, -9511,  -31356, -25329, 3212,  28899},
+    /* cos_table_long_24_05[24] */
+    {13524,  31357,  27827, 5338,  -20787, -32749, -22399, 3212,   26635,  31912,  15447, -11542,
+     -30667, -28898, -7440, 19087, 32610,  23916,  -1071,  -25329, -32329, -17303, 9512,  29847},
+    /* cos_table_long_24_06[24] */
+    {-11541, -28898, -31911, -19086, 3212,  23916, 32750,  25330,  5338,   -17303, -31356, -29846,
+     -13523, 9512,   27827,  32330,  20788, -1071, -22399, -32609, -26634, -7440,  15447,  30668},
+    /* cos_table_long_24_07[24] */
+    {9512,  25330, 32610, 28899, 15447, -3211,  -20787, -31356, -31356, -20787, -3211, 15447,
+     28899, 32610, 25330, 9512,  -9511, -25329, -32609, -28898, -15446, 3212,   20788, 31357},
+    /* cos_table_long_24_08[24] */
+    {-7440, -20787, -29846, -32749, -28898, -19086, -5337,  9512,   22400, 30668, 32610, 27827,
+     17304, 3212,   -11542, -23915, -31356, -32329, -26634, -15446, -1071, 13524, 25330, 31912},
+    /* cos_table_long_24_09[24] */
+    {5338,   15447,  23916,  29847,  32610,  31912,  27827, 20788, 11543, 1072,  -9511, -19086,
+     -26634, -31356, -32749, -30667, -25329, -17303, -7440, 3212,  13524, 22400, 28899, 32330},
+    /* cos_table_long_24_10[24] */
+    {-3211,  -9511,  -15446, -20787, -25329, -28898, -31356, -32609,
+     -32609, -31356, -28898, -25329, -20787, -15446, -9511,  -3211,
+     3212,   9512,   15447,  20788,  25330,  28899,  31357,  32610},
+    /* cos_table_long_24_11[24] */
+    {1072,  3212,  5338,  7441,  9512,  11543, 13524, 15447, 17304, 19087, 20788, 22400,
+     23916, 25330, 26635, 27827, 28899, 29847, 30668, 31357, 31912, 32330, 32610, 32750},
+    /* cos_table_long_24_12[24] */
+    {23916, 20788, -26634, -17303, 28899, 13524,  -30667, -9511, 31912, 5338,   -32609, -1071,
+     32750, -3211, -32329, 7441,   31357, -11542, -29846, 15447, 27827, -19086, -25329, 22400},
+    /* cos_table_long_24_13[24] */
+    {-25329, -15446, 31357,  3212,   -32609, 9512,  28899,  -20787, -20787, 28899, 9512,   -32609,
+     3212,   31357,  -15446, -25329, 25330,  15447, -31356, -3211,  32610,  -9511, -28898, 20788},
+    /* cos_table_long_24_14[24] */
+    {26635,  9512,  -32749, 11542,  25330, -27826, -7440,  32610,  -13523, -23915, 28899,  5338,
+     -32329, 15447, 22400,  -29846, -3211, 31912,  -17303, -20787, 30668,  1072,   -31356, 19087},
+    /* cos_table_long_24_15[24] */
+    {-27826, -3211,  30668, -23915, -9511,  32330, -19086, -15446, 32750, -13523, -20787, 31912,
+     -7440,  -25329, 29847, -1071,  -28898, 26635, 5338,   -31356, 22400, 11543,  -32609, 17304},
+    /* cos_table_long_24_16[24] */
+    {28899, -3211,  -25329, 31357, -9511,  -20787, 32610, -15446, -15446, 32610, -20787, -9511,
+     31357, -25329, -3211,  28899, -28898, 3212,   25330, -31356, 9512,   20788, -32609, 15447},
+    /* cos_table_long_24_17[24] */
+    {-29846, 9512,  17304,  -32329, 25330, -1071,  -23915, 32610,  -19086, -7440, 28899,  -30667,
+     11542,  15447, -31911, 26635,  -3211, -22399, 32750,  -20787, -5337,  27827, -31356, 13524},
+    /* cos_table_long_24_18[24] */
+    {30668,  -15446, -7440,  26635, -32609, 22400,  -1071, -20787, 32330,  -27826, 9512,   13524,
+     -29846, 31357,  -17303, -5337, 25330,  -32749, 23916, -3211,  -19086, 31912,  -28898, 11543},
+    /* cos_table_long_24_19[24] */
+    {-31356, 20788, -3211, -15446, 28899, -32609, 25330, -9511, -9511,  25330, -32609, 28899,
+     -15446, -3211, 20788, -31356, 31357, -20787, 3212,  15447, -28898, 32610, -25329, 9512},
+    /* cos_table_long_24_20[24] */
+    {31912, -25329, 13524, 1072,   -15446, 26635, -32329, 31357, -23915, 11542, 3212,   -17303,
+     27827, -32609, 30668, -22399, 9512,   5338,  -19086, 28899, -32749, 29847, -20787, 7441},
+    /* cos_table_long_24_21[24] */
+    {-32329, 28899, -22399, 13524, -3211,  -7440, 17304,  -25329, 30668,  -32749, 31357,  -26634,
+     19087,  -9511, -1071,  11543, -20787, 27827, -31911, 32610,  -29846, 23916,  -15446, 5338},
+    /* cos_table_long_24_22[24] */
+    {32610,  -31356, 28899,  -25329, 20788,  -15446, 9512,   -3211, -3211,  9512,  -15446, 20788,
+     -25329, 28899,  -31356, 32610,  -32609, 31357,  -28898, 25330, -20787, 15447, -9511,  3212},
+    /* cos_table_long_24_23[24] */
+    {-32749, 32610, -32329, 31912, -31356, 30668, -29846, 28899, -27826, 26635, -25329, 23916,
+     -22399, 20788, -19086, 17304, -15446, 13524, -11541, 9512,  -7440,  5338,  -3211,  1072},
+
+    /* cos_table_long_18_00[18] */
+    {22138, 25997, -17605, -29065, 12540, 31251, -7091, -32487, 1429, 32737, 4277, -31990, -9853,
+     30274, 15131, -27635, -19947, 24159},
+    /* cos_table_long_18_01[18] */
+    {-19947, -30273, 4277, 32488, 12540, -25996, -25996, 12540, 32488, 4277, -30273, -19947,
+     19948, 30274, -4276, -32487, -12539, 25997},
+    /* cos_table_long_18_02[18] */
+    {17606, 32488, 9854, -24158, -30273, -1428, 29066, 25997, -7091, -31990, -19947, 15131, 32737,
+     12540, -22137, -31250, -4276, 27636},
+    /* cos_table_long_18_03[18] */
+    {-15130, -32487, -22137, 7092, 30274, 27636, 1429, -25996, -31250, -9853, 19948, 32737, 17606,
+     -12539, -31990, -24158, 4277, 29066},
+    /* cos_table_long_18_04[18] */
+    {12540, 30274, 30274, 12540, -12539, -30273, -30273, -12539, 12540, 30274, 30274, 12540,
+     -12539, -30273, -30273, -12539, 12540, 30274},
+    /* cos_table_long_18_05[18] */
+    {-9852, -25996, -32736, -27635, -12539, 7092, 24159, 32488, 29066, 15131, -4276, -22137,
+     -31990, -30273, -17605, 1429, 19948, 31251},
+    /* cos_table_long_18_06[18] */
+    {7092, 19948, 29066, 32737, 30274, 22138, 9854, -4276, -17605, -27635, -32487, -31250, -24158,
+     -12539, 1429, 15131, 25997, 31991},
+    /* cos_table_long_18_07[18] */
+    {-4276, -12539, -19947, -25996, -30273, -32487, -32487, -30273, -25996, -19947, -12539, -4276,
+     4277, 12540, 19948, 25997, 30274, 32488},
+    /* cos_table_long_18_08[18] */
+    {1429, 4277, 7092, 9854, 12540, 15131, 17606, 19948, 22138, 24159, 25997, 27636, 29066, 30274,
+     31251, 31991, 32488, 32737},
+    /* cos_table_long_18_09[18] */
+    {-24158, -19947, 27636, 15131, -30273, -9853, 31991, 4277, -32736, 1429, 32488, -7091, -31250,
+     12540, 29066, -17605, -25996, 22138},
+    /* cos_table_long_18_10[18] */
+    {25997, 12540, -32487, 4277, 30274, -19947, -19947, 30274, 4277, -32487, 12540, 25997, -25996,
+     -12539, 32488, -4276, -30273, 19948},
+    /* cos_table_long_18_11[18] */
+    {-27635, -4276, 31251, -22137, -12539, 32737, -15130, -19947, 31991, -7091, -25996, 29066,
+     1429, -30273, 24159, 9854, -32487, 17606},
+    /* cos_table_long_18_12[18] */
+    {29066, -4276, -24158, 31991, -12539, -17605, 32737, -19947, -9853, 31251, -25996, -1428,
+     27636, -30273, 7092, 22138, -32487, 15131},
+    /* cos_table_long_18_13[18] */
+    {-30273, 12540, 12540, -30273, 30274, -12539, -12539, 30274, -30273, 12540, 12540, -30273,
+     30274, -12539, -12539, 30274, -30273, 12540},
+    /* cos_table_long_18_14[18] */
+    {31251, -19947, 1429, 17606, -30273, 31991, -22137, 4277, 15131, -29065, 32488, -24158, 7092,
+     12540, -27635, 32737, -25996, 9854},
+    /* cos_table_long_18_15[18] */
+    {-31990, 25997, -15130, 1429, 12540, -24158, 31251, -32487, 27636, -17605, 4277, 9854, -22137,
+     30274, -32736, 29066, -19947, 7092},
+    /* cos_table_long_18_16[18] */
+    {32488, -30273, 25997, -19947, 12540, -4276, -4276, 12540, -19947, 25997, -30273, 32488,
+     -32487, 30274, -25996, 19948, -12539, 4277},
+    /* cos_table_long_18_17[18] */
+    {-32736, 32488, -31990, 31251, -30273, 29066, -27635, 25997, -24158, 22138, -19947, 17606,
+     -15130, 12540, -9852, 7092, -4276, 1429},
+
+    /* cos_table_long_16_00[16] */
+    {-22005, -26319, 16846, 29622, -11038, -31785, 4808, 32729, 1608, -32412, -7961, 30853, 14010,
+     -28105, -19519, 24279},
+    /* cos_table_long_16_01[16] */
+    {19520, 30853, -1607, -31785, -16845, 22006, 29622, -4807, -32412, -14009, 24279, 28106,
+     -7961, -32728, -11038, 26320},
+    /* cos_table_long_16_02[16] */
+    {-16845, -32728, -14009, 19520, 32413, 11039, -22005, -31785, -7961, 24279, 30853, 4808,
+     -26319, -29621, -1607, 28106},
+    /* cos_table_long_16_03[16] */
+    {14010, 31786, 26320, 1608, -24278, -32412, -16845, 11039, 30853, 28106, 4808, -22005, -32728,
+     -19519, 7962, 29622},
+    /* cos_table_long_16_04[16] */
+    {-11038, -28105, -32412, -22005, -1607, 19520, 31786, 29622, 14010, -7961, -26319, -32728,
+     -24278, -4807, 16846, 30853},
+    /* cos_table_long_16_05[16] */
+    {7962, 22006, 30853, 32413, 26320, 14010, -1607, -16845, -28105, -32728, -29621, -19519,
+     -4807, 11039, 24279, 31786},
+    /* cos_table_long_16_06[16] */
+    {-4807, -14009, -22005, -28105, -31785, -32728, -30852, -26319, -19519, -11038, -1607, 7962,
+     16846, 24279, 29622, 32413},
+    /* cos_table_long_16_07[16] */
+    {1608, 4808, 7962, 11039, 14010, 16846, 19520, 22006, 24279, 26320, 28106, 29622, 30853,
+     31786, 32413, 32729},
+    /* cos_table_long_16_08[16] */
+    {24279, 19520, -28105, -14009, 30853, 7962, -32412, -1607, 32729, -4807, -31785, 11039, 29622,
+     -16845, -26319, 22006},
+    /* cos_table_long_16_09[16] */
+    {-26319, -11038, 32729, -7961, -28105, 24279, 14010, -32412, 4808, 29622, -22005, -16845,
+     31786, -1607, -30852, 19520},
+    /* cos_table_long_16_10[16] */
+    {28106, 1608, -29621, 26319, 4808, -30852, 24279, 7962, -31785, 22006, 11039, -32412, 19520,
+     14010, -32728, 16846},
+    /* cos_table_long_16_11[16] */
+    {-29621, 7962, 19520, -32728, 22006, 4808, -28105, 30853, -11038, -16845, 32413, -24278,
+     -1607, 26320, -31785, 14010},
+    /* cos_table_long_16_12[16] */
+    {30853, -16845, -4807, 24280, -32728, 26319, -7961, -14009, 29622, -31785, 19520, 1608,
+     -22005, 32413, -28105, 11039},
+    /* cos_table_long_16_13[16] */
+    {-31785, 24279, -11038, -4807, 19520, -29621, 32729, -28105, 16846, -1607, -14009, 26320,
+     -32412, 30853, -22005, 7962},
+    /* cos_table_long_16_14[16] */
+    {32413, -29621, 24279, -16845, 7962, 1608, -11038, 19520, -26319, 30853, -32728, 31786,
+     -28105, 22006, -14009, 4808},
+    /* cos_table_long_16_15[16] */
+    {-32728, 32413, -31785, 30853, -29621, 28106, -26319, 24279, -22005, 19520, -16845, 14010,
+     -11038, 7962, -4807, 1608},
+
+    /* cos_table_long_15_00[15] */
+    {20622, 29197, -8480, -32722, -5125, 30592, 17847, -23169, -27481, 11743, 32365, 1715, -31650,
+     -14875, 25466},
+    /* cos_table_long_15_01[15] */
+    {-17846, -32364, -8480, 25466, 29197, -1714, -30591, -23169, 11743, 32723, 14876, -20621,
+     -31650, -5125, 27482},
+    /* cos_table_long_15_02[15] */
+    {14876, 32365, 23170, -5125, -29195, -29195, -5125, 23170, 32365, 14876, -14875, -32364,
+     -23169, 5126, 29197},
+    /* cos_table_long_15_03[15] */
+    {-11742, -29195, -31650, -17846, 5126, 25466, 32723, 23170, 1715, -20621, -32364, -27481,
+     -8480, 14876, 30592},
+    /* cos_table_long_15_04[15] */
+    {8481, 23170, 31651, 31651, 23170, 8481, -8480, -23169, -31650, -31650, -23169, -8480, 8481,
+     23170, 31651},
+    /* cos_table_long_15_05[15] */
+    {-5125, -14875, -23169, -29196, -32364, -32364, -29196, -23169, -14875, -5125, 5126, 14876,
+     23170, 29197, 32365},
+    /* cos_table_long_15_06[15] */
+    {1715, 5126, 8481, 11743, 14876, 17847, 20622, 23170, 25466, 27482, 29197, 30592, 31651,
+     32365, 32723},
+    /* cos_table_long_15_07[15] */
+    {-23169, -23169, 23170, 23170, -23169, -23169, 23170, 23170, -23169, -23169, 23170, 23170,
+     -23169, -23169, 23170},
+    /* cos_table_long_15_08[15] */
+    {25466, 14876, -31650, -1714, 32365, -11742, -27481, 23170, 17847, -30591, -5125, 32723,
+     -8480, -29196, 20622},
+    /* cos_table_long_15_09[15] */
+    {-27481, -5125, 31651, -20621, -14875, 32723, -11742, -23169, 30592, -1714, -29195, 25466,
+     8481, -32364, 17847},
+    /* cos_table_long_15_10[15] */
+    {29196, -5125, -23169, 32365, -14875, -14875, 32365, -23169, -5125, 29197, -29195, 5126,
+     23170, -32364, 14876},
+    /* cos_table_long_15_11[15] */
+    {-30591, 14876, 8481, -27481, 32365, -20621, -1714, 23170, -32722, 25466, -5125, -17846,
+     31651, -29196, 11743},
+    /* cos_table_long_15_12[15] */
+    {31651, -23169, 8481, 8481, -23169, 31651, -31650, 23170, -8480, -8480, 23170, -31650, 31651,
+     -23169, 8481},
+    /* cos_table_long_15_13[15] */
+    {-32364, 29196, -23169, 14876, -5125, -5125, 14876, -23169, 29197, -32364, 32365, -29195,
+     23170, -14875, 5126},
+    /* cos_table_long_15_14[15] */
+    {32723, -32364, 31651, -30591, 29196, -27481, 25466, -23169, 20622, -17846, 14876, -11742,
+     8481, -5125, 1715},
+
+    /* cos_table_short_4_00[4] */
+    {-18204, -32137, -6392, 27246},
+    /* cos_table_short_4_01[4] */
+    {6393, 18205, 27246, 32138},
+    /* cos_table_short_4_02[4] */
+    {27246, 6393, -32137, 18205},
+    /* cos_table_short_4_03[4] */
+    {-32137, 27246, -18204, 6393},
+
+    /* cos_table_short_3_00[3] */
+    {8481, 23170, 31651},
+    /* cos_table_short_3_01[3] */
+    {-23169, -23169, 23170},
+    /* cos_table_short_3_02[3] */
+    {31651, -23169, 8481},
+
+    /* cos_table_short_2_00[2] */
+    {12540, 30274},
+    /* cos_table_short_2_01[2] */
+    {-30273, 12540}}; /* END OF ia_mps_dec_mdct2qmf_tables_struct */
+
+const ia_mps_dec_m1_m2_tables_struct ixheaacd_mps_dec_m1_m2_tables = {
+    {{/* row_2_channel_stp[7][8] */
+      {0, 1, 2, -1, 3, 4, -1, -1},
+      {0, 3, 1, 4, 2, -1, -1, -1},
+      {0, 2, 1, 3, -1, -1, -1, -1},
+      {0, 4, 2, 1, 5, 3, -1, -1},
+      {0, 4, 2, 1, 5, 3, -1, -1},
+      {0, 2, -1, 1, 3, -1, -1, -1},
+      {-1, 2, 0, -1, 3, 1, -1, -1}},
+     {/* row_2_channel_ges[7][8] */
+      {0, 1, 2, -1, 3, 4, -1, -1},
+      {0, 3, 1, 4, 2, -1, -1, -1},
+      {0, 3, 1, 4, 2, -1, -1, -1},
+      {0, 5, 3, 1, 6, 4, 2, -1},
+      {0, 5, 3, 1, 6, 4, 2, -1},
+      {0, 2, -1, 1, 3, -1, -1, -1},
+      {-1, 2, 0, -1, 3, 1, -1, -1}},
+     {/* row_2_residual[7][8] */
+      {-1, 0, 1, 3, 2, 4},
+      {-1, 0, 1, 3, 4, 2},
+      {-1, -1, -1, 1, 2, 0},
+      {-1, -1, -1, 1, 2, 0, 3, 4},
+      {-1, -1, -1, 1, 2, 0, 3, 4},
+      {-1, -1, -1, -1, -1, -1, 0, 1},
+      {-1, -1, -1, -1, -1, -1, 0, 1}}},
+    {/* hybrid_2_param_28[71] */
+     1,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
+     16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23,
+     23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,
+     26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27},
+    {/* r1_matrix_l[31] */
+     0,     184,   328,   583,   1036,  1840,  2595,  3654,  5129,  7159,  9880,
+     12120, 14682, 17486, 20381, 23170, 25658, 27713, 29295, 30444, 31243, 31976,
+     32364, 32564, 32665, 32716, 32752, 32763, 32766, 32767, 32768},
+    {/* ten_cld_by_10[31] q15 */
+     0,       1,        3,        10,        33,        104,        207,       413,
+     823,     1642,     3277,     5193,      8231,      13045,      20675,     32767,
+     51932,   82307,    130448,   206746,    327670,    653788,     1304478,   2602775,
+     5193220, 10361835, 32767000, 103618352, 327670000, 1036183521, 0x7FFFFFFF},
+    {/* w00_cld2_15[31] */
+     0,     184,   328,   583,   1036,  1840,  2595,  3654,  5129,  7158,  9880,
+     12120, 14682, 17485, 20381, 23170, 25658, 27712, 29294, 30443, 31242, 31976,
+     32363, 32563, 32664, 32715, 32751, 32762, 32765, 32766, 32767},
+    {/* table_kappa[8] */
+     0, 6609, 10230, 15121, 17593, 18918, 15288, 2669},
+    {/* dec_pow[31] q15 */
+     0,      184,    327,     582,     1036,    1842,    2602,      3676,
+     5193,   7335,   10362,   13045,   16422,   20675,   26028,     32768,
+     41252,  51933,  65380,   82309,   103621,  146369,  206752,    292045,
+     412524, 582706, 1036215, 1842680, 3276800, 5827066, 2147483647},
+    {/* cld_tab_1[31] */
+     0,     1,     3,     10,    32,    103,   205,   407,   802,   1563,  2978,
+     4482,  6578,  9330,  12676, 16384, 20091, 23437, 26189, 28285, 29789, 31204,
+     31965, 32360, 32562, 32664, 32735, 32757, 32764, 32766, 32768},
+    {/* cld_tab_2[31] */
+     2147483647, 5827066, 3276800, 1842680, 1036215, 582706, 412524, 292045,
+     206752,     146369,  103621,  82309,   65380,   51933,  41252,  32768,
+     26028,      20675,   16422,   13045,   10362,   7335,   5193,   3676,
+     2602,       1842,    1036,    582,     327,     184,    0},
+    {/* cld_tab_3[31] */
+     0,       1,        3,        10,        32,        103,        206,       412,
+     823,     1642,     3276,     5193,      8230,      13045,      20675,     32768,
+     51933,   82309,    130451,   206752,    327680,    653807,     1304517,   2602854,
+     5193378, 10362151, 32768000, 103621512, 327680000, 1036215168, 2147483647},
+    {/* reciprocal[576] q28 */
+     268435456, 134217728, 89478488, 67108864, 53687092, 44739244, 38347924, 33554432, 29826162,
+     26843546,  24403224,  22369622, 20648882, 19173962, 17895698, 16777216, 15790321, 14913081,
+     14128182,  13421773,  12782641, 12201612, 11671107, 11184811, 10737418, 10324441, 9942054,
+     9586981,   9256395,   8947849,  8659208,  8388608,  8134408,  7895161,  7669585,  7456541,
+     7255013,   7064091,   6882961,  6710887,  6547206,  6391321,  6242685,  6100806,  5965233,
+     5835554,   5711393,   5592406,  5478275,  5368709,  5263441,  5162221,  5064820,  4971027,
+     4880645,   4793491,   4709394,  4628198,  4549754,  4473925,  4400581,  4329604,  4260881,
+     4194304,   4129776,   4067204,  4006499,  3947580,  3890369,  3834792,  3780781,  3728270,
+     3677198,   3627506,   3579140,  3532046,  3486175,  3441480,  3397917,  3355443,  3314018,
+     3273603,   3234162,   3195660,  3158064,  3121343,  3085465,  3050403,  3016129,  2982616,
+     2949840,   2917777,   2886403,  2855696,  2825637,  2796203,  2767376,  2739137,  2711469,
+     2684355,   2657777,   2631720,  2606170,  2581110,  2556528,  2532410,  2508743,  2485514,
+     2462711,   2440322,   2418338,  2396745,  2375535,  2354697,  2334221,  2314099,  2294320,
+     2274877,   2255760,   2236962,  2218475,  2200291,  2182402,  2164802,  2147484,  2130440,
+     2113665,   2097152,   2080895,  2064888,  2049126,  2033602,  2018312,  2003250,  1988411,
+     1973790,   1959383,   1945185,  1931190,  1917396,  1903798,  1890391,  1877171,  1864135,
+     1851279,   1838599,   1826092,  1813753,  1801580,  1789570,  1777718,  1766023,  1754480,
+     1743087,   1731842,   1720740,  1709780,  1698959,  1688273,  1677722,  1667301,  1657009,
+     1646843,   1636802,   1626882,  1617081,  1607398,  1597830,  1588376,  1579032,  1569798,
+     1560671,   1551650,   1542733,  1533917,  1525202,  1516585,  1508064,  1499639,  1491308,
+     1483069,   1474920,   1466860,  1458888,  1451003,  1443201,  1435484,  1427848,  1420293,
+     1412818,   1405421,   1398101,  1390857,  1383688,  1376592,  1369569,  1362617,  1355735,
+     1348922,   1342177,   1335500,  1328888,  1322342,  1315860,  1309441,  1303085,  1296790,
+     1290555,   1284380,   1278264,  1272206,  1266205,  1260260,  1254371,  1248537,  1242757,
+     1237030,   1231355,   1225733,  1220161,  1214640,  1209169,  1203747,  1198373,  1193047,
+     1187768,   1182535,   1177349,  1172207,  1167111,  1162058,  1157049,  1152084,  1147160,
+     1142279,   1137438,   1132639,  1127880,  1123161,  1118481,  1113840,  1109237,  1104673,
+     1100145,   1095655,   1091201,  1086783,  1082401,  1078054,  1073742,  1069464,  1065220,
+     1061010,   1056833,   1052688,  1048576,  1044496,  1040448,  1036430,  1032444,  1028488,
+     1024563,   1020667,   1016801,  1012964,  1009156,  1005376,  1001625,  997901,   994205,
+     990537,    986895,    983280,   979691,   976129,   972592,   969081,   965595,   962134,
+     958698,    955286,    951899,   948535,   945195,   941879,   938586,   935315,   932068,
+     928842,    925640,    922459,   919300,   916162,   913046,   909951,   906877,   903823,
+     900790,    897777,    894785,   891812,   888859,   885926,   883011,   880116,   877240,
+     874383,    871544,    868723,   865921,   863137,   860370,   857621,   854890,   852176,
+     849479,    846800,    844137,   841490,   838861,   836248,   833651,   831070,   828505,
+     825955,    823422,    820904,   818401,   815913,   813441,   810983,   808541,   806113,
+     803699,    801300,    798915,   796544,   794188,   791845,   789516,   787201,   784899,
+     782611,    780336,    778074,   775825,   773589,   771366,   769156,   766958,   764773,
+     762601,    760440,    758292,   756156,   754032,   751920,   749820,   747731,   745654,
+     743589,    741534,    739492,   737460,   735440,   733430,   731432,   729444,   727467,
+     725501,    723546,    721601,   719666,   717742,   715828,   713924,   712030,   710147,
+     708273,    706409,    704555,   702711,   700876,   699051,   697235,   695429,   693632,
+     691844,    690065,    688296,   686536,   684784,   683042,   681308,   679583,   677867,
+     676160,    674461,    672771,   671089,   669415,   667750,   666093,   664444,   662804,
+     661171,    659547,    657930,   656321,   654721,   653128,   651542,   649965,   648395,
+     646832,    645278,    643730,   642190,   640657,   639132,   637614,   636103,   634599,
+     633103,    631613,    630130,   628654,   627186,   625724,   624269,   622820,   621378,
+     619943,    618515,    617093,   615678,   614269,   612866,   611470,   610081,   608697,
+     607320,    605949,    604584,   603226,   601873,   600527,   599186,   597852,   596523,
+     595201,    593884,    592573,   591268,   589968,   588674,   587386,   586104,   584827,
+     583555,    582290,    581029,   579774,   578525,   577281,   576042,   574808,   573580,
+     572357,    571139,    569927,   568719,   567517,   566320,   565127,   563940,   562758,
+     561580,    560408,    559241,   558078,   556920,   555767,   554619,   553475,   552336,
+     551202,    550073,    548948,   547827,   546712,   545601,   544494,   543392,   542294,
+     541201,    540112,    539027,   537947,   536871,   535799,   534732,   533669,   532610,
+     531555,    530505,    529459,   528416,   527378,   526344,   525314,   524288,   523266,
+     522248,    521234,    520224,   519218,   518215,   517217,   516222,   515231,   514244,
+     513261,    512281,    511306,   510334,   509365,   508401,   507439,   506482,   505528,
+     504578,    503631,    502688,   501749,   500812,   499880,   498951,   498025,   497103,
+     496184,    495268,    494356,   493448,   492542,   491640,   490741,   489846,   488953,
+     488064,    487179,    486296,   485417,   484541,   483668,   482798,   481931,   481067,
+     480207,    479349,    478495,   477643,   476795,   475949,   475107,   474268,   473431,
+     472598,    471767,    470939,   470115,   469293,   468474,   467658,   466844,   466034},
+    {/* c_l_table[31] */
+     0,     184,   328,   583,   1036,  1840,  2595,  3654,  5129,  7159,  9880,
+     12120, 14682, 17486, 20381, 23170, 25658, 27713, 29295, 30444, 31243, 31976,
+     32364, 32564, 32665, 32716, 32752, 32763, 32766, 32767, 32767},
+    {/* cos_table[16][31] */
+     {32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768,
+      32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768,
+      32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768, 32768},
+     {30704, 30726, 30743, 30773, 30825, 30912, 30989, 31090, 31219, 31378, 31565,
+      31701, 31842, 31984, 32121, 32248, 32361, 32458, 32538, 32601, 32650, 32700,
+      32730, 32747, 32757, 32762, 32766, 32767, 32768, 32768, 32768},
+     {27564, 27617, 27658, 27730, 27855, 28066, 28254, 28502, 28821, 29218, 29688,
+      30033, 30395, 30759, 31112, 31440, 31733, 31983, 32188, 32350, 32473, 32599,
+      32675, 32718, 32741, 32754, 32763, 32767, 32768, 32768, 32768},
+     {19691, 19808, 19898, 20057, 20334, 20810, 21239, 21815, 22570, 23531, 24703,
+      25586, 26526, 27489, 28433, 29317, 30105, 30775, 31317, 31738, 32053, 32368,
+      32551, 32653, 32708, 32737, 32758, 32765, 32767, 32768, 32768},
+     {12047, 12206, 12329, 12546, 12927, 13590, 14197, 15025, 16135, 17586, 19413,
+      20829, 22370, 23980, 25583, 27097, 28447, 29584, 30491, 31182, 31687, 32178,
+      32455, 32605, 32684, 32725, 32754, 32764, 32767, 32768, 32768},
+     {0,     184,   328,   583,   1036,  1840,  2595,  3654,  5129,  7159,  9880,
+      12120, 14682, 17486, 20381, 23170, 25658, 27713, 29295, 30444, 31243, 31976,
+      32364, 32564, 32665, 32716, 32752, 32763, 32766, 32767, 32768},
+     {-19300, -19179, -19084, -18914, -18604, -18036, -17477, -16651, -15406, -13492, -10479,
+      -7533,  -3540,  1699,   8069,   14854,  20913,  25445,  28411,  30209,  31263,  32079,
+      32446,  32615,  32694,  32732,  32757,  32765,  32767,  32768,  32768},
+     {
+         -32440, -32437, -32434, -32428, -32419, -32400, -32382, -32353, -32306, -32226, -32073,
+         -31875, -31483, -30498, -26581, 2317,   29018,  31884,  32450,  32628,  32699,  32741,
+         32756,  32763,  32766,  32767,  32768,  32768,  32768,  32768,  32768,
+     },
+     {
+         -32381, -32376, -32373, -32366, -32355, -32333, -32311, -32277, -32222, -32128, -31947,
+         -31715, -31256, -30112, -25701, 2520,   28513,  31737,  32395,  32603,  32687,  32736,
+         32754,  32762,  32765,  32767,  32768,  32768,  32768,  32768,  32768,
+     },
+     {
+         -23483, -23393, -23322, -23194, -22961, -22530, -22102, -21460, -20474, -18908, -16315,
+         -13613, -9671,  -3995,  3628,   12334,  20114,  25547,  28767,  30544,  31512,  32216,
+         32516,  32650,  32712,  32741,  32760,  32765,  32767,  32768,  32768,
+     },
+     {
+         -17414, -17281, -17177, -16990, -16652, -16032, -15426, -14535, -13204, -11183, -8069,
+         -5095,  -1169,  3823,   9712,   15861,  21349,  25536,  28361,  30128,  31191,  32034,
+         32421,  32602,  32687,  32729,  32756,  32764,  32767,  32768,  32768,
+     },
+     {
+         -14568, -14420, -14303, -14095, -13719, -13034, -12370, -11400, -9970, -7840, -4648,
+         -1698,  2067,   6675,   11918,  17268,  22043,  25769,  28374,  30067, 31121, 31984,
+         32392,  32586,  32679,  32724,  32754,  32764,  32767,  32768,  32768,
+     },
+     {
+         -12498, -12340, -12216, -11995, -11596, -10873, -10175, -9162, -7682, -5505, -2305,
+         592,    4211,   8540,   13364,  18224,  22560,  25987,  28434, 30060, 31095, 31960,
+         32377,  32577,  32674,  32722,  32754,  32764,  32767,  32768, 32768,
+     },
+     {
+         -11093, -10929, -10801, -10573, -10161, -9416, -8699, -7663, -6158, -3964, -777,
+         2070,   5582,   9725,   14285,  18845,  22913, 26152, 28493, 30071, 31087, 31949,
+         32369,  32572,  32672,  32720,  32753,  32763, 32767, 32768, 32768,
+     },
+     {
+         -10279, -10112, -9982, -9749, -9331, -8575, -7849, -6802, -5286, -3086, 88,
+         2902,   6348,   10384, 14799, 19195, 23118, 26253, 28533, 30082, 31086, 31944,
+         32365,  32570,  32670, 32720, 32753, 32763, 32767, 32768, 32768,
+     },
+     {
+         -10012, -9845, -9714, -9480, -9060, -8300, -7571, -6521, -5002, -2801, 367,
+         3170,   6595,  10597, 14964, 19309, 23185, 26287, 28547, 30086, 31087, 31942,
+         32364,  32569, 32670, 32719, 32753, 32763, 32767, 32768, 32768,
+     }},
+    {/* sin_table[8][31] */
+     {
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+     },
+     {
+         11447, 11387, 11340, 11259, 11117, 10872, 10650, 10351, 9955, 9442, 8798,
+         8294,  7734,  7126,  6481,  5816,  5148,  4496,  3876,  3302, 2782, 2114,
+         1578,  1161,  846,   611,   352,   200,   113,   64,    0,
+     },
+     {
+         17719, 17636, 17571, 17458, 17258, 16912, 16596, 16166, 15591, 14835, 13870,
+         13105, 12244, 11298, 10287, 9234,  8171,  7129,  6137,  5217,  4386,  3321,
+         2471,  1814,  1318,  951,   546,   310,   176,   99,    0,
+     },
+     {
+         26192, 26103, 26034, 25912, 25695, 25312, 24953, 24451, 23756, 22804, 21529,
+         20471, 19238, 17836, 16289, 14637, 12938, 11254, 9642,  8150,  6808,  5105,
+         3765,  2743,  1982,  1423,  813,   461,   260,   147,   0,
+     },
+     {
+         30473, 30410, 30360, 30271, 30110, 29817, 29533, 29120, 28520, 27649, 26399,
+         25296, 23944, 22332, 20475, 18425, 16264, 14090, 12001, 10071, 8348,  6190,
+         4520,  3267,  2346,  1677,  952,   538,   304,   171,   0,
+     },
+     {
+         32768, 32767, 32766, 32763, 32752, 32716, 32665, 32564, 32364, 31976, 31243,
+         30444, 29295, 27713, 25658, 23170, 20381, 17486, 14682, 12120, 9880,  7159,
+         5129,  3654,  2595,  1840,  1036,  583,   328,   184,   0,
+     },
+     {
+         26481, 26569, 26637, 26758, 26974, 27358, 27718, 28222, 28920, 29862, 31047,
+         31890, 32576, 32724, 31759, 29208, 25227, 20647, 16327, 12696, 9818,  6685,
+         4584,  3167,  2202,  1538,  853,   476,   266,   149,   0,
+     },
+     {
+         4622, 4648, 4669,  4705,  4772,  4895,  5017, 5199, 5481, 5934, 6715,
+         7597, 9086, 11983, 19163, 32686, 15222, 7561, 4554, 3024, 2123, 1328,
+         869,  583,  398,   275,   151,   84,    47,   26,   0,
+     }}}; /* END OF ia_mps_dec_m1_m2_tables_struct */
+
+const ia_mps_dec_decorr_tables_struct ixheaacd_mps_dec_decorr_tables = {
+    { /* rev_table */
+     {/* rev_delay[4][10] */
+      {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
+      {7, 7, 7, 7, 7, 7, 7, 7, 7, 7},
+      {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
+      {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}},
+     /* rev_split_freq_0[4] */
+     {3, 15, 24, 65},
+     /* rev_split_freq_1[4] */
+     {3, 50, 65, 65},
+     /* rev_split_freq_2[4] */
+     {0, 15, 65, 65}},
+    {/* lattice_coeff_0[10][20] */
+     {8110,  14854, -721, -10099, -184, 12432,  -11331, 12465, -10682, 16043,
+      -7497, 11629, 6354, -4591,  1265, -13287, -9988,  -8176, 1288,   8058},
+     {12950,  -13910, -940,  14139, 2363,  -3795, 2241, -416,  -8408,  6344,
+      -13153, -8369,  -1937, 11085, -6200, -2395, 6891, 14742, -11911, -6236},
+     {-3093, -6822, -3280, -14320, -13615, 12472, -4846, -14818, 13379, 2005,
+      15988, 5390,  -5426, 5669,   655,    -8588, 11459, -7471,  10286, -10476},
+     {2366,  6049, -13756, 2913,  -8625, -8723, -8985, -15342, 9227,   10155,
+      -7468, 2831, 891,    -6691, 7556,  400,   -7569, -8657,  -12966, -11367},
+     {-11282, -14428, 7268, -4787, -3090, -3437, -4548, 14585, -2585, 15548,
+      -4660,  -2907,  2025, 5685,  5069,  780,   -3444, -3559, 15594, -4122},
+     {2169, -4335, -11393, -12544, -2497, 10335,  -14241, -8978, 12124,  -3916,
+      557,  12809, -14038, -1488,  -8897, -16158, 3775,   10115, -12445, -11236},
+     {-15480, 11128, 5679,  -12829, 9162,  9552, -79,   -5695, 9434, 2943,
+      9378,   -7576, 14333, -14831, 12429, 8710, 15670, -5983, 5400, 6747},
+     {5168,   12943, 14877, 9817,  -16381, 12904, 6187, 15637, 12085, -1642,
+      -15797, 242,   1645,  -7468, -13622, 5289,  4378, 9352,  11459, 10266},
+     {-5177, -6344, -4778, -9231, -10040, 3244,  15611, -8235, 14035,  -12101,
+      8575,  12016, 5492,  4961,  246,    -3192, 531,   -3660, -13481, 11426},
+     {865,   7376,   15113,  -6272, -11954, 7887, 1638,  10122,  10106, -15381,
+      11793, -14248, -13045, 13582, -6134,  5941, -5476, -10197, 3195,  -13189}},
+    {/* lattice_coeff_1[10][15] */
+     {9696, -12373, -11407, 10066, 13058, 11521, 5531, -4610, -49, 1681, 8736, -9739, -6380,
+      15594, -6622},
+     {1376, -4994, 11167, 16030, 5823, -1304, -1278, -2317, -12586, 15073, 5790, 8575, 2323,
+      -5659, 2654},
+     {13281, 7124, -15263, 1579, 1697, 2363, -12757, -1897, 2969, -14818, -10751, 6213, -2081, 39,
+      2107},
+     {12796, 3251, -5400, 6370, -2051, 12812, -13110, 10125, 2949, -3775, -10020, -15283, -12875,
+      -9293, -8962},
+     {-8592, 7700, 5780, -9899, 5774, 9568, 15758, -3939, -9159, -6187, 6111, 197, 11534, -3634,
+      -9660},
+     {-15817, 7006, -8592, -15994, 15539, 12272, 4165, 15784, -7111, -197, 5993, -5482, -154,
+      12979, -14257},
+     {-12724, 1042, -9418, -1776, -9028, -6613, 15286, 13897, 14887, 11620, 2048, 682, -475, 8821,
+      -7943},
+     {-10519, -14595, 5675, 5089, -9067, 1769, -5990, 8015, 4771, 3827, -11692, 8172, -8962,
+      12855, 918},
+     {-12970, -6629, 8929, -3883, 11213, -8192, 3883, 11993, -3418, -16024, -1153, -9670, -3831,
+      -6013, 15643},
+     {1602, 15018, 14483, 3660, -9136, -7540, -6331, -15099, 770, -11600, 14267, -331, 4361,
+      12737, -16161}},
+    {/* lattice_coeff_2[10][6] */
+     {-5741, 5420, -2454, -6603, 826, -151},
+     {16289, -6898, -13556, -6062, 7278, 12629},
+     {15185, 11541, 13314, 14909, -14762, -14841},
+     {10093, 10335, 3205, 2372, 3480, 12583},
+     {-4797, -5043, 3903, -9916, 8392, 12167},
+     {5725, 8788, -7678, 16246, -15509, 13949},
+     {-16187, 3467, -9067, -3156, -14382, 3362},
+     {986, -1101, -1511, 15906, 10053, -15152},
+     {4037, -1655, 2697, 6111, 4755, 15670},
+     {-9470, 6619, 13471, -13690, -8235, 15801}},
+    {/* lattice_coeff_3[10][3] */
+     {4450, -1222, 1170},
+     {-14510, -7491, -15368},
+     {13242, -6698, 15204},
+     {-14379, 12465, -15699},
+     {9844, 7782, 14418},
+     {14202, 10882, -5259},
+     {-4951, 832, -5243},
+     {-12255, 4083, 8087},
+     {-16194, -9958, 15663},
+     {12504, -12783, -14529}},
+    {/* den_coef_0 q14 */
+     {16384, -2677, 11144, -8152, -2917, 537,   -2150, -1288, 5735, -6796, 8752,
+      -2647, 2786,  5973,  -3923, 1093,  -8123, -5322, -1199, -53,  4029},
+
+     {16384, 2448,   -15662, 1190,  16636, -5357, -10438, 4364, 1939,  -4316, 5345,
+      -3394, -11208, 3891,   13793, -7985, -9467, 8668,   8686, -6206, -3118},
+
+     {16384, -6990, -772, 3794, -12779, 2933, 4793, -14032, 6966, -2876, -4518,
+      14259, -6262, 1196, 5414, -6895,  2755, 3281, -4283,  6852, -5238},
+
+     {16384, 5512, 4926, -2017, -4276, -2849, -5766, -6567, -5863, -627, 3326,
+      1558,  5098, 5629, 1356,  5286,  2457,  -3334, -6056, -7615, -5684},
+
+     {16384, -8857, -4068, 3305, -3044, 5892, -5781, -2649, 2947, -264, 5595,
+      540,   -3428, -2919, 4814, -107,  2970, -3338, -4532, 8788, -2061},
+
+     {16384, 1190,  -10978, 2490,  -3098, -2264, 12235, -9936, -7287, 12175, -7420,
+      -1698, 15077, -5154,  -3386, -94,   -7800, 3804,  7900,  -5899, -5618},
+
+     {16384, -17384, 12468, -751,  3681, -7469, 10649, 3130,  -5704, 2373, 6351,
+      5340,  -12595, 16555, -7389, 5115, -5671, 12027, -3051, -994,  3373},
+
+     {16384, 13384, 10432, 5829,  3526,  -7134, 3086, -115,  -1605, -4068, -1825,
+      -7607, -653,  -1349, -4475, -4514, 6441,  8150, 10624, 9360,  5133},
+
+     {16384, -5813, 362,  -1267, -8112, -2160, 4043, 1620, -3873, 8207, -12183,
+      5524,  1972,  1327, 4976,  2631,  -3570, -50,  42,   -7948, 5713},
+
+     {16384, -7682,  2829, 12031, -22053, 12224, 2498,  -12336, 26658, -10308, -9897,
+      18060, -22112, 2326, 9035,  -12851, 12792, -5163, -5946,  4431,  -6595}},
+    {/* den_coef_1 q14 */
+     {16384, 5086, -12829, -8464, 6791, 10492, 2538, -4199, -3432, 5908, 6533, -3531, -8738, 3267,
+      6451, -3311},
+
+     {16384, 3356, -2917, 2732, 4176, 1387, 1216, 2488, -1363, -3535, 5979, 3249, 5099, 268,
+      -2539, 1327},
+
+     {16384, 6526, -2521, -4879, 6157, 850, -4836, -3599, 2838, -2512, -8878, -3331, 2352, -1190,
+      439, 1053},
+
+     {16384, 10349, 9342, 1987, 4461, 1128, 3510, -5025, 2031, -153, -2101, -6694, -10307, -10414,
+      -7129, -4481},
+
+     {16384, -3388, -2228, -58, -2878, 2872, 5455, 6756, -2217, -5804, -3514, 3112, -905, 6255,
+      -660, -4830},
+
+     {16384, -12573, 2440, 7208, -21776, 11349, 9605, -15665, 18521, -4353, -12453, 14610, -4744,
+      -4245, 10731, -7129},
+
+     {16384, 1438, 3894, -4945, -4577, -5649, -8998, 1275, 2533, 7551, 5513, 831, 2478, -516,
+      3803, -3971},
+
+     {16384, -9557, -4016, 1148, 3067, -2322, 4368, -9160, 4040, 2668, 1543, -3710, 3583, -7718,
+      6155, 459},
+
+     {16384, -8302, -3137, 3782, -3003, 1583, -2785, -119, 6186, -659, -3700, -576, -718, -1954,
+      -6285, 7822},
+
+     {16384, 2798, 10568, 5005, -7412, -7699, -13818, -6523, -6133, 5936, 1861, 11433, 1574,
+      -2064, 3440, -8081}},
+    {/* den_coef_2 q14 */
+     {16384, -3386, 2367, -451, -3395, 428, -75},
+
+     {16384, 9840, -7195, -12936, -3631, 6891, 6314},
+
+     {16384, 15624, 8696, 3216, -3613, -12943, -7420},
+
+     {16384, 8053, 7214, 3850, 4439, 4576, 6291},
+
+     {16384, -2632, -3365, 2966, -6169, 2640, 6083},
+
+     {16384, -6449, 9825, -7212, 10563, -9094, 6975},
+
+     {16384, -9038, 5639, -5838, 2923, -8043, 1681},
+
+     {16384, 251, -4704, -415, 8460, 3836, -7576},
+
+     {16384, 3680, 1058, 2332, 3098, 3594, 7835},
+
+     {16384, -7410, -4018, 12455, -5813, -6733, 7900}},
+    {/* den_coef_3 q14 */
+     {16384, 2120, -535, 585},
+
+     {16384, -3840, -1121, -7684},
+
+     {16384, 3714, -905, 7602},
+
+     {16384, -12910, 10987, -7850},
+
+     {16384, 7803, 6571, 7209},
+
+     {16384, 8586, 3923, -2630},
+
+     {16384, -2605, 822, -2621},
+
+     {16384, -6387, 341, 4044},
+
+     {16384, -8016, -7673, 7832},
+
+     {16384, 6647, -8082, -7265}},
+    {/* lattice_delta_phi[10][20] */
+     {58687, 14277, 37483, 30019, 55054, 47071, 28194, 1144,  50735, 27466,
+      38014, 48916, 56938, 45597, 10889, 25058, 57780, 56633, 25339, 55198},
+     {3575, 21794, 50227, 609,   8579,  12524, 12275, 37293, 16813, 12281,
+      944,  46128, 27492, 57554, 28783, 25857, 52268, 32437, 12517, 41514},
+     {51767, 1212,  42081, 23439, 51377, 31058, 43821, 26490, 18815, 11715,
+      11947, 42140, 18701, 33456, 9319,  43106, 23370, 53120, 52727, 36661},
+     {30671, 55575, 50748, 39833, 50522, 40780, 21122, 17895, 21073, 32988,
+      44912, 19104, 51790, 35088, 22879, 43404, 33761, 27479, 42900, 38375},
+     {49093, 59100, 32280, 54362, 10682, 60516, 16767, 15584, 54090, 45541,
+      8431,  727,   55214, 12301, 18452, 40855, 17567, 28983, 4001,  61047},
+     {35996, 26159, 31841, 20627, 26739, 13956, 35812, 46966, 32725, 39564,
+      12914, 23459, 48382, 42054, 28479, 35072, 49057, 3657,  37238, 3106},
+     {25657, 18838, 54005, 927,   47435, 59965, 61155, 48726, 27096, 30779,
+      13215, 39748, 19769, 59300, 44882, 25444, 45990, 16551, 27171, 57652},
+     {42208, 13130, 51836, 38837, 8264, 12793, 37503, 38905, 22882, 35524,
+      27882, 2710,  1678,  19313, 793,  23717, 42192, 5734,  2182,  37824},
+     {37588, 973,   1009,  11741, 36251, 3555,  22702, 39004, 44325, 42785,
+      5194,  28063, 27289, 21820, 9486,  41733, 43188, 44935, 29547, 34272},
+     {7478,  27843, 44217, 55149, 16869, 15735, 53464, 14352, 49712, 56109,
+      14323, 14782, 3074,  4843,  39580, 11790, 52124, 10741, 10548, 61414}
+
+    }}; /* END OF ia_mps_dec_decorr_tables_struct */
+
+const ia_mps_dec_tp_process_tables_struct ixheaacd_mps_dec_tp_process_tables = {
+    {/* WORD32 bp[25] */
+     0,          536871,     9878425,    63028645,   277025391,  793709956,  1051300620,
+     1072990205, 1073741824, 1073741824, 1073741824, 1073741824, 1073634450, 1072023837,
+     1063863399, 1034979744, 961213681,  827962321,  657881616,  494887607,  364105853,
+     267683837,  198427489,  148927991,  113065014},
+    {/* WORD32 bpxgf[25] */
+     0,      0,      0,      0,      0,      0,      11,     869,    3876,
+     9030,   17180,  29034,  42613,  60301,  78683,  101438, 118431, 129369,
+     130793, 123544, 116663, 110310, 106802, 105375, 106563},
+    {/* WORD32 bp2xgf2[25] */
+     0,          0,          0,          0,          0,          0,          14,
+     94422,      1878124,    10192994,   36893488,   105371488,  226978688,  454531424,
+     773883456,  1286217856, 1753241984, 2092045696, 2138365312, 1907882112, 1701286528,
+     1521032576, 1425823104, 1387998976, 1419449728},
+    {/* ia_mps_dec_qmf_64_640 */
+
+     -593273,    -603195,    -531235,    -523473,    -525466,    -541242,    -561198,
+     -586968,    -609649,    -630386,    -658498,    -677798,    -702262,    -727749,
+     -745350,    -768556,    -779004,    -798965,    -804296,    -824781,    -829449,
+     -841205,    -835357,    -837912,    -837674,    -833006,    -819350,    -808527,
+     -785910,    -774746,    -742807,    -714082,    -680923,    -638459,    -597491,
+     -552501,    -494600,    -439710,    -375935,    -311061,    -225307,    -155303,
+     -66285,     14490,      117508,     219367,     316703,     432346,     548401,
+     669947,     800799,     924324,     1061499,    1207976,    1350540,    1492769,
+     1658203,    1811196,    1970130,    2130426,    2304420,    2471459,    2644155,
+     2813392,    -14250510,  15451646,   16686544,   17966354,   19266512,   20602146,
+     21961434,   23350400,   24769094,   26216586,   27689208,   29190684,   30716766,
+     32266228,   33824760,   35407076,   37003392,   38622232,   40245224,   41881696,
+     43524036,   45166852,   46825616,   48478200,   50126888,   51772148,   53406388,
+     55035300,   56653920,   58245424,   59826064,   61376848,   62912216,   64407060,
+     65869248,   67308344,   68688968,   70034496,   71335920,   72593104,   73770768,
+     74907480,   75981056,   76987576,   77919576,   78771872,   79564664,   80257104,
+     80867504,   81390528,   81818320,   82140408,   82366040,   82482056,   82488072,
+     82378000,   82146696,   81792104,   81315088,   80699888,   79957728,   79070992,
+     78036832,   76861272,   75541288,   -387791520, 399839488,  411924960,  424043392,
+     436188032,  448362048,  460540736,  472720608,  484901440,  497068160,  509217024,
+     521328832,  533403616,  545441280,  557404608,  569323776,  581168512,  592925760,
+     604601408,  616169344,  627645376,  638996992,  650234816,  661329408,  672295808,
+     683112384,  693773568,  704268992,  714590208,  724739584,  734692096,  744455552,
+     754023232,  763367104,  772499520,  781410112,  790081984,  798523328,  806716992,
+     814656576,  822343936,  829764160,  836905280,  843784256,  850375168,  856681280,
+     862696320,  868409664,  873831616,  878940992,  883734592,  888228800,  892390976,
+     896245568,  899765312,  902967616,  905834176,  908366080,  910566976,  912444864,
+     913965952,  915155200,  916011392,  916516032,  916694784,  387791520,  -375800416,
+     -363861344, -351984768, -340191360, -328468224, -316830784, -305287808, -293843840,
+     -282507200, -271278752, -260169456, -249182288, -238333392, -227604912, -217030080,
+     -206584352, -196298528, -186166240, -176196608, -166387792, -156741232, -147269248,
+     -137976128, -128857392, -119918376, -111167664, -102599616, -94225952,  -86046760,
+     -78054944,  -70266720,  -62674884,  -55276676,  -48082892,  -41100320,  -34309408,
+     -27726944,  -21349652,  -15170772,  -9203229,   -3445304,   2122315,    7477201,
+     12629763,   17577288,   22333516,   26876570,   31226990,   35388804,   39343844,
+     43106256,   46682944,   50068936,   53255304,   56274144,   59105196,   61756552,
+     64227648,   66529340,   68659864,   70619000,   72426576,   74052112,   75541288,
+     14250510,   -13083544,  -11952416,  -10860922,  -9805983,   -8783018,   -7797064,
+     -6849645,   -5941788,   -5070487,   -4230663,   -3428863,   -2665749,   -1936973,
+     -1242119,   -586722,    29640,      626234,     1170628,    1694867,    2176923,
+     2631584,    3054447,    3445840,    3801180,    4129225,    4429361,    4703189,
+     4943457,    5165715,    5351495,    5517130,    5660311,    5780916,    5879142,
+     5948998,    6004056,    6041528,    6054744,    6061830,    6036645,    6006299,
+     5956659,    5892270,    5819334,    5741478,    5632975,    5519822,    5410909,
+     5276110,    5146719,    5004330,    4854371,    4695550,    4538091,    4382987,
+     4209866,    4037690,    3866358,    3695698,    3515389,    3342066,    3164257,
+     2992568,    2813392,    0
+
+    },
+
+    {/* time_out_idx_5xxx */
+     0, 4, 1, 5, 2, 3},
+    {                          /* time_out_idx_7xxx */
+     0, 6, 4, 1, 7, 5, 2, 3}}; /* END OF ia_mps_dec_tp_process_tables_struct */
+
+const ia_mps_dec_wf_tables_struct ixheaacd_mps_dec_wf_tables = {
+    {/* wf_02[02] */
+     241763088, 1047220608},
+    {/* wf_03[03] */
+     405508672, 994288128, 1073741824},
+    {/* wf_04[04] */
+     74786520, 495910976, 952295808, 1072442752},
+    {/* wf_15[15] */
+     33378420, 82512488, 161958320, 271833312, 405508672, 550893760, 693520960, 820157440,
+     921652736, 994288128, 1039588224, 1063000768, 1071959744, 1073777408, 1073741824},
+    {/* wf_16[16] */
+     17767756, 49954848, 106257792, 189948048, 299393344, 427811456, 564606912, 697780672,
+     816546368, 913347264, 984834112, 1031783360, 1058213184, 1070029568, 1073496768, 1073778048},
+    {/* wf_18[18] */
+     16564868, 43063124, 87930072, 154132432, 241763088, 347599968, 465479488, 587373440,
+     704843840, 810472832, 898935168, 967540544, 1016242176, 1047220608, 1064192000, 1071578112,
+     1073653504, 1073771776},
+    {/* wf_24[24] */
+     14317799,   31203742,   57523900,   95005720,   144655552,  206523232,
+     279593792,  361828608,  450350208,  541736896,  632377216,  718827712,
+     798123008,  868004096,  927046656,  974691008,  1011186368, 1037469120,
+     1054995264, 1065546944, 1071026944, 1073256768, 1073790592, 1073759872},
+    {/* wf_30[30] */
+     13067639,   25239604,   43063124,   67534224,   99414240,   139133360,
+     186719680,  241763088,  303418944,  370451168,  441309952,  514235072,
+     587373440,  658898880,  727122624,  790586112,  848129856,  898935168,
+     942540224,  978831680,  1008016576, 1030578048, 1047220608, 1058807040,
+     1066291840, 1070653760, 1072829696, 1073653504, 1073802496, 1073753728},
+    {/* wf_32[32] */
+     12766251,   23875188,   39863096,   61569988,   89667248,   124584992,  166455168,
+     215076864,  269907904,  330083936,  394462912,  461690592,  530280480,  598700672,
+     665459648,  729184768,  788687296,  843011328,  891463872,  933627840,  969357504,
+     998760960,  1022170432, 1040104512, 1053224448, 1062286912, 1068094656, 1071448256,
+     1073099136, 1073706624, 1073800704, 1073752448}}; /* END OF ia_mps_dec_wf_tables_struct */
+
+const ia_mps_dec_mdct2qmf_table_struct ixheaacd_mps_dec_mdct2qmf_table = {
+    {/* twi_post_cos[64] */
+     13,   -38,  63,   -88,   113,  -138,  163,  -187,  212,  -237,  261,  -285, 309,
+     -333, 357,  -380, 403,   -426, 449,   -472, 494,   -516, 537,   -558, 579,  -600,
+     620,  -640, 659,  -678,  697,  -715,  733,  -750,  767,  -784,  799,  -815, 830,
+     -844, 858,  -872, 885,   -897, 909,   -920, 931,   -941, 951,   -960, 968,  -976,
+     983,  -990, 996,  -1002, 1007, -1011, 1015, -1018, 1020, -1022, 1023, -1024
+
+    },
+    {/* twi_post_sin[64] */
+
+     1024, -1023, 1022, -1020, 1018, -1015, 1011, -1007, 1002, -996, 990,  -983, 976,
+     -968, 960,   -951, 941,   -931, 920,   -909, 897,   -885, 872,  -858, 844,  -830,
+     815,  -799,  784,  -767,  750,  -733,  715,  -697,  678,  -659, 640,  -620, 600,
+     -579, 558,   -537, 516,   -494, 472,   -449, 426,   -403, 380,  -357, 333,  -309,
+     285,  -261,  237,  -212,  187,  -163,  138,  -113,  88,   -63,  38,   -13},
+    {/* hybrid_2_qmf[71] */
+     0,  0,  0,  0,  0,  0,  1,  1,  2,  2,  3,  4,  5,  6,  7,  8,  9,  10,
+     11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+     29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+     47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63},
+    {/* local_sin_4 */
+     6393, 18205, 27246, 32138},
+    {/* local_sin_15 */
+     0, 3425, 6813, 10126, 13328, 16384, 19261, 21926, 24351, 26510, 28378, 29935, 31164, 32052,
+     32588, 32768},
+    {/* local_sin_16 */
+     1608, 4808, 7962, 11039, 14010, 16846, 19520, 22006, 24279, 26320, 28106, 29622, 30853,
+     31786, 32413, 32729},
+    {/* local_sin_18 */
+     1429, 4277, 7092, 9854, 12540, 15131, 17606, 19948, 22138, 24159, 25997, 27636, 29066, 30274,
+     31251, 31991, 32488, 32737},
+    {/* local_sin_24 */
+     1072,  3212,  5338,  7441,  9512,  11543, 13524, 15447, 17304, 19087, 20788, 22400,
+     23916, 25330, 26635, 27827, 28899, 29847, 30668, 31357, 31912, 32330, 32610, 32750},
+    {/* local_sin_30 */
+     858,   2571,  4277,  5971,  7650,  9307,  10938, 12540, 14107, 15636,
+     17121, 18560, 19948, 21281, 22556, 23769, 24917, 25997, 27005, 27939,
+     28797, 29576, 30274, 30888, 31419, 31863, 32219, 32488, 32667, 32757},
+    {/* local_sin_32 */
+     804,   2411,  4011,  5602,  7180,  8740,  10279, 11793, 13279, 14733, 16151,
+     17531, 18868, 20160, 21403, 22595, 23732, 24812, 25833, 26791, 27684, 28511,
+     29269, 29957, 30572, 31114, 31581, 31972, 32286, 32522, 32679, 32758}
+
+}; /* END OF ia_mps_dec_mdct2qmf_table_struct */
+
+const ia_mps_dec_tonality_tables_struct ixheaacd_mps_dec_tonality_tables = {
+    {/* gmax_fix[72] */
+     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
+     2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5},
+    {/* dwin_fix[72] */
+     32768,  65536,  98304,  131072, 163840, 196608, 229376, 262144, 294912, 327680, 360448,
+     393216, 425984, 458752, 491520, 524288, 278528, 294912, 311296, 327680, 344064, 360448,
+     376832, 393216, 409600, 425984, 442368, 458752, 475136, 491520, 507904, 524288, 360448,
+     371371, 382293, 393216, 404139, 415061, 425984, 436907, 447829, 458752, 469675, 480597,
+     491520, 502443, 513365, 524288, 401408, 409600, 417792, 425984, 434176, 442368, 450560,
+     458752, 466944, 475136, 483328, 491520, 499712, 507904, 516096, 524288, 425984, 432538,
+     439091, 445645, 452198, 458752, 465306, 471859},
+    {/* nstart_fix[5][72] */
+     {
+
+         -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0,  -7, -7,
+         -6,  -6,  -5,  -5,  -4,  -4,  -3, -3, -2, -2, -1, -1, 0,  0,  -5, -5, -4, -4,
+         -4,  -3,  -3,  -3,  -2,  -2,  -2, -1, -1, -1, 0,  0,  -4, -3, -3, -3, -3, -2,
+         -2,  -2,  -2,  -1,  -1,  -1,  -1, 0,  0,  0,  -3, -3, -3, -2, -2, -2, -2, -2},
+     {
+
+         -14, -12, -10, -8, -6, -4, -2, 0,  2,  4,  6,  8,  10, 12, 14, 16, 1,  2,
+         3,   4,   5,   6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16, 6,  7,  7,  8,
+         9,   9,   10,  11, 11, 12, 13, 13, 14, 15, 15, 16, 9,  9,  10, 10, 11, 11,
+         12,  12,  13,  13, 14, 14, 15, 15, 16, 16, 10, 10, 11, 11, 12, 12, 12, 13},
+     {
+
+         -13, -10, -7, -4, -1, 2,  5,  8,  11, 14, 17, 20, 23, 26, 29, 32, 10, 11,
+         13,  14,  16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 17, 18, 19, 20,
+         21,  22,  23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 21, 22, 22, 23, 24, 25,
+         25,  26,  27, 28, 28, 29, 30, 31, 31, 32, 23, 24, 24, 25, 25, 26, 27, 27},
+     {
+
+         -12, -8, -4, 0,  4,  8,  12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 18, 20,
+         22,  24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 28, 29, 31, 32,
+         33,  35, 36, 37, 39, 40, 41, 43, 44, 45, 47, 48, 33, 34, 35, 36, 37, 38,
+         39,  40, 41, 42, 43, 44, 45, 46, 47, 48, 36, 37, 38, 38, 39, 40, 41, 42},
+     {
+
+         -11, -6, -1, 4,  9,  14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64, 27, 29,
+         32,  34, 37, 39, 42, 44, 47, 49, 52, 54, 57, 59, 62, 64, 39, 41, 42, 44,
+         46,  47, 49, 51, 52, 54, 56, 57, 59, 61, 62, 64, 45, 47, 48, 49, 50, 52,
+         53,  54, 55, 57, 58, 59, 60, 62, 63, 64, 49, 50, 51, 52, 53, 54, 55, 56}},
+    {/* dfrac_fix[5][56] */
+     {16384, 0,     16384,  0,     16384, 0,      16384, 0,     16384,  0,     16384, 0,
+      16384, 0,     16384,  0,     0,     -10923, 10923, 0,     -10923, 10923, 0,     -10923,
+      10923, 0,     -10923, 10923, 0,     -10923, 10923, 0,     -8192,  16384, 8192,  0,
+      -8192, 16384, 8192,   0,     -8192, 16384,  8192,  0,     -8192,  16384, 8192,  0,
+      0,     -6554, -13107, 13107, 6554,  0,      -6554, -13107},
+     {0,      0,      0,     0,      0,     0,     0,      0,   0,     0,      0,     0,
+      0,      0,      0,     0,      0,     10923, -10923, 0,   10923, -10923, 0,     10923,
+      -10923, 0,      10923, -10923, 0,     10923, -10923, 0,   16384, 0,      16384, 0,
+      16384,  0,      16384, 0,      16384, 0,     16384,  0,   16384, 0,      16384, 0,
+      0,      -13107, 6554,  -6554,  13107, 0,     -13107, 6554},
+     {16384, 0, 16384, 0,     16384, 0,     16384, 0,     16384, 0,     16384,  0, 16384, 0,
+      16384, 0, 0,     0,     0,     0,     0,     0,     0,     0,     0,      0, 0,     0,
+      0,     0, 0,     0,     8192,  16384, -8192, 0,     8192,  16384, -8192,  0, 8192,  16384,
+      -8192, 0, 8192,  16384, -8192, 0,     0,     13107, -6554, 6554,  -13107, 0, 13107, -6554},
+     {0, 0,      0,     0,      0,     0, 0,      0,     0,     0,      0,     0, 0,      0,
+      0, 0,      0,     -10923, 10923, 0, -10923, 10923, 0,     -10923, 10923, 0, -10923, 10923,
+      0, -10923, 10923, 0,      0,     0, 0,      0,     0,     0,      0,     0, 0,      0,
+      0, 0,      0,     0,      0,     0, 0,      6554,  13107, -13107, -6554, 0, 6554,   13107},
+     {16384,  0,     16384, 0,      16384, 0,     16384,  0, 16384, 0,      16384, 0,
+      16384,  0,     16384, 0,      0,     10923, -10923, 0, 10923, -10923, 0,     10923,
+      -10923, 0,     10923, -10923, 0,     10923, -10923, 0, -8192, 16384,  8192,  0,
+      -8192,  16384, 8192,  0,      -8192, 16384, 8192,   0, -8192, 16384,  8192,  0,
+      0,      0,     0,     0,      0,     0,     0,      0}
+
+    },
+    {/* part4[4] */
+     65536, 131072, 557056, 1343488},
+    {/* part5[5] */
+     32768, 65536, 196608, 458752, 1343488},
+    {/* part7[7] */
+     32768, 32768, 65536, 131072, 196608, 294912, 1343488},
+    {/* part10[10] */
+     16384, 16384, 32768, 32768, 65536, 65536, 65536, 163840, 294912, 1343488},
+    {/* part14[14] */
+     16384, 16384, 16384, 16384, 32768, 32768, 65536, 65536, 98304, 98304, 131072, 163840, 393216,
+     950272},
+    {/* part20[20] */
+     8192,  8192,  8192,  8192,  16384, 16384, 16384,  16384,  32768,  32768,
+     32768, 32768, 32768, 32768, 65536, 98304, 131072, 163840, 393216, 950272},
+    {/* part28[28] */
+     8192,  8192,  8192,  8192,  8192,   8192,   8192,   8192,  16384, 16384,
+     16384, 16384, 32768, 32768, 32768,  32768,  65536,  65536, 65536, 65536,
+     65536, 65536, 98304, 98304, 131072, 163840, 196608, 753664},
+    {/* part40[40] */
+     4096,  4096,  4096,  4096,  4096,  4096,   4096,   4096,   8192,   8192,
+     8192,  8192,  8192,  8192,  8192,  8192,   16384,  16384,  16384,  16384,
+     16384, 16384, 16384, 16384, 32768, 32768,  32768,  32768,  32768,  65536,
+     65536, 65536, 65536, 98304, 98304, 131072, 163840, 196608, 229376, 524288},
+    {/* w_real[16] */
+     1073741824, 1053109888, 992008576, 892784128, 759250368, 596538752, 410902752, 209476288, 0,
+     -209476288, -410902752, -596538752, -759250368, -892784128, -992008576, -1053109888},
+    {/* w_imag[16] */
+     0, -209476288, -410902752, -596538752, -759250368, -892784128, -992008576, -1053109888,
+     -1073741824, -1053109888, -992008576, -892784128, -759250368, -596538752, -410902752,
+     -209476288},
+    {/* bitrev[16] */
+     0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}
+
+}; /* END OF ia_mps_dec_tonality_tables_struct */
+
+const ia_mps_dec_bitdec_tables_struct ixheaacd_mps_dec_bitdec_tables = {
+    { /* kernel_table */
+     {/* kernels_4_to_71[71] */
+      0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+      2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+      3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
+     {/* kernels_5_to_71[71] */
+      0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+      3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+      4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+     {/* kernels_7_to_71[71] */
+      0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5,
+      5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
+     {/* kernels_10_to_71[71] */
+      0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8,
+      8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+      9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
+     {/* kernels_14_to_71[71] */
+      0,  0,  0,  0,  1,  1,  2,  3,  4,  4,  5,  6,  6,  7,  7,  8,  8,  8,
+      9,  9,  9,  10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
+      12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+      13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+     {/* kernels_20_to_71[71] */
+      1,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 14,
+      15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
+      18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19},
+     {/* kernels_28_to_71[71] */
+      1,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
+      16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23,
+      23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26,
+      26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27},
+     {/* bb_env_kernels[71] */
+      1,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 14,
+      15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18,
+      18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
+      19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}},
+    { /* map_table */
+     {/* mapping_4_to_28[28] */
+      0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3},
+     {/* mapping_5_to_28[28] */
+      0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4},
+     {/* mapping_7_to_28[28] */
+      0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6},
+     {/* mapping_10_to_28[28] */
+      0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9},
+     {/* mapping_14_to_28[28] */
+      0, 0, 1, 1, 2,  3,  4,  4,  5,  6,  6,  7,  7,  8,
+      8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13},
+     {/* mapping_20_to_28[28] */
+      0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13,
+      14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19}
+
+    },
+
+    {/* tree_property_table[7] */
+     {1, 6, 5, 0, {0, 0, 0, 0, 1}},
+     {1, 6, 5, 0, {0, 0, 1, 0, 0}},
+     {2, 6, 3, 1, {1, 0, 0, 0, 0}},
+     {2, 8, 5, 1, {1, 0, 0, 0, 0}},
+     {2, 8, 5, 1, {1, 0, 0, 0, 0}},
+     {6, 8, 2, 0, {0, 0, 0, 0, 0}},
+     {6, 8, 2, 0, {0, 0, 0, 0, 0}}},
+
+    {/* sampling_freq_table[13] */
+     96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350},
+    {/* freq_res_table[8] */
+     0, 28, 20, 14, 10, 7, 5, 4},
+    {/* temp_shape_chan_table[2][7] */
+     {5, 5, 4, 6, 6, 4, 4},
+     {5, 5, 5, 7, 7, 4, 4}},
+    {/* surround_gain_table[5] */
+     32768, 38968, 46341, 55109, 65536},
+    {/* lfe_gain_table[5] */
+     32768, 103621, 327680, 1036215, 3276800},
+    {/* clip_gain_table[8] */
+     32768, 38968, 46341, 55109, 65536, 77936, 92682, 131072},
+    {/* pb_stride_table[4] */
+     1, 2, 5, 28},
+    {/* smg_time_table[4] */
+     64, 128, 256, 512},
+    {/* dequant_cld[31] */
+     -4915200, -1474560, -1310720, -1146880, -983040, -819200, -720896, -622592,
+     -524288,  -425984,  -327680,  -262144,  -196608, -131072, -65536,  0,
+     65536,    131072,   196608,   262144,   327680,  425984,  524288,  622592,
+     720896,   819200,   983040,   1146880,  1310720, 1474560, 4915200},
+    {/* dequant_cld_coarse[15] */
+     -4915200, -1146880, -819200, -622592, -425984, -262144, -131072, 0, 131072, 262144, 425984,
+     622592, 819200, 1146880, 4915200},
+    {/* dequant_cpc[52] */
+     -65536, -62259, -58982, -55705, -52428, -49152, -45875, -42598, -39321, -36044, -32768,
+     -29491, -26214, -22937, -19660, -16384, -13107, -9830,  -6553,  -3276,  0,      3276,
+     6553,   9830,   13107,  16384,  19660,  22937,  26214,  29491,  32768,  36044,  39321,
+     42598,  45875,  49152,  52428,  55705,  58982,  62259,  65536,  68812,  72089,  75366,
+     78643,  81920,  85196,  88473,  91750,  95027,  98304},
+    {/* dequant_cpc_coarse[26] */
+     -65536, -58982, -52428, -45875, -39321, -32768, -26214, -19660, -13107,
+     -6553,  0,      6553,   13107,  19660,  26214,  32768,  39321,  45875,
+     52428,  58982,  65536,  72089,  78643,  85196,  91750,  98304},
+    {/* dequant_icc[8] */
+     32768, 30704, 27564, 19691, 12047, 0, -19300, -32440},
+    {/* factor_cld_tab_1[31] */
+     -4915200, -1474564, -1310734, -1146925, -983182, -819649, -721791, -624372,
+     -527818,  -432943,  -341243,  -283080,  -228498, -178762, -135149, -98641,
+     -69613,   -47690,   -31890,   -20936,   -13563,  -6959,   -3530,   -1780,
+     -895,     -449,     -142,     -44,      -14,     -4,      0},
+    {/* hrtf_power[64] */
+     5193,    5827,    6538,    7336,    8231,    9235,    10362,   11627,   13045,   14637,
+     16423,   18427,   20675,   23198,   26029,   29205,   32768,   36766,   41252,   46286,
+     51934,   58271,   65381,   73358,   82309,   92353,   103622,  116265,  130452,  146369,
+     164229,  184268,  206752,  231980,  260285,  292045,  327680,  367663,  412525,  462860,
+     519338,  582707,  653808,  733584,  823095,  923528,  1036215, 1162652, 1304518, 1463693,
+     1642291, 1842680, 2067521, 2319797, 2602855, 2920452, 3276800, 3676630, 4125246, 4628604,
+     5193379, 5827066, 6538075, 7335840},
+    {/* envshape_data[2][5] */
+     {16384, 23170, 32768, 46341, 65536},
+     {16384, 20643, 26008, 32768, 41285}},
+    {/* pcm_chnksz_level_3[5] */
+     2, 4, 5, 7, 8},
+
+    /* pcm_chnksz_level_4 */
+    2,
+    {/* pcm_chnksz_level_7[6] */
+     3, 6, 9, 12, 15, 17},
+    /* pcm_chnksz_level_8 */
+    3,
+    {/* pcm_chnksz_level_11[2] */
+     4, 7},
+    {/* pcm_chnksz_level_13[4] */
+     4, 8, 12, 15},
+    /* pcm_chnksz_level_15 */
+    4,
+    {/* pcm_chnksz_level_19[4] */
+     5, 9, 13, 17},
+    {/* pcm_chnksz_level_25[3] */
+     5, 10, 14},
+    /* pcm_chnksz_level_26 */
+    5,
+    /* pcm_chnksz_level_31 */
+    5,
+    {                 /* pcm_chnksz_level_51[4] */
+     6, 12, 18, 23}}; /* END OF ia_mps_dec_bitdec_tables_struct */
+
+const ia_mps_dec_blind_tables_struct ixheaacd_mps_dec_blind_tables = {
+    {{/* blind_cld_mesh[31][21] */
+      {-9, -9, -7, -3, -2, -1, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1},
+      {-10, -8, -6, -3, -2, -1, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 7},
+      {-10, -6, -5, -2, -1, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 9},
+      {-7, -5, -4, -2, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 7, 10},
+      {-8, -5, -3, 0, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 10},
+      {-10, -4, -4, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 8, 10},
+      {1, 1, 1, 2, 3, 2, 2, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 9, 11},
+      {3, 3, 2, 4, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 9, 11},
+      {4, 4, 4, 1, 3, 2, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 9, 11},
+      {5, 5, 5, 3, 2, 3, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 10},
+      {5, 5, 4, 4, 5, 3, 3, 5, 5, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 11},
+      {5, 5, 5, 5, 6, 5, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 8, 8, 8, 10, 11},
+      {5, 5, 5, 5, 5, 4, 4, 6, 6, 7, 8, 9, 8, 8, 8, 8, 8, 9, 9, 10, 11},
+      {5, 5, 5, 5, 5, 4, 4, 6, 6, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 11},
+      {5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 8, 10, 10, 9, 9, 10, 10, 10, 11, 11},
+      {5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 9, 9, 9, 10, 10, 10, 9, 9, 10, 11, 11},
+      {5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11},
+      {5, 5, 5, 5, 5, 5, 6, 7, 7, 8, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11},
+      {5, 5, 5, 5, 5, 6, 6, 6, 6, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11},
+      {5, 5, 5, 5, 6, 6, 6, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11},
+      {5, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11},
+      {5, 5, 5, 6, 6, 6, 7, 7, 7, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11},
+      {5, 5, 5, 6, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+      {5, 5, 6, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+      {6, 6, 6, 6, 6, 7, 7, 8, 9, 9, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+      {6, 6, 6, 6, 7, 7, 8, 8, 9, 10, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+      {6, 6, 6, 6, 7, 7, 8, 9, 10, 10, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+      {6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+      {6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10},
+      {9, 9, 8, 7, 8, 8, 10, 10, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10},
+      {11, 11, 8, 7, 8, 8, 10, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10}},
+     {/* blind_icc_mesh[31][21] */
+      {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5},
+      {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {5, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 4, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 2, 2, 4, 3, 4, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {2, 2, 2, 3, 2, 3, 4, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {2, 2, 2, 3, 3, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4},
+      {2, 2, 3, 3, 3, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4},
+      {2, 2, 3, 3, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 2, 2, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 2, 2, 2, 3, 3, 2, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5},
+      {3, 3, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 5, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 2, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
+      {4, 5, 3, 3, 3, 3, 4, 5, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}},
+     {/* blind_cpc_1_mesh[31][21] */
+      {8, 9, 8, 7, 7, 6, 6, 6, 6, 6, 5, 4, 4, 3, 3, 2, 1, 0, -1, -1, -5},
+      {10, 9, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1},
+      {9, 9, 8, 8, 7, 7, 7, 7, 7, 6, 6, 5, 5, 4, 4, 4, 3, 2, 2, 2, 0},
+      {9, 7, 6, 6, 7, 7, 7, 7, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 2},
+      {8, 6, 7, 7, 6, 7, 7, 7, 7, 7, 6, 6, 6, 5, 5, 4, 3, 3, 3, 3, 3},
+      {10, 7, 8, 7, 6, 7, 7, 7, 7, 7, 7, 6, 6, 6, 5, 4, 4, 3, 3, 4, 4},
+      {7, 7, 7, 6, 7, 7, 7, 8, 7, 7, 7, 6, 6, 6, 5, 4, 4, 4, 4, 5, 4},
+      {6, 6, 8, 6, 8, 8, 8, 8, 8, 7, 7, 8, 7, 7, 6, 5, 5, 4, 5, 5, 4},
+      {4, 4, 5, 9, 8, 9, 9, 8, 8, 8, 8, 7, 7, 7, 6, 6, 5, 4, 5, 5, 4},
+      {3, 3, 7, 6, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 5, 5, 5, 5, 5, 5, 5},
+      {2, 2, 5, 7, 8, 10, 9, 9, 8, 8, 8, 8, 8, 7, 7, 6, 5, 5, 5, 5, 5},
+      {4, 4, 5, 7, 7, 9, 9, 9, 8, 9, 8, 9, 8, 8, 7, 7, 6, 7, 6, 5, 6},
+      {5, 5, 6, 7, 8, 9, 10, 8, 9, 9, 9, 9, 7, 7, 7, 6, 6, 6, 6, 5, 6},
+      {6, 6, 6, 7, 8, 9, 10, 9, 9, 9, 8, 9, 8, 8, 9, 7, 7, 6, 6, 6, 7},
+      {6, 6, 7, 8, 8, 9, 9, 9, 9, 9, 9, 8, 9, 8, 8, 9, 8, 8, 5, 7, 7},
+      {7, 7, 7, 8, 9, 9, 9, 10, 9, 9, 10, 9, 9, 9, 8, 8, 8, 8, 8, 8, 7},
+      {7, 7, 7, 8, 9, 9, 10, 10, 10, 9, 10, 9, 8, 8, 8, 8, 9, 8, 8, 8, 8},
+      {7, 7, 8, 8, 9, 9, 10, 10, 10, 10, 9, 10, 9, 7, 8, 8, 8, 8, 8, 8, 8},
+      {8, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 9, 9, 8, 8, 8, 8, 8, 9, 9, 8},
+      {8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 9, 9, 9, 8, 8, 8, 8, 9, 8, 8},
+      {8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 9, 9, 8, 8, 8, 8, 8, 8, 8},
+      {8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 9, 9, 9, 8, 8, 8, 8, 8, 8},
+      {8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 8},
+      {9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8, 8},
+      {9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8},
+      {9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8},
+      {9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 8, 8},
+      {9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9},
+      {9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9},
+      {10, 10, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9},
+      {10, 10, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9}},
+     {/* blind_cpc_2_mesh[31][21] */
+      {8, 9, 8, 7, 7, 6, 6, 6, 6, 6, 5, 4, 4, 3, 3, 2, 1, 0, -1, -1, -5},
+      {7, 7, 7, 6, 6, 6, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 0, 0, 0, 0, 0},
+      {10, 6, 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 0, -3},
+      {7, 3, 5, 5, 5, 5, 4, 5, 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 0, -2},
+      {2, 0, 3, 4, 5, 4, 4, 3, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, -5},
+      {0, 2, 2, 3, 2, 4, 3, 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 1, 0, -6},
+      {1, 1, 1, 1, 2, 2, 1, 1, 0, 0, -1, 0, 0, 1, 2, 2, 2, 1, 0, -2, -8},
+      {0, 0, 0, -2, -2, 1, 2, 0, 0, -1, -1, -2, -3, -3, -1, 0, 0, 0, -2, -5, -5},
+      {2, 2, 5, 3, -1, -1, 0, 0, 0, -1, -2, -2, -1, -1, -3, -2, -3, -1, -1, -3, -5},
+      {1, 1, 5, 4, 3, 0, -1, 1, 0, -1, -1, -2, -1, 0, 0, 0, 1, 0, 0, -3, -3},
+      {1, 1, 3, 4, 5, 2, -1, -1, 1, 2, 1, 0, 0, 0, 1, 1, 0, 1, -1, -2, -5},
+      {2, 2, 3, 4, 4, 1, -1, 2, 3, 3, 2, 1, 1, 0, 2, -1, 0, 3, -1, -3, -5},
+      {3, 3, 3, 3, 3, 2, 2, 3, 4, 1, 2, 1, 3, -1, 1, 3, -2, -4, 1, -3, -5},
+      {3, 3, 3, 3, 3, 2, 2, 0, 3, 3, 1, 1, -3, 0, -1, -1, -1, 1, 0, -3, -5},
+      {3, 3, 3, 3, 3, 2, 2, 2, 0, 7, 2, 3, 0, -3, -4, -4, -4, -6, -5, -6, -5},
+      {3, 3, 3, 3, 2, 2, 2, 3, 4, 5, 3, 3, 1, -1, -3, -6, 0, -2, -5, -6, -7},
+      {3, 3, 3, 3, 2, 2, 3, 3, 2, 6, 3, 2, 2, 0, -2, -3, -1, -4, -4, -6, -6},
+      {3, 3, 3, 3, 2, 3, 3, 3, 3, 0, 0, 0, 1, 3, 0, -2, -2, -3, -6, -7, -6},
+      {3, 3, 3, 3, 3, 3, 3, 3, 3, 0, -2, 0, 1, 1, 1, -1, -2, -3, -5, -9, -6},
+      {3, 3, 3, 3, 3, 3, 3, 2, 1, -1, 2, 0, 1, 1, 0, 0, -2, -3, -5, -6, -6},
+      {3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, -1, -3, -4, -6, -6},
+      {3, 3, 3, 3, 3, 2, 2, 2, 4, 1, 1, 1, 1, 1, 0, 0, -1, -2, -4, -5, -5},
+      {3, 3, 3, 3, 3, 2, 2, 3, 2, 2, 1, 1, 1, 1, 0, 0, -1, -2, -3, -4, -4},
+      {3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, -1, -2, -3, -3, -3},
+      {3, 3, 3, 3, 2, 2, 2, 2, 2, 3, 4, 2, 1, 1, 0, 0, -1, -2, -2, -3, -3},
+      {3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 1, 0, -1, -1, -2, -2, -2},
+      {3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 0, 0, -1, -2, -2, -2},
+      {3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 1, 1, 0, 0, -1, -1, -2, -2},
+      {3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, -1, -1, -1, -1},
+      {5, 5, 4, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, -1, -1, -1},
+      {8, 8, 4, 2, 2, 2, 2, 3, 3, 4, -3, 3, -1, 1, 1, 1, 0, 0, -1, -1, -1}}},
+    {/* exp_1[13] */
+     32762, 32762, 32759, 32757, 32756, 32751, 32745, 32743, 32734, 32723, 32719, 32700, 32694},
+    {/* exp_2[13] */
+     32757, 32756, 32751, 32745, 32743, 32734, 32723, 32719, 32700, 32677, 32669, 32632, 32620},
+    {/* exp_4[13] */
+     32745, 32743, 32734, 32723, 32719, 32700, 32677, 32669, 32632, 32586, 32570, 32496, 32472},
+    {/* exp_8[13] */
+     32723, 32719, 32700, 32677, 32669, 32632, 32586, 32570, 32496, 32406, 32374, 32226, 32179},
+    {/* exp_16[13] */
+     32677, 32669, 32632, 32586, 32570, 32496, 32406, 32374, 32226, 32048, 31985, 31694, 31600},
+    {/* exp_32[13] */
+     32586, 32570, 32496, 32406, 32374, 32226, 32048, 31985, 31694, 31344, 31221, 30655, 30474},
+    {/* exp_64[13] */
+     32406, 32374, 32226, 32048, 31985, 31694, 31344, 31221, 30655, 29981, 29746, 28678, 28342},
+    {/* exp_128[13] */
+     32048, 31985, 31694, 31344, 31221, 30655, 29981, 29746, 28678, 27431, 27003, 25098,
+     24513}}; /* END OF ia_mps_dec_blind_tables_struct */
+
+const ia_huff_cpc_nodes_struct ixheaacd_huff_cpc_nodes =
+    {
+        /* ia_huff_cpc_nodes_struct huff_cpc_nodes */
+        {{{{2, 1},    {-1, -2},   {-3, 3},   {-4, 4},   {6, 5},    {-5, 7},   {-6, 8},
+           {-7, 9},   {-8, 10},   {-9, 11},  {-10, 12}, {-11, 13}, {-12, 14}, {-13, 15},
+           {-14, 16}, {-15, 17},  {-16, 18}, {-17, 19}, {-18, 20}, {-19, 21}, {-20, 22},
+           {-21, 23}, {-22, -26}, {-23, 24}, {-24, -25}}},
+         {{{-1, 1},   {-2, 2},    {-3, 3},   {-4, 4},   {-5, 5},   {-6, 6},   {-7, 7},
+           {9, 8},    {-8, 10},   {-9, 11},  {-10, 12}, {-11, 13}, {15, 14},  {-12, -14},
+           {-13, 16}, {-15, 17},  {-16, 18}, {-17, 19}, {-18, 20}, {-19, 21}, {-20, 22},
+           {-26, 23}, {-21, -22}, {-23, 24}, {-24, -25}}},
+         {{{-1, 1},   {-2, 2},    {-3, 3},   {-4, 4},   {-5, 5},   {-6, 6},   {-7, 7},
+           {9, 8},    {-8, 10},   {-9, 11},  {-10, 12}, {-11, 13}, {15, 14},  {-12, -14},
+           {-13, 16}, {-15, 17},  {-16, 18}, {-17, 19}, {-18, 20}, {-19, 21}, {-20, 22},
+           {-26, 23}, {-21, -22}, {-23, 24}, {-24, -25}}}},
+        {{{{{2, 1},
+            {-1, -52},
+            {4, 3},
+            {-2, 5},
+            {-51, 6},
+            {-18, 7},
+            {-17, 8},
+            {10, 9},
+            {-3, -36},
+            {-19, -50},
+            {-35, 11},
+            {-34, 12},
+            {-4, 13},
+            {-33, 14},
+            {-20, -49}},
+           {{2, 1},     {4, 3},     {-103, 5}, {-1, 6},    {8, 7},    {-2, 9},   {-102, 10},
+            {-18, 11},  {13, 12},   {-17, 14}, {-87, 15},  {-19, 16}, {18, 17},  {-86, -101},
+            {-3, 19},   {21, 20},   {23, 22},  {-34, -85}, {-20, 24}, {-35, 25}, {-100, 26},
+            {28, 27},   {-4, 29},   {-33, 30}, {-70, -71}, {-84, 31}, {-36, 32}, {-21, 33},
+            {-69, 34},  {-99, 35},  {-5, 36},  {-50, 37},  {-51, 38}, {-83, 39}, {-37, -68},
+            {-22, -52}, {-98, 40},  {-6, -49}, {-54, -55}, {-53, 41}, {-7, 42},  {-66, 43},
+            {-67, 44},  {-39, -65}, {-38, 45}, {-82, 46},  {-81, 47}, {-23, -97}},
+           {{2, 1},      {4, 3},      {6, 5},      {-154, 7},    {9, 8},       {11, 10},
+            {-1, 12},    {14, 13},    {-2, -153},  {-18, 15},    {17, 16},     {19, 18},
+            {-17, 20},   {-138, 21},  {23, 22},    {-19, 24},    {-137, 25},   {-152, 26},
+            {-3, 27},    {29, 28},    {31, 30},    {-34, 32},    {34, 33},     {-136, 35},
+            {-20, 36},   {-35, 37},   {-151, 38},  {40, 39},     {-122, 41},   {-4, -33},
+            {-121, 42},  {44, 43},    {-36, 45},   {-135, 46},   {48, 47},     {-120, 49},
+            {-21, 50},   {52, 51},    {-150, 53},  {55, 54},     {-50, -51},   {-5, 56},
+            {58, 57},    {-37, -119}, {-52, 59},   {-134, 60},   {-38, 61},    {-103, 62},
+            {-22, -118}, {-53, 63},   {-133, 64},  {-23, 65},    {-106, -149}, {-105, 66},
+            {-104, 67},  {-49, -148}, {69, 68},    {-6, 70},     {-68, 71},    {73, 72},
+            {-117, 74},  {-39, -54},  {-69, 75},   {-102, -132}, {-66, 76},    {-24, -67},
+            {78, 77},    {-147, 79},  {-7, -88},   {-86, 80},    {-87, -90},   {-55, -101},
+            {-116, 81},  {-8, -89},   {-40, -70},  {-65, -131},  {-25, 82},    {-83, 83},
+            {-84, -146}, {-85, 84},   {-82, 85},   {-9, 86},     {-73, 87},    {-72, 88},
+            {-71, -74},  {-81, 89},   {-10, 90},   {-98, -99},   {-100, 91},   {93, 92},
+            {-57, -58},  {-56, 94},   {-97, -115}, {-114, 95},   {-42, 96},    {-41, -113},
+            {-130, 97},  {-26, 98},   {-129, -145}},
+           {{2, 1},       {4, 3},      {6, 5},       {8, 7},       {-205, 9},    {11, 10},
+            {13, 12},     {-1, 14},    {16, 15},     {-204, 17},   {-18, 18},    {-2, 19},
+            {21, 20},     {23, 22},    {-189, 24},   {-17, 25},    {27, 26},     {-19, 28},
+            {-188, 29},   {-203, 30},  {32, 31},     {-3, 33},     {35, 34},     {-34, 36},
+            {38, 37},     {40, 39},    {-187, 41},   {-35, 42},    {-20, 43},    {45, 44},
+            {-202, 46},   {-173, 47},  {49, 48},     {51, 50},     {-172, 52},   {54, 53},
+            {-4, -33},    {-36, 55},   {-186, 56},   {-171, 57},   {59, 58},     {-21, 60},
+            {62, 61},     {-201, 63},  {65, 64},     {-50, 66},    {-51, 67},    {69, 68},
+            {-52, 70},    {72, 71},    {-37, -170},  {74, 73},     {-185, 75},   {-5, 76},
+            {78, 77},     {-22, 79},   {-157, 80},   {82, 81},     {-156, 83},   {85, 84},
+            {-155, 86},   {-200, 87},  {89, 88},     {-154, 90},   {-53, 91},    {-49, 92},
+            {-169, 93},   {-38, 94},   {96, 95},     {98, 97},     {-184, 99},   {-6, 100},
+            {-66, 101},   {-86, 102},  {-23, -67},   {-69, 103},   {-68, 104},   {106, 105},
+            {108, 107},   {-199, 109}, {-54, 110},   {-153, 111},  {-56, -136},  {-71, 112},
+            {-151, -168}, {-166, 113}, {-41, 114},   {-39, -137},  {-181, 115},  {-138, -141},
+            {-183, 116},  {-139, 117}, {-140, 118},  {-24, 119},   {-7, 120},    {-26, -120},
+            {-121, 121},  {-70, 122},  {-152, 123},  {-65, 124},   {-196, 125},  {-55, -198},
+            {-87, 126},   {-135, 127}, {-150, -167}, {-72, 128},   {-40, -82},   {-57, -84},
+            {-85, 129},   {-83, -182}, {-165, 130},  {-42, 131},   {-27, -103},  {-8, 132},
+            {-25, -180},  {-102, 133}, {-195, -197}, {-101, 134},  {-119, -124}, {-123, 135},
+            {-125, 136},  {-73, -122}, {-88, 137},   {-58, -149},  {-43, -134},  {-28, -179},
+            {-164, 138},  {-11, -194}, {-81, 139},   {-9, -106},   {-99, -105},  {-100, -104},
+            {-98, 140},   {-12, 141},  {143, 142},   {-10, -107},  {-116, 144},  {-109, 145},
+            {-117, -118}, {-108, 146}, {-13, 147},   {-97, 148},   {-90, 149},   {-91, -114},
+            {-89, 150},   {-115, 151}, {-93, 152},   {-131, 153},  {-92, -133},  {-132, 154},
+            {-113, 155},  {-74, 156},  {158, 157},   {-76, -130},  {-75, 159},   {-129, 160},
+            {-77, -148},  {-147, 161}, {-61, -146},  {163, 162},   {-59, -60},   {-163, 164},
+            {-44, -162},  {-145, 165}, {-45, 166},   {-161, -178}, {-29, 167},   {-177, 0}}},
+          {{{2, 1},
+            {-1, -52},
+            {-17, 3},
+            {5, 4},
+            {-36, 6},
+            {-18, 7},
+            {-2, 8},
+            {-33, 9},
+            {-20, 10},
+            {-34, -51},
+            {-35, 11},
+            {-49, 12},
+            {-19, 13},
+            {-3, 14},
+            {-4, -50}},
+           {{2, 1},      {4, 3},     {-103, 5},  {-1, 6},    {-17, 7},  {-87, 8},  {10, 9},
+            {-18, 11},   {13, 12},   {-2, -33},  {-71, 14},  {16, 15},  {-34, 17}, {-102, 18},
+            {-86, 19},   {-55, 20},  {-49, -50}, {22, 21},   {24, 23},  {-70, 25}, {-19, 26},
+            {-39, 27},   {-65, -66}, {-35, 28},  {30, 29},   {-54, 31}, {-3, 32},  {-51, 33},
+            {-85, -101}, {-23, -81}, {-82, 34},  {-38, 35},  {-69, 36}, {-67, 37}, {-20, -53},
+            {-36, 38},   {-97, 39},  {-52, 40},  {-4, -100}, {-84, 41}, {-68, 42}, {-21, 43},
+            {-37, 44},   {-5, 45},   {-83, -99}, {-22, 46},  {-98, 47}, {-6, -7}},
+           {{2, 1},      {4, 3},      {-154, 5},   {7, 6},      {-1, 8},     {-17, 9},
+            {-138, 10},  {12, 11},    {14, 13},    {-18, 15},   {17, 16},    {-122, 18},
+            {-33, 19},   {21, 20},    {-2, -34},   {23, 22},    {-153, 24},  {-106, 25},
+            {-137, 26},  {28, 27},    {-49, 29},   {-50, 30},   {32, 31},    {-121, 33},
+            {-90, 34},   {36, 35},    {-19, -66},  {38, 37},    {-65, 39},   {41, 40},
+            {-35, 42},   {-105, 43},  {45, 44},    {-51, -74},  {-82, 46},   {-3, 47},
+            {49, 48},    {-81, -152}, {-58, 50},   {-89, -98},  {-136, 51},  {53, 52},
+            {-73, 54},   {-67, -120}, {56, 55},    {-83, 57},   {-97, 58},   {-104, 59},
+            {-42, 60},   {-88, 61},   {-114, 62},  {-20, 63},   {-57, -113}, {-36, 64},
+            {-99, 65},   {-52, -68},  {67, 66},    {-72, 68},   {-130, 69},  {-26, 70},
+            {-41, -103}, {-4, -151},  {-135, 71},  {-84, -129}, {-119, 72},  {-115, 73},
+            {-56, 74},   {-87, 75},   {-53, -145}, {-100, 76},  {-21, 77},   {-37, 78},
+            {-69, -71},  {-118, 79},  {81, 80},    {-85, -150}, {-5, -102},  {-134, 82},
+            {-86, 83},   {-38, 84},   {-22, 85},   {-54, 86},   {-133, 87},  {-70, 88},
+            {-149, 89},  {-6, -117},  {-101, 90},  {-23, 91},   {-39, 92},   {-55, -148},
+            {-132, 93},  {-116, 94},  {-7, 95},    {-24, -40},  {-147, 96},  {-8, -131},
+            {-25, 97},   {-9, 98},    {-10, -146}},
+           {{2, 1},       {4, 3},       {6, 5},       {8, 7},       {-205, 9},    {-1, 10},
+            {-17, 11},    {13, 12},     {-189, 14},   {16, 15},     {-18, 17},    {19, 18},
+            {-173, 20},   {22, 21},     {-33, 23},    {-34, 24},    {-2, 25},     {27, 26},
+            {-204, 28},   {-157, 29},   {31, 30},     {-188, 32},   {-49, -50},   {34, 33},
+            {36, 35},     {-172, 37},   {-141, 38},   {40, 39},     {42, 41},     {-65, -66},
+            {44, 43},     {-19, 45},    {47, 46},     {-156, 48},   {-35, 49},    {51, 50},
+            {-125, 52},   {54, 53},     {-82, 55},    {-81, 56},    {-51, 57},    {59, 58},
+            {-140, 60},   {-3, 61},     {-203, 62},   {64, 63},     {-109, -187}, {66, 65},
+            {-98, 67},    {-67, 68},    {-171, 69},   {-97, 70},    {72, 71},     {-124, 73},
+            {75, 74},     {-93, 76},    {-155, 77},   {79, 78},     {-61, -83},   {-114, 80},
+            {82, 81},     {84, 83},     {-113, -146}, {-20, 85},    {-36, -108},  {-76, 86},
+            {88, 87},     {-77, -139},  {-52, 89},    {-99, 90},    {-131, 91},   {-130, 92},
+            {-45, 93},    {95, 94},     {-91, -129},  {-68, 96},    {-92, -161},  {-123, 97},
+            {-162, 98},   {-202, 99},   {-170, 100},  {-60, 101},   {-116, 102},  {-4, -145},
+            {-115, -186}, {104, 103},   {-107, -154}, {-84, 105},   {-29, -147},  {107, 106},
+            {-106, 108},  {-75, -177},  {-178, 109},  {111, 110},   {-132, -138}, {-100, 112},
+            {-21, 113},   {-37, 114},   {-44, -101},  {-193, 115},  {-90, 116},   {-53, -69},
+            {-122, -163}, {118, 117},   {-121, 119},  {-59, -117},  {-148, 120},  {-201, 121},
+            {-85, -185},  {123, 122},   {-74, 124},   {-153, -169}, {-5, 125},    {-86, -105},
+            {127, 126},   {-133, -137}, {129, 128},   {-22, -136},  {-102, 130},  {-38, 131},
+            {-54, 132},   {-89, -120},  {-118, 133},  {-70, -71},   {135, 134},   {-104, 136},
+            {-168, -200}, {-6, 137},    {-152, -184}, {-87, 138},   {140, 139},   {-103, 141},
+            {-39, 142},   {-135, 143},  {-151, 144},  {-55, 145},   {-23, 146},   {-119, 147},
+            {-56, -72},   {-88, 148},   {-167, -183}, {-7, -199},   {150, 149},   {-166, 151},
+            {-24, -150},  {-40, 152},   {154, 153},   {-134, 155},  {-41, 156},   {-198, 157},
+            {-57, -182},  {-8, 158},    {-73, -197},  {-9, -181},   {-165, 159},  {-149, 160},
+            {-25, 161},   {-26, -180},  {-164, 162},  {-58, 163},   {-42, -196},  {165, 164},
+            {-10, -195},  {-27, -43},   {-179, 166},  {-28, -194},  {-11, 167},   {-12, -13}}}},
+         {{{{-1, 1},
+            {-52, 2},
+            {4, 3},
+            {-17, 5},
+            {-2, 6},
+            {-18, -36},
+            {8, 7},
+            {-51, 9},
+            {11, 10},
+            {-33, -34},
+            {-20, -35},
+            {-19, 12},
+            {-3, 13},
+            {-49, 14},
+            {-4, -50}},
+           {{2, 1},    {-103, 3},   {-1, 4},    {6, 5},    {-17, 7},  {9, 8},     {-2, -87},
+            {-18, 10}, {12, 11},    {-102, 13}, {15, 14},  {-34, 16}, {-33, -86}, {18, 17},
+            {-71, 19}, {21, 20},    {-19, 22},  {-70, 23}, {-35, 24}, {-50, 25},  {-3, 26},
+            {-55, 27}, {-85, -101}, {-49, 28},  {30, 29},  {-51, 31}, {-69, 32},  {-54, 33},
+            {-20, 34}, {-66, 35},   {-36, 36},  {-39, 37}, {-65, 38}, {-52, -53}, {-67, 39},
+            {-4, 40},  {-84, -100}, {-38, -68}, {-82, 41}, {-81, 42}, {-21, -23}, {-37, 43},
+            {-5, 44},  {-83, -97},  {-99, 45},  {-22, 46}, {-6, 47},  {-7, -98}},
+           {{2, 1},       {-154, 3},   {5, 4},      {-1, 6},     {8, 7},       {-17, 9},
+            {-18, 10},    {-138, 11},  {-2, 12},    {14, 13},    {-153, 15},   {17, 16},
+            {-34, 18},    {-137, 19},  {21, 20},    {-33, -122}, {23, 22},     {-19, 24},
+            {26, 25},     {28, 27},    {-121, 29},  {-35, 30},   {32, 31},     {-50, 33},
+            {-3, 34},     {-152, 35},  {-106, 36},  {-136, 37},  {-49, 38},    {40, 39},
+            {-120, 41},   {-51, 42},   {44, 43},    {-105, 45},  {47, 46},     {49, 48},
+            {-66, 50},    {-20, 51},   {-36, 52},   {54, 53},    {-68, -90},   {56, 55},
+            {-103, 57},   {-52, -104}, {-65, -88},  {-67, 58},   {60, 59},     {62, 61},
+            {-4, -89},    {-83, -151}, {64, 63},    {-53, -135}, {-119, 65},   {-82, 66},
+            {-73, -87},   {-74, 67},   {-69, -98},  {-84, 68},   {-58, 69},    {-81, 70},
+            {72, 71},     {-72, 73},   {-21, 74},   {-37, 75},   {-102, -118}, {-85, 76},
+            {-86, -99},   {-57, 77},   {-71, 78},   {-150, 79},  {-97, 80},    {-100, -114},
+            {-54, 81},    {-5, -134},  {-38, 82},   {-56, -70},  {-42, 83},    {-113, 84},
+            {-115, 85},   {-130, 86},  {-41, -101}, {-22, -133}, {-117, 87},   {-129, 88},
+            {-26, 89},    {-39, 90},   {-23, -149}, {-6, 91},    {-55, 92},    {-132, 93},
+            {-145, -148}, {-116, 94},  {-24, -40},  {-7, 95},    {-147, 96},   {-8, -131},
+            {-25, 97},    {-146, 98},  {-9, -10}},
+           {{2, 1},       {4, 3},      {-205, 5},    {-1, 6},      {8, 7},      {10, 9},
+            {-17, 11},    {-18, 12},   {-2, -189},   {14, 13},     {-204, 15},  {17, 16},
+            {19, 18},     {-34, 20},   {-188, 21},   {23, 22},     {-33, -173}, {25, 24},
+            {-19, 26},    {28, 27},    {30, 29},     {32, 31},     {-35, -172}, {34, 33},
+            {36, 35},     {-3, -50},   {38, 37},     {-203, 39},   {-187, 40},  {-157, 41},
+            {-49, 42},    {44, 43},    {-171, 45},   {-51, 46},    {48, 47},    {-156, 49},
+            {51, 50},     {53, 52},    {-20, 54},    {-66, 55},    {-36, 56},   {58, 57},
+            {60, 59},     {-141, 61},  {-52, 62},    {-155, 63},   {65, 64},    {-67, 66},
+            {68, 67},     {-65, 69},   {71, 70},     {-140, 72},   {-202, 73},  {-186, 74},
+            {-4, 75},     {-170, 76},  {-82, 77},    {-68, 78},    {80, 79},    {-154, 81},
+            {83, 82},     {85, 84},    {-125, -139}, {87, 86},     {-86, 88},   {-121, 89},
+            {91, 90},     {93, 92},    {-53, 94},    {-37, -101},  {-21, -83},  {96, 95},
+            {-81, -124},  {98, 97},    {100, 99},    {-69, -98},   {102, 101},  {-106, -138},
+            {104, 103},   {-136, 105}, {-109, 106},  {-84, 107},   {109, 108},  {-102, -120},
+            {111, 110},   {-116, 112}, {-105, 113},  {-123, 114},  {-91, 115},  {-99, 116},
+            {-169, -185}, {-97, -153}, {-108, 117},  {-85, -137},  {-131, 118}, {-201, 119},
+            {-87, -114},  {-5, -76},   {-122, 120},  {-104, -117}, {-93, 121},  {-61, -71},
+            {-146, 122},  {-103, 123}, {-100, 124},  {-90, 125},   {-118, 126}, {-115, 127},
+            {-70, -113},  {-132, 128}, {-38, -130},  {-75, 129},   {-22, -107}, {-89, 130},
+            {-54, 131},   {-92, -119}, {-147, 132},  {-133, 133},  {-77, -151}, {-162, 134},
+            {136, 135},   {-45, -152}, {-135, -200}, {-168, 137},  {-60, -148}, {-88, -161},
+            {-184, 138},  {-59, -74},  {-129, 139},  {-72, 140},   {-6, 141},   {-163, 142},
+            {-44, -56},   {-55, 143},  {-145, -178}, {-23, 144},   {146, 145},  {-29, 147},
+            {-39, -166},  {-150, 148}, {-167, -177}, {-7, -41},    {-134, 149}, {-183, 150},
+            {-199, 151},  {-40, 152},  {-165, 153},  {-24, -73},   {-57, 154},  {-149, -193},
+            {-181, 155},  {157, 156},  {-182, 158},  {-42, 159},   {-8, 160},   {-26, 161},
+            {-164, 162},  {-25, -198}, {-27, -180},  {-58, 163},   {-196, 164}, {-195, 165},
+            {-10, -197},  {-11, -43},  {-12, 166},   {-9, -179},   {-13, 167},  {-28, -194}}},
+          {{{-1, 1},
+            {-52, 2},
+            {4, 3},
+            {-2, 5},
+            {-17, 6},
+            {-18, 7},
+            {-36, -51},
+            {9, 8},
+            {11, 10},
+            {-34, -35},
+            {-19, 12},
+            {-3, -33},
+            {-20, 13},
+            {-50, 14},
+            {-4, -49}},
+           {{2, 1},    {-103, 3},  {-1, 4},     {6, 5},     {8, 7},     {-2, 9},     {-17, -18},
+            {-87, 10}, {-102, 11}, {13, 12},    {15, 14},   {-86, 16},  {-34, 17},   {19, 18},
+            {-19, 20}, {-33, 21},  {-35, 22},   {-71, 23},  {-3, 24},   {-70, -101}, {-85, 25},
+            {27, 26},  {-50, 28},  {30, 29},    {-20, 31},  {-69, 32},  {-51, 33},   {-36, -55},
+            {35, 34},  {-49, 36},  {-54, -100}, {-4, 37},   {-52, -84}, {39, 38},    {-53, -68},
+            {-66, 40}, {-21, 41},  {-67, 42},   {-37, -39}, {-65, 43},  {-38, -99},  {-5, 44},
+            {-83, 45}, {-22, -82}, {-98, 46},   {-23, -81}, {-6, 47},   {-7, -97}},
+           {{2, 1},      {4, 3},       {-154, 5},   {7, 6},     {-1, 8},     {10, 9},
+            {-18, 11},   {-2, -17},    {13, 12},    {-138, 14}, {-153, 15},  {17, 16},
+            {19, 18},    {-137, 20},   {-34, 21},   {23, 22},   {-19, 24},   {26, 25},
+            {28, 27},    {-33, -122},  {-35, 29},   {-3, 30},   {-152, 31},  {-121, 32},
+            {-136, 33},  {35, 34},     {37, 36},    {39, 38},   {-50, -120}, {41, 40},
+            {43, 42},    {-20, -51},   {45, 44},    {-36, 46},  {48, 47},    {-106, 49},
+            {-52, 50},   {-105, 51},   {-49, -103}, {53, 52},   {-151, 54},  {-104, -135},
+            {-4, 55},    {-68, 56},    {-119, 57},  {-53, 58},  {60, 59},    {-66, 61},
+            {-67, 62},   {-88, 63},    {-69, 64},   {-21, 65},  {-37, 66},   {-118, 67},
+            {-87, 68},   {-90, 69},    {-83, 70},   {-89, 71},  {-86, -102}, {-65, 72},
+            {-150, 73},  {-38, 74},    {-84, -134}, {76, 75},   {-5, 77},    {-54, -73},
+            {79, 78},    {-82, -85},   {-133, 80},  {-72, 81},  {-70, 82},   {-22, -71},
+            {-98, 83},   {-117, 84},   {-74, 85},   {-23, -99}, {-101, 86},  {-39, -149},
+            {-81, -100}, {-148, 87},   {-6, -58},   {-55, 88},  {-57, 89},   {91, 90},
+            {-56, -132}, {-116, 92},   {-24, 93},   {-114, 94}, {-40, -115}, {-97, 95},
+            {-7, -42},   {-131, -147}, {-41, 96},   {-8, -113}, {-25, 97},   {-26, -130},
+            {-9, -146},  {-129, 98},   {-10, -145}},
+           {{2, 1},       {4, 3},       {-205, 5},    {7, 6},       {9, 8},       {-1, 10},
+            {12, 11},     {-18, 13},    {-17, 14},    {-2, 15},     {-189, 16},   {-204, 17},
+            {19, 18},     {-188, 20},   {22, 21},     {24, 23},     {-34, 25},    {27, 26},
+            {-19, 28},    {30, 29},     {-35, 31},    {-173, 32},   {-33, 33},    {35, 34},
+            {-172, 36},   {-203, 37},   {-3, 38},     {-187, 39},   {41, 40},     {-171, 42},
+            {44, 43},     {-50, 45},    {47, 46},     {-51, 48},    {-20, 49},    {51, 50},
+            {-36, 52},    {-52, 53},    {55, 54},     {57, 56},     {-157, 58},   {60, 59},
+            {-156, 61},   {-155, 62},   {-49, 63},    {-202, 64},   {-154, 65},   {-170, 66},
+            {-186, 67},   {69, 68},     {-4, 70},     {-86, 71},    {73, 72},     {-66, 74},
+            {-67, 75},    {-68, 76},    {-69, 77},    {79, 78},     {-53, 80},    {82, 81},
+            {-21, -37},   {84, 83},     {-120, 85},   {-137, 86},   {-141, 87},   {-121, 88},
+            {-140, 89},   {-138, 90},   {-136, -139}, {92, 91},     {-153, 93},   {95, 94},
+            {-65, -201},  {-169, 96},   {-101, 97},   {-103, -185}, {99, 98},     {101, 100},
+            {-82, 102},   {-102, 103},  {-5, 104},    {-85, 105},   {-83, -84},   {-71, 106},
+            {108, 107},   {-70, -87},   {-106, 109},  {-22, 110},   {-38, 111},   {-54, 112},
+            {114, 113},   {-105, 115},  {-123, 116},  {-124, -151}, {-125, 117},  {-104, 118},
+            {-122, -135}, {120, 119},   {-119, 121},  {-116, 122},  {-152, 123},  {-184, -200},
+            {-168, 124},  {-81, 125},   {-117, 126},  {128, 127},   {-56, -98},   {-118, 129},
+            {-100, 130},  {-99, 131},   {-6, -91},    {-72, 132},   {-90, 133},   {-23, -39},
+            {-166, 134},  {-88, 135},   {137, 136},   {-55, 138},   {-89, -150},  {-107, 139},
+            {-109, 140},  {142, 141},   {-108, -131}, {-199, 143},  {-41, -132},  {-134, 144},
+            {-97, 145},   {-57, -183},  {147, 146},   {-76, -167},  {-114, -133}, {-73, 148},
+            {150, 149},   {-115, 151},  {-40, -75},   {-24, 152},   {-7, -165},   {-74, -181},
+            {-92, 153},   {-93, 154},   {-146, -182}, {-26, -147},  {-198, 155},  {-149, 156},
+            {-42, -58},   {158, 157},   {-130, -148}, {-61, -113},  {-196, 159},  {-60, -180},
+            {-164, 160},  {-8, -25},    {-27, 161},   {-59, -77},   {-163, 162},  {-162, 163},
+            {-195, -197}, {-43, 164},   {-44, -179},  {-11, -45},   {-9, -129},   {-28, 165},
+            {-178, 166},  {-145, -194}, {-29, -161},  {-10, -12},   {-177, 167},  {-13, -193}}}},
+         {{{{2, 1},
+            {-1, -52},
+            {-17, 3},
+            {5, 4},
+            {-36, 6},
+            {-18, 7},
+            {-2, 8},
+            {-33, 9},
+            {-20, 10},
+            {-34, -51},
+            {-35, 11},
+            {-49, 12},
+            {-19, 13},
+            {-3, 14},
+            {-4, -50}},
+           {{2, 1},      {4, 3},     {-103, 5},  {-1, 6},    {-17, 7},  {-87, 8},  {10, 9},
+            {-18, 11},   {13, 12},   {-2, -33},  {-71, 14},  {16, 15},  {-34, 17}, {-102, 18},
+            {-86, 19},   {-55, 20},  {-49, -50}, {22, 21},   {24, 23},  {-70, 25}, {-19, 26},
+            {-39, 27},   {-65, -66}, {-35, 28},  {30, 29},   {-54, 31}, {-3, 32},  {-51, 33},
+            {-85, -101}, {-23, -81}, {-82, 34},  {-38, 35},  {-69, 36}, {-67, 37}, {-20, -53},
+            {-36, 38},   {-97, 39},  {-52, 40},  {-4, -100}, {-84, 41}, {-68, 42}, {-21, 43},
+            {-37, 44},   {-5, 45},   {-83, -99}, {-22, 46},  {-98, 47}, {-6, -7}},
+           {{2, 1},      {4, 3},      {-154, 5},   {7, 6},      {-1, 8},     {-17, 9},
+            {-138, 10},  {12, 11},    {14, 13},    {-18, 15},   {17, 16},    {-122, 18},
+            {-33, 19},   {21, 20},    {-2, -34},   {23, 22},    {-153, 24},  {-106, 25},
+            {-137, 26},  {28, 27},    {-49, 29},   {-50, 30},   {32, 31},    {-121, 33},
+            {-90, 34},   {36, 35},    {-19, -66},  {38, 37},    {-65, 39},   {41, 40},
+            {-35, 42},   {-105, 43},  {45, 44},    {-51, -74},  {-82, 46},   {-3, 47},
+            {49, 48},    {-81, -152}, {-58, 50},   {-89, -98},  {-136, 51},  {53, 52},
+            {-73, 54},   {-67, -120}, {56, 55},    {-83, 57},   {-97, 58},   {-104, 59},
+            {-42, 60},   {-88, 61},   {-114, 62},  {-20, 63},   {-57, -113}, {-36, 64},
+            {-99, 65},   {-52, -68},  {67, 66},    {-72, 68},   {-130, 69},  {-26, 70},
+            {-41, -103}, {-4, -151},  {-135, 71},  {-84, -129}, {-119, 72},  {-115, 73},
+            {-56, 74},   {-87, 75},   {-53, -145}, {-100, 76},  {-21, 77},   {-37, 78},
+            {-69, -71},  {-118, 79},  {81, 80},    {-85, -150}, {-5, -102},  {-134, 82},
+            {-86, 83},   {-38, 84},   {-22, 85},   {-54, 86},   {-133, 87},  {-70, 88},
+            {-149, 89},  {-6, -117},  {-101, 90},  {-23, 91},   {-39, 92},   {-55, -148},
+            {-132, 93},  {-116, 94},  {-7, 95},    {-24, -40},  {-147, 96},  {-8, -131},
+            {-25, 97},   {-9, 98},    {-10, -146}},
+           {{2, 1},       {4, 3},       {6, 5},       {8, 7},       {-205, 9},    {-1, 10},
+            {-17, 11},    {13, 12},     {-189, 14},   {16, 15},     {-18, 17},    {19, 18},
+            {-173, 20},   {22, 21},     {-33, 23},    {-34, 24},    {-2, 25},     {27, 26},
+            {-204, 28},   {-157, 29},   {31, 30},     {-188, 32},   {-49, -50},   {34, 33},
+            {36, 35},     {-172, 37},   {-141, 38},   {40, 39},     {42, 41},     {-65, -66},
+            {44, 43},     {-19, 45},    {47, 46},     {-156, 48},   {-35, 49},    {51, 50},
+            {-125, 52},   {54, 53},     {-82, 55},    {-81, 56},    {-51, 57},    {59, 58},
+            {-140, 60},   {-3, 61},     {-203, 62},   {64, 63},     {-109, -187}, {66, 65},
+            {-98, 67},    {-67, 68},    {-171, 69},   {-97, 70},    {72, 71},     {-124, 73},
+            {75, 74},     {-93, 76},    {-155, 77},   {79, 78},     {-61, -83},   {-114, 80},
+            {82, 81},     {84, 83},     {-113, -146}, {-20, 85},    {-36, -108},  {-76, 86},
+            {88, 87},     {-77, -139},  {-52, 89},    {-99, 90},    {-131, 91},   {-130, 92},
+            {-45, 93},    {95, 94},     {-91, -129},  {-68, 96},    {-92, -161},  {-123, 97},
+            {-162, 98},   {-202, 99},   {-170, 100},  {-60, 101},   {-116, 102},  {-4, -145},
+            {-115, -186}, {104, 103},   {-107, -154}, {-84, 105},   {-29, -147},  {107, 106},
+            {-106, 108},  {-75, -177},  {-178, 109},  {111, 110},   {-132, -138}, {-100, 112},
+            {-21, 113},   {-37, 114},   {-44, -101},  {-193, 115},  {-90, 116},   {-53, -69},
+            {-122, -163}, {118, 117},   {-121, 119},  {-59, -117},  {-148, 120},  {-201, 121},
+            {-85, -185},  {123, 122},   {-74, 124},   {-153, -169}, {-5, 125},    {-86, -105},
+            {127, 126},   {-133, -137}, {129, 128},   {-22, -136},  {-102, 130},  {-38, 131},
+            {-54, 132},   {-89, -120},  {-118, 133},  {-70, -71},   {135, 134},   {-104, 136},
+            {-168, -200}, {-6, 137},    {-152, -184}, {-87, 138},   {140, 139},   {-103, 141},
+            {-39, 142},   {-135, 143},  {-151, 144},  {-55, 145},   {-23, 146},   {-119, 147},
+            {-56, -72},   {-88, 148},   {-167, -183}, {-7, -199},   {150, 149},   {-166, 151},
+            {-24, -150},  {-40, 152},   {154, 153},   {-134, 155},  {-41, 156},   {-198, 157},
+            {-57, -182},  {-8, 158},    {-73, -197},  {-9, -181},   {-165, 159},  {-149, 160},
+            {-25, 161},   {-26, -180},  {-164, 162},  {-58, 163},   {-42, -196},  {165, 164},
+            {-10, -195},  {-27, -43},   {-179, 166},  {-28, -194},  {-11, 167},   {-12, -13}}},
+          {{{2, 1},
+            {-1, -52},
+            {-17, 3},
+            {5, 4},
+            {-36, 6},
+            {-18, 7},
+            {-2, 8},
+            {-33, 9},
+            {-20, 10},
+            {-34, -51},
+            {-35, 11},
+            {-49, 12},
+            {-19, 13},
+            {-3, 14},
+            {-4, -50}},
+           {{2, 1},      {4, 3},     {-103, 5},  {-1, 6},    {-17, 7},  {-87, 8},  {10, 9},
+            {-18, 11},   {13, 12},   {-2, -33},  {-71, 14},  {16, 15},  {-34, 17}, {-102, 18},
+            {-86, 19},   {-55, 20},  {-49, -50}, {22, 21},   {24, 23},  {-70, 25}, {-19, 26},
+            {-39, 27},   {-65, -66}, {-35, 28},  {30, 29},   {-54, 31}, {-3, 32},  {-51, 33},
+            {-85, -101}, {-23, -81}, {-82, 34},  {-38, 35},  {-69, 36}, {-67, 37}, {-20, -53},
+            {-36, 38},   {-97, 39},  {-52, 40},  {-4, -100}, {-84, 41}, {-68, 42}, {-21, 43},
+            {-37, 44},   {-5, 45},   {-83, -99}, {-22, 46},  {-98, 47}, {-6, -7}},
+           {{2, 1},      {4, 3},      {-154, 5},   {7, 6},      {-1, 8},     {-17, 9},
+            {-138, 10},  {12, 11},    {14, 13},    {-18, 15},   {17, 16},    {-122, 18},
+            {-33, 19},   {21, 20},    {-2, -34},   {23, 22},    {-153, 24},  {-106, 25},
+            {-137, 26},  {28, 27},    {-49, 29},   {-50, 30},   {32, 31},    {-121, 33},
+            {-90, 34},   {36, 35},    {-19, -66},  {38, 37},    {-65, 39},   {41, 40},
+            {-35, 42},   {-105, 43},  {45, 44},    {-51, -74},  {-82, 46},   {-3, 47},
+            {49, 48},    {-81, -152}, {-58, 50},   {-89, -98},  {-136, 51},  {53, 52},
+            {-73, 54},   {-67, -120}, {56, 55},    {-83, 57},   {-97, 58},   {-104, 59},
+            {-42, 60},   {-88, 61},   {-114, 62},  {-20, 63},   {-57, -113}, {-36, 64},
+            {-99, 65},   {-52, -68},  {67, 66},    {-72, 68},   {-130, 69},  {-26, 70},
+            {-41, -103}, {-4, -151},  {-135, 71},  {-84, -129}, {-119, 72},  {-115, 73},
+            {-56, 74},   {-87, 75},   {-53, -145}, {-100, 76},  {-21, 77},   {-37, 78},
+            {-69, -71},  {-118, 79},  {81, 80},    {-85, -150}, {-5, -102},  {-134, 82},
+            {-86, 83},   {-38, 84},   {-22, 85},   {-54, 86},   {-133, 87},  {-70, 88},
+            {-149, 89},  {-6, -117},  {-101, 90},  {-23, 91},   {-39, 92},   {-55, -148},
+            {-132, 93},  {-116, 94},  {-7, 95},    {-24, -40},  {-147, 96},  {-8, -131},
+            {-25, 97},   {-9, 98},    {-10, -146}},
+           {{2, 1},       {4, 3},       {6, 5},       {8, 7},       {-205, 9},
+            {-1, 10},     {-17, 11},    {13, 12},     {-189, 14},   {16, 15},
+            {-18, 17},    {19, 18},     {-173, 20},   {22, 21},     {-33, 23},
+            {-34, 24},    {-2, 25},     {27, 26},     {-204, 28},   {-157, 29},
+            {31, 30},     {-188, 32},   {-49, -50},   {34, 33},     {36, 35},
+            {-172, 37},   {-141, 38},   {40, 39},     {42, 41},     {-65, -66},
+            {44, 43},     {-19, 45},    {47, 46},     {-156, 48},   {-35, 49},
+            {51, 50},     {-125, 52},   {54, 53},     {-82, 55},    {-81, 56},
+            {-51, 57},    {59, 58},     {-140, 60},   {-3, 61},     {-203, 62},
+            {64, 63},     {-109, -187}, {66, 65},     {-98, 67},    {-67, 68},
+            {-171, 69},   {-97, 70},    {72, 71},     {-124, 73},   {75, 74},
+            {-93, 76},    {-155, 77},   {79, 78},     {-61, -83},   {-114, 80},
+            {82, 81},     {84, 83},     {-113, -146}, {-20, 85},    {-36, -108},
+            {-76, 86},    {88, 87},     {-77, -139},  {-52, 89},    {-99, 90},
+            {-131, 91},   {-130, 92},   {-45, 93},    {95, 94},     {-91, -129},
+            {-68, 96},    {-92, -161},  {-123, 97},   {-162, 98},   {-202, 99},
+            {-170, 100},  {-60, 101},   {-116, 102},  {-4, -145},   {-115, -186},
+            {104, 103},   {-107, -154}, {-84, 105},   {-29, -147},  {107, 106},
+            {-106, 108},  {-75, -177},  {-178, 109},  {111, 110},   {-132, -138},
+            {-100, 112},  {-21, 113},   {-37, 114},   {-44, -101},  {-193, 115},
+            {-90, 116},   {-53, -69},   {-122, -163}, {118, 117},   {-121, 119},
+            {-59, -117},  {-148, 120},  {-201, 121},  {-85, -185},  {123, 122},
+            {-74, 124},   {-153, -169}, {-5, 125},    {-86, -105},  {127, 126},
+            {-133, -137}, {129, 128},   {-22, -136},  {-102, 130},  {-38, 131},
+            {-54, 132},   {-89, -120},  {-118, 133},  {-70, -71},   {135, 134},
+            {-104, 136},  {-168, -200}, {-6, 137},    {-152, -184}, {-87, 138},
+            {140, 139},   {-103, 141},  {-39, 142},   {-135, 143},  {-151, 144},
+            {-55, 145},   {-23, 146},   {-119, 147},  {-56, -72},   {-88, 148},
+            {-167, -183}, {-7, -199},   {150, 149},   {-166, 151},  {-24, -150},
+            {-40, 152},   {154, 153},   {-134, 155},  {-41, 156},   {-198, 157},
+            {-57, -182},  {-8, 158},    {-73, -197},  {-9, -181},   {-165, 159},
+            {-149, 160},  {-25, 161},   {-26, -180},  {-164, 162},  {-58, 163},
+            {-42, -196},  {165, 164},   {-10, -195},  {-27, -43},   {-179, 166},
+            {-28, -194},  {-11, 167},   {-12, -13}}}}}}; /* END OF
+                                                            ia_mps_dec_huff_nodes_table_struct */
diff --git a/decoder/ixheaacd_mps_smoothing.c b/decoder/ixheaacd_mps_smoothing.c
index f4917a4..875f389 100644
--- a/decoder/ixheaacd_mps_smoothing.c
+++ b/decoder/ixheaacd_mps_smoothing.c
@@ -17,33 +17,56 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
-#include <math.h>
-#include <stdlib.h>
 #include "ixheaacd_type_def.h"
 #include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_mps_polyphase.h"
-#include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_constants.h"
 #include "ixheaacd_basic_ops32.h"
 #include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_error_standards.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_smoothing.h"
+#include "ixheaacd_mps_tonality.h"
+#ifndef MULT
+#define MULT(a, b) (a * b)
+#endif
+#define ONE_BY_128_IN_Q30 (8388608)
+#define ONE_IN_Q30 (1073741824)
+#define PI_IN_Q27 (421657440)
+#define FIFTY_X_PI_BY_180_Q27 (117127067)
+#define TWENTY_FIVE_X_PI_BY_180_Q27 (58563533)
+#define Q28_VALUE (1 << 28)
+#define Q28_FLOAT_VAL ((FLOAT32)(1 << 28))
+#define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL)
 
 VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing(
     ia_mps_dec_state_struct *self) {
-  int smooth_band;
-  int delta, one_minus_delta;
-
-  int ps = 0, pb, row, col;
-  int res_bands = 0;
-  int *p_smoothing_data;
+  WORD32 smooth_band;
+  FLOAT32 delta, one_minus_delta;
+  WORD32 ps = 0, pb, row, col;
+  WORD32 res_bands = 0;
+  WORD32 *p_smoothing_data;
 
   if (self->residual_coding) res_bands = self->max_res_bands;
 
   p_smoothing_data = &self->smoothing_data[ps][res_bands];
 
   delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps];
-  one_minus_delta = 1073741824 - delta;
+  one_minus_delta = 1.0f - delta;
 
   for (pb = res_bands; pb < self->bs_param_bands; pb++) {
     smooth_band = *p_smoothing_data++;
@@ -51,43 +74,32 @@
       for (row = 0; row < MAX_M_OUTPUT; row++) {
         for (col = 0; col < MAX_M_INPUT; col++) {
           self->m1_param_re[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m1_param_re[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m1_param_re_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m1_param_re[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m1_param_re_prev[pb][row][col]));
           self->m1_param_im[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m1_param_im[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m1_param_im_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m1_param_im[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m1_param_im_prev[pb][row][col]));
           self->m2_decor_re[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m2_decor_re[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m2_decor_re_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m2_decor_re[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m2_decor_re_prev[pb][row][col]));
           self->m2_decor_im[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m2_decor_im[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m2_decor_im_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m2_decor_im[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m2_decor_im_prev[pb][row][col]));
           self->m2_resid_re[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m2_resid_re[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m2_resid_re_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m2_resid_re[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m2_resid_re_prev[pb][row][col]));
           self->m2_resid_im[ps][pb][row][col] =
-              (ixheaacd_mult32(delta, self->m2_resid_im[ps][pb][row][col]) +
-               ixheaacd_mult32(one_minus_delta,
-                               self->m2_resid_im_prev[pb][row][col]))
-              << 2;
+              (MULT(delta, self->m2_resid_im[ps][pb][row][col]) +
+               MULT(one_minus_delta, self->m2_resid_im_prev[pb][row][col]));
         }
       }
+      self->pre_mix_req++;
     }
   }
 
   for (ps = 1; ps < self->num_parameter_sets; ps++) {
     delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps];
-    one_minus_delta = 1073741824 - delta;
+    one_minus_delta = 1.0f - delta;
 
     p_smoothing_data = &self->smoothing_data[ps][res_bands];
 
@@ -97,63 +109,56 @@
         for (row = 0; row < MAX_M_OUTPUT; row++) {
           for (col = 0; col < MAX_M_INPUT; col++) {
             self->m1_param_re[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m1_param_re[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m1_param_re[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m1_param_re[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m1_param_re[ps - 1][pb][row][col]));
             self->m1_param_im[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m1_param_im[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m1_param_im[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m1_param_im[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m1_param_im[ps - 1][pb][row][col]));
             self->m2_resid_re[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m2_resid_re[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m2_resid_re[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m2_resid_re[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m2_resid_re[ps - 1][pb][row][col]));
             self->m2_decor_re[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m2_decor_re[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m2_decor_re[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m2_decor_re[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m2_decor_re[ps - 1][pb][row][col]));
             self->m2_decor_im[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m2_decor_im[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m2_decor_im[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m2_decor_im[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m2_decor_im[ps - 1][pb][row][col]));
             self->m2_resid_im[ps][pb][row][col] =
-                (ixheaacd_mult32(delta, self->m2_resid_im[ps][pb][row][col]) +
-                 ixheaacd_mult32(one_minus_delta,
-                                 self->m2_resid_im[ps - 1][pb][row][col]))
-                << 2;
+                (MULT(delta, self->m2_resid_im[ps][pb][row][col]) +
+                 MULT(one_minus_delta,
+                      self->m2_resid_im[ps - 1][pb][row][col]));
           }
         }
+        self->pre_mix_req++;
       }
     }
   }
 }
 
-#define ONE_BY_128_IN_Q30 (8388608)
-#define ONE_IN_Q30 (1073741824)
-#define PI_IN_Q27 (421657440)
-#define FIFTY_X_PI_BY_180_Q27 (117127067)
-#define TWENTY_FIVE_X_PI_BY_180_Q27 (58563533)
-
 VOID ixheaacd_mps_smoothing_opd(ia_mps_dec_state_struct *self) {
-  int ps, pb;
-  int delta, one_minus_delta;
+  WORD32 ps, pb;
+  WORD32 delta, one_minus_delta;
 
   if (self->opd_smoothing_mode == 0) {
     for (pb = 0; pb < self->bs_param_bands; pb++) {
       self->opd_smooth.smooth_l_phase[pb] =
-          self->phase_l_fix[self->num_parameter_sets - 1][pb] >> 1;
+          ((WORD32)(self->phase_l[self->num_parameter_sets - 1][pb] *
+                    Q28_VALUE)) >>
+          1;
       self->opd_smooth.smooth_r_phase[pb] =
-          self->phase_r_fix[self->num_parameter_sets - 1][pb] >> 1;
+          ((WORD32)(self->phase_r[self->num_parameter_sets - 1][pb] *
+                    Q28_VALUE)) >>
+          1;
     }
     return;
   }
   for (ps = 0; ps < self->num_parameter_sets; ps++) {
-    int thr = self->bs_frame.ipd_data.bs_quant_coarse_xxx[ps]
+    WORD32 thr = self->bs_frame.ipd_data.bs_quant_coarse_xxx[ps]
                   ? FIFTY_X_PI_BY_180_Q27
                   : TWENTY_FIVE_X_PI_BY_180_Q27;
 
@@ -161,10 +166,9 @@
     one_minus_delta = ONE_IN_Q30 - delta;
 
     for (pb = 0; pb < self->bs_param_bands; pb++) {
-      int ltemp, rtemp, tmp;
-
-      ltemp = self->phase_l_fix[ps][pb] >> 1;
-      rtemp = self->phase_r_fix[ps][pb] >> 1;
+      WORD32 ltemp, rtemp, tmp;
+      ltemp = ((WORD32)(self->phase_l[ps][pb] * Q28_FLOAT_VAL)) >> 1;
+      rtemp = ((WORD32)(self->phase_r[ps][pb] * Q28_FLOAT_VAL)) >> 1;
 
       while (ltemp > self->opd_smooth.smooth_l_phase[pb] + PI_IN_Q27)
         ltemp -= 2 * PI_IN_Q27;
@@ -205,8 +209,515 @@
       while (self->opd_smooth.smooth_r_phase[pb] < 0)
         self->opd_smooth.smooth_r_phase[pb] += 2 * PI_IN_Q27;
 
-      self->phase_l_fix[ps][pb] = self->opd_smooth.smooth_l_phase[pb] << 1;
-      self->phase_r_fix[ps][pb] = self->opd_smooth.smooth_r_phase[pb] << 1;
+      self->phase_l[ps][pb] =
+          (self->opd_smooth.smooth_l_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL;
+      self->phase_r[ps][pb] =
+          (self->opd_smooth.smooth_r_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL;
     }
   }
 }
+
+static VOID ixheaacd_calc_filter_coeff(
+    ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps, WORD32 *delta) {
+  WORD32 d_slots;
+  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
+  WORD32 *smg_time = pstr_mps_state->aux_struct->smg_time;
+
+  if (ps == 0)
+    d_slots = param_slot[ps] + 1;
+  else
+    d_slots = param_slot[ps] - param_slot[ps - 1];
+
+  if (pstr_mps_state->smooth_control) {
+    switch (smg_time[ps]) {
+      case SMG_TIME_64:
+        *delta = d_slots << 9;
+        break;
+      case SMG_TIME_128:
+        *delta = d_slots << 8;
+        break;
+      case SMG_TIME_256:
+        *delta = d_slots << 7;
+        break;
+      case SMG_TIME_512:
+        *delta = d_slots << 6;
+        break;
+      default:
+        break;
+    }
+  } else {
+    *delta = d_slots << 7;
+  }
+
+  return;
+}
+
+VOID ixheaacd_smooth_m1m2(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
+  ia_mps_persistent_mem *persistent_mem = &curr_state->mps_persistent_mem;
+  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
+  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
+  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
+  WORD32 *m1_param_real_prev = persistent_mem->m1_param_real_prev;
+  WORD32 *m2_decor_real_prev = persistent_mem->m2_decor_real_prev;
+  WORD32 *m2_resid_real_prev = persistent_mem->m2_resid_real_prev;
+
+  WORD32 num_parameter_bands = curr_state->num_parameter_bands;
+  WORD32 num_direct_signals = curr_state->num_direct_signals;
+  WORD32 num_decor_signals = curr_state->num_decor_signals;
+  WORD32 m1_param_imag_present = curr_state->m1_param_imag_present;
+  WORD32 m2_param_imag_present = curr_state->m2_param_imag_present;
+  WORD32 col_counter = num_direct_signals + num_decor_signals;
+  WORD32 num_parameter_sets = curr_state->num_parameter_sets;
+  WORD32 num_output_channels = curr_state->num_output_channels;
+  WORD32 num_v_channels = curr_state->num_v_channels;
+  WORD32 num_x_channels = curr_state->num_x_channels;
+  WORD32 smooth_control = curr_state->smooth_control;
+  WORD32 smooth_config = curr_state->smooth_config;
+  WORD32 resid_col_counter;
+  WORD32 smooth_band_arr[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
+
+  WORD32 *delta, *one_minus_delta, *delta_ptr, *one_minus_delta_ptr;
+  WORD32 *param_r, *param_i, *param_prev_r, *param_prev_i;
+
+  WORD32 *ton;
+  WORD32 i, ps, pb, row, col;
+  WORD32 res_bands = 0;
+  WORD32 idx = 0;
+
+  WORD32 *m2_decor_imag_prev = persistent_mem->m2_decor_imag_prev;
+  WORD32 *m2_resid_imag_prev = persistent_mem->m2_resid_imag_prev;
+  WORD32 *m1_param_imag_prev = persistent_mem->m1_param_imag_prev;
+
+  ton = pstr_mps_state->mps_scratch_mem_v;
+  delta = delta_ptr = ton + MAX_PARAMETER_BANDS;
+  one_minus_delta = one_minus_delta_ptr = delta + MAX_PARAMETER_SETS;
+
+  param_r = curr_state->res_bands;
+  if (curr_state->residual_coding) {
+    for (i = 0; i < MAX_RESIDUAL_CHANNELS_MPS; i++) {
+      if (param_r[i] > res_bands) {
+        res_bands = param_r[i];
+      }
+    }
+  }
+
+  if (curr_state->arbitrary_downmix == 2) {
+    if (res_bands < curr_state->arbdmx_residual_bands) {
+      res_bands = curr_state->arbdmx_residual_bands;
+    }
+  }
+
+  if (smooth_config) {
+    ixheaacd_measure_tonality(pstr_mps_state, ton);
+  }
+
+  for (ps = 0; ps < num_parameter_sets; ps++) {
+    ixheaacd_calc_filter_coeff(pstr_mps_state, ps, delta);
+    *one_minus_delta++ = (1 << 15) - *delta++;
+  }
+
+  if (smooth_control) {
+    for (ps = 0; ps < num_parameter_sets; ps++) {
+      if (ps < 8) {
+        for (pb = 0; pb < num_parameter_bands; pb++) {
+          smooth_band_arr[ps][pb] = pstr_mps_state->aux_struct->smg_data[ps][pb];
+        }
+      }
+    }
+  } else if (smooth_config) {
+    for (ps = 0; ps < num_parameter_sets; ps++) {
+      for (pb = 0; pb < num_parameter_bands; pb++) {
+        smooth_band_arr[ps][pb] = (ton[pb] > POINT_EIGHT_Q15);
+      }
+    }
+  }
+
+  if (!(smooth_control == 0 && smooth_config == 0)) {
+    if (m1_param_imag_present) {
+      WORD32 *ptr_r1 = &m1_param->m1_param_real[0][0][0][0];
+      WORD32 *ptr_i1 = &m1_param->m1_param_imag[0][0][0][0];
+      for (row = 0; row < num_v_channels; row++) {
+        WORD32 *ptr_r2 = ptr_r1;
+        WORD32 *ptr_i2 = ptr_i1;
+        for (col = 0; col < num_x_channels; col++) {
+          param_r = ptr_r2;
+          param_i = ptr_i2;
+          m1_param_real_prev += res_bands;
+          m1_param_imag_prev += res_bands;
+
+          for (pb = res_bands; pb < num_parameter_bands; pb++) {
+            if (smooth_band_arr[0][pb]) {
+              WORD64 acc;
+
+              acc = (WORD64)((WORD64)param_r[pb] * (WORD64)(*delta_ptr) +
+                             (WORD64)(*m1_param_real_prev) *
+                                 (WORD64)(*one_minus_delta_ptr));
+
+              acc >>= 15;
+
+              param_r[pb] = (WORD32)acc;
+
+              acc = (WORD64)((WORD64)param_i[pb] * (WORD64)(*delta_ptr) +
+                             (WORD64)(*m1_param_imag_prev) *
+                                 (WORD64)(*one_minus_delta_ptr));
+
+              acc >>= 15;
+
+              param_i[pb] = (WORD32)acc;
+            }
+            m1_param_real_prev++;
+            m1_param_imag_prev++;
+          }
+          param_r += MAX_PARAMETER_BANDS;
+          param_i += MAX_PARAMETER_BANDS;
+
+          for (ps = 1; ps < num_parameter_sets; ps++) {
+            WORD32 del = delta_ptr[ps];
+            WORD32 one_minus_del = one_minus_delta_ptr[ps];
+
+            param_prev_r = param_r - MAX_PARAMETER_BANDS;
+            param_prev_i = param_i - MAX_PARAMETER_BANDS;
+
+            for (pb = res_bands; pb < num_parameter_bands; pb++) {
+              if (smooth_band_arr[ps][pb]) {
+                WORD64 acc;
+
+                acc = (WORD64)((WORD64)param_r[pb] * (WORD64)(del) +
+                               (WORD64)param_prev_r[pb] *
+                                   (WORD64)(one_minus_del));
+
+                acc >>= 15;
+
+                param_r[pb] = (WORD32)acc;
+
+                acc = (WORD64)((WORD64)param_i[pb] * (WORD64)(del) +
+                               (WORD64)param_prev_i[pb] *
+                                   (WORD64)(one_minus_del));
+
+                acc >>= 15;
+
+                param_i[pb] = (WORD32)acc;
+              }
+            }
+            param_r += MAX_PARAMETER_BANDS;
+            param_i += MAX_PARAMETER_BANDS;
+          }
+          ptr_r2 += PBXPS;
+          ptr_i2 += PBXPS;
+        }
+        ptr_r1 += INCHXPBXPS;
+        ptr_i1 += INCHXPBXPS;
+      }
+    } else {
+      WORD32 *ptr1 = (WORD32 *)m1_param;
+
+      for (row = 0; row < num_v_channels; row++) {
+        WORD32 *ptr2 = ptr1;
+
+        for (col = 0; col < num_x_channels; col++) {
+          WORD32 *param_r = ptr2;
+
+          WORD32 del = delta_ptr[0];
+          WORD32 one_minus_del = one_minus_delta_ptr[0];
+
+          m1_param_real_prev += res_bands;
+
+          for (pb = res_bands; pb < num_parameter_bands; pb++) {
+            if (smooth_band_arr[0][pb]) {
+              WORD64 acc;
+
+              acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del)) +
+                    (WORD64)((WORD64)(*m1_param_real_prev) *
+                             (WORD64)(one_minus_del));
+
+              param_r[pb] = (WORD32)(acc >> 15);
+            }
+            m1_param_real_prev++;
+          }
+          param_r += MAX_PARAMETER_BANDS;
+
+          for (ps = 1; ps < num_parameter_sets; ps++) {
+            WORD32 del = delta_ptr[ps];
+            WORD32 one_minus_del = one_minus_delta_ptr[ps];
+
+            param_prev_r = param_r - MAX_PARAMETER_BANDS;
+
+            for (pb = res_bands; pb < num_parameter_bands; pb++) {
+              if (smooth_band_arr[ps][pb]) {
+                WORD64 acc;
+
+                acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del) +
+                      (WORD64)((WORD64)(param_prev_r[pb]) *
+                               (WORD64)one_minus_del);
+
+                param_r[pb] = (WORD32)(acc >> 15);
+              }
+            }
+            param_r += MAX_PARAMETER_BANDS;
+          }
+          ptr2 += PBXPS;
+        }
+        ptr1 += INCHXPBXPS;
+      }
+    }
+
+    if (curr_state->residual_coding)
+      resid_col_counter = col_counter;
+    else
+      resid_col_counter = num_direct_signals;
+
+    idx = 0;
+    if (m2_param_imag_present) {
+      WORD32 *ptr_r1 = &m2_param->m2_resid_real[0][0][0];
+      WORD32 *ptr_i1 = &m2_param->m2_resid_imag[0][0][0];
+      for (row = 0; row < num_output_channels; row++) {
+        for (col = 0; col < resid_col_counter; col++) {
+          if (curr_state->m2_param_present[row][col] & 2) {
+            WORD32 del = *delta_ptr;
+            WORD32 one_minus_del = *one_minus_delta_ptr;
+
+            param_r = ptr_r1;
+            param_i = ptr_i1;
+
+            m2_resid_real_prev += res_bands;
+            m2_resid_imag_prev += res_bands;
+
+            for (pb = res_bands; pb < num_parameter_bands; pb++) {
+              if (smooth_band_arr[0][pb]) {
+                WORD64 acc;
+                acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del) +
+                               (WORD64)(*m2_resid_real_prev) *
+                                   (WORD64)(one_minus_del));
+
+                acc >>= 15;
+                param_r[pb] = (WORD32)acc;
+
+                acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)(del) +
+                               (WORD64)(*m2_resid_imag_prev) *
+                                   (WORD64)(one_minus_del));
+
+                acc >>= 15;
+                param_i[pb] = (WORD32)acc;
+              }
+
+              m2_resid_real_prev++;
+              m2_resid_imag_prev++;
+            }
+
+            param_r += MAX_PARAMETER_BANDS;
+            param_i += MAX_PARAMETER_BANDS;
+
+            for (ps = 1; ps < num_parameter_sets; ps++) {
+              WORD32 del = delta_ptr[ps];
+              WORD32 one_minus_del = one_minus_delta_ptr[ps];
+
+              param_prev_r = param_r - MAX_PARAMETER_BANDS;
+              param_prev_i = param_i - MAX_PARAMETER_BANDS;
+              for (pb = res_bands; pb < num_parameter_bands; pb++) {
+                if (smooth_band_arr[ps][pb]) {
+                  WORD64 acc;
+                  acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del) +
+                                 (WORD64)(param_prev_r[pb]) *
+                                     (WORD64)(one_minus_del));
+
+                  acc >>= 15;
+                  param_r[pb] = (WORD32)acc;
+
+                  acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)(del) +
+                                 (WORD64)(param_prev_i[pb]) *
+                                     (WORD64)(one_minus_del));
+
+                  acc >>= 15;
+                  param_i[pb] = (WORD32)acc;
+                }
+              }
+              param_r += MAX_PARAMETER_BANDS;
+              param_i += MAX_PARAMETER_BANDS;
+            }
+            idx++;
+            ptr_r1 += PBXPS;
+            ptr_i1 += PBXPS;
+          }
+        }
+      }
+
+      idx = 0;
+
+      ptr_r1 = &m2_param->m2_resid_real[0][0][0];
+      ptr_i1 = &m2_param->m2_resid_imag[0][0][0];
+      for (row = 0; row < num_output_channels; row++) {
+        for (col = num_direct_signals; col < col_counter; col++) {
+          if (curr_state->m2_param_present[row][col] & 1) {
+            WORD32 del = *delta_ptr;
+            WORD32 one_minus_del = *one_minus_delta_ptr;
+            m2_decor_real_prev += res_bands;
+            m2_decor_imag_prev += res_bands;
+
+            param_r = ptr_r1;
+            param_i = ptr_i1;
+
+            for (pb = res_bands; pb < num_parameter_bands; pb++) {
+              if (smooth_band_arr[0][pb]) {
+                WORD64 acc;
+                acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del +
+                               (WORD64)(*m2_decor_real_prev) *
+                                   (WORD64)one_minus_del);
+                acc >>= 15;
+                param_r[pb] = (WORD32)acc;
+
+                acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)del +
+                               (WORD64)(*m2_decor_imag_prev) *
+                                   (WORD64)one_minus_del);
+                acc >>= 15;
+                param_i[pb] = (WORD32)acc;
+              }
+              m2_decor_real_prev++;
+              m2_decor_imag_prev++;
+            }
+
+            param_r += MAX_PARAMETER_BANDS;
+            param_i += MAX_PARAMETER_BANDS;
+
+            for (ps = 1; ps < num_parameter_sets; ps++) {
+              WORD32 del = delta_ptr[ps];
+              WORD32 one_minus_del = one_minus_delta_ptr[ps];
+              param_prev_r = param_r - MAX_PARAMETER_BANDS;
+              param_prev_i = param_i - MAX_PARAMETER_BANDS;
+              for (pb = res_bands; pb < num_parameter_bands; pb++) {
+                if (smooth_band_arr[ps][pb]) {
+                  WORD64 acc;
+
+                  acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del +
+                                 (WORD64)(param_prev_r[pb]) *
+                                     (WORD64)one_minus_del);
+                  acc >>= 15;
+                  param_r[pb] = (WORD32)acc;
+
+                  acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)del +
+                                 (WORD64)(param_prev_i[pb]) *
+                                     (WORD64)one_minus_del);
+                  acc >>= 15;
+                  param_i[pb] = (WORD32)acc;
+                }
+              }
+              param_r += MAX_PARAMETER_BANDS;
+              param_i += MAX_PARAMETER_BANDS;
+            }
+
+            idx++;
+            ptr_r1 += PBXPS;
+            ptr_i1 += PBXPS;
+          }
+        }
+      }
+    } else {
+      WORD32 *ptr1 = &m2_param->m2_resid_real[0][0][0];
+
+      for (row = 0; row < num_output_channels; row++) {
+        for (col = 0; col < resid_col_counter; col++) {
+          if (curr_state->m2_param_present[row][col] & 2) {
+            WORD32 *ptr2 = ptr1;
+            WORD32 del = *delta_ptr;
+            WORD32 one_minus_del = *one_minus_delta_ptr;
+            m2_resid_real_prev += res_bands;
+
+            for (pb = res_bands; pb < num_parameter_bands; pb++) {
+              if (smooth_band_arr[0][pb]) {
+                WORD64 acc;
+
+                acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)(del) +
+                               (WORD64)(*m2_resid_real_prev) *
+                                   (WORD64)(one_minus_del));
+
+                acc >>= 15;
+                ptr2[pb] = (WORD32)acc;
+              }
+
+              m2_resid_real_prev++;
+            }
+
+            ptr2 += MAX_PARAMETER_BANDS;
+
+            for (ps = 1; ps < num_parameter_sets; ps++) {
+              WORD32 del = delta_ptr[ps];
+              WORD32 one_minus_del = one_minus_delta_ptr[ps];
+
+              param_prev_r = ptr2 - MAX_PARAMETER_BANDS;
+
+              for (pb = res_bands; pb < num_parameter_bands; pb++) {
+                if (smooth_band_arr[ps][pb]) {
+                  WORD64 acc;
+
+                  acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)(del) +
+                                 (WORD64)(*param_prev_r) *
+                                     (WORD64)(one_minus_del));
+
+                  acc >>= 15;
+                  ptr2[pb] = (WORD32)acc;
+                }
+
+                param_prev_r++;
+              }
+              ptr2 += MAX_PARAMETER_BANDS;
+            }
+            idx++;
+            ptr1 += PBXPS;
+          }
+        }
+      }
+      idx = 0;
+      ptr1 = &m2_param->m2_decor_real[0][0][0];
+
+      for (row = 0; row < num_output_channels; row++) {
+        for (col = num_direct_signals; col < col_counter; col++) {
+          if (curr_state->m2_param_present[row][col] & 1) {
+            WORD32 *ptr2 = ptr1;
+            m2_decor_real_prev += res_bands;
+
+            param_r = &m2_param->m2_decor_real[idx][0][res_bands];
+            for (pb = res_bands; pb < num_parameter_bands; pb++) {
+              if (smooth_band_arr[0][pb]) {
+                WORD64 acc;
+                acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)*delta_ptr +
+                               (WORD64)(*m2_decor_real_prev) *
+                                   (WORD64)*one_minus_delta_ptr);
+                acc >>= 15;
+                ptr2[pb] = (WORD32)acc;
+              }
+              m2_decor_real_prev++;
+            }
+            ptr2 += MAX_PARAMETER_BANDS;
+
+            for (ps = 1; ps < num_parameter_sets; ps++) {
+              WORD32 del = delta_ptr[ps];
+              WORD32 one_minus_del = one_minus_delta_ptr[ps];
+
+              param_prev_r = ptr2 - MAX_PARAMETER_BANDS;
+              for (pb = res_bands; pb < num_parameter_bands; pb++) {
+                if (smooth_band_arr[ps][pb]) {
+                  WORD64 acc;
+
+                  acc =
+                      (WORD64)((WORD64)(ptr2[pb]) * (WORD64)del +
+                               (WORD64)(*param_prev_r) * (WORD64)one_minus_del);
+                  acc >>= 15;
+                  ptr2[pb] = (WORD32)acc;
+                }
+
+                param_prev_r++;
+              }
+
+              ptr2 += MAX_PARAMETER_BANDS;
+            }
+
+            idx++;
+
+            ptr1 += PBXPS;
+          }
+        }
+      }
+    }
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_smoothing.h b/decoder/ixheaacd_mps_smoothing.h
new file mode 100644
index 0000000..718d10a
--- /dev/null
+++ b/decoder/ixheaacd_mps_smoothing.h
@@ -0,0 +1,30 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_SMOOTHING_H
+#define IXHEAACD_MPS_SMOOTHING_H
+
+#define SMG_TIME_64 (64)
+#define SMG_TIME_128 (128)
+#define SMG_TIME_256 (256)
+#define SMG_TIME_512 (512)
+
+VOID ixheaacd_smooth_m1m2(ia_heaac_mps_state_struct *pstr_mps_state);
+
+#endif /* IXHEAACD_MPS_SMOOTHING_H */
diff --git a/decoder/ixheaacd_mps_struct_def.h b/decoder/ixheaacd_mps_struct_def.h
new file mode 100644
index 0000000..e795fef
--- /dev/null
+++ b/decoder/ixheaacd_mps_struct_def.h
@@ -0,0 +1,397 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_STRUCT_DEF_H
+#define IXHEAACD_MPS_STRUCT_DEF_H
+
+typedef struct {
+  const WORD32 *p_filter_ana;
+  const WORD32 *ref_co_eff_ptr_l;
+  const WORD32 *ref_co_eff_ptr_r;
+  WORD32 offset_l;
+  WORD32 offset_r;
+  WORD32 *qmf_states_buffer;
+  WORD16 flag;
+  WORD16 offset;
+  WORD32 *qmf_states_curr_pos;
+} ia_mps_dec_qmf_ana_filter_bank;
+
+typedef struct {
+  const WORD32 *p_filter_syn;
+  WORD32 *sbr_qmf_states_synthesis;
+} ia_mps_dec_qmf_syn_filter_bank;
+
+typedef struct {
+  WORD32 ia_mps_enc_qmf_64_640[650];
+  WORD16 sbr_alt_sin_twiddle[33];
+  WORD16 sbr_cos_twiddle[32];
+  WORD16 sbr_sin_twiddle[32];
+  WORD16 fft_c[4];
+  WORD16 ia_qmf_anl_addt_cos[32];
+  WORD16 ia_qmf_anl_addt_sin[32];
+} ia_mps_dec_qmf_tables_struct;
+
+typedef struct { WORD32 sqrt_tab[513]; } ia_mps_dec_common_tables_struct;
+
+typedef struct {
+  WORD16 p8_13[19];
+  WORD16 p2_6[6];
+  WORD32 sine_array[2048];
+  WORD32 cosine_array[2048];
+} ia_mps_dec_hybrid_tables_struct;
+
+typedef struct {
+  WORD32 row_2_channel_stp[7][8];
+  WORD32 row_2_channel_ges[7][8];
+  WORD32 row_2_residual[7][8];
+} ia_mps_dec_index_tables_struct;
+
+typedef struct {
+  ia_mps_dec_index_tables_struct idx_table;
+  WORD32 hybrid_2_param_28[71];
+  WORD32 r1_matrix_l[31];
+  WORD32 ten_cld_by_10[31];
+  WORD32 w00_cld2_15[31];
+  WORD32 table_kappa[8];
+  WORD32 dec_pow[31];
+  WORD32 cld_tab_1[31];
+  WORD32 cld_tab_2[31];
+  WORD32 cld_tab_3[31];
+  WORD32 reciprocal[576];
+  WORD32 c_l_table[31];
+  WORD32 cos_table[16][31];
+  WORD32 sin_table[8][31];
+} ia_mps_dec_m1_m2_tables_struct;
+
+typedef struct {
+  WORD32 rev_delay[4][10];
+  WORD32 rev_split_freq_0[4];
+  WORD32 rev_split_freq_1[4];
+  WORD32 rev_split_freq_2[4];
+} ia_mps_dec_rev_tables_struct;
+
+typedef struct {
+  ia_mps_dec_rev_tables_struct rev_table;
+  WORD32 lattice_coeff_0[10][20];
+  WORD32 lattice_coeff_1[10][15];
+  WORD32 lattice_coeff_2[10][6];
+  WORD32 lattice_coeff_3[10][3];
+  WORD32 den_coef_0[10][21];
+  WORD32 den_coef_1[10][16];
+  WORD32 den_coef_2[10][7];
+  WORD32 den_coef_3[10][4];
+  WORD32 lattice_delta_phi[10][20];
+} ia_mps_dec_decorr_tables_struct;
+
+typedef struct {
+  WORD32 bp[25];
+  WORD32 bpxgf[25];
+  WORD32 bp2xgf2[25];
+  WORD32 ia_mps_dec_qmf_64_640[325];
+  WORD32 time_out_idx_5xxx[6];
+  WORD32 time_out_idx_7xxx[8];
+} ia_mps_dec_tp_process_tables_struct;
+
+typedef struct {
+  WORD32 wf_02[02];
+  WORD32 wf_03[03];
+  WORD32 wf_04[04];
+  WORD32 wf_15[15];
+  WORD32 wf_16[16];
+  WORD32 wf_18[18];
+  WORD32 wf_24[24];
+  WORD32 wf_30[30];
+  WORD32 wf_32[32];
+} ia_mps_dec_wf_tables_struct;
+
+typedef struct { const WORD32 *wf[32]; } ia_mps_dec_wf_ptr_table_struct;
+
+typedef struct {
+  WORD32 twi_post_cos[64];
+  WORD32 twi_post_sin[64];
+  WORD32 hybrid_2_qmf[71];
+  WORD32 local_sin_4[4];
+  WORD32 local_sin_15[16];
+  WORD32 local_sin_16[16];
+  WORD32 local_sin_18[18];
+  WORD32 local_sin_24[24];
+  WORD32 local_sin_30[30];
+  WORD32 local_sin_32[32];
+} ia_mps_dec_mdct2qmf_table_struct;
+
+typedef struct {
+  WORD16 gmax_fix[72];
+  WORD32 dwin_fix[72];
+  WORD32 nstart_fix[5][72];
+  WORD32 dfrac_fix[5][56];
+  WORD32 part4[4];
+  WORD32 part5[5];
+  WORD32 part7[7];
+  WORD32 part10[10];
+  WORD32 part14[14];
+  WORD32 part20[20];
+  WORD32 part28[28];
+  WORD32 part40[40];
+  WORD32 w_real[16];
+  WORD32 w_imag[16];
+  WORD32 bitrev[16];
+} ia_mps_dec_tonality_tables_struct;
+
+typedef struct {
+  WORD32 kernels_4_to_71[71];
+  WORD32 kernels_5_to_71[71];
+  WORD32 kernels_7_to_71[71];
+  WORD32 kernels_10_to_71[71];
+  WORD32 kernels_14_to_71[71];
+  WORD32 kernels_20_to_71[71];
+  WORD32 kernels_28_to_71[71];
+  WORD32 bb_env_kernels[71];
+} ia_mps_dec_kernels_table_struct;
+
+typedef struct {
+  WORD32 mapping_4_to_28[28];
+  WORD32 mapping_5_to_28[28];
+  WORD32 mapping_7_to_28[28];
+  WORD32 mapping_10_to_28[28];
+  WORD32 mapping_14_to_28[28];
+  WORD32 mapping_20_to_28[28];
+} ia_mps_dec_mapping_table_struct;
+
+typedef struct {
+  WORD32 num_input_channels;
+  WORD32 num_output_channels;
+  WORD32 num_ott_boxes;
+  WORD32 num_ttt_boxes;
+  WORD32 ott_mode_lfe[5];
+} ia_mps_dec_tree_properties_struct;
+
+typedef struct {
+  ia_mps_dec_kernels_table_struct kernel_table;
+  ia_mps_dec_mapping_table_struct map_table;
+  ia_mps_dec_tree_properties_struct tree_property_table[7];
+  WORD32 sampling_freq_table[15];
+  WORD32 freq_res_table[8];
+  WORD32 temp_shape_chan_table[2][7];
+  WORD32 surround_gain_table[5];
+  WORD32 lfe_gain_table[5];
+  WORD32 clip_gain_table[8];
+  WORD32 pb_stride_table[4];
+  WORD32 smg_time_table[4];
+  WORD32 dequant_cld[31];
+  WORD32 dequant_cld_coarse[15];
+  WORD32 dequant_cpc[52];
+  WORD32 dequant_cpc_coarse[26];
+  WORD32 dequant_icc[8];
+  WORD32 factor_cld_tab_1[31];
+  WORD32 hrtf_power[64];
+  WORD32 envshape_data[2][5];
+  WORD32 pcm_chnksz_level_3[5];
+  WORD32 pcm_chnksz_level_4;
+  WORD32 pcm_chnksz_level_7[6];
+  WORD32 pcm_chnksz_level_8;
+  WORD32 pcm_chnksz_level_11[2];
+  WORD32 pcm_chnksz_level_13[4];
+  WORD32 pcm_chnksz_level_15;
+  WORD32 pcm_chnksz_level_19[4];
+  WORD32 pcm_chnksz_level_25[3];
+  WORD32 pcm_chnksz_level_26;
+  WORD32 pcm_chnksz_level_31;
+  WORD32 pcm_chnksz_level_51[4];
+} ia_mps_dec_bitdec_tables_struct;
+
+typedef struct {
+  WORD32 blind_cld_mesh[31][21];
+  WORD32 blind_icc_mesh[31][21];
+  WORD32 blind_cpc_1_mesh[31][21];
+  WORD32 blind_cpc_2_mesh[31][21];
+} ia_mps_dec_mesh_tables_struct;
+
+typedef struct {
+  ia_mps_dec_mesh_tables_struct mesh_table;
+  WORD32 exp_1[13];
+  WORD32 exp_2[13];
+  WORD32 exp_4[13];
+  WORD32 exp_8[13];
+  WORD32 exp_16[13];
+  WORD32 exp_32[13];
+  WORD32 exp_64[13];
+  WORD32 exp_128[13];
+} ia_mps_dec_blind_tables_struct;
+
+typedef struct {
+  WORD16 *cos_table_long[64];
+  WORD16 *cos_table_short[10];
+} ia_mps_dec_mdct2qmf_cos_table_struct;
+
+typedef struct {
+  WORD16 cos_table_long_32_00[32];
+  WORD16 cos_table_long_32_01[32];
+  WORD16 cos_table_long_32_02[32];
+  WORD16 cos_table_long_32_03[32];
+  WORD16 cos_table_long_32_04[32];
+  WORD16 cos_table_long_32_05[32];
+  WORD16 cos_table_long_32_06[32];
+  WORD16 cos_table_long_32_07[32];
+  WORD16 cos_table_long_32_08[32];
+  WORD16 cos_table_long_32_09[32];
+  WORD16 cos_table_long_32_10[32];
+  WORD16 cos_table_long_32_11[32];
+  WORD16 cos_table_long_32_12[32];
+  WORD16 cos_table_long_32_13[32];
+  WORD16 cos_table_long_32_14[32];
+  WORD16 cos_table_long_32_15[32];
+  WORD16 cos_table_long_32_16[32];
+  WORD16 cos_table_long_32_17[32];
+  WORD16 cos_table_long_32_18[32];
+  WORD16 cos_table_long_32_19[32];
+  WORD16 cos_table_long_32_20[32];
+  WORD16 cos_table_long_32_21[32];
+  WORD16 cos_table_long_32_22[32];
+  WORD16 cos_table_long_32_23[32];
+  WORD16 cos_table_long_32_24[32];
+  WORD16 cos_table_long_32_25[32];
+  WORD16 cos_table_long_32_26[32];
+  WORD16 cos_table_long_32_27[32];
+  WORD16 cos_table_long_32_28[32];
+  WORD16 cos_table_long_32_29[32];
+  WORD16 cos_table_long_32_30[32];
+  WORD16 cos_table_long_32_31[32];
+
+  WORD16 cos_table_long_30_00[30];
+  WORD16 cos_table_long_30_01[30];
+  WORD16 cos_table_long_30_02[30];
+  WORD16 cos_table_long_30_03[30];
+  WORD16 cos_table_long_30_04[30];
+  WORD16 cos_table_long_30_05[30];
+  WORD16 cos_table_long_30_06[30];
+  WORD16 cos_table_long_30_07[30];
+  WORD16 cos_table_long_30_08[30];
+  WORD16 cos_table_long_30_09[30];
+  WORD16 cos_table_long_30_10[30];
+  WORD16 cos_table_long_30_11[30];
+  WORD16 cos_table_long_30_12[30];
+  WORD16 cos_table_long_30_13[30];
+  WORD16 cos_table_long_30_14[30];
+  WORD16 cos_table_long_30_15[30];
+  WORD16 cos_table_long_30_16[30];
+  WORD16 cos_table_long_30_17[30];
+  WORD16 cos_table_long_30_18[30];
+  WORD16 cos_table_long_30_19[30];
+  WORD16 cos_table_long_30_20[30];
+  WORD16 cos_table_long_30_21[30];
+  WORD16 cos_table_long_30_22[30];
+  WORD16 cos_table_long_30_23[30];
+  WORD16 cos_table_long_30_24[30];
+  WORD16 cos_table_long_30_25[30];
+  WORD16 cos_table_long_30_26[30];
+  WORD16 cos_table_long_30_27[30];
+  WORD16 cos_table_long_30_28[30];
+  WORD16 cos_table_long_30_29[30];
+
+  WORD16 cos_table_long_24_00[24];
+  WORD16 cos_table_long_24_01[24];
+  WORD16 cos_table_long_24_02[24];
+  WORD16 cos_table_long_24_03[24];
+  WORD16 cos_table_long_24_04[24];
+  WORD16 cos_table_long_24_05[24];
+  WORD16 cos_table_long_24_06[24];
+  WORD16 cos_table_long_24_07[24];
+  WORD16 cos_table_long_24_08[24];
+  WORD16 cos_table_long_24_09[24];
+  WORD16 cos_table_long_24_10[24];
+  WORD16 cos_table_long_24_11[24];
+  WORD16 cos_table_long_24_12[24];
+  WORD16 cos_table_long_24_13[24];
+  WORD16 cos_table_long_24_14[24];
+  WORD16 cos_table_long_24_15[24];
+  WORD16 cos_table_long_24_16[24];
+  WORD16 cos_table_long_24_17[24];
+  WORD16 cos_table_long_24_18[24];
+  WORD16 cos_table_long_24_19[24];
+  WORD16 cos_table_long_24_20[24];
+  WORD16 cos_table_long_24_21[24];
+  WORD16 cos_table_long_24_22[24];
+  WORD16 cos_table_long_24_23[24];
+
+  WORD16 cos_table_long_18_00[18];
+  WORD16 cos_table_long_18_01[18];
+  WORD16 cos_table_long_18_02[18];
+  WORD16 cos_table_long_18_03[18];
+  WORD16 cos_table_long_18_04[18];
+  WORD16 cos_table_long_18_05[18];
+  WORD16 cos_table_long_18_06[18];
+  WORD16 cos_table_long_18_07[18];
+  WORD16 cos_table_long_18_08[18];
+  WORD16 cos_table_long_18_09[18];
+  WORD16 cos_table_long_18_10[18];
+  WORD16 cos_table_long_18_11[18];
+  WORD16 cos_table_long_18_12[18];
+  WORD16 cos_table_long_18_13[18];
+  WORD16 cos_table_long_18_14[18];
+  WORD16 cos_table_long_18_15[18];
+  WORD16 cos_table_long_18_16[18];
+  WORD16 cos_table_long_18_17[18];
+
+  WORD16 cos_table_long_16_00[16];
+  WORD16 cos_table_long_16_01[16];
+  WORD16 cos_table_long_16_02[16];
+  WORD16 cos_table_long_16_03[16];
+  WORD16 cos_table_long_16_04[16];
+  WORD16 cos_table_long_16_05[16];
+  WORD16 cos_table_long_16_06[16];
+  WORD16 cos_table_long_16_07[16];
+  WORD16 cos_table_long_16_08[16];
+  WORD16 cos_table_long_16_09[16];
+  WORD16 cos_table_long_16_10[16];
+  WORD16 cos_table_long_16_11[16];
+  WORD16 cos_table_long_16_12[16];
+  WORD16 cos_table_long_16_13[16];
+  WORD16 cos_table_long_16_14[16];
+  WORD16 cos_table_long_16_15[16];
+
+  WORD16 cos_table_long_15_00[15];
+  WORD16 cos_table_long_15_01[15];
+  WORD16 cos_table_long_15_02[15];
+  WORD16 cos_table_long_15_03[15];
+  WORD16 cos_table_long_15_04[15];
+  WORD16 cos_table_long_15_05[15];
+  WORD16 cos_table_long_15_06[15];
+  WORD16 cos_table_long_15_07[15];
+  WORD16 cos_table_long_15_08[15];
+  WORD16 cos_table_long_15_09[15];
+  WORD16 cos_table_long_15_10[15];
+  WORD16 cos_table_long_15_11[15];
+  WORD16 cos_table_long_15_12[15];
+  WORD16 cos_table_long_15_13[15];
+  WORD16 cos_table_long_15_14[15];
+
+  WORD16 cos_table_short_4_00[4];
+  WORD16 cos_table_short_4_01[4];
+  WORD16 cos_table_short_4_02[4];
+  WORD16 cos_table_short_4_03[4];
+
+  WORD16 cos_table_short_3_00[3];
+  WORD16 cos_table_short_3_01[3];
+  WORD16 cos_table_short_3_02[3];
+
+  WORD16 cos_table_short_2_00[2];
+  WORD16 cos_table_short_2_01[2];
+} ia_mps_dec_mdct2qmf_tables_struct;
+
+#endif /* IXHEAACD_MPS_STRUCT_DEF_H */
diff --git a/decoder/ixheaacd_mps_tables.h b/decoder/ixheaacd_mps_tables.h
new file mode 100644
index 0000000..59fc22e
--- /dev/null
+++ b/decoder/ixheaacd_mps_tables.h
@@ -0,0 +1,36 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_TABLES_H
+#define IXHEAACD_MPS_TABLES_H
+
+extern const ia_mps_dec_m1_m2_tables_struct ixheaacd_mps_dec_m1_m2_tables;
+extern const ia_mps_dec_decorr_tables_struct ixheaacd_mps_dec_decorr_tables;
+extern const ia_mps_dec_tp_process_tables_struct ixheaacd_mps_dec_tp_process_tables;
+extern const ia_mps_dec_wf_tables_struct ixheaacd_mps_dec_wf_tables;
+extern const ia_mps_dec_mdct2qmf_table_struct ixheaacd_mps_dec_mdct2qmf_table;
+extern const ia_mps_dec_tonality_tables_struct ixheaacd_mps_dec_tonality_tables;
+extern ia_mps_dec_bitdec_tables_struct ixheaacd_mps_dec_bitdec_tables;
+extern const ia_mps_dec_blind_tables_struct ixheaacd_mps_dec_blind_tables;
+extern const ia_mps_dec_mdct2qmf_tables_struct ixheaacd_mps_dec_mdct2qmf_tables;
+extern const ia_mps_dec_qmf_tables_struct ixheaacd_mps_dec_qmf_tables;
+extern const ia_mps_dec_common_tables_struct ixheaacd_mps_dec_common_tables;
+extern const ia_mps_dec_hybrid_tables_struct ixheaacd_mps_dec_hybrid_tables;
+
+#endif /*IXHEAACD_MPS_TABLES_H */
diff --git a/decoder/ixheaacd_mps_temp_process.c b/decoder/ixheaacd_mps_temp_process.c
index 736996c..fe5271b 100644
--- a/decoder/ixheaacd_mps_temp_process.c
+++ b/decoder/ixheaacd_mps_temp_process.c
@@ -18,44 +18,39 @@
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
 #include <math.h>
-#include <float.h>
-#include <memory.h>
-
-#include <assert.h>
-
 #include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
 #include "ixheaacd_bitbuffer.h"
-#include "ixheaacd_config.h"
-#include "ixheaacd_mps_polyphase.h"
-#include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
-
-#include "ixheaacd_mps_process.h"
-
 #include "ixheaacd_common_rom.h"
-#include "ixheaacd_defines.h"
-
-#include "ixheaacd_pns.h"
-
-#include "ixheaacd_aac_rom.h"
-#include "ixheaacd_pulsedata.h"
-
 #include "ixheaacd_sbrdecsettings.h"
 #include "ixheaacd_sbr_scale.h"
-#include "ixheaacd_lpp_tran.h"
 #include "ixheaacd_env_extr_part.h"
 #include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_config.h"
 #include "ixheaacd_hybrid.h"
 #include "ixheaacd_ps_dec.h"
-#include "ixheaacd_env_extr.h"
-
 #include "ixheaacd_qmf_dec.h"
-
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_process.h"
+#include "ixheaacd_lpp_tran.h"
+#include "ixheaacd_env_extr.h"
 #include "ixheaacd_env_calc.h"
 #include "ixheaacd_sbr_const.h"
 #include "ixheaacd_pvc_dec.h"
 #include "ixheaacd_sbr_dec.h"
-
+#include "ixheaacd_audioobjtypes.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_mps_bitdec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_get_index.h"
+#include "ixheaacd_mps_basic_op.h"
+#include "ixheaacd_mps_tp_process.h"
+#include "ixheaacd_error_codes.h"
 #define HP_SIZE (9)
 
 #define STP_LPF_COEFF1 (0.950f)
@@ -64,21 +59,20 @@
 #define STP_SCALE_LIMIT (2.82f)
 #define STP_DAMP (0.1f)
 
-#define max(a, b) ((a > b) ? (a) : (b))
-#define min(a, b) ((a < b) ? (a) : (b))
-
 static const FLOAT32 ixheaacd_bp[BP_SIZE] = {
-    0.0000f, 0.0005f, 0.0092f, 0.0587f, 0.2580f, 0.7392f, 0.9791f,
-    0.9993f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.9999f, 0.9984f,
-    0.9908f, 0.9639f, 0.8952f, 0.7711f, 0.6127f, 0.4609f, 0.3391f,
-    0.2493f, 0.1848f, 0.1387f, 0.1053f};
+  0.0000f, 0.0005f, 0.0092f, 0.0587f, 0.2580f, 0.7392f, 0.9791f,
+  0.9993f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.9999f, 0.9984f,
+  0.9908f, 0.9639f, 0.8952f, 0.7711f, 0.6127f, 0.4609f, 0.3391f,
+  0.2493f, 0.1848f, 0.1387f, 0.1053f};
 
 static const FLOAT32 ixheaacd_gf[BP_SIZE] = {
-    0.f,         0.f,         0.f,         0.f,         0.f,
-    0.f,         1e-008f,     8.1e-007f,   3.61e-006f,  8.41e-006f,
-    1.6e-005f,   2.704e-005f, 3.969e-005f, 5.625e-005f, 7.396e-005f,
-    9.801e-005f, 0.00012321f, 0.00015625f, 0.00019881f, 0.00024964f,
-    0.00032041f, 0.00041209f, 0.00053824f, 0.00070756f, 0.00094249f};
+  0.f,     0.f,     0.f,     0.f,     0.f,
+  0.f,     1e-008f,   8.1e-007f,   3.61e-006f,  8.41e-006f,
+  1.6e-005f,   2.704e-005f, 3.969e-005f, 5.625e-005f, 7.396e-005f,
+  9.801e-005f, 0.00012321f, 0.00015625f, 0.00019881f, 0.00024964f,
+  0.00032041f, 0.00041209f, 0.00053824f, 0.00070756f, 0.00094249f};
+
+extern const WORD32 ixheaacd_mps_gain_set_indx[29];
 
 static VOID ixheaacd_mps_temp_process_scale_calc(ia_mps_dec_state_struct* self,
                                                  WORD32 ts, FLOAT32* scale) {
@@ -171,6 +165,17 @@
   WORD32 no_scaling;
   FLOAT32 temp;
   const WORD32 ixheaacd_hybrid_to_qmf_map[] = {0, 0, 0, 0, 0, 0, 1, 1, 2, 2};
+  const WORD32 ixheaacd_hybrid_to_qmf_map_ldmps[] = {0, 1, 2};
+  const WORD32* ptr_ixheaacd_hybrid_to_qmf_map;
+  WORD32 loop_counter = 0;
+
+  if (self->ldmps_config.ldmps_present_flag) {
+    ptr_ixheaacd_hybrid_to_qmf_map = ixheaacd_hybrid_to_qmf_map_ldmps;
+    loop_counter = 3;
+  } else {
+    ptr_ixheaacd_hybrid_to_qmf_map = ixheaacd_hybrid_to_qmf_map;
+    loop_counter = 10;
+  }
 
   ixheaacd_mps_temp_process_scale_calc(self, ts, scale);
 
@@ -182,27 +187,38 @@
       no_scaling = !self->temp_shape_enable_ch_stp[ch];
 
     if (no_scaling == 1) {
-      for (n = 0; n < self->hyb_band_count; n++) {
+      for (n = 0; n < self->hyb_band_count_max; n++) {
         self->hyb_dir_out[ch][ts][n].re += self->hyb_diff_out[ch][ts][n].re;
         self->hyb_dir_out[ch][ts][n].im += self->hyb_diff_out[ch][ts][n].im;
       }
     } else {
-      for (n = 0; n < 10; n++) {
-        temp =
-            (FLOAT32)(scale[ch] * ixheaacd_bp[ixheaacd_hybrid_to_qmf_map[n]]);
-        self->hyb_dir_out[ch][ts][n].re +=
-            (self->hyb_diff_out[ch][ts][n].re * temp);
-        self->hyb_dir_out[ch][ts][n].im +=
-            (self->hyb_diff_out[ch][ts][n].im * temp);
+      if (self->ldmps_config.ldmps_present_flag) {
+        for (n = 0; n < 3; n++) {
+          temp = (FLOAT32)(scale[ch] *
+                           ixheaacd_bp[ptr_ixheaacd_hybrid_to_qmf_map[n]]);
+          self->hyb_dir_out[ch][ts][n].re +=
+              (self->hyb_diff_out[ch][ts][n].re * temp);
+          self->hyb_dir_out[ch][ts][n].im +=
+              (self->hyb_diff_out[ch][ts][n].im * temp);
+        }
+      } else {
+        for (n = 0; n < loop_counter; n++) {
+          temp = (FLOAT32)(scale[ch] *
+                           ixheaacd_bp[ptr_ixheaacd_hybrid_to_qmf_map[n]]);
+          self->hyb_dir_out[ch][ts][n].re +=
+              (self->hyb_diff_out[ch][ts][n].re * temp);
+          self->hyb_dir_out[ch][ts][n].im +=
+              (self->hyb_diff_out[ch][ts][n].im * temp);
+        }
       }
-      for (; n < HP_SIZE - 3 + 10; n++) {
+      for (n = 7; n < HP_SIZE - 3 + 10; n++) {
         temp = (FLOAT32)(scale[ch] * ixheaacd_bp[n + 3 - 10]);
         self->hyb_dir_out[ch][ts][n].re +=
             (self->hyb_diff_out[ch][ts][n].re * temp);
         self->hyb_dir_out[ch][ts][n].im +=
             (self->hyb_diff_out[ch][ts][n].im * temp);
       }
-      for (; n < self->hyb_band_count; n++) {
+      for (; n < self->hyb_band_count_max; n++) {
         temp = (FLOAT32)(scale[ch]);
         self->hyb_dir_out[ch][ts][n].re +=
             (self->hyb_diff_out[ch][ts][n].re * temp);
@@ -216,29 +232,1193 @@
 WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct* self) {
   WORD32 ch, ts, hyb;
   WORD32 err = 0;
+  ia_sbr_frame_info_data_struct* ptr_frame_data =
+      (ia_sbr_frame_info_data_struct*)self->p_sbr_frame[0];
+  if (self->res_bands != 28) {
+    if (self->config->bs_temp_shape_config == 1) {
+      WORD32 dif_s = ((self->res_bands == 0)
+                          ? 0
+                          : ixheaacd_mps_gain_set_indx[self->res_bands]);
+      for (ch = 0; ch < self->out_ch_count; ch++) {
+        for (ts = 0; ts < self->time_slots; ts++) {
+          for (hyb = dif_s; hyb < HYBRID_BAND_BORDER; hyb++) {
+            self->hyb_dir_out[ch][ts][hyb].re +=
+                self->hyb_diff_out[ch][ts][hyb].re;
+            self->hyb_dir_out[ch][ts][hyb].im +=
+                self->hyb_diff_out[ch][ts][hyb].im;
+            self->hyb_diff_out[ch][ts][hyb].re = 0;
+            self->hyb_diff_out[ch][ts][hyb].im = 0;
+          }
+        }
+      }
 
-  for (ch = 0; ch < self->out_ch_count; ch++) {
-    for (ts = 0; ts < self->time_slots; ts++) {
-      for (hyb = 0; hyb < HYBRID_BAND_BORDER; hyb++) {
-        self->hyb_dir_out[ch][ts][hyb].re += self->hyb_diff_out[ch][ts][hyb].re;
-        self->hyb_dir_out[ch][ts][hyb].im += self->hyb_diff_out[ch][ts][hyb].im;
-        self->hyb_diff_out[ch][ts][hyb].re = 0;
-        self->hyb_diff_out[ch][ts][hyb].im = 0;
+      for (ts = 0; ts < self->time_slots; ts++)
+        ixheaacd_mps_subbandtp(self, ts);
+
+    } else {
+      WORD32 dif_s = ((self->res_bands == 0)
+                          ? 0
+                          : ixheaacd_mps_gain_set_indx[self->res_bands]);
+      for (ch = 0; ch < self->out_ch_count; ch++) {
+        for (ts = 0; ts < self->time_slots; ts++) {
+          for (hyb = dif_s; hyb < self->hyb_band_count_max; hyb++) {
+            self->hyb_dir_out[ch][ts][hyb].re +=
+                self->hyb_diff_out[ch][ts][hyb].re;
+            self->hyb_dir_out[ch][ts][hyb].im +=
+                self->hyb_diff_out[ch][ts][hyb].im;
+          }
+        }
       }
     }
   }
 
-  for (ts = 0; ts < self->time_slots; ts++) ixheaacd_mps_subbandtp(self, ts);
-
   ixheaacd_mps_qmf_hyb_synthesis(self);
 
-  for (ch = 0; ch < self->out_ch_count; ch++) {
-    err = ixheaacd_sbr_dec_from_mps(&self->qmf_out_dir[ch][0][0].re,
-                                    self->p_sbr_dec[ch], self->p_sbr_frame[ch],
-                                    self->p_sbr_header[ch]);
-    if (err) return err;
+  if (self->ldmps_config.ldmps_present_flag != 1) {
+    for (ch = 0; ch < self->out_ch_count; ch++) {
+      err =
+          ixheaacd_sbr_dec_from_mps(&self->qmf_out_dir[ch][0][0].re, self->p_sbr_dec[ch],
+                                    self->p_sbr_frame[ch], self->p_sbr_header[ch], self->ec_flag);
+      if (err) return err;
+    }
+  }
+
+  if (self->object_type == AOT_ER_AAC_ELD || self->object_type == AOT_ER_AAC_LD)
+    self->synth_count = self->hyb_band_count[0];
+  else
+  {
+    if (ptr_frame_data->mps_sbr_flag) {
+      self->synth_count =
+        ptr_frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end;
+    }
+    else {
+      self->synth_count = self->band_count[0];
+    }
   }
 
   ixheaacd_mps_synt_calc(self);
   return err;
-}
\ No newline at end of file
+}
+
+static VOID ixheaacd_subband_tp(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ts) {
+  ia_mps_dec_tp_process_tables_struct *tp_process_table_ptr =
+      pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr;
+  const WORD32 *sqrt_tab =
+      pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+  ia_mps_dec_subband_tp_params_struct *sub_band_tp =
+      pstr_mps_state->mps_persistent_mem.sub_band_params;
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+
+  WORD32 temp_1, temp_2;
+  WORD16 qtemp1, qtemp2;
+  WORD32 *qmf_output_real_dry;
+  WORD32 *qmf_output_imag_dry;
+  WORD32 *qmf_output_real_wet;
+  WORD32 *qmf_output_imag_wet;
+
+  WORD32 *dmx_real;
+  WORD32 *dmx_imag;
+  WORD32 *dry_ener;
+  WORD32 *wet_ener;
+  WORD16 *q_dry_ener;
+  WORD16 *q_wet_ener;
+
+  WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
+  WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
+  WORD32 *scale;
+  WORD16 *q_scale;
+  WORD32 damp, one_minus_damp;
+  WORD32 temp;
+
+  WORD32 *prev_tp_scale = sub_band_tp->prev_tp_scale;
+
+  WORD32 *old_wet_ener = sub_band_tp->old_wet_ener;
+  WORD16 *q_old_wet_ener = sub_band_tp->q_old_wet_ener;
+
+  WORD32 *run_wet_ener = sub_band_tp->run_wet_ener;
+  WORD16 *q_run_wet_ener = sub_band_tp->q_run_wet_ener;
+
+  WORD32 *old_dry_ener = sub_band_tp->old_dry_ener;
+  WORD16 *q_old_dry_ener = sub_band_tp->q_old_dry_ener;
+
+  WORD32 *run_dry_ener = sub_band_tp->run_dry_ener;
+  WORD16 *q_run_dry_ener = sub_band_tp->q_run_dry_ener;
+
+  WORD32 *hyb_output_real_dry, *hyb_output_imag_dry;
+
+  WORD32 *p_hyb_out_dry_real, *p_hyb_out_dry_imag;
+
+  WORD32 ch, n, no_scaling, i, k = 0, offset;
+  WORD32 i_lf = 0, i_rf = 0, i_c = 0, i_lfe = 0, i_ls = 0, i_rs = 0, i_al = 0, i_ar = 0;
+
+  WORD32 loop_counter = 0;
+
+  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
+  WORD32 num_output_channels = pstr_mps_state->num_output_channels;
+  WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
+
+  WORD32 tree_config = pstr_mps_state->tree_config;
+
+  dry_ener = pstr_mps_state->mps_scratch_mem_v;
+  q_dry_ener = (WORD16 *)pstr_mps_state->mps_scratch_mem_v + INPUT_CHX2;
+
+  wet_ener = dry_ener + INPUT_CHX1_5;
+  q_wet_ener = q_dry_ener + IN_CH_2XOUT_CH;
+
+  scale = wet_ener + OUTPUT_CHX1_5;
+  q_scale = q_wet_ener + OUTPUT_CHX3;
+
+  dmx_real = scale + OUTPUT_CHX1_5;
+  dmx_imag = dmx_real + IN_CHXBP_SIZE;
+
+  qmf_output_real_dry = dmx_imag + IN_CHXBP_SIZE;
+
+  qmf_output_imag_dry = qmf_output_real_dry + OUT_CHXQB;
+
+  qmf_output_real_wet = qmf_output_imag_dry + OUT_CHXQB;
+
+  qmf_output_imag_wet = qmf_output_real_wet + OUT_CHXQB;
+
+  if (sub_band_tp->update_old_ener == STP_UPDATE_ENERGY_RATE) {
+    sub_band_tp->update_old_ener = 1;
+    for (ch = 0; ch < num_input_channels; ch++) {
+      old_dry_ener[ch] = run_dry_ener[ch];
+      q_old_dry_ener[ch] = q_run_dry_ener[ch];
+    }
+    for (ch = 0; ch < num_output_channels; ch++) {
+      old_wet_ener[ch] = run_wet_ener[ch];
+      q_old_wet_ener[ch] = q_run_wet_ener[ch];
+    }
+  } else
+    sub_band_tp->update_old_ener++;
+
+  for (ch = 0; ch < MAX_OUTPUT_CHANNELS_MPS; ch++) {
+    scale[ch] = ONE_IN_Q15;
+    q_scale[ch] = 15;
+  }
+
+  switch (tree_config) {
+    case TREE_5151:
+      i_lf = 0;
+      i_rf = 1;
+      i_c = 2;
+      i_lfe = 3;
+      i_ls = 4;
+      i_rs = 5;
+      loop_counter = 6;
+      break;
+    case TREE_5152:
+      i_lf = 0;
+      i_rf = 2;
+      i_c = 4;
+      i_lfe = 5;
+      i_ls = 1;
+      i_rs = 3;
+      loop_counter = 5;
+      break;
+    case TREE_525:
+      i_lf = 0;
+      i_rf = 2;
+      i_c = 4;
+      i_lfe = 5;
+      i_ls = 1;
+      i_rs = 3;
+      loop_counter = 4;
+      break;
+    case TREE_7271:
+    case TREE_7272:
+    case TREE_7572:
+      i_lf = 0;
+      i_rf = 3;
+      i_c = 6;
+      i_lfe = 7;
+      i_ls = 2;
+      i_rs = 5;
+      i_al = 1;
+      i_ar = 4;
+      loop_counter = 6;
+      break;
+    case TREE_7571:
+      i_lf = 0;
+      i_rf = 3;
+      i_c = 6;
+      i_lfe = 7;
+      i_ls = 2;
+      i_rs = 5;
+      i_al = 1;
+      i_ar = 4;
+      loop_counter = 5;
+      break;
+    default:
+      break;
+  }
+
+  offset = ts * MAX_HYBRID_BANDS;
+  p_buffer_real = p_array_struct->buf_real + offset + HYBRID_BAND_BORDER;
+  p_buffer_imag = p_array_struct->buf_imag + offset + HYBRID_BAND_BORDER;
+
+  for (ch = 0; ch < num_output_channels; ch++) {
+    p_buffer_re = p_buffer_real;
+    p_buffer_im = p_buffer_imag;
+
+    for (i = QMF_OUT_START_IDX; i < BP_SIZE; i++) {
+      *qmf_output_real_wet++ = *p_buffer_re++;
+      *qmf_output_imag_wet++ = *p_buffer_im++;
+    }
+    p_buffer_real += TSXHB;
+    p_buffer_imag += TSXHB;
+  }
+  i = QMF_OUT_OFFSET * num_output_channels;
+  qmf_output_real_wet -= i;
+  qmf_output_imag_wet -= i;
+
+  p_buffer_re = qmf_output_real_dry;
+  p_buffer_im = qmf_output_imag_dry;
+
+  hyb_output_real_dry =
+      p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 6;
+  hyb_output_imag_dry =
+      p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 6;
+
+  for (ch = 0; ch < loop_counter; ch++) {
+    *p_buffer_re++ = hyb_output_real_dry[0] + hyb_output_real_dry[1];
+    *p_buffer_im++ = hyb_output_imag_dry[0] + hyb_output_imag_dry[1];
+
+    hyb_output_real_dry += TSXHB;
+    hyb_output_imag_dry += TSXHB;
+  }
+
+  hyb_output_real_dry =
+      p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 8;
+  hyb_output_imag_dry =
+      p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 8;
+
+  for (ch = 0; ch < loop_counter; ch++) {
+    *p_buffer_re++ = hyb_output_real_dry[0] + hyb_output_real_dry[1];
+    *p_buffer_im++ = hyb_output_imag_dry[0] + hyb_output_imag_dry[1];
+
+    hyb_output_real_dry += TSXHB;
+    hyb_output_imag_dry += TSXHB;
+  }
+
+  p_hyb_out_dry_real =
+      p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 10;
+  p_hyb_out_dry_imag =
+      p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 10;
+
+  for (i = 3; i < BP_SIZE; i++) {
+    hyb_output_real_dry = p_hyb_out_dry_real;
+    hyb_output_imag_dry = p_hyb_out_dry_imag;
+
+    for (ch = 0; ch < loop_counter; ch++) {
+      *p_buffer_re++ = *hyb_output_real_dry;
+      *p_buffer_im++ = *hyb_output_imag_dry;
+
+      hyb_output_real_dry += TSXHB;
+      hyb_output_imag_dry += TSXHB;
+    }
+    p_hyb_out_dry_real++;
+    p_hyb_out_dry_imag++;
+  }
+
+  for (n = 1; n < BP_SIZE; n++) {
+    switch (tree_config) {
+      case TREE_5151:
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+        dmx_real++;
+
+        break;
+      case TREE_5152:
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+        dmx_real++;
+
+        break;
+      case TREE_525:
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+
+        break;
+      case TREE_7271:
+      case TREE_7272:
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+
+        break;
+      case TREE_7571:
+
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+
+        qmf_output_real_dry++;
+
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+
+        break;
+      case TREE_7572:
+        qmf_output_real_dry++;
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+
+        qmf_output_real_dry++;
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+
+        *dmx_real = *qmf_output_real_dry++;
+        *dmx_real += *qmf_output_real_dry++;
+
+        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_real++;
+
+        break;
+      default:
+        break;
+    }
+  }
+  dmx_real -= DMX_OFFSET;
+
+  for (n = 1; n < BP_SIZE; n++) {
+    switch (tree_config) {
+      case TREE_5151:
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+
+        qmf_output_imag_dry++;
+
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag++ += *qmf_output_imag_dry++;
+
+        dmx_imag++;
+
+        dmx_imag[0] = ixheaacd_mps_mult32_shr_30(
+            dmx_imag[0], tp_process_table_ptr->bpxgf[n]);
+        break;
+      case TREE_5152:
+
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag++ += *qmf_output_imag_dry++;
+
+        dmx_imag++;
+
+        dmx_imag[0] = ixheaacd_mps_mult32_shr_30(
+            dmx_imag[0], tp_process_table_ptr->bpxgf[n]);
+        break;
+      case TREE_525:
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag = ixheaacd_mps_mult32_shr_30(dmx_imag[0],
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_imag++;
+
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_imag++;
+        break;
+      case TREE_7271:
+      case TREE_7272:
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_imag++;
+
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+
+        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_imag++;
+
+        break;
+      case TREE_7571:
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        qmf_output_imag_dry++;
+        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_imag++;
+
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_imag++;
+
+        break;
+      case TREE_7572:
+        qmf_output_imag_dry++;
+
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+
+        qmf_output_imag_dry++;
+
+        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_imag++;
+
+        *dmx_imag = *qmf_output_imag_dry++;
+        *dmx_imag += *qmf_output_imag_dry++;
+        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
+                                               tp_process_table_ptr->bpxgf[n]);
+        dmx_imag++;
+
+        break;
+      default:
+        break;
+    }
+  }
+  dmx_imag -= DMX_OFFSET;
+
+  for (ch = 0; ch < min(2, num_input_channels); ch++) {
+    dry_ener[ch] = 0;
+    q_dry_ener[ch] = 15;
+
+    for (n = 1; n < BP_SIZE; n++) {
+      qtemp1 = 10;
+      temp_1 = ixheaacd_mps_mult32(*dmx_real, *dmx_real, &qtemp1, qtemp1);
+      dmx_real += 2;
+      dry_ener[ch] =
+          ixheaacd_mps_add32(dry_ener[ch], temp_1, &q_dry_ener[ch], qtemp1);
+
+      qtemp1 = 10;
+      temp_1 = ixheaacd_mps_mult32(*dmx_imag, *dmx_imag, &qtemp1, qtemp1);
+      dmx_imag += 2;
+      dry_ener[ch] =
+          ixheaacd_mps_add32(dry_ener[ch], temp_1, &q_dry_ener[ch], qtemp1);
+    }
+    dmx_real -= DMX_OFFSET_MINUS_ONE;
+    dmx_imag -= DMX_OFFSET_MINUS_ONE;
+
+    temp_1 = ixheaacd_mps_mult32_shr_15(run_dry_ener[ch], STP_LPF_COEFF1_FIX);
+
+    temp_2 = ONE_IN_Q15 - STP_LPF_COEFF1_FIX;
+    temp_2 = ixheaacd_mps_mult32_shr_15(temp_2, dry_ener[ch]);
+
+    run_dry_ener[ch] = ixheaacd_mps_add32(temp_1, temp_2, &(q_run_dry_ener[ch]),
+                                          q_dry_ener[ch]);
+
+    qtemp1 = q_old_dry_ener[ch];
+    temp_1 = ixheaacd_mps_add32(old_dry_ener[ch], ABS_THR_FIX, &qtemp1, 15);
+    ;
+
+    dry_ener[ch] = ixheaacd_mps_div_32(dry_ener[ch], temp_1, &qtemp2);
+    q_dry_ener[ch] = qtemp2 + q_dry_ener[ch] - qtemp1;
+  }
+
+  for (ch = 0; ch < num_output_channels; ch++) {
+    if (ch == i_lfe) continue;
+    if ((tree_config >= TREE_525) && (ch == i_c)) continue;
+    if ((tree_config == TREE_7571) && ((ch == i_ls) || (ch == i_rs))) continue;
+    if ((tree_config == TREE_7572) && ((ch == i_lf) || (ch == i_rf))) continue;
+
+    wet_ener[ch] = 0;
+    q_wet_ener[ch] = 15;
+
+    wet_ener[ch] = 0;
+    q_wet_ener[ch] = 15;
+    for (n = FIVE; n < BP_SIZE; n++) {
+      qtemp1 = 10;
+      temp_1 = ixheaacd_mps_mult32(*qmf_output_real_wet, *qmf_output_real_wet,
+                                   &qtemp1, qtemp1);
+      qmf_output_real_wet++;
+
+      qtemp2 = 10;
+      temp_2 = ixheaacd_mps_mult32(*qmf_output_imag_wet, *qmf_output_imag_wet,
+                                   &qtemp2, qtemp2);
+      qmf_output_imag_wet++;
+
+      temp_1 = ixheaacd_mps_add32(temp_1, temp_2, &qtemp1, qtemp2);
+
+      temp_1 = ixheaacd_mps_mult32(temp_1, tp_process_table_ptr->bp2xgf2[n],
+                                   &qtemp1, 57);
+
+      wet_ener[ch] =
+          ixheaacd_mps_add32(wet_ener[ch], temp_1, &q_wet_ener[ch], qtemp1);
+    }
+    temp_1 = ixheaacd_mps_mult32_shr_15(run_wet_ener[ch], STP_LPF_COEFF1_FIX);
+
+    temp_2 = ONE_IN_Q15 - STP_LPF_COEFF1_FIX;
+
+    temp_2 = ixheaacd_mps_mult32_shr_15(temp_2, wet_ener[ch]);
+
+    run_wet_ener[ch] =
+        ixheaacd_mps_add32(temp_1, temp_2, &q_run_wet_ener[ch], q_wet_ener[ch]);
+
+    qtemp1 = q_old_wet_ener[ch];
+    temp_1 = ixheaacd_mps_add32(old_wet_ener[ch], ABS_THR_FIX, &qtemp1, 15);
+
+    wet_ener[ch] = ixheaacd_mps_div_32(wet_ener[ch], temp_1, &qtemp2);
+    q_wet_ener[ch] = qtemp2 + q_wet_ener[ch] - qtemp1;
+  }
+
+  damp = POINT_ONE_Q15;
+  one_minus_damp = POINT_NINE_Q15;
+  switch (tree_config) {
+    case TREE_5151:
+    case TREE_5152:
+      if (wet_ener[i_lf] != 0) {
+        scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
+        q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_lf] = dry_ener[0] << temp_1;
+        q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
+
+      if (wet_ener[i_rf] != 0) {
+        scale[i_rf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_rf], &qtemp2);
+        q_scale[i_rf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_rf];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_rf] = dry_ener[0] << temp_1;
+        q_scale[i_rf] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
+
+      if (wet_ener[i_c] != 0) {
+        scale[i_c] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_c], &qtemp2);
+        q_scale[i_c] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_c];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_c] = dry_ener[0] << temp_1;
+        q_scale[i_c] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_c] = ixheaacd_mps_sqrt(scale[i_c], &(q_scale[i_c]), sqrt_tab);
+
+      if (wet_ener[i_ls] != 0) {
+        scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
+        q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_ls] = dry_ener[0] << temp_1;
+        q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
+
+      if (wet_ener[i_rs] != 0) {
+        scale[i_rs] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_rs], &qtemp2);
+        q_scale[i_rs] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_rs];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_rs] = dry_ener[0] << temp_1;
+        q_scale[i_rs] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
+
+      for (ch = 0; ch < 6; ch++) {
+        if (ch == 3 && tree_config == 0) continue;
+        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
+        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
+        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
+        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
+        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
+          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
+      }
+
+      break;
+    case TREE_525:
+      if (wet_ener[i_lf] != 0) {
+        scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
+        q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_lf] = dry_ener[0] << temp_1;
+        q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
+
+      if (wet_ener[i_rf] != 0) {
+        scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
+        q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_rf] = dry_ener[1] << temp_1;
+        q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
+
+      if (wet_ener[i_ls] != 0) {
+        scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
+        q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_ls] = dry_ener[0] << temp_1;
+        q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
+
+      if (wet_ener[i_rs] != 0) {
+        scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
+        q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_rs] = dry_ener[1] << temp_1;
+        q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
+
+      for (ch = 0; ch < 4; ch++) {
+        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
+        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
+        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
+        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
+        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
+          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
+      }
+      break;
+    case TREE_7271:
+    case TREE_7272:
+      if (wet_ener[i_lf] != 0) {
+        scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
+        q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_lf] = dry_ener[0] << temp_1;
+        q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
+
+      if (wet_ener[i_rf] != 0) {
+        scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
+        q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_rf] = dry_ener[1] << temp_1;
+        q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
+
+      if (wet_ener[i_ls] != 0) {
+        scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
+        q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_ls] = dry_ener[0] << temp_1;
+        q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
+
+      if (wet_ener[i_rs] != 0) {
+        scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
+        q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_rs] = dry_ener[1] << temp_1;
+        q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
+
+      if (wet_ener[i_al] != 0) {
+        scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
+        q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_al] = dry_ener[0] << temp_1;
+        q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
+
+      if (wet_ener[i_ar] != 0) {
+        scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
+        q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_ar] = dry_ener[1] << temp_1;
+        q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
+
+      for (ch = 0; ch < 6; ch++) {
+        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
+        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
+        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
+        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
+        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
+          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
+      }
+
+      break;
+    case TREE_7571:
+      if (wet_ener[i_lf] != 0) {
+        scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
+        q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_lf] = dry_ener[0] << temp_1;
+        q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
+
+      if (wet_ener[i_rf] != 0) {
+        scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
+        q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_rf] = dry_ener[1] << temp_1;
+        q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
+
+      if (wet_ener[i_al] != 0) {
+        scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
+        q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_al] = dry_ener[0] << temp_1;
+        q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
+
+      if (wet_ener[i_ar] != 0) {
+        scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
+        q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_ar] = dry_ener[1] << temp_1;
+        q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
+      for (ch = 0; ch < FIVE; ch++) {
+        if (ch == 2) continue;
+        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
+        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
+        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
+        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
+        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
+          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
+      }
+
+      break;
+    case TREE_7572:
+      if (wet_ener[i_ls] != 0) {
+        scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
+        q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_ls] = dry_ener[0] << temp_1;
+        q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
+
+      if (wet_ener[i_rs] != 0) {
+        scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
+        q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_rs] = dry_ener[1] << temp_1;
+        q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
+
+      if (wet_ener[i_al] != 0) {
+        scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
+        q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[0]);
+        scale[i_al] = dry_ener[0] << temp_1;
+        q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
+      }
+      scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
+
+      if (wet_ener[i_ar] != 0) {
+        scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
+        q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
+      } else {
+        temp_1 = ixheaacd_norm32(dry_ener[1]);
+        scale[i_ar] = dry_ener[1] << temp_1;
+        q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
+      }
+      scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
+      for (ch = 0; ch < 6; ch++) {
+        if (ch == 3 || ch == 0) continue;
+        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
+        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
+        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
+        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
+        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
+          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
+      }
+
+      break;
+    default:
+      break;
+  }
+
+  for (ch = 0; ch < num_output_channels; ch++) {
+    temp_1 = ixheaacd_mps_mult32_shr_15(STP_LPF_COEFF2_FIX, scale[ch]);
+    temp_2 =
+        ixheaacd_mps_mult32_shr_15(ONE_MINUS_STP_LPF_COEFF2, prev_tp_scale[ch]);
+    scale[ch] = temp_1 + temp_2;
+    prev_tp_scale[ch] = scale[ch];
+  }
+
+  offset = ts * MAX_HYBRID_BANDS;
+  p_buffer_real = p_array_struct->buf_real + offset + HYBRID_BAND_BORDER;
+  p_buffer_imag = p_array_struct->buf_imag + offset + HYBRID_BAND_BORDER;
+
+  p_buf_real = p_array_struct->buffer_real + offset + FIVE;
+  p_buf_imag = p_array_struct->buffer_imag + offset + FIVE;
+
+  p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry +
+                       ts * MAX_HYBRID_BANDS + HYBRID_BAND_BORDER;
+  p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry +
+                       ts * MAX_HYBRID_BANDS + HYBRID_BAND_BORDER;
+
+  for (ch = 0; ch < num_output_channels; ch++) {
+    no_scaling = 1;
+
+    ixheaacd_get_ch_idx(pstr_mps_state, ch, &i);
+    if (i != -1) {
+      no_scaling = !pstr_mps_state->aux_struct->temp_shape_enable_channel_stp[i];
+    }
+    p_buffer_re = p_buffer_real;
+    p_buffer_im = p_buffer_imag;
+
+    p_buf_re = p_buf_real;
+    p_buf_im = p_buf_imag;
+
+    hyb_output_real_dry = p_hyb_out_dry_real;
+    hyb_output_imag_dry = p_hyb_out_dry_imag;
+
+    if (no_scaling == 1) {
+      for (n = HYBRID_BAND_BORDER; n < (HP_SIZE + QMF_TO_HYB_OFFSET); n++) {
+        *p_buf_re++ = *hyb_output_real_dry++ + *p_buffer_re++;
+
+        *p_buf_im++ = *hyb_output_imag_dry++ + *p_buffer_im++;
+      }
+
+      for (; n < hybrid_bands; n++, k++) {
+        temp = (no_scaling ? ONE_IN_Q15 : scale[ch]);
+
+        *p_buf_re++ = *hyb_output_real_dry++ + *p_buffer_re++;
+
+        *p_buf_im++ = *hyb_output_imag_dry++ + *p_buffer_im++;
+      }
+    } else {
+      for (n = HYBRID_BAND_BORDER; n < (HP_SIZE + QMF_TO_HYB_OFFSET); n++) {
+        temp = ixheaacd_mps_mult32_shr_30(
+            scale[ch], tp_process_table_ptr->bp[n - QMF_TO_HYB_OFFSET]);
+
+        *p_buf_re++ = *hyb_output_real_dry++ +
+                      ixheaacd_mps_mult32_shr_15(temp, *p_buffer_re);
+        p_buffer_re++;
+
+        *p_buf_im++ = *hyb_output_imag_dry++ +
+                      ixheaacd_mps_mult32_shr_15(temp, *p_buffer_im);
+        p_buffer_im++;
+      }
+
+      for (; n < hybrid_bands; n++, k++) {
+        temp = (no_scaling ? ONE_IN_Q15 : scale[ch]);
+
+        *p_buf_re++ = *hyb_output_real_dry++ +
+                      ixheaacd_mps_mult32_shr_15(temp, *p_buffer_re);
+        p_buffer_re++;
+
+        *p_buf_im++ = *hyb_output_imag_dry++ +
+                      ixheaacd_mps_mult32_shr_15(temp, *p_buffer_im);
+        p_buffer_im++;
+      }
+    }
+
+    p_buffer_real += TSXHB;
+    p_buffer_imag += TSXHB;
+
+    p_buf_real += TSXHB;
+    p_buf_imag += TSXHB;
+
+    p_hyb_out_dry_real += TSXHB;
+    p_hyb_out_dry_imag += TSXHB;
+  }
+
+  return;
+}
+
+VOID ixheaacd_tp_process(ia_heaac_mps_state_struct *pstr_mps_state) {
+  WORD32 ch, ts, hyb, n;
+  WORD32 temp, temp_1, temp_2;
+  ia_mps_dec_synthesis_interface *syn = pstr_mps_state->syn;
+  WORD32 *hyb_output_real_wet, *hyb_output_imag_wet;
+  WORD32 *hyb_output_real_dry, *hyb_output_imag_dry;
+
+  WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
+  WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
+  WORD32 *buf_real, *buf_imag;
+
+  WORD32 num_output_channels = pstr_mps_state->num_output_channels;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
+  WORD32 num_output_channels_at = pstr_mps_state->num_output_channels_at;
+  WORD32 tree_config = pstr_mps_state->tree_config;
+  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
+  WORD32 tp_hyb_band_border = pstr_mps_state->tp_hyb_band_border;
+
+  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
+  WORD32 *p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
+  WORD32 *p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
+  WORD32 *p_hyb_out_dry_re, *p_hyb_out_dry_im;
+
+  WORD32 *p_time_out;
+
+  p_buffer_real = p_array_struct->buf_real;
+  p_buffer_imag = p_array_struct->buf_imag;
+
+  p_buf_real = p_array_struct->buffer_real;
+  p_buf_imag = p_array_struct->buffer_imag;
+
+  if (!pstr_mps_state->scaling_enable) {
+    for (ch = 0; ch < num_output_channels; ch++) {
+      p_buffer_re = p_buffer_real;
+      p_buffer_im = p_buffer_imag;
+
+      p_buf_re = p_buf_real;
+      p_buf_im = p_buf_imag;
+
+      p_hyb_out_dry_re = p_hyb_out_dry_real;
+      p_hyb_out_dry_im = p_hyb_out_dry_imag;
+
+      for (ts = 0; ts < time_slots; ts++) {
+        hyb_output_real_wet = p_buffer_re;
+        hyb_output_imag_wet = p_buffer_im;
+        hyb_output_real_dry = p_hyb_out_dry_re;
+        hyb_output_imag_dry = p_hyb_out_dry_im;
+
+        buf_real = p_buf_re;
+        buf_imag = p_buf_im;
+
+        temp_1 = *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        temp_2 = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        for (n = 1; n < 6; n++) {
+          temp_1 += *hyb_output_real_dry++ + *hyb_output_real_wet++;
+          temp_2 += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        }
+
+        *buf_real++ = temp_1;
+        *buf_imag++ = temp_2;
+
+        temp = *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        *buf_real = temp + *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        temp = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        *buf_imag = temp + *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+
+        buf_real++;
+        buf_imag++;
+
+        temp = *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        *buf_real = temp + *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        temp = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        *buf_imag = temp + *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+
+        buf_real++;
+        buf_imag++;
+
+        for (n = 0; n < qmf_bands; n++) {
+          *buf_real++ = *hyb_output_real_dry++ + *hyb_output_real_wet++;
+          *buf_imag++ = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        }
+
+        p_buffer_re += MAX_HYBRID_BANDS;
+        p_buffer_im += MAX_HYBRID_BANDS;
+
+        p_buf_re += MAX_HYBRID_BANDS;
+        p_buf_im += MAX_HYBRID_BANDS;
+
+        p_hyb_out_dry_re += MAX_HYBRID_BANDS;
+        p_hyb_out_dry_im += MAX_HYBRID_BANDS;
+      }
+      p_buffer_real += TSXHB;
+      p_buffer_imag += TSXHB;
+
+      p_buf_real += TSXHB;
+      p_buf_imag += TSXHB;
+
+      p_hyb_out_dry_real += TSXHB;
+      p_hyb_out_dry_imag += TSXHB;
+    }
+  } else {
+    for (ch = 0; ch < num_output_channels; ch++) {
+      p_buffer_re = p_buffer_real;
+      p_buffer_im = p_buffer_imag;
+
+      p_buf_re = p_buf_real;
+      p_buf_im = p_buf_imag;
+
+      p_hyb_out_dry_re = p_hyb_out_dry_real;
+      p_hyb_out_dry_im = p_hyb_out_dry_imag;
+
+      for (ts = 0; ts < time_slots; ts++) {
+        hyb_output_real_wet = p_buffer_re;
+        hyb_output_imag_wet = p_buffer_im;
+        hyb_output_real_dry = p_hyb_out_dry_re;
+        hyb_output_imag_dry = p_hyb_out_dry_im;
+
+        buf_real = p_buf_re;
+        buf_imag = p_buf_im;
+
+        temp_1 = *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        temp_2 = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        for (n = 1; n < 6; n++) {
+          temp_1 += *hyb_output_real_dry++ + *hyb_output_real_wet++;
+          temp_2 += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        }
+
+        *buf_real++ = temp_1;
+        *buf_imag++ = temp_2;
+
+        *buf_real = *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        *buf_real += *hyb_output_real_dry++ + *hyb_output_real_wet++;
+
+        *buf_imag = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        *buf_imag += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+
+        buf_real++;
+        buf_imag++;
+
+        *buf_real = *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        *buf_real += *hyb_output_real_dry++ + *hyb_output_real_wet++;
+        *buf_imag = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        *buf_imag += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+
+        buf_real++;
+        buf_imag++;
+
+        for (hyb = 3; hyb < tp_hyb_band_border - QMF_TO_HYB_OFFSET; hyb++) {
+          *buf_real++ = *hyb_output_real_dry++ + *hyb_output_real_wet++;
+          *buf_imag++ = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
+        }
+        p_buffer_re += MAX_HYBRID_BANDS;
+        p_buffer_im += MAX_HYBRID_BANDS;
+
+        p_buf_re += MAX_HYBRID_BANDS;
+        p_buf_im += MAX_HYBRID_BANDS;
+
+        p_hyb_out_dry_re += MAX_HYBRID_BANDS;
+        p_hyb_out_dry_im += MAX_HYBRID_BANDS;
+      }
+      p_buffer_real += TSXHB;
+      p_buffer_imag += TSXHB;
+
+      p_buf_real += TSXHB;
+      p_buf_imag += TSXHB;
+
+      p_hyb_out_dry_real += TSXHB;
+      p_hyb_out_dry_imag += TSXHB;
+    }
+
+    for (ts = 0; ts < time_slots; ts++) {
+      ixheaacd_subband_tp(pstr_mps_state, ts);
+    }
+  }
+
+  if ((!pstr_mps_state->bs_config.arbitrary_tree) &&
+      ((up_mix_type != 2) && (up_mix_type != 3))) {
+    WORD32 *time_out_5xxx =
+        pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr->time_out_idx_5xxx;
+    WORD32 *time_out_7xxx =
+        pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr->time_out_idx_7xxx;
+
+    p_buf_real = p_array_struct->buffer_real;
+    p_buf_imag = p_array_struct->buffer_imag;
+
+    for (ch = 0; ch < num_output_channels_at; ch++) {
+      WORD32 tempch = 0;
+      switch (tree_config) {
+        case TREE_5151:
+          tempch = ch;
+          break;
+        case TREE_5152:
+        case TREE_525:
+          tempch = time_out_5xxx[ch];
+          break;
+        case TREE_7271:
+        case TREE_7272:
+        case TREE_7571:
+        case TREE_7572:
+          tempch = time_out_7xxx[ch];
+          break;
+        default:
+          break;
+      }
+      p_time_out = p_array_struct->time_out + tempch * QBXTS;
+      syn->syn_filter_bank(&pstr_mps_state->syn_qmf_bank, p_buf_real, p_buf_imag,
+                           p_time_out, ch, qmf_bands, time_slots,
+                           pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr);
+
+      p_buf_real += TSXHB;
+      p_buf_imag += TSXHB;
+    }
+  } else {
+    p_time_out = p_array_struct->time_out;
+    for (ch = 0; ch < num_output_channels_at; ch++) {
+      syn->syn_filter_bank(&pstr_mps_state->syn_qmf_bank, p_buf_real, p_buf_imag,
+                           p_time_out, ch, qmf_bands, time_slots,
+                           pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr);
+
+      p_buf_real += TSXHB;
+      p_buf_imag += TSXHB;
+      p_time_out += QBXTS;
+    }
+  }
+
+  return;
+}
diff --git a/decoder/ixheaacd_mps_temp_reshape.c b/decoder/ixheaacd_mps_temp_reshape.c
index fd8e62c..2138c78 100644
--- a/decoder/ixheaacd_mps_temp_reshape.c
+++ b/decoder/ixheaacd_mps_temp_reshape.c
@@ -19,17 +19,22 @@
 */
 #include <math.h>
 #include "ixheaacd_type_def.h"
+#include "ixheaacd_constants.h"
 #include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
 #include "ixheaacd_config.h"
-
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_mps_polyphase.h"
-
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
-#include "ixheaacd_mps_interface.h"
-
-#define max(a, b) ((a) > (b) ? (a) : (b))
-
-#define min(a, b) ((a) < (b) ? (a) : (b))
 
 #define DIR_DIFF_IN 0
 #define DOWNMIX_IN 1
@@ -67,7 +72,7 @@
     case DIR_DIFF_IN:
       ch_offset = 0;
       for (ii = 0; ii < self->time_slots; ii++) {
-        for (jj = 0; jj < self->hyb_band_count; jj++) {
+        for (jj = 0; jj < self->hyb_band_count_max; jj++) {
           slot_energy[ii]
                      [ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] +=
               ((self->hyb_dir_out[ch][ii][jj].re +
@@ -83,14 +88,26 @@
       break;
     case DOWNMIX_IN:
       ch_offset = self->out_ch_count;
-      for (ii = 0; ii < self->time_slots; ii++) {
-        for (jj = 0; jj < self->hyb_band_count; jj++) {
-          slot_energy[ii]
-                     [ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] +=
-              self->hyb_in[ch][ii][jj].re * self->hyb_in[ch][ii][jj].re +
-              self->hyb_in[ch][ii][jj].im * self->hyb_in[ch][ii][jj].im;
+      if ((self->pre_mix_req | self->bs_tsd_enable)) {
+        for (ii = 0; ii < self->time_slots; ii++) {
+          for (jj = 0; jj < self->hyb_band_count_max; jj++) {
+            slot_energy
+                [ii][ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] +=
+                self->hyb_in[ch][jj][ii].re * self->hyb_in[ch][jj][ii].re +
+                self->hyb_in[ch][jj][ii].im * self->hyb_in[ch][jj][ii].im;
+          }
+        }
+      } else {
+        for (ii = 0; ii < self->time_slots; ii++) {
+          for (jj = 0; jj < self->hyb_band_count_max; jj++) {
+            slot_energy
+                [ii][ixheaacd_hybrid_band_71_to_processing_band_20_map[jj]] +=
+                self->w_dir[ch][ii][jj].re * self->w_dir[ch][ii][jj].re +
+                self->w_dir[ch][ii][jj].im * self->w_dir[ch][ii][jj].im;
+          }
         }
       }
+
       break;
     default:
       ch_offset = 0;
@@ -168,7 +185,7 @@
         amp_direct = 0;
         amp_diff = 0;
 
-        for (jj = band_start; jj < self->hyb_band_count; jj++) {
+        for (jj = band_start; jj < self->hyb_band_count_max; jj++) {
           amp_direct += self->hyb_dir_out[ch][time_slot][jj].re *
                             self->hyb_dir_out[ch][time_slot][jj].re +
                         self->hyb_dir_out[ch][time_slot][jj].im *
@@ -184,11 +201,11 @@
 
         ratio = min(max((gain + amp_ratio * (gain - 1)), 1 / LAMDA), LAMDA);
 
-        for (jj = band_start; jj < self->hyb_band_count; jj++) {
+        for (jj = band_start; jj < self->hyb_band_count_max; jj++) {
           self->hyb_dir_out[ch][time_slot][jj].re *= ratio;
           self->hyb_dir_out[ch][time_slot][jj].im *= ratio;
         }
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/decoder/ixheaacd_mps_tonality.c b/decoder/ixheaacd_mps_tonality.c
new file mode 100644
index 0000000..34a6a7e
--- /dev/null
+++ b/decoder/ixheaacd_mps_tonality.c
@@ -0,0 +1,432 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_error_codes.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+#include "ixheaacd_lpp_tran.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_env_extr.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_config.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_bitdec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_basic_op.h"
+
+VOID ixheaacd_init_tonality(ia_heaac_mps_state_struct *pstr_mps_state) {
+  ia_mps_dec_tonality_state_struct *ton_state = pstr_mps_state->mps_persistent_mem.ton_state;
+  WORD32 cnt = pstr_mps_state->qmf_bands * 8;
+  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
+
+  memset(ton_state->spec_prev_real, 0, cnt * sizeof(ton_state->spec_prev_real[0]));
+  memset(ton_state->spec_prev_imag, 0, cnt * sizeof(ton_state->spec_prev_imag[0]));
+  memset(ton_state->p_cross_real, 0, cnt * sizeof(ton_state->p_cross_real[0]));
+  memset(ton_state->p_cross_imag, 0, cnt * sizeof(ton_state->p_cross_imag[0]));
+  memset(ton_state->p_sum, 0, cnt * sizeof(ton_state->p_sum[0]));
+  memset(ton_state->p_sum_prev, 0, cnt * sizeof(ton_state->p_sum_prev[0]));
+
+  memset(ton_state->buf_real, 0, qmf_bands * 6 * sizeof(ton_state->buf_real[0][0]));
+  memset(ton_state->buf_imag, 0, qmf_bands * 6 * sizeof(ton_state->buf_imag[0][0]));
+  memset(ton_state->win_buf_real, 0, qmf_bands * 16 * sizeof(ton_state->win_buf_real[0][0]));
+  memset(ton_state->win_buf_imag, 0, qmf_bands * 16 * sizeof(ton_state->win_buf_imag[0][0]));
+}
+
+VOID ixheaacd_zoom_fft16(WORD32 *in_real, WORD32 *in_imag, WORD32 *out_real, WORD32 *out_imag,
+                         WORD32 qmf_band, WORD32 dfrac,
+                         ia_mps_dec_mps_tables_struct *ia_mps_dec_mps_table_ptr) {
+  WORD32 blackman[16];
+
+  WORD32 v_real[16], v_imag[16];
+  WORD32 t_real, t_imag;
+  WORD32 e_real, e_imag;
+
+  WORD32 temp_1, temp_2, temp3, temp4;
+  const WORD32 *bitrev = ia_mps_dec_mps_table_ptr->tonality_table_ptr->bitrev;
+  const WORD32 *w_real = ia_mps_dec_mps_table_ptr->tonality_table_ptr->w_real;
+  const WORD32 *w_imag = ia_mps_dec_mps_table_ptr->tonality_table_ptr->w_imag;
+  const WORD32 *cos_tab = ia_mps_dec_mps_table_ptr->hybrid_table_ptr->cosine_array;
+  const WORD32 *sin_tab = ia_mps_dec_mps_table_ptr->hybrid_table_ptr->sine_array;
+
+  WORD32 i, j, s1, s2;
+
+  temp3 = TWO_PI_BY_FIFTEEN_Q15;
+
+  for (i = 0; i < 16; i++) {
+    temp_1 = (i << 15) + dfrac;
+    temp_2 = ixheaacd_mps_mult32_shr_15(temp_1, temp3);
+    temp_2 = ixheaacd_mps_cos(temp_2, cos_tab);
+    temp_2 >>= 1;
+
+    temp_1 <<= 1;
+    temp_1 = ixheaacd_mps_cos(temp_1, cos_tab);
+
+    temp_1 = ixheaacd_mps_mult32x16_shr_16(temp_1, TWO_BY_TWENTYFIVE_Q16);
+
+    temp4 = POINT_FOUR_TWO_Q15 - temp_2;
+
+    blackman[i] = temp_1 + temp4;
+  }
+
+  for (i = 0; i < 16; i++) {
+    WORD32 idx = bitrev[i];
+    temp_1 = ixheaacd_mps_mult32_shr_30(in_real[i], w_real[i]) -
+             ixheaacd_mps_mult32_shr_30(in_imag[i], w_imag[i]);
+    v_real[idx] = ixheaacd_mps_mult32_shr_30(temp_1, blackman[i]);
+
+    temp_1 = ixheaacd_mps_mult32_shr_30(in_real[i], w_imag[i]) +
+             ixheaacd_mps_mult32_shr_30(in_imag[i], w_real[i]);
+    v_imag[idx] = ixheaacd_mps_mult32_shr_30(temp_1, blackman[i]);
+  }
+
+  for (s1 = 1, s2 = 16; s1 < 8; s1 <<= 1, s2 >>= 1) {
+    for (i = 0; i < 16; i += 2 * s1) {
+      for (j = 0; j < s1; j++) {
+        t_real = ixheaacd_mps_mult32_shr_30(v_real[i + j + s1], w_real[j * s2]) -
+                 ixheaacd_mps_mult32_shr_30(v_imag[i + j + s1], w_imag[j * s2]);
+        t_imag = ixheaacd_mps_mult32_shr_30(v_real[i + j + s1], w_imag[j * s2]) +
+                 ixheaacd_mps_mult32_shr_30(v_imag[i + j + s1], w_real[j * s2]);
+
+        v_real[i + j + s1] = v_real[i + j] - t_real;
+        v_imag[i + j + s1] = v_imag[i + j] - t_imag;
+
+        v_real[i + j] += t_real;
+        v_imag[i + j] += t_imag;
+      }
+    }
+  }
+
+  for (j = 0; j < 8; j++) {
+    WORD32 idx = j << 1;
+    t_real = ixheaacd_mps_mult32_shr_30(v_real[j + 8], w_real[idx]) -
+             ixheaacd_mps_mult32_shr_30(v_imag[j + 8], w_imag[idx]);
+    t_imag = ixheaacd_mps_mult32_shr_30(v_real[j + 8], w_imag[idx]) +
+             ixheaacd_mps_mult32_shr_30(v_imag[j + 8], w_real[idx]);
+
+    if ((qmf_band & ONE_BIT_MASK) == 0) {
+      out_real[j] = v_real[j] + t_real;
+      out_imag[j] = v_imag[j] + t_imag;
+    } else {
+      out_real[j] = v_real[j] - t_real;
+      out_imag[j] = v_imag[j] - t_imag;
+    }
+  }
+
+  temp3 = MINUS_PI_BY_EIGHT_Q15;
+  for (i = 0; i < 8; i++) {
+    if ((qmf_band & ONE_BIT_MASK) == 0) {
+      temp_1 = dfrac * i;
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, temp3);
+      e_real = ixheaacd_mps_cos(temp_1, cos_tab);
+      e_imag = ixheaacd_mps_sin(temp_1, sin_tab);
+    } else {
+      temp_1 = dfrac * (i - 8);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, temp3);
+      e_real = ixheaacd_mps_cos(temp_1, cos_tab);
+      e_imag = ixheaacd_mps_sin(temp_1, sin_tab);
+    }
+
+    t_real = ixheaacd_mps_mult32_shr_15(out_real[i], e_real) -
+             ixheaacd_mps_mult32_shr_15(out_imag[i], e_imag);
+    out_imag[i] = ixheaacd_mps_mult32_shr_15(out_real[i], e_imag) +
+                  ixheaacd_mps_mult32_shr_15(out_imag[i], e_real);
+    out_real[i] = t_real;
+  }
+}
+
+VOID ixheaacd_measure_tonality(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 *tonality) {
+  ia_mps_dec_tonality_state_struct *ton_state = pstr_mps_state->mps_persistent_mem.ton_state;
+
+  WORD32 *qmf_real;
+  WORD32 *qmf_imag;
+
+  WORD32 *spec_zoom_real;
+  WORD32 *spec_zoom_imag;
+
+  WORD32 *spec_prev_real = ton_state->spec_prev_real;
+  WORD32 *spec_prev_imag = ton_state->spec_prev_imag;
+
+  WORD32 *p_cross_real = ton_state->p_cross_real;
+  WORD32 *p_cross_imag = ton_state->p_cross_imag;
+
+  WORD32 *p_sum = ton_state->p_sum;
+  WORD32 *p_sum_prev = ton_state->p_sum_prev;
+
+  WORD32 *p_max;
+
+  WORD32 *coh_spec;
+  WORD32 *pow_spec;
+
+  WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
+  WORD32 *buf_real, *buf_imag;
+  WORD32 g, gmax;
+  WORD32 i, j, q, s, c, cnt;
+
+  WORD32 const *part;
+  WORD32 pstart;
+  WORD32 pstop = 0;
+  WORD32 pqmf, num, den, tmp_ton, beta, dwin, dfrac;
+  WORD16 q_beta, q_tmp_ton;
+
+  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
+  WORD32 time_slots = pstr_mps_state->time_slots;
+  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
+  WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
+  WORD32 sampling_freq = pstr_mps_state->sampling_freq;
+  const WORD32 *sqrt_tab = pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
+
+  WORD32 nstart;
+
+  WORD32 tmp_real, tmp_imag;
+
+  WORD32 temp_1, temp;
+  WORD16 qtemp1, qtemp2;
+
+  spec_zoom_real =
+      (WORD32 *)((WORD8 *)pstr_mps_state->mps_scratch_mem_v + SCRATCH_OFFSET_SMOOTHING);
+  spec_zoom_imag = spec_zoom_real + QMF_BANDSX8;
+  p_max = spec_zoom_imag + QMF_BANDSX8;
+  coh_spec = p_max + QMF_BANDSX8;
+  pow_spec = coh_spec + QMF_BANDSX8;
+
+  qmf_real = pow_spec + QMF_BANDSX8;
+  qmf_imag = qmf_real + QBXTS;
+
+  switch (num_parameter_bands) {
+    case PARAMETER_BANDS_4:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part4;
+      break;
+    case PARAMETER_BANDS_5:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part5;
+      break;
+    case PARAMETER_BANDS_7:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part7;
+      break;
+    case PARAMETER_BANDS_10:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part10;
+      break;
+    case PARAMETER_BANDS_14:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part14;
+      break;
+    case PARAMETER_BANDS_20:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part20;
+      break;
+    case PARAMETER_BANDS_28:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part28;
+      break;
+    case PARAMETER_BANDS_40:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part40;
+      break;
+    default:
+      part = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->part4;
+      break;
+  }
+
+  temp = time_slots - 6;
+
+  p_buf_real = pstr_mps_state->array_struct->buf_real;
+  p_buf_imag = pstr_mps_state->array_struct->buf_imag;
+
+  for (q = 0; q < qmf_bands; q++) {
+    qmf_real += 6;
+    qmf_imag += 6;
+
+    p_buf_re = p_buf_real;
+    p_buf_im = p_buf_imag;
+    for (s = 0; s < time_slots; s++) {
+      tmp_real = 0;
+      tmp_imag = 0;
+
+      buf_real = p_buf_re;
+      buf_imag = p_buf_im;
+
+      for (c = 0; c < num_input_channels; c++) {
+        tmp_real += *buf_real;
+        tmp_imag += *buf_imag;
+
+        buf_real += TSXHB;
+        buf_imag += TSXHB;
+      }
+
+      if (s == temp) {
+        qmf_real -= time_slots;
+        qmf_imag -= time_slots;
+      }
+
+      if (s + 6 < time_slots) {
+        *qmf_real++ = tmp_real;
+        *qmf_imag++ = tmp_imag;
+      } else {
+        *qmf_real++ = ton_state->buf_real[q][s + 6 - time_slots];
+        *qmf_imag++ = ton_state->buf_imag[q][s + 6 - time_slots];
+
+        ton_state->buf_real[q][s + 6 - time_slots] = tmp_real;
+        ton_state->buf_imag[q][s + 6 - time_slots] = tmp_imag;
+      }
+      p_buf_re += MAX_HYBRID_BANDS;
+      p_buf_re += MAX_HYBRID_BANDS;
+    }
+    qmf_real += temp;
+    qmf_imag += temp;
+
+    p_buf_real++;
+    p_buf_imag++;
+  }
+
+  gmax = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->gmax_fix[time_slots];
+  dwin = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->dwin_fix[time_slots];
+
+  qtemp1 = 15;
+  temp_1 = ixheaacd_mps_mult32(dwin, (40 * (qmf_bands)), &qtemp1, 0);
+  beta = ixheaacd_mps_div_32(temp_1, sampling_freq, &q_beta);
+  q_beta = q_beta + qtemp1;
+  beta = ixheaacd_mps_convert_to_qn(beta, q_beta, 15);
+
+  for (i = 0; i < num_parameter_bands; i++) {
+    tonality[i] = ONE_IN_Q15;
+  }
+
+  for (g = 0; g < gmax; g++) {
+    nstart = pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->nstart_fix[g][time_slots];
+    if (time_slots <= 16)
+      dfrac = 0;
+    else
+      dfrac =
+          pstr_mps_state->ia_mps_dec_mps_table.tonality_table_ptr->dfrac_fix[g][time_slots - 16];
+
+    qmf_real = pow_spec + QBX48;
+    qmf_imag = qmf_real + QMF_BANDSXTSX6;
+    for (q = 0; q < qmf_bands; q++) {
+      for (i = 0; i < 16; i++) {
+        if (nstart + i < 0) {
+          ton_state->win_buf_real[q][i] = ton_state->win_buf_real[q][16 + nstart + i];
+          ton_state->win_buf_imag[q][i] = ton_state->win_buf_imag[q][16 + nstart + i];
+        } else {
+          ton_state->win_buf_real[q][i] = qmf_real[nstart + i];
+          ton_state->win_buf_imag[q][i] = qmf_imag[nstart + i];
+        }
+      }
+      qmf_real += time_slots;
+      qmf_imag += time_slots;
+    }
+
+    for (q = 0; q < qmf_bands; q++) {
+      ixheaacd_zoom_fft16(&(ton_state->win_buf_real[q][0]), &(ton_state->win_buf_imag[q][0]),
+                          &(spec_zoom_real[q * 8]), &(spec_zoom_imag[q * 8]), q, dfrac,
+                          &(pstr_mps_state->ia_mps_dec_mps_table));
+    }
+
+    cnt = 8 * qmf_bands;
+    for (i = 0; i < cnt; i++) {
+      WORD64 temp;
+      WORD32 one_minus_beta = ONE_IN_Q15 - beta;
+      WORD32 x = *spec_zoom_real;
+      WORD32 y = *spec_zoom_imag;
+
+      temp = x * spec_prev_real[i] + y * spec_prev_imag[i];
+      temp_1 = (WORD32)(temp >> 10);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, beta);
+
+      p_cross_real[i] = ixheaacd_mps_mult32_shr_15(p_cross_real[i], one_minus_beta);
+      p_cross_real[i] += temp_1;
+
+      temp = y * spec_prev_real[i] - x * spec_prev_imag[i];
+      temp_1 = (WORD32)(temp >> 10);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, beta);
+
+      p_cross_imag[i] = ixheaacd_mps_mult32_shr_15(p_cross_imag[i], one_minus_beta);
+      p_cross_imag[i] += temp_1;
+
+      temp = x * x + y * y;
+      temp_1 = (WORD32)(temp >> 10);
+      temp_1 = ixheaacd_mps_mult32_shr_15(temp_1, beta);
+
+      p_sum[i] = ixheaacd_mps_mult32_shr_15(p_sum[i], one_minus_beta);
+      p_sum[i] += temp_1;
+
+      *p_max = (p_sum[i] > p_sum_prev[i]) ? p_sum[i] : p_sum_prev[i];
+
+      p_sum_prev[i] = p_sum[i];
+
+      temp = p_cross_real[i] * p_cross_real[i] + p_cross_imag[i] * p_cross_imag[i];
+      temp_1 = (WORD32)(temp >> 10);
+      qtemp1 = 10;
+      temp_1 = ixheaacd_mps_sqrt(temp_1, &qtemp1, sqrt_tab);
+      *coh_spec = ixheaacd_mps_div_32(temp_1, *p_max++, &qtemp2);
+      qtemp2 = qtemp2 + qtemp1 - 10;
+      *coh_spec = ixheaacd_mps_convert_to_qn(*coh_spec, qtemp2, 10);
+      coh_spec++;
+
+      temp = x * x + y * y + spec_prev_real[i] * spec_prev_real[i] +
+             spec_prev_imag[i] * spec_prev_imag[i];
+      *pow_spec = (WORD32)(temp >> 10);
+
+      spec_prev_real[i] = *spec_zoom_real++;
+      spec_prev_imag[i] = *spec_zoom_imag++;
+    }
+    spec_zoom_real -= i;
+    spec_zoom_imag -= i;
+    p_max -= i;
+    coh_spec -= i;
+    pow_spec -= i;
+
+    pstart = 0;
+    pqmf = 0;
+    for (i = 0; i < num_parameter_bands; i++) {
+      pqmf += part[i];
+      pstop = ((pqmf << 3) + ONE_IN_Q14) >> 15;
+
+      num = 0;
+      den = 0;
+      for (j = pstart; j < pstop; j++) {
+        num += ixheaacd_mps_mult32_shr_n(*pow_spec, *coh_spec, 10);
+        coh_spec++;
+        den += *pow_spec++;
+      }
+
+      tmp_ton = ixheaacd_mps_div_32(num, den, &q_tmp_ton);
+      ixheaacd_mps_convert_to_qn(tmp_ton, q_tmp_ton, 15);
+
+      if (tmp_ton > 32767) {
+        tmp_ton = 32767;
+      }
+
+      if (tmp_ton < tonality[i]) tonality[i] = tmp_ton;
+
+      pstart = pstop;
+    }
+    coh_spec -= pstop;
+    pow_spec -= pstop;
+  }
+  return;
+}
diff --git a/decoder/ixheaacd_mps_tonality.h b/decoder/ixheaacd_mps_tonality.h
new file mode 100644
index 0000000..f42bf8f
--- /dev/null
+++ b/decoder/ixheaacd_mps_tonality.h
@@ -0,0 +1,27 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_TONALITY_H
+#define IXHEAACD_MPS_TONALITY_H
+
+VOID ixheaacd_init_tonality(ia_heaac_mps_state_struct *pstr_mps_state);
+
+VOID ixheaacd_measure_tonality(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 *tonality);
+
+#endif /* IXHEAACD_MPS_TONALITY_H */
diff --git a/decoder/ixheaacd_mps_tp_process.h b/decoder/ixheaacd_mps_tp_process.h
new file mode 100644
index 0000000..4257bc1
--- /dev/null
+++ b/decoder/ixheaacd_mps_tp_process.h
@@ -0,0 +1,38 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_MPS_TP_PROCESS_H
+#define IXHEAACD_MPS_TP_PROCESS_H
+
+#define STP_LPF_COEFF1_FIX (31130)
+#define STP_LPF_COEFF2_FIX (14746)
+#define ONE_MINUS_STP_LPF_COEFF2 (18022)
+#define STP_SCALE_LIMIT_FIX (92406)
+#define ONE_BY_STP_SCALE_LIMIT (11620)
+#define QMF_TO_HYB_OFFSET (7)
+#define DMX_OFFSET (48)
+#define DMX_OFFSET_MINUS_ONE (47)
+#define QMF_OUT_START_IDX (5)
+#define QMF_OUT_OFFSET (20)
+#define HYBRID_BAND_BORDER (12)
+#define FIVE (5)
+
+VOID ixheaacd_tp_process(ia_heaac_mps_state_struct *pstr_mps_state);
+
+#endif /* IXHEAACD_MPS_TP_PROCESS_H */
diff --git a/decoder/ixheaacd_multichannel.c b/decoder/ixheaacd_multichannel.c
index d914ad2..66c252b 100644
--- a/decoder/ixheaacd_multichannel.c
+++ b/decoder/ixheaacd_multichannel.c
@@ -43,6 +43,9 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -68,8 +71,16 @@
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_qmf_dec.h"
 #include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_interface.h"
 #include "ixheaacd_struct_def.h"
 #include "ixheaacd_headerdecode.h"
 
@@ -130,7 +141,7 @@
 }
 
 IA_ERRORCODE ixheaacd_dec_coupling_channel_element(
-    ia_handle_bit_buf_struct bs, ia_aac_decoder_struct *aac_handle,
+    ia_bit_buf_struct *it_bit_buf, ia_aac_decoder_struct *aac_handle,
     WORD32 samp_rate_idx, ia_aac_dec_tables_struct *ptr_aac_tables,
     ixheaacd_misc_tables *common_tables_ptr, WORD *element_index_order,
     ia_enhaacplus_dec_ind_cc *ind_channel_info, WORD32 total_channels,
@@ -142,8 +153,6 @@
   WORD ind_sw_cce_flag, num_coupled_elements;
 
   WORD num_gain_element_lists = 0;
-  WORD cc_domain;
-  WORD gain_element_sign;
   WORD gain_element_scale;
 
   const UWORD16 *hcod_sf =
@@ -154,11 +163,11 @@
 
   IA_ERRORCODE error_status = IA_NO_ERROR;
 
-  element_instance_tag = ixheaacd_read_bits_buf(bs, 4);
+  element_instance_tag = ixheaacd_read_bits_buf(it_bit_buf, 4);
   element_index_order[0] = element_instance_tag;
 
-  ind_sw_cce_flag = ixheaacd_read_bits_buf(bs, 1);
-  num_coupled_elements = ixheaacd_read_bits_buf(bs, 3);
+  ind_sw_cce_flag = ixheaacd_read_bits_buf(it_bit_buf, 1);
+  num_coupled_elements = ixheaacd_read_bits_buf(it_bit_buf, 3);
 
   for (c = 0; c < MAX_BS_ELEMENT; c++)
     ind_channel_info->elements_coupled[c] = -1;
@@ -168,11 +177,11 @@
   for (c = 0; c < (num_coupled_elements + 1); c++) {
     num_gain_element_lists++;
 
-    ind_channel_info->cc_target_is_cpe[c] = ixheaacd_read_bits_buf(bs, 1);
-    ind_channel_info->cc_target_tag_select[c] = ixheaacd_read_bits_buf(bs, 4);
+    ind_channel_info->cc_target_is_cpe[c] = ixheaacd_read_bits_buf(it_bit_buf, 1);
+    ind_channel_info->cc_target_tag_select[c] = ixheaacd_read_bits_buf(it_bit_buf, 4);
     if (ind_channel_info->cc_target_is_cpe[c]) {
-      ind_channel_info->cc_l[c] = ixheaacd_read_bits_buf(bs, 1);
-      ind_channel_info->cc_r[c] = ixheaacd_read_bits_buf(bs, 1);
+      ind_channel_info->cc_l[c] = ixheaacd_read_bits_buf(it_bit_buf, 1);
+      ind_channel_info->cc_r[c] = ixheaacd_read_bits_buf(it_bit_buf, 1);
       if (ind_channel_info->cc_l[c] && ind_channel_info->cc_r[c])
         num_gain_element_lists++;
       ind_channel_info->elements_coupled[c] = 1;
@@ -182,9 +191,9 @@
   if ((ind_sw_cce_flag == 0) && (num_gain_element_lists > MAX_BS_ELEMENT)) {
     return IA_FATAL_ERROR;
   }
-  cc_domain = ixheaacd_read_bits_buf(bs, 1);
-  gain_element_sign = ixheaacd_read_bits_buf(bs, 1);
-  gain_element_scale = ixheaacd_read_bits_buf(bs, 2);
+  ixheaacd_read_bits_buf(it_bit_buf, 1);/*cc_domain*/
+  ixheaacd_read_bits_buf(it_bit_buf, 1);/*gain_element_sign*/
+  gain_element_scale = ixheaacd_read_bits_buf(it_bit_buf, 2);
 
   aac_handle->pstr_aac_dec_ch_info[0]->str_ics_info.num_swb_window = 0;
   aac_handle->pstr_aac_dec_ch_info[0]->str_ics_info.sampling_rate_index =
@@ -193,7 +202,7 @@
   aac_handle->pstr_aac_dec_ch_info[0]->common_window = 0;
 
   error_status = ixheaacd_individual_ch_stream(
-      bs, aac_handle, 1, frame_size, total_channels, audio_object_type,
+      it_bit_buf, aac_handle, 1, frame_size, total_channels, audio_object_type,
       eld_specific_config, ele_type);
 
   if (error_status) return error_status;
@@ -207,15 +216,15 @@
     if (ind_sw_cce_flag)
       cge = 1;
     else {
-      common_gain_element_present[c] = ixheaacd_read_bits_buf(bs, 1);
+      common_gain_element_present[c] = ixheaacd_read_bits_buf(it_bit_buf, 1);
       cge = common_gain_element_present[c];
-      return IA_ENHAACPLUS_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
+      return IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
     }
     if (cge) {
-      UWORD8 *ptr_read_next = bs->ptr_read_next;
-      WORD32 bit_pos = 7 - bs->bit_pos;
+      UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
+      WORD32 bit_pos = 7 - it_bit_buf->bit_pos;
       WORD32 read_word =
-          ixheaacd_aac_showbits_32(bs->ptr_read_next, bs->cnt_bits, NULL);
+          ixheaacd_aac_showbits_32(it_bit_buf->ptr_read_next, it_bit_buf->cnt_bits, NULL);
       UWORD32 read_word1;
 
       read_word1 = read_word << bit_pos;
@@ -227,9 +236,9 @@
       while (bit_pos > 8)
         ixheaacd_aac_read_byte(&ptr_read_next, &bit_pos, &read_word);
 
-      bs->ptr_read_next = ptr_read_next;
-      bs->bit_pos = 7 - bit_pos;
-      bs->cnt_bits -= length;
+      it_bit_buf->ptr_read_next = ptr_read_next;
+      it_bit_buf->bit_pos = 7 - bit_pos;
+      it_bit_buf->cnt_bits -= length;
 
       norm_value = index - 60;
       if (norm_value == -1)
@@ -246,47 +255,45 @@
         }
       }
     } else {
-      return IA_ENHAACPLUS_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
+      return IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
     }
   }
-  if (bs->cnt_bits < 0) {
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+  if (it_bit_buf->cnt_bits < 0) {
+    return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
   }
   return error_status;
 }
 
-void ixheaacd_dec_couple_channel(WORD16 *p_time_data, WORD16 *out_samp_cc,
+void ixheaacd_dec_couple_channel(WORD32 *p_time_data, WORD32 *out_samp_cc,
                                  WORD16 frame_size, WORD total_channels,
-                                 WORD32 gain_cc)
+                                 WORD16 gain_cc)
 
 {
   WORD i;
-  WORD16 out_cc;
-  WORD16 *ptr_out_samp = &out_samp_cc[0];
+  WORD32 out_cc;
+  WORD32 *ptr_out_samp = &out_samp_cc[0];
   for (i = frame_size - 1; i >= 0; i--) {
-    out_cc = ixheaacd_round16(ixheaacd_shl32_sat(
-        ixheaacd_mult32x16in32(gain_cc, *ptr_out_samp++), 3));
-    *p_time_data = ixheaacd_add16_sat(out_cc, *p_time_data);
+    out_cc = (ixheaacd_shl32_sat(
+        ixheaacd_mult32x16in32(*ptr_out_samp++, gain_cc), 3));
+    *p_time_data = ixheaacd_add32_sat(out_cc, *p_time_data);
     p_time_data += total_channels;
   }
 }
 
 void ixheaacd_dec_ind_coupling(
-    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD16 *coup_ch_output,
-    WORD16 frame_size, WORD total_channels, WORD16 *ptr_time_data)
+    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 *coup_ch_output,
+    WORD16 frame_size, WORD total_channels, VOID *ptr_time_data_tmp)
 
 {
   WORD c, j, k;
   WORD l;
-  WORD coupling_channel;
-
-  WORD16 *out_samp_cc;
+  WORD32 *out_samp_cc;
 
   ia_enhaacplus_dec_ind_cc *ind_channel_info;
 
-  {
-    coupling_channel = p_obj_exhaacplus_dec->aac_config.ui_coupling_channel;
+  WORD32 *ptr_time_data = (WORD32 *)ptr_time_data_tmp;
 
+  {
     ind_channel_info = &p_obj_exhaacplus_dec->p_state_aac->ind_cc_info;
 
     out_samp_cc = coup_ch_output;
@@ -308,18 +315,18 @@
       k = p_obj_exhaacplus_dec->aac_config.slot_element[l];
 
       if (ind_channel_info->cc_target_is_cpe[c] == 0) {
-        WORD16 *p_time_data = &ptr_time_data[k];
+        WORD32 *p_time_data = &ptr_time_data[k];
 
-        WORD32 gain_cc = ind_channel_info->cc_gain[j];
+        WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j]);
 
         ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
                                     total_channels, gain_cc);
       }
       if (ind_channel_info->cc_target_is_cpe[c] == 1) {
         if (ind_channel_info->cc_l[c] == 1) {
-          WORD16 *p_time_data = &ptr_time_data[k];
+          WORD32 *p_time_data = &ptr_time_data[k];
 
-          WORD32 gain_cc = ind_channel_info->cc_gain[j];
+          WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j]);
 
           ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
                                       total_channels, gain_cc);
@@ -328,8 +335,8 @@
         k = p_obj_exhaacplus_dec->aac_config.slot_element[l];
 
         if (ind_channel_info->cc_r[c] == 1) {
-          WORD16 *p_time_data = &ptr_time_data[k + 1];
-          WORD32 gain_cc = ind_channel_info->cc_gain[j + 1];
+          WORD32 *p_time_data = &ptr_time_data[k + 1];
+          WORD16 gain_cc = ixheaacd_round16(ind_channel_info->cc_gain[j + 1]);
 
           ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
                                       total_channels, gain_cc);
diff --git a/decoder/ixheaacd_multichannel.h b/decoder/ixheaacd_multichannel.h
index 9156f44..ea37259 100644
--- a/decoder/ixheaacd_multichannel.h
+++ b/decoder/ixheaacd_multichannel.h
@@ -17,11 +17,11 @@
  *****************************************************************************
  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */
-#ifndef IA_EAACP_DEC_MUTLCHANNEL_H
-#define IA_EAACP_DEC_MUTLCHANNEL_H
+#ifndef IXHEAACD_MULTICHANNEL_H
+#define IXHEAACD_MULTICHANNEL_H
 
 IA_ERRORCODE ixheaacd_dec_coupling_channel_element(
-    ia_handle_bit_buf_struct bs, ia_aac_decoder_struct *aac_handle,
+    ia_bit_buf_struct *it_bit_buf, ia_aac_decoder_struct *aac_handle,
     WORD32 sample_rate_idx, ia_aac_dec_tables_struct *ptr_aac_tables,
     ixheaacd_misc_tables *common_tables_ptr, WORD *element_index_order,
     ia_enhaacplus_dec_ind_cc *ind_channel_info, WORD32 total_channels,
@@ -29,11 +29,11 @@
     ia_eld_specific_config_struct eld_specific_config, WORD32 ele_type);
 
 void ixheaacd_dec_ind_coupling(
-    ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD16 *coup_ch_output,
-    WORD16 frame_size, WORD total_channels, WORD16 *ptr_time_data);
+    ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD32 *coup_ch_output,
+    WORD16 frame_size, WORD total_channels, VOID *ptr_time_data);
 
 void ixheaacd_dec_downmix_to_stereo(
     ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec, WORD16 frame_size,
     WORD total_elements, WORD16 *ptr_time_data, WORD total_channels);
 
-#endif /* IA_EAACP_DEC_MUTLCHANNEL_H */
\ No newline at end of file
+#endif /* IXHEAACD_MULTICHANNEL_H */
diff --git a/decoder/ixheaacd_peak_limiter.c b/decoder/ixheaacd_peak_limiter.c
new file mode 100644
index 0000000..d5f2b4b
--- /dev/null
+++ b/decoder/ixheaacd_peak_limiter.c
@@ -0,0 +1,334 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <stdlib.h>
+#include <math.h>
+#include "ixheaacd_type_def.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_peak_limiter_struct_def.h"
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#define MIN(x, y) ((x) > (y) ? (y) : (x))
+
+/**
+*  ixheaacd_peak_limiter_init
+*
+*  \brief Peak Limiter initialization
+*
+*  \param [in/out] peak_limiter Pointer to peak_limiter struct
+*  \param [in] num_channels Number of ouptut channels
+*  \param [in] sample_rate Sampling rate value
+*  \param [in] buffer Peak limiter buffer of size PEAK_LIM_BUFFER_SIZE
+*
+*  \return WORD32
+*
+*/
+WORD32 ixheaacd_peak_limiter_init(ia_peak_limiter_struct *peak_limiter,
+                                  UWORD32 num_channels, UWORD32 sample_rate,
+                                  FLOAT32 *buffer, UWORD32 *delay_in_samples) {
+  UWORD32 attack;
+
+  attack = (UWORD32)(DEFAULT_ATTACK_TIME_MS * sample_rate / 1000);
+  *delay_in_samples = attack;
+
+  if (attack < 1) return 0;
+
+  peak_limiter->max_buf = buffer;
+  peak_limiter->max_idx = 0;
+  peak_limiter->cir_buf_pnt = 0;
+  peak_limiter->delayed_input = buffer + attack * 4 + 32;
+
+  peak_limiter->delayed_input_index = 0;
+  peak_limiter->attack_time = DEFAULT_ATTACK_TIME_MS;
+  peak_limiter->release_time = DEFAULT_RELEASE_TIME_MS;
+  peak_limiter->attack_time_samples = attack;
+  peak_limiter->attack_constant = (FLOAT32)pow(0.1, 1.0 / (attack + 1));
+  peak_limiter->release_constant = (FLOAT32)pow(
+      0.1, 1.0 / (DEFAULT_RELEASE_TIME_MS * sample_rate / 1000 + 1));
+  peak_limiter->num_channels = num_channels;
+  peak_limiter->sample_rate = sample_rate;
+  peak_limiter->min_gain = 1.0f;
+  peak_limiter->limiter_on = 1;
+  peak_limiter->pre_smoothed_gain = 1.0f;
+  peak_limiter->gain_modified = 1.0f;
+
+  return 0;
+}
+VOID ixheaacd_peak_limiter_process_float(ia_peak_limiter_struct *peak_limiter,
+                                         FLOAT32 samples[MAX_NUM_CHANNELS][4096],
+                                         UWORD32 frame_len) {
+  UWORD32 i, j;
+  FLOAT32 tmp, gain;
+  FLOAT32 min_gain = 1.0f;
+  FLOAT32 maximum;
+  UWORD32 num_channels = peak_limiter->num_channels;
+  UWORD32 attack_time_samples = peak_limiter->attack_time_samples;
+  FLOAT32 attack_constant = peak_limiter->attack_constant;
+  FLOAT32 release_constant = peak_limiter->release_constant;
+  FLOAT32 *max_buf = peak_limiter->max_buf;
+  FLOAT32 gain_modified = peak_limiter->gain_modified;
+  FLOAT32 *delayed_input = peak_limiter->delayed_input;
+  UWORD32 delayed_input_index = peak_limiter->delayed_input_index;
+  FLOAT64 pre_smoothed_gain = peak_limiter->pre_smoothed_gain;
+  FLOAT32 limit_threshold = PEAK_LIM_THR_FLOAT;
+
+  if (peak_limiter->limiter_on || (FLOAT32)pre_smoothed_gain) {
+    for (i = 0; i < frame_len; i++) {
+      tmp = 0.0f;
+      for (j = 0; j < num_channels; j++) {
+        tmp = (FLOAT32)MAX(tmp, fabs(samples[j][i]));
+      }
+      max_buf[peak_limiter->cir_buf_pnt] = tmp;
+
+      if (peak_limiter->max_idx == peak_limiter->cir_buf_pnt) {
+        peak_limiter->max_idx = 0;
+        for (j = 1; j < (attack_time_samples); j++) {
+          if (max_buf[j] > max_buf[peak_limiter->max_idx]) peak_limiter->max_idx = j;
+        }
+      } else if (tmp >= max_buf[peak_limiter->max_idx]) {
+        peak_limiter->max_idx = peak_limiter->cir_buf_pnt;
+      }
+
+      peak_limiter->cir_buf_pnt++;
+
+      if (peak_limiter->cir_buf_pnt == (WORD32)(attack_time_samples))
+        peak_limiter->cir_buf_pnt = 0;
+      maximum = max_buf[peak_limiter->max_idx];
+
+      if (maximum > limit_threshold) {
+        gain = limit_threshold / maximum;
+      } else {
+        gain = 1;
+      }
+
+      if (gain < pre_smoothed_gain) {
+        gain_modified =
+            MIN(gain_modified, (gain - 0.1f * (FLOAT32)pre_smoothed_gain) * 1.11111111f);
+      } else {
+        gain_modified = gain;
+      }
+
+      if (gain_modified < pre_smoothed_gain) {
+        pre_smoothed_gain = attack_constant * (pre_smoothed_gain - gain_modified) + gain_modified;
+        pre_smoothed_gain = MAX(pre_smoothed_gain, gain);
+      } else {
+        pre_smoothed_gain =
+            release_constant * (pre_smoothed_gain - gain_modified) + gain_modified;
+      }
+
+      gain = (FLOAT32)pre_smoothed_gain;
+
+      for (j = 0; j < num_channels; j++) {
+        tmp = delayed_input[delayed_input_index * num_channels + j];
+        delayed_input[delayed_input_index * num_channels + j] = samples[j][i];
+
+        tmp *= gain;
+
+        if (tmp > limit_threshold)
+          tmp = limit_threshold;
+        else if (tmp < -limit_threshold)
+          tmp = -limit_threshold;
+
+        samples[j][i] = tmp;
+      }
+
+      delayed_input_index++;
+      if (delayed_input_index >= attack_time_samples) delayed_input_index = 0;
+
+      if (gain < min_gain) min_gain = gain;
+    }
+  } else {
+    for (i = 0; i < frame_len; i++) {
+      for (j = 0; j < num_channels; j++) {
+        tmp = delayed_input[delayed_input_index * num_channels + j];
+        delayed_input[delayed_input_index * num_channels + j] = samples[j][i];
+        samples[j][i] = tmp;
+      }
+
+      delayed_input_index++;
+      if (delayed_input_index >= attack_time_samples) delayed_input_index = 0;
+    }
+  }
+
+  peak_limiter->gain_modified = gain_modified;
+  peak_limiter->delayed_input_index = delayed_input_index;
+  peak_limiter->pre_smoothed_gain = pre_smoothed_gain;
+  peak_limiter->min_gain = min_gain;
+
+  return;
+}
+
+/**
+*  ixheaacd_peak_limiter_process
+*
+*  \brief Peak Limiter process
+*
+*  \param [in/out] peak_limiter
+*  \param [in] samples
+*  \param [in] frame_len
+*
+*  \return WORD32
+*
+*/
+VOID ixheaacd_peak_limiter_process(ia_peak_limiter_struct *peak_limiter,
+                                   VOID *samples_t, UWORD32 frame_len,
+                                   UWORD8 *qshift_adj) {
+  UWORD32 i, j;
+  FLOAT32 tmp, gain;
+  FLOAT32 min_gain = 1.0f;
+  FLOAT32 maximum;
+  UWORD32 num_channels = peak_limiter->num_channels;
+  UWORD32 attack_time_samples = peak_limiter->attack_time_samples;
+  FLOAT32 attack_constant = peak_limiter->attack_constant;
+  FLOAT32 release_constant = peak_limiter->release_constant;
+  FLOAT32 *max_buf = peak_limiter->max_buf;
+  FLOAT32 gain_modified = peak_limiter->gain_modified;
+  FLOAT32 *delayed_input = peak_limiter->delayed_input;
+  UWORD32 delayed_input_index = peak_limiter->delayed_input_index;
+  FLOAT64 pre_smoothed_gain = peak_limiter->pre_smoothed_gain;
+  WORD32 limit_threshold = PEAK_LIM_THR_FIX;
+
+  WORD32 *samples = (WORD32 *)samples_t;
+
+  if (peak_limiter->limiter_on || (FLOAT32)pre_smoothed_gain) {
+    for (i = 0; i < frame_len; i++) {
+      tmp = 0.0f;
+      for (j = 0; j < num_channels; j++) {
+        FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j));
+        tmp = (FLOAT32)MAX(tmp, fabs((samples[i * num_channels + j] * gain_t)));
+      }
+      max_buf[peak_limiter->cir_buf_pnt] = tmp;
+
+      if (peak_limiter->max_idx == peak_limiter->cir_buf_pnt) {
+        peak_limiter->max_idx = 0;
+        for (j = 1; j < (attack_time_samples); j++) {
+          if (max_buf[j] > max_buf[peak_limiter->max_idx])
+            peak_limiter->max_idx = j;
+        }
+      } else if (tmp >= max_buf[peak_limiter->max_idx]) {
+        peak_limiter->max_idx = peak_limiter->cir_buf_pnt;
+      }
+      peak_limiter->cir_buf_pnt++;
+
+      if (peak_limiter->cir_buf_pnt == (WORD32)(attack_time_samples))
+        peak_limiter->cir_buf_pnt = 0;
+      maximum = max_buf[peak_limiter->max_idx];
+
+      if (maximum > limit_threshold) {
+        gain = limit_threshold / maximum;
+      } else {
+        gain = 1;
+      }
+
+      if (gain < pre_smoothed_gain) {
+        gain_modified =
+            MIN(gain_modified,
+                (gain - 0.1f * (FLOAT32)pre_smoothed_gain) * 1.11111111f);
+
+      } else {
+        gain_modified = gain;
+      }
+
+      if (gain_modified < pre_smoothed_gain) {
+        pre_smoothed_gain =
+            attack_constant * (pre_smoothed_gain - gain_modified) +
+            gain_modified;
+        pre_smoothed_gain = MAX(pre_smoothed_gain, gain);
+      } else {
+        pre_smoothed_gain =
+            release_constant * (pre_smoothed_gain - gain_modified) +
+            gain_modified;
+      }
+
+      gain = (FLOAT32)pre_smoothed_gain;
+
+      for (j = 0; j < num_channels; j++) {
+        WORD64 tmp_fix;
+        tmp = delayed_input[delayed_input_index * num_channels + j];
+        FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j));
+        delayed_input[delayed_input_index * num_channels + j] =
+            samples[i * num_channels + j] * gain_t;
+
+        tmp *= gain;
+
+        tmp_fix = (WORD64)tmp;
+
+        if (tmp_fix > limit_threshold)
+          tmp_fix = limit_threshold;
+        else if (tmp_fix < -limit_threshold)
+          tmp_fix = -limit_threshold;
+
+        samples[i * num_channels + j] = (WORD32)tmp_fix;
+      }
+
+      delayed_input_index++;
+      if (delayed_input_index >= attack_time_samples) delayed_input_index = 0;
+
+      if (gain < min_gain) min_gain = gain;
+    }
+  } else {
+    for (i = 0; i < frame_len; i++) {
+      for (j = 0; j < num_channels; j++) {
+        tmp = delayed_input[delayed_input_index * num_channels + j];
+        FLOAT32 gain_t = (FLOAT32)(1 << *(qshift_adj + j));
+        delayed_input[delayed_input_index * num_channels + j] =
+            samples[i * num_channels + j] * gain_t;
+        samples[i * num_channels + j] = (WORD32)tmp;
+      }
+
+      delayed_input_index++;
+      if (delayed_input_index >= attack_time_samples) delayed_input_index = 0;
+    }
+  }
+
+  peak_limiter->gain_modified = gain_modified;
+  peak_limiter->delayed_input_index = delayed_input_index;
+  peak_limiter->pre_smoothed_gain = pre_smoothed_gain;
+  peak_limiter->min_gain = min_gain;
+
+  return;
+}
+
+/**
+ *  ixheaacd_scale_adjust
+ *
+ *  \brief Scale adjust process
+ *
+ *  \param [in/out] samples
+ *  \param [in] qshift_adj
+ *  \param [in] frame_len
+ *
+ *  \return WORD32
+ *
+ */
+
+VOID ixheaacd_scale_adjust(WORD32 *samples, UWORD32 frame_len,
+                           WORD8 *qshift_adj, WORD num_channels) {
+  UWORD32 i;
+  WORD32 j;
+  for (i = 0; i < frame_len; i++) {
+    for (j = 0; j < num_channels; j++) {
+      WORD32 gain_t = (WORD32)(1 << *(qshift_adj + j));
+      samples[i * num_channels + j] = (samples[i * num_channels + j] * gain_t);
+    }
+  }
+}
\ No newline at end of file
diff --git a/decoder/ixheaacd_peak_limiter_struct_def.h b/decoder/ixheaacd_peak_limiter_struct_def.h
new file mode 100644
index 0000000..dfc3eb6
--- /dev/null
+++ b/decoder/ixheaacd_peak_limiter_struct_def.h
@@ -0,0 +1,50 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#ifndef IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H
+#define IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H
+
+#define PEAK_LIM_SIZE (1024 * 16)
+#define DEFAULT_ATTACK_TIME_MS (5.0f)
+#define DEFAULT_RELEASE_TIME_MS (50.0f)
+#define PEAK_LIM_THR_FLOAT (29203.6f)
+#define PEAK_LIM_THR_FIX (2147483647)
+
+typedef struct ia_peak_limiter_struct {
+  FLOAT32 attack_time;
+  FLOAT32 release_time;
+  FLOAT32 attack_constant;
+  FLOAT32 release_constant;
+  FLOAT32 limit_threshold;
+  UWORD32 num_channels;
+  UWORD32 sample_rate;
+  UWORD32 attack_time_samples;
+  UWORD32 limiter_on;
+  FLOAT32 gain_modified;
+  FLOAT64 pre_smoothed_gain;
+  FLOAT32 *delayed_input;
+  UWORD32 delayed_input_index;
+  FLOAT32 *max_buf;
+  FLOAT32 min_gain;
+  FLOAT32 buffer[PEAK_LIM_SIZE];
+  WORD32 max_idx;
+  WORD32 cir_buf_pnt;
+} ia_peak_limiter_struct;
+
+#endif /* IXHEAACD_PEAK_LIMITER_STRUCT_DEF_H */
diff --git a/decoder/ixheaacd_pns_js_thumb.c b/decoder/ixheaacd_pns_js_thumb.c
index 39985dc..b41e201 100644
--- a/decoder/ixheaacd_pns_js_thumb.c
+++ b/decoder/ixheaacd_pns_js_thumb.c
@@ -45,8 +45,10 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
-#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_block.h"
@@ -113,6 +115,7 @@
       &ptr_aac_dec_channel_info[channel]->str_pns_info;
   ia_ics_info_struct *ptr_ics_info =
       &ptr_aac_dec_channel_info[channel]->str_ics_info;
+  WORD16 maximum_bins_short = ptr_ics_info->frame_length >> 3;
   WORD32 *ptr_scale_mant_tab =
       ptr_aac_tables->pstr_block_tables->scale_mant_tab;
 
@@ -181,7 +184,10 @@
           }
         }
 
-        spec += 128;
+        if (maximum_bins_short == 120)
+          spec += maximum_bins_short;
+        else
+          spec += 128;
       }
     }
   }
@@ -252,6 +258,7 @@
   WORD win, filt, start, stop, size, scale_spec;
   ia_ics_info_struct *ptr_ics_info = &ptr_aac_dec_channel_info->str_ics_info;
   WORD num_window, tns_max_bands, win_seq;
+  WORD16 maximum_bins_short = ptr_ics_info->frame_length >> 3;
   WORD position;
 
   WORD32 parcor_coef[MAX_ORDER + 1];
@@ -262,6 +269,8 @@
 
   const WORD16 *ptr_sfb_table;
 
+  WORD16 max_bin_long = ptr_ics_info->frame_length;
+
   win_seq = ptr_ics_info->window_sequence == 0
                 ? 0
                 : (ptr_ics_info->window_sequence % 2 == 0);
@@ -348,16 +357,33 @@
       }
 
       {
-        WORD32 *ptr_tmp = spec + (win << 7) + start;
+        WORD32 *ptr_tmp;
+
+        if (maximum_bins_short == 120)
+          ptr_tmp = spec + (win * maximum_bins_short) + start;
+        else
+          ptr_tmp = spec + (win << 7) + start;
+
         scale_spec = (*ixheaacd_calc_max_spectral_line)(ptr_tmp, size);
       }
 
       if (filter->direction == -1) {
         position = stop - 1;
-        if (((win << 7) + position) < filter->order) continue;
+
+        if (maximum_bins_short == 120) {
+          if (((win * maximum_bins_short) + position) < filter->order) continue;
+        } else {
+          if (((win << 7) + position) < filter->order) continue;
+        }
+
       } else {
         position = start;
-        if ((((win << 7) + position) + filter->order) > MAX_BINS_LONG) continue;
+        if (maximum_bins_short == 120) {
+          if ((((win * maximum_bins_short) + position) + filter->order) > max_bin_long)
+            continue;
+        } else {
+          if ((((win << 7) + position) + filter->order) > MAX_BINS_LONG) continue;
+        }
       }
 
       if ((num_ch <= 2) &&
@@ -378,28 +404,52 @@
         if ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_AAC_LTP) ||
             (num_ch > 2)) {
           if (ar_flag)
-            (*ixheaacd_tns_ar_filter_fixed)(&spec[(win << 7) + position], size,
-                                            filter->direction,
-                                            (WORD32 *)lpc_coef, filter->order,
-                                            (WORD32)scale_lpc, scale_spec);
-          else
-            ixheaacd_tns_ma_filter_fixed_ld(&spec[(win << 7) + position], size,
-                                            filter->direction, lpc_coef,
-                                            filter->order, scale_lpc);
-
+          {
+            if (maximum_bins_short == 120) {
+              (*ixheaacd_tns_ar_filter_fixed)(&spec[(win * maximum_bins_short) + position],
+                                              size, filter->direction,
+                                              (WORD32 *)lpc_coef, filter->order,
+                                              (WORD32)scale_lpc, scale_spec);
+            } else {
+              (*ixheaacd_tns_ar_filter_fixed)(&spec[(win << 7) + position], size,
+                                              filter->direction,
+                                              (WORD32 *)lpc_coef, filter->order,
+                                              (WORD32)scale_lpc, scale_spec);
+            }
+          } else {
+            if (maximum_bins_short == 120) {
+              ixheaacd_tns_ma_filter_fixed_ld(&spec[(win * maximum_bins_short) + position],
+                                              size, filter->direction, lpc_coef,
+                                              filter->order, scale_lpc);
+            } else {
+              ixheaacd_tns_ma_filter_fixed_ld(&spec[(win << 7) + position], size,
+                                              filter->direction, lpc_coef,
+                                              filter->order, scale_lpc);
+            }
+          }
         } else {
           if (object_type == AOT_ER_AAC_ELD) scale_spec = scale_spec - 1;
-
-          (*ixheaacd_tns_ar_filter)(&spec[(win << 7) + position], size,
-                                    filter->direction, lpc_coef_16,
-                                    filter->order, (WORD32)scale_lpc,
-                                    scale_spec, scratch_buf);
+          if (maximum_bins_short == 120) {
+            (*ixheaacd_tns_ar_filter)(&spec[(win * maximum_bins_short) + position], size,
+                                      filter->direction, lpc_coef_16,
+                                      filter->order, (WORD32)scale_lpc,
+                                      scale_spec, scratch_buf);
+          } else {
+            (*ixheaacd_tns_ar_filter)(&spec[(win << 7) + position], size,
+                                      filter->direction, lpc_coef_16,
+                                      filter->order, (WORD32)scale_lpc,
+                                      scale_spec, scratch_buf);
+          }
         }
-
       }
 
       else {
-        WORD32 *ptr_tmp = spec + (win << 7) + start;
+        WORD32 *ptr_tmp;
+
+        if (maximum_bins_short == 120)
+          ptr_tmp = spec + (win * maximum_bins_short) + start;
+        else
+          ptr_tmp = spec + (win >> 7) + start;
 
         scale_spec = -scale_spec;
         scale_spec = ixheaacd_min32(scale_spec, 31);
@@ -411,25 +461,47 @@
 
         if ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_AAC_LTP) ||
             num_ch > 2) {
-          if (ar_flag)
-            (*ixheaacd_tns_ar_filter_fixed)(
-                &spec[(win << 7) + position], size, filter->direction,
-                (WORD32 *)lpc_coef, filter->order, scale_lpc, 0);
-
-          else
-            ixheaacd_tns_ma_filter_fixed_ld(&spec[(win << 7) + position], size,
-                                            filter->direction, lpc_coef,
-                                            filter->order, scale_lpc);
+          if (ar_flag) {
+            if (maximum_bins_short == 120) {
+              (*ixheaacd_tns_ar_filter_fixed)(
+                  &spec[(win * maximum_bins_short) + position], size, filter->direction,
+                  (WORD32 *)lpc_coef, filter->order, scale_lpc, 0);
+            } else {
+              (*ixheaacd_tns_ar_filter_fixed)(
+                  &spec[(win << 7) + position], size, filter->direction,
+                  (WORD32 *)lpc_coef, filter->order, scale_lpc, 0);
+            }
+          } else {
+            if (maximum_bins_short == 120) {
+              ixheaacd_tns_ma_filter_fixed_ld(&spec[(win * maximum_bins_short) + position],
+                                              size, filter->direction, lpc_coef,
+                                              filter->order, scale_lpc);
+            } else {
+              ixheaacd_tns_ma_filter_fixed_ld(&spec[(win << 7) + position], size,
+                                              filter->direction, lpc_coef,
+                                              filter->order, scale_lpc);
+            }
+          }
         } else {
           if (object_type == AOT_ER_AAC_ELD) {
             scale_lpc = scale_lpc - 1;
           }
-          (*ixheaacd_tns_ar_filter)(&spec[(win << 7) + position], size,
-                                    filter->direction, lpc_coef_16,
-                                    filter->order, scale_lpc, 0, scratch_buf);
+
+          if (maximum_bins_short == 120) {
+            (*ixheaacd_tns_ar_filter)(&spec[(win * maximum_bins_short) + position], size,
+                                      filter->direction, lpc_coef_16,
+                                      filter->order, scale_lpc, 0, scratch_buf);
+          } else {
+            (*ixheaacd_tns_ar_filter)(&spec[(win << 7) + position], size,
+                                      filter->direction, lpc_coef_16,
+                                      filter->order, scale_lpc, 0, scratch_buf);
+          }
         }
 
-        ptr_tmp = spec + (win << 7) + start;
+        if (maximum_bins_short == 120)
+          ptr_tmp = spec + (win * maximum_bins_short) + start;
+        else
+          ptr_tmp = spec + (win << 7) + start;
 
         for (i = size; i != 0; i--) {
           *ptr_tmp = (*ptr_tmp << scale_spec);
diff --git a/decoder/ixheaacd_process.c b/decoder/ixheaacd_process.c
index f1c7202..599908b 100644
--- a/decoder/ixheaacd_process.c
+++ b/decoder/ixheaacd_process.c
@@ -20,7 +20,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <math.h>
-
+#include "ixheaacd_constants.h"
 #include "ixheaacd_type_def.h"
 #include "ixheaacd_memory_standards.h"
 #include "ixheaacd_sbrdecsettings.h"
@@ -38,9 +38,13 @@
 #include "ixheaacd_drc_dec.h"
 
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_channel.h"
 #include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_sbr_scale.h"
 #include "ixheaacd_audioobjtypes.h"
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_aacdec.h"
@@ -48,6 +52,13 @@
 
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
 #include "ixheaacd_mps_interface.h"
 #include "ixheaacd_struct_def.h"
@@ -66,6 +77,7 @@
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
 #include "ixheaacd_main.h"
+#include "ixheaacd_ec.h"
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_bit_extract.h"
 #include "ixheaacd_create.h"
@@ -94,21 +106,16 @@
 VOID ixheaacd_allocate_sbr_scr(ia_sbr_scr_struct *sbr_scratch_struct,
                                VOID *base_scratch_ptr, VOID *output_ptr,
                                WORD total_elements, WORD ch_fac,
-                               WORD32 object_type);
-
-IA_ERRORCODE ixheaacd_applysbr(
-    ia_handle_sbr_dec_inst_struct self,
-    ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream, WORD16 *core_sample_buf,
-    WORD16 *codec_num_channels, FLAG frame_status, FLAG down_samp_flag,
-    FLAG down_mix_flag, ia_sbr_scr_struct *sbr_scratch_struct, WORD32 ps_enable,
-    WORD32 ch_fac, WORD32 slot_element, ia_bit_buf_struct *it_bit_buff,
-    ia_drc_dec_struct *pstr_drc_dec, WORD eld_sbr_flag, WORD32 object_type);
+                               WORD32 object_type, WORD32 total_channels,
+                               WORD8 *p_qshift_arr, UWORD8 slot_element,
+                               WORD32 channel);
 
 IA_ERRORCODE ixheaacd_esbr_process(ia_usac_data_struct *usac_data,
                                    ia_bit_buf_struct *it_bit_buff,
                                    WORD32 stereo_config_idx,
                                    WORD16 num_channels,
-                                   WORD32 audio_object_type) {
+                                   WORD32 audio_object_type,
+                                   WORD32 heaac_mps_present) {
   WORD32 ch;
   WORD32 err_code = 0;
   ia_aac_dec_sbr_bitstream_struct *esbr_bit_str = &usac_data->esbr_bit_str[0];
@@ -117,7 +124,7 @@
   ia_sbr_scr_struct sbr_scratch_struct;
   ixheaacd_allocate_sbr_scr(&sbr_scratch_struct,
                             usac_data->sbr_scratch_mem_base, NULL, 2, 1,
-                            audio_object_type);
+                            audio_object_type, 0, NULL, 0, 0);
 
   self->usac_independency_flag = usac_data->usac_independency_flg;
 
@@ -127,6 +134,13 @@
 
   self->sbr_mode = usac_data->sbr_mode;
   self->aot_usac_flag = usac_data->usac_flag;
+  self->esbr_hq = usac_data->esbr_hq;
+  self->enh_sbr = usac_data->enh_sbr;
+  self->enh_sbr_ps = usac_data->enh_sbr_ps;
+  self->ec_flag = usac_data->ec_flag;
+  self->first_frame = usac_data->first_frame;
+  self->frame_ok = usac_data->frame_ok;
+  self->sbr_parse_complete = usac_data->sbr_parse_complete;
 
   for (ch = 0; ch < num_channels; ch++) {
     if ((self->pstr_sbr_channel[ch]
@@ -137,15 +151,67 @@
 
   err_code = ixheaacd_applysbr(self, esbr_bit_str, NULL, &num_channels, 1, 0, 0,
                                &sbr_scratch_struct, 0, 1, 0, it_bit_buff, NULL,
-                               0, audio_object_type);
+                               0, audio_object_type, 0, 0, 1024,
+                               heaac_mps_present, self->ec_flag, self->first_frame);
 
   usac_data->sbr_mode = self->sbr_mode;
 
   return err_code;
 }
 
-static VOID ixheaacd_sbr_ext_data_read(
-    ia_bit_buf_struct *it_bit_buff,
+IA_ERRORCODE ixheaacd_esbr_parse(ia_usac_data_struct *usac_data, ia_bit_buf_struct *it_bit_buff,
+                                 WORD32 stereo_config_idx, WORD16 num_channels,
+                                 WORD32 audio_object_type)
+{
+  WORD32 err_code = 0;
+  ia_aac_dec_sbr_bitstream_struct *esbr_bit_str = &usac_data->esbr_bit_str[0];
+  ia_handle_sbr_dec_inst_struct self = usac_data->pstr_esbr_dec;
+
+  ia_sbr_scr_struct sbr_scratch_struct;
+  jmp_buf local;
+  ixheaacd_allocate_sbr_scr(&sbr_scratch_struct, usac_data->sbr_scratch_mem_base, NULL, 2, 1,
+                            audio_object_type, 0, NULL, 0, 0);
+
+  self->usac_independency_flag = usac_data->usac_independency_flg;
+
+  self->time_sample_buf[0] = usac_data->time_sample_vector[0];
+  self->time_sample_buf[1] = usac_data->time_sample_vector[1];
+  self->stereo_config_idx = stereo_config_idx;
+  self->pstr_sbr_channel[0]->str_sbr_dec.time_sample_buf = self->time_sample_buf[0];
+  self->pstr_sbr_channel[1]->str_sbr_dec.time_sample_buf = self->time_sample_buf[1];
+
+  self->sbr_mode = usac_data->sbr_mode;
+  self->aot_usac_flag = usac_data->usac_flag;
+  self->esbr_hq = usac_data->esbr_hq;
+  self->enh_sbr = usac_data->enh_sbr;
+  self->enh_sbr_ps = usac_data->enh_sbr_ps;
+  self->ec_flag = usac_data->ec_flag;
+  self->first_frame = usac_data->first_frame;
+  self->frame_ok = usac_data->frame_ok;
+  self->sbr_parse_err_flag = usac_data->sbr_parse_err_flag;
+
+  if (usac_data->ec_flag) {
+    err_code = setjmp(local);
+  }
+  if (err_code == 0) {
+    if (usac_data->ec_flag) {
+      it_bit_buff->xaac_jmp_buf = &local;
+    }
+    err_code = ixheaacd_parse_sbr(self, esbr_bit_str, &num_channels, self->frame_ok,
+                                  &sbr_scratch_struct, it_bit_buff, audio_object_type);
+  } else {
+    usac_data->frame_ok = 0;
+    self->frame_ok = usac_data->frame_ok;
+  }
+
+  usac_data->sbr_mode = self->sbr_mode;
+  usac_data->sbr_parse_err_flag = self->sbr_parse_err_flag;
+  usac_data->sbr_parse_complete = self->sbr_parse_complete;
+
+  return err_code;
+}
+
+static VOID ixheaacd_sbr_ext_data_read(ia_bit_buf_struct *it_bit_buff,
     ia_aac_dec_sbr_bitstream_struct *esbr_bit_str) {
   WORD32 count = 0;
   WORD32 read_bits = 0;
@@ -173,13 +239,16 @@
   }
 }
 
-static WORD32 ixheaacd_read_ext_element(
-    UWORD32 usac_ext_element_default_length,
-    UWORD32 usac_ext_element_payload_frag, ia_bit_buf_struct *it_bit_buff,
-    ia_usac_decoder_config_struct *pstr_usac_dec_config, WORD32 elem_idx) {
+static WORD32 ixheaacd_read_ext_element(UWORD32 usac_ext_element_default_length,
+                                        UWORD32 usac_ext_element_payload_frag,
+                                        ia_bit_buf_struct *it_bit_buff
+                                       ,
+                                        ia_usac_decoder_config_struct *pstr_usac_dec_config,
+                                        WORD32 elem_idx,
+                                        WORD32 *frame_ok) {
   UWORD32 usac_ext_element_present;
   UWORD32 usac_ext_element_use_dft_length;
-  UWORD32 pay_load_length, tmp;
+  UWORD32 pay_load_length;
   WORD32 i;
   usac_ext_element_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
 
@@ -197,11 +266,13 @@
         pay_load_length = (UWORD32)((WORD32)pay_load_length + val_add - 2);
       }
     }
-    if ((it_bit_buff->cnt_bits >> 3) < (WORD32)pay_load_length)
-      return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+    if ((it_bit_buff->cnt_bits >> 3) < (WORD32)pay_load_length) {
+      *frame_ok = 0;
+      longjmp(*(it_bit_buff->xaac_jmp_buf), IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+    }
     if (pay_load_length > 0) {
       if (usac_ext_element_payload_frag)
-        tmp = ixheaacd_read_bits_buf(it_bit_buff, 2);
+        ixheaacd_read_bits_buf(it_bit_buff, 2);
 
       if (pstr_usac_dec_config->usac_ext_ele_payload_present[elem_idx]) {
         WORD32 preroll_counter = pstr_usac_dec_config->preroll_counter;
@@ -223,7 +294,7 @@
       } else {
         if (it_bit_buff->cnt_bits < (WORD32)(pay_load_length << 3)) {
           longjmp(*(it_bit_buff->xaac_jmp_buf),
-                  IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+                  IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
         }
         it_bit_buff->ptr_read_next =
             it_bit_buff->ptr_read_next + pay_load_length;
@@ -311,135 +382,229 @@
   WORD32 elem_idx = 0;
   WORD32 num_ch_out = 0;
   WORD32 num_elements = pstr_usac_dec_config->num_elements;
+  UWORD32 ec_flag = p_state_aac_dec->p_config->ui_err_conceal;
 
-  pstr_usac_data->usac_independency_flg =
-      ixheaacd_read_bits_buf(it_bit_buff, 1);
+  if (ec_flag) {
+    if (it_bit_buff->cnt_bits < 16) {
+      pstr_dec_data->str_usac_data.frame_ok = 0;
+    }
+    if (pstr_dec_data->str_usac_data.frame_ok == 1) {
+      pstr_usac_data->usac_independency_flg = ixheaacd_read_bits_buf(it_bit_buff, 1);
+    }
+  } else {
+    pstr_usac_data->usac_independency_flg = ixheaacd_read_bits_buf(it_bit_buff, 1);
+  }
+
+  if (pstr_usac_data->ec_flag && pstr_dec_data->str_usac_data.frame_ok == 1) {
+    if (!(pstr_usac_data->last_frame_ok) && !(pstr_usac_data->usac_independency_flg)) {
+      pstr_dec_data->str_usac_data.frame_ok = 0;
+    } else {
+      pstr_dec_data->str_usac_data.frame_ok = 1;
+    }
+  }
 
   for (elem_idx = 0; elem_idx < num_elements; elem_idx++) {
     WORD32 stereo_config_index =
         pstr_usac_config->str_usac_dec_config.str_usac_element_config[elem_idx]
             .stereo_config_index;
+    jmp_buf local;
+    if (ec_flag) {
+      err = setjmp(local);
+    }
 
     pstr_usac_data->esbr_bit_str[0].no_elements = 0;
     pstr_usac_data->esbr_bit_str[1].no_elements = 0;
 
-    switch (ele_id = pstr_usac_dec_config->usac_element_type[elem_idx]) {
-      case ID_USAC_SCE:
-        nr_core_coder_channels = 1;
-        num_ch_out += 1;
-        goto core_data_extracting;
-
-      case ID_USAC_CPE:
-        nr_core_coder_channels = (stereo_config_index == 1) ? 1 : 2;
-        if (((stereo_config_index > 1) || (stereo_config_index == 0)) &&
-            (p_state_aac_dec->num_of_output_ch < 2))
-          return -1;
-        num_ch_out += 2;
-        goto core_data_extracting;
-      case ID_USAC_LFE:
-        nr_core_coder_channels = 1;
-        num_ch_out += 1;
-
-      core_data_extracting:
-        if (ch_offset >= MAX_NUM_CHANNELS_USAC_LVL2) return -1;
-        if (num_ch_out > MAX_NUM_CHANNELS_USAC_LVL2) return -1;
-        err = ixheaacd_core_coder_data(ele_id, pstr_usac_data, elem_idx,
-                                       ch_offset, it_bit_buff,
-                                       nr_core_coder_channels);
-        if (err != 0) return -1;
-
-        ixheaacd_sbr_ele_type_set(&pstr_usac_data->esbr_bit_str[0],
-                                  &pstr_usac_data->esbr_bit_str[1], ele_id,
-                                  stereo_config_index);
-
-        if (pstr_usac_data->mps_pseudo_lr[elem_idx])
-          ixheaacd_ms_processing(pstr_usac_data);
-
-        if (ele_id != ID_USAC_LFE) {
-          if (pstr_usac_data->sbr_ratio_idx > 0)
-            ixheaacd_sbr_ext_data_read(it_bit_buff,
-                                       &pstr_usac_data->esbr_bit_str[0]);
-        }
-
-        if ((pstr_usac_data->sbr_ratio_idx > 0) &&
-            (pstr_usac_data->esbr_bit_str[0].no_elements != 0)) {
-          err_code = ixheaacd_esbr_process(
-              pstr_usac_data, it_bit_buff, stereo_config_index,
-              nr_core_coder_channels,
-              pstr_dec_data->str_usac_data.audio_object_type);
-          if (err_code < 0) return err_code;
-        }
-
-        if (stereo_config_index > 0 && pstr_usac_data->sbr_ratio_idx > 0) {
-          FLOAT32 **ptr_inp[2 * 2];
-          WORD32 ch;
-
-          *num_out_channels = p_state_aac_dec->mps_dec_handle.out_ch_count;
-
-          err = ixheaacd_mps_frame_parsing(
-              &p_state_aac_dec->mps_dec_handle,
-              pstr_usac_data->usac_independency_flg, it_bit_buff);
-          if (err) return err;
-
-          for (ch = 0; ch < nr_core_coder_channels; ch++) {
-            ptr_inp[2 * ch] =
-                pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[ch]
-                    ->str_sbr_dec.pp_qmf_buf_real;
-            ptr_inp[2 * ch + 1] =
-                pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[ch]
-                    ->str_sbr_dec.pp_qmf_buf_imag;
-            p_state_aac_dec->mps_dec_handle.p_sbr_dec[ch] =
-                (VOID *)(&pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[ch]
-                              ->str_sbr_dec);
-            p_state_aac_dec->mps_dec_handle.p_sbr_header[ch] =
-                (VOID *)(pstr_usac_data->pstr_esbr_dec->pstr_sbr_header[ch]);
-            p_state_aac_dec->mps_dec_handle.p_sbr_frame[ch] =
-                (VOID *)(pstr_usac_data->pstr_esbr_dec->frame_buffer[ch]);
-          }
-          if (nr_core_coder_channels == 1) {
-            if (p_state_aac_dec->mps_dec_handle.res_ch_count != 0) {
-              ptr_inp[2] = pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1]
-                               ->str_sbr_dec.pp_qmf_buf_real;
-              ptr_inp[2 + 1] =
-                  pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1]
-                      ->str_sbr_dec.pp_qmf_buf_imag;
-            }
-            p_state_aac_dec->mps_dec_handle.p_sbr_dec[1] =
-                (VOID *)(&pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1]
-                              ->str_sbr_dec);
-            p_state_aac_dec->mps_dec_handle.p_sbr_header[1] =
-                (VOID *)(pstr_usac_data->pstr_esbr_dec->pstr_sbr_header[1]);
-            p_state_aac_dec->mps_dec_handle.p_sbr_frame[1] =
-                (VOID *)(pstr_usac_data->pstr_esbr_dec->frame_buffer[1]);
-          }
-
-          err = ixheaacd_mps_apply(&p_state_aac_dec->mps_dec_handle, ptr_inp,
-                                   pstr_usac_data->time_sample_vector);
-          if (err) return err;
-        }
-
-        ch_offset += nr_core_coder_channels;
-        break;
-
-      case ID_USAC_EXT: {
-        ia_usac_dec_element_config_struct *pusac_element_config =
-            &pstr_usac_dec_config->str_usac_element_config[elem_idx];
-        err = ixheaacd_read_ext_element(
-            pusac_element_config->usac_ext_eleme_def_len,
-            pusac_element_config->usac_ext_elem_pld_frag, it_bit_buff,
-            pstr_usac_dec_config, elem_idx);
-        if (err != 0) return err;
-
-        break;
+    if (!err) {
+      if (ec_flag) {
+        it_bit_buff->xaac_jmp_buf = &local;
       }
+      switch (ele_id = pstr_usac_dec_config->usac_element_type[elem_idx]) {
+        case ID_USAC_SCE:
+          nr_core_coder_channels = 1;
+          num_ch_out += 1;
+          goto core_data_extracting;
 
-      default:
+        case ID_USAC_CPE:
+          nr_core_coder_channels = (stereo_config_index == 1) ? 1 : 2;
+          if (((stereo_config_index > 1) || (stereo_config_index == 0)) &&
+              (p_state_aac_dec->num_of_output_ch < 2))
+            return -1;
+          num_ch_out += 2;
+          goto core_data_extracting;
+        case ID_USAC_LFE:
+          nr_core_coder_channels = 1;
+          num_ch_out += 1;
 
-        return -1;
+        core_data_extracting:
+          if (!ec_flag) {
+            if (ch_offset >= MAX_NUM_CHANNELS_USAC_LVL2) return -1;
+            if (num_ch_out > MAX_NUM_CHANNELS_USAC_LVL2) return -1;
+          } else {
+            if ((ch_offset >= MAX_NUM_CHANNELS_USAC_LVL2) ||
+                (num_ch_out > MAX_NUM_CHANNELS_USAC_LVL2)) {
+              pstr_usac_data->frame_ok = 0;
+            }
+          }
 
-        break;
+          err = ixheaacd_core_coder_data(ele_id, pstr_usac_data, elem_idx, ch_offset, it_bit_buff,
+                                         nr_core_coder_channels);
+          if (!ec_flag) {
+            if (err != 0) return -1;
+          } else {
+            if (err != 0) pstr_usac_data->frame_ok = 0;
+          }
+
+          ixheaacd_sbr_ele_type_set(&pstr_usac_data->esbr_bit_str[0],
+                                    &pstr_usac_data->esbr_bit_str[1], ele_id,
+                                    stereo_config_index);
+
+          if (pstr_usac_data->mps_pseudo_lr[elem_idx]) ixheaacd_ms_processing(pstr_usac_data);
+
+          if (ele_id != ID_USAC_LFE) {
+            if (pstr_usac_data->sbr_ratio_idx > 0)
+              ixheaacd_sbr_ext_data_read(it_bit_buff, &pstr_usac_data->esbr_bit_str[0]);
+          }
+
+          if ((pstr_usac_data->sbr_ratio_idx > 0) &&
+              (pstr_usac_data->esbr_bit_str[0].no_elements != 0)) {
+            if (ec_flag) {
+              pstr_usac_data->first_frame = p_state_aac_dec->first_frame;
+            }
+            err_code = ixheaacd_esbr_process(
+                pstr_usac_data, it_bit_buff, stereo_config_index, nr_core_coder_channels,
+                pstr_dec_data->str_frame_data.str_audio_specific_config.audio_object_type,
+                p_state_aac_dec->heaac_mps_handle.heaac_mps_present);
+            if (!ec_flag) {
+              if (err_code < 0) return err_code;
+            } else {
+              if (err_code < 0) pstr_usac_data->frame_ok = 0;
+            }
+          }
+
+          if (stereo_config_index > 0 && pstr_usac_data->sbr_ratio_idx > 0) {
+            FLOAT32 **ptr_inp[2 * 2];
+            WORD32 ch;
+
+            *num_out_channels = p_state_aac_dec->mps_dec_handle.out_ch_count;
+
+            if (!ec_flag && pstr_usac_data->frame_ok == 1) {
+              if (ec_flag) {
+                it_bit_buff->xaac_jmp_buf = &local;
+              }
+              err =
+                  ixheaacd_mps_frame_parsing(&p_state_aac_dec->mps_dec_handle,
+                                             pstr_usac_data->usac_independency_flg, it_bit_buff);
+              if (err) return err;
+            }
+
+            p_state_aac_dec->mps_dec_handle.band_count[0] =
+                pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[0]->str_sbr_dec.band_count;
+            p_state_aac_dec->mps_dec_handle.band_count[1] =
+                pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1]->str_sbr_dec.band_count;
+
+            for (ch = 0; ch < nr_core_coder_channels; ch++) {
+              ptr_inp[2 * ch] = pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[ch]
+                                    ->str_sbr_dec.pp_qmf_buf_real;
+              ptr_inp[2 * ch + 1] = pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[ch]
+                                        ->str_sbr_dec.pp_qmf_buf_imag;
+              p_state_aac_dec->mps_dec_handle.p_sbr_dec[ch] =
+                  (VOID *)(&pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[ch]->str_sbr_dec);
+              p_state_aac_dec->mps_dec_handle.p_sbr_header[ch] =
+                  (VOID *)(pstr_usac_data->pstr_esbr_dec->pstr_sbr_header[ch]);
+              p_state_aac_dec->mps_dec_handle.p_sbr_frame[ch] =
+                  (VOID *)(pstr_usac_data->pstr_esbr_dec->frame_buffer[ch]);
+            }
+            if (nr_core_coder_channels == 1) {
+              if (p_state_aac_dec->mps_dec_handle.res_ch_count != 0) {
+                ptr_inp[2] = pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1]
+                                 ->str_sbr_dec.pp_qmf_buf_real;
+                ptr_inp[2 + 1] = pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1]
+                                     ->str_sbr_dec.pp_qmf_buf_imag;
+              }
+              p_state_aac_dec->mps_dec_handle.p_sbr_dec[1] =
+                  (VOID *)(&pstr_usac_data->pstr_esbr_dec->pstr_sbr_channel[1]->str_sbr_dec);
+              p_state_aac_dec->mps_dec_handle.p_sbr_header[1] =
+                  (VOID *)(pstr_usac_data->pstr_esbr_dec->pstr_sbr_header[1]);
+              p_state_aac_dec->mps_dec_handle.p_sbr_frame[1] =
+                  (VOID *)(pstr_usac_data->pstr_esbr_dec->frame_buffer[1]);
+            }
+            if ((!ec_flag || !p_state_aac_dec->first_frame) &&
+                p_state_aac_dec->mps_dec_handle.mps_init_done == 1) {
+              err = ixheaacd_mps_apply(&p_state_aac_dec->mps_dec_handle, ptr_inp,
+                                       pstr_usac_data->time_sample_vector);
+              if (!ec_flag) {
+                if (err) return err;
+              } else {
+                if (err) pstr_usac_data->frame_ok = 0;
+              }
+            }
+            if (ec_flag) {
+              pstr_usac_data->first_frame = p_state_aac_dec->first_frame;
+              err_code = ixheaacd_esbr_parse(
+                  pstr_usac_data, it_bit_buff, stereo_config_index, nr_core_coder_channels,
+                  pstr_dec_data->str_frame_data.str_audio_specific_config.audio_object_type);
+
+              if (err_code < 0) pstr_usac_data->frame_ok = 0;
+              if (ec_flag) {
+                err = setjmp(local);
+              }
+              if (err == 0 && pstr_usac_data->frame_ok == 1) {
+                if (ec_flag) {
+                  it_bit_buff->xaac_jmp_buf = &local;
+                }
+                err = ixheaacd_mps_frame_parsing(&p_state_aac_dec->mps_dec_handle,
+                                                 pstr_usac_data->usac_independency_flg,
+                                                 it_bit_buff);
+                if (err) pstr_usac_data->frame_ok = 0;
+              } else {
+                pstr_usac_data->frame_ok = 0;
+                if (p_state_aac_dec->mps_dec_handle.num_parameter_sets_prev < 1) {
+                  p_state_aac_dec->mps_dec_handle.num_parameter_sets_prev = 1;
+                }
+              }
+            }
+          } else if ((pstr_usac_data->sbr_ratio_idx > 0) &&
+                     (pstr_usac_data->esbr_bit_str[0].no_elements != 0) && ec_flag) {
+            pstr_usac_data->first_frame = p_state_aac_dec->first_frame;
+            err_code = ixheaacd_esbr_parse(
+                pstr_usac_data, it_bit_buff, stereo_config_index, nr_core_coder_channels,
+                pstr_dec_data->str_frame_data.str_audio_specific_config.audio_object_type);
+            if (err_code < 0) pstr_usac_data->frame_ok = 0;
+          }
+          if (ec_flag) {
+            p_state_aac_dec->first_frame = 0;
+          }
+
+          ch_offset += nr_core_coder_channels;
+          break;
+
+        case ID_USAC_EXT: {
+          ia_usac_dec_element_config_struct *pusac_element_config =
+              &pstr_usac_dec_config->str_usac_element_config[elem_idx];
+          if (pstr_usac_data->frame_ok) {
+            err = ixheaacd_read_ext_element(pusac_element_config->usac_ext_eleme_def_len,
+                                            pusac_element_config->usac_ext_elem_pld_frag,
+                                            it_bit_buff, pstr_usac_dec_config, elem_idx,
+                                            &pstr_usac_data->frame_ok);
+            if (!ec_flag) {
+              if (err != 0) return err;
+            } else {
+              if (err) pstr_usac_data->frame_ok = 0;
+            }
+          }
+          break;
+        }
+
+        default:
+
+          return -1;
+
+          break;
+      }
     }
   }
+  pstr_usac_data->last_frame_ok = pstr_usac_data->frame_ok;
 
   return 0;
 }
diff --git a/decoder/ixheaacd_ps_bitdec.c b/decoder/ixheaacd_ps_bitdec.c
index d255f48..298b602 100644
--- a/decoder/ixheaacd_ps_bitdec.c
+++ b/decoder/ixheaacd_ps_bitdec.c
@@ -95,12 +95,18 @@
   return (WORD16)ret;
 }
 
-VOID ixheaacd_decode_ps_data(ia_ps_dec_struct *ptr_ps_dec) {
+VOID ixheaacd_decode_ps_data(ia_ps_dec_struct *ptr_ps_dec, WORD32 frame_size) {
   WORD e, i, temp;
   WORD16 iid_mode = (WORD16)((ptr_ps_dec->iid_mode) ? 1 : 2);
   WORD16 icc_mode = (WORD16)((ptr_ps_dec->icc_mode) ? 1 : 2);
   WORD16 num_iid_levels =
       (WORD16)(ptr_ps_dec->iid_quant ? NUM_IID_LEVELS_FINE : NUM_IID_LEVELS);
+  WORD32 max_num_columns;
+
+  if (frame_size == 960)
+    max_num_columns = MAX_NUM_COLUMNS_960;
+  else
+    max_num_columns = MAX_NUM_COLUMNS;
 
   if (!ptr_ps_dec->ps_data_present) {
     ptr_ps_dec->num_env = 0;
@@ -231,17 +237,16 @@
     env_count = 0;
 
     for (e = 1; e < ptr_ps_dec->num_env; e++) {
-      env_count = add_d(env_count, MAX_NUM_COLUMNS);
+      env_count = add_d(env_count, max_num_columns);
       ptr_ps_dec->border_position[e] = (WORD16)(env_count >> shift);
     }
-    ptr_ps_dec->border_position[ptr_ps_dec->num_env] = MAX_NUM_COLUMNS;
+    ptr_ps_dec->border_position[ptr_ps_dec->num_env] = max_num_columns;
   } else {
     ptr_ps_dec->border_position[0] = 0;
 
-    if (ptr_ps_dec->border_position[ptr_ps_dec->num_env] < MAX_NUM_COLUMNS) {
+    if (ptr_ps_dec->border_position[ptr_ps_dec->num_env] < max_num_columns) {
       ptr_ps_dec->num_env++;
-      add_d(ptr_ps_dec->num_env, 1);
-      ptr_ps_dec->border_position[ptr_ps_dec->num_env] = MAX_NUM_COLUMNS;
+      ptr_ps_dec->border_position[ptr_ps_dec->num_env] = max_num_columns;
 
       memcpy(ptr_ps_dec->iid_par_table[ptr_ps_dec->num_env - 1],
              ptr_ps_dec->iid_par_table[ptr_ps_dec->num_env - 2],
@@ -254,7 +259,7 @@
 
     for (e = 1; e < ptr_ps_dec->num_env; e++) {
       WORD threshold;
-      threshold = sub_d(MAX_NUM_COLUMNS, sub_d(ptr_ps_dec->num_env, e));
+      threshold = sub_d(max_num_columns, sub_d(ptr_ps_dec->num_env, e));
 
       if (ptr_ps_dec->border_position[e] > threshold) {
         ptr_ps_dec->border_position[e] = threshold;
diff --git a/decoder/ixheaacd_ps_bitdec.h b/decoder/ixheaacd_ps_bitdec.h
index 67f6106..154a170 100644
--- a/decoder/ixheaacd_ps_bitdec.h
+++ b/decoder/ixheaacd_ps_bitdec.h
@@ -22,11 +22,12 @@
 
 #define EXTENSION_ID_PS_CODING 2
 
-WORD16 ixheaacd_read_ps_data(ia_ps_dec_struct *ptr_ps_dec,
-                             ia_bit_buf_struct *it_bit_buff, WORD16 n_bits_left,
-                             ia_ps_tables_struct *ps_tables_ptr);
+#define EXTENSION_ID_ENHSBR_CODING 3
 
-VOID ixheaacd_decode_ps_data(ia_ps_dec_struct *ptr_ps_dec);
+IA_ERRORCODE ixheaacd_read_ps_data(ia_ps_dec_struct *ptr_ps_dec, ia_bit_buf_struct *it_bit_buff,
+  WORD16 n_bits_left, ia_ps_tables_struct *ps_tables_ptr);
+
+VOID ixheaacd_decode_ps_data(ia_ps_dec_struct *ptr_ps_dec, WORD32 frame_size);
 
 extern VOID ixheaacd_map_34_params_to_20(WORD16 *a_idx);
 
diff --git a/decoder/ixheaacd_ps_dec.c b/decoder/ixheaacd_ps_dec.c
index f576ca8..74c019e 100644
--- a/decoder/ixheaacd_ps_dec.c
+++ b/decoder/ixheaacd_ps_dec.c
@@ -44,6 +44,9 @@
 
 #include "ixheaacd_drc_data_struct.h"
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -865,8 +868,7 @@
   WORD16 hybrid_resol;
   WORD32 tmp_real, tmp_img;
   WORD32 tmp_real1, tmp_img1;
-  WORD32 loopcnt;
-  WORD16 H11_H12[128 * 2];
+  WORD16 H11_H12[128 * 2] = {0};
 
   usb = ptr_ps_dec->usb;
 
@@ -938,7 +940,6 @@
       }
     }
   }
-  loopcnt = (usb + 15) >> 4;
 
   for (subband = 0; subband < NO_QMF_CHANNELS_IN_HYBRID; subband++) {
     tmp_real = *p_hyb_left_re1++;
diff --git a/decoder/ixheaacd_ps_dec.h b/decoder/ixheaacd_ps_dec.h
index f441d35..059e5e0 100644
--- a/decoder/ixheaacd_ps_dec.h
+++ b/decoder/ixheaacd_ps_dec.h
@@ -21,6 +21,8 @@
 #define IXHEAACD_PS_DEC_H
 
 #define MAX_NUM_COLUMNS 32
+
+#define MAX_NUM_COLUMNS_960 30
 #define NUM_OF_QUAD_MIRROR_FILTER_CHNLS 64
 #define NUM_OF_ALL_PASS_CHNLS 23
 #define NUM_OF_DEL_CHNLS \
@@ -34,12 +36,61 @@
 #define NUM_OF_QUAD_MIRROR_FILTER_ICC_CHNLS \
   (NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + NUM_OF_DEL_CHNLS)
 #define PEAK_DECAYING_FACT 0x620a
-#define NUM_SER_AP_LINKS 3
+
 #define MAXIM_NUM_OF_PS_ENVLOPS 5
 #define PSC_SQRT05F (0x5a82)
 #define NUM_OF_BINS (20)
 #define NUM_BANDS_FINE (34)
 
+#define NUM_SUB_SAMPLES_960 30
+#define CORE_CODEC_FRAME_SIZE 1024
+#define NUM_SUB_SAMPLES (CORE_CODEC_FRAME_SIZE / 32)
+
+#define NRG_INT_COEFF 0.75f
+#define INIT_FILT_COEFF (1.0f - NRG_INT_COEFF)
+
+#define NEGATE_IPD_MASK (0x00001000)
+
+#define NUM_IPD_STEPS (8)
+#define NUM_OPD_STEPS (8)
+
+#define NUM_HI_RES_BINS (34)
+#define NUM_MID_RES_BINS (20)
+
+#define NUM_HI_RES_IPD_BINS (17)
+
+#define NUM_MID_RES_IPD_BINS (11)
+
+#define NUM_LOW_RES_IPD_BINS (5)
+
+#ifndef _M_PI_
+#define _M_PI_ (3.141592653589793238462643383279)
+#endif
+#define PSC_SQRT2  (1.41421356237309504880)
+#define PSC_PIF ((FLOAT32)_M_PI_)
+#define PSC_SQRT2F ((FLOAT32)PSC_SQRT2)
+
+#define IPD_HALF_RANGE (PSC_PIF)
+#define IPD_SCALE_FACTOR (IPD_HALF_RANGE / NUM_IPD_STEPS)
+#define OPD_HALF_RANGE (PSC_PIF)
+#define OPD_SCALE_FACTOR (OPD_HALF_RANGE / NUM_OPD_STEPS)
+#define NEGATE_IPD_MASK (0x00001000)
+
+#define DECAY_CUTOFF 3
+#define DECAY_CUTOFF_HI_RES 5
+#define DECAY_SLOPE 0.05f
+
+#define PHASE_SMOOTH_HIST1 (0.5f)
+#define PHASE_SMOOTH_HIST2 (0.25f)
+
+#define NUM_QMF_BANDS_IN_HYBRID20 3
+#define NUM_QMF_BANDS_IN_HYBRID34 5
+
+#define MAX_NUM_QMF_CHANNELS_IN_HYBRID (NUM_QMF_BANDS_IN_HYBRID34)
+
+#define PEAK_DECAY_FACTOR_FAST (0.765928338364649f)
+
+
 typedef WORD16((*REVERB_BUFFERS_RI)[NUM_SER_AP_LINKS])[32 * 2];
 typedef WORD16((REVERB_BUFFERS_CH_RI[5])[NUM_SER_AP_LINKS])[16 * 2];
 
@@ -108,10 +159,106 @@
   WORD16 icc_par_table[MAXIM_NUM_OF_PS_ENVLOPS + 2][NUM_BANDS_FINE];
 
   ia_hybrid_struct str_hybrid;
+  FLOAT32 hyb_left_re[CORE_CODEC_FRAME_SIZE / MAX_NUM_COLUMNS][MAX_NUM_COLUMNS];
+  FLOAT32 hyb_left_im[CORE_CODEC_FRAME_SIZE / MAX_NUM_COLUMNS][MAX_NUM_COLUMNS];
+  FLOAT32 hyb_right_re[CORE_CODEC_FRAME_SIZE / MAX_NUM_COLUMNS][MAX_NUM_COLUMNS];
+  FLOAT32 hyb_right_im[CORE_CODEC_FRAME_SIZE / MAX_NUM_COLUMNS][MAX_NUM_COLUMNS];
+
+  FLOAT32 h11_re_vec[NUM_HI_RES_BINS];
+  FLOAT32 h11_im_vec[NUM_HI_RES_BINS];
+  FLOAT32 h12_re_vec[NUM_HI_RES_BINS];
+  FLOAT32 h12_im_vec[NUM_HI_RES_BINS];
+  FLOAT32 h21_re_vec[NUM_HI_RES_BINS];
+  FLOAT32 h21_im_vec[NUM_HI_RES_BINS];
+  FLOAT32 h22_re_vec[NUM_HI_RES_BINS];
+  FLOAT32 h22_im_vec[NUM_HI_RES_BINS];
+
+  FLOAT32 h11_re_prev[NUM_HI_RES_BINS];
+  FLOAT32 h11_im_prev[NUM_HI_RES_BINS];
+  FLOAT32 h12_re_prev[NUM_HI_RES_BINS];
+  FLOAT32 h12_im_prev[NUM_HI_RES_BINS];
+  FLOAT32 h21_re_prev[NUM_HI_RES_BINS];
+  FLOAT32 h21_im_prev[NUM_HI_RES_BINS];
+  FLOAT32 h22_re_prev[NUM_HI_RES_BINS];
+  FLOAT32 h22_im_prev[NUM_HI_RES_BINS];
+
+  FLOAT32 qmf_delay_buf_re[HIGH_DEL][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 qmf_delay_buf_im[HIGH_DEL][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 sub_qmf_delay_buf_re[HIGH_DEL][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 sub_qmf_delay_buf_im[HIGH_DEL][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 ser_qmf_delay_buf_re[NUM_SER_AP_LINKS][5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 ser_qmf_delay_buf_im[NUM_SER_AP_LINKS][5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+  ia_hybrid_flt_struct *ptr_hybrid;
+  ia_hybrid_flt_struct str_flt_hybrid20;
+  ia_hybrid_flt_struct str_flt_hybrid34;
+  WORD32 use_34_st_bands;
+  WORD32 use_34_st_bands_prev;
+  WORD32 ps_mode;
+
+  WORD32 *ptr_group_borders;
+  WORD32 num_groups;
+  WORD32 num_sub_qmf_groups;
+  WORD32 num_bins;
+  WORD32 first_delay_gr;
+  WORD32 *ptr_bins_group_map;
+  WORD32 num_sub_samples;
+  WORD32 num_chans;
+  WORD32 use_pca_rot_flg;
+  WORD32 freq_res_ipd;
+  WORD32 delay_qmf_delay_buf_idx[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  WORD32 delay_qmf_delay_num_samp[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 peak_decay_fast_bin[NUM_HI_RES_BINS];
+  FLOAT32 prev_nrg_bin[NUM_HI_RES_BINS];
+  FLOAT32 prev_peak_diff_bin[NUM_HI_RES_BINS];
+  WORD32 ipd_idx_map_1[NUM_HI_RES_IPD_BINS];
+  WORD32 opd_idx_map_1[NUM_HI_RES_IPD_BINS];
+  WORD32 ipd_idx_map_2[NUM_HI_RES_IPD_BINS];
+  WORD32 opd_idx_map_2[NUM_HI_RES_IPD_BINS];
+
+  WORD32 ipd_idx_map[MAXIM_NUM_OF_PS_ENVLOPS][NUM_HI_RES_IPD_BINS];
+  WORD32 opd_idx_map[MAXIM_NUM_OF_PS_ENVLOPS][NUM_HI_RES_IPD_BINS];
+
+  FLOAT32 ser_sub_qmf_dealy_buf_re[NUM_SER_AP_LINKS][5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 ser_sub_qmf_dealy_buf_im[NUM_SER_AP_LINKS][5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+  FLOAT32 hyb_work_re_20[NUM_SUB_SAMPLES + HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 hyb_work_im_20[NUM_SUB_SAMPLES + HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 hyb_qmf_buf_re_20[MAX_NUM_QMF_CHANNELS_IN_HYBRID][HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 hyb_qmf_buf_im_20[MAX_NUM_QMF_CHANNELS_IN_HYBRID][HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 hyb_temp_re_20[NUM_SUB_SAMPLES][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 hyb_temp_im_20[NUM_SUB_SAMPLES][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+  FLOAT32 hyb_work_re_34[NUM_SUB_SAMPLES + HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 hyb_work_im_34[NUM_SUB_SAMPLES + HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 hyb_qmf_buf_re_34[MAX_NUM_QMF_CHANNELS_IN_HYBRID][HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 hyb_qmf_buf_im_34[MAX_NUM_QMF_CHANNELS_IN_HYBRID][HYBRID_FILTER_LENGTH - 1];
+  FLOAT32 hyb_temp_re_34[NUM_SUB_SAMPLES][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 hyb_temp_im_34[NUM_SUB_SAMPLES][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+  FLOAT32 **pp_qmf_buf_real[2];
+  FLOAT32 **pp_qmf_buf_imag[2];
+  FLOAT32 *time_sample_buf[2];
+
 } ia_ps_dec_struct;
 
+typedef struct {
+  FLAG enable_iid;
+  FLAG enable_icc;
+  WORD16 iid_mode;
+  WORD16 icc_mode;
+  FLAG frame_class;
+  WORD32 freq_res_ipd;
+  WORD16 border_position[MAXIM_NUM_OF_PS_ENVLOPS + 2];
+  FLAG iid_dt[MAXIM_NUM_OF_PS_ENVLOPS];
+  FLAG icc_dt[MAXIM_NUM_OF_PS_ENVLOPS];
+  WORD16 iid_par_table[MAXIM_NUM_OF_PS_ENVLOPS + 2][NUM_BANDS_FINE];
+  WORD16 icc_par_table[MAXIM_NUM_OF_PS_ENVLOPS + 2][NUM_BANDS_FINE];
+} ia_ps_dec_config_struct;
+
 VOID ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec,
-                           VOID *sbr_persistent_mem, WORD32 *ptr_overlap_buf);
+                           VOID *sbr_persistent_mem, WORD32 *ptr_overlap_buf,
+                           WORD32 frame_size);
 
 VOID ixheaacd_decorr_filter1_dec(ia_ps_dec_struct *ptr_ps_dec,
                                  ia_ps_tables_struct *ps_tables_ptr,
@@ -160,7 +307,7 @@
                        WORD32 **imag_buf_left, WORD32 *real_buf_right,
                        WORD32 *imag_buf_right,
                        ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 slot,
-                       ia_sbr_tables_struct *sbr_tables_ptr);
+                       ia_sbr_tables_struct *sbr_tables_ptr, WORD no_col);
 
 VOID ixheaacd_apply_rot_dec(ia_ps_dec_struct *ptr_ps_dec, WORD32 *p_qmf_left_re,
                             WORD32 *p_qmf_left_im, WORD32 *p_qmf_right_re,
@@ -176,6 +323,45 @@
 
 VOID ixheaacd_scale_ps_states(ia_ps_dec_struct *ptr_ps_dec, WORD16 scale);
 
+VOID
+ixheaacd_esbr_apply_ps(ia_ps_dec_struct * ptr_ps_dec,
+                       FLOAT32 **pp_qmf_buf_re_left,
+                       FLOAT32 **pp_qmf_buf_im_left,
+                       FLOAT32 **pp_qmf_buf_re_right,
+                       FLOAT32 **pp_qmf_buf_im_right,
+                       WORD32 usb, ia_ps_tables_struct *ptr_ps_tables,
+                       WORD32 num_time_slot);
+
+VOID
+ixheaacd_esbr_ps_de_correlate(ia_ps_dec_struct *ptr_ps_dec,
+                              FLOAT32 **pp_qmf_buf_re_left,
+                              FLOAT32 **pp_qmf_buf_im_left,
+                              FLOAT32 **pp_qmf_buf_re_right,
+                              FLOAT32 **pp_qmf_buf_im_right,
+                              ia_ps_tables_struct *ptr_ps_tables);
+
+VOID
+ixheaacd_esbr_ps_apply_rotation(ia_ps_dec_struct *ptr_ps_dec,
+                                FLOAT32 **pp_qmf_buf_re_left,
+                                FLOAT32 **pp_qmf_buf_im_left,
+                                FLOAT32 **pp_qmf_buf_re_right,
+                                FLOAT32 **pp_qmf_buf_im_right,
+                                ia_ps_tables_struct *ptr_ps_tables);
+
+WORD32
+ixheaacd_create_hyb_filterbank_esbr_ps(ia_hybrid_flt_struct *pHybrid,
+                                       WORD32 frameSize,
+                                       WORD32 noBands);
+
+WORD32 ixheaacd_create_ps_esbr_dec(ia_ps_dec_struct *ptr_ps_dec_struct,
+                                   ia_ps_tables_struct *ptr_ps_tables,
+                                   UWORD32 noQmfChans,
+                                   UWORD32 num_sub_samples,
+                                   WORD32 ps_mode);
+
+VOID ResetPsDec(ia_ps_dec_struct * ptr_ps_dec);
+VOID ResetPsDeCor(ia_ps_dec_struct * ptr_ps_dec);
+
 extern WORD16 ixheaacd_divideby2(WORD32 op);
 extern WORD16 ixheaacd_divideby3(WORD32 op);
 
diff --git a/decoder/ixheaacd_ps_dec_flt.c b/decoder/ixheaacd_ps_dec_flt.c
new file mode 100644
index 0000000..d16858e
--- /dev/null
+++ b/decoder/ixheaacd_ps_dec_flt.c
@@ -0,0 +1,1224 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+ */
+#include <string.h>
+#include <math.h>
+#include "ixheaacd_sbr_common.h"
+#include "ixheaacd_type_def.h"
+
+#include "ixheaacd_constants.h"
+#include "ixheaacd_basic_ops32.h"
+#include "ixheaacd_basic_ops16.h"
+#include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_basic_ops_arr.h"
+#include "ixheaacd_basic_ops.h"
+
+#include "ixheaacd_defines.h"
+#include "ixheaacd_basic_op.h"
+#include "ixheaacd_intrinsics.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_basic_funcs.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_defines.h"
+
+#include "ixheaacd_pns.h"
+
+#include "ixheaacd_aac_rom.h"
+#include "ixheaacd_pulsedata.h"
+
+#include "ixheaacd_drc_data_struct.h"
+#include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_drc_dec.h"
+
+#include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_sbr_scale.h"
+#include "ixheaacd_lpp_tran.h"
+#include "ixheaacd_env_extr_part.h"
+#include "ixheaacd_sbr_rom.h"
+
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+
+#include "ixheaacd_env_extr.h"
+
+#include "ixheaacd_ps_dec.h"
+
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_env_calc.h"
+#include "ixheaacd_sbr_const.h"
+
+#include "ixheaacd_pvc_dec.h"
+#include "ixheaacd_sbr_dec.h"
+#include "ixheaacd_function_selector.h"
+
+VOID ixheaacd_k_chan_filt(const FLOAT32 *ptr_qmf_re, const FLOAT32 *ptr_qmf_im,
+                          FLOAT32 (*ptr_tmp_hyb_re)[MAX_NUM_QMF_CHANNELS],
+                          FLOAT32 (*ptr_tmp_hyb_im)[MAX_NUM_QMF_CHANNELS], WORD32 nSamples,
+                          WORD32 k, WORD32 bCplx, const FLOAT32 *p,
+                          FLOAT32 *cos_sin_mod_tbl) {
+  WORD32 i, n, q;
+  FLOAT32 real, imag;
+  FLOAT32 cos_val, sin_val;
+  FLOAT32 *p_real_imag = cos_sin_mod_tbl;
+
+  if (bCplx) {
+    for (i = 0; i < nSamples; i++) {
+      for (q = 0; q < k; q++) {
+        real = 0;
+        imag = 0;
+        for (n = 0; n < 13; n++) {
+          cos_val = *p_real_imag++;
+          sin_val = *p_real_imag++;
+          real += p[n] * (ptr_qmf_re[n + i] * cos_val - ptr_qmf_im[n + i] * sin_val);
+          imag += p[n] * (ptr_qmf_im[n + i] * cos_val + ptr_qmf_re[n + i] * sin_val);
+        }
+        ptr_tmp_hyb_re[i][q] = real;
+        ptr_tmp_hyb_im[i][q] = imag;
+      }
+      p_real_imag -= (13 * k * 2);
+    }
+  } else {
+    for (i = 0; i < nSamples; i++) {
+      for (q = 0; q < k; q++) {
+        real = 0;
+        imag = 0;
+        for (n = 0; n < 13; n++) {
+          cos_val = *p_real_imag++;
+          real += p[n] * (ptr_qmf_re[n + i] * cos_val);
+          imag += p[n] * (ptr_qmf_im[n + i] * cos_val);
+        }
+        ptr_tmp_hyb_re[i][q] = real;
+        ptr_tmp_hyb_im[i][q] = imag;
+      }
+      p_real_imag -= (13 * k);
+    }
+  }
+}
+
+VOID ixheaacd_hyb_anal(const FLOAT32 **ptr_qmf_re, const FLOAT32 **ptr_qmf_im,
+                       ia_ps_dec_struct *ptr_ps_dec, ia_ps_tables_struct *ptr_ps_tables,
+                       WORD32 use_34_st_bands) {
+  WORD32 k, n, band;
+  WORD32 band_res;
+  WORD32 frame_size;
+  WORD32 ch_offset = 0;
+  FLOAT32(*ptr_tmp_hyb_re)[MAX_NUM_COLUMNS];
+  FLOAT32(*ptr_tmp_hyb_im)[MAX_NUM_COLUMNS];
+  ia_hybrid_flt_struct *ptr_hybrid;
+  if (!use_34_st_bands) {
+    ptr_tmp_hyb_re = ptr_ps_dec->hyb_left_re;
+    ptr_tmp_hyb_im = ptr_ps_dec->hyb_left_im;
+    ptr_hybrid = &ptr_ps_dec->str_flt_hybrid20;
+  } else {
+    ptr_tmp_hyb_re = NULL;
+    ptr_tmp_hyb_im = ptr_ps_dec->hyb_left_im;
+    ptr_hybrid = &ptr_ps_dec->str_flt_hybrid34;
+  }
+  frame_size = ptr_hybrid->frame_size;
+  for (band = 0; band < ptr_hybrid->num_qmf_bands; band++) {
+    band_res = ptr_hybrid->ptr_resol[band];
+
+    memcpy(ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_qmf_buf_re[band],
+           (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_work_re[0]));
+    memcpy(ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_qmf_buf_im[band],
+           (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_work_im[0]));
+
+    for (n = 0; n < frame_size; n++) {
+      ptr_hybrid->ptr_work_re[(HYBRID_FILTER_LENGTH - 1) + n] =
+          ptr_qmf_re[n + HYBRID_FILTER_DELAY][band];
+      ptr_hybrid->ptr_work_im[(HYBRID_FILTER_LENGTH - 1) + n] =
+          ptr_qmf_im[n + HYBRID_FILTER_DELAY][band];
+    }
+
+    memcpy(ptr_hybrid->ptr_qmf_buf_re[band], ptr_hybrid->ptr_work_re + frame_size,
+           (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_qmf_buf_re[band][0]));
+    memcpy(ptr_hybrid->ptr_qmf_buf_im[band], ptr_hybrid->ptr_work_im + frame_size,
+           (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_qmf_buf_im[band][0]));
+
+    if (ptr_tmp_hyb_re) {
+      switch (band_res) {
+        case NO_HYBRID_CHANNELS_2:
+          ixheaacd_k_chan_filt(
+              ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
+              ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_2, REAL,
+              ptr_ps_tables->p2_13_20,
+              &ptr_ps_tables->cos_mod_2channel[0][0]);
+          break;
+        case NO_HYBRID_CHANNELS_4:
+          ixheaacd_k_chan_filt(
+              ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
+              ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_4, CPLX,
+              ptr_ps_tables->p4_13_34,
+              &ptr_ps_tables->cos_sin_mod_4channel[0][0]);
+          break;
+        case NO_HYBRID_CHANNELS_8:
+          ixheaacd_k_chan_filt(
+              ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
+              ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_8, CPLX,
+              use_34_st_bands ? ptr_ps_tables->p8_13_34 : ptr_ps_tables->p8_13_20,
+              &ptr_ps_tables->cos_sin_mod_8channel[0][0]);
+          break;
+        case NO_HYBRID_CHANNELS_12:
+          ixheaacd_k_chan_filt(ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im,
+                               ptr_hybrid->ptr_temp_re, ptr_hybrid->ptr_temp_im, frame_size,
+                               NO_HYBRID_CHANNELS_12, CPLX, ptr_ps_tables->p12_13_34,
+                               &ptr_ps_tables->cos_sin_mod_12channel[0][0]);
+          break;
+        default:
+          break;
+      }
+
+      for (n = 0; n < frame_size; n++) {
+        for (k = 0; k < (WORD32)band_res; k++) {
+          ptr_tmp_hyb_re[n][ch_offset + k] = ptr_hybrid->ptr_temp_re[n][k];
+          ptr_tmp_hyb_im[n][ch_offset + k] = ptr_hybrid->ptr_temp_im[n][k];
+        }
+      }
+      ch_offset += band_res;
+    }
+  }
+}
+
+VOID ixheaacd_hyb_synth(
+    FLOAT32 (*ptr_tmp_hyb_re)[MAX_NUM_COLUMNS],
+    FLOAT32 (*ptr_tmp_hyb_im)[MAX_NUM_COLUMNS],
+    FLOAT32 **ptr_qmf_re,
+    FLOAT32 **ptr_qmf_im,
+    ia_hybrid_flt_struct *ptr_hybrid) {
+  WORD32 k, n, band;
+  WORD16 band_res;
+  WORD32 frame_size = ptr_hybrid->frame_size;
+  WORD32 ch_offset = 0;
+
+  for (band = 0; band < ptr_hybrid->num_qmf_bands; band++) {
+    band_res = ptr_hybrid->ptr_resol[band];
+
+    for (n = 0; n < frame_size; n++) {
+      ptr_qmf_re[n][band] = ptr_qmf_im[n][band] = 0;
+
+      for (k = 0; k < (WORD32)band_res; k++) {
+        ptr_qmf_re[n][band] += ptr_tmp_hyb_re[n][ch_offset + k];
+        ptr_qmf_im[n][band] += ptr_tmp_hyb_im[n][ch_offset + k];
+      }
+    }
+    ch_offset += band_res;
+  }
+}
+
+VOID ixheaacd_map_34_float_to_20(FLOAT32 *ptr_index) {
+  ptr_index[0] = (2 * ptr_index[0] + ptr_index[1]) / 3.0f;
+  ptr_index[1] = (ptr_index[1] + 2 * ptr_index[2]) / 3.0f;
+  ptr_index[2] = (2 * ptr_index[3] + ptr_index[4]) / 3.0f;
+  ptr_index[3] = (ptr_index[4] + 2 * ptr_index[5]) / 3.0f;
+  ptr_index[4] = (ptr_index[6] + ptr_index[7]) / 2.0f;
+  ptr_index[5] = (ptr_index[8] + ptr_index[9]) / 2.0f;
+  ptr_index[6] = ptr_index[10];
+  ptr_index[7] = ptr_index[11];
+  ptr_index[8] = (ptr_index[12] + ptr_index[13]) / 2.0f;
+  ptr_index[9] = (ptr_index[14] + ptr_index[15]) / 2.0f;
+  ptr_index[10] = ptr_index[16];
+  ptr_index[11] = ptr_index[17];
+  ptr_index[12] = ptr_index[18];
+  ptr_index[13] = ptr_index[19];
+  ptr_index[14] = (ptr_index[20] + ptr_index[21]) / 2.0f;
+  ptr_index[15] = (ptr_index[22] + ptr_index[23]) / 2.0f;
+  ptr_index[16] = (ptr_index[24] + ptr_index[25]) / 2.0f;
+  ptr_index[17] = (ptr_index[26] + ptr_index[27]) / 2.0f;
+  ptr_index[18] = (ptr_index[28] + ptr_index[29] + ptr_index[30] + ptr_index[31]) / 4.0f;
+  ptr_index[19] = (ptr_index[32] + ptr_index[33]) / 2.0f;
+}
+
+VOID ixheaacd_map_20_float_to_34(FLOAT32 *ptr_index) {
+  FLOAT32 arr_temp[NUM_HI_RES_BINS];
+  WORD32 i;
+
+  arr_temp[0] = ptr_index[0];
+  arr_temp[1] = (ptr_index[0] + ptr_index[1]) / 2.0f;
+  arr_temp[2] = ptr_index[1];
+  arr_temp[3] = ptr_index[2];
+  arr_temp[4] = (ptr_index[2] + ptr_index[3]) / 2.0f;
+  arr_temp[5] = ptr_index[3];
+  arr_temp[6] = ptr_index[4];
+  arr_temp[7] = ptr_index[4];
+  arr_temp[8] = ptr_index[5];
+  arr_temp[9] = ptr_index[5];
+  arr_temp[10] = ptr_index[6];
+  arr_temp[11] = ptr_index[7];
+  arr_temp[12] = ptr_index[8];
+  arr_temp[13] = ptr_index[8];
+  arr_temp[14] = ptr_index[9];
+  arr_temp[15] = ptr_index[9];
+  arr_temp[16] = ptr_index[10];
+  arr_temp[17] = ptr_index[11];
+  arr_temp[18] = ptr_index[12];
+  arr_temp[19] = ptr_index[13];
+  arr_temp[20] = ptr_index[14];
+  arr_temp[21] = ptr_index[14];
+  arr_temp[22] = ptr_index[15];
+  arr_temp[23] = ptr_index[15];
+  arr_temp[24] = ptr_index[16];
+  arr_temp[25] = ptr_index[16];
+  arr_temp[26] = ptr_index[17];
+  arr_temp[27] = ptr_index[17];
+  arr_temp[28] = ptr_index[18];
+  arr_temp[29] = ptr_index[18];
+  arr_temp[30] = ptr_index[18];
+  arr_temp[31] = ptr_index[18];
+  arr_temp[32] = ptr_index[19];
+  arr_temp[33] = ptr_index[19];
+
+  for (i = 0; i < 34; i++) {
+    ptr_index[i] = arr_temp[i];
+  }
+}
+
+WORD32 ixheaacd_create_ps_esbr_dec(ia_ps_dec_struct *ptr_ps_dec_struct,
+                                   ia_ps_tables_struct *ptr_ps_tables, UWORD32 noQmfChans,
+                                   UWORD32 num_sub_samples, WORD32 ps_mode) {
+  UWORD32 i;
+  ia_ps_dec_struct *ptr_ps_dec = ptr_ps_dec_struct;
+
+  ptr_ps_dec = ptr_ps_dec_struct;
+
+  ptr_ps_dec->num_sub_samples = num_sub_samples;
+  ptr_ps_dec->num_chans = noQmfChans;
+  ptr_ps_dec->ps_mode = ps_mode;
+
+  ptr_ps_dec->ps_data_present = 0;
+  ptr_ps_dec->enable_iid = 0;
+  ptr_ps_dec->iid_mode = 0;
+  ptr_ps_dec->enable_icc = 0;
+  ptr_ps_dec->icc_mode = 0;
+  ptr_ps_dec->enable_ext = 0;
+
+  ptr_ps_dec->use_pca_rot_flg = 0;
+  ptr_ps_dec->freq_res_ipd = 0;
+  ptr_ps_dec->use_34_st_bands = 0;
+  ptr_ps_dec->use_34_st_bands_prev = 0;
+
+  ptr_ps_dec->str_flt_hybrid20.frame_size = ptr_ps_dec->num_sub_samples;
+  ptr_ps_dec->str_flt_hybrid20.num_qmf_bands = NUM_QMF_BANDS_IN_HYBRID20;
+  ptr_ps_dec->str_flt_hybrid20.ptr_resol = (WORD16 *)&ptr_ps_tables->band_res_hyb20[0];
+  ptr_ps_dec->str_flt_hybrid20.ptr_work_re = &ptr_ps_dec->hyb_work_re_20[0];
+  ptr_ps_dec->str_flt_hybrid20.ptr_work_im = &ptr_ps_dec->hyb_work_im_20[0];
+  ptr_ps_dec->str_flt_hybrid20.ptr_qmf_buf_re = ptr_ps_dec->hyb_qmf_buf_re_20;
+  ptr_ps_dec->str_flt_hybrid20.ptr_qmf_buf_im = ptr_ps_dec->hyb_qmf_buf_im_20;
+  ptr_ps_dec->str_flt_hybrid20.ptr_temp_re = ptr_ps_dec->hyb_temp_re_20;
+  ptr_ps_dec->str_flt_hybrid20.ptr_temp_im = ptr_ps_dec->hyb_temp_im_20;
+
+  ptr_ps_dec->str_flt_hybrid34.frame_size = ptr_ps_dec->num_sub_samples;
+  ptr_ps_dec->str_flt_hybrid34.num_qmf_bands = NUM_QMF_BANDS_IN_HYBRID34;
+  ptr_ps_dec->str_flt_hybrid34.ptr_resol = (WORD16 *)&ptr_ps_tables->band_res_hyb34[0];
+  ptr_ps_dec->str_flt_hybrid34.ptr_work_re = &ptr_ps_dec->hyb_work_re_34[0];
+  ptr_ps_dec->str_flt_hybrid34.ptr_work_im = &ptr_ps_dec->hyb_work_im_34[0];
+  ptr_ps_dec->str_flt_hybrid34.ptr_qmf_buf_re = ptr_ps_dec->hyb_qmf_buf_re_34;
+  ptr_ps_dec->str_flt_hybrid34.ptr_qmf_buf_im = ptr_ps_dec->hyb_qmf_buf_im_34;
+  ptr_ps_dec->str_flt_hybrid34.ptr_temp_re = ptr_ps_dec->hyb_temp_re_34;
+  ptr_ps_dec->str_flt_hybrid34.ptr_temp_im = ptr_ps_dec->hyb_temp_im_34;
+
+  ptr_ps_dec->delay_buf_idx = 0;
+
+  for (i = 0; i < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; i++) {
+    ptr_ps_dec->delay_qmf_delay_buf_idx[i] = 0;
+    ptr_ps_dec->delay_qmf_delay_num_samp[i] = ptr_ps_tables->qmf_delay_idx_tbl[i];
+  }
+
+  for (i = 0; i < NUM_HI_RES_BINS; i++) {
+    ptr_ps_dec->h11_re_prev[i] = 1.0f;
+    ptr_ps_dec->h12_re_prev[i] = 1.0f;
+  }
+
+  memset(ptr_ps_dec->h11_im_prev, 0, sizeof(ptr_ps_dec->h11_im_prev));
+  memset(ptr_ps_dec->h12_im_prev, 0, sizeof(ptr_ps_dec->h12_im_prev));
+  memset(ptr_ps_dec->h21_re_prev, 0, sizeof(ptr_ps_dec->h21_re_prev));
+  memset(ptr_ps_dec->h22_re_prev, 0, sizeof(ptr_ps_dec->h22_re_prev));
+  memset(ptr_ps_dec->h21_im_prev, 0, sizeof(ptr_ps_dec->h21_im_prev));
+  memset(ptr_ps_dec->h22_im_prev, 0, sizeof(ptr_ps_dec->h22_im_prev));
+
+  memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
+  memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
+  memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
+  memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
+
+  for (i = 0; i < NUM_HI_RES_BINS; i++) {
+    ptr_ps_dec->peak_decay_fast_bin[i] = 0.0f;
+    ptr_ps_dec->prev_nrg_bin[i] = 0.0f;
+    ptr_ps_dec->prev_peak_diff_bin[i] = 0.0f;
+  }
+
+  memset(ptr_ps_dec->qmf_delay_buf_re, 0, sizeof(ptr_ps_dec->qmf_delay_buf_re));
+  memset(ptr_ps_dec->qmf_delay_buf_im, 0, sizeof(ptr_ps_dec->qmf_delay_buf_im));
+  memset(ptr_ps_dec->sub_qmf_delay_buf_re, 0, sizeof(ptr_ps_dec->sub_qmf_delay_buf_re));
+  memset(ptr_ps_dec->sub_qmf_delay_buf_im, 0, sizeof(ptr_ps_dec->sub_qmf_delay_buf_im));
+
+  for (i = 0; i < NUM_SER_AP_LINKS; i++) {
+    memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
+           sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
+    memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
+           sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
+    memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
+           sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
+    memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
+           sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
+  }
+
+  return 0;
+}
+
+VOID ixheaacd_esbr_apply_ps(ia_ps_dec_struct *ptr_ps_dec,
+                            FLOAT32 **pp_qmf_buf_re_left,
+                            FLOAT32 **pp_qmf_buf_im_left,
+                            FLOAT32 **pp_qmf_buf_re_right,
+                            FLOAT32 **pp_qmf_buf_im_right,
+                            WORD32 usb, ia_ps_tables_struct *ptr_ps_tables,
+                            WORD32 num_time_slot) {
+  WORD32 sb;
+  WORD32 i, k;
+
+  WORD32 max_num_column;
+
+  if (num_time_slot == 15)
+    max_num_column = MAX_NUM_COLUMNS_960;
+  else
+    max_num_column = MAX_NUM_COLUMNS;
+
+  if (ptr_ps_dec->use_34_st_bands) {
+    ptr_ps_dec->ptr_group_borders = (WORD32 *)&ptr_ps_tables->group_borders_34_tbl[0];
+    ptr_ps_dec->ptr_bins_group_map = (WORD32 *)&ptr_ps_tables->bin_group_map_34[0];
+    ptr_ps_dec->ptr_hybrid = &ptr_ps_dec->str_flt_hybrid34;
+    ptr_ps_dec->num_groups = NUM_IID_GROUPS_HI_RES;
+    ptr_ps_dec->num_sub_qmf_groups = SUBQMF_GROUPS_HI_RES;
+    ptr_ps_dec->num_bins = NUM_HI_RES_BINS;
+    ptr_ps_dec->first_delay_gr = SUBQMF_GROUPS_HI_RES;
+  } else {
+    ptr_ps_dec->ptr_group_borders = (WORD32 *)&ptr_ps_tables->group_borders_20_tbl[0];
+    ptr_ps_dec->ptr_bins_group_map = (WORD32 *)&ptr_ps_tables->bin_group_map_20[0];
+    ptr_ps_dec->ptr_hybrid = &ptr_ps_dec->str_flt_hybrid20;
+    ptr_ps_dec->num_groups = NUM_IID_GROUPS;
+    ptr_ps_dec->num_sub_qmf_groups = SUBQMF_GROUPS;
+    ptr_ps_dec->num_bins = NUM_MID_RES_BINS;
+    ptr_ps_dec->first_delay_gr = SUBQMF_GROUPS;
+  }
+
+  for (sb = usb; sb < ptr_ps_dec->num_chans; sb++) {
+    for (i = 0; i < NUM_SER_AP_LINKS; i++) {
+      for (k = 0; k < ptr_ps_dec->delay_sample_ser[i]; k++) {
+        ptr_ps_dec->ser_qmf_delay_buf_re[i][k][sb] = 0;
+        ptr_ps_dec->ser_qmf_delay_buf_im[i][k][sb] = 0;
+      }
+    }
+    for (k = 0; k < HIGH_DEL; k++) {
+      ptr_ps_dec->qmf_delay_buf_re[k][sb] = 0;
+      ptr_ps_dec->qmf_delay_buf_im[k][sb] = 0;
+    }
+  }
+  ixheaacd_hyb_anal((const FLOAT32 **)pp_qmf_buf_re_left,
+                    (const FLOAT32 **)pp_qmf_buf_im_left,
+                    ptr_ps_dec, ptr_ps_tables, 0);
+  ixheaacd_hyb_anal((const FLOAT32 **)pp_qmf_buf_re_left,
+                    (const FLOAT32 **)pp_qmf_buf_im_left,
+                    ptr_ps_dec, ptr_ps_tables, 1);
+
+  if (!ptr_ps_dec->use_34_st_bands) {
+    WORD32 k;
+    for (k = 0; k < (WORD32)ptr_ps_dec->num_sub_samples; k++) {
+      ptr_ps_dec->hyb_left_re[k][3] += ptr_ps_dec->hyb_left_re[k][4];
+      ptr_ps_dec->hyb_left_im[k][3] += ptr_ps_dec->hyb_left_im[k][4];
+      ptr_ps_dec->hyb_left_re[k][4] = 0.;
+      ptr_ps_dec->hyb_left_im[k][4] = 0.;
+
+      ptr_ps_dec->hyb_left_re[k][2] += ptr_ps_dec->hyb_left_re[k][5];
+      ptr_ps_dec->hyb_left_im[k][2] += ptr_ps_dec->hyb_left_im[k][5];
+      ptr_ps_dec->hyb_left_re[k][5] = 0.;
+      ptr_ps_dec->hyb_left_im[k][5] = 0.;
+    }
+  }
+
+  if (ptr_ps_dec->ps_mode & 0x0080) {
+    WORD32 i, j;
+    for (i = 0; i < max_num_column; i++) {
+      for (j = 0; j < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; j++) {
+        pp_qmf_buf_im_right[i][j] = pp_qmf_buf_im_left[i][j];
+        pp_qmf_buf_re_right[i][j] = pp_qmf_buf_re_left[i][j];
+      }
+    }
+    for (i = 0; i < max_num_column; i++) {
+      for (j = 0; j < NUM_SUB_QMF_CHANNELS_HI_RES; j++) {
+        ptr_ps_dec->hyb_right_re[i][j] = ptr_ps_dec->hyb_left_re[i][j];
+        ptr_ps_dec->hyb_right_im[i][j] = ptr_ps_dec->hyb_left_im[i][j];
+      }
+    }
+  } else {
+    if (ptr_ps_dec->ps_mode & 0x0002) {
+      WORD32 i, j;
+      for (i = 0; i < max_num_column; i++) {
+        for (j = 0; j < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; j++) {
+          pp_qmf_buf_im_right[i][j] = 0.;
+          pp_qmf_buf_re_right[i][j] = 0.;
+        }
+      }
+      for (i = 0; i < max_num_column; i++) {
+        for (j = 0; j < NUM_SUB_QMF_CHANNELS_HI_RES; j++) {
+          ptr_ps_dec->hyb_right_re[i][j] = 0.;
+          ptr_ps_dec->hyb_right_im[i][j] = 0.;
+        }
+      }
+    } else {
+      ixheaacd_esbr_ps_de_correlate(ptr_ps_dec, pp_qmf_buf_re_left, pp_qmf_buf_im_left,
+                                    pp_qmf_buf_re_right, pp_qmf_buf_im_right,
+                                    ptr_ps_tables);
+    }
+
+    if (!(ptr_ps_dec->ps_mode & 0x0040)) {
+      ixheaacd_esbr_ps_apply_rotation(ptr_ps_dec, pp_qmf_buf_re_left, pp_qmf_buf_im_left,
+                                      pp_qmf_buf_re_right, pp_qmf_buf_im_right,
+                                      ptr_ps_tables);
+    }
+  }
+
+  ixheaacd_hyb_synth(ptr_ps_dec->hyb_left_re, ptr_ps_dec->hyb_left_im,
+                     pp_qmf_buf_re_left, pp_qmf_buf_im_left, ptr_ps_dec->ptr_hybrid);
+
+  ixheaacd_hyb_synth(ptr_ps_dec->hyb_right_re, ptr_ps_dec->hyb_right_im,
+                     pp_qmf_buf_re_right, pp_qmf_buf_im_right, ptr_ps_dec->ptr_hybrid);
+
+  ptr_ps_dec->use_34_st_bands_prev = ptr_ps_dec->use_34_st_bands;
+
+}
+
+VOID ixheaacd_esbr_ps_de_correlate(
+    ia_ps_dec_struct *ptr_ps_dec,
+    FLOAT32 **pp_qmf_buf_re_left,
+    FLOAT32 **pp_qmf_buf_im_left,
+    FLOAT32 **pp_qmf_buf_re_right,
+    FLOAT32 **pp_qmf_buf_im_right,
+    ia_ps_tables_struct *ptr_ps_tables) {
+  WORD32 sb, maxsb, gr, k;
+  WORD32 m;
+  WORD32 l_delay = 0;
+  WORD32 l_ser_delay_arr[NUM_SER_AP_LINKS] = {0};
+  FLOAT32 re_left;
+  FLOAT32 im_left;
+  FLOAT32 peak_diff, nrg, trans_ratio;
+
+  FLOAT32(*pp_hyb_left_re)[MAX_NUM_COLUMNS];
+  FLOAT32(*pp_hyb_left_im)[MAX_NUM_COLUMNS];
+  FLOAT32(*pp_hyb_right_re)[MAX_NUM_COLUMNS];
+  FLOAT32(*pp_hyb_right_im)[MAX_NUM_COLUMNS];
+
+  FLOAT32(*ppp_ser_sub_qmf_dealy_buf_re)[5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32(*ppp_ser_sub_qmf_dealy_buf_im)[5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32(*pp_sub_qmf_delay_buf_re)[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32(*pp_sub_qmf_delay_buf_im)[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
+
+  FLOAT32 *pp_frac_delay_phase_fac_re;
+  FLOAT32 *pp_frac_delay_phase_fac_im;
+  FLOAT32(*pp_frac_delay_phase_fac_ser_re)[NUM_SER_AP_LINKS];
+  FLOAT32(*pp_frac_delay_phase_fac_ser_im)[NUM_SER_AP_LINKS];
+
+  WORD32 *p_delay_qmf_delay_num_samp = NULL;
+  WORD32 *p_delay_qmf_delay_buf_idx = NULL;
+
+  FLOAT32 pow_arr[32][NUM_HI_RES_BINS];
+  FLOAT32 trans_ratio_arr[32][NUM_HI_RES_BINS];
+  WORD32 bin;
+  FLOAT32 decay_cutoff;
+
+  pp_hyb_left_re = ptr_ps_dec->hyb_left_re;
+  pp_hyb_left_im = ptr_ps_dec->hyb_left_im;
+  pp_hyb_right_re = ptr_ps_dec->hyb_right_re;
+  pp_hyb_right_im = ptr_ps_dec->hyb_right_im;
+
+  ppp_ser_sub_qmf_dealy_buf_re = ptr_ps_dec->ser_sub_qmf_dealy_buf_re;
+  ppp_ser_sub_qmf_dealy_buf_im = ptr_ps_dec->ser_sub_qmf_dealy_buf_im;
+
+  pp_sub_qmf_delay_buf_re = ptr_ps_dec->sub_qmf_delay_buf_re;
+  pp_sub_qmf_delay_buf_im = ptr_ps_dec->sub_qmf_delay_buf_im;
+
+  if (ptr_ps_dec->use_34_st_bands != ptr_ps_dec->use_34_st_bands_prev) {
+    if (ptr_ps_dec->use_34_st_bands) {
+      WORD32 i;
+      for (i = 0; i < NUM_SER_AP_LINKS; i++) {
+        memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
+               sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
+        memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
+               sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
+        memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
+               sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
+        memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
+               sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
+      }
+      return;
+    } else {
+      WORD32 i;
+      for (i = 0; i < NUM_SER_AP_LINKS; i++) {
+        memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
+               sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
+        memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
+               sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
+        memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
+               sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
+        memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
+               sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
+      }
+
+      return;
+    }
+  }
+
+  if (ptr_ps_dec->use_34_st_bands) {
+    pp_frac_delay_phase_fac_re = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_re_34;
+    pp_frac_delay_phase_fac_im = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_im_34;
+    pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_re_34;
+    pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_im_34;
+  } else {
+    pp_frac_delay_phase_fac_re = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_re_20;
+    pp_frac_delay_phase_fac_im = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_im_20;
+    pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_re_20;
+    pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_im_20;
+  }
+
+  for (k = 0; k < 32; k++) {
+    for (bin = 0; bin < NUM_HI_RES_BINS; bin++) {
+      pow_arr[k][bin] = 0;
+    }
+  }
+
+  for (gr = 0; gr < ptr_ps_dec->num_sub_qmf_groups; gr++) {
+    bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
+    maxsb = ptr_ps_dec->ptr_group_borders[gr] + 1;
+    for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
+      for (k = ptr_ps_dec->border_position[0];
+           k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
+        im_left = pp_hyb_left_re[k][sb];
+        re_left = pp_hyb_left_im[k][sb];
+        pow_arr[k][bin] += im_left * im_left + re_left * re_left;
+      }
+    }
+  }
+  for (; gr < ptr_ps_dec->num_groups; gr++) {
+    bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
+    maxsb = ptr_ps_dec->ptr_group_borders[gr + 1];
+    for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
+      for (k = ptr_ps_dec->border_position[0];
+           k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
+        im_left = pp_qmf_buf_re_left[k][sb];
+        re_left = pp_qmf_buf_im_left[k][sb];
+        pow_arr[k][bin] += im_left * im_left + re_left * re_left;
+      }
+    }
+  }
+
+  for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
+    for (k = ptr_ps_dec->border_position[0];
+         k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
+      FLOAT32 q = 1.5f;
+
+      ptr_ps_dec->peak_decay_fast_bin[bin] *= PEAK_DECAY_FACTOR_FAST;
+      if (ptr_ps_dec->peak_decay_fast_bin[bin] < pow_arr[k][bin])
+        ptr_ps_dec->peak_decay_fast_bin[bin] = pow_arr[k][bin];
+
+      peak_diff = ptr_ps_dec->prev_peak_diff_bin[bin];
+      peak_diff += INIT_FILT_COEFF * (ptr_ps_dec->peak_decay_fast_bin[bin] -
+                                      pow_arr[k][bin] -
+                                      ptr_ps_dec->prev_peak_diff_bin[bin]);
+      ptr_ps_dec->prev_peak_diff_bin[bin] = peak_diff;
+
+      nrg = ptr_ps_dec->prev_nrg_bin[bin];
+      nrg += INIT_FILT_COEFF * (pow_arr[k][bin] - ptr_ps_dec->prev_nrg_bin[bin]);
+      ptr_ps_dec->prev_nrg_bin[bin] = nrg;
+      if (q * peak_diff <= nrg) {
+        trans_ratio_arr[k][bin] = 1.0f;
+      } else {
+        trans_ratio_arr[k][bin] = nrg / (q * peak_diff);
+      }
+    }
+  }
+
+  if (ptr_ps_dec->use_34_st_bands) {
+    decay_cutoff = DECAY_CUTOFF_HI_RES;
+  } else {
+    decay_cutoff = DECAY_CUTOFF;
+  }
+
+  for (gr = 0; gr < ptr_ps_dec->num_sub_qmf_groups; gr++) {
+    maxsb = ptr_ps_dec->ptr_group_borders[gr] + 1;
+
+    for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
+      FLOAT32 decay_scale_factor;
+
+      decay_scale_factor = 1.0f;
+
+      decay_scale_factor = max(decay_scale_factor, 0.0f);
+
+      l_delay = ptr_ps_dec->delay_buf_idx;
+      for (k = 0; k < NUM_SER_AP_LINKS; k++)
+        l_ser_delay_arr[k] = ptr_ps_dec->delay_buf_idx_ser[k];
+
+      for (k = ptr_ps_dec->border_position[0];
+           k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
+        FLOAT32 real, imag, real0, imag0, r_r0, i_r0;
+
+        im_left = pp_hyb_left_re[k][sb];
+        re_left = pp_hyb_left_im[k][sb];
+
+        {
+          real0 = pp_sub_qmf_delay_buf_re[l_delay][sb];
+          imag0 = pp_sub_qmf_delay_buf_im[l_delay][sb];
+          pp_sub_qmf_delay_buf_re[l_delay][sb] = im_left;
+          pp_sub_qmf_delay_buf_im[l_delay][sb] = re_left;
+
+          real = real0 * pp_frac_delay_phase_fac_re[sb] - imag0 *
+                 pp_frac_delay_phase_fac_im[sb];
+          imag = real0 * pp_frac_delay_phase_fac_im[sb] + imag0 *
+                 pp_frac_delay_phase_fac_re[sb];
+
+          r_r0 = real;
+          i_r0 = imag;
+          for (m = 0; m < NUM_SER_AP_LINKS; m++) {
+            real0 = ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb];
+            imag0 = ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb];
+            real = real0 * pp_frac_delay_phase_fac_ser_re[sb][m] -
+                   imag0 * pp_frac_delay_phase_fac_ser_im[sb][m];
+            imag = real0 * pp_frac_delay_phase_fac_ser_im[sb][m] +
+                   imag0 * pp_frac_delay_phase_fac_ser_re[sb][m];
+
+            real += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * r_r0;
+            imag += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * i_r0;
+            ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb] =
+                r_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * real;
+            ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb] =
+                i_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * imag;
+            r_r0 = real;
+            i_r0 = imag;
+          }
+        }
+
+        bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
+        trans_ratio = trans_ratio_arr[k][bin];
+
+        pp_hyb_right_re[k][sb] = trans_ratio * r_r0;
+        pp_hyb_right_im[k][sb] = trans_ratio * i_r0;
+
+        if (++l_delay >= DEL_ALL_PASS) l_delay = 0;
+
+        for (m = 0; m < NUM_SER_AP_LINKS; m++) {
+          if (++l_ser_delay_arr[m] >= ptr_ps_dec->delay_sample_ser[m]) {
+            l_ser_delay_arr[m] = 0;
+          }
+        }
+      }
+    }
+  }
+  {
+    ppp_ser_sub_qmf_dealy_buf_re = ptr_ps_dec->ser_qmf_delay_buf_re;
+    ppp_ser_sub_qmf_dealy_buf_im = ptr_ps_dec->ser_qmf_delay_buf_im;
+
+    pp_sub_qmf_delay_buf_re = ptr_ps_dec->qmf_delay_buf_re;
+    pp_sub_qmf_delay_buf_im = ptr_ps_dec->qmf_delay_buf_im;
+
+    pp_frac_delay_phase_fac_re = ptr_ps_tables->qmf_fract_delay_phase_factor_re;
+    pp_frac_delay_phase_fac_im = ptr_ps_tables->qmf_fract_delay_phase_factor_im;
+
+    pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->qmf_ser_fract_delay_phase_factor_re;
+    pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->qmf_ser_fract_delay_phase_factor_im;
+
+    p_delay_qmf_delay_buf_idx = ptr_ps_dec->delay_qmf_delay_buf_idx;
+    p_delay_qmf_delay_num_samp = ptr_ps_dec->delay_qmf_delay_num_samp;
+  }
+  for (; gr < ptr_ps_dec->num_groups; gr++) {
+    maxsb = ptr_ps_dec->ptr_group_borders[gr + 1];
+
+    for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
+      FLOAT32 decay_scale_factor;
+      if (sb <= decay_cutoff)
+        decay_scale_factor = 1.0f;
+      else
+        decay_scale_factor = 1.0f + decay_cutoff * DECAY_SLOPE - DECAY_SLOPE * sb;
+
+      decay_scale_factor = max(decay_scale_factor, 0.0f);
+
+      l_delay = ptr_ps_dec->delay_buf_idx;
+      for (k = 0; k < NUM_SER_AP_LINKS; k++)
+        l_ser_delay_arr[k] = ptr_ps_dec->delay_buf_idx_ser[k];
+
+      for (k = ptr_ps_dec->border_position[0];
+           k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
+        FLOAT32 real, imag, real0, imag0, r_r0, i_r0;
+
+        im_left = pp_qmf_buf_re_left[k][sb];
+        re_left = pp_qmf_buf_im_left[k][sb];
+
+        if (gr >= ptr_ps_dec->first_delay_gr && sb >= NUM_OF_ALL_PASS_CHNLS) {
+          real = pp_sub_qmf_delay_buf_re[p_delay_qmf_delay_buf_idx[sb]][sb];
+          imag = pp_sub_qmf_delay_buf_im[p_delay_qmf_delay_buf_idx[sb]][sb];
+          r_r0 = real;
+          i_r0 = imag;
+          pp_sub_qmf_delay_buf_re[p_delay_qmf_delay_buf_idx[sb]][sb] = im_left;
+          pp_sub_qmf_delay_buf_im[p_delay_qmf_delay_buf_idx[sb]][sb] = re_left;
+        } else {
+          real0 = pp_sub_qmf_delay_buf_re[l_delay][sb];
+          imag0 = pp_sub_qmf_delay_buf_im[l_delay][sb];
+          pp_sub_qmf_delay_buf_re[l_delay][sb] = im_left;
+          pp_sub_qmf_delay_buf_im[l_delay][sb] = re_left;
+
+          real = real0 * pp_frac_delay_phase_fac_re[sb] - imag0 *
+                 pp_frac_delay_phase_fac_im[sb];
+          imag = real0 * pp_frac_delay_phase_fac_im[sb] + imag0 *
+                 pp_frac_delay_phase_fac_re[sb];
+
+          r_r0 = real;
+          i_r0 = imag;
+          for (m = 0; m < NUM_SER_AP_LINKS; m++) {
+            real0 = ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb];
+            imag0 = ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb];
+            real = real0 * pp_frac_delay_phase_fac_ser_re[sb][m] -
+                   imag0 * pp_frac_delay_phase_fac_ser_im[sb][m];
+            imag = real0 * pp_frac_delay_phase_fac_ser_im[sb][m] +
+                   imag0 * pp_frac_delay_phase_fac_ser_re[sb][m];
+
+            real += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * r_r0;
+            imag += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * i_r0;
+            ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb] =
+                r_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * real;
+            ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb] =
+                i_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * imag;
+            r_r0 = real;
+            i_r0 = imag;
+          }
+        }
+
+        bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
+        trans_ratio = trans_ratio_arr[k][bin];
+
+        pp_qmf_buf_re_right[k][sb] = trans_ratio * r_r0;
+        pp_qmf_buf_im_right[k][sb] = trans_ratio * i_r0;
+
+        if (++l_delay >= DEL_ALL_PASS) l_delay = 0;
+
+        if (gr >= ptr_ps_dec->first_delay_gr && sb >= NUM_OF_ALL_PASS_CHNLS) {
+          if (++p_delay_qmf_delay_buf_idx[sb] >= p_delay_qmf_delay_num_samp[sb]) {
+            p_delay_qmf_delay_buf_idx[sb] = 0;
+          }
+        }
+
+        for (m = 0; m < NUM_SER_AP_LINKS; m++) {
+          if (++l_ser_delay_arr[m] >= ptr_ps_dec->delay_sample_ser[m]) {
+            l_ser_delay_arr[m] = 0;
+          }
+        }
+      }
+    }
+  }
+
+  ptr_ps_dec->delay_buf_idx = l_delay;
+  for (m = 0; m < NUM_SER_AP_LINKS; m++) {
+    ptr_ps_dec->delay_buf_idx_ser[m] = l_ser_delay_arr[m];
+  }
+}
+
+VOID ixheaacd_esbr_ps_apply_rotation(
+    ia_ps_dec_struct *ptr_ps_dec,
+    FLOAT32 **pp_qmf_buf_re_left,
+    FLOAT32 **pp_qmf_buf_im_left,
+    FLOAT32 **pp_qmf_buf_re_right,
+    FLOAT32 **pp_qmf_buf_im_right,
+    ia_ps_tables_struct *ptr_ps_tables) {
+  WORD32 i;
+  WORD32 group;
+  WORD32 bin = 0;
+  WORD32 subband, max_subband;
+  WORD32 env;
+  FLOAT32(*p_hyb_left_re)[MAX_NUM_COLUMNS];
+  FLOAT32(*p_hyb_left_im)[MAX_NUM_COLUMNS];
+  FLOAT32(*p_hyb_rigth_re)[MAX_NUM_COLUMNS];
+  FLOAT32(*p_hyb_rigth_im)[MAX_NUM_COLUMNS];
+  FLOAT32 scale_fac_l, scale_fac_r;
+  FLOAT32 alpha, beta;
+  FLOAT32 ipd, opd;
+  FLOAT32 ipd1, opd1;
+  FLOAT32 ipd2, opd2;
+
+  FLOAT32 h11r, h12r, h21r, h22r;
+  FLOAT32 h11i, h12i, h21i, h22i;
+  FLOAT32 H11r, H12r, H21r, H22r;
+  FLOAT32 H11i, H12i, H21i, H22i;
+  FLOAT32 deltaH11r, deltaH12r, deltaH21r, deltaH22r;
+  FLOAT32 deltaH11i, deltaH12i, deltaH21i, deltaH22i;
+  FLOAT32 l_left_re, l_left_im;
+  FLOAT32 l_right_re, l_right_im;
+
+  WORD32 L;
+  FLOAT32 *ptr_scale_factors;
+  const WORD32 *ptr_quantized_iids;
+  WORD32 num_iid_steps;
+
+  if (ptr_ps_dec->iid_quant) {
+    num_iid_steps = NUM_IID_STEPS_FINE;
+    ptr_scale_factors = ptr_ps_tables->scale_factors_fine_flt;
+    ptr_quantized_iids = ptr_ps_tables->quantized_iids_fine;
+  } else {
+    num_iid_steps = NUM_IID_STEPS;
+    ptr_scale_factors = ptr_ps_tables->scale_factors_flt;
+    ptr_quantized_iids = ptr_ps_tables->quantized_iids;
+  }
+
+  if (ptr_ps_dec->use_34_st_bands != ptr_ps_dec->use_34_st_bands_prev) {
+    if (ptr_ps_dec->use_34_st_bands) {
+      ixheaacd_map_20_float_to_34(ptr_ps_dec->h11_re_prev);
+      ixheaacd_map_20_float_to_34(ptr_ps_dec->h12_re_prev);
+      ixheaacd_map_20_float_to_34(ptr_ps_dec->h21_re_prev);
+      ixheaacd_map_20_float_to_34(ptr_ps_dec->h22_re_prev);
+
+      ixheaacd_map_20_float_to_34(ptr_ps_dec->h11_im_prev);
+      ixheaacd_map_20_float_to_34(ptr_ps_dec->h12_im_prev);
+      ixheaacd_map_20_float_to_34(ptr_ps_dec->h21_im_prev);
+      ixheaacd_map_20_float_to_34(ptr_ps_dec->h22_im_prev);
+
+      memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
+      memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
+      memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
+      memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
+    } else {
+      ixheaacd_map_34_float_to_20(ptr_ps_dec->h11_re_prev);
+      ixheaacd_map_34_float_to_20(ptr_ps_dec->h12_re_prev);
+      ixheaacd_map_34_float_to_20(ptr_ps_dec->h21_re_prev);
+      ixheaacd_map_34_float_to_20(ptr_ps_dec->h22_re_prev);
+
+      ixheaacd_map_34_float_to_20(ptr_ps_dec->h11_im_prev);
+      ixheaacd_map_34_float_to_20(ptr_ps_dec->h12_im_prev);
+      ixheaacd_map_34_float_to_20(ptr_ps_dec->h21_im_prev);
+      ixheaacd_map_34_float_to_20(ptr_ps_dec->h22_im_prev);
+
+      memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
+      memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
+      memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
+      memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
+    }
+  }
+
+  for (env = 0; env < ptr_ps_dec->num_env; env++) {
+    for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
+      if (!ptr_ps_dec->use_pca_rot_flg) {
+        scale_fac_r = ptr_scale_factors[num_iid_steps +
+                      ptr_ps_dec->iid_par_table[env][bin]];
+        scale_fac_l = ptr_scale_factors[num_iid_steps -
+                      ptr_ps_dec->iid_par_table[env][bin]];
+
+        alpha = ptr_ps_tables->alphas[ptr_ps_dec->icc_par_table[env][bin]];
+
+        beta = alpha * (scale_fac_r - scale_fac_l) / PSC_SQRT2F;
+
+        h11r = (FLOAT32)(scale_fac_l * cos(beta + alpha));
+        h12r = (FLOAT32)(scale_fac_r * cos(beta - alpha));
+        h21r = (FLOAT32)(scale_fac_l * sin(beta + alpha));
+        h22r = (FLOAT32)(scale_fac_r * sin(beta - alpha));
+      } else {
+        FLOAT32 c, rho, mu, alpha, gamma;
+        WORD32 i;
+
+        i = ptr_ps_dec->iid_par_table[env][bin];
+        c = (FLOAT32)pow(
+            10.0,
+            ((i) ? (((i > 0) ? 1 : -1) * ptr_quantized_iids[((i > 0) ? i : -i) - 1]) : 0.) /
+                20.0);
+        rho = ptr_ps_tables->quantized_rhos[ptr_ps_dec->icc_par_table[env][bin]];
+        rho = max(rho, 0.05f);
+
+        if (rho == 0.0f && c == 1.) {
+          alpha = (FLOAT32)PI / 4.0f;
+        } else {
+          if (rho <= 0.05f) {
+            rho = 0.05f;
+          }
+          alpha = 0.5f * (FLOAT32)atan((2.0f * c * rho) / (c * c - 1.0f));
+
+          if (alpha < 0.) {
+            alpha += (FLOAT32)PI / 2.0f;
+          }
+        }
+        mu = c + 1.0f / c;
+        mu = 1 + (4.0f * rho * rho - 4.0f) / (mu * mu);
+        gamma = (FLOAT32)atan(sqrt((1.0f - sqrt(mu)) / (1.0f + sqrt(mu))));
+
+        h11r = (FLOAT32)(sqrt(2.) * cos(alpha) * cos(gamma));
+        h12r = (FLOAT32)(sqrt(2.) * sin(alpha) * cos(gamma));
+        h21r = (FLOAT32)(sqrt(2.) * -sin(alpha) * sin(gamma));
+        h22r = (FLOAT32)(sqrt(2.) * cos(alpha) * sin(gamma));
+      }
+
+      if (bin >= ptr_ps_tables->ipd_bins_tbl[ptr_ps_dec->freq_res_ipd]) {
+        h11i = h12i = h21i = h22i = 0.0f;
+      } else {
+        ipd = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map[env][bin];
+        opd = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map[env][bin];
+        ipd1 = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map_1[bin];
+        opd1 = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map_1[bin];
+        ipd2 = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map_2[bin];
+        opd2 = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map_2[bin];
+
+        l_left_re = (FLOAT32)cos(ipd);
+        l_left_im = (FLOAT32)sin(ipd);
+        l_right_re = (FLOAT32)cos(opd);
+        l_right_im = (FLOAT32)sin(opd);
+
+        l_left_re += PHASE_SMOOTH_HIST1 * (FLOAT32)cos(ipd1);
+        l_left_im += PHASE_SMOOTH_HIST1 * (FLOAT32)sin(ipd1);
+        l_right_re += PHASE_SMOOTH_HIST1 * (FLOAT32)cos(opd1);
+        l_right_im += PHASE_SMOOTH_HIST1 * (FLOAT32)sin(opd1);
+
+        l_left_re += PHASE_SMOOTH_HIST2 * (FLOAT32)cos(ipd2);
+        l_left_im += PHASE_SMOOTH_HIST2 * (FLOAT32)sin(ipd2);
+        l_right_re += PHASE_SMOOTH_HIST2 * (FLOAT32)cos(opd2);
+        l_right_im += PHASE_SMOOTH_HIST2 * (FLOAT32)sin(opd2);
+
+        ipd = (FLOAT32)atan2(l_left_im, l_left_re);
+        opd = (FLOAT32)atan2(l_right_im, l_right_re);
+
+        l_left_re = (FLOAT32)cos(opd);
+        l_left_im = (FLOAT32)sin(opd);
+        opd -= ipd;
+        l_right_re = (FLOAT32)cos(opd);
+        l_right_im = (FLOAT32)sin(opd);
+
+        h11i = h11r * l_left_im;
+        h12i = h12r * l_right_im;
+        h21i = h21r * l_left_im;
+        h22i = h22r * l_right_im;
+
+        h11r *= l_left_re;
+        h12r *= l_right_re;
+        h21r *= l_left_re;
+        h22r *= l_right_re;
+      }
+
+      ptr_ps_dec->h11_re_vec[bin] = h11r;
+      ptr_ps_dec->h12_re_vec[bin] = h12r;
+      ptr_ps_dec->h21_re_vec[bin] = h21r;
+      ptr_ps_dec->h22_re_vec[bin] = h22r;
+      ptr_ps_dec->h11_im_vec[bin] = h11i;
+      ptr_ps_dec->h12_im_vec[bin] = h12i;
+      ptr_ps_dec->h21_im_vec[bin] = h21i;
+      ptr_ps_dec->h22_im_vec[bin] = h22i;
+
+    }
+
+    p_hyb_left_re = ptr_ps_dec->hyb_left_re;
+    p_hyb_left_im = ptr_ps_dec->hyb_left_im;
+    p_hyb_rigth_re = ptr_ps_dec->hyb_right_re;
+    p_hyb_rigth_im = ptr_ps_dec->hyb_right_im;
+
+    for (group = 0; group < ptr_ps_dec->num_sub_qmf_groups; group++) {
+      bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[group];
+
+      max_subband = ptr_ps_dec->ptr_group_borders[group] + 1;
+
+      L = ptr_ps_dec->border_position[env + 1] - ptr_ps_dec->border_position[env];
+
+      H11r = ptr_ps_dec->h11_re_prev[bin];
+      H12r = ptr_ps_dec->h12_re_prev[bin];
+      H21r = ptr_ps_dec->h21_re_prev[bin];
+      H22r = ptr_ps_dec->h22_re_prev[bin];
+      if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
+        H11i = -ptr_ps_dec->h11_im_prev[bin];
+        H12i = -ptr_ps_dec->h12_im_prev[bin];
+        H21i = -ptr_ps_dec->h21_im_prev[bin];
+        H22i = -ptr_ps_dec->h22_im_prev[bin];
+      } else {
+        H11i = ptr_ps_dec->h11_im_prev[bin];
+        H12i = ptr_ps_dec->h12_im_prev[bin];
+        H21i = ptr_ps_dec->h21_im_prev[bin];
+        H22i = ptr_ps_dec->h22_im_prev[bin];
+      }
+
+      h11r = ptr_ps_dec->h11_re_vec[bin];
+      h12r = ptr_ps_dec->h12_re_vec[bin];
+      h21r = ptr_ps_dec->h21_re_vec[bin];
+      h22r = ptr_ps_dec->h22_re_vec[bin];
+      if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
+        h11i = -ptr_ps_dec->h11_im_vec[bin];
+        h12i = -ptr_ps_dec->h12_im_vec[bin];
+        h21i = -ptr_ps_dec->h21_im_vec[bin];
+        h22i = -ptr_ps_dec->h22_im_vec[bin];
+      } else {
+        h11i = ptr_ps_dec->h11_im_vec[bin];
+        h12i = ptr_ps_dec->h12_im_vec[bin];
+        h21i = ptr_ps_dec->h21_im_vec[bin];
+        h22i = ptr_ps_dec->h22_im_vec[bin];
+      }
+
+      deltaH11r = (h11r - H11r) / L;
+      deltaH12r = (h12r - H12r) / L;
+      deltaH21r = (h21r - H21r) / L;
+      deltaH22r = (h22r - H22r) / L;
+
+      deltaH11i = (h11i - H11i) / L;
+      deltaH12i = (h12i - H12i) / L;
+      deltaH21i = (h21i - H21i) / L;
+      deltaH22i = (h22i - H22i) / L;
+
+      for (i = ptr_ps_dec->border_position[env]; i < ptr_ps_dec->border_position[env + 1];
+           i++) {
+        H11r += deltaH11r;
+        H12r += deltaH12r;
+        H21r += deltaH21r;
+        H22r += deltaH22r;
+
+        H11i += deltaH11i;
+        H12i += deltaH12i;
+        H21i += deltaH21i;
+        H22i += deltaH22i;
+
+        for (subband = ptr_ps_dec->ptr_group_borders[group]; subband < max_subband;
+             subband++) {
+          l_left_re = H11r * p_hyb_left_re[i][subband] - H11i * p_hyb_left_im[i][subband] +
+                      H21r * p_hyb_rigth_re[i][subband] - H21i * p_hyb_rigth_im[i][subband];
+
+          l_left_im = H11i * p_hyb_left_re[i][subband] + H11r * p_hyb_left_im[i][subband] +
+                      H21i * p_hyb_rigth_re[i][subband] + H21r * p_hyb_rigth_im[i][subband];
+
+          l_right_re = H12r * p_hyb_left_re[i][subband] - H12i * p_hyb_left_im[i][subband] +
+                       H22r * p_hyb_rigth_re[i][subband] - H22i * p_hyb_rigth_im[i][subband];
+
+          l_right_im = H12i * p_hyb_left_re[i][subband] + H12r * p_hyb_left_im[i][subband] +
+                       H22i * p_hyb_rigth_re[i][subband] + H22r * p_hyb_rigth_im[i][subband];
+
+          p_hyb_left_re[i][subband] = l_left_re;
+          p_hyb_left_im[i][subband] = l_left_im;
+          p_hyb_rigth_re[i][subband] = l_right_re;
+          p_hyb_rigth_im[i][subband] = l_right_im;
+        }
+      }
+    }
+
+    for (; group < ptr_ps_dec->num_groups; group++) {
+      bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[group];
+
+      max_subband = ptr_ps_dec->ptr_group_borders[group + 1];
+
+      L = ptr_ps_dec->border_position[env + 1] - ptr_ps_dec->border_position[env];
+
+      H11r = ptr_ps_dec->h11_re_prev[bin];
+      H12r = ptr_ps_dec->h12_re_prev[bin];
+      H21r = ptr_ps_dec->h21_re_prev[bin];
+      H22r = ptr_ps_dec->h22_re_prev[bin];
+      if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
+        H11i = -ptr_ps_dec->h11_im_prev[bin];
+        H12i = -ptr_ps_dec->h12_im_prev[bin];
+        H21i = -ptr_ps_dec->h21_im_prev[bin];
+        H22i = -ptr_ps_dec->h22_im_prev[bin];
+      } else {
+        H11i = ptr_ps_dec->h11_im_prev[bin];
+        H12i = ptr_ps_dec->h12_im_prev[bin];
+        H21i = ptr_ps_dec->h21_im_prev[bin];
+        H22i = ptr_ps_dec->h22_im_prev[bin];
+      }
+
+      h11r = ptr_ps_dec->h11_re_vec[bin];
+      h12r = ptr_ps_dec->h12_re_vec[bin];
+      h21r = ptr_ps_dec->h21_re_vec[bin];
+      h22r = ptr_ps_dec->h22_re_vec[bin];
+      if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
+        h11i = -ptr_ps_dec->h11_im_vec[bin];
+        h12i = -ptr_ps_dec->h12_im_vec[bin];
+        h21i = -ptr_ps_dec->h21_im_vec[bin];
+        h22i = -ptr_ps_dec->h22_im_vec[bin];
+      } else {
+        h11i = ptr_ps_dec->h11_im_vec[bin];
+        h12i = ptr_ps_dec->h12_im_vec[bin];
+        h21i = ptr_ps_dec->h21_im_vec[bin];
+        h22i = ptr_ps_dec->h22_im_vec[bin];
+      }
+
+      deltaH11r = (h11r - H11r) / L;
+      deltaH12r = (h12r - H12r) / L;
+      deltaH21r = (h21r - H21r) / L;
+      deltaH22r = (h22r - H22r) / L;
+
+      deltaH11i = (h11i - H11i) / L;
+      deltaH12i = (h12i - H12i) / L;
+      deltaH21i = (h21i - H21i) / L;
+      deltaH22i = (h22i - H22i) / L;
+
+      for (i = ptr_ps_dec->border_position[env]; i < ptr_ps_dec->border_position[env + 1];
+           i++) {
+        H11r += deltaH11r;
+        H12r += deltaH12r;
+        H21r += deltaH21r;
+        H22r += deltaH22r;
+
+        H11i += deltaH11i;
+        H12i += deltaH12i;
+        H21i += deltaH21i;
+        H22i += deltaH22i;
+
+        for (subband = ptr_ps_dec->ptr_group_borders[group]; subband < max_subband;
+             subband++) {
+          l_left_re = H11r * pp_qmf_buf_re_left[i][subband] - H11i *
+                      pp_qmf_buf_im_left[i][subband] +
+                      H21r * pp_qmf_buf_re_right[i][subband] - H21i *
+                      pp_qmf_buf_im_right[i][subband];
+
+          l_left_im = H11i * pp_qmf_buf_re_left[i][subband] + H11r *
+                      pp_qmf_buf_im_left[i][subband] +
+                      H21i * pp_qmf_buf_re_right[i][subband] + H21r *
+                      pp_qmf_buf_im_right[i][subband];
+
+          l_right_re = H12r * pp_qmf_buf_re_left[i][subband] - H12i *
+                       pp_qmf_buf_im_left[i][subband] +
+                       H22r * pp_qmf_buf_re_right[i][subband] - H22i *
+                       pp_qmf_buf_im_right[i][subband];
+
+          l_right_im = H12i * pp_qmf_buf_re_left[i][subband] + H12r *
+                       pp_qmf_buf_im_left[i][subband] +
+                       H22i * pp_qmf_buf_re_right[i][subband] + H22r *
+                       pp_qmf_buf_im_right[i][subband];
+
+          pp_qmf_buf_re_left[i][subband] = l_left_re;
+          pp_qmf_buf_im_left[i][subband] = l_left_im;
+          pp_qmf_buf_re_right[i][subband] = l_right_re;
+          pp_qmf_buf_im_right[i][subband] = l_right_im;
+        }
+      }
+    }
+    for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
+      ptr_ps_dec->h11_re_prev[bin] = ptr_ps_dec->h11_re_vec[bin];
+      ptr_ps_dec->h12_re_prev[bin] = ptr_ps_dec->h12_re_vec[bin];
+      ptr_ps_dec->h21_re_prev[bin] = ptr_ps_dec->h21_re_vec[bin];
+      ptr_ps_dec->h22_re_prev[bin] = ptr_ps_dec->h22_re_vec[bin];
+
+      ptr_ps_dec->h11_im_prev[bin] = ptr_ps_dec->h11_im_vec[bin];
+      ptr_ps_dec->h12_im_prev[bin] = ptr_ps_dec->h12_im_vec[bin];
+      ptr_ps_dec->h21_im_prev[bin] = ptr_ps_dec->h21_im_vec[bin];
+      ptr_ps_dec->h22_im_prev[bin] = ptr_ps_dec->h22_im_vec[bin];
+    }
+
+    for (bin = 0; bin < ptr_ps_tables->ipd_bins_tbl[ptr_ps_dec->freq_res_ipd]; bin++) {
+      ptr_ps_dec->ipd_idx_map_2[bin] = ptr_ps_dec->ipd_idx_map_1[bin];
+      ptr_ps_dec->opd_idx_map_2[bin] = ptr_ps_dec->opd_idx_map_1[bin];
+      ptr_ps_dec->ipd_idx_map_1[bin] = ptr_ps_dec->ipd_idx_map[env][bin];
+      ptr_ps_dec->opd_idx_map_1[bin] = ptr_ps_dec->opd_idx_map[env][bin];
+    }
+  }
+}
diff --git a/decoder/ixheaacd_qmf_dec.c b/decoder/ixheaacd_qmf_dec.c
index 022a631..7e7ddea 100644
--- a/decoder/ixheaacd_qmf_dec.c
+++ b/decoder/ixheaacd_qmf_dec.c
@@ -358,21 +358,145 @@
   return;
 }
 
+VOID ixheaacd_sbr_qmfanal32_winadd_eld_mps(WORD32 *inp1, WORD32 *inp2,
+                                           const WORD32 *p_qmf1,
+                                           const WORD32 *p_qmf2,
+                                           WORD32 *p_out) {
+  WORD32 n;
+  WORD32 resolution = 64;
+
+  for (n = 0; n < 64; n += 2) {
+    WORD32 accu;
+    accu = ixheaacd_mul32_sh(inp1[n + 0], p_qmf1[(n + 0)], 31);
+    accu = ixheaacd_add32(accu,
+                          ixheaacd_mul32_sh(inp1[n + 2 * resolution],
+                                            p_qmf1[(n + 2 * resolution)], 31));
+    accu = ixheaacd_add32(accu,
+                          ixheaacd_mul32_sh(inp1[n + 4 * resolution],
+                                            p_qmf1[(n + 4 * resolution)], 31));
+    accu = ixheaacd_add32(accu,
+                          ixheaacd_mul32_sh(inp1[n + 6 * resolution],
+                                            p_qmf1[(n + 6 * resolution)], 31));
+    accu = ixheaacd_add32(accu,
+                          ixheaacd_mul32_sh(inp1[n + 8 * resolution],
+                                            p_qmf1[(n + 8 * resolution)], 31));
+    p_out[n] = accu;
+
+    accu = ixheaacd_mul32_sh(inp1[n + 1 + 0], p_qmf1[(n + 1 + 0)], 31);
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp1[n + 1 + 2 * resolution],
+                                p_qmf1[(n + 1 + 2 * resolution)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp1[n + 1 + 4 * resolution],
+                                p_qmf1[(n + 1 + 4 * resolution)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp1[n + 1 + 6 * resolution],
+                                p_qmf1[(n + 1 + 6 * resolution)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp1[n + 1 + 8 * resolution],
+                                p_qmf1[(n + 1 + 8 * resolution)], 31));
+    p_out[n + 1] = accu;
+
+    accu = ixheaacd_mul32_sh(inp2[n + 0], p_qmf2[(n + 0)], 31);
+    accu = ixheaacd_add32(accu,
+                          ixheaacd_mul32_sh(inp2[n + 2 * resolution],
+                                            p_qmf2[(n + 2 * resolution)], 31));
+    accu = ixheaacd_add32(accu,
+                          ixheaacd_mul32_sh(inp2[n + 4 * resolution],
+                                            p_qmf2[(n + 4 * resolution)], 31));
+    accu = ixheaacd_add32(accu,
+                          ixheaacd_mul32_sh(inp2[n + 6 * resolution],
+                                            p_qmf2[(n + 6 * resolution)], 31));
+    accu = ixheaacd_add32(accu,
+                          ixheaacd_mul32_sh(inp2[n + 8 * resolution],
+                                            p_qmf2[(n + 8 * resolution)], 31));
+    p_out[n + 64] = accu;
+
+    accu = ixheaacd_mul32_sh(inp2[n + 1 + 0], p_qmf2[(n + 1 + 0)], 31);
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp2[n + 1 + 2 * resolution],
+                                p_qmf2[(n + 1 + 2 * resolution)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp2[n + 1 + 4 * resolution],
+                                p_qmf2[(n + 1 + 4 * resolution)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp2[n + 1 + 6 * resolution],
+                                p_qmf2[(n + 1 + 6 * resolution)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp2[n + 1 + 8 * resolution],
+                                p_qmf2[(n + 1 + 8 * resolution)], 31));
+    p_out[n + 1 + 64] = accu;
+  }
+}
+
+VOID ixheaacd_sbr_qmfanal32_winadd_eld_32(WORD32 *inp1, WORD32 *inp2,
+                                          const WORD32 *p_qmf1,
+                                          const WORD32 *p_qmf2, WORD32 *p_out) {
+  WORD32 n;
+
+  for (n = 0; n < 32; n += 2) {
+    WORD32 accu;
+    accu = ixheaacd_mul32_sh(inp1[n + 0], p_qmf1[(n + 0)], 31);
+    accu = ixheaacd_add32(
+        accu, ixheaacd_mul32_sh(inp1[n + 64], p_qmf1[(n + 64)], 31));
+    accu = ixheaacd_add32(
+        accu, ixheaacd_mul32_sh(inp1[n + 128], p_qmf1[(n + 128)], 31));
+    accu = ixheaacd_add32(
+        accu, ixheaacd_mul32_sh(inp1[n + 192], p_qmf1[(n + 192)], 31));
+    accu = ixheaacd_add32(
+        accu, ixheaacd_mul32_sh(inp1[n + 256], p_qmf1[(n + 256)], 31));
+    p_out[n] = accu;
+
+    accu = ixheaacd_mul32_sh(inp1[n + 1 + 0], p_qmf1[(n + 1 + 0)], 31);
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp1[n + 1 + 64], p_qmf1[(n + 1 + 64)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp1[n + 1 + 128], p_qmf1[(n + 1 + 128)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp1[n + 1 + 192], p_qmf1[(n + 1 + 192)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp1[n + 1 + 256], p_qmf1[(n + 1 + 256)], 31));
+    p_out[n + 1] = accu;
+
+    accu = ixheaacd_mul32_sh(inp2[n + 0], p_qmf2[(n + 0)], 31);
+    accu = ixheaacd_add32(
+        accu, ixheaacd_mul32_sh(inp2[n + 64], p_qmf2[(n + 64)], 31));
+    accu = ixheaacd_add32(
+        accu, ixheaacd_mul32_sh(inp2[n + 128], p_qmf2[(n + 128)], 31));
+    accu = ixheaacd_add32(
+        accu, ixheaacd_mul32_sh(inp2[n + 192], p_qmf2[(n + 192)], 31));
+    accu = ixheaacd_add32(
+        accu, ixheaacd_mul32_sh(inp2[n + 256], p_qmf2[(n + 256)], 31));
+    p_out[n + 32] = accu;
+
+    accu = ixheaacd_mul32_sh(inp2[n + 1 + 0], p_qmf2[(n + 1 + 0)], 31);
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp2[n + 1 + 64], p_qmf2[(n + 1 + 64)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp2[n + 1 + 128], p_qmf2[(n + 1 + 128)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp2[n + 1 + 192], p_qmf2[(n + 1 + 192)], 31));
+    accu = ixheaacd_add32_sat(
+        accu, ixheaacd_mul32_sh(inp2[n + 1 + 256], p_qmf2[(n + 1 + 256)], 31));
+    p_out[n + 1 + 32] = accu;
+  }
+}
+
 VOID ixheaacd_sbr_qmfanal32_winadd_eld(WORD16 *inp1, WORD16 *inp2,
-                                       WORD16 *p_qmf1, WORD16 *p_qmf2,
-                                       WORD32 *p_out) {
+                                       const WORD16 *p_qmf1,
+                                       const WORD16 *p_qmf2, WORD32 *p_out) {
   WORD32 n;
 
   for (n = 0; n < 32; n += 2) {
     WORD32 accu;
     accu = ixheaacd_mult16x16in32(inp1[n + 0], p_qmf1[(n + 0)]);
-    accu = ixheaacd_add32(
+    accu = ixheaacd_add32_sat(
         accu, ixheaacd_mult16x16in32(inp1[n + 64], p_qmf1[(n + 64)]));
-    accu = ixheaacd_add32(
+    accu = ixheaacd_add32_sat(
         accu, ixheaacd_mult16x16in32(inp1[n + 128], p_qmf1[(n + 128)]));
-    accu = ixheaacd_add32(
+    accu = ixheaacd_add32_sat(
         accu, ixheaacd_mult16x16in32(inp1[n + 192], p_qmf1[(n + 192)]));
-    accu = ixheaacd_add32(
+    accu = ixheaacd_add32_sat(
         accu, ixheaacd_mult16x16in32(inp1[n + 256], p_qmf1[(n + 256)]));
     p_out[n] = accu;
 
@@ -388,13 +512,13 @@
     p_out[n + 1] = accu;
 
     accu = ixheaacd_mult16x16in32(inp2[n + 0], p_qmf2[(n + 0)]);
-    accu = ixheaacd_add32(
+    accu = ixheaacd_add32_sat(
         accu, ixheaacd_mult16x16in32(inp2[n + 64], p_qmf2[(n + 64)]));
-    accu = ixheaacd_add32(
+    accu = ixheaacd_add32_sat(
         accu, ixheaacd_mult16x16in32(inp2[n + 128], p_qmf2[(n + 128)]));
-    accu = ixheaacd_add32(
+    accu = ixheaacd_add32_sat(
         accu, ixheaacd_mult16x16in32(inp2[n + 192], p_qmf2[(n + 192)]));
-    accu = ixheaacd_add32(
+    accu = ixheaacd_add32_sat(
         accu, ixheaacd_mult16x16in32(inp2[n + 256], p_qmf2[(n + 256)]));
     p_out[n + 32] = accu;
 
@@ -609,9 +733,18 @@
 
 VOID ixheaacd_esbr_inv_modulation(
     WORD32 *qmf_real, ia_sbr_qmf_filter_bank_struct *syn_qmf,
-    ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) {
-  ixheaacd_esbr_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->esbr_w_32,
-                            qmf_dec_tables_ptr->dig_rev_table2_32);
+    ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 no_synthesis_channels) {
+
+    if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED)
+    {
+      ixheaacd_esbr_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->esbr_w_16,
+        qmf_dec_tables_ptr->dig_rev_table4_16);
+    }
+    else
+    {
+      ixheaacd_esbr_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->esbr_w_32,
+        qmf_dec_tables_ptr->dig_rev_table2_32);
+    }
 }
 
 VOID ixheaacd_sbr_qmfsyn32_winadd(WORD16 *tmp1, WORD16 *tmp2, WORD16 *inp1,
@@ -715,7 +848,7 @@
   WORD32 *qmf_imag_tmp = &qmf_real2[NO_SYNTHESIS_CHANNELS];
   WORD32 env = 0;
 
-  WORD32 common_shift;
+  WORD32 common_shift = 0;
 
   if (no_synthesis_channels == 32) {
     qmf_bank->cos_twiddle =
@@ -884,7 +1017,7 @@
 
         ixheaacd_apply_ps(ptr_ps_dec, &qmf_real[i], &qmf_imag[i], qmf_real_tmp,
                           qmf_imag_tmp, sbr_scale_factor, (WORD16)i,
-                          sbr_tables_ptr);
+                          sbr_tables_ptr, num_time_slots);
       }
       if (1 == drc_on) {
         WORD32 loop_val;
diff --git a/decoder/ixheaacd_qmf_dec.h b/decoder/ixheaacd_qmf_dec.h
index 89f2e5f..f9868da 100644
--- a/decoder/ixheaacd_qmf_dec.h
+++ b/decoder/ixheaacd_qmf_dec.h
@@ -64,16 +64,25 @@
   WORD16 *fp1_syn;
   WORD16 *fp2_syn;
   WORD16 sixty4;
+  WORD32 *core_samples_buffer_32;
+  WORD32 *fp1_anal_32;
+  WORD32 *fp2_anal_32;
+  WORD32 *filter_2_32;
 
 } ia_sbr_qmf_filter_bank_struct;
 
 VOID ixheaacd_cplx_anal_qmffilt(const WORD16 *time_inp,
-                                ia_sbr_scale_fact_struct *sbr_scale_factor,
-                                WORD32 **qmf_real, WORD32 **qmf_imag,
-                                ia_sbr_qmf_filter_bank_struct *qmf_bank,
-                                ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
-                                WORD ch_fac, WORD32 low_pow_flag,
-                                WORD audio_object_type);
+                                ia_sbr_scale_fact_struct *sbr_scale_factor, WORD32 **qmf_real,
+                                WORD32 **qmf_imag, ia_sbr_qmf_filter_bank_struct *qmf_bank,
+                                ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD ch_fac,
+                                WORD32 low_pow_flag, WORD audio_object_type);
+
+VOID ixheaacd_cplx_anal_qmffilt_32(const WORD32 *time_inp,
+                                   ia_sbr_scale_fact_struct *sbr_scale_factor,
+                                   WORD32 **qmf_real, WORD32 **qmf_imag,
+                                   ia_sbr_qmf_filter_bank_struct *qmf_bank,
+                                   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
+                                   WORD ch_fac, WORD32 ldsbr_present);
 
 VOID ixheaacd_cplx_synt_qmffilt(
     WORD32 **qmf_real, WORD32 **qmf_im, WORD32 split_slot,
@@ -94,14 +103,18 @@
 
 VOID ixheaacd_esbr_inv_modulation(WORD32 *qmf_real,
                                   ia_sbr_qmf_filter_bank_struct *syn_qmf,
-                                  ia_qmf_dec_tables_struct *qmf_dec_tables_ptr);
+                                  ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
+                                  WORD32 no_synthesis_channels);
 
 VOID ixheaacd_shiftrountine_with_rnd_hq(WORD32 *qmf_real, WORD32 *qmf_imag,
                                         WORD32 *filter_states, WORD32 len,
                                         WORD32 shift);
 
-VOID ixheaacd_esbr_qmfsyn64_winadd(WORD32 *tmp1, WORD32 *tmp2, WORD32 *tmp3,
-                                   WORD32 *sample_buffer, WORD ch_fac);
+VOID ixheaacd_esbr_qmfsyn64_winadd(WORD32 *tmp1, WORD32 *tmp2, WORD32 *inp1,
+                                   WORD32 *sample_buffer, WORD32 ch_fac);
+
+VOID ixheaacd_esbr_qmfsyn32_winadd(WORD32 *tmp1, WORD32 *tmp2, WORD32 *inp1,
+                                   WORD32 *sample_buffer, WORD32 ch_fac);
 
 VOID ixheaacd_sbr_qmfanal32_winadds(WORD16 *fp1, WORD16 *fp2, WORD16 *filter_1,
                                     WORD16 *filter_2, WORD32 *analysis_buffer,
@@ -119,7 +132,8 @@
 VOID ixheaacd_fwd_modulation(const WORD32 *p_time_in1, WORD32 *real_subband,
                              WORD32 *imag_subband,
                              ia_sbr_qmf_filter_bank_struct *qmf_bank,
-                             ia_qmf_dec_tables_struct *qmf_dec_tables_ptr);
+                             ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
+                             WORD32 ld_mps_flag);
 VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output,
                       const WORD16 *main_twidle_fwd, const WORD16 *post_tbl,
                       const WORD16 *w_16, const WORD32 *p_table);
@@ -199,8 +213,16 @@
 VOID ixheaacd_pretwdct2(WORD32 *inp, WORD32 *out_fwd);
 
 VOID ixheaacd_sbr_qmfanal32_winadd_eld(WORD16 *inp1, WORD16 *inp2,
-                                       WORD16 *p_qmf1, WORD16 *p_qmf2,
-                                       WORD32 *p_out);
+                                       const WORD16 *p_qmf1,
+                                       const WORD16 *p_qmf2, WORD32 *p_out);
+
+VOID ixheaacd_sbr_qmfanal32_winadd_eld_32(WORD32 *inp1, WORD32 *inp2,
+                                          const WORD32 *p_qmf1,
+                                          const WORD32 *p_qmf2, WORD32 *p_out);
+
+VOID ixheaacd_sbr_qmfanal32_winadd_eld_mps(WORD32 *inp1, WORD32 *inp2,
+                                           const WORD32 *p_qmf1,
+                                           const WORD32 *p_qmf2, WORD32 *p_out);
 
 VOID ixheaacd_dct2_32(WORD32 *inp, WORD32 *out,
                       ia_qmf_dec_tables_struct *qmf_dec_tables_ptr,
diff --git a/decoder/ixheaacd_qmf_poly.h b/decoder/ixheaacd_qmf_poly.h
index 0cafcf1..a3952b4 100644
--- a/decoder/ixheaacd_qmf_poly.h
+++ b/decoder/ixheaacd_qmf_poly.h
@@ -37,4 +37,8 @@
 
 VOID ixheaacd_real_synth_fft_p3(FLOAT32 *inp, FLOAT32 *out, WORD32 n_points);
 
+WORD32 ixheaacd_dft_hbe_cplx_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+                                       FLOAT32 qmf_buf_real[][64],
+                                       FLOAT32 qmf_buf_imag[][64]);
+
 #endif
diff --git a/decoder/ixheaacd_rev_vlc.c b/decoder/ixheaacd_rev_vlc.c
index 2092174..1e9b3b4 100644
--- a/decoder/ixheaacd_rev_vlc.c
+++ b/decoder/ixheaacd_rev_vlc.c
@@ -38,6 +38,9 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 
 #include "ixheaacd_drc_dec.h"
@@ -63,30 +66,29 @@
 #include "ixheaacd_latmdemux.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_config.h"
+#include "ixheaacd_hybrid.h"
+#include "ixheaacd_ps_dec.h"
+#include "ixheaacd_qmf_dec.h"
+#include "ixheaacd_mps_macro_def.h"
+#include "ixheaacd_mps_struct_def.h"
+#include "ixheaacd_mps_res_rom.h"
+#include "ixheaacd_mps_aac_struct.h"
 #include "ixheaacd_mps_dec.h"
+#include "ixheaacd_mps_interface.h"
 #include "ixheaacd_struct_def.h"
-
 #include "ixheaacd_cnst.h"
+#include "ixheaacd_error_standards.h"
 
 #define RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID 0x80000000
-#define RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD 0x40000000
-#define RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD 0x20000000
 #define RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD 0x08000000
 #define RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD 0x04000000
 
 #define FWD 0
 #define BWD 1
 
-#define MAX_RVL 7
-#define MIN_RVL -7
-#define MAX_ALLOWED_DPCM_INDEX 14
-#define TABLE_OFFSET 7
 #define MAX_LEN_RVLC_CODE_WORD 9
 #define MAX_LEN_RVLC_ESCAPE_WORD 20
 
-#define DPCM_NOISE_NRG_BITS 9
-#define SF_OFFSET 100
-
 #define CONCEAL_MAX_INIT 1311
 #define CONCEAL_MIN_INIT -1311
 
@@ -95,8 +97,6 @@
 #define MASK_LEFT 0xFFF000
 #define MASK_RIGHT 0xFFF
 #define CLR_BIT_10 0x3FF
-#define NODE_MASK 0x400
-
 #define LEFT_OFFSET 12
 
 #define ixheaacd_bitbuf_checkpoint(it_bit_buf, saved_bit_buf) \
@@ -104,8 +104,8 @@
 #define ixheaacd_bitbuf_restore(it_bit_buf, saved_bit_buf) \
   (it_bit_buf) = (saved_bit_buf)
 
-static int ixheaacd_rvlc_decode(short cw, int len, int *found) {
-  short indx = 0;
+static WORD32 ixheaacd_rvlc_decode(WORD16 cw, WORD32 len, WORD32 *found) {
+  WORD16 indx = 0;
   *found = 0;
   switch (len) {
     case 1:
@@ -202,8 +202,8 @@
   return indx;
 }
 
-static int ixheaacd_rvlc_decode_esc(int cw, int len, int *found) {
-  short indx = 0;
+static WORD32 ixheaacd_rvlc_decode_esc(WORD32 cw, WORD32 len, WORD32 *found) {
+  WORD16 indx = 0;
   *found = 0;
   switch (len) {
     case 2:
@@ -699,7 +699,7 @@
     ia_rvlc_info_struct *ptr_rvlc,
     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
     ia_bit_buf_struct *it_bit_buff) {
-  WORD16 band, group, dpcm, ixheaacd_drc_offset;
+  WORD16 band, group, dpcm;
   WORD16 bnds = ptr_rvlc->max_sfb_transmitted - 1;
 
   WORD16 factor = ptr_rvlc->rev_global_gain;
@@ -752,10 +752,6 @@
   for (group = ptr_rvlc->num_wind_grps - 1; group >= 0; group--) {
     for (band = ptr_rvlc->max_sfb_transmitted - 1; band >= 0; band--) {
       bnds = 16 * group + band;
-      if ((band == 0) && (ptr_rvlc->num_wind_grps != 1))
-        ixheaacd_drc_offset = 16 - ptr_rvlc->max_sfb_transmitted + 1;
-      else
-        ixheaacd_drc_offset = 1;
 
       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
         case ZERO_HCB:
@@ -955,7 +951,7 @@
   }
 }
 
-static WORD32 ixheaacd_rvlc_init(
+static IA_ERRORCODE ixheaacd_rvlc_init(
     ia_rvlc_info_struct *ptr_rvlc,
     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
     ia_bit_buf_struct *it_bit_buff) {
@@ -1007,9 +1003,9 @@
     it_bit_buff->bit_pos = ((it_bit_buff->size - it_bit_buff->cnt_bits) & 7);
   }
   if (it_bit_buff->cnt_bits < 0) {
-    return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
+    return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
   } else
-    return 0;
+    return IA_NO_ERROR;
 }
 
 VOID ixheaacd_bi_dir_est_scf_prev_frame_reference(
@@ -1377,13 +1373,6 @@
   WORD32 sum_nrg_fwd, sum_nrg_bwd;
   WORD32 sum_scf_fwd, sum_scf_bwd;
   WORD32 use_fwd, use_nrg_fwd, use_scf_fwd;
-  WORD32 max_scf_bands;
-
-  if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
-      EIGHT_SHORT_SEQUENCE)
-    max_scf_bands = 16;
-  else
-    max_scf_bands = 64;
 
   sum_fwd = sum_bwd = sum_nrg_fwd = sum_nrg_bwd = sum_scf_fwd = sum_scf_bwd = 0;
   use_fwd = use_nrg_fwd = use_scf_fwd = 0;
@@ -1464,15 +1453,8 @@
     ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info) {
   ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
   WORD32 band, bnds, group;
-  WORD32 max_scf_bands;
   WORD32 common_min;
 
-  if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
-      EIGHT_SHORT_SEQUENCE)
-    max_scf_bands = 16;
-  else
-    max_scf_bands = 64;
-
   for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
     for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
       bnds = 16 * group + band;
diff --git a/decoder/ixheaacd_rom.c b/decoder/ixheaacd_rom.c
index 0e10e6a..f61e49a 100644
--- a/decoder/ixheaacd_rom.c
+++ b/decoder/ixheaacd_rom.c
@@ -26,4270 +26,4430 @@
 ia_huff_code_book_struct ixheaacd_book;
 
 const WORD16 ixheaacd_sfb_96_1024[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,  56,
-    64,  72,  80,  88,  96,  108, 120, 132, 144, 156, 172, 188, 212, 240,
-    276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,  56,
+  64,  72,  80,  88,  96,  108, 120, 132, 144, 156, 172, 188, 212, 240,
+  276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024};
 
 const WORD16 ixheaacd_sfb_96_128[] = {4,  8,  12, 16, 20, 24,
-                                      32, 40, 48, 64, 92, 128};
+  32, 40, 48, 64, 92, 128};
 
 const WORD16 ixheaacd_sfb_96_960[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,  56,
-    64,  72,  80,  88,  96,  108, 120, 132, 144, 156, 172, 188, 212, 240,
-    276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,  56,
+  64,  72,  80,  88,  96,  108, 120, 132, 144, 156, 172, 188, 212, 240,
+  276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960};
 
 const WORD16 ixheaacd_sfb_96_120[] = {4,  8,  12, 16, 20, 24,
-                                      32, 40, 48, 64, 92, 120};
+  32, 40, 48, 64, 92, 120};
 
 const WORD16 ixheaacd_sfb_96_768[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,
-    56,  64,  72,  80,  88,  96,  108, 120, 132, 144, 156, 172, 188,
-    212, 240, 276, 320, 384, 448, 512, 576, 640, 704, 768};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,
+  56,  64,  72,  80,  88,  96,  108, 120, 132, 144, 156, 172, 188,
+  212, 240, 276, 320, 384, 448, 512, 576, 640, 704, 768};
 
 const WORD16 ixheaacd_sfb_96_96[] = {4,  8,  12, 16, 20, 24,
-                                     32, 40, 48, 64, 92, 96};
+  32, 40, 48, 64, 92, 96};
 
 const WORD16 ixheaacd_sfb_64_1024[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
-    52,  56,  64,  72,  80,  88,  100, 112, 124, 140, 156, 172,
-    192, 216, 240, 268, 304, 344, 384, 424, 464, 504, 544, 584,
-    624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
+  52,  56,  64,  72,  80,  88,  100, 112, 124, 140, 156, 172,
+  192, 216, 240, 268, 304, 344, 384, 424, 464, 504, 544, 584,
+  624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024};
 
 const WORD16 ixheaacd_sfb_64_128[] = {4,  8,  12, 16, 20, 24,
-                                      32, 40, 48, 64, 92, 128};
+  32, 40, 48, 64, 92, 128};
 
 const WORD16 ixheaacd_sfb_64_960[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
-    52,  56,  64,  72,  80,  88,  100, 112, 124, 140, 156, 172,
-    192, 216, 240, 268, 304, 344, 384, 424, 464, 504, 544, 584,
-    624, 664, 704, 744, 784, 824, 864, 904, 944, 960};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
+  52,  56,  64,  72,  80,  88,  100, 112, 124, 140, 156, 172,
+  192, 216, 240, 268, 304, 344, 384, 424, 464, 504, 544, 584,
+  624, 664, 704, 744, 784, 824, 864, 904, 944, 960};
 
 const WORD16 ixheaacd_sfb_64_120[] = {4,  8,  12, 16, 20, 24,
-                                      32, 40, 48, 64, 92, 120};
+  32, 40, 48, 64, 92, 120};
 
 const WORD16 ixheaacd_sfb_64_768[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,  56,
-    64,  72,  80,  88,  100, 112, 124, 140, 156, 172, 192, 216, 240, 268,
-    304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 768};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,  56,
+  64,  72,  80,  88,  100, 112, 124, 140, 156, 172, 192, 216, 240, 268,
+  304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 768};
 
 const WORD16 ixheaacd_sfb_64_96[] = {4,  8,  12, 16, 20, 24,
-                                     32, 40, 48, 64, 92, 96};
+  32, 40, 48, 64, 92, 96};
 
 const WORD16 ixheaacd_sfb_48_1024[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,
-    72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240,
-    264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640,
-    672, 704, 736, 768, 800, 832, 864, 896, 928, 1024};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,
+  72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240,
+  264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640,
+  672, 704, 736, 768, 800, 832, 864, 896, 928, 1024};
 
 const WORD16 ixheaacd_sfb_48_960[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,
-    72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240,
-    264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640,
-    672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 0};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,
+  72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240,
+  264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640,
+  672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 0};
 
 const WORD16 ixheaacd_sfb_48_768[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,  72,  80,
-    88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352,
-    384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,  72,  80,
+  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352,
+  384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768};
 
 const WORD16 ixheaacd_sfb_48_512[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
-    52,  56,  60,  68,  76,  84,  92,  100, 112, 124, 136, 148,
-    164, 184, 208, 236, 268, 300, 332, 364, 396, 428, 460, 512};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
+  52,  56,  60,  68,  76,  84,  92,  100, 112, 124, 136, 148,
+  164, 184, 208, 236, 268, 300, 332, 364, 396, 428, 460, 512};
 
 const WORD16 ixheaacd_sfb_48_480[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
-    52,  56,  64,  72,  80,  88,  96,  108, 120, 132, 144, 156,
-    172, 188, 212, 240, 272, 304, 336, 368, 400, 432, 480};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,
+  52,  56,  64,  72,  80,  88,  96,  108, 120, 132, 144, 156,
+  172, 188, 212, 240, 272, 304, 336, 368, 400, 432, 480};
 
 const WORD16 ixheaacd_sfb_48_128[] = {4,  8,  12, 16, 20, 28,  36,
-                                      44, 56, 68, 80, 96, 112, 128};
+  44, 56, 68, 80, 96, 112, 128};
 
 const WORD16 ixheaacd_sfb_48_120[] = {4,  8,  12, 16, 20, 28,  36,
-                                      44, 56, 68, 80, 96, 112, 120};
+  44, 56, 68, 80, 96, 112, 120};
 
 const WORD16 ixheaacd_sfb_48_96[] = {4,  8,  12, 16, 20, 28,
-                                     36, 44, 56, 68, 80, 96};
+  36, 44, 56, 68, 80, 96};
 
 const WORD16 ixheaacd_sfb_32_1024[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,
-    72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240,
-    264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640,
-    672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,
+  72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240,
+  264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640,
+  672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024};
 
 const WORD16 ixheaacd_sfb_32_960[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,
-    72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240,
-    264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640,
-    672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 0};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,
+  72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240,
+  264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640,
+  672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 0};
 
 const WORD16 ixheaacd_sfb_32_768[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,  72,  80,
-    88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352,
-    384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  48,  56,  64,  72,  80,
+  88,  96,  108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352,
+  384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768};
 
 const WORD16 ixheaacd_sfb_32_512[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,
-    56,  64,  72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 192,
-    212, 236, 260, 288, 320, 352, 384, 416, 448, 480, 512};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,
+  56,  64,  72,  80,  88,  96,  108, 120, 132, 144, 160, 176, 192,
+  212, 236, 260, 288, 320, 352, 384, 416, 448, 480, 512};
 
 const WORD16 ixheaacd_sfb_32_480[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,
-    56,  60,  64,  72,  80,  88,  96,  104, 112, 124, 136, 148, 164,
-    180, 200, 224, 256, 288, 320, 352, 384, 416, 448, 480};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48,  52,
+  56,  60,  64,  72,  80,  88,  96,  104, 112, 124, 136, 148, 164,
+  180, 200, 224, 256, 288, 320, 352, 384, 416, 448, 480};
 
 const WORD16 sfb_32_120[] = {4,  8,  12, 16, 20,  28,  36, 44,
-                             56, 68, 80, 96, 112, 120, 0};
+  56, 68, 80, 96, 112, 120, 0};
 
 const WORD16 ixheaacd_sfb_24_1024[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  52,
-    60,  68,  76,  84,  92,  100, 108, 116, 124, 136, 148, 160,
-    172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432,
-    468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  52,
+  60,  68,  76,  84,  92,  100, 108, 116, 124, 136, 148, 160,
+  172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432,
+  468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024};
 
 const WORD16 ixheaacd_sfb_24_960[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  52,
-    60,  68,  76,  84,  92,  100, 108, 116, 124, 136, 148, 160,
-    172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432,
-    468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 0};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  52,
+  60,  68,  76,  84,  92,  100, 108, 116, 124, 136, 148, 160,
+  172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432,
+  468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 0};
 
 const WORD16 ixheaacd_sfb_24_768[] = {
-    4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  52,  60,  68,  76,
-    84,  92,  100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260,
-    284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768};
+  4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  52,  60,  68,  76,
+  84,  92,  100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260,
+  284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768};
 
 const WORD16 ixheaacd_sfb_24_128[] = {4,  8,  12, 16, 20, 24,  28, 36,
-                                      44, 52, 64, 76, 92, 108, 128};
+  44, 52, 64, 76, 92, 108, 128};
 
 const WORD16 ixheaacd_sfb_24_120[] = {4,  8,  12, 16, 20, 24,  28,  36,
-                                      44, 52, 64, 76, 92, 108, 120, 0};
+  44, 52, 64, 76, 92, 108, 120, 0};
 
 const WORD16 ixheaacd_sfb_24_96[] = {4,  8,  12, 16, 20, 24, 28,
-                                     36, 44, 52, 64, 76, 92, 96};
+  36, 44, 52, 64, 76, 92, 96};
 
 const WORD16 ixheaacd_sfb_24_512[] = {4,   8,   12,  16,  20,  24,  28,  32,
-                                      36,  40,  44,  52,  60,  68,  80,  92,
-                                      104, 120, 140, 164, 192, 224, 256, 288,
-                                      320, 352, 384, 416, 448, 480, 512};
+  36,  40,  44,  52,  60,  68,  80,  92,
+  104, 120, 140, 164, 192, 224, 256, 288,
+  320, 352, 384, 416, 448, 480, 512};
 
 const WORD16 ixheaacd_sfb_24_480[] = {
-    4,  8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  52,  60,  68,  80,
-    92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480};
+  4,  8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  52,  60,  68,  80,
+  92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480};
 
 const WORD16 ixheaacd_sfb_16_1024[] = {
-    8,   16,  24,  32,  40,  48,  56,  64,  72,  80,  88,  100, 112, 124, 136,
-    148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, 396,
-    424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024};
+  8,   16,  24,  32,  40,  48,  56,  64,  72,  80,  88,  100, 112, 124, 136,
+  148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, 396,
+  424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024};
 
 const WORD16 ixheaacd_sfb_16_960[] = {
-    8,   16,  24,  32,  40,  48,  56,  64,  72,  80,  88,  100, 112, 124,
-    136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344,
-    368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960};
+  8,   16,  24,  32,  40,  48,  56,  64,  72,  80,  88,  100, 112, 124,
+  136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344,
+  368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960};
 
 const WORD16 ixheaacd_sfb_16_768[] = {
-    8,   16,  24,  32,  40,  48,  56,  64,  72,  80,  88,  100, 112,
-    124, 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300,
-    320, 344, 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 768};
+  8,   16,  24,  32,  40,  48,  56,  64,  72,  80,  88,  100, 112,
+  124, 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300,
+  320, 344, 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 768};
 
 const WORD16 ixheaacd_sfb_16_128[] = {4,  8,  12, 16, 20, 24,  28, 32,
-                                      40, 48, 60, 72, 88, 108, 128};
+  40, 48, 60, 72, 88, 108, 128};
 
 const WORD16 ixheaacd_sfb_16_120[] = {4,  8,  12, 16, 20, 24,  28, 32,
-                                      40, 48, 60, 72, 88, 108, 120};
+  40, 48, 60, 72, 88, 108, 120};
 
 const WORD16 ixheaacd_sfb_16_96[] = {4,  8,  12, 16, 20, 24, 28,
-                                     32, 40, 48, 60, 72, 88, 96};
+  32, 40, 48, 60, 72, 88, 96};
 
 const WORD16 ixheaacd_sfb_8_1024[] = {
-    12,  24,  36,  48,  60,  72,  84,  96,  108, 120, 132, 144, 156, 172,
-    188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
-    476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024};
+  12,  24,  36,  48,  60,  72,  84,  96,  108, 120, 132, 144, 156, 172,
+  188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
+  476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024};
 
 const WORD16 ixheaacd_sfb_8_768[] = {
-    12,  24,  36,  48,  60,  72,  84,  96,  108, 120, 132, 144, 156,
-    172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396,
-    420, 448, 476, 508, 544, 580, 620, 664, 712, 764, 768};
+  12,  24,  36,  48,  60,  72,  84,  96,  108, 120, 132, 144, 156,
+  172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396,
+  420, 448, 476, 508, 544, 580, 620, 664, 712, 764, 768};
 
 const WORD16 ixheaacd_sfb_8_128[] = {4,  8,  12, 16, 20, 24,  28, 36,
-                                     44, 52, 60, 72, 88, 108, 128};
+  44, 52, 60, 72, 88, 108, 128};
 
 const WORD16 ixheaacd_sfb_8_96[] = {4,  8,  12, 16, 20, 24, 28,
-                                    36, 44, 52, 60, 72, 88, 96};
+  36, 44, 52, 60, 72, 88, 96};
 
 const WORD16 ixheaacd_sfb_8_960[] = {
-    12,  24,  36,  48,  60,  72,  84,  96,  108, 120, 132, 144, 156, 172,
-    188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
-    476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 960};
+  12,  24,  36,  48,  60,  72,  84,  96,  108, 120, 132, 144, 156, 172,
+  188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
+  476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 960};
 
 const WORD16 ixheaacd_sfb_8_120[] = {4,  8,  12, 16, 20, 24,  28, 36,
-                                     44, 52, 60, 72, 88, 108, 120};
+  44, 52, 60, 72, 88, 108, 120};
 
 const WORD32 ixheaacd_sampling_boundaries[(1 << LEN_SAMP_IDX)] = {
-    92017, 75132, 55426, 46009, 37566, 27713, 23004, 18783,
-    13856, 11502, 9391,  0,     0,     0,     0,     0};
+  92017, 75132, 55426, 46009, 37566, 27713, 23004, 18783,
+  13856, 11502, 9391,  0,   0,   0,   0,   0};
 
 const ia_usac_samp_rate_info ixheaacd_samp_rate_info[(1 << LEN_SAMP_IDX)] = {
 
-    {96000, 41, ixheaacd_sfb_96_1024, 12, ixheaacd_sfb_96_128, 40,
-     ixheaacd_sfb_96_960, 12, ixheaacd_sfb_96_120, 37, ixheaacd_sfb_96_768, 12,
-     ixheaacd_sfb_96_96, 8, 4, 0, 0, 0, 0},
-    {88200, 41, ixheaacd_sfb_96_1024, 12, ixheaacd_sfb_96_128, 40,
-     ixheaacd_sfb_96_960, 12, ixheaacd_sfb_96_120, 37, ixheaacd_sfb_96_768, 12,
-     ixheaacd_sfb_96_96, 8, 4, 0, 0, 0, 0},
-    {64000, 47, ixheaacd_sfb_64_1024, 12, ixheaacd_sfb_64_128, 46,
-     ixheaacd_sfb_64_960, 12, ixheaacd_sfb_64_120, 41, ixheaacd_sfb_64_768, 12,
-     ixheaacd_sfb_64_96, 13, 5, 0, 0, 0, 0},
-    {48000, 49, ixheaacd_sfb_48_1024, 14, ixheaacd_sfb_48_128, 49,
-     ixheaacd_sfb_48_960, 14, ixheaacd_sfb_48_120, 43, ixheaacd_sfb_48_768, 12,
-     ixheaacd_sfb_48_96, 18, 5, 35, ixheaacd_sfb_48_480, 36,
-     ixheaacd_sfb_48_512},
-    {44100, 49, ixheaacd_sfb_48_1024, 14, ixheaacd_sfb_48_128, 49,
-     ixheaacd_sfb_48_960, 14, ixheaacd_sfb_48_120, 43, ixheaacd_sfb_48_768, 12,
-     ixheaacd_sfb_48_96, 18, 5, 35, ixheaacd_sfb_48_480, 36,
-     ixheaacd_sfb_48_512},
-    {32000, 51, ixheaacd_sfb_32_1024, 14, ixheaacd_sfb_48_128, 49,
-     ixheaacd_sfb_32_960, 14, ixheaacd_sfb_48_120, 43, ixheaacd_sfb_32_768, 12,
-     ixheaacd_sfb_48_96, 26, 6, 37, ixheaacd_sfb_32_480, 37,
-     ixheaacd_sfb_32_512},
-    {24000, 47, ixheaacd_sfb_24_1024, 15, ixheaacd_sfb_24_128, 46,
-     ixheaacd_sfb_24_960, 15, ixheaacd_sfb_24_120, 43, ixheaacd_sfb_24_768, 14,
-     ixheaacd_sfb_24_96, 36, 8, 30, ixheaacd_sfb_24_480, 31,
-     ixheaacd_sfb_24_512},
-    {22050, 47, ixheaacd_sfb_24_1024, 15, ixheaacd_sfb_24_128, 46,
-     ixheaacd_sfb_24_960, 15, ixheaacd_sfb_24_120, 43, ixheaacd_sfb_24_768, 14,
-     ixheaacd_sfb_24_96, 36, 8, 30, ixheaacd_sfb_24_480, 31,
-     ixheaacd_sfb_24_512},
-    {16000, 43, ixheaacd_sfb_16_1024, 15, ixheaacd_sfb_16_128, 42,
-     ixheaacd_sfb_16_960, 15, ixheaacd_sfb_16_120, 39, ixheaacd_sfb_16_768, 14,
-     ixheaacd_sfb_16_96, 54, 8, 0, 0, 0, 0},
-    {12000, 43, ixheaacd_sfb_16_1024, 15, ixheaacd_sfb_16_128, 42,
-     ixheaacd_sfb_16_960, 15, ixheaacd_sfb_16_120, 39, ixheaacd_sfb_16_768, 14,
-     ixheaacd_sfb_16_96, 104, 10, 0, 0, 0, 0},
-    {11025, 43, ixheaacd_sfb_16_1024, 15, ixheaacd_sfb_16_128, 42,
-     ixheaacd_sfb_16_960, 15, ixheaacd_sfb_16_120, 39, ixheaacd_sfb_16_768, 14,
-     ixheaacd_sfb_16_96, 104, 10, 0, 0, 0, 0},
-    {8000, 40, ixheaacd_sfb_8_1024, 15, ixheaacd_sfb_8_128, 40,
-     ixheaacd_sfb_8_960, 15, ixheaacd_sfb_8_120, 37, ixheaacd_sfb_8_768, 14,
-     ixheaacd_sfb_8_96, 104, 9, 0, 0, 0, 0},
-    {7350, 40, ixheaacd_sfb_8_1024, 15, ixheaacd_sfb_8_128, 40,
-     ixheaacd_sfb_8_960, 15, ixheaacd_sfb_8_120, 37, ixheaacd_sfb_8_768, 14,
-     ixheaacd_sfb_8_96, 104, 9, 0, 0, 0, 0},
-    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
+  {96000, 41, ixheaacd_sfb_96_1024, 12, ixheaacd_sfb_96_128, 40,
+   ixheaacd_sfb_96_960, 12, ixheaacd_sfb_96_120, 37, ixheaacd_sfb_96_768, 12,
+   ixheaacd_sfb_96_96, 8, 4, 0, 0, 0, 0},
+  {88200, 41, ixheaacd_sfb_96_1024, 12, ixheaacd_sfb_96_128, 40,
+   ixheaacd_sfb_96_960, 12, ixheaacd_sfb_96_120, 37, ixheaacd_sfb_96_768, 12,
+   ixheaacd_sfb_96_96, 8, 4, 0, 0, 0, 0},
+  {64000, 47, ixheaacd_sfb_64_1024, 12, ixheaacd_sfb_64_128, 46,
+   ixheaacd_sfb_64_960, 12, ixheaacd_sfb_64_120, 41, ixheaacd_sfb_64_768, 12,
+   ixheaacd_sfb_64_96, 13, 5, 0, 0, 0, 0},
+  {48000, 49, ixheaacd_sfb_48_1024, 14, ixheaacd_sfb_48_128, 49,
+   ixheaacd_sfb_48_960, 14, ixheaacd_sfb_48_120, 43, ixheaacd_sfb_48_768, 12,
+   ixheaacd_sfb_48_96, 18, 5, 35, ixheaacd_sfb_48_480, 36,
+   ixheaacd_sfb_48_512},
+  {44100, 49, ixheaacd_sfb_48_1024, 14, ixheaacd_sfb_48_128, 49,
+   ixheaacd_sfb_48_960, 14, ixheaacd_sfb_48_120, 43, ixheaacd_sfb_48_768, 12,
+   ixheaacd_sfb_48_96, 18, 5, 35, ixheaacd_sfb_48_480, 36,
+   ixheaacd_sfb_48_512},
+  {32000, 51, ixheaacd_sfb_32_1024, 14, ixheaacd_sfb_48_128, 49,
+   ixheaacd_sfb_32_960, 14, ixheaacd_sfb_48_120, 43, ixheaacd_sfb_32_768, 12,
+   ixheaacd_sfb_48_96, 26, 6, 37, ixheaacd_sfb_32_480, 37,
+   ixheaacd_sfb_32_512},
+  {24000, 47, ixheaacd_sfb_24_1024, 15, ixheaacd_sfb_24_128, 46,
+   ixheaacd_sfb_24_960, 15, ixheaacd_sfb_24_120, 43, ixheaacd_sfb_24_768, 14,
+   ixheaacd_sfb_24_96, 36, 8, 30, ixheaacd_sfb_24_480, 31,
+   ixheaacd_sfb_24_512},
+  {22050, 47, ixheaacd_sfb_24_1024, 15, ixheaacd_sfb_24_128, 46,
+   ixheaacd_sfb_24_960, 15, ixheaacd_sfb_24_120, 43, ixheaacd_sfb_24_768, 14,
+   ixheaacd_sfb_24_96, 36, 8, 30, ixheaacd_sfb_24_480, 31,
+   ixheaacd_sfb_24_512},
+  {16000, 43, ixheaacd_sfb_16_1024, 15, ixheaacd_sfb_16_128, 42,
+   ixheaacd_sfb_16_960, 15, ixheaacd_sfb_16_120, 39, ixheaacd_sfb_16_768, 14,
+   ixheaacd_sfb_16_96, 54, 8, 0, 0, 0, 0},
+  {12000, 43, ixheaacd_sfb_16_1024, 15, ixheaacd_sfb_16_128, 42,
+   ixheaacd_sfb_16_960, 15, ixheaacd_sfb_16_120, 39, ixheaacd_sfb_16_768, 14,
+   ixheaacd_sfb_16_96, 104, 10, 0, 0, 0, 0},
+  {11025, 43, ixheaacd_sfb_16_1024, 15, ixheaacd_sfb_16_128, 42,
+   ixheaacd_sfb_16_960, 15, ixheaacd_sfb_16_120, 39, ixheaacd_sfb_16_768, 14,
+   ixheaacd_sfb_16_96, 104, 10, 0, 0, 0, 0},
+  {8000, 40, ixheaacd_sfb_8_1024, 15, ixheaacd_sfb_8_128, 40,
+   ixheaacd_sfb_8_960, 15, ixheaacd_sfb_8_120, 37, ixheaacd_sfb_8_768, 14,
+   ixheaacd_sfb_8_96, 104, 9, 0, 0, 0, 0},
+  {7350, 40, ixheaacd_sfb_8_1024, 15, ixheaacd_sfb_8_128, 40,
+   ixheaacd_sfb_8_960, 15, ixheaacd_sfb_8_120, 37, ixheaacd_sfb_8_768, 14,
+   ixheaacd_sfb_8_96, 104, 9, 0, 0, 0, 0},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
 
 const FLOAT32 ixheaacd_int_leave_gain_table[256] = {
-    0.012445F, 0.215546F, 0.028326F, 0.965442F,  0.053042F, 0.525819F,
-    0.065409F, 1.495322F, 0.078212F, 2.323725F,  0.100504F, 0.751276F,
-    0.112617F, 3.427530F, 0.113124F, 0.309583F,  0.121763F, 1.140685F,
-    0.143515F, 7.519609F, 0.162430F, 0.568752F,  0.164940F, 1.904113F,
-    0.165429F, 4.947562F, 0.194985F, 0.855463F,  0.213527F, 1.281019F,
-    0.223544F, 0.414672F, 0.243135F, 2.781766F,  0.257180F, 1.659565F,
-    0.269488F, 0.636749F, 0.286539F, 1.003938F,  0.328124F, 2.225436F,
-    0.328761F, 0.330278F, 0.336807F, 11.500983F, 0.339794F, 3.805726F,
-    0.344454F, 1.494626F, 0.346165F, 0.738748F,  0.363605F, 1.141454F,
-    0.398729F, 0.517614F, 0.415276F, 2.928666F,  0.416282F, 0.862935F,
-    0.423421F, 1.873310F, 0.444151F, 0.202244F,  0.445842F, 1.301113F,
-    0.455671F, 5.519512F, 0.484764F, 0.387607F,  0.488696F, 0.967884F,
-    0.488730F, 0.666771F, 0.508189F, 1.516224F,  0.508792F, 2.348662F,
-    0.531504F, 3.883870F, 0.548649F, 1.112861F,  0.551182F, 0.514986F,
-    0.564397F, 1.742030F, 0.566598F, 0.796454F,  0.589255F, 3.081743F,
-    0.598816F, 1.271936F, 0.617654F, 0.333501F,  0.619073F, 2.040522F,
-    0.625282F, 0.950244F, 0.630798F, 0.594883F,  0.638918F, 4.863197F,
-    0.650102F, 1.464846F, 0.668412F, 0.747138F,  0.669490F, 2.583027F,
-    0.683757F, 1.125479F, 0.691216F, 1.739274F,  0.718441F, 3.297789F,
-    0.722608F, 0.902743F, 0.728827F, 2.194941F,  0.729586F, 0.633849F,
-    0.730907F, 7.432957F, 0.731017F, 0.431076F,  0.731543F, 1.387847F,
-    0.759183F, 1.045210F, 0.768606F, 1.789648F,  0.771245F, 4.085637F,
-    0.772613F, 0.778145F, 0.786483F, 1.283204F,  0.792467F, 2.412891F,
-    0.802393F, 0.544588F, 0.807156F, 0.255978F,  0.814280F, 1.544409F,
-    0.817839F, 0.938798F, 0.826959F, 2.910633F,  0.830453F, 0.684066F,
-    0.833431F, 1.171532F, 0.841208F, 1.908628F,  0.846440F, 5.333522F,
-    0.868280F, 0.841519F, 0.868662F, 1.435230F,  0.871449F, 3.675784F,
-    0.881317F, 2.245058F, 0.882020F, 0.480249F,  0.882476F, 1.105804F,
-    0.902856F, 0.684850F, 0.904419F, 1.682113F,  0.909384F, 2.787801F,
-    0.916558F, 7.500981F, 0.918444F, 0.950341F,  0.919721F, 1.296319F,
-    0.940272F, 4.682978F, 0.940273F, 1.991736F,  0.950291F, 3.507281F,
-    0.957455F, 1.116284F, 0.957723F, 0.793034F,  0.958217F, 1.497824F,
-    0.962628F, 2.514156F, 0.968507F, 0.588605F,  0.974739F, 0.339933F,
-    0.991738F, 1.750201F, 0.997210F, 0.936131F,  1.002422F, 1.250008F,
-    1.006040F, 2.167232F, 1.008848F, 3.129940F,  1.014404F, 5.842819F,
-    1.027798F, 4.287319F, 1.039404F, 1.489295F,  1.039628F, 8.947958F,
-    1.043214F, 0.765733F, 1.045089F, 2.537806F,  1.058994F, 1.031496F,
-    1.060415F, 0.478612F, 1.072132F, 12.8F,      1.074778F, 1.910049F,
-    1.076570F, 15.9999F,  1.107853F, 3.843067F,  1.110673F, 1.228576F,
-    1.110969F, 2.758471F, 1.140058F, 1.603077F,  1.155384F, 0.668935F,
-    1.176229F, 6.717108F, 1.179008F, 2.011940F,  1.187735F, 0.963552F,
-    1.199569F, 4.891432F, 1.206311F, 3.316329F,  1.215323F, 2.507536F,
-    1.223150F, 1.387102F, 1.296012F, 9.684225F};
-const WORD32 twiddle_table_fft[257] = {
-    0x00007fff, 0xff377fff, 0xfe6e7ffe, 0xfda57ffa, 0xfcdc7ff6, 0xfc137ff1,
-    0xfb4a7fea, 0xfa817fe2, 0xf9b87fd9, 0xf8ef7fce, 0xf8277fc2, 0xf75e7fb5,
-    0xf6957fa7, 0xf5cd7f98, 0xf5057f87, 0xf43c7f75, 0xf3747f62, 0xf2ac7f4e,
-    0xf1e47f38, 0xf11c7f22, 0xf0557f0a, 0xef8d7ef0, 0xeec67ed6, 0xedff7eba,
-    0xed387e9d, 0xec717e7f, 0xebab7e60, 0xeae47e3f, 0xea1e7e1e, 0xe9587dfb,
-    0xe8927dd6, 0xe7cd7db1, 0xe7077d8a, 0xe6427d63, 0xe57d7d3a, 0xe4b97d0f,
-    0xe3f47ce4, 0xe3307cb7, 0xe26d7c89, 0xe1a97c5a, 0xe0e67c2a, 0xe0237bf9,
-    0xdf617bc6, 0xde9e7b92, 0xdddc7b5d, 0xdd1b7b27, 0xdc597aef, 0xdb997ab7,
-    0xdad87a7d, 0xda187a42, 0xd9587a06, 0xd89879c9, 0xd7d9798a, 0xd71b794a,
-    0xd65c790a, 0xd59e78c8, 0xd4e17885, 0xd4247840, 0xd36777fb, 0xd2ab77b4,
-    0xd1ef776c, 0xd1347723, 0xd07976d9, 0xcfbe768e, 0xcf047642, 0xce4b75f4,
-    0xcd9275a6, 0xccd97556, 0xcc217505, 0xcb6974b3, 0xcab27460, 0xc9fc740b,
-    0xc94673b6, 0xc890735f, 0xc7db7308, 0xc72772af, 0xc6737255, 0xc5c071fa,
-    0xc50d719e, 0xc45b7141, 0xc3a970e3, 0xc2f87083, 0xc2487023, 0xc1986fc2,
-    0xc0e96f5f, 0xc03a6efb, 0xbf8c6e97, 0xbedf6e31, 0xbe326dca, 0xbd866d62,
-    0xbcda6cf9, 0xbc2f6c8f, 0xbb856c24, 0xbadc6bb8, 0xba336b4b, 0xb98b6add,
-    0xb8e36a6e, 0xb83c69fd, 0xb796698c, 0xb6f1691a, 0xb64c68a7, 0xb5a86832,
-    0xb50567bd, 0xb4626747, 0xb3c066d0, 0xb31f6657, 0xb27f65de, 0xb1df6564,
-    0xb14064e9, 0xb0a2646c, 0xb00563ef, 0xaf686371, 0xaecc62f2, 0xae316272,
-    0xad9761f1, 0xacfd616f, 0xac6560ec, 0xabcd6068, 0xab365fe4, 0xaaa05f5e,
-    0xaa0a5ed7, 0xa9765e50, 0xa8e25dc8, 0xa84f5d3e, 0xa7bd5cb4, 0xa72c5c29,
-    0xa69c5b9d, 0xa60c5b10, 0xa57e5a82, 0xa4f059f4, 0xa4635964, 0xa3d758d4,
-    0xa34c5843, 0xa2c257b1, 0xa238571e, 0xa1b0568a, 0xa12955f6, 0xa0a25560,
-    0xa01c54ca, 0x9f985433, 0x9f14539b, 0x9e915303, 0x9e0f5269, 0x9d8e51cf,
-    0x9d0e5134, 0x9c8f5098, 0x9c114ffb, 0x9b944f5e, 0x9b174ec0, 0x9a9c4e21,
-    0x9a224d81, 0x99a94ce1, 0x99304c40, 0x98b94b9e, 0x98434afb, 0x97ce4a58,
-    0x975949b4, 0x96e6490f, 0x9674486a, 0x960347c4, 0x9592471d, 0x95234675,
-    0x94b545cd, 0x94484524, 0x93dc447b, 0x937143d1, 0x93074326, 0x929e427a,
-    0x923641ce, 0x91cf4121, 0x91694074, 0x91053fc6, 0x90a13f17, 0x903e3e68,
-    0x8fdd3db8, 0x8f7d3d08, 0x8f1d3c57, 0x8ebf3ba5, 0x8e623af3, 0x8e063a40,
-    0x8dab398d, 0x8d5138d9, 0x8cf83825, 0x8ca13770, 0x8c4a36ba, 0x8bf53604,
-    0x8ba0354e, 0x8b4d3497, 0x8afb33df, 0x8aaa3327, 0x8a5a326e, 0x8a0c31b5,
-    0x89be30fc, 0x89723042, 0x89272f87, 0x88dd2ecc, 0x88942e11, 0x884c2d55,
-    0x88052c99, 0x87c02bdc, 0x877b2b1f, 0x87382a62, 0x86f629a4, 0x86b628e5,
-    0x86762827, 0x86372768, 0x85fa26a8, 0x85be25e8, 0x85832528, 0x85492467,
-    0x851123a7, 0x84d922e5, 0x84a32224, 0x846e2162, 0x843a209f, 0x84071fdd,
-    0x83d61f1a, 0x83a61e57, 0x83771d93, 0x83491cd0, 0x831c1c0c, 0x82f11b47,
-    0x82c61a83, 0x829d19be, 0x827618f9, 0x824f1833, 0x822a176e, 0x820516a8,
-    0x81e215e2, 0x81c1151c, 0x81a01455, 0x8181138f, 0x816312c8, 0x81461201,
-    0x812a113a, 0x81101073, 0x80f60fab, 0x80de0ee4, 0x80c80e1c, 0x80b20d54,
-    0x809e0c8c, 0x808b0bc4, 0x80790afb, 0x80680a33, 0x8059096b, 0x804b08a2,
-    0x803e07d9, 0x80320711, 0x80270648, 0x801e057f, 0x801604b6, 0x800f03ed,
-    0x800a0324, 0x8006025b, 0x80020192, 0x800100c9, 0x80000000};
+  0.012445F, 0.215546F, 0.028326F, 0.965442F,  0.053042F, 0.525819F,
+  0.065409F, 1.495322F, 0.078212F, 2.323725F,  0.100504F, 0.751276F,
+  0.112617F, 3.427530F, 0.113124F, 0.309583F,  0.121763F, 1.140685F,
+  0.143515F, 7.519609F, 0.162430F, 0.568752F,  0.164940F, 1.904113F,
+  0.165429F, 4.947562F, 0.194985F, 0.855463F,  0.213527F, 1.281019F,
+  0.223544F, 0.414672F, 0.243135F, 2.781766F,  0.257180F, 1.659565F,
+  0.269488F, 0.636749F, 0.286539F, 1.003938F,  0.328124F, 2.225436F,
+  0.328761F, 0.330278F, 0.336807F, 11.500983F, 0.339794F, 3.805726F,
+  0.344454F, 1.494626F, 0.346165F, 0.738748F,  0.363605F, 1.141454F,
+  0.398729F, 0.517614F, 0.415276F, 2.928666F,  0.416282F, 0.862935F,
+  0.423421F, 1.873310F, 0.444151F, 0.202244F,  0.445842F, 1.301113F,
+  0.455671F, 5.519512F, 0.484764F, 0.387607F,  0.488696F, 0.967884F,
+  0.488730F, 0.666771F, 0.508189F, 1.516224F,  0.508792F, 2.348662F,
+  0.531504F, 3.883870F, 0.548649F, 1.112861F,  0.551182F, 0.514986F,
+  0.564397F, 1.742030F, 0.566598F, 0.796454F,  0.589255F, 3.081743F,
+  0.598816F, 1.271936F, 0.617654F, 0.333501F,  0.619073F, 2.040522F,
+  0.625282F, 0.950244F, 0.630798F, 0.594883F,  0.638918F, 4.863197F,
+  0.650102F, 1.464846F, 0.668412F, 0.747138F,  0.669490F, 2.583027F,
+  0.683757F, 1.125479F, 0.691216F, 1.739274F,  0.718441F, 3.297789F,
+  0.722608F, 0.902743F, 0.728827F, 2.194941F,  0.729586F, 0.633849F,
+  0.730907F, 7.432957F, 0.731017F, 0.431076F,  0.731543F, 1.387847F,
+  0.759183F, 1.045210F, 0.768606F, 1.789648F,  0.771245F, 4.085637F,
+  0.772613F, 0.778145F, 0.786483F, 1.283204F,  0.792467F, 2.412891F,
+  0.802393F, 0.544588F, 0.807156F, 0.255978F,  0.814280F, 1.544409F,
+  0.817839F, 0.938798F, 0.826959F, 2.910633F,  0.830453F, 0.684066F,
+  0.833431F, 1.171532F, 0.841208F, 1.908628F,  0.846440F, 5.333522F,
+  0.868280F, 0.841519F, 0.868662F, 1.435230F,  0.871449F, 3.675784F,
+  0.881317F, 2.245058F, 0.882020F, 0.480249F,  0.882476F, 1.105804F,
+  0.902856F, 0.684850F, 0.904419F, 1.682113F,  0.909384F, 2.787801F,
+  0.916558F, 7.500981F, 0.918444F, 0.950341F,  0.919721F, 1.296319F,
+  0.940272F, 4.682978F, 0.940273F, 1.991736F,  0.950291F, 3.507281F,
+  0.957455F, 1.116284F, 0.957723F, 0.793034F,  0.958217F, 1.497824F,
+  0.962628F, 2.514156F, 0.968507F, 0.588605F,  0.974739F, 0.339933F,
+  0.991738F, 1.750201F, 0.997210F, 0.936131F,  1.002422F, 1.250008F,
+  1.006040F, 2.167232F, 1.008848F, 3.129940F,  1.014404F, 5.842819F,
+  1.027798F, 4.287319F, 1.039404F, 1.489295F,  1.039628F, 8.947958F,
+  1.043214F, 0.765733F, 1.045089F, 2.537806F,  1.058994F, 1.031496F,
+  1.060415F, 0.478612F, 1.072132F, 12.8F,    1.074778F, 1.910049F,
+  1.076570F, 15.9999F,  1.107853F, 3.843067F,  1.110673F, 1.228576F,
+  1.110969F, 2.758471F, 1.140058F, 1.603077F,  1.155384F, 0.668935F,
+  1.176229F, 6.717108F, 1.179008F, 2.011940F,  1.187735F, 0.963552F,
+  1.199569F, 4.891432F, 1.206311F, 3.316329F,  1.215323F, 2.507536F,
+  1.223150F, 1.387102F, 1.296012F, 9.684225F};
 
 const WORD32 ixheaacd_twiddle_table_fft_32x32[514] = {
-    0x00000000, 0x7fffffff, 0xff36f079, 0x7fff6215, 0xfe6de2e1, 0x7ffd8859,
-    0xfda4d929, 0x7ffa72d0, 0xfcdbd542, 0x7ff62181, 0xfc12d91a, 0x7ff09476,
-    0xfb49e6a3, 0x7fe9cbbe, 0xfa80ffcc, 0x7fe1c76a, 0xf9b82684, 0x7fd8878c,
-    0xf8ef5cbc, 0x7fce0c3d, 0xf826a462, 0x7fc25595, 0xf75dff66, 0x7fb563b1,
-    0xf6956fb7, 0x7fa736b3, 0xf5ccf744, 0x7f97cebb, 0xf50497fb, 0x7f872bf1,
-    0xf43c53cb, 0x7f754e7e, 0xf3742ca2, 0x7f62368e, 0xf2ac246e, 0x7f4de44f,
-    0xf1e43d1d, 0x7f3857f4, 0xf11c789b, 0x7f2191b2, 0xf054d8d5, 0x7f0991c2,
-    0xef8d5fb9, 0x7ef0585e, 0xeec60f32, 0x7ed5e5c5, 0xedfee92c, 0x7eba3a38,
-    0xed37ef92, 0x7e9d55fb, 0xec712450, 0x7e7f3955, 0xebaa894f, 0x7e5fe492,
-    0xeae4207b, 0x7e3f57fd, 0xea1debbc, 0x7e1d93e8, 0xe957ecfc, 0x7dfa98a6,
-    0xe8922622, 0x7dd6668d, 0xe7cc9918, 0x7db0fdf6, 0xe70747c4, 0x7d8a5f3e,
-    0xe642340e, 0x7d628ac4, 0xe57d5fdb, 0x7d3980eb, 0xe4b8cd11, 0x7d0f4217,
-    0xe3f47d96, 0x7ce3ceb0, 0xe330734d, 0x7cb72723, 0xe26cb01b, 0x7c894bdc,
-    0xe1a935e2, 0x7c5a3d4e, 0xe0e60685, 0x7c29fbed, 0xe02323e6, 0x7bf8882f,
-    0xdf608fe4, 0x7bc5e28e, 0xde9e4c61, 0x7b920b88, 0xdddc5b3b, 0x7b5d039c,
-    0xdd1abe52, 0x7b26cb4e, 0xdc597782, 0x7aef6322, 0xdb9888a9, 0x7ab6cba2,
-    0xdad7f3a3, 0x7a7d055a, 0xda17ba4b, 0x7a4210d7, 0xd957de7b, 0x7a05eeac,
-    0xd898620c, 0x79c89f6c, 0xd7d946d8, 0x798a23b0, 0xd71a8eb6, 0x794a7c10,
-    0xd65c3b7c, 0x7909a92b, 0xd59e4eff, 0x78c7aba0, 0xd4e0cb15, 0x78848412,
-    0xd423b191, 0x78403327, 0xd3670446, 0x77fab987, 0xd2aac505, 0x77b417de,
-    0xd1eef59f, 0x776c4eda, 0xd13397e2, 0x77235f2c, 0xd078ad9e, 0x76d94987,
-    0xcfbe38a0, 0x768e0ea4, 0xcf043ab3, 0x7641af3b, 0xce4ab5a3, 0x75f42c09,
-    0xcd91ab39, 0x75a585ce, 0xccd91d3e, 0x7555bd4a, 0xcc210d79, 0x7504d344,
-    0xcb697db1, 0x74b2c882, 0xcab26faa, 0x745f9dd0, 0xc9fbe528, 0x740b53f9,
-    0xc945dfed, 0x73b5ebd0, 0xc89061ba, 0x735f6625, 0xc7db6c50, 0x7307c3cf,
-    0xc727016d, 0x72af05a5, 0xc67322ce, 0x72552c83, 0xc5bfd22f, 0x71fa3947,
-    0xc50d1149, 0x719e2cd1, 0xc45ae1d7, 0x71410803, 0xc3a94590, 0x70e2cbc5,
-    0xc2f83e2b, 0x708378fd, 0xc247cd5b, 0x70231098, 0xc197f4d4, 0x6fc19384,
-    0xc0e8b649, 0x6f5f02b0, 0xc03a1369, 0x6efb5f11, 0xbf8c0de3, 0x6e96a99b,
-    0xbedea766, 0x6e30e348, 0xbe31e19c, 0x6dca0d13, 0xbd85be30, 0x6d6227f9,
-    0xbcda3ecb, 0x6cf934fa, 0xbc2f6514, 0x6c8f351b, 0xbb8532b0, 0x6c24295f,
-    0xbadba944, 0x6bb812d0, 0xba32ca71, 0x6b4af277, 0xb98a97d9, 0x6adcc963,
-    0xb8e3131a, 0x6a6d98a3, 0xb83c3dd2, 0x69fd6149, 0xb796199c, 0x698c246b,
-    0xb6f0a812, 0x6919e31f, 0xb64beacd, 0x68a69e80, 0xb5a7e363, 0x683257aa,
-    0xb5049369, 0x67bd0fbb, 0xb461fc71, 0x6746c7d6, 0xb3c0200d, 0x66cf811f,
-    0xb31effcc, 0x66573cba, 0xb27e9d3c, 0x65ddfbd2, 0xb1def9e9, 0x6563bf91,
-    0xb140175c, 0x64e88925, 0xb0a1f71d, 0x646c59be, 0xb0049ab3, 0x63ef328e,
-    0xaf6803a2, 0x637114cb, 0xaecc336c, 0x62f201ab, 0xae312b92, 0x6271fa68,
-    0xad96ed92, 0x61f1003e, 0xacfd7ae9, 0x616f146a, 0xac64d511, 0x60ec382f,
-    0xabccfd83, 0x60686cce, 0xab35f5b6, 0x5fe3b38c, 0xaa9fbf1e, 0x5f5e0db2,
-    0xaa0a5b2e, 0x5ed77c88, 0xa975cb57, 0x5e50015c, 0xa8e21107, 0x5dc79d7b,
-    0xa84f2daa, 0x5d3e5235, 0xa7bd22ac, 0x5cb420df, 0xa72bf174, 0x5c290acb,
-    0xa69b9b69, 0x5b9d1152, 0xa60c21ee, 0x5b1035ce, 0xa57d8667, 0x5a827999,
-    0xa4efca31, 0x59f3de11, 0xa462eead, 0x59646497, 0xa3d6f534, 0x58d40e8b,
-    0xa34bdf21, 0x5842dd53, 0xa2c1adca, 0x57b0d255, 0xa2386284, 0x571deef8,
-    0xa1affea3, 0x568a34a8, 0xa1288377, 0x55f5a4d1, 0xa0a1f24d, 0x556040e1,
-    0xa01c4c73, 0x54ca0a49, 0x9f979332, 0x5433027c, 0x9f13c7d1, 0x539b2aee,
-    0x9e90eb95, 0x53028517, 0x9e0effc2, 0x5269126d, 0x9d8e0597, 0x51ced46d,
-    0x9d0dfe54, 0x5133cc93, 0x9c8eeb34, 0x5097fc5d, 0x9c10cd71, 0x4ffb654c,
-    0x9b93a641, 0x4f5e08e2, 0x9b1776da, 0x4ebfe8a3, 0x9a9c406e, 0x4e210616,
-    0x9a22042d, 0x4d8162c3, 0x99a8c345, 0x4ce10033, 0x99307ee1, 0x4c3fdff2,
-    0x98b93829, 0x4b9e038f, 0x9842f044, 0x4afb6c97, 0x97cda856, 0x4a581c9c,
-    0x9759617f, 0x49b41532, 0x96e61ce0, 0x490f57ed, 0x9673db94, 0x4869e664,
-    0x96029eb6, 0x47c3c22e, 0x9592675c, 0x471cece6, 0x9523369c, 0x46756827,
-    0x94b50d88, 0x45cd358e, 0x9447ed30, 0x452456bc, 0x93dbd6a0, 0x447acd4f,
-    0x9370cae4, 0x43d09aec, 0x9306cb05, 0x4325c134, 0x929dd806, 0x427a41cf,
-    0x9235f2ec, 0x41ce1e64, 0x91cf1cb7, 0x4121589a, 0x91695664, 0x4073f21c,
-    0x9104a0ee, 0x3fc5ec97, 0x90a0fd4f, 0x3f1749b7, 0x903e6c7b, 0x3e680b2c,
-    0x8fdcef67, 0x3db832a5, 0x8f7c8702, 0x3d07c1d5, 0x8f1d343a, 0x3c56ba6f,
-    0x8ebef7fc, 0x3ba51e28, 0x8e61d32e, 0x3af2eeb6, 0x8e05c6b8, 0x3a402dd1,
-    0x8daad37c, 0x398cdd31, 0x8d50fa5a, 0x38d8fe92, 0x8cf83c31, 0x382493af,
-    0x8ca099da, 0x376f9e45, 0x8c4a1430, 0x36ba2013, 0x8bf4ac06, 0x36041ad8,
-    0x8ba06230, 0x354d9056, 0x8b4d377d, 0x3496824f, 0x8afb2cbb, 0x33def286,
-    0x8aaa42b5, 0x3326e2c2, 0x8a5a7a31, 0x326e54c7, 0x8a0bd3f6, 0x31b54a5d,
-    0x89be50c4, 0x30fbc54c, 0x8971f15b, 0x3041c760, 0x8926b678, 0x2f875261,
-    0x88dca0d3, 0x2ecc681d, 0x8893b125, 0x2e110a61, 0x884be821, 0x2d553afb,
-    0x88054678, 0x2c98fbba, 0x87bfccd8, 0x2bdc4e6e, 0x877b7bed, 0x2b1f34eb,
-    0x8738545f, 0x2a61b101, 0x86f656d4, 0x29a3c484, 0x86b583ef, 0x28e5714a,
-    0x8675dc4f, 0x2826b927, 0x86376093, 0x27679df3, 0x85fa1153, 0x26a82185,
-    0x85bdef28, 0x25e845b5, 0x8582faa5, 0x25280c5d, 0x8549345d, 0x24677757,
-    0x85109cdd, 0x23a6887e, 0x84d934b1, 0x22e541ae, 0x84a2fc63, 0x2223a4c5,
-    0x846df477, 0x2161b39f, 0x843a1d71, 0x209f701c, 0x840777d0, 0x1fdcdc1a,
-    0x83d60412, 0x1f19f97a, 0x83a5c2b1, 0x1e56ca1d, 0x8376b423, 0x1d934fe5,
-    0x8348d8dc, 0x1ccf8cb2, 0x831c314f, 0x1c0b826a, 0x82f0bde9, 0x1b4732ef,
-    0x82c67f14, 0x1a82a025, 0x829d753b, 0x19bdcbf2, 0x8275a0c1, 0x18f8b83c,
-    0x824f0209, 0x183366e8, 0x82299972, 0x176dd9de, 0x82056759, 0x16a81304,
-    0x81e26c17, 0x15e21444, 0x81c0a802, 0x151bdf85, 0x81a01b6d, 0x145576b1,
-    0x8180c6aa, 0x138edbb0, 0x8162aa04, 0x12c8106e, 0x8145c5c7, 0x120116d4,
-    0x812a1a3a, 0x1139f0ce, 0x810fa7a1, 0x1072a047, 0x80f66e3d, 0x0fab272b,
-    0x80de6e4d, 0x0ee38765, 0x80c7a80b, 0x0e1bc2e3, 0x80b21bb0, 0x0d53db92,
-    0x809dc971, 0x0c8bd35d, 0x808ab181, 0x0bc3ac35, 0x8078d40e, 0x0afb6805,
-    0x80683144, 0x0a3308bc, 0x8058c94c, 0x096a9049, 0x804a9c4e, 0x08a2009a,
-    0x803daa6a, 0x07d95b9e, 0x8031f3c2, 0x0710a344, 0x80277873, 0x0647d97c,
-    0x801e3895, 0x057f0034, 0x80163441, 0x04b6195d, 0x800f6b89, 0x03ed26e6,
-    0x8009de7e, 0x03242abe, 0x80058d2f, 0x025b26d7, 0x800277a6, 0x01921d1f,
-    0x80009dea, 0x00c90f87, 0x80000000, 0x00000000};
+  0x00000000, 0x7fffffff, 0xff36f079, 0x7fff6215, 0xfe6de2e1, 0x7ffd8859,
+  0xfda4d929, 0x7ffa72d0, 0xfcdbd542, 0x7ff62181, 0xfc12d91a, 0x7ff09476,
+  0xfb49e6a3, 0x7fe9cbbe, 0xfa80ffcc, 0x7fe1c76a, 0xf9b82684, 0x7fd8878c,
+  0xf8ef5cbc, 0x7fce0c3d, 0xf826a462, 0x7fc25595, 0xf75dff66, 0x7fb563b1,
+  0xf6956fb7, 0x7fa736b3, 0xf5ccf744, 0x7f97cebb, 0xf50497fb, 0x7f872bf1,
+  0xf43c53cb, 0x7f754e7e, 0xf3742ca2, 0x7f62368e, 0xf2ac246e, 0x7f4de44f,
+  0xf1e43d1d, 0x7f3857f4, 0xf11c789b, 0x7f2191b2, 0xf054d8d5, 0x7f0991c2,
+  0xef8d5fb9, 0x7ef0585e, 0xeec60f32, 0x7ed5e5c5, 0xedfee92c, 0x7eba3a38,
+  0xed37ef92, 0x7e9d55fb, 0xec712450, 0x7e7f3955, 0xebaa894f, 0x7e5fe492,
+  0xeae4207b, 0x7e3f57fd, 0xea1debbc, 0x7e1d93e8, 0xe957ecfc, 0x7dfa98a6,
+  0xe8922622, 0x7dd6668d, 0xe7cc9918, 0x7db0fdf6, 0xe70747c4, 0x7d8a5f3e,
+  0xe642340e, 0x7d628ac4, 0xe57d5fdb, 0x7d3980eb, 0xe4b8cd11, 0x7d0f4217,
+  0xe3f47d96, 0x7ce3ceb0, 0xe330734d, 0x7cb72723, 0xe26cb01b, 0x7c894bdc,
+  0xe1a935e2, 0x7c5a3d4e, 0xe0e60685, 0x7c29fbed, 0xe02323e6, 0x7bf8882f,
+  0xdf608fe4, 0x7bc5e28e, 0xde9e4c61, 0x7b920b88, 0xdddc5b3b, 0x7b5d039c,
+  0xdd1abe52, 0x7b26cb4e, 0xdc597782, 0x7aef6322, 0xdb9888a9, 0x7ab6cba2,
+  0xdad7f3a3, 0x7a7d055a, 0xda17ba4b, 0x7a4210d7, 0xd957de7b, 0x7a05eeac,
+  0xd898620c, 0x79c89f6c, 0xd7d946d8, 0x798a23b0, 0xd71a8eb6, 0x794a7c10,
+  0xd65c3b7c, 0x7909a92b, 0xd59e4eff, 0x78c7aba0, 0xd4e0cb15, 0x78848412,
+  0xd423b191, 0x78403327, 0xd3670446, 0x77fab987, 0xd2aac505, 0x77b417de,
+  0xd1eef59f, 0x776c4eda, 0xd13397e2, 0x77235f2c, 0xd078ad9e, 0x76d94987,
+  0xcfbe38a0, 0x768e0ea4, 0xcf043ab3, 0x7641af3b, 0xce4ab5a3, 0x75f42c09,
+  0xcd91ab39, 0x75a585ce, 0xccd91d3e, 0x7555bd4a, 0xcc210d79, 0x7504d344,
+  0xcb697db1, 0x74b2c882, 0xcab26faa, 0x745f9dd0, 0xc9fbe528, 0x740b53f9,
+  0xc945dfed, 0x73b5ebd0, 0xc89061ba, 0x735f6625, 0xc7db6c50, 0x7307c3cf,
+  0xc727016d, 0x72af05a5, 0xc67322ce, 0x72552c83, 0xc5bfd22f, 0x71fa3947,
+  0xc50d1149, 0x719e2cd1, 0xc45ae1d7, 0x71410803, 0xc3a94590, 0x70e2cbc5,
+  0xc2f83e2b, 0x708378fd, 0xc247cd5b, 0x70231098, 0xc197f4d4, 0x6fc19384,
+  0xc0e8b649, 0x6f5f02b0, 0xc03a1369, 0x6efb5f11, 0xbf8c0de3, 0x6e96a99b,
+  0xbedea766, 0x6e30e348, 0xbe31e19c, 0x6dca0d13, 0xbd85be30, 0x6d6227f9,
+  0xbcda3ecb, 0x6cf934fa, 0xbc2f6514, 0x6c8f351b, 0xbb8532b0, 0x6c24295f,
+  0xbadba944, 0x6bb812d0, 0xba32ca71, 0x6b4af277, 0xb98a97d9, 0x6adcc963,
+  0xb8e3131a, 0x6a6d98a3, 0xb83c3dd2, 0x69fd6149, 0xb796199c, 0x698c246b,
+  0xb6f0a812, 0x6919e31f, 0xb64beacd, 0x68a69e80, 0xb5a7e363, 0x683257aa,
+  0xb5049369, 0x67bd0fbb, 0xb461fc71, 0x6746c7d6, 0xb3c0200d, 0x66cf811f,
+  0xb31effcc, 0x66573cba, 0xb27e9d3c, 0x65ddfbd2, 0xb1def9e9, 0x6563bf91,
+  0xb140175c, 0x64e88925, 0xb0a1f71d, 0x646c59be, 0xb0049ab3, 0x63ef328e,
+  0xaf6803a2, 0x637114cb, 0xaecc336c, 0x62f201ab, 0xae312b92, 0x6271fa68,
+  0xad96ed92, 0x61f1003e, 0xacfd7ae9, 0x616f146a, 0xac64d511, 0x60ec382f,
+  0xabccfd83, 0x60686cce, 0xab35f5b6, 0x5fe3b38c, 0xaa9fbf1e, 0x5f5e0db2,
+  0xaa0a5b2e, 0x5ed77c88, 0xa975cb57, 0x5e50015c, 0xa8e21107, 0x5dc79d7b,
+  0xa84f2daa, 0x5d3e5235, 0xa7bd22ac, 0x5cb420df, 0xa72bf174, 0x5c290acb,
+  0xa69b9b69, 0x5b9d1152, 0xa60c21ee, 0x5b1035ce, 0xa57d8667, 0x5a827999,
+  0xa4efca31, 0x59f3de11, 0xa462eead, 0x59646497, 0xa3d6f534, 0x58d40e8b,
+  0xa34bdf21, 0x5842dd53, 0xa2c1adca, 0x57b0d255, 0xa2386284, 0x571deef8,
+  0xa1affea3, 0x568a34a8, 0xa1288377, 0x55f5a4d1, 0xa0a1f24d, 0x556040e1,
+  0xa01c4c73, 0x54ca0a49, 0x9f979332, 0x5433027c, 0x9f13c7d1, 0x539b2aee,
+  0x9e90eb95, 0x53028517, 0x9e0effc2, 0x5269126d, 0x9d8e0597, 0x51ced46d,
+  0x9d0dfe54, 0x5133cc93, 0x9c8eeb34, 0x5097fc5d, 0x9c10cd71, 0x4ffb654c,
+  0x9b93a641, 0x4f5e08e2, 0x9b1776da, 0x4ebfe8a3, 0x9a9c406e, 0x4e210616,
+  0x9a22042d, 0x4d8162c3, 0x99a8c345, 0x4ce10033, 0x99307ee1, 0x4c3fdff2,
+  0x98b93829, 0x4b9e038f, 0x9842f044, 0x4afb6c97, 0x97cda856, 0x4a581c9c,
+  0x9759617f, 0x49b41532, 0x96e61ce0, 0x490f57ed, 0x9673db94, 0x4869e664,
+  0x96029eb6, 0x47c3c22e, 0x9592675c, 0x471cece6, 0x9523369c, 0x46756827,
+  0x94b50d88, 0x45cd358e, 0x9447ed30, 0x452456bc, 0x93dbd6a0, 0x447acd4f,
+  0x9370cae4, 0x43d09aec, 0x9306cb05, 0x4325c134, 0x929dd806, 0x427a41cf,
+  0x9235f2ec, 0x41ce1e64, 0x91cf1cb7, 0x4121589a, 0x91695664, 0x4073f21c,
+  0x9104a0ee, 0x3fc5ec97, 0x90a0fd4f, 0x3f1749b7, 0x903e6c7b, 0x3e680b2c,
+  0x8fdcef67, 0x3db832a5, 0x8f7c8702, 0x3d07c1d5, 0x8f1d343a, 0x3c56ba6f,
+  0x8ebef7fc, 0x3ba51e28, 0x8e61d32e, 0x3af2eeb6, 0x8e05c6b8, 0x3a402dd1,
+  0x8daad37c, 0x398cdd31, 0x8d50fa5a, 0x38d8fe92, 0x8cf83c31, 0x382493af,
+  0x8ca099da, 0x376f9e45, 0x8c4a1430, 0x36ba2013, 0x8bf4ac06, 0x36041ad8,
+  0x8ba06230, 0x354d9056, 0x8b4d377d, 0x3496824f, 0x8afb2cbb, 0x33def286,
+  0x8aaa42b5, 0x3326e2c2, 0x8a5a7a31, 0x326e54c7, 0x8a0bd3f6, 0x31b54a5d,
+  0x89be50c4, 0x30fbc54c, 0x8971f15b, 0x3041c760, 0x8926b678, 0x2f875261,
+  0x88dca0d3, 0x2ecc681d, 0x8893b125, 0x2e110a61, 0x884be821, 0x2d553afb,
+  0x88054678, 0x2c98fbba, 0x87bfccd8, 0x2bdc4e6e, 0x877b7bed, 0x2b1f34eb,
+  0x8738545f, 0x2a61b101, 0x86f656d4, 0x29a3c484, 0x86b583ef, 0x28e5714a,
+  0x8675dc4f, 0x2826b927, 0x86376093, 0x27679df3, 0x85fa1153, 0x26a82185,
+  0x85bdef28, 0x25e845b5, 0x8582faa5, 0x25280c5d, 0x8549345d, 0x24677757,
+  0x85109cdd, 0x23a6887e, 0x84d934b1, 0x22e541ae, 0x84a2fc63, 0x2223a4c5,
+  0x846df477, 0x2161b39f, 0x843a1d71, 0x209f701c, 0x840777d0, 0x1fdcdc1a,
+  0x83d60412, 0x1f19f97a, 0x83a5c2b1, 0x1e56ca1d, 0x8376b423, 0x1d934fe5,
+  0x8348d8dc, 0x1ccf8cb2, 0x831c314f, 0x1c0b826a, 0x82f0bde9, 0x1b4732ef,
+  0x82c67f14, 0x1a82a025, 0x829d753b, 0x19bdcbf2, 0x8275a0c1, 0x18f8b83c,
+  0x824f0209, 0x183366e8, 0x82299972, 0x176dd9de, 0x82056759, 0x16a81304,
+  0x81e26c17, 0x15e21444, 0x81c0a802, 0x151bdf85, 0x81a01b6d, 0x145576b1,
+  0x8180c6aa, 0x138edbb0, 0x8162aa04, 0x12c8106e, 0x8145c5c7, 0x120116d4,
+  0x812a1a3a, 0x1139f0ce, 0x810fa7a1, 0x1072a047, 0x80f66e3d, 0x0fab272b,
+  0x80de6e4d, 0x0ee38765, 0x80c7a80b, 0x0e1bc2e3, 0x80b21bb0, 0x0d53db92,
+  0x809dc971, 0x0c8bd35d, 0x808ab181, 0x0bc3ac35, 0x8078d40e, 0x0afb6805,
+  0x80683144, 0x0a3308bc, 0x8058c94c, 0x096a9049, 0x804a9c4e, 0x08a2009a,
+  0x803daa6a, 0x07d95b9e, 0x8031f3c2, 0x0710a344, 0x80277873, 0x0647d97c,
+  0x801e3895, 0x057f0034, 0x80163441, 0x04b6195d, 0x800f6b89, 0x03ed26e6,
+  0x8009de7e, 0x03242abe, 0x80058d2f, 0x025b26d7, 0x800277a6, 0x01921d1f,
+  0x80009dea, 0x00c90f87, 0x80000000, 0x00000000};
+
+const FLOAT32 ixheaacd_twiddle_table_fft[514] = {
+  0.0000000000f, 1.0000000000f, -0.0061358842f, 0.9999811649f,
+  -0.0122715384f, 0.9999247193f, -0.0184067301f, 0.9998306036f,
+  -0.0245412290f, 0.9996988177f, -0.0306748040f, 0.9995294213f,
+  -0.0368072242f, 0.9993223548f, -0.0429382548f, 0.9990777373f,
+  -0.0490676761f, 0.9987954497f, -0.0551952422f, 0.9984755516f,
+  -0.0613207370f, 0.9981181026f, -0.0674439222f, 0.9977230430f,
+  -0.0735645667f, 0.9972904325f, -0.0796824396f, 0.9968202710f,
+  -0.0857973099f, 0.9963126183f, -0.0919089541f, 0.9957674146f,
+  -0.0980171412f, 0.9951847196f, -0.1041216329f, 0.9945645928f,
+  -0.1102222055f, 0.9939069748f, -0.1163186282f, 0.9932119250f,
+  -0.1224106774f, 0.9924795628f, -0.1284981072f, 0.9917097688f,
+  -0.1345807016f, 0.9909026623f, -0.1406582445f, 0.9900581837f,
+  -0.1467304677f, 0.9891765118f, -0.1527971923f, 0.9882575870f,
+  -0.1588581502f, 0.9873014092f, -0.1649131179f, 0.9863080978f,
+  -0.1709618866f, 0.9852776527f, -0.1770042181f, 0.9842100739f,
+  -0.1830398887f, 0.9831054807f, -0.1890686601f, 0.9819638729f,
+  -0.1950903237f, 0.9807852507f, -0.2011046410f, 0.9795697927f,
+  -0.2071113735f, 0.9783173800f, -0.2131103128f, 0.9770281315f,
+  -0.2191012353f, 0.9757021070f, -0.2250839174f, 0.9743393660f,
+  -0.2310581058f, 0.9729399681f, -0.2370236069f, 0.9715039134f,
+  -0.2429801822f, 0.9700312614f, -0.2489276081f, 0.9685220718f,
+  -0.2548656464f, 0.9669764638f, -0.2607941031f, 0.9653944373f,
+  -0.2667127550f, 0.9637760520f, -0.2726213634f, 0.9621214271f,
+  -0.2785196900f, 0.9604305029f, -0.2844075263f, 0.9587034583f,
+  -0.2902846634f, 0.9569403529f, -0.2961508930f, 0.9551411867f,
+  -0.3020059466f, 0.9533060193f, -0.3078496456f, 0.9514350295f,
+  -0.3136817515f, 0.9495281577f, -0.3195020258f, 0.9475855827f,
+  -0.3253102899f, 0.9456073046f, -0.3311063051f, 0.9435934424f,
+  -0.3368898630f, 0.9415440559f, -0.3426607251f, 0.9394592047f,
+  -0.3484186828f, 0.9373390079f, -0.3541635275f, 0.9351835251f,
+  -0.3598950505f, 0.9329928160f, -0.3656129837f, 0.9307669401f,
+  -0.3713172078f, 0.9285060763f, -0.3770074248f, 0.9262102246f,
+  -0.3826834261f, 0.9238795042f, -0.3883450329f, 0.9215140343f,
+  -0.3939920366f, 0.9191138744f, -0.3996241987f, 0.9166790843f,
+  -0.4052413106f, 0.9142097831f, -0.4108431637f, 0.9117060304f,
+  -0.4164295495f, 0.9091680050f, -0.4220002592f, 0.9065957069f,
+  -0.4275550842f, 0.9039893150f, -0.4330938160f, 0.9013488293f,
+  -0.4386162460f, 0.8986744881f, -0.4441221356f, 0.8959662318f,
+  -0.4496113360f, 0.8932242990f, -0.4550835788f, 0.8904487491f,
+  -0.4605387151f, 0.8876396418f, -0.4659765065f, 0.8847970963f,
+  -0.4713967443f, 0.8819212914f, -0.4767992198f, 0.8790122271f,
+  -0.4821837842f, 0.8760700822f, -0.4875501692f, 0.8730949759f,
+  -0.4928981960f, 0.8700869679f, -0.4982276559f, 0.8670462370f,
+  -0.5035383701f, 0.8639728427f, -0.5088301301f, 0.8608669639f,
+  -0.5141027570f, 0.8577286005f, -0.5193560123f, 0.8545579910f,
+  -0.5245896578f, 0.8513551950f, -0.5298036337f, 0.8481203318f,
+  -0.5349976420f, 0.8448535800f, -0.5401714444f, 0.8415549994f,
+  -0.5453249812f, 0.8382247090f, -0.5504579544f, 0.8348628879f,
+  -0.5555702448f, 0.8314695954f, -0.5606615543f, 0.8280450702f,
+  -0.5657318234f, 0.8245893121f, -0.5707807541f, 0.8211025000f,
+  -0.5758081675f, 0.8175848126f, -0.5808139443f, 0.8140363097f,
+  -0.5857978463f, 0.8104571700f, -0.5907596946f, 0.8068475723f,
+  -0.5956993103f, 0.8032075167f, -0.6006164551f, 0.7995372415f,
+  -0.6055110693f, 0.7958369255f, -0.6103827953f, 0.7921065688f,
+  -0.6152315736f, 0.7883464098f, -0.6200572252f, 0.7845565677f,
+  -0.6248595119f, 0.7807372212f, -0.6296382546f, 0.7768884897f,
+  -0.6343932748f, 0.7730104327f, -0.6391244531f, 0.7691033483f,
+  -0.6438315511f, 0.7651672363f, -0.6485143900f, 0.7612023950f,
+  -0.6531728506f, 0.7572088242f, -0.6578066945f, 0.7531868219f,
+  -0.6624158025f, 0.7491363883f, -0.6669999361f, 0.7450577617f,
+  -0.6715589762f, 0.7409511209f, -0.6760926843f, 0.7368165851f,
+  -0.6806010008f, 0.7326542735f, -0.6850836873f, 0.7284643650f,
+  -0.6895405650f, 0.7242470980f, -0.6939714551f, 0.7200025320f,
+  -0.6983762383f, 0.7157308459f, -0.7027547359f, 0.7114322186f,
+  -0.7071067691f, 0.7071067691f, -0.7114322186f, 0.7027547359f,
+  -0.7157308459f, 0.6983762383f, -0.7200025320f, 0.6939714551f,
+  -0.7242470980f, 0.6895405650f, -0.7284643650f, 0.6850836873f,
+  -0.7326542735f, 0.6806010008f, -0.7368165851f, 0.6760926843f,
+  -0.7409511209f, 0.6715589762f, -0.7450577617f, 0.6669999361f,
+  -0.7491363883f, 0.6624158025f, -0.7531868219f, 0.6578066945f,
+  -0.7572088242f, 0.6531728506f, -0.7612023950f, 0.6485143900f,
+  -0.7651672363f, 0.6438315511f, -0.7691033483f, 0.6391244531f,
+  -0.7730104327f, 0.6343932748f, -0.7768884897f, 0.6296382546f,
+  -0.7807372212f, 0.6248595119f, -0.7845565677f, 0.6200572252f,
+  -0.7883464098f, 0.6152315736f, -0.7921065688f, 0.6103827953f,
+  -0.7958369255f, 0.6055110693f, -0.7995372415f, 0.6006164551f,
+  -0.8032075167f, 0.5956993103f, -0.8068475723f, 0.5907596946f,
+  -0.8104571700f, 0.5857978463f, -0.8140363097f, 0.5808139443f,
+  -0.8175848126f, 0.5758081675f, -0.8211025000f, 0.5707807541f,
+  -0.8245893121f, 0.5657318234f, -0.8280450702f, 0.5606615543f,
+  -0.8314695954f, 0.5555702448f, -0.8348628879f, 0.5504579544f,
+  -0.8382247090f, 0.5453249812f, -0.8415549994f, 0.5401714444f,
+  -0.8448535800f, 0.5349976420f, -0.8481203318f, 0.5298036337f,
+  -0.8513551950f, 0.5245896578f, -0.8545579910f, 0.5193560123f,
+  -0.8577286005f, 0.5141027570f, -0.8608669639f, 0.5088301301f,
+  -0.8639728427f, 0.5035383701f, -0.8670462370f, 0.4982276559f,
+  -0.8700869679f, 0.4928981960f, -0.8730949759f, 0.4875501692f,
+  -0.8760700822f, 0.4821837842f, -0.8790122271f, 0.4767992198f,
+  -0.8819212914f, 0.4713967443f, -0.8847970963f, 0.4659765065f,
+  -0.8876396418f, 0.4605387151f, -0.8904487491f, 0.4550835788f,
+  -0.8932242990f, 0.4496113360f, -0.8959662318f, 0.4441221356f,
+  -0.8986744881f, 0.4386162460f, -0.9013488293f, 0.4330938160f,
+  -0.9039893150f, 0.4275550842f, -0.9065957069f, 0.4220002592f,
+  -0.9091680050f, 0.4164295495f, -0.9117060304f, 0.4108431637f,
+  -0.9142097831f, 0.4052413106f, -0.9166790843f, 0.3996241987f,
+  -0.9191138744f, 0.3939920366f, -0.9215140343f, 0.3883450329f,
+  -0.9238795042f, 0.3826834261f, -0.9262102246f, 0.3770074248f,
+  -0.9285060763f, 0.3713172078f, -0.9307669401f, 0.3656129837f,
+  -0.9329928160f, 0.3598950505f, -0.9351835251f, 0.3541635275f,
+  -0.9373390079f, 0.3484186828f, -0.9394592047f, 0.3426607251f,
+  -0.9415440559f, 0.3368898630f, -0.9435934424f, 0.3311063051f,
+  -0.9456073046f, 0.3253102899f, -0.9475855827f, 0.3195020258f,
+  -0.9495281577f, 0.3136817515f, -0.9514350295f, 0.3078496456f,
+  -0.9533060193f, 0.3020059466f, -0.9551411867f, 0.2961508930f,
+  -0.9569403529f, 0.2902846634f, -0.9587034583f, 0.2844075263f,
+  -0.9604305029f, 0.2785196900f, -0.9621214271f, 0.2726213634f,
+  -0.9637760520f, 0.2667127550f, -0.9653944373f, 0.2607941031f,
+  -0.9669764638f, 0.2548656464f, -0.9685220718f, 0.2489276081f,
+  -0.9700312614f, 0.2429801822f, -0.9715039134f, 0.2370236069f,
+  -0.9729399681f, 0.2310581058f, -0.9743393660f, 0.2250839174f,
+  -0.9757021070f, 0.2191012353f, -0.9770281315f, 0.2131103128f,
+  -0.9783173800f, 0.2071113735f, -0.9795697927f, 0.2011046410f,
+  -0.9807852507f, 0.1950903237f, -0.9819638729f, 0.1890686601f,
+  -0.9831054807f, 0.1830398887f, -0.9842100739f, 0.1770042181f,
+  -0.9852776527f, 0.1709618866f, -0.9863080978f, 0.1649131179f,
+  -0.9873014092f, 0.1588581502f, -0.9882575870f, 0.1527971923f,
+  -0.9891765118f, 0.1467304677f, -0.9900581837f, 0.1406582445f,
+  -0.9909026623f, 0.1345807016f, -0.9917097688f, 0.1284981072f,
+  -0.9924795628f, 0.1224106774f, -0.9932119250f, 0.1163186282f,
+  -0.9939069748f, 0.1102222055f, -0.9945645928f, 0.1041216329f,
+  -0.9951847196f, 0.0980171412f, -0.9957674146f, 0.0919089541f,
+  -0.9963126183f, 0.0857973099f, -0.9968202710f, 0.0796824396f,
+  -0.9972904325f, 0.0735645667f, -0.9977230430f, 0.0674439222f,
+  -0.9981181026f, 0.0613207370f, -0.9984755516f, 0.0551952422f,
+  -0.9987954497f, 0.0490676761f, -0.9990777373f, 0.0429382548f,
+  -0.9993223548f, 0.0368072242f, -0.9995294213f, 0.0306748040f,
+  -0.9996988177f, 0.0245412290f, -0.9998306036f, 0.0184067301f,
+  -0.9999247193f, 0.0122715384f, -0.9999811649f, 0.0061358842f,
+  -1.0000000000f, 0.0000000000f};
+
+const FLOAT32 ixheaacd_twiddle_table_fft_flt[16] = {
+  1.000000f, -0.000000f, 0.980785f, -0.195090f, 0.923880f, -0.382683f,
+  0.831470f, -0.555570f, 0.707107f, -0.707107f, 0.555570f, -0.831470f,
+  0.382683f, -0.923880f, 0.195090f, -0.980785f};
 
 const WORD32 ixheaacd_twiddle_table_3pr[1155] = {
-    0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7ffb9d14, 0x7fee74a1,
-    0x7fffffff, 0x7fee74a1, 0x7fb9d757, 0x7fffffff, 0x7fd8878c, 0x7f62368e,
-    0x7fffffff, 0x7fb9d757, 0x7ee7aa4a, 0x7fffffff, 0x7f92661c, 0x7e4a5425,
-    0x7fffffff, 0x7f62368e, 0x7d8a5f3e, 0x7fffffff, 0x7f294bfb, 0x7ca80037,
-    0x7fffffff, 0x7ee7aa4a, 0x7ba3751c, 0x7fffffff, 0x7e9d55fb, 0x7a7d055a,
-    0x7fffffff, 0x7e4a5425, 0x793501a7, 0x7fffffff, 0x7deeaa78, 0x77cbc3f0,
-    0x7fffffff, 0x7d8a5f3e, 0x7641af3b, 0x7fffffff, 0x7d1d7956, 0x74972f90,
-    0x7fffffff, 0x7ca80037, 0x72ccb9d9, 0x7fffffff, 0x7c29fbed, 0x70e2cbc5,
-    0x7fffffff, 0x7ba3751c, 0x6ed9eba0, 0x7fffffff, 0x7b1474fc, 0x6cb2a835,
-    0x7fffffff, 0x7a7d055a, 0x6a6d98a3, 0x7fffffff, 0x79dd3097, 0x680b5c32,
-    0x7fffffff, 0x793501a7, 0x658c9a2c, 0x7fffffff, 0x78848412, 0x62f201ab,
-    0x7fffffff, 0x77cbc3f0, 0x603c496b, 0x7fffffff, 0x770acdeb, 0x5d6c2f98,
-    0x7fffffff, 0x7641af3b, 0x5a827999, 0x7fffffff, 0x757075ab, 0x577ff3d9,
-    0x7fffffff, 0x74972f90, 0x54657193, 0x7fffffff, 0x73b5ebd0, 0x5133cc93,
-    0x7fffffff, 0x72ccb9d9, 0x4debe4fd, 0x7fffffff, 0x71dba9a9, 0x4a8ea110,
-    0x7fffffff, 0x70e2cbc5, 0x471cece6, 0x7fffffff, 0x6fe2313a, 0x4397ba31,
-    0x7fffffff, 0x6ed9eba0, 0x3fffffff, 0x7fffffff, 0x6dca0d13, 0x3c56ba6f,
-    0x7fffffff, 0x6cb2a835, 0x389cea71, 0x7fffffff, 0x6b93d02d, 0x34d3957d,
-    0x7fffffff, 0x6a6d98a3, 0x30fbc54c, 0x7fffffff, 0x694015c1, 0x2d168791,
-    0x7fffffff, 0x680b5c32, 0x2924edab, 0x7fffffff, 0x66cf811f, 0x25280c5d,
-    0x7fffffff, 0x658c9a2c, 0x2120fb82, 0x7fffffff, 0x6442bd7c, 0x1d10d5c1,
-    0x7fffffff, 0x62f201ab, 0x18f8b83c, 0x7fffffff, 0x619a7dcc, 0x14d9c245,
-    0x7fffffff, 0x603c496b, 0x10b5150f, 0x7fffffff, 0x5ed77c88, 0x0c8bd35d,
-    0x7fffffff, 0x5d6c2f98, 0x085f2136, 0x7fffffff, 0x5bfa7b81, 0x0430238f,
-    0x7fffffff, 0x5a827999, 0x00000000, 0x7fffffff, 0x590443a6, 0xfbcfdc71,
-    0x7fffffff, 0x577ff3d9, 0xf7a0deca, 0x7fffffff, 0x55f5a4d1, 0xf3742ca2,
-    0x7fffffff, 0x54657193, 0xef4aeaf1, 0x7fffffff, 0x52cf758d, 0xeb263dbb,
-    0x7fffffff, 0x5133cc93, 0xe70747c4, 0x7fffffff, 0x4f9292db, 0xe2ef2a3f,
-    0x7fffffff, 0x4debe4fd, 0xdedf047d, 0x7fffffff, 0x4c3fdff2, 0xdad7f3a3,
-    0x7fffffff, 0x4a8ea110, 0xd6db1255, 0x7fffffff, 0x48d84608, 0xd2e9786f,
-    0x7fffffff, 0x471cece6, 0xcf043ab3, 0x7fffffff, 0x455cb40b, 0xcb2c6a83,
-    0x7fffffff, 0x4397ba31, 0xc763158f, 0x7fffffff, 0x41ce1e64, 0xc3a94590,
-    0x7fffffff, 0x3fffffff, 0xc0000000, 0x7fffffff, 0x3e2d7eb0, 0xbc6845ce,
-    0x7fffffff, 0x3c56ba6f, 0xb8e3131a, 0x7fffffff, 0x3a7bd381, 0xb5715eef,
-    0x7fffffff, 0x389cea71, 0xb2141b02, 0x7fffffff, 0x36ba2013, 0xaecc336c,
-    0x7fffffff, 0x34d3957d, 0xab9a8e6c, 0x7fffffff, 0x32e96c08, 0xa8800c26,
-    0x7fffffff, 0x30fbc54c, 0xa57d8667, 0x7fffffff, 0x2f0ac31f, 0xa293d067,
-    0x7fffffff, 0x2d168791, 0x9fc3b694, 0x7fffffff, 0x2b1f34eb, 0x9d0dfe54,
-    0x7fffffff, 0x2924edab, 0x9a7365d3, 0x7fffffff, 0x2727d485, 0x97f4a3cd,
-    0x7fffffff, 0x25280c5d, 0x9592675c, 0x7fffffff, 0x2325b847, 0x934d57ca,
-    0x7fffffff, 0x2120fb82, 0x9126145f, 0x7fffffff, 0x1f19f97a, 0x8f1d343a,
-    0x7fffffff, 0x1d10d5c1, 0x8d334626, 0x7fffffff, 0x1b05b40e, 0x8b68d06f,
-    0x7fffffff, 0x18f8b83c, 0x89be50c4, 0x7fffffff, 0x16ea0646, 0x88343c0f,
-    0x7fffffff, 0x14d9c245, 0x86cafe58, 0x7fffffff, 0x12c8106e, 0x8582faa5,
-    0x7fffffff, 0x10b5150f, 0x845c8ae3, 0x7fffffff, 0x0ea0f48c, 0x8357ffc8,
-    0x7fffffff, 0x0c8bd35d, 0x8275a0c1, 0x7fffffff, 0x0a75d60e, 0x81b5abda,
-    0x7fffffff, 0x085f2136, 0x811855b5, 0x7fffffff, 0x0647d97c, 0x809dc971,
-    0x7fffffff, 0x0430238f, 0x804628a8, 0x7fffffff, 0x02182427, 0x80118b5e,
-    0x7fffffff, 0x00000000, 0x80000000, 0x7fffffff, 0xfde7dbd9, 0x80118b5e,
-    0x7fffffff, 0xfbcfdc71, 0x804628a8, 0x7fffffff, 0xf9b82684, 0x809dc971,
-    0x7fffffff, 0xf7a0deca, 0x811855b5, 0x7fffffff, 0xf58a29f2, 0x81b5abda,
-    0x7fffffff, 0xf3742ca2, 0x8275a0c1, 0x7fffffff, 0xf15f0b74, 0x8357ffc8,
-    0x7fffffff, 0xef4aeaf1, 0x845c8ae3, 0x7fffffff, 0xed37ef92, 0x8582faa5,
-    0x7fffffff, 0xeb263dbb, 0x86cafe58, 0x7fffffff, 0xe915f9ba, 0x88343c0f,
-    0x7fffffff, 0xe70747c4, 0x89be50c4, 0x7fffffff, 0xe4fa4bf2, 0x8b68d06f,
-    0x7fffffff, 0xe2ef2a3f, 0x8d334626, 0x7fffffff, 0xe0e60685, 0x8f1d343a,
-    0x7fffffff, 0xdedf047d, 0x9126145f, 0x7fffffff, 0xdcda47b9, 0x934d57ca,
-    0x7fffffff, 0xdad7f3a3, 0x9592675c, 0x7fffffff, 0xd8d82b7b, 0x97f4a3cd,
-    0x7fffffff, 0xd6db1255, 0x9a7365d3, 0x7fffffff, 0xd4e0cb15, 0x9d0dfe54,
-    0x7fffffff, 0xd2e9786f, 0x9fc3b694, 0x7fffffff, 0xd0f53ce0, 0xa293d067,
-    0x7fffffff, 0xcf043ab3, 0xa57d8667, 0x7fffffff, 0xcd1693f7, 0xa8800c26,
-    0x7fffffff, 0xcb2c6a83, 0xab9a8e6c, 0x7fffffff, 0xc945dfed, 0xaecc336c,
-    0x7fffffff, 0xc763158f, 0xb2141b02, 0x7fffffff, 0xc5842c7f, 0xb5715eef,
-    0x7fffffff, 0xc3a94590, 0xb8e3131a, 0x7fffffff, 0xc1d28150, 0xbc6845ce,
-    0x7fffffff, 0xc0000000, 0xc0000000, 0x7fffffff, 0xbe31e19c, 0xc3a94590,
-    0x7fffffff, 0xbc6845ce, 0xc763158f, 0x7fffffff, 0xbaa34bf4, 0xcb2c6a83,
-    0x7fffffff, 0xb8e3131a, 0xcf043ab3, 0x7fffffff, 0xb727b9f7, 0xd2e9786f,
-    0x7fffffff, 0xb5715eef, 0xd6db1255, 0x7fffffff, 0xb3c0200d, 0xdad7f3a3,
-    0x7fffffff, 0xb2141b02, 0xdedf047d, 0x7fffffff, 0xb06d6d25, 0xe2ef2a3f,
-    0x7fffffff, 0xaecc336c, 0xe70747c4, 0x7fffffff, 0xad308a72, 0xeb263dbb,
-    0x7fffffff, 0xab9a8e6c, 0xef4aeaf1, 0x7fffffff, 0xaa0a5b2e, 0xf3742ca2,
-    0x7fffffff, 0xa8800c26, 0xf7a0deca, 0x7fffffff, 0xa6fbbc5a, 0xfbcfdc71,
-    0x7fffffff, 0xa57d8667, 0x00000000, 0x7fffffff, 0xa405847f, 0x0430238f,
-    0x7fffffff, 0xa293d067, 0x085f2136, 0x7fffffff, 0xa1288377, 0x0c8bd35d,
-    0x7fffffff, 0x9fc3b694, 0x10b5150f, 0x7fffffff, 0x9e658233, 0x14d9c245,
-    0x7fffffff, 0x9d0dfe54, 0x18f8b83c, 0x7fffffff, 0x9bbd4283, 0x1d10d5c1,
-    0x7fffffff, 0x9a7365d3, 0x2120fb82, 0x7fffffff, 0x99307ee1, 0x25280c5d,
-    0x7fffffff, 0x97f4a3cd, 0x2924edab, 0x7fffffff, 0x96bfea3e, 0x2d168791,
-    0x7fffffff, 0x9592675c, 0x30fbc54c, 0x7fffffff, 0x946c2fd2, 0x34d3957d,
-    0x7fffffff, 0x934d57ca, 0x389cea71, 0x7fffffff, 0x9235f2ec, 0x3c56ba6f,
-    0x7fffffff, 0x9126145f, 0x3fffffff, 0x7fffffff, 0x901dcec5, 0x4397ba31,
-    0x7fffffff, 0x8f1d343a, 0x471cece6, 0x7fffffff, 0x8e245656, 0x4a8ea110,
-    0x7fffffff, 0x8d334626, 0x4debe4fd, 0x7fffffff, 0x8c4a1430, 0x5133cc93,
-    0x7fffffff, 0x8b68d06f, 0x54657193, 0x7fffffff, 0x8a8f8a54, 0x577ff3d9,
-    0x7fffffff, 0x89be50c4, 0x5a827999, 0x7fffffff, 0x88f53214, 0x5d6c2f98,
-    0x7fffffff, 0x88343c0f, 0x603c496b, 0x7fffffff, 0x877b7bed, 0x62f201ab,
-    0x7fffffff, 0x86cafe58, 0x658c9a2c, 0x7fffffff, 0x8622cf68, 0x680b5c32,
-    0x7fffffff, 0x8582faa5, 0x6a6d98a3, 0x7fffffff, 0x84eb8b03, 0x6cb2a835,
-    0x7fffffff, 0x845c8ae3, 0x6ed9eba0, 0x7fffffff, 0x83d60412, 0x70e2cbc5,
-    0x7fffffff, 0x8357ffc8, 0x72ccb9d9, 0x7fffffff, 0x82e286a9, 0x74972f90,
-    0x7fffffff, 0x8275a0c1, 0x7641af3b, 0x7fffffff, 0x82115587, 0x77cbc3f0,
-    0x7fffffff, 0x81b5abda, 0x793501a7, 0x7fffffff, 0x8162aa04, 0x7a7d055a,
-    0x7fffffff, 0x811855b5, 0x7ba3751c, 0x7fffffff, 0x80d6b404, 0x7ca80037,
-    0x7fffffff, 0x809dc971, 0x7d8a5f3e, 0x7fffffff, 0x806d99e3, 0x7e4a5425,
-    0x7fffffff, 0x804628a8, 0x7ee7aa4a, 0x7fffffff, 0x80277873, 0x7f62368e,
-    0x7fffffff, 0x80118b5e, 0x7fb9d757, 0x7fffffff, 0x800462eb, 0x7fee74a1,
-    0x7fffffff, 0x80000000, 0x7fffffff, 0x7fffffff, 0x800462eb, 0x7fee74a1,
-    0x7fffffff, 0x80118b5e, 0x7fb9d757, 0x7fffffff, 0x80277873, 0x7f62368e,
-    0x7fffffff, 0x804628a8, 0x7ee7aa4a, 0x7fffffff, 0x806d99e3, 0x7e4a5425,
-    0x7fffffff, 0x809dc971, 0x7d8a5f3e, 0x7fffffff, 0x80d6b404, 0x7ca80037,
-    0x7fffffff, 0x811855b5, 0x7ba3751c, 0x7fffffff, 0x8162aa04, 0x7a7d055a,
-    0x7fffffff, 0x81b5abda, 0x793501a7, 0x7fffffff, 0x82115587, 0x77cbc3f0,
-    0x7fffffff, 0x8275a0c1, 0x7641af3b, 0x7fffffff, 0x82e286a9, 0x74972f90,
-    0x7fffffff, 0x8357ffc8, 0x72ccb9d9, 0x7fffffff, 0x83d60412, 0x70e2cbc5,
-    0x7fffffff, 0x845c8ae3, 0x6ed9eba0, 0x7fffffff, 0x84eb8b03, 0x6cb2a835,
-    0x7fffffff, 0x8582faa5, 0x6a6d98a3, 0x7fffffff, 0x8622cf68, 0x680b5c32,
-    0x7fffffff, 0x86cafe58, 0x658c9a2c, 0x7fffffff, 0x877b7bed, 0x62f201ab,
-    0x7fffffff, 0x88343c0f, 0x603c496b, 0x7fffffff, 0x88f53214, 0x5d6c2f98,
-    0x7fffffff, 0x89be50c4, 0x5a827999, 0x7fffffff, 0x8a8f8a54, 0x577ff3d9,
-    0x7fffffff, 0x8b68d06f, 0x54657193, 0x7fffffff, 0x8c4a1430, 0x5133cc93,
-    0x7fffffff, 0x8d334626, 0x4debe4fd, 0x7fffffff, 0x8e245656, 0x4a8ea110,
-    0x7fffffff, 0x8f1d343a, 0x471cece6, 0x7fffffff, 0x901dcec5, 0x4397ba31,
-    0x7fffffff, 0x9126145f, 0x3fffffff, 0x7fffffff, 0x9235f2ec, 0x3c56ba6f,
-    0x7fffffff, 0x934d57ca, 0x389cea71, 0x7fffffff, 0x946c2fd2, 0x34d3957d,
-    0x7fffffff, 0x9592675c, 0x30fbc54c, 0x7fffffff, 0x96bfea3e, 0x2d168791,
-    0x7fffffff, 0x97f4a3cd, 0x2924edab, 0x7fffffff, 0x99307ee1, 0x25280c5d,
-    0x7fffffff, 0x9a7365d3, 0x2120fb82, 0x7fffffff, 0x9bbd4283, 0x1d10d5c1,
-    0x7fffffff, 0x9d0dfe54, 0x18f8b83c, 0x7fffffff, 0x9e658233, 0x14d9c245,
-    0x7fffffff, 0x9fc3b694, 0x10b5150f, 0x7fffffff, 0xa1288377, 0x0c8bd35d,
-    0x7fffffff, 0xa293d067, 0x085f2136, 0x7fffffff, 0xa405847f, 0x0430238f,
-    0x7fffffff, 0xa57d8667, 0x00000000, 0x7fffffff, 0xa6fbbc5a, 0xfbcfdc71,
-    0x7fffffff, 0xa8800c26, 0xf7a0deca, 0x7fffffff, 0xaa0a5b2e, 0xf3742ca2,
-    0x7fffffff, 0xab9a8e6c, 0xef4aeaf1, 0x7fffffff, 0xad308a72, 0xeb263dbb,
-    0x7fffffff, 0xaecc336c, 0xe70747c4, 0x7fffffff, 0xb06d6d25, 0xe2ef2a3f,
-    0x7fffffff, 0xb2141b02, 0xdedf047d, 0x7fffffff, 0xb3c0200d, 0xdad7f3a3,
-    0x7fffffff, 0xb5715eef, 0xd6db1255, 0x7fffffff, 0xb727b9f7, 0xd2e9786f,
-    0x7fffffff, 0xb8e3131a, 0xcf043ab3, 0x7fffffff, 0xbaa34bf4, 0xcb2c6a83,
-    0x7fffffff, 0xbc6845ce, 0xc763158f, 0x7fffffff, 0xbe31e19c, 0xc3a94590,
-    0x7fffffff, 0xc0000000, 0xc0000000, 0x7fffffff, 0xc1d28150, 0xbc6845ce,
-    0x7fffffff, 0xc3a94590, 0xb8e3131a, 0x7fffffff, 0xc5842c7f, 0xb5715eef,
-    0x7fffffff, 0xc763158f, 0xb2141b02, 0x7fffffff, 0xc945dfed, 0xaecc336c,
-    0x7fffffff, 0xcb2c6a83, 0xab9a8e6c, 0x7fffffff, 0xcd1693f7, 0xa8800c26,
-    0x7fffffff, 0xcf043ab3, 0xa57d8667, 0x7fffffff, 0xd0f53ce0, 0xa293d067,
-    0x7fffffff, 0xd2e9786f, 0x9fc3b694, 0x7fffffff, 0xd4e0cb15, 0x9d0dfe54,
-    0x7fffffff, 0xd6db1255, 0x9a7365d3, 0x7fffffff, 0xd8d82b7b, 0x97f4a3cd,
-    0x7fffffff, 0xdad7f3a3, 0x9592675c, 0x7fffffff, 0xdcda47b9, 0x934d57ca,
-    0x7fffffff, 0xdedf047d, 0x9126145f, 0x7fffffff, 0xe0e60685, 0x8f1d343a,
-    0x7fffffff, 0xe2ef2a3f, 0x8d334626, 0x7fffffff, 0xe4fa4bf2, 0x8b68d06f,
-    0x7fffffff, 0xe70747c4, 0x89be50c4, 0x7fffffff, 0xe915f9ba, 0x88343c0f,
-    0x7fffffff, 0xeb263dbb, 0x86cafe58, 0x7fffffff, 0xed37ef92, 0x8582faa5,
-    0x7fffffff, 0xef4aeaf1, 0x845c8ae3, 0x7fffffff, 0xf15f0b74, 0x8357ffc8,
-    0x7fffffff, 0xf3742ca2, 0x8275a0c1, 0x7fffffff, 0xf58a29f2, 0x81b5abda,
-    0x7fffffff, 0xf7a0deca, 0x811855b5, 0x7fffffff, 0xf9b82684, 0x809dc971,
-    0x7fffffff, 0xfbcfdc71, 0x804628a8, 0x7fffffff, 0xfde7dbd9, 0x80118b5e,
-    0x7fffffff, 0x00000000, 0x80000000, 0x7fffffff, 0x02182427, 0x80118b5e,
-    0x7fffffff, 0x0430238f, 0x804628a8, 0x7fffffff, 0x0647d97c, 0x809dc971,
-    0x7fffffff, 0x085f2136, 0x811855b5, 0x7fffffff, 0x0a75d60e, 0x81b5abda,
-    0x7fffffff, 0x0c8bd35d, 0x8275a0c1, 0x7fffffff, 0x0ea0f48c, 0x8357ffc8,
-    0x7fffffff, 0x10b5150f, 0x845c8ae3, 0x7fffffff, 0x12c8106e, 0x8582faa5,
-    0x7fffffff, 0x14d9c245, 0x86cafe58, 0x7fffffff, 0x16ea0646, 0x88343c0f,
-    0x7fffffff, 0x18f8b83c, 0x89be50c4, 0x7fffffff, 0x1b05b40e, 0x8b68d06f,
-    0x7fffffff, 0x1d10d5c1, 0x8d334626, 0x7fffffff, 0x1f19f97a, 0x8f1d343a,
-    0x7fffffff, 0x2120fb82, 0x9126145f, 0x7fffffff, 0x2325b847, 0x934d57ca,
-    0x7fffffff, 0x25280c5d, 0x9592675c, 0x7fffffff, 0x2727d485, 0x97f4a3cd,
-    0x7fffffff, 0x2924edab, 0x9a7365d3, 0x7fffffff, 0x2b1f34eb, 0x9d0dfe54,
-    0x7fffffff, 0x2d168791, 0x9fc3b694, 0x7fffffff, 0x2f0ac31f, 0xa293d067,
-    0x7fffffff, 0x30fbc54c, 0xa57d8667, 0x7fffffff, 0x32e96c08, 0xa8800c26,
-    0x7fffffff, 0x34d3957d, 0xab9a8e6c, 0x7fffffff, 0x36ba2013, 0xaecc336c,
-    0x7fffffff, 0x389cea71, 0xb2141b02, 0x7fffffff, 0x3a7bd381, 0xb5715eef,
-    0x7fffffff, 0x3c56ba6f, 0xb8e3131a, 0x7fffffff, 0x3e2d7eb0, 0xbc6845ce,
-    0x7fffffff, 0x3fffffff, 0xc0000000, 0x7fffffff, 0x41ce1e64, 0xc3a94590,
-    0x7fffffff, 0x4397ba31, 0xc763158f, 0x7fffffff, 0x455cb40b, 0xcb2c6a83,
-    0x7fffffff, 0x471cece6, 0xcf043ab3, 0x7fffffff, 0x48d84608, 0xd2e9786f,
-    0x7fffffff, 0x4a8ea110, 0xd6db1255, 0x7fffffff, 0x4c3fdff2, 0xdad7f3a3,
-    0x7fffffff, 0x4debe4fd, 0xdedf047d, 0x7fffffff, 0x4f9292db, 0xe2ef2a3f,
-    0x7fffffff, 0x5133cc93, 0xe70747c4, 0x7fffffff, 0x52cf758d, 0xeb263dbb,
-    0x7fffffff, 0x54657193, 0xef4aeaf1, 0x7fffffff, 0x55f5a4d1, 0xf3742ca2,
-    0x7fffffff, 0x577ff3d9, 0xf7a0deca, 0x7fffffff, 0x590443a6, 0xfbcfdc71,
-    0x7fffffff, 0x5a827999, 0x00000000, 0x7fffffff, 0x5bfa7b81, 0x0430238f,
-    0x7fffffff, 0x5d6c2f98, 0x085f2136, 0x7fffffff, 0x5ed77c88, 0x0c8bd35d,
-    0x7fffffff, 0x603c496b, 0x10b5150f, 0x7fffffff, 0x619a7dcc, 0x14d9c245,
-    0x7fffffff, 0x62f201ab, 0x18f8b83c, 0x7fffffff, 0x6442bd7c, 0x1d10d5c1,
-    0x7fffffff, 0x658c9a2c, 0x2120fb82, 0x7fffffff, 0x66cf811f, 0x25280c5d,
-    0x7fffffff, 0x680b5c32, 0x2924edab, 0x7fffffff, 0x694015c1, 0x2d168791,
-    0x7fffffff, 0x6a6d98a3, 0x30fbc54c, 0x7fffffff, 0x6b93d02d, 0x34d3957d,
-    0x7fffffff, 0x6cb2a835, 0x389cea71, 0x7fffffff, 0x6dca0d13, 0x3c56ba6f,
-    0x7fffffff, 0x6ed9eba0, 0x3fffffff, 0x7fffffff, 0x6fe2313a, 0x4397ba31,
-    0x7fffffff, 0x70e2cbc5, 0x471cece6, 0x7fffffff, 0x71dba9a9, 0x4a8ea110,
-    0x7fffffff, 0x72ccb9d9, 0x4debe4fd, 0x7fffffff, 0x73b5ebd0, 0x5133cc93,
-    0x7fffffff, 0x74972f90, 0x54657193, 0x7fffffff, 0x757075ab, 0x577ff3d9,
-    0x7fffffff, 0x7641af3b, 0x5a827999, 0x7fffffff, 0x770acdeb, 0x5d6c2f98,
-    0x7fffffff, 0x77cbc3f0, 0x603c496b, 0x7fffffff, 0x78848412, 0x62f201ab,
-    0x7fffffff, 0x793501a7, 0x658c9a2c, 0x7fffffff, 0x79dd3097, 0x680b5c32,
-    0x7fffffff, 0x7a7d055a, 0x6a6d98a3, 0x7fffffff, 0x7b1474fc, 0x6cb2a835,
-    0x7fffffff, 0x7ba3751c, 0x6ed9eba0, 0x7fffffff, 0x7c29fbed, 0x70e2cbc5,
-    0x7fffffff, 0x7ca80037, 0x72ccb9d9, 0x7fffffff, 0x7d1d7956, 0x74972f90,
-    0x7fffffff, 0x7d8a5f3e, 0x7641af3b, 0x7fffffff, 0x7deeaa78, 0x77cbc3f0,
-    0x7fffffff, 0x7e4a5425, 0x793501a7, 0x7fffffff, 0x7e9d55fb, 0x7a7d055a,
-    0x7fffffff, 0x7ee7aa4a, 0x7ba3751c, 0x7fffffff, 0x7f294bfb, 0x7ca80037,
-    0x7fffffff, 0x7f62368e, 0x7d8a5f3e, 0x7fffffff, 0x7f92661c, 0x7e4a5425,
-    0x7fffffff, 0x7fb9d757, 0x7ee7aa4a, 0x7fffffff, 0x7fd8878c, 0x7f62368e,
-    0x7fffffff, 0x7fee74a1, 0x7fb9d757, 0x7fffffff, 0x7ffb9d14, 0x7fee74a1,
-    0x7fffffff, 0x7fffffff, 0x7fffffff};
+  0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7ffb9d14, 0x7fee74a1,
+  0x7fffffff, 0x7fee74a1, 0x7fb9d757, 0x7fffffff, 0x7fd8878c, 0x7f62368e,
+  0x7fffffff, 0x7fb9d757, 0x7ee7aa4a, 0x7fffffff, 0x7f92661c, 0x7e4a5425,
+  0x7fffffff, 0x7f62368e, 0x7d8a5f3e, 0x7fffffff, 0x7f294bfb, 0x7ca80037,
+  0x7fffffff, 0x7ee7aa4a, 0x7ba3751c, 0x7fffffff, 0x7e9d55fb, 0x7a7d055a,
+  0x7fffffff, 0x7e4a5425, 0x793501a7, 0x7fffffff, 0x7deeaa78, 0x77cbc3f0,
+  0x7fffffff, 0x7d8a5f3e, 0x7641af3b, 0x7fffffff, 0x7d1d7956, 0x74972f90,
+  0x7fffffff, 0x7ca80037, 0x72ccb9d9, 0x7fffffff, 0x7c29fbed, 0x70e2cbc5,
+  0x7fffffff, 0x7ba3751c, 0x6ed9eba0, 0x7fffffff, 0x7b1474fc, 0x6cb2a835,
+  0x7fffffff, 0x7a7d055a, 0x6a6d98a3, 0x7fffffff, 0x79dd3097, 0x680b5c32,
+  0x7fffffff, 0x793501a7, 0x658c9a2c, 0x7fffffff, 0x78848412, 0x62f201ab,
+  0x7fffffff, 0x77cbc3f0, 0x603c496b, 0x7fffffff, 0x770acdeb, 0x5d6c2f98,
+  0x7fffffff, 0x7641af3b, 0x5a827999, 0x7fffffff, 0x757075ab, 0x577ff3d9,
+  0x7fffffff, 0x74972f90, 0x54657193, 0x7fffffff, 0x73b5ebd0, 0x5133cc93,
+  0x7fffffff, 0x72ccb9d9, 0x4debe4fd, 0x7fffffff, 0x71dba9a9, 0x4a8ea110,
+  0x7fffffff, 0x70e2cbc5, 0x471cece6, 0x7fffffff, 0x6fe2313a, 0x4397ba31,
+  0x7fffffff, 0x6ed9eba0, 0x3fffffff, 0x7fffffff, 0x6dca0d13, 0x3c56ba6f,
+  0x7fffffff, 0x6cb2a835, 0x389cea71, 0x7fffffff, 0x6b93d02d, 0x34d3957d,
+  0x7fffffff, 0x6a6d98a3, 0x30fbc54c, 0x7fffffff, 0x694015c1, 0x2d168791,
+  0x7fffffff, 0x680b5c32, 0x2924edab, 0x7fffffff, 0x66cf811f, 0x25280c5d,
+  0x7fffffff, 0x658c9a2c, 0x2120fb82, 0x7fffffff, 0x6442bd7c, 0x1d10d5c1,
+  0x7fffffff, 0x62f201ab, 0x18f8b83c, 0x7fffffff, 0x619a7dcc, 0x14d9c245,
+  0x7fffffff, 0x603c496b, 0x10b5150f, 0x7fffffff, 0x5ed77c88, 0x0c8bd35d,
+  0x7fffffff, 0x5d6c2f98, 0x085f2136, 0x7fffffff, 0x5bfa7b81, 0x0430238f,
+  0x7fffffff, 0x5a827999, 0x00000000, 0x7fffffff, 0x590443a6, 0xfbcfdc71,
+  0x7fffffff, 0x577ff3d9, 0xf7a0deca, 0x7fffffff, 0x55f5a4d1, 0xf3742ca2,
+  0x7fffffff, 0x54657193, 0xef4aeaf1, 0x7fffffff, 0x52cf758d, 0xeb263dbb,
+  0x7fffffff, 0x5133cc93, 0xe70747c4, 0x7fffffff, 0x4f9292db, 0xe2ef2a3f,
+  0x7fffffff, 0x4debe4fd, 0xdedf047d, 0x7fffffff, 0x4c3fdff2, 0xdad7f3a3,
+  0x7fffffff, 0x4a8ea110, 0xd6db1255, 0x7fffffff, 0x48d84608, 0xd2e9786f,
+  0x7fffffff, 0x471cece6, 0xcf043ab3, 0x7fffffff, 0x455cb40b, 0xcb2c6a83,
+  0x7fffffff, 0x4397ba31, 0xc763158f, 0x7fffffff, 0x41ce1e64, 0xc3a94590,
+  0x7fffffff, 0x3fffffff, 0xc0000000, 0x7fffffff, 0x3e2d7eb0, 0xbc6845ce,
+  0x7fffffff, 0x3c56ba6f, 0xb8e3131a, 0x7fffffff, 0x3a7bd381, 0xb5715eef,
+  0x7fffffff, 0x389cea71, 0xb2141b02, 0x7fffffff, 0x36ba2013, 0xaecc336c,
+  0x7fffffff, 0x34d3957d, 0xab9a8e6c, 0x7fffffff, 0x32e96c08, 0xa8800c26,
+  0x7fffffff, 0x30fbc54c, 0xa57d8667, 0x7fffffff, 0x2f0ac31f, 0xa293d067,
+  0x7fffffff, 0x2d168791, 0x9fc3b694, 0x7fffffff, 0x2b1f34eb, 0x9d0dfe54,
+  0x7fffffff, 0x2924edab, 0x9a7365d3, 0x7fffffff, 0x2727d485, 0x97f4a3cd,
+  0x7fffffff, 0x25280c5d, 0x9592675c, 0x7fffffff, 0x2325b847, 0x934d57ca,
+  0x7fffffff, 0x2120fb82, 0x9126145f, 0x7fffffff, 0x1f19f97a, 0x8f1d343a,
+  0x7fffffff, 0x1d10d5c1, 0x8d334626, 0x7fffffff, 0x1b05b40e, 0x8b68d06f,
+  0x7fffffff, 0x18f8b83c, 0x89be50c4, 0x7fffffff, 0x16ea0646, 0x88343c0f,
+  0x7fffffff, 0x14d9c245, 0x86cafe58, 0x7fffffff, 0x12c8106e, 0x8582faa5,
+  0x7fffffff, 0x10b5150f, 0x845c8ae3, 0x7fffffff, 0x0ea0f48c, 0x8357ffc8,
+  0x7fffffff, 0x0c8bd35d, 0x8275a0c1, 0x7fffffff, 0x0a75d60e, 0x81b5abda,
+  0x7fffffff, 0x085f2136, 0x811855b5, 0x7fffffff, 0x0647d97c, 0x809dc971,
+  0x7fffffff, 0x0430238f, 0x804628a8, 0x7fffffff, 0x02182427, 0x80118b5e,
+  0x7fffffff, 0x00000000, 0x80000000, 0x7fffffff, 0xfde7dbd9, 0x80118b5e,
+  0x7fffffff, 0xfbcfdc71, 0x804628a8, 0x7fffffff, 0xf9b82684, 0x809dc971,
+  0x7fffffff, 0xf7a0deca, 0x811855b5, 0x7fffffff, 0xf58a29f2, 0x81b5abda,
+  0x7fffffff, 0xf3742ca2, 0x8275a0c1, 0x7fffffff, 0xf15f0b74, 0x8357ffc8,
+  0x7fffffff, 0xef4aeaf1, 0x845c8ae3, 0x7fffffff, 0xed37ef92, 0x8582faa5,
+  0x7fffffff, 0xeb263dbb, 0x86cafe58, 0x7fffffff, 0xe915f9ba, 0x88343c0f,
+  0x7fffffff, 0xe70747c4, 0x89be50c4, 0x7fffffff, 0xe4fa4bf2, 0x8b68d06f,
+  0x7fffffff, 0xe2ef2a3f, 0x8d334626, 0x7fffffff, 0xe0e60685, 0x8f1d343a,
+  0x7fffffff, 0xdedf047d, 0x9126145f, 0x7fffffff, 0xdcda47b9, 0x934d57ca,
+  0x7fffffff, 0xdad7f3a3, 0x9592675c, 0x7fffffff, 0xd8d82b7b, 0x97f4a3cd,
+  0x7fffffff, 0xd6db1255, 0x9a7365d3, 0x7fffffff, 0xd4e0cb15, 0x9d0dfe54,
+  0x7fffffff, 0xd2e9786f, 0x9fc3b694, 0x7fffffff, 0xd0f53ce0, 0xa293d067,
+  0x7fffffff, 0xcf043ab3, 0xa57d8667, 0x7fffffff, 0xcd1693f7, 0xa8800c26,
+  0x7fffffff, 0xcb2c6a83, 0xab9a8e6c, 0x7fffffff, 0xc945dfed, 0xaecc336c,
+  0x7fffffff, 0xc763158f, 0xb2141b02, 0x7fffffff, 0xc5842c7f, 0xb5715eef,
+  0x7fffffff, 0xc3a94590, 0xb8e3131a, 0x7fffffff, 0xc1d28150, 0xbc6845ce,
+  0x7fffffff, 0xc0000000, 0xc0000000, 0x7fffffff, 0xbe31e19c, 0xc3a94590,
+  0x7fffffff, 0xbc6845ce, 0xc763158f, 0x7fffffff, 0xbaa34bf4, 0xcb2c6a83,
+  0x7fffffff, 0xb8e3131a, 0xcf043ab3, 0x7fffffff, 0xb727b9f7, 0xd2e9786f,
+  0x7fffffff, 0xb5715eef, 0xd6db1255, 0x7fffffff, 0xb3c0200d, 0xdad7f3a3,
+  0x7fffffff, 0xb2141b02, 0xdedf047d, 0x7fffffff, 0xb06d6d25, 0xe2ef2a3f,
+  0x7fffffff, 0xaecc336c, 0xe70747c4, 0x7fffffff, 0xad308a72, 0xeb263dbb,
+  0x7fffffff, 0xab9a8e6c, 0xef4aeaf1, 0x7fffffff, 0xaa0a5b2e, 0xf3742ca2,
+  0x7fffffff, 0xa8800c26, 0xf7a0deca, 0x7fffffff, 0xa6fbbc5a, 0xfbcfdc71,
+  0x7fffffff, 0xa57d8667, 0x00000000, 0x7fffffff, 0xa405847f, 0x0430238f,
+  0x7fffffff, 0xa293d067, 0x085f2136, 0x7fffffff, 0xa1288377, 0x0c8bd35d,
+  0x7fffffff, 0x9fc3b694, 0x10b5150f, 0x7fffffff, 0x9e658233, 0x14d9c245,
+  0x7fffffff, 0x9d0dfe54, 0x18f8b83c, 0x7fffffff, 0x9bbd4283, 0x1d10d5c1,
+  0x7fffffff, 0x9a7365d3, 0x2120fb82, 0x7fffffff, 0x99307ee1, 0x25280c5d,
+  0x7fffffff, 0x97f4a3cd, 0x2924edab, 0x7fffffff, 0x96bfea3e, 0x2d168791,
+  0x7fffffff, 0x9592675c, 0x30fbc54c, 0x7fffffff, 0x946c2fd2, 0x34d3957d,
+  0x7fffffff, 0x934d57ca, 0x389cea71, 0x7fffffff, 0x9235f2ec, 0x3c56ba6f,
+  0x7fffffff, 0x9126145f, 0x3fffffff, 0x7fffffff, 0x901dcec5, 0x4397ba31,
+  0x7fffffff, 0x8f1d343a, 0x471cece6, 0x7fffffff, 0x8e245656, 0x4a8ea110,
+  0x7fffffff, 0x8d334626, 0x4debe4fd, 0x7fffffff, 0x8c4a1430, 0x5133cc93,
+  0x7fffffff, 0x8b68d06f, 0x54657193, 0x7fffffff, 0x8a8f8a54, 0x577ff3d9,
+  0x7fffffff, 0x89be50c4, 0x5a827999, 0x7fffffff, 0x88f53214, 0x5d6c2f98,
+  0x7fffffff, 0x88343c0f, 0x603c496b, 0x7fffffff, 0x877b7bed, 0x62f201ab,
+  0x7fffffff, 0x86cafe58, 0x658c9a2c, 0x7fffffff, 0x8622cf68, 0x680b5c32,
+  0x7fffffff, 0x8582faa5, 0x6a6d98a3, 0x7fffffff, 0x84eb8b03, 0x6cb2a835,
+  0x7fffffff, 0x845c8ae3, 0x6ed9eba0, 0x7fffffff, 0x83d60412, 0x70e2cbc5,
+  0x7fffffff, 0x8357ffc8, 0x72ccb9d9, 0x7fffffff, 0x82e286a9, 0x74972f90,
+  0x7fffffff, 0x8275a0c1, 0x7641af3b, 0x7fffffff, 0x82115587, 0x77cbc3f0,
+  0x7fffffff, 0x81b5abda, 0x793501a7, 0x7fffffff, 0x8162aa04, 0x7a7d055a,
+  0x7fffffff, 0x811855b5, 0x7ba3751c, 0x7fffffff, 0x80d6b404, 0x7ca80037,
+  0x7fffffff, 0x809dc971, 0x7d8a5f3e, 0x7fffffff, 0x806d99e3, 0x7e4a5425,
+  0x7fffffff, 0x804628a8, 0x7ee7aa4a, 0x7fffffff, 0x80277873, 0x7f62368e,
+  0x7fffffff, 0x80118b5e, 0x7fb9d757, 0x7fffffff, 0x800462eb, 0x7fee74a1,
+  0x7fffffff, 0x80000000, 0x7fffffff, 0x7fffffff, 0x800462eb, 0x7fee74a1,
+  0x7fffffff, 0x80118b5e, 0x7fb9d757, 0x7fffffff, 0x80277873, 0x7f62368e,
+  0x7fffffff, 0x804628a8, 0x7ee7aa4a, 0x7fffffff, 0x806d99e3, 0x7e4a5425,
+  0x7fffffff, 0x809dc971, 0x7d8a5f3e, 0x7fffffff, 0x80d6b404, 0x7ca80037,
+  0x7fffffff, 0x811855b5, 0x7ba3751c, 0x7fffffff, 0x8162aa04, 0x7a7d055a,
+  0x7fffffff, 0x81b5abda, 0x793501a7, 0x7fffffff, 0x82115587, 0x77cbc3f0,
+  0x7fffffff, 0x8275a0c1, 0x7641af3b, 0x7fffffff, 0x82e286a9, 0x74972f90,
+  0x7fffffff, 0x8357ffc8, 0x72ccb9d9, 0x7fffffff, 0x83d60412, 0x70e2cbc5,
+  0x7fffffff, 0x845c8ae3, 0x6ed9eba0, 0x7fffffff, 0x84eb8b03, 0x6cb2a835,
+  0x7fffffff, 0x8582faa5, 0x6a6d98a3, 0x7fffffff, 0x8622cf68, 0x680b5c32,
+  0x7fffffff, 0x86cafe58, 0x658c9a2c, 0x7fffffff, 0x877b7bed, 0x62f201ab,
+  0x7fffffff, 0x88343c0f, 0x603c496b, 0x7fffffff, 0x88f53214, 0x5d6c2f98,
+  0x7fffffff, 0x89be50c4, 0x5a827999, 0x7fffffff, 0x8a8f8a54, 0x577ff3d9,
+  0x7fffffff, 0x8b68d06f, 0x54657193, 0x7fffffff, 0x8c4a1430, 0x5133cc93,
+  0x7fffffff, 0x8d334626, 0x4debe4fd, 0x7fffffff, 0x8e245656, 0x4a8ea110,
+  0x7fffffff, 0x8f1d343a, 0x471cece6, 0x7fffffff, 0x901dcec5, 0x4397ba31,
+  0x7fffffff, 0x9126145f, 0x3fffffff, 0x7fffffff, 0x9235f2ec, 0x3c56ba6f,
+  0x7fffffff, 0x934d57ca, 0x389cea71, 0x7fffffff, 0x946c2fd2, 0x34d3957d,
+  0x7fffffff, 0x9592675c, 0x30fbc54c, 0x7fffffff, 0x96bfea3e, 0x2d168791,
+  0x7fffffff, 0x97f4a3cd, 0x2924edab, 0x7fffffff, 0x99307ee1, 0x25280c5d,
+  0x7fffffff, 0x9a7365d3, 0x2120fb82, 0x7fffffff, 0x9bbd4283, 0x1d10d5c1,
+  0x7fffffff, 0x9d0dfe54, 0x18f8b83c, 0x7fffffff, 0x9e658233, 0x14d9c245,
+  0x7fffffff, 0x9fc3b694, 0x10b5150f, 0x7fffffff, 0xa1288377, 0x0c8bd35d,
+  0x7fffffff, 0xa293d067, 0x085f2136, 0x7fffffff, 0xa405847f, 0x0430238f,
+  0x7fffffff, 0xa57d8667, 0x00000000, 0x7fffffff, 0xa6fbbc5a, 0xfbcfdc71,
+  0x7fffffff, 0xa8800c26, 0xf7a0deca, 0x7fffffff, 0xaa0a5b2e, 0xf3742ca2,
+  0x7fffffff, 0xab9a8e6c, 0xef4aeaf1, 0x7fffffff, 0xad308a72, 0xeb263dbb,
+  0x7fffffff, 0xaecc336c, 0xe70747c4, 0x7fffffff, 0xb06d6d25, 0xe2ef2a3f,
+  0x7fffffff, 0xb2141b02, 0xdedf047d, 0x7fffffff, 0xb3c0200d, 0xdad7f3a3,
+  0x7fffffff, 0xb5715eef, 0xd6db1255, 0x7fffffff, 0xb727b9f7, 0xd2e9786f,
+  0x7fffffff, 0xb8e3131a, 0xcf043ab3, 0x7fffffff, 0xbaa34bf4, 0xcb2c6a83,
+  0x7fffffff, 0xbc6845ce, 0xc763158f, 0x7fffffff, 0xbe31e19c, 0xc3a94590,
+  0x7fffffff, 0xc0000000, 0xc0000000, 0x7fffffff, 0xc1d28150, 0xbc6845ce,
+  0x7fffffff, 0xc3a94590, 0xb8e3131a, 0x7fffffff, 0xc5842c7f, 0xb5715eef,
+  0x7fffffff, 0xc763158f, 0xb2141b02, 0x7fffffff, 0xc945dfed, 0xaecc336c,
+  0x7fffffff, 0xcb2c6a83, 0xab9a8e6c, 0x7fffffff, 0xcd1693f7, 0xa8800c26,
+  0x7fffffff, 0xcf043ab3, 0xa57d8667, 0x7fffffff, 0xd0f53ce0, 0xa293d067,
+  0x7fffffff, 0xd2e9786f, 0x9fc3b694, 0x7fffffff, 0xd4e0cb15, 0x9d0dfe54,
+  0x7fffffff, 0xd6db1255, 0x9a7365d3, 0x7fffffff, 0xd8d82b7b, 0x97f4a3cd,
+  0x7fffffff, 0xdad7f3a3, 0x9592675c, 0x7fffffff, 0xdcda47b9, 0x934d57ca,
+  0x7fffffff, 0xdedf047d, 0x9126145f, 0x7fffffff, 0xe0e60685, 0x8f1d343a,
+  0x7fffffff, 0xe2ef2a3f, 0x8d334626, 0x7fffffff, 0xe4fa4bf2, 0x8b68d06f,
+  0x7fffffff, 0xe70747c4, 0x89be50c4, 0x7fffffff, 0xe915f9ba, 0x88343c0f,
+  0x7fffffff, 0xeb263dbb, 0x86cafe58, 0x7fffffff, 0xed37ef92, 0x8582faa5,
+  0x7fffffff, 0xef4aeaf1, 0x845c8ae3, 0x7fffffff, 0xf15f0b74, 0x8357ffc8,
+  0x7fffffff, 0xf3742ca2, 0x8275a0c1, 0x7fffffff, 0xf58a29f2, 0x81b5abda,
+  0x7fffffff, 0xf7a0deca, 0x811855b5, 0x7fffffff, 0xf9b82684, 0x809dc971,
+  0x7fffffff, 0xfbcfdc71, 0x804628a8, 0x7fffffff, 0xfde7dbd9, 0x80118b5e,
+  0x7fffffff, 0x00000000, 0x80000000, 0x7fffffff, 0x02182427, 0x80118b5e,
+  0x7fffffff, 0x0430238f, 0x804628a8, 0x7fffffff, 0x0647d97c, 0x809dc971,
+  0x7fffffff, 0x085f2136, 0x811855b5, 0x7fffffff, 0x0a75d60e, 0x81b5abda,
+  0x7fffffff, 0x0c8bd35d, 0x8275a0c1, 0x7fffffff, 0x0ea0f48c, 0x8357ffc8,
+  0x7fffffff, 0x10b5150f, 0x845c8ae3, 0x7fffffff, 0x12c8106e, 0x8582faa5,
+  0x7fffffff, 0x14d9c245, 0x86cafe58, 0x7fffffff, 0x16ea0646, 0x88343c0f,
+  0x7fffffff, 0x18f8b83c, 0x89be50c4, 0x7fffffff, 0x1b05b40e, 0x8b68d06f,
+  0x7fffffff, 0x1d10d5c1, 0x8d334626, 0x7fffffff, 0x1f19f97a, 0x8f1d343a,
+  0x7fffffff, 0x2120fb82, 0x9126145f, 0x7fffffff, 0x2325b847, 0x934d57ca,
+  0x7fffffff, 0x25280c5d, 0x9592675c, 0x7fffffff, 0x2727d485, 0x97f4a3cd,
+  0x7fffffff, 0x2924edab, 0x9a7365d3, 0x7fffffff, 0x2b1f34eb, 0x9d0dfe54,
+  0x7fffffff, 0x2d168791, 0x9fc3b694, 0x7fffffff, 0x2f0ac31f, 0xa293d067,
+  0x7fffffff, 0x30fbc54c, 0xa57d8667, 0x7fffffff, 0x32e96c08, 0xa8800c26,
+  0x7fffffff, 0x34d3957d, 0xab9a8e6c, 0x7fffffff, 0x36ba2013, 0xaecc336c,
+  0x7fffffff, 0x389cea71, 0xb2141b02, 0x7fffffff, 0x3a7bd381, 0xb5715eef,
+  0x7fffffff, 0x3c56ba6f, 0xb8e3131a, 0x7fffffff, 0x3e2d7eb0, 0xbc6845ce,
+  0x7fffffff, 0x3fffffff, 0xc0000000, 0x7fffffff, 0x41ce1e64, 0xc3a94590,
+  0x7fffffff, 0x4397ba31, 0xc763158f, 0x7fffffff, 0x455cb40b, 0xcb2c6a83,
+  0x7fffffff, 0x471cece6, 0xcf043ab3, 0x7fffffff, 0x48d84608, 0xd2e9786f,
+  0x7fffffff, 0x4a8ea110, 0xd6db1255, 0x7fffffff, 0x4c3fdff2, 0xdad7f3a3,
+  0x7fffffff, 0x4debe4fd, 0xdedf047d, 0x7fffffff, 0x4f9292db, 0xe2ef2a3f,
+  0x7fffffff, 0x5133cc93, 0xe70747c4, 0x7fffffff, 0x52cf758d, 0xeb263dbb,
+  0x7fffffff, 0x54657193, 0xef4aeaf1, 0x7fffffff, 0x55f5a4d1, 0xf3742ca2,
+  0x7fffffff, 0x577ff3d9, 0xf7a0deca, 0x7fffffff, 0x590443a6, 0xfbcfdc71,
+  0x7fffffff, 0x5a827999, 0x00000000, 0x7fffffff, 0x5bfa7b81, 0x0430238f,
+  0x7fffffff, 0x5d6c2f98, 0x085f2136, 0x7fffffff, 0x5ed77c88, 0x0c8bd35d,
+  0x7fffffff, 0x603c496b, 0x10b5150f, 0x7fffffff, 0x619a7dcc, 0x14d9c245,
+  0x7fffffff, 0x62f201ab, 0x18f8b83c, 0x7fffffff, 0x6442bd7c, 0x1d10d5c1,
+  0x7fffffff, 0x658c9a2c, 0x2120fb82, 0x7fffffff, 0x66cf811f, 0x25280c5d,
+  0x7fffffff, 0x680b5c32, 0x2924edab, 0x7fffffff, 0x694015c1, 0x2d168791,
+  0x7fffffff, 0x6a6d98a3, 0x30fbc54c, 0x7fffffff, 0x6b93d02d, 0x34d3957d,
+  0x7fffffff, 0x6cb2a835, 0x389cea71, 0x7fffffff, 0x6dca0d13, 0x3c56ba6f,
+  0x7fffffff, 0x6ed9eba0, 0x3fffffff, 0x7fffffff, 0x6fe2313a, 0x4397ba31,
+  0x7fffffff, 0x70e2cbc5, 0x471cece6, 0x7fffffff, 0x71dba9a9, 0x4a8ea110,
+  0x7fffffff, 0x72ccb9d9, 0x4debe4fd, 0x7fffffff, 0x73b5ebd0, 0x5133cc93,
+  0x7fffffff, 0x74972f90, 0x54657193, 0x7fffffff, 0x757075ab, 0x577ff3d9,
+  0x7fffffff, 0x7641af3b, 0x5a827999, 0x7fffffff, 0x770acdeb, 0x5d6c2f98,
+  0x7fffffff, 0x77cbc3f0, 0x603c496b, 0x7fffffff, 0x78848412, 0x62f201ab,
+  0x7fffffff, 0x793501a7, 0x658c9a2c, 0x7fffffff, 0x79dd3097, 0x680b5c32,
+  0x7fffffff, 0x7a7d055a, 0x6a6d98a3, 0x7fffffff, 0x7b1474fc, 0x6cb2a835,
+  0x7fffffff, 0x7ba3751c, 0x6ed9eba0, 0x7fffffff, 0x7c29fbed, 0x70e2cbc5,
+  0x7fffffff, 0x7ca80037, 0x72ccb9d9, 0x7fffffff, 0x7d1d7956, 0x74972f90,
+  0x7fffffff, 0x7d8a5f3e, 0x7641af3b, 0x7fffffff, 0x7deeaa78, 0x77cbc3f0,
+  0x7fffffff, 0x7e4a5425, 0x793501a7, 0x7fffffff, 0x7e9d55fb, 0x7a7d055a,
+  0x7fffffff, 0x7ee7aa4a, 0x7ba3751c, 0x7fffffff, 0x7f294bfb, 0x7ca80037,
+  0x7fffffff, 0x7f62368e, 0x7d8a5f3e, 0x7fffffff, 0x7f92661c, 0x7e4a5425,
+  0x7fffffff, 0x7fb9d757, 0x7ee7aa4a, 0x7fffffff, 0x7fd8878c, 0x7f62368e,
+  0x7fffffff, 0x7fee74a1, 0x7fb9d757, 0x7fffffff, 0x7ffb9d14, 0x7fee74a1,
+  0x7fffffff, 0x7fffffff, 0x7fffffff};
 
 const WORD32 ixheaacd_twiddle_table_3pi[1155] = {
-    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfde7dbd9, 0xfbcfdc71,
-    0x00000000, 0xfbcfdc71, 0xf7a0deca, 0x00000000, 0xf9b82684, 0xf3742ca2,
-    0x00000000, 0xf7a0deca, 0xef4aeaf1, 0x00000000, 0xf58a29f2, 0xeb263dbb,
-    0x00000000, 0xf3742ca2, 0xe70747c4, 0x00000000, 0xf15f0b74, 0xe2ef2a3f,
-    0x00000000, 0xef4aeaf1, 0xdedf047d, 0x00000000, 0xed37ef92, 0xdad7f3a3,
-    0x00000000, 0xeb263dbb, 0xd6db1255, 0x00000000, 0xe915f9ba, 0xd2e9786f,
-    0x00000000, 0xe70747c4, 0xcf043ab3, 0x00000000, 0xe4fa4bf2, 0xcb2c6a83,
-    0x00000000, 0xe2ef2a3f, 0xc763158f, 0x00000000, 0xe0e60685, 0xc3a94590,
-    0x00000000, 0xdedf047d, 0xc0000000, 0x00000000, 0xdcda47b9, 0xbc6845ce,
-    0x00000000, 0xdad7f3a3, 0xb8e3131a, 0x00000000, 0xd8d82b7b, 0xb5715eef,
-    0x00000000, 0xd6db1255, 0xb2141b02, 0x00000000, 0xd4e0cb15, 0xaecc336c,
-    0x00000000, 0xd2e9786f, 0xab9a8e6c, 0x00000000, 0xd0f53ce0, 0xa8800c26,
-    0x00000000, 0xcf043ab3, 0xa57d8667, 0x00000000, 0xcd1693f7, 0xa293d067,
-    0x00000000, 0xcb2c6a83, 0x9fc3b694, 0x00000000, 0xc945dfed, 0x9d0dfe54,
-    0x00000000, 0xc763158f, 0x9a7365d3, 0x00000000, 0xc5842c7f, 0x97f4a3cd,
-    0x00000000, 0xc3a94590, 0x9592675c, 0x00000000, 0xc1d28150, 0x934d57ca,
-    0x00000000, 0xc0000000, 0x9126145f, 0x00000000, 0xbe31e19c, 0x8f1d343a,
-    0x00000000, 0xbc6845ce, 0x8d334626, 0x00000000, 0xbaa34bf4, 0x8b68d06f,
-    0x00000000, 0xb8e3131a, 0x89be50c4, 0x00000000, 0xb727b9f7, 0x88343c0f,
-    0x00000000, 0xb5715eef, 0x86cafe58, 0x00000000, 0xb3c0200d, 0x8582faa5,
-    0x00000000, 0xb2141b02, 0x845c8ae3, 0x00000000, 0xb06d6d25, 0x8357ffc8,
-    0x00000000, 0xaecc336c, 0x8275a0c1, 0x00000000, 0xad308a72, 0x81b5abda,
-    0x00000000, 0xab9a8e6c, 0x811855b5, 0x00000000, 0xaa0a5b2e, 0x809dc971,
-    0x00000000, 0xa8800c26, 0x804628a8, 0x00000000, 0xa6fbbc5a, 0x80118b5e,
-    0x00000000, 0xa57d8667, 0x80000000, 0x00000000, 0xa405847f, 0x80118b5e,
-    0x00000000, 0xa293d067, 0x804628a8, 0x00000000, 0xa1288377, 0x809dc971,
-    0x00000000, 0x9fc3b694, 0x811855b5, 0x00000000, 0x9e658233, 0x81b5abda,
-    0x00000000, 0x9d0dfe54, 0x8275a0c1, 0x00000000, 0x9bbd4283, 0x8357ffc8,
-    0x00000000, 0x9a7365d3, 0x845c8ae3, 0x00000000, 0x99307ee1, 0x8582faa5,
-    0x00000000, 0x97f4a3cd, 0x86cafe58, 0x00000000, 0x96bfea3e, 0x88343c0f,
-    0x00000000, 0x9592675c, 0x89be50c4, 0x00000000, 0x946c2fd2, 0x8b68d06f,
-    0x00000000, 0x934d57ca, 0x8d334626, 0x00000000, 0x9235f2ec, 0x8f1d343a,
-    0x00000000, 0x9126145f, 0x9126145f, 0x00000000, 0x901dcec5, 0x934d57ca,
-    0x00000000, 0x8f1d343a, 0x9592675c, 0x00000000, 0x8e245656, 0x97f4a3cd,
-    0x00000000, 0x8d334626, 0x9a7365d3, 0x00000000, 0x8c4a1430, 0x9d0dfe54,
-    0x00000000, 0x8b68d06f, 0x9fc3b694, 0x00000000, 0x8a8f8a54, 0xa293d067,
-    0x00000000, 0x89be50c4, 0xa57d8667, 0x00000000, 0x88f53214, 0xa8800c26,
-    0x00000000, 0x88343c0f, 0xab9a8e6c, 0x00000000, 0x877b7bed, 0xaecc336c,
-    0x00000000, 0x86cafe58, 0xb2141b02, 0x00000000, 0x8622cf68, 0xb5715eef,
-    0x00000000, 0x8582faa5, 0xb8e3131a, 0x00000000, 0x84eb8b03, 0xbc6845ce,
-    0x00000000, 0x845c8ae3, 0xc0000000, 0x00000000, 0x83d60412, 0xc3a94590,
-    0x00000000, 0x8357ffc8, 0xc763158f, 0x00000000, 0x82e286a9, 0xcb2c6a83,
-    0x00000000, 0x8275a0c1, 0xcf043ab3, 0x00000000, 0x82115587, 0xd2e9786f,
-    0x00000000, 0x81b5abda, 0xd6db1255, 0x00000000, 0x8162aa04, 0xdad7f3a3,
-    0x00000000, 0x811855b5, 0xdedf047d, 0x00000000, 0x80d6b404, 0xe2ef2a3f,
-    0x00000000, 0x809dc971, 0xe70747c4, 0x00000000, 0x806d99e3, 0xeb263dbb,
-    0x00000000, 0x804628a8, 0xef4aeaf1, 0x00000000, 0x80277873, 0xf3742ca2,
-    0x00000000, 0x80118b5e, 0xf7a0deca, 0x00000000, 0x800462eb, 0xfbcfdc71,
-    0x00000000, 0x80000000, 0x00000000, 0x00000000, 0x800462eb, 0x0430238f,
-    0x00000000, 0x80118b5e, 0x085f2136, 0x00000000, 0x80277873, 0x0c8bd35d,
-    0x00000000, 0x804628a8, 0x10b5150f, 0x00000000, 0x806d99e3, 0x14d9c245,
-    0x00000000, 0x809dc971, 0x18f8b83c, 0x00000000, 0x80d6b404, 0x1d10d5c1,
-    0x00000000, 0x811855b5, 0x2120fb82, 0x00000000, 0x8162aa04, 0x25280c5d,
-    0x00000000, 0x81b5abda, 0x2924edab, 0x00000000, 0x82115587, 0x2d168791,
-    0x00000000, 0x8275a0c1, 0x30fbc54c, 0x00000000, 0x82e286a9, 0x34d3957d,
-    0x00000000, 0x8357ffc8, 0x389cea71, 0x00000000, 0x83d60412, 0x3c56ba6f,
-    0x00000000, 0x845c8ae3, 0x3fffffff, 0x00000000, 0x84eb8b03, 0x4397ba31,
-    0x00000000, 0x8582faa5, 0x471cece6, 0x00000000, 0x8622cf68, 0x4a8ea110,
-    0x00000000, 0x86cafe58, 0x4debe4fd, 0x00000000, 0x877b7bed, 0x5133cc93,
-    0x00000000, 0x88343c0f, 0x54657193, 0x00000000, 0x88f53214, 0x577ff3d9,
-    0x00000000, 0x89be50c4, 0x5a827999, 0x00000000, 0x8a8f8a54, 0x5d6c2f98,
-    0x00000000, 0x8b68d06f, 0x603c496b, 0x00000000, 0x8c4a1430, 0x62f201ab,
-    0x00000000, 0x8d334626, 0x658c9a2c, 0x00000000, 0x8e245656, 0x680b5c32,
-    0x00000000, 0x8f1d343a, 0x6a6d98a3, 0x00000000, 0x901dcec5, 0x6cb2a835,
-    0x00000000, 0x9126145f, 0x6ed9eba0, 0x00000000, 0x9235f2ec, 0x70e2cbc5,
-    0x00000000, 0x934d57ca, 0x72ccb9d9, 0x00000000, 0x946c2fd2, 0x74972f90,
-    0x00000000, 0x9592675c, 0x7641af3b, 0x00000000, 0x96bfea3e, 0x77cbc3f0,
-    0x00000000, 0x97f4a3cd, 0x793501a7, 0x00000000, 0x99307ee1, 0x7a7d055a,
-    0x00000000, 0x9a7365d3, 0x7ba3751c, 0x00000000, 0x9bbd4283, 0x7ca80037,
-    0x00000000, 0x9d0dfe54, 0x7d8a5f3e, 0x00000000, 0x9e658233, 0x7e4a5425,
-    0x00000000, 0x9fc3b694, 0x7ee7aa4a, 0x00000000, 0xa1288377, 0x7f62368e,
-    0x00000000, 0xa293d067, 0x7fb9d757, 0x00000000, 0xa405847f, 0x7fee74a1,
-    0x00000000, 0xa57d8667, 0x7fffffff, 0x00000000, 0xa6fbbc5a, 0x7fee74a1,
-    0x00000000, 0xa8800c26, 0x7fb9d757, 0x00000000, 0xaa0a5b2e, 0x7f62368e,
-    0x00000000, 0xab9a8e6c, 0x7ee7aa4a, 0x00000000, 0xad308a72, 0x7e4a5425,
-    0x00000000, 0xaecc336c, 0x7d8a5f3e, 0x00000000, 0xb06d6d25, 0x7ca80037,
-    0x00000000, 0xb2141b02, 0x7ba3751c, 0x00000000, 0xb3c0200d, 0x7a7d055a,
-    0x00000000, 0xb5715eef, 0x793501a7, 0x00000000, 0xb727b9f7, 0x77cbc3f0,
-    0x00000000, 0xb8e3131a, 0x7641af3b, 0x00000000, 0xbaa34bf4, 0x74972f90,
-    0x00000000, 0xbc6845ce, 0x72ccb9d9, 0x00000000, 0xbe31e19c, 0x70e2cbc5,
-    0x00000000, 0xc0000000, 0x6ed9eba0, 0x00000000, 0xc1d28150, 0x6cb2a835,
-    0x00000000, 0xc3a94590, 0x6a6d98a3, 0x00000000, 0xc5842c7f, 0x680b5c32,
-    0x00000000, 0xc763158f, 0x658c9a2c, 0x00000000, 0xc945dfed, 0x62f201ab,
-    0x00000000, 0xcb2c6a83, 0x603c496b, 0x00000000, 0xcd1693f7, 0x5d6c2f98,
-    0x00000000, 0xcf043ab3, 0x5a827999, 0x00000000, 0xd0f53ce0, 0x577ff3d9,
-    0x00000000, 0xd2e9786f, 0x54657193, 0x00000000, 0xd4e0cb15, 0x5133cc93,
-    0x00000000, 0xd6db1255, 0x4debe4fd, 0x00000000, 0xd8d82b7b, 0x4a8ea110,
-    0x00000000, 0xdad7f3a3, 0x471cece6, 0x00000000, 0xdcda47b9, 0x4397ba31,
-    0x00000000, 0xdedf047d, 0x3fffffff, 0x00000000, 0xe0e60685, 0x3c56ba6f,
-    0x00000000, 0xe2ef2a3f, 0x389cea71, 0x00000000, 0xe4fa4bf2, 0x34d3957d,
-    0x00000000, 0xe70747c4, 0x30fbc54c, 0x00000000, 0xe915f9ba, 0x2d168791,
-    0x00000000, 0xeb263dbb, 0x2924edab, 0x00000000, 0xed37ef92, 0x25280c5d,
-    0x00000000, 0xef4aeaf1, 0x2120fb82, 0x00000000, 0xf15f0b74, 0x1d10d5c1,
-    0x00000000, 0xf3742ca2, 0x18f8b83c, 0x00000000, 0xf58a29f2, 0x14d9c245,
-    0x00000000, 0xf7a0deca, 0x10b5150f, 0x00000000, 0xf9b82684, 0x0c8bd35d,
-    0x00000000, 0xfbcfdc71, 0x085f2136, 0x00000000, 0xfde7dbd9, 0x0430238f,
-    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02182427, 0xfbcfdc71,
-    0x00000000, 0x0430238f, 0xf7a0deca, 0x00000000, 0x0647d97c, 0xf3742ca2,
-    0x00000000, 0x085f2136, 0xef4aeaf1, 0x00000000, 0x0a75d60e, 0xeb263dbb,
-    0x00000000, 0x0c8bd35d, 0xe70747c4, 0x00000000, 0x0ea0f48c, 0xe2ef2a3f,
-    0x00000000, 0x10b5150f, 0xdedf047d, 0x00000000, 0x12c8106e, 0xdad7f3a3,
-    0x00000000, 0x14d9c245, 0xd6db1255, 0x00000000, 0x16ea0646, 0xd2e9786f,
-    0x00000000, 0x18f8b83c, 0xcf043ab3, 0x00000000, 0x1b05b40e, 0xcb2c6a83,
-    0x00000000, 0x1d10d5c1, 0xc763158f, 0x00000000, 0x1f19f97a, 0xc3a94590,
-    0x00000000, 0x2120fb82, 0xc0000000, 0x00000000, 0x2325b847, 0xbc6845ce,
-    0x00000000, 0x25280c5d, 0xb8e3131a, 0x00000000, 0x2727d485, 0xb5715eef,
-    0x00000000, 0x2924edab, 0xb2141b02, 0x00000000, 0x2b1f34eb, 0xaecc336c,
-    0x00000000, 0x2d168791, 0xab9a8e6c, 0x00000000, 0x2f0ac31f, 0xa8800c26,
-    0x00000000, 0x30fbc54c, 0xa57d8667, 0x00000000, 0x32e96c08, 0xa293d067,
-    0x00000000, 0x34d3957d, 0x9fc3b694, 0x00000000, 0x36ba2013, 0x9d0dfe54,
-    0x00000000, 0x389cea71, 0x9a7365d3, 0x00000000, 0x3a7bd381, 0x97f4a3cd,
-    0x00000000, 0x3c56ba6f, 0x9592675c, 0x00000000, 0x3e2d7eb0, 0x934d57ca,
-    0x00000000, 0x3fffffff, 0x9126145f, 0x00000000, 0x41ce1e64, 0x8f1d343a,
-    0x00000000, 0x4397ba31, 0x8d334626, 0x00000000, 0x455cb40b, 0x8b68d06f,
-    0x00000000, 0x471cece6, 0x89be50c4, 0x00000000, 0x48d84608, 0x88343c0f,
-    0x00000000, 0x4a8ea110, 0x86cafe58, 0x00000000, 0x4c3fdff2, 0x8582faa5,
-    0x00000000, 0x4debe4fd, 0x845c8ae3, 0x00000000, 0x4f9292db, 0x8357ffc8,
-    0x00000000, 0x5133cc93, 0x8275a0c1, 0x00000000, 0x52cf758d, 0x81b5abda,
-    0x00000000, 0x54657193, 0x811855b5, 0x00000000, 0x55f5a4d1, 0x809dc971,
-    0x00000000, 0x577ff3d9, 0x804628a8, 0x00000000, 0x590443a6, 0x80118b5e,
-    0x00000000, 0x5a827999, 0x80000000, 0x00000000, 0x5bfa7b81, 0x80118b5e,
-    0x00000000, 0x5d6c2f98, 0x804628a8, 0x00000000, 0x5ed77c88, 0x809dc971,
-    0x00000000, 0x603c496b, 0x811855b5, 0x00000000, 0x619a7dcc, 0x81b5abda,
-    0x00000000, 0x62f201ab, 0x8275a0c1, 0x00000000, 0x6442bd7c, 0x8357ffc8,
-    0x00000000, 0x658c9a2c, 0x845c8ae3, 0x00000000, 0x66cf811f, 0x8582faa5,
-    0x00000000, 0x680b5c32, 0x86cafe58, 0x00000000, 0x694015c1, 0x88343c0f,
-    0x00000000, 0x6a6d98a3, 0x89be50c4, 0x00000000, 0x6b93d02d, 0x8b68d06f,
-    0x00000000, 0x6cb2a835, 0x8d334626, 0x00000000, 0x6dca0d13, 0x8f1d343a,
-    0x00000000, 0x6ed9eba0, 0x9126145f, 0x00000000, 0x6fe2313a, 0x934d57ca,
-    0x00000000, 0x70e2cbc5, 0x9592675c, 0x00000000, 0x71dba9a9, 0x97f4a3cd,
-    0x00000000, 0x72ccb9d9, 0x9a7365d3, 0x00000000, 0x73b5ebd0, 0x9d0dfe54,
-    0x00000000, 0x74972f90, 0x9fc3b694, 0x00000000, 0x757075ab, 0xa293d067,
-    0x00000000, 0x7641af3b, 0xa57d8667, 0x00000000, 0x770acdeb, 0xa8800c26,
-    0x00000000, 0x77cbc3f0, 0xab9a8e6c, 0x00000000, 0x78848412, 0xaecc336c,
-    0x00000000, 0x793501a7, 0xb2141b02, 0x00000000, 0x79dd3097, 0xb5715eef,
-    0x00000000, 0x7a7d055a, 0xb8e3131a, 0x00000000, 0x7b1474fc, 0xbc6845ce,
-    0x00000000, 0x7ba3751c, 0xc0000000, 0x00000000, 0x7c29fbed, 0xc3a94590,
-    0x00000000, 0x7ca80037, 0xc763158f, 0x00000000, 0x7d1d7956, 0xcb2c6a83,
-    0x00000000, 0x7d8a5f3e, 0xcf043ab3, 0x00000000, 0x7deeaa78, 0xd2e9786f,
-    0x00000000, 0x7e4a5425, 0xd6db1255, 0x00000000, 0x7e9d55fb, 0xdad7f3a3,
-    0x00000000, 0x7ee7aa4a, 0xdedf047d, 0x00000000, 0x7f294bfb, 0xe2ef2a3f,
-    0x00000000, 0x7f62368e, 0xe70747c4, 0x00000000, 0x7f92661c, 0xeb263dbb,
-    0x00000000, 0x7fb9d757, 0xef4aeaf1, 0x00000000, 0x7fd8878c, 0xf3742ca2,
-    0x00000000, 0x7fee74a1, 0xf7a0deca, 0x00000000, 0x7ffb9d14, 0xfbcfdc71,
-    0x00000000, 0x7fffffff, 0x00000000, 0x00000000, 0x7ffb9d14, 0x0430238f,
-    0x00000000, 0x7fee74a1, 0x085f2136, 0x00000000, 0x7fd8878c, 0x0c8bd35d,
-    0x00000000, 0x7fb9d757, 0x10b5150f, 0x00000000, 0x7f92661c, 0x14d9c245,
-    0x00000000, 0x7f62368e, 0x18f8b83c, 0x00000000, 0x7f294bfb, 0x1d10d5c1,
-    0x00000000, 0x7ee7aa4a, 0x2120fb82, 0x00000000, 0x7e9d55fb, 0x25280c5d,
-    0x00000000, 0x7e4a5425, 0x2924edab, 0x00000000, 0x7deeaa78, 0x2d168791,
-    0x00000000, 0x7d8a5f3e, 0x30fbc54c, 0x00000000, 0x7d1d7956, 0x34d3957d,
-    0x00000000, 0x7ca80037, 0x389cea71, 0x00000000, 0x7c29fbed, 0x3c56ba6f,
-    0x00000000, 0x7ba3751c, 0x3fffffff, 0x00000000, 0x7b1474fc, 0x4397ba31,
-    0x00000000, 0x7a7d055a, 0x471cece6, 0x00000000, 0x79dd3097, 0x4a8ea110,
-    0x00000000, 0x793501a7, 0x4debe4fd, 0x00000000, 0x78848412, 0x5133cc93,
-    0x00000000, 0x77cbc3f0, 0x54657193, 0x00000000, 0x770acdeb, 0x577ff3d9,
-    0x00000000, 0x7641af3b, 0x5a827999, 0x00000000, 0x757075ab, 0x5d6c2f98,
-    0x00000000, 0x74972f90, 0x603c496b, 0x00000000, 0x73b5ebd0, 0x62f201ab,
-    0x00000000, 0x72ccb9d9, 0x658c9a2c, 0x00000000, 0x71dba9a9, 0x680b5c32,
-    0x00000000, 0x70e2cbc5, 0x6a6d98a3, 0x00000000, 0x6fe2313a, 0x6cb2a835,
-    0x00000000, 0x6ed9eba0, 0x6ed9eba0, 0x00000000, 0x6dca0d13, 0x70e2cbc5,
-    0x00000000, 0x6cb2a835, 0x72ccb9d9, 0x00000000, 0x6b93d02d, 0x74972f90,
-    0x00000000, 0x6a6d98a3, 0x7641af3b, 0x00000000, 0x694015c1, 0x77cbc3f0,
-    0x00000000, 0x680b5c32, 0x793501a7, 0x00000000, 0x66cf811f, 0x7a7d055a,
-    0x00000000, 0x658c9a2c, 0x7ba3751c, 0x00000000, 0x6442bd7c, 0x7ca80037,
-    0x00000000, 0x62f201ab, 0x7d8a5f3e, 0x00000000, 0x619a7dcc, 0x7e4a5425,
-    0x00000000, 0x603c496b, 0x7ee7aa4a, 0x00000000, 0x5ed77c88, 0x7f62368e,
-    0x00000000, 0x5d6c2f98, 0x7fb9d757, 0x00000000, 0x5bfa7b81, 0x7fee74a1,
-    0x00000000, 0x5a827999, 0x7fffffff, 0x00000000, 0x590443a6, 0x7fee74a1,
-    0x00000000, 0x577ff3d9, 0x7fb9d757, 0x00000000, 0x55f5a4d1, 0x7f62368e,
-    0x00000000, 0x54657193, 0x7ee7aa4a, 0x00000000, 0x52cf758d, 0x7e4a5425,
-    0x00000000, 0x5133cc93, 0x7d8a5f3e, 0x00000000, 0x4f9292db, 0x7ca80037,
-    0x00000000, 0x4debe4fd, 0x7ba3751c, 0x00000000, 0x4c3fdff2, 0x7a7d055a,
-    0x00000000, 0x4a8ea110, 0x793501a7, 0x00000000, 0x48d84608, 0x77cbc3f0,
-    0x00000000, 0x471cece6, 0x7641af3b, 0x00000000, 0x455cb40b, 0x74972f90,
-    0x00000000, 0x4397ba31, 0x72ccb9d9, 0x00000000, 0x41ce1e64, 0x70e2cbc5,
-    0x00000000, 0x3fffffff, 0x6ed9eba0, 0x00000000, 0x3e2d7eb0, 0x6cb2a835,
-    0x00000000, 0x3c56ba6f, 0x6a6d98a3, 0x00000000, 0x3a7bd381, 0x680b5c32,
-    0x00000000, 0x389cea71, 0x658c9a2c, 0x00000000, 0x36ba2013, 0x62f201ab,
-    0x00000000, 0x34d3957d, 0x603c496b, 0x00000000, 0x32e96c08, 0x5d6c2f98,
-    0x00000000, 0x30fbc54c, 0x5a827999, 0x00000000, 0x2f0ac31f, 0x577ff3d9,
-    0x00000000, 0x2d168791, 0x54657193, 0x00000000, 0x2b1f34eb, 0x5133cc93,
-    0x00000000, 0x2924edab, 0x4debe4fd, 0x00000000, 0x2727d485, 0x4a8ea110,
-    0x00000000, 0x25280c5d, 0x471cece6, 0x00000000, 0x2325b847, 0x4397ba31,
-    0x00000000, 0x2120fb82, 0x3fffffff, 0x00000000, 0x1f19f97a, 0x3c56ba6f,
-    0x00000000, 0x1d10d5c1, 0x389cea71, 0x00000000, 0x1b05b40e, 0x34d3957d,
-    0x00000000, 0x18f8b83c, 0x30fbc54c, 0x00000000, 0x16ea0646, 0x2d168791,
-    0x00000000, 0x14d9c245, 0x2924edab, 0x00000000, 0x12c8106e, 0x25280c5d,
-    0x00000000, 0x10b5150f, 0x2120fb82, 0x00000000, 0x0ea0f48c, 0x1d10d5c1,
-    0x00000000, 0x0c8bd35d, 0x18f8b83c, 0x00000000, 0x0a75d60e, 0x14d9c245,
-    0x00000000, 0x085f2136, 0x10b5150f, 0x00000000, 0x0647d97c, 0x0c8bd35d,
-    0x00000000, 0x0430238f, 0x085f2136, 0x00000000, 0x02182427, 0x0430238f,
-    0x00000000, 0x00000000, 0x00000000};
+  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfde7dbd9, 0xfbcfdc71,
+  0x00000000, 0xfbcfdc71, 0xf7a0deca, 0x00000000, 0xf9b82684, 0xf3742ca2,
+  0x00000000, 0xf7a0deca, 0xef4aeaf1, 0x00000000, 0xf58a29f2, 0xeb263dbb,
+  0x00000000, 0xf3742ca2, 0xe70747c4, 0x00000000, 0xf15f0b74, 0xe2ef2a3f,
+  0x00000000, 0xef4aeaf1, 0xdedf047d, 0x00000000, 0xed37ef92, 0xdad7f3a3,
+  0x00000000, 0xeb263dbb, 0xd6db1255, 0x00000000, 0xe915f9ba, 0xd2e9786f,
+  0x00000000, 0xe70747c4, 0xcf043ab3, 0x00000000, 0xe4fa4bf2, 0xcb2c6a83,
+  0x00000000, 0xe2ef2a3f, 0xc763158f, 0x00000000, 0xe0e60685, 0xc3a94590,
+  0x00000000, 0xdedf047d, 0xc0000000, 0x00000000, 0xdcda47b9, 0xbc6845ce,
+  0x00000000, 0xdad7f3a3, 0xb8e3131a, 0x00000000, 0xd8d82b7b, 0xb5715eef,
+  0x00000000, 0xd6db1255, 0xb2141b02, 0x00000000, 0xd4e0cb15, 0xaecc336c,
+  0x00000000, 0xd2e9786f, 0xab9a8e6c, 0x00000000, 0xd0f53ce0, 0xa8800c26,
+  0x00000000, 0xcf043ab3, 0xa57d8667, 0x00000000, 0xcd1693f7, 0xa293d067,
+  0x00000000, 0xcb2c6a83, 0x9fc3b694, 0x00000000, 0xc945dfed, 0x9d0dfe54,
+  0x00000000, 0xc763158f, 0x9a7365d3, 0x00000000, 0xc5842c7f, 0x97f4a3cd,
+  0x00000000, 0xc3a94590, 0x9592675c, 0x00000000, 0xc1d28150, 0x934d57ca,
+  0x00000000, 0xc0000000, 0x9126145f, 0x00000000, 0xbe31e19c, 0x8f1d343a,
+  0x00000000, 0xbc6845ce, 0x8d334626, 0x00000000, 0xbaa34bf4, 0x8b68d06f,
+  0x00000000, 0xb8e3131a, 0x89be50c4, 0x00000000, 0xb727b9f7, 0x88343c0f,
+  0x00000000, 0xb5715eef, 0x86cafe58, 0x00000000, 0xb3c0200d, 0x8582faa5,
+  0x00000000, 0xb2141b02, 0x845c8ae3, 0x00000000, 0xb06d6d25, 0x8357ffc8,
+  0x00000000, 0xaecc336c, 0x8275a0c1, 0x00000000, 0xad308a72, 0x81b5abda,
+  0x00000000, 0xab9a8e6c, 0x811855b5, 0x00000000, 0xaa0a5b2e, 0x809dc971,
+  0x00000000, 0xa8800c26, 0x804628a8, 0x00000000, 0xa6fbbc5a, 0x80118b5e,
+  0x00000000, 0xa57d8667, 0x80000000, 0x00000000, 0xa405847f, 0x80118b5e,
+  0x00000000, 0xa293d067, 0x804628a8, 0x00000000, 0xa1288377, 0x809dc971,
+  0x00000000, 0x9fc3b694, 0x811855b5, 0x00000000, 0x9e658233, 0x81b5abda,
+  0x00000000, 0x9d0dfe54, 0x8275a0c1, 0x00000000, 0x9bbd4283, 0x8357ffc8,
+  0x00000000, 0x9a7365d3, 0x845c8ae3, 0x00000000, 0x99307ee1, 0x8582faa5,
+  0x00000000, 0x97f4a3cd, 0x86cafe58, 0x00000000, 0x96bfea3e, 0x88343c0f,
+  0x00000000, 0x9592675c, 0x89be50c4, 0x00000000, 0x946c2fd2, 0x8b68d06f,
+  0x00000000, 0x934d57ca, 0x8d334626, 0x00000000, 0x9235f2ec, 0x8f1d343a,
+  0x00000000, 0x9126145f, 0x9126145f, 0x00000000, 0x901dcec5, 0x934d57ca,
+  0x00000000, 0x8f1d343a, 0x9592675c, 0x00000000, 0x8e245656, 0x97f4a3cd,
+  0x00000000, 0x8d334626, 0x9a7365d3, 0x00000000, 0x8c4a1430, 0x9d0dfe54,
+  0x00000000, 0x8b68d06f, 0x9fc3b694, 0x00000000, 0x8a8f8a54, 0xa293d067,
+  0x00000000, 0x89be50c4, 0xa57d8667, 0x00000000, 0x88f53214, 0xa8800c26,
+  0x00000000, 0x88343c0f, 0xab9a8e6c, 0x00000000, 0x877b7bed, 0xaecc336c,
+  0x00000000, 0x86cafe58, 0xb2141b02, 0x00000000, 0x8622cf68, 0xb5715eef,
+  0x00000000, 0x8582faa5, 0xb8e3131a, 0x00000000, 0x84eb8b03, 0xbc6845ce,
+  0x00000000, 0x845c8ae3, 0xc0000000, 0x00000000, 0x83d60412, 0xc3a94590,
+  0x00000000, 0x8357ffc8, 0xc763158f, 0x00000000, 0x82e286a9, 0xcb2c6a83,
+  0x00000000, 0x8275a0c1, 0xcf043ab3, 0x00000000, 0x82115587, 0xd2e9786f,
+  0x00000000, 0x81b5abda, 0xd6db1255, 0x00000000, 0x8162aa04, 0xdad7f3a3,
+  0x00000000, 0x811855b5, 0xdedf047d, 0x00000000, 0x80d6b404, 0xe2ef2a3f,
+  0x00000000, 0x809dc971, 0xe70747c4, 0x00000000, 0x806d99e3, 0xeb263dbb,
+  0x00000000, 0x804628a8, 0xef4aeaf1, 0x00000000, 0x80277873, 0xf3742ca2,
+  0x00000000, 0x80118b5e, 0xf7a0deca, 0x00000000, 0x800462eb, 0xfbcfdc71,
+  0x00000000, 0x80000000, 0x00000000, 0x00000000, 0x800462eb, 0x0430238f,
+  0x00000000, 0x80118b5e, 0x085f2136, 0x00000000, 0x80277873, 0x0c8bd35d,
+  0x00000000, 0x804628a8, 0x10b5150f, 0x00000000, 0x806d99e3, 0x14d9c245,
+  0x00000000, 0x809dc971, 0x18f8b83c, 0x00000000, 0x80d6b404, 0x1d10d5c1,
+  0x00000000, 0x811855b5, 0x2120fb82, 0x00000000, 0x8162aa04, 0x25280c5d,
+  0x00000000, 0x81b5abda, 0x2924edab, 0x00000000, 0x82115587, 0x2d168791,
+  0x00000000, 0x8275a0c1, 0x30fbc54c, 0x00000000, 0x82e286a9, 0x34d3957d,
+  0x00000000, 0x8357ffc8, 0x389cea71, 0x00000000, 0x83d60412, 0x3c56ba6f,
+  0x00000000, 0x845c8ae3, 0x3fffffff, 0x00000000, 0x84eb8b03, 0x4397ba31,
+  0x00000000, 0x8582faa5, 0x471cece6, 0x00000000, 0x8622cf68, 0x4a8ea110,
+  0x00000000, 0x86cafe58, 0x4debe4fd, 0x00000000, 0x877b7bed, 0x5133cc93,
+  0x00000000, 0x88343c0f, 0x54657193, 0x00000000, 0x88f53214, 0x577ff3d9,
+  0x00000000, 0x89be50c4, 0x5a827999, 0x00000000, 0x8a8f8a54, 0x5d6c2f98,
+  0x00000000, 0x8b68d06f, 0x603c496b, 0x00000000, 0x8c4a1430, 0x62f201ab,
+  0x00000000, 0x8d334626, 0x658c9a2c, 0x00000000, 0x8e245656, 0x680b5c32,
+  0x00000000, 0x8f1d343a, 0x6a6d98a3, 0x00000000, 0x901dcec5, 0x6cb2a835,
+  0x00000000, 0x9126145f, 0x6ed9eba0, 0x00000000, 0x9235f2ec, 0x70e2cbc5,
+  0x00000000, 0x934d57ca, 0x72ccb9d9, 0x00000000, 0x946c2fd2, 0x74972f90,
+  0x00000000, 0x9592675c, 0x7641af3b, 0x00000000, 0x96bfea3e, 0x77cbc3f0,
+  0x00000000, 0x97f4a3cd, 0x793501a7, 0x00000000, 0x99307ee1, 0x7a7d055a,
+  0x00000000, 0x9a7365d3, 0x7ba3751c, 0x00000000, 0x9bbd4283, 0x7ca80037,
+  0x00000000, 0x9d0dfe54, 0x7d8a5f3e, 0x00000000, 0x9e658233, 0x7e4a5425,
+  0x00000000, 0x9fc3b694, 0x7ee7aa4a, 0x00000000, 0xa1288377, 0x7f62368e,
+  0x00000000, 0xa293d067, 0x7fb9d757, 0x00000000, 0xa405847f, 0x7fee74a1,
+  0x00000000, 0xa57d8667, 0x7fffffff, 0x00000000, 0xa6fbbc5a, 0x7fee74a1,
+  0x00000000, 0xa8800c26, 0x7fb9d757, 0x00000000, 0xaa0a5b2e, 0x7f62368e,
+  0x00000000, 0xab9a8e6c, 0x7ee7aa4a, 0x00000000, 0xad308a72, 0x7e4a5425,
+  0x00000000, 0xaecc336c, 0x7d8a5f3e, 0x00000000, 0xb06d6d25, 0x7ca80037,
+  0x00000000, 0xb2141b02, 0x7ba3751c, 0x00000000, 0xb3c0200d, 0x7a7d055a,
+  0x00000000, 0xb5715eef, 0x793501a7, 0x00000000, 0xb727b9f7, 0x77cbc3f0,
+  0x00000000, 0xb8e3131a, 0x7641af3b, 0x00000000, 0xbaa34bf4, 0x74972f90,
+  0x00000000, 0xbc6845ce, 0x72ccb9d9, 0x00000000, 0xbe31e19c, 0x70e2cbc5,
+  0x00000000, 0xc0000000, 0x6ed9eba0, 0x00000000, 0xc1d28150, 0x6cb2a835,
+  0x00000000, 0xc3a94590, 0x6a6d98a3, 0x00000000, 0xc5842c7f, 0x680b5c32,
+  0x00000000, 0xc763158f, 0x658c9a2c, 0x00000000, 0xc945dfed, 0x62f201ab,
+  0x00000000, 0xcb2c6a83, 0x603c496b, 0x00000000, 0xcd1693f7, 0x5d6c2f98,
+  0x00000000, 0xcf043ab3, 0x5a827999, 0x00000000, 0xd0f53ce0, 0x577ff3d9,
+  0x00000000, 0xd2e9786f, 0x54657193, 0x00000000, 0xd4e0cb15, 0x5133cc93,
+  0x00000000, 0xd6db1255, 0x4debe4fd, 0x00000000, 0xd8d82b7b, 0x4a8ea110,
+  0x00000000, 0xdad7f3a3, 0x471cece6, 0x00000000, 0xdcda47b9, 0x4397ba31,
+  0x00000000, 0xdedf047d, 0x3fffffff, 0x00000000, 0xe0e60685, 0x3c56ba6f,
+  0x00000000, 0xe2ef2a3f, 0x389cea71, 0x00000000, 0xe4fa4bf2, 0x34d3957d,
+  0x00000000, 0xe70747c4, 0x30fbc54c, 0x00000000, 0xe915f9ba, 0x2d168791,
+  0x00000000, 0xeb263dbb, 0x2924edab, 0x00000000, 0xed37ef92, 0x25280c5d,
+  0x00000000, 0xef4aeaf1, 0x2120fb82, 0x00000000, 0xf15f0b74, 0x1d10d5c1,
+  0x00000000, 0xf3742ca2, 0x18f8b83c, 0x00000000, 0xf58a29f2, 0x14d9c245,
+  0x00000000, 0xf7a0deca, 0x10b5150f, 0x00000000, 0xf9b82684, 0x0c8bd35d,
+  0x00000000, 0xfbcfdc71, 0x085f2136, 0x00000000, 0xfde7dbd9, 0x0430238f,
+  0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02182427, 0xfbcfdc71,
+  0x00000000, 0x0430238f, 0xf7a0deca, 0x00000000, 0x0647d97c, 0xf3742ca2,
+  0x00000000, 0x085f2136, 0xef4aeaf1, 0x00000000, 0x0a75d60e, 0xeb263dbb,
+  0x00000000, 0x0c8bd35d, 0xe70747c4, 0x00000000, 0x0ea0f48c, 0xe2ef2a3f,
+  0x00000000, 0x10b5150f, 0xdedf047d, 0x00000000, 0x12c8106e, 0xdad7f3a3,
+  0x00000000, 0x14d9c245, 0xd6db1255, 0x00000000, 0x16ea0646, 0xd2e9786f,
+  0x00000000, 0x18f8b83c, 0xcf043ab3, 0x00000000, 0x1b05b40e, 0xcb2c6a83,
+  0x00000000, 0x1d10d5c1, 0xc763158f, 0x00000000, 0x1f19f97a, 0xc3a94590,
+  0x00000000, 0x2120fb82, 0xc0000000, 0x00000000, 0x2325b847, 0xbc6845ce,
+  0x00000000, 0x25280c5d, 0xb8e3131a, 0x00000000, 0x2727d485, 0xb5715eef,
+  0x00000000, 0x2924edab, 0xb2141b02, 0x00000000, 0x2b1f34eb, 0xaecc336c,
+  0x00000000, 0x2d168791, 0xab9a8e6c, 0x00000000, 0x2f0ac31f, 0xa8800c26,
+  0x00000000, 0x30fbc54c, 0xa57d8667, 0x00000000, 0x32e96c08, 0xa293d067,
+  0x00000000, 0x34d3957d, 0x9fc3b694, 0x00000000, 0x36ba2013, 0x9d0dfe54,
+  0x00000000, 0x389cea71, 0x9a7365d3, 0x00000000, 0x3a7bd381, 0x97f4a3cd,
+  0x00000000, 0x3c56ba6f, 0x9592675c, 0x00000000, 0x3e2d7eb0, 0x934d57ca,
+  0x00000000, 0x3fffffff, 0x9126145f, 0x00000000, 0x41ce1e64, 0x8f1d343a,
+  0x00000000, 0x4397ba31, 0x8d334626, 0x00000000, 0x455cb40b, 0x8b68d06f,
+  0x00000000, 0x471cece6, 0x89be50c4, 0x00000000, 0x48d84608, 0x88343c0f,
+  0x00000000, 0x4a8ea110, 0x86cafe58, 0x00000000, 0x4c3fdff2, 0x8582faa5,
+  0x00000000, 0x4debe4fd, 0x845c8ae3, 0x00000000, 0x4f9292db, 0x8357ffc8,
+  0x00000000, 0x5133cc93, 0x8275a0c1, 0x00000000, 0x52cf758d, 0x81b5abda,
+  0x00000000, 0x54657193, 0x811855b5, 0x00000000, 0x55f5a4d1, 0x809dc971,
+  0x00000000, 0x577ff3d9, 0x804628a8, 0x00000000, 0x590443a6, 0x80118b5e,
+  0x00000000, 0x5a827999, 0x80000000, 0x00000000, 0x5bfa7b81, 0x80118b5e,
+  0x00000000, 0x5d6c2f98, 0x804628a8, 0x00000000, 0x5ed77c88, 0x809dc971,
+  0x00000000, 0x603c496b, 0x811855b5, 0x00000000, 0x619a7dcc, 0x81b5abda,
+  0x00000000, 0x62f201ab, 0x8275a0c1, 0x00000000, 0x6442bd7c, 0x8357ffc8,
+  0x00000000, 0x658c9a2c, 0x845c8ae3, 0x00000000, 0x66cf811f, 0x8582faa5,
+  0x00000000, 0x680b5c32, 0x86cafe58, 0x00000000, 0x694015c1, 0x88343c0f,
+  0x00000000, 0x6a6d98a3, 0x89be50c4, 0x00000000, 0x6b93d02d, 0x8b68d06f,
+  0x00000000, 0x6cb2a835, 0x8d334626, 0x00000000, 0x6dca0d13, 0x8f1d343a,
+  0x00000000, 0x6ed9eba0, 0x9126145f, 0x00000000, 0x6fe2313a, 0x934d57ca,
+  0x00000000, 0x70e2cbc5, 0x9592675c, 0x00000000, 0x71dba9a9, 0x97f4a3cd,
+  0x00000000, 0x72ccb9d9, 0x9a7365d3, 0x00000000, 0x73b5ebd0, 0x9d0dfe54,
+  0x00000000, 0x74972f90, 0x9fc3b694, 0x00000000, 0x757075ab, 0xa293d067,
+  0x00000000, 0x7641af3b, 0xa57d8667, 0x00000000, 0x770acdeb, 0xa8800c26,
+  0x00000000, 0x77cbc3f0, 0xab9a8e6c, 0x00000000, 0x78848412, 0xaecc336c,
+  0x00000000, 0x793501a7, 0xb2141b02, 0x00000000, 0x79dd3097, 0xb5715eef,
+  0x00000000, 0x7a7d055a, 0xb8e3131a, 0x00000000, 0x7b1474fc, 0xbc6845ce,
+  0x00000000, 0x7ba3751c, 0xc0000000, 0x00000000, 0x7c29fbed, 0xc3a94590,
+  0x00000000, 0x7ca80037, 0xc763158f, 0x00000000, 0x7d1d7956, 0xcb2c6a83,
+  0x00000000, 0x7d8a5f3e, 0xcf043ab3, 0x00000000, 0x7deeaa78, 0xd2e9786f,
+  0x00000000, 0x7e4a5425, 0xd6db1255, 0x00000000, 0x7e9d55fb, 0xdad7f3a3,
+  0x00000000, 0x7ee7aa4a, 0xdedf047d, 0x00000000, 0x7f294bfb, 0xe2ef2a3f,
+  0x00000000, 0x7f62368e, 0xe70747c4, 0x00000000, 0x7f92661c, 0xeb263dbb,
+  0x00000000, 0x7fb9d757, 0xef4aeaf1, 0x00000000, 0x7fd8878c, 0xf3742ca2,
+  0x00000000, 0x7fee74a1, 0xf7a0deca, 0x00000000, 0x7ffb9d14, 0xfbcfdc71,
+  0x00000000, 0x7fffffff, 0x00000000, 0x00000000, 0x7ffb9d14, 0x0430238f,
+  0x00000000, 0x7fee74a1, 0x085f2136, 0x00000000, 0x7fd8878c, 0x0c8bd35d,
+  0x00000000, 0x7fb9d757, 0x10b5150f, 0x00000000, 0x7f92661c, 0x14d9c245,
+  0x00000000, 0x7f62368e, 0x18f8b83c, 0x00000000, 0x7f294bfb, 0x1d10d5c1,
+  0x00000000, 0x7ee7aa4a, 0x2120fb82, 0x00000000, 0x7e9d55fb, 0x25280c5d,
+  0x00000000, 0x7e4a5425, 0x2924edab, 0x00000000, 0x7deeaa78, 0x2d168791,
+  0x00000000, 0x7d8a5f3e, 0x30fbc54c, 0x00000000, 0x7d1d7956, 0x34d3957d,
+  0x00000000, 0x7ca80037, 0x389cea71, 0x00000000, 0x7c29fbed, 0x3c56ba6f,
+  0x00000000, 0x7ba3751c, 0x3fffffff, 0x00000000, 0x7b1474fc, 0x4397ba31,
+  0x00000000, 0x7a7d055a, 0x471cece6, 0x00000000, 0x79dd3097, 0x4a8ea110,
+  0x00000000, 0x793501a7, 0x4debe4fd, 0x00000000, 0x78848412, 0x5133cc93,
+  0x00000000, 0x77cbc3f0, 0x54657193, 0x00000000, 0x770acdeb, 0x577ff3d9,
+  0x00000000, 0x7641af3b, 0x5a827999, 0x00000000, 0x757075ab, 0x5d6c2f98,
+  0x00000000, 0x74972f90, 0x603c496b, 0x00000000, 0x73b5ebd0, 0x62f201ab,
+  0x00000000, 0x72ccb9d9, 0x658c9a2c, 0x00000000, 0x71dba9a9, 0x680b5c32,
+  0x00000000, 0x70e2cbc5, 0x6a6d98a3, 0x00000000, 0x6fe2313a, 0x6cb2a835,
+  0x00000000, 0x6ed9eba0, 0x6ed9eba0, 0x00000000, 0x6dca0d13, 0x70e2cbc5,
+  0x00000000, 0x6cb2a835, 0x72ccb9d9, 0x00000000, 0x6b93d02d, 0x74972f90,
+  0x00000000, 0x6a6d98a3, 0x7641af3b, 0x00000000, 0x694015c1, 0x77cbc3f0,
+  0x00000000, 0x680b5c32, 0x793501a7, 0x00000000, 0x66cf811f, 0x7a7d055a,
+  0x00000000, 0x658c9a2c, 0x7ba3751c, 0x00000000, 0x6442bd7c, 0x7ca80037,
+  0x00000000, 0x62f201ab, 0x7d8a5f3e, 0x00000000, 0x619a7dcc, 0x7e4a5425,
+  0x00000000, 0x603c496b, 0x7ee7aa4a, 0x00000000, 0x5ed77c88, 0x7f62368e,
+  0x00000000, 0x5d6c2f98, 0x7fb9d757, 0x00000000, 0x5bfa7b81, 0x7fee74a1,
+  0x00000000, 0x5a827999, 0x7fffffff, 0x00000000, 0x590443a6, 0x7fee74a1,
+  0x00000000, 0x577ff3d9, 0x7fb9d757, 0x00000000, 0x55f5a4d1, 0x7f62368e,
+  0x00000000, 0x54657193, 0x7ee7aa4a, 0x00000000, 0x52cf758d, 0x7e4a5425,
+  0x00000000, 0x5133cc93, 0x7d8a5f3e, 0x00000000, 0x4f9292db, 0x7ca80037,
+  0x00000000, 0x4debe4fd, 0x7ba3751c, 0x00000000, 0x4c3fdff2, 0x7a7d055a,
+  0x00000000, 0x4a8ea110, 0x793501a7, 0x00000000, 0x48d84608, 0x77cbc3f0,
+  0x00000000, 0x471cece6, 0x7641af3b, 0x00000000, 0x455cb40b, 0x74972f90,
+  0x00000000, 0x4397ba31, 0x72ccb9d9, 0x00000000, 0x41ce1e64, 0x70e2cbc5,
+  0x00000000, 0x3fffffff, 0x6ed9eba0, 0x00000000, 0x3e2d7eb0, 0x6cb2a835,
+  0x00000000, 0x3c56ba6f, 0x6a6d98a3, 0x00000000, 0x3a7bd381, 0x680b5c32,
+  0x00000000, 0x389cea71, 0x658c9a2c, 0x00000000, 0x36ba2013, 0x62f201ab,
+  0x00000000, 0x34d3957d, 0x603c496b, 0x00000000, 0x32e96c08, 0x5d6c2f98,
+  0x00000000, 0x30fbc54c, 0x5a827999, 0x00000000, 0x2f0ac31f, 0x577ff3d9,
+  0x00000000, 0x2d168791, 0x54657193, 0x00000000, 0x2b1f34eb, 0x5133cc93,
+  0x00000000, 0x2924edab, 0x4debe4fd, 0x00000000, 0x2727d485, 0x4a8ea110,
+  0x00000000, 0x25280c5d, 0x471cece6, 0x00000000, 0x2325b847, 0x4397ba31,
+  0x00000000, 0x2120fb82, 0x3fffffff, 0x00000000, 0x1f19f97a, 0x3c56ba6f,
+  0x00000000, 0x1d10d5c1, 0x389cea71, 0x00000000, 0x1b05b40e, 0x34d3957d,
+  0x00000000, 0x18f8b83c, 0x30fbc54c, 0x00000000, 0x16ea0646, 0x2d168791,
+  0x00000000, 0x14d9c245, 0x2924edab, 0x00000000, 0x12c8106e, 0x25280c5d,
+  0x00000000, 0x10b5150f, 0x2120fb82, 0x00000000, 0x0ea0f48c, 0x1d10d5c1,
+  0x00000000, 0x0c8bd35d, 0x18f8b83c, 0x00000000, 0x0a75d60e, 0x14d9c245,
+  0x00000000, 0x085f2136, 0x10b5150f, 0x00000000, 0x0647d97c, 0x0c8bd35d,
+  0x00000000, 0x0430238f, 0x085f2136, 0x00000000, 0x02182427, 0x0430238f,
+  0x00000000, 0x00000000, 0x00000000};
 
 const WORD32 ixheaacd_pre_post_twid_cos_512[512] = {
-    0x7fffff7f, 0x7fffcdff, 0x7fff4d7f, 0x7ffe7e7f, 0x7ffd607f, 0x7ffbf2ff,
-    0x7ffa36ff, 0x7ff82bff, 0x7ff5d1ff, 0x7ff328ff, 0x7ff030ff, 0x7fecea7f,
-    0x7fe9547f, 0x7fe56fff, 0x7fe13c7f, 0x7fdcba7f, 0x7fd7e8ff, 0x7fd2c8ff,
-    0x7fcd59ff, 0x7fc79c7f, 0x7fc18f7f, 0x7fbb347f, 0x7fb489ff, 0x7fad90ff,
-    0x7fa6497f, 0x7f9eb2ff, 0x7f96cdff, 0x7f8e99ff, 0x7f86177f, 0x7f7d45ff,
-    0x7f7425ff, 0x7f6ab77f, 0x7f60fa7f, 0x7f56eeff, 0x7f4c947f, 0x7f41ebff,
-    0x7f36f4ff, 0x7f2baeff, 0x7f201aff, 0x7f14387f, 0x7f08077f, 0x7efb87ff,
-    0x7eeeba7f, 0x7ee19e7f, 0x7ed433ff, 0x7ec67bff, 0x7eb874ff, 0x7eaa207f,
-    0x7e9b7d7f, 0x7e8c8c7f, 0x7e7d4cff, 0x7e6dbfff, 0x7e5de4ff, 0x7e4dbbff,
-    0x7e3d44ff, 0x7e2c7fff, 0x7e1b6d7f, 0x7e0a0cff, 0x7df85e7f, 0x7de6627f,
-    0x7dd418ff, 0x7dc181ff, 0x7dae9cff, 0x7d9b6aff, 0x7d87eaff, 0x7d741dff,
-    0x7d6002ff, 0x7d4b9b7f, 0x7d36e5ff, 0x7d21e37f, 0x7d0c93ff, 0x7cf6f6ff,
-    0x7ce10cff, 0x7ccad67f, 0x7cb4527f, 0x7c9d817f, 0x7c8663ff, 0x7c6ef97f,
-    0x7c5741ff, 0x7c3f3e7f, 0x7c26ed7f, 0x7c0e507f, 0x7bf566ff, 0x7bdc307f,
-    0x7bc2adff, 0x7ba8deff, 0x7b8ec3ff, 0x7b745c7f, 0x7b59a8ff, 0x7b3ea97f,
-    0x7b235d7f, 0x7b07c5ff, 0x7aebe27f, 0x7acfb2ff, 0x7ab337ff, 0x7a96717f,
-    0x7a795eff, 0x7a5c00ff, 0x7a3e577f, 0x7a20627f, 0x7a02227f, 0x79e396ff,
-    0x79c4c07f, 0x79a59eff, 0x798631ff, 0x79667a7f, 0x7946777f, 0x792629ff,
-    0x790591ff, 0x78e4af7f, 0x78c381ff, 0x78a209ff, 0x7880477f, 0x785e3aff,
-    0x783be3ff, 0x781942ff, 0x77f657ff, 0x77d322ff, 0x77afa3ff, 0x778bdaff,
-    0x7767c87f, 0x77436bff, 0x771ec67f, 0x76f9d6ff, 0x76d49e7f, 0x76af1c7f,
-    0x768950ff, 0x76633cff, 0x763cdf7f, 0x7616397f, 0x75ef49ff, 0x75c8127f,
-    0x75a091ff, 0x7578c87f, 0x7550b6ff, 0x75285cff, 0x74ffbaff, 0x74d6d07f,
-    0x74ad9e7f, 0x748423ff, 0x745a617f, 0x7430577f, 0x740605ff, 0x73db6c7f,
-    0x73b08bff, 0x7385637f, 0x7359f47f, 0x732e3dff, 0x73023fff, 0x72d5fb7f,
-    0x72a9707f, 0x727c9e7f, 0x724f857f, 0x7222267f, 0x71f4807f, 0x71c694ff,
-    0x7198627f, 0x7169ea7f, 0x713b2c7f, 0x710c287f, 0x70dcdeff, 0x70ad4f7f,
-    0x707d7a7f, 0x704d607f, 0x701d00ff, 0x6fec5bff, 0x6fbb727f, 0x6f8a43ff,
-    0x6f58d07f, 0x6f27187f, 0x6ef51b7f, 0x6ec2da7f, 0x6e9054ff, 0x6e5d8b7f,
-    0x6e2a7dff, 0x6df72bff, 0x6dc3967f, 0x6d8fbd7f, 0x6d5ba07f, 0x6d27407f,
-    0x6cf29cff, 0x6cbdb5ff, 0x6c888bff, 0x6c531f7f, 0x6c1d6fff, 0x6be77d7f,
-    0x6bb1487f, 0x6b7ad17f, 0x6b44177f, 0x6b0d1bff, 0x6ad5ddff, 0x6a9e5e7f,
-    0x6a669cff, 0x6a2e997f, 0x69f654ff, 0x69bdceff, 0x698507ff, 0x694bff7f,
-    0x6912b67f, 0x68d92c7f, 0x689f617f, 0x6865567f, 0x682b0a7f, 0x67f07eff,
-    0x67b5b27f, 0x677aa67f, 0x673f5aff, 0x6703cf7f, 0x66c8047f, 0x668bf9ff,
-    0x664fafff, 0x661326ff, 0x65d65f7f, 0x659958ff, 0x655c137f, 0x651e8f7f,
-    0x64e0cd7f, 0x64a2ccff, 0x64648e7f, 0x642611ff, 0x63e757ff, 0x63a85fff,
-    0x63692aff, 0x6329b7ff, 0x62ea087f, 0x62aa1b7f, 0x6269f1ff, 0x62298b7f,
-    0x61e8e87f, 0x61a808ff, 0x6166ed7f, 0x612595ff, 0x60e4027f, 0x60a232ff,
-    0x606027ff, 0x601de1ff, 0x5fdb5fff, 0x5f98a37f, 0x5f55ab7f, 0x5f1278ff,
-    0x5ecf0b7f, 0x5e8b63ff, 0x5e4781ff, 0x5e03657f, 0x5dbf0f7f, 0x5d7a7f7f,
-    0x5d35b5ff, 0x5cf0b27f, 0x5cab75ff, 0x5c66007f, 0x5c2051ff, 0x5bda6a7f,
-    0x5b9449ff, 0x5b4df17f, 0x5b07607f, 0x5ac0977f, 0x5a79967f, 0x5a325d7f,
-    0x59eaecff, 0x59a344ff, 0x595b657f, 0x59134eff, 0x58cb01ff, 0x58827d7f,
-    0x5839c2ff, 0x57f0d1ff, 0x57a7aa7f, 0x575e4cff, 0x5714b97f, 0x56caf07f,
-    0x5680f1ff, 0x5636bdff, 0x55ec54ff, 0x55a1b67f, 0x5556e37f, 0x550bdbff,
-    0x54c09fff, 0x54752f7f, 0x54298aff, 0x53ddb27f, 0x5391a67f, 0x534566ff,
-    0x52f8f3ff, 0x52ac4d7f, 0x525f747f, 0x5212687f, 0x51c529ff, 0x5177b8ff,
-    0x512a157f, 0x50dc3fff, 0x508e387f, 0x503fffff, 0x4ff1957f, 0x4fa2f97f,
-    0x4f542c7f, 0x4f052e7f, 0x4eb5ffff, 0x4e66a0ff, 0x4e17117f, 0x4dc751ff,
-    0x4d7761ff, 0x4d2742ff, 0x4cd6f37f, 0x4c86757f, 0x4c35c77f, 0x4be4eaff,
-    0x4b93df7f, 0x4b42a57f, 0x4af13cff, 0x4a9fa67f, 0x4a4de17f, 0x49fbeeff,
-    0x49a9ce7f, 0x495780ff, 0x490505ff, 0x48b25dff, 0x485f897f, 0x480c87ff,
-    0x47b959ff, 0x4765ffff, 0x4712797f, 0x46bec77f, 0x466ae9ff, 0x4616e0ff,
-    0x45c2ac7f, 0x456e4d7f, 0x4519c2ff, 0x44c50e7f, 0x44702eff, 0x441b257f,
-    0x43c5f1ff, 0x437094ff, 0x431b0dff, 0x42c55dff, 0x426f847f, 0x421981ff,
-    0x41c356ff, 0x416d02ff, 0x411686ff, 0x40bfe27f, 0x4069167f, 0x4012227f,
-    0x3fbb06ff, 0x3f63c43f, 0x3f0c5a3f, 0x3eb4c97f, 0x3e5d123f, 0x3e05343f,
-    0x3dad2fff, 0x3d5505bf, 0x3cfcb5bf, 0x3ca43fff, 0x3c4ba4ff, 0x3bf2e4bf,
-    0x3b99ff7f, 0x3b40f57f, 0x3ae7c6ff, 0x3a8e73ff, 0x3a34fcff, 0x39db61ff,
-    0x3981a37f, 0x3927c13f, 0x38cdbbff, 0x3873937f, 0x3819487f, 0x37beda7f,
-    0x37644a7f, 0x370997ff, 0x36aec3bf, 0x3653cdbf, 0x35f8b5ff, 0x359d7d3f,
-    0x3542233f, 0x34e6a87f, 0x348b0cff, 0x342f513f, 0x33d3753f, 0x3377793f,
-    0x331b5d7f, 0x32bf223f, 0x3262c7bf, 0x32064dff, 0x31a9b57f, 0x314cfe7f,
-    0x30f028ff, 0x3093353f, 0x3036237f, 0x2fd8f3ff, 0x2f7ba73f, 0x2f1e3cff,
-    0x2ec0b57f, 0x2e63117f, 0x2e0550bf, 0x2da7737f, 0x2d497a3f, 0x2ceb64ff,
-    0x2c8d33ff, 0x2c2ee7bf, 0x2bd07fff, 0x2b71fd3f, 0x2b135fbf, 0x2ab4a7bf,
-    0x2a55d53f, 0x29f6e8bf, 0x2997e23f, 0x2938c23f, 0x28d988bf, 0x287a35ff,
-    0x281aca3f, 0x27bb45ff, 0x275ba8ff, 0x26fbf3bf, 0x269c267f, 0x263c417f,
-    0x25dc44bf, 0x257c30bf, 0x251c05bf, 0x24bbc3bf, 0x245b6aff, 0x23fafbff,
-    0x239a76bf, 0x2339db3f, 0x22d92a7f, 0x227863ff, 0x2217883f, 0x21b6973f,
-    0x215591bf, 0x20f477bf, 0x2093493f, 0x203206bf, 0x1fd0b03f, 0x1f6f461f,
-    0x1f0dc8bf, 0x1eac381f, 0x1e4a949f, 0x1de8de7f, 0x1d8715df, 0x1d253aff,
-    0x1cc34e1f, 0x1c614f7f, 0x1bff3f7f, 0x1b9d1e1f, 0x1b3aebbf, 0x1ad8a87f,
-    0x1a7654bf, 0x1a13f0bf, 0x19b17c7f, 0x194ef87f, 0x18ec64ff, 0x1889c1ff,
-    0x18270fdf, 0x17c44ebf, 0x17617f1f, 0x16fea0ff, 0x169bb4bf, 0x1638ba7f,
-    0x15d5b27f, 0x15729d1f, 0x150f7a7f, 0x14ac4adf, 0x14490e7f, 0x13e5c57f,
-    0x1382705f, 0x131f0f1f, 0x12bba21f, 0x1258299f, 0x11f4a5bf, 0x119116bf,
-    0x112d7cff, 0x10c9d89f, 0x106629df, 0x100270ff, 0x0f9eae4f, 0x0f3ae1ef,
-    0x0ed70c2f, 0x0e732d3f, 0x0e0f456f, 0x0dab54ef, 0x0d475bff, 0x0ce35adf,
-    0x0c7f51cf, 0x0c1b40ff, 0x0bb728bf, 0x0b53094f, 0x0aeee2cf, 0x0a8ab59f,
-    0x0a2681ef, 0x09c247ef, 0x095e07ef, 0x08f9c22f, 0x089576df, 0x0831264f,
-    0x07ccd0a7, 0x0768762f, 0x07041727, 0x069fb3c7, 0x063b4c57, 0x05d6e10f,
-    0x05727227, 0x050dffe7, 0x04a98a87, 0x04451247, 0x03e09767, 0x037c1a1f,
-    0x03179ab3, 0x02b3195f, 0x024e9663, 0x01ea11f7, 0x01858c5d, 0x012105d3,
-    0x00bc7e98, 0x0057f6e8};
+  0x7fffff7f, 0x7fffcdff, 0x7fff4d7f, 0x7ffe7e7f, 0x7ffd607f, 0x7ffbf2ff,
+  0x7ffa36ff, 0x7ff82bff, 0x7ff5d1ff, 0x7ff328ff, 0x7ff030ff, 0x7fecea7f,
+  0x7fe9547f, 0x7fe56fff, 0x7fe13c7f, 0x7fdcba7f, 0x7fd7e8ff, 0x7fd2c8ff,
+  0x7fcd59ff, 0x7fc79c7f, 0x7fc18f7f, 0x7fbb347f, 0x7fb489ff, 0x7fad90ff,
+  0x7fa6497f, 0x7f9eb2ff, 0x7f96cdff, 0x7f8e99ff, 0x7f86177f, 0x7f7d45ff,
+  0x7f7425ff, 0x7f6ab77f, 0x7f60fa7f, 0x7f56eeff, 0x7f4c947f, 0x7f41ebff,
+  0x7f36f4ff, 0x7f2baeff, 0x7f201aff, 0x7f14387f, 0x7f08077f, 0x7efb87ff,
+  0x7eeeba7f, 0x7ee19e7f, 0x7ed433ff, 0x7ec67bff, 0x7eb874ff, 0x7eaa207f,
+  0x7e9b7d7f, 0x7e8c8c7f, 0x7e7d4cff, 0x7e6dbfff, 0x7e5de4ff, 0x7e4dbbff,
+  0x7e3d44ff, 0x7e2c7fff, 0x7e1b6d7f, 0x7e0a0cff, 0x7df85e7f, 0x7de6627f,
+  0x7dd418ff, 0x7dc181ff, 0x7dae9cff, 0x7d9b6aff, 0x7d87eaff, 0x7d741dff,
+  0x7d6002ff, 0x7d4b9b7f, 0x7d36e5ff, 0x7d21e37f, 0x7d0c93ff, 0x7cf6f6ff,
+  0x7ce10cff, 0x7ccad67f, 0x7cb4527f, 0x7c9d817f, 0x7c8663ff, 0x7c6ef97f,
+  0x7c5741ff, 0x7c3f3e7f, 0x7c26ed7f, 0x7c0e507f, 0x7bf566ff, 0x7bdc307f,
+  0x7bc2adff, 0x7ba8deff, 0x7b8ec3ff, 0x7b745c7f, 0x7b59a8ff, 0x7b3ea97f,
+  0x7b235d7f, 0x7b07c5ff, 0x7aebe27f, 0x7acfb2ff, 0x7ab337ff, 0x7a96717f,
+  0x7a795eff, 0x7a5c00ff, 0x7a3e577f, 0x7a20627f, 0x7a02227f, 0x79e396ff,
+  0x79c4c07f, 0x79a59eff, 0x798631ff, 0x79667a7f, 0x7946777f, 0x792629ff,
+  0x790591ff, 0x78e4af7f, 0x78c381ff, 0x78a209ff, 0x7880477f, 0x785e3aff,
+  0x783be3ff, 0x781942ff, 0x77f657ff, 0x77d322ff, 0x77afa3ff, 0x778bdaff,
+  0x7767c87f, 0x77436bff, 0x771ec67f, 0x76f9d6ff, 0x76d49e7f, 0x76af1c7f,
+  0x768950ff, 0x76633cff, 0x763cdf7f, 0x7616397f, 0x75ef49ff, 0x75c8127f,
+  0x75a091ff, 0x7578c87f, 0x7550b6ff, 0x75285cff, 0x74ffbaff, 0x74d6d07f,
+  0x74ad9e7f, 0x748423ff, 0x745a617f, 0x7430577f, 0x740605ff, 0x73db6c7f,
+  0x73b08bff, 0x7385637f, 0x7359f47f, 0x732e3dff, 0x73023fff, 0x72d5fb7f,
+  0x72a9707f, 0x727c9e7f, 0x724f857f, 0x7222267f, 0x71f4807f, 0x71c694ff,
+  0x7198627f, 0x7169ea7f, 0x713b2c7f, 0x710c287f, 0x70dcdeff, 0x70ad4f7f,
+  0x707d7a7f, 0x704d607f, 0x701d00ff, 0x6fec5bff, 0x6fbb727f, 0x6f8a43ff,
+  0x6f58d07f, 0x6f27187f, 0x6ef51b7f, 0x6ec2da7f, 0x6e9054ff, 0x6e5d8b7f,
+  0x6e2a7dff, 0x6df72bff, 0x6dc3967f, 0x6d8fbd7f, 0x6d5ba07f, 0x6d27407f,
+  0x6cf29cff, 0x6cbdb5ff, 0x6c888bff, 0x6c531f7f, 0x6c1d6fff, 0x6be77d7f,
+  0x6bb1487f, 0x6b7ad17f, 0x6b44177f, 0x6b0d1bff, 0x6ad5ddff, 0x6a9e5e7f,
+  0x6a669cff, 0x6a2e997f, 0x69f654ff, 0x69bdceff, 0x698507ff, 0x694bff7f,
+  0x6912b67f, 0x68d92c7f, 0x689f617f, 0x6865567f, 0x682b0a7f, 0x67f07eff,
+  0x67b5b27f, 0x677aa67f, 0x673f5aff, 0x6703cf7f, 0x66c8047f, 0x668bf9ff,
+  0x664fafff, 0x661326ff, 0x65d65f7f, 0x659958ff, 0x655c137f, 0x651e8f7f,
+  0x64e0cd7f, 0x64a2ccff, 0x64648e7f, 0x642611ff, 0x63e757ff, 0x63a85fff,
+  0x63692aff, 0x6329b7ff, 0x62ea087f, 0x62aa1b7f, 0x6269f1ff, 0x62298b7f,
+  0x61e8e87f, 0x61a808ff, 0x6166ed7f, 0x612595ff, 0x60e4027f, 0x60a232ff,
+  0x606027ff, 0x601de1ff, 0x5fdb5fff, 0x5f98a37f, 0x5f55ab7f, 0x5f1278ff,
+  0x5ecf0b7f, 0x5e8b63ff, 0x5e4781ff, 0x5e03657f, 0x5dbf0f7f, 0x5d7a7f7f,
+  0x5d35b5ff, 0x5cf0b27f, 0x5cab75ff, 0x5c66007f, 0x5c2051ff, 0x5bda6a7f,
+  0x5b9449ff, 0x5b4df17f, 0x5b07607f, 0x5ac0977f, 0x5a79967f, 0x5a325d7f,
+  0x59eaecff, 0x59a344ff, 0x595b657f, 0x59134eff, 0x58cb01ff, 0x58827d7f,
+  0x5839c2ff, 0x57f0d1ff, 0x57a7aa7f, 0x575e4cff, 0x5714b97f, 0x56caf07f,
+  0x5680f1ff, 0x5636bdff, 0x55ec54ff, 0x55a1b67f, 0x5556e37f, 0x550bdbff,
+  0x54c09fff, 0x54752f7f, 0x54298aff, 0x53ddb27f, 0x5391a67f, 0x534566ff,
+  0x52f8f3ff, 0x52ac4d7f, 0x525f747f, 0x5212687f, 0x51c529ff, 0x5177b8ff,
+  0x512a157f, 0x50dc3fff, 0x508e387f, 0x503fffff, 0x4ff1957f, 0x4fa2f97f,
+  0x4f542c7f, 0x4f052e7f, 0x4eb5ffff, 0x4e66a0ff, 0x4e17117f, 0x4dc751ff,
+  0x4d7761ff, 0x4d2742ff, 0x4cd6f37f, 0x4c86757f, 0x4c35c77f, 0x4be4eaff,
+  0x4b93df7f, 0x4b42a57f, 0x4af13cff, 0x4a9fa67f, 0x4a4de17f, 0x49fbeeff,
+  0x49a9ce7f, 0x495780ff, 0x490505ff, 0x48b25dff, 0x485f897f, 0x480c87ff,
+  0x47b959ff, 0x4765ffff, 0x4712797f, 0x46bec77f, 0x466ae9ff, 0x4616e0ff,
+  0x45c2ac7f, 0x456e4d7f, 0x4519c2ff, 0x44c50e7f, 0x44702eff, 0x441b257f,
+  0x43c5f1ff, 0x437094ff, 0x431b0dff, 0x42c55dff, 0x426f847f, 0x421981ff,
+  0x41c356ff, 0x416d02ff, 0x411686ff, 0x40bfe27f, 0x4069167f, 0x4012227f,
+  0x3fbb06ff, 0x3f63c43f, 0x3f0c5a3f, 0x3eb4c97f, 0x3e5d123f, 0x3e05343f,
+  0x3dad2fff, 0x3d5505bf, 0x3cfcb5bf, 0x3ca43fff, 0x3c4ba4ff, 0x3bf2e4bf,
+  0x3b99ff7f, 0x3b40f57f, 0x3ae7c6ff, 0x3a8e73ff, 0x3a34fcff, 0x39db61ff,
+  0x3981a37f, 0x3927c13f, 0x38cdbbff, 0x3873937f, 0x3819487f, 0x37beda7f,
+  0x37644a7f, 0x370997ff, 0x36aec3bf, 0x3653cdbf, 0x35f8b5ff, 0x359d7d3f,
+  0x3542233f, 0x34e6a87f, 0x348b0cff, 0x342f513f, 0x33d3753f, 0x3377793f,
+  0x331b5d7f, 0x32bf223f, 0x3262c7bf, 0x32064dff, 0x31a9b57f, 0x314cfe7f,
+  0x30f028ff, 0x3093353f, 0x3036237f, 0x2fd8f3ff, 0x2f7ba73f, 0x2f1e3cff,
+  0x2ec0b57f, 0x2e63117f, 0x2e0550bf, 0x2da7737f, 0x2d497a3f, 0x2ceb64ff,
+  0x2c8d33ff, 0x2c2ee7bf, 0x2bd07fff, 0x2b71fd3f, 0x2b135fbf, 0x2ab4a7bf,
+  0x2a55d53f, 0x29f6e8bf, 0x2997e23f, 0x2938c23f, 0x28d988bf, 0x287a35ff,
+  0x281aca3f, 0x27bb45ff, 0x275ba8ff, 0x26fbf3bf, 0x269c267f, 0x263c417f,
+  0x25dc44bf, 0x257c30bf, 0x251c05bf, 0x24bbc3bf, 0x245b6aff, 0x23fafbff,
+  0x239a76bf, 0x2339db3f, 0x22d92a7f, 0x227863ff, 0x2217883f, 0x21b6973f,
+  0x215591bf, 0x20f477bf, 0x2093493f, 0x203206bf, 0x1fd0b03f, 0x1f6f461f,
+  0x1f0dc8bf, 0x1eac381f, 0x1e4a949f, 0x1de8de7f, 0x1d8715df, 0x1d253aff,
+  0x1cc34e1f, 0x1c614f7f, 0x1bff3f7f, 0x1b9d1e1f, 0x1b3aebbf, 0x1ad8a87f,
+  0x1a7654bf, 0x1a13f0bf, 0x19b17c7f, 0x194ef87f, 0x18ec64ff, 0x1889c1ff,
+  0x18270fdf, 0x17c44ebf, 0x17617f1f, 0x16fea0ff, 0x169bb4bf, 0x1638ba7f,
+  0x15d5b27f, 0x15729d1f, 0x150f7a7f, 0x14ac4adf, 0x14490e7f, 0x13e5c57f,
+  0x1382705f, 0x131f0f1f, 0x12bba21f, 0x1258299f, 0x11f4a5bf, 0x119116bf,
+  0x112d7cff, 0x10c9d89f, 0x106629df, 0x100270ff, 0x0f9eae4f, 0x0f3ae1ef,
+  0x0ed70c2f, 0x0e732d3f, 0x0e0f456f, 0x0dab54ef, 0x0d475bff, 0x0ce35adf,
+  0x0c7f51cf, 0x0c1b40ff, 0x0bb728bf, 0x0b53094f, 0x0aeee2cf, 0x0a8ab59f,
+  0x0a2681ef, 0x09c247ef, 0x095e07ef, 0x08f9c22f, 0x089576df, 0x0831264f,
+  0x07ccd0a7, 0x0768762f, 0x07041727, 0x069fb3c7, 0x063b4c57, 0x05d6e10f,
+  0x05727227, 0x050dffe7, 0x04a98a87, 0x04451247, 0x03e09767, 0x037c1a1f,
+  0x03179ab3, 0x02b3195f, 0x024e9663, 0x01ea11f7, 0x01858c5d, 0x012105d3,
+  0x00bc7e98, 0x0057f6e8};
 
 const WORD32 ixheaacd_pre_post_twid_sin_512[512] = {
-    0x000c90fd, 0x007118dc, 0x00d5a074, 0x013a2789, 0x019eaddd, 0x0203332f,
-    0x0267b747, 0x02cc39df, 0x0330babf, 0x039539a7, 0x03f9b65b, 0x045e3097,
-    0x04c2a827, 0x05271cc7, 0x058b8e2f, 0x05effc37, 0x0654668f, 0x06b8cd07,
-    0x071d2f4f, 0x07818d3f, 0x07e5e687, 0x084a3aef, 0x08ae8a3f, 0x0912d42f,
-    0x0977187f, 0x09db56ff, 0x0a3f8f6f, 0x0aa3c18f, 0x0b07ed1f, 0x0b6c11cf,
-    0x0bd02f7f, 0x0c3445ef, 0x0c9854cf, 0x0cfc5bef, 0x0d605aff, 0x0dc451df,
-    0x0e28402f, 0x0e8c25cf, 0x0ef0027f, 0x0f53d5ef, 0x0fb79fdf, 0x101b601f,
-    0x107f167f, 0x10e2c2bf, 0x1146647f, 0x11a9fb7f, 0x120d87bf, 0x127108df,
-    0x12d47e7f, 0x1337e89f, 0x139b46bf, 0x13fe98ff, 0x1461debf, 0x14c517ff,
-    0x1528445f, 0x158b63bf, 0x15ee75bf, 0x16517a5f, 0x16b4711f, 0x171759df,
-    0x177a345f, 0x17dd007f, 0x183fbdbf, 0x18a26c1f, 0x19050b3f, 0x19679aff,
-    0x19ca1b1f, 0x1a2c8b3f, 0x1a8eeb3f, 0x1af13adf, 0x1b5379df, 0x1bb5a7ff,
-    0x1c17c51f, 0x1c79d0df, 0x1cdbcaff, 0x1d3db35f, 0x1d9f89bf, 0x1e014dbf,
-    0x1e62ff3f, 0x1ec49e1f, 0x1f2629df, 0x1f87a27f, 0x1fe9079f, 0x204a593f,
-    0x20ab96bf, 0x210cbfff, 0x216dd53f, 0x21ced57f, 0x222fc0ff, 0x2290977f,
-    0x22f158bf, 0x2352043f, 0x23b299ff, 0x241319bf, 0x2473833f, 0x24d3d63f,
-    0x253412bf, 0x259437ff, 0x25f4463f, 0x26543cff, 0x26b41bff, 0x2713e33f,
-    0x2773927f, 0x27d3293f, 0x2832a77f, 0x28920cff, 0x28f1597f, 0x29508cbf,
-    0x29afa63f, 0x2a0ea63f, 0x2a6d8c3f, 0x2acc583f, 0x2b2b09bf, 0x2b89a07f,
-    0x2be81c7f, 0x2c467d3f, 0x2ca4c2ff, 0x2d02ecff, 0x2d60fb3f, 0x2dbeed7f,
-    0x2e1cc37f, 0x2e7a7d3f, 0x2ed81a3f, 0x2f359a3f, 0x2f92fd3f, 0x2ff042bf,
-    0x304d6abf, 0x30aa74ff, 0x3107613f, 0x31642f3f, 0x31c0debf, 0x321d6f7f,
-    0x3279e13f, 0x32d633ff, 0x3332677f, 0x338e7b3f, 0x33ea6f3f, 0x3446433f,
-    0x34a1f6ff, 0x34fd8a3f, 0x3558fcbf, 0x35b44e7f, 0x360f7eff, 0x366a8e3f,
-    0x36c57bff, 0x372047bf, 0x377af1bf, 0x37d5793f, 0x382fde7f, 0x388a20ff,
-    0x38e4407f, 0x393e3d3f, 0x3998167f, 0x39f1cc3f, 0x3a4b5dff, 0x3aa4cbff,
-    0x3afe15ff, 0x3b573b7f, 0x3bb03c3f, 0x3c09183f, 0x3c61cf3f, 0x3cba60ff,
-    0x3d12cd3f, 0x3d6b13ff, 0x3dc334bf, 0x3e1b2f3f, 0x3e73037f, 0x3ecab17f,
-    0x3f22387f, 0x3f79987f, 0x3fd0d17f, 0x4027e2ff, 0x407eccff, 0x40d58f7f,
-    0x412c297f, 0x41829b7f, 0x41d8e57f, 0x422f067f, 0x4284fe7f, 0x42dacdff,
-    0x4330737f, 0x4385efff, 0x43db42ff, 0x44306bff, 0x44856aff, 0x44da3f7f,
-    0x452ee97f, 0x458368ff, 0x45d7bdff, 0x462be77f, 0x467fe57f, 0x46d3b87f,
-    0x47275f7f, 0x477ada7f, 0x47ce297f, 0x48214c7f, 0x4874427f, 0x48c70c7f,
-    0x4919a8ff, 0x496c187f, 0x49be5aff, 0x4a106fff, 0x4a6256ff, 0x4ab4107f,
-    0x4b059b7f, 0x4b56f87f, 0x4ba826ff, 0x4bf9267f, 0x4c49f77f, 0x4c9a997f,
-    0x4ceb0bff, 0x4d3b4eff, 0x4d8b627f, 0x4ddb467f, 0x4e2af9ff, 0x4e7a7d7f,
-    0x4ec9d07f, 0x4f18f2ff, 0x4f67e47f, 0x4fb6a4ff, 0x5005347f, 0x5053927f,
-    0x50a1beff, 0x50efb9ff, 0x513d82ff, 0x518b197f, 0x51d87dff, 0x5225afff,
-    0x5272af7f, 0x52bf7bff, 0x530c157f, 0x53587b7f, 0x53a4ae7f, 0x53f0ad7f,
-    0x543c78ff, 0x5488107f, 0x54d373ff, 0x551ea2ff, 0x55699d7f, 0x55b462ff,
-    0x55fef3ff, 0x56494fff, 0x5693767f, 0x56dd67ff, 0x5727237f, 0x5770a97f,
-    0x57b9f97f, 0x580312ff, 0x584bf6ff, 0x5894a3ff, 0x58dd1a7f, 0x592559ff,
-    0x596d627f, 0x59b533ff, 0x59fcce7f, 0x5a4430ff, 0x5a8b5bff, 0x5ad24eff,
-    0x5b1909ff, 0x5b5f8cff, 0x5ba5d77f, 0x5bebe97f, 0x5c31c2ff, 0x5c77637f,
-    0x5cbcca7f, 0x5d01f8ff, 0x5d46ed7f, 0x5d8ba8ff, 0x5dd02a7f, 0x5e1471ff,
-    0x5e587fff, 0x5e9c537f, 0x5edfec7f, 0x5f234aff, 0x5f666eff, 0x5fa957ff,
-    0x5fec05ff, 0x602e78ff, 0x6070b07f, 0x60b2ac7f, 0x60f46cff, 0x6135f17f,
-    0x617739ff, 0x61b8467f, 0x61f916ff, 0x6239aaff, 0x627a01ff, 0x62ba1c7f,
-    0x62f9f9ff, 0x63399a7f, 0x6378fdff, 0x63b823ff, 0x63f70bff, 0x6435b6ff,
-    0x647423ff, 0x64b252ff, 0x64f043ff, 0x652df67f, 0x656b6a7f, 0x65a8a07f,
-    0x65e5977f, 0x66224f7f, 0x665ec87f, 0x669b027f, 0x66d6fcff, 0x6712b7ff,
-    0x674e33ff, 0x67896f7f, 0x67c46b7f, 0x67ff27ff, 0x6839a37f, 0x6873deff,
-    0x68adda7f, 0x68e794ff, 0x69210eff, 0x695a47ff, 0x69933fff, 0x69cbf6ff,
-    0x6a046c7f, 0x6a3ca07f, 0x6a74937f, 0x6aac447f, 0x6ae3b37f, 0x6b1ae0ff,
-    0x6b51cc7f, 0x6b88757f, 0x6bbedbff, 0x6bf5007f, 0x6c2ae1ff, 0x6c6080ff,
-    0x6c95dcff, 0x6ccaf5ff, 0x6cffcbff, 0x6d345eff, 0x6d68adff, 0x6d9cb9ff,
-    0x6dd0827f, 0x6e0406ff, 0x6e37477f, 0x6e6a447f, 0x6e9cfcff, 0x6ecf717f,
-    0x6f01a17f, 0x6f338cff, 0x6f6533ff, 0x6f9695ff, 0x6fc7b37f, 0x6ff88bff,
-    0x70291eff, 0x70596d7f, 0x7089767f, 0x70b939ff, 0x70e8b77f, 0x7117efff,
-    0x7146e27f, 0x71758eff, 0x71a3f5ff, 0x71d2167f, 0x71fff07f, 0x722d84ff,
-    0x725ad27f, 0x7287d97f, 0x72b499ff, 0x72e1137f, 0x730d467f, 0x733931ff,
-    0x7364d6ff, 0x7390347f, 0x73bb4a7f, 0x73e6197f, 0x7410a0ff, 0x743ae0ff,
-    0x7464d8ff, 0x748e88ff, 0x74b7f17f, 0x74e111ff, 0x7509ea7f, 0x75327a7f,
-    0x755ac27f, 0x7582c1ff, 0x75aa787f, 0x75d1e6ff, 0x75f90cff, 0x761fe97f,
-    0x76467dff, 0x766cc8ff, 0x7692caff, 0x76b883ff, 0x76ddf37f, 0x770319ff,
-    0x7727f6ff, 0x774c89ff, 0x7770d3ff, 0x7794d3ff, 0x77b88a7f, 0x77dbf6ff,
-    0x77ff19ff, 0x7821f27f, 0x784480ff, 0x7866c4ff, 0x7888bf7f, 0x78aa6eff,
-    0x78cbd3ff, 0x78eceeff, 0x790dbeff, 0x792e447f, 0x794e7f7f, 0x796e6eff,
-    0x798e13ff, 0x79ad6dff, 0x79cc7cff, 0x79eb40ff, 0x7a09b97f, 0x7a27e6ff,
-    0x7a45c8ff, 0x7a635f7f, 0x7a80aa7f, 0x7a9da9ff, 0x7aba5dff, 0x7ad6c5ff,
-    0x7af2e27f, 0x7b0eb2ff, 0x7b2a377f, 0x7b45707f, 0x7b605cff, 0x7b7afd7f,
-    0x7b9551ff, 0x7baf59ff, 0x7bc915ff, 0x7be2857f, 0x7bfba87f, 0x7c147eff,
-    0x7c2d08ff, 0x7c45467f, 0x7c5d36ff, 0x7c74db7f, 0x7c8c327f, 0x7ca33cff,
-    0x7cb9fa7f, 0x7cd06b7f, 0x7ce68eff, 0x7cfc657f, 0x7d11eeff, 0x7d272b7f,
-    0x7d3c1a7f, 0x7d50bc7f, 0x7d6510ff, 0x7d79187f, 0x7d8cd1ff, 0x7da03e7f,
-    0x7db35d7f, 0x7dc62eff, 0x7dd8b2ff, 0x7deae8ff, 0x7dfcd17f, 0x7e0e6c7f,
-    0x7e1fb97f, 0x7e30b87f, 0x7e4169ff, 0x7e51cd7f, 0x7e61e2ff, 0x7e71aa7f,
-    0x7e81247f, 0x7e904fff, 0x7e9f2d7f, 0x7eadbcff, 0x7ebbfdff, 0x7ec9f0ff,
-    0x7ed795ff, 0x7ee4ecff, 0x7ef1f4ff, 0x7efeaeff, 0x7f0b1aff, 0x7f17387f,
-    0x7f23077f, 0x7f2e87ff, 0x7f39b9ff, 0x7f449d7f, 0x7f4f327f, 0x7f5978ff,
-    0x7f63717f, 0x7f6d1a7f, 0x7f76757f, 0x7f7f81ff, 0x7f883f7f, 0x7f90adff,
-    0x7f98ce7f, 0x7fa09fff, 0x7fa8227f, 0x7faf56ff, 0x7fb63bff, 0x7fbcd27f,
-    0x7fc319ff, 0x7fc912ff, 0x7fcebcff, 0x7fd4187f, 0x7fd924ff, 0x7fdde27f,
-    0x7fe250ff, 0x7fe6707f, 0x7fea417f, 0x7fedc37f, 0x7ff0f67f, 0x7ff3da7f,
-    0x7ff66fff, 0x7ff8b5ff, 0x7ffaad7f, 0x7ffc55ff, 0x7ffdaeff, 0x7ffeb97f,
-    0x7fff74ff, 0x7fffe1ff};
+  0x000c90fd, 0x007118dc, 0x00d5a074, 0x013a2789, 0x019eaddd, 0x0203332f,
+  0x0267b747, 0x02cc39df, 0x0330babf, 0x039539a7, 0x03f9b65b, 0x045e3097,
+  0x04c2a827, 0x05271cc7, 0x058b8e2f, 0x05effc37, 0x0654668f, 0x06b8cd07,
+  0x071d2f4f, 0x07818d3f, 0x07e5e687, 0x084a3aef, 0x08ae8a3f, 0x0912d42f,
+  0x0977187f, 0x09db56ff, 0x0a3f8f6f, 0x0aa3c18f, 0x0b07ed1f, 0x0b6c11cf,
+  0x0bd02f7f, 0x0c3445ef, 0x0c9854cf, 0x0cfc5bef, 0x0d605aff, 0x0dc451df,
+  0x0e28402f, 0x0e8c25cf, 0x0ef0027f, 0x0f53d5ef, 0x0fb79fdf, 0x101b601f,
+  0x107f167f, 0x10e2c2bf, 0x1146647f, 0x11a9fb7f, 0x120d87bf, 0x127108df,
+  0x12d47e7f, 0x1337e89f, 0x139b46bf, 0x13fe98ff, 0x1461debf, 0x14c517ff,
+  0x1528445f, 0x158b63bf, 0x15ee75bf, 0x16517a5f, 0x16b4711f, 0x171759df,
+  0x177a345f, 0x17dd007f, 0x183fbdbf, 0x18a26c1f, 0x19050b3f, 0x19679aff,
+  0x19ca1b1f, 0x1a2c8b3f, 0x1a8eeb3f, 0x1af13adf, 0x1b5379df, 0x1bb5a7ff,
+  0x1c17c51f, 0x1c79d0df, 0x1cdbcaff, 0x1d3db35f, 0x1d9f89bf, 0x1e014dbf,
+  0x1e62ff3f, 0x1ec49e1f, 0x1f2629df, 0x1f87a27f, 0x1fe9079f, 0x204a593f,
+  0x20ab96bf, 0x210cbfff, 0x216dd53f, 0x21ced57f, 0x222fc0ff, 0x2290977f,
+  0x22f158bf, 0x2352043f, 0x23b299ff, 0x241319bf, 0x2473833f, 0x24d3d63f,
+  0x253412bf, 0x259437ff, 0x25f4463f, 0x26543cff, 0x26b41bff, 0x2713e33f,
+  0x2773927f, 0x27d3293f, 0x2832a77f, 0x28920cff, 0x28f1597f, 0x29508cbf,
+  0x29afa63f, 0x2a0ea63f, 0x2a6d8c3f, 0x2acc583f, 0x2b2b09bf, 0x2b89a07f,
+  0x2be81c7f, 0x2c467d3f, 0x2ca4c2ff, 0x2d02ecff, 0x2d60fb3f, 0x2dbeed7f,
+  0x2e1cc37f, 0x2e7a7d3f, 0x2ed81a3f, 0x2f359a3f, 0x2f92fd3f, 0x2ff042bf,
+  0x304d6abf, 0x30aa74ff, 0x3107613f, 0x31642f3f, 0x31c0debf, 0x321d6f7f,
+  0x3279e13f, 0x32d633ff, 0x3332677f, 0x338e7b3f, 0x33ea6f3f, 0x3446433f,
+  0x34a1f6ff, 0x34fd8a3f, 0x3558fcbf, 0x35b44e7f, 0x360f7eff, 0x366a8e3f,
+  0x36c57bff, 0x372047bf, 0x377af1bf, 0x37d5793f, 0x382fde7f, 0x388a20ff,
+  0x38e4407f, 0x393e3d3f, 0x3998167f, 0x39f1cc3f, 0x3a4b5dff, 0x3aa4cbff,
+  0x3afe15ff, 0x3b573b7f, 0x3bb03c3f, 0x3c09183f, 0x3c61cf3f, 0x3cba60ff,
+  0x3d12cd3f, 0x3d6b13ff, 0x3dc334bf, 0x3e1b2f3f, 0x3e73037f, 0x3ecab17f,
+  0x3f22387f, 0x3f79987f, 0x3fd0d17f, 0x4027e2ff, 0x407eccff, 0x40d58f7f,
+  0x412c297f, 0x41829b7f, 0x41d8e57f, 0x422f067f, 0x4284fe7f, 0x42dacdff,
+  0x4330737f, 0x4385efff, 0x43db42ff, 0x44306bff, 0x44856aff, 0x44da3f7f,
+  0x452ee97f, 0x458368ff, 0x45d7bdff, 0x462be77f, 0x467fe57f, 0x46d3b87f,
+  0x47275f7f, 0x477ada7f, 0x47ce297f, 0x48214c7f, 0x4874427f, 0x48c70c7f,
+  0x4919a8ff, 0x496c187f, 0x49be5aff, 0x4a106fff, 0x4a6256ff, 0x4ab4107f,
+  0x4b059b7f, 0x4b56f87f, 0x4ba826ff, 0x4bf9267f, 0x4c49f77f, 0x4c9a997f,
+  0x4ceb0bff, 0x4d3b4eff, 0x4d8b627f, 0x4ddb467f, 0x4e2af9ff, 0x4e7a7d7f,
+  0x4ec9d07f, 0x4f18f2ff, 0x4f67e47f, 0x4fb6a4ff, 0x5005347f, 0x5053927f,
+  0x50a1beff, 0x50efb9ff, 0x513d82ff, 0x518b197f, 0x51d87dff, 0x5225afff,
+  0x5272af7f, 0x52bf7bff, 0x530c157f, 0x53587b7f, 0x53a4ae7f, 0x53f0ad7f,
+  0x543c78ff, 0x5488107f, 0x54d373ff, 0x551ea2ff, 0x55699d7f, 0x55b462ff,
+  0x55fef3ff, 0x56494fff, 0x5693767f, 0x56dd67ff, 0x5727237f, 0x5770a97f,
+  0x57b9f97f, 0x580312ff, 0x584bf6ff, 0x5894a3ff, 0x58dd1a7f, 0x592559ff,
+  0x596d627f, 0x59b533ff, 0x59fcce7f, 0x5a4430ff, 0x5a8b5bff, 0x5ad24eff,
+  0x5b1909ff, 0x5b5f8cff, 0x5ba5d77f, 0x5bebe97f, 0x5c31c2ff, 0x5c77637f,
+  0x5cbcca7f, 0x5d01f8ff, 0x5d46ed7f, 0x5d8ba8ff, 0x5dd02a7f, 0x5e1471ff,
+  0x5e587fff, 0x5e9c537f, 0x5edfec7f, 0x5f234aff, 0x5f666eff, 0x5fa957ff,
+  0x5fec05ff, 0x602e78ff, 0x6070b07f, 0x60b2ac7f, 0x60f46cff, 0x6135f17f,
+  0x617739ff, 0x61b8467f, 0x61f916ff, 0x6239aaff, 0x627a01ff, 0x62ba1c7f,
+  0x62f9f9ff, 0x63399a7f, 0x6378fdff, 0x63b823ff, 0x63f70bff, 0x6435b6ff,
+  0x647423ff, 0x64b252ff, 0x64f043ff, 0x652df67f, 0x656b6a7f, 0x65a8a07f,
+  0x65e5977f, 0x66224f7f, 0x665ec87f, 0x669b027f, 0x66d6fcff, 0x6712b7ff,
+  0x674e33ff, 0x67896f7f, 0x67c46b7f, 0x67ff27ff, 0x6839a37f, 0x6873deff,
+  0x68adda7f, 0x68e794ff, 0x69210eff, 0x695a47ff, 0x69933fff, 0x69cbf6ff,
+  0x6a046c7f, 0x6a3ca07f, 0x6a74937f, 0x6aac447f, 0x6ae3b37f, 0x6b1ae0ff,
+  0x6b51cc7f, 0x6b88757f, 0x6bbedbff, 0x6bf5007f, 0x6c2ae1ff, 0x6c6080ff,
+  0x6c95dcff, 0x6ccaf5ff, 0x6cffcbff, 0x6d345eff, 0x6d68adff, 0x6d9cb9ff,
+  0x6dd0827f, 0x6e0406ff, 0x6e37477f, 0x6e6a447f, 0x6e9cfcff, 0x6ecf717f,
+  0x6f01a17f, 0x6f338cff, 0x6f6533ff, 0x6f9695ff, 0x6fc7b37f, 0x6ff88bff,
+  0x70291eff, 0x70596d7f, 0x7089767f, 0x70b939ff, 0x70e8b77f, 0x7117efff,
+  0x7146e27f, 0x71758eff, 0x71a3f5ff, 0x71d2167f, 0x71fff07f, 0x722d84ff,
+  0x725ad27f, 0x7287d97f, 0x72b499ff, 0x72e1137f, 0x730d467f, 0x733931ff,
+  0x7364d6ff, 0x7390347f, 0x73bb4a7f, 0x73e6197f, 0x7410a0ff, 0x743ae0ff,
+  0x7464d8ff, 0x748e88ff, 0x74b7f17f, 0x74e111ff, 0x7509ea7f, 0x75327a7f,
+  0x755ac27f, 0x7582c1ff, 0x75aa787f, 0x75d1e6ff, 0x75f90cff, 0x761fe97f,
+  0x76467dff, 0x766cc8ff, 0x7692caff, 0x76b883ff, 0x76ddf37f, 0x770319ff,
+  0x7727f6ff, 0x774c89ff, 0x7770d3ff, 0x7794d3ff, 0x77b88a7f, 0x77dbf6ff,
+  0x77ff19ff, 0x7821f27f, 0x784480ff, 0x7866c4ff, 0x7888bf7f, 0x78aa6eff,
+  0x78cbd3ff, 0x78eceeff, 0x790dbeff, 0x792e447f, 0x794e7f7f, 0x796e6eff,
+  0x798e13ff, 0x79ad6dff, 0x79cc7cff, 0x79eb40ff, 0x7a09b97f, 0x7a27e6ff,
+  0x7a45c8ff, 0x7a635f7f, 0x7a80aa7f, 0x7a9da9ff, 0x7aba5dff, 0x7ad6c5ff,
+  0x7af2e27f, 0x7b0eb2ff, 0x7b2a377f, 0x7b45707f, 0x7b605cff, 0x7b7afd7f,
+  0x7b9551ff, 0x7baf59ff, 0x7bc915ff, 0x7be2857f, 0x7bfba87f, 0x7c147eff,
+  0x7c2d08ff, 0x7c45467f, 0x7c5d36ff, 0x7c74db7f, 0x7c8c327f, 0x7ca33cff,
+  0x7cb9fa7f, 0x7cd06b7f, 0x7ce68eff, 0x7cfc657f, 0x7d11eeff, 0x7d272b7f,
+  0x7d3c1a7f, 0x7d50bc7f, 0x7d6510ff, 0x7d79187f, 0x7d8cd1ff, 0x7da03e7f,
+  0x7db35d7f, 0x7dc62eff, 0x7dd8b2ff, 0x7deae8ff, 0x7dfcd17f, 0x7e0e6c7f,
+  0x7e1fb97f, 0x7e30b87f, 0x7e4169ff, 0x7e51cd7f, 0x7e61e2ff, 0x7e71aa7f,
+  0x7e81247f, 0x7e904fff, 0x7e9f2d7f, 0x7eadbcff, 0x7ebbfdff, 0x7ec9f0ff,
+  0x7ed795ff, 0x7ee4ecff, 0x7ef1f4ff, 0x7efeaeff, 0x7f0b1aff, 0x7f17387f,
+  0x7f23077f, 0x7f2e87ff, 0x7f39b9ff, 0x7f449d7f, 0x7f4f327f, 0x7f5978ff,
+  0x7f63717f, 0x7f6d1a7f, 0x7f76757f, 0x7f7f81ff, 0x7f883f7f, 0x7f90adff,
+  0x7f98ce7f, 0x7fa09fff, 0x7fa8227f, 0x7faf56ff, 0x7fb63bff, 0x7fbcd27f,
+  0x7fc319ff, 0x7fc912ff, 0x7fcebcff, 0x7fd4187f, 0x7fd924ff, 0x7fdde27f,
+  0x7fe250ff, 0x7fe6707f, 0x7fea417f, 0x7fedc37f, 0x7ff0f67f, 0x7ff3da7f,
+  0x7ff66fff, 0x7ff8b5ff, 0x7ffaad7f, 0x7ffc55ff, 0x7ffdaeff, 0x7ffeb97f,
+  0x7fff74ff, 0x7fffe1ff};
 
 const WORD32 ixheaacd_pre_post_twid_cos_384[384] = {
-    0x7ffffeff, 0x7fffa6ff, 0x7ffec2ff, 0x7ffd527f, 0x7ffb55ff, 0x7ff8cc7f,
-    0x7ff5b6ff, 0x7ff2157f, 0x7fede6ff, 0x7fe92cff, 0x7fe3e5ff, 0x7fde12ff,
-    0x7fd7b3ff, 0x7fd0c87f, 0x7fc950ff, 0x7fc14d7f, 0x7fb8bd7f, 0x7fafa1ff,
-    0x7fa5f9ff, 0x7f9bc5ff, 0x7f91067f, 0x7f85baff, 0x7f79e37f, 0x7f6d7fff,
-    0x7f6090ff, 0x7f53167f, 0x7f450fff, 0x7f367dff, 0x7f27607f, 0x7f17b7ff,
-    0x7f07837f, 0x7ef6c3ff, 0x7ee5797f, 0x7ed3a37f, 0x7ec1427f, 0x7eae567f,
-    0x7e9adf7f, 0x7e86ddff, 0x7e72517f, 0x7e5d39ff, 0x7e47987f, 0x7e316bff,
-    0x7e1ab57f, 0x7e03747f, 0x7deba97f, 0x7dd3547f, 0x7dba74ff, 0x7da10bff,
-    0x7d87197f, 0x7d6c9cff, 0x7d5196ff, 0x7d36077f, 0x7d19ee7f, 0x7cfd4cff,
-    0x7ce021ff, 0x7cc26dff, 0x7ca430ff, 0x7c856b7f, 0x7c661d7f, 0x7c46477f,
-    0x7c25e87f, 0x7c0501ff, 0x7be392ff, 0x7bc19c7f, 0x7b9f1dff, 0x7b7c17ff,
-    0x7b588a7f, 0x7b3475ff, 0x7b0fd9ff, 0x7aeab77f, 0x7ac50dff, 0x7a9eddff,
-    0x7a7826ff, 0x7a50ea7f, 0x7a2926ff, 0x7a00ddff, 0x79d80f7f, 0x79aebaff,
-    0x7984e0ff, 0x795a81ff, 0x792f9dff, 0x790434ff, 0x78d846ff, 0x78abd47f,
-    0x787eddff, 0x785162ff, 0x7823647f, 0x77f4e1ff, 0x77c5dbff, 0x7796527f,
-    0x776645ff, 0x7735b67f, 0x7704a47f, 0x76d30fff, 0x76a0f8ff, 0x766e5f7f,
-    0x763b44ff, 0x7607a7ff, 0x75d389ff, 0x759eeaff, 0x7569ca7f, 0x7534297f,
-    0x74fe07ff, 0x74c765ff, 0x7490447f, 0x7458a27f, 0x7420817f, 0x73e7e07f,
-    0x73aec0ff, 0x7375227f, 0x733b04ff, 0x7300697f, 0x72c54fff, 0x7289b7ff,
-    0x724da2ff, 0x7211107f, 0x71d400ff, 0x7196747f, 0x71586b7f, 0x7119e5ff,
-    0x70dae4ff, 0x709b67ff, 0x705b6eff, 0x701afb7f, 0x6fda0c7f, 0x6f98a37f,
-    0x6f56bf7f, 0x6f14617f, 0x6ed189ff, 0x6e8e38ff, 0x6e4a6e7f, 0x6e062aff,
-    0x6dc16eff, 0x6d7c3a7f, 0x6d368dff, 0x6cf069ff, 0x6ca9cdff, 0x6c62bb7f,
-    0x6c1b317f, 0x6bd3317f, 0x6b8abaff, 0x6b41ce7f, 0x6af86c7f, 0x6aae94ff,
-    0x6a64487f, 0x6a19877f, 0x69ce527f, 0x6982a8ff, 0x69368bff, 0x68e9fb7f,
-    0x689cf7ff, 0x684f817f, 0x680198ff, 0x67b33dff, 0x676471ff, 0x671533ff,
-    0x66c584ff, 0x6675657f, 0x6624d57f, 0x65d3d57f, 0x658265ff, 0x653086ff,
-    0x64de397f, 0x648b7cff, 0x643851ff, 0x63e4b97f, 0x6390b37f, 0x633c3fff,
-    0x62e75f7f, 0x629212ff, 0x623c5a7f, 0x61e635ff, 0x618fa5ff, 0x6138aaff,
-    0x60e1457f, 0x608975ff, 0x60313c7f, 0x5fd8997f, 0x5f7f8d7f, 0x5f26187f,
-    0x5ecc3aff, 0x5e71f5ff, 0x5e17497f, 0x5dbc357f, 0x5d60ba7f, 0x5d04d97f,
-    0x5ca8927f, 0x5c4be57f, 0x5beed37f, 0x5b915cff, 0x5b3381ff, 0x5ad5427f,
-    0x5a769fff, 0x5a1799ff, 0x59b830ff, 0x595865ff, 0x58f8387f, 0x5897a9ff,
-    0x5836b9ff, 0x57d5697f, 0x5773b87f, 0x5711a77f, 0x56af377f, 0x564c67ff,
-    0x55e939ff, 0x5585ad7f, 0x5521c37f, 0x54bd7c7f, 0x5458d7ff, 0x53f3d6ff,
-    0x538e7a7f, 0x5328c1ff, 0x52c2adff, 0x525c3f7f, 0x51f576ff, 0x518e547f,
-    0x5126d7ff, 0x50bf02ff, 0x5056d57f, 0x4fee4fff, 0x4f85727f, 0x4f1c3dff,
-    0x4eb2b27f, 0x4e48d0ff, 0x4dde997f, 0x4d740c7f, 0x4d092a7f, 0x4c9df47f,
-    0x4c3269ff, 0x4bc68bff, 0x4b5a5aff, 0x4aedd77f, 0x4a8101ff, 0x4a13da7f,
-    0x49a6617f, 0x493897ff, 0x48ca7e7f, 0x485c14ff, 0x47ed5bff, 0x477e53ff,
-    0x470efdff, 0x469f597f, 0x462f67ff, 0x45bf297f, 0x454e9e7f, 0x44ddc77f,
-    0x446ca4ff, 0x43fb377f, 0x43897eff, 0x43177cff, 0x42a530ff, 0x42329bff,
-    0x41bfbeff, 0x414c98ff, 0x40d92bff, 0x4065777f, 0x3ff17cbf, 0x3f7d3bbf,
-    0x3f08b4ff, 0x3e93e93f, 0x3e1ed8ff, 0x3da9843f, 0x3d33ec3f, 0x3cbe10ff,
-    0x3c47f2ff, 0x3bd192ff, 0x3b5af17f, 0x3ae40ebf, 0x3a6ceb7f, 0x39f5883f,
-    0x397de57f, 0x3906037f, 0x388de2ff, 0x3815847f, 0x379ce87f, 0x37240f7f,
-    0x36aaf9ff, 0x3631a8bf, 0x35b81bff, 0x353e543f, 0x34c451ff, 0x344a15ff,
-    0x33cfa0bf, 0x3354f27f, 0x32da0c3f, 0x325eedff, 0x31e3987f, 0x31680c7f,
-    0x30ec49ff, 0x307051ff, 0x2ff424ff, 0x2f77c33f, 0x2efb2d7f, 0x2e7e643f,
-    0x2e0167ff, 0x2d84397f, 0x2d06d8bf, 0x2c8946bf, 0x2c0b83ff, 0x2b8d90bf,
-    0x2b0f6dff, 0x2a911bbf, 0x2a129aff, 0x2993ec3f, 0x29150fbf, 0x289605ff,
-    0x2816cfff, 0x27976dff, 0x2717e07f, 0x2698283f, 0x2618457f, 0x259838ff,
-    0x2518037f, 0x2497a4ff, 0x24171ebf, 0x2396707f, 0x23159b7f, 0x22949fff,
-    0x22137e7f, 0x219237bf, 0x2110cbff, 0x208f3c3f, 0x200d887f, 0x1f8bb1bf,
-    0x1f09b87f, 0x1e879cff, 0x1e05601f, 0x1d83025f, 0x1d00843f, 0x1c7de63f,
-    0x1bfb291f, 0x1b784d3f, 0x1af5531f, 0x1a723b9f, 0x19ef06ff, 0x196bb5ff,
-    0x18e8491f, 0x1864c0df, 0x17e11dff, 0x175d60df, 0x16d989ff, 0x16559a3f,
-    0x15d191df, 0x154d719f, 0x14c93a1f, 0x1444eb9f, 0x13c086ff, 0x133c0cbf,
-    0x12b77d5f, 0x1232d97f, 0x11ae219f, 0x1129565f, 0x10a4783f, 0x101f87ff,
-    0x0f9a85ff, 0x0f1572df, 0x0e904f2f, 0x0e0b1b8f, 0x0d85d88f, 0x0d0086af,
-    0x0c7b268f, 0x0bf5b8cf, 0x0b703ddf, 0x0aeab66f, 0x0a6522ff, 0x09df842f,
-    0x0959da7f, 0x08d4269f, 0x084e68ff, 0x07c8a24f, 0x0742d30f, 0x06bcfbdf,
-    0x06371d47, 0x05b137df, 0x052b4c37, 0x04a55ae7, 0x041f647f, 0x0399698f,
-    0x03136aaf, 0x028d686f, 0x02076363, 0x01815c1b, 0x00fb532f, 0x0075492e};
+  0x7ffffeff, 0x7fffa6ff, 0x7ffec2ff, 0x7ffd527f, 0x7ffb55ff, 0x7ff8cc7f,
+  0x7ff5b6ff, 0x7ff2157f, 0x7fede6ff, 0x7fe92cff, 0x7fe3e5ff, 0x7fde12ff,
+  0x7fd7b3ff, 0x7fd0c87f, 0x7fc950ff, 0x7fc14d7f, 0x7fb8bd7f, 0x7fafa1ff,
+  0x7fa5f9ff, 0x7f9bc5ff, 0x7f91067f, 0x7f85baff, 0x7f79e37f, 0x7f6d7fff,
+  0x7f6090ff, 0x7f53167f, 0x7f450fff, 0x7f367dff, 0x7f27607f, 0x7f17b7ff,
+  0x7f07837f, 0x7ef6c3ff, 0x7ee5797f, 0x7ed3a37f, 0x7ec1427f, 0x7eae567f,
+  0x7e9adf7f, 0x7e86ddff, 0x7e72517f, 0x7e5d39ff, 0x7e47987f, 0x7e316bff,
+  0x7e1ab57f, 0x7e03747f, 0x7deba97f, 0x7dd3547f, 0x7dba74ff, 0x7da10bff,
+  0x7d87197f, 0x7d6c9cff, 0x7d5196ff, 0x7d36077f, 0x7d19ee7f, 0x7cfd4cff,
+  0x7ce021ff, 0x7cc26dff, 0x7ca430ff, 0x7c856b7f, 0x7c661d7f, 0x7c46477f,
+  0x7c25e87f, 0x7c0501ff, 0x7be392ff, 0x7bc19c7f, 0x7b9f1dff, 0x7b7c17ff,
+  0x7b588a7f, 0x7b3475ff, 0x7b0fd9ff, 0x7aeab77f, 0x7ac50dff, 0x7a9eddff,
+  0x7a7826ff, 0x7a50ea7f, 0x7a2926ff, 0x7a00ddff, 0x79d80f7f, 0x79aebaff,
+  0x7984e0ff, 0x795a81ff, 0x792f9dff, 0x790434ff, 0x78d846ff, 0x78abd47f,
+  0x787eddff, 0x785162ff, 0x7823647f, 0x77f4e1ff, 0x77c5dbff, 0x7796527f,
+  0x776645ff, 0x7735b67f, 0x7704a47f, 0x76d30fff, 0x76a0f8ff, 0x766e5f7f,
+  0x763b44ff, 0x7607a7ff, 0x75d389ff, 0x759eeaff, 0x7569ca7f, 0x7534297f,
+  0x74fe07ff, 0x74c765ff, 0x7490447f, 0x7458a27f, 0x7420817f, 0x73e7e07f,
+  0x73aec0ff, 0x7375227f, 0x733b04ff, 0x7300697f, 0x72c54fff, 0x7289b7ff,
+  0x724da2ff, 0x7211107f, 0x71d400ff, 0x7196747f, 0x71586b7f, 0x7119e5ff,
+  0x70dae4ff, 0x709b67ff, 0x705b6eff, 0x701afb7f, 0x6fda0c7f, 0x6f98a37f,
+  0x6f56bf7f, 0x6f14617f, 0x6ed189ff, 0x6e8e38ff, 0x6e4a6e7f, 0x6e062aff,
+  0x6dc16eff, 0x6d7c3a7f, 0x6d368dff, 0x6cf069ff, 0x6ca9cdff, 0x6c62bb7f,
+  0x6c1b317f, 0x6bd3317f, 0x6b8abaff, 0x6b41ce7f, 0x6af86c7f, 0x6aae94ff,
+  0x6a64487f, 0x6a19877f, 0x69ce527f, 0x6982a8ff, 0x69368bff, 0x68e9fb7f,
+  0x689cf7ff, 0x684f817f, 0x680198ff, 0x67b33dff, 0x676471ff, 0x671533ff,
+  0x66c584ff, 0x6675657f, 0x6624d57f, 0x65d3d57f, 0x658265ff, 0x653086ff,
+  0x64de397f, 0x648b7cff, 0x643851ff, 0x63e4b97f, 0x6390b37f, 0x633c3fff,
+  0x62e75f7f, 0x629212ff, 0x623c5a7f, 0x61e635ff, 0x618fa5ff, 0x6138aaff,
+  0x60e1457f, 0x608975ff, 0x60313c7f, 0x5fd8997f, 0x5f7f8d7f, 0x5f26187f,
+  0x5ecc3aff, 0x5e71f5ff, 0x5e17497f, 0x5dbc357f, 0x5d60ba7f, 0x5d04d97f,
+  0x5ca8927f, 0x5c4be57f, 0x5beed37f, 0x5b915cff, 0x5b3381ff, 0x5ad5427f,
+  0x5a769fff, 0x5a1799ff, 0x59b830ff, 0x595865ff, 0x58f8387f, 0x5897a9ff,
+  0x5836b9ff, 0x57d5697f, 0x5773b87f, 0x5711a77f, 0x56af377f, 0x564c67ff,
+  0x55e939ff, 0x5585ad7f, 0x5521c37f, 0x54bd7c7f, 0x5458d7ff, 0x53f3d6ff,
+  0x538e7a7f, 0x5328c1ff, 0x52c2adff, 0x525c3f7f, 0x51f576ff, 0x518e547f,
+  0x5126d7ff, 0x50bf02ff, 0x5056d57f, 0x4fee4fff, 0x4f85727f, 0x4f1c3dff,
+  0x4eb2b27f, 0x4e48d0ff, 0x4dde997f, 0x4d740c7f, 0x4d092a7f, 0x4c9df47f,
+  0x4c3269ff, 0x4bc68bff, 0x4b5a5aff, 0x4aedd77f, 0x4a8101ff, 0x4a13da7f,
+  0x49a6617f, 0x493897ff, 0x48ca7e7f, 0x485c14ff, 0x47ed5bff, 0x477e53ff,
+  0x470efdff, 0x469f597f, 0x462f67ff, 0x45bf297f, 0x454e9e7f, 0x44ddc77f,
+  0x446ca4ff, 0x43fb377f, 0x43897eff, 0x43177cff, 0x42a530ff, 0x42329bff,
+  0x41bfbeff, 0x414c98ff, 0x40d92bff, 0x4065777f, 0x3ff17cbf, 0x3f7d3bbf,
+  0x3f08b4ff, 0x3e93e93f, 0x3e1ed8ff, 0x3da9843f, 0x3d33ec3f, 0x3cbe10ff,
+  0x3c47f2ff, 0x3bd192ff, 0x3b5af17f, 0x3ae40ebf, 0x3a6ceb7f, 0x39f5883f,
+  0x397de57f, 0x3906037f, 0x388de2ff, 0x3815847f, 0x379ce87f, 0x37240f7f,
+  0x36aaf9ff, 0x3631a8bf, 0x35b81bff, 0x353e543f, 0x34c451ff, 0x344a15ff,
+  0x33cfa0bf, 0x3354f27f, 0x32da0c3f, 0x325eedff, 0x31e3987f, 0x31680c7f,
+  0x30ec49ff, 0x307051ff, 0x2ff424ff, 0x2f77c33f, 0x2efb2d7f, 0x2e7e643f,
+  0x2e0167ff, 0x2d84397f, 0x2d06d8bf, 0x2c8946bf, 0x2c0b83ff, 0x2b8d90bf,
+  0x2b0f6dff, 0x2a911bbf, 0x2a129aff, 0x2993ec3f, 0x29150fbf, 0x289605ff,
+  0x2816cfff, 0x27976dff, 0x2717e07f, 0x2698283f, 0x2618457f, 0x259838ff,
+  0x2518037f, 0x2497a4ff, 0x24171ebf, 0x2396707f, 0x23159b7f, 0x22949fff,
+  0x22137e7f, 0x219237bf, 0x2110cbff, 0x208f3c3f, 0x200d887f, 0x1f8bb1bf,
+  0x1f09b87f, 0x1e879cff, 0x1e05601f, 0x1d83025f, 0x1d00843f, 0x1c7de63f,
+  0x1bfb291f, 0x1b784d3f, 0x1af5531f, 0x1a723b9f, 0x19ef06ff, 0x196bb5ff,
+  0x18e8491f, 0x1864c0df, 0x17e11dff, 0x175d60df, 0x16d989ff, 0x16559a3f,
+  0x15d191df, 0x154d719f, 0x14c93a1f, 0x1444eb9f, 0x13c086ff, 0x133c0cbf,
+  0x12b77d5f, 0x1232d97f, 0x11ae219f, 0x1129565f, 0x10a4783f, 0x101f87ff,
+  0x0f9a85ff, 0x0f1572df, 0x0e904f2f, 0x0e0b1b8f, 0x0d85d88f, 0x0d0086af,
+  0x0c7b268f, 0x0bf5b8cf, 0x0b703ddf, 0x0aeab66f, 0x0a6522ff, 0x09df842f,
+  0x0959da7f, 0x08d4269f, 0x084e68ff, 0x07c8a24f, 0x0742d30f, 0x06bcfbdf,
+  0x06371d47, 0x05b137df, 0x052b4c37, 0x04a55ae7, 0x041f647f, 0x0399698f,
+  0x03136aaf, 0x028d686f, 0x02076363, 0x01815c1b, 0x00fb532f, 0x0075492e};
 
 const WORD32 ixheaacd_pre_post_twid_sin_384[384] = {
-    0x0010c152, 0x0096cbc0, 0x011cd589, 0x01a2de1b, 0x0228e4df, 0x02aee947,
-    0x0334eabf, 0x03bae8af, 0x0440e28f, 0x04c6d7bf, 0x054cc7af, 0x05d2b1d7,
-    0x06589597, 0x06de725f, 0x076447a7, 0x07ea14cf, 0x086fd93f, 0x08f5947f,
-    0x097b45df, 0x0a00ecef, 0x0a8688ef, 0x0b0c196f, 0x0b919dcf, 0x0c17157f,
-    0x0c9c7fef, 0x0d21dc7f, 0x0da72abf, 0x0e2c69ef, 0x0eb1999f, 0x0f36b92f,
-    0x0fbbc81f, 0x1040c5bf, 0x10c5b17f, 0x114a8aff, 0x11cf515f, 0x1254045f,
-    0x12d8a31f, 0x135d2d5f, 0x13e1a23f, 0x1466015f, 0x14ea4a1f, 0x156e7bff,
-    0x15f2963f, 0x1676987f, 0x16fa821f, 0x177e527f, 0x1802091f, 0x1885a57f,
-    0x190926df, 0x198c8cdf, 0x1a0fd6df, 0x1a93043f, 0x1b16147f, 0x1b9906ff,
-    0x1c1bdb3f, 0x1c9e90bf, 0x1d2126bf, 0x1da39cdf, 0x1e25f27f, 0x1ea826ff,
-    0x1f2a39ff, 0x1fac2abf, 0x202df8bf, 0x20afa37f, 0x21312a7f, 0x21b28cff,
-    0x2233ca7f, 0x22b4e27f, 0x2335d47f, 0x23b69fbf, 0x243743ff, 0x24b7c07f,
-    0x253814bf, 0x25b83fff, 0x263841ff, 0x26b81a3f, 0x2737c7ff, 0x27b74a7f,
-    0x2836a1bf, 0x28b5ccbf, 0x2934caff, 0x29b39c3f, 0x2a323f7f, 0x2ab0b4bf,
-    0x2b2efb3f, 0x2bad123f, 0x2c2af93f, 0x2ca8afff, 0x2d26357f, 0x2da389bf,
-    0x2e20abff, 0x2e9d9b7f, 0x2f1a57bf, 0x2f96e0bf, 0x3013353f, 0x308f54ff,
-    0x310b3fbf, 0x3186f47f, 0x320272ff, 0x327dbabf, 0x32f8caff, 0x3373a37f,
-    0x33ee437f, 0x3468aa7f, 0x34e2d7ff, 0x355ccb7f, 0x35d684bf, 0x365002bf,
-    0x36c944ff, 0x37424b7f, 0x37bb153f, 0x3833a1ff, 0x38abf0ff, 0x392401bf,
-    0x399bd3ff, 0x3a1366ff, 0x3a8aba7f, 0x3b01cd7f, 0x3b789fff, 0x3bef313f,
-    0x3c6580bf, 0x3cdb8dff, 0x3d51587f, 0x3dc6dfbf, 0x3e3c237f, 0x3eb122bf,
-    0x3f25dd3f, 0x3f9a527f, 0x400e81ff, 0x40826b7f, 0x40f60dff, 0x4169697f,
-    0x41dc7cff, 0x424f487f, 0x42c1caff, 0x4334047f, 0x43a5f3ff, 0x4417997f,
-    0x4488f47f, 0x44fa047f, 0x456ac87f, 0x45db407f, 0x464b6b7f, 0x46bb49ff,
-    0x472ada7f, 0x479a1d7f, 0x4809117f, 0x4877b67f, 0x48e60c7f, 0x495411ff,
-    0x49c1c77f, 0x4a2f2bff, 0x4a9c3eff, 0x4b09007f, 0x4b756eff, 0x4be18b7f,
-    0x4c4d547f, 0x4cb8c9ff, 0x4d23eaff, 0x4d8eb77f, 0x4df92f7f, 0x4e63517f,
-    0x4ecd1d7f, 0x4f3692ff, 0x4f9fb1ff, 0x5008797f, 0x5070e8ff, 0x50d9007f,
-    0x5140bf7f, 0x51a8257f, 0x520f317f, 0x5275e3ff, 0x52dc3b7f, 0x5342387f,
-    0x53a7d9ff, 0x540d1fff, 0x5472097f, 0x54d696ff, 0x553ac6ff, 0x559e997f,
-    0x56020e7f, 0x5665247f, 0x56c7dc7f, 0x572a34ff, 0x578c2d7f, 0x57edc67f,
-    0x584efeff, 0x58afd67f, 0x59104cff, 0x597061ff, 0x59d0147f, 0x5a2f647f,
-    0x5a8e51ff, 0x5aecdbff, 0x5b4b01ff, 0x5ba8c3ff, 0x5c06217f, 0x5c631a7f,
-    0x5cbfad7f, 0x5d1bdb7f, 0x5d77a2ff, 0x5dd303ff, 0x5e2dfdff, 0x5e8890ff,
-    0x5ee2bc7f, 0x5f3c7f7f, 0x5f95d9ff, 0x5feecbff, 0x6047547f, 0x609f73ff,
-    0x60f728ff, 0x614e73ff, 0x61a553ff, 0x61fbc8ff, 0x6251d27f, 0x62a7707f,
-    0x62fca1ff, 0x635166ff, 0x63a5beff, 0x63f9a9ff, 0x644d26ff, 0x64a0367f,
-    0x64f2d6ff, 0x6545097f, 0x6596cc7f, 0x65e81fff, 0x663903ff, 0x668977ff,
-    0x66d97b7f, 0x67290dff, 0x67782f7f, 0x67c6df7f, 0x68151d7f, 0x6862e9ff,
-    0x68b0437f, 0x68fd29ff, 0x69499dff, 0x69959dff, 0x69e12a7f, 0x6a2c42ff,
-    0x6a76e67f, 0x6ac115ff, 0x6b0acfff, 0x6b54147f, 0x6b9ce37f, 0x6be53c7f,
-    0x6c2d1eff, 0x6c748aff, 0x6cbb807f, 0x6d01fdff, 0x6d48047f, 0x6d8d92ff,
-    0x6dd2a97f, 0x6e1746ff, 0x6e5b6c7f, 0x6e9f187f, 0x6ee24b7f, 0x6f25047f,
-    0x6f6743ff, 0x6fa908ff, 0x6fea53ff, 0x702b23ff, 0x706b78ff, 0x70ab527f,
-    0x70eab0ff, 0x712992ff, 0x7167f97f, 0x71a5e2ff, 0x71e3507f, 0x722040ff,
-    0x725cb3ff, 0x7298a9ff, 0x72d421ff, 0x730f1bff, 0x734997ff, 0x738395ff,
-    0x73bd147f, 0x73f6147f, 0x742e957f, 0x746696ff, 0x749e18ff, 0x74d51a7f,
-    0x750b9c7f, 0x75419dff, 0x75771e7f, 0x75ac1eff, 0x75e09d7f, 0x76149b7f,
-    0x7648177f, 0x767b11ff, 0x76ad8aff, 0x76df80ff, 0x7710f57f, 0x7741e6ff,
-    0x7772557f, 0x77a2417f, 0x77d1a9ff, 0x78008eff, 0x782ef07f, 0x785cce7f,
-    0x788a27ff, 0x78b6fd7f, 0x78e34eff, 0x790f1b7f, 0x793a637f, 0x7965267f,
-    0x798f63ff, 0x79b91c7f, 0x79e24f7f, 0x7a0afcff, 0x7a33247f, 0x7a5ac5ff,
-    0x7a81e17f, 0x7aa8767f, 0x7ace84ff, 0x7af40c7f, 0x7b190d7f, 0x7b3d877f,
-    0x7b617a7f, 0x7b84e5ff, 0x7ba7c9ff, 0x7bca267f, 0x7bebfb7f, 0x7c0d487f,
-    0x7c2e0cff, 0x7c4e497f, 0x7c6dfdff, 0x7c8d29ff, 0x7cabccff, 0x7cc9e77f,
-    0x7ce7797f, 0x7d0481ff, 0x7d2101ff, 0x7d3cf7ff, 0x7d58657f, 0x7d7348ff,
-    0x7d8da2ff, 0x7da7737f, 0x7dc0b9ff, 0x7dd9767f, 0x7df1a97f, 0x7e0951ff,
-    0x7e206fff, 0x7e3703ff, 0x7e4d0dff, 0x7e628cff, 0x7e77817f, 0x7e8beaff,
-    0x7e9fca7f, 0x7eb31e7f, 0x7ec5e77f, 0x7ed825ff, 0x7ee9d8ff, 0x7efb00ff,
-    0x7f0b9d7f, 0x7f1baeff, 0x7f2b34ff, 0x7f3a2f7f, 0x7f489e7f, 0x7f5681ff,
-    0x7f63d9ff, 0x7f70a5ff, 0x7f7ce67f, 0x7f889aff, 0x7f93c37f, 0x7f9e607f,
-    0x7fa870ff, 0x7fb1f5ff, 0x7fbaeeff, 0x7fc35b7f, 0x7fcb3bff, 0x7fd2907f,
-    0x7fd958ff, 0x7fdf94ff, 0x7fe544ff, 0x7fea687f, 0x7feeffff, 0x7ff30aff,
-    0x7ff6897f, 0x7ff97bff, 0x7ffbe1ff, 0x7ffdbbff, 0x7fff097f, 0x7fffca7f};
+  0x0010c152, 0x0096cbc0, 0x011cd589, 0x01a2de1b, 0x0228e4df, 0x02aee947,
+  0x0334eabf, 0x03bae8af, 0x0440e28f, 0x04c6d7bf, 0x054cc7af, 0x05d2b1d7,
+  0x06589597, 0x06de725f, 0x076447a7, 0x07ea14cf, 0x086fd93f, 0x08f5947f,
+  0x097b45df, 0x0a00ecef, 0x0a8688ef, 0x0b0c196f, 0x0b919dcf, 0x0c17157f,
+  0x0c9c7fef, 0x0d21dc7f, 0x0da72abf, 0x0e2c69ef, 0x0eb1999f, 0x0f36b92f,
+  0x0fbbc81f, 0x1040c5bf, 0x10c5b17f, 0x114a8aff, 0x11cf515f, 0x1254045f,
+  0x12d8a31f, 0x135d2d5f, 0x13e1a23f, 0x1466015f, 0x14ea4a1f, 0x156e7bff,
+  0x15f2963f, 0x1676987f, 0x16fa821f, 0x177e527f, 0x1802091f, 0x1885a57f,
+  0x190926df, 0x198c8cdf, 0x1a0fd6df, 0x1a93043f, 0x1b16147f, 0x1b9906ff,
+  0x1c1bdb3f, 0x1c9e90bf, 0x1d2126bf, 0x1da39cdf, 0x1e25f27f, 0x1ea826ff,
+  0x1f2a39ff, 0x1fac2abf, 0x202df8bf, 0x20afa37f, 0x21312a7f, 0x21b28cff,
+  0x2233ca7f, 0x22b4e27f, 0x2335d47f, 0x23b69fbf, 0x243743ff, 0x24b7c07f,
+  0x253814bf, 0x25b83fff, 0x263841ff, 0x26b81a3f, 0x2737c7ff, 0x27b74a7f,
+  0x2836a1bf, 0x28b5ccbf, 0x2934caff, 0x29b39c3f, 0x2a323f7f, 0x2ab0b4bf,
+  0x2b2efb3f, 0x2bad123f, 0x2c2af93f, 0x2ca8afff, 0x2d26357f, 0x2da389bf,
+  0x2e20abff, 0x2e9d9b7f, 0x2f1a57bf, 0x2f96e0bf, 0x3013353f, 0x308f54ff,
+  0x310b3fbf, 0x3186f47f, 0x320272ff, 0x327dbabf, 0x32f8caff, 0x3373a37f,
+  0x33ee437f, 0x3468aa7f, 0x34e2d7ff, 0x355ccb7f, 0x35d684bf, 0x365002bf,
+  0x36c944ff, 0x37424b7f, 0x37bb153f, 0x3833a1ff, 0x38abf0ff, 0x392401bf,
+  0x399bd3ff, 0x3a1366ff, 0x3a8aba7f, 0x3b01cd7f, 0x3b789fff, 0x3bef313f,
+  0x3c6580bf, 0x3cdb8dff, 0x3d51587f, 0x3dc6dfbf, 0x3e3c237f, 0x3eb122bf,
+  0x3f25dd3f, 0x3f9a527f, 0x400e81ff, 0x40826b7f, 0x40f60dff, 0x4169697f,
+  0x41dc7cff, 0x424f487f, 0x42c1caff, 0x4334047f, 0x43a5f3ff, 0x4417997f,
+  0x4488f47f, 0x44fa047f, 0x456ac87f, 0x45db407f, 0x464b6b7f, 0x46bb49ff,
+  0x472ada7f, 0x479a1d7f, 0x4809117f, 0x4877b67f, 0x48e60c7f, 0x495411ff,
+  0x49c1c77f, 0x4a2f2bff, 0x4a9c3eff, 0x4b09007f, 0x4b756eff, 0x4be18b7f,
+  0x4c4d547f, 0x4cb8c9ff, 0x4d23eaff, 0x4d8eb77f, 0x4df92f7f, 0x4e63517f,
+  0x4ecd1d7f, 0x4f3692ff, 0x4f9fb1ff, 0x5008797f, 0x5070e8ff, 0x50d9007f,
+  0x5140bf7f, 0x51a8257f, 0x520f317f, 0x5275e3ff, 0x52dc3b7f, 0x5342387f,
+  0x53a7d9ff, 0x540d1fff, 0x5472097f, 0x54d696ff, 0x553ac6ff, 0x559e997f,
+  0x56020e7f, 0x5665247f, 0x56c7dc7f, 0x572a34ff, 0x578c2d7f, 0x57edc67f,
+  0x584efeff, 0x58afd67f, 0x59104cff, 0x597061ff, 0x59d0147f, 0x5a2f647f,
+  0x5a8e51ff, 0x5aecdbff, 0x5b4b01ff, 0x5ba8c3ff, 0x5c06217f, 0x5c631a7f,
+  0x5cbfad7f, 0x5d1bdb7f, 0x5d77a2ff, 0x5dd303ff, 0x5e2dfdff, 0x5e8890ff,
+  0x5ee2bc7f, 0x5f3c7f7f, 0x5f95d9ff, 0x5feecbff, 0x6047547f, 0x609f73ff,
+  0x60f728ff, 0x614e73ff, 0x61a553ff, 0x61fbc8ff, 0x6251d27f, 0x62a7707f,
+  0x62fca1ff, 0x635166ff, 0x63a5beff, 0x63f9a9ff, 0x644d26ff, 0x64a0367f,
+  0x64f2d6ff, 0x6545097f, 0x6596cc7f, 0x65e81fff, 0x663903ff, 0x668977ff,
+  0x66d97b7f, 0x67290dff, 0x67782f7f, 0x67c6df7f, 0x68151d7f, 0x6862e9ff,
+  0x68b0437f, 0x68fd29ff, 0x69499dff, 0x69959dff, 0x69e12a7f, 0x6a2c42ff,
+  0x6a76e67f, 0x6ac115ff, 0x6b0acfff, 0x6b54147f, 0x6b9ce37f, 0x6be53c7f,
+  0x6c2d1eff, 0x6c748aff, 0x6cbb807f, 0x6d01fdff, 0x6d48047f, 0x6d8d92ff,
+  0x6dd2a97f, 0x6e1746ff, 0x6e5b6c7f, 0x6e9f187f, 0x6ee24b7f, 0x6f25047f,
+  0x6f6743ff, 0x6fa908ff, 0x6fea53ff, 0x702b23ff, 0x706b78ff, 0x70ab527f,
+  0x70eab0ff, 0x712992ff, 0x7167f97f, 0x71a5e2ff, 0x71e3507f, 0x722040ff,
+  0x725cb3ff, 0x7298a9ff, 0x72d421ff, 0x730f1bff, 0x734997ff, 0x738395ff,
+  0x73bd147f, 0x73f6147f, 0x742e957f, 0x746696ff, 0x749e18ff, 0x74d51a7f,
+  0x750b9c7f, 0x75419dff, 0x75771e7f, 0x75ac1eff, 0x75e09d7f, 0x76149b7f,
+  0x7648177f, 0x767b11ff, 0x76ad8aff, 0x76df80ff, 0x7710f57f, 0x7741e6ff,
+  0x7772557f, 0x77a2417f, 0x77d1a9ff, 0x78008eff, 0x782ef07f, 0x785cce7f,
+  0x788a27ff, 0x78b6fd7f, 0x78e34eff, 0x790f1b7f, 0x793a637f, 0x7965267f,
+  0x798f63ff, 0x79b91c7f, 0x79e24f7f, 0x7a0afcff, 0x7a33247f, 0x7a5ac5ff,
+  0x7a81e17f, 0x7aa8767f, 0x7ace84ff, 0x7af40c7f, 0x7b190d7f, 0x7b3d877f,
+  0x7b617a7f, 0x7b84e5ff, 0x7ba7c9ff, 0x7bca267f, 0x7bebfb7f, 0x7c0d487f,
+  0x7c2e0cff, 0x7c4e497f, 0x7c6dfdff, 0x7c8d29ff, 0x7cabccff, 0x7cc9e77f,
+  0x7ce7797f, 0x7d0481ff, 0x7d2101ff, 0x7d3cf7ff, 0x7d58657f, 0x7d7348ff,
+  0x7d8da2ff, 0x7da7737f, 0x7dc0b9ff, 0x7dd9767f, 0x7df1a97f, 0x7e0951ff,
+  0x7e206fff, 0x7e3703ff, 0x7e4d0dff, 0x7e628cff, 0x7e77817f, 0x7e8beaff,
+  0x7e9fca7f, 0x7eb31e7f, 0x7ec5e77f, 0x7ed825ff, 0x7ee9d8ff, 0x7efb00ff,
+  0x7f0b9d7f, 0x7f1baeff, 0x7f2b34ff, 0x7f3a2f7f, 0x7f489e7f, 0x7f5681ff,
+  0x7f63d9ff, 0x7f70a5ff, 0x7f7ce67f, 0x7f889aff, 0x7f93c37f, 0x7f9e607f,
+  0x7fa870ff, 0x7fb1f5ff, 0x7fbaeeff, 0x7fc35b7f, 0x7fcb3bff, 0x7fd2907f,
+  0x7fd958ff, 0x7fdf94ff, 0x7fe544ff, 0x7fea687f, 0x7feeffff, 0x7ff30aff,
+  0x7ff6897f, 0x7ff97bff, 0x7ffbe1ff, 0x7ffdbbff, 0x7fff097f, 0x7fffca7f};
 
 const WORD32 ixheaacd_pre_post_twid_sin_64[64] = {
-    0x006487e2, 0x0388a9e7, 0x06ac406f, 0x09cecf8f, 0x0cefdb6f, 0x100ee89f,
-    0x132b7bff, 0x16451a7f, 0x195b49df, 0x1c6d905f, 0x1f7b747f, 0x22847dbf,
-    0x2588347f, 0x288621bf, 0x2b7dceff, 0x2e6ec77f, 0x315896ff, 0x343aca7f,
-    0x3714f03f, 0x39e6973f, 0x3caf50bf, 0x3f6eaebf, 0x4224447f, 0x44cfa6ff,
-    0x47706d7f, 0x4a062f7f, 0x4c90877f, 0x4f0f10ff, 0x5181697f, 0x53e7307f,
-    0x5640077f, 0x588b90ff, 0x5ac9737f, 0x5cf955ff, 0x5f1ae27f, 0x612dc47f,
-    0x6331a9ff, 0x6526437f, 0x670b447f, 0x68e060ff, 0x6aa551ff, 0x6c59d07f,
-    0x6dfd99ff, 0x6f906d7f, 0x71120cff, 0x72823c7f, 0x73e0c37f, 0x752d6c7f,
-    0x7668037f, 0x779057ff, 0x78a63cff, 0x79a986ff, 0x7a9a0e7f, 0x7b77ad7f,
-    0x7c4242ff, 0x7cf9aeff, 0x7d9dd57f, 0x7e2e9cff, 0x7eabeeff, 0x7f15b8ff,
-    0x7f6be9ff, 0x7fae747f, 0x7fdd4eff, 0x7ff8717f};
+  0x006487e2, 0x0388a9e7, 0x06ac406f, 0x09cecf8f, 0x0cefdb6f, 0x100ee89f,
+  0x132b7bff, 0x16451a7f, 0x195b49df, 0x1c6d905f, 0x1f7b747f, 0x22847dbf,
+  0x2588347f, 0x288621bf, 0x2b7dceff, 0x2e6ec77f, 0x315896ff, 0x343aca7f,
+  0x3714f03f, 0x39e6973f, 0x3caf50bf, 0x3f6eaebf, 0x4224447f, 0x44cfa6ff,
+  0x47706d7f, 0x4a062f7f, 0x4c90877f, 0x4f0f10ff, 0x5181697f, 0x53e7307f,
+  0x5640077f, 0x588b90ff, 0x5ac9737f, 0x5cf955ff, 0x5f1ae27f, 0x612dc47f,
+  0x6331a9ff, 0x6526437f, 0x670b447f, 0x68e060ff, 0x6aa551ff, 0x6c59d07f,
+  0x6dfd99ff, 0x6f906d7f, 0x71120cff, 0x72823c7f, 0x73e0c37f, 0x752d6c7f,
+  0x7668037f, 0x779057ff, 0x78a63cff, 0x79a986ff, 0x7a9a0e7f, 0x7b77ad7f,
+  0x7c4242ff, 0x7cf9aeff, 0x7d9dd57f, 0x7e2e9cff, 0x7eabeeff, 0x7f15b8ff,
+  0x7f6be9ff, 0x7fae747f, 0x7fdd4eff, 0x7ff8717f};
 
 const WORD32 ixheaacd_pre_post_twid_cos_64[64] = {
-    0x7fffd87f, 0x7ff3827f, 0x7fd3717f, 0x7f9fa9ff, 0x7f58347f, 0x7efd1bff,
-    0x7e8e6e7f, 0x7e0c3cff, 0x7d769b7f, 0x7ccda17f, 0x7c11687f, 0x7b420d7f,
-    0x7a5fb0ff, 0x796a757f, 0x7862807f, 0x7747fbff, 0x761b11ff, 0x74dbf1ff,
-    0x738acc7f, 0x7227d5ff, 0x70b344ff, 0x6f2d52ff, 0x6d963c7f, 0x6bee3f7f,
-    0x6a359d7f, 0x686c9b7f, 0x66937e7f, 0x64aa907f, 0x62b21c7f, 0x60aa707f,
-    0x5e93dbff, 0x5c6eb27f, 0x5a3b477f, 0x57f9f2ff, 0x55ab0d7f, 0x534ef17f,
-    0x50e5fd7f, 0x4e708f7f, 0x4bef08ff, 0x4961ccff, 0x46c9407f, 0x4425c8ff,
-    0x4177cf7f, 0x3ebfbdbf, 0x3bfdfebf, 0x3932ff7f, 0x365f2e3f, 0x3382fa7f,
-    0x309ed53f, 0x2db330bf, 0x2ac0803f, 0x27c737bf, 0x24c7cd3f, 0x21c2b67f,
-    0x1eb86b3f, 0x1ba9633f, 0x1896171f, 0x157f007f, 0x1264993f, 0x0f475bff,
-    0x0c27c38f, 0x09064b3f, 0x05e36ea7, 0x02bfa9a3};
+  0x7fffd87f, 0x7ff3827f, 0x7fd3717f, 0x7f9fa9ff, 0x7f58347f, 0x7efd1bff,
+  0x7e8e6e7f, 0x7e0c3cff, 0x7d769b7f, 0x7ccda17f, 0x7c11687f, 0x7b420d7f,
+  0x7a5fb0ff, 0x796a757f, 0x7862807f, 0x7747fbff, 0x761b11ff, 0x74dbf1ff,
+  0x738acc7f, 0x7227d5ff, 0x70b344ff, 0x6f2d52ff, 0x6d963c7f, 0x6bee3f7f,
+  0x6a359d7f, 0x686c9b7f, 0x66937e7f, 0x64aa907f, 0x62b21c7f, 0x60aa707f,
+  0x5e93dbff, 0x5c6eb27f, 0x5a3b477f, 0x57f9f2ff, 0x55ab0d7f, 0x534ef17f,
+  0x50e5fd7f, 0x4e708f7f, 0x4bef08ff, 0x4961ccff, 0x46c9407f, 0x4425c8ff,
+  0x4177cf7f, 0x3ebfbdbf, 0x3bfdfebf, 0x3932ff7f, 0x365f2e3f, 0x3382fa7f,
+  0x309ed53f, 0x2db330bf, 0x2ac0803f, 0x27c737bf, 0x24c7cd3f, 0x21c2b67f,
+  0x1eb86b3f, 0x1ba9633f, 0x1896171f, 0x157f007f, 0x1264993f, 0x0f475bff,
+  0x0c27c38f, 0x09064b3f, 0x05e36ea7, 0x02bfa9a3};
 
 const WORD32 ixheaacd_pre_post_twid_sin_48[48] = {
-    0x00860a78, 0x04b6195f, 0x08e4dd9f, 0x0d1131bf, 0x1139f0bf, 0x155df6ff,
-    0x197c219f, 0x1d934fdf, 0x21a2627f, 0x25a83cff, 0x29a3c47f, 0x2d93e1ff,
-    0x317780ff, 0x354d903f, 0x391502ff, 0x3ccccfff, 0x4073f1ff, 0x440968ff,
-    0x478c397f, 0x4afb6c7f, 0x4e5611ff, 0x519b3d7f, 0x54ca0a7f, 0x57e198ff,
-    0x5ae10fff, 0x5dc79d7f, 0x609475ff, 0x6346d47f, 0x65ddfbff, 0x6859367f,
-    0x6ab7d67f, 0x6cf934ff, 0x6f1cb3ff, 0x7121bd7f, 0x7307c3ff, 0x74ce417f,
-    0x7674b9ff, 0x77fab97f, 0x795fd4ff, 0x7aa3aaff, 0x7bc5e27f, 0x7cc62bff,
-    0x7da440ff, 0x7e5fe47f, 0x7ef8e37f, 0x7f6f13ff, 0x7fc2557f, 0x7ff290ff};
+  0x00860a78, 0x04b6195f, 0x08e4dd9f, 0x0d1131bf, 0x1139f0bf, 0x155df6ff,
+  0x197c219f, 0x1d934fdf, 0x21a2627f, 0x25a83cff, 0x29a3c47f, 0x2d93e1ff,
+  0x317780ff, 0x354d903f, 0x391502ff, 0x3ccccfff, 0x4073f1ff, 0x440968ff,
+  0x478c397f, 0x4afb6c7f, 0x4e5611ff, 0x519b3d7f, 0x54ca0a7f, 0x57e198ff,
+  0x5ae10fff, 0x5dc79d7f, 0x609475ff, 0x6346d47f, 0x65ddfbff, 0x6859367f,
+  0x6ab7d67f, 0x6cf934ff, 0x6f1cb3ff, 0x7121bd7f, 0x7307c3ff, 0x74ce417f,
+  0x7674b9ff, 0x77fab97f, 0x795fd4ff, 0x7aa3aaff, 0x7bc5e27f, 0x7cc62bff,
+  0x7da440ff, 0x7e5fe47f, 0x7ef8e37f, 0x7f6f13ff, 0x7fc2557f, 0x7ff290ff};
 
 const WORD32 ixheaacd_pre_post_twid_cos_48[48] = {
-    0x7fffb9ff, 0x7fe9cb7f, 0x7fb0ccff, 0x7f54cd7f, 0x7ed5e5ff, 0x7e3438ff,
-    0x7d6ff3ff, 0x7c894bff, 0x7b807fff, 0x7a55d8ff, 0x7909a8ff, 0x779c4aff,
-    0x760e22ff, 0x745f9dff, 0x729131ff, 0x70a35dff, 0x6e96a97f, 0x6c6ba3ff,
-    0x6a22e5ff, 0x67bd0f7f, 0x653ac8ff, 0x629cc27f, 0x5fe3b37f, 0x5d105b7f,
-    0x5a237fff, 0x571deeff, 0x54007c7f, 0x50cc027f, 0x4d8162ff, 0x4a2183ff,
-    0x46ad527f, 0x4325c0ff, 0x3f8bc7bf, 0x3be062bf, 0x382493bf, 0x345960bf,
-    0x307fd3ff, 0x2c98fbbf, 0x28a5e9bf, 0x24a7b2ff, 0x209f6fff, 0x1c8e3bbf,
-    0x1875335f, 0x145576bf, 0x103026ff, 0x0c06673f, 0x07d95b9f, 0x03aa2927};
+  0x7fffb9ff, 0x7fe9cb7f, 0x7fb0ccff, 0x7f54cd7f, 0x7ed5e5ff, 0x7e3438ff,
+  0x7d6ff3ff, 0x7c894bff, 0x7b807fff, 0x7a55d8ff, 0x7909a8ff, 0x779c4aff,
+  0x760e22ff, 0x745f9dff, 0x729131ff, 0x70a35dff, 0x6e96a97f, 0x6c6ba3ff,
+  0x6a22e5ff, 0x67bd0f7f, 0x653ac8ff, 0x629cc27f, 0x5fe3b37f, 0x5d105b7f,
+  0x5a237fff, 0x571deeff, 0x54007c7f, 0x50cc027f, 0x4d8162ff, 0x4a2183ff,
+  0x46ad527f, 0x4325c0ff, 0x3f8bc7bf, 0x3be062bf, 0x382493bf, 0x345960bf,
+  0x307fd3ff, 0x2c98fbbf, 0x28a5e9bf, 0x24a7b2ff, 0x209f6fff, 0x1c8e3bbf,
+  0x1875335f, 0x145576bf, 0x103026ff, 0x0c06673f, 0x07d95b9f, 0x03aa2927};
 
 const WORD32 ixheaacd_sine_win_128[128] = {
-    0x00c91080, 0x025b291c, 0x03ed288c, 0x057efe10, 0x0710a138, 0x08a20140,
-    0x0a330510, 0x0bc3ac90, 0x0d53dea0, 0x0ee38a80, 0x10729f60, 0x120114e0,
-    0x138eda20, 0x151bde80, 0x16a81120, 0x183369c0, 0x19bdcf00, 0x1b473040,
-    0x1ccf8d80, 0x1e56cd60, 0x1fdcdf60, 0x2161b2c0, 0x22e53ec0, 0x24677b40,
-    0x25e846c0, 0x2767a100, 0x28e57100, 0x2a61ae80, 0x2bdc50c0, 0x2d553f00,
-    0x2ecc6840, 0x3041c400, 0x31b54a00, 0x3326e100, 0x34968100, 0x36041880,
-    0x376f9fc0, 0x38d8fd40, 0x3a403140, 0x3ba52280, 0x3d07c000, 0x3e6809c0,
-    0x3fc5ef80, 0x4121577f, 0x427a41ff, 0x43d09dff, 0x45245aff, 0x4675687f,
-    0x47c3c57f, 0x490f59ff, 0x4a581cff, 0x4b9e05ff, 0x4ce1047f, 0x4e21077f,
-    0x4f5e06ff, 0x5097fa7f, 0x51ced07f, 0x5302817f, 0x543304ff, 0x5560417f,
-    0x568a36ff, 0x57b0d4ff, 0x58d40a7f, 0x59f3dfff, 0x5b1033ff, 0x5c290eff,
-    0x5d3e4eff, 0x5e5004ff, 0x5f5e0f7f, 0x60686e7f, 0x616f10ff, 0x6271f77f,
-    0x637110ff, 0x646c5cff, 0x6563c2ff, 0x66573a7f, 0x6746cb7f, 0x683254ff,
-    0x6919e6ff, 0x69fd60ff, 0x6adcca7f, 0x6bb812ff, 0x6c8f31ff, 0x6d6227ff,
-    0x6e30e3ff, 0x6efb5cff, 0x6fc1937f, 0x708376ff, 0x714106ff, 0x71fa3b7f,
-    0x72af037f, 0x735f677f, 0x740b567f, 0x74b2c7ff, 0x7555bcff, 0x75f42b7f,
-    0x768e0c7f, 0x77235f7f, 0x77b41bff, 0x7840317f, 0x78c7a7ff, 0x794a7f7f,
-    0x79c89f7f, 0x7a420f7f, 0x7ab6c77f, 0x7b26c7ff, 0x7b9207ff, 0x7bf8877f,
-    0x7c5a3dff, 0x7cb723ff, 0x7d0f40ff, 0x7d628c7f, 0x7db0feff, 0x7dfa97ff,
-    0x7e3f56ff, 0x7e7f3cff, 0x7eba387f, 0x7ef05a7f, 0x7f2191ff, 0x7f4de7ff,
-    0x7f754aff, 0x7f97cbff, 0x7fb562ff, 0x7fce0fff, 0x7fe1c97f, 0x7ff090ff,
-    0x7ffa767f, 0x7fff607f};
+  0x00c91080, 0x025b291c, 0x03ed288c, 0x057efe10, 0x0710a138, 0x08a20140,
+  0x0a330510, 0x0bc3ac90, 0x0d53dea0, 0x0ee38a80, 0x10729f60, 0x120114e0,
+  0x138eda20, 0x151bde80, 0x16a81120, 0x183369c0, 0x19bdcf00, 0x1b473040,
+  0x1ccf8d80, 0x1e56cd60, 0x1fdcdf60, 0x2161b2c0, 0x22e53ec0, 0x24677b40,
+  0x25e846c0, 0x2767a100, 0x28e57100, 0x2a61ae80, 0x2bdc50c0, 0x2d553f00,
+  0x2ecc6840, 0x3041c400, 0x31b54a00, 0x3326e100, 0x34968100, 0x36041880,
+  0x376f9fc0, 0x38d8fd40, 0x3a403140, 0x3ba52280, 0x3d07c000, 0x3e6809c0,
+  0x3fc5ef80, 0x4121577f, 0x427a41ff, 0x43d09dff, 0x45245aff, 0x4675687f,
+  0x47c3c57f, 0x490f59ff, 0x4a581cff, 0x4b9e05ff, 0x4ce1047f, 0x4e21077f,
+  0x4f5e06ff, 0x5097fa7f, 0x51ced07f, 0x5302817f, 0x543304ff, 0x5560417f,
+  0x568a36ff, 0x57b0d4ff, 0x58d40a7f, 0x59f3dfff, 0x5b1033ff, 0x5c290eff,
+  0x5d3e4eff, 0x5e5004ff, 0x5f5e0f7f, 0x60686e7f, 0x616f10ff, 0x6271f77f,
+  0x637110ff, 0x646c5cff, 0x6563c2ff, 0x66573a7f, 0x6746cb7f, 0x683254ff,
+  0x6919e6ff, 0x69fd60ff, 0x6adcca7f, 0x6bb812ff, 0x6c8f31ff, 0x6d6227ff,
+  0x6e30e3ff, 0x6efb5cff, 0x6fc1937f, 0x708376ff, 0x714106ff, 0x71fa3b7f,
+  0x72af037f, 0x735f677f, 0x740b567f, 0x74b2c7ff, 0x7555bcff, 0x75f42b7f,
+  0x768e0c7f, 0x77235f7f, 0x77b41bff, 0x7840317f, 0x78c7a7ff, 0x794a7f7f,
+  0x79c89f7f, 0x7a420f7f, 0x7ab6c77f, 0x7b26c7ff, 0x7b9207ff, 0x7bf8877f,
+  0x7c5a3dff, 0x7cb723ff, 0x7d0f40ff, 0x7d628c7f, 0x7db0feff, 0x7dfa97ff,
+  0x7e3f56ff, 0x7e7f3cff, 0x7eba387f, 0x7ef05a7f, 0x7f2191ff, 0x7f4de7ff,
+  0x7f754aff, 0x7f97cbff, 0x7fb562ff, 0x7fce0fff, 0x7fe1c97f, 0x7ff090ff,
+  0x7ffa767f, 0x7fff607f};
 
 const WORD32 ixheaacd_sine_win_1024[1024] = {
-    0x00192210, 0x004b6630, 0x007daa50, 0x00afee70, 0x00e23290, 0x011476b0,
-    0x0146bad0, 0x0178fef0, 0x01ab3aac, 0x01dd7ecc, 0x020fc2ec, 0x0242070c,
-    0x02744b2c, 0x02a686e8, 0x02d8cb08, 0x030b06c4, 0x033d4ae4, 0x036f86a0,
-    0x03a1cac0, 0x03d4067c, 0x04064238, 0x04388658, 0x046ac218, 0x049cfdd0,
-    0x04cf3990, 0x05017548, 0x0533a8a0, 0x0565e460, 0x05982020, 0x05ca5378,
-    0x05fc86d0, 0x062ec288, 0x0660f5e8, 0x06932940, 0x06c55c98, 0x06f78788,
-    0x0729bae8, 0x075bee40, 0x078e1930, 0x07c04428, 0x07f26f20, 0x08249a10,
-    0x0856c510, 0x0888f000, 0x08bb1290, 0x08ed3520, 0x091f6010, 0x095182b0,
-    0x09839ce0, 0x09b5bf70, 0x09e7e200, 0x0a19fc30, 0x0a4c1660, 0x0a7e3080,
-    0x0ab04ab0, 0x0ae25c80, 0x0b146e50, 0x0b468880, 0x0b7891e0, 0x0baaa3b0,
-    0x0bdcb580, 0x0c0ebee0, 0x0c40c840, 0x0c72d1b0, 0x0ca4d2b0, 0x0cd6dc20,
-    0x0d08dd20, 0x0d3ade20, 0x0d6cd6c0, 0x0d9ed7c0, 0x0dd0d060, 0x0e02c910,
-    0x0e34b940, 0x0e66b1e0, 0x0e98a220, 0x0eca9260, 0x0efc7a40, 0x0f2e6a70,
-    0x0f605250, 0x0f9231c0, 0x0fc419a0, 0x0ff5f910, 0x1027d880, 0x1059afa0,
-    0x108b8f20, 0x10bd6620, 0x10ef34e0, 0x11210be0, 0x1152daa0, 0x1184a0e0,
-    0x11b66fa0, 0x11e835e0, 0x1219fc20, 0x124bba20, 0x127d7800, 0x12af35e0,
-    0x12e0eb60, 0x1312a0e0, 0x13445680, 0x137603a0, 0x13a7b0c0, 0x13d95de0,
-    0x140b02a0, 0x143ca760, 0x146e43a0, 0x149fe000, 0x14d17c60, 0x150318c0,
-    0x1534aca0, 0x15663840, 0x1597c3e0, 0x15c94f60, 0x15fadb00, 0x162c5e20,
-    0x165dd900, 0x168f53c0, 0x16c0cea0, 0x16f24100, 0x1723b360, 0x175525c0,
-    0x17868fe0, 0x17b7f180, 0x17e95b80, 0x181ab4c0, 0x184c1660, 0x187d6fa0,
-    0x18aec080, 0x18e01140, 0x19116220, 0x1942aaa0, 0x1973eac0, 0x19a52ac0,
-    0x19d66ae0, 0x1a07a280, 0x1a38da40, 0x1a6a0980, 0x1a9b38e0, 0x1acc5fc0,
-    0x1afd86a0, 0x1b2ea520, 0x1b5fc3c0, 0x1b90d9e0, 0x1bc1f000, 0x1bf2fdc0,
-    0x1c240b80, 0x1c5510e0, 0x1c860dc0, 0x1cb71320, 0x1ce807c0, 0x1d18fc60,
-    0x1d49f0e0, 0x1d7add20, 0x1dabc0e0, 0x1ddca4c0, 0x1e0d8880, 0x1e3e5b80,
-    0x1e6f36e0, 0x1ea001a0, 0x1ed0d4a0, 0x1f0196e0, 0x1f325920, 0x1f631b60,
-    0x1f93cce0, 0x1fc486a0, 0x1ff52fc0, 0x2025d8c0, 0x20568200, 0x20872280,
-    0x20b7bb00, 0x20e85340, 0x2118e340, 0x21497300, 0x2179f240, 0x21aa79c0,
-    0x21daf080, 0x220b6740, 0x223bde00, 0x226c4c40, 0x229cb240, 0x22cd1000,
-    0x22fd6d80, 0x232dc2c0, 0x235e1800, 0x238e64c0, 0x23bea900, 0x23eeed80,
-    0x241f2980, 0x244f5d40, 0x247f90c0, 0x24afbc00, 0x24dfdf00, 0x251001c0,
-    0x25401c40, 0x25702e80, 0x25a03800, 0x25d041c0, 0x26004300, 0x26304480,
-    0x26603d40, 0x26902e00, 0x26c01600, 0x26effe40, 0x271fde00, 0x274fb540,
-    0x277f8440, 0x27af5340, 0x27df19c0, 0x280ed800, 0x283e9640, 0x286e4c00,
-    0x289df980, 0x28cd9e80, 0x28fd4380, 0x292ce040, 0x295c7480, 0x298c0040,
-    0x29bb83c0, 0x29eb0740, 0x2a1a8280, 0x2a49f500, 0x2a7967c0, 0x2aa8d200,
-    0x2ad83400, 0x2b078d80, 0x2b36dec0, 0x2b662780, 0x2b957040, 0x2bc4b080,
-    0x2bf3e880, 0x2c231840, 0x2c5247c0, 0x2c816f00, 0x2cb08dc0, 0x2cdfa440,
-    0x2d0eb240, 0x2d3db800, 0x2d6cbd80, 0x2d9bb280, 0x2dcaa740, 0x2df993c0,
-    0x2e288040, 0x2e575c00, 0x2e862f40, 0x2eb502c0, 0x2ee3cd80, 0x2f129040,
-    0x2f414a40, 0x2f6ffc00, 0x2f9ea580, 0x2fcd4ec0, 0x2ffbe780, 0x302a8000,
-    0x30591040, 0x30879800, 0x30b61780, 0x30e48e80, 0x3112fd40, 0x31416380,
-    0x316fc9c0, 0x319e1f40, 0x31cc74c0, 0x31fab980, 0x3228fe40, 0x32573a80,
-    0x32856e80, 0x32b39a00, 0x32e1bd00, 0x330fd800, 0x333dea40, 0x336bf440,
-    0x3399fe40, 0x33c7f780, 0x33f5e840, 0x3423d940, 0x3451b940, 0x347f9940,
-    0x34ad6880, 0x34db37c0, 0x3508fec0, 0x3536b4c0, 0x35646b00, 0x35921040,
-    0x35bfb580, 0x35ed5280, 0x361ae700, 0x36486ac0, 0x3675ee80, 0x36a36a00,
-    0x36d0d480, 0x36fe3f40, 0x372ba180, 0x3758f300, 0x37864440, 0x37b38d80,
-    0x37e0c5c0, 0x380dfe00, 0x383b2580, 0x38684d00, 0x389563c0, 0x38c27a80,
-    0x38ef8040, 0x391c8640, 0x39497b80, 0x39766840, 0x39a34cc0, 0x39d028c0,
-    0x39fd04c0, 0x3a29cfc0, 0x3a568a40, 0x3a8344c0, 0x3aaff6c0, 0x3adca080,
-    0x3b093980, 0x3b35d240, 0x3b625a80, 0x3b8ee280, 0x3bbb59c0, 0x3be7c8c0,
-    0x3c142f80, 0x3c408d80, 0x3c6ce340, 0x3c9930c0, 0x3cc56d40, 0x3cf1aa00,
-    0x3d1dd5c0, 0x3d4a01c0, 0x3d761cc0, 0x3da22f80, 0x3dce39c0, 0x3dfa3340,
-    0x3e262cc0, 0x3e521580, 0x3e7dfe40, 0x3ea9d640, 0x3ed5a5c0, 0x3f016d00,
-    0x3f2d2340, 0x3f58d9c0, 0x3f847f40, 0x3fb02500, 0x3fdbb9c0, 0x40073dff,
-    0x4032c1ff, 0x405e3d7f, 0x4089a87f, 0x40b50aff, 0x40e064ff, 0x410bb6ff,
-    0x4136f7ff, 0x416238ff, 0x418d68ff, 0x41b890ff, 0x41e3a7ff, 0x420ebeff,
-    0x4239c4ff, 0x4264c2ff, 0x428fb87f, 0x42baa57f, 0x42e581ff, 0x43105dff,
-    0x433b297f, 0x4365e47f, 0x43909eff, 0x43bb48ff, 0x43e5ea7f, 0x441083ff,
-    0x443b0c7f, 0x4465947f, 0x449003ff, 0x44ba72ff, 0x44e4d9ff, 0x450f2fff,
-    0x45397dff, 0x4563ba7f, 0x458df77f, 0x45b823ff, 0x45e2477f, 0x460c5a7f,
-    0x46366d7f, 0x46606f7f, 0x468a60ff, 0x46b4527f, 0x46de32ff, 0x470802ff,
-    0x4731d2ff, 0x475b91ff, 0x4785487f, 0x47aeee7f, 0x47d8947f, 0x4802217f,
-    0x482badff, 0x485529ff, 0x487e9d7f, 0x48a808ff, 0x48d162ff, 0x48fab4ff,
-    0x4923f67f, 0x494d37ff, 0x49765fff, 0x499f87ff, 0x49c89f7f, 0x49f1adff,
-    0x4a1aac7f, 0x4a43a1ff, 0x4a6c8f7f, 0x4a95747f, 0x4abe487f, 0x4ae70bff,
-    0x4b0fc6ff, 0x4b3879ff, 0x4b6123ff, 0x4b89bd7f, 0x4bb245ff, 0x4bdaceff,
-    0x4c0346ff, 0x4c2badff, 0x4c540cff, 0x4c7c62ff, 0x4ca4a8ff, 0x4ccce5ff,
-    0x4cf51aff, 0x4d1d3eff, 0x4d4551ff, 0x4d6d5cff, 0x4d955f7f, 0x4dbd597f,
-    0x4de542ff, 0x4e0d1b7f, 0x4e34eb7f, 0x4e5cb37f, 0x4e846a7f, 0x4eac18ff,
-    0x4ed3b6ff, 0x4efb4bff, 0x4f22d0ff, 0x4f4a4cff, 0x4f71c0ff, 0x4f9923ff,
-    0x4fc0767f, 0x4fe7c07f, 0x500f01ff, 0x503632ff, 0x505d5aff, 0x508472ff,
-    0x50ab81ff, 0x50d2807f, 0x50f9767f, 0x51205bff, 0x5147387f, 0x516e04ff,
-    0x5194c87f, 0x51bb7b7f, 0x51e225ff, 0x5208bfff, 0x522f50ff, 0x5255d9ff,
-    0x527c49ff, 0x52a2b17f, 0x52c9107f, 0x52ef5eff, 0x5315a47f, 0x533bd9ff,
-    0x5362067f, 0x5388227f, 0x53ae2d7f, 0x53d4307f, 0x53fa2aff, 0x5420147f,
-    0x5445ed7f, 0x546bbd7f, 0x54917d7f, 0x54b7347f, 0x54dcdaff, 0x5502797f,
-    0x5528067f, 0x554d837f, 0x5572f77f, 0x559862ff, 0x55bdb5ff, 0x55e2ffff,
-    0x560841ff, 0x562d72ff, 0x56529b7f, 0x5677aaff, 0x569cba7f, 0x56c1b0ff,
-    0x56e69eff, 0x570b847f, 0x5730597f, 0x57551d7f, 0x5779d8ff, 0x579e83ff,
-    0x57c31dff, 0x57e7af7f, 0x580c307f, 0x5830a8ff, 0x585510ff, 0x587967ff,
-    0x589db67f, 0x58c1f3ff, 0x58e6297f, 0x590a45ff, 0x592e61ff, 0x595264ff,
-    0x59765fff, 0x599a49ff, 0x59be2b7f, 0x59e1fbff, 0x5a05bbff, 0x5a29737f,
-    0x5a4d1a7f, 0x5a70b07f, 0x5a943dff, 0x5ab7baff, 0x5adb26ff, 0x5afe8a7f,
-    0x5b21dd7f, 0x5b451fff, 0x5b68597f, 0x5b8b827f, 0x5bae9a7f, 0x5bd1aa7f,
-    0x5bf4a97f, 0x5c1797ff, 0x5c3a7d7f, 0x5c5d4a7f, 0x5c8016ff, 0x5ca2ca7f,
-    0x5cc575ff, 0x5ce80fff, 0x5d0a997f, 0x5d2d1aff, 0x5d4f8b7f, 0x5d71eaff,
-    0x5d9439ff, 0x5db6807f, 0x5dd8b5ff, 0x5dfadaff, 0x5e1cf77f, 0x5e3f037f,
-    0x5e60fe7f, 0x5e82e87f, 0x5ea4ca7f, 0x5ec69b7f, 0x5ee85b7f, 0x5f0a0aff,
-    0x5f2bb1ff, 0x5f4d487f, 0x5f6ecdff, 0x5f904aff, 0x5fb1aeff, 0x5fd30aff,
-    0x5ff4557f, 0x601597ff, 0x6036c17f, 0x6057e1ff, 0x6078f27f, 0x6099f17f,
-    0x60bae87f, 0x60dbceff, 0x60fca3ff, 0x611d68ff, 0x613e1c7f, 0x615ec7ff,
-    0x617f627f, 0x619fec7f, 0x61c0657f, 0x61e0cdff, 0x62012dff, 0x62217cff,
-    0x6241bb7f, 0x6261e8ff, 0x628205ff, 0x62a21a7f, 0x62c21dff, 0x62e210ff,
-    0x6301f2ff, 0x6321c47f, 0x63418d7f, 0x63613cff, 0x6380e47f, 0x63a07aff,
-    0x63c000ff, 0x63df7e7f, 0x63fee2ff, 0x641e3e7f, 0x643d89ff, 0x645cc3ff,
-    0x647bed7f, 0x649b067f, 0x64ba16ff, 0x64d90dff, 0x64f7fcff, 0x6516daff,
-    0x6535a87f, 0x655464ff, 0x657318ff, 0x6591b3ff, 0x65b0467f, 0x65cebfff,
-    0x65ed30ff, 0x660b90ff, 0x6629e07f, 0x66481f7f, 0x6666557f, 0x668472ff,
-    0x66a2877f, 0x66c082ff, 0x66de767f, 0x66fc587f, 0x671a2a7f, 0x6737eaff,
-    0x67559aff, 0x677342ff, 0x6790d17f, 0x67ae577f, 0x67cbc47f, 0x67e928ff,
-    0x68067cff, 0x6823bfff, 0x6840f1ff, 0x685e137f, 0x687b247f, 0x6898247f,
-    0x68b5137f, 0x68d1f9ff, 0x68eec7ff, 0x690b8cff, 0x692838ff, 0x6944dc7f,
-    0x696166ff, 0x697de8ff, 0x699a5a7f, 0x69b6baff, 0x69d30aff, 0x69ef49ff,
-    0x6a0b77ff, 0x6a27957f, 0x6a43a1ff, 0x6a5f9dff, 0x6a7b88ff, 0x6a976bff,
-    0x6ab3357f, 0x6aceedff, 0x6aea9e7f, 0x6b06357f, 0x6b21c47f, 0x6b3d39ff,
-    0x6b58a77f, 0x6b73fb7f, 0x6b8f46ff, 0x6baa797f, 0x6bc5a3ff, 0x6be0bd7f,
-    0x6bfbbd7f, 0x6c16b57f, 0x6c319c7f, 0x6c4c69ff, 0x6c672f7f, 0x6c81e47f,
-    0x6c9c7fff, 0x6cb712ff, 0x6cd1957f, 0x6cec06ff, 0x6d065f7f, 0x6d20af7f,
-    0x6d3aeeff, 0x6d5514ff, 0x6d6f327f, 0x6d893f7f, 0x6da3337f, 0x6dbd1eff,
-    0x6dd6f97f, 0x6df0baff, 0x6e0a73ff, 0x6e2413ff, 0x6e3dab7f, 0x6e57297f,
-    0x6e709f7f, 0x6e89fc7f, 0x6ea350ff, 0x6ebc8bff, 0x6ed5beff, 0x6eeed87f,
-    0x6f07e17f, 0x6f20d97f, 0x6f39c97f, 0x6f529fff, 0x6f6b657f, 0x6f841a7f,
-    0x6f9cbeff, 0x6fb5527f, 0x6fcdd4ff, 0x6fe646ff, 0x6ffe9f7f, 0x7016efff,
-    0x702f2f7f, 0x704755ff, 0x705f73ff, 0x707778ff, 0x708f757f, 0x70a7587f,
-    0x70bf2aff, 0x70d6ecff, 0x70eea5ff, 0x7106467f, 0x711dd5ff, 0x71354bff,
-    0x714cb9ff, 0x716416ff, 0x717b637f, 0x7192967f, 0x71a9c0ff, 0x71c0d2ff,
-    0x71d7d37f, 0x71eec37f, 0x7205a2ff, 0x721c717f, 0x72332eff, 0x7249dbff,
-    0x726077ff, 0x7276faff, 0x728d757f, 0x72a3d6ff, 0x72ba2fff, 0x72d06fff,
-    0x72e69eff, 0x72fcbd7f, 0x7312caff, 0x7328beff, 0x733eaaff, 0x73547dff,
-    0x736a487f, 0x737ff97f, 0x739599ff, 0x73ab29ff, 0x73c0a8ff, 0x73d616ff,
-    0x73eb6bff, 0x7400b87f, 0x7415ebff, 0x742b0e7f, 0x7440207f, 0x7455217f,
-    0x746a11ff, 0x747ef17f, 0x7493b7ff, 0x74a875ff, 0x74bd1a7f, 0x74d1ae7f,
-    0x74e631ff, 0x74faa47f, 0x750efdff, 0x75234e7f, 0x7537867f, 0x754bad7f,
-    0x755fc37f, 0x7573c8ff, 0x7587bdff, 0x759b997f, 0x75af6c7f, 0x75c3267f,
-    0x75d6cf7f, 0x75ea67ff, 0x75fdef7f, 0x76115dff, 0x7624c3ff, 0x763810ff,
-    0x764b4cff, 0x765e787f, 0x76718a7f, 0x7684947f, 0x769784ff, 0x76aa64ff,
-    0x76bd33ff, 0x76cff1ff, 0x76e29f7f, 0x76f533ff, 0x7707b77f, 0x771a2a7f,
-    0x772c8c7f, 0x773edd7f, 0x7751157f, 0x77633cff, 0x77755bff, 0x778758ff,
-    0x77994dff, 0x77ab327f, 0x77bcfd7f, 0x77ceb77f, 0x77e060ff, 0x77f1f97f,
-    0x780378ff, 0x7814e7ff, 0x782645ff, 0x783792ff, 0x7848cf7f, 0x7859f27f,
-    0x786b04ff, 0x787c06ff, 0x788cf7ff, 0x789dd7ff, 0x78ae9eff, 0x78bf54ff,
-    0x78cffa7f, 0x78e08eff, 0x78f10a7f, 0x79017d7f, 0x7911d77f, 0x7922187f,
-    0x7932507f, 0x79426fff, 0x79527e7f, 0x79627bff, 0x797268ff, 0x79823c7f,
-    0x7991ff7f, 0x79a1b17f, 0x79b152ff, 0x79c0e37f, 0x79d05aff, 0x79dfc17f,
-    0x79ef177f, 0x79fe53ff, 0x7a0d7fff, 0x7a1c9b7f, 0x7a2ba57f, 0x7a3a9eff,
-    0x7a497f7f, 0x7a584f7f, 0x7a670dff, 0x7a75b3ff, 0x7a8450ff, 0x7a92d57f,
-    0x7aa1487f, 0x7aafa2ff, 0x7abdec7f, 0x7acc24ff, 0x7ada4cff, 0x7ae863ff,
-    0x7af661ff, 0x7b044eff, 0x7b122b7f, 0x7b1fee7f, 0x7b2da0ff, 0x7b3b42ff,
-    0x7b48d37f, 0x7b564b7f, 0x7b63b27f, 0x7b71087f, 0x7b7e4dff, 0x7b8b79ff,
-    0x7b98957f, 0x7ba59fff, 0x7bb299ff, 0x7bbf7aff, 0x7bcc4aff, 0x7bd9017f,
-    0x7be5afff, 0x7bf244ff, 0x7bfec97f, 0x7c0b34ff, 0x7c1797ff, 0x7c23e17f,
-    0x7c3011ff, 0x7c3c3a7f, 0x7c48497f, 0x7c54477f, 0x7c602c7f, 0x7c6c08ff,
-    0x7c77ccff, 0x7c8376ff, 0x7c8f18ff, 0x7c9aa1ff, 0x7ca619ff, 0x7cb1787f,
-    0x7cbcceff, 0x7cc80c7f, 0x7cd3307f, 0x7cde4c7f, 0x7ce94eff, 0x7cf4407f,
-    0x7cff197f, 0x7d09e0ff, 0x7d1497ff, 0x7d1f3e7f, 0x7d29cb7f, 0x7d3447ff,
-    0x7d3eb37f, 0x7d4905ff, 0x7d53477f, 0x7d5d787f, 0x7d67987f, 0x7d719f7f,
-    0x7d7b957f, 0x7d85727f, 0x7d8f46ff, 0x7d99027f, 0x7da2a4ff, 0x7dac3e7f,
-    0x7db5bf7f, 0x7dbf26ff, 0x7dc885ff, 0x7dd1cbff, 0x7ddb017f, 0x7de41d7f,
-    0x7ded287f, 0x7df622ff, 0x7dff0c7f, 0x7e07dd7f, 0x7e109cff, 0x7e19437f,
-    0x7e21d97f, 0x7e2a5e7f, 0x7e32d27f, 0x7e3b2dff, 0x7e4377ff, 0x7e4bb17f,
-    0x7e53d1ff, 0x7e5be17f, 0x7e63e07f, 0x7e6bc5ff, 0x7e739aff, 0x7e7b5eff,
-    0x7e8309ff, 0x7e8aac7f, 0x7e922d7f, 0x7e99a5ff, 0x7ea1057f, 0x7ea84bff,
-    0x7eaf89ff, 0x7eb6ae7f, 0x7ebdc27f, 0x7ec4bcff, 0x7ecba6ff, 0x7ed2807f,
-    0x7ed948ff, 0x7edff7ff, 0x7ee68dff, 0x7eed1bff, 0x7ef3907f, 0x7ef9f47f,
-    0x7f003eff, 0x7f0678ff, 0x7f0ca1ff, 0x7f12b9ff, 0x7f18b8ff, 0x7f1e9eff,
-    0x7f247c7f, 0x7f2a40ff, 0x7f2ff47f, 0x7f358eff, 0x7f3b18ff, 0x7f4091ff,
-    0x7f45f17f, 0x7f4b407f, 0x7f507e7f, 0x7f55abff, 0x7f5abfff, 0x7f5fbb7f,
-    0x7f64adff, 0x7f69877f, 0x7f6e47ff, 0x7f72ffff, 0x7f779e7f, 0x7f7c23ff,
-    0x7f80a17f, 0x7f85057f, 0x7f89507f, 0x7f8d8a7f, 0x7f91b3ff, 0x7f95cc7f,
-    0x7f99cbff, 0x7f9dba7f, 0x7fa1987f, 0x7fa55cff, 0x7fa910ff, 0x7facabff,
-    0x7fb0357f, 0x7fb3aeff, 0x7fb70eff, 0x7fba667f, 0x7fbd9c7f, 0x7fc0ca7f,
-    0x7fc3deff, 0x7fc6e27f, 0x7fc9ccff, 0x7fcca6ff, 0x7fcf6fff, 0x7fd21fff,
-    0x7fd4beff, 0x7fd74d7f, 0x7fd9c27f, 0x7fdc26ff, 0x7fde71ff, 0x7fe0ac7f,
-    0x7fe2d5ff, 0x7fe4eeff, 0x7fe6ee7f, 0x7fe8dd7f, 0x7feab37f, 0x7fec787f,
-    0x7fee2c7f, 0x7fefcfff, 0x7ff15a7f, 0x7ff2cb7f, 0x7ff433ff, 0x7ff5837f,
-    0x7ff6b9ff, 0x7ff7e7ff, 0x7ff8fcff, 0x7ff9f87f, 0x7ffae37f, 0x7ffbbd7f,
-    0x7ffc86ff, 0x7ffd36ff, 0x7ffdd67f, 0x7ffe5c7f, 0x7ffed1ff, 0x7fff367f,
-    0x7fff8a7f, 0x7fffc57f, 0x7fffe6ff, 0x7fffffff,
-};
+  0x00192210, 0x004b6630, 0x007daa50, 0x00afee70, 0x00e23290, 0x011476b0,
+  0x0146bad0, 0x0178fef0, 0x01ab3aac, 0x01dd7ecc, 0x020fc2ec, 0x0242070c,
+  0x02744b2c, 0x02a686e8, 0x02d8cb08, 0x030b06c4, 0x033d4ae4, 0x036f86a0,
+  0x03a1cac0, 0x03d4067c, 0x04064238, 0x04388658, 0x046ac218, 0x049cfdd0,
+  0x04cf3990, 0x05017548, 0x0533a8a0, 0x0565e460, 0x05982020, 0x05ca5378,
+  0x05fc86d0, 0x062ec288, 0x0660f5e8, 0x06932940, 0x06c55c98, 0x06f78788,
+  0x0729bae8, 0x075bee40, 0x078e1930, 0x07c04428, 0x07f26f20, 0x08249a10,
+  0x0856c510, 0x0888f000, 0x08bb1290, 0x08ed3520, 0x091f6010, 0x095182b0,
+  0x09839ce0, 0x09b5bf70, 0x09e7e200, 0x0a19fc30, 0x0a4c1660, 0x0a7e3080,
+  0x0ab04ab0, 0x0ae25c80, 0x0b146e50, 0x0b468880, 0x0b7891e0, 0x0baaa3b0,
+  0x0bdcb580, 0x0c0ebee0, 0x0c40c840, 0x0c72d1b0, 0x0ca4d2b0, 0x0cd6dc20,
+  0x0d08dd20, 0x0d3ade20, 0x0d6cd6c0, 0x0d9ed7c0, 0x0dd0d060, 0x0e02c910,
+  0x0e34b940, 0x0e66b1e0, 0x0e98a220, 0x0eca9260, 0x0efc7a40, 0x0f2e6a70,
+  0x0f605250, 0x0f9231c0, 0x0fc419a0, 0x0ff5f910, 0x1027d880, 0x1059afa0,
+  0x108b8f20, 0x10bd6620, 0x10ef34e0, 0x11210be0, 0x1152daa0, 0x1184a0e0,
+  0x11b66fa0, 0x11e835e0, 0x1219fc20, 0x124bba20, 0x127d7800, 0x12af35e0,
+  0x12e0eb60, 0x1312a0e0, 0x13445680, 0x137603a0, 0x13a7b0c0, 0x13d95de0,
+  0x140b02a0, 0x143ca760, 0x146e43a0, 0x149fe000, 0x14d17c60, 0x150318c0,
+  0x1534aca0, 0x15663840, 0x1597c3e0, 0x15c94f60, 0x15fadb00, 0x162c5e20,
+  0x165dd900, 0x168f53c0, 0x16c0cea0, 0x16f24100, 0x1723b360, 0x175525c0,
+  0x17868fe0, 0x17b7f180, 0x17e95b80, 0x181ab4c0, 0x184c1660, 0x187d6fa0,
+  0x18aec080, 0x18e01140, 0x19116220, 0x1942aaa0, 0x1973eac0, 0x19a52ac0,
+  0x19d66ae0, 0x1a07a280, 0x1a38da40, 0x1a6a0980, 0x1a9b38e0, 0x1acc5fc0,
+  0x1afd86a0, 0x1b2ea520, 0x1b5fc3c0, 0x1b90d9e0, 0x1bc1f000, 0x1bf2fdc0,
+  0x1c240b80, 0x1c5510e0, 0x1c860dc0, 0x1cb71320, 0x1ce807c0, 0x1d18fc60,
+  0x1d49f0e0, 0x1d7add20, 0x1dabc0e0, 0x1ddca4c0, 0x1e0d8880, 0x1e3e5b80,
+  0x1e6f36e0, 0x1ea001a0, 0x1ed0d4a0, 0x1f0196e0, 0x1f325920, 0x1f631b60,
+  0x1f93cce0, 0x1fc486a0, 0x1ff52fc0, 0x2025d8c0, 0x20568200, 0x20872280,
+  0x20b7bb00, 0x20e85340, 0x2118e340, 0x21497300, 0x2179f240, 0x21aa79c0,
+  0x21daf080, 0x220b6740, 0x223bde00, 0x226c4c40, 0x229cb240, 0x22cd1000,
+  0x22fd6d80, 0x232dc2c0, 0x235e1800, 0x238e64c0, 0x23bea900, 0x23eeed80,
+  0x241f2980, 0x244f5d40, 0x247f90c0, 0x24afbc00, 0x24dfdf00, 0x251001c0,
+  0x25401c40, 0x25702e80, 0x25a03800, 0x25d041c0, 0x26004300, 0x26304480,
+  0x26603d40, 0x26902e00, 0x26c01600, 0x26effe40, 0x271fde00, 0x274fb540,
+  0x277f8440, 0x27af5340, 0x27df19c0, 0x280ed800, 0x283e9640, 0x286e4c00,
+  0x289df980, 0x28cd9e80, 0x28fd4380, 0x292ce040, 0x295c7480, 0x298c0040,
+  0x29bb83c0, 0x29eb0740, 0x2a1a8280, 0x2a49f500, 0x2a7967c0, 0x2aa8d200,
+  0x2ad83400, 0x2b078d80, 0x2b36dec0, 0x2b662780, 0x2b957040, 0x2bc4b080,
+  0x2bf3e880, 0x2c231840, 0x2c5247c0, 0x2c816f00, 0x2cb08dc0, 0x2cdfa440,
+  0x2d0eb240, 0x2d3db800, 0x2d6cbd80, 0x2d9bb280, 0x2dcaa740, 0x2df993c0,
+  0x2e288040, 0x2e575c00, 0x2e862f40, 0x2eb502c0, 0x2ee3cd80, 0x2f129040,
+  0x2f414a40, 0x2f6ffc00, 0x2f9ea580, 0x2fcd4ec0, 0x2ffbe780, 0x302a8000,
+  0x30591040, 0x30879800, 0x30b61780, 0x30e48e80, 0x3112fd40, 0x31416380,
+  0x316fc9c0, 0x319e1f40, 0x31cc74c0, 0x31fab980, 0x3228fe40, 0x32573a80,
+  0x32856e80, 0x32b39a00, 0x32e1bd00, 0x330fd800, 0x333dea40, 0x336bf440,
+  0x3399fe40, 0x33c7f780, 0x33f5e840, 0x3423d940, 0x3451b940, 0x347f9940,
+  0x34ad6880, 0x34db37c0, 0x3508fec0, 0x3536b4c0, 0x35646b00, 0x35921040,
+  0x35bfb580, 0x35ed5280, 0x361ae700, 0x36486ac0, 0x3675ee80, 0x36a36a00,
+  0x36d0d480, 0x36fe3f40, 0x372ba180, 0x3758f300, 0x37864440, 0x37b38d80,
+  0x37e0c5c0, 0x380dfe00, 0x383b2580, 0x38684d00, 0x389563c0, 0x38c27a80,
+  0x38ef8040, 0x391c8640, 0x39497b80, 0x39766840, 0x39a34cc0, 0x39d028c0,
+  0x39fd04c0, 0x3a29cfc0, 0x3a568a40, 0x3a8344c0, 0x3aaff6c0, 0x3adca080,
+  0x3b093980, 0x3b35d240, 0x3b625a80, 0x3b8ee280, 0x3bbb59c0, 0x3be7c8c0,
+  0x3c142f80, 0x3c408d80, 0x3c6ce340, 0x3c9930c0, 0x3cc56d40, 0x3cf1aa00,
+  0x3d1dd5c0, 0x3d4a01c0, 0x3d761cc0, 0x3da22f80, 0x3dce39c0, 0x3dfa3340,
+  0x3e262cc0, 0x3e521580, 0x3e7dfe40, 0x3ea9d640, 0x3ed5a5c0, 0x3f016d00,
+  0x3f2d2340, 0x3f58d9c0, 0x3f847f40, 0x3fb02500, 0x3fdbb9c0, 0x40073dff,
+  0x4032c1ff, 0x405e3d7f, 0x4089a87f, 0x40b50aff, 0x40e064ff, 0x410bb6ff,
+  0x4136f7ff, 0x416238ff, 0x418d68ff, 0x41b890ff, 0x41e3a7ff, 0x420ebeff,
+  0x4239c4ff, 0x4264c2ff, 0x428fb87f, 0x42baa57f, 0x42e581ff, 0x43105dff,
+  0x433b297f, 0x4365e47f, 0x43909eff, 0x43bb48ff, 0x43e5ea7f, 0x441083ff,
+  0x443b0c7f, 0x4465947f, 0x449003ff, 0x44ba72ff, 0x44e4d9ff, 0x450f2fff,
+  0x45397dff, 0x4563ba7f, 0x458df77f, 0x45b823ff, 0x45e2477f, 0x460c5a7f,
+  0x46366d7f, 0x46606f7f, 0x468a60ff, 0x46b4527f, 0x46de32ff, 0x470802ff,
+  0x4731d2ff, 0x475b91ff, 0x4785487f, 0x47aeee7f, 0x47d8947f, 0x4802217f,
+  0x482badff, 0x485529ff, 0x487e9d7f, 0x48a808ff, 0x48d162ff, 0x48fab4ff,
+  0x4923f67f, 0x494d37ff, 0x49765fff, 0x499f87ff, 0x49c89f7f, 0x49f1adff,
+  0x4a1aac7f, 0x4a43a1ff, 0x4a6c8f7f, 0x4a95747f, 0x4abe487f, 0x4ae70bff,
+  0x4b0fc6ff, 0x4b3879ff, 0x4b6123ff, 0x4b89bd7f, 0x4bb245ff, 0x4bdaceff,
+  0x4c0346ff, 0x4c2badff, 0x4c540cff, 0x4c7c62ff, 0x4ca4a8ff, 0x4ccce5ff,
+  0x4cf51aff, 0x4d1d3eff, 0x4d4551ff, 0x4d6d5cff, 0x4d955f7f, 0x4dbd597f,
+  0x4de542ff, 0x4e0d1b7f, 0x4e34eb7f, 0x4e5cb37f, 0x4e846a7f, 0x4eac18ff,
+  0x4ed3b6ff, 0x4efb4bff, 0x4f22d0ff, 0x4f4a4cff, 0x4f71c0ff, 0x4f9923ff,
+  0x4fc0767f, 0x4fe7c07f, 0x500f01ff, 0x503632ff, 0x505d5aff, 0x508472ff,
+  0x50ab81ff, 0x50d2807f, 0x50f9767f, 0x51205bff, 0x5147387f, 0x516e04ff,
+  0x5194c87f, 0x51bb7b7f, 0x51e225ff, 0x5208bfff, 0x522f50ff, 0x5255d9ff,
+  0x527c49ff, 0x52a2b17f, 0x52c9107f, 0x52ef5eff, 0x5315a47f, 0x533bd9ff,
+  0x5362067f, 0x5388227f, 0x53ae2d7f, 0x53d4307f, 0x53fa2aff, 0x5420147f,
+  0x5445ed7f, 0x546bbd7f, 0x54917d7f, 0x54b7347f, 0x54dcdaff, 0x5502797f,
+  0x5528067f, 0x554d837f, 0x5572f77f, 0x559862ff, 0x55bdb5ff, 0x55e2ffff,
+  0x560841ff, 0x562d72ff, 0x56529b7f, 0x5677aaff, 0x569cba7f, 0x56c1b0ff,
+  0x56e69eff, 0x570b847f, 0x5730597f, 0x57551d7f, 0x5779d8ff, 0x579e83ff,
+  0x57c31dff, 0x57e7af7f, 0x580c307f, 0x5830a8ff, 0x585510ff, 0x587967ff,
+  0x589db67f, 0x58c1f3ff, 0x58e6297f, 0x590a45ff, 0x592e61ff, 0x595264ff,
+  0x59765fff, 0x599a49ff, 0x59be2b7f, 0x59e1fbff, 0x5a05bbff, 0x5a29737f,
+  0x5a4d1a7f, 0x5a70b07f, 0x5a943dff, 0x5ab7baff, 0x5adb26ff, 0x5afe8a7f,
+  0x5b21dd7f, 0x5b451fff, 0x5b68597f, 0x5b8b827f, 0x5bae9a7f, 0x5bd1aa7f,
+  0x5bf4a97f, 0x5c1797ff, 0x5c3a7d7f, 0x5c5d4a7f, 0x5c8016ff, 0x5ca2ca7f,
+  0x5cc575ff, 0x5ce80fff, 0x5d0a997f, 0x5d2d1aff, 0x5d4f8b7f, 0x5d71eaff,
+  0x5d9439ff, 0x5db6807f, 0x5dd8b5ff, 0x5dfadaff, 0x5e1cf77f, 0x5e3f037f,
+  0x5e60fe7f, 0x5e82e87f, 0x5ea4ca7f, 0x5ec69b7f, 0x5ee85b7f, 0x5f0a0aff,
+  0x5f2bb1ff, 0x5f4d487f, 0x5f6ecdff, 0x5f904aff, 0x5fb1aeff, 0x5fd30aff,
+  0x5ff4557f, 0x601597ff, 0x6036c17f, 0x6057e1ff, 0x6078f27f, 0x6099f17f,
+  0x60bae87f, 0x60dbceff, 0x60fca3ff, 0x611d68ff, 0x613e1c7f, 0x615ec7ff,
+  0x617f627f, 0x619fec7f, 0x61c0657f, 0x61e0cdff, 0x62012dff, 0x62217cff,
+  0x6241bb7f, 0x6261e8ff, 0x628205ff, 0x62a21a7f, 0x62c21dff, 0x62e210ff,
+  0x6301f2ff, 0x6321c47f, 0x63418d7f, 0x63613cff, 0x6380e47f, 0x63a07aff,
+  0x63c000ff, 0x63df7e7f, 0x63fee2ff, 0x641e3e7f, 0x643d89ff, 0x645cc3ff,
+  0x647bed7f, 0x649b067f, 0x64ba16ff, 0x64d90dff, 0x64f7fcff, 0x6516daff,
+  0x6535a87f, 0x655464ff, 0x657318ff, 0x6591b3ff, 0x65b0467f, 0x65cebfff,
+  0x65ed30ff, 0x660b90ff, 0x6629e07f, 0x66481f7f, 0x6666557f, 0x668472ff,
+  0x66a2877f, 0x66c082ff, 0x66de767f, 0x66fc587f, 0x671a2a7f, 0x6737eaff,
+  0x67559aff, 0x677342ff, 0x6790d17f, 0x67ae577f, 0x67cbc47f, 0x67e928ff,
+  0x68067cff, 0x6823bfff, 0x6840f1ff, 0x685e137f, 0x687b247f, 0x6898247f,
+  0x68b5137f, 0x68d1f9ff, 0x68eec7ff, 0x690b8cff, 0x692838ff, 0x6944dc7f,
+  0x696166ff, 0x697de8ff, 0x699a5a7f, 0x69b6baff, 0x69d30aff, 0x69ef49ff,
+  0x6a0b77ff, 0x6a27957f, 0x6a43a1ff, 0x6a5f9dff, 0x6a7b88ff, 0x6a976bff,
+  0x6ab3357f, 0x6aceedff, 0x6aea9e7f, 0x6b06357f, 0x6b21c47f, 0x6b3d39ff,
+  0x6b58a77f, 0x6b73fb7f, 0x6b8f46ff, 0x6baa797f, 0x6bc5a3ff, 0x6be0bd7f,
+  0x6bfbbd7f, 0x6c16b57f, 0x6c319c7f, 0x6c4c69ff, 0x6c672f7f, 0x6c81e47f,
+  0x6c9c7fff, 0x6cb712ff, 0x6cd1957f, 0x6cec06ff, 0x6d065f7f, 0x6d20af7f,
+  0x6d3aeeff, 0x6d5514ff, 0x6d6f327f, 0x6d893f7f, 0x6da3337f, 0x6dbd1eff,
+  0x6dd6f97f, 0x6df0baff, 0x6e0a73ff, 0x6e2413ff, 0x6e3dab7f, 0x6e57297f,
+  0x6e709f7f, 0x6e89fc7f, 0x6ea350ff, 0x6ebc8bff, 0x6ed5beff, 0x6eeed87f,
+  0x6f07e17f, 0x6f20d97f, 0x6f39c97f, 0x6f529fff, 0x6f6b657f, 0x6f841a7f,
+  0x6f9cbeff, 0x6fb5527f, 0x6fcdd4ff, 0x6fe646ff, 0x6ffe9f7f, 0x7016efff,
+  0x702f2f7f, 0x704755ff, 0x705f73ff, 0x707778ff, 0x708f757f, 0x70a7587f,
+  0x70bf2aff, 0x70d6ecff, 0x70eea5ff, 0x7106467f, 0x711dd5ff, 0x71354bff,
+  0x714cb9ff, 0x716416ff, 0x717b637f, 0x7192967f, 0x71a9c0ff, 0x71c0d2ff,
+  0x71d7d37f, 0x71eec37f, 0x7205a2ff, 0x721c717f, 0x72332eff, 0x7249dbff,
+  0x726077ff, 0x7276faff, 0x728d757f, 0x72a3d6ff, 0x72ba2fff, 0x72d06fff,
+  0x72e69eff, 0x72fcbd7f, 0x7312caff, 0x7328beff, 0x733eaaff, 0x73547dff,
+  0x736a487f, 0x737ff97f, 0x739599ff, 0x73ab29ff, 0x73c0a8ff, 0x73d616ff,
+  0x73eb6bff, 0x7400b87f, 0x7415ebff, 0x742b0e7f, 0x7440207f, 0x7455217f,
+  0x746a11ff, 0x747ef17f, 0x7493b7ff, 0x74a875ff, 0x74bd1a7f, 0x74d1ae7f,
+  0x74e631ff, 0x74faa47f, 0x750efdff, 0x75234e7f, 0x7537867f, 0x754bad7f,
+  0x755fc37f, 0x7573c8ff, 0x7587bdff, 0x759b997f, 0x75af6c7f, 0x75c3267f,
+  0x75d6cf7f, 0x75ea67ff, 0x75fdef7f, 0x76115dff, 0x7624c3ff, 0x763810ff,
+  0x764b4cff, 0x765e787f, 0x76718a7f, 0x7684947f, 0x769784ff, 0x76aa64ff,
+  0x76bd33ff, 0x76cff1ff, 0x76e29f7f, 0x76f533ff, 0x7707b77f, 0x771a2a7f,
+  0x772c8c7f, 0x773edd7f, 0x7751157f, 0x77633cff, 0x77755bff, 0x778758ff,
+  0x77994dff, 0x77ab327f, 0x77bcfd7f, 0x77ceb77f, 0x77e060ff, 0x77f1f97f,
+  0x780378ff, 0x7814e7ff, 0x782645ff, 0x783792ff, 0x7848cf7f, 0x7859f27f,
+  0x786b04ff, 0x787c06ff, 0x788cf7ff, 0x789dd7ff, 0x78ae9eff, 0x78bf54ff,
+  0x78cffa7f, 0x78e08eff, 0x78f10a7f, 0x79017d7f, 0x7911d77f, 0x7922187f,
+  0x7932507f, 0x79426fff, 0x79527e7f, 0x79627bff, 0x797268ff, 0x79823c7f,
+  0x7991ff7f, 0x79a1b17f, 0x79b152ff, 0x79c0e37f, 0x79d05aff, 0x79dfc17f,
+  0x79ef177f, 0x79fe53ff, 0x7a0d7fff, 0x7a1c9b7f, 0x7a2ba57f, 0x7a3a9eff,
+  0x7a497f7f, 0x7a584f7f, 0x7a670dff, 0x7a75b3ff, 0x7a8450ff, 0x7a92d57f,
+  0x7aa1487f, 0x7aafa2ff, 0x7abdec7f, 0x7acc24ff, 0x7ada4cff, 0x7ae863ff,
+  0x7af661ff, 0x7b044eff, 0x7b122b7f, 0x7b1fee7f, 0x7b2da0ff, 0x7b3b42ff,
+  0x7b48d37f, 0x7b564b7f, 0x7b63b27f, 0x7b71087f, 0x7b7e4dff, 0x7b8b79ff,
+  0x7b98957f, 0x7ba59fff, 0x7bb299ff, 0x7bbf7aff, 0x7bcc4aff, 0x7bd9017f,
+  0x7be5afff, 0x7bf244ff, 0x7bfec97f, 0x7c0b34ff, 0x7c1797ff, 0x7c23e17f,
+  0x7c3011ff, 0x7c3c3a7f, 0x7c48497f, 0x7c54477f, 0x7c602c7f, 0x7c6c08ff,
+  0x7c77ccff, 0x7c8376ff, 0x7c8f18ff, 0x7c9aa1ff, 0x7ca619ff, 0x7cb1787f,
+  0x7cbcceff, 0x7cc80c7f, 0x7cd3307f, 0x7cde4c7f, 0x7ce94eff, 0x7cf4407f,
+  0x7cff197f, 0x7d09e0ff, 0x7d1497ff, 0x7d1f3e7f, 0x7d29cb7f, 0x7d3447ff,
+  0x7d3eb37f, 0x7d4905ff, 0x7d53477f, 0x7d5d787f, 0x7d67987f, 0x7d719f7f,
+  0x7d7b957f, 0x7d85727f, 0x7d8f46ff, 0x7d99027f, 0x7da2a4ff, 0x7dac3e7f,
+  0x7db5bf7f, 0x7dbf26ff, 0x7dc885ff, 0x7dd1cbff, 0x7ddb017f, 0x7de41d7f,
+  0x7ded287f, 0x7df622ff, 0x7dff0c7f, 0x7e07dd7f, 0x7e109cff, 0x7e19437f,
+  0x7e21d97f, 0x7e2a5e7f, 0x7e32d27f, 0x7e3b2dff, 0x7e4377ff, 0x7e4bb17f,
+  0x7e53d1ff, 0x7e5be17f, 0x7e63e07f, 0x7e6bc5ff, 0x7e739aff, 0x7e7b5eff,
+  0x7e8309ff, 0x7e8aac7f, 0x7e922d7f, 0x7e99a5ff, 0x7ea1057f, 0x7ea84bff,
+  0x7eaf89ff, 0x7eb6ae7f, 0x7ebdc27f, 0x7ec4bcff, 0x7ecba6ff, 0x7ed2807f,
+  0x7ed948ff, 0x7edff7ff, 0x7ee68dff, 0x7eed1bff, 0x7ef3907f, 0x7ef9f47f,
+  0x7f003eff, 0x7f0678ff, 0x7f0ca1ff, 0x7f12b9ff, 0x7f18b8ff, 0x7f1e9eff,
+  0x7f247c7f, 0x7f2a40ff, 0x7f2ff47f, 0x7f358eff, 0x7f3b18ff, 0x7f4091ff,
+  0x7f45f17f, 0x7f4b407f, 0x7f507e7f, 0x7f55abff, 0x7f5abfff, 0x7f5fbb7f,
+  0x7f64adff, 0x7f69877f, 0x7f6e47ff, 0x7f72ffff, 0x7f779e7f, 0x7f7c23ff,
+  0x7f80a17f, 0x7f85057f, 0x7f89507f, 0x7f8d8a7f, 0x7f91b3ff, 0x7f95cc7f,
+  0x7f99cbff, 0x7f9dba7f, 0x7fa1987f, 0x7fa55cff, 0x7fa910ff, 0x7facabff,
+  0x7fb0357f, 0x7fb3aeff, 0x7fb70eff, 0x7fba667f, 0x7fbd9c7f, 0x7fc0ca7f,
+  0x7fc3deff, 0x7fc6e27f, 0x7fc9ccff, 0x7fcca6ff, 0x7fcf6fff, 0x7fd21fff,
+  0x7fd4beff, 0x7fd74d7f, 0x7fd9c27f, 0x7fdc26ff, 0x7fde71ff, 0x7fe0ac7f,
+  0x7fe2d5ff, 0x7fe4eeff, 0x7fe6ee7f, 0x7fe8dd7f, 0x7feab37f, 0x7fec787f,
+  0x7fee2c7f, 0x7fefcfff, 0x7ff15a7f, 0x7ff2cb7f, 0x7ff433ff, 0x7ff5837f,
+  0x7ff6b9ff, 0x7ff7e7ff, 0x7ff8fcff, 0x7ff9f87f, 0x7ffae37f, 0x7ffbbd7f,
+  0x7ffc86ff, 0x7ffd36ff, 0x7ffdd67f, 0x7ffe5c7f, 0x7ffed1ff, 0x7fff367f,
+  0x7fff8a7f, 0x7fffc57f, 0x7fffe6ff, 0x7fffffff};
 
 const WORD32 ixheaacd_sine_win_64[64] = {
-    0x019220ff, 0x04b6177f, 0x07d95dd7, 0x0afb655f, 0x0e1bc11f, 0x1139f33f,
-    0x1455757f, 0x176ddabf, 0x1a829cff, 0x1d934eff, 0x209f72ff, 0x23a68aff,
-    0x26a821ff, 0x29a3c1ff, 0x2c98fe7f, 0x2f8750bf, 0x326e547f, 0x354d93ff,
-    0x382491bf, 0x3af2f13f, 0x3db8347f, 0x4073eeff, 0x4325c3ff, 0x45cd357f,
-    0x4869e7ff, 0x4afb6dff, 0x4d81627f, 0x4ffb697f, 0x5269167f, 0x54ca0bff,
-    0x571deeff, 0x5964627f, 0x5b9d12ff, 0x5dc79aff, 0x5fe3afff, 0x61f0fdff,
-    0x63ef307f, 0x65ddfc7f, 0x67bd0dff, 0x698c21ff, 0x6b4af4ff, 0x6cf9337f,
-    0x6e96aaff, 0x70230fff, 0x719e2fff, 0x7307bfff, 0x745f9dff, 0x75a586ff,
-    0x76d948ff, 0x77fab97f, 0x7909a67f, 0x7a05ee7f, 0x7aef66ff, 0x7bc5de7f,
-    0x7c894c7f, 0x7d397dff, 0x7dd6627f, 0x7e5fe0ff, 0x7ed5e8ff, 0x7f3857ff,
-    0x7f872eff, 0x7fc2547f, 0x7fe9c87f, 0x7ffd8aff};
+  0x019220ff, 0x04b6177f, 0x07d95dd7, 0x0afb655f, 0x0e1bc11f, 0x1139f33f,
+  0x1455757f, 0x176ddabf, 0x1a829cff, 0x1d934eff, 0x209f72ff, 0x23a68aff,
+  0x26a821ff, 0x29a3c1ff, 0x2c98fe7f, 0x2f8750bf, 0x326e547f, 0x354d93ff,
+  0x382491bf, 0x3af2f13f, 0x3db8347f, 0x4073eeff, 0x4325c3ff, 0x45cd357f,
+  0x4869e7ff, 0x4afb6dff, 0x4d81627f, 0x4ffb697f, 0x5269167f, 0x54ca0bff,
+  0x571deeff, 0x5964627f, 0x5b9d12ff, 0x5dc79aff, 0x5fe3afff, 0x61f0fdff,
+  0x63ef307f, 0x65ddfc7f, 0x67bd0dff, 0x698c21ff, 0x6b4af4ff, 0x6cf9337f,
+  0x6e96aaff, 0x70230fff, 0x719e2fff, 0x7307bfff, 0x745f9dff, 0x75a586ff,
+  0x76d948ff, 0x77fab97f, 0x7909a67f, 0x7a05ee7f, 0x7aef66ff, 0x7bc5de7f,
+  0x7c894c7f, 0x7d397dff, 0x7dd6627f, 0x7e5fe0ff, 0x7ed5e8ff, 0x7f3857ff,
+  0x7f872eff, 0x7fc2547f, 0x7fe9c87f, 0x7ffd8aff};
 
 const WORD32 ixheaacd_sine_win_768[768] = {
-    0x0021858b, 0x0064883f, 0x00a78af3, 0x00ea960a, 0x012d98bf, 0x01709b73,
-    0x01b39e27, 0x01f6a0db, 0x0239a38f, 0x027ca643, 0x02bfa8f7, 0x0302abab,
-    0x0345ae5f, 0x0388a8af, 0x03cbab63, 0x040ea5b7, 0x0451a007, 0x04949a57,
-    0x04d794a7, 0x051a8ef7, 0x055d8947, 0x05a07b37, 0x05e36d1f, 0x06265f0f,
-    0x066950ff, 0x06ac42e7, 0x06ef2c6f, 0x073215ff, 0x0774ff87, 0x07b7e90f,
-    0x07faca37, 0x083db3bf, 0x088094df, 0x08c36daf, 0x09064ecf, 0x0949278f,
-    0x098bf7ef, 0x09ced0af, 0x0a11a10f, 0x0a54716f, 0x0a97396f, 0x0ada016f,
-    0x0b1cc95f, 0x0b5f915f, 0x0ba250ff, 0x0be5082f, 0x0c27bf5f, 0x0c6a768f,
-    0x0cad2dcf, 0x0cefdc9f, 0x0d32830f, 0x0d7531df, 0x0db7cfdf, 0x0dfa764f,
-    0x0e3d145f, 0x0e7fa9ff, 0x0ec23faf, 0x0f04ccef, 0x0f475a2f, 0x0f89e76f,
-    0x0fcc6c4f, 0x100ee8df, 0x1051653f, 0x1093d95f, 0x10d64d7f, 0x1118b93f,
-    0x115b24df, 0x119d883f, 0x11dfeb7f, 0x1222467f, 0x126498ff, 0x12a6eb9f,
-    0x12e935bf, 0x132b7fdf, 0x136db93f, 0x13affaff, 0x13f22bff, 0x14345cff,
-    0x14768dff, 0x14b8ae3f, 0x14face5f, 0x153cee9f, 0x157efdff, 0x15c10d7f,
-    0x1603147f, 0x16451b9f, 0x16871a3f, 0x16c9107f, 0x170afe5f, 0x174ce3df,
-    0x178ec95f, 0x17d0a67f, 0x18127b1f, 0x18544fdf, 0x189613df, 0x18d7d7bf,
-    0x1919933f, 0x195b467f, 0x199cf99f, 0x19de9bff, 0x1a203e5f, 0x1a61d85f,
-    0x1aa369ff, 0x1ae4f33f, 0x1b2673ff, 0x1b67ec7f, 0x1ba964df, 0x1beacc9f,
-    0x1c2c343f, 0x1c6d937f, 0x1caee1ff, 0x1cf0307f, 0x1d31769f, 0x1d72b45f,
-    0x1db3e99f, 0x1df5169f, 0x1e363b1f, 0x1e77573f, 0x1eb86b1f, 0x1ef9767f,
-    0x1f3a797f, 0x1f7b741f, 0x1fbc663f, 0x1ffd501f, 0x203e317f, 0x207f0abf,
-    0x20bfd2ff, 0x21009b3f, 0x21415aff, 0x21820a3f, 0x21c2b93f, 0x220357bf,
-    0x2243ed7f, 0x22847b3f, 0x22c5003f, 0x23057cff, 0x2345f17f, 0x238654ff,
-    0x23c6b8bf, 0x24070b7f, 0x244755ff, 0x248797ff, 0x24c7c93f, 0x2507fabf,
-    0x25481b3f, 0x2588333f, 0x25c842ff, 0x26084a3f, 0x264840ff, 0x26882eff,
-    0x26c814bf, 0x2707e9bf, 0x2747b67f, 0x27877abf, 0x27c7367f, 0x2806e9ff,
-    0x28468cbf, 0x28861e7f, 0x28c5b07f, 0x2905317f, 0x2944aa3f, 0x2984123f,
-    0x29c371bf, 0x2a02c8ff, 0x2a420f7f, 0x2a814d7f, 0x2ac082ff, 0x2affa7ff,
-    0x2b3ec47f, 0x2b7dcfff, 0x2bbcd33f, 0x2bfbc5bf, 0x2c3aafff, 0x2c7991bf,
-    0x2cb862bf, 0x2cf72b3f, 0x2d35e2ff, 0x2d74927f, 0x2db330ff, 0x2df1c73f,
-    0x2e304cbf, 0x2e6ec9ff, 0x2ead363f, 0x2eeb99ff, 0x2f29ed3f, 0x2f682f7f,
-    0x2fa671ff, 0x2fe49aff, 0x3022bbff, 0x3060cbff, 0x309ed37f, 0x30dcca7f,
-    0x311ab8ff, 0x3158967f, 0x3196637f, 0x31d427ff, 0x3211dbbf, 0x324f873f,
-    0x328d21bf, 0x32caab7f, 0x33082cff, 0x3345953f, 0x3382fd7f, 0x33c04c7f,
-    0x33fd933f, 0x343ac93f, 0x3477f6bf, 0x34b50aff, 0x34f216ff, 0x352f1a7f,
-    0x356c04ff, 0x35a8e6ff, 0x35e5b83f, 0x362278bf, 0x365f30ff, 0x369bcfbf,
-    0x36d8663f, 0x3714ec3f, 0x3751697f, 0x378dcdbf, 0x37ca297f, 0x3806747f,
-    0x3842aebf, 0x387ed83f, 0x38baf97f, 0x38f7013f, 0x393300bf, 0x396eefbf,
-    0x39aacd7f, 0x39e69abf, 0x3a22573f, 0x3a5e02ff, 0x3a999dbf, 0x3ad5303f,
-    0x3b10a97f, 0x3b4c1a7f, 0x3b87723f, 0x3bc2c1bf, 0x3bfe003f, 0x3c392dff,
-    0x3c7442bf, 0x3caf4eff, 0x3cea4a7f, 0x3d25353f, 0x3d600f3f, 0x3d9ad83f,
-    0x3dd5883f, 0x3e102fff, 0x3e4ac6bf, 0x3e854cbf, 0x3ebfb9bf, 0x3efa1e3f,
-    0x3f3471ff, 0x3f6eac7f, 0x3fa8debf, 0x3fe2f7bf, 0x401cffff, 0x4056ffff,
-    0x4090e67f, 0x40cabc7f, 0x4104817f, 0x413e2d7f, 0x4177d0ff, 0x41b15b7f,
-    0x41eadd7f, 0x422445ff, 0x425d9e7f, 0x4296e57f, 0x42d0137f, 0x4309397f,
-    0x434245ff, 0x437b417f, 0x43b42cff, 0x43ed06ff, 0x4425c7ff, 0x445e787f,
-    0x449717ff, 0x44cfa67f, 0x4508247f, 0x4540897f, 0x4578dd7f, 0x45b1207f,
-    0x45e94a7f, 0x462163ff, 0x46596c7f, 0x46915bff, 0x46c942ff, 0x4701107f,
-    0x4738c57f, 0x4770717f, 0x47a7fbff, 0x47df7e7f, 0x4816e77f, 0x484e3fff,
-    0x4885877f, 0x48bcb5ff, 0x48f3d37f, 0x492ad7ff, 0x4961cbff, 0x4998ae7f,
-    0x49cf787f, 0x4a06317f, 0x4a3cd17f, 0x4a73607f, 0x4aa9de7f, 0x4ae0437f,
-    0x4b168f7f, 0x4b4cd2ff, 0x4b82f4ff, 0x4bb90e7f, 0x4bef067f, 0x4c24f67f,
-    0x4c5ac47f, 0x4c9089ff, 0x4cc6367f, 0x4cfbc9ff, 0x4d314c7f, 0x4d66b5ff,
-    0x4d9c0e7f, 0x4dd14dff, 0x4e06747f, 0x4e3b927f, 0x4e708eff, 0x4ea57a7f,
-    0x4eda4cff, 0x4f0f0e7f, 0x4f43bf7f, 0x4f784eff, 0x4faccd7f, 0x4fe13aff,
-    0x50158f7f, 0x5049caff, 0x507ded7f, 0x50b1feff, 0x50e5ff7f, 0x5119deff,
-    0x514dacff, 0x51816aff, 0x51b50f7f, 0x51e89a7f, 0x521c0c7f, 0x524f6dff,
-    0x5282b5ff, 0x52b5e4ff, 0x52e9037f, 0x531c087f, 0x534ef47f, 0x5381c6ff,
-    0x53b488ff, 0x53e731ff, 0x5419c17f, 0x544c407f, 0x547e9d7f, 0x54b0e9ff,
-    0x54e325ff, 0x55153fff, 0x5547497f, 0x5579397f, 0x55ab107f, 0x55dcce7f,
-    0x560e737f, 0x5640077f, 0x567181ff, 0x56a2e3ff, 0x56d42bff, 0x57055b7f,
-    0x573679ff, 0x57677f7f, 0x579862ff, 0x57c935ff, 0x57f9efff, 0x582a98ff,
-    0x585b207f, 0x588b8eff, 0x58bbec7f, 0x58ec287f, 0x591c53ff, 0x594c65ff,
-    0x597c5eff, 0x59ac3e7f, 0x59dc057f, 0x5a0bb27f, 0x5a3b46ff, 0x5a6ac1ff,
-    0x5a9a2c7f, 0x5ac974ff, 0x5af8a4ff, 0x5b27c37f, 0x5b56c0ff, 0x5b85a4ff,
-    0x5bb4787f, 0x5be329ff, 0x5c11c27f, 0x5c404a7f, 0x5c6eb07f, 0x5c9d05ff,
-    0x5ccb39ff, 0x5cf954ff, 0x5d27567f, 0x5d55477f, 0x5d83167f, 0x5db0cc7f,
-    0x5dde697f, 0x5e0bed7f, 0x5e3957ff, 0x5e66a97f, 0x5e93d97f, 0x5ec0f87f,
-    0x5eedfe7f, 0x5f1ae2ff, 0x5f47adff, 0x5f74687f, 0x5fa1017f, 0x5fcd80ff,
-    0x5ff9df7f, 0x60262c7f, 0x605260ff, 0x607e737f, 0x60aa6cff, 0x60d64d7f,
-    0x6102147f, 0x612dc27f, 0x6159577f, 0x6184caff, 0x61b024ff, 0x61db65ff,
-    0x62068d7f, 0x62319c7f, 0x625c897f, 0x6287657f, 0x62b2207f, 0x62dcb97f,
-    0x630741ff, 0x6331a8ff, 0x635bf67f, 0x63862aff, 0x63b0467f, 0x63da407f,
-    0x640420ff, 0x642de87f, 0x64578e7f, 0x64811aff, 0x64aa8e7f, 0x64d3e8ff,
-    0x64fd21ff, 0x6526417f, 0x654f47ff, 0x65782cff, 0x65a0f8ff, 0x65c9ab7f,
-    0x65f244ff, 0x661abcff, 0x66431bff, 0x666b58ff, 0x66937cff, 0x66bb87ff,
-    0x66e3717f, 0x670b417f, 0x6732f87f, 0x675a8dff, 0x678209ff, 0x67a96d7f,
-    0x67d0aeff, 0x67f7d6ff, 0x681eddff, 0x6845cb7f, 0x686c97ff, 0x689352ff,
-    0x68b9e47f, 0x68e064ff, 0x6906bbff, 0x692d01ff, 0x695325ff, 0x697928ff,
-    0x699f127f, 0x69c4e2ff, 0x69ea91ff, 0x6a10277f, 0x6a359bff, 0x6a5af6ff,
-    0x6a802fff, 0x6aa5507f, 0x6aca577f, 0x6aef34ff, 0x6b1400ff, 0x6b38abff,
-    0x6b5d357f, 0x6b81a57f, 0x6ba5f3ff, 0x6bca297f, 0x6bee3d7f, 0x6c1237ff,
-    0x6c3610ff, 0x6c59d0ff, 0x6c7d6f7f, 0x6ca0f4ff, 0x6cc4587f, 0x6ce79a7f,
-    0x6d0ac37f, 0x6d2dd37f, 0x6d50b97f, 0x6d738e7f, 0x6d96397f, 0x6db8cb7f,
-    0x6ddb447f, 0x6dfd9b7f, 0x6e1fd17f, 0x6e41edff, 0x6e63e8ff, 0x6e85c27f,
-    0x6ea7827f, 0x6ec9297f, 0x6eeaa6ff, 0x6f0c0aff, 0x6f2d557f, 0x6f4e767f,
-    0x6f6f867f, 0x6f906cff, 0x6fb139ff, 0x6fd1e4ff, 0x6ff2777f, 0x7012e7ff,
-    0x7033377f, 0x705364ff, 0x7073797f, 0x70936c7f, 0x70b345ff, 0x70d2fdff,
-    0x70f294ff, 0x711209ff, 0x713165ff, 0x71509fff, 0x716fc17f, 0x718eb87f,
-    0x71ad967f, 0x71cc52ff, 0x71eaf67f, 0x7209787f, 0x7227d87f, 0x724616ff,
-    0x72643cff, 0x7282387f, 0x72a022ff, 0x72bde3ff, 0x72db8b7f, 0x72f9097f,
-    0x7316767f, 0x7333b97f, 0x7350daff, 0x736de2ff, 0x738ac9ff, 0x73a7977f,
-    0x73c43aff, 0x73e0c57f, 0x73fd2e7f, 0x741975ff, 0x74359bff, 0x7451a87f,
-    0x746d8aff, 0x7489547f, 0x74a4fc7f, 0x74c08b7f, 0x74dbf07f, 0x74f73bff,
-    0x751265ff, 0x752d6eff, 0x754855ff, 0x75631b7f, 0x757dc77f, 0x759849ff,
-    0x75b2b37f, 0x75ccfaff, 0x75e720ff, 0x76012dff, 0x761b10ff, 0x7634daff,
-    0x764e7a7f, 0x7668017f, 0x7681667f, 0x769aa9ff, 0x76b3d47f, 0x76ccd4ff,
-    0x76e5b3ff, 0x76fe79ff, 0x77171dff, 0x772f987f, 0x7747f97f, 0x776038ff,
-    0x777856ff, 0x77905bff, 0x77a836ff, 0x77bff07f, 0x77d7907f, 0x77ef067f,
-    0x780663ff, 0x781d9f7f, 0x7834b0ff, 0x784ba97f, 0x78627fff, 0x7879357f,
-    0x788fc8ff, 0x78a63b7f, 0x78bc8bff, 0x78d2c37f, 0x78e8d0ff, 0x78febcff,
-    0x7914877f, 0x792a387f, 0x793fbfff, 0x79552dff, 0x796a727f, 0x797f9d7f,
-    0x79949e7f, 0x79a9867f, 0x79be4cff, 0x79d2e97f, 0x79e76c7f, 0x79fbce7f,
-    0x7a1005ff, 0x7a24247f, 0x7a38217f, 0x7a4bfcff, 0x7a5fae7f, 0x7a7346ff,
-    0x7a86bdff, 0x7a9a0aff, 0x7aad3e7f, 0x7ac0507f, 0x7ad3417f, 0x7ae607ff,
-    0x7af8b57f, 0x7b0b38ff, 0x7b1da37f, 0x7b2fec7f, 0x7b420aff, 0x7b5410ff,
-    0x7b65ecff, 0x7b77af7f, 0x7b8947ff, 0x7b9ac77f, 0x7bac1cff, 0x7bbd50ff,
-    0x7bce6bff, 0x7bdf5cff, 0x7bf02c7f, 0x7c00d9ff, 0x7c11667f, 0x7c21d0ff,
-    0x7c3219ff, 0x7c4241ff, 0x7c5247ff, 0x7c622c7f, 0x7c71eeff, 0x7c8187ff,
-    0x7c9107ff, 0x7ca05dff, 0x7caf9a7f, 0x7cbead7f, 0x7ccd9e7f, 0x7cdc767f,
-    0x7ceb247f, 0x7cf9b0ff, 0x7d081bff, 0x7d16657f, 0x7d2484ff, 0x7d328b7f,
-    0x7d406fff, 0x7d4e2aff, 0x7d5bcc7f, 0x7d69447f, 0x7d769a7f, 0x7d83ceff,
-    0x7d90e1ff, 0x7d9dd37f, 0x7daaa37f, 0x7db751ff, 0x7dc3d67f, 0x7dd041ff,
-    0x7ddc82ff, 0x7de8a2ff, 0x7df4a97f, 0x7e0085ff, 0x7e0c38ff, 0x7e17d27f,
-    0x7e234a7f, 0x7e2ea0ff, 0x7e39cd7f, 0x7e44d87f, 0x7e4fc1ff, 0x7e5a897f,
-    0x7e652fff, 0x7e6fb4ff, 0x7e7a17ff, 0x7e8450ff, 0x7e8e717f, 0x7e98677f,
-    0x7ea23bff, 0x7eabeeff, 0x7eb5807f, 0x7ebef07f, 0x7ec8367f, 0x7ed15aff,
-    0x7eda65ff, 0x7ee3477f, 0x7eec06ff, 0x7ef4a57f, 0x7efd197f, 0x7f05747f,
-    0x7f0da5ff, 0x7f15b57f, 0x7f1da37f, 0x7f256fff, 0x7f2d1aff, 0x7f34a47f,
-    0x7f3c037f, 0x7f43417f, 0x7f4a667f, 0x7f5160ff, 0x7f5831ff, 0x7f5ee97f,
-    0x7f65777f, 0x7f6bebff, 0x7f72367f, 0x7f785f7f, 0x7f7e66ff, 0x7f84447f,
-    0x7f8a08ff, 0x7f8fa37f, 0x7f951c7f, 0x7f9a737f, 0x7f9fa97f, 0x7fa4bd7f,
-    0x7fa9a7ff, 0x7fae70ff, 0x7fb3207f, 0x7fb7a5ff, 0x7fbc017f, 0x7fc043ff,
-    0x7fc45c7f, 0x7fc85bff, 0x7fcc317f, 0x7fcfe57f, 0x7fd36f7f, 0x7fd6e07f,
-    0x7fda26ff, 0x7fdd4c7f, 0x7fe04fff, 0x7fe3327f, 0x7fe5f2ff, 0x7fe889ff,
-    0x7feafeff, 0x7fed5aff, 0x7fef8cff, 0x7ff194ff, 0x7ff383ff, 0x7ff548ff,
-    0x7ff6ec7f, 0x7ff86dff, 0x7ff9ce7f, 0x7ffb0d7f, 0x7ffc21ff, 0x7ffd1dff,
-    0x7ffdef7f, 0x7ffe9f7f, 0x7fff25ff, 0x7fff92ff, 0x7fffd5ff, 0x7ffff77f};
+  0x0021858b, 0x0064883f, 0x00a78af3, 0x00ea960a, 0x012d98bf, 0x01709b73,
+  0x01b39e27, 0x01f6a0db, 0x0239a38f, 0x027ca643, 0x02bfa8f7, 0x0302abab,
+  0x0345ae5f, 0x0388a8af, 0x03cbab63, 0x040ea5b7, 0x0451a007, 0x04949a57,
+  0x04d794a7, 0x051a8ef7, 0x055d8947, 0x05a07b37, 0x05e36d1f, 0x06265f0f,
+  0x066950ff, 0x06ac42e7, 0x06ef2c6f, 0x073215ff, 0x0774ff87, 0x07b7e90f,
+  0x07faca37, 0x083db3bf, 0x088094df, 0x08c36daf, 0x09064ecf, 0x0949278f,
+  0x098bf7ef, 0x09ced0af, 0x0a11a10f, 0x0a54716f, 0x0a97396f, 0x0ada016f,
+  0x0b1cc95f, 0x0b5f915f, 0x0ba250ff, 0x0be5082f, 0x0c27bf5f, 0x0c6a768f,
+  0x0cad2dcf, 0x0cefdc9f, 0x0d32830f, 0x0d7531df, 0x0db7cfdf, 0x0dfa764f,
+  0x0e3d145f, 0x0e7fa9ff, 0x0ec23faf, 0x0f04ccef, 0x0f475a2f, 0x0f89e76f,
+  0x0fcc6c4f, 0x100ee8df, 0x1051653f, 0x1093d95f, 0x10d64d7f, 0x1118b93f,
+  0x115b24df, 0x119d883f, 0x11dfeb7f, 0x1222467f, 0x126498ff, 0x12a6eb9f,
+  0x12e935bf, 0x132b7fdf, 0x136db93f, 0x13affaff, 0x13f22bff, 0x14345cff,
+  0x14768dff, 0x14b8ae3f, 0x14face5f, 0x153cee9f, 0x157efdff, 0x15c10d7f,
+  0x1603147f, 0x16451b9f, 0x16871a3f, 0x16c9107f, 0x170afe5f, 0x174ce3df,
+  0x178ec95f, 0x17d0a67f, 0x18127b1f, 0x18544fdf, 0x189613df, 0x18d7d7bf,
+  0x1919933f, 0x195b467f, 0x199cf99f, 0x19de9bff, 0x1a203e5f, 0x1a61d85f,
+  0x1aa369ff, 0x1ae4f33f, 0x1b2673ff, 0x1b67ec7f, 0x1ba964df, 0x1beacc9f,
+  0x1c2c343f, 0x1c6d937f, 0x1caee1ff, 0x1cf0307f, 0x1d31769f, 0x1d72b45f,
+  0x1db3e99f, 0x1df5169f, 0x1e363b1f, 0x1e77573f, 0x1eb86b1f, 0x1ef9767f,
+  0x1f3a797f, 0x1f7b741f, 0x1fbc663f, 0x1ffd501f, 0x203e317f, 0x207f0abf,
+  0x20bfd2ff, 0x21009b3f, 0x21415aff, 0x21820a3f, 0x21c2b93f, 0x220357bf,
+  0x2243ed7f, 0x22847b3f, 0x22c5003f, 0x23057cff, 0x2345f17f, 0x238654ff,
+  0x23c6b8bf, 0x24070b7f, 0x244755ff, 0x248797ff, 0x24c7c93f, 0x2507fabf,
+  0x25481b3f, 0x2588333f, 0x25c842ff, 0x26084a3f, 0x264840ff, 0x26882eff,
+  0x26c814bf, 0x2707e9bf, 0x2747b67f, 0x27877abf, 0x27c7367f, 0x2806e9ff,
+  0x28468cbf, 0x28861e7f, 0x28c5b07f, 0x2905317f, 0x2944aa3f, 0x2984123f,
+  0x29c371bf, 0x2a02c8ff, 0x2a420f7f, 0x2a814d7f, 0x2ac082ff, 0x2affa7ff,
+  0x2b3ec47f, 0x2b7dcfff, 0x2bbcd33f, 0x2bfbc5bf, 0x2c3aafff, 0x2c7991bf,
+  0x2cb862bf, 0x2cf72b3f, 0x2d35e2ff, 0x2d74927f, 0x2db330ff, 0x2df1c73f,
+  0x2e304cbf, 0x2e6ec9ff, 0x2ead363f, 0x2eeb99ff, 0x2f29ed3f, 0x2f682f7f,
+  0x2fa671ff, 0x2fe49aff, 0x3022bbff, 0x3060cbff, 0x309ed37f, 0x30dcca7f,
+  0x311ab8ff, 0x3158967f, 0x3196637f, 0x31d427ff, 0x3211dbbf, 0x324f873f,
+  0x328d21bf, 0x32caab7f, 0x33082cff, 0x3345953f, 0x3382fd7f, 0x33c04c7f,
+  0x33fd933f, 0x343ac93f, 0x3477f6bf, 0x34b50aff, 0x34f216ff, 0x352f1a7f,
+  0x356c04ff, 0x35a8e6ff, 0x35e5b83f, 0x362278bf, 0x365f30ff, 0x369bcfbf,
+  0x36d8663f, 0x3714ec3f, 0x3751697f, 0x378dcdbf, 0x37ca297f, 0x3806747f,
+  0x3842aebf, 0x387ed83f, 0x38baf97f, 0x38f7013f, 0x393300bf, 0x396eefbf,
+  0x39aacd7f, 0x39e69abf, 0x3a22573f, 0x3a5e02ff, 0x3a999dbf, 0x3ad5303f,
+  0x3b10a97f, 0x3b4c1a7f, 0x3b87723f, 0x3bc2c1bf, 0x3bfe003f, 0x3c392dff,
+  0x3c7442bf, 0x3caf4eff, 0x3cea4a7f, 0x3d25353f, 0x3d600f3f, 0x3d9ad83f,
+  0x3dd5883f, 0x3e102fff, 0x3e4ac6bf, 0x3e854cbf, 0x3ebfb9bf, 0x3efa1e3f,
+  0x3f3471ff, 0x3f6eac7f, 0x3fa8debf, 0x3fe2f7bf, 0x401cffff, 0x4056ffff,
+  0x4090e67f, 0x40cabc7f, 0x4104817f, 0x413e2d7f, 0x4177d0ff, 0x41b15b7f,
+  0x41eadd7f, 0x422445ff, 0x425d9e7f, 0x4296e57f, 0x42d0137f, 0x4309397f,
+  0x434245ff, 0x437b417f, 0x43b42cff, 0x43ed06ff, 0x4425c7ff, 0x445e787f,
+  0x449717ff, 0x44cfa67f, 0x4508247f, 0x4540897f, 0x4578dd7f, 0x45b1207f,
+  0x45e94a7f, 0x462163ff, 0x46596c7f, 0x46915bff, 0x46c942ff, 0x4701107f,
+  0x4738c57f, 0x4770717f, 0x47a7fbff, 0x47df7e7f, 0x4816e77f, 0x484e3fff,
+  0x4885877f, 0x48bcb5ff, 0x48f3d37f, 0x492ad7ff, 0x4961cbff, 0x4998ae7f,
+  0x49cf787f, 0x4a06317f, 0x4a3cd17f, 0x4a73607f, 0x4aa9de7f, 0x4ae0437f,
+  0x4b168f7f, 0x4b4cd2ff, 0x4b82f4ff, 0x4bb90e7f, 0x4bef067f, 0x4c24f67f,
+  0x4c5ac47f, 0x4c9089ff, 0x4cc6367f, 0x4cfbc9ff, 0x4d314c7f, 0x4d66b5ff,
+  0x4d9c0e7f, 0x4dd14dff, 0x4e06747f, 0x4e3b927f, 0x4e708eff, 0x4ea57a7f,
+  0x4eda4cff, 0x4f0f0e7f, 0x4f43bf7f, 0x4f784eff, 0x4faccd7f, 0x4fe13aff,
+  0x50158f7f, 0x5049caff, 0x507ded7f, 0x50b1feff, 0x50e5ff7f, 0x5119deff,
+  0x514dacff, 0x51816aff, 0x51b50f7f, 0x51e89a7f, 0x521c0c7f, 0x524f6dff,
+  0x5282b5ff, 0x52b5e4ff, 0x52e9037f, 0x531c087f, 0x534ef47f, 0x5381c6ff,
+  0x53b488ff, 0x53e731ff, 0x5419c17f, 0x544c407f, 0x547e9d7f, 0x54b0e9ff,
+  0x54e325ff, 0x55153fff, 0x5547497f, 0x5579397f, 0x55ab107f, 0x55dcce7f,
+  0x560e737f, 0x5640077f, 0x567181ff, 0x56a2e3ff, 0x56d42bff, 0x57055b7f,
+  0x573679ff, 0x57677f7f, 0x579862ff, 0x57c935ff, 0x57f9efff, 0x582a98ff,
+  0x585b207f, 0x588b8eff, 0x58bbec7f, 0x58ec287f, 0x591c53ff, 0x594c65ff,
+  0x597c5eff, 0x59ac3e7f, 0x59dc057f, 0x5a0bb27f, 0x5a3b46ff, 0x5a6ac1ff,
+  0x5a9a2c7f, 0x5ac974ff, 0x5af8a4ff, 0x5b27c37f, 0x5b56c0ff, 0x5b85a4ff,
+  0x5bb4787f, 0x5be329ff, 0x5c11c27f, 0x5c404a7f, 0x5c6eb07f, 0x5c9d05ff,
+  0x5ccb39ff, 0x5cf954ff, 0x5d27567f, 0x5d55477f, 0x5d83167f, 0x5db0cc7f,
+  0x5dde697f, 0x5e0bed7f, 0x5e3957ff, 0x5e66a97f, 0x5e93d97f, 0x5ec0f87f,
+  0x5eedfe7f, 0x5f1ae2ff, 0x5f47adff, 0x5f74687f, 0x5fa1017f, 0x5fcd80ff,
+  0x5ff9df7f, 0x60262c7f, 0x605260ff, 0x607e737f, 0x60aa6cff, 0x60d64d7f,
+  0x6102147f, 0x612dc27f, 0x6159577f, 0x6184caff, 0x61b024ff, 0x61db65ff,
+  0x62068d7f, 0x62319c7f, 0x625c897f, 0x6287657f, 0x62b2207f, 0x62dcb97f,
+  0x630741ff, 0x6331a8ff, 0x635bf67f, 0x63862aff, 0x63b0467f, 0x63da407f,
+  0x640420ff, 0x642de87f, 0x64578e7f, 0x64811aff, 0x64aa8e7f, 0x64d3e8ff,
+  0x64fd21ff, 0x6526417f, 0x654f47ff, 0x65782cff, 0x65a0f8ff, 0x65c9ab7f,
+  0x65f244ff, 0x661abcff, 0x66431bff, 0x666b58ff, 0x66937cff, 0x66bb87ff,
+  0x66e3717f, 0x670b417f, 0x6732f87f, 0x675a8dff, 0x678209ff, 0x67a96d7f,
+  0x67d0aeff, 0x67f7d6ff, 0x681eddff, 0x6845cb7f, 0x686c97ff, 0x689352ff,
+  0x68b9e47f, 0x68e064ff, 0x6906bbff, 0x692d01ff, 0x695325ff, 0x697928ff,
+  0x699f127f, 0x69c4e2ff, 0x69ea91ff, 0x6a10277f, 0x6a359bff, 0x6a5af6ff,
+  0x6a802fff, 0x6aa5507f, 0x6aca577f, 0x6aef34ff, 0x6b1400ff, 0x6b38abff,
+  0x6b5d357f, 0x6b81a57f, 0x6ba5f3ff, 0x6bca297f, 0x6bee3d7f, 0x6c1237ff,
+  0x6c3610ff, 0x6c59d0ff, 0x6c7d6f7f, 0x6ca0f4ff, 0x6cc4587f, 0x6ce79a7f,
+  0x6d0ac37f, 0x6d2dd37f, 0x6d50b97f, 0x6d738e7f, 0x6d96397f, 0x6db8cb7f,
+  0x6ddb447f, 0x6dfd9b7f, 0x6e1fd17f, 0x6e41edff, 0x6e63e8ff, 0x6e85c27f,
+  0x6ea7827f, 0x6ec9297f, 0x6eeaa6ff, 0x6f0c0aff, 0x6f2d557f, 0x6f4e767f,
+  0x6f6f867f, 0x6f906cff, 0x6fb139ff, 0x6fd1e4ff, 0x6ff2777f, 0x7012e7ff,
+  0x7033377f, 0x705364ff, 0x7073797f, 0x70936c7f, 0x70b345ff, 0x70d2fdff,
+  0x70f294ff, 0x711209ff, 0x713165ff, 0x71509fff, 0x716fc17f, 0x718eb87f,
+  0x71ad967f, 0x71cc52ff, 0x71eaf67f, 0x7209787f, 0x7227d87f, 0x724616ff,
+  0x72643cff, 0x7282387f, 0x72a022ff, 0x72bde3ff, 0x72db8b7f, 0x72f9097f,
+  0x7316767f, 0x7333b97f, 0x7350daff, 0x736de2ff, 0x738ac9ff, 0x73a7977f,
+  0x73c43aff, 0x73e0c57f, 0x73fd2e7f, 0x741975ff, 0x74359bff, 0x7451a87f,
+  0x746d8aff, 0x7489547f, 0x74a4fc7f, 0x74c08b7f, 0x74dbf07f, 0x74f73bff,
+  0x751265ff, 0x752d6eff, 0x754855ff, 0x75631b7f, 0x757dc77f, 0x759849ff,
+  0x75b2b37f, 0x75ccfaff, 0x75e720ff, 0x76012dff, 0x761b10ff, 0x7634daff,
+  0x764e7a7f, 0x7668017f, 0x7681667f, 0x769aa9ff, 0x76b3d47f, 0x76ccd4ff,
+  0x76e5b3ff, 0x76fe79ff, 0x77171dff, 0x772f987f, 0x7747f97f, 0x776038ff,
+  0x777856ff, 0x77905bff, 0x77a836ff, 0x77bff07f, 0x77d7907f, 0x77ef067f,
+  0x780663ff, 0x781d9f7f, 0x7834b0ff, 0x784ba97f, 0x78627fff, 0x7879357f,
+  0x788fc8ff, 0x78a63b7f, 0x78bc8bff, 0x78d2c37f, 0x78e8d0ff, 0x78febcff,
+  0x7914877f, 0x792a387f, 0x793fbfff, 0x79552dff, 0x796a727f, 0x797f9d7f,
+  0x79949e7f, 0x79a9867f, 0x79be4cff, 0x79d2e97f, 0x79e76c7f, 0x79fbce7f,
+  0x7a1005ff, 0x7a24247f, 0x7a38217f, 0x7a4bfcff, 0x7a5fae7f, 0x7a7346ff,
+  0x7a86bdff, 0x7a9a0aff, 0x7aad3e7f, 0x7ac0507f, 0x7ad3417f, 0x7ae607ff,
+  0x7af8b57f, 0x7b0b38ff, 0x7b1da37f, 0x7b2fec7f, 0x7b420aff, 0x7b5410ff,
+  0x7b65ecff, 0x7b77af7f, 0x7b8947ff, 0x7b9ac77f, 0x7bac1cff, 0x7bbd50ff,
+  0x7bce6bff, 0x7bdf5cff, 0x7bf02c7f, 0x7c00d9ff, 0x7c11667f, 0x7c21d0ff,
+  0x7c3219ff, 0x7c4241ff, 0x7c5247ff, 0x7c622c7f, 0x7c71eeff, 0x7c8187ff,
+  0x7c9107ff, 0x7ca05dff, 0x7caf9a7f, 0x7cbead7f, 0x7ccd9e7f, 0x7cdc767f,
+  0x7ceb247f, 0x7cf9b0ff, 0x7d081bff, 0x7d16657f, 0x7d2484ff, 0x7d328b7f,
+  0x7d406fff, 0x7d4e2aff, 0x7d5bcc7f, 0x7d69447f, 0x7d769a7f, 0x7d83ceff,
+  0x7d90e1ff, 0x7d9dd37f, 0x7daaa37f, 0x7db751ff, 0x7dc3d67f, 0x7dd041ff,
+  0x7ddc82ff, 0x7de8a2ff, 0x7df4a97f, 0x7e0085ff, 0x7e0c38ff, 0x7e17d27f,
+  0x7e234a7f, 0x7e2ea0ff, 0x7e39cd7f, 0x7e44d87f, 0x7e4fc1ff, 0x7e5a897f,
+  0x7e652fff, 0x7e6fb4ff, 0x7e7a17ff, 0x7e8450ff, 0x7e8e717f, 0x7e98677f,
+  0x7ea23bff, 0x7eabeeff, 0x7eb5807f, 0x7ebef07f, 0x7ec8367f, 0x7ed15aff,
+  0x7eda65ff, 0x7ee3477f, 0x7eec06ff, 0x7ef4a57f, 0x7efd197f, 0x7f05747f,
+  0x7f0da5ff, 0x7f15b57f, 0x7f1da37f, 0x7f256fff, 0x7f2d1aff, 0x7f34a47f,
+  0x7f3c037f, 0x7f43417f, 0x7f4a667f, 0x7f5160ff, 0x7f5831ff, 0x7f5ee97f,
+  0x7f65777f, 0x7f6bebff, 0x7f72367f, 0x7f785f7f, 0x7f7e66ff, 0x7f84447f,
+  0x7f8a08ff, 0x7f8fa37f, 0x7f951c7f, 0x7f9a737f, 0x7f9fa97f, 0x7fa4bd7f,
+  0x7fa9a7ff, 0x7fae70ff, 0x7fb3207f, 0x7fb7a5ff, 0x7fbc017f, 0x7fc043ff,
+  0x7fc45c7f, 0x7fc85bff, 0x7fcc317f, 0x7fcfe57f, 0x7fd36f7f, 0x7fd6e07f,
+  0x7fda26ff, 0x7fdd4c7f, 0x7fe04fff, 0x7fe3327f, 0x7fe5f2ff, 0x7fe889ff,
+  0x7feafeff, 0x7fed5aff, 0x7fef8cff, 0x7ff194ff, 0x7ff383ff, 0x7ff548ff,
+  0x7ff6ec7f, 0x7ff86dff, 0x7ff9ce7f, 0x7ffb0d7f, 0x7ffc21ff, 0x7ffd1dff,
+  0x7ffdef7f, 0x7ffe9f7f, 0x7fff25ff, 0x7fff92ff, 0x7fffd5ff, 0x7ffff77f};
 
 const WORD32 ixheaacd_sine_win_192[192] = {
-    0x00860dcc, 0x01922100, 0x029e2bd0, 0x03aa25d8, 0x04b61780, 0x05c1f860,
-    0x06cdb7b0, 0x07d95dd8, 0x08e4da10, 0x09f034b0, 0x0afb6560, 0x0c0663c0,
-    0x0d112fd0, 0x0e1bc120, 0x0f2617c0, 0x103022e0, 0x1139f340, 0x12436fc0,
-    0x134ca0c0, 0x14557580, 0x155df660, 0x16661ae0, 0x176ddac0, 0x18753600,
-    0x197c2440, 0x1a829d00, 0x1b88a8c0, 0x1c8e3f00, 0x1d934f00, 0x1e97e140,
-    0x1f9bed40, 0x209f7300, 0x21a261c0, 0x22a4c200, 0x23a68b00, 0x24a7b500,
-    0x25a83f40, 0x26a82200, 0x27a75cc0, 0x28a5e780, 0x29a3c200, 0x2aa0ec80,
-    0x2b9d5600, 0x2c98fe80, 0x2d93e600, 0x2e8e0440, 0x2f8750c0, 0x307fd400,
-    0x31777d00, 0x326e5480, 0x33644940, 0x34596400, 0x354d9400, 0x3640d900,
-    0x37332ac0, 0x382491c0, 0x39150540, 0x3a0474c0, 0x3af2f140, 0x3be06100,
-    0x3cccccc0, 0x3db83480, 0x3ea28780, 0x3f8bc580, 0x4073eeff, 0x415b037f,
-    0x4240f1ff, 0x4325c3ff, 0x4409677f, 0x44ebe57f, 0x45cd357f, 0x46ad4f7f,
-    0x478c3aff, 0x4869e7ff, 0x494655ff, 0x4a21857f, 0x4afb6dff, 0x4bd40eff,
-    0x4cab607f, 0x4d81627f, 0x4e5614ff, 0x4f2966ff, 0x4ffb60ff, 0x50cc037f,
-    0x519b3cff, 0x5269167f, 0x53357e7f, 0x54007dff, 0x54ca0bff, 0x559220ff,
-    0x5658c47f, 0x571deeff, 0x57e1977f, 0x58a3bdff, 0x5964627f, 0x5a237cff,
-    0x5ae10cff, 0x5b9d12ff, 0x5c577d7f, 0x5d105dff, 0x5dc79aff, 0x5e7d457f,
-    0x5f314c7f, 0x5fe3afff, 0x609478ff, 0x61438cff, 0x61f0fdff, 0x629cc2ff,
-    0x6346d3ff, 0x63ef307f, 0x6495d8ff, 0x653acd7f, 0x65ddfc7f, 0x667f6f7f,
-    0x671f257f, 0x67bd0dff, 0x685939ff, 0x68f3907f, 0x698c21ff, 0x6a22e5ff,
-    0x6ab7d3ff, 0x6b4af4ff, 0x6bdc377f, 0x6c6ba47f, 0x6cf9337f, 0x6d84e3ff,
-    0x6e0eb67f, 0x6e96aaff, 0x6f1cafff, 0x6fa0d77f, 0x70230fff, 0x70a3617f,
-    0x7121bbff, 0x719e2fff, 0x7218ac7f, 0x729131ff, 0x7307bfff, 0x737c5eff,
-    0x73eefe7f, 0x745f9dff, 0x74ce3dff, 0x753ae67f, 0x75a586ff, 0x760e1f7f,
-    0x7674b7ff, 0x76d948ff, 0x773bd17f, 0x779c497f, 0x77fab97f, 0x785718ff,
-    0x78b167ff, 0x7909a67f, 0x795fd47f, 0x79b3e97f, 0x7a05ee7f, 0x7a55d9ff,
-    0x7aa3acff, 0x7aef66ff, 0x7b38ffff, 0x7b807fff, 0x7bc5de7f, 0x7c09247f,
-    0x7c4a48ff, 0x7c894c7f, 0x7cc62e7f, 0x7d00e67f, 0x7d397dff, 0x7d6ff37f,
-    0x7da43fff, 0x7dd6627f, 0x7e0663ff, 0x7e343b7f, 0x7e5fe0ff, 0x7e89657f,
-    0x7eb0b7ff, 0x7ed5e8ff, 0x7ef8df7f, 0x7f19b4ff, 0x7f3857ff, 0x7f54c97f,
-    0x7f6f10ff, 0x7f872eff, 0x7f9d12ff, 0x7fb0cc7f, 0x7fc2547f, 0x7fd1aa7f,
-    0x7fded67f, 0x7fe9c87f, 0x7ff2907f, 0x7ff926ff, 0x7ffd8aff, 0x7fffbcff,
+  0x00860dcc, 0x01922100, 0x029e2bd0, 0x03aa25d8, 0x04b61780, 0x05c1f860,
+  0x06cdb7b0, 0x07d95dd8, 0x08e4da10, 0x09f034b0, 0x0afb6560, 0x0c0663c0,
+  0x0d112fd0, 0x0e1bc120, 0x0f2617c0, 0x103022e0, 0x1139f340, 0x12436fc0,
+  0x134ca0c0, 0x14557580, 0x155df660, 0x16661ae0, 0x176ddac0, 0x18753600,
+  0x197c2440, 0x1a829d00, 0x1b88a8c0, 0x1c8e3f00, 0x1d934f00, 0x1e97e140,
+  0x1f9bed40, 0x209f7300, 0x21a261c0, 0x22a4c200, 0x23a68b00, 0x24a7b500,
+  0x25a83f40, 0x26a82200, 0x27a75cc0, 0x28a5e780, 0x29a3c200, 0x2aa0ec80,
+  0x2b9d5600, 0x2c98fe80, 0x2d93e600, 0x2e8e0440, 0x2f8750c0, 0x307fd400,
+  0x31777d00, 0x326e5480, 0x33644940, 0x34596400, 0x354d9400, 0x3640d900,
+  0x37332ac0, 0x382491c0, 0x39150540, 0x3a0474c0, 0x3af2f140, 0x3be06100,
+  0x3cccccc0, 0x3db83480, 0x3ea28780, 0x3f8bc580, 0x4073eeff, 0x415b037f,
+  0x4240f1ff, 0x4325c3ff, 0x4409677f, 0x44ebe57f, 0x45cd357f, 0x46ad4f7f,
+  0x478c3aff, 0x4869e7ff, 0x494655ff, 0x4a21857f, 0x4afb6dff, 0x4bd40eff,
+  0x4cab607f, 0x4d81627f, 0x4e5614ff, 0x4f2966ff, 0x4ffb60ff, 0x50cc037f,
+  0x519b3cff, 0x5269167f, 0x53357e7f, 0x54007dff, 0x54ca0bff, 0x559220ff,
+  0x5658c47f, 0x571deeff, 0x57e1977f, 0x58a3bdff, 0x5964627f, 0x5a237cff,
+  0x5ae10cff, 0x5b9d12ff, 0x5c577d7f, 0x5d105dff, 0x5dc79aff, 0x5e7d457f,
+  0x5f314c7f, 0x5fe3afff, 0x609478ff, 0x61438cff, 0x61f0fdff, 0x629cc2ff,
+  0x6346d3ff, 0x63ef307f, 0x6495d8ff, 0x653acd7f, 0x65ddfc7f, 0x667f6f7f,
+  0x671f257f, 0x67bd0dff, 0x685939ff, 0x68f3907f, 0x698c21ff, 0x6a22e5ff,
+  0x6ab7d3ff, 0x6b4af4ff, 0x6bdc377f, 0x6c6ba47f, 0x6cf9337f, 0x6d84e3ff,
+  0x6e0eb67f, 0x6e96aaff, 0x6f1cafff, 0x6fa0d77f, 0x70230fff, 0x70a3617f,
+  0x7121bbff, 0x719e2fff, 0x7218ac7f, 0x729131ff, 0x7307bfff, 0x737c5eff,
+  0x73eefe7f, 0x745f9dff, 0x74ce3dff, 0x753ae67f, 0x75a586ff, 0x760e1f7f,
+  0x7674b7ff, 0x76d948ff, 0x773bd17f, 0x779c497f, 0x77fab97f, 0x785718ff,
+  0x78b167ff, 0x7909a67f, 0x795fd47f, 0x79b3e97f, 0x7a05ee7f, 0x7a55d9ff,
+  0x7aa3acff, 0x7aef66ff, 0x7b38ffff, 0x7b807fff, 0x7bc5de7f, 0x7c09247f,
+  0x7c4a48ff, 0x7c894c7f, 0x7cc62e7f, 0x7d00e67f, 0x7d397dff, 0x7d6ff37f,
+  0x7da43fff, 0x7dd6627f, 0x7e0663ff, 0x7e343b7f, 0x7e5fe0ff, 0x7e89657f,
+  0x7eb0b7ff, 0x7ed5e8ff, 0x7ef8df7f, 0x7f19b4ff, 0x7f3857ff, 0x7f54c97f,
+  0x7f6f10ff, 0x7f872eff, 0x7f9d12ff, 0x7fb0cc7f, 0x7fc2547f, 0x7fd1aa7f,
+  0x7fded67f, 0x7fe9c87f, 0x7ff2907f, 0x7ff926ff, 0x7ffd8aff, 0x7fffbcff,
 };
 
 const WORD32 ixheaacd_sine_win_96[96] = {
-    0x010c1334, 0x032428d4, 0x053c0c20, 0x07538ac0, 0x096a93f0, 0x0b80ed00,
-    0x0d968510, 0x0fab29e0, 0x11beb9e0, 0x13d11380, 0x15e21540, 0x17f19500,
-    0x19ff7160, 0x1c0b8060, 0x1e15a8e0, 0x201dc0c0, 0x2223a6c0, 0x242730c0,
-    0x26284580, 0x2826bb40, 0x2a227080, 0x2c1b3b00, 0x2e110a00, 0x3003ab80,
-    0x31f30600, 0x33def000, 0x35c74fc0, 0x37abfb80, 0x398cda80, 0x3b69ca80,
-    0x3d42a240, 0x3f174800, 0x40e79a7f, 0x42b380ff, 0x447ad07f, 0x463d687f,
-    0x47fb377f, 0x49b4137f, 0x4b67e3ff, 0x4d168f7f, 0x4ebfebff, 0x5063e07f,
-    0x5202537f, 0x539b2c7f, 0x552e48ff, 0x56bb87ff, 0x5842e0ff, 0x59c421ff,
-    0x5b3f41ff, 0x5cb41fff, 0x5e22a2ff, 0x5f8ab0ff, 0x60ec397f, 0x62471b7f,
-    0x639b3cff, 0x64e8857f, 0x662eec7f, 0x676e4fff, 0x68a69fff, 0x69d7c2ff,
-    0x6b019eff, 0x6c242cff, 0x6d3f4a7f, 0x6e52ef7f, 0x6f5f02ff, 0x7063737f,
-    0x716030ff, 0x725529ff, 0x73424e7f, 0x74278cff, 0x7504d57f, 0x75da167f,
-    0x76a73f7f, 0x776c507f, 0x782927ff, 0x78ddce7f, 0x798a21ff, 0x7a2e22ff,
-    0x7ac9c8ff, 0x7b5d02ff, 0x7be7c8ff, 0x7c6a11ff, 0x7ce3cd7f, 0x7d54fbff,
-    0x7dbd9c7f, 0x7e1d96ff, 0x7e74ea7f, 0x7ec3977f, 0x7f09957f, 0x7f46dc7f,
-    0x7f7b637f, 0x7fa732ff, 0x7fca4aff, 0x7fe4927f, 0x7ff622ff, 0x7ffeeaff};
+  0x010c1334, 0x032428d4, 0x053c0c20, 0x07538ac0, 0x096a93f0, 0x0b80ed00,
+  0x0d968510, 0x0fab29e0, 0x11beb9e0, 0x13d11380, 0x15e21540, 0x17f19500,
+  0x19ff7160, 0x1c0b8060, 0x1e15a8e0, 0x201dc0c0, 0x2223a6c0, 0x242730c0,
+  0x26284580, 0x2826bb40, 0x2a227080, 0x2c1b3b00, 0x2e110a00, 0x3003ab80,
+  0x31f30600, 0x33def000, 0x35c74fc0, 0x37abfb80, 0x398cda80, 0x3b69ca80,
+  0x3d42a240, 0x3f174800, 0x40e79a7f, 0x42b380ff, 0x447ad07f, 0x463d687f,
+  0x47fb377f, 0x49b4137f, 0x4b67e3ff, 0x4d168f7f, 0x4ebfebff, 0x5063e07f,
+  0x5202537f, 0x539b2c7f, 0x552e48ff, 0x56bb87ff, 0x5842e0ff, 0x59c421ff,
+  0x5b3f41ff, 0x5cb41fff, 0x5e22a2ff, 0x5f8ab0ff, 0x60ec397f, 0x62471b7f,
+  0x639b3cff, 0x64e8857f, 0x662eec7f, 0x676e4fff, 0x68a69fff, 0x69d7c2ff,
+  0x6b019eff, 0x6c242cff, 0x6d3f4a7f, 0x6e52ef7f, 0x6f5f02ff, 0x7063737f,
+  0x716030ff, 0x725529ff, 0x73424e7f, 0x74278cff, 0x7504d57f, 0x75da167f,
+  0x76a73f7f, 0x776c507f, 0x782927ff, 0x78ddce7f, 0x798a21ff, 0x7a2e22ff,
+  0x7ac9c8ff, 0x7b5d02ff, 0x7be7c8ff, 0x7c6a11ff, 0x7ce3cd7f, 0x7d54fbff,
+  0x7dbd9c7f, 0x7e1d96ff, 0x7e74ea7f, 0x7ec3977f, 0x7f09957f, 0x7f46dc7f,
+  0x7f7b637f, 0x7fa732ff, 0x7fca4aff, 0x7fe4927f, 0x7ff622ff, 0x7ffeeaff};
 
 const WORD32 ixheaacd_sine_win_256[256] = {
-    0x006487ea, 0x012d96a6, 0x01f6a29e, 0x02bfa9a4, 0x0388a9f4, 0x0451a170,
-    0x051a8e60, 0x05e36ea8, 0x06ac4068, 0x077501b8, 0x083db0a0, 0x09064b30,
-    0x09cecf80, 0x0a973ba0, 0x0b5f8da0, 0x0c27c390, 0x0cefdb70, 0x0db7d370,
-    0x0e7fa9a0, 0x0f475bf0, 0x100ee8a0, 0x10d64dc0, 0x119d8940, 0x12649940,
-    0x132b7be0, 0x13f22f60, 0x14b8b180, 0x157f0080, 0x16451a80, 0x170afd80,
-    0x17d0a7c0, 0x18961720, 0x195b49e0, 0x1a203e20, 0x1ae4f1e0, 0x1ba96340,
-    0x1c6d9060, 0x1d317740, 0x1df51640, 0x1eb86b40, 0x1f7b7480, 0x203e3000,
-    0x21009c00, 0x21c2b680, 0x22847e00, 0x2345f000, 0x24070b00, 0x24c7cd40,
-    0x25883480, 0x26483f80, 0x2707ebc0, 0x27c737c0, 0x288621c0, 0x2944a7c0,
-    0x2a02c7c0, 0x2ac08040, 0x2b7dcf00, 0x2c3ab2c0, 0x2cf72940, 0x2db330c0,
-    0x2e6ec780, 0x2f29ebc0, 0x2fe49bc0, 0x309ed540, 0x31589700, 0x3211df00,
-    0x32caab80, 0x3382fa80, 0x343aca80, 0x34f219c0, 0x35a8e640, 0x365f2e40,
-    0x3714f040, 0x37ca2a40, 0x387eda80, 0x3932ff80, 0x39e69780, 0x3a99a040,
-    0x3b4c18c0, 0x3bfdfec0, 0x3caf50c0, 0x3d600d40, 0x3e103200, 0x3ebfbdc0,
-    0x3f6eaec0, 0x401d02ff, 0x40cab97f, 0x4177cf7f, 0x4224447f, 0x42d015ff,
-    0x437b42ff, 0x4425c8ff, 0x44cfa77f, 0x4578db7f, 0x4621647f, 0x46c9407f,
-    0x47706d7f, 0x4816ea7f, 0x48bcb57f, 0x4961ccff, 0x4a062fff, 0x4aa9db7f,
-    0x4b4ccf7f, 0x4bef08ff, 0x4c90877f, 0x4d31497f, 0x4dd14c7f, 0x4e708f7f,
-    0x4f0f10ff, 0x4faccf7f, 0x5049c97f, 0x50e5fd7f, 0x5181697f, 0x521c0c7f,
-    0x52b5e4ff, 0x534ef17f, 0x53e7307f, 0x547ea07f, 0x55153fff, 0x55ab0d7f,
-    0x5640077f, 0x56d42c7f, 0x57677b7f, 0x57f9f2ff, 0x588b917f, 0x591c54ff,
-    0x59ac3cff, 0x5a3b477f, 0x5ac9737f, 0x5b56bf7f, 0x5be32a7f, 0x5c6eb27f,
-    0x5cf9567f, 0x5d83147f, 0x5e0bec7f, 0x5e93dbff, 0x5f1ae27f, 0x5fa0fdff,
-    0x60262dff, 0x60aa707f, 0x612dc47f, 0x61b0287f, 0x62319b7f, 0x62b21c7f,
-    0x6331a9ff, 0x63b0427f, 0x642de4ff, 0x64aa907f, 0x6526437f, 0x65a0fcff,
-    0x661abbff, 0x66937e7f, 0x670b447f, 0x67820b7f, 0x67f7d3ff, 0x686c9b7f,
-    0x68e060ff, 0x695323ff, 0x69c4e37f, 0x6a359d7f, 0x6aa551ff, 0x6b13feff,
-    0x6b81a3ff, 0x6bee3f7f, 0x6c59d07f, 0x6cc4567f, 0x6d2dcfff, 0x6d963c7f,
-    0x6dfd99ff, 0x6e63e87f, 0x6ec9267f, 0x6f2d52ff, 0x6f906d7f, 0x6ff2747f,
-    0x7053677f, 0x70b344ff, 0x71120cff, 0x716fbd7f, 0x71cc55ff, 0x7227d5ff,
-    0x72823c7f, 0x72db87ff, 0x7333b87f, 0x738acc7f, 0x73e0c37f, 0x74359cff,
-    0x748956ff, 0x74dbf1ff, 0x752d6c7f, 0x757dc5ff, 0x75ccfd7f, 0x761b11ff,
-    0x7668037f, 0x76b3d07f, 0x76fe78ff, 0x7747fbff, 0x779057ff, 0x77d78d7f,
-    0x781d9b7f, 0x7862807f, 0x78a63cff, 0x78e8cf7f, 0x792a37ff, 0x796a757f,
-    0x79a986ff, 0x79e76c7f, 0x7a24257f, 0x7a5fb0ff, 0x7a9a0e7f, 0x7ad33cff,
-    0x7b0b3cff, 0x7b420d7f, 0x7b77ad7f, 0x7bac1cff, 0x7bdf5b7f, 0x7c11687f,
-    0x7c4242ff, 0x7c71eaff, 0x7ca05fff, 0x7ccda17f, 0x7cf9aeff, 0x7d2487ff,
-    0x7d4e2c7f, 0x7d769b7f, 0x7d9dd57f, 0x7dc3d8ff, 0x7de8a67f, 0x7e0c3cff,
-    0x7e2e9cff, 0x7e4fc4ff, 0x7e6fb5ff, 0x7e8e6e7f, 0x7eabeeff, 0x7ec836ff,
-    0x7ee345ff, 0x7efd1bff, 0x7f15b8ff, 0x7f2d1bff, 0x7f43457f, 0x7f58347f,
-    0x7f6be9ff, 0x7f7e647f, 0x7f8fa47f, 0x7f9fa9ff, 0x7fae747f, 0x7fbc03ff,
-    0x7fc8587f, 0x7fd3717f, 0x7fdd4eff, 0x7fe5f0ff, 0x7fed577f, 0x7ff3827f,
-    0x7ff8717f, 0x7ffc24ff, 0x7ffe9c7f, 0x7fffd87f,
+  0x006487ea, 0x012d96a6, 0x01f6a29e, 0x02bfa9a4, 0x0388a9f4, 0x0451a170,
+  0x051a8e60, 0x05e36ea8, 0x06ac4068, 0x077501b8, 0x083db0a0, 0x09064b30,
+  0x09cecf80, 0x0a973ba0, 0x0b5f8da0, 0x0c27c390, 0x0cefdb70, 0x0db7d370,
+  0x0e7fa9a0, 0x0f475bf0, 0x100ee8a0, 0x10d64dc0, 0x119d8940, 0x12649940,
+  0x132b7be0, 0x13f22f60, 0x14b8b180, 0x157f0080, 0x16451a80, 0x170afd80,
+  0x17d0a7c0, 0x18961720, 0x195b49e0, 0x1a203e20, 0x1ae4f1e0, 0x1ba96340,
+  0x1c6d9060, 0x1d317740, 0x1df51640, 0x1eb86b40, 0x1f7b7480, 0x203e3000,
+  0x21009c00, 0x21c2b680, 0x22847e00, 0x2345f000, 0x24070b00, 0x24c7cd40,
+  0x25883480, 0x26483f80, 0x2707ebc0, 0x27c737c0, 0x288621c0, 0x2944a7c0,
+  0x2a02c7c0, 0x2ac08040, 0x2b7dcf00, 0x2c3ab2c0, 0x2cf72940, 0x2db330c0,
+  0x2e6ec780, 0x2f29ebc0, 0x2fe49bc0, 0x309ed540, 0x31589700, 0x3211df00,
+  0x32caab80, 0x3382fa80, 0x343aca80, 0x34f219c0, 0x35a8e640, 0x365f2e40,
+  0x3714f040, 0x37ca2a40, 0x387eda80, 0x3932ff80, 0x39e69780, 0x3a99a040,
+  0x3b4c18c0, 0x3bfdfec0, 0x3caf50c0, 0x3d600d40, 0x3e103200, 0x3ebfbdc0,
+  0x3f6eaec0, 0x401d02ff, 0x40cab97f, 0x4177cf7f, 0x4224447f, 0x42d015ff,
+  0x437b42ff, 0x4425c8ff, 0x44cfa77f, 0x4578db7f, 0x4621647f, 0x46c9407f,
+  0x47706d7f, 0x4816ea7f, 0x48bcb57f, 0x4961ccff, 0x4a062fff, 0x4aa9db7f,
+  0x4b4ccf7f, 0x4bef08ff, 0x4c90877f, 0x4d31497f, 0x4dd14c7f, 0x4e708f7f,
+  0x4f0f10ff, 0x4faccf7f, 0x5049c97f, 0x50e5fd7f, 0x5181697f, 0x521c0c7f,
+  0x52b5e4ff, 0x534ef17f, 0x53e7307f, 0x547ea07f, 0x55153fff, 0x55ab0d7f,
+  0x5640077f, 0x56d42c7f, 0x57677b7f, 0x57f9f2ff, 0x588b917f, 0x591c54ff,
+  0x59ac3cff, 0x5a3b477f, 0x5ac9737f, 0x5b56bf7f, 0x5be32a7f, 0x5c6eb27f,
+  0x5cf9567f, 0x5d83147f, 0x5e0bec7f, 0x5e93dbff, 0x5f1ae27f, 0x5fa0fdff,
+  0x60262dff, 0x60aa707f, 0x612dc47f, 0x61b0287f, 0x62319b7f, 0x62b21c7f,
+  0x6331a9ff, 0x63b0427f, 0x642de4ff, 0x64aa907f, 0x6526437f, 0x65a0fcff,
+  0x661abbff, 0x66937e7f, 0x670b447f, 0x67820b7f, 0x67f7d3ff, 0x686c9b7f,
+  0x68e060ff, 0x695323ff, 0x69c4e37f, 0x6a359d7f, 0x6aa551ff, 0x6b13feff,
+  0x6b81a3ff, 0x6bee3f7f, 0x6c59d07f, 0x6cc4567f, 0x6d2dcfff, 0x6d963c7f,
+  0x6dfd99ff, 0x6e63e87f, 0x6ec9267f, 0x6f2d52ff, 0x6f906d7f, 0x6ff2747f,
+  0x7053677f, 0x70b344ff, 0x71120cff, 0x716fbd7f, 0x71cc55ff, 0x7227d5ff,
+  0x72823c7f, 0x72db87ff, 0x7333b87f, 0x738acc7f, 0x73e0c37f, 0x74359cff,
+  0x748956ff, 0x74dbf1ff, 0x752d6c7f, 0x757dc5ff, 0x75ccfd7f, 0x761b11ff,
+  0x7668037f, 0x76b3d07f, 0x76fe78ff, 0x7747fbff, 0x779057ff, 0x77d78d7f,
+  0x781d9b7f, 0x7862807f, 0x78a63cff, 0x78e8cf7f, 0x792a37ff, 0x796a757f,
+  0x79a986ff, 0x79e76c7f, 0x7a24257f, 0x7a5fb0ff, 0x7a9a0e7f, 0x7ad33cff,
+  0x7b0b3cff, 0x7b420d7f, 0x7b77ad7f, 0x7bac1cff, 0x7bdf5b7f, 0x7c11687f,
+  0x7c4242ff, 0x7c71eaff, 0x7ca05fff, 0x7ccda17f, 0x7cf9aeff, 0x7d2487ff,
+  0x7d4e2c7f, 0x7d769b7f, 0x7d9dd57f, 0x7dc3d8ff, 0x7de8a67f, 0x7e0c3cff,
+  0x7e2e9cff, 0x7e4fc4ff, 0x7e6fb5ff, 0x7e8e6e7f, 0x7eabeeff, 0x7ec836ff,
+  0x7ee345ff, 0x7efd1bff, 0x7f15b8ff, 0x7f2d1bff, 0x7f43457f, 0x7f58347f,
+  0x7f6be9ff, 0x7f7e647f, 0x7f8fa47f, 0x7f9fa9ff, 0x7fae747f, 0x7fbc03ff,
+  0x7fc8587f, 0x7fd3717f, 0x7fdd4eff, 0x7fe5f0ff, 0x7fed577f, 0x7ff3827f,
+  0x7ff8717f, 0x7ffc24ff, 0x7ffe9c7f, 0x7fffd87f,
 };
 
 const WORD32 ixheaacd_kbd_win120[120] = {
-    0x00017b6e, 0x00042d2e, 0x000849d0, 0x000e3494, 0x00165efc, 0x002149bd,
-    0x002f854b, 0x0041b235, 0x0058814f, 0x0074b3af, 0x00971a67, 0x00c0960d,
-    0x00f21602, 0x012c9774, 0x01712428, 0x01c0d0f7, 0x021cbc12, 0x02860b04,
-    0x02fde874, 0x038581b2, 0x041e040c, 0x04c899f3, 0x05866802, 0x065889d5,
-    0x07400ed3, 0x083df6e8, 0x09532f37, 0x0a808ed0, 0x0bc6d380, 0x0d269eb0,
-    0x0ea07270, 0x1034aeb5, 0x11e38ed2, 0x13ad2732, 0x1591636c, 0x179004a6,
-    0x19a8a05f, 0x1bda9fa1, 0x1e253ea1, 0x20878cce, 0x23006d5d, 0x258e9847,
-    0x28309bc5, 0x2ae4de3d, 0x2da9a0a7, 0x307d0162, 0x335cff71, 0x36477e1e,
-    0x393a48f0, 0x3c3317f8, 0x3f2f945b, 0x422d5d17, 0x452a0bf2, 0x48233a80,
-    0x4b16873d, 0x4e019a9c, 0x50e22c0a, 0x53b606ca, 0x567b0ea6, 0x592f445e,
-    0x5bd0c9c5, 0x5e5de587, 0x60d50688, 0x6334c6d0, 0x657bedf8, 0x67a97316,
-    0x69bc7e1d, 0x6bb468af, 0x6d90be60, 0x6f513c5f, 0x70f5d09a, 0x727e984c,
-    0x73ebde0f, 0x753e1762, 0x7675e1cb, 0x7793ff86, 0x789953de, 0x7986df3d,
-    0x7a5dbaff, 0x7b1f1524, 0x7bcc2be6, 0x7c664952, 0x7ceebeee, 0x7d66e18a,
-    0x7dd0053a, 0x7e2b79a1, 0x7e7a8685, 0x7ebe68c3, 0x7ef84fb5, 0x7f295af3,
-    0x7f529898, 0x7f7503f1, 0x7f918499, 0x7fa8ee08, 0x7fbbff80, 0x7fcb6458,
-    0x7fd7b492, 0x7fe175b9, 0x7fe91bf2, 0x7fef0b3a, 0x7ff398ba, 0x7ff70c37,
-    0x7ff9a17a, 0x7ffb89c1, 0x7ffced19, 0x7ffdebb1, 0x7ffe9f09, 0x7fff1b10,
-    0x7fff6f1d, 0x7fffa6ce, 0x7fffcacb, 0x7fffe165, 0x7fffef23, 0x7ffff72c,
-    0x7ffffbaa, 0x7ffffe0a, 0x7fffff35, 0x7fffffba, 0x7fffffed, 0x7ffffffc};
+  0x00017b6e, 0x00042d2e, 0x000849d0, 0x000e3494, 0x00165efc, 0x002149bd,
+  0x002f854b, 0x0041b235, 0x0058814f, 0x0074b3af, 0x00971a67, 0x00c0960d,
+  0x00f21602, 0x012c9774, 0x01712428, 0x01c0d0f7, 0x021cbc12, 0x02860b04,
+  0x02fde874, 0x038581b2, 0x041e040c, 0x04c899f3, 0x05866802, 0x065889d5,
+  0x07400ed3, 0x083df6e8, 0x09532f37, 0x0a808ed0, 0x0bc6d380, 0x0d269eb0,
+  0x0ea07270, 0x1034aeb5, 0x11e38ed2, 0x13ad2732, 0x1591636c, 0x179004a6,
+  0x19a8a05f, 0x1bda9fa1, 0x1e253ea1, 0x20878cce, 0x23006d5d, 0x258e9847,
+  0x28309bc5, 0x2ae4de3d, 0x2da9a0a7, 0x307d0162, 0x335cff71, 0x36477e1e,
+  0x393a48f0, 0x3c3317f8, 0x3f2f945b, 0x422d5d17, 0x452a0bf2, 0x48233a80,
+  0x4b16873d, 0x4e019a9c, 0x50e22c0a, 0x53b606ca, 0x567b0ea6, 0x592f445e,
+  0x5bd0c9c5, 0x5e5de587, 0x60d50688, 0x6334c6d0, 0x657bedf8, 0x67a97316,
+  0x69bc7e1d, 0x6bb468af, 0x6d90be60, 0x6f513c5f, 0x70f5d09a, 0x727e984c,
+  0x73ebde0f, 0x753e1762, 0x7675e1cb, 0x7793ff86, 0x789953de, 0x7986df3d,
+  0x7a5dbaff, 0x7b1f1524, 0x7bcc2be6, 0x7c664952, 0x7ceebeee, 0x7d66e18a,
+  0x7dd0053a, 0x7e2b79a1, 0x7e7a8685, 0x7ebe68c3, 0x7ef84fb5, 0x7f295af3,
+  0x7f529898, 0x7f7503f1, 0x7f918499, 0x7fa8ee08, 0x7fbbff80, 0x7fcb6458,
+  0x7fd7b492, 0x7fe175b9, 0x7fe91bf2, 0x7fef0b3a, 0x7ff398ba, 0x7ff70c37,
+  0x7ff9a17a, 0x7ffb89c1, 0x7ffced19, 0x7ffdebb1, 0x7ffe9f09, 0x7fff1b10,
+  0x7fff6f1d, 0x7fffa6ce, 0x7fffcacb, 0x7fffe165, 0x7fffef23, 0x7ffff72c,
+  0x7ffffbaa, 0x7ffffe0a, 0x7fffff35, 0x7fffffba, 0x7fffffed, 0x7ffffffc};
 
 const WORD32 ixheaacd_kbd_win128[128] = {
-    0x00017119, 0x0003e63e, 0x000791c4, 0x000cbf2b, 0x0013db7f, 0x001d3aa3,
-    0x00295a6c, 0x0038b04a, 0x004bd33c, 0x006351de, 0x007fdc58, 0x00a21a71,
-    0x00cacd17, 0x00fab53c, 0x0132b55d, 0x017396cf, 0x01be4cd7, 0x0213b9ef,
-    0x0274d163, 0x02e28ed3, 0x035de58f, 0x03e7d133, 0x0481450f, 0x052b345f,
-    0x05e6926f, 0x06b43957, 0x07950b97, 0x0889d27f, 0x09934eff, 0x0ab2313f,
-    0x0be707df, 0x0d32591f, 0x0e9491ef, 0x100dfddf, 0x119ecf5f, 0x13471f7f,
-    0x1506dd5f, 0x16dde79f, 0x18cbe1df, 0x1ad06fdf, 0x1ceaf25f, 0x1f1ab8df,
-    0x215efa7f, 0x23b6aa3f, 0x2620bc3f, 0x289bf17f, 0x2b26f1bf, 0x2dc054ff,
-    0x3066773f, 0x3317c5ff, 0x35d27c3f, 0x3894ccbf, 0x3b5cd8ff, 0x3e28baff,
-    0x40f6727f, 0x43c408ff, 0x468f8e7f, 0x495703ff, 0x4c187a7f, 0x4ed2027f,
-    0x5181be7f, 0x5425e0ff, 0x56bcb5ff, 0x5944997f, 0x5bbc09ff, 0x5e218dff,
-    0x6073ddff, 0x62b1d4ff, 0x64da65ff, 0x66ecaeff, 0x68e7e5ff, 0x6acb857f,
-    0x6c970f7f, 0x6e4a37ff, 0x6fe4d5ff, 0x7166f8ff, 0x72d0bb7f, 0x74225f7f,
-    0x755c52ff, 0x767f1b7f, 0x778b4fff, 0x7881ba7f, 0x79632bff, 0x7a307eff,
-    0x7aeab77f, 0x7b92c8ff, 0x7c29c77f, 0x7cb0d0ff, 0x7d28f17f, 0x7d933dff,
-    0x7df0dc7f, 0x7e42d8ff, 0x7e8a3f7f, 0x7ec80c7f, 0x7efd3aff, 0x7f2ab67f,
-    0x7f5160ff, 0x7f7203ff, 0x7f8d68ff, 0x7fa42eff, 0x7fb7067f, 0x7fc6757f,
-    0x7fd3027f, 0x7fdd2aff, 0x7fe542ff, 0x7febaeff, 0x7ff0baff, 0x7ff4a97f,
-    0x7ff7ad7f, 0x7ff9f87f, 0x7ffbac7f, 0x7ffcf3ff, 0x7ffde6ff, 0x7ffe8eff,
-    0x7fff0c7f, 0x7fff607f, 0x7fff9b7f, 0x7fffbcff, 0x7fffd5ff, 0x7fffe6ff,
-    0x7ffff77f, 0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff,
-    0x7fffffff, 0x7fffffff};
+  0x00017119, 0x0003e63e, 0x000791c4, 0x000cbf2b, 0x0013db7f, 0x001d3aa3,
+  0x00295a6c, 0x0038b04a, 0x004bd33c, 0x006351de, 0x007fdc58, 0x00a21a71,
+  0x00cacd17, 0x00fab53c, 0x0132b55d, 0x017396cf, 0x01be4cd7, 0x0213b9ef,
+  0x0274d163, 0x02e28ed3, 0x035de58f, 0x03e7d133, 0x0481450f, 0x052b345f,
+  0x05e6926f, 0x06b43957, 0x07950b97, 0x0889d27f, 0x09934eff, 0x0ab2313f,
+  0x0be707df, 0x0d32591f, 0x0e9491ef, 0x100dfddf, 0x119ecf5f, 0x13471f7f,
+  0x1506dd5f, 0x16dde79f, 0x18cbe1df, 0x1ad06fdf, 0x1ceaf25f, 0x1f1ab8df,
+  0x215efa7f, 0x23b6aa3f, 0x2620bc3f, 0x289bf17f, 0x2b26f1bf, 0x2dc054ff,
+  0x3066773f, 0x3317c5ff, 0x35d27c3f, 0x3894ccbf, 0x3b5cd8ff, 0x3e28baff,
+  0x40f6727f, 0x43c408ff, 0x468f8e7f, 0x495703ff, 0x4c187a7f, 0x4ed2027f,
+  0x5181be7f, 0x5425e0ff, 0x56bcb5ff, 0x5944997f, 0x5bbc09ff, 0x5e218dff,
+  0x6073ddff, 0x62b1d4ff, 0x64da65ff, 0x66ecaeff, 0x68e7e5ff, 0x6acb857f,
+  0x6c970f7f, 0x6e4a37ff, 0x6fe4d5ff, 0x7166f8ff, 0x72d0bb7f, 0x74225f7f,
+  0x755c52ff, 0x767f1b7f, 0x778b4fff, 0x7881ba7f, 0x79632bff, 0x7a307eff,
+  0x7aeab77f, 0x7b92c8ff, 0x7c29c77f, 0x7cb0d0ff, 0x7d28f17f, 0x7d933dff,
+  0x7df0dc7f, 0x7e42d8ff, 0x7e8a3f7f, 0x7ec80c7f, 0x7efd3aff, 0x7f2ab67f,
+  0x7f5160ff, 0x7f7203ff, 0x7f8d68ff, 0x7fa42eff, 0x7fb7067f, 0x7fc6757f,
+  0x7fd3027f, 0x7fdd2aff, 0x7fe542ff, 0x7febaeff, 0x7ff0baff, 0x7ff4a97f,
+  0x7ff7ad7f, 0x7ff9f87f, 0x7ffbac7f, 0x7ffcf3ff, 0x7ffde6ff, 0x7ffe8eff,
+  0x7fff0c7f, 0x7fff607f, 0x7fff9b7f, 0x7fffbcff, 0x7fffd5ff, 0x7fffe6ff,
+  0x7ffff77f, 0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff,
+  0x7fffffff, 0x7fffffff};
 
 const WORD32 kbd_win32[32] = {
-    0x0002dec5, 0x001e8ba8, 0x00693bb0, 0x01097406, 0x02311ec3, 0x041af00f,
-    0x0704b1f7, 0x0b274746, 0x10ad6b60, 0x17aaa83a, 0x2014320f, 0x29bd3b7d,
-    0x3457df96, 0x3f7b02c1, 0x4aaca77c, 0x556f55f4, 0x5f508afc, 0x67f5d1a0,
-    0x6f264993, 0x74ceee0d, 0x7900e380, 0x7bea421b, 0x7dcb051e, 0x7ee8ac51,
-    0x7f835d29, 0x7fceb4af, 0x7fef248c, 0x7ffb3200, 0x7ffeecbc, 0x7fffd4bc,
-    0x7ffffc59, 0x7ffffff6};
+  0x0002dec5, 0x001e8ba8, 0x00693bb0, 0x01097406, 0x02311ec3, 0x041af00f,
+  0x0704b1f7, 0x0b274746, 0x10ad6b60, 0x17aaa83a, 0x2014320f, 0x29bd3b7d,
+  0x3457df96, 0x3f7b02c1, 0x4aaca77c, 0x556f55f4, 0x5f508afc, 0x67f5d1a0,
+  0x6f264993, 0x74ceee0d, 0x7900e380, 0x7bea421b, 0x7dcb051e, 0x7ee8ac51,
+  0x7f835d29, 0x7fceb4af, 0x7fef248c, 0x7ffb3200, 0x7ffeecbc, 0x7fffd4bc,
+  0x7ffffc59, 0x7ffffff6};
 
 const WORD32 ixheaacd_kbd_win960[960] = {
-    0x0009e6ab, 0x000e96d5, 0x0012987d, 0x001652b5, 0x0019ebce, 0x001d76bf,
-    0x0020fe78, 0x002489ef, 0x00281de1, 0x002bbdbb, 0x002f6c0d, 0x00332ad8,
-    0x0036fbb8, 0x003ae003, 0x003ed8d8, 0x0042e72f, 0x00470be3, 0x004b47b8,
-    0x004f9b5e, 0x00540779, 0x00588ca0, 0x005d2b61, 0x0061e441, 0x0066b7c1,
-    0x006ba65b, 0x0070b086, 0x0075d6b4, 0x007b1955, 0x008078d5, 0x0085f59f,
-    0x008b901c, 0x009148b4, 0x00971fcb, 0x009d15c7, 0x00a32b0a, 0x00a95ff9,
-    0x00afb4f3, 0x00b62a5c, 0x00bcc093, 0x00c377f8, 0x00ca50ea, 0x00d14bcb,
-    0x00d868f7, 0x00dfa8cd, 0x00e70bad, 0x00ee91f3, 0x00f63bfe, 0x00fe0a2b,
-    0x0105fcd8, 0x010e1462, 0x01165126, 0x011eb381, 0x01273bcf, 0x012fea6f,
-    0x0138bfbb, 0x0141bc11, 0x014adfce, 0x01542b4c, 0x015d9ee9, 0x01673b00,
-    0x0170ffee, 0x017aee0e, 0x018505bc, 0x018f4753, 0x0199b32f, 0x01a449ac,
-    0x01af0b24, 0x01b9f7f3, 0x01c51074, 0x01d05501, 0x01dbc5f5, 0x01e763ab,
-    0x01f32e7d, 0x01ff26c5, 0x020b4cdd, 0x0217a120, 0x022423e6, 0x0230d589,
-    0x023db663, 0x024ac6cd, 0x02580720, 0x026577b3, 0x027318e0, 0x0280eaff,
-    0x028eee67, 0x029d2371, 0x02ab8a74, 0x02ba23c6, 0x02c8efbf, 0x02d7eeb6,
-    0x02e72101, 0x02f686f5, 0x030620e9, 0x0315ef31, 0x0325f223, 0x03362a14,
-    0x03469757, 0x03573a42, 0x03681327, 0x0379225a, 0x038a682d, 0x039be4f4,
-    0x03ad9900, 0x03bf84a3, 0x03d1a82e, 0x03e403f2, 0x03f69840, 0x04096567,
-    0x041c6bb8, 0x042fab80, 0x0443250f, 0x0456d8b3, 0x046ac6ba, 0x047eef70,
-    0x04935322, 0x04a7f21c, 0x04bcccab, 0x04d1e318, 0x04e735af, 0x04fcc4b9,
-    0x05129080, 0x0528994d, 0x053edf67, 0x05556318, 0x056c24a5, 0x05832455,
-    0x059a626e, 0x05b1df35, 0x05c99aef, 0x05e195e0, 0x05f9d04b, 0x06124a72,
-    0x062b0499, 0x0643feff, 0x065d39e7, 0x0676b58f, 0x06907237, 0x06aa701d,
-    0x06c4af7f, 0x06df309b, 0x06f9f3ad, 0x0714f8f0, 0x0730409f, 0x074bcaf4,
-    0x07679829, 0x0783a876, 0x079ffc13, 0x07bc9337, 0x07d96e18, 0x07f68cec,
-    0x0813efe7, 0x0831973c, 0x084f831f, 0x086db3c2, 0x088c2956, 0x08aae40b,
-    0x08c9e411, 0x08e92996, 0x0908b4c9, 0x092885d5, 0x09489ce8, 0x0968fa2b,
-    0x09899dca, 0x09aa87ed, 0x09cbb8bd, 0x09ed3061, 0x0a0eef00, 0x0a30f4bf,
-    0x0a5341c2, 0x0a75d62d, 0x0a98b224, 0x0abbd5c7, 0x0adf4137, 0x0b02f494,
-    0x0b26effc, 0x0b4b338e, 0x0b6fbf66, 0x0b94939f, 0x0bb9b055, 0x0bdf15a1,
-    0x0c04c39c, 0x0c2aba5c, 0x0c50f9fa, 0x0c778289, 0x0c9e5420, 0x0cc56ed0,
-    0x0cecd2ad, 0x0d147fc7, 0x0d3c7630, 0x0d64b5f5, 0x0d8d3f25, 0x0db611cd,
-    0x0ddf2df9, 0x0e0893b3, 0x0e324306, 0x0e5c3bf9, 0x0e867e93, 0x0eb10add,
-    0x0edbe0d9, 0x0f07008d, 0x0f3269fb, 0x0f5e1d26, 0x0f8a1a0d, 0x0fb660b0,
-    0x0fe2f10e, 0x100fcb24, 0x103ceeed, 0x106a5c65, 0x10981385, 0x10c61446,
-    0x10f45ea0, 0x1122f287, 0x1151cff2, 0x1180f6d4, 0x11b06720, 0x11e020c7,
-    0x121023ba, 0x12406fe7, 0x1271053d, 0x12a1e3a8, 0x12d30b14, 0x13047b6c,
-    0x13363497, 0x1368367e, 0x139a8108, 0x13cd141a, 0x13ffef99, 0x14331367,
-    0x14667f67, 0x149a3378, 0x14ce2f7b, 0x1502734e, 0x1536fece, 0x156bd1d6,
-    0x15a0ec41, 0x15d64de8, 0x160bf6a4, 0x1641e64b, 0x16781cb3, 0x16ae99b1,
-    0x16e55d18, 0x171c66b9, 0x1753b666, 0x178b4bef, 0x17c32720, 0x17fb47c9,
-    0x1833adb4, 0x186c58ad, 0x18a5487c, 0x18de7ceb, 0x1917f5c0, 0x1951b2c1,
-    0x198bb3b3, 0x19c5f85a, 0x1a008076, 0x1a3b4bca, 0x1a765a16, 0x1ab1ab18,
-    0x1aed3e8d, 0x1b291431, 0x1b652bc0, 0x1ba184f4, 0x1bde1f85, 0x1c1afb2b,
-    0x1c58179b, 0x1c95748c, 0x1cd311b1, 0x1d10eebc, 0x1d4f0b5f, 0x1d8d674c,
-    0x1dcc0230, 0x1e0adbba, 0x1e49f397, 0x1e894973, 0x1ec8dcf8, 0x1f08adcf,
-    0x1f48bba2, 0x1f890617, 0x1fc98cd5, 0x200a4f80, 0x204b4dbc, 0x208c872b,
-    0x20cdfb70, 0x210faa2b, 0x215192fb, 0x2193b57f, 0x21d61153, 0x2218a613,
-    0x225b735c, 0x229e78c6, 0x22e1b5ea, 0x23252a61, 0x2368d5c1, 0x23acb79f,
-    0x23f0cf91, 0x24351d29, 0x24799ffb, 0x24be5798, 0x25034391, 0x25486374,
-    0x258db6d1, 0x25d33d34, 0x2618f62c, 0x265ee142, 0x26a4fe01, 0x26eb4bf4,
-    0x2731caa2, 0x27787994, 0x27bf5850, 0x2806665b, 0x284da33b, 0x28950e73,
-    0x28dca787, 0x29246df9, 0x296c6149, 0x29b480f9, 0x29fccc86, 0x2a454371,
-    0x2a8de537, 0x2ad6b154, 0x2b1fa744, 0x2b68c683, 0x2bb20e8b, 0x2bfb7ed6,
-    0x2c4516db, 0x2c8ed614, 0x2cd8bbf6, 0x2d22c7f9, 0x2d6cf992, 0x2db75036,
-    0x2e01cb58, 0x2e4c6a6c, 0x2e972ce5, 0x2ee21234, 0x2f2d19cb, 0x2f78431a,
-    0x2fc38d90, 0x300ef89d, 0x305a83ae, 0x30a62e33, 0x30f1f797, 0x313ddf48,
-    0x3189e4b0, 0x31d6073c, 0x32224656, 0x326ea167, 0x32bb17da, 0x3307a916,
-    0x33545485, 0x33a1198d, 0x33edf797, 0x343aee08, 0x3487fc48, 0x34d521ba,
-    0x35225dc6, 0x356fafcf, 0x35bd1739, 0x360a9368, 0x365823c0, 0x36a5c7a3,
-    0x36f37e74, 0x37414795, 0x378f2267, 0x37dd0e4b, 0x382b0aa3, 0x387916cf,
-    0x38c7322f, 0x39155c23, 0x3963940b, 0x39b1d945, 0x3a002b30, 0x3a4e892c,
-    0x3a9cf295, 0x3aeb66cb, 0x3b39e52b, 0x3b886d13, 0x3bd6fde0, 0x3c2596f0,
-    0x3c74379e, 0x3cc2df48, 0x3d118d4b, 0x3d604102, 0x3daef9cb, 0x3dfdb701,
-    0x3e4c77ff, 0x3e9b3c24, 0x3eea02c9, 0x3f38cb4a, 0x3f879504, 0x3fd65f52,
-    0x4025298f, 0x4073f317, 0x40c2bb45, 0x41118175, 0x41604503, 0x41af0549,
-    0x41fdc1a4, 0x424c796f, 0x429b2c05, 0x42e9d8c3, 0x43387f04, 0x43871e25,
-    0x43d5b580, 0x44244473, 0x4472ca59, 0x44c1468f, 0x450fb872, 0x455e1f5e,
-    0x45ac7ab1, 0x45fac9c7, 0x46490bfe, 0x469740b4, 0x46e56746, 0x47337f12,
-    0x47818778, 0x47cf7fd5, 0x481d6789, 0x486b3df2, 0x48b90271, 0x4906b465,
-    0x4954532f, 0x49a1de2f, 0x49ef54c7, 0x4a3cb656, 0x4a8a0241, 0x4ad737e7,
-    0x4b2456ad, 0x4b715df6, 0x4bbe4d24, 0x4c0b239b, 0x4c57e0c1, 0x4ca483f9,
-    0x4cf10caa, 0x4d3d7a3a, 0x4d89cc0e, 0x4dd6018d, 0x4e221a20, 0x4e6e152f,
-    0x4eb9f221, 0x4f05b060, 0x4f514f56, 0x4f9cce6e, 0x4fe82d12, 0x50336aae,
-    0x507e86af, 0x50c98080, 0x51145791, 0x515f0b50, 0x51a99b2a, 0x51f40691,
-    0x523e4cf3, 0x52886dc4, 0x52d26874, 0x531c3c75, 0x5365e93d, 0x53af6e3d,
-    0x53f8caec, 0x5441febf, 0x548b092d, 0x54d3e9ac, 0x551c9fb6, 0x55652ac2,
-    0x55ad8a4b, 0x55f5bdcc, 0x563dc4bf, 0x56859ea2, 0x56cd4af1, 0x5714c92b,
-    0x575c18cf, 0x57a3395d, 0x57ea2a55, 0x5830eb39, 0x58777b8d, 0x58bddad4,
-    0x59040892, 0x594a044d, 0x598fcd8d, 0x59d563d8, 0x5a1ac6b7, 0x5a5ff5b4,
-    0x5aa4f059, 0x5ae9b632, 0x5b2e46cc, 0x5b72a1b5, 0x5bb6c67b, 0x5bfab4ad,
-    0x5c3e6bde, 0x5c81eb9f, 0x5cc53382, 0x5d08431d, 0x5d4b1a04, 0x5d8db7ce,
-    0x5dd01c12, 0x5e124669, 0x5e54366c, 0x5e95ebb7, 0x5ed765e4, 0x5f18a493,
-    0x5f59a75f, 0x5f9a6dea, 0x5fdaf7d4, 0x601b44be, 0x605b544b, 0x609b2620,
-    0x60dab9e2, 0x611a0f37, 0x615925c8, 0x6197fd3d, 0x61d69540, 0x6214ed7c,
-    0x6253059f, 0x6290dd56, 0x62ce7450, 0x630bca3d, 0x6348ded0, 0x6385b1ba,
-    0x63c242b1, 0x63fe9168, 0x643a9d98, 0x647666f7, 0x64b1ed3e, 0x64ed3029,
-    0x65282f73, 0x6562ead9, 0x659d6218, 0x65d794f1, 0x66118325, 0x664b2c75,
-    0x668490a5, 0x66bdaf79, 0x66f688b9, 0x672f1c2a, 0x67676995, 0x679f70c5,
-    0x67d73185, 0x680eaba2, 0x6845dee8, 0x687ccb28, 0x68b37031, 0x68e9cdd7,
-    0x691fe3eb, 0x6955b242, 0x698b38b3, 0x69c07713, 0x69f56d3d, 0x6a2a1b09,
-    0x6a5e8052, 0x6a929cf5, 0x6ac670d0, 0x6af9fbc1, 0x6b2d3da9, 0x6b60366b,
-    0x6b92e5e7, 0x6bc54c04, 0x6bf768a7, 0x6c293bb7, 0x6c5ac51b, 0x6c8c04be,
-    0x6cbcfa8b, 0x6ceda66e, 0x6d1e0854, 0x6d4e202c, 0x6d7dede7, 0x6dad7176,
-    0x6ddcaacb, 0x6e0b99db, 0x6e3a3e9c, 0x6e689903, 0x6e96a90a, 0x6ec46ea8,
-    0x6ef1e9d9, 0x6f1f1a99, 0x6f4c00e4, 0x6f789cb9, 0x6fa4ee19, 0x6fd0f502,
-    0x6ffcb179, 0x70282380, 0x70534b1c, 0x707e2853, 0x70a8bb2d, 0x70d303b1,
-    0x70fd01e9, 0x7126b5e1, 0x71501fa5, 0x71793f41, 0x71a214c5, 0x71caa040,
-    0x71f2e1c4, 0x721ad962, 0x7242872f, 0x7269eb3e, 0x729105a5, 0x72b7d67c,
-    0x72de5dda, 0x73049bd9, 0x732a9094, 0x73503c25, 0x73759eaa, 0x739ab840,
-    0x73bf8908, 0x73e4111f, 0x740850a9, 0x742c47c8, 0x744ff69e, 0x74735d50,
-    0x74967c04, 0x74b952e1, 0x74dbe20f, 0x74fe29b6, 0x75202a00, 0x7541e319,
-    0x7563552c, 0x75848066, 0x75a564f5, 0x75c60308, 0x75e65ad0, 0x76066c7d,
-    0x76263841, 0x7645be50, 0x7664fedc, 0x7683fa1c, 0x76a2b045, 0x76c1218e,
-    0x76df4e2e, 0x76fd365f, 0x771ada59, 0x77383a56, 0x77555694, 0x77722f4d,
-    0x778ec4be, 0x77ab1726, 0x77c726c3, 0x77e2f3d5, 0x77fe7e9d, 0x7819c75b,
-    0x7834ce51, 0x784f93c3, 0x786a17f4, 0x78845b28, 0x789e5da5, 0x78b81fb0,
-    0x78d1a190, 0x78eae38c, 0x7903e5ed, 0x791ca8fb, 0x79352d00, 0x794d7246,
-    0x79657917, 0x797d41c0, 0x7994cc8b, 0x79ac19c8, 0x79c329c1, 0x79d9fcc6,
-    0x79f09325, 0x7a06ed2e, 0x7a1d0b2f, 0x7a32ed7a, 0x7a489460, 0x7a5e0031,
-    0x7a733141, 0x7a8827e0, 0x7a9ce463, 0x7ab1671d, 0x7ac5b061, 0x7ad9c085,
-    0x7aed97dd, 0x7b0136bf, 0x7b149d81, 0x7b27cc78, 0x7b3ac3fb, 0x7b4d8462,
-    0x7b600e03, 0x7b726138, 0x7b847e57, 0x7b9665b9, 0x7ba817b8, 0x7bb994ac,
-    0x7bcadcef, 0x7bdbf0db, 0x7becd0ca, 0x7bfd7d17, 0x7c0df61b, 0x7c1e3c32,
-    0x7c2e4fb8, 0x7c3e3107, 0x7c4de07b, 0x7c5d5e70, 0x7c6cab42, 0x7c7bc74d,
-    0x7c8ab2ee, 0x7c996e82, 0x7ca7fa64, 0x7cb656f1, 0x7cc48488, 0x7cd28384,
-    0x7ce05444, 0x7cedf723, 0x7cfb6c80, 0x7d08b4b9, 0x7d15d02a, 0x7d22bf31,
-    0x7d2f822c, 0x7d3c1978, 0x7d488573, 0x7d54c67a, 0x7d60dcec, 0x7d6cc925,
-    0x7d788b84, 0x7d842466, 0x7d8f9427, 0x7d9adb27, 0x7da5f9c2, 0x7db0f055,
-    0x7dbbbf3d, 0x7dc666d8, 0x7dd0e782, 0x7ddb4199, 0x7de57578, 0x7def837d,
-    0x7df96c03, 0x7e032f68, 0x7e0cce07, 0x7e16483c, 0x7e1f9e62, 0x7e28d0d5,
-    0x7e31dff1, 0x7e3acc0f, 0x7e43958c, 0x7e4c3cc2, 0x7e54c20a, 0x7e5d25bf,
-    0x7e65683b, 0x7e6d89d7, 0x7e758aed, 0x7e7d6bd5, 0x7e852ce7, 0x7e8cce7d,
-    0x7e9450ee, 0x7e9bb492, 0x7ea2f9c1, 0x7eaa20d0, 0x7eb12a17, 0x7eb815ec,
-    0x7ebee4a5, 0x7ec59697, 0x7ecc2c19, 0x7ed2a57d, 0x7ed90319, 0x7edf4541,
-    0x7ee56c49, 0x7eeb7882, 0x7ef16a41, 0x7ef741d7, 0x7efcff97, 0x7f02a3d1,
-    0x7f082ed7, 0x7f0da0f9, 0x7f12fa87, 0x7f183bd2, 0x7f1d6527, 0x7f2276d6,
-    0x7f27712d, 0x7f2c5479, 0x7f312109, 0x7f35d727, 0x7f3a7721, 0x7f3f0143,
-    0x7f4375d7, 0x7f47d528, 0x7f4c1f81, 0x7f50552b, 0x7f54766f, 0x7f588396,
-    0x7f5c7ce7, 0x7f6062ab, 0x7f643528, 0x7f67f4a4, 0x7f6ba167, 0x7f6f3bb4,
-    0x7f72c3d1, 0x7f763a01, 0x7f799e8a, 0x7f7cf1ac, 0x7f8033ad, 0x7f8364cc,
-    0x7f86854c, 0x7f89956d, 0x7f8c9570, 0x7f8f8594, 0x7f926619, 0x7f95373d,
-    0x7f97f93d, 0x7f9aac58, 0x7f9d50ca, 0x7f9fe6d0, 0x7fa26ea4, 0x7fa4e882,
-    0x7fa754a5, 0x7fa9b346, 0x7fac049e, 0x7fae48e7, 0x7fb08058, 0x7fb2ab29,
-    0x7fb4c991, 0x7fb6dbc6, 0x7fb8e1fe, 0x7fbadc6e, 0x7fbccb4b, 0x7fbeaec8,
-    0x7fc0871a, 0x7fc25472, 0x7fc41704, 0x7fc5cf00, 0x7fc77c98, 0x7fc91ffd,
-    0x7fcab95e, 0x7fcc48eb, 0x7fcdced2, 0x7fcf4b42, 0x7fd0be68, 0x7fd22872,
-    0x7fd3898b, 0x7fd4e1e0, 0x7fd6319c, 0x7fd778ea, 0x7fd8b7f4, 0x7fd9eee4,
-    0x7fdb1de2, 0x7fdc4518, 0x7fdd64ad, 0x7fde7cc9, 0x7fdf8d93, 0x7fe09731,
-    0x7fe199c9, 0x7fe29580, 0x7fe38a7b, 0x7fe478de, 0x7fe560cc, 0x7fe6426a,
-    0x7fe71dda, 0x7fe7f33d, 0x7fe8c2b5, 0x7fe98c64, 0x7fea506a, 0x7feb0ee6,
-    0x7febc7fa, 0x7fec7bc3, 0x7fed2a60, 0x7fedd3ef, 0x7fee788f, 0x7fef185b,
-    0x7fefb371, 0x7ff049ed, 0x7ff0dbeb, 0x7ff16985, 0x7ff1f2d6, 0x7ff277f9,
-    0x7ff2f908, 0x7ff3761c, 0x7ff3ef4d, 0x7ff464b5, 0x7ff4d66c, 0x7ff54488,
-    0x7ff5af22, 0x7ff61650, 0x7ff67a28, 0x7ff6dac0, 0x7ff7382e, 0x7ff79287,
-    0x7ff7e9df, 0x7ff83e4c, 0x7ff88fe0, 0x7ff8deb0, 0x7ff92ace, 0x7ff9744d,
-    0x7ff9bb3f, 0x7ff9ffb8, 0x7ffa41c7, 0x7ffa817f, 0x7ffabef0, 0x7ffafa2b,
-    0x7ffb3341, 0x7ffb6a40, 0x7ffb9f38, 0x7ffbd23a, 0x7ffc0353, 0x7ffc3292,
-    0x7ffc6005, 0x7ffc8bba, 0x7ffcb5bf, 0x7ffcde21, 0x7ffd04ed, 0x7ffd2a30,
-    0x7ffd4df5, 0x7ffd704a, 0x7ffd9139, 0x7ffdb0cf, 0x7ffdcf16, 0x7ffdec19,
-    0x7ffe07e4, 0x7ffe2280, 0x7ffe3bf8, 0x7ffe5456, 0x7ffe6ba3, 0x7ffe81e8,
-    0x7ffe9730, 0x7ffeab82, 0x7ffebee7, 0x7ffed169, 0x7ffee30e, 0x7ffef3e0,
-    0x7fff03e5, 0x7fff1326, 0x7fff21aa, 0x7fff2f78, 0x7fff3c96, 0x7fff490d,
-    0x7fff54e1, 0x7fff601a, 0x7fff6abe, 0x7fff74d3, 0x7fff7e5e, 0x7fff8765,
-    0x7fff8fee, 0x7fff97fe, 0x7fff9f9b, 0x7fffa6c8, 0x7fffad8b, 0x7fffb3e9,
-    0x7fffb9e5, 0x7fffbf85, 0x7fffc4cd, 0x7fffc9c0, 0x7fffce64, 0x7fffd2ba,
-    0x7fffd6c8, 0x7fffda90, 0x7fffde16, 0x7fffe15e, 0x7fffe46a, 0x7fffe73d,
-    0x7fffe9db, 0x7fffec47, 0x7fffee82, 0x7ffff091, 0x7ffff274, 0x7ffff42f,
-    0x7ffff5c4, 0x7ffff736, 0x7ffff885, 0x7ffff9b5, 0x7ffffac7, 0x7ffffbbe,
-    0x7ffffc9a, 0x7ffffd5f, 0x7ffffe0c, 0x7ffffea5, 0x7fffff2a, 0x7fffff9c};
+  0x0009e6ab, 0x000e96d5, 0x0012987d, 0x001652b5, 0x0019ebce, 0x001d76bf,
+  0x0020fe78, 0x002489ef, 0x00281de1, 0x002bbdbb, 0x002f6c0d, 0x00332ad8,
+  0x0036fbb8, 0x003ae003, 0x003ed8d8, 0x0042e72f, 0x00470be3, 0x004b47b8,
+  0x004f9b5e, 0x00540779, 0x00588ca0, 0x005d2b61, 0x0061e441, 0x0066b7c1,
+  0x006ba65b, 0x0070b086, 0x0075d6b4, 0x007b1955, 0x008078d5, 0x0085f59f,
+  0x008b901c, 0x009148b4, 0x00971fcb, 0x009d15c7, 0x00a32b0a, 0x00a95ff9,
+  0x00afb4f3, 0x00b62a5c, 0x00bcc093, 0x00c377f8, 0x00ca50ea, 0x00d14bcb,
+  0x00d868f7, 0x00dfa8cd, 0x00e70bad, 0x00ee91f3, 0x00f63bfe, 0x00fe0a2b,
+  0x0105fcd8, 0x010e1462, 0x01165126, 0x011eb381, 0x01273bcf, 0x012fea6f,
+  0x0138bfbb, 0x0141bc11, 0x014adfce, 0x01542b4c, 0x015d9ee9, 0x01673b00,
+  0x0170ffee, 0x017aee0e, 0x018505bc, 0x018f4753, 0x0199b32f, 0x01a449ac,
+  0x01af0b24, 0x01b9f7f3, 0x01c51074, 0x01d05501, 0x01dbc5f5, 0x01e763ab,
+  0x01f32e7d, 0x01ff26c5, 0x020b4cdd, 0x0217a120, 0x022423e6, 0x0230d589,
+  0x023db663, 0x024ac6cd, 0x02580720, 0x026577b3, 0x027318e0, 0x0280eaff,
+  0x028eee67, 0x029d2371, 0x02ab8a74, 0x02ba23c6, 0x02c8efbf, 0x02d7eeb6,
+  0x02e72101, 0x02f686f5, 0x030620e9, 0x0315ef31, 0x0325f223, 0x03362a14,
+  0x03469757, 0x03573a42, 0x03681327, 0x0379225a, 0x038a682d, 0x039be4f4,
+  0x03ad9900, 0x03bf84a3, 0x03d1a82e, 0x03e403f2, 0x03f69840, 0x04096567,
+  0x041c6bb8, 0x042fab80, 0x0443250f, 0x0456d8b3, 0x046ac6ba, 0x047eef70,
+  0x04935322, 0x04a7f21c, 0x04bcccab, 0x04d1e318, 0x04e735af, 0x04fcc4b9,
+  0x05129080, 0x0528994d, 0x053edf67, 0x05556318, 0x056c24a5, 0x05832455,
+  0x059a626e, 0x05b1df35, 0x05c99aef, 0x05e195e0, 0x05f9d04b, 0x06124a72,
+  0x062b0499, 0x0643feff, 0x065d39e7, 0x0676b58f, 0x06907237, 0x06aa701d,
+  0x06c4af7f, 0x06df309b, 0x06f9f3ad, 0x0714f8f0, 0x0730409f, 0x074bcaf4,
+  0x07679829, 0x0783a876, 0x079ffc13, 0x07bc9337, 0x07d96e18, 0x07f68cec,
+  0x0813efe7, 0x0831973c, 0x084f831f, 0x086db3c2, 0x088c2956, 0x08aae40b,
+  0x08c9e411, 0x08e92996, 0x0908b4c9, 0x092885d5, 0x09489ce8, 0x0968fa2b,
+  0x09899dca, 0x09aa87ed, 0x09cbb8bd, 0x09ed3061, 0x0a0eef00, 0x0a30f4bf,
+  0x0a5341c2, 0x0a75d62d, 0x0a98b224, 0x0abbd5c7, 0x0adf4137, 0x0b02f494,
+  0x0b26effc, 0x0b4b338e, 0x0b6fbf66, 0x0b94939f, 0x0bb9b055, 0x0bdf15a1,
+  0x0c04c39c, 0x0c2aba5c, 0x0c50f9fa, 0x0c778289, 0x0c9e5420, 0x0cc56ed0,
+  0x0cecd2ad, 0x0d147fc7, 0x0d3c7630, 0x0d64b5f5, 0x0d8d3f25, 0x0db611cd,
+  0x0ddf2df9, 0x0e0893b3, 0x0e324306, 0x0e5c3bf9, 0x0e867e93, 0x0eb10add,
+  0x0edbe0d9, 0x0f07008d, 0x0f3269fb, 0x0f5e1d26, 0x0f8a1a0d, 0x0fb660b0,
+  0x0fe2f10e, 0x100fcb24, 0x103ceeed, 0x106a5c65, 0x10981385, 0x10c61446,
+  0x10f45ea0, 0x1122f287, 0x1151cff2, 0x1180f6d4, 0x11b06720, 0x11e020c7,
+  0x121023ba, 0x12406fe7, 0x1271053d, 0x12a1e3a8, 0x12d30b14, 0x13047b6c,
+  0x13363497, 0x1368367e, 0x139a8108, 0x13cd141a, 0x13ffef99, 0x14331367,
+  0x14667f67, 0x149a3378, 0x14ce2f7b, 0x1502734e, 0x1536fece, 0x156bd1d6,
+  0x15a0ec41, 0x15d64de8, 0x160bf6a4, 0x1641e64b, 0x16781cb3, 0x16ae99b1,
+  0x16e55d18, 0x171c66b9, 0x1753b666, 0x178b4bef, 0x17c32720, 0x17fb47c9,
+  0x1833adb4, 0x186c58ad, 0x18a5487c, 0x18de7ceb, 0x1917f5c0, 0x1951b2c1,
+  0x198bb3b3, 0x19c5f85a, 0x1a008076, 0x1a3b4bca, 0x1a765a16, 0x1ab1ab18,
+  0x1aed3e8d, 0x1b291431, 0x1b652bc0, 0x1ba184f4, 0x1bde1f85, 0x1c1afb2b,
+  0x1c58179b, 0x1c95748c, 0x1cd311b1, 0x1d10eebc, 0x1d4f0b5f, 0x1d8d674c,
+  0x1dcc0230, 0x1e0adbba, 0x1e49f397, 0x1e894973, 0x1ec8dcf8, 0x1f08adcf,
+  0x1f48bba2, 0x1f890617, 0x1fc98cd5, 0x200a4f80, 0x204b4dbc, 0x208c872b,
+  0x20cdfb70, 0x210faa2b, 0x215192fb, 0x2193b57f, 0x21d61153, 0x2218a613,
+  0x225b735c, 0x229e78c6, 0x22e1b5ea, 0x23252a61, 0x2368d5c1, 0x23acb79f,
+  0x23f0cf91, 0x24351d29, 0x24799ffb, 0x24be5798, 0x25034391, 0x25486374,
+  0x258db6d1, 0x25d33d34, 0x2618f62c, 0x265ee142, 0x26a4fe01, 0x26eb4bf4,
+  0x2731caa2, 0x27787994, 0x27bf5850, 0x2806665b, 0x284da33b, 0x28950e73,
+  0x28dca787, 0x29246df9, 0x296c6149, 0x29b480f9, 0x29fccc86, 0x2a454371,
+  0x2a8de537, 0x2ad6b154, 0x2b1fa744, 0x2b68c683, 0x2bb20e8b, 0x2bfb7ed6,
+  0x2c4516db, 0x2c8ed614, 0x2cd8bbf6, 0x2d22c7f9, 0x2d6cf992, 0x2db75036,
+  0x2e01cb58, 0x2e4c6a6c, 0x2e972ce5, 0x2ee21234, 0x2f2d19cb, 0x2f78431a,
+  0x2fc38d90, 0x300ef89d, 0x305a83ae, 0x30a62e33, 0x30f1f797, 0x313ddf48,
+  0x3189e4b0, 0x31d6073c, 0x32224656, 0x326ea167, 0x32bb17da, 0x3307a916,
+  0x33545485, 0x33a1198d, 0x33edf797, 0x343aee08, 0x3487fc48, 0x34d521ba,
+  0x35225dc6, 0x356fafcf, 0x35bd1739, 0x360a9368, 0x365823c0, 0x36a5c7a3,
+  0x36f37e74, 0x37414795, 0x378f2267, 0x37dd0e4b, 0x382b0aa3, 0x387916cf,
+  0x38c7322f, 0x39155c23, 0x3963940b, 0x39b1d945, 0x3a002b30, 0x3a4e892c,
+  0x3a9cf295, 0x3aeb66cb, 0x3b39e52b, 0x3b886d13, 0x3bd6fde0, 0x3c2596f0,
+  0x3c74379e, 0x3cc2df48, 0x3d118d4b, 0x3d604102, 0x3daef9cb, 0x3dfdb701,
+  0x3e4c77ff, 0x3e9b3c24, 0x3eea02c9, 0x3f38cb4a, 0x3f879504, 0x3fd65f52,
+  0x4025298f, 0x4073f317, 0x40c2bb45, 0x41118175, 0x41604503, 0x41af0549,
+  0x41fdc1a4, 0x424c796f, 0x429b2c05, 0x42e9d8c3, 0x43387f04, 0x43871e25,
+  0x43d5b580, 0x44244473, 0x4472ca59, 0x44c1468f, 0x450fb872, 0x455e1f5e,
+  0x45ac7ab1, 0x45fac9c7, 0x46490bfe, 0x469740b4, 0x46e56746, 0x47337f12,
+  0x47818778, 0x47cf7fd5, 0x481d6789, 0x486b3df2, 0x48b90271, 0x4906b465,
+  0x4954532f, 0x49a1de2f, 0x49ef54c7, 0x4a3cb656, 0x4a8a0241, 0x4ad737e7,
+  0x4b2456ad, 0x4b715df6, 0x4bbe4d24, 0x4c0b239b, 0x4c57e0c1, 0x4ca483f9,
+  0x4cf10caa, 0x4d3d7a3a, 0x4d89cc0e, 0x4dd6018d, 0x4e221a20, 0x4e6e152f,
+  0x4eb9f221, 0x4f05b060, 0x4f514f56, 0x4f9cce6e, 0x4fe82d12, 0x50336aae,
+  0x507e86af, 0x50c98080, 0x51145791, 0x515f0b50, 0x51a99b2a, 0x51f40691,
+  0x523e4cf3, 0x52886dc4, 0x52d26874, 0x531c3c75, 0x5365e93d, 0x53af6e3d,
+  0x53f8caec, 0x5441febf, 0x548b092d, 0x54d3e9ac, 0x551c9fb6, 0x55652ac2,
+  0x55ad8a4b, 0x55f5bdcc, 0x563dc4bf, 0x56859ea2, 0x56cd4af1, 0x5714c92b,
+  0x575c18cf, 0x57a3395d, 0x57ea2a55, 0x5830eb39, 0x58777b8d, 0x58bddad4,
+  0x59040892, 0x594a044d, 0x598fcd8d, 0x59d563d8, 0x5a1ac6b7, 0x5a5ff5b4,
+  0x5aa4f059, 0x5ae9b632, 0x5b2e46cc, 0x5b72a1b5, 0x5bb6c67b, 0x5bfab4ad,
+  0x5c3e6bde, 0x5c81eb9f, 0x5cc53382, 0x5d08431d, 0x5d4b1a04, 0x5d8db7ce,
+  0x5dd01c12, 0x5e124669, 0x5e54366c, 0x5e95ebb7, 0x5ed765e4, 0x5f18a493,
+  0x5f59a75f, 0x5f9a6dea, 0x5fdaf7d4, 0x601b44be, 0x605b544b, 0x609b2620,
+  0x60dab9e2, 0x611a0f37, 0x615925c8, 0x6197fd3d, 0x61d69540, 0x6214ed7c,
+  0x6253059f, 0x6290dd56, 0x62ce7450, 0x630bca3d, 0x6348ded0, 0x6385b1ba,
+  0x63c242b1, 0x63fe9168, 0x643a9d98, 0x647666f7, 0x64b1ed3e, 0x64ed3029,
+  0x65282f73, 0x6562ead9, 0x659d6218, 0x65d794f1, 0x66118325, 0x664b2c75,
+  0x668490a5, 0x66bdaf79, 0x66f688b9, 0x672f1c2a, 0x67676995, 0x679f70c5,
+  0x67d73185, 0x680eaba2, 0x6845dee8, 0x687ccb28, 0x68b37031, 0x68e9cdd7,
+  0x691fe3eb, 0x6955b242, 0x698b38b3, 0x69c07713, 0x69f56d3d, 0x6a2a1b09,
+  0x6a5e8052, 0x6a929cf5, 0x6ac670d0, 0x6af9fbc1, 0x6b2d3da9, 0x6b60366b,
+  0x6b92e5e7, 0x6bc54c04, 0x6bf768a7, 0x6c293bb7, 0x6c5ac51b, 0x6c8c04be,
+  0x6cbcfa8b, 0x6ceda66e, 0x6d1e0854, 0x6d4e202c, 0x6d7dede7, 0x6dad7176,
+  0x6ddcaacb, 0x6e0b99db, 0x6e3a3e9c, 0x6e689903, 0x6e96a90a, 0x6ec46ea8,
+  0x6ef1e9d9, 0x6f1f1a99, 0x6f4c00e4, 0x6f789cb9, 0x6fa4ee19, 0x6fd0f502,
+  0x6ffcb179, 0x70282380, 0x70534b1c, 0x707e2853, 0x70a8bb2d, 0x70d303b1,
+  0x70fd01e9, 0x7126b5e1, 0x71501fa5, 0x71793f41, 0x71a214c5, 0x71caa040,
+  0x71f2e1c4, 0x721ad962, 0x7242872f, 0x7269eb3e, 0x729105a5, 0x72b7d67c,
+  0x72de5dda, 0x73049bd9, 0x732a9094, 0x73503c25, 0x73759eaa, 0x739ab840,
+  0x73bf8908, 0x73e4111f, 0x740850a9, 0x742c47c8, 0x744ff69e, 0x74735d50,
+  0x74967c04, 0x74b952e1, 0x74dbe20f, 0x74fe29b6, 0x75202a00, 0x7541e319,
+  0x7563552c, 0x75848066, 0x75a564f5, 0x75c60308, 0x75e65ad0, 0x76066c7d,
+  0x76263841, 0x7645be50, 0x7664fedc, 0x7683fa1c, 0x76a2b045, 0x76c1218e,
+  0x76df4e2e, 0x76fd365f, 0x771ada59, 0x77383a56, 0x77555694, 0x77722f4d,
+  0x778ec4be, 0x77ab1726, 0x77c726c3, 0x77e2f3d5, 0x77fe7e9d, 0x7819c75b,
+  0x7834ce51, 0x784f93c3, 0x786a17f4, 0x78845b28, 0x789e5da5, 0x78b81fb0,
+  0x78d1a190, 0x78eae38c, 0x7903e5ed, 0x791ca8fb, 0x79352d00, 0x794d7246,
+  0x79657917, 0x797d41c0, 0x7994cc8b, 0x79ac19c8, 0x79c329c1, 0x79d9fcc6,
+  0x79f09325, 0x7a06ed2e, 0x7a1d0b2f, 0x7a32ed7a, 0x7a489460, 0x7a5e0031,
+  0x7a733141, 0x7a8827e0, 0x7a9ce463, 0x7ab1671d, 0x7ac5b061, 0x7ad9c085,
+  0x7aed97dd, 0x7b0136bf, 0x7b149d81, 0x7b27cc78, 0x7b3ac3fb, 0x7b4d8462,
+  0x7b600e03, 0x7b726138, 0x7b847e57, 0x7b9665b9, 0x7ba817b8, 0x7bb994ac,
+  0x7bcadcef, 0x7bdbf0db, 0x7becd0ca, 0x7bfd7d17, 0x7c0df61b, 0x7c1e3c32,
+  0x7c2e4fb8, 0x7c3e3107, 0x7c4de07b, 0x7c5d5e70, 0x7c6cab42, 0x7c7bc74d,
+  0x7c8ab2ee, 0x7c996e82, 0x7ca7fa64, 0x7cb656f1, 0x7cc48488, 0x7cd28384,
+  0x7ce05444, 0x7cedf723, 0x7cfb6c80, 0x7d08b4b9, 0x7d15d02a, 0x7d22bf31,
+  0x7d2f822c, 0x7d3c1978, 0x7d488573, 0x7d54c67a, 0x7d60dcec, 0x7d6cc925,
+  0x7d788b84, 0x7d842466, 0x7d8f9427, 0x7d9adb27, 0x7da5f9c2, 0x7db0f055,
+  0x7dbbbf3d, 0x7dc666d8, 0x7dd0e782, 0x7ddb4199, 0x7de57578, 0x7def837d,
+  0x7df96c03, 0x7e032f68, 0x7e0cce07, 0x7e16483c, 0x7e1f9e62, 0x7e28d0d5,
+  0x7e31dff1, 0x7e3acc0f, 0x7e43958c, 0x7e4c3cc2, 0x7e54c20a, 0x7e5d25bf,
+  0x7e65683b, 0x7e6d89d7, 0x7e758aed, 0x7e7d6bd5, 0x7e852ce7, 0x7e8cce7d,
+  0x7e9450ee, 0x7e9bb492, 0x7ea2f9c1, 0x7eaa20d0, 0x7eb12a17, 0x7eb815ec,
+  0x7ebee4a5, 0x7ec59697, 0x7ecc2c19, 0x7ed2a57d, 0x7ed90319, 0x7edf4541,
+  0x7ee56c49, 0x7eeb7882, 0x7ef16a41, 0x7ef741d7, 0x7efcff97, 0x7f02a3d1,
+  0x7f082ed7, 0x7f0da0f9, 0x7f12fa87, 0x7f183bd2, 0x7f1d6527, 0x7f2276d6,
+  0x7f27712d, 0x7f2c5479, 0x7f312109, 0x7f35d727, 0x7f3a7721, 0x7f3f0143,
+  0x7f4375d7, 0x7f47d528, 0x7f4c1f81, 0x7f50552b, 0x7f54766f, 0x7f588396,
+  0x7f5c7ce7, 0x7f6062ab, 0x7f643528, 0x7f67f4a4, 0x7f6ba167, 0x7f6f3bb4,
+  0x7f72c3d1, 0x7f763a01, 0x7f799e8a, 0x7f7cf1ac, 0x7f8033ad, 0x7f8364cc,
+  0x7f86854c, 0x7f89956d, 0x7f8c9570, 0x7f8f8594, 0x7f926619, 0x7f95373d,
+  0x7f97f93d, 0x7f9aac58, 0x7f9d50ca, 0x7f9fe6d0, 0x7fa26ea4, 0x7fa4e882,
+  0x7fa754a5, 0x7fa9b346, 0x7fac049e, 0x7fae48e7, 0x7fb08058, 0x7fb2ab29,
+  0x7fb4c991, 0x7fb6dbc6, 0x7fb8e1fe, 0x7fbadc6e, 0x7fbccb4b, 0x7fbeaec8,
+  0x7fc0871a, 0x7fc25472, 0x7fc41704, 0x7fc5cf00, 0x7fc77c98, 0x7fc91ffd,
+  0x7fcab95e, 0x7fcc48eb, 0x7fcdced2, 0x7fcf4b42, 0x7fd0be68, 0x7fd22872,
+  0x7fd3898b, 0x7fd4e1e0, 0x7fd6319c, 0x7fd778ea, 0x7fd8b7f4, 0x7fd9eee4,
+  0x7fdb1de2, 0x7fdc4518, 0x7fdd64ad, 0x7fde7cc9, 0x7fdf8d93, 0x7fe09731,
+  0x7fe199c9, 0x7fe29580, 0x7fe38a7b, 0x7fe478de, 0x7fe560cc, 0x7fe6426a,
+  0x7fe71dda, 0x7fe7f33d, 0x7fe8c2b5, 0x7fe98c64, 0x7fea506a, 0x7feb0ee6,
+  0x7febc7fa, 0x7fec7bc3, 0x7fed2a60, 0x7fedd3ef, 0x7fee788f, 0x7fef185b,
+  0x7fefb371, 0x7ff049ed, 0x7ff0dbeb, 0x7ff16985, 0x7ff1f2d6, 0x7ff277f9,
+  0x7ff2f908, 0x7ff3761c, 0x7ff3ef4d, 0x7ff464b5, 0x7ff4d66c, 0x7ff54488,
+  0x7ff5af22, 0x7ff61650, 0x7ff67a28, 0x7ff6dac0, 0x7ff7382e, 0x7ff79287,
+  0x7ff7e9df, 0x7ff83e4c, 0x7ff88fe0, 0x7ff8deb0, 0x7ff92ace, 0x7ff9744d,
+  0x7ff9bb3f, 0x7ff9ffb8, 0x7ffa41c7, 0x7ffa817f, 0x7ffabef0, 0x7ffafa2b,
+  0x7ffb3341, 0x7ffb6a40, 0x7ffb9f38, 0x7ffbd23a, 0x7ffc0353, 0x7ffc3292,
+  0x7ffc6005, 0x7ffc8bba, 0x7ffcb5bf, 0x7ffcde21, 0x7ffd04ed, 0x7ffd2a30,
+  0x7ffd4df5, 0x7ffd704a, 0x7ffd9139, 0x7ffdb0cf, 0x7ffdcf16, 0x7ffdec19,
+  0x7ffe07e4, 0x7ffe2280, 0x7ffe3bf8, 0x7ffe5456, 0x7ffe6ba3, 0x7ffe81e8,
+  0x7ffe9730, 0x7ffeab82, 0x7ffebee7, 0x7ffed169, 0x7ffee30e, 0x7ffef3e0,
+  0x7fff03e5, 0x7fff1326, 0x7fff21aa, 0x7fff2f78, 0x7fff3c96, 0x7fff490d,
+  0x7fff54e1, 0x7fff601a, 0x7fff6abe, 0x7fff74d3, 0x7fff7e5e, 0x7fff8765,
+  0x7fff8fee, 0x7fff97fe, 0x7fff9f9b, 0x7fffa6c8, 0x7fffad8b, 0x7fffb3e9,
+  0x7fffb9e5, 0x7fffbf85, 0x7fffc4cd, 0x7fffc9c0, 0x7fffce64, 0x7fffd2ba,
+  0x7fffd6c8, 0x7fffda90, 0x7fffde16, 0x7fffe15e, 0x7fffe46a, 0x7fffe73d,
+  0x7fffe9db, 0x7fffec47, 0x7fffee82, 0x7ffff091, 0x7ffff274, 0x7ffff42f,
+  0x7ffff5c4, 0x7ffff736, 0x7ffff885, 0x7ffff9b5, 0x7ffffac7, 0x7ffffbbe,
+  0x7ffffc9a, 0x7ffffd5f, 0x7ffffe0c, 0x7ffffea5, 0x7fffff2a, 0x7fffff9c};
 
 const WORD32 ixheaacd_kbd_win1024[1024] = {
-    0x000999dc, 0x000e1719, 0x0011ec91, 0x00157689, 0x0018def4, 0x001c3697,
-    0x001f85d7, 0x0022d516, 0x00262cba, 0x00298cc1, 0x002cf52b, 0x00306e5c,
-    0x0033f854, 0x00379314, 0x003b3636, 0x003ef283, 0x0042bf97, 0x0046a5d6,
-    0x004a9478, 0x004ea4a8, 0x0052c59f, 0x0056f75d, 0x005b4245, 0x005fa658,
-    0x00642395, 0x0068b19a, 0x006d58c8, 0x00722185, 0x0076fb08, 0x007bedb6,
-    0x0080f98f, 0x00861e92, 0x008b5cbf, 0x0090bc7a, 0x00963560, 0x009bc770,
-    0x00a172ab, 0x00a73710, 0x00ad1d03, 0x00b31c21, 0x00b93ccc, 0x00bf76a2,
-    0x00c5c9a2, 0x00cc4694, 0x00d2d44d, 0x00d98393, 0x00e05468, 0x00e746cb,
-    0x00ee5258, 0x00f57f72, 0x00fcce1b, 0x01043e53, 0x010bc7b3, 0x01137b07,
-    0x011b4783, 0x0123358f, 0x012b4527, 0x01337eb1, 0x013bd167, 0x014445a9,
-    0x014ce3dd, 0x0155a39f, 0x015e84ef, 0x016787cd, 0x0170b49d, 0x0179fa97,
-    0x018372e5, 0x018d045f, 0x0196bfc9, 0x01a09cc3, 0x01aaa3ad, 0x01b4d487,
-    0x01bf26f1, 0x01c99ae9, 0x01d44135, 0x01df090f, 0x01e9f277, 0x01f50e33,
-    0x02004b7f, 0x020bb2bb, 0x02173b83, 0x0222f6a3, 0x022ed353, 0x023ae253,
-    0x024712e3, 0x025375c7, 0x025ffa3b, 0x026cb103, 0x02798957, 0x02869403,
-    0x0293c89f, 0x02a12f8f, 0x02aeb80f, 0x02bc72e3, 0x02ca57a7, 0x02d8665f,
-    0x02e6a767, 0x02f51267, 0x0303afb7, 0x031276fb, 0x0321682f, 0x0330941b,
-    0x033fe197, 0x034f69cb, 0x035f1bef, 0x036ef803, 0x037f0ed3, 0x038f4f93,
-    0x039fc2a7, 0x03b05faf, 0x03c1376b, 0x03d2391b, 0x03e36d23, 0x03f4dbdf,
-    0x0406748f, 0x04183f8f, 0x042a3ce7, 0x043c6c97, 0x044ece97, 0x04616b57,
-    0x047431ff, 0x04873367, 0x049a671f, 0x04adcd2f, 0x04c1658f, 0x04d538af,
-    0x04e935b7, 0x04fd75df, 0x0511dfff, 0x052684cf, 0x053b6457, 0x05506dd7,
-    0x0565ba6f, 0x057b395f, 0x0590ea9f, 0x05a6d697, 0x05bcf4e7, 0x05d34def,
-    0x05e9e1af, 0x0600b027, 0x0617b0f7, 0x062ee417, 0x06465a57, 0x065e02e7,
-    0x0675e637, 0x068e0437, 0x06a65cf7, 0x06bef067, 0x06d7b637, 0x06f0b6b7,
-    0x0709fa57, 0x07237047, 0x073d20ef, 0x07570c57, 0x07713ad7, 0x078b9ba7,
-    0x07a63737, 0x07c10d77, 0x07dc26df, 0x07f77af7, 0x0813015f, 0x082ecaef,
-    0x084acf2f, 0x0867168f, 0x0883903f, 0x08a04d0f, 0x08bd449f, 0x08da76df,
-    0x08f7ec2f, 0x09159c4f, 0x0933870f, 0x0951b4ff, 0x0970153f, 0x098ec0ff,
-    0x09ad9f0f, 0x09ccc02f, 0x09ec247f, 0x0a0bc37f, 0x0a2b9d3f, 0x0a4bba0f,
-    0x0a6c19ff, 0x0a8cac4f, 0x0aad8a0f, 0x0acea28f, 0x0aeff5bf, 0x0b118c1f,
-    0x0b335d1f, 0x0b55714f, 0x0b77c88f, 0x0b9a5a8f, 0x0bbd2f9f, 0x0be03f6f,
-    0x0c03925f, 0x0c27285f, 0x0c4af91f, 0x0c6f0cff, 0x0c9363ef, 0x0cb7f59f,
-    0x0cdcca6f, 0x0d01e25f, 0x0d2734ff, 0x0d4ccaaf, 0x0d729b2f, 0x0d98b71f,
-    0x0dbf0dbf, 0x0de59f2f, 0x0e0c7c0f, 0x0e3393af, 0x0e5aee5f, 0x0e8283cf,
-    0x0eaa64bf, 0x0ed2806f, 0x0efad6cf, 0x0f2378af, 0x0f4c553f, 0x0f7574ef,
-    0x0f9ecf5f, 0x0fc8754f, 0x0ff255ef, 0x101c79bf, 0x1046d81f, 0x107179bf,
-    0x109c5e5f, 0x10c7863f, 0x10f2e8bf, 0x111e8e5f, 0x114a771f, 0x1176a2ff,
-    0x11a3097f, 0x11cfb33f, 0x11fc979f, 0x1229c77f, 0x125729bf, 0x1284d75f,
-    0x12b2bfdf, 0x12e0eb5f, 0x130f5a1f, 0x133e037f, 0x136ce77f, 0x139c171f,
-    0x13cb817f, 0x13fb267f, 0x142b0e9f, 0x145b39df, 0x148b9fdf, 0x14bc48ff,
-    0x14ed2cbf, 0x151e539f, 0x154fbd9f, 0x158159ff, 0x15b341df, 0x15e55bff,
-    0x1617c1bf, 0x164a59bf, 0x167d34df, 0x16b0531f, 0x16e3a39f, 0x17173fbf,
-    0x174b0e1f, 0x177f1f9f, 0x17b36bdf, 0x17e7f2bf, 0x181cbcbf, 0x1851c19f,
-    0x1887011f, 0x18bc7b3f, 0x18f2389f, 0x1928309f, 0x195e5aff, 0x1994c87f,
-    0x19cb709f, 0x1a02539f, 0x1a39713f, 0x1a70d1ff, 0x1aa864ff, 0x1ae032df,
-    0x1b183b5f, 0x1b507e9f, 0x1b88fc9f, 0x1bc1acdf, 0x1bfaa03f, 0x1c33c5ff,
-    0x1c6d267f, 0x1ca6c19f, 0x1ce0977f, 0x1d1a9fbf, 0x1d54e2bf, 0x1d8f57ff,
-    0x1dca105f, 0x1e04f29f, 0x1e40181f, 0x1e7b677f, 0x1eb6f9ff, 0x1ef2b65f,
-    0x1f2ead9f, 0x1f6adf7f, 0x1fa73b3f, 0x1fe3d1bf, 0x2020a2ff, 0x205d9e3f,
-    0x209ad43f, 0x20d83c7f, 0x2115d6ff, 0x2153a3ff, 0x2191a33f, 0x21cfd4bf,
-    0x220e38bf, 0x224cceff, 0x228b977f, 0x22ca923f, 0x2309bf7f, 0x234916bf,
-    0x2388a03f, 0x23c85c3f, 0x240841ff, 0x244859ff, 0x2488a47f, 0x24c918ff,
-    0x2509bf7f, 0x254a903f, 0x258b8aff, 0x25ccb7bf, 0x260e0ebf, 0x264f8f7f,
-    0x269142bf, 0x26d31fbf, 0x27151e7f, 0x27574f7f, 0x2799aa7f, 0x27dc2f3f,
-    0x281eddff, 0x2861b6bf, 0x28a4b13f, 0x28e7ddbf, 0x292b2bff, 0x296ea43f,
-    0x29b23dbf, 0x29f6017f, 0x2a39eeff, 0x2a7dfe3f, 0x2ac2373f, 0x2b0691ff,
-    0x2b4b0dff, 0x2b8fb43f, 0x2bd4737f, 0x2c195cbf, 0x2c5e6fff, 0x2ca39c3f,
-    0x2ce8ea3f, 0x2d2e61ff, 0x2d73f2ff, 0x2db9a5bf, 0x2dff79bf, 0x2e4566ff,
-    0x2e8b7e3f, 0x2ed1aebf, 0x2f1800bf, 0x2f5e6bbf, 0x2fa4efff, 0x2feb9e3f,
-    0x30325d3f, 0x30793dbf, 0x30c0377f, 0x31074a7f, 0x314e7eff, 0x3195cc7f,
-    0x31dd2aff, 0x3224aabf, 0x326c3b7f, 0x32b3edbf, 0x32fbb0ff, 0x33438cff,
-    0x338b827f, 0x33d388bf, 0x341ba7ff, 0x3463d7ff, 0x34ac213f, 0x34f483bf,
-    0x353cee7f, 0x3585727f, 0x35ce073f, 0x3616b53f, 0x365f6bbf, 0x36a832bf,
-    0x36f112ff, 0x3739fbbf, 0x3782f4ff, 0x37cbff3f, 0x38151a3f, 0x385e3dbf,
-    0x38a77a3f, 0x38f0b6bf, 0x393a03ff, 0x398361ff, 0x39ccc87f, 0x3a16377f,
-    0x3a5faebf, 0x3aa936bf, 0x3af2bebf, 0x3b3c577f, 0x3b85f8bf, 0x3bcfa27f,
-    0x3c194bff, 0x3c63063f, 0x3cacc0bf, 0x3cf6837f, 0x3d40463f, 0x3d8a117f,
-    0x3dd3e4ff, 0x3e1db87f, 0x3e678bff, 0x3eb167ff, 0x3efb3b7f, 0x3f45177f,
-    0x3f8efbbf, 0x3fd8d77f, 0x4022b37f, 0x406c8f7f, 0x40b66b7f, 0x4100477f,
-    0x414a1aff, 0x4193f6ff, 0x41ddc1ff, 0x4227957f, 0x4271607f, 0x42bb237f,
-    0x4304e5ff, 0x434ea07f, 0x4398527f, 0x43e1fbff, 0x442ba57f, 0x44753e7f,
-    0x44beceff, 0x45085f7f, 0x4551deff, 0x459b55ff, 0x45e4c4ff, 0x462e22ff,
-    0x4677817f, 0x46c0c5ff, 0x470a027f, 0x475336ff, 0x479c59ff, 0x47e56cff,
-    0x482e6e7f, 0x487767ff, 0x48c0487f, 0x49091fff, 0x4951e77f, 0x499a9d7f,
-    0x49e33aff, 0x4a2bc6ff, 0x4a744aff, 0x4abcad7f, 0x4b05077f, 0x4b4d487f,
-    0x4b956fff, 0x4bdd86ff, 0x4c2584ff, 0x4c6d71ff, 0x4cb545ff, 0x4cfd007f,
-    0x4d44a1ff, 0x4d8c327f, 0x4dd3a1ff, 0x4e1af7ff, 0x4e62347f, 0x4ea9587f,
-    0x4ef062ff, 0x4f3753ff, 0x4f7e23ff, 0x4fc4da7f, 0x500b77ff, 0x5051f3ff,
-    0x50984dff, 0x50de8f7f, 0x5124aeff, 0x516ab57f, 0x51b09a7f, 0x51f6557f,
-    0x523bff7f, 0x52817fff, 0x52c6de7f, 0x530c1b7f, 0x535136ff, 0x539630ff,
-    0x53db017f, 0x541fafff, 0x546444ff, 0x54a8a7ff, 0x54ece97f, 0x5531097f,
-    0x5574ff7f, 0x55b8d3ff, 0x55fc7e7f, 0x5640077f, 0x56835dff, 0x56c692ff,
-    0x57099dff, 0x574c877f, 0x578f3eff, 0x57d1cbff, 0x58142f7f, 0x585670ff,
-    0x5898807f, 0x58da65ff, 0x591c18ff, 0x595daaff, 0x599f09ff, 0x59e03f7f,
-    0x5a21427f, 0x5a621b7f, 0x5aa2ca7f, 0x5ae3477f, 0x5b2391ff, 0x5b63b27f,
-    0x5ba3a07f, 0x5be3647f, 0x5c22ee7f, 0x5c624dff, 0x5ca17aff, 0x5ce075ff,
-    0x5d1f46ff, 0x5d5ddcff, 0x5d9c40ff, 0x5dda727f, 0x5e187a7f, 0x5e5646ff,
-    0x5e93e1ff, 0x5ed1417f, 0x5f0e777f, 0x5f4b72ff, 0x5f883b7f, 0x5fc4d1ff,
-    0x60012dff, 0x603d577f, 0x607945ff, 0x60b5027f, 0x60f0847f, 0x612bd3ff,
-    0x6166e87f, 0x61a1caff, 0x61dc727f, 0x6216deff, 0x6251117f, 0x628b117f,
-    0x62c4d67f, 0x62fe68ff, 0x6337b8ff, 0x6370cdff, 0x63a9b07f, 0x63e2587f,
-    0x641abcff, 0x6452ef7f, 0x648ae77f, 0x64c29bff, 0x64fa1dff, 0x65315d7f,
-    0x65686a7f, 0x659f33ff, 0x65d5c2ff, 0x660c177f, 0x664230ff, 0x6678077f,
-    0x66ada2ff, 0x66e3047f, 0x67182a7f, 0x674d0dff, 0x6781b67f, 0x67b61b7f,
-    0x67ea4e7f, 0x681e367f, 0x6851eb7f, 0x68855d7f, 0x68b88c7f, 0x68eb80ff,
-    0x691e31ff, 0x6950a87f, 0x6982dbff, 0x69b4d47f, 0x69e6927f, 0x6a1804ff,
-    0x6a493c7f, 0x6a7a397f, 0x6aaaf37f, 0x6adb69ff, 0x6b0ba5ff, 0x6b3b9eff,
-    0x6b6b54ff, 0x6b9ac77f, 0x6bc9ff7f, 0x6bf8f47f, 0x6c27ae7f, 0x6c56257f,
-    0x6c84597f, 0x6cb24a7f, 0x6ce0007f, 0x6d0d6aff, 0x6d3a9aff, 0x6d678fff,
-    0x6d9439ff, 0x6dc0a8ff, 0x6decd47f, 0x6e18bd7f, 0x6e446b7f, 0x6e6fcdff,
-    0x6e9af57f, 0x6ec5da7f, 0x6ef07bff, 0x6f1ae2ff, 0x6f44fdff, 0x6f6edeff,
-    0x6f987c7f, 0x6fc1d6ff, 0x6feaf67f, 0x7013d2ff, 0x703c63ff, 0x7064ba7f,
-    0x708cd5ff, 0x70b4a67f, 0x70dc3bff, 0x71038dff, 0x712a9d7f, 0x7151697f,
-    0x7177faff, 0x719e40ff, 0x71c44bff, 0x71ea1c7f, 0x720fa17f, 0x7234eb7f,
-    0x7259f27f, 0x727eb67f, 0x72a33fff, 0x72c785ff, 0x72eb897f, 0x730f517f,
-    0x7332d6ff, 0x735618ff, 0x737917ff, 0x739bdc7f, 0x73be65ff, 0x73e0a3ff,
-    0x7402a77f, 0x74246fff, 0x7445f57f, 0x746737ff, 0x74883fff, 0x74a9047f,
-    0x74c98e7f, 0x74e9d4ff, 0x7509e0ff, 0x7529a9ff, 0x7549387f, 0x75688bff,
-    0x75879c7f, 0x75a6697f, 0x75c4fbff, 0x75e353ff, 0x760170ff, 0x761f4aff,
-    0x763cea7f, 0x765a467f, 0x767767ff, 0x76944eff, 0x76b0faff, 0x76cd6bff,
-    0x76e99a7f, 0x7705967f, 0x77214eff, 0x773cccff, 0x7758107f, 0x7773107f,
-    0x778dde7f, 0x77a8717f, 0x77c2c9ff, 0x77dce7ff, 0x77f6c27f, 0x78106a7f,
-    0x7829d87f, 0x78430aff, 0x785c0b7f, 0x7874c8ff, 0x788d53ff, 0x78a5a47f,
-    0x78bdb9ff, 0x78d594ff, 0x78ed3d7f, 0x7904ab7f, 0x791be6ff, 0x7932df7f,
-    0x7949adff, 0x796038ff, 0x79769a7f, 0x798cb8ff, 0x79a2acff, 0x79b85e7f,
-    0x79cde5ff, 0x79e3327f, 0x79f84c7f, 0x7a0d2bff, 0x7a21d97f, 0x7a36547f,
-    0x7a4a947f, 0x7a5eaa7f, 0x7a7285ff, 0x7a862f7f, 0x7a99ae7f, 0x7aacf2ff,
-    0x7ac004ff, 0x7ad2e4ff, 0x7ae5927f, 0x7af80dff, 0x7b0a567f, 0x7b1c6cff,
-    0x7b2e597f, 0x7b400b7f, 0x7b51937f, 0x7b62f17f, 0x7b74147f, 0x7b850dff,
-    0x7b95d4ff, 0x7ba671ff, 0x7bb6dc7f, 0x7bc71d7f, 0x7bd72bff, 0x7be707ff,
-    0x7bf6b9ff, 0x7c0641ff, 0x7c15a07f, 0x7c24cc7f, 0x7c33ce7f, 0x7c429dff,
-    0x7c514bff, 0x7c5fc7ff, 0x7c6e197f, 0x7c7c417f, 0x7c8a3f7f, 0x7c980aff,
-    0x7ca5b4ff, 0x7cb3357f, 0x7cc08b7f, 0x7ccdb77f, 0x7cdab9ff, 0x7ce79a7f,
-    0x7cf448ff, 0x7d00d5ff, 0x7d0d38ff, 0x7d1979ff, 0x7d25917f, 0x7d317eff,
-    0x7d3d427f, 0x7d48e47f, 0x7d5464ff, 0x7d5fbb7f, 0x7d6aefff, 0x7d75faff,
-    0x7d80e47f, 0x7d8bac7f, 0x7d964a7f, 0x7da0c67f, 0x7dab217f, 0x7db55aff,
-    0x7dbf69ff, 0x7dc95fff, 0x7dd32c7f, 0x7ddcdf7f, 0x7de6687f, 0x7defcfff,
-    0x7df91e7f, 0x7e0242ff, 0x7e0b4dff, 0x7e1437ff, 0x7e1cffff, 0x7e25aeff,
-    0x7e2e33ff, 0x7e369fff, 0x7e3ef27f, 0x7e471b7f, 0x7e4f2aff, 0x7e57217f,
-    0x7e5ef5ff, 0x7e66b1ff, 0x7e6e4bff, 0x7e75ccff, 0x7e7d2c7f, 0x7e8472ff,
-    0x7e8b9fff, 0x7e92ab7f, 0x7e99a5ff, 0x7ea07f7f, 0x7ea73f7f, 0x7eadddff,
-    0x7eb46b7f, 0x7ebadfff, 0x7ec132ff, 0x7ec7757f, 0x7ecd95ff, 0x7ed3a5ff,
-    0x7ed99c7f, 0x7edf7a7f, 0x7ee53e7f, 0x7eeae9ff, 0x7ef07bff, 0x7ef5fd7f,
-    0x7efb657f, 0x7f00b47f, 0x7f05f27f, 0x7f0b177f, 0x7f10237f, 0x7f151e7f,
-    0x7f1a007f, 0x7f1ed17f, 0x7f2391ff, 0x7f2838ff, 0x7f2cc6ff, 0x7f31447f,
-    0x7f35b07f, 0x7f3a0c7f, 0x7f3e4eff, 0x7f42807f, 0x7f46997f, 0x7f4aa97f,
-    0x7f4ea07f, 0x7f52867f, 0x7f565bff, 0x7f5a20ff, 0x7f5dd4ff, 0x7f6177ff,
-    0x7f650a7f, 0x7f688bff, 0x7f6bfc7f, 0x7f6f547f, 0x7f72abff, 0x7f75ea7f,
-    0x7f7917ff, 0x7f7c34ff, 0x7f7f497f, 0x7f824d7f, 0x7f85407f, 0x7f882aff,
-    0x7f8afc7f, 0x7f8dc57f, 0x7f9085ff, 0x7f9335ff, 0x7f95d4ff, 0x7f9862ff,
-    0x7f9ae8ff, 0x7f9d667f, 0x7f9fd37f, 0x7fa22f7f, 0x7fa482ff, 0x7fa6cdff,
-    0x7fa9087f, 0x7fab3a7f, 0x7fad5bff, 0x7faf74ff, 0x7fb1857f, 0x7fb384ff,
-    0x7fb5847f, 0x7fb76aff, 0x7fb951ff, 0x7fbb277f, 0x7fbcf4ff, 0x7fbeb9ff,
-    0x7fc0767f, 0x7fc22a7f, 0x7fc3cdff, 0x7fc5717f, 0x7fc703ff, 0x7fc88e7f,
-    0x7fca107f, 0x7fcb91ff, 0x7fcd037f, 0x7fce6bff, 0x7fcfcc7f, 0x7fd1247f,
-    0x7fd273ff, 0x7fd3c37f, 0x7fd501ff, 0x7fd6387f, 0x7fd76eff, 0x7fd89cff,
-    0x7fd9c27f, 0x7fdadf7f, 0x7fdbf47f, 0x7fdd00ff, 0x7fde0d7f, 0x7fdf117f,
-    0x7fe00cff, 0x7fe1007f, 0x7fe1f37f, 0x7fe2de7f, 0x7fe3c0ff, 0x7fe49aff,
-    0x7fe574ff, 0x7fe646ff, 0x7fe7187f, 0x7fe7e1ff, 0x7fe8a2ff, 0x7fe963ff,
-    0x7fea1c7f, 0x7feacc7f, 0x7feb7c7f, 0x7fec247f, 0x7feccc7f, 0x7fed73ff,
-    0x7fee0aff, 0x7feea1ff, 0x7fef38ff, 0x7fefc77f, 0x7ff055ff, 0x7ff0dc7f,
-    0x7ff1627f, 0x7ff1e8ff, 0x7ff2667f, 0x7ff2dbff, 0x7ff3517f, 0x7ff3c6ff,
-    0x7ff433ff, 0x7ff4a0ff, 0x7ff50dff, 0x7ff572ff, 0x7ff5ceff, 0x7ff633ff,
-    0x7ff68fff, 0x7ff6ec7f, 0x7ff73fff, 0x7ff793ff, 0x7ff7e7ff, 0x7ff8337f,
-    0x7ff8877f, 0x7ff8ca7f, 0x7ff915ff, 0x7ff958ff, 0x7ff99bff, 0x7ff9df7f,
-    0x7ffa227f, 0x7ffa5cff, 0x7ffa97ff, 0x7ffad27f, 0x7ffb04ff, 0x7ffb3f7f,
-    0x7ffb71ff, 0x7ffba47f, 0x7ffbce7f, 0x7ffc007f, 0x7ffc2a7f, 0x7ffc547f,
-    0x7ffc7e7f, 0x7ffca87f, 0x7ffcc9ff, 0x7ffcf3ff, 0x7ffd157f, 0x7ffd36ff,
-    0x7ffd587f, 0x7ffd79ff, 0x7ffd9b7f, 0x7ffdb4ff, 0x7ffdcdff, 0x7ffdef7f,
-    0x7ffe087f, 0x7ffe21ff, 0x7ffe3aff, 0x7ffe4bff, 0x7ffe64ff, 0x7ffe7dff,
-    0x7ffe8eff, 0x7ffe9f7f, 0x7ffeb07f, 0x7ffec97f, 0x7ffeda7f, 0x7ffeeaff,
-    0x7ffef37f, 0x7fff047f, 0x7fff14ff, 0x7fff25ff, 0x7fff2e7f, 0x7fff3eff,
-    0x7fff477f, 0x7fff4fff, 0x7fff607f, 0x7fff68ff, 0x7fff717f, 0x7fff79ff,
-    0x7fff81ff, 0x7fff8a7f, 0x7fff92ff, 0x7fff9b7f, 0x7fffa37f, 0x7fffabff,
-    0x7fffabff, 0x7fffb47f, 0x7fffbcff, 0x7fffbcff, 0x7fffc57f, 0x7fffc57f,
-    0x7fffcd7f, 0x7fffcd7f, 0x7fffd5ff, 0x7fffd5ff, 0x7fffde7f, 0x7fffde7f,
-    0x7fffde7f, 0x7fffe6ff, 0x7fffe6ff, 0x7fffe6ff, 0x7fffeeff, 0x7fffeeff,
-    0x7fffeeff, 0x7fffeeff, 0x7ffff77f, 0x7ffff77f, 0x7ffff77f, 0x7ffff77f,
-    0x7ffff77f, 0x7ffff77f, 0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff,
-    0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
+  0x000999dc, 0x000e1719, 0x0011ec91, 0x00157689, 0x0018def4, 0x001c3697,
+  0x001f85d7, 0x0022d516, 0x00262cba, 0x00298cc1, 0x002cf52b, 0x00306e5c,
+  0x0033f854, 0x00379314, 0x003b3636, 0x003ef283, 0x0042bf97, 0x0046a5d6,
+  0x004a9478, 0x004ea4a8, 0x0052c59f, 0x0056f75d, 0x005b4245, 0x005fa658,
+  0x00642395, 0x0068b19a, 0x006d58c8, 0x00722185, 0x0076fb08, 0x007bedb6,
+  0x0080f98f, 0x00861e92, 0x008b5cbf, 0x0090bc7a, 0x00963560, 0x009bc770,
+  0x00a172ab, 0x00a73710, 0x00ad1d03, 0x00b31c21, 0x00b93ccc, 0x00bf76a2,
+  0x00c5c9a2, 0x00cc4694, 0x00d2d44d, 0x00d98393, 0x00e05468, 0x00e746cb,
+  0x00ee5258, 0x00f57f72, 0x00fcce1b, 0x01043e53, 0x010bc7b3, 0x01137b07,
+  0x011b4783, 0x0123358f, 0x012b4527, 0x01337eb1, 0x013bd167, 0x014445a9,
+  0x014ce3dd, 0x0155a39f, 0x015e84ef, 0x016787cd, 0x0170b49d, 0x0179fa97,
+  0x018372e5, 0x018d045f, 0x0196bfc9, 0x01a09cc3, 0x01aaa3ad, 0x01b4d487,
+  0x01bf26f1, 0x01c99ae9, 0x01d44135, 0x01df090f, 0x01e9f277, 0x01f50e33,
+  0x02004b7f, 0x020bb2bb, 0x02173b83, 0x0222f6a3, 0x022ed353, 0x023ae253,
+  0x024712e3, 0x025375c7, 0x025ffa3b, 0x026cb103, 0x02798957, 0x02869403,
+  0x0293c89f, 0x02a12f8f, 0x02aeb80f, 0x02bc72e3, 0x02ca57a7, 0x02d8665f,
+  0x02e6a767, 0x02f51267, 0x0303afb7, 0x031276fb, 0x0321682f, 0x0330941b,
+  0x033fe197, 0x034f69cb, 0x035f1bef, 0x036ef803, 0x037f0ed3, 0x038f4f93,
+  0x039fc2a7, 0x03b05faf, 0x03c1376b, 0x03d2391b, 0x03e36d23, 0x03f4dbdf,
+  0x0406748f, 0x04183f8f, 0x042a3ce7, 0x043c6c97, 0x044ece97, 0x04616b57,
+  0x047431ff, 0x04873367, 0x049a671f, 0x04adcd2f, 0x04c1658f, 0x04d538af,
+  0x04e935b7, 0x04fd75df, 0x0511dfff, 0x052684cf, 0x053b6457, 0x05506dd7,
+  0x0565ba6f, 0x057b395f, 0x0590ea9f, 0x05a6d697, 0x05bcf4e7, 0x05d34def,
+  0x05e9e1af, 0x0600b027, 0x0617b0f7, 0x062ee417, 0x06465a57, 0x065e02e7,
+  0x0675e637, 0x068e0437, 0x06a65cf7, 0x06bef067, 0x06d7b637, 0x06f0b6b7,
+  0x0709fa57, 0x07237047, 0x073d20ef, 0x07570c57, 0x07713ad7, 0x078b9ba7,
+  0x07a63737, 0x07c10d77, 0x07dc26df, 0x07f77af7, 0x0813015f, 0x082ecaef,
+  0x084acf2f, 0x0867168f, 0x0883903f, 0x08a04d0f, 0x08bd449f, 0x08da76df,
+  0x08f7ec2f, 0x09159c4f, 0x0933870f, 0x0951b4ff, 0x0970153f, 0x098ec0ff,
+  0x09ad9f0f, 0x09ccc02f, 0x09ec247f, 0x0a0bc37f, 0x0a2b9d3f, 0x0a4bba0f,
+  0x0a6c19ff, 0x0a8cac4f, 0x0aad8a0f, 0x0acea28f, 0x0aeff5bf, 0x0b118c1f,
+  0x0b335d1f, 0x0b55714f, 0x0b77c88f, 0x0b9a5a8f, 0x0bbd2f9f, 0x0be03f6f,
+  0x0c03925f, 0x0c27285f, 0x0c4af91f, 0x0c6f0cff, 0x0c9363ef, 0x0cb7f59f,
+  0x0cdcca6f, 0x0d01e25f, 0x0d2734ff, 0x0d4ccaaf, 0x0d729b2f, 0x0d98b71f,
+  0x0dbf0dbf, 0x0de59f2f, 0x0e0c7c0f, 0x0e3393af, 0x0e5aee5f, 0x0e8283cf,
+  0x0eaa64bf, 0x0ed2806f, 0x0efad6cf, 0x0f2378af, 0x0f4c553f, 0x0f7574ef,
+  0x0f9ecf5f, 0x0fc8754f, 0x0ff255ef, 0x101c79bf, 0x1046d81f, 0x107179bf,
+  0x109c5e5f, 0x10c7863f, 0x10f2e8bf, 0x111e8e5f, 0x114a771f, 0x1176a2ff,
+  0x11a3097f, 0x11cfb33f, 0x11fc979f, 0x1229c77f, 0x125729bf, 0x1284d75f,
+  0x12b2bfdf, 0x12e0eb5f, 0x130f5a1f, 0x133e037f, 0x136ce77f, 0x139c171f,
+  0x13cb817f, 0x13fb267f, 0x142b0e9f, 0x145b39df, 0x148b9fdf, 0x14bc48ff,
+  0x14ed2cbf, 0x151e539f, 0x154fbd9f, 0x158159ff, 0x15b341df, 0x15e55bff,
+  0x1617c1bf, 0x164a59bf, 0x167d34df, 0x16b0531f, 0x16e3a39f, 0x17173fbf,
+  0x174b0e1f, 0x177f1f9f, 0x17b36bdf, 0x17e7f2bf, 0x181cbcbf, 0x1851c19f,
+  0x1887011f, 0x18bc7b3f, 0x18f2389f, 0x1928309f, 0x195e5aff, 0x1994c87f,
+  0x19cb709f, 0x1a02539f, 0x1a39713f, 0x1a70d1ff, 0x1aa864ff, 0x1ae032df,
+  0x1b183b5f, 0x1b507e9f, 0x1b88fc9f, 0x1bc1acdf, 0x1bfaa03f, 0x1c33c5ff,
+  0x1c6d267f, 0x1ca6c19f, 0x1ce0977f, 0x1d1a9fbf, 0x1d54e2bf, 0x1d8f57ff,
+  0x1dca105f, 0x1e04f29f, 0x1e40181f, 0x1e7b677f, 0x1eb6f9ff, 0x1ef2b65f,
+  0x1f2ead9f, 0x1f6adf7f, 0x1fa73b3f, 0x1fe3d1bf, 0x2020a2ff, 0x205d9e3f,
+  0x209ad43f, 0x20d83c7f, 0x2115d6ff, 0x2153a3ff, 0x2191a33f, 0x21cfd4bf,
+  0x220e38bf, 0x224cceff, 0x228b977f, 0x22ca923f, 0x2309bf7f, 0x234916bf,
+  0x2388a03f, 0x23c85c3f, 0x240841ff, 0x244859ff, 0x2488a47f, 0x24c918ff,
+  0x2509bf7f, 0x254a903f, 0x258b8aff, 0x25ccb7bf, 0x260e0ebf, 0x264f8f7f,
+  0x269142bf, 0x26d31fbf, 0x27151e7f, 0x27574f7f, 0x2799aa7f, 0x27dc2f3f,
+  0x281eddff, 0x2861b6bf, 0x28a4b13f, 0x28e7ddbf, 0x292b2bff, 0x296ea43f,
+  0x29b23dbf, 0x29f6017f, 0x2a39eeff, 0x2a7dfe3f, 0x2ac2373f, 0x2b0691ff,
+  0x2b4b0dff, 0x2b8fb43f, 0x2bd4737f, 0x2c195cbf, 0x2c5e6fff, 0x2ca39c3f,
+  0x2ce8ea3f, 0x2d2e61ff, 0x2d73f2ff, 0x2db9a5bf, 0x2dff79bf, 0x2e4566ff,
+  0x2e8b7e3f, 0x2ed1aebf, 0x2f1800bf, 0x2f5e6bbf, 0x2fa4efff, 0x2feb9e3f,
+  0x30325d3f, 0x30793dbf, 0x30c0377f, 0x31074a7f, 0x314e7eff, 0x3195cc7f,
+  0x31dd2aff, 0x3224aabf, 0x326c3b7f, 0x32b3edbf, 0x32fbb0ff, 0x33438cff,
+  0x338b827f, 0x33d388bf, 0x341ba7ff, 0x3463d7ff, 0x34ac213f, 0x34f483bf,
+  0x353cee7f, 0x3585727f, 0x35ce073f, 0x3616b53f, 0x365f6bbf, 0x36a832bf,
+  0x36f112ff, 0x3739fbbf, 0x3782f4ff, 0x37cbff3f, 0x38151a3f, 0x385e3dbf,
+  0x38a77a3f, 0x38f0b6bf, 0x393a03ff, 0x398361ff, 0x39ccc87f, 0x3a16377f,
+  0x3a5faebf, 0x3aa936bf, 0x3af2bebf, 0x3b3c577f, 0x3b85f8bf, 0x3bcfa27f,
+  0x3c194bff, 0x3c63063f, 0x3cacc0bf, 0x3cf6837f, 0x3d40463f, 0x3d8a117f,
+  0x3dd3e4ff, 0x3e1db87f, 0x3e678bff, 0x3eb167ff, 0x3efb3b7f, 0x3f45177f,
+  0x3f8efbbf, 0x3fd8d77f, 0x4022b37f, 0x406c8f7f, 0x40b66b7f, 0x4100477f,
+  0x414a1aff, 0x4193f6ff, 0x41ddc1ff, 0x4227957f, 0x4271607f, 0x42bb237f,
+  0x4304e5ff, 0x434ea07f, 0x4398527f, 0x43e1fbff, 0x442ba57f, 0x44753e7f,
+  0x44beceff, 0x45085f7f, 0x4551deff, 0x459b55ff, 0x45e4c4ff, 0x462e22ff,
+  0x4677817f, 0x46c0c5ff, 0x470a027f, 0x475336ff, 0x479c59ff, 0x47e56cff,
+  0x482e6e7f, 0x487767ff, 0x48c0487f, 0x49091fff, 0x4951e77f, 0x499a9d7f,
+  0x49e33aff, 0x4a2bc6ff, 0x4a744aff, 0x4abcad7f, 0x4b05077f, 0x4b4d487f,
+  0x4b956fff, 0x4bdd86ff, 0x4c2584ff, 0x4c6d71ff, 0x4cb545ff, 0x4cfd007f,
+  0x4d44a1ff, 0x4d8c327f, 0x4dd3a1ff, 0x4e1af7ff, 0x4e62347f, 0x4ea9587f,
+  0x4ef062ff, 0x4f3753ff, 0x4f7e23ff, 0x4fc4da7f, 0x500b77ff, 0x5051f3ff,
+  0x50984dff, 0x50de8f7f, 0x5124aeff, 0x516ab57f, 0x51b09a7f, 0x51f6557f,
+  0x523bff7f, 0x52817fff, 0x52c6de7f, 0x530c1b7f, 0x535136ff, 0x539630ff,
+  0x53db017f, 0x541fafff, 0x546444ff, 0x54a8a7ff, 0x54ece97f, 0x5531097f,
+  0x5574ff7f, 0x55b8d3ff, 0x55fc7e7f, 0x5640077f, 0x56835dff, 0x56c692ff,
+  0x57099dff, 0x574c877f, 0x578f3eff, 0x57d1cbff, 0x58142f7f, 0x585670ff,
+  0x5898807f, 0x58da65ff, 0x591c18ff, 0x595daaff, 0x599f09ff, 0x59e03f7f,
+  0x5a21427f, 0x5a621b7f, 0x5aa2ca7f, 0x5ae3477f, 0x5b2391ff, 0x5b63b27f,
+  0x5ba3a07f, 0x5be3647f, 0x5c22ee7f, 0x5c624dff, 0x5ca17aff, 0x5ce075ff,
+  0x5d1f46ff, 0x5d5ddcff, 0x5d9c40ff, 0x5dda727f, 0x5e187a7f, 0x5e5646ff,
+  0x5e93e1ff, 0x5ed1417f, 0x5f0e777f, 0x5f4b72ff, 0x5f883b7f, 0x5fc4d1ff,
+  0x60012dff, 0x603d577f, 0x607945ff, 0x60b5027f, 0x60f0847f, 0x612bd3ff,
+  0x6166e87f, 0x61a1caff, 0x61dc727f, 0x6216deff, 0x6251117f, 0x628b117f,
+  0x62c4d67f, 0x62fe68ff, 0x6337b8ff, 0x6370cdff, 0x63a9b07f, 0x63e2587f,
+  0x641abcff, 0x6452ef7f, 0x648ae77f, 0x64c29bff, 0x64fa1dff, 0x65315d7f,
+  0x65686a7f, 0x659f33ff, 0x65d5c2ff, 0x660c177f, 0x664230ff, 0x6678077f,
+  0x66ada2ff, 0x66e3047f, 0x67182a7f, 0x674d0dff, 0x6781b67f, 0x67b61b7f,
+  0x67ea4e7f, 0x681e367f, 0x6851eb7f, 0x68855d7f, 0x68b88c7f, 0x68eb80ff,
+  0x691e31ff, 0x6950a87f, 0x6982dbff, 0x69b4d47f, 0x69e6927f, 0x6a1804ff,
+  0x6a493c7f, 0x6a7a397f, 0x6aaaf37f, 0x6adb69ff, 0x6b0ba5ff, 0x6b3b9eff,
+  0x6b6b54ff, 0x6b9ac77f, 0x6bc9ff7f, 0x6bf8f47f, 0x6c27ae7f, 0x6c56257f,
+  0x6c84597f, 0x6cb24a7f, 0x6ce0007f, 0x6d0d6aff, 0x6d3a9aff, 0x6d678fff,
+  0x6d9439ff, 0x6dc0a8ff, 0x6decd47f, 0x6e18bd7f, 0x6e446b7f, 0x6e6fcdff,
+  0x6e9af57f, 0x6ec5da7f, 0x6ef07bff, 0x6f1ae2ff, 0x6f44fdff, 0x6f6edeff,
+  0x6f987c7f, 0x6fc1d6ff, 0x6feaf67f, 0x7013d2ff, 0x703c63ff, 0x7064ba7f,
+  0x708cd5ff, 0x70b4a67f, 0x70dc3bff, 0x71038dff, 0x712a9d7f, 0x7151697f,
+  0x7177faff, 0x719e40ff, 0x71c44bff, 0x71ea1c7f, 0x720fa17f, 0x7234eb7f,
+  0x7259f27f, 0x727eb67f, 0x72a33fff, 0x72c785ff, 0x72eb897f, 0x730f517f,
+  0x7332d6ff, 0x735618ff, 0x737917ff, 0x739bdc7f, 0x73be65ff, 0x73e0a3ff,
+  0x7402a77f, 0x74246fff, 0x7445f57f, 0x746737ff, 0x74883fff, 0x74a9047f,
+  0x74c98e7f, 0x74e9d4ff, 0x7509e0ff, 0x7529a9ff, 0x7549387f, 0x75688bff,
+  0x75879c7f, 0x75a6697f, 0x75c4fbff, 0x75e353ff, 0x760170ff, 0x761f4aff,
+  0x763cea7f, 0x765a467f, 0x767767ff, 0x76944eff, 0x76b0faff, 0x76cd6bff,
+  0x76e99a7f, 0x7705967f, 0x77214eff, 0x773cccff, 0x7758107f, 0x7773107f,
+  0x778dde7f, 0x77a8717f, 0x77c2c9ff, 0x77dce7ff, 0x77f6c27f, 0x78106a7f,
+  0x7829d87f, 0x78430aff, 0x785c0b7f, 0x7874c8ff, 0x788d53ff, 0x78a5a47f,
+  0x78bdb9ff, 0x78d594ff, 0x78ed3d7f, 0x7904ab7f, 0x791be6ff, 0x7932df7f,
+  0x7949adff, 0x796038ff, 0x79769a7f, 0x798cb8ff, 0x79a2acff, 0x79b85e7f,
+  0x79cde5ff, 0x79e3327f, 0x79f84c7f, 0x7a0d2bff, 0x7a21d97f, 0x7a36547f,
+  0x7a4a947f, 0x7a5eaa7f, 0x7a7285ff, 0x7a862f7f, 0x7a99ae7f, 0x7aacf2ff,
+  0x7ac004ff, 0x7ad2e4ff, 0x7ae5927f, 0x7af80dff, 0x7b0a567f, 0x7b1c6cff,
+  0x7b2e597f, 0x7b400b7f, 0x7b51937f, 0x7b62f17f, 0x7b74147f, 0x7b850dff,
+  0x7b95d4ff, 0x7ba671ff, 0x7bb6dc7f, 0x7bc71d7f, 0x7bd72bff, 0x7be707ff,
+  0x7bf6b9ff, 0x7c0641ff, 0x7c15a07f, 0x7c24cc7f, 0x7c33ce7f, 0x7c429dff,
+  0x7c514bff, 0x7c5fc7ff, 0x7c6e197f, 0x7c7c417f, 0x7c8a3f7f, 0x7c980aff,
+  0x7ca5b4ff, 0x7cb3357f, 0x7cc08b7f, 0x7ccdb77f, 0x7cdab9ff, 0x7ce79a7f,
+  0x7cf448ff, 0x7d00d5ff, 0x7d0d38ff, 0x7d1979ff, 0x7d25917f, 0x7d317eff,
+  0x7d3d427f, 0x7d48e47f, 0x7d5464ff, 0x7d5fbb7f, 0x7d6aefff, 0x7d75faff,
+  0x7d80e47f, 0x7d8bac7f, 0x7d964a7f, 0x7da0c67f, 0x7dab217f, 0x7db55aff,
+  0x7dbf69ff, 0x7dc95fff, 0x7dd32c7f, 0x7ddcdf7f, 0x7de6687f, 0x7defcfff,
+  0x7df91e7f, 0x7e0242ff, 0x7e0b4dff, 0x7e1437ff, 0x7e1cffff, 0x7e25aeff,
+  0x7e2e33ff, 0x7e369fff, 0x7e3ef27f, 0x7e471b7f, 0x7e4f2aff, 0x7e57217f,
+  0x7e5ef5ff, 0x7e66b1ff, 0x7e6e4bff, 0x7e75ccff, 0x7e7d2c7f, 0x7e8472ff,
+  0x7e8b9fff, 0x7e92ab7f, 0x7e99a5ff, 0x7ea07f7f, 0x7ea73f7f, 0x7eadddff,
+  0x7eb46b7f, 0x7ebadfff, 0x7ec132ff, 0x7ec7757f, 0x7ecd95ff, 0x7ed3a5ff,
+  0x7ed99c7f, 0x7edf7a7f, 0x7ee53e7f, 0x7eeae9ff, 0x7ef07bff, 0x7ef5fd7f,
+  0x7efb657f, 0x7f00b47f, 0x7f05f27f, 0x7f0b177f, 0x7f10237f, 0x7f151e7f,
+  0x7f1a007f, 0x7f1ed17f, 0x7f2391ff, 0x7f2838ff, 0x7f2cc6ff, 0x7f31447f,
+  0x7f35b07f, 0x7f3a0c7f, 0x7f3e4eff, 0x7f42807f, 0x7f46997f, 0x7f4aa97f,
+  0x7f4ea07f, 0x7f52867f, 0x7f565bff, 0x7f5a20ff, 0x7f5dd4ff, 0x7f6177ff,
+  0x7f650a7f, 0x7f688bff, 0x7f6bfc7f, 0x7f6f547f, 0x7f72abff, 0x7f75ea7f,
+  0x7f7917ff, 0x7f7c34ff, 0x7f7f497f, 0x7f824d7f, 0x7f85407f, 0x7f882aff,
+  0x7f8afc7f, 0x7f8dc57f, 0x7f9085ff, 0x7f9335ff, 0x7f95d4ff, 0x7f9862ff,
+  0x7f9ae8ff, 0x7f9d667f, 0x7f9fd37f, 0x7fa22f7f, 0x7fa482ff, 0x7fa6cdff,
+  0x7fa9087f, 0x7fab3a7f, 0x7fad5bff, 0x7faf74ff, 0x7fb1857f, 0x7fb384ff,
+  0x7fb5847f, 0x7fb76aff, 0x7fb951ff, 0x7fbb277f, 0x7fbcf4ff, 0x7fbeb9ff,
+  0x7fc0767f, 0x7fc22a7f, 0x7fc3cdff, 0x7fc5717f, 0x7fc703ff, 0x7fc88e7f,
+  0x7fca107f, 0x7fcb91ff, 0x7fcd037f, 0x7fce6bff, 0x7fcfcc7f, 0x7fd1247f,
+  0x7fd273ff, 0x7fd3c37f, 0x7fd501ff, 0x7fd6387f, 0x7fd76eff, 0x7fd89cff,
+  0x7fd9c27f, 0x7fdadf7f, 0x7fdbf47f, 0x7fdd00ff, 0x7fde0d7f, 0x7fdf117f,
+  0x7fe00cff, 0x7fe1007f, 0x7fe1f37f, 0x7fe2de7f, 0x7fe3c0ff, 0x7fe49aff,
+  0x7fe574ff, 0x7fe646ff, 0x7fe7187f, 0x7fe7e1ff, 0x7fe8a2ff, 0x7fe963ff,
+  0x7fea1c7f, 0x7feacc7f, 0x7feb7c7f, 0x7fec247f, 0x7feccc7f, 0x7fed73ff,
+  0x7fee0aff, 0x7feea1ff, 0x7fef38ff, 0x7fefc77f, 0x7ff055ff, 0x7ff0dc7f,
+  0x7ff1627f, 0x7ff1e8ff, 0x7ff2667f, 0x7ff2dbff, 0x7ff3517f, 0x7ff3c6ff,
+  0x7ff433ff, 0x7ff4a0ff, 0x7ff50dff, 0x7ff572ff, 0x7ff5ceff, 0x7ff633ff,
+  0x7ff68fff, 0x7ff6ec7f, 0x7ff73fff, 0x7ff793ff, 0x7ff7e7ff, 0x7ff8337f,
+  0x7ff8877f, 0x7ff8ca7f, 0x7ff915ff, 0x7ff958ff, 0x7ff99bff, 0x7ff9df7f,
+  0x7ffa227f, 0x7ffa5cff, 0x7ffa97ff, 0x7ffad27f, 0x7ffb04ff, 0x7ffb3f7f,
+  0x7ffb71ff, 0x7ffba47f, 0x7ffbce7f, 0x7ffc007f, 0x7ffc2a7f, 0x7ffc547f,
+  0x7ffc7e7f, 0x7ffca87f, 0x7ffcc9ff, 0x7ffcf3ff, 0x7ffd157f, 0x7ffd36ff,
+  0x7ffd587f, 0x7ffd79ff, 0x7ffd9b7f, 0x7ffdb4ff, 0x7ffdcdff, 0x7ffdef7f,
+  0x7ffe087f, 0x7ffe21ff, 0x7ffe3aff, 0x7ffe4bff, 0x7ffe64ff, 0x7ffe7dff,
+  0x7ffe8eff, 0x7ffe9f7f, 0x7ffeb07f, 0x7ffec97f, 0x7ffeda7f, 0x7ffeeaff,
+  0x7ffef37f, 0x7fff047f, 0x7fff14ff, 0x7fff25ff, 0x7fff2e7f, 0x7fff3eff,
+  0x7fff477f, 0x7fff4fff, 0x7fff607f, 0x7fff68ff, 0x7fff717f, 0x7fff79ff,
+  0x7fff81ff, 0x7fff8a7f, 0x7fff92ff, 0x7fff9b7f, 0x7fffa37f, 0x7fffabff,
+  0x7fffabff, 0x7fffb47f, 0x7fffbcff, 0x7fffbcff, 0x7fffc57f, 0x7fffc57f,
+  0x7fffcd7f, 0x7fffcd7f, 0x7fffd5ff, 0x7fffd5ff, 0x7fffde7f, 0x7fffde7f,
+  0x7fffde7f, 0x7fffe6ff, 0x7fffe6ff, 0x7fffe6ff, 0x7fffeeff, 0x7fffeeff,
+  0x7fffeeff, 0x7fffeeff, 0x7ffff77f, 0x7ffff77f, 0x7ffff77f, 0x7ffff77f,
+  0x7ffff77f, 0x7ffff77f, 0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff,
+  0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
 
 const WORD32 kbd_win256[256] = {
-    0x00132c5e, 0x001f986b, 0x002c6d72, 0x003a3c1b, 0x00493eaa, 0x00599862,
-    0x006b63fc, 0x007eb86c, 0x0093aacb, 0x00aa4f3b, 0x00c2b958, 0x00dcfc70,
-    0x00f92ba8, 0x01175a0a, 0x01379a8f, 0x015a0023, 0x017e9da6, 0x01a585e6,
-    0x01cecba4, 0x01fa8186, 0x0228ba1b, 0x025987d1, 0x028cfcee, 0x02c32b8e,
-    0x02fc259c, 0x0337fcc8, 0x0376c285, 0x03b88801, 0x03fd5e1a, 0x04455560,
-    0x04907e06, 0x04dee7e0, 0x0530a25b, 0x0585bc76, 0x05de44bb, 0x063a4939,
-    0x0699d77f, 0x06fcfc92, 0x0763c4ea, 0x07ce3c6a, 0x083c6e59, 0x08ae655f,
-    0x09242b7d, 0x099dca06, 0x0a1b499d, 0x0a9cb22d, 0x0b220ae4, 0x0bab5a2f,
-    0x0c38a5b4, 0x0cc9f24f, 0x0d5f440b, 0x0df89e21, 0x0e9602f2, 0x0f377404,
-    0x0fdcf1ff, 0x10867ca8, 0x113412e1, 0x11e5b2a4, 0x129b5901, 0x13550220,
-    0x1412a936, 0x14d44890, 0x1599d986, 0x16635483, 0x1730b0fe, 0x1801e581,
-    0x18d6e7a1, 0x19afac06, 0x1a8c2664, 0x1b6c4986, 0x1c500746, 0x1d375093,
-    0x1e221575, 0x1f10450b, 0x2001cd93, 0x20f69c66, 0x21ee9e04, 0x22e9be10,
-    0x23e7e75a, 0x24e903de, 0x25ecfcd0, 0x26f3ba97, 0x27fd24db, 0x29092288,
-    0x2a1799d1, 0x2b28703a, 0x2c3b8a9b, 0x2d50cd2b, 0x2e681b83, 0x2f8158a5,
-    0x309c6709, 0x31b9289c, 0x32d77ed0, 0x33f74a9e, 0x35186c95, 0x363ac4d8,
-    0x375e3333, 0x3882971a, 0x39a7cfb6, 0x3acdbbf0, 0x3bf43a75, 0x3d1b29c5,
-    0x3e426836, 0x3f69d405, 0x40914b59, 0x41b8ac51, 0x42dfd50a, 0x4406a3ac,
-    0x452cf672, 0x4652abb4, 0x4777a1f0, 0x489bb7d4, 0x49becc4a, 0x4ae0be7e,
-    0x4c016de7, 0x4d20ba56, 0x4e3e83f8, 0x4f5aab65, 0x507511a6, 0x518d983d,
-    0x52a42131, 0x53b88f14, 0x54cac50d, 0x55daa6dc, 0x56e818ea, 0x57f30047,
-    0x58fb42b9, 0x5a00c6c1, 0x5b03739e, 0x5c03315a, 0x5cffe8cc, 0x5df983a1,
-    0x5eefec5d, 0x5fe30e66, 0x60d2d607, 0x61bf3073, 0x62a80bcb, 0x638d5722,
-    0x646f0282, 0x654cfeec, 0x66273e5f, 0x66fdb3d5, 0x67d0534d, 0x689f11c6,
-    0x6969e543, 0x6a30c4cc, 0x6af3a870, 0x6bb28941, 0x6c6d6159, 0x6d242bd6,
-    0x6dd6e4da, 0x6e85898a, 0x6f30180d, 0x6fd68f86, 0x7078f015, 0x71173ad6,
-    0x71b171d8, 0x7247981c, 0x72d9b193, 0x7367c317, 0x73f1d266, 0x7477e620,
-    0x74fa05bd, 0x7578398b, 0x75f28aa7, 0x766902f5, 0x76dbad1c, 0x774a947c,
-    0x77b5c529, 0x781d4be4, 0x78813611, 0x78e191b2, 0x793e6d5d, 0x7997d834,
-    0x79ede1dc, 0x7a409a77, 0x7a90129a, 0x7adc5b43, 0x7b2585d1, 0x7b6ba3fd,
-    0x7baec7ce, 0x7bef0393, 0x7c2c69d7, 0x7c670d5c, 0x7c9f0110, 0x7cd45801,
-    0x7d07255b, 0x7d377c5b, 0x7d657049, 0x7d91146a, 0x7dba7c02, 0x7de1ba42,
-    0x7e06e247, 0x7e2a070f, 0x7e4b3b72, 0x7e6a921d, 0x7e881d8a, 0x7ea3effa,
-    0x7ebe1b6d, 0x7ed6b19e, 0x7eedc3fe, 0x7f0363ae, 0x7f17a177, 0x7f2a8dcd,
-    0x7f3c38c3, 0x7f4cb20c, 0x7f5c08f4, 0x7f6a4c62, 0x7f778ad0, 0x7f83d24c,
-    0x7f8f3073, 0x7f99b274, 0x7fa36509, 0x7fac547b, 0x7fb48c9e, 0x7fbc18d2,
-    0x7fc30404, 0x7fc958ad, 0x7fcf20d1, 0x7fd46604, 0x7fd93169, 0x7fdd8bb1,
-    0x7fe17d22, 0x7fe50d93, 0x7fe84475, 0x7feb28ce, 0x7fedc13f, 0x7ff01409,
-    0x7ff2270b, 0x7ff3ffc7, 0x7ff5a368, 0x7ff716bf, 0x7ff85e4b, 0x7ff97e3b,
-    0x7ffa7a71, 0x7ffb5686, 0x7ffc15cb, 0x7ffcbb50, 0x7ffd49e5, 0x7ffdc41f,
-    0x7ffe2c57, 0x7ffe84b3, 0x7ffecf28, 0x7fff0d78, 0x7fff413b, 0x7fff6be1,
-    0x7fff8eb1, 0x7fffaad1, 0x7fffc144, 0x7fffd2f2, 0x7fffe0a3, 0x7fffeb0a,
-    0x7ffff2bf, 0x7ffff849, 0x7ffffc18, 0x7ffffe8f};
+  0x00132c5e, 0x001f986b, 0x002c6d72, 0x003a3c1b, 0x00493eaa, 0x00599862,
+  0x006b63fc, 0x007eb86c, 0x0093aacb, 0x00aa4f3b, 0x00c2b958, 0x00dcfc70,
+  0x00f92ba8, 0x01175a0a, 0x01379a8f, 0x015a0023, 0x017e9da6, 0x01a585e6,
+  0x01cecba4, 0x01fa8186, 0x0228ba1b, 0x025987d1, 0x028cfcee, 0x02c32b8e,
+  0x02fc259c, 0x0337fcc8, 0x0376c285, 0x03b88801, 0x03fd5e1a, 0x04455560,
+  0x04907e06, 0x04dee7e0, 0x0530a25b, 0x0585bc76, 0x05de44bb, 0x063a4939,
+  0x0699d77f, 0x06fcfc92, 0x0763c4ea, 0x07ce3c6a, 0x083c6e59, 0x08ae655f,
+  0x09242b7d, 0x099dca06, 0x0a1b499d, 0x0a9cb22d, 0x0b220ae4, 0x0bab5a2f,
+  0x0c38a5b4, 0x0cc9f24f, 0x0d5f440b, 0x0df89e21, 0x0e9602f2, 0x0f377404,
+  0x0fdcf1ff, 0x10867ca8, 0x113412e1, 0x11e5b2a4, 0x129b5901, 0x13550220,
+  0x1412a936, 0x14d44890, 0x1599d986, 0x16635483, 0x1730b0fe, 0x1801e581,
+  0x18d6e7a1, 0x19afac06, 0x1a8c2664, 0x1b6c4986, 0x1c500746, 0x1d375093,
+  0x1e221575, 0x1f10450b, 0x2001cd93, 0x20f69c66, 0x21ee9e04, 0x22e9be10,
+  0x23e7e75a, 0x24e903de, 0x25ecfcd0, 0x26f3ba97, 0x27fd24db, 0x29092288,
+  0x2a1799d1, 0x2b28703a, 0x2c3b8a9b, 0x2d50cd2b, 0x2e681b83, 0x2f8158a5,
+  0x309c6709, 0x31b9289c, 0x32d77ed0, 0x33f74a9e, 0x35186c95, 0x363ac4d8,
+  0x375e3333, 0x3882971a, 0x39a7cfb6, 0x3acdbbf0, 0x3bf43a75, 0x3d1b29c5,
+  0x3e426836, 0x3f69d405, 0x40914b59, 0x41b8ac51, 0x42dfd50a, 0x4406a3ac,
+  0x452cf672, 0x4652abb4, 0x4777a1f0, 0x489bb7d4, 0x49becc4a, 0x4ae0be7e,
+  0x4c016de7, 0x4d20ba56, 0x4e3e83f8, 0x4f5aab65, 0x507511a6, 0x518d983d,
+  0x52a42131, 0x53b88f14, 0x54cac50d, 0x55daa6dc, 0x56e818ea, 0x57f30047,
+  0x58fb42b9, 0x5a00c6c1, 0x5b03739e, 0x5c03315a, 0x5cffe8cc, 0x5df983a1,
+  0x5eefec5d, 0x5fe30e66, 0x60d2d607, 0x61bf3073, 0x62a80bcb, 0x638d5722,
+  0x646f0282, 0x654cfeec, 0x66273e5f, 0x66fdb3d5, 0x67d0534d, 0x689f11c6,
+  0x6969e543, 0x6a30c4cc, 0x6af3a870, 0x6bb28941, 0x6c6d6159, 0x6d242bd6,
+  0x6dd6e4da, 0x6e85898a, 0x6f30180d, 0x6fd68f86, 0x7078f015, 0x71173ad6,
+  0x71b171d8, 0x7247981c, 0x72d9b193, 0x7367c317, 0x73f1d266, 0x7477e620,
+  0x74fa05bd, 0x7578398b, 0x75f28aa7, 0x766902f5, 0x76dbad1c, 0x774a947c,
+  0x77b5c529, 0x781d4be4, 0x78813611, 0x78e191b2, 0x793e6d5d, 0x7997d834,
+  0x79ede1dc, 0x7a409a77, 0x7a90129a, 0x7adc5b43, 0x7b2585d1, 0x7b6ba3fd,
+  0x7baec7ce, 0x7bef0393, 0x7c2c69d7, 0x7c670d5c, 0x7c9f0110, 0x7cd45801,
+  0x7d07255b, 0x7d377c5b, 0x7d657049, 0x7d91146a, 0x7dba7c02, 0x7de1ba42,
+  0x7e06e247, 0x7e2a070f, 0x7e4b3b72, 0x7e6a921d, 0x7e881d8a, 0x7ea3effa,
+  0x7ebe1b6d, 0x7ed6b19e, 0x7eedc3fe, 0x7f0363ae, 0x7f17a177, 0x7f2a8dcd,
+  0x7f3c38c3, 0x7f4cb20c, 0x7f5c08f4, 0x7f6a4c62, 0x7f778ad0, 0x7f83d24c,
+  0x7f8f3073, 0x7f99b274, 0x7fa36509, 0x7fac547b, 0x7fb48c9e, 0x7fbc18d2,
+  0x7fc30404, 0x7fc958ad, 0x7fcf20d1, 0x7fd46604, 0x7fd93169, 0x7fdd8bb1,
+  0x7fe17d22, 0x7fe50d93, 0x7fe84475, 0x7feb28ce, 0x7fedc13f, 0x7ff01409,
+  0x7ff2270b, 0x7ff3ffc7, 0x7ff5a368, 0x7ff716bf, 0x7ff85e4b, 0x7ff97e3b,
+  0x7ffa7a71, 0x7ffb5686, 0x7ffc15cb, 0x7ffcbb50, 0x7ffd49e5, 0x7ffdc41f,
+  0x7ffe2c57, 0x7ffe84b3, 0x7ffecf28, 0x7fff0d78, 0x7fff413b, 0x7fff6be1,
+  0x7fff8eb1, 0x7fffaad1, 0x7fffc144, 0x7fffd2f2, 0x7fffe0a3, 0x7fffeb0a,
+  0x7ffff2bf, 0x7ffff849, 0x7ffffc18, 0x7ffffe8f};
 
 const WORD32 ixheaacd_kbd_win4[4] = {0x000807ab, 0x22b0608e, 0x7b35bb1c,
-                                     0x7fffffff};
+  0x7fffffff};
 
 const WORD32 ixheaacd_kbd_win16[16] = {
-    0x00040f1f, 0x008e78fe, 0x02c97f7b, 0x0884e8da, 0x137eb190, 0x244db0c4,
-    0x398f9632, 0x5009fdd5, 0x63e3825f, 0x7253cdb4, 0x7abe6e47, 0x7e81b826,
-    0x7fb757e1, 0x7ff83b3b, 0x7fffb0c4, 0x7fffffff};
+  0x00040f1f, 0x008e78fe, 0x02c97f7b, 0x0884e8da, 0x137eb190, 0x244db0c4,
+  0x398f9632, 0x5009fdd5, 0x63e3825f, 0x7253cdb4, 0x7abe6e47, 0x7e81b826,
+  0x7fb757e1, 0x7ff83b3b, 0x7fffb0c4, 0x7fffffff};
 
 const WORD32 ixheaacd_kbd_win_64[64] = {
-    0x00020817, 0x00096787, 0x0017763e, 0x002f8bde, 0x00559f6e, 0x008e7146,
-    0x00df9378, 0x014f3fd9, 0x01e45803, 0x02a63b67, 0x039c8c93, 0x04cf17ff,
-    0x06456f77, 0x0806b7af, 0x0a195ccf, 0x0c82be8f, 0x0f46ed1f, 0x1268555f,
-    0x15e7a73f, 0x19c38aff, 0x1df8875f, 0x2280f97f, 0x27552e3f, 0x2c6b58ff,
-    0x31b7e0bf, 0x372d903f, 0x3cbdf4bf, 0x4259b7ff, 0x47f11f7f, 0x4d745fff,
-    0x52d43cff, 0x580242ff, 0x5cf1777f, 0x6196747f, 0x65e7e1ff, 0x69de9bff,
-    0x6d75ea7f, 0x70ab607f, 0x737f0eff, 0x75f316ff, 0x780ba1ff, 0x79ce95ff,
-    0x7b4306ff, 0x7c7114ff, 0x7d615e7f, 0x7e1c9b7f, 0x7eab607f, 0x7f15c5ff,
-    0x7f631b7f, 0x7f99dc7f, 0x7fbf82ff, 0x7fd8a57f, 0x7fe8dd7f, 0x7ff2f57f,
-    0x7ff8fcff, 0x7ffc6d7f, 0x7ffe4bff, 0x7fff3eff, 0x7fffb47f, 0x7fffe6ff,
-    0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff};
+  0x00020817, 0x00096787, 0x0017763e, 0x002f8bde, 0x00559f6e, 0x008e7146,
+  0x00df9378, 0x014f3fd9, 0x01e45803, 0x02a63b67, 0x039c8c93, 0x04cf17ff,
+  0x06456f77, 0x0806b7af, 0x0a195ccf, 0x0c82be8f, 0x0f46ed1f, 0x1268555f,
+  0x15e7a73f, 0x19c38aff, 0x1df8875f, 0x2280f97f, 0x27552e3f, 0x2c6b58ff,
+  0x31b7e0bf, 0x372d903f, 0x3cbdf4bf, 0x4259b7ff, 0x47f11f7f, 0x4d745fff,
+  0x52d43cff, 0x580242ff, 0x5cf1777f, 0x6196747f, 0x65e7e1ff, 0x69de9bff,
+  0x6d75ea7f, 0x70ab607f, 0x737f0eff, 0x75f316ff, 0x780ba1ff, 0x79ce95ff,
+  0x7b4306ff, 0x7c7114ff, 0x7d615e7f, 0x7e1c9b7f, 0x7eab607f, 0x7f15c5ff,
+  0x7f631b7f, 0x7f99dc7f, 0x7fbf82ff, 0x7fd8a57f, 0x7fe8dd7f, 0x7ff2f57f,
+  0x7ff8fcff, 0x7ffc6d7f, 0x7ffe4bff, 0x7fff3eff, 0x7fffb47f, 0x7fffe6ff,
+  0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff};
 
 const WORD32 ixheaacd_kbd_win768[768] = {
-    0x000b1359, 0x00107b78, 0x0015336d, 0x0019b0ab, 0x001e14bd, 0x002278d0,
-    0x0026e546, 0x002b6ae7, 0x0030014f, 0x0034b0e1, 0x00398201, 0x003e6c4c,
-    0x00438088, 0x0048adee, 0x004e0da9, 0x0053868f, 0x00592966, 0x005efe92,
-    0x0064f54c, 0x006b15f8, 0x00716095, 0x0077d523, 0x007e7c06, 0x00854cda,
-    0x008c5004, 0x00937d1f, 0x009adc8f, 0x00a26e53, 0x00aa326d, 0x00b22078,
-    0x00ba493c, 0x00c2a454, 0x00cb31c1, 0x00d3f9e7, 0x00dcf461, 0x00e62131,
-    0x00ef88b8, 0x00f92af9, 0x0102ff8d, 0x010d0edb, 0x01176145, 0x0121e603,
-    0x012ca579, 0x0137a80b, 0x0142dcf3, 0x014e5d5b, 0x015a1015, 0x016605ed,
-    0x01723ee1, 0x017eb28d, 0x018b6955, 0x01986337, 0x01a5a037, 0x01b32053,
-    0x01c0e389, 0x01cee9dd, 0x01dd3baf, 0x01ebc839, 0x01faa043, 0x0209c3cf,
-    0x021932d7, 0x0228e4fb, 0x0238da3b, 0x0249235f, 0x0259af9f, 0x026a8fbf,
-    0x027bb2ff, 0x028d2a1f, 0x029eecbf, 0x02b0fadf, 0x02c35cdf, 0x02d60a63,
-    0x02e90bc7, 0x02fc58ab, 0x030ff973, 0x0323ee1b, 0x033836a7, 0x034ccab3,
-    0x0361bb03, 0x0376ff3b, 0x038c8eef, 0x03a2834b, 0x03b8c32b, 0x03cf5f4f,
-    0x03e64f53, 0x03fd9b9f, 0x04154437, 0x042d40a7, 0x04459967, 0x045e4607,
-    0x0477574f, 0x0490c4df, 0x04aa864f, 0x04c4ac6f, 0x04df2ecf, 0x04fa0d77,
-    0x05154867, 0x0530e7ff, 0x054ce3df, 0x05694467, 0x05860997, 0x05a32b0f,
-    0x05c0a8cf, 0x05de939f, 0x05fcdaaf, 0x061b866f, 0x063a96d7, 0x065a0be7,
-    0x0679e59f, 0x069a23ff, 0x06bacf77, 0x06dbd727, 0x06fd4bef, 0x071f255f,
-    0x07416bd7, 0x076416ff, 0x07872f2f, 0x07aaac0f, 0x07ce8d97, 0x07f2e48f,
-    0x0817a02f, 0x083cc07f, 0x0862562f, 0x0888509f, 0x08aec06f, 0x08d594ef,
-    0x08fcd67f, 0x0924851f, 0x094ca0bf, 0x0975296f, 0x099e279f, 0x09c78a6f,
-    0x09f162af, 0x0a1ba7ff, 0x0a465a4f, 0x0a7179bf, 0x0a9d0e9f, 0x0ac9107f,
-    0x0af587cf, 0x0b226c3f, 0x0b4fbdaf, 0x0b7d848f, 0x0babb87f, 0x0bda61df,
-    0x0c09784f, 0x0c39042f, 0x0c69057f, 0x0c9973df, 0x0cca4f3f, 0x0cfba87f,
-    0x0d2d6ecf, 0x0d5fa21f, 0x0d92534f, 0x0dc5718f, 0x0df8fccf, 0x0e2d05ef,
-    0x0e617c1f, 0x0e9667af, 0x0ecbc05f, 0x0f0196df, 0x0f37da5f, 0x0f6e8aff,
-    0x0fa5b95f, 0x0fdd54df, 0x101565bf, 0x104dec1f, 0x1086df7f, 0x10c0485f,
-    0x10fa269f, 0x11347a5f, 0x116f3b1f, 0x11aa715f, 0x11e6149f, 0x122235bf,
-    0x125ec3df, 0x129bbeff, 0x12d92fbf, 0x131715bf, 0x135568df, 0x1394317f,
-    0x13d3671f, 0x1413121f, 0x14532a3f, 0x1493b7df, 0x14d4b27f, 0x15161a1f,
-    0x1557f73f, 0x159a415f, 0x15dcf89f, 0x1620253f, 0x1663bedf, 0x16a7c59f,
-    0x16ec397f, 0x17311a5f, 0x1776683f, 0x17bc233f, 0x18024b3f, 0x1848e03f,
-    0x188fe25f, 0x18d7517f, 0x191f255f, 0x1967663f, 0x19b0141f, 0x19f926bf,
-    0x1a42a65f, 0x1a8c8abf, 0x1ad6dc1f, 0x1b21921f, 0x1b6cacdf, 0x1bb8347f,
-    0x1c04189f, 0x1c50699f, 0x1c9d1f5f, 0x1cea39bf, 0x1d37b8df, 0x1d85941f,
-    0x1dd3d41f, 0x1e2278df, 0x1e7179bf, 0x1ec0df5f, 0x1f10a99f, 0x1f60d01f,
-    0x1fb152ff, 0x200231ff, 0x20536d7f, 0x20a504ff, 0x20f7013f, 0x2149517f,
-    0x219bf57f, 0x21eefe3f, 0x22425aff, 0x229613bf, 0x22ea207f, 0x233e813f,
-    0x239335bf, 0x23e846bf, 0x243da2ff, 0x24935b7f, 0x24e95fbf, 0x253fb7bf,
-    0x2596637f, 0x25ed5aff, 0x26449dbf, 0x269c347f, 0x26f416bf, 0x274c447f,
-    0x27a4bdbf, 0x27fd79ff, 0x28568a3f, 0x28afddbf, 0x29097c7f, 0x29635e7f,
-    0x29bd837f, 0x2a17f3ff, 0x2a729f3f, 0x2acd8dbf, 0x2b28c77f, 0x2b843c3f,
-    0x2bdfeb7f, 0x2c3bddff, 0x2c980b3f, 0x2cf47b7f, 0x2d511dff, 0x2dae03bf,
-    0x2e0b1bbf, 0x2e686e7f, 0x2ec5f37f, 0x2f23b37f, 0x2f81a57f, 0x2fdfd27f,
-    0x303e293f, 0x309cb23f, 0x30fb6dbf, 0x315a5b7f, 0x31b9733f, 0x3218bd7f,
-    0x327828ff, 0x32d7c6ff, 0x33378eff, 0x3397783f, 0x33f7943f, 0x3457d17f,
-    0x34b8303f, 0x3518b0bf, 0x35795b3f, 0x35da1ebf, 0x363b0c3f, 0x369c12ff,
-    0x36fd32bf, 0x375e743f, 0x37bfcebf, 0x38214abf, 0x3882d7bf, 0x38e47dbf,
-    0x39463cff, 0x39a80cff, 0x3a09f63f, 0x3a6befff, 0x3acdfabf, 0x3b30163f,
-    0x3b923a3f, 0x3bf4773f, 0x3c56b43f, 0x3cb90a7f, 0x3d1b60bf, 0x3d7dbf3f,
-    0x3de02ebf, 0x3e429dff, 0x3ea515bf, 0x3f078d7f, 0x3f6a053f, 0x3fcc857f,
-    0x402efd7f, 0x40917d7f, 0x40f3f4ff, 0x41566cff, 0x41b8dc7f, 0x421b437f,
-    0x427daa7f, 0x42e0007f, 0x43424e7f, 0x43a493ff, 0x4406d0ff, 0x4468f47f,
-    0x44cb0fff, 0x452d1aff, 0x458f14ff, 0x45f0fdff, 0x4652cdff, 0x46b48cff,
-    0x4716337f, 0x4777c87f, 0x47d93c7f, 0x483a96ff, 0x489bd7ff, 0x48fd007f,
-    0x495e06ff, 0x49beebff, 0x4a1fafff, 0x4a8059ff, 0x4ae0da7f, 0x4b41397f,
-    0x4ba176ff, 0x4c018a7f, 0x4c61737f, 0x4cc13b7f, 0x4d20d0ff, 0x4d8044ff,
-    0x4ddf86ff, 0x4e3e9e7f, 0x4e9d83ff, 0x4efc36ff, 0x4f5abfff, 0x4fb916ff,
-    0x501732ff, 0x5075257f, 0x50d2dc7f, 0x513061ff, 0x518dabff, 0x51eabbff,
-    0x5247907f, 0x52a4337f, 0x530092ff, 0x535cb77f, 0x53b898ff, 0x54143fff,
-    0x546fac7f, 0x54caccff, 0x5525b2ff, 0x558055ff, 0x55daad7f, 0x5634c9ff,
-    0x568e92ff, 0x56e820ff, 0x5741637f, 0x579a5a7f, 0x57f305ff, 0x584b65ff,
-    0x58a37aff, 0x58fb43ff, 0x5952c17f, 0x59a9eaff, 0x5a00c97f, 0x5a57537f,
-    0x5aad89ff, 0x5b0374ff, 0x5b59037f, 0x5bae46ff, 0x5c032d7f, 0x5c57c07f,
-    0x5cabffff, 0x5cffe27f, 0x5d53717f, 0x5da6a47f, 0x5df97a7f, 0x5e4bfcff,
-    0x5e9e1aff, 0x5eefe4ff, 0x5f414a7f, 0x5f925b7f, 0x5fe3087f, 0x6033507f,
-    0x60833c7f, 0x60d2cbff, 0x6121f6ff, 0x6170bcff, 0x61bf26ff, 0x620d23ff,
-    0x625ac47f, 0x62a8007f, 0x62f4cf7f, 0x634141ff, 0x638d477f, 0x63d8e87f,
-    0x6424247f, 0x646ef3ff, 0x64b955ff, 0x65035bff, 0x654cec7f, 0x659617ff,
-    0x65ded67f, 0x6627287f, 0x666f157f, 0x66b68cff, 0x66fd9fff, 0x6744457f,
-    0x678a75ff, 0x67d041ff, 0x681597ff, 0x685a817f, 0x689efd7f, 0x68e3047f,
-    0x6926a67f, 0x6969ca7f, 0x69ac89ff, 0x69eed47f, 0x6a30a8ff, 0x6a72107f,
-    0x6ab30b7f, 0x6af3907f, 0x6b33a07f, 0x6b7342ff, 0x6bb26fff, 0x6bf127ff,
-    0x6c2f727f, 0x6c6d47ff, 0x6caaa7ff, 0x6ce7927f, 0x6d240f7f, 0x6d60177f,
-    0x6d9ba9ff, 0x6dd6c6ff, 0x6e1176ff, 0x6e4ba97f, 0x6e856e7f, 0x6ebebdff,
-    0x6ef7987f, 0x6f2ffcff, 0x6f67ec7f, 0x6f9f667f, 0x6fd672ff, 0x700d0a7f,
-    0x7043247f, 0x7078d0ff, 0x70ae07ff, 0x70e2c97f, 0x71171dff, 0x714af4ff,
-    0x717e5e7f, 0x71b152ff, 0x71e3d1ff, 0x7215e37f, 0x7247777f, 0x72789e7f,
-    0x72a94fff, 0x72d9947f, 0x7309637f, 0x7338bcff, 0x7367a0ff, 0x739617ff,
-    0x73c421ff, 0x73f1b67f, 0x741ed57f, 0x744b877f, 0x7477c47f, 0x74a393ff,
-    0x74cef67f, 0x74f9e37f, 0x7524637f, 0x754e767f, 0x75781c7f, 0x75a14cff,
-    0x75ca107f, 0x75f26eff, 0x761a587f, 0x7641d47f, 0x7668e3ff, 0x768f85ff,
-    0x76b5c37f, 0x76db8b7f, 0x7700eeff, 0x7725e57f, 0x774a76ff, 0x776e9b7f,
-    0x7792537f, 0x77b5a5ff, 0x77d88bff, 0x77fb157f, 0x781d29ff, 0x783ee17f,
-    0x78602c7f, 0x78811aff, 0x78a19c7f, 0x78c1b97f, 0x78e1717f, 0x7900cd7f,
-    0x791fbc7f, 0x793e4eff, 0x795c7cff, 0x797a4e7f, 0x7997bb7f, 0x79b4cbff,
-    0x79d177ff, 0x79edc7ff, 0x7a09b2ff, 0x7a2549ff, 0x7a407cff, 0x7a5b52ff,
-    0x7a75d57f, 0x7a8ff2ff, 0x7aa9bcff, 0x7ac32a7f, 0x7adc3bff, 0x7af4f8ff,
-    0x7b0d5a7f, 0x7b25677f, 0x7b3d20ff, 0x7b547dff, 0x7b6b86ff, 0x7b823c7f,
-    0x7b989dff, 0x7baeab7f, 0x7bc464ff, 0x7bd9d37f, 0x7beeed7f, 0x7c03b3ff,
-    0x7c18267f, 0x7c2c4d7f, 0x7c4028ff, 0x7c53b8ff, 0x7c66f4ff, 0x7c79e57f,
-    0x7c8c8a7f, 0x7c9eec7f, 0x7cb0faff, 0x7cc2c5ff, 0x7cd43cff, 0x7ce5797f,
-    0x7cf66a7f, 0x7d070f7f, 0x7d1771ff, 0x7d2790ff, 0x7d3764ff, 0x7d46fdff,
-    0x7d564b7f, 0x7d655dff, 0x7d74257f, 0x7d82b1ff, 0x7d9103ff, 0x7d9f09ff,
-    0x7dacd57f, 0x7dba667f, 0x7dc7bcff, 0x7dd4cfff, 0x7de1a7ff, 0x7dee45ff,
-    0x7dfaa87f, 0x7e06d0ff, 0x7e12be7f, 0x7e1e797f, 0x7e29f17f, 0x7e353f7f,
-    0x7e4052ff, 0x7e4b2b7f, 0x7e55d1ff, 0x7e60457f, 0x7e6a7eff, 0x7e748e7f,
-    0x7e7e62ff, 0x7e880d7f, 0x7e9185ff, 0x7e9acbff, 0x7ea3df7f, 0x7eacc8ff,
-    0x7eb5807f, 0x7ebe0dff, 0x7ec668ff, 0x7ece99ff, 0x7ed6a17f, 0x7ede7e7f,
-    0x7ee631ff, 0x7eedb2ff, 0x7ef5127f, 0x7efc47ff, 0x7f03537f, 0x7f0a3d7f,
-    0x7f10fd7f, 0x7f17937f, 0x7f1e07ff, 0x7f245aff, 0x7f2a83ff, 0x7f308b7f,
-    0x7f36697f, 0x7f3c2d7f, 0x7f41d07f, 0x7f47497f, 0x7f4ca8ff, 0x7f51e77f,
-    0x7f5703ff, 0x7f5bfeff, 0x7f60e0ff, 0x7f65a17f, 0x7f6a3fff, 0x7f6ecdff,
-    0x7f7331ff, 0x7f77857f, 0x7f7bb6ff, 0x7f7fcfff, 0x7f83c6ff, 0x7f87acff,
-    0x7f8b79ff, 0x7f8f257f, 0x7f92c07f, 0x7f9641ff, 0x7f99aa7f, 0x7f9cf97f,
-    0x7fa037ff, 0x7fa35d7f, 0x7fa671ff, 0x7fa964ff, 0x7fac4f7f, 0x7faf20ff,
-    0x7fb1d8ff, 0x7fb488ff, 0x7fb71f7f, 0x7fb9a57f, 0x7fbc127f, 0x7fbe76ff,
-    0x7fc0c1ff, 0x7fc2fc7f, 0x7fc52e7f, 0x7fc7477f, 0x7fc957ff, 0x7fcb4eff,
-    0x7fcd3dff, 0x7fcf1bff, 0x7fd0e97f, 0x7fd2ae7f, 0x7fd462ff, 0x7fd605ff,
-    0x7fd7a0ff, 0x7fd92b7f, 0x7fdaad7f, 0x7fdc1e7f, 0x7fdd86ff, 0x7fdee77f,
-    0x7fe036ff, 0x7fe175ff, 0x7fe2b47f, 0x7fe3e27f, 0x7fe507ff, 0x7fe6257f,
-    0x7fe739ff, 0x7fe83e7f, 0x7fe9427f, 0x7fea357f, 0x7feb28ff, 0x7fec0b7f,
-    0x7fece57f, 0x7fedbf7f, 0x7fee88ff, 0x7fef51ff, 0x7ff012ff, 0x7ff0cb7f,
-    0x7ff17bff, 0x7ff2237f, 0x7ff2cb7f, 0x7ff3627f, 0x7ff401ff, 0x7ff4907f,
-    0x7ff51eff, 0x7ff5a4ff, 0x7ff622ff, 0x7ff6a0ff, 0x7ff7167f, 0x7ff7837f,
-    0x7ff7f07f, 0x7ff85d7f, 0x7ff8c1ff, 0x7ff91e7f, 0x7ff97a7f, 0x7ff9d6ff,
-    0x7ffa2aff, 0x7ffa767f, 0x7ffac9ff, 0x7ffb0d7f, 0x7ffb58ff, 0x7ffb9bff,
-    0x7ffbd67f, 0x7ffc117f, 0x7ffc4bff, 0x7ffc86ff, 0x7ffcb8ff, 0x7ffceb7f,
-    0x7ffd1dff, 0x7ffd477f, 0x7ffd717f, 0x7ffd9b7f, 0x7ffdc57f, 0x7ffde6ff,
-    0x7ffe087f, 0x7ffe29ff, 0x7ffe4bff, 0x7ffe64ff, 0x7ffe867f, 0x7ffe9f7f,
-    0x7ffeb8ff, 0x7ffed1ff, 0x7ffee2ff, 0x7ffefbff, 0x7fff0c7f, 0x7fff1d7f,
-    0x7fff2e7f, 0x7fff3eff, 0x7fff4fff, 0x7fff607f, 0x7fff68ff, 0x7fff79ff,
-    0x7fff81ff, 0x7fff92ff, 0x7fff9b7f, 0x7fffa37f, 0x7fffabff, 0x7fffb47f,
-    0x7fffbcff, 0x7fffc57f, 0x7fffc57f, 0x7fffcd7f, 0x7fffd5ff, 0x7fffd5ff,
-    0x7fffde7f, 0x7fffde7f, 0x7fffe6ff, 0x7fffe6ff, 0x7fffeeff, 0x7fffeeff,
-    0x7fffeeff, 0x7fffeeff, 0x7ffff77f, 0x7ffff77f, 0x7ffff77f, 0x7ffff77f,
-    0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
+  0x000b1359, 0x00107b78, 0x0015336d, 0x0019b0ab, 0x001e14bd, 0x002278d0,
+  0x0026e546, 0x002b6ae7, 0x0030014f, 0x0034b0e1, 0x00398201, 0x003e6c4c,
+  0x00438088, 0x0048adee, 0x004e0da9, 0x0053868f, 0x00592966, 0x005efe92,
+  0x0064f54c, 0x006b15f8, 0x00716095, 0x0077d523, 0x007e7c06, 0x00854cda,
+  0x008c5004, 0x00937d1f, 0x009adc8f, 0x00a26e53, 0x00aa326d, 0x00b22078,
+  0x00ba493c, 0x00c2a454, 0x00cb31c1, 0x00d3f9e7, 0x00dcf461, 0x00e62131,
+  0x00ef88b8, 0x00f92af9, 0x0102ff8d, 0x010d0edb, 0x01176145, 0x0121e603,
+  0x012ca579, 0x0137a80b, 0x0142dcf3, 0x014e5d5b, 0x015a1015, 0x016605ed,
+  0x01723ee1, 0x017eb28d, 0x018b6955, 0x01986337, 0x01a5a037, 0x01b32053,
+  0x01c0e389, 0x01cee9dd, 0x01dd3baf, 0x01ebc839, 0x01faa043, 0x0209c3cf,
+  0x021932d7, 0x0228e4fb, 0x0238da3b, 0x0249235f, 0x0259af9f, 0x026a8fbf,
+  0x027bb2ff, 0x028d2a1f, 0x029eecbf, 0x02b0fadf, 0x02c35cdf, 0x02d60a63,
+  0x02e90bc7, 0x02fc58ab, 0x030ff973, 0x0323ee1b, 0x033836a7, 0x034ccab3,
+  0x0361bb03, 0x0376ff3b, 0x038c8eef, 0x03a2834b, 0x03b8c32b, 0x03cf5f4f,
+  0x03e64f53, 0x03fd9b9f, 0x04154437, 0x042d40a7, 0x04459967, 0x045e4607,
+  0x0477574f, 0x0490c4df, 0x04aa864f, 0x04c4ac6f, 0x04df2ecf, 0x04fa0d77,
+  0x05154867, 0x0530e7ff, 0x054ce3df, 0x05694467, 0x05860997, 0x05a32b0f,
+  0x05c0a8cf, 0x05de939f, 0x05fcdaaf, 0x061b866f, 0x063a96d7, 0x065a0be7,
+  0x0679e59f, 0x069a23ff, 0x06bacf77, 0x06dbd727, 0x06fd4bef, 0x071f255f,
+  0x07416bd7, 0x076416ff, 0x07872f2f, 0x07aaac0f, 0x07ce8d97, 0x07f2e48f,
+  0x0817a02f, 0x083cc07f, 0x0862562f, 0x0888509f, 0x08aec06f, 0x08d594ef,
+  0x08fcd67f, 0x0924851f, 0x094ca0bf, 0x0975296f, 0x099e279f, 0x09c78a6f,
+  0x09f162af, 0x0a1ba7ff, 0x0a465a4f, 0x0a7179bf, 0x0a9d0e9f, 0x0ac9107f,
+  0x0af587cf, 0x0b226c3f, 0x0b4fbdaf, 0x0b7d848f, 0x0babb87f, 0x0bda61df,
+  0x0c09784f, 0x0c39042f, 0x0c69057f, 0x0c9973df, 0x0cca4f3f, 0x0cfba87f,
+  0x0d2d6ecf, 0x0d5fa21f, 0x0d92534f, 0x0dc5718f, 0x0df8fccf, 0x0e2d05ef,
+  0x0e617c1f, 0x0e9667af, 0x0ecbc05f, 0x0f0196df, 0x0f37da5f, 0x0f6e8aff,
+  0x0fa5b95f, 0x0fdd54df, 0x101565bf, 0x104dec1f, 0x1086df7f, 0x10c0485f,
+  0x10fa269f, 0x11347a5f, 0x116f3b1f, 0x11aa715f, 0x11e6149f, 0x122235bf,
+  0x125ec3df, 0x129bbeff, 0x12d92fbf, 0x131715bf, 0x135568df, 0x1394317f,
+  0x13d3671f, 0x1413121f, 0x14532a3f, 0x1493b7df, 0x14d4b27f, 0x15161a1f,
+  0x1557f73f, 0x159a415f, 0x15dcf89f, 0x1620253f, 0x1663bedf, 0x16a7c59f,
+  0x16ec397f, 0x17311a5f, 0x1776683f, 0x17bc233f, 0x18024b3f, 0x1848e03f,
+  0x188fe25f, 0x18d7517f, 0x191f255f, 0x1967663f, 0x19b0141f, 0x19f926bf,
+  0x1a42a65f, 0x1a8c8abf, 0x1ad6dc1f, 0x1b21921f, 0x1b6cacdf, 0x1bb8347f,
+  0x1c04189f, 0x1c50699f, 0x1c9d1f5f, 0x1cea39bf, 0x1d37b8df, 0x1d85941f,
+  0x1dd3d41f, 0x1e2278df, 0x1e7179bf, 0x1ec0df5f, 0x1f10a99f, 0x1f60d01f,
+  0x1fb152ff, 0x200231ff, 0x20536d7f, 0x20a504ff, 0x20f7013f, 0x2149517f,
+  0x219bf57f, 0x21eefe3f, 0x22425aff, 0x229613bf, 0x22ea207f, 0x233e813f,
+  0x239335bf, 0x23e846bf, 0x243da2ff, 0x24935b7f, 0x24e95fbf, 0x253fb7bf,
+  0x2596637f, 0x25ed5aff, 0x26449dbf, 0x269c347f, 0x26f416bf, 0x274c447f,
+  0x27a4bdbf, 0x27fd79ff, 0x28568a3f, 0x28afddbf, 0x29097c7f, 0x29635e7f,
+  0x29bd837f, 0x2a17f3ff, 0x2a729f3f, 0x2acd8dbf, 0x2b28c77f, 0x2b843c3f,
+  0x2bdfeb7f, 0x2c3bddff, 0x2c980b3f, 0x2cf47b7f, 0x2d511dff, 0x2dae03bf,
+  0x2e0b1bbf, 0x2e686e7f, 0x2ec5f37f, 0x2f23b37f, 0x2f81a57f, 0x2fdfd27f,
+  0x303e293f, 0x309cb23f, 0x30fb6dbf, 0x315a5b7f, 0x31b9733f, 0x3218bd7f,
+  0x327828ff, 0x32d7c6ff, 0x33378eff, 0x3397783f, 0x33f7943f, 0x3457d17f,
+  0x34b8303f, 0x3518b0bf, 0x35795b3f, 0x35da1ebf, 0x363b0c3f, 0x369c12ff,
+  0x36fd32bf, 0x375e743f, 0x37bfcebf, 0x38214abf, 0x3882d7bf, 0x38e47dbf,
+  0x39463cff, 0x39a80cff, 0x3a09f63f, 0x3a6befff, 0x3acdfabf, 0x3b30163f,
+  0x3b923a3f, 0x3bf4773f, 0x3c56b43f, 0x3cb90a7f, 0x3d1b60bf, 0x3d7dbf3f,
+  0x3de02ebf, 0x3e429dff, 0x3ea515bf, 0x3f078d7f, 0x3f6a053f, 0x3fcc857f,
+  0x402efd7f, 0x40917d7f, 0x40f3f4ff, 0x41566cff, 0x41b8dc7f, 0x421b437f,
+  0x427daa7f, 0x42e0007f, 0x43424e7f, 0x43a493ff, 0x4406d0ff, 0x4468f47f,
+  0x44cb0fff, 0x452d1aff, 0x458f14ff, 0x45f0fdff, 0x4652cdff, 0x46b48cff,
+  0x4716337f, 0x4777c87f, 0x47d93c7f, 0x483a96ff, 0x489bd7ff, 0x48fd007f,
+  0x495e06ff, 0x49beebff, 0x4a1fafff, 0x4a8059ff, 0x4ae0da7f, 0x4b41397f,
+  0x4ba176ff, 0x4c018a7f, 0x4c61737f, 0x4cc13b7f, 0x4d20d0ff, 0x4d8044ff,
+  0x4ddf86ff, 0x4e3e9e7f, 0x4e9d83ff, 0x4efc36ff, 0x4f5abfff, 0x4fb916ff,
+  0x501732ff, 0x5075257f, 0x50d2dc7f, 0x513061ff, 0x518dabff, 0x51eabbff,
+  0x5247907f, 0x52a4337f, 0x530092ff, 0x535cb77f, 0x53b898ff, 0x54143fff,
+  0x546fac7f, 0x54caccff, 0x5525b2ff, 0x558055ff, 0x55daad7f, 0x5634c9ff,
+  0x568e92ff, 0x56e820ff, 0x5741637f, 0x579a5a7f, 0x57f305ff, 0x584b65ff,
+  0x58a37aff, 0x58fb43ff, 0x5952c17f, 0x59a9eaff, 0x5a00c97f, 0x5a57537f,
+  0x5aad89ff, 0x5b0374ff, 0x5b59037f, 0x5bae46ff, 0x5c032d7f, 0x5c57c07f,
+  0x5cabffff, 0x5cffe27f, 0x5d53717f, 0x5da6a47f, 0x5df97a7f, 0x5e4bfcff,
+  0x5e9e1aff, 0x5eefe4ff, 0x5f414a7f, 0x5f925b7f, 0x5fe3087f, 0x6033507f,
+  0x60833c7f, 0x60d2cbff, 0x6121f6ff, 0x6170bcff, 0x61bf26ff, 0x620d23ff,
+  0x625ac47f, 0x62a8007f, 0x62f4cf7f, 0x634141ff, 0x638d477f, 0x63d8e87f,
+  0x6424247f, 0x646ef3ff, 0x64b955ff, 0x65035bff, 0x654cec7f, 0x659617ff,
+  0x65ded67f, 0x6627287f, 0x666f157f, 0x66b68cff, 0x66fd9fff, 0x6744457f,
+  0x678a75ff, 0x67d041ff, 0x681597ff, 0x685a817f, 0x689efd7f, 0x68e3047f,
+  0x6926a67f, 0x6969ca7f, 0x69ac89ff, 0x69eed47f, 0x6a30a8ff, 0x6a72107f,
+  0x6ab30b7f, 0x6af3907f, 0x6b33a07f, 0x6b7342ff, 0x6bb26fff, 0x6bf127ff,
+  0x6c2f727f, 0x6c6d47ff, 0x6caaa7ff, 0x6ce7927f, 0x6d240f7f, 0x6d60177f,
+  0x6d9ba9ff, 0x6dd6c6ff, 0x6e1176ff, 0x6e4ba97f, 0x6e856e7f, 0x6ebebdff,
+  0x6ef7987f, 0x6f2ffcff, 0x6f67ec7f, 0x6f9f667f, 0x6fd672ff, 0x700d0a7f,
+  0x7043247f, 0x7078d0ff, 0x70ae07ff, 0x70e2c97f, 0x71171dff, 0x714af4ff,
+  0x717e5e7f, 0x71b152ff, 0x71e3d1ff, 0x7215e37f, 0x7247777f, 0x72789e7f,
+  0x72a94fff, 0x72d9947f, 0x7309637f, 0x7338bcff, 0x7367a0ff, 0x739617ff,
+  0x73c421ff, 0x73f1b67f, 0x741ed57f, 0x744b877f, 0x7477c47f, 0x74a393ff,
+  0x74cef67f, 0x74f9e37f, 0x7524637f, 0x754e767f, 0x75781c7f, 0x75a14cff,
+  0x75ca107f, 0x75f26eff, 0x761a587f, 0x7641d47f, 0x7668e3ff, 0x768f85ff,
+  0x76b5c37f, 0x76db8b7f, 0x7700eeff, 0x7725e57f, 0x774a76ff, 0x776e9b7f,
+  0x7792537f, 0x77b5a5ff, 0x77d88bff, 0x77fb157f, 0x781d29ff, 0x783ee17f,
+  0x78602c7f, 0x78811aff, 0x78a19c7f, 0x78c1b97f, 0x78e1717f, 0x7900cd7f,
+  0x791fbc7f, 0x793e4eff, 0x795c7cff, 0x797a4e7f, 0x7997bb7f, 0x79b4cbff,
+  0x79d177ff, 0x79edc7ff, 0x7a09b2ff, 0x7a2549ff, 0x7a407cff, 0x7a5b52ff,
+  0x7a75d57f, 0x7a8ff2ff, 0x7aa9bcff, 0x7ac32a7f, 0x7adc3bff, 0x7af4f8ff,
+  0x7b0d5a7f, 0x7b25677f, 0x7b3d20ff, 0x7b547dff, 0x7b6b86ff, 0x7b823c7f,
+  0x7b989dff, 0x7baeab7f, 0x7bc464ff, 0x7bd9d37f, 0x7beeed7f, 0x7c03b3ff,
+  0x7c18267f, 0x7c2c4d7f, 0x7c4028ff, 0x7c53b8ff, 0x7c66f4ff, 0x7c79e57f,
+  0x7c8c8a7f, 0x7c9eec7f, 0x7cb0faff, 0x7cc2c5ff, 0x7cd43cff, 0x7ce5797f,
+  0x7cf66a7f, 0x7d070f7f, 0x7d1771ff, 0x7d2790ff, 0x7d3764ff, 0x7d46fdff,
+  0x7d564b7f, 0x7d655dff, 0x7d74257f, 0x7d82b1ff, 0x7d9103ff, 0x7d9f09ff,
+  0x7dacd57f, 0x7dba667f, 0x7dc7bcff, 0x7dd4cfff, 0x7de1a7ff, 0x7dee45ff,
+  0x7dfaa87f, 0x7e06d0ff, 0x7e12be7f, 0x7e1e797f, 0x7e29f17f, 0x7e353f7f,
+  0x7e4052ff, 0x7e4b2b7f, 0x7e55d1ff, 0x7e60457f, 0x7e6a7eff, 0x7e748e7f,
+  0x7e7e62ff, 0x7e880d7f, 0x7e9185ff, 0x7e9acbff, 0x7ea3df7f, 0x7eacc8ff,
+  0x7eb5807f, 0x7ebe0dff, 0x7ec668ff, 0x7ece99ff, 0x7ed6a17f, 0x7ede7e7f,
+  0x7ee631ff, 0x7eedb2ff, 0x7ef5127f, 0x7efc47ff, 0x7f03537f, 0x7f0a3d7f,
+  0x7f10fd7f, 0x7f17937f, 0x7f1e07ff, 0x7f245aff, 0x7f2a83ff, 0x7f308b7f,
+  0x7f36697f, 0x7f3c2d7f, 0x7f41d07f, 0x7f47497f, 0x7f4ca8ff, 0x7f51e77f,
+  0x7f5703ff, 0x7f5bfeff, 0x7f60e0ff, 0x7f65a17f, 0x7f6a3fff, 0x7f6ecdff,
+  0x7f7331ff, 0x7f77857f, 0x7f7bb6ff, 0x7f7fcfff, 0x7f83c6ff, 0x7f87acff,
+  0x7f8b79ff, 0x7f8f257f, 0x7f92c07f, 0x7f9641ff, 0x7f99aa7f, 0x7f9cf97f,
+  0x7fa037ff, 0x7fa35d7f, 0x7fa671ff, 0x7fa964ff, 0x7fac4f7f, 0x7faf20ff,
+  0x7fb1d8ff, 0x7fb488ff, 0x7fb71f7f, 0x7fb9a57f, 0x7fbc127f, 0x7fbe76ff,
+  0x7fc0c1ff, 0x7fc2fc7f, 0x7fc52e7f, 0x7fc7477f, 0x7fc957ff, 0x7fcb4eff,
+  0x7fcd3dff, 0x7fcf1bff, 0x7fd0e97f, 0x7fd2ae7f, 0x7fd462ff, 0x7fd605ff,
+  0x7fd7a0ff, 0x7fd92b7f, 0x7fdaad7f, 0x7fdc1e7f, 0x7fdd86ff, 0x7fdee77f,
+  0x7fe036ff, 0x7fe175ff, 0x7fe2b47f, 0x7fe3e27f, 0x7fe507ff, 0x7fe6257f,
+  0x7fe739ff, 0x7fe83e7f, 0x7fe9427f, 0x7fea357f, 0x7feb28ff, 0x7fec0b7f,
+  0x7fece57f, 0x7fedbf7f, 0x7fee88ff, 0x7fef51ff, 0x7ff012ff, 0x7ff0cb7f,
+  0x7ff17bff, 0x7ff2237f, 0x7ff2cb7f, 0x7ff3627f, 0x7ff401ff, 0x7ff4907f,
+  0x7ff51eff, 0x7ff5a4ff, 0x7ff622ff, 0x7ff6a0ff, 0x7ff7167f, 0x7ff7837f,
+  0x7ff7f07f, 0x7ff85d7f, 0x7ff8c1ff, 0x7ff91e7f, 0x7ff97a7f, 0x7ff9d6ff,
+  0x7ffa2aff, 0x7ffa767f, 0x7ffac9ff, 0x7ffb0d7f, 0x7ffb58ff, 0x7ffb9bff,
+  0x7ffbd67f, 0x7ffc117f, 0x7ffc4bff, 0x7ffc86ff, 0x7ffcb8ff, 0x7ffceb7f,
+  0x7ffd1dff, 0x7ffd477f, 0x7ffd717f, 0x7ffd9b7f, 0x7ffdc57f, 0x7ffde6ff,
+  0x7ffe087f, 0x7ffe29ff, 0x7ffe4bff, 0x7ffe64ff, 0x7ffe867f, 0x7ffe9f7f,
+  0x7ffeb8ff, 0x7ffed1ff, 0x7ffee2ff, 0x7ffefbff, 0x7fff0c7f, 0x7fff1d7f,
+  0x7fff2e7f, 0x7fff3eff, 0x7fff4fff, 0x7fff607f, 0x7fff68ff, 0x7fff79ff,
+  0x7fff81ff, 0x7fff92ff, 0x7fff9b7f, 0x7fffa37f, 0x7fffabff, 0x7fffb47f,
+  0x7fffbcff, 0x7fffc57f, 0x7fffc57f, 0x7fffcd7f, 0x7fffd5ff, 0x7fffd5ff,
+  0x7fffde7f, 0x7fffde7f, 0x7fffe6ff, 0x7fffe6ff, 0x7fffeeff, 0x7fffeeff,
+  0x7fffeeff, 0x7fffeeff, 0x7ffff77f, 0x7ffff77f, 0x7ffff77f, 0x7ffff77f,
+  0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
 
 const WORD32 ixheaacd_kbd_win192[192] = {
-    0x00012dfd, 0x000296b3, 0x00047d3d, 0x0006f262, 0x000a0f4d, 0x000ded28,
-    0x0012a51e, 0x0018611f, 0x001f31f4, 0x002749f0, 0x0030c23f, 0x003bcd35,
-    0x004894c4, 0x005742dc, 0x00680170, 0x007b0b38, 0x00908a25, 0x00a8c154,
-    0x00c3eb7c, 0x00e2328f, 0x0103ea6f, 0x01293d0f, 0x015275ed, 0x017fe089,
-    0x01b1af39, 0x01e835dd, 0x0223b793, 0x02647777, 0x02aac107, 0x02f6e827,
-    0x0349278f, 0x03a1cabf, 0x04012597, 0x04677b37, 0x04d50eb7, 0x054a2b9f,
-    0x05c714ff, 0x064c1657, 0x06d96a67, 0x076f5447, 0x080e064f, 0x08b5cbff,
-    0x0966cf3f, 0x0a214acf, 0x0ae5603f, 0x0bb34a3f, 0x0c8b2a6f, 0x0d6d223f,
-    0x0e594aef, 0x0f4fc60f, 0x1050939f, 0x115bcc9f, 0x127179bf, 0x1391925f,
-    0x14bc169f, 0x15f0ed3f, 0x1730163f, 0x1879701f, 0x19ccd0ff, 0x1b2a1f7f,
-    0x1c91211f, 0x1e01abdf, 0x1f7b741f, 0x20fe477f, 0x2289d27f, 0x241dc93f,
-    0x25b9cf7f, 0x275d91bf, 0x2908aabf, 0x2abaa57f, 0x2c73257f, 0x2e31ad3f,
-    0x2ff5c6bf, 0x31bef47f, 0x338cb07f, 0x355e7c7f, 0x3733ca3f, 0x390c133f,
-    0x3ae6c07f, 0x3cc343bf, 0x3ea10dff, 0x407f7fff, 0x425e0b7f, 0x443c20ff,
-    0x461921ff, 0x47f476ff, 0x49cd897f, 0x4ba3d2ff, 0x4d76b37f, 0x4f45ae7f,
-    0x5110237f, 0x52d594ff, 0x54957cff, 0x564f5cff, 0x5802afff, 0x59af0fff,
-    0x5b53f7ff, 0x5cf10a7f, 0x5e85db7f, 0x60120dff, 0x61954e7f, 0x630f387f,
-    0x647f98ff, 0x65e61cff, 0x674288ff, 0x6894aaff, 0x69dc58ff, 0x6b19697f,
-    0x6c4bc27f, 0x6d7342ff, 0x6e8feaff, 0x6fa1a8ff, 0x70a8867f, 0x71a482ff,
-    0x7295a6ff, 0x737c137f, 0x7457d9ff, 0x752923ff, 0x75f01b7f, 0x76ace27f,
-    0x775fb2ff, 0x7808bfff, 0x78a84bff, 0x793e9a7f, 0x79cbdd7f, 0x7a5071ff,
-    0x7acc91ff, 0x7b4091ff, 0x7bacbc7f, 0x7c11667f, 0x7c6ee2ff, 0x7cc57dff,
-    0x7d1593ff, 0x7d5f6fff, 0x7da36dff, 0x7de1da7f, 0x7e1affff, 0x7e4f3b7f,
-    0x7e7ecfff, 0x7eaa10ff, 0x7ed149ff, 0x7ef4be7f, 0x7f14b9ff, 0x7f31767f,
-    0x7f4b37ff, 0x7f62497f, 0x7f76ccff, 0x7f890d7f, 0x7f9934ff, 0x7fa77e7f,
-    0x7fb40aff, 0x7fbf0dff, 0x7fc8afff, 0x7fd10aff, 0x7fd8517f, 0x7fde9bff,
-    0x7fe403ff, 0x7fe8a2ff, 0x7fec99ff, 0x7feff9ff, 0x7ff2cb7f, 0x7ff52fff,
-    0x7ff737ff, 0x7ff8e37f, 0x7ffa43ff, 0x7ffb697f, 0x7ffc5cff, 0x7ffd1dff,
-    0x7ffdbcff, 0x7ffe437f, 0x7ffea7ff, 0x7ffefbff, 0x7fff367f, 0x7fff68ff,
-    0x7fff92ff, 0x7fffabff, 0x7fffc57f, 0x7fffd5ff, 0x7fffde7f, 0x7fffeeff,
-    0x7fffeeff, 0x7ffff77f, 0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff,
-    0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
+  0x00012dfd, 0x000296b3, 0x00047d3d, 0x0006f262, 0x000a0f4d, 0x000ded28,
+  0x0012a51e, 0x0018611f, 0x001f31f4, 0x002749f0, 0x0030c23f, 0x003bcd35,
+  0x004894c4, 0x005742dc, 0x00680170, 0x007b0b38, 0x00908a25, 0x00a8c154,
+  0x00c3eb7c, 0x00e2328f, 0x0103ea6f, 0x01293d0f, 0x015275ed, 0x017fe089,
+  0x01b1af39, 0x01e835dd, 0x0223b793, 0x02647777, 0x02aac107, 0x02f6e827,
+  0x0349278f, 0x03a1cabf, 0x04012597, 0x04677b37, 0x04d50eb7, 0x054a2b9f,
+  0x05c714ff, 0x064c1657, 0x06d96a67, 0x076f5447, 0x080e064f, 0x08b5cbff,
+  0x0966cf3f, 0x0a214acf, 0x0ae5603f, 0x0bb34a3f, 0x0c8b2a6f, 0x0d6d223f,
+  0x0e594aef, 0x0f4fc60f, 0x1050939f, 0x115bcc9f, 0x127179bf, 0x1391925f,
+  0x14bc169f, 0x15f0ed3f, 0x1730163f, 0x1879701f, 0x19ccd0ff, 0x1b2a1f7f,
+  0x1c91211f, 0x1e01abdf, 0x1f7b741f, 0x20fe477f, 0x2289d27f, 0x241dc93f,
+  0x25b9cf7f, 0x275d91bf, 0x2908aabf, 0x2abaa57f, 0x2c73257f, 0x2e31ad3f,
+  0x2ff5c6bf, 0x31bef47f, 0x338cb07f, 0x355e7c7f, 0x3733ca3f, 0x390c133f,
+  0x3ae6c07f, 0x3cc343bf, 0x3ea10dff, 0x407f7fff, 0x425e0b7f, 0x443c20ff,
+  0x461921ff, 0x47f476ff, 0x49cd897f, 0x4ba3d2ff, 0x4d76b37f, 0x4f45ae7f,
+  0x5110237f, 0x52d594ff, 0x54957cff, 0x564f5cff, 0x5802afff, 0x59af0fff,
+  0x5b53f7ff, 0x5cf10a7f, 0x5e85db7f, 0x60120dff, 0x61954e7f, 0x630f387f,
+  0x647f98ff, 0x65e61cff, 0x674288ff, 0x6894aaff, 0x69dc58ff, 0x6b19697f,
+  0x6c4bc27f, 0x6d7342ff, 0x6e8feaff, 0x6fa1a8ff, 0x70a8867f, 0x71a482ff,
+  0x7295a6ff, 0x737c137f, 0x7457d9ff, 0x752923ff, 0x75f01b7f, 0x76ace27f,
+  0x775fb2ff, 0x7808bfff, 0x78a84bff, 0x793e9a7f, 0x79cbdd7f, 0x7a5071ff,
+  0x7acc91ff, 0x7b4091ff, 0x7bacbc7f, 0x7c11667f, 0x7c6ee2ff, 0x7cc57dff,
+  0x7d1593ff, 0x7d5f6fff, 0x7da36dff, 0x7de1da7f, 0x7e1affff, 0x7e4f3b7f,
+  0x7e7ecfff, 0x7eaa10ff, 0x7ed149ff, 0x7ef4be7f, 0x7f14b9ff, 0x7f31767f,
+  0x7f4b37ff, 0x7f62497f, 0x7f76ccff, 0x7f890d7f, 0x7f9934ff, 0x7fa77e7f,
+  0x7fb40aff, 0x7fbf0dff, 0x7fc8afff, 0x7fd10aff, 0x7fd8517f, 0x7fde9bff,
+  0x7fe403ff, 0x7fe8a2ff, 0x7fec99ff, 0x7feff9ff, 0x7ff2cb7f, 0x7ff52fff,
+  0x7ff737ff, 0x7ff8e37f, 0x7ffa43ff, 0x7ffb697f, 0x7ffc5cff, 0x7ffd1dff,
+  0x7ffdbcff, 0x7ffe437f, 0x7ffea7ff, 0x7ffefbff, 0x7fff367f, 0x7fff68ff,
+  0x7fff92ff, 0x7fffabff, 0x7fffc57f, 0x7fffd5ff, 0x7fffde7f, 0x7fffeeff,
+  0x7fffeeff, 0x7ffff77f, 0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff,
+  0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
 
 const WORD32 ixheaacd_kbd_win96[96] = {
-    0x0001abd1, 0x00057082, 0x000ba1f4, 0x001511df, 0x0022ab25, 0x00359bc3,
-    0x004f11b5, 0x0070867a, 0x009b7bf1, 0x00d1b716, 0x01150549, 0x0167663f,
-    0x01caf2d7, 0x0241d4b7, 0x02ce570f, 0x0372bcb3, 0x043150d7, 0x050c5eaf,
-    0x06061847, 0x0720a73f, 0x085dfa7f, 0x09bfe7df, 0x0b480a5f, 0x0cf7b17f,
-    0x0ecff21f, 0x10d184bf, 0x12fcc5bf, 0x1551bd5f, 0x17cffebf, 0x1a76c05f,
-    0x1d44c37f, 0x203864bf, 0x234f7a7f, 0x268797ff, 0x29ddca3f, 0x2d4ed2bf,
-    0x30d70e7f, 0x34729f3f, 0x381d53bf, 0x3bd2bf3f, 0x3f8e6cff, 0x434ba4ff,
-    0x4705b7ff, 0x4ab8067f, 0x4e5de9ff, 0x51f2f57f, 0x5572de7f, 0x58d9ad7f,
-    0x5c239e7f, 0x5f4d617f, 0x6253eaff, 0x6534b4ff, 0x67eda67f, 0x6a7d137f,
-    0x6ce1d67f, 0x6f1b2e7f, 0x7128f17f, 0x730b527f, 0x74c2efff, 0x7650deff,
-    0x77b6887f, 0x78f5a0ff, 0x7a10387f, 0x7b0880ff, 0x7be0deff, 0x7c9bd7ff,
-    0x7d3c037f, 0x7dc3f7ff, 0x7e364bff, 0x7e957cff, 0x7ee3e6ff, 0x7f23dd7f,
-    0x7f57687f, 0x7f80777f, 0x7fa0ceff, 0x7fb9e8ff, 0x7fcd24ff, 0x7fdbb17f,
-    0x7fe6817f, 0x7fee677f, 0x7ff41aff, 0x7ff8227f, 0x7ffae37f, 0x7ffcc9ff,
-    0x7ffe087f, 0x7ffed1ff, 0x7fff4fff, 0x7fffa37f, 0x7fffcd7f, 0x7fffe6ff,
-    0x7ffff77f, 0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
+  0x0001abd1, 0x00057082, 0x000ba1f4, 0x001511df, 0x0022ab25, 0x00359bc3,
+  0x004f11b5, 0x0070867a, 0x009b7bf1, 0x00d1b716, 0x01150549, 0x0167663f,
+  0x01caf2d7, 0x0241d4b7, 0x02ce570f, 0x0372bcb3, 0x043150d7, 0x050c5eaf,
+  0x06061847, 0x0720a73f, 0x085dfa7f, 0x09bfe7df, 0x0b480a5f, 0x0cf7b17f,
+  0x0ecff21f, 0x10d184bf, 0x12fcc5bf, 0x1551bd5f, 0x17cffebf, 0x1a76c05f,
+  0x1d44c37f, 0x203864bf, 0x234f7a7f, 0x268797ff, 0x29ddca3f, 0x2d4ed2bf,
+  0x30d70e7f, 0x34729f3f, 0x381d53bf, 0x3bd2bf3f, 0x3f8e6cff, 0x434ba4ff,
+  0x4705b7ff, 0x4ab8067f, 0x4e5de9ff, 0x51f2f57f, 0x5572de7f, 0x58d9ad7f,
+  0x5c239e7f, 0x5f4d617f, 0x6253eaff, 0x6534b4ff, 0x67eda67f, 0x6a7d137f,
+  0x6ce1d67f, 0x6f1b2e7f, 0x7128f17f, 0x730b527f, 0x74c2efff, 0x7650deff,
+  0x77b6887f, 0x78f5a0ff, 0x7a10387f, 0x7b0880ff, 0x7be0deff, 0x7c9bd7ff,
+  0x7d3c037f, 0x7dc3f7ff, 0x7e364bff, 0x7e957cff, 0x7ee3e6ff, 0x7f23dd7f,
+  0x7f57687f, 0x7f80777f, 0x7fa0ceff, 0x7fb9e8ff, 0x7fcd24ff, 0x7fdbb17f,
+  0x7fe6817f, 0x7fee677f, 0x7ff41aff, 0x7ff8227f, 0x7ffae37f, 0x7ffcc9ff,
+  0x7ffe087f, 0x7ffed1ff, 0x7fff4fff, 0x7fffa37f, 0x7fffcd7f, 0x7fffe6ff,
+  0x7ffff77f, 0x7ffff77f, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff};
 
 const WORD32 ixheaacd_kbd_win48[48] = {
-    0x000257ef, 0x000eb8da, 0x0029a9c3, 0x005c2d23, 0x00b19012, 0x0137851d,
-    0x01fddfc9, 0x0316102f, 0x04926117, 0x0684ff27, 0x08fed5af, 0x0c0e533f,
-    0x0fbe2c0f, 0x1414349f, 0x19106c7f, 0x1eac53df, 0x24da9d7f, 0x2b874cff,
-    0x3298467f, 0x39ee4b7f, 0x41665bff, 0x48db617f, 0x50280e7f, 0x5728c9ff,
-    0x5dbd86ff, 0x63cb63ff, 0x693def7f, 0x6e07fb7f, 0x7223ed7f, 0x759381ff,
-    0x785f127f, 0x7a9467ff, 0x7c453f7f, 0x7d85a5ff, 0x7e6a537f, 0x7f0737ff,
-    0x7f6e547f, 0x7faefb7f, 0x7fd577ff, 0x7feb177f, 0x7ff6797f, 0x7ffc087f,
-    0x7ffe84ff, 0x7fff84ff, 0x7fffdeff, 0x7ffff8ff, 0x7ffffeff, 0x7fffffff};
+  0x000257ef, 0x000eb8da, 0x0029a9c3, 0x005c2d23, 0x00b19012, 0x0137851d,
+  0x01fddfc9, 0x0316102f, 0x04926117, 0x0684ff27, 0x08fed5af, 0x0c0e533f,
+  0x0fbe2c0f, 0x1414349f, 0x19106c7f, 0x1eac53df, 0x24da9d7f, 0x2b874cff,
+  0x3298467f, 0x39ee4b7f, 0x41665bff, 0x48db617f, 0x50280e7f, 0x5728c9ff,
+  0x5dbd86ff, 0x63cb63ff, 0x693def7f, 0x6e07fb7f, 0x7223ed7f, 0x759381ff,
+  0x785f127f, 0x7a9467ff, 0x7c453f7f, 0x7d85a5ff, 0x7e6a537f, 0x7f0737ff,
+  0x7f6e547f, 0x7faefb7f, 0x7fd577ff, 0x7feb177f, 0x7ff6797f, 0x7ffc087f,
+  0x7ffe84ff, 0x7fff84ff, 0x7fffdeff, 0x7ffff8ff, 0x7ffffeff, 0x7fffffff};
 
 const FLOAT32 mean_lsf_conc[16] = {
-    415.8089f,  810.0709f,  1291.5637f, 1674.4192f, 2077.4895f, 2464.5791f,
-    2841.3894f, 3217.6775f, 3587.4265f, 3976.9675f, 4366.0098f, 4766.7573f,
-    5149.4009f, 5545.2534f, 5918.0859f, 1577.0078f};
+  415.8089f,  810.0709f,  1291.5637f, 1674.4192f, 2077.4895f, 2464.5791f,
+  2841.3894f, 3217.6775f, 3587.4265f, 3976.9675f, 4366.0098f, 4766.7573f,
+  5149.4009f, 5545.2534f, 5918.0859f, 1577.0078f};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_512[4][512] = {
-    {2147483015, 2147467855, 2147432483, 2147376898, 2147301101, 2147205093,
-     2147088874, 2146952447, 2146795811, 2146618969, 2146421922, 2146204673,
-     2145967222, 2145709573, 2145431727, 2145133688, 2144815458, 2144477040,
-     2144118438, 2143739654, 2143340693, 2142921558, 2142482252, 2142022781,
-     2141543148, 2141043359, 2140523417, 2139983327, 2139423095, 2138842727,
-     2138242226, 2137621600, 2136980853, 2136319993, 2135639024, 2134937954,
-     2134216790, 2133475537, 2132714203, 2131932795, 2131131321, 2130309787,
-     2129468203, 2128606574, 2127724911, 2126823221, 2125901512, 2124959794,
-     2123998074, 2123016363, 2122014669, 2120993002, 2119951371, 2118889786,
-     2117808258, 2116706796, 2115585411, 2114444113, 2113282913, 2112101822,
-     2110900851, 2109680012, 2108439315, 2107178773, 2105898398, 2104598201,
-     2103278194, 2101938391, 2100578804, 2099199445, 2097800328, 2096381465,
-     2094942870, 2093484557, 2092006540, 2090508831, 2088991446, 2087454399,
-     2085897703, 2084321375, 2082725428, 2081109877, 2079474738, 2077820027,
-     2076145758, 2074451948, 2072738612, 2071005767, 2069253429, 2067481614,
-     2065690339, 2063879622, 2062049478, 2060199925, 2058330981, 2056442663,
-     2054534990, 2052607978, 2050661646, 2048696012, 2046711096, 2044706915,
-     2042683488, 2040640835, 2038578975, 2036497927, 2034397710, 2032278345,
-     2030139852, 2027982250, 2025805559, 2023609802, 2021394997, 2019161166,
-     2016908330, 2014636510, 2012345727, 2010036004, 2007707361, 2005359821,
-     2002993406, 2000608137, 1998204039, 1995781132, 1993339441, 1990878987,
-     1988399795, 1985901886, 1983385286, 1980850018, 1978296105, 1975723571,
-     1973132441, 1970522740, 1967894491, 1965247719, 1962582450, 1959898708,
-     1957196519, 1954475908, 1951736901, 1948979523, 1946203800, 1943409760,
-     1940597427, 1937766828, 1934917991, 1932050941, 1929165706, 1926262314,
-     1923340790, 1920401163, 1917443461, 1914467711, 1911473941, 1908462180,
-     1905432455, 1902384796, 1899319231, 1896235789, 1893134498, 1890015389,
-     1886878490, 1883723832, 1880551443, 1877361353, 1874153593, 1870928193,
-     1867685183, 1864424593, 1861146455, 1857850799, 1854537656, 1851207058,
-     1847859035, 1844493620, 1841110843, 1837710737, 1834293334, 1830858666,
-     1827406765, 1823937664, 1820451396, 1816947992, 1813427487, 1809889913,
-     1806335304, 1802763693, 1799175113, 1795569599, 1791947185, 1788307904,
-     1784651790, 1780978879, 1777289205, 1773582802, 1769859705, 1766119950,
-     1762363572, 1758590605, 1754801086, 1750995050, 1747172533, 1743333571,
-     1739478200, 1735606457, 1731718377, 1727813998, 1723893355, 1719956487,
-     1716003430, 1712034221, 1708048898, 1704047499, 1700030060, 1695996619,
-     1691947216, 1687881887, 1683800671, 1679703606, 1675590732, 1671462086,
-     1667317708, 1663157636, 1658981910, 1654790569, 1650583653, 1646361200,
-     1642123252, 1637869847, 1633601026, 1629316829, 1625017296, 1620702468,
-     1616372385, 1612027088, 1607666618, 1603291017, 1598900324, 1594494582,
-     1590073832, 1585638116, 1581187475, 1576721951, 1572241587, 1567746424,
-     1563236505, 1558711872, 1554172567, 1549618635, 1545050117, 1540467056,
-     1535869495, 1531257479, 1526631050, 1521990251, 1517335127, 1512665721,
-     1507982078, 1503284241, 1498572254, 1493846162, 1489106009, 1484351841,
-     1479583701, 1474801635, 1470005687, 1465195903, 1460372328, 1455535008,
-     1450683987, 1445819312, 1440941029, 1436049183, 1431143820, 1426224987,
-     1421292729, 1416347094, 1411388127, 1406415876, 1401430388, 1396431708,
-     1391419885, 1386394965, 1381356996, 1376306025, 1371242100, 1366165268,
-     1361075577, 1355973076, 1350857811, 1345729832, 1340589186, 1335435922,
-     1330270088, 1325091733, 1319900906, 1314697656, 1309482031, 1304254081,
-     1299013854, 1293761401, 1288496771, 1283220012, 1277931176, 1272630311,
-     1267317467, 1261992696, 1256656045, 1251307567, 1245947311, 1240575328,
-     1235191667, 1229796381, 1224389520, 1218971133, 1213541274, 1208099992,
-     1202647339, 1197183367, 1191708126, 1186221668, 1180724045, 1175215309,
-     1169695511, 1164164703, 1158622938, 1153070268, 1147506744, 1141932419,
-     1136347347, 1130751578, 1125145167, 1119528165, 1113900626, 1108262602,
-     1102614147, 1096955313, 1091286155, 1085606725, 1079917077, 1074217265,
-     1068507341, 1062787360, 1057057376, 1051317442, 1045567614, 1039807943,
-     1034038486, 1028259296, 1022470427, 1016671935, 1010863874, 1005046297,
-     999219261,  993382820,  987537029,  981681942,  975817616,  969944105,
-     964061464,  958169750,  952269016,  946359320,  940440716,  934513260,
-     928577009,  922632017,  916678341,  910716037,  904745160,  898765769,
-     892777917,  886781662,  880777061,  874764170,  868743044,  862713742,
-     856676320,  850630834,  844577342,  838515900,  832446566,  826369397,
-     820284450,  814191781,  808091449,  801983512,  795868025,  789745048,
-     783614637,  777476851,  771331746,  765179382,  759019815,  752853104,
-     746679307,  740498482,  734310687,  728115981,  721914421,  715706067,
-     709490975,  703269206,  697040818,  690805868,  684564417,  678316522,
-     672062242,  665801637,  659534765,  653261685,  646982457,  640697138,
-     634405790,  628108470,  621805238,  615496153,  609181275,  602860664,
-     596534378,  590202477,  583865021,  577522069,  571173681,  564819918,
-     558460838,  552096501,  545726969,  539352299,  532972553,  526587790,
-     520198071,  513803456,  507404004,  500999777,  494590834,  488177236,
-     481759043,  475336315,  468909113,  462477498,  456041530,  449601269,
-     443156776,  436708113,  430255339,  423798515,  417337702,  410872961,
-     404404353,  397931938,  391455778,  384975933,  378492465,  372005434,
-     365514902,  359020929,  352523578,  346022908,  339518981,  333011858,
-     326501601,  319988271,  313471929,  306952637,  300430455,  293905446,
-     287377670,  280847190,  274314066,  267778360,  261240133,  254699448,
-     248156365,  241610947,  235063254,  228513349,  221961293,  215407148,
-     208850976,  202292837,  195732795,  189170910,  182607245,  176041861,
-     169474820,  162906184,  156336014,  149764373,  143191322,  136616924,
-     130041240,  123464331,  116886261,  110307090,  103726882,  97145696,
-     90563597,   83980645,   77396903,   70812432,   64227294,   57641552,
-     51055268,   44468503,   37881319,   31293779,   24705944,   18117877,
-     11529639,   4941293},
-    {-1647099,    -8235476,    -14823776,   -21411936,   -27999895,
-     -34587590,   -41174959,   -47761942,   -54348474,   -60934495,
-     -67519942,   -74104754,   -80688869,   -87272224,   -93854757,
-     -100436407,  -107017112,  -113596809,  -120175438,  -126752935,
-     -133329239,  -139904288,  -146478020,  -153050374,  -159621287,
-     -166190697,  -172758544,  -179324764,  -185889296,  -192452079,
-     -199013050,  -205572148,  -212129312,  -218684478,  -225237586,
-     -231788574,  -238337381,  -244883944,  -251428202,  -257970094,
-     -264509558,  -271046532,  -277580954,  -284112764,  -290641900,
-     -297168300,  -303691903,  -310212648,  -316730473,  -323245317,
-     -329757118,  -336265815,  -342771348,  -349273654,  -355772672,
-     -362268342,  -368760602,  -375249391,  -381734648,  -388216312,
-     -394694322,  -401168617,  -407639136,  -414105819,  -420568603,
-     -427027429,  -433482236,  -439932962,  -446379548,  -452821932,
-     -459260054,  -465693853,  -472123270,  -478548242,  -484968710,
-     -491384613,  -497795891,  -504202484,  -510604331,  -517001372,
-     -523393547,  -529780795,  -536163057,  -542540272,  -548912381,
-     -555279323,  -561641039,  -567997468,  -574348551,  -580694228,
-     -587034439,  -593369125,  -599698226,  -606021683,  -612339435,
-     -618651423,  -624957589,  -631257872,  -637552214,  -643840555,
-     -650122836,  -656398997,  -662668981,  -668932727,  -675190176,
-     -681441271,  -687685951,  -693924159,  -700155836,  -706380922,
-     -712599359,  -718811090,  -725016054,  -731214195,  -737405452,
-     -743589770,  -749767088,  -755937349,  -762100495,  -768256468,
-     -774405209,  -780546662,  -786680768,  -792807469,  -798926708,
-     -805038428,  -811142570,  -817239077,  -823327892,  -829408958,
-     -835482216,  -841547611,  -847605085,  -853654581,  -859696043,
-     -865729412,  -871754633,  -877771648,  -883780402,  -889780837,
-     -895772897,  -901756525,  -907731667,  -913698264,  -919656261,
-     -925605602,  -931546230,  -937478091,  -943401128,  -949315285,
-     -955220507,  -961116738,  -967003922,  -972882005,  -978750931,
-     -984610644,  -990461090,  -996302213,  -1002133958, -1007956271,
-     -1013769097, -1019572381, -1025366068, -1031150104, -1036924435,
-     -1042689005, -1048443762, -1054188650, -1059923615, -1065648604,
-     -1071363563, -1077068438, -1082763175, -1088447721, -1094122022,
-     -1099786024, -1105439675, -1111082921, -1116715709, -1122337986,
-     -1127949700, -1133550796, -1139141223, -1144720928, -1150289859,
-     -1155847963, -1161395187, -1166931480, -1172456789, -1177971063,
-     -1183474249, -1188966296, -1194447152, -1199916765, -1205375084,
-     -1210822058, -1216257635, -1221681764, -1227094394, -1232495474,
-     -1237884954, -1243262782, -1248628908, -1253983282, -1259325852,
-     -1264656569, -1269975383, -1275282244, -1280577101, -1285859904,
-     -1291130605, -1296389153, -1301635499, -1306869593, -1312091387,
-     -1317300831, -1322497876, -1327682472, -1332854573, -1338014128,
-     -1343161089, -1348295408, -1353417036, -1358525925, -1363622027,
-     -1368705294, -1373775679, -1378833133, -1383877609, -1388909059,
-     -1393927437, -1398932694, -1403924784, -1408903660, -1413869274,
-     -1418821581, -1423760533, -1428686084, -1433598188, -1438496798,
-     -1443381869, -1448253354, -1453111207, -1457955383, -1462785837,
-     -1467602522, -1472405393, -1477194406, -1481969514, -1486730674,
-     -1491477840, -1496210968, -1500930013, -1505634931, -1510325677,
-     -1515002207, -1519664477, -1524312444, -1528946063, -1533565291,
-     -1538170085, -1542760401, -1547336196, -1551897427, -1556444051,
-     -1560976025, -1565493306, -1569995852, -1574483621, -1578956571,
-     -1583414658, -1587857842, -1592286081, -1596699332, -1601097554,
-     -1605480706, -1609848747, -1614201636, -1618539331, -1622861791,
-     -1627168977, -1631460847, -1635737361, -1639998479, -1644244161,
-     -1648474366, -1652689055, -1656888189, -1661071727, -1665239631,
-     -1669391861, -1673528378, -1677649143, -1681754117, -1685843262,
-     -1689916539, -1693973910, -1698015337, -1702040782, -1706050206,
-     -1710043572, -1714020842, -1717981980, -1721926947, -1725855707,
-     -1729768222, -1733664457, -1737544373, -1741407935, -1745255106,
-     -1749085850, -1752900131, -1756697913, -1760479160, -1764243837,
-     -1767991908, -1771723338, -1775438092, -1779136135, -1782817432,
-     -1786481949, -1790129650, -1793760503, -1797374471, -1800971522,
-     -1804551622, -1808114736, -1811660832, -1815189875, -1818701834,
-     -1822196674, -1825674363, -1829134868, -1832578156, -1836004196,
-     -1839412954, -1842804399, -1846178499, -1849535222, -1852874537,
-     -1856196411, -1859500815, -1862787716, -1866057083, -1869308887,
-     -1872543096, -1875759680, -1878958608, -1882139852, -1885303379,
-     -1888449162, -1891577169, -1894687373, -1897779743, -1900854250,
-     -1903910866, -1906949561, -1909970307, -1912973077, -1915957840,
-     -1918924570, -1921873238, -1924803816, -1927716278, -1930610595,
-     -1933486741, -1936344688, -1939184409, -1942005878, -1944809068,
-     -1947593953, -1950360506, -1953108702, -1955838514, -1958549918,
-     -1961242886, -1963917395, -1966573418, -1969210932, -1971829910,
-     -1974430329, -1977012164, -1979575390, -1982119984, -1984645921,
-     -1987153178, -1989641732, -1992111558, -1994562633, -1996994935,
-     -1999408441, -2001803127, -2004178971, -2006535952, -2008874046,
-     -2011193232, -2013493487, -2015774791, -2018037122, -2020280458,
-     -2022504779, -2024710063, -2026896289, -2029063438, -2031211488,
-     -2033340420, -2035450213, -2037540848, -2039612305, -2041664564,
-     -2043697606, -2045711412, -2047705963, -2049681241, -2051637226,
-     -2053573900, -2055491245, -2057389243, -2059267876, -2061127127,
-     -2062966977, -2064787410, -2066588408, -2068369955, -2070132034,
-     -2071874627, -2073597720, -2075301295, -2076985336, -2078649828,
-     -2080294755, -2081920102, -2083525853, -2085111992, -2086678506,
-     -2088225379, -2089752597, -2091260146, -2092748011, -2094216178,
-     -2095664633, -2097093364, -2098502355, -2099891595, -2101261070,
-     -2102610767, -2103940673, -2105250776, -2106541064, -2107811524,
-     -2109062145, -2110292914, -2111503821, -2112694853, -2113866000,
-     -2115017250, -2116148593, -2117260018, -2118351514, -2119423072,
-     -2120474681, -2121506331, -2122518013, -2123509717, -2124481433,
-     -2125433154, -2126364868, -2127276569, -2128168247, -2129039893,
-     -2129891501, -2130723061, -2131534566, -2132326008, -2133097379,
-     -2133848674, -2134579883, -2135291001, -2135982021, -2136652937,
-     -2137303741, -2137934428, -2138544992, -2139135428, -2139705729,
-     -2140255890, -2140785906, -2141295773, -2141785485, -2142255037,
-     -2142704426, -2143133647, -2143542696, -2143931569, -2144300262,
-     -2144648773, -2144977097, -2145285232, -2145573174, -2145840922,
-     -2146088472, -2146315823, -2146522971, -2146709916, -2146876655,
-     -2147023187, -2147149510, -2147255623, -2147341526, -2147407217,
-     -2147452695, -2147477962},
-    {2147483647, 2147473540, 2147443221, 2147392689, 2147321945, 2147230990,
-     2147119824, 2146988448, 2146836865, 2146665074, 2146473078, 2146260879,
-     2146028478, 2145775879, 2145503082, 2145210091, 2144896908, 2144563537,
-     2144209981, 2143836242, 2143442325, 2143028233, 2142593969, 2142139539,
-     2141664947, 2141170196, 2140655291, 2140120238, 2139565041, 2138989706,
-     2138394238, 2137778643, 2137142926, 2136487093, 2135811151, 2135115106,
-     2134398964, 2133662733, 2132906418, 2132130028, 2131333570, 2130517051,
-     2129680478, 2128823860, 2127947205, 2127050521, 2126133816, 2125197099,
-     2124240379, 2123263664, 2122266965, 2121250290, 2120213650, 2119157053,
-     2118080509, 2116984030, 2115867624, 2114731304, 2113575078, 2112398959,
-     2111202957, 2109987084, 2108751350, 2107495769, 2106220350, 2104925108,
-     2103610052, 2102275197, 2100920555, 2099546137, 2098151959, 2096738031,
-     2095304368, 2093850983, 2092377891, 2090885104, 2089372636, 2087840503,
-     2086288718, 2084717297, 2083126253, 2081515602, 2079885359, 2078235539,
-     2076566158, 2074877232, 2073168776, 2071440807, 2069693340, 2067926393,
-     2066139982, 2064334123, 2062508834, 2060664132, 2058800034, 2056916558,
-     2055013722, 2053091543, 2051150039, 2049189229, 2047209132, 2045209765,
-     2043191148, 2041153300, 2039096240, 2037019987, 2034924560, 2032809981,
-     2030676267, 2028523440, 2026351520, 2024160527, 2021950482, 2019721406,
-     2017473319, 2015206243, 2012920199, 2010615209, 2008291294, 2005948476,
-     2003586778, 2001206221, 1998806828, 1996388621, 1993951623, 1991495858,
-     1989021348, 1986528117, 1984016187, 1981485584, 1978936329, 1976368449,
-     1973781966, 1971176905, 1968553290, 1965911147, 1963250500, 1960571374,
-     1957873794, 1955157786, 1952423376, 1949670588, 1946899449, 1944109986,
-     1941302224, 1938476189, 1935631909, 1932769410, 1929888719, 1926989863,
-     1924072869, 1921137766, 1918184579, 1915213339, 1912224071, 1909216805,
-     1906191569, 1903148391, 1900087299, 1897008324, 1893911493, 1890796835,
-     1887664381, 1884514160, 1881346200, 1878160533, 1874957188, 1871736195,
-     1868497584, 1865241387, 1861967633, 1858676353, 1855367579, 1852041342,
-     1848697672, 1845336602, 1841958163, 1838562387, 1835149305, 1831718950,
-     1828271354, 1824806550, 1821324571, 1817825448, 1814309215, 1810775905,
-     1807225552, 1803658188, 1800073847, 1796472564, 1792854371, 1789219303,
-     1785567395, 1781898680, 1778213193, 1774510969, 1770792043, 1767056449,
-     1763304223, 1759535400, 1755750016, 1751948106, 1748129706, 1744294851,
-     1740443579, 1736575926, 1732691926, 1728791618, 1724875039, 1720942223,
-     1716993210, 1713028036, 1709046738, 1705049354, 1701035921, 1697006477,
-     1692961061, 1688899710, 1684822462, 1680729356, 1676620430, 1672495724,
-     1668355275, 1664199123, 1660027307, 1655839866, 1651636840, 1647418268,
-     1643184190, 1638934645, 1634669674, 1630389317, 1626093615, 1621782607,
-     1617456334, 1613114836, 1608758156, 1604386334, 1599999410, 1595597426,
-     1591180424, 1586748446, 1582301532, 1577839725, 1573363067, 1568871600,
-     1564365365, 1559844407, 1555308767, 1550758487, 1546193611, 1541614182,
-     1537020242, 1532411836, 1527789006, 1523151796, 1518500249, 1513834409,
-     1509154321, 1504460028, 1499751575, 1495029005, 1490292363, 1485541694,
-     1480777043, 1475998454, 1471205973, 1466399644, 1461579512, 1456745624,
-     1451898024, 1447036759, 1442161873, 1437273413, 1432371425, 1427455955,
-     1422527049, 1417584754, 1412629116, 1407660182, 1402677998, 1397682612,
-     1392674071, 1387652420, 1382617709, 1377569984, 1372509293, 1367435684,
-     1362349203, 1357249900, 1352137821, 1347013016, 1341875532, 1336725418,
-     1331562722, 1326387493, 1321199779, 1315999630, 1310787094, 1305562221,
-     1300325059, 1295075658, 1289814067, 1284540336, 1279254514, 1273956652,
-     1268646799, 1263325004, 1257991319, 1252645793, 1247288476, 1241919420,
-     1236538674, 1231146290, 1225742317, 1220326808, 1214899812, 1209461381,
-     1204011566, 1198550418, 1193077990, 1187594331, 1182099495, 1176593532,
-     1171076494, 1165548434, 1160009404, 1154459455, 1148898639, 1143327010,
-     1137744620, 1132151520, 1126547764, 1120933405, 1115308495, 1109673088,
-     1104027236, 1098370992, 1092704410, 1087027543, 1081340444, 1075643168,
-     1069935767, 1064218295, 1058490807, 1052753356, 1047005996, 1041248781,
-     1035481765, 1029705003, 1023918549, 1018122458, 1012316783, 1006501580,
-     1000676904, 994842809,  988999350,  983146582,  977284561,  971413341,
-     965532977,  959643526,  953745042,  947837581,  941921199,  935995951,
-     930061893,  924119081,  918167571,  912207418,  906238680,  900261412,
-     894275670,  888281511,  882278991,  876268167,  870249094,  864221831,
-     858186434,  852142958,  846091463,  840032003,  833964637,  827889421,
-     821806412,  815715669,  809617248,  803511206,  797397601,  791276491,
-     785147933,  779011985,  772868705,  766718150,  760560379,  754395449,
-     748223418,  742044344,  735858286,  729665302,  723465451,  717258789,
-     711045377,  704825271,  698598532,  692365217,  686125386,  679879096,
-     673626407,  667367378,  661102067,  654830534,  648552837,  642269036,
-     635979189,  629683356,  623381597,  617073970,  610760535,  604441351,
-     598116478,  591785975,  585449902,  579108319,  572761285,  566408859,
-     560051103,  553688075,  547319836,  540946445,  534567962,  528184448,
-     521795962,  515402565,  509004317,  502601278,  496193509,  489781068,
-     483364018,  476942419,  470516330,  464085812,  457650927,  451211733,
-     444768293,  438320666,  431868914,  425413097,  418953276,  412489511,
-     406021864,  399550395,  393075166,  386596236,  380113668,  373627522,
-     367137860,  360644742,  354148229,  347648383,  341145265,  334638935,
-     328129456,  321616889,  315101294,  308582733,  302061268,  295536960,
-     289009870,  282480060,  275947591,  269412525,  262874923,  256334846,
-     249792357,  243247517,  236700387,  230151030,  223599506,  217045877,
-     210490205,  203932553,  197372981,  190811551,  184248325,  177683365,
-     171116732,  164548489,  157978697,  151407418,  144834714,  138260647,
-     131685278,  125108670,  118530884,  111951983,  105372028,  98791081,
-     92209204,   85626459,   79042909,   72458614,   65873638,   59288041,
-     52701886,   46115236,   39528151,   32940694,   26352927,   19764912,
-     13176711,   6588386},
-    {0,           -6588386,    -13176711,   -19764912,   -26352927,
-     -32940694,   -39528151,   -46115236,   -52701886,   -59288041,
-     -65873638,   -72458614,   -79042909,   -85626459,   -92209204,
-     -98791081,   -105372028,  -111951983,  -118530884,  -125108670,
-     -131685278,  -138260647,  -144834714,  -151407418,  -157978697,
-     -164548489,  -171116732,  -177683365,  -184248325,  -190811551,
-     -197372981,  -203932553,  -210490205,  -217045877,  -223599506,
-     -230151030,  -236700387,  -243247517,  -249792357,  -256334846,
-     -262874923,  -269412525,  -275947591,  -282480060,  -289009870,
-     -295536960,  -302061268,  -308582733,  -315101294,  -321616889,
-     -328129456,  -334638935,  -341145265,  -347648383,  -354148229,
-     -360644742,  -367137860,  -373627522,  -380113668,  -386596236,
-     -393075166,  -399550395,  -406021864,  -412489511,  -418953276,
-     -425413097,  -431868914,  -438320666,  -444768293,  -451211733,
-     -457650927,  -464085812,  -470516330,  -476942419,  -483364018,
-     -489781068,  -496193509,  -502601278,  -509004317,  -515402565,
-     -521795962,  -528184448,  -534567962,  -540946445,  -547319836,
-     -553688075,  -560051103,  -566408859,  -572761285,  -579108319,
-     -585449902,  -591785975,  -598116478,  -604441351,  -610760535,
-     -617073970,  -623381597,  -629683356,  -635979189,  -642269036,
-     -648552837,  -654830534,  -661102067,  -667367378,  -673626407,
-     -679879096,  -686125386,  -692365217,  -698598532,  -704825271,
-     -711045377,  -717258789,  -723465451,  -729665302,  -735858286,
-     -742044344,  -748223418,  -754395449,  -760560379,  -766718150,
-     -772868705,  -779011985,  -785147933,  -791276491,  -797397601,
-     -803511206,  -809617248,  -815715669,  -821806412,  -827889421,
-     -833964637,  -840032003,  -846091463,  -852142958,  -858186434,
-     -864221831,  -870249094,  -876268167,  -882278991,  -888281511,
-     -894275670,  -900261412,  -906238680,  -912207418,  -918167571,
-     -924119081,  -930061893,  -935995951,  -941921199,  -947837581,
-     -953745042,  -959643526,  -965532977,  -971413341,  -977284561,
-     -983146582,  -988999350,  -994842809,  -1000676904, -1006501580,
-     -1012316783, -1018122458, -1023918549, -1029705003, -1035481765,
-     -1041248781, -1047005996, -1052753356, -1058490807, -1064218295,
-     -1069935767, -1075643168, -1081340444, -1087027543, -1092704410,
-     -1098370992, -1104027236, -1109673088, -1115308495, -1120933405,
-     -1126547764, -1132151520, -1137744620, -1143327010, -1148898639,
-     -1154459455, -1160009404, -1165548434, -1171076494, -1176593532,
-     -1182099495, -1187594331, -1193077990, -1198550418, -1204011566,
-     -1209461381, -1214899812, -1220326808, -1225742317, -1231146290,
-     -1236538674, -1241919420, -1247288476, -1252645793, -1257991319,
-     -1263325004, -1268646799, -1273956652, -1279254514, -1284540336,
-     -1289814067, -1295075658, -1300325059, -1305562221, -1310787094,
-     -1315999630, -1321199779, -1326387493, -1331562722, -1336725418,
-     -1341875532, -1347013016, -1352137821, -1357249900, -1362349203,
-     -1367435684, -1372509293, -1377569984, -1382617709, -1387652420,
-     -1392674071, -1397682612, -1402677998, -1407660182, -1412629116,
-     -1417584754, -1422527049, -1427455955, -1432371425, -1437273413,
-     -1442161873, -1447036759, -1451898024, -1456745624, -1461579512,
-     -1466399644, -1471205973, -1475998454, -1480777043, -1485541694,
-     -1490292363, -1495029005, -1499751575, -1504460028, -1509154321,
-     -1513834409, -1518500249, -1523151796, -1527789006, -1532411836,
-     -1537020242, -1541614182, -1546193611, -1550758487, -1555308767,
-     -1559844407, -1564365365, -1568871600, -1573363067, -1577839725,
-     -1582301532, -1586748446, -1591180424, -1595597426, -1599999410,
-     -1604386334, -1608758156, -1613114836, -1617456334, -1621782607,
-     -1626093615, -1630389317, -1634669674, -1638934645, -1643184190,
-     -1647418268, -1651636840, -1655839866, -1660027307, -1664199123,
-     -1668355275, -1672495724, -1676620430, -1680729356, -1684822462,
-     -1688899710, -1692961061, -1697006477, -1701035921, -1705049354,
-     -1709046738, -1713028036, -1716993210, -1720942223, -1724875039,
-     -1728791618, -1732691926, -1736575926, -1740443579, -1744294851,
-     -1748129706, -1751948106, -1755750016, -1759535400, -1763304223,
-     -1767056449, -1770792043, -1774510969, -1778213193, -1781898680,
-     -1785567395, -1789219303, -1792854371, -1796472564, -1800073847,
-     -1803658188, -1807225552, -1810775905, -1814309215, -1817825448,
-     -1821324571, -1824806550, -1828271354, -1831718950, -1835149305,
-     -1838562387, -1841958163, -1845336602, -1848697672, -1852041342,
-     -1855367579, -1858676353, -1861967633, -1865241387, -1868497584,
-     -1871736195, -1874957188, -1878160533, -1881346200, -1884514160,
-     -1887664381, -1890796835, -1893911493, -1897008324, -1900087299,
-     -1903148391, -1906191569, -1909216805, -1912224071, -1915213339,
-     -1918184579, -1921137766, -1924072869, -1926989863, -1929888719,
-     -1932769410, -1935631909, -1938476189, -1941302224, -1944109986,
-     -1946899449, -1949670588, -1952423376, -1955157786, -1957873794,
-     -1960571374, -1963250500, -1965911147, -1968553290, -1971176905,
-     -1973781966, -1976368449, -1978936329, -1981485584, -1984016187,
-     -1986528117, -1989021348, -1991495858, -1993951623, -1996388621,
-     -1998806828, -2001206221, -2003586778, -2005948476, -2008291294,
-     -2010615209, -2012920199, -2015206243, -2017473319, -2019721406,
-     -2021950482, -2024160527, -2026351520, -2028523440, -2030676267,
-     -2032809981, -2034924560, -2037019987, -2039096240, -2041153300,
-     -2043191148, -2045209765, -2047209132, -2049189229, -2051150039,
-     -2053091543, -2055013722, -2056916558, -2058800034, -2060664132,
-     -2062508834, -2064334123, -2066139982, -2067926393, -2069693340,
-     -2071440807, -2073168776, -2074877232, -2076566158, -2078235539,
-     -2079885359, -2081515602, -2083126253, -2084717297, -2086288718,
-     -2087840503, -2089372636, -2090885104, -2092377891, -2093850983,
-     -2095304368, -2096738031, -2098151959, -2099546137, -2100920555,
-     -2102275197, -2103610052, -2104925108, -2106220350, -2107495769,
-     -2108751350, -2109987084, -2111202957, -2112398959, -2113575078,
-     -2114731304, -2115867624, -2116984030, -2118080509, -2119157053,
-     -2120213650, -2121250290, -2122266965, -2123263664, -2124240379,
-     -2125197099, -2126133816, -2127050521, -2127947205, -2128823860,
-     -2129680478, -2130517051, -2131333570, -2132130028, -2132906418,
-     -2133662733, -2134398964, -2135115106, -2135811151, -2136487093,
-     -2137142926, -2137778643, -2138394238, -2138989706, -2139565041,
-     -2140120238, -2140655291, -2141170196, -2141664947, -2142139539,
-     -2142593969, -2143028233, -2143442325, -2143836242, -2144209981,
-     -2144563537, -2144896908, -2145210091, -2145503082, -2145775879,
-     -2146028478, -2146260879, -2146473078, -2146665074, -2146836865,
-     -2146988448, -2147119824, -2147230990, -2147321945, -2147392689,
-     -2147443221, -2147473540}};
+  {
+    2147483015, 2147467855, 2147432483, 2147376898, 2147301101, 2147205093,
+    2147088874, 2146952447, 2146795811, 2146618969, 2146421922, 2146204673,
+    2145967222, 2145709573, 2145431727, 2145133688, 2144815458, 2144477040,
+    2144118438, 2143739654, 2143340693, 2142921558, 2142482252, 2142022781,
+    2141543148, 2141043359, 2140523417, 2139983327, 2139423095, 2138842727,
+    2138242226, 2137621600, 2136980853, 2136319993, 2135639024, 2134937954,
+    2134216790, 2133475537, 2132714203, 2131932795, 2131131321, 2130309787,
+    2129468203, 2128606574, 2127724911, 2126823221, 2125901512, 2124959794,
+    2123998074, 2123016363, 2122014669, 2120993002, 2119951371, 2118889786,
+    2117808258, 2116706796, 2115585411, 2114444113, 2113282913, 2112101822,
+    2110900851, 2109680012, 2108439315, 2107178773, 2105898398, 2104598201,
+    2103278194, 2101938391, 2100578804, 2099199445, 2097800328, 2096381465,
+    2094942870, 2093484557, 2092006540, 2090508831, 2088991446, 2087454399,
+    2085897703, 2084321375, 2082725428, 2081109877, 2079474738, 2077820027,
+    2076145758, 2074451948, 2072738612, 2071005767, 2069253429, 2067481614,
+    2065690339, 2063879622, 2062049478, 2060199925, 2058330981, 2056442663,
+    2054534990, 2052607978, 2050661646, 2048696012, 2046711096, 2044706915,
+    2042683488, 2040640835, 2038578975, 2036497927, 2034397710, 2032278345,
+    2030139852, 2027982250, 2025805559, 2023609802, 2021394997, 2019161166,
+    2016908330, 2014636510, 2012345727, 2010036004, 2007707361, 2005359821,
+    2002993406, 2000608137, 1998204039, 1995781132, 1993339441, 1990878987,
+    1988399795, 1985901886, 1983385286, 1980850018, 1978296105, 1975723571,
+    1973132441, 1970522740, 1967894491, 1965247719, 1962582450, 1959898708,
+    1957196519, 1954475908, 1951736901, 1948979523, 1946203800, 1943409760,
+    1940597427, 1937766828, 1934917991, 1932050941, 1929165706, 1926262314,
+    1923340790, 1920401163, 1917443461, 1914467711, 1911473941, 1908462180,
+    1905432455, 1902384796, 1899319231, 1896235789, 1893134498, 1890015389,
+    1886878490, 1883723832, 1880551443, 1877361353, 1874153593, 1870928193,
+    1867685183, 1864424593, 1861146455, 1857850799, 1854537656, 1851207058,
+    1847859035, 1844493620, 1841110843, 1837710737, 1834293334, 1830858666,
+    1827406765, 1823937664, 1820451396, 1816947992, 1813427487, 1809889913,
+    1806335304, 1802763693, 1799175113, 1795569599, 1791947185, 1788307904,
+    1784651790, 1780978879, 1777289205, 1773582802, 1769859705, 1766119950,
+    1762363572, 1758590605, 1754801086, 1750995050, 1747172533, 1743333571,
+    1739478200, 1735606457, 1731718377, 1727813998, 1723893355, 1719956487,
+    1716003430, 1712034221, 1708048898, 1704047499, 1700030060, 1695996619,
+    1691947216, 1687881887, 1683800671, 1679703606, 1675590732, 1671462086,
+    1667317708, 1663157636, 1658981910, 1654790569, 1650583653, 1646361200,
+    1642123252, 1637869847, 1633601026, 1629316829, 1625017296, 1620702468,
+    1616372385, 1612027088, 1607666618, 1603291017, 1598900324, 1594494582,
+    1590073832, 1585638116, 1581187475, 1576721951, 1572241587, 1567746424,
+    1563236505, 1558711872, 1554172567, 1549618635, 1545050117, 1540467056,
+    1535869495, 1531257479, 1526631050, 1521990251, 1517335127, 1512665721,
+    1507982078, 1503284241, 1498572254, 1493846162, 1489106009, 1484351841,
+    1479583701, 1474801635, 1470005687, 1465195903, 1460372328, 1455535008,
+    1450683987, 1445819312, 1440941029, 1436049183, 1431143820, 1426224987,
+    1421292729, 1416347094, 1411388127, 1406415876, 1401430388, 1396431708,
+    1391419885, 1386394965, 1381356996, 1376306025, 1371242100, 1366165268,
+    1361075577, 1355973076, 1350857811, 1345729832, 1340589186, 1335435922,
+    1330270088, 1325091733, 1319900906, 1314697656, 1309482031, 1304254081,
+    1299013854, 1293761401, 1288496771, 1283220012, 1277931176, 1272630311,
+    1267317467, 1261992696, 1256656045, 1251307567, 1245947311, 1240575328,
+    1235191667, 1229796381, 1224389520, 1218971133, 1213541274, 1208099992,
+    1202647339, 1197183367, 1191708126, 1186221668, 1180724045, 1175215309,
+    1169695511, 1164164703, 1158622938, 1153070268, 1147506744, 1141932419,
+    1136347347, 1130751578, 1125145167, 1119528165, 1113900626, 1108262602,
+    1102614147, 1096955313, 1091286155, 1085606725, 1079917077, 1074217265,
+    1068507341, 1062787360, 1057057376, 1051317442, 1045567614, 1039807943,
+    1034038486, 1028259296, 1022470427, 1016671935, 1010863874, 1005046297,
+    999219261,  993382820,  987537029,  981681942,  975817616,  969944105,
+    964061464,  958169750,  952269016,  946359320,  940440716,  934513260,
+    928577009,  922632017,  916678341,  910716037,  904745160,  898765769,
+    892777917,  886781662,  880777061,  874764170,  868743044,  862713742,
+    856676320,  850630834,  844577342,  838515900,  832446566,  826369397,
+    820284450,  814191781,  808091449,  801983512,  795868025,  789745048,
+    783614637,  777476851,  771331746,  765179382,  759019815,  752853104,
+    746679307,  740498482,  734310687,  728115981,  721914421,  715706067,
+    709490975,  703269206,  697040818,  690805868,  684564417,  678316522,
+    672062242,  665801637,  659534765,  653261685,  646982457,  640697138,
+    634405790,  628108470,  621805238,  615496153,  609181275,  602860664,
+    596534378,  590202477,  583865021,  577522069,  571173681,  564819918,
+    558460838,  552096501,  545726969,  539352299,  532972553,  526587790,
+    520198071,  513803456,  507404004,  500999777,  494590834,  488177236,
+    481759043,  475336315,  468909113,  462477498,  456041530,  449601269,
+    443156776,  436708113,  430255339,  423798515,  417337702,  410872961,
+    404404353,  397931938,  391455778,  384975933,  378492465,  372005434,
+    365514902,  359020929,  352523578,  346022908,  339518981,  333011858,
+    326501601,  319988271,  313471929,  306952637,  300430455,  293905446,
+    287377670,  280847190,  274314066,  267778360,  261240133,  254699448,
+    248156365,  241610947,  235063254,  228513349,  221961293,  215407148,
+    208850976,  202292837,  195732795,  189170910,  182607245,  176041861,
+    169474820,  162906184,  156336014,  149764373,  143191322,  136616924,
+    130041240,  123464331,  116886261,  110307090,  103726882,  97145696,
+    90563597,    83980645,    77396903,    70812432,    64227294,    57641552,
+    51055268,    44468503,    37881319,    31293779,    24705944,    18117877,
+    11529639,    4941293
+  },
+  {
+    -1647099,  -8235476,  -14823776,    -21411936,    -27999895,
+    -34587590,    -41174959,    -47761942,    -54348474,    -60934495,
+    -67519942,    -74104754,    -80688869,    -87272224,    -93854757,
+    -100436407,  -107017112,  -113596809,  -120175438,  -126752935,
+    -133329239,  -139904288,  -146478020,  -153050374,  -159621287,
+    -166190697,  -172758544,  -179324764,  -185889296,  -192452079,
+    -199013050,  -205572148,  -212129312,  -218684478,  -225237586,
+    -231788574,  -238337381,  -244883944,  -251428202,  -257970094,
+    -264509558,  -271046532,  -277580954,  -284112764,  -290641900,
+    -297168300,  -303691903,  -310212648,  -316730473,  -323245317,
+    -329757118,  -336265815,  -342771348,  -349273654,  -355772672,
+    -362268342,  -368760602,  -375249391,  -381734648,  -388216312,
+    -394694322,  -401168617,  -407639136,  -414105819,  -420568603,
+    -427027429,  -433482236,  -439932962,  -446379548,  -452821932,
+    -459260054,  -465693853,  -472123270,  -478548242,  -484968710,
+    -491384613,  -497795891,  -504202484,  -510604331,  -517001372,
+    -523393547,  -529780795,  -536163057,  -542540272,  -548912381,
+    -555279323,  -561641039,  -567997468,  -574348551,  -580694228,
+    -587034439,  -593369125,  -599698226,  -606021683,  -612339435,
+    -618651423,  -624957589,  -631257872,  -637552214,  -643840555,
+    -650122836,  -656398997,  -662668981,  -668932727,  -675190176,
+    -681441271,  -687685951,  -693924159,  -700155836,  -706380922,
+    -712599359,  -718811090,  -725016054,  -731214195,  -737405452,
+    -743589770,  -749767088,  -755937349,  -762100495,  -768256468,
+    -774405209,  -780546662,  -786680768,  -792807469,  -798926708,
+    -805038428,  -811142570,  -817239077,  -823327892,  -829408958,
+    -835482216,  -841547611,  -847605085,  -853654581,  -859696043,
+    -865729412,  -871754633,  -877771648,  -883780402,  -889780837,
+    -895772897,  -901756525,  -907731667,  -913698264,  -919656261,
+    -925605602,  -931546230,  -937478091,  -943401128,  -949315285,
+    -955220507,  -961116738,  -967003922,  -972882005,  -978750931,
+    -984610644,  -990461090,  -996302213,  -1002133958, -1007956271,
+    -1013769097, -1019572381, -1025366068, -1031150104, -1036924435,
+    -1042689005, -1048443762, -1054188650, -1059923615, -1065648604,
+    -1071363563, -1077068438, -1082763175, -1088447721, -1094122022,
+    -1099786024, -1105439675, -1111082921, -1116715709, -1122337986,
+    -1127949700, -1133550796, -1139141223, -1144720928, -1150289859,
+    -1155847963, -1161395187, -1166931480, -1172456789, -1177971063,
+    -1183474249, -1188966296, -1194447152, -1199916765, -1205375084,
+    -1210822058, -1216257635, -1221681764, -1227094394, -1232495474,
+    -1237884954, -1243262782, -1248628908, -1253983282, -1259325852,
+    -1264656569, -1269975383, -1275282244, -1280577101, -1285859904,
+    -1291130605, -1296389153, -1301635499, -1306869593, -1312091387,
+    -1317300831, -1322497876, -1327682472, -1332854573, -1338014128,
+    -1343161089, -1348295408, -1353417036, -1358525925, -1363622027,
+    -1368705294, -1373775679, -1378833133, -1383877609, -1388909059,
+    -1393927437, -1398932694, -1403924784, -1408903660, -1413869274,
+    -1418821581, -1423760533, -1428686084, -1433598188, -1438496798,
+    -1443381869, -1448253354, -1453111207, -1457955383, -1462785837,
+    -1467602522, -1472405393, -1477194406, -1481969514, -1486730674,
+    -1491477840, -1496210968, -1500930013, -1505634931, -1510325677,
+    -1515002207, -1519664477, -1524312444, -1528946063, -1533565291,
+    -1538170085, -1542760401, -1547336196, -1551897427, -1556444051,
+    -1560976025, -1565493306, -1569995852, -1574483621, -1578956571,
+    -1583414658, -1587857842, -1592286081, -1596699332, -1601097554,
+    -1605480706, -1609848747, -1614201636, -1618539331, -1622861791,
+    -1627168977, -1631460847, -1635737361, -1639998479, -1644244161,
+    -1648474366, -1652689055, -1656888189, -1661071727, -1665239631,
+    -1669391861, -1673528378, -1677649143, -1681754117, -1685843262,
+    -1689916539, -1693973910, -1698015337, -1702040782, -1706050206,
+    -1710043572, -1714020842, -1717981980, -1721926947, -1725855707,
+    -1729768222, -1733664457, -1737544373, -1741407935, -1745255106,
+    -1749085850, -1752900131, -1756697913, -1760479160, -1764243837,
+    -1767991908, -1771723338, -1775438092, -1779136135, -1782817432,
+    -1786481949, -1790129650, -1793760503, -1797374471, -1800971522,
+    -1804551622, -1808114736, -1811660832, -1815189875, -1818701834,
+    -1822196674, -1825674363, -1829134868, -1832578156, -1836004196,
+    -1839412954, -1842804399, -1846178499, -1849535222, -1852874537,
+    -1856196411, -1859500815, -1862787716, -1866057083, -1869308887,
+    -1872543096, -1875759680, -1878958608, -1882139852, -1885303379,
+    -1888449162, -1891577169, -1894687373, -1897779743, -1900854250,
+    -1903910866, -1906949561, -1909970307, -1912973077, -1915957840,
+    -1918924570, -1921873238, -1924803816, -1927716278, -1930610595,
+    -1933486741, -1936344688, -1939184409, -1942005878, -1944809068,
+    -1947593953, -1950360506, -1953108702, -1955838514, -1958549918,
+    -1961242886, -1963917395, -1966573418, -1969210932, -1971829910,
+    -1974430329, -1977012164, -1979575390, -1982119984, -1984645921,
+    -1987153178, -1989641732, -1992111558, -1994562633, -1996994935,
+    -1999408441, -2001803127, -2004178971, -2006535952, -2008874046,
+    -2011193232, -2013493487, -2015774791, -2018037122, -2020280458,
+    -2022504779, -2024710063, -2026896289, -2029063438, -2031211488,
+    -2033340420, -2035450213, -2037540848, -2039612305, -2041664564,
+    -2043697606, -2045711412, -2047705963, -2049681241, -2051637226,
+    -2053573900, -2055491245, -2057389243, -2059267876, -2061127127,
+    -2062966977, -2064787410, -2066588408, -2068369955, -2070132034,
+    -2071874627, -2073597720, -2075301295, -2076985336, -2078649828,
+    -2080294755, -2081920102, -2083525853, -2085111992, -2086678506,
+    -2088225379, -2089752597, -2091260146, -2092748011, -2094216178,
+    -2095664633, -2097093364, -2098502355, -2099891595, -2101261070,
+    -2102610767, -2103940673, -2105250776, -2106541064, -2107811524,
+    -2109062145, -2110292914, -2111503821, -2112694853, -2113866000,
+    -2115017250, -2116148593, -2117260018, -2118351514, -2119423072,
+    -2120474681, -2121506331, -2122518013, -2123509717, -2124481433,
+    -2125433154, -2126364868, -2127276569, -2128168247, -2129039893,
+    -2129891501, -2130723061, -2131534566, -2132326008, -2133097379,
+    -2133848674, -2134579883, -2135291001, -2135982021, -2136652937,
+    -2137303741, -2137934428, -2138544992, -2139135428, -2139705729,
+    -2140255890, -2140785906, -2141295773, -2141785485, -2142255037,
+    -2142704426, -2143133647, -2143542696, -2143931569, -2144300262,
+    -2144648773, -2144977097, -2145285232, -2145573174, -2145840922,
+    -2146088472, -2146315823, -2146522971, -2146709916, -2146876655,
+    -2147023187, -2147149510, -2147255623, -2147341526, -2147407217,
+    -2147452695, -2147477962
+  },
+  {
+    2147483647, 2147473540, 2147443221, 2147392689, 2147321945, 2147230990,
+    2147119824, 2146988448, 2146836865, 2146665074, 2146473078, 2146260879,
+    2146028478, 2145775879, 2145503082, 2145210091, 2144896908, 2144563537,
+    2144209981, 2143836242, 2143442325, 2143028233, 2142593969, 2142139539,
+    2141664947, 2141170196, 2140655291, 2140120238, 2139565041, 2138989706,
+    2138394238, 2137778643, 2137142926, 2136487093, 2135811151, 2135115106,
+    2134398964, 2133662733, 2132906418, 2132130028, 2131333570, 2130517051,
+    2129680478, 2128823860, 2127947205, 2127050521, 2126133816, 2125197099,
+    2124240379, 2123263664, 2122266965, 2121250290, 2120213650, 2119157053,
+    2118080509, 2116984030, 2115867624, 2114731304, 2113575078, 2112398959,
+    2111202957, 2109987084, 2108751350, 2107495769, 2106220350, 2104925108,
+    2103610052, 2102275197, 2100920555, 2099546137, 2098151959, 2096738031,
+    2095304368, 2093850983, 2092377891, 2090885104, 2089372636, 2087840503,
+    2086288718, 2084717297, 2083126253, 2081515602, 2079885359, 2078235539,
+    2076566158, 2074877232, 2073168776, 2071440807, 2069693340, 2067926393,
+    2066139982, 2064334123, 2062508834, 2060664132, 2058800034, 2056916558,
+    2055013722, 2053091543, 2051150039, 2049189229, 2047209132, 2045209765,
+    2043191148, 2041153300, 2039096240, 2037019987, 2034924560, 2032809981,
+    2030676267, 2028523440, 2026351520, 2024160527, 2021950482, 2019721406,
+    2017473319, 2015206243, 2012920199, 2010615209, 2008291294, 2005948476,
+    2003586778, 2001206221, 1998806828, 1996388621, 1993951623, 1991495858,
+    1989021348, 1986528117, 1984016187, 1981485584, 1978936329, 1976368449,
+    1973781966, 1971176905, 1968553290, 1965911147, 1963250500, 1960571374,
+    1957873794, 1955157786, 1952423376, 1949670588, 1946899449, 1944109986,
+    1941302224, 1938476189, 1935631909, 1932769410, 1929888719, 1926989863,
+    1924072869, 1921137766, 1918184579, 1915213339, 1912224071, 1909216805,
+    1906191569, 1903148391, 1900087299, 1897008324, 1893911493, 1890796835,
+    1887664381, 1884514160, 1881346200, 1878160533, 1874957188, 1871736195,
+    1868497584, 1865241387, 1861967633, 1858676353, 1855367579, 1852041342,
+    1848697672, 1845336602, 1841958163, 1838562387, 1835149305, 1831718950,
+    1828271354, 1824806550, 1821324571, 1817825448, 1814309215, 1810775905,
+    1807225552, 1803658188, 1800073847, 1796472564, 1792854371, 1789219303,
+    1785567395, 1781898680, 1778213193, 1774510969, 1770792043, 1767056449,
+    1763304223, 1759535400, 1755750016, 1751948106, 1748129706, 1744294851,
+    1740443579, 1736575926, 1732691926, 1728791618, 1724875039, 1720942223,
+    1716993210, 1713028036, 1709046738, 1705049354, 1701035921, 1697006477,
+    1692961061, 1688899710, 1684822462, 1680729356, 1676620430, 1672495724,
+    1668355275, 1664199123, 1660027307, 1655839866, 1651636840, 1647418268,
+    1643184190, 1638934645, 1634669674, 1630389317, 1626093615, 1621782607,
+    1617456334, 1613114836, 1608758156, 1604386334, 1599999410, 1595597426,
+    1591180424, 1586748446, 1582301532, 1577839725, 1573363067, 1568871600,
+    1564365365, 1559844407, 1555308767, 1550758487, 1546193611, 1541614182,
+    1537020242, 1532411836, 1527789006, 1523151796, 1518500249, 1513834409,
+    1509154321, 1504460028, 1499751575, 1495029005, 1490292363, 1485541694,
+    1480777043, 1475998454, 1471205973, 1466399644, 1461579512, 1456745624,
+    1451898024, 1447036759, 1442161873, 1437273413, 1432371425, 1427455955,
+    1422527049, 1417584754, 1412629116, 1407660182, 1402677998, 1397682612,
+    1392674071, 1387652420, 1382617709, 1377569984, 1372509293, 1367435684,
+    1362349203, 1357249900, 1352137821, 1347013016, 1341875532, 1336725418,
+    1331562722, 1326387493, 1321199779, 1315999630, 1310787094, 1305562221,
+    1300325059, 1295075658, 1289814067, 1284540336, 1279254514, 1273956652,
+    1268646799, 1263325004, 1257991319, 1252645793, 1247288476, 1241919420,
+    1236538674, 1231146290, 1225742317, 1220326808, 1214899812, 1209461381,
+    1204011566, 1198550418, 1193077990, 1187594331, 1182099495, 1176593532,
+    1171076494, 1165548434, 1160009404, 1154459455, 1148898639, 1143327010,
+    1137744620, 1132151520, 1126547764, 1120933405, 1115308495, 1109673088,
+    1104027236, 1098370992, 1092704410, 1087027543, 1081340444, 1075643168,
+    1069935767, 1064218295, 1058490807, 1052753356, 1047005996, 1041248781,
+    1035481765, 1029705003, 1023918549, 1018122458, 1012316783, 1006501580,
+    1000676904, 994842809,  988999350,  983146582,  977284561,  971413341,
+    965532977,  959643526,  953745042,  947837581,  941921199,  935995951,
+    930061893,  924119081,  918167571,  912207418,  906238680,  900261412,
+    894275670,  888281511,  882278991,  876268167,  870249094,  864221831,
+    858186434,  852142958,  846091463,  840032003,  833964637,  827889421,
+    821806412,  815715669,  809617248,  803511206,  797397601,  791276491,
+    785147933,  779011985,  772868705,  766718150,  760560379,  754395449,
+    748223418,  742044344,  735858286,  729665302,  723465451,  717258789,
+    711045377,  704825271,  698598532,  692365217,  686125386,  679879096,
+    673626407,  667367378,  661102067,  654830534,  648552837,  642269036,
+    635979189,  629683356,  623381597,  617073970,  610760535,  604441351,
+    598116478,  591785975,  585449902,  579108319,  572761285,  566408859,
+    560051103,  553688075,  547319836,  540946445,  534567962,  528184448,
+    521795962,  515402565,  509004317,  502601278,  496193509,  489781068,
+    483364018,  476942419,  470516330,  464085812,  457650927,  451211733,
+    444768293,  438320666,  431868914,  425413097,  418953276,  412489511,
+    406021864,  399550395,  393075166,  386596236,  380113668,  373627522,
+    367137860,  360644742,  354148229,  347648383,  341145265,  334638935,
+    328129456,  321616889,  315101294,  308582733,  302061268,  295536960,
+    289009870,  282480060,  275947591,  269412525,  262874923,  256334846,
+    249792357,  243247517,  236700387,  230151030,  223599506,  217045877,
+    210490205,  203932553,  197372981,  190811551,  184248325,  177683365,
+    171116732,  164548489,  157978697,  151407418,  144834714,  138260647,
+    131685278,  125108670,  118530884,  111951983,  105372028,  98791081,
+    92209204,    85626459,    79042909,    72458614,    65873638,    59288041,
+    52701886,    46115236,    39528151,    32940694,    26352927,    19764912,
+    13176711,    6588386
+  },
+  {
+    0,         -6588386,  -13176711,    -19764912,    -26352927,
+    -32940694,    -39528151,    -46115236,    -52701886,    -59288041,
+    -65873638,    -72458614,    -79042909,    -85626459,    -92209204,
+    -98791081,    -105372028,  -111951983,  -118530884,  -125108670,
+    -131685278,  -138260647,  -144834714,  -151407418,  -157978697,
+    -164548489,  -171116732,  -177683365,  -184248325,  -190811551,
+    -197372981,  -203932553,  -210490205,  -217045877,  -223599506,
+    -230151030,  -236700387,  -243247517,  -249792357,  -256334846,
+    -262874923,  -269412525,  -275947591,  -282480060,  -289009870,
+    -295536960,  -302061268,  -308582733,  -315101294,  -321616889,
+    -328129456,  -334638935,  -341145265,  -347648383,  -354148229,
+    -360644742,  -367137860,  -373627522,  -380113668,  -386596236,
+    -393075166,  -399550395,  -406021864,  -412489511,  -418953276,
+    -425413097,  -431868914,  -438320666,  -444768293,  -451211733,
+    -457650927,  -464085812,  -470516330,  -476942419,  -483364018,
+    -489781068,  -496193509,  -502601278,  -509004317,  -515402565,
+    -521795962,  -528184448,  -534567962,  -540946445,  -547319836,
+    -553688075,  -560051103,  -566408859,  -572761285,  -579108319,
+    -585449902,  -591785975,  -598116478,  -604441351,  -610760535,
+    -617073970,  -623381597,  -629683356,  -635979189,  -642269036,
+    -648552837,  -654830534,  -661102067,  -667367378,  -673626407,
+    -679879096,  -686125386,  -692365217,  -698598532,  -704825271,
+    -711045377,  -717258789,  -723465451,  -729665302,  -735858286,
+    -742044344,  -748223418,  -754395449,  -760560379,  -766718150,
+    -772868705,  -779011985,  -785147933,  -791276491,  -797397601,
+    -803511206,  -809617248,  -815715669,  -821806412,  -827889421,
+    -833964637,  -840032003,  -846091463,  -852142958,  -858186434,
+    -864221831,  -870249094,  -876268167,  -882278991,  -888281511,
+    -894275670,  -900261412,  -906238680,  -912207418,  -918167571,
+    -924119081,  -930061893,  -935995951,  -941921199,  -947837581,
+    -953745042,  -959643526,  -965532977,  -971413341,  -977284561,
+    -983146582,  -988999350,  -994842809,  -1000676904, -1006501580,
+    -1012316783, -1018122458, -1023918549, -1029705003, -1035481765,
+    -1041248781, -1047005996, -1052753356, -1058490807, -1064218295,
+    -1069935767, -1075643168, -1081340444, -1087027543, -1092704410,
+    -1098370992, -1104027236, -1109673088, -1115308495, -1120933405,
+    -1126547764, -1132151520, -1137744620, -1143327010, -1148898639,
+    -1154459455, -1160009404, -1165548434, -1171076494, -1176593532,
+    -1182099495, -1187594331, -1193077990, -1198550418, -1204011566,
+    -1209461381, -1214899812, -1220326808, -1225742317, -1231146290,
+    -1236538674, -1241919420, -1247288476, -1252645793, -1257991319,
+    -1263325004, -1268646799, -1273956652, -1279254514, -1284540336,
+    -1289814067, -1295075658, -1300325059, -1305562221, -1310787094,
+    -1315999630, -1321199779, -1326387493, -1331562722, -1336725418,
+    -1341875532, -1347013016, -1352137821, -1357249900, -1362349203,
+    -1367435684, -1372509293, -1377569984, -1382617709, -1387652420,
+    -1392674071, -1397682612, -1402677998, -1407660182, -1412629116,
+    -1417584754, -1422527049, -1427455955, -1432371425, -1437273413,
+    -1442161873, -1447036759, -1451898024, -1456745624, -1461579512,
+    -1466399644, -1471205973, -1475998454, -1480777043, -1485541694,
+    -1490292363, -1495029005, -1499751575, -1504460028, -1509154321,
+    -1513834409, -1518500249, -1523151796, -1527789006, -1532411836,
+    -1537020242, -1541614182, -1546193611, -1550758487, -1555308767,
+    -1559844407, -1564365365, -1568871600, -1573363067, -1577839725,
+    -1582301532, -1586748446, -1591180424, -1595597426, -1599999410,
+    -1604386334, -1608758156, -1613114836, -1617456334, -1621782607,
+    -1626093615, -1630389317, -1634669674, -1638934645, -1643184190,
+    -1647418268, -1651636840, -1655839866, -1660027307, -1664199123,
+    -1668355275, -1672495724, -1676620430, -1680729356, -1684822462,
+    -1688899710, -1692961061, -1697006477, -1701035921, -1705049354,
+    -1709046738, -1713028036, -1716993210, -1720942223, -1724875039,
+    -1728791618, -1732691926, -1736575926, -1740443579, -1744294851,
+    -1748129706, -1751948106, -1755750016, -1759535400, -1763304223,
+    -1767056449, -1770792043, -1774510969, -1778213193, -1781898680,
+    -1785567395, -1789219303, -1792854371, -1796472564, -1800073847,
+    -1803658188, -1807225552, -1810775905, -1814309215, -1817825448,
+    -1821324571, -1824806550, -1828271354, -1831718950, -1835149305,
+    -1838562387, -1841958163, -1845336602, -1848697672, -1852041342,
+    -1855367579, -1858676353, -1861967633, -1865241387, -1868497584,
+    -1871736195, -1874957188, -1878160533, -1881346200, -1884514160,
+    -1887664381, -1890796835, -1893911493, -1897008324, -1900087299,
+    -1903148391, -1906191569, -1909216805, -1912224071, -1915213339,
+    -1918184579, -1921137766, -1924072869, -1926989863, -1929888719,
+    -1932769410, -1935631909, -1938476189, -1941302224, -1944109986,
+    -1946899449, -1949670588, -1952423376, -1955157786, -1957873794,
+    -1960571374, -1963250500, -1965911147, -1968553290, -1971176905,
+    -1973781966, -1976368449, -1978936329, -1981485584, -1984016187,
+    -1986528117, -1989021348, -1991495858, -1993951623, -1996388621,
+    -1998806828, -2001206221, -2003586778, -2005948476, -2008291294,
+    -2010615209, -2012920199, -2015206243, -2017473319, -2019721406,
+    -2021950482, -2024160527, -2026351520, -2028523440, -2030676267,
+    -2032809981, -2034924560, -2037019987, -2039096240, -2041153300,
+    -2043191148, -2045209765, -2047209132, -2049189229, -2051150039,
+    -2053091543, -2055013722, -2056916558, -2058800034, -2060664132,
+    -2062508834, -2064334123, -2066139982, -2067926393, -2069693340,
+    -2071440807, -2073168776, -2074877232, -2076566158, -2078235539,
+    -2079885359, -2081515602, -2083126253, -2084717297, -2086288718,
+    -2087840503, -2089372636, -2090885104, -2092377891, -2093850983,
+    -2095304368, -2096738031, -2098151959, -2099546137, -2100920555,
+    -2102275197, -2103610052, -2104925108, -2106220350, -2107495769,
+    -2108751350, -2109987084, -2111202957, -2112398959, -2113575078,
+    -2114731304, -2115867624, -2116984030, -2118080509, -2119157053,
+    -2120213650, -2121250290, -2122266965, -2123263664, -2124240379,
+    -2125197099, -2126133816, -2127050521, -2127947205, -2128823860,
+    -2129680478, -2130517051, -2131333570, -2132130028, -2132906418,
+    -2133662733, -2134398964, -2135115106, -2135811151, -2136487093,
+    -2137142926, -2137778643, -2138394238, -2138989706, -2139565041,
+    -2140120238, -2140655291, -2141170196, -2141664947, -2142139539,
+    -2142593969, -2143028233, -2143442325, -2143836242, -2144209981,
+    -2144563537, -2144896908, -2145210091, -2145503082, -2145775879,
+    -2146028478, -2146260879, -2146473078, -2146665074, -2146836865,
+    -2146988448, -2147119824, -2147230990, -2147321945, -2147392689,
+    -2147443221, -2147473540}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_384[4][384] = {
-    {2147483647, 2147465679, 2147411779, 2147321945, 2147196180, 2147034485,
-     2146836865, 2146603320, 2146333857, 2146028478, 2145687190, 2145309998,
-     2144896908, 2144447928, 2143963064, 2143442325, 2142885719, 2142293256,
-     2141664947, 2141000800, 2140300828, 2139565041, 2138793454, 2137986077,
-     2137142926, 2136264013, 2135349354, 2134398964, 2133412859, 2132391055,
-     2131333570, 2130240421, 2129111626, 2127947205, 2126747176, 2125511561,
-     2124240379, 2122933651, 2121591401, 2120213650, 2118800421, 2117351737,
-     2115867624, 2114348106, 2112793208, 2111202957, 2109577379, 2107916501,
-     2106220350, 2104488957, 2102722348, 2100920555, 2099083606, 2097211534,
-     2095304368, 2093362142, 2091384887, 2089372636, 2087325424, 2085243285,
-     2083126253, 2080974364, 2078787653, 2076566158, 2074309916, 2072018964,
-     2069693340, 2067333084, 2064938236, 2062508834, 2060044920, 2057546536,
-     2055013722, 2052446521, 2049844977, 2047209132, 2044539031, 2041834718,
-     2039096240, 2036323641, 2033516967, 2030676267, 2027801588, 2024892976,
-     2021950482, 2018974155, 2015964044, 2012920199, 2009842672, 2006731514,
-     2003586778, 2000408515, 1997196779, 1993951623, 1990673103, 1987361273,
-     1984016187, 1980637903, 1977226477, 1973781966, 1970304427, 1966793919,
-     1963250500, 1959674230, 1956065168, 1952423376, 1948748913, 1945041841,
-     1941302224, 1937530122, 1933725599, 1929888719, 1926019545, 1922118144,
-     1918184579, 1914218918, 1910221225, 1906191569, 1902130016, 1898036634,
-     1893911493, 1889754660, 1885566206, 1881346200, 1877094714, 1872811818,
-     1868497584, 1864152085, 1859775392, 1855367579, 1850928721, 1846458890,
-     1841958163, 1837426614, 1832864319, 1828271354, 1823647797, 1818993725,
-     1814309215, 1809594346, 1804849197, 1800073847, 1795268377, 1790432865,
-     1785567395, 1780672046, 1775746901, 1770792043, 1765807553, 1760793516,
-     1755750016, 1750677136, 1745574962, 1740443579, 1735283073, 1730093531,
-     1724875039, 1719627684, 1714351554, 1709046738, 1703713324, 1698351402,
-     1692961061, 1687542392, 1682095484, 1676620430, 1671117321, 1665586249,
-     1660027307, 1654440587, 1648826183, 1643184190, 1637514700, 1631817810,
-     1626093615, 1620342210, 1614563691, 1608758156, 1602925701, 1597066425,
-     1591180424, 1585267799, 1579328646, 1573363067, 1567371160, 1561353026,
-     1555308767, 1549238481, 1543142273, 1537020242, 1530872493, 1524699127,
-     1518500249, 1512275961, 1506026368, 1499751575, 1493451686, 1487126807,
-     1480777043, 1474402502, 1468003289, 1461579512, 1455131279, 1448658696,
-     1442161873, 1435640918, 1429095940, 1422527049, 1415934355, 1409317968,
-     1402677998, 1396014558, 1389327757, 1382617709, 1375884526, 1369128319,
-     1362349203, 1355547290, 1348722695, 1341875532, 1335005915, 1328113959,
-     1321199779, 1314263492, 1307305213, 1300325059, 1293323146, 1286299592,
-     1279254514, 1272188031, 1265100259, 1257991319, 1250861328, 1243710407,
-     1236538674, 1229346251, 1222133256, 1214899812, 1207646038, 1200372057,
-     1193077990, 1185763959, 1178430086, 1171076494, 1163703307, 1156310648,
-     1148898639, 1141467406, 1134017073, 1126547764, 1119059605, 1111552720,
-     1104027236, 1096483277, 1088920971, 1081340444, 1073741823, 1066125235,
-     1058490807, 1050838667, 1043168944, 1035481765, 1027777259, 1020055555,
-     1012316783, 1004561071, 996788550,  988999350,  981193601,  973371433,
-     965532977,  957678366,  949807729,  941921199,  934018908,  926100988,
-     918167571,  910218790,  902254779,  894275670,  886281597,  878272694,
-     870249094,  862210933,  854158344,  846091463,  838010423,  829915361,
-     821806412,  813683712,  805547396,  797397601,  789234463,  781058119,
-     772868705,  764666359,  756451217,  748223418,  739983098,  731730396,
-     723465451,  715188399,  706899380,  698598532,  690285995,  681961907,
-     673626407,  665279636,  656921733,  648552837,  640173089,  631782629,
-     623381597,  614970134,  606548381,  598116478,  589674567,  581222788,
-     572761285,  564290197,  555809666,  547319836,  538820847,  530312841,
-     521795962,  513270352,  504736153,  496193509,  487642561,  479083454,
-     470516330,  461941333,  453358606,  444768293,  436170538,  427565484,
-     418953276,  410334057,  401707972,  393075166,  384435782,  375789965,
-     367137860,  358479612,  349815365,  341145265,  332469456,  323788084,
-     315101294,  306409231,  297712042,  289009870,  280302863,  271591165,
-     262874923,  254154282,  245429388,  236700387,  227967426,  219230650,
-     210490205,  201746239,  192998897,  184248325,  175494670,  166738078,
-     157978697,  149216672,  140452150,  131685278,  122916202,  114145070,
-     105372028,  96597222,   87820800,   79042909,   70263695,   61483305,
-     52701886,   43919586,   35136551,   26352927,   17568863,   8784505},
-    {0,           -8784505,    -17568863,   -26352927,   -35136551,
-     -43919586,   -52701886,   -61483305,   -70263695,   -79042909,
-     -87820800,   -96597222,   -105372028,  -114145070,  -122916202,
-     -131685278,  -140452150,  -149216672,  -157978697,  -166738078,
-     -175494670,  -184248325,  -192998897,  -201746239,  -210490205,
-     -219230650,  -227967426,  -236700387,  -245429388,  -254154282,
-     -262874923,  -271591165,  -280302863,  -289009870,  -297712042,
-     -306409231,  -315101294,  -323788084,  -332469456,  -341145265,
-     -349815365,  -358479612,  -367137860,  -375789965,  -384435782,
-     -393075166,  -401707972,  -410334057,  -418953276,  -427565484,
-     -436170538,  -444768293,  -453358606,  -461941333,  -470516330,
-     -479083454,  -487642561,  -496193509,  -504736153,  -513270352,
-     -521795962,  -530312841,  -538820847,  -547319836,  -555809666,
-     -564290197,  -572761285,  -581222788,  -589674567,  -598116478,
-     -606548381,  -614970134,  -623381597,  -631782629,  -640173089,
-     -648552837,  -656921733,  -665279636,  -673626407,  -681961907,
-     -690285995,  -698598532,  -706899380,  -715188399,  -723465451,
-     -731730396,  -739983098,  -748223418,  -756451217,  -764666359,
-     -772868705,  -781058119,  -789234463,  -797397601,  -805547396,
-     -813683712,  -821806412,  -829915361,  -838010423,  -846091463,
-     -854158344,  -862210933,  -870249094,  -878272694,  -886281597,
-     -894275670,  -902254779,  -910218790,  -918167571,  -926100988,
-     -934018908,  -941921199,  -949807729,  -957678366,  -965532977,
-     -973371433,  -981193601,  -988999350,  -996788550,  -1004561071,
-     -1012316783, -1020055555, -1027777259, -1035481765, -1043168944,
-     -1050838667, -1058490807, -1066125235, -1073741823, -1081340444,
-     -1088920971, -1096483277, -1104027236, -1111552720, -1119059605,
-     -1126547764, -1134017073, -1141467406, -1148898639, -1156310648,
-     -1163703307, -1171076494, -1178430086, -1185763959, -1193077990,
-     -1200372057, -1207646038, -1214899812, -1222133256, -1229346251,
-     -1236538674, -1243710407, -1250861328, -1257991319, -1265100259,
-     -1272188031, -1279254514, -1286299592, -1293323146, -1300325059,
-     -1307305213, -1314263492, -1321199779, -1328113959, -1335005915,
-     -1341875532, -1348722695, -1355547290, -1362349203, -1369128319,
-     -1375884526, -1382617709, -1389327757, -1396014558, -1402677998,
-     -1409317968, -1415934355, -1422527049, -1429095940, -1435640918,
-     -1442161873, -1448658696, -1455131279, -1461579512, -1468003289,
-     -1474402502, -1480777043, -1487126807, -1493451686, -1499751575,
-     -1506026368, -1512275961, -1518500249, -1524699127, -1530872493,
-     -1537020242, -1543142273, -1549238481, -1555308767, -1561353026,
-     -1567371160, -1573363067, -1579328646, -1585267799, -1591180424,
-     -1597066425, -1602925701, -1608758156, -1614563691, -1620342210,
-     -1626093615, -1631817810, -1637514700, -1643184190, -1648826183,
-     -1654440587, -1660027307, -1665586249, -1671117321, -1676620430,
-     -1682095484, -1687542392, -1692961061, -1698351402, -1703713324,
-     -1709046738, -1714351554, -1719627684, -1724875039, -1730093531,
-     -1735283073, -1740443579, -1745574962, -1750677136, -1755750016,
-     -1760793516, -1765807553, -1770792043, -1775746901, -1780672046,
-     -1785567395, -1790432865, -1795268377, -1800073847, -1804849197,
-     -1809594346, -1814309215, -1818993725, -1823647797, -1828271354,
-     -1832864319, -1837426614, -1841958163, -1846458890, -1850928721,
-     -1855367579, -1859775392, -1864152085, -1868497584, -1872811818,
-     -1877094714, -1881346200, -1885566206, -1889754660, -1893911493,
-     -1898036634, -1902130016, -1906191569, -1910221225, -1914218918,
-     -1918184579, -1922118144, -1926019545, -1929888719, -1933725599,
-     -1937530122, -1941302224, -1945041841, -1948748913, -1952423376,
-     -1956065168, -1959674230, -1963250500, -1966793919, -1970304427,
-     -1973781966, -1977226477, -1980637903, -1984016187, -1987361273,
-     -1990673103, -1993951623, -1997196779, -2000408515, -2003586778,
-     -2006731514, -2009842672, -2012920199, -2015964044, -2018974155,
-     -2021950482, -2024892976, -2027801588, -2030676267, -2033516967,
-     -2036323641, -2039096240, -2041834718, -2044539031, -2047209132,
-     -2049844977, -2052446521, -2055013722, -2057546536, -2060044920,
-     -2062508834, -2064938236, -2067333084, -2069693340, -2072018964,
-     -2074309916, -2076566158, -2078787653, -2080974364, -2083126253,
-     -2085243285, -2087325424, -2089372636, -2091384887, -2093362142,
-     -2095304368, -2097211534, -2099083606, -2100920555, -2102722348,
-     -2104488957, -2106220350, -2107916501, -2109577379, -2111202957,
-     -2112793208, -2114348106, -2115867624, -2117351737, -2118800421,
-     -2120213650, -2121591401, -2122933651, -2124240379, -2125511561,
-     -2126747176, -2127947205, -2129111626, -2130240421, -2131333570,
-     -2132391055, -2133412859, -2134398964, -2135349354, -2136264013,
-     -2137142926, -2137986077, -2138793454, -2139565041, -2140300828,
-     -2141000800, -2141664947, -2142293256, -2142885719, -2143442325,
-     -2143963064, -2144447928, -2144896908, -2145309998, -2145687190,
-     -2146028478, -2146333857, -2146603320, -2146836865, -2147034485,
-     -2147196180, -2147321945, -2147411779, -2147465679},
-    {2147482524, 2147455573, 2147392689, 2147293872, 2147159125, 2146988448,
-     2146781846, 2146539322, 2146260879, 2145946523, 2145596258, 2145210091,
-     2144788028, 2144330076, 2143836242, 2143306535, 2142740965, 2142139539,
-     2141502269, 2140829165, 2140120238, 2139375500, 2138594964, 2137778643,
-     2136926550, 2136038699, 2135115106, 2134155786, 2133160754, 2132130028,
-     2131063626, 2129961563, 2128823860, 2127650535, 2126441608, 2125197099,
-     2123917028, 2122601418, 2121250290, 2119863668, 2118441573, 2116984030,
-     2115491063, 2113962698, 2112398959, 2110799873, 2109165467, 2107495769,
-     2105790805, 2104050605, 2102275197, 2100464612, 2098618880, 2096738031,
-     2094822097, 2092871111, 2090885104, 2088864110, 2086808163, 2084717297,
-     2082591547, 2080430949, 2078235539, 2076005354, 2073740430, 2071440807,
-     2069106521, 2066737614, 2064334123, 2061896089, 2059423554, 2056916558,
-     2054375144, 2051799353, 2049189229, 2046544816, 2043866158, 2041153300,
-     2038406287, 2035625165, 2032809981, 2029960781, 2027077614, 2024160527,
-     2021209571, 2018224792, 2015206243, 2012153973, 2009068034, 2005948476,
-     2002795353, 1999608717, 1996388621, 1993135119, 1989848266, 1986528117,
-     1983174727, 1979788152, 1976368449, 1972915675, 1969429888, 1965911147,
-     1962359510, 1958775036, 1955157786, 1951507820, 1947825200, 1944109986,
-     1940362241, 1936582028, 1932769410, 1928924450, 1925047214, 1921137766,
-     1917196171, 1913222495, 1909216805, 1905179168, 1901109652, 1897008324,
-     1892875253, 1888710508, 1884514160, 1880286277, 1876026932, 1871736195,
-     1867414138, 1863060833, 1858676353, 1854260772, 1849814164, 1845336602,
-     1840828162, 1836288920, 1831718950, 1827118330, 1822487137, 1817825448,
-     1813133341, 1808410894, 1803658188, 1798875300, 1794062312, 1789219303,
-     1784346356, 1779443550, 1774510969, 1769548695, 1764556811, 1759535400,
-     1754484547, 1749404336, 1744294851, 1739156180, 1733988407, 1728791618,
-     1723565902, 1718311345, 1713028036, 1707716062, 1702375513, 1697006477,
-     1691609046, 1686183309, 1680729356, 1675247280, 1669737171, 1664199123,
-     1658633228, 1653039578, 1647418268, 1641769391, 1636093043, 1630389317,
-     1624658311, 1618900118, 1613114836, 1607302562, 1601463393, 1595597426,
-     1589704760, 1583785493, 1577839725, 1571867554, 1565869082, 1559844407,
-     1553793631, 1547716856, 1541614182, 1535485712, 1529331549, 1523151796,
-     1516946555, 1510715931, 1504460028, 1498178951, 1491872805, 1485541694,
-     1479185727, 1472805008, 1466399644, 1459969743, 1453515412, 1447036759,
-     1440533892, 1434006921, 1427455955, 1420881103, 1414282475, 1407660182,
-     1401014334, 1394345043, 1387652420, 1380936578, 1374197628, 1367435684,
-     1360650858, 1353843264, 1347013016, 1340160228, 1333285016, 1326387493,
-     1319467776, 1312525980, 1305562221, 1298576616, 1291569282, 1284540336,
-     1277489896, 1270418079, 1263325004, 1256210790, 1249075556, 1241919420,
-     1234742504, 1227544926, 1220326808, 1213088269, 1205829433, 1198550418,
-     1191251349, 1183932346, 1176593532, 1169235030, 1161856963, 1154459455,
-     1147042629, 1139606609, 1132151520, 1124677487, 1117184634, 1109673088,
-     1102142973, 1094594416, 1087027543, 1079442480, 1071839355, 1064218295,
-     1056579428, 1048922880, 1041248781, 1033557258, 1025848440, 1018122458,
-     1010379438, 1002619512, 994842809,  987049459,  979239593,  971413341,
-     963570834,  955712204,  947837581,  939947099,  932040888,  924119081,
-     916181811,  908229210,  900261412,  892278549,  884280756,  876268167,
-     868240914,  860199133,  852142958,  844072525,  835987967,  827889421,
-     819777021,  811650904,  803511206,  795358062,  787191610,  779011985,
-     770819326,  762613767,  754395449,  746164506,  737921078,  729665302,
-     721397317,  713117261,  704825271,  696521488,  688206050,  679879096,
-     671540766,  663191198,  654830534,  646458912,  638076473,  629683356,
-     621279704,  612865655,  604441351,  596006933,  587562542,  579108319,
-     570644406,  562170944,  553688075,  545195941,  536694685,  528184448,
-     519665373,  511137602,  502601278,  494056544,  485503544,  476942419,
-     468373313,  459796370,  451211733,  442619546,  434019953,  425413097,
-     416799123,  408178174,  399550395,  390915931,  382274925,  373627522,
-     364973868,  356314107,  347648383,  338976842,  330299629,  321616889,
-     312928767,  304235409,  295536960,  286833566,  278125372,  269412525,
-     260695169,  251973451,  243247517,  234517512,  225783584,  217045877,
-     208304538,  199559714,  190811551,  182060194,  173305792,  164548489,
-     155788433,  147025770,  138260647,  129493210,  120723606,  111951983,
-     103178486,  94403263,   85626459,   76848224,   68068702,   59288041,
-     50506388,   41723890,   32940694,   24156947,   15372795,   6588386},
-    {-2196132,    -10980614,   -19764912,   -28548880,   -37332370,
-     -46115236,   -54897329,   -63678505,   -72458614,   -81237511,
-     -90015049,   -98791081,   -107565459,  -116338038,  -125108670,
-     -133877208,  -142643507,  -151407418,  -160168796,  -168927494,
-     -177683365,  -186436262,  -195186041,  -203932553,  -212675652,
-     -221415193,  -230151030,  -238883014,  -247611002,  -256334846,
-     -265054401,  -273769521,  -282480060,  -291185872,  -299886812,
-     -308582733,  -317273491,  -325958940,  -334638935,  -343313330,
-     -351981981,  -360644742,  -369301468,  -377952014,  -386596236,
-     -395233990,  -403865129,  -412489511,  -421106991,  -429717424,
-     -438320666,  -446916575,  -455505004,  -464085812,  -472658854,
-     -481223988,  -489781068,  -498329954,  -506870500,  -515402565,
-     -523926006,  -532440680,  -540946445,  -549443158,  -557930676,
-     -566408859,  -574877565,  -583336650,  -591785975,  -600225397,
-     -608654776,  -617073970,  -625482838,  -633881240,  -642269036,
-     -650646084,  -659012245,  -667367378,  -675711344,  -684044004,
-     -692365217,  -700674845,  -708972749,  -717258789,  -725532827,
-     -733794725,  -742044344,  -750281547,  -758506195,  -766718150,
-     -774917276,  -783103436,  -791276491,  -799436306,  -807582744,
-     -815715669,  -823834944,  -831940434,  -840032003,  -848109516,
-     -856172837,  -864221831,  -872256365,  -880276303,  -888281511,
-     -896271855,  -904247202,  -912207418,  -920152371,  -928081926,
-     -935995951,  -943894314,  -951776883,  -959643526,  -967494111,
-     -975328507,  -983146582,  -990948207,  -998733250,  -1006501580,
-     -1014253069, -1021987587, -1029705003, -1037405189, -1045088016,
-     -1052753356, -1060401079, -1068031059, -1075643168, -1083237277,
-     -1090813261, -1098370992, -1105910344, -1113431190, -1120933405,
-     -1128416864, -1135881440, -1143327010, -1150753449, -1158160631,
-     -1165548434, -1172916734, -1180265407, -1187594331, -1194903383,
-     -1202192440, -1209461381, -1216710083, -1223938427, -1231146290,
-     -1238333552, -1245500093, -1252645793, -1259770532, -1266874191,
-     -1273956652, -1281017795, -1288057503, -1295075658, -1302072142,
-     -1309046838, -1315999630, -1322930401, -1329839036, -1336725418,
-     -1343589432, -1350430964, -1357249900, -1364046124, -1370819523,
-     -1377569984, -1384297395, -1391001641, -1397682612, -1404340196,
-     -1410974280, -1417584754, -1424171508, -1430734431, -1437273413,
-     -1443788345, -1450279119, -1456745624, -1463187754, -1469605400,
-     -1475998454, -1482366811, -1488710363, -1495029005, -1501322630,
-     -1507591133, -1513834409, -1520052355, -1526244865, -1532411836,
-     -1538553165, -1544668750, -1550758487, -1556822275, -1562860013,
-     -1568871600, -1574856934, -1580815916, -1586748446, -1592654425,
-     -1598533753, -1604386334, -1610212067, -1616010857, -1621782607,
-     -1627527218, -1633244596, -1638934645, -1644597269, -1650232375,
-     -1655839866, -1661419650, -1666971634, -1672495724, -1677991828,
-     -1683459854, -1688899710, -1694311306, -1699694550, -1705049354,
-     -1710375626, -1715673279, -1720942223, -1726182371, -1731393634,
-     -1736575926, -1741729159, -1746853247, -1751948106, -1757013649,
-     -1762049791, -1767056449, -1772033539, -1776980976, -1781898680,
-     -1786786567, -1791644555, -1796472564, -1801270512, -1806038319,
-     -1810775905, -1815483192, -1820160100, -1824806550, -1829422467,
-     -1834007771, -1838562387, -1843086237, -1847579248, -1852041342,
-     -1856472446, -1860872486, -1865241387, -1869579077, -1873885483,
-     -1878160533, -1882404156, -1886616280, -1890796835, -1894945752,
-     -1899062960, -1903148391, -1907201976, -1911223648, -1915213339,
-     -1919170982, -1923096512, -1926989863, -1930850969, -1934679765,
-     -1938476189, -1942240176, -1945971663, -1949670588, -1953336889,
-     -1956970504, -1960571374, -1964139437, -1967674633, -1971176905,
-     -1974646192, -1978082438, -1981485584, -1984855573, -1988192350,
-     -1991495858, -1994766042, -1998002848, -2001206221, -2004376107,
-     -2007512454, -2010615209, -2013684320, -2016719736, -2019721406,
-     -2022689280, -2025623308, -2028523440, -2031389630, -2034221828,
-     -2037019987, -2039784060, -2042514001, -2045209765, -2047871306,
-     -2050498580, -2053091543, -2055650151, -2058174361, -2060664132,
-     -2063119422, -2065540189, -2067926393, -2070277994, -2072594954,
-     -2074877232, -2077124791, -2079337593, -2081515602, -2083658780,
-     -2085767092, -2087840503, -2089878978, -2091882483, -2093850983,
-     -2095784448, -2097682843, -2099546137, -2101374300, -2103167300,
-     -2104925108, -2106647693, -2108335028, -2109987084, -2111603833,
-     -2113185248, -2114731304, -2116241973, -2117717231, -2119157053,
-     -2120561414, -2121930293, -2123263664, -2124561507, -2125823800,
-     -2127050521, -2128241649, -2129397166, -2130517051, -2131601286,
-     -2132649852, -2133662733, -2134639911, -2135581369, -2136487093,
-     -2137357067, -2138191276, -2138989706, -2139752345, -2140479179,
-     -2141170196, -2141825384, -2142444733, -2143028233, -2143575872,
-     -2144087643, -2144563537, -2145003546, -2145407662, -2145775879,
-     -2146108190, -2146404590, -2146665074, -2146889638, -2147078277,
-     -2147230990, -2147347772, -2147428623, -2147473540}};
+  {
+    2147483647, 2147465679, 2147411779, 2147321945, 2147196180, 2147034485,
+    2146836865, 2146603320, 2146333857, 2146028478, 2145687190, 2145309998,
+    2144896908, 2144447928, 2143963064, 2143442325, 2142885719, 2142293256,
+    2141664947, 2141000800, 2140300828, 2139565041, 2138793454, 2137986077,
+    2137142926, 2136264013, 2135349354, 2134398964, 2133412859, 2132391055,
+    2131333570, 2130240421, 2129111626, 2127947205, 2126747176, 2125511561,
+    2124240379, 2122933651, 2121591401, 2120213650, 2118800421, 2117351737,
+    2115867624, 2114348106, 2112793208, 2111202957, 2109577379, 2107916501,
+    2106220350, 2104488957, 2102722348, 2100920555, 2099083606, 2097211534,
+    2095304368, 2093362142, 2091384887, 2089372636, 2087325424, 2085243285,
+    2083126253, 2080974364, 2078787653, 2076566158, 2074309916, 2072018964,
+    2069693340, 2067333084, 2064938236, 2062508834, 2060044920, 2057546536,
+    2055013722, 2052446521, 2049844977, 2047209132, 2044539031, 2041834718,
+    2039096240, 2036323641, 2033516967, 2030676267, 2027801588, 2024892976,
+    2021950482, 2018974155, 2015964044, 2012920199, 2009842672, 2006731514,
+    2003586778, 2000408515, 1997196779, 1993951623, 1990673103, 1987361273,
+    1984016187, 1980637903, 1977226477, 1973781966, 1970304427, 1966793919,
+    1963250500, 1959674230, 1956065168, 1952423376, 1948748913, 1945041841,
+    1941302224, 1937530122, 1933725599, 1929888719, 1926019545, 1922118144,
+    1918184579, 1914218918, 1910221225, 1906191569, 1902130016, 1898036634,
+    1893911493, 1889754660, 1885566206, 1881346200, 1877094714, 1872811818,
+    1868497584, 1864152085, 1859775392, 1855367579, 1850928721, 1846458890,
+    1841958163, 1837426614, 1832864319, 1828271354, 1823647797, 1818993725,
+    1814309215, 1809594346, 1804849197, 1800073847, 1795268377, 1790432865,
+    1785567395, 1780672046, 1775746901, 1770792043, 1765807553, 1760793516,
+    1755750016, 1750677136, 1745574962, 1740443579, 1735283073, 1730093531,
+    1724875039, 1719627684, 1714351554, 1709046738, 1703713324, 1698351402,
+    1692961061, 1687542392, 1682095484, 1676620430, 1671117321, 1665586249,
+    1660027307, 1654440587, 1648826183, 1643184190, 1637514700, 1631817810,
+    1626093615, 1620342210, 1614563691, 1608758156, 1602925701, 1597066425,
+    1591180424, 1585267799, 1579328646, 1573363067, 1567371160, 1561353026,
+    1555308767, 1549238481, 1543142273, 1537020242, 1530872493, 1524699127,
+    1518500249, 1512275961, 1506026368, 1499751575, 1493451686, 1487126807,
+    1480777043, 1474402502, 1468003289, 1461579512, 1455131279, 1448658696,
+    1442161873, 1435640918, 1429095940, 1422527049, 1415934355, 1409317968,
+    1402677998, 1396014558, 1389327757, 1382617709, 1375884526, 1369128319,
+    1362349203, 1355547290, 1348722695, 1341875532, 1335005915, 1328113959,
+    1321199779, 1314263492, 1307305213, 1300325059, 1293323146, 1286299592,
+    1279254514, 1272188031, 1265100259, 1257991319, 1250861328, 1243710407,
+    1236538674, 1229346251, 1222133256, 1214899812, 1207646038, 1200372057,
+    1193077990, 1185763959, 1178430086, 1171076494, 1163703307, 1156310648,
+    1148898639, 1141467406, 1134017073, 1126547764, 1119059605, 1111552720,
+    1104027236, 1096483277, 1088920971, 1081340444, 1073741823, 1066125235,
+    1058490807, 1050838667, 1043168944, 1035481765, 1027777259, 1020055555,
+    1012316783, 1004561071, 996788550,  988999350,  981193601,  973371433,
+    965532977,  957678366,  949807729,  941921199,  934018908,  926100988,
+    918167571,  910218790,  902254779,  894275670,  886281597,  878272694,
+    870249094,  862210933,  854158344,  846091463,  838010423,  829915361,
+    821806412,  813683712,  805547396,  797397601,  789234463,  781058119,
+    772868705,  764666359,  756451217,  748223418,  739983098,  731730396,
+    723465451,  715188399,  706899380,  698598532,  690285995,  681961907,
+    673626407,  665279636,  656921733,  648552837,  640173089,  631782629,
+    623381597,  614970134,  606548381,  598116478,  589674567,  581222788,
+    572761285,  564290197,  555809666,  547319836,  538820847,  530312841,
+    521795962,  513270352,  504736153,  496193509,  487642561,  479083454,
+    470516330,  461941333,  453358606,  444768293,  436170538,  427565484,
+    418953276,  410334057,  401707972,  393075166,  384435782,  375789965,
+    367137860,  358479612,  349815365,  341145265,  332469456,  323788084,
+    315101294,  306409231,  297712042,  289009870,  280302863,  271591165,
+    262874923,  254154282,  245429388,  236700387,  227967426,  219230650,
+    210490205,  201746239,  192998897,  184248325,  175494670,  166738078,
+    157978697,  149216672,  140452150,  131685278,  122916202,  114145070,
+    105372028,  96597222,    87820800,    79042909,    70263695,    61483305,
+    52701886,    43919586,    35136551,    26352927,    17568863,    8784505
+  },
+  {
+    0,         -8784505,  -17568863,    -26352927,    -35136551,
+    -43919586,    -52701886,    -61483305,    -70263695,    -79042909,
+    -87820800,    -96597222,    -105372028,  -114145070,  -122916202,
+    -131685278,  -140452150,  -149216672,  -157978697,  -166738078,
+    -175494670,  -184248325,  -192998897,  -201746239,  -210490205,
+    -219230650,  -227967426,  -236700387,  -245429388,  -254154282,
+    -262874923,  -271591165,  -280302863,  -289009870,  -297712042,
+    -306409231,  -315101294,  -323788084,  -332469456,  -341145265,
+    -349815365,  -358479612,  -367137860,  -375789965,  -384435782,
+    -393075166,  -401707972,  -410334057,  -418953276,  -427565484,
+    -436170538,  -444768293,  -453358606,  -461941333,  -470516330,
+    -479083454,  -487642561,  -496193509,  -504736153,  -513270352,
+    -521795962,  -530312841,  -538820847,  -547319836,  -555809666,
+    -564290197,  -572761285,  -581222788,  -589674567,  -598116478,
+    -606548381,  -614970134,  -623381597,  -631782629,  -640173089,
+    -648552837,  -656921733,  -665279636,  -673626407,  -681961907,
+    -690285995,  -698598532,  -706899380,  -715188399,  -723465451,
+    -731730396,  -739983098,  -748223418,  -756451217,  -764666359,
+    -772868705,  -781058119,  -789234463,  -797397601,  -805547396,
+    -813683712,  -821806412,  -829915361,  -838010423,  -846091463,
+    -854158344,  -862210933,  -870249094,  -878272694,  -886281597,
+    -894275670,  -902254779,  -910218790,  -918167571,  -926100988,
+    -934018908,  -941921199,  -949807729,  -957678366,  -965532977,
+    -973371433,  -981193601,  -988999350,  -996788550,  -1004561071,
+    -1012316783, -1020055555, -1027777259, -1035481765, -1043168944,
+    -1050838667, -1058490807, -1066125235, -1073741823, -1081340444,
+    -1088920971, -1096483277, -1104027236, -1111552720, -1119059605,
+    -1126547764, -1134017073, -1141467406, -1148898639, -1156310648,
+    -1163703307, -1171076494, -1178430086, -1185763959, -1193077990,
+    -1200372057, -1207646038, -1214899812, -1222133256, -1229346251,
+    -1236538674, -1243710407, -1250861328, -1257991319, -1265100259,
+    -1272188031, -1279254514, -1286299592, -1293323146, -1300325059,
+    -1307305213, -1314263492, -1321199779, -1328113959, -1335005915,
+    -1341875532, -1348722695, -1355547290, -1362349203, -1369128319,
+    -1375884526, -1382617709, -1389327757, -1396014558, -1402677998,
+    -1409317968, -1415934355, -1422527049, -1429095940, -1435640918,
+    -1442161873, -1448658696, -1455131279, -1461579512, -1468003289,
+    -1474402502, -1480777043, -1487126807, -1493451686, -1499751575,
+    -1506026368, -1512275961, -1518500249, -1524699127, -1530872493,
+    -1537020242, -1543142273, -1549238481, -1555308767, -1561353026,
+    -1567371160, -1573363067, -1579328646, -1585267799, -1591180424,
+    -1597066425, -1602925701, -1608758156, -1614563691, -1620342210,
+    -1626093615, -1631817810, -1637514700, -1643184190, -1648826183,
+    -1654440587, -1660027307, -1665586249, -1671117321, -1676620430,
+    -1682095484, -1687542392, -1692961061, -1698351402, -1703713324,
+    -1709046738, -1714351554, -1719627684, -1724875039, -1730093531,
+    -1735283073, -1740443579, -1745574962, -1750677136, -1755750016,
+    -1760793516, -1765807553, -1770792043, -1775746901, -1780672046,
+    -1785567395, -1790432865, -1795268377, -1800073847, -1804849197,
+    -1809594346, -1814309215, -1818993725, -1823647797, -1828271354,
+    -1832864319, -1837426614, -1841958163, -1846458890, -1850928721,
+    -1855367579, -1859775392, -1864152085, -1868497584, -1872811818,
+    -1877094714, -1881346200, -1885566206, -1889754660, -1893911493,
+    -1898036634, -1902130016, -1906191569, -1910221225, -1914218918,
+    -1918184579, -1922118144, -1926019545, -1929888719, -1933725599,
+    -1937530122, -1941302224, -1945041841, -1948748913, -1952423376,
+    -1956065168, -1959674230, -1963250500, -1966793919, -1970304427,
+    -1973781966, -1977226477, -1980637903, -1984016187, -1987361273,
+    -1990673103, -1993951623, -1997196779, -2000408515, -2003586778,
+    -2006731514, -2009842672, -2012920199, -2015964044, -2018974155,
+    -2021950482, -2024892976, -2027801588, -2030676267, -2033516967,
+    -2036323641, -2039096240, -2041834718, -2044539031, -2047209132,
+    -2049844977, -2052446521, -2055013722, -2057546536, -2060044920,
+    -2062508834, -2064938236, -2067333084, -2069693340, -2072018964,
+    -2074309916, -2076566158, -2078787653, -2080974364, -2083126253,
+    -2085243285, -2087325424, -2089372636, -2091384887, -2093362142,
+    -2095304368, -2097211534, -2099083606, -2100920555, -2102722348,
+    -2104488957, -2106220350, -2107916501, -2109577379, -2111202957,
+    -2112793208, -2114348106, -2115867624, -2117351737, -2118800421,
+    -2120213650, -2121591401, -2122933651, -2124240379, -2125511561,
+    -2126747176, -2127947205, -2129111626, -2130240421, -2131333570,
+    -2132391055, -2133412859, -2134398964, -2135349354, -2136264013,
+    -2137142926, -2137986077, -2138793454, -2139565041, -2140300828,
+    -2141000800, -2141664947, -2142293256, -2142885719, -2143442325,
+    -2143963064, -2144447928, -2144896908, -2145309998, -2145687190,
+    -2146028478, -2146333857, -2146603320, -2146836865, -2147034485,
+    -2147196180, -2147321945, -2147411779, -2147465679
+  },
+  {
+    2147482524, 2147455573, 2147392689, 2147293872, 2147159125, 2146988448,
+    2146781846, 2146539322, 2146260879, 2145946523, 2145596258, 2145210091,
+    2144788028, 2144330076, 2143836242, 2143306535, 2142740965, 2142139539,
+    2141502269, 2140829165, 2140120238, 2139375500, 2138594964, 2137778643,
+    2136926550, 2136038699, 2135115106, 2134155786, 2133160754, 2132130028,
+    2131063626, 2129961563, 2128823860, 2127650535, 2126441608, 2125197099,
+    2123917028, 2122601418, 2121250290, 2119863668, 2118441573, 2116984030,
+    2115491063, 2113962698, 2112398959, 2110799873, 2109165467, 2107495769,
+    2105790805, 2104050605, 2102275197, 2100464612, 2098618880, 2096738031,
+    2094822097, 2092871111, 2090885104, 2088864110, 2086808163, 2084717297,
+    2082591547, 2080430949, 2078235539, 2076005354, 2073740430, 2071440807,
+    2069106521, 2066737614, 2064334123, 2061896089, 2059423554, 2056916558,
+    2054375144, 2051799353, 2049189229, 2046544816, 2043866158, 2041153300,
+    2038406287, 2035625165, 2032809981, 2029960781, 2027077614, 2024160527,
+    2021209571, 2018224792, 2015206243, 2012153973, 2009068034, 2005948476,
+    2002795353, 1999608717, 1996388621, 1993135119, 1989848266, 1986528117,
+    1983174727, 1979788152, 1976368449, 1972915675, 1969429888, 1965911147,
+    1962359510, 1958775036, 1955157786, 1951507820, 1947825200, 1944109986,
+    1940362241, 1936582028, 1932769410, 1928924450, 1925047214, 1921137766,
+    1917196171, 1913222495, 1909216805, 1905179168, 1901109652, 1897008324,
+    1892875253, 1888710508, 1884514160, 1880286277, 1876026932, 1871736195,
+    1867414138, 1863060833, 1858676353, 1854260772, 1849814164, 1845336602,
+    1840828162, 1836288920, 1831718950, 1827118330, 1822487137, 1817825448,
+    1813133341, 1808410894, 1803658188, 1798875300, 1794062312, 1789219303,
+    1784346356, 1779443550, 1774510969, 1769548695, 1764556811, 1759535400,
+    1754484547, 1749404336, 1744294851, 1739156180, 1733988407, 1728791618,
+    1723565902, 1718311345, 1713028036, 1707716062, 1702375513, 1697006477,
+    1691609046, 1686183309, 1680729356, 1675247280, 1669737171, 1664199123,
+    1658633228, 1653039578, 1647418268, 1641769391, 1636093043, 1630389317,
+    1624658311, 1618900118, 1613114836, 1607302562, 1601463393, 1595597426,
+    1589704760, 1583785493, 1577839725, 1571867554, 1565869082, 1559844407,
+    1553793631, 1547716856, 1541614182, 1535485712, 1529331549, 1523151796,
+    1516946555, 1510715931, 1504460028, 1498178951, 1491872805, 1485541694,
+    1479185727, 1472805008, 1466399644, 1459969743, 1453515412, 1447036759,
+    1440533892, 1434006921, 1427455955, 1420881103, 1414282475, 1407660182,
+    1401014334, 1394345043, 1387652420, 1380936578, 1374197628, 1367435684,
+    1360650858, 1353843264, 1347013016, 1340160228, 1333285016, 1326387493,
+    1319467776, 1312525980, 1305562221, 1298576616, 1291569282, 1284540336,
+    1277489896, 1270418079, 1263325004, 1256210790, 1249075556, 1241919420,
+    1234742504, 1227544926, 1220326808, 1213088269, 1205829433, 1198550418,
+    1191251349, 1183932346, 1176593532, 1169235030, 1161856963, 1154459455,
+    1147042629, 1139606609, 1132151520, 1124677487, 1117184634, 1109673088,
+    1102142973, 1094594416, 1087027543, 1079442480, 1071839355, 1064218295,
+    1056579428, 1048922880, 1041248781, 1033557258, 1025848440, 1018122458,
+    1010379438, 1002619512, 994842809,  987049459,  979239593,  971413341,
+    963570834,  955712204,  947837581,  939947099,  932040888,  924119081,
+    916181811,  908229210,  900261412,  892278549,  884280756,  876268167,
+    868240914,  860199133,  852142958,  844072525,  835987967,  827889421,
+    819777021,  811650904,  803511206,  795358062,  787191610,  779011985,
+    770819326,  762613767,  754395449,  746164506,  737921078,  729665302,
+    721397317,  713117261,  704825271,  696521488,  688206050,  679879096,
+    671540766,  663191198,  654830534,  646458912,  638076473,  629683356,
+    621279704,  612865655,  604441351,  596006933,  587562542,  579108319,
+    570644406,  562170944,  553688075,  545195941,  536694685,  528184448,
+    519665373,  511137602,  502601278,  494056544,  485503544,  476942419,
+    468373313,  459796370,  451211733,  442619546,  434019953,  425413097,
+    416799123,  408178174,  399550395,  390915931,  382274925,  373627522,
+    364973868,  356314107,  347648383,  338976842,  330299629,  321616889,
+    312928767,  304235409,  295536960,  286833566,  278125372,  269412525,
+    260695169,  251973451,  243247517,  234517512,  225783584,  217045877,
+    208304538,  199559714,  190811551,  182060194,  173305792,  164548489,
+    155788433,  147025770,  138260647,  129493210,  120723606,  111951983,
+    103178486,  94403263,    85626459,    76848224,    68068702,    59288041,
+    50506388,    41723890,    32940694,    24156947,    15372795,    6588386
+  },
+  {
+    -2196132,  -10980614,    -19764912,    -28548880,    -37332370,
+    -46115236,    -54897329,    -63678505,    -72458614,    -81237511,
+    -90015049,    -98791081,    -107565459,  -116338038,  -125108670,
+    -133877208,  -142643507,  -151407418,  -160168796,  -168927494,
+    -177683365,  -186436262,  -195186041,  -203932553,  -212675652,
+    -221415193,  -230151030,  -238883014,  -247611002,  -256334846,
+    -265054401,  -273769521,  -282480060,  -291185872,  -299886812,
+    -308582733,  -317273491,  -325958940,  -334638935,  -343313330,
+    -351981981,  -360644742,  -369301468,  -377952014,  -386596236,
+    -395233990,  -403865129,  -412489511,  -421106991,  -429717424,
+    -438320666,  -446916575,  -455505004,  -464085812,  -472658854,
+    -481223988,  -489781068,  -498329954,  -506870500,  -515402565,
+    -523926006,  -532440680,  -540946445,  -549443158,  -557930676,
+    -566408859,  -574877565,  -583336650,  -591785975,  -600225397,
+    -608654776,  -617073970,  -625482838,  -633881240,  -642269036,
+    -650646084,  -659012245,  -667367378,  -675711344,  -684044004,
+    -692365217,  -700674845,  -708972749,  -717258789,  -725532827,
+    -733794725,  -742044344,  -750281547,  -758506195,  -766718150,
+    -774917276,  -783103436,  -791276491,  -799436306,  -807582744,
+    -815715669,  -823834944,  -831940434,  -840032003,  -848109516,
+    -856172837,  -864221831,  -872256365,  -880276303,  -888281511,
+    -896271855,  -904247202,  -912207418,  -920152371,  -928081926,
+    -935995951,  -943894314,  -951776883,  -959643526,  -967494111,
+    -975328507,  -983146582,  -990948207,  -998733250,  -1006501580,
+    -1014253069, -1021987587, -1029705003, -1037405189, -1045088016,
+    -1052753356, -1060401079, -1068031059, -1075643168, -1083237277,
+    -1090813261, -1098370992, -1105910344, -1113431190, -1120933405,
+    -1128416864, -1135881440, -1143327010, -1150753449, -1158160631,
+    -1165548434, -1172916734, -1180265407, -1187594331, -1194903383,
+    -1202192440, -1209461381, -1216710083, -1223938427, -1231146290,
+    -1238333552, -1245500093, -1252645793, -1259770532, -1266874191,
+    -1273956652, -1281017795, -1288057503, -1295075658, -1302072142,
+    -1309046838, -1315999630, -1322930401, -1329839036, -1336725418,
+    -1343589432, -1350430964, -1357249900, -1364046124, -1370819523,
+    -1377569984, -1384297395, -1391001641, -1397682612, -1404340196,
+    -1410974280, -1417584754, -1424171508, -1430734431, -1437273413,
+    -1443788345, -1450279119, -1456745624, -1463187754, -1469605400,
+    -1475998454, -1482366811, -1488710363, -1495029005, -1501322630,
+    -1507591133, -1513834409, -1520052355, -1526244865, -1532411836,
+    -1538553165, -1544668750, -1550758487, -1556822275, -1562860013,
+    -1568871600, -1574856934, -1580815916, -1586748446, -1592654425,
+    -1598533753, -1604386334, -1610212067, -1616010857, -1621782607,
+    -1627527218, -1633244596, -1638934645, -1644597269, -1650232375,
+    -1655839866, -1661419650, -1666971634, -1672495724, -1677991828,
+    -1683459854, -1688899710, -1694311306, -1699694550, -1705049354,
+    -1710375626, -1715673279, -1720942223, -1726182371, -1731393634,
+    -1736575926, -1741729159, -1746853247, -1751948106, -1757013649,
+    -1762049791, -1767056449, -1772033539, -1776980976, -1781898680,
+    -1786786567, -1791644555, -1796472564, -1801270512, -1806038319,
+    -1810775905, -1815483192, -1820160100, -1824806550, -1829422467,
+    -1834007771, -1838562387, -1843086237, -1847579248, -1852041342,
+    -1856472446, -1860872486, -1865241387, -1869579077, -1873885483,
+    -1878160533, -1882404156, -1886616280, -1890796835, -1894945752,
+    -1899062960, -1903148391, -1907201976, -1911223648, -1915213339,
+    -1919170982, -1923096512, -1926989863, -1930850969, -1934679765,
+    -1938476189, -1942240176, -1945971663, -1949670588, -1953336889,
+    -1956970504, -1960571374, -1964139437, -1967674633, -1971176905,
+    -1974646192, -1978082438, -1981485584, -1984855573, -1988192350,
+    -1991495858, -1994766042, -1998002848, -2001206221, -2004376107,
+    -2007512454, -2010615209, -2013684320, -2016719736, -2019721406,
+    -2022689280, -2025623308, -2028523440, -2031389630, -2034221828,
+    -2037019987, -2039784060, -2042514001, -2045209765, -2047871306,
+    -2050498580, -2053091543, -2055650151, -2058174361, -2060664132,
+    -2063119422, -2065540189, -2067926393, -2070277994, -2072594954,
+    -2074877232, -2077124791, -2079337593, -2081515602, -2083658780,
+    -2085767092, -2087840503, -2089878978, -2091882483, -2093850983,
+    -2095784448, -2097682843, -2099546137, -2101374300, -2103167300,
+    -2104925108, -2106647693, -2108335028, -2109987084, -2111603833,
+    -2113185248, -2114731304, -2116241973, -2117717231, -2119157053,
+    -2120561414, -2121930293, -2123263664, -2124561507, -2125823800,
+    -2127050521, -2128241649, -2129397166, -2130517051, -2131601286,
+    -2132649852, -2133662733, -2134639911, -2135581369, -2136487093,
+    -2137357067, -2138191276, -2138989706, -2139752345, -2140479179,
+    -2141170196, -2141825384, -2142444733, -2143028233, -2143575872,
+    -2144087643, -2144563537, -2145003546, -2145407662, -2145775879,
+    -2146108190, -2146404590, -2146665074, -2146889638, -2147078277,
+    -2147230990, -2147347772, -2147428623, -2147473540}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_256[4][256] = {
-    {2147481120, 2147420481, 2147278994, 2147056662, 2146753495, 2146369504,
-     2145904703, 2145359111, 2144732746, 2144025634, 2143237800, 2142369275,
-     2141420091, 2140390283, 2139279891, 2138088956, 2136817524, 2135465641,
-     2134033359, 2132520732, 2130927817, 2129254674, 2127501366, 2125667958,
-     2123754520, 2121761124, 2119687845, 2117534761, 2115301953, 2112989505,
-     2110597504, 2108126040, 2105575206, 2102945099, 2100235817, 2097447462,
-     2094580140, 2091633958, 2088609027, 2085505461, 2082323377, 2079062895,
-     2075724137, 2072307229, 2068812301, 2065239482, 2061588909, 2057860717,
-     2054055049, 2050172046, 2046211856, 2042174627, 2038060511, 2033869663,
-     2029602242, 2025258407, 2020838322, 2016342154, 2011770071, 2007122247,
-     2002398855, 1997600075, 1992726085, 1987777071, 1982753218, 1977654716,
-     1972481756, 1967234533, 1961913245, 1956518092, 1951049277, 1945507007,
-     1939891489, 1934202935, 1928441559, 1922607579, 1916701214, 1910722686,
-     1904672221, 1898550045, 1892356390, 1886091490, 1879755578, 1873348896,
-     1866871682, 1860324182, 1853706642, 1847019310, 1840262440, 1833436285,
-     1826541101, 1819577150, 1812544693, 1805443994, 1798275321, 1791038944,
-     1783735136, 1776364171, 1768926327, 1761421884, 1753851124, 1746214333,
-     1738511798, 1730743809, 1722910658, 1715012641, 1707050054, 1699023198,
-     1690932375, 1682777889, 1674560047, 1666279160, 1657935537, 1649529495,
-     1641061348, 1632531417, 1623940021, 1615287485, 1606574135, 1597800298,
-     1588966305, 1580072488, 1571119182, 1562106724, 1553035454, 1543905713,
-     1534717845, 1525472195, 1516169113, 1506808947, 1497392051, 1487918779,
-     1478389488, 1468804536, 1459164285, 1449469097, 1439719337, 1429915373,
-     1420057573, 1410146308, 1400181953, 1390164881, 1380095471, 1369974100,
-     1359801151, 1349577006, 1339302051, 1328976671, 1318601256, 1308176197,
-     1297701885, 1287178716, 1276607085, 1265987391, 1255320033, 1244605413,
-     1233843934, 1223036001, 1212182022, 1201282406, 1190337561, 1179347901,
-     1168313839, 1157235791, 1146114173, 1134949405, 1123741907, 1112492100,
-     1101200409, 1089867258, 1078493075, 1067078287, 1055623323, 1044128616,
-     1032594599, 1021021705, 1009410369, 997761030,  986074126,  974350097,
-     962589384,  950792430,  938959680,  927091578,  915188571,  903251109,
-     891279639,  879274613,  867236483,  855165702,  843062725,  830928006,
-     818762004,  806565176,  794337981,  782080880,  769794333,  757478805,
-     745134758,  732762657,  720362967,  707936157,  695482693,  683003045,
-     670497682,  657967075,  645411696,  632832017,  620228513,  607601658,
-     594951926,  582279796,  569585742,  556870244,  544133780,  531376830,
-     518599874,  505803393,  492987869,  480153783,  467301621,  454431865,
-     441544999,  428641510,  415721883,  402786603,  389836160,  376871039,
-     363891729,  350898719,  337892497,  324873555,  311842381,  298799466,
-     285745301,  272680379,  259605190,  246520227,  233425983,  220322950,
-     207211623,  194092494,  180966058,  167832808,  154693239,  141547847,
-     128397125,  115241569,  102081674,  88917936,   75750851,   62580913,
-     49408619,   36234465,   23058947,   9882561},
-    {-3294197,    -16470831,   -29646846,   -42821744,   -55995030,
-     -69166207,   -82334781,   -95500255,   -108662133,  -121819920,
-     -134973121,  -148121240,  -161263783,  -174400253,  -187530158,
-     -200653003,  -213768293,  -226875534,  -239974234,  -253063900,
-     -266144037,  -279214154,  -292273759,  -305322360,  -318359466,
-     -331384586,  -344397229,  -357396906,  -370383127,  -383355403,
-     -396313247,  -409256169,  -422183683,  -435095302,  -447990540,
-     -460868912,  -473729932,  -486573116,  -499397981,  -512204044,
-     -524990823,  -537757836,  -550504603,  -563230644,  -575935479,
-     -588618631,  -601279622,  -613917975,  -626533214,  -639124864,
-     -651692452,  -664235504,  -676753548,  -689246113,  -701712727,
-     -714152923,  -726566231,  -738952185,  -751310317,  -763640163,
-     -775941258,  -788213140,  -800455345,  -812667415,  -824848887,
-     -836999305,  -849118210,  -861205146,  -873259658,  -885281292,
-     -897269597,  -909224119,  -921144410,  -933030020,  -944880502,
-     -956695410,  -968474299,  -980216725,  -991922247,  -1003590423,
-     -1015220815, -1026812984, -1038366494, -1049880911, -1061355800,
-     -1072790729, -1084185269, -1095538990, -1106851464, -1118122266,
-     -1129350971, -1140537157, -1151680402, -1162780287, -1173836394,
-     -1184848307, -1195815611, -1206737893, -1217614742, -1228445749,
-     -1239230505, -1249968605, -1260659645, -1271303221, -1281898933,
-     -1292446383, -1302945173, -1313394908, -1323795194, -1334145640,
-     -1344445856, -1354695454, -1364894049, -1375041257, -1385136695,
-     -1395179983, -1405170743, -1415108600, -1424993179, -1434824107,
-     -1444601016, -1454323535, -1463991301, -1473603947, -1483161114,
-     -1492662440, -1502107569, -1511496144, -1520827811, -1530102221,
-     -1539319023, -1548477871, -1557578419, -1566620326, -1575603250,
-     -1584526853, -1593390800, -1602194757, -1610938392, -1619621376,
-     -1628243382, -1636804086, -1645303165, -1653740299, -1662115171,
-     -1670427465, -1678676868, -1686863071, -1694985763, -1703044641,
-     -1711039400, -1718969739, -1726835360, -1734635967, -1742371265,
-     -1750040965, -1757644776, -1765182413, -1772653592, -1780058031,
-     -1787395452, -1794665579, -1801868137, -1809002857, -1816069468,
-     -1823067705, -1829997305, -1836858007, -1843649552, -1850371684,
-     -1857024151, -1863606703, -1870119090, -1876561068, -1882932395,
-     -1889232831, -1895462138, -1901620082, -1907706431, -1913720956,
-     -1919663431, -1925533631, -1931331336, -1937056328, -1942708390,
-     -1948287311, -1953792880, -1959224889, -1964583135, -1969867415,
-     -1975077531, -1980213286, -1985274488, -1990260945, -1995172470,
-     -2000008877, -2004769986, -2009455616, -2014065591, -2018599738,
-     -2023057885, -2027439866, -2031745514, -2035974669, -2040127170,
-     -2044202862, -2048201590, -2052123205, -2055967559, -2059734506,
-     -2063423906, -2067035619, -2070569510, -2074025444, -2077403293,
-     -2080702928, -2083924227, -2087067066, -2090131329, -2093116900,
-     -2096023666, -2098851517, -2101600349, -2104270056, -2106860538,
-     -2109371699, -2111803443, -2114155678, -2116428317, -2118621274,
-     -2120734465, -2122767812, -2124721239, -2126594670, -2128388037,
-     -2130101271, -2131734307, -2133287086, -2134759547, -2136151635,
-     -2137463299, -2138694489, -2139845157, -2140915262, -2141904763,
-     -2142813622, -2143641805, -2144389282, -2145056023, -2145642005,
-     -2146147204, -2146571602, -2146915182, -2147177933, -2147359843,
-     -2147460907},
-    {2147483647, 2147443221, 2147321945, 2147119824, 2146836865, 2146473078,
-     2146028478, 2145503082, 2144896908, 2144209981, 2143442325, 2142593969,
-     2141664947, 2140655291, 2139565041, 2138394238, 2137142926, 2135811151,
-     2134398964, 2132906418, 2131333570, 2129680478, 2127947205, 2126133816,
-     2124240379, 2122266965, 2120213650, 2118080509, 2115867624, 2113575078,
-     2111202957, 2108751350, 2106220350, 2103610052, 2100920555, 2098151959,
-     2095304368, 2092377891, 2089372636, 2086288718, 2083126253, 2079885359,
-     2076566158, 2073168776, 2069693340, 2066139982, 2062508834, 2058800034,
-     2055013722, 2051150039, 2047209132, 2043191148, 2039096240, 2034924560,
-     2030676267, 2026351520, 2021950482, 2017473319, 2012920199, 2008291294,
-     2003586778, 1998806828, 1993951623, 1989021348, 1984016187, 1978936329,
-     1973781966, 1968553290, 1963250500, 1957873794, 1952423376, 1946899449,
-     1941302224, 1935631909, 1929888719, 1924072869, 1918184579, 1912224071,
-     1906191569, 1900087299, 1893911493, 1887664381, 1881346200, 1874957188,
-     1868497584, 1861967633, 1855367579, 1848697672, 1841958163, 1835149305,
-     1828271354, 1821324571, 1814309215, 1807225552, 1800073847, 1792854371,
-     1785567395, 1778213193, 1770792043, 1763304223, 1755750016, 1748129706,
-     1740443579, 1732691926, 1724875039, 1716993210, 1709046738, 1701035921,
-     1692961061, 1684822462, 1676620430, 1668355275, 1660027307, 1651636840,
-     1643184190, 1634669674, 1626093615, 1617456334, 1608758156, 1599999410,
-     1591180424, 1582301532, 1573363067, 1564365365, 1555308767, 1546193611,
-     1537020242, 1527789006, 1518500249, 1509154321, 1499751575, 1490292363,
-     1480777043, 1471205973, 1461579512, 1451898024, 1442161873, 1432371425,
-     1422527049, 1412629116, 1402677998, 1392674071, 1382617709, 1372509293,
-     1362349203, 1352137821, 1341875532, 1331562722, 1321199779, 1310787094,
-     1300325059, 1289814067, 1279254514, 1268646799, 1257991319, 1247288476,
-     1236538674, 1225742317, 1214899812, 1204011566, 1193077990, 1182099495,
-     1171076494, 1160009404, 1148898639, 1137744620, 1126547764, 1115308495,
-     1104027236, 1092704410, 1081340444, 1069935767, 1058490807, 1047005996,
-     1035481765, 1023918549, 1012316783, 1000676904, 988999350,  977284561,
-     965532977,  953745042,  941921199,  930061893,  918167571,  906238680,
-     894275670,  882278991,  870249094,  858186434,  846091463,  833964637,
-     821806412,  809617248,  797397601,  785147933,  772868705,  760560379,
-     748223418,  735858286,  723465451,  711045377,  698598532,  686125386,
-     673626407,  661102067,  648552837,  635979189,  623381597,  610760535,
-     598116478,  585449902,  572761285,  560051103,  547319836,  534567962,
-     521795962,  509004317,  496193509,  483364018,  470516330,  457650927,
-     444768293,  431868914,  418953276,  406021864,  393075166,  380113668,
-     367137860,  354148229,  341145265,  328129456,  315101294,  302061268,
-     289009870,  275947591,  262874923,  249792357,  236700387,  223599506,
-     210490205,  197372981,  184248325,  171116732,  157978697,  144834714,
-     131685278,  118530884,  105372028,  92209204,   79042909,   65873638,
-     52701886,   39528151,   26352927,   13176711},
-    {0,           -13176711,   -26352927,   -39528151,   -52701886,
-     -65873638,   -79042909,   -92209204,   -105372028,  -118530884,
-     -131685278,  -144834714,  -157978697,  -171116732,  -184248325,
-     -197372981,  -210490205,  -223599506,  -236700387,  -249792357,
-     -262874923,  -275947591,  -289009870,  -302061268,  -315101294,
-     -328129456,  -341145265,  -354148229,  -367137860,  -380113668,
-     -393075166,  -406021864,  -418953276,  -431868914,  -444768293,
-     -457650927,  -470516330,  -483364018,  -496193509,  -509004317,
-     -521795962,  -534567962,  -547319836,  -560051103,  -572761285,
-     -585449902,  -598116478,  -610760535,  -623381597,  -635979189,
-     -648552837,  -661102067,  -673626407,  -686125386,  -698598532,
-     -711045377,  -723465451,  -735858286,  -748223418,  -760560379,
-     -772868705,  -785147933,  -797397601,  -809617248,  -821806412,
-     -833964637,  -846091463,  -858186434,  -870249094,  -882278991,
-     -894275670,  -906238680,  -918167571,  -930061893,  -941921199,
-     -953745042,  -965532977,  -977284561,  -988999350,  -1000676904,
-     -1012316783, -1023918549, -1035481765, -1047005996, -1058490807,
-     -1069935767, -1081340444, -1092704410, -1104027236, -1115308495,
-     -1126547764, -1137744620, -1148898639, -1160009404, -1171076494,
-     -1182099495, -1193077990, -1204011566, -1214899812, -1225742317,
-     -1236538674, -1247288476, -1257991319, -1268646799, -1279254514,
-     -1289814067, -1300325059, -1310787094, -1321199779, -1331562722,
-     -1341875532, -1352137821, -1362349203, -1372509293, -1382617709,
-     -1392674071, -1402677998, -1412629116, -1422527049, -1432371425,
-     -1442161873, -1451898024, -1461579512, -1471205973, -1480777043,
-     -1490292363, -1499751575, -1509154321, -1518500249, -1527789006,
-     -1537020242, -1546193611, -1555308767, -1564365365, -1573363067,
-     -1582301532, -1591180424, -1599999410, -1608758156, -1617456334,
-     -1626093615, -1634669674, -1643184190, -1651636840, -1660027307,
-     -1668355275, -1676620430, -1684822462, -1692961061, -1701035921,
-     -1709046738, -1716993210, -1724875039, -1732691926, -1740443579,
-     -1748129706, -1755750016, -1763304223, -1770792043, -1778213193,
-     -1785567395, -1792854371, -1800073847, -1807225552, -1814309215,
-     -1821324571, -1828271354, -1835149305, -1841958163, -1848697672,
-     -1855367579, -1861967633, -1868497584, -1874957188, -1881346200,
-     -1887664381, -1893911493, -1900087299, -1906191569, -1912224071,
-     -1918184579, -1924072869, -1929888719, -1935631909, -1941302224,
-     -1946899449, -1952423376, -1957873794, -1963250500, -1968553290,
-     -1973781966, -1978936329, -1984016187, -1989021348, -1993951623,
-     -1998806828, -2003586778, -2008291294, -2012920199, -2017473319,
-     -2021950482, -2026351520, -2030676267, -2034924560, -2039096240,
-     -2043191148, -2047209132, -2051150039, -2055013722, -2058800034,
-     -2062508834, -2066139982, -2069693340, -2073168776, -2076566158,
-     -2079885359, -2083126253, -2086288718, -2089372636, -2092377891,
-     -2095304368, -2098151959, -2100920555, -2103610052, -2106220350,
-     -2108751350, -2111202957, -2113575078, -2115867624, -2118080509,
-     -2120213650, -2122266965, -2124240379, -2126133816, -2127947205,
-     -2129680478, -2131333570, -2132906418, -2134398964, -2135811151,
-     -2137142926, -2138394238, -2139565041, -2140655291, -2141664947,
-     -2142593969, -2143442325, -2144209981, -2144896908, -2145503082,
-     -2146028478, -2146473078, -2146836865, -2147119824, -2147321945,
-     -2147443221}};
+  {
+    2147481120, 2147420481, 2147278994, 2147056662, 2146753495, 2146369504,
+    2145904703, 2145359111, 2144732746, 2144025634, 2143237800, 2142369275,
+    2141420091, 2140390283, 2139279891, 2138088956, 2136817524, 2135465641,
+    2134033359, 2132520732, 2130927817, 2129254674, 2127501366, 2125667958,
+    2123754520, 2121761124, 2119687845, 2117534761, 2115301953, 2112989505,
+    2110597504, 2108126040, 2105575206, 2102945099, 2100235817, 2097447462,
+    2094580140, 2091633958, 2088609027, 2085505461, 2082323377, 2079062895,
+    2075724137, 2072307229, 2068812301, 2065239482, 2061588909, 2057860717,
+    2054055049, 2050172046, 2046211856, 2042174627, 2038060511, 2033869663,
+    2029602242, 2025258407, 2020838322, 2016342154, 2011770071, 2007122247,
+    2002398855, 1997600075, 1992726085, 1987777071, 1982753218, 1977654716,
+    1972481756, 1967234533, 1961913245, 1956518092, 1951049277, 1945507007,
+    1939891489, 1934202935, 1928441559, 1922607579, 1916701214, 1910722686,
+    1904672221, 1898550045, 1892356390, 1886091490, 1879755578, 1873348896,
+    1866871682, 1860324182, 1853706642, 1847019310, 1840262440, 1833436285,
+    1826541101, 1819577150, 1812544693, 1805443994, 1798275321, 1791038944,
+    1783735136, 1776364171, 1768926327, 1761421884, 1753851124, 1746214333,
+    1738511798, 1730743809, 1722910658, 1715012641, 1707050054, 1699023198,
+    1690932375, 1682777889, 1674560047, 1666279160, 1657935537, 1649529495,
+    1641061348, 1632531417, 1623940021, 1615287485, 1606574135, 1597800298,
+    1588966305, 1580072488, 1571119182, 1562106724, 1553035454, 1543905713,
+    1534717845, 1525472195, 1516169113, 1506808947, 1497392051, 1487918779,
+    1478389488, 1468804536, 1459164285, 1449469097, 1439719337, 1429915373,
+    1420057573, 1410146308, 1400181953, 1390164881, 1380095471, 1369974100,
+    1359801151, 1349577006, 1339302051, 1328976671, 1318601256, 1308176197,
+    1297701885, 1287178716, 1276607085, 1265987391, 1255320033, 1244605413,
+    1233843934, 1223036001, 1212182022, 1201282406, 1190337561, 1179347901,
+    1168313839, 1157235791, 1146114173, 1134949405, 1123741907, 1112492100,
+    1101200409, 1089867258, 1078493075, 1067078287, 1055623323, 1044128616,
+    1032594599, 1021021705, 1009410369, 997761030,  986074126,  974350097,
+    962589384,  950792430,  938959680,  927091578,  915188571,  903251109,
+    891279639,  879274613,  867236483,  855165702,  843062725,  830928006,
+    818762004,  806565176,  794337981,  782080880,  769794333,  757478805,
+    745134758,  732762657,  720362967,  707936157,  695482693,  683003045,
+    670497682,  657967075,  645411696,  632832017,  620228513,  607601658,
+    594951926,  582279796,  569585742,  556870244,  544133780,  531376830,
+    518599874,  505803393,  492987869,  480153783,  467301621,  454431865,
+    441544999,  428641510,  415721883,  402786603,  389836160,  376871039,
+    363891729,  350898719,  337892497,  324873555,  311842381,  298799466,
+    285745301,  272680379,  259605190,  246520227,  233425983,  220322950,
+    207211623,  194092494,  180966058,  167832808,  154693239,  141547847,
+    128397125,  115241569,  102081674,  88917936,    75750851,    62580913,
+    49408619,    36234465,    23058947,    9882561
+  },
+  {
+    -3294197,  -16470831,    -29646846,    -42821744,    -55995030,
+    -69166207,    -82334781,    -95500255,    -108662133,  -121819920,
+    -134973121,  -148121240,  -161263783,  -174400253,  -187530158,
+    -200653003,  -213768293,  -226875534,  -239974234,  -253063900,
+    -266144037,  -279214154,  -292273759,  -305322360,  -318359466,
+    -331384586,  -344397229,  -357396906,  -370383127,  -383355403,
+    -396313247,  -409256169,  -422183683,  -435095302,  -447990540,
+    -460868912,  -473729932,  -486573116,  -499397981,  -512204044,
+    -524990823,  -537757836,  -550504603,  -563230644,  -575935479,
+    -588618631,  -601279622,  -613917975,  -626533214,  -639124864,
+    -651692452,  -664235504,  -676753548,  -689246113,  -701712727,
+    -714152923,  -726566231,  -738952185,  -751310317,  -763640163,
+    -775941258,  -788213140,  -800455345,  -812667415,  -824848887,
+    -836999305,  -849118210,  -861205146,  -873259658,  -885281292,
+    -897269597,  -909224119,  -921144410,  -933030020,  -944880502,
+    -956695410,  -968474299,  -980216725,  -991922247,  -1003590423,
+    -1015220815, -1026812984, -1038366494, -1049880911, -1061355800,
+    -1072790729, -1084185269, -1095538990, -1106851464, -1118122266,
+    -1129350971, -1140537157, -1151680402, -1162780287, -1173836394,
+    -1184848307, -1195815611, -1206737893, -1217614742, -1228445749,
+    -1239230505, -1249968605, -1260659645, -1271303221, -1281898933,
+    -1292446383, -1302945173, -1313394908, -1323795194, -1334145640,
+    -1344445856, -1354695454, -1364894049, -1375041257, -1385136695,
+    -1395179983, -1405170743, -1415108600, -1424993179, -1434824107,
+    -1444601016, -1454323535, -1463991301, -1473603947, -1483161114,
+    -1492662440, -1502107569, -1511496144, -1520827811, -1530102221,
+    -1539319023, -1548477871, -1557578419, -1566620326, -1575603250,
+    -1584526853, -1593390800, -1602194757, -1610938392, -1619621376,
+    -1628243382, -1636804086, -1645303165, -1653740299, -1662115171,
+    -1670427465, -1678676868, -1686863071, -1694985763, -1703044641,
+    -1711039400, -1718969739, -1726835360, -1734635967, -1742371265,
+    -1750040965, -1757644776, -1765182413, -1772653592, -1780058031,
+    -1787395452, -1794665579, -1801868137, -1809002857, -1816069468,
+    -1823067705, -1829997305, -1836858007, -1843649552, -1850371684,
+    -1857024151, -1863606703, -1870119090, -1876561068, -1882932395,
+    -1889232831, -1895462138, -1901620082, -1907706431, -1913720956,
+    -1919663431, -1925533631, -1931331336, -1937056328, -1942708390,
+    -1948287311, -1953792880, -1959224889, -1964583135, -1969867415,
+    -1975077531, -1980213286, -1985274488, -1990260945, -1995172470,
+    -2000008877, -2004769986, -2009455616, -2014065591, -2018599738,
+    -2023057885, -2027439866, -2031745514, -2035974669, -2040127170,
+    -2044202862, -2048201590, -2052123205, -2055967559, -2059734506,
+    -2063423906, -2067035619, -2070569510, -2074025444, -2077403293,
+    -2080702928, -2083924227, -2087067066, -2090131329, -2093116900,
+    -2096023666, -2098851517, -2101600349, -2104270056, -2106860538,
+    -2109371699, -2111803443, -2114155678, -2116428317, -2118621274,
+    -2120734465, -2122767812, -2124721239, -2126594670, -2128388037,
+    -2130101271, -2131734307, -2133287086, -2134759547, -2136151635,
+    -2137463299, -2138694489, -2139845157, -2140915262, -2141904763,
+    -2142813622, -2143641805, -2144389282, -2145056023, -2145642005,
+    -2146147204, -2146571602, -2146915182, -2147177933, -2147359843,
+    -2147460907
+  },
+  {
+    2147483647, 2147443221, 2147321945, 2147119824, 2146836865, 2146473078,
+    2146028478, 2145503082, 2144896908, 2144209981, 2143442325, 2142593969,
+    2141664947, 2140655291, 2139565041, 2138394238, 2137142926, 2135811151,
+    2134398964, 2132906418, 2131333570, 2129680478, 2127947205, 2126133816,
+    2124240379, 2122266965, 2120213650, 2118080509, 2115867624, 2113575078,
+    2111202957, 2108751350, 2106220350, 2103610052, 2100920555, 2098151959,
+    2095304368, 2092377891, 2089372636, 2086288718, 2083126253, 2079885359,
+    2076566158, 2073168776, 2069693340, 2066139982, 2062508834, 2058800034,
+    2055013722, 2051150039, 2047209132, 2043191148, 2039096240, 2034924560,
+    2030676267, 2026351520, 2021950482, 2017473319, 2012920199, 2008291294,
+    2003586778, 1998806828, 1993951623, 1989021348, 1984016187, 1978936329,
+    1973781966, 1968553290, 1963250500, 1957873794, 1952423376, 1946899449,
+    1941302224, 1935631909, 1929888719, 1924072869, 1918184579, 1912224071,
+    1906191569, 1900087299, 1893911493, 1887664381, 1881346200, 1874957188,
+    1868497584, 1861967633, 1855367579, 1848697672, 1841958163, 1835149305,
+    1828271354, 1821324571, 1814309215, 1807225552, 1800073847, 1792854371,
+    1785567395, 1778213193, 1770792043, 1763304223, 1755750016, 1748129706,
+    1740443579, 1732691926, 1724875039, 1716993210, 1709046738, 1701035921,
+    1692961061, 1684822462, 1676620430, 1668355275, 1660027307, 1651636840,
+    1643184190, 1634669674, 1626093615, 1617456334, 1608758156, 1599999410,
+    1591180424, 1582301532, 1573363067, 1564365365, 1555308767, 1546193611,
+    1537020242, 1527789006, 1518500249, 1509154321, 1499751575, 1490292363,
+    1480777043, 1471205973, 1461579512, 1451898024, 1442161873, 1432371425,
+    1422527049, 1412629116, 1402677998, 1392674071, 1382617709, 1372509293,
+    1362349203, 1352137821, 1341875532, 1331562722, 1321199779, 1310787094,
+    1300325059, 1289814067, 1279254514, 1268646799, 1257991319, 1247288476,
+    1236538674, 1225742317, 1214899812, 1204011566, 1193077990, 1182099495,
+    1171076494, 1160009404, 1148898639, 1137744620, 1126547764, 1115308495,
+    1104027236, 1092704410, 1081340444, 1069935767, 1058490807, 1047005996,
+    1035481765, 1023918549, 1012316783, 1000676904, 988999350,  977284561,
+    965532977,  953745042,  941921199,  930061893,  918167571,  906238680,
+    894275670,  882278991,  870249094,  858186434,  846091463,  833964637,
+    821806412,  809617248,  797397601,  785147933,  772868705,  760560379,
+    748223418,  735858286,  723465451,  711045377,  698598532,  686125386,
+    673626407,  661102067,  648552837,  635979189,  623381597,  610760535,
+    598116478,  585449902,  572761285,  560051103,  547319836,  534567962,
+    521795962,  509004317,  496193509,  483364018,  470516330,  457650927,
+    444768293,  431868914,  418953276,  406021864,  393075166,  380113668,
+    367137860,  354148229,  341145265,  328129456,  315101294,  302061268,
+    289009870,  275947591,  262874923,  249792357,  236700387,  223599506,
+    210490205,  197372981,  184248325,  171116732,  157978697,  144834714,
+    131685278,  118530884,  105372028,  92209204,    79042909,    65873638,
+    52701886,    39528151,    26352927,    13176711
+  },
+  {
+    0,         -13176711,    -26352927,    -39528151,    -52701886,
+    -65873638,    -79042909,    -92209204,    -105372028,  -118530884,
+    -131685278,  -144834714,  -157978697,  -171116732,  -184248325,
+    -197372981,  -210490205,  -223599506,  -236700387,  -249792357,
+    -262874923,  -275947591,  -289009870,  -302061268,  -315101294,
+    -328129456,  -341145265,  -354148229,  -367137860,  -380113668,
+    -393075166,  -406021864,  -418953276,  -431868914,  -444768293,
+    -457650927,  -470516330,  -483364018,  -496193509,  -509004317,
+    -521795962,  -534567962,  -547319836,  -560051103,  -572761285,
+    -585449902,  -598116478,  -610760535,  -623381597,  -635979189,
+    -648552837,  -661102067,  -673626407,  -686125386,  -698598532,
+    -711045377,  -723465451,  -735858286,  -748223418,  -760560379,
+    -772868705,  -785147933,  -797397601,  -809617248,  -821806412,
+    -833964637,  -846091463,  -858186434,  -870249094,  -882278991,
+    -894275670,  -906238680,  -918167571,  -930061893,  -941921199,
+    -953745042,  -965532977,  -977284561,  -988999350,  -1000676904,
+    -1012316783, -1023918549, -1035481765, -1047005996, -1058490807,
+    -1069935767, -1081340444, -1092704410, -1104027236, -1115308495,
+    -1126547764, -1137744620, -1148898639, -1160009404, -1171076494,
+    -1182099495, -1193077990, -1204011566, -1214899812, -1225742317,
+    -1236538674, -1247288476, -1257991319, -1268646799, -1279254514,
+    -1289814067, -1300325059, -1310787094, -1321199779, -1331562722,
+    -1341875532, -1352137821, -1362349203, -1372509293, -1382617709,
+    -1392674071, -1402677998, -1412629116, -1422527049, -1432371425,
+    -1442161873, -1451898024, -1461579512, -1471205973, -1480777043,
+    -1490292363, -1499751575, -1509154321, -1518500249, -1527789006,
+    -1537020242, -1546193611, -1555308767, -1564365365, -1573363067,
+    -1582301532, -1591180424, -1599999410, -1608758156, -1617456334,
+    -1626093615, -1634669674, -1643184190, -1651636840, -1660027307,
+    -1668355275, -1676620430, -1684822462, -1692961061, -1701035921,
+    -1709046738, -1716993210, -1724875039, -1732691926, -1740443579,
+    -1748129706, -1755750016, -1763304223, -1770792043, -1778213193,
+    -1785567395, -1792854371, -1800073847, -1807225552, -1814309215,
+    -1821324571, -1828271354, -1835149305, -1841958163, -1848697672,
+    -1855367579, -1861967633, -1868497584, -1874957188, -1881346200,
+    -1887664381, -1893911493, -1900087299, -1906191569, -1912224071,
+    -1918184579, -1924072869, -1929888719, -1935631909, -1941302224,
+    -1946899449, -1952423376, -1957873794, -1963250500, -1968553290,
+    -1973781966, -1978936329, -1984016187, -1989021348, -1993951623,
+    -1998806828, -2003586778, -2008291294, -2012920199, -2017473319,
+    -2021950482, -2026351520, -2030676267, -2034924560, -2039096240,
+    -2043191148, -2047209132, -2051150039, -2055013722, -2058800034,
+    -2062508834, -2066139982, -2069693340, -2073168776, -2076566158,
+    -2079885359, -2083126253, -2086288718, -2089372636, -2092377891,
+    -2095304368, -2098151959, -2100920555, -2103610052, -2106220350,
+    -2108751350, -2111202957, -2113575078, -2115867624, -2118080509,
+    -2120213650, -2122266965, -2124240379, -2126133816, -2127947205,
+    -2129680478, -2131333570, -2132906418, -2134398964, -2135811151,
+    -2137142926, -2138394238, -2139565041, -2140655291, -2141664947,
+    -2142593969, -2143442325, -2144209981, -2144896908, -2145503082,
+    -2146028478, -2146473078, -2146836865, -2147119824, -2147321945,
+    -2147443221}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_192[4][192] = {
-    {2147479155, 2147371353, 2147119824, 2146724583, 2146185657, 2145503082,
-     2144676904, 2143707178, 2142593969, 2141337352, 2139937411, 2138394238,
-     2136707939, 2134878625, 2132906418, 2130791452, 2128533868, 2126133816,
-     2123591457, 2120906961, 2118080509, 2115112289, 2112002500, 2108751350,
-     2105359057, 2101825848, 2098151959, 2094337635, 2090383134, 2086288718,
-     2082054663, 2077681251, 2073168776, 2068517539, 2063727851, 2058800034,
-     2053734417, 2048531339, 2043191148, 2037714202, 2032100868, 2026351520,
-     2020466545, 2014446335, 2008291294, 2002001834, 1995578375, 1989021348,
-     1982331192, 1975508353, 1968553290, 1961466467, 1954248359, 1946899449,
-     1939420229, 1931811199, 1924072869, 1916205757, 1908210388, 1900087299,
-     1891837033, 1883460143, 1874957188, 1866328738, 1857575371, 1848697672,
-     1839696236, 1830571666, 1821324571, 1811955570, 1802465292, 1792854371,
-     1783123450, 1773273181, 1763304223, 1753217243, 1743012917, 1732691926,
-     1722254963, 1711702726, 1701035921, 1690255262, 1679361470, 1668355275,
-     1657237413, 1646008629, 1634669674, 1623221307, 1611664295, 1599999410,
-     1588227433, 1576349154, 1564365365, 1552276871, 1540084479, 1527789006,
-     1515391275, 1502892115, 1490292363, 1477592863, 1464794465, 1451898024,
-     1438904405, 1425814477, 1412629116, 1399349205, 1385975632, 1372509293,
-     1358951089, 1345301928, 1331562722, 1317734392, 1303817863, 1289814067,
-     1275723941, 1261548428, 1247288476, 1232945041, 1218519083, 1204011566,
-     1189423462, 1174755747, 1160009404, 1145185418, 1130284783, 1115308495,
-     1100257558, 1085132977, 1069935767, 1054666943, 1039327528, 1023918549,
-     1008441037, 992896027,  977284561,  961607683,  945866442,  930061893,
-     914195093,  898267103,  882278991,  866231826,  850126682,  833964637,
-     817746773,  801474175,  785147933,  768769140,  752338891,  735858286,
-     719328429,  702750426,  686125386,  669454422,  652738650,  635979189,
-     619177160,  602333689,  585449902,  568526930,  551565905,  534567962,
-     517534240,  500465878,  483364018,  466229806,  449064389,  431868914,
-     414644534,  397392400,  380113668,  362809495,  345481037,  328129456,
-     310755913,  293361570,  275947591,  258515143,  241065392,  223599506,
-     206118653,  188624005,  171116732,  153598006,  136068999,  118530884,
-     100984836,  83432029,   65873638,   48310837,   30744803,   13176711},
-    {-4392261,    -21960941,   -39528151,   -57092715,   -74653458,
-     -92209204,   -109758778,  -127301006,  -144834714,  -162358727,
-     -179871873,  -197372981,  -214860877,  -232334392,  -249792357,
-     -267233603,  -284656962,  -302061268,  -319445357,  -336808065,
-     -354148229,  -371464689,  -388756287,  -406021864,  -423260265,
-     -440470337,  -457650927,  -474800885,  -491919064,  -509004317,
-     -526055502,  -543071477,  -560051103,  -576993243,  -593896764,
-     -610760535,  -627583425,  -644364311,  -661102067,  -677795575,
-     -694443716,  -711045377,  -727599445,  -744104814,  -760560379,
-     -776965037,  -793317692,  -809617248,  -825862614,  -842052704,
-     -858186434,  -874262723,  -890280496,  -906238680,  -922136208,
-     -937972015,  -953745042,  -969454233,  -985098536,  -1000676904,
-     -1016188295, -1031631670, -1047005996, -1062310243, -1077543387,
-     -1092704410, -1107792295, -1122806033, -1137744620, -1152607054,
-     -1167392343, -1182099495, -1196727526, -1211275459, -1225742317,
-     -1240127135, -1254428947, -1268646799, -1282779736, -1296826815,
-     -1310787094, -1324659640, -1338443523, -1352137821, -1365741618,
-     -1379254002, -1392674071, -1406000924, -1419233671, -1432371425,
-     -1445413308, -1458358446, -1471205973, -1483955029, -1496604760,
-     -1509154321, -1521602871, -1533949576, -1546193611, -1558334156,
-     -1570370398, -1582301532, -1594126759, -1605845288, -1617456334,
-     -1628959120, -1640352876, -1651636840, -1662810256, -1673872377,
-     -1684822462, -1695659778, -1706383600, -1716993210, -1727487898,
-     -1737866961, -1748129706, -1758275444, -1768303497, -1778213193,
-     -1788003870, -1797674872, -1807225552, -1816655270, -1825963395,
-     -1835149305, -1844212384, -1853152026, -1861967633, -1870658614,
-     -1879224388, -1887664381, -1895978029, -1904164775, -1912224071,
-     -1920155378, -1927958165, -1935631909, -1943176097, -1950590224,
-     -1957873794, -1965026319, -1972047321, -1978936329, -1985692883,
-     -1992316530, -1998806828, -2005163340, -2011385643, -2017473319,
-     -2023425962, -2029243172, -2034924560, -2040469747, -2045878361,
-     -2051150039, -2056284430, -2061281189, -2066139982, -2070860483,
-     -2075442378, -2079885359, -2084189128, -2088353398, -2092377891,
-     -2096262335, -2100006473, -2103610052, -2107072833, -2110394582,
-     -2113575078, -2116614108, -2119511468, -2122266965, -2124880414,
-     -2127351640, -2129680478, -2131866772, -2133910375, -2135811151,
-     -2137568973, -2139183722, -2140655291, -2141983582, -2143168505,
-     -2144209981, -2145107940, -2145862323, -2146473078, -2146940166,
-     -2147263554, -2147443221},
-    {2147483647, 2147411779, 2147196180, 2146836865, 2146333857, 2145687190,
-     2144896908, 2143963064, 2142885719, 2141664947, 2140300828, 2138793454,
-     2137142926, 2135349354, 2133412859, 2131333570, 2129111626, 2126747176,
-     2124240379, 2121591401, 2118800421, 2115867624, 2112793208, 2109577379,
-     2106220350, 2102722348, 2099083606, 2095304368, 2091384887, 2087325424,
-     2083126253, 2078787653, 2074309916, 2069693340, 2064938236, 2060044920,
-     2055013722, 2049844977, 2044539031, 2039096240, 2033516967, 2027801588,
-     2021950482, 2015964044, 2009842672, 2003586778, 1997196779, 1990673103,
-     1984016187, 1977226477, 1970304427, 1963250500, 1956065168, 1948748913,
-     1941302224, 1933725599, 1926019545, 1918184579, 1910221225, 1902130016,
-     1893911493, 1885566206, 1877094714, 1868497584, 1859775392, 1850928721,
-     1841958163, 1832864319, 1823647797, 1814309215, 1804849197, 1795268377,
-     1785567395, 1775746901, 1765807553, 1755750016, 1745574962, 1735283073,
-     1724875039, 1714351554, 1703713324, 1692961061, 1682095484, 1671117321,
-     1660027307, 1648826183, 1637514700, 1626093615, 1614563691, 1602925701,
-     1591180424, 1579328646, 1567371160, 1555308767, 1543142273, 1530872493,
-     1518500249, 1506026368, 1493451686, 1480777043, 1468003289, 1455131279,
-     1442161873, 1429095940, 1415934355, 1402677998, 1389327757, 1375884526,
-     1362349203, 1348722695, 1335005915, 1321199779, 1307305213, 1293323146,
-     1279254514, 1265100259, 1250861328, 1236538674, 1222133256, 1207646038,
-     1193077990, 1178430086, 1163703307, 1148898639, 1134017073, 1119059605,
-     1104027236, 1088920971, 1073741823, 1058490807, 1043168944, 1027777259,
-     1012316783, 996788550,  981193601,  965532977,  949807729,  934018908,
-     918167571,  902254779,  886281597,  870249094,  854158344,  838010423,
-     821806412,  805547396,  789234463,  772868705,  756451217,  739983098,
-     723465451,  706899380,  690285995,  673626407,  656921733,  640173089,
-     623381597,  606548381,  589674567,  572761285,  555809666,  538820847,
-     521795962,  504736153,  487642561,  470516330,  453358606,  436170538,
-     418953276,  401707972,  384435782,  367137860,  349815365,  332469456,
-     315101294,  297712042,  280302863,  262874923,  245429388,  227967426,
-     210490205,  192998897,  175494670,  157978697,  140452150,  122916202,
-     105372028,  87820800,   70263695,   52701886,   35136551,   17568863},
-    {0,           -17568863,   -35136551,   -52701886,   -70263695,
-     -87820800,   -105372028,  -122916202,  -140452150,  -157978697,
-     -175494670,  -192998897,  -210490205,  -227967426,  -245429388,
-     -262874923,  -280302863,  -297712042,  -315101294,  -332469456,
-     -349815365,  -367137860,  -384435782,  -401707972,  -418953276,
-     -436170538,  -453358606,  -470516330,  -487642561,  -504736153,
-     -521795962,  -538820847,  -555809666,  -572761285,  -589674567,
-     -606548381,  -623381597,  -640173089,  -656921733,  -673626407,
-     -690285995,  -706899380,  -723465451,  -739983098,  -756451217,
-     -772868705,  -789234463,  -805547396,  -821806412,  -838010423,
-     -854158344,  -870249094,  -886281597,  -902254779,  -918167571,
-     -934018908,  -949807729,  -965532977,  -981193601,  -996788550,
-     -1012316783, -1027777259, -1043168944, -1058490807, -1073741823,
-     -1088920971, -1104027236, -1119059605, -1134017073, -1148898639,
-     -1163703307, -1178430086, -1193077990, -1207646038, -1222133256,
-     -1236538674, -1250861328, -1265100259, -1279254514, -1293323146,
-     -1307305213, -1321199779, -1335005915, -1348722695, -1362349203,
-     -1375884526, -1389327757, -1402677998, -1415934355, -1429095940,
-     -1442161873, -1455131279, -1468003289, -1480777043, -1493451686,
-     -1506026368, -1518500249, -1530872493, -1543142273, -1555308767,
-     -1567371160, -1579328646, -1591180424, -1602925701, -1614563691,
-     -1626093615, -1637514700, -1648826183, -1660027307, -1671117321,
-     -1682095484, -1692961061, -1703713324, -1714351554, -1724875039,
-     -1735283073, -1745574962, -1755750016, -1765807553, -1775746901,
-     -1785567395, -1795268377, -1804849197, -1814309215, -1823647797,
-     -1832864319, -1841958163, -1850928721, -1859775392, -1868497584,
-     -1877094714, -1885566206, -1893911493, -1902130016, -1910221225,
-     -1918184579, -1926019545, -1933725599, -1941302224, -1948748913,
-     -1956065168, -1963250500, -1970304427, -1977226477, -1984016187,
-     -1990673103, -1997196779, -2003586778, -2009842672, -2015964044,
-     -2021950482, -2027801588, -2033516967, -2039096240, -2044539031,
-     -2049844977, -2055013722, -2060044920, -2064938236, -2069693340,
-     -2074309916, -2078787653, -2083126253, -2087325424, -2091384887,
-     -2095304368, -2099083606, -2102722348, -2106220350, -2109577379,
-     -2112793208, -2115867624, -2118800421, -2121591401, -2124240379,
-     -2126747176, -2129111626, -2131333570, -2133412859, -2135349354,
-     -2137142926, -2138793454, -2140300828, -2141664947, -2142885719,
-     -2143963064, -2144896908, -2145687190, -2146333857, -2146836865,
-     -2147196180, -2147411779}};
+  {
+    2147479155, 2147371353, 2147119824, 2146724583, 2146185657, 2145503082,
+    2144676904, 2143707178, 2142593969, 2141337352, 2139937411, 2138394238,
+    2136707939, 2134878625, 2132906418, 2130791452, 2128533868, 2126133816,
+    2123591457, 2120906961, 2118080509, 2115112289, 2112002500, 2108751350,
+    2105359057, 2101825848, 2098151959, 2094337635, 2090383134, 2086288718,
+    2082054663, 2077681251, 2073168776, 2068517539, 2063727851, 2058800034,
+    2053734417, 2048531339, 2043191148, 2037714202, 2032100868, 2026351520,
+    2020466545, 2014446335, 2008291294, 2002001834, 1995578375, 1989021348,
+    1982331192, 1975508353, 1968553290, 1961466467, 1954248359, 1946899449,
+    1939420229, 1931811199, 1924072869, 1916205757, 1908210388, 1900087299,
+    1891837033, 1883460143, 1874957188, 1866328738, 1857575371, 1848697672,
+    1839696236, 1830571666, 1821324571, 1811955570, 1802465292, 1792854371,
+    1783123450, 1773273181, 1763304223, 1753217243, 1743012917, 1732691926,
+    1722254963, 1711702726, 1701035921, 1690255262, 1679361470, 1668355275,
+    1657237413, 1646008629, 1634669674, 1623221307, 1611664295, 1599999410,
+    1588227433, 1576349154, 1564365365, 1552276871, 1540084479, 1527789006,
+    1515391275, 1502892115, 1490292363, 1477592863, 1464794465, 1451898024,
+    1438904405, 1425814477, 1412629116, 1399349205, 1385975632, 1372509293,
+    1358951089, 1345301928, 1331562722, 1317734392, 1303817863, 1289814067,
+    1275723941, 1261548428, 1247288476, 1232945041, 1218519083, 1204011566,
+    1189423462, 1174755747, 1160009404, 1145185418, 1130284783, 1115308495,
+    1100257558, 1085132977, 1069935767, 1054666943, 1039327528, 1023918549,
+    1008441037, 992896027,  977284561,  961607683,  945866442,  930061893,
+    914195093,  898267103,  882278991,  866231826,  850126682,  833964637,
+    817746773,  801474175,  785147933,  768769140,  752338891,  735858286,
+    719328429,  702750426,  686125386,  669454422,  652738650,  635979189,
+    619177160,  602333689,  585449902,  568526930,  551565905,  534567962,
+    517534240,  500465878,  483364018,  466229806,  449064389,  431868914,
+    414644534,  397392400,  380113668,  362809495,  345481037,  328129456,
+    310755913,  293361570,  275947591,  258515143,  241065392,  223599506,
+    206118653,  188624005,  171116732,  153598006,  136068999,  118530884,
+    100984836,  83432029,    65873638,    48310837,    30744803,    13176711
+  },
+  {
+    -4392261,  -21960941,    -39528151,    -57092715,    -74653458,
+    -92209204,    -109758778,  -127301006,  -144834714,  -162358727,
+    -179871873,  -197372981,  -214860877,  -232334392,  -249792357,
+    -267233603,  -284656962,  -302061268,  -319445357,  -336808065,
+    -354148229,  -371464689,  -388756287,  -406021864,  -423260265,
+    -440470337,  -457650927,  -474800885,  -491919064,  -509004317,
+    -526055502,  -543071477,  -560051103,  -576993243,  -593896764,
+    -610760535,  -627583425,  -644364311,  -661102067,  -677795575,
+    -694443716,  -711045377,  -727599445,  -744104814,  -760560379,
+    -776965037,  -793317692,  -809617248,  -825862614,  -842052704,
+    -858186434,  -874262723,  -890280496,  -906238680,  -922136208,
+    -937972015,  -953745042,  -969454233,  -985098536,  -1000676904,
+    -1016188295, -1031631670, -1047005996, -1062310243, -1077543387,
+    -1092704410, -1107792295, -1122806033, -1137744620, -1152607054,
+    -1167392343, -1182099495, -1196727526, -1211275459, -1225742317,
+    -1240127135, -1254428947, -1268646799, -1282779736, -1296826815,
+    -1310787094, -1324659640, -1338443523, -1352137821, -1365741618,
+    -1379254002, -1392674071, -1406000924, -1419233671, -1432371425,
+    -1445413308, -1458358446, -1471205973, -1483955029, -1496604760,
+    -1509154321, -1521602871, -1533949576, -1546193611, -1558334156,
+    -1570370398, -1582301532, -1594126759, -1605845288, -1617456334,
+    -1628959120, -1640352876, -1651636840, -1662810256, -1673872377,
+    -1684822462, -1695659778, -1706383600, -1716993210, -1727487898,
+    -1737866961, -1748129706, -1758275444, -1768303497, -1778213193,
+    -1788003870, -1797674872, -1807225552, -1816655270, -1825963395,
+    -1835149305, -1844212384, -1853152026, -1861967633, -1870658614,
+    -1879224388, -1887664381, -1895978029, -1904164775, -1912224071,
+    -1920155378, -1927958165, -1935631909, -1943176097, -1950590224,
+    -1957873794, -1965026319, -1972047321, -1978936329, -1985692883,
+    -1992316530, -1998806828, -2005163340, -2011385643, -2017473319,
+    -2023425962, -2029243172, -2034924560, -2040469747, -2045878361,
+    -2051150039, -2056284430, -2061281189, -2066139982, -2070860483,
+    -2075442378, -2079885359, -2084189128, -2088353398, -2092377891,
+    -2096262335, -2100006473, -2103610052, -2107072833, -2110394582,
+    -2113575078, -2116614108, -2119511468, -2122266965, -2124880414,
+    -2127351640, -2129680478, -2131866772, -2133910375, -2135811151,
+    -2137568973, -2139183722, -2140655291, -2141983582, -2143168505,
+    -2144209981, -2145107940, -2145862323, -2146473078, -2146940166,
+    -2147263554, -2147443221
+  },
+  {
+    2147483647, 2147411779, 2147196180, 2146836865, 2146333857, 2145687190,
+    2144896908, 2143963064, 2142885719, 2141664947, 2140300828, 2138793454,
+    2137142926, 2135349354, 2133412859, 2131333570, 2129111626, 2126747176,
+    2124240379, 2121591401, 2118800421, 2115867624, 2112793208, 2109577379,
+    2106220350, 2102722348, 2099083606, 2095304368, 2091384887, 2087325424,
+    2083126253, 2078787653, 2074309916, 2069693340, 2064938236, 2060044920,
+    2055013722, 2049844977, 2044539031, 2039096240, 2033516967, 2027801588,
+    2021950482, 2015964044, 2009842672, 2003586778, 1997196779, 1990673103,
+    1984016187, 1977226477, 1970304427, 1963250500, 1956065168, 1948748913,
+    1941302224, 1933725599, 1926019545, 1918184579, 1910221225, 1902130016,
+    1893911493, 1885566206, 1877094714, 1868497584, 1859775392, 1850928721,
+    1841958163, 1832864319, 1823647797, 1814309215, 1804849197, 1795268377,
+    1785567395, 1775746901, 1765807553, 1755750016, 1745574962, 1735283073,
+    1724875039, 1714351554, 1703713324, 1692961061, 1682095484, 1671117321,
+    1660027307, 1648826183, 1637514700, 1626093615, 1614563691, 1602925701,
+    1591180424, 1579328646, 1567371160, 1555308767, 1543142273, 1530872493,
+    1518500249, 1506026368, 1493451686, 1480777043, 1468003289, 1455131279,
+    1442161873, 1429095940, 1415934355, 1402677998, 1389327757, 1375884526,
+    1362349203, 1348722695, 1335005915, 1321199779, 1307305213, 1293323146,
+    1279254514, 1265100259, 1250861328, 1236538674, 1222133256, 1207646038,
+    1193077990, 1178430086, 1163703307, 1148898639, 1134017073, 1119059605,
+    1104027236, 1088920971, 1073741823, 1058490807, 1043168944, 1027777259,
+    1012316783, 996788550,  981193601,  965532977,  949807729,  934018908,
+    918167571,  902254779,  886281597,  870249094,  854158344,  838010423,
+    821806412,  805547396,  789234463,  772868705,  756451217,  739983098,
+    723465451,  706899380,  690285995,  673626407,  656921733,  640173089,
+    623381597,  606548381,  589674567,  572761285,  555809666,  538820847,
+    521795962,  504736153,  487642561,  470516330,  453358606,  436170538,
+    418953276,  401707972,  384435782,  367137860,  349815365,  332469456,
+    315101294,  297712042,  280302863,  262874923,  245429388,  227967426,
+    210490205,  192998897,  175494670,  157978697,  140452150,  122916202,
+    105372028,  87820800,    70263695,    52701886,    35136551,    17568863
+  },
+  {
+    0,         -17568863,    -35136551,    -52701886,    -70263695,
+    -87820800,    -105372028,  -122916202,  -140452150,  -157978697,
+    -175494670,  -192998897,  -210490205,  -227967426,  -245429388,
+    -262874923,  -280302863,  -297712042,  -315101294,  -332469456,
+    -349815365,  -367137860,  -384435782,  -401707972,  -418953276,
+    -436170538,  -453358606,  -470516330,  -487642561,  -504736153,
+    -521795962,  -538820847,  -555809666,  -572761285,  -589674567,
+    -606548381,  -623381597,  -640173089,  -656921733,  -673626407,
+    -690285995,  -706899380,  -723465451,  -739983098,  -756451217,
+    -772868705,  -789234463,  -805547396,  -821806412,  -838010423,
+    -854158344,  -870249094,  -886281597,  -902254779,  -918167571,
+    -934018908,  -949807729,  -965532977,  -981193601,  -996788550,
+    -1012316783, -1027777259, -1043168944, -1058490807, -1073741823,
+    -1088920971, -1104027236, -1119059605, -1134017073, -1148898639,
+    -1163703307, -1178430086, -1193077990, -1207646038, -1222133256,
+    -1236538674, -1250861328, -1265100259, -1279254514, -1293323146,
+    -1307305213, -1321199779, -1335005915, -1348722695, -1362349203,
+    -1375884526, -1389327757, -1402677998, -1415934355, -1429095940,
+    -1442161873, -1455131279, -1468003289, -1480777043, -1493451686,
+    -1506026368, -1518500249, -1530872493, -1543142273, -1555308767,
+    -1567371160, -1579328646, -1591180424, -1602925701, -1614563691,
+    -1626093615, -1637514700, -1648826183, -1660027307, -1671117321,
+    -1682095484, -1692961061, -1703713324, -1714351554, -1724875039,
+    -1735283073, -1745574962, -1755750016, -1765807553, -1775746901,
+    -1785567395, -1795268377, -1804849197, -1814309215, -1823647797,
+    -1832864319, -1841958163, -1850928721, -1859775392, -1868497584,
+    -1877094714, -1885566206, -1893911493, -1902130016, -1910221225,
+    -1918184579, -1926019545, -1933725599, -1941302224, -1948748913,
+    -1956065168, -1963250500, -1970304427, -1977226477, -1984016187,
+    -1990673103, -1997196779, -2003586778, -2009842672, -2015964044,
+    -2021950482, -2027801588, -2033516967, -2039096240, -2044539031,
+    -2049844977, -2055013722, -2060044920, -2064938236, -2069693340,
+    -2074309916, -2078787653, -2083126253, -2087325424, -2091384887,
+    -2095304368, -2099083606, -2102722348, -2106220350, -2109577379,
+    -2112793208, -2115867624, -2118800421, -2121591401, -2124240379,
+    -2126747176, -2129111626, -2131333570, -2133412859, -2135349354,
+    -2137142926, -2138793454, -2140300828, -2141664947, -2142885719,
+    -2143963064, -2144896908, -2145687190, -2146333857, -2146836865,
+    -2147196180, -2147411779}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_128[4][128] = {
-    {2147473540, 2147230990, 2146665074, 2145775879, 2144563537, 2143028233,
-     2141170196, 2138989706, 2136487093, 2133662733, 2130517051, 2127050521,
-     2123263664, 2119157053, 2114731304, 2109987084, 2104925108, 2099546137,
-     2093850983, 2087840503, 2081515602, 2074877232, 2067926393, 2060664132,
-     2053091543, 2045209765, 2037019987, 2028523440, 2019721406, 2010615209,
-     2001206221, 1991495858, 1981485584, 1971176905, 1960571374, 1949670588,
-     1938476189, 1926989863, 1915213339, 1903148391, 1890796835, 1878160533,
-     1865241387, 1852041342, 1838562387, 1824806550, 1810775905, 1796472564,
-     1781898680, 1767056449, 1751948106, 1736575926, 1720942223, 1705049354,
-     1688899710, 1672495724, 1655839866, 1638934645, 1621782607, 1604386334,
-     1586748446, 1568871600, 1550758487, 1532411836, 1513834409, 1495029005,
-     1475998454, 1456745624, 1437273413, 1417584754, 1397682612, 1377569984,
-     1357249900, 1336725418, 1315999630, 1295075658, 1273956652, 1252645793,
-     1231146290, 1209461381, 1187594331, 1165548434, 1143327010, 1120933405,
-     1098370992, 1075643168, 1052753356, 1029705003, 1006501580, 983146582,
-     959643526,  935995951,  912207418,  888281511,  864221831,  840032003,
-     815715669,  791276491,  766718150,  742044344,  717258789,  692365217,
-     667367378,  642269036,  617073970,  591785975,  566408859,  540946445,
-     515402565,  489781068,  464085812,  438320666,  412489511,  386596236,
-     360644742,  334638935,  308582733,  282480060,  256334846,  230151030,
-     203932553,  177683365,  151407418,  125108670,  98791081,   72458614,
-     46115236,   19764912},
-    {-6588386,    -32940694,   -59288041,   -85626459,   -111951983,
-     -138260647,  -164548489,  -190811551,  -217045877,  -243247517,
-     -269412525,  -295536960,  -321616889,  -347648383,  -373627522,
-     -399550395,  -425413097,  -451211733,  -476942419,  -502601278,
-     -528184448,  -553688075,  -579108319,  -604441351,  -629683356,
-     -654830534,  -679879096,  -704825271,  -729665302,  -754395449,
-     -779011985,  -803511206,  -827889421,  -852142958,  -876268167,
-     -900261412,  -924119081,  -947837581,  -971413341,  -994842809,
-     -1018122458, -1041248781, -1064218295, -1087027543, -1109673088,
-     -1132151520, -1154459455, -1176593532, -1198550418, -1220326808,
-     -1241919420, -1263325004, -1284540336, -1305562221, -1326387493,
-     -1347013016, -1367435684, -1387652420, -1407660182, -1427455955,
-     -1447036759, -1466399644, -1485541694, -1504460028, -1523151796,
-     -1541614182, -1559844407, -1577839725, -1595597426, -1613114836,
-     -1630389317, -1647418268, -1664199123, -1680729356, -1697006477,
-     -1713028036, -1728791618, -1744294851, -1759535400, -1774510969,
-     -1789219303, -1803658188, -1817825448, -1831718950, -1845336602,
-     -1858676353, -1871736195, -1884514160, -1897008324, -1909216805,
-     -1921137766, -1932769410, -1944109986, -1955157786, -1965911147,
-     -1976368449, -1986528117, -1996388621, -2005948476, -2015206243,
-     -2024160527, -2032809981, -2041153300, -2049189229, -2056916558,
-     -2064334123, -2071440807, -2078235539, -2084717297, -2090885104,
-     -2096738031, -2102275197, -2107495769, -2112398959, -2116984030,
-     -2121250290, -2125197099, -2128823860, -2132130028, -2135115106,
-     -2137778643, -2140120238, -2142139539, -2143836242, -2145210091,
-     -2146260879, -2146988448, -2147392689},
-    {2147483647, 2147321945, 2146836865, 2146028478, 2144896908, 2143442325,
-     2141664947, 2139565041, 2137142926, 2134398964, 2131333570, 2127947205,
-     2124240379, 2120213650, 2115867624, 2111202957, 2106220350, 2100920555,
-     2095304368, 2089372636, 2083126253, 2076566158, 2069693340, 2062508834,
-     2055013722, 2047209132, 2039096240, 2030676267, 2021950482, 2012920199,
-     2003586778, 1993951623, 1984016187, 1973781966, 1963250500, 1952423376,
-     1941302224, 1929888719, 1918184579, 1906191569, 1893911493, 1881346200,
-     1868497584, 1855367579, 1841958163, 1828271354, 1814309215, 1800073847,
-     1785567395, 1770792043, 1755750016, 1740443579, 1724875039, 1709046738,
-     1692961061, 1676620430, 1660027307, 1643184190, 1626093615, 1608758156,
-     1591180424, 1573363067, 1555308767, 1537020242, 1518500249, 1499751575,
-     1480777043, 1461579512, 1442161873, 1422527049, 1402677998, 1382617709,
-     1362349203, 1341875532, 1321199779, 1300325059, 1279254514, 1257991319,
-     1236538674, 1214899812, 1193077990, 1171076494, 1148898639, 1126547764,
-     1104027236, 1081340444, 1058490807, 1035481765, 1012316783, 988999350,
-     965532977,  941921199,  918167571,  894275670,  870249094,  846091463,
-     821806412,  797397601,  772868705,  748223418,  723465451,  698598532,
-     673626407,  648552837,  623381597,  598116478,  572761285,  547319836,
-     521795962,  496193509,  470516330,  444768293,  418953276,  393075166,
-     367137860,  341145265,  315101294,  289009870,  262874923,  236700387,
-     210490205,  184248325,  157978697,  131685278,  105372028,  79042909,
-     52701886,   26352927},
-    {0,           -26352927,   -52701886,   -79042909,   -105372028,
-     -131685278,  -157978697,  -184248325,  -210490205,  -236700387,
-     -262874923,  -289009870,  -315101294,  -341145265,  -367137860,
-     -393075166,  -418953276,  -444768293,  -470516330,  -496193509,
-     -521795962,  -547319836,  -572761285,  -598116478,  -623381597,
-     -648552837,  -673626407,  -698598532,  -723465451,  -748223418,
-     -772868705,  -797397601,  -821806412,  -846091463,  -870249094,
-     -894275670,  -918167571,  -941921199,  -965532977,  -988999350,
-     -1012316783, -1035481765, -1058490807, -1081340444, -1104027236,
-     -1126547764, -1148898639, -1171076494, -1193077990, -1214899812,
-     -1236538674, -1257991319, -1279254514, -1300325059, -1321199779,
-     -1341875532, -1362349203, -1382617709, -1402677998, -1422527049,
-     -1442161873, -1461579512, -1480777043, -1499751575, -1518500249,
-     -1537020242, -1555308767, -1573363067, -1591180424, -1608758156,
-     -1626093615, -1643184190, -1660027307, -1676620430, -1692961061,
-     -1709046738, -1724875039, -1740443579, -1755750016, -1770792043,
-     -1785567395, -1800073847, -1814309215, -1828271354, -1841958163,
-     -1855367579, -1868497584, -1881346200, -1893911493, -1906191569,
-     -1918184579, -1929888719, -1941302224, -1952423376, -1963250500,
-     -1973781966, -1984016187, -1993951623, -2003586778, -2012920199,
-     -2021950482, -2030676267, -2039096240, -2047209132, -2055013722,
-     -2062508834, -2069693340, -2076566158, -2083126253, -2089372636,
-     -2095304368, -2100920555, -2106220350, -2111202957, -2115867624,
-     -2120213650, -2124240379, -2127947205, -2131333570, -2134398964,
-     -2137142926, -2139565041, -2141664947, -2143442325, -2144896908,
-     -2146028478, -2146836865, -2147321945}};
+  {
+    2147473540, 2147230990, 2146665074, 2145775879, 2144563537, 2143028233,
+    2141170196, 2138989706, 2136487093, 2133662733, 2130517051, 2127050521,
+    2123263664, 2119157053, 2114731304, 2109987084, 2104925108, 2099546137,
+    2093850983, 2087840503, 2081515602, 2074877232, 2067926393, 2060664132,
+    2053091543, 2045209765, 2037019987, 2028523440, 2019721406, 2010615209,
+    2001206221, 1991495858, 1981485584, 1971176905, 1960571374, 1949670588,
+    1938476189, 1926989863, 1915213339, 1903148391, 1890796835, 1878160533,
+    1865241387, 1852041342, 1838562387, 1824806550, 1810775905, 1796472564,
+    1781898680, 1767056449, 1751948106, 1736575926, 1720942223, 1705049354,
+    1688899710, 1672495724, 1655839866, 1638934645, 1621782607, 1604386334,
+    1586748446, 1568871600, 1550758487, 1532411836, 1513834409, 1495029005,
+    1475998454, 1456745624, 1437273413, 1417584754, 1397682612, 1377569984,
+    1357249900, 1336725418, 1315999630, 1295075658, 1273956652, 1252645793,
+    1231146290, 1209461381, 1187594331, 1165548434, 1143327010, 1120933405,
+    1098370992, 1075643168, 1052753356, 1029705003, 1006501580, 983146582,
+    959643526,  935995951,  912207418,  888281511,  864221831,  840032003,
+    815715669,  791276491,  766718150,  742044344,  717258789,  692365217,
+    667367378,  642269036,  617073970,  591785975,  566408859,  540946445,
+    515402565,  489781068,  464085812,  438320666,  412489511,  386596236,
+    360644742,  334638935,  308582733,  282480060,  256334846,  230151030,
+    203932553,  177683365,  151407418,  125108670,  98791081,    72458614,
+    46115236,    19764912
+  },
+  {
+    -6588386,  -32940694,    -59288041,    -85626459,    -111951983,
+    -138260647,  -164548489,  -190811551,  -217045877,  -243247517,
+    -269412525,  -295536960,  -321616889,  -347648383,  -373627522,
+    -399550395,  -425413097,  -451211733,  -476942419,  -502601278,
+    -528184448,  -553688075,  -579108319,  -604441351,  -629683356,
+    -654830534,  -679879096,  -704825271,  -729665302,  -754395449,
+    -779011985,  -803511206,  -827889421,  -852142958,  -876268167,
+    -900261412,  -924119081,  -947837581,  -971413341,  -994842809,
+    -1018122458, -1041248781, -1064218295, -1087027543, -1109673088,
+    -1132151520, -1154459455, -1176593532, -1198550418, -1220326808,
+    -1241919420, -1263325004, -1284540336, -1305562221, -1326387493,
+    -1347013016, -1367435684, -1387652420, -1407660182, -1427455955,
+    -1447036759, -1466399644, -1485541694, -1504460028, -1523151796,
+    -1541614182, -1559844407, -1577839725, -1595597426, -1613114836,
+    -1630389317, -1647418268, -1664199123, -1680729356, -1697006477,
+    -1713028036, -1728791618, -1744294851, -1759535400, -1774510969,
+    -1789219303, -1803658188, -1817825448, -1831718950, -1845336602,
+    -1858676353, -1871736195, -1884514160, -1897008324, -1909216805,
+    -1921137766, -1932769410, -1944109986, -1955157786, -1965911147,
+    -1976368449, -1986528117, -1996388621, -2005948476, -2015206243,
+    -2024160527, -2032809981, -2041153300, -2049189229, -2056916558,
+    -2064334123, -2071440807, -2078235539, -2084717297, -2090885104,
+    -2096738031, -2102275197, -2107495769, -2112398959, -2116984030,
+    -2121250290, -2125197099, -2128823860, -2132130028, -2135115106,
+    -2137778643, -2140120238, -2142139539, -2143836242, -2145210091,
+    -2146260879, -2146988448, -2147392689
+  },
+  {
+    2147483647, 2147321945, 2146836865, 2146028478, 2144896908, 2143442325,
+    2141664947, 2139565041, 2137142926, 2134398964, 2131333570, 2127947205,
+    2124240379, 2120213650, 2115867624, 2111202957, 2106220350, 2100920555,
+    2095304368, 2089372636, 2083126253, 2076566158, 2069693340, 2062508834,
+    2055013722, 2047209132, 2039096240, 2030676267, 2021950482, 2012920199,
+    2003586778, 1993951623, 1984016187, 1973781966, 1963250500, 1952423376,
+    1941302224, 1929888719, 1918184579, 1906191569, 1893911493, 1881346200,
+    1868497584, 1855367579, 1841958163, 1828271354, 1814309215, 1800073847,
+    1785567395, 1770792043, 1755750016, 1740443579, 1724875039, 1709046738,
+    1692961061, 1676620430, 1660027307, 1643184190, 1626093615, 1608758156,
+    1591180424, 1573363067, 1555308767, 1537020242, 1518500249, 1499751575,
+    1480777043, 1461579512, 1442161873, 1422527049, 1402677998, 1382617709,
+    1362349203, 1341875532, 1321199779, 1300325059, 1279254514, 1257991319,
+    1236538674, 1214899812, 1193077990, 1171076494, 1148898639, 1126547764,
+    1104027236, 1081340444, 1058490807, 1035481765, 1012316783, 988999350,
+    965532977,  941921199,  918167571,  894275670,  870249094,  846091463,
+    821806412,  797397601,  772868705,  748223418,  723465451,  698598532,
+    673626407,  648552837,  623381597,  598116478,  572761285,  547319836,
+    521795962,  496193509,  470516330,  444768293,  418953276,  393075166,
+    367137860,  341145265,  315101294,  289009870,  262874923,  236700387,
+    210490205,  184248325,  157978697,  131685278,  105372028,  79042909,
+    52701886,    26352927
+  },
+  {
+    0,         -26352927,    -52701886,    -79042909,    -105372028,
+    -131685278,  -157978697,  -184248325,  -210490205,  -236700387,
+    -262874923,  -289009870,  -315101294,  -341145265,  -367137860,
+    -393075166,  -418953276,  -444768293,  -470516330,  -496193509,
+    -521795962,  -547319836,  -572761285,  -598116478,  -623381597,
+    -648552837,  -673626407,  -698598532,  -723465451,  -748223418,
+    -772868705,  -797397601,  -821806412,  -846091463,  -870249094,
+    -894275670,  -918167571,  -941921199,  -965532977,  -988999350,
+    -1012316783, -1035481765, -1058490807, -1081340444, -1104027236,
+    -1126547764, -1148898639, -1171076494, -1193077990, -1214899812,
+    -1236538674, -1257991319, -1279254514, -1300325059, -1321199779,
+    -1341875532, -1362349203, -1382617709, -1402677998, -1422527049,
+    -1442161873, -1461579512, -1480777043, -1499751575, -1518500249,
+    -1537020242, -1555308767, -1573363067, -1591180424, -1608758156,
+    -1626093615, -1643184190, -1660027307, -1676620430, -1692961061,
+    -1709046738, -1724875039, -1740443579, -1755750016, -1770792043,
+    -1785567395, -1800073847, -1814309215, -1828271354, -1841958163,
+    -1855367579, -1868497584, -1881346200, -1893911493, -1906191569,
+    -1918184579, -1929888719, -1941302224, -1952423376, -1963250500,
+    -1973781966, -1984016187, -1993951623, -2003586778, -2012920199,
+    -2021950482, -2030676267, -2039096240, -2047209132, -2055013722,
+    -2062508834, -2069693340, -2076566158, -2083126253, -2089372636,
+    -2095304368, -2100920555, -2106220350, -2111202957, -2115867624,
+    -2120213650, -2124240379, -2127947205, -2131333570, -2134398964,
+    -2137142926, -2139565041, -2141664947, -2143442325, -2144896908,
+    -2146028478, -2146836865, -2147321945}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_96[4][96] = {
-    {2147465679, 2147034485, 2146028478, 2144447928, 2142293256, 2139565041,
-     2136264013, 2132391055, 2127947205, 2122933651, 2117351737, 2111202957,
-     2104488957, 2097211534, 2089372636, 2080974364, 2072018964, 2062508834,
-     2052446521, 2041834718, 2030676267, 2018974155, 2006731514, 1993951623,
-     1980637903, 1966793919, 1952423376, 1937530122, 1922118144, 1906191569,
-     1889754660, 1872811818, 1855367579, 1837426614, 1818993725, 1800073847,
-     1780672046, 1760793516, 1740443579, 1719627684, 1698351402, 1676620430,
-     1654440587, 1631817810, 1608758156, 1585267799, 1561353026, 1537020242,
-     1512275961, 1487126807, 1461579512, 1435640918, 1409317968, 1382617709,
-     1355547290, 1328113959, 1300325059, 1272188031, 1243710407, 1214899812,
-     1185763959, 1156310648, 1126547764, 1096483277, 1066125235, 1035481765,
-     1004561071, 973371433,  941921199,  910218790,  878272694,  846091463,
-     813683712,  781058119,  748223418,  715188399,  681961907,  648552837,
-     614970134,  581222788,  547319836,  513270352,  479083454,  444768293,
-     410334057,  375789965,  341145265,  306409231,  271591165,  236700387,
-     201746239,  166738078,  131685278,  96597222,   61483305,   26352927},
-    {-8784505,    -43919586,   -79042909,   -114145070,  -149216672,
-     -184248325,  -219230650,  -254154282,  -289009870,  -323788084,
-     -358479612,  -393075166,  -427565484,  -461941333,  -496193509,
-     -530312841,  -564290197,  -598116478,  -631782629,  -665279636,
-     -698598532,  -731730396,  -764666359,  -797397601,  -829915361,
-     -862210933,  -894275670,  -926100988,  -957678366,  -988999350,
-     -1020055555, -1050838667, -1081340444, -1111552720, -1141467406,
-     -1171076494, -1200372057, -1229346251, -1257991319, -1286299592,
-     -1314263492, -1341875532, -1369128319, -1396014558, -1422527049,
-     -1448658696, -1474402502, -1499751575, -1524699127, -1549238481,
-     -1573363067, -1597066425, -1620342210, -1643184190, -1665586249,
-     -1687542392, -1709046738, -1730093531, -1750677136, -1770792043,
-     -1790432865, -1809594346, -1828271354, -1846458890, -1864152085,
-     -1881346200, -1898036634, -1914218918, -1929888719, -1945041841,
-     -1959674230, -1973781966, -1987361273, -2000408515, -2012920199,
-     -2024892976, -2036323641, -2047209132, -2057546536, -2067333084,
-     -2076566158, -2085243285, -2093362142, -2100920555, -2107916501,
-     -2114348106, -2120213650, -2125511561, -2130240421, -2134398964,
-     -2137986077, -2141000800, -2143442325, -2145309998, -2146603320,
-     -2147321945},
-    {2147483647, 2147196180, 2146333857, 2144896908, 2142885719, 2140300828,
-     2137142926, 2133412859, 2129111626, 2124240379, 2118800421, 2112793208,
-     2106220350, 2099083606, 2091384887, 2083126253, 2074309916, 2064938236,
-     2055013722, 2044539031, 2033516967, 2021950482, 2009842672, 1997196779,
-     1984016187, 1970304427, 1956065168, 1941302224, 1926019545, 1910221225,
-     1893911493, 1877094714, 1859775392, 1841958163, 1823647797, 1804849197,
-     1785567395, 1765807553, 1745574962, 1724875039, 1703713324, 1682095484,
-     1660027307, 1637514700, 1614563691, 1591180424, 1567371160, 1543142273,
-     1518500249, 1493451686, 1468003289, 1442161873, 1415934355, 1389327757,
-     1362349203, 1335005915, 1307305213, 1279254514, 1250861328, 1222133256,
-     1193077990, 1163703307, 1134017073, 1104027236, 1073741823, 1043168944,
-     1012316783, 981193601,  949807729,  918167571,  886281597,  854158344,
-     821806412,  789234463,  756451217,  723465451,  690285995,  656921733,
-     623381597,  589674567,  555809666,  521795962,  487642561,  453358606,
-     418953276,  384435782,  349815365,  315101294,  280302863,  245429388,
-     210490205,  175494670,  140452150,  105372028,  70263695,   35136551},
-    {0,           -35136551,   -70263695,   -105372028,  -140452150,
-     -175494670,  -210490205,  -245429388,  -280302863,  -315101294,
-     -349815365,  -384435782,  -418953276,  -453358606,  -487642561,
-     -521795962,  -555809666,  -589674567,  -623381597,  -656921733,
-     -690285995,  -723465451,  -756451217,  -789234463,  -821806412,
-     -854158344,  -886281597,  -918167571,  -949807729,  -981193601,
-     -1012316783, -1043168944, -1073741823, -1104027236, -1134017073,
-     -1163703307, -1193077990, -1222133256, -1250861328, -1279254514,
-     -1307305213, -1335005915, -1362349203, -1389327757, -1415934355,
-     -1442161873, -1468003289, -1493451686, -1518500249, -1543142273,
-     -1567371160, -1591180424, -1614563691, -1637514700, -1660027307,
-     -1682095484, -1703713324, -1724875039, -1745574962, -1765807553,
-     -1785567395, -1804849197, -1823647797, -1841958163, -1859775392,
-     -1877094714, -1893911493, -1910221225, -1926019545, -1941302224,
-     -1956065168, -1970304427, -1984016187, -1997196779, -2009842672,
-     -2021950482, -2033516967, -2044539031, -2055013722, -2064938236,
-     -2074309916, -2083126253, -2091384887, -2099083606, -2106220350,
-     -2112793208, -2118800421, -2124240379, -2129111626, -2133412859,
-     -2137142926, -2140300828, -2142885719, -2144896908, -2146333857,
-     -2147196180}};
+  {
+    2147465679, 2147034485, 2146028478, 2144447928, 2142293256, 2139565041,
+    2136264013, 2132391055, 2127947205, 2122933651, 2117351737, 2111202957,
+    2104488957, 2097211534, 2089372636, 2080974364, 2072018964, 2062508834,
+    2052446521, 2041834718, 2030676267, 2018974155, 2006731514, 1993951623,
+    1980637903, 1966793919, 1952423376, 1937530122, 1922118144, 1906191569,
+    1889754660, 1872811818, 1855367579, 1837426614, 1818993725, 1800073847,
+    1780672046, 1760793516, 1740443579, 1719627684, 1698351402, 1676620430,
+    1654440587, 1631817810, 1608758156, 1585267799, 1561353026, 1537020242,
+    1512275961, 1487126807, 1461579512, 1435640918, 1409317968, 1382617709,
+    1355547290, 1328113959, 1300325059, 1272188031, 1243710407, 1214899812,
+    1185763959, 1156310648, 1126547764, 1096483277, 1066125235, 1035481765,
+    1004561071, 973371433,  941921199,  910218790,  878272694,  846091463,
+    813683712,  781058119,  748223418,  715188399,  681961907,  648552837,
+    614970134,  581222788,  547319836,  513270352,  479083454,  444768293,
+    410334057,  375789965,  341145265,  306409231,  271591165,  236700387,
+    201746239,  166738078,  131685278,  96597222,    61483305,    26352927
+  },
+  {
+    -8784505,  -43919586,    -79042909,    -114145070,  -149216672,
+    -184248325,  -219230650,  -254154282,  -289009870,  -323788084,
+    -358479612,  -393075166,  -427565484,  -461941333,  -496193509,
+    -530312841,  -564290197,  -598116478,  -631782629,  -665279636,
+    -698598532,  -731730396,  -764666359,  -797397601,  -829915361,
+    -862210933,  -894275670,  -926100988,  -957678366,  -988999350,
+    -1020055555, -1050838667, -1081340444, -1111552720, -1141467406,
+    -1171076494, -1200372057, -1229346251, -1257991319, -1286299592,
+    -1314263492, -1341875532, -1369128319, -1396014558, -1422527049,
+    -1448658696, -1474402502, -1499751575, -1524699127, -1549238481,
+    -1573363067, -1597066425, -1620342210, -1643184190, -1665586249,
+    -1687542392, -1709046738, -1730093531, -1750677136, -1770792043,
+    -1790432865, -1809594346, -1828271354, -1846458890, -1864152085,
+    -1881346200, -1898036634, -1914218918, -1929888719, -1945041841,
+    -1959674230, -1973781966, -1987361273, -2000408515, -2012920199,
+    -2024892976, -2036323641, -2047209132, -2057546536, -2067333084,
+    -2076566158, -2085243285, -2093362142, -2100920555, -2107916501,
+    -2114348106, -2120213650, -2125511561, -2130240421, -2134398964,
+    -2137986077, -2141000800, -2143442325, -2145309998, -2146603320,
+    -2147321945
+  },
+  {
+    2147483647, 2147196180, 2146333857, 2144896908, 2142885719, 2140300828,
+    2137142926, 2133412859, 2129111626, 2124240379, 2118800421, 2112793208,
+    2106220350, 2099083606, 2091384887, 2083126253, 2074309916, 2064938236,
+    2055013722, 2044539031, 2033516967, 2021950482, 2009842672, 1997196779,
+    1984016187, 1970304427, 1956065168, 1941302224, 1926019545, 1910221225,
+    1893911493, 1877094714, 1859775392, 1841958163, 1823647797, 1804849197,
+    1785567395, 1765807553, 1745574962, 1724875039, 1703713324, 1682095484,
+    1660027307, 1637514700, 1614563691, 1591180424, 1567371160, 1543142273,
+    1518500249, 1493451686, 1468003289, 1442161873, 1415934355, 1389327757,
+    1362349203, 1335005915, 1307305213, 1279254514, 1250861328, 1222133256,
+    1193077990, 1163703307, 1134017073, 1104027236, 1073741823, 1043168944,
+    1012316783, 981193601,  949807729,  918167571,  886281597,  854158344,
+    821806412,  789234463,  756451217,  723465451,  690285995,  656921733,
+    623381597,  589674567,  555809666,  521795962,  487642561,  453358606,
+    418953276,  384435782,  349815365,  315101294,  280302863,  245429388,
+    210490205,  175494670,  140452150,  105372028,  70263695,    35136551
+  },
+  {
+    0,         -35136551,    -70263695,    -105372028,  -140452150,
+    -175494670,  -210490205,  -245429388,  -280302863,  -315101294,
+    -349815365,  -384435782,  -418953276,  -453358606,  -487642561,
+    -521795962,  -555809666,  -589674567,  -623381597,  -656921733,
+    -690285995,  -723465451,  -756451217,  -789234463,  -821806412,
+    -854158344,  -886281597,  -918167571,  -949807729,  -981193601,
+    -1012316783, -1043168944, -1073741823, -1104027236, -1134017073,
+    -1163703307, -1193077990, -1222133256, -1250861328, -1279254514,
+    -1307305213, -1335005915, -1362349203, -1389327757, -1415934355,
+    -1442161873, -1468003289, -1493451686, -1518500249, -1543142273,
+    -1567371160, -1591180424, -1614563691, -1637514700, -1660027307,
+    -1682095484, -1703713324, -1724875039, -1745574962, -1765807553,
+    -1785567395, -1804849197, -1823647797, -1841958163, -1859775392,
+    -1877094714, -1893911493, -1910221225, -1926019545, -1941302224,
+    -1956065168, -1970304427, -1984016187, -1997196779, -2009842672,
+    -2021950482, -2033516967, -2044539031, -2055013722, -2064938236,
+    -2074309916, -2083126253, -2091384887, -2099083606, -2106220350,
+    -2112793208, -2118800421, -2124240379, -2129111626, -2133412859,
+    -2137142926, -2140300828, -2142885719, -2144896908, -2146333857,
+    -2147196180}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_64[4][64] = {
-    {2147443221, 2146473078, 2144209981, 2140655291, 2135811151, 2129680478,
-     2122266965, 2113575078, 2103610052, 2092377891, 2079885359, 2066139982,
-     2051150039, 2034924560, 2017473319, 1998806828, 1978936329, 1957873794,
-     1935631909, 1912224071, 1887664381, 1861967633, 1835149305, 1807225552,
-     1778213193, 1748129706, 1716993210, 1684822462, 1651636840, 1617456334,
-     1582301532, 1546193611, 1509154321, 1471205973, 1432371425, 1392674071,
-     1352137821, 1310787094, 1268646799, 1225742317, 1182099495, 1137744620,
-     1092704410, 1047005996, 1000676904, 953745042,  906238680,  858186434,
-     809617248,  760560379,  711045377,  661102067,  610760535,  560051103,
-     509004317,  457650927,  406021864,  354148229,  302061268,  249792357,
-     197372981,  144834714,  92209204,   39528151},
-    {-13176711,   -65873638,   -118530884,  -171116732,  -223599506,
-     -275947591,  -328129456,  -380113668,  -431868914,  -483364018,
-     -534567962,  -585449902,  -635979189,  -686125386,  -735858286,
-     -785147933,  -833964637,  -882278991,  -930061893,  -977284561,
-     -1023918549, -1069935767, -1115308495, -1160009404, -1204011566,
-     -1247288476, -1289814067, -1331562722, -1372509293, -1412629116,
-     -1451898024, -1490292363, -1527789006, -1564365365, -1599999410,
-     -1634669674, -1668355275, -1701035921, -1732691926, -1763304223,
-     -1792854371, -1821324571, -1848697672, -1874957188, -1900087299,
-     -1924072869, -1946899449, -1968553290, -1989021348, -2008291294,
-     -2026351520, -2043191148, -2058800034, -2073168776, -2086288718,
-     -2098151959, -2108751350, -2118080509, -2126133816, -2132906418,
-     -2138394238, -2142593969, -2145503082, -2147119824},
-    {2147483647, 2146836865, 2144896908, 2141664947, 2137142926, 2131333570,
-     2124240379, 2115867624, 2106220350, 2095304368, 2083126253, 2069693340,
-     2055013722, 2039096240, 2021950482, 2003586778, 1984016187, 1963250500,
-     1941302224, 1918184579, 1893911493, 1868497584, 1841958163, 1814309215,
-     1785567395, 1755750016, 1724875039, 1692961061, 1660027307, 1626093615,
-     1591180424, 1555308767, 1518500249, 1480777043, 1442161873, 1402677998,
-     1362349203, 1321199779, 1279254514, 1236538674, 1193077990, 1148898639,
-     1104027236, 1058490807, 1012316783, 965532977,  918167571,  870249094,
-     821806412,  772868705,  723465451,  673626407,  623381597,  572761285,
-     521795962,  470516330,  418953276,  367137860,  315101294,  262874923,
-     210490205,  157978697,  105372028,  52701886},
-    {0,           -52701886,   -105372028,  -157978697,  -210490205,
-     -262874923,  -315101294,  -367137860,  -418953276,  -470516330,
-     -521795962,  -572761285,  -623381597,  -673626407,  -723465451,
-     -772868705,  -821806412,  -870249094,  -918167571,  -965532977,
-     -1012316783, -1058490807, -1104027236, -1148898639, -1193077990,
-     -1236538674, -1279254514, -1321199779, -1362349203, -1402677998,
-     -1442161873, -1480777043, -1518500249, -1555308767, -1591180424,
-     -1626093615, -1660027307, -1692961061, -1724875039, -1755750016,
-     -1785567395, -1814309215, -1841958163, -1868497584, -1893911493,
-     -1918184579, -1941302224, -1963250500, -1984016187, -2003586778,
-     -2021950482, -2039096240, -2055013722, -2069693340, -2083126253,
-     -2095304368, -2106220350, -2115867624, -2124240379, -2131333570,
-     -2137142926, -2141664947, -2144896908, -2146836865}};
+  {
+    2147443221, 2146473078, 2144209981, 2140655291, 2135811151, 2129680478,
+    2122266965, 2113575078, 2103610052, 2092377891, 2079885359, 2066139982,
+    2051150039, 2034924560, 2017473319, 1998806828, 1978936329, 1957873794,
+    1935631909, 1912224071, 1887664381, 1861967633, 1835149305, 1807225552,
+    1778213193, 1748129706, 1716993210, 1684822462, 1651636840, 1617456334,
+    1582301532, 1546193611, 1509154321, 1471205973, 1432371425, 1392674071,
+    1352137821, 1310787094, 1268646799, 1225742317, 1182099495, 1137744620,
+    1092704410, 1047005996, 1000676904, 953745042,  906238680,  858186434,
+    809617248,  760560379,  711045377,  661102067,  610760535,  560051103,
+    509004317,  457650927,  406021864,  354148229,  302061268,  249792357,
+    197372981,  144834714,  92209204,    39528151
+  },
+  {
+    -13176711,    -65873638,    -118530884,  -171116732,  -223599506,
+    -275947591,  -328129456,  -380113668,  -431868914,  -483364018,
+    -534567962,  -585449902,  -635979189,  -686125386,  -735858286,
+    -785147933,  -833964637,  -882278991,  -930061893,  -977284561,
+    -1023918549, -1069935767, -1115308495, -1160009404, -1204011566,
+    -1247288476, -1289814067, -1331562722, -1372509293, -1412629116,
+    -1451898024, -1490292363, -1527789006, -1564365365, -1599999410,
+    -1634669674, -1668355275, -1701035921, -1732691926, -1763304223,
+    -1792854371, -1821324571, -1848697672, -1874957188, -1900087299,
+    -1924072869, -1946899449, -1968553290, -1989021348, -2008291294,
+    -2026351520, -2043191148, -2058800034, -2073168776, -2086288718,
+    -2098151959, -2108751350, -2118080509, -2126133816, -2132906418,
+    -2138394238, -2142593969, -2145503082, -2147119824
+  },
+  {
+    2147483647, 2146836865, 2144896908, 2141664947, 2137142926, 2131333570,
+    2124240379, 2115867624, 2106220350, 2095304368, 2083126253, 2069693340,
+    2055013722, 2039096240, 2021950482, 2003586778, 1984016187, 1963250500,
+    1941302224, 1918184579, 1893911493, 1868497584, 1841958163, 1814309215,
+    1785567395, 1755750016, 1724875039, 1692961061, 1660027307, 1626093615,
+    1591180424, 1555308767, 1518500249, 1480777043, 1442161873, 1402677998,
+    1362349203, 1321199779, 1279254514, 1236538674, 1193077990, 1148898639,
+    1104027236, 1058490807, 1012316783, 965532977,  918167571,  870249094,
+    821806412,  772868705,  723465451,  673626407,  623381597,  572761285,
+    521795962,  470516330,  418953276,  367137860,  315101294,  262874923,
+    210490205,  157978697,  105372028,  52701886
+  },
+  {
+    0,         -52701886,    -105372028,  -157978697,  -210490205,
+    -262874923,  -315101294,  -367137860,  -418953276,  -470516330,
+    -521795962,  -572761285,  -623381597,  -673626407,  -723465451,
+    -772868705,  -821806412,  -870249094,  -918167571,  -965532977,
+    -1012316783, -1058490807, -1104027236, -1148898639, -1193077990,
+    -1236538674, -1279254514, -1321199779, -1362349203, -1402677998,
+    -1442161873, -1480777043, -1518500249, -1555308767, -1591180424,
+    -1626093615, -1660027307, -1692961061, -1724875039, -1755750016,
+    -1785567395, -1814309215, -1841958163, -1868497584, -1893911493,
+    -1918184579, -1941302224, -1963250500, -1984016187, -2003586778,
+    -2021950482, -2039096240, -2055013722, -2069693340, -2083126253,
+    -2095304368, -2106220350, -2115867624, -2124240379, -2131333570,
+    -2137142926, -2141664947, -2144896908, -2146836865}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_48[4][48] = {
-    {2147411779, 2145687190, 2141664947, 2135349354, 2126747176, 2115867624,
-     2102722348, 2087325424, 2069693340, 2049844977, 2027801588, 2003586778,
-     1977226477, 1948748913, 1918184579, 1885566206, 1850928721, 1814309215,
-     1775746901, 1735283073, 1692961061, 1648826183, 1602925701, 1555308767,
-     1506026368, 1455131279, 1402677998, 1348722695, 1293323146, 1236538674,
-     1178430086, 1119059605, 1058490807, 996788550,  934018908,  870249094,
-     805547396,  739983098,  673626407,  606548381,  538820847,  470516330,
-     401707972,  332469456,  262874923,  192998897,  122916202,  52701886},
-    {-17568863,   -87820800,   -157978697,  -227967426,  -297712042,
-     -367137860,  -436170538,  -504736153,  -572761285,  -640173089,
-     -706899380,  -772868705,  -838010423,  -902254779,  -965532977,
-     -1027777259, -1088920971, -1148898639, -1207646038, -1265100259,
-     -1321199779, -1375884526, -1429095940, -1480777043, -1530872493,
-     -1579328646, -1626093615, -1671117321, -1714351554, -1755750016,
-     -1795268377, -1832864319, -1868497584, -1902130016, -1933725599,
-     -1963250500, -1990673103, -2015964044, -2039096240, -2060044920,
-     -2078787653, -2095304368, -2109577379, -2121591401, -2131333570,
-     -2138793454, -2143963064, -2146836865},
-    {2147483647, 2146333857, 2142885719, 2137142926, 2129111626, 2118800421,
-     2106220350, 2091384887, 2074309916, 2055013722, 2033516967, 2009842672,
-     1984016187, 1956065168, 1926019545, 1893911493, 1859775392, 1823647797,
-     1785567395, 1745574962, 1703713324, 1660027307, 1614563691, 1567371160,
-     1518500249, 1468003289, 1415934355, 1362349203, 1307305213, 1250861328,
-     1193077990, 1134017073, 1073741823, 1012316783, 949807729,  886281597,
-     821806412,  756451217,  690285995,  623381597,  555809666,  487642561,
-     418953276,  349815365,  280302863,  210490205,  140452150,  70263695},
-    {0,           -70263695,   -140452150,  -210490205,  -280302863,
-     -349815365,  -418953276,  -487642561,  -555809666,  -623381597,
-     -690285995,  -756451217,  -821806412,  -886281597,  -949807729,
-     -1012316783, -1073741823, -1134017073, -1193077990, -1250861328,
-     -1307305213, -1362349203, -1415934355, -1468003289, -1518500249,
-     -1567371160, -1614563691, -1660027307, -1703713324, -1745574962,
-     -1785567395, -1823647797, -1859775392, -1893911493, -1926019545,
-     -1956065168, -1984016187, -2009842672, -2033516967, -2055013722,
-     -2074309916, -2091384887, -2106220350, -2118800421, -2129111626,
-     -2137142926, -2142885719, -2146333857}};
+  {
+    2147411779, 2145687190, 2141664947, 2135349354, 2126747176, 2115867624,
+    2102722348, 2087325424, 2069693340, 2049844977, 2027801588, 2003586778,
+    1977226477, 1948748913, 1918184579, 1885566206, 1850928721, 1814309215,
+    1775746901, 1735283073, 1692961061, 1648826183, 1602925701, 1555308767,
+    1506026368, 1455131279, 1402677998, 1348722695, 1293323146, 1236538674,
+    1178430086, 1119059605, 1058490807, 996788550,  934018908,  870249094,
+    805547396,  739983098,  673626407,  606548381,  538820847,  470516330,
+    401707972,  332469456,  262874923,  192998897,  122916202,  52701886
+  },
+  {
+    -17568863,    -87820800,    -157978697,  -227967426,  -297712042,
+    -367137860,  -436170538,  -504736153,  -572761285,  -640173089,
+    -706899380,  -772868705,  -838010423,  -902254779,  -965532977,
+    -1027777259, -1088920971, -1148898639, -1207646038, -1265100259,
+    -1321199779, -1375884526, -1429095940, -1480777043, -1530872493,
+    -1579328646, -1626093615, -1671117321, -1714351554, -1755750016,
+    -1795268377, -1832864319, -1868497584, -1902130016, -1933725599,
+    -1963250500, -1990673103, -2015964044, -2039096240, -2060044920,
+    -2078787653, -2095304368, -2109577379, -2121591401, -2131333570,
+    -2138793454, -2143963064, -2146836865
+  },
+  {
+    2147483647, 2146333857, 2142885719, 2137142926, 2129111626, 2118800421,
+    2106220350, 2091384887, 2074309916, 2055013722, 2033516967, 2009842672,
+    1984016187, 1956065168, 1926019545, 1893911493, 1859775392, 1823647797,
+    1785567395, 1745574962, 1703713324, 1660027307, 1614563691, 1567371160,
+    1518500249, 1468003289, 1415934355, 1362349203, 1307305213, 1250861328,
+    1193077990, 1134017073, 1073741823, 1012316783, 949807729,  886281597,
+    821806412,  756451217,  690285995,  623381597,  555809666,  487642561,
+    418953276,  349815365,  280302863,  210490205,  140452150,  70263695
+  },
+  {
+    0,         -70263695,    -140452150,  -210490205,  -280302863,
+    -349815365,  -418953276,  -487642561,  -555809666,  -623381597,
+    -690285995,  -756451217,  -821806412,  -886281597,  -949807729,
+    -1012316783, -1073741823, -1134017073, -1193077990, -1250861328,
+    -1307305213, -1362349203, -1415934355, -1468003289, -1518500249,
+    -1567371160, -1614563691, -1660027307, -1703713324, -1745574962,
+    -1785567395, -1823647797, -1859775392, -1893911493, -1926019545,
+    -1956065168, -1984016187, -2009842672, -2033516967, -2055013722,
+    -2074309916, -2091384887, -2106220350, -2118800421, -2129111626,
+    -2137142926, -2142885719, -2146333857}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_32[4][32] = {
-    {2147321945, 2143442325, 2134398964, 2120213650, 2100920555, 2076566158,
-     2047209132, 2012920199, 1973781966, 1929888719, 1881346200, 1828271354,
-     1770792043, 1709046738, 1643184190, 1573363067, 1499751575, 1422527049,
-     1341875532, 1257991319, 1171076494, 1081340444, 988999350,  894275670,
-     797397601,  698598532,  598116478,  496193509,  393075166,  289009870,
-     184248325,  79042909},
-    {-26352927,   -131685278,  -236700387,  -341145265,  -444768293,
-     -547319836,  -648552837,  -748223418,  -846091463,  -941921199,
-     -1035481765, -1126547764, -1214899812, -1300325059, -1382617709,
-     -1461579512, -1537020242, -1608758156, -1676620430, -1740443579,
-     -1800073847, -1855367579, -1906191569, -1952423376, -1993951623,
-     -2030676267, -2062508834, -2089372636, -2111202957, -2127947205,
-     -2139565041, -2146028478},
-    {2147483647, 2144896908, 2137142926, 2124240379, 2106220350, 2083126253,
-     2055013722, 2021950482, 1984016187, 1941302224, 1893911493, 1841958163,
-     1785567395, 1724875039, 1660027307, 1591180424, 1518500249, 1442161873,
-     1362349203, 1279254514, 1193077990, 1104027236, 1012316783, 918167571,
-     821806412,  723465451,  623381597,  521795962,  418953276,  315101294,
-     210490205,  105372028},
-    {0,           -105372028,  -210490205,  -315101294,  -418953276,
-     -521795962,  -623381597,  -723465451,  -821806412,  -918167571,
-     -1012316783, -1104027236, -1193077990, -1279254514, -1362349203,
-     -1442161873, -1518500249, -1591180424, -1660027307, -1724875039,
-     -1785567395, -1841958163, -1893911493, -1941302224, -1984016187,
-     -2021950482, -2055013722, -2083126253, -2106220350, -2124240379,
-     -2137142926, -2144896908}};
+  {
+    2147321945, 2143442325, 2134398964, 2120213650, 2100920555, 2076566158,
+    2047209132, 2012920199, 1973781966, 1929888719, 1881346200, 1828271354,
+    1770792043, 1709046738, 1643184190, 1573363067, 1499751575, 1422527049,
+    1341875532, 1257991319, 1171076494, 1081340444, 988999350,  894275670,
+    797397601,  698598532,  598116478,  496193509,  393075166,  289009870,
+    184248325,  79042909
+  },
+  {
+    -26352927,    -131685278,  -236700387,  -341145265,  -444768293,
+    -547319836,  -648552837,  -748223418,  -846091463,  -941921199,
+    -1035481765, -1126547764, -1214899812, -1300325059, -1382617709,
+    -1461579512, -1537020242, -1608758156, -1676620430, -1740443579,
+    -1800073847, -1855367579, -1906191569, -1952423376, -1993951623,
+    -2030676267, -2062508834, -2089372636, -2111202957, -2127947205,
+    -2139565041, -2146028478
+  },
+  {
+    2147483647, 2144896908, 2137142926, 2124240379, 2106220350, 2083126253,
+    2055013722, 2021950482, 1984016187, 1941302224, 1893911493, 1841958163,
+    1785567395, 1724875039, 1660027307, 1591180424, 1518500249, 1442161873,
+    1362349203, 1279254514, 1193077990, 1104027236, 1012316783, 918167571,
+    821806412,  723465451,  623381597,  521795962,  418953276,  315101294,
+    210490205,  105372028
+  },
+  {
+    0,         -105372028,  -210490205,  -315101294,  -418953276,
+    -521795962,  -623381597,  -723465451,  -821806412,  -918167571,
+    -1012316783, -1104027236, -1193077990, -1279254514, -1362349203,
+    -1442161873, -1518500249, -1591180424, -1660027307, -1724875039,
+    -1785567395, -1841958163, -1893911493, -1941302224, -1984016187,
+    -2021950482, -2055013722, -2083126253, -2106220350, -2124240379,
+    -2137142926, -2144896908}};
 
 const WORD32 ixheaacd_pre_post_twid_cos_sin_24[4][24] = {
-    {2147196180, 2140300828, 2124240379, 2099083606, 2064938236, 2021950482,
-     1970304427, 1910221225, 1841958163, 1765807553, 1682095484, 1591180424,
-     1493451686, 1389327757, 1279254514, 1163703307, 1043168944, 918167571,
-     789234463,  656921733,  521795962,  384435782,  245429388,  105372028},
-    {-35136551,   -175494670,  -315101294,  -453358606,  -589674567,
-     -723465451,  -854158344,  -981193601,  -1104027236, -1222133256,
-     -1335005915, -1442161873, -1543142273, -1637514700, -1724875039,
-     -1804849197, -1877094714, -1941302224, -1997196779, -2044539031,
-     -2083126253, -2112793208, -2133412859, -2144896908},
-    {2147483647, 2142885719, 2129111626, 2106220350, 2074309916, 2033516967,
-     1984016187, 1926019545, 1859775392, 1785567395, 1703713324, 1614563691,
-     1518500249, 1415934355, 1307305213, 1193077990, 1073741823, 949807729,
-     821806412,  690285995,  555809666,  418953276,  280302863,  140452150},
-    {0,           -140452150,  -280302863,  -418953276,  -555809666,
-     -690285995,  -821806412,  -949807729,  -1073741823, -1193077990,
-     -1307305213, -1415934355, -1518500249, -1614563691, -1703713324,
-     -1785567395, -1859775392, -1926019545, -1984016187, -2033516967,
-     -2074309916, -2106220350, -2129111626, -2142885719}};
+  {
+    2147196180, 2140300828, 2124240379, 2099083606, 2064938236, 2021950482,
+    1970304427, 1910221225, 1841958163, 1765807553, 1682095484, 1591180424,
+    1493451686, 1389327757, 1279254514, 1163703307, 1043168944, 918167571,
+    789234463,  656921733,  521795962,  384435782,  245429388,  105372028
+  },
+  {
+    -35136551,    -175494670,  -315101294,  -453358606,  -589674567,
+    -723465451,  -854158344,  -981193601,  -1104027236, -1222133256,
+    -1335005915, -1442161873, -1543142273, -1637514700, -1724875039,
+    -1804849197, -1877094714, -1941302224, -1997196779, -2044539031,
+    -2083126253, -2112793208, -2133412859, -2144896908
+  },
+  {
+    2147483647, 2142885719, 2129111626, 2106220350, 2074309916, 2033516967,
+    1984016187, 1926019545, 1859775392, 1785567395, 1703713324, 1614563691,
+    1518500249, 1415934355, 1307305213, 1193077990, 1073741823, 949807729,
+    821806412,  690285995,  555809666,  418953276,  280302863,  140452150
+  },
+  {
+    0,         -140452150,  -280302863,  -418953276,  -555809666,
+    -690285995,  -821806412,  -949807729,  -1073741823, -1193077990,
+    -1307305213, -1415934355, -1518500249, -1614563691, -1703713324,
+    -1785567395, -1859775392, -1926019545, -1984016187, -2033516967,
+    -2074309916, -2106220350, -2129111626, -2142885719}};
 
 const FLOAT64 ixheaacd_power_10_table[28] = {
-    1.000000000000, 1.085711119402, 1.178768634794, 1.279802213998,
-    1.389495494373, 1.508590708600, 1.637893706954, 1.778279410039,
-    1.930697728883, 2.096179992453, 2.275845926075, 2.470911227986,
-    2.682695795280, 2.912632654909, 3.162277660168, 3.433320018282,
-    3.727593720315, 4.047089950760, 4.393970560761, 4.770582696144,
-    5.179474679231, 5.623413251903, 6.105402296585, 6.628703161826,
-    7.196856730012, 7.813707376518, 8.483428982441, 9.210553176895};
+  1.000000000000, 1.085711119402, 1.178768634794, 1.279802213998,
+  1.389495494373, 1.508590708600, 1.637893706954, 1.778279410039,
+  1.930697728883, 2.096179992453, 2.275845926075, 2.470911227986,
+  2.682695795280, 2.912632654909, 3.162277660168, 3.433320018282,
+  3.727593720315, 4.047089950760, 4.393970560761, 4.770582696144,
+  5.179474679231, 5.623413251903, 6.105402296585, 6.628703161826,
+  7.196856730012, 7.813707376518, 8.483428982441, 9.210553176895};
 
 const FLOAT32 ixheaacd_dico_lsf_abs_8b_flt[16 * 256] = {
-    377.3749f,  688.0079f,  1147.3799f, 1461.0438f, 1786.7794f, 2143.6711f,
-    2522.1946f, 2889.7402f, 3263.6023f, 3628.4624f, 4005.4351f, 4379.4170f,
-    4783.9556f, 5157.1753f, 5555.1797f, 5926.6816f, 601.5123f,  1066.8242f,
-    1384.3585f, 1652.9448f, 1978.3910f, 2311.2676f, 2674.0537f, 3010.3896f,
-    3360.0623f, 3725.9336f, 4093.3335f, 4470.6431f, 4859.1006f, 5210.4717f,
-    5598.3716f, 5954.4204f, 552.5036f,  859.7047f,  1355.2023f, 1624.9041f,
-    1887.5609f, 2173.1638f, 2540.7429f, 2926.8169f, 3323.2173f, 3680.7197f,
-    4008.3447f, 4330.8442f, 4692.8228f, 5033.9697f, 5443.3467f, 5875.4497f,
-    459.4534f,  793.3189f,  1293.7278f, 1617.3970f, 1920.0642f, 2192.2153f,
-    2487.5627f, 2772.1514f, 3111.3823f, 3461.2671f, 3867.0176f, 4279.8550f,
-    4741.0664f, 5141.0181f, 5552.8237f, 5933.6934f, 327.9834f,  430.4954f,
-    723.9031f,  1528.6172f, 1763.1125f, 2013.7936f, 2334.2153f, 2569.0334f,
-    3017.9436f, 3308.0610f, 3591.7820f, 3865.5430f, 4693.5786f, 5286.7646f,
-    5647.7036f, 5987.2305f, 455.0753f,  606.0817f,  963.7564f,  1374.9937f,
-    1536.4897f, 1914.7618f, 2376.9631f, 2580.8184f, 2989.1501f, 3258.8386f,
-    3485.1460f, 3741.1270f, 4297.4912f, 5207.3779f, 5672.3818f, 5980.5322f,
-    434.9507f,  558.8508f,  890.7061f,  1355.7625f, 1552.6155f, 1895.7960f,
-    2222.5579f, 2502.6079f, 2841.8738f, 3137.5264f, 3367.7336f, 3860.7769f,
-    4795.2554f, 5090.9370f, 5421.8218f, 5874.4287f, 281.0164f,  404.5417f,
-    729.2898f,  997.1851f,  1699.8862f, 1961.3673f, 2255.7202f, 2540.9187f,
-    2804.4553f, 3057.1843f, 3750.2288f, 4340.9893f, 4716.8647f, 5002.7471f,
-    5477.2998f, 5965.7402f, 372.2410f,  505.3570f,  762.3755f,  997.3586f,
-    1174.4255f, 1986.1741f, 2368.1367f, 2624.1733f, 3194.6084f, 3403.2793f,
-    3877.7622f, 4425.7676f, 4824.7837f, 5158.1606f, 5532.7466f, 5893.5483f,
-    367.3766f,  501.1806f,  824.5358f,  1090.6857f, 1271.9792f, 1527.7137f,
-    2381.4382f, 2694.4634f, 2964.5359f, 3639.4832f, 3946.4038f, 4254.3916f,
-    4645.8076f, 5033.5396f, 5373.8735f, 5878.4385f, 229.4505f,  352.5671f,
-    701.0831f,  1226.4518f, 1678.3601f, 1895.7949f, 2140.0664f, 2526.5515f,
-    3080.3391f, 3297.8284f, 3845.3987f, 4427.9785f, 4704.4551f, 4997.4155f,
-    5434.0698f, 5918.4785f, 336.3082f,  516.7915f,  881.9847f,  1272.5824f,
-    1505.1870f, 1880.7520f, 2274.9458f, 2611.0083f, 3126.5256f, 3655.5332f,
-    4183.3877f, 4668.2993f, 5004.0029f, 5305.3491f, 5650.4985f, 5943.7383f,
-    296.0867f,  469.6519f,  956.5997f,  1224.1262f, 1443.0049f, 1727.6880f,
-    2216.1677f, 2689.3677f, 3060.4456f, 3520.9438f, 3916.6050f, 4343.7954f,
-    4763.8906f, 5156.0132f, 5553.8115f, 5936.9634f, 407.1503f,  577.5120f,
-    839.7361f,  1455.3907f, 1665.2137f, 1935.0054f, 2398.0537f, 2652.2605f,
-    3111.1831f, 3505.5962f, 3766.7554f, 4204.8730f, 4699.1631f, 4970.8652f,
-    5295.5962f, 5695.6919f, 281.0083f,  361.8386f,  950.9102f,  1464.1158f,
-    1634.7019f, 1965.4950f, 2211.1406f, 2662.1055f, 2846.0122f, 3585.8884f,
-    4048.7148f, 4358.9150f, 4683.8755f, 5046.0908f, 5400.0859f, 5956.1040f,
-    279.1811f,  393.9142f,  876.8306f,  1502.2417f, 1673.0590f, 2288.7161f,
-    2545.3674f, 3028.9507f, 3517.5840f, 3824.4246f, 4144.8486f, 4481.8140f,
-    4821.2769f, 5162.3975f, 5542.8560f, 5928.5854f, 379.7892f,  500.9199f,
-    725.0223f,  998.7143f,  1179.6127f, 1771.9886f, 2775.4812f, 3136.8457f,
-    3378.6143f, 3674.0188f, 3946.3604f, 4184.4824f, 4521.5454f, 4934.8940f,
-    5315.5029f, 5759.7544f, 317.4339f,  442.2628f,  778.7388f,  1167.8633f,
-    1356.1576f, 1578.5603f, 1840.1584f, 2870.7527f, 3236.1504f, 3502.7249f,
-    3876.3696f, 4100.5244f, 4650.2632f, 5235.1890f, 5665.2285f, 5999.0649f,
-    350.2696f,  492.2163f,  763.0640f,  1264.7550f, 1515.0244f, 1755.7783f,
-    2489.3274f, 2898.6252f, 3143.1018f, 3643.0640f, 4035.0657f, 4255.0889f,
-    4641.7231f, 5138.5107f, 5557.1318f, 5920.2402f, 301.3833f,  464.9852f,
-    762.3419f,  1012.2126f, 1803.5172f, 2192.4214f, 2651.6287f, 3013.6697f,
-    3251.3591f, 3539.4675f, 3946.3433f, 4469.3560f, 4890.7446f, 5200.4878f,
-    5509.6753f, 5910.2397f, 253.1752f,  356.8990f,  630.3325f,  1163.1683f,
-    1528.6230f, 2023.4438f, 2488.6001f, 2745.5627f, 2933.7024f, 3237.4414f,
-    3976.9258f, 4415.2534f, 4789.9131f, 5194.3423f, 5714.6445f, 6032.4160f,
-    265.1815f,  364.7549f,  590.0148f,  805.2595f,  1564.7582f, 2150.6536f,
-    2365.6501f, 2598.7876f, 2861.5334f, 3514.1265f, 4005.6328f, 4609.3091f,
-    4955.4478f, 5238.4116f, 5519.5884f, 5890.7925f, 209.3544f,  313.1497f,
-    503.2642f,  949.4504f,  1729.7280f, 1912.6814f, 2117.5051f, 2498.6272f,
-    3284.6587f, 3810.8555f, 4105.0195f, 4349.5151f, 4770.3682f, 5210.2910f,
-    5585.1533f, 5970.3638f, 302.3150f,  415.6502f,  684.1018f,  922.3598f,
-    1489.4418f, 2235.6252f, 2449.9773f, 2800.6938f, 3061.3721f, 3526.1001f,
-    3905.8174f, 4170.7891f, 4446.4209f, 4907.9937f, 5470.7158f, 5914.7261f,
-    264.9068f,  366.4342f,  582.8182f,  790.8568f,  1619.4548f, 2034.0782f,
-    2337.6724f, 2632.1714f, 2933.2356f, 3430.1858f, 3815.0198f, 4276.3931f,
-    4748.3149f, 5164.0098f, 5553.3320f, 5974.9092f, 249.6359f,  361.9234f,
-    581.9844f,  841.1097f,  1657.5543f, 2184.4114f, 2525.9739f, 2820.0503f,
-    3120.7190f, 3623.7678f, 4050.5435f, 4434.5742f, 4802.6782f, 5171.8438f,
-    5575.0068f, 5963.7402f, 290.1085f,  404.2538f,  664.1223f,  878.2748f,
-    1237.1085f, 2237.4707f, 2497.5647f, 2957.7786f, 3289.3928f, 3626.5276f,
-    4190.9243f, 4594.6450f, 4981.7456f, 5283.5513f, 5617.1538f, 5938.3760f,
-    182.7846f,  270.3831f,  490.2131f,  1070.2524f, 1674.5724f, 2092.4905f,
-    2524.1472f, 2929.3523f, 3334.8005f, 3712.0061f, 4101.2896f, 4475.7324f,
-    4866.1919f, 5231.7559f, 5606.4077f, 5960.9644f, 286.7701f,  386.1487f,
-    577.4210f,  764.3087f,  1151.2404f, 2014.4502f, 2399.8547f, 2879.0371f,
-    3160.2502f, 3450.6274f, 3869.8240f, 4368.3618f, 4816.7861f, 5187.6450f,
-    5564.7231f, 5962.0386f, 179.9538f,  266.0682f,  647.9122f,  1380.2810f,
-    1776.1240f, 2208.4592f, 2590.6843f, 2993.6758f, 3368.2034f, 3753.2156f,
-    4125.2124f, 4508.6050f, 4878.9932f, 5249.3291f, 5612.5049f, 5965.2134f,
-    309.2416f,  434.7111f,  724.6614f,  936.5360f,  1264.9886f, 2272.1338f,
-    2548.4519f, 2904.0798f, 3313.4990f, 3579.7854f, 3914.5811f, 4297.5938f,
-    4756.9072f, 5163.2017f, 5592.2822f, 5943.7222f, 256.9009f,  393.7155f,
-    769.3966f,  1200.9640f, 1774.4797f, 2307.9629f, 2794.6799f, 3165.9431f,
-    3507.7952f, 3840.5791f, 4142.8877f, 4453.5078f, 4790.6973f, 5142.6123f,
-    5530.5977f, 5923.2188f, 394.1425f,  602.0079f,  934.5173f,  1352.9718f,
-    1813.9639f, 2172.5435f, 2603.7295f, 2963.9590f, 3335.2344f, 3732.0515f,
-    4120.0151f, 4487.9668f, 4877.6294f, 5238.9336f, 5596.1479f, 5939.6489f,
-    373.0307f,  665.4328f,  1227.4684f, 1524.6017f, 1947.3784f, 2361.6384f,
-    2778.1921f, 3134.5396f, 3462.3992f, 3752.4592f, 4069.0352f, 4404.2720f,
-    4782.2241f, 5145.0581f, 5541.9980f, 5932.9136f, 449.9942f,  814.1862f,
-    1344.2784f, 1682.7061f, 2086.3599f, 2486.9709f, 2916.1177f, 3265.9099f,
-    3616.3977f, 3919.6345f, 4218.5342f, 4519.2207f, 4857.5220f, 5193.5269f,
-    5573.7339f, 5934.5400f, 531.4455f,  965.7403f,  1458.5353f, 1773.3784f,
-    2236.0146f, 2650.9109f, 3099.2871f, 3467.1567f, 3809.7056f, 4094.6472f,
-    4378.5811f, 4660.2471f, 4962.5078f, 5270.9863f, 5629.4160f, 5973.6450f,
-    565.5986f,  1091.1300f, 1561.4944f, 1983.5482f, 2492.8821f, 2897.5085f,
-    3233.5361f, 3539.8831f, 3838.6494f, 4093.4460f, 4372.1924f, 4678.2251f,
-    4999.2646f, 5325.0371f, 5672.8887f, 5998.9990f, 581.0623f,  976.0275f,
-    1447.0302f, 1779.9243f, 2148.2158f, 2543.8347f, 2979.5061f, 3373.6099f,
-    3796.8259f, 4164.8242f, 4510.5493f, 4853.5527f, 5175.6318f, 5465.3647f,
-    5763.2334f, 6050.6582f, 429.4613f,  802.5781f,  1229.0529f, 1512.6678f,
-    1835.8625f, 2216.9915f, 2625.3999f, 2995.9927f, 3379.5146f, 3764.7837f,
-    4156.1382f, 4532.4570f, 4906.4678f, 5262.8960f, 5626.6519f, 5970.6504f,
-    224.5468f,  328.6938f,  615.8844f,  1207.4470f, 1520.9565f, 1865.9806f,
-    2182.4731f, 2431.4897f, 3239.3486f, 3490.9065f, 3775.7139f, 4291.4312f,
-    4740.0815f, 5192.0786f, 5532.9302f, 5928.7236f, 312.1133f,  424.3103f,
-    716.4448f,  921.9969f,  1244.5491f, 2017.9143f, 2248.4170f, 2840.0688f,
-    3138.9390f, 3399.7288f, 3723.3479f, 3999.6824f, 4582.2339f, 5148.5166f,
-    5631.8989f, 6000.7192f, 373.5378f,  506.7356f,  789.6149f,  942.6201f,
-    1695.8035f, 2021.6426f, 2323.3867f, 2649.5979f, 2853.1729f, 3169.5815f,
-    3524.9375f, 3848.6399f, 4261.7319f, 4978.9668f, 5505.4004f, 5924.7939f,
-    503.2296f,  724.8124f,  940.3833f,  1220.5646f, 1439.8641f, 1726.9827f,
-    2215.5464f, 2476.0925f, 2846.8127f, 3232.0950f, 3638.5989f, 3986.3333f,
-    4371.3052f, 5022.0664f, 5657.4897f, 6040.3452f, 398.3355f,  530.8898f,
-    835.5377f,  1058.3699f, 1327.2036f, 1814.9178f, 2114.2439f, 2515.8892f,
-    2754.9077f, 3094.8794f, 3598.7061f, 3981.2385f, 4605.9160f, 5110.8364f,
-    5550.1899f, 5953.9600f, 327.7583f,  454.8903f,  825.9029f,  1025.4349f,
-    1321.1567f, 1551.4836f, 1978.2037f, 2838.9021f, 3111.9041f, 3417.3940f,
-    3841.0564f, 4696.0547f, 5126.1641f, 5409.5347f, 5711.7163f, 5968.3394f,
-    327.1260f,  431.3983f,  721.9533f,  871.1266f,  1507.7616f, 1847.8716f,
-    2144.9641f, 2491.1108f, 2702.0847f, 3483.1516f, 3917.5173f, 4254.1260f,
-    4704.4863f, 4981.6284f, 5450.1035f, 5937.7861f, 443.5867f,  610.7686f,
-    818.9614f,  999.3525f,  1181.9182f, 1884.4948f, 2243.3950f, 2522.8867f,
-    2993.8594f, 3196.6631f, 3835.5020f, 4233.2568f, 4506.8604f, 4985.0249f,
-    5544.1382f, 5980.0083f, 395.7788f,  582.9504f,  822.1151f,  1013.0453f,
-    1224.6812f, 1988.4263f, 2452.4744f, 2686.4263f, 2952.8831f, 3135.0867f,
-    3562.5471f, 4006.6929f, 4401.7471f, 5038.5654f, 5567.4189f, 5986.0850f,
-    264.3071f,  372.0398f,  616.4940f,  842.1705f,  1350.0250f, 1822.1957f,
-    2165.8896f, 2662.2937f, 3055.4390f, 3502.6787f, 3923.4236f, 4352.6587f,
-    4772.5068f, 5158.1309f, 5573.9385f, 5972.6895f, 218.7390f,  325.2024f,
-    635.0441f,  1103.4701f, 1636.4287f, 2070.2615f, 2274.2910f, 2453.2002f,
-    3069.4382f, 3615.7065f, 3980.0811f, 4484.8662f, 4848.6416f, 5093.7163f,
-    5522.6973f, 5907.4048f, 260.0797f,  461.2137f,  1049.2261f, 1334.1865f,
-    1628.6233f, 2014.9823f, 2413.4802f, 2844.4973f, 3232.3040f, 3661.0122f,
-    4069.8274f, 4466.5210f, 4857.6553f, 5234.4463f, 5608.4517f, 5954.7920f,
-    301.7969f,  406.3861f,  706.7324f,  1387.1207f, 1581.4719f, 2004.7585f,
-    2291.9421f, 2548.9978f, 3076.8755f, 3343.1306f, 3623.1770f, 4279.7432f,
-    4777.6563f, 5084.3960f, 5473.4536f, 5872.0615f, 344.0269f,  472.3550f,
-    776.6819f,  1455.1270f, 1611.6870f, 2012.4386f, 2417.4033f, 2621.8564f,
-    3318.9663f, 3709.0132f, 3944.1958f, 4299.0293f, 4776.4038f, 5184.1089f,
-    5545.5454f, 5913.9531f, 332.1463f,  433.0623f,  992.1605f,  1254.8217f,
-    1498.4819f, 1824.6357f, 2118.3374f, 2444.6484f, 2684.8369f, 2930.4683f,
-    3557.4851f, 4292.9014f, 4786.7251f, 5138.2168f, 5616.2739f, 5996.8369f,
-    281.7202f,  372.7708f,  1074.7051f, 1443.0428f, 1687.6460f, 1980.7075f,
-    2275.4241f, 2632.2017f, 2848.1765f, 3118.7881f, 3628.5857f, 4522.9585f,
-    4876.2163f, 5177.2739f, 5600.6675f, 5960.9634f, 412.0151f,  535.6881f,
-    768.8618f,  1462.2601f, 1789.1055f, 1947.8196f, 2224.6890f, 2447.9089f,
-    2834.6140f, 3472.6721f, 3729.8525f, 4008.2893f, 4525.7271f, 4822.9194f,
-    5204.6611f, 5895.0942f, 263.8760f,  379.7789f,  825.0498f,  1113.1218f,
-    1465.8749f, 1846.7463f, 2146.0496f, 2487.2766f, 2845.8447f, 3388.4800f,
-    3883.8447f, 4440.7603f, 4867.0815f, 5214.7280f, 5535.8149f, 5906.9932f,
-    409.8116f,  583.7237f,  859.1983f,  1172.0491f, 1377.6473f, 1984.8322f,
-    2361.7292f, 2688.9368f, 3238.6563f, 3542.6716f, 3944.3005f, 4441.0840f,
-    4881.1211f, 5224.6045f, 5604.3711f, 5909.3657f, 318.0743f,  438.8244f,
-    852.9153f,  1061.4503f, 1290.7609f, 1552.5408f, 2053.1118f, 2373.2883f,
-    2926.1560f, 3452.9551f, 4098.6626f, 4585.2773f, 4967.0898f, 5271.2720f,
-    5644.6709f, 5961.9585f, 370.3631f,  496.5860f,  932.6390f,  1213.4189f,
-    1452.6641f, 1803.1532f, 2092.2354f, 2607.5247f, 2883.8086f, 3112.1086f,
-    3687.5657f, 4525.1274f, 4846.9404f, 5130.0537f, 5416.4141f, 5804.5122f,
-    247.8941f,  343.9862f,  751.6780f,  1526.2566f, 1712.5012f, 2038.0667f,
-    2324.0371f, 2727.9749f, 3005.8975f, 3378.9817f, 3858.2002f, 4339.2017f,
-    4716.4580f, 5125.0918f, 5564.3589f, 5969.7163f, 297.6552f,  401.7544f,
-    891.9346f,  1380.2275f, 1540.3125f, 1782.6058f, 2009.2045f, 2614.2092f,
-    2899.5396f, 3379.9722f, 3804.1169f, 4284.8540f, 4696.3335f, 5118.4551f,
-    5525.9839f, 5934.2686f, 226.1444f,  333.4511f,  682.9995f,  1307.4166f,
-    1554.1943f, 1849.3679f, 2116.3438f, 2756.3567f, 3204.3018f, 3540.4106f,
-    4002.1895f, 4402.7734f, 4796.4395f, 5192.6812f, 5600.6841f, 5960.1855f,
-    196.3791f,  299.9716f,  572.3173f,  1201.8826f, 1804.7235f, 2012.0171f,
-    2264.7415f, 2790.3406f, 3272.6926f, 3668.4863f, 4063.0435f, 4442.4419f,
-    4810.5957f, 5156.0923f, 5512.8501f, 5900.7441f, 280.1911f,  391.5190f,
-    705.9903f,  1435.5063f, 1588.2345f, 2116.5032f, 2357.1875f, 2670.7461f,
-    3299.0071f, 3507.9336f, 4044.3057f, 4591.9023f, 4981.4575f, 5281.1270f,
-    5654.7158f, 5949.9263f, 262.5740f,  370.5089f,  654.7243f,  1278.9299f,
-    1847.3096f, 2087.3394f, 2553.8892f, 2887.8269f, 3254.0747f, 3810.6626f,
-    4258.4390f, 4528.8022f, 4872.9741f, 5206.0483f, 5565.2876f, 5918.5596f,
-    193.6133f,  356.3127f,  1076.8109f, 1485.8608f, 1887.7994f, 2273.1333f,
-    2676.7832f, 3052.3513f, 3419.1294f, 3792.5024f, 4161.7036f, 4532.6431f,
-    4898.5176f, 5262.0498f, 5622.8901f, 5976.4863f, 302.7377f,  409.7598f,
-    899.1851f,  1176.6501f, 1531.3615f, 1933.6494f, 2229.9561f, 2819.8936f,
-    3031.6248f, 3807.0129f, 4118.7495f, 4412.7339f, 4704.6758f, 5012.0190f,
-    5351.4160f, 5892.3232f, 421.1889f,  587.3521f,  835.9208f,  1248.0127f,
-    1475.8882f, 1779.3772f, 2330.6294f, 2606.6780f, 3026.0417f, 3513.8035f,
-    3754.6023f, 4081.0518f, 4536.3438f, 4815.9336f, 5117.6392f, 5802.9902f,
-    378.0719f,  722.0884f,  1327.5808f, 1665.8940f, 1954.7782f, 2238.9473f,
-    2608.8538f, 2958.7910f, 3341.5112f, 3721.2021f, 4095.8457f, 4457.6865f,
-    4843.8672f, 5212.5142f, 5589.5122f, 5945.3730f, 468.4631f,  962.3222f,
-    1541.0238f, 1919.1746f, 2347.4365f, 2650.7366f, 2927.5945f, 3166.4202f,
-    3451.0664f, 3757.8477f, 4109.2383f, 4467.9443f, 4858.6045f, 5211.8428f,
-    5593.3311f, 5951.0137f, 422.2508f,  845.8956f,  1495.2552f, 1811.3933f,
-    2128.1157f, 2371.2532f, 2656.0715f, 2942.9011f, 3294.5308f, 3652.0935f,
-    4031.2534f, 4399.2222f, 4801.9497f, 5163.3721f, 5559.4517f, 5934.4063f,
-    423.1028f,  661.7286f,  991.1974f,  1204.3813f, 1472.8564f, 2003.0298f,
-    2443.5833f, 2789.2795f, 3354.1692f, 3722.7822f, 4032.7351f, 4320.9727f,
-    4621.8140f, 4963.7310f, 5429.8203f, 5900.1465f, 361.2513f,  485.9720f,
-    828.4865f,  1340.9952f, 1497.8477f, 2072.8511f, 2437.9839f, 2674.9912f,
-    3259.3357f, 3539.0474f, 3789.1389f, 4087.5015f, 4404.8867f, 4771.0947f,
-    5500.2227f, 6015.7041f, 301.8146f,  392.9569f,  685.1938f,  1783.6246f,
-    2034.8542f, 2257.1614f, 2519.8713f, 2782.6279f, 3152.1135f, 3400.8662f,
-    3614.3801f, 3906.7375f, 4233.1968f, 4712.3682f, 5596.0396f, 5998.5742f,
-    242.0591f,  371.0809f,  729.0743f,  1190.6813f, 1851.5691f, 2132.6724f,
-    2334.7773f, 2522.3608f, 3091.8643f, 3621.4614f, 3854.5227f, 4174.7017f,
-    4490.7510f, 4780.1230f, 5157.6147f, 5865.4756f, 431.2477f,  562.1808f,
-    888.5207f,  1034.2062f, 1443.2480f, 2109.8850f, 2337.1443f, 2829.1870f,
-    3070.1301f, 3252.6370f, 3510.3967f, 4366.2236f, 4843.2139f, 5133.0537f,
-    5549.8911f, 5850.3252f, 420.2594f,  668.9339f,  911.1281f,  1218.0372f,
-    1806.5541f, 2050.8423f, 2394.5708f, 2761.3542f, 3021.1716f, 3414.0020f,
-    3970.9626f, 4342.2900f, 4691.6074f, 5062.5386f, 5452.6655f, 5792.8384f,
-    257.3011f,  370.8905f,  604.8825f,  1096.4209f, 1711.8464f, 1934.4335f,
-    2319.4717f, 2769.0144f, 3019.0200f, 3354.3726f, 4119.8809f, 4354.8589f,
-    4557.7979f, 4893.5776f, 5450.3042f, 5910.4136f, 241.4264f,  347.9253f,
-    622.2432f,  1248.8121f, 1559.7318f, 1848.8098f, 2315.5635f, 2571.5894f,
-    2879.5754f, 3624.1069f, 3968.0334f, 4238.9727f, 4713.4746f, 5156.6792f,
-    5568.5596f, 5975.8716f, 478.7131f,  629.4184f,  918.1857f,  1342.7815f,
-    1535.1541f, 1803.0487f, 2483.7764f, 2724.4321f, 2998.1257f, 3634.9932f,
-    3915.9443f, 4119.2837f, 4327.0283f, 4980.3516f, 5532.6880f, 5964.3052f,
-    265.7818f,  373.8575f,  723.3755f,  1186.0619f, 1509.2827f, 2064.2075f,
-    2298.1992f, 2566.4395f, 2785.7659f, 3423.1396f, 3883.9011f, 4136.8940f,
-    4463.0386f, 5010.6592f, 5539.0337f, 5931.4414f, 221.4221f,  347.7610f,
-    707.4465f,  1187.0800f, 1575.9095f, 1824.3983f, 1979.3307f, 2299.3174f,
-    2967.6799f, 3472.3381f, 3955.8469f, 4292.6079f, 4794.8745f, 5127.5181f,
-    5652.6729f, 5953.0132f, 397.2769f,  510.2605f,  746.8268f,  1588.0735f,
-    1991.5200f, 2150.6843f, 2439.0486f, 2712.2754f, 2972.5825f, 3501.2673f,
-    3917.5459f, 4143.6069f, 4443.4414f, 4829.1929f, 5490.0376f, 6028.3794f,
-    280.5184f,  370.6464f,  640.7120f,  1721.3899f, 1948.9806f, 2149.9592f,
-    2400.4678f, 2674.0542f, 3146.3154f, 3419.8850f, 3813.9553f, 4417.4497f,
-    4818.3652f, 5139.6323f, 5465.0669f, 5879.7183f, 325.2418f,  431.2627f,
-    1008.7708f, 1271.9235f, 1527.4150f, 2066.6370f, 2242.3311f, 2883.4065f,
-    3180.6614f, 3352.5015f, 3756.9688f, 4386.6904f, 4857.6621f, 5189.2212f,
-    5514.7573f, 5856.8086f, 451.8427f,  582.4401f,  925.8821f,  1363.4249f,
-    1503.2460f, 1961.5940f, 2265.6001f, 2574.4414f, 3123.0769f, 3345.1587f,
-    3634.3022f, 4266.0137f, 4880.8052f, 5223.5776f, 5567.8901f, 5880.3770f,
-    411.0873f,  553.3847f,  809.2106f,  1023.4841f, 1189.0618f, 1786.0770f,
-    2121.8489f, 2454.6458f, 2947.4700f, 3220.3210f, 3828.0911f, 4218.0229f,
-    4831.2383f, 5322.1445f, 5727.3906f, 6033.3887f, 310.5608f,  442.2204f,
-    742.7755f,  1097.5740f, 1340.9608f, 1854.4385f, 2261.6399f, 2634.8315f,
-    3297.8879f, 3638.6956f, 3925.8770f, 4232.9146f, 4559.9287f, 4893.5830f,
-    5403.0981f, 5917.7056f, 377.5583f,  488.4103f,  945.2491f,  1234.1572f,
-    1416.0774f, 1666.5979f, 1932.9910f, 2746.2000f, 2997.4753f, 3216.6152f,
-    3559.3999f, 3843.8130f, 4359.6626f, 5014.2920f, 5560.6162f, 5992.7212f,
-    285.2173f,  389.6116f,  825.5790f,  1238.8229f, 1459.6588f, 1860.8855f,
-    2178.6296f, 2519.1597f, 2828.0032f, 3278.8101f, 3560.8286f, 4142.0552f,
-    4691.0698f, 5117.7778f, 5558.7944f, 5954.6680f, 465.7002f,  631.7491f,
-    914.5521f,  1340.0057f, 1562.5760f, 1844.1741f, 2186.1208f, 2483.7080f,
-    2901.9417f, 3190.3162f, 3474.7651f, 3873.4065f, 4240.1973f, 4761.1255f,
-    5428.2832f, 5958.5273f, 340.5456f,  449.2341f,  793.7005f,  1387.7467f,
-    1555.8701f, 1938.7877f, 2201.6155f, 2579.5762f, 2914.9724f, 3149.8584f,
-    3699.3984f, 3985.6790f, 4331.7534f, 4999.4805f, 5514.6924f, 5969.4897f,
-    395.8350f,  564.1188f,  774.8214f,  1276.3201f, 1721.8716f, 1864.0143f,
-    2267.5696f, 2790.2031f, 3003.9434f, 3377.6140f, 3917.7395f, 4167.3867f,
-    4465.2529f, 4936.1138f, 5464.0479f, 5905.0444f, 324.1844f,  443.0006f,
-    728.8958f,  1398.6589f, 1584.1820f, 1923.8724f, 2348.0903f, 2561.5554f,
-    3154.5991f, 3449.1746f, 3771.7927f, 4182.1899f, 4937.0791f, 5361.6509f,
-    5727.7656f, 6002.7505f, 267.1790f,  373.7663f,  703.5949f,  1173.7009f,
-    1390.2002f, 1905.7941f, 2177.4961f, 2703.2627f, 3022.9121f, 3308.9612f,
-    3798.5823f, 4187.1533f, 4703.2163f, 5136.0918f, 5571.1655f, 5966.6577f,
-    272.9294f,  399.3804f,  797.7335f,  1180.1516f, 1426.4850f, 2097.2839f,
-    2355.4727f, 2793.8774f, 3137.1907f, 3458.7727f, 3893.6628f, 4245.8047f,
-    4652.3794f, 5106.5293f, 5568.1885f, 5948.3169f, 324.5529f,  431.7663f,
-    759.6147f,  1494.8739f, 1668.8168f, 2110.5635f, 2427.4104f, 2672.9270f,
-    3170.5266f, 3448.2080f, 3717.1240f, 4034.2280f, 4375.3647f, 5041.1372f,
-    5666.9517f, 6014.7217f, 306.4759f,  404.5361f,  795.7795f,  1675.9967f,
-    1835.0950f, 2160.6624f, 2430.8855f, 2734.2646f, 3270.1426f, 3586.1355f,
-    3821.9670f, 4102.0078f, 4372.9404f, 4918.9146f, 5412.0376f, 5868.5225f,
-    421.3803f,  607.7995f,  813.0241f,  1286.8525f, 1827.2451f, 2026.8683f,
-    2333.9453f, 2730.9817f, 2988.4067f, 3303.8513f, 3759.1897f, 4057.5264f,
-    4441.5493f, 4890.0078f, 5212.0469f, 5672.2188f, 423.8560f,  599.5201f,
-    829.0651f,  1082.6381f, 1245.9272f, 1623.7075f, 2453.0420f, 2855.6631f,
-    3171.3855f, 3475.5881f, 3715.4219f, 3972.1326f, 4419.1597f, 4894.0283f,
-    5363.8691f, 5919.2681f, 441.2789f,  634.8879f,  921.6287f,  1189.0240f,
-    1368.7466f, 2012.1312f, 2383.7656f, 2638.5222f, 2975.0288f, 3163.6150f,
-    3433.9958f, 3838.9917f, 4186.6426f, 4856.8477f, 5559.1196f, 5977.2290f,
-    349.2039f,  466.2342f,  724.2582f,  904.4043f,  1190.4492f, 1981.7565f,
-    2226.5554f, 2592.5098f, 2865.5525f, 3195.8196f, 3735.6345f, 4267.1660f,
-    4810.9893f, 5207.5093f, 5605.1445f, 5952.0361f, 497.7713f,  719.9073f,
-    925.0815f,  1146.3021f, 1326.7095f, 1574.5039f, 2306.7678f, 2714.8022f,
-    2967.5190f, 3400.1121f, 3732.0544f, 3981.7878f, 4553.4819f, 5090.0869f,
-    5426.2085f, 5833.5220f, 471.7526f,  648.3213f,  902.1542f,  1245.7086f,
-    1423.3403f, 1701.1757f, 2125.8530f, 2407.0481f, 2969.5583f, 3294.1296f,
-    3712.8398f, 4140.7930f, 4808.4668f, 5322.3896f, 5662.1255f, 5950.6211f,
-    345.3843f,  485.9887f,  841.2579f,  1035.9401f, 1244.8905f, 1488.1833f,
-    2340.4253f, 2607.0859f, 2845.4153f, 3223.1768f, 3557.0696f, 4119.7944f,
-    4666.8896f, 5145.8589f, 5565.7534f, 5976.6875f, 332.4270f,  427.5984f,
-    829.9191f,  1138.0469f, 1339.4468f, 1589.0535f, 1926.0630f, 2432.9331f,
-    2699.7964f, 3311.4355f, 3716.1003f, 4270.4990f, 4760.3647f, 5208.3950f,
-    5619.2080f, 5971.2715f, 249.0114f,  381.2982f,  925.7067f,  1520.3356f,
-    1842.8396f, 2368.2908f, 2783.4033f, 3272.5757f, 3673.7402f, 4046.3950f,
-    4370.4966f, 4688.0269f, 5002.6772f, 5316.3594f, 5650.2192f, 5977.6587f,
-    263.3275f,  451.6255f,  1252.2307f, 1503.0652f, 1786.7695f, 2082.7554f,
-    2451.1829f, 2804.7590f, 3116.7583f, 3493.8892f, 3884.6575f, 4349.6724f,
-    4770.0156f, 5143.1636f, 5542.5913f, 5931.5522f, 252.9447f,  341.5762f,
-    632.7664f,  1766.8096f, 2084.1511f, 2272.7332f, 2531.1006f, 2765.2080f,
-    3134.5417f, 3380.6223f, 3640.8015f, 3932.7854f, 4532.1172f, 5245.2070f,
-    5597.0776f, 5973.6831f, 234.9979f,  324.6731f,  1239.8643f, 1663.1921f,
-    1858.7769f, 2171.1614f, 2403.8818f, 2680.6433f, 2836.4985f, 3192.6577f,
-    3864.8811f, 4385.8066f, 4845.9766f, 5150.2412f, 5631.1519f, 6011.7773f,
-    284.5302f,  410.1263f,  985.4119f,  1298.3987f, 1789.4304f, 1996.9287f,
-    2450.8525f, 2831.6011f, 2994.2073f, 3214.1306f, 3525.0498f, 3819.9141f,
-    4672.7544f, 5424.3545f, 5691.0732f, 5980.3096f, 244.2704f,  415.5891f,
-    1038.3009f, 1317.5186f, 1686.4528f, 2081.3147f, 2476.9873f, 2959.5393f,
-    3214.9561f, 3569.1431f, 3934.4736f, 4308.7114f, 4728.3687f, 5105.7964f,
-    5488.1938f, 5908.9443f, 335.8417f,  468.3464f,  1003.6253f, 1275.0145f,
-    1534.2854f, 1985.3167f, 2348.3411f, 2743.3169f, 2956.0967f, 3408.5063f,
-    3866.8574f, 4287.0034f, 4556.7222f, 4922.7832f, 5259.7480f, 5800.2876f,
-    388.2726f,  518.0591f,  832.5999f,  1325.0247f, 1528.8624f, 1808.1732f,
-    2151.0820f, 2486.1331f, 2815.4980f, 3158.5391f, 3635.3606f, 3960.5383f,
-    4671.7686f, 5371.8140f, 5777.8940f, 6056.4722f, 506.5153f,  673.0771f,
-    900.0349f,  1154.2124f, 1378.2689f, 1786.9409f, 2081.9631f, 2398.6965f,
-    2859.7441f, 3075.4841f, 3546.6563f, 4322.6694f, 4732.0049f, 4992.5542f,
-    5267.5859f, 5807.1812f, 487.2466f,  653.6116f,  968.5656f,  1389.2708f,
-    1601.5822f, 1910.9694f, 2282.4038f, 2608.7063f, 3032.6233f, 3361.9692f,
-    3629.8552f, 3908.8335f, 4318.4009f, 4646.5781f, 5043.5962f, 5792.7393f,
-    432.8733f,  591.7551f,  899.2619f,  1490.1176f, 1789.8751f, 2060.3750f,
-    2434.8779f, 2840.3374f, 3122.1292f, 3472.8079f, 3830.8870f, 4097.2622f,
-    4353.5464f, 4650.2075f, 4981.5752f, 5482.9565f, 378.4767f,  508.5656f,
-    802.8280f,  947.2892f,  1532.0898f, 2038.8177f, 2349.1965f, 2650.2039f,
-    2863.8018f, 3591.6697f, 3918.9211f, 4256.6255f, 4604.8467f, 4899.0996f,
-    5237.6084f, 5791.5029f, 407.0908f,  546.0364f,  866.1215f,  1098.6927f,
-    1347.2009f, 1657.1525f, 1965.5845f, 2717.7190f, 3033.4961f, 3509.9031f,
-    3873.4150f, 4131.4438f, 4389.5693f, 4774.2295f, 5450.1768f, 5977.5151f,
-    429.3459f,  568.8134f,  903.5659f,  1099.2942f, 1379.4979f, 2207.5940f,
-    2479.9919f, 2780.9072f, 3206.3960f, 3425.4084f, 3682.5911f, 3950.1941f,
-    4324.0840f, 4689.4922f, 5068.2534f, 5787.2852f, 371.9443f,  524.7249f,
-    890.0464f,  1670.7485f, 1958.5308f, 2182.7007f, 2558.5007f, 2835.4937f,
-    3192.0740f, 3634.4817f, 3950.0942f, 4259.6953f, 4628.0049f, 4999.1616f,
-    5364.9893f, 5801.6855f, 323.1922f,  451.0327f,  787.1655f,  1011.6555f,
-    1323.8138f, 2177.6636f, 2401.1392f, 2826.8796f, 3432.8999f, 3653.1851f,
-    3883.9897f, 4082.7559f, 4361.6753f, 4635.1475f, 5084.7544f, 5823.3062f,
-    377.0061f,  524.2181f,  743.6288f,  1378.9187f, 1857.6434f, 2056.4695f,
-    2453.7949f, 2902.1995f, 3127.2651f, 3463.3523f, 3980.1316f, 4241.2578f,
-    4528.5859f, 4881.4521f, 5239.3145f, 5580.5986f, 308.7965f,  403.7058f,
-    705.9506f,  1823.8571f, 2126.9387f, 2369.2810f, 2647.2048f, 2855.8276f,
-    3209.7708f, 3498.2310f, 3747.6047f, 3972.8647f, 4254.3325f, 4574.4292f,
-    5087.3965f, 5890.4219f, 274.7571f,  383.7251f,  573.6029f,  1142.8372f,
-    2151.7173f, 2558.8972f, 2751.9468f, 2987.4412f, 3234.3350f, 3526.0127f,
-    3922.9927f, 4189.0249f, 4483.3774f, 4877.1860f, 5396.7798f, 5921.8125f,
-    248.5916f,  423.6264f,  1260.9626f, 1696.0492f, 1972.9108f, 2298.5972f,
-    2592.9307f, 2947.2292f, 3266.2227f, 3614.3572f, 3980.3892f, 4359.4067f,
-    4770.2842f, 5158.9058f, 5554.6597f, 5936.9043f, 320.5471f,  429.6766f,
-    657.1440f,  1390.1080f, 2194.6426f, 2507.6086f, 2712.3662f, 2980.3408f,
-    3216.1682f, 3544.8467f, 3956.9790f, 4227.5308f, 4463.7563f, 4745.7124f,
-    5088.6650f, 5525.8516f, 245.5478f,  520.3131f,  1177.0693f, 1454.0125f,
-    1770.2620f, 2160.8779f, 2551.2700f, 2950.2324f, 3326.8621f, 3710.4624f,
-    4104.3936f, 4481.9971f, 4865.9736f, 5230.6396f, 5608.5649f, 5965.6162f,
-    514.5864f,  956.9897f,  1287.9597f, 1520.3473f, 1802.0631f, 2116.4980f,
-    2509.8552f, 2865.9822f, 3238.7510f, 3611.3108f, 4016.4353f, 4431.8457f,
-    4860.3442f, 5231.4814f, 5614.6016f, 5963.9976f, 537.0523f,  932.2803f,
-    1380.2690f, 1709.4702f, 2079.9902f, 2446.4014f, 2859.4204f, 3229.6975f,
-    3623.4031f, 4012.5327f, 4373.7568f, 4724.3359f, 5078.2686f, 5397.6040f,
-    5721.9639f, 6028.1167f, 452.5153f,  798.2777f,  1099.3080f, 1317.0807f,
-    1652.6885f, 2059.7708f, 2471.0164f, 2808.5396f, 3146.5076f, 3494.0779f,
-    3870.6912f, 4310.8281f, 4777.5024f, 5181.2617f, 5574.4912f, 5934.3813f,
-    340.3716f,  430.5102f,  872.3513f,  1636.3792f, 1772.8615f, 2074.0161f,
-    2295.1008f, 2693.0037f, 3177.7710f, 3391.7559f, 3670.8718f, 4224.3926f,
-    4896.3877f, 5199.9883f, 5580.4512f, 5911.7671f, 317.8269f,  414.8185f,
-    881.1970f,  1658.4944f, 1852.0098f, 2136.0415f, 2380.8228f, 2668.9141f,
-    3046.8027f, 3299.0051f, 3523.0593f, 3758.9412f, 4116.9063f, 5061.2124f,
-    5624.1777f, 5989.4761f, 374.0671f,  488.0840f,  734.0546f,  1415.9261f,
-    1648.7783f, 1852.8462f, 2099.1895f, 2347.5562f, 2954.8359f, 3269.6714f,
-    3536.7920f, 4116.1743f, 4481.4355f, 4913.8838f, 5467.2817f, 5909.8779f,
-    340.4291f,  448.5775f,  1041.4979f, 1426.0011f, 1637.8165f, 1968.6743f,
-    2210.7976f, 2647.5144f, 2913.8650f, 3131.7698f, 3429.8755f, 3722.6763f,
-    4104.6479f, 4969.0093f, 5574.2231f, 5978.2070f, 254.2538f,  412.7710f,
-    947.8206f,  1209.3683f, 1690.4813f, 2040.7881f, 2401.4314f, 2728.0066f,
-    3016.2290f, 3530.3865f, 3964.6563f, 4393.6934f, 4804.2168f, 5187.9302f,
-    5586.4399f, 5954.8950f, 241.0244f,  347.0750f,  835.2348f,  1601.9089f,
-    1786.4336f, 2134.3950f, 2396.0139f, 2848.9712f, 3239.9138f, 3623.8250f,
-    4029.5088f, 4400.3936f, 4797.3564f, 5195.7310f, 5596.6689f, 5965.9878f,
-    309.3683f,  453.6776f,  812.9343f,  1125.9915f, 1423.5935f, 2149.2227f,
-    2514.9277f, 3031.3599f, 3463.7219f, 3790.7839f, 4064.0039f, 4297.9839f,
-    4653.4551f, 5189.7061f, 5721.2954f, 6033.0752f, 469.4284f,  730.1902f,
-    973.0643f,  1170.5016f, 1572.2559f, 2084.2769f, 2567.8604f, 2963.4592f,
-    3286.9617f, 3580.3228f, 3882.8706f, 4335.5483f, 4859.7197f, 5258.2827f,
-    5627.9785f, 5957.8623f, 454.6165f,  795.2360f,  1078.7705f, 1294.9473f,
-    1761.6650f, 2235.2788f, 2695.8455f, 3095.7695f, 3473.4897f, 3833.0889f,
-    4185.7290f, 4528.9863f, 4893.0039f, 5240.7627f, 5608.8594f, 5951.0718f,
-    563.4587f,  875.8987f,  1139.0026f, 1378.2317f, 1855.7401f, 2279.7683f,
-    2651.3079f, 2968.4397f, 3279.4453f, 3607.2500f, 3975.5796f, 4358.3574f,
-    4768.7969f, 5135.3706f, 5525.3501f, 5904.2617f, 461.7852f,  855.0644f,
-    1367.4387f, 1702.5593f, 2141.0093f, 2500.9055f, 2853.8596f, 3123.9744f,
-    3406.0178f, 3694.0481f, 4028.9985f, 4373.1113f, 4768.2891f, 5137.6895f,
-    5541.3721f, 5921.4507f, 438.6031f,  753.0179f,  1269.3203f, 1630.4396f,
-    2027.2959f, 2350.9695f, 2672.1396f, 2957.1809f, 3250.1545f, 3546.5315f,
-    3894.0161f, 4249.9346f, 4666.2266f, 5061.2524f, 5490.7749f, 5904.6362f,
-    543.3182f,  828.4835f,  1239.1818f, 1471.1134f, 1737.8622f, 2037.2484f,
-    2434.5112f, 2801.3242f, 3162.3250f, 3508.1255f, 3849.0903f, 4165.7588f,
-    4588.3809f, 5020.0952f, 5475.2813f, 5904.6377f, 519.5982f,  837.6639f,
-    1171.2003f, 1363.0320f, 1617.4617f, 1976.1787f, 2472.0303f, 2901.3264f,
-    3340.7300f, 3736.0830f, 4103.3843f, 4444.8657f, 4800.9482f, 5145.6011f,
-    5544.2002f, 5933.0981f, 433.3774f,  582.7663f,  899.6142f,  1150.7437f,
-    1321.1309f, 1947.8643f, 2557.8604f, 2733.1497f, 3240.4907f, 3634.7915f,
-    3855.9856f, 4058.0281f, 4364.2568f, 5096.5225f, 5659.0952f, 6013.8145f,
-    424.9731f,  604.3164f,  868.1793f,  1207.7882f, 1414.2374f, 1713.2893f,
-    2520.2900f, 2960.8887f, 3210.8542f, 3584.5403f, 3914.5796f, 4149.8550f,
-    4505.7705f, 4886.9575f, 5214.5361f, 5597.8389f, 347.0334f,  494.2440f,
-    753.7191f,  1451.0435f, 1700.7461f, 1925.4844f, 2605.7988f, 2870.4744f,
-    3173.7312f, 3758.7219f, 4112.1929f, 4400.3882f, 4866.1016f, 5165.8799f,
-    5433.0371f, 5781.1509f, 318.4942f,  464.3939f,  783.5214f,  1491.0234f,
-    1708.4984f, 2280.2876f, 2533.3354f, 2885.1736f, 3443.7451f, 3669.8506f,
-    4000.6792f, 4269.6626f, 4571.2739f, 4827.2158f, 5277.3813f, 5850.4736f,
-    386.8698f,  519.0056f,  725.0029f,  981.5649f,  1156.1665f, 1500.4691f,
-    2421.7993f, 2962.4722f, 3175.0166f, 3548.4756f, 3860.7961f, 4146.4150f,
-    4658.9897f, 5088.3999f, 5531.8945f, 5951.4624f, 315.9294f,  738.5538f,
-    1171.9581f, 1553.7167f, 1949.9159f, 2319.6641f, 2707.5493f, 3069.2996f,
-    3444.6157f, 3811.2139f, 4177.5469f, 4545.6943f, 4905.0444f, 5271.3926f,
-    5622.6831f, 5974.4141f, 216.5136f,  598.1122f,  1059.3214f, 1466.4785f,
-    1880.1747f, 2263.6533f, 2658.3081f, 3030.4099f, 3413.6802f, 3780.1853f,
-    4157.1455f, 4519.1919f, 4893.5439f, 5244.3530f, 5603.1064f, 5926.8379f,
-    375.4021f,  487.0890f,  844.4013f,  1574.3596f, 1794.5249f, 2106.2878f,
-    2418.5217f, 2657.8938f, 3116.6096f, 3457.8625f, 3691.0596f, 3930.1062f,
-    4259.5928f, 4592.4370f, 5020.5078f, 5840.3989f, 474.3148f,  724.2144f,
-    974.0716f,  1283.4182f, 1521.2632f, 1746.4248f, 2333.0957f, 2874.2966f,
-    3111.9636f, 3440.0410f, 3752.9678f, 3975.7139f, 4294.7056f, 4821.9893f,
-    5201.5562f, 5658.8301f, 400.0291f,  564.9626f,  808.2393f,  1083.2745f,
-    1300.4403f, 2080.7405f, 2588.6882f, 2858.4629f, 3206.4502f, 3429.8623f,
-    3746.9080f, 4341.4868f, 4713.2803f, 4986.4258f, 5336.7339f, 5710.1123f,
-    354.4416f,  480.1495f,  834.1089f,  1037.7775f, 1350.0652f, 1791.1736f,
-    2193.0159f, 2504.6775f, 2776.0623f, 3153.0994f, 4108.1357f, 4597.4082f,
-    4861.9688f, 5092.8613f, 5473.2295f, 5932.0332f, 237.3935f,  346.9133f,
-    675.5335f,  1481.0535f, 1716.8414f, 1884.7153f, 2099.3057f, 2725.5403f,
-    3022.8506f, 3276.2922f, 3639.1001f, 4185.3926f, 4941.6597f, 5292.0093f,
-    5682.0391f, 5981.0215f, 367.4981f,  469.7130f,  820.7811f,  1219.7736f,
-    1368.4479f, 1624.6671f, 1804.2581f, 2607.8589f, 2891.3174f, 3212.2432f,
-    3760.7290f, 4015.6111f, 4618.0068f, 5129.3213f, 5652.1582f, 6042.1113f,
-    312.6796f,  415.8322f,  674.1500f,  853.7709f,  1808.7385f, 2232.5310f,
-    2497.8157f, 2834.2991f, 3039.7012f, 3301.4050f, 3659.2969f, 4455.9453f,
-    4841.4912f, 5111.6167f, 5502.2534f, 5924.6357f, 341.9309f,  471.7513f,
-    758.1926f,  979.7221f,  1287.4463f, 1737.0303f, 2160.7915f, 2664.5562f,
-    2961.8315f, 3461.7439f, 3732.6611f, 4109.0928f, 4568.9111f, 5037.4331f,
-    5511.3169f, 5966.1304f, 351.3721f,  462.1897f,  765.1075f,  946.3102f,
-    1322.8093f, 2292.2400f, 2503.6494f, 2819.7234f, 3079.2803f, 3297.6252f,
-    3571.4668f, 3872.0823f, 4337.6426f, 5079.1504f, 5562.8110f, 5942.7153f,
-    435.4323f,  614.4746f,  892.8980f,  1215.9469f, 1395.9762f, 1814.3936f,
-    2155.9590f, 2465.0427f, 3201.6211f, 3490.9224f, 3853.2620f, 4410.1855f,
-    4786.0625f, 5095.0181f, 5394.4805f, 5715.3364f, 294.6053f,  417.1553f,
-    1046.2922f, 1443.0247f, 1636.7180f, 1956.4248f, 2189.9697f, 2869.8071f,
-    3129.9385f, 3462.5681f, 3895.2805f, 4213.4541f, 4541.8950f, 5009.1958f,
-    5472.7642f, 5983.0063f, 322.1185f,  446.8733f,  689.4188f,  1338.2788f,
-    1643.1023f, 1903.8652f, 2494.2722f, 2804.6968f, 3103.8682f, 3640.1233f,
-    3965.9861f, 4172.5596f, 4404.7388f, 4670.7544f, 5240.3682f, 5893.4600f,
-    209.7024f,  336.5508f,  729.0126f,  1217.3285f, 1699.0111f, 1891.2837f,
-    2146.8486f, 2830.0850f, 3108.6204f, 3446.0396f, 3754.1230f, 3945.1038f,
-    4474.5806f, 5191.6987f, 5613.3076f, 5970.2695f, 346.6580f,  470.5094f,
-    663.3455f,  1266.9061f, 2020.5759f, 2270.5173f, 2527.3550f, 2826.9104f,
-    3078.3403f, 3401.2625f, 3804.3770f, 4100.3091f, 4407.7876f, 4732.2319f,
-    5150.2749f, 5808.2559f, 283.7796f,  391.4603f,  1165.6863f, 1456.1125f,
-    1692.9001f, 2008.4825f, 2322.7837f, 2784.0608f, 2998.5811f, 3268.5164f,
-    3548.9373f, 4167.1289f, 4643.9878f, 5099.2881f, 5473.0781f, 5929.8242f,
-    301.0849f,  383.1578f,  692.0848f,  1648.9374f, 1873.0947f, 2109.6113f,
-    2345.0110f, 2613.1121f, 2922.0193f, 3170.0020f, 3405.0774f, 3881.9875f,
-    4778.3154f, 5092.5205f, 5445.7100f, 5920.7896f, 509.1023f,  750.8580f,
-    963.8820f,  1295.3452f, 1634.8796f, 1818.7975f, 2151.1250f, 2590.3354f,
-    2867.5596f, 3238.7666f, 3747.2834f, 4053.8911f, 4457.8164f, 4928.0151f,
-    5295.3521f, 5789.0571f, 421.8951f,  547.9814f,  967.4185f,  1153.8607f,
-    1461.4230f, 1813.0994f, 2155.2703f, 2570.9712f, 2777.6597f, 3048.9863f,
-    3432.0986f, 3729.3877f, 4395.7461f, 5028.7402f, 5486.4946f, 5951.5024f,
-    340.6758f,  445.7014f,  931.8882f,  1253.4775f, 1521.9260f, 1969.5759f,
-    2267.5332f, 2735.0112f, 2948.7678f, 3236.5166f, 3529.5505f, 3882.3674f,
-    4699.5781f, 5089.6641f, 5377.7842f, 5880.7778f, 284.1882f,  408.6918f,
-    786.3123f,  1670.3220f, 2042.9493f, 2265.2275f, 2691.2012f, 3035.8762f,
-    3334.1719f, 3863.1194f, 4276.8916f, 4571.0420f, 4996.4404f, 5336.5205f,
-    5647.9556f, 5944.5996f, 300.0066f,  616.4817f,  1238.7324f, 1614.8296f,
-    1997.6188f, 2367.4343f, 2784.5605f, 3168.8354f, 3569.8250f, 3965.6011f,
-    4336.3804f, 4689.5874f, 5044.2012f, 5365.7456f, 5697.5654f, 6010.6572f,
-    242.9420f,  476.8371f,  1250.6661f, 1671.6031f, 2159.6443f, 2637.7417f,
-    3049.8589f, 3371.6045f, 3674.8706f, 3951.1006f, 4230.6416f, 4543.2827f,
-    4887.4478f, 5220.5581f, 5595.2686f, 5962.1313f, 242.6795f,  331.1335f,
-    635.2861f,  1801.5236f, 2084.1472f, 2264.4692f, 2506.2891f, 2799.4441f,
-    3236.7134f, 3489.6038f, 3859.3291f, 4424.8008f, 4964.6348f, 5298.6533f,
-    5640.2031f, 5988.0552f, 254.0538f,  336.2447f,  1216.6261f, 1717.7201f,
-    1886.0708f, 2176.6338f, 2405.8547f, 2762.3037f, 2934.8816f, 3167.0657f,
-    3385.5457f, 3804.4346f, 4848.8198f, 5286.0352f, 5630.5391f, 6086.4492f,
-    295.2298f,  426.2079f,  630.7856f,  1155.5609f, 1827.6831f, 2120.5283f,
-    2462.4373f, 2759.6152f, 2990.9526f, 3253.4216f, 3910.9834f, 4204.2754f,
-    4462.7944f, 4909.7529f, 5579.9653f, 5985.8579f, 298.9633f,  410.3875f,
-    810.1115f,  1346.1040f, 1499.2391f, 2210.3948f, 2467.9424f, 2792.7122f,
-    3284.0874f, 3493.0740f, 3784.1899f, 4319.6396f, 4860.6548f, 5213.8540f,
-    5609.8672f, 5949.6890f, 437.9900f,  575.3093f,  866.0077f,  1104.2080f,
-    1307.4966f, 1959.9323f, 2293.9365f, 2604.6704f, 2966.6514f, 3228.0056f,
-    3548.8499f, 4096.4424f, 4769.5420f, 5086.5449f, 5416.5317f, 5853.6909f,
-    412.4955f,  569.1867f,  864.0179f,  1117.6798f, 1348.6332f, 1976.5171f,
-    2334.3960f, 2640.3381f, 3006.5347f, 3327.5784f, 3695.8564f, 4042.1753f,
-    4362.7837f, 4687.4751f, 5389.8662f, 5966.5825f, 406.8686f,  542.0319f,
-    867.3541f,  1436.3810f, 1678.6399f, 2000.1501f, 2358.1204f, 2651.3806f,
-    3042.1216f, 3339.2766f, 3617.9963f, 3933.3860f, 4249.0278f, 4591.8530f,
-    5502.0400f, 6020.7910f, 375.4336f,  519.7731f,  764.5574f,  1215.1381f,
-    1482.9417f, 1696.8020f, 1957.0332f, 2169.1169f, 2973.4634f, 3687.7449f,
-    3966.8525f, 4258.8042f, 4680.6567f, 4947.0225f, 5230.9824f, 5843.2466f,
-    443.2378f,  574.0562f,  813.3345f,  1282.7894f, 1538.0752f, 1727.8997f,
-    2007.8584f, 2194.5601f, 2755.8220f, 3460.9243f, 3654.1399f, 4030.5530f,
-    4572.4727f, 4904.7847f, 5400.6147f, 5934.2656f, 423.6246f,  540.1947f,
-    862.8629f,  1386.7659f, 1577.2052f, 1811.0304f, 2046.7363f, 2309.0366f,
-    3129.1145f, 3533.0020f, 3738.4211f, 4021.1111f, 4357.3677f, 4634.8740f,
-    5307.2920f, 5944.9155f, 287.7661f,  401.5490f,  725.6079f,  950.8911f,
-    1186.5465f, 1490.1750f, 2114.7920f, 2562.4019f, 3028.3977f, 3519.6277f,
-    3940.5737f, 4339.3086f, 4765.8188f, 5172.3428f, 5582.8022f, 5971.0273f,
-    382.6039f,  537.7234f,  836.8093f,  1371.3546f, 1578.9803f, 1869.8213f,
-    2292.5596f, 2540.8601f, 3032.9834f, 3402.5059f, 3737.0569f, 4053.9937f,
-    4446.6240f, 5251.8457f, 5710.7935f, 6022.2925f, 313.2195f,  415.0511f,
-    690.6860f,  1561.4832f, 1815.6521f, 2059.9187f, 2345.5095f, 2614.8701f,
-    3006.9604f, 3291.9744f, 3590.4119f, 3996.1516f, 4365.4995f, 4853.4956f,
-    5465.1572f, 5954.5718f, 361.7959f,  448.4001f,  921.3198f,  1343.1167f,
-    1488.6287f, 1736.7700f, 1950.8906f, 2536.0193f, 2768.7393f, 3062.4473f,
-    3484.6570f, 3888.5618f, 4618.4038f, 5092.6641f, 5523.3657f, 5966.6772f,
-    249.5541f,  366.6601f,  684.6592f,  1203.0931f, 1642.2089f, 1961.8837f,
-    2227.3289f, 2421.1348f, 2660.5676f, 3229.5410f, 3822.5837f, 4232.7266f,
-    4782.5181f, 5127.2612f, 5570.2676f, 5978.9858f, 287.4206f,  421.3210f,
-    704.0352f,  1279.8597f, 1562.7307f, 2115.4241f, 2492.4517f, 2780.9470f,
-    3317.3616f, 3606.1492f, 4026.6375f, 4337.9014f, 4699.6895f, 4997.2573f,
-    5431.1787f, 5903.8628f, 487.9554f,  740.9349f,  1021.9616f, 1327.3262f,
-    1620.8544f, 1890.7717f, 2269.1218f, 2584.4868f, 2911.2896f, 3424.9221f,
-    3855.1670f, 4205.9272f, 4707.2466f, 5147.1846f, 5601.1152f, 5953.4673f,
-    400.8269f,  513.4500f,  786.8242f,  1269.3298f, 1441.4178f, 1696.9789f,
-    1911.0537f, 2223.0684f, 2847.1619f, 3113.3845f, 3670.6318f, 4146.2900f,
-    4555.9204f, 5083.8579f, 5574.8120f, 5987.6030f, 379.0329f,  487.7222f,
-    914.8179f,  1130.9854f, 1430.1394f, 1830.0769f, 2088.8796f, 2613.6855f,
-    2803.1633f, 3457.1777f, 4032.6118f, 4306.7344f, 4662.6899f, 4959.6348f,
-    5245.5234f, 5787.3940f, 340.6941f,  451.0338f,  656.2767f,  911.5805f,
-    1124.9330f, 1733.8730f, 2518.7861f, 2768.6851f, 3211.3733f, 3717.7583f,
-    3929.6772f, 4176.2993f, 4522.4517f, 5011.5547f, 5575.8784f, 6006.7222f,
-    341.5027f,  441.6417f,  807.2695f,  1060.2080f, 1251.2837f, 1478.9895f,
-    1750.0796f, 2594.8977f, 2924.5027f, 3401.4751f, 3852.0557f, 4292.4683f,
-    4718.2930f, 5159.4775f, 5562.4067f, 5972.5571f, 313.8985f,  421.5380f,
-    667.2407f,  873.6023f,  1110.1119f, 2060.7332f, 2381.0916f, 2746.2288f,
-    3080.5649f, 3399.9905f, 3897.5884f, 4434.9990f, 5048.1343f, 5390.8149f,
-    5744.3931f, 6007.9326f, 252.1832f,  354.2392f,  673.5427f,  1339.1161f,
-    1554.8853f, 2014.9351f, 2300.4138f, 2829.6182f, 3213.1714f, 3409.5105f,
-    3604.3242f, 3927.8020f, 4622.3218f, 5103.4565f, 5559.5024f, 5971.5986f,
-    385.2648f,  513.7607f,  760.7678f,  983.5819f,  1175.7727f, 2134.7810f,
-    2592.9614f, 2822.0161f, 3232.2524f, 3445.3516f, 3750.7583f, 4094.6714f,
-    4401.5830f, 4753.4204f, 5549.2319f, 6034.7148f, 220.6833f,  314.5706f,
-    622.2172f,  1350.8225f, 1785.5879f, 2077.5837f, 2504.2158f, 3057.6992f,
-    3436.0974f, 3695.2976f, 3953.4272f, 4267.8701f, 4660.6865f, 5073.6831f,
-    5501.9478f, 5929.9780f, 207.8814f,  310.4071f,  646.2098f,  1270.5835f,
-    1542.7271f, 2079.3804f, 2440.0339f, 2843.4690f, 3272.4854f, 3657.9851f,
-    4061.2014f, 4444.9780f, 4841.6060f, 5224.5947f, 5620.9141f, 5972.7261f,
-    326.1488f,  456.7737f,  740.3350f,  961.4597f,  1262.7579f, 2190.7178f,
-    2483.5300f, 2872.4180f, 3328.4910f, 3811.0334f, 4153.1602f, 4441.8271f,
-    4801.1802f, 5065.2988f, 5381.6309f, 5693.2886f, 206.2046f,  328.0855f,
-    618.9507f,  980.9994f,  1695.9775f, 1982.3051f, 2275.5444f, 2806.0271f,
-    3269.5178f, 3491.2456f, 3722.1775f, 4145.9121f, 4843.1167f, 5266.8677f,
-    5656.8794f, 5992.1201f, 308.1086f,  407.7706f,  806.7985f,  1045.7629f,
-    1401.8912f, 2108.3472f, 2331.7849f, 2952.5391f, 3174.1865f, 3374.0686f,
-    3645.4260f, 4292.7183f, 4939.2969f, 5250.4829f, 5607.2358f, 5932.8657f,
-    267.5990f,  378.7492f,  642.2629f,  871.7917f,  1691.7523f, 2087.5117f,
-    2423.1462f, 2686.1487f, 3021.7893f, 3724.0247f, 4035.5454f, 4369.5903f,
-    4680.1167f, 4991.4175f, 5323.6875f, 5811.7471f, 312.3856f,  437.4281f,
-    714.5340f,  899.5771f,  1632.7545f, 1938.5369f, 2295.5544f, 2625.6189f,
-    2900.5576f, 3295.4934f, 3557.1260f, 3960.1123f, 4731.6079f, 5141.8447f,
-    5502.7793f, 5954.0049f, 332.2842f,  449.0976f,  875.9957f,  1206.1912f,
-    1422.6793f, 2097.5745f, 2354.2483f, 2715.8494f, 3093.4697f, 3344.5132f,
-    3623.4814f, 3889.3655f, 4256.2002f, 4994.5742f, 5593.8428f, 5985.9575f,
-    286.9586f,  434.7701f,  781.3996f,  1248.3495f, 1835.5530f, 2137.1155f,
-    2573.7449f, 2869.9299f, 3126.0564f, 3459.1448f, 3769.4475f, 4138.3076f,
-    4688.0298f, 5084.9028f, 5436.8086f, 5894.2520f, 327.0000f,  429.0804f,
-    663.7327f,  849.7463f,  1174.9340f, 2383.3875f, 2695.9597f, 2941.2026f,
-    3214.4724f, 3433.6287f, 3778.9312f, 4134.8096f, 4504.8022f, 5066.7559f,
-    5599.2290f, 5985.7334f, 244.4052f,  499.2254f,  1294.8232f, 1689.3677f,
-    2123.5024f, 2572.4958f, 3042.9067f, 3446.8752f, 3836.3740f, 4175.6729f,
-    4485.3213f, 4792.3755f, 5094.9077f, 5386.1816f, 5699.6411f, 6008.2114f,
-    561.9757f,  1020.3204f, 1494.1995f, 1841.8171f, 2297.0906f, 2772.6184f,
-    3204.8804f, 3565.8628f, 3935.4106f, 4253.4141f, 4559.7021f, 4849.9653f,
-    5140.2852f, 5428.6934f, 5731.2251f, 6023.5078f, 581.6182f,  1053.5670f,
-    1478.5878f, 1784.4789f, 2125.1157f, 2454.5889f, 2809.0256f, 3141.7256f,
-    3490.7529f, 3848.5923f, 4201.7271f, 4568.7720f, 4945.9619f, 5288.6289f,
-    5647.7642f, 5981.9341f, 258.9683f,  364.0963f,  722.5463f,  1763.2114f,
-    1969.3870f, 2265.5239f, 2532.1821f, 2883.3557f, 3388.1838f, 3725.3120f,
-    4080.9338f, 4390.3818f, 4716.3599f, 5068.4941f, 5452.2778f, 5847.1401f,
-    271.5428f,  401.4228f,  695.5894f,  857.3072f,  1776.5358f, 2008.5603f,
-    2554.4143f, 2844.4021f, 3018.6877f, 3226.1279f, 3482.3398f, 3810.6858f,
-    4549.3071f, 5266.2764f, 5614.6157f, 5945.6904f, 330.3132f,  444.6271f,
-    669.0279f,  874.5479f,  1102.9247f, 2052.1780f, 2436.2378f, 2711.1165f,
-    3037.7537f, 3298.2036f, 3898.6858f, 4241.5415f, 4606.7637f, 5086.6919f,
-    5569.7397f, 5988.6797f, 232.3014f,  344.5512f,  578.5155f,  1213.9569f,
-    1880.9729f, 2105.6685f, 2335.4148f, 2550.3965f, 3147.6501f, 3491.9253f,
-    3791.5613f, 4159.6694f, 4642.2441f, 5103.3340f, 5605.4106f, 5989.7969f,
-    346.3687f,  444.8047f,  714.3775f,  889.1195f,  1211.8463f, 2168.7598f,
-    2430.2490f, 2760.6326f, 3012.4961f, 3268.8750f, 3565.1558f, 4172.5791f,
-    4781.5391f, 5127.6704f, 5512.6323f, 5911.3779f, 398.0477f,  553.8537f,
-    845.8521f,  1119.3066f, 1309.7244f, 1928.3351f, 2351.2095f, 2649.8230f,
-    3050.6750f, 3297.0566f, 3592.7275f, 3916.1785f, 4723.3325f, 5318.1221f,
-    5703.9697f, 5996.7651f, 371.4409f,  471.0789f,  896.4924f,  1197.7544f,
-    1400.8007f, 1611.1555f, 1867.3550f, 2818.4475f, 3002.5906f, 3250.1440f,
-    3546.5891f, 4265.0371f, 4890.3369f, 5274.4722f, 5659.3560f, 5946.9644f,
-    330.9331f,  448.7211f,  808.3973f,  978.2021f,  1652.6361f, 1969.0725f,
-    2357.0146f, 2680.4792f, 2859.9165f, 3078.9578f, 3423.6895f, 4233.3169f,
-    4856.7813f, 5086.5723f, 5393.9961f, 5938.6035f, 323.9659f,  433.8731f,
-    1045.5168f, 1369.1907f, 1561.9178f, 1984.2457f, 2224.0959f, 2747.3657f,
-    2995.0359f, 3242.9248f, 3501.0344f, 4022.2388f, 4847.4985f, 5210.9922f,
-    5658.1357f, 6005.0718f, 354.6574f,  501.6520f,  852.5305f,  1020.8707f,
-    1540.5925f, 1998.5675f, 2253.1487f, 2845.3960f, 3056.5273f, 3305.0466f,
-    3954.2900f, 4591.7471f, 4915.2856f, 5221.9082f, 5544.7285f, 5879.9150f,
-    363.1311f,  474.7310f,  907.5490f,  1106.8586f, 1367.2662f, 1646.6934f,
-    2031.3650f, 2326.4382f, 2568.6519f, 3030.1091f, 3905.6482f, 4265.9111f,
-    4716.1831f, 5017.0454f, 5469.8149f, 5958.6182f, 379.9262f,  524.4459f,
-    845.4813f,  1275.4414f, 1458.2488f, 1772.5863f, 2067.7981f, 2526.8850f,
-    3066.4063f, 3307.8713f, 3807.2900f, 4199.1509f, 4452.4653f, 4854.7471f,
-    5464.8833f, 5947.7842f, 371.8218f,  483.9148f,  778.2747f,  1208.0812f,
-    1366.3983f, 1623.4895f, 1798.8777f, 2224.6445f, 3103.7175f, 3386.0408f,
-    3782.8284f, 4307.4727f, 4698.8994f, 5118.1255f, 5505.1919f, 5921.1724f,
-    217.9059f,  323.3224f,  639.7305f,  1026.5331f, 1312.9242f, 1885.6948f,
-    2361.8403f, 2805.5396f, 3213.2600f, 3631.5017f, 4033.4087f, 4426.3423f,
-    4821.3203f, 5208.3833f, 5590.5205f, 5956.1538f, 211.9971f,  311.2018f,
-    504.6345f,  858.3289f,  1574.7019f, 1934.9866f, 2381.4163f, 2786.2043f,
-    3238.9326f, 3611.0518f, 4005.2578f, 4401.0615f, 4802.1479f, 5192.5493f,
-    5587.1479f, 5965.5977f, 219.3884f,  319.3835f,  604.0102f,  1114.8630f,
-    1481.3870f, 2036.0469f, 2303.4883f, 2616.1384f, 3253.6335f, 3556.5107f,
-    3946.6567f, 4520.3555f, 5091.0479f, 5416.3037f, 5748.5737f, 5946.5757f,
-    350.3716f,  515.4462f,  756.5206f,  1061.4270f, 1251.9570f, 1723.2751f,
-    2687.6689f, 3036.2019f, 3273.9678f, 3744.2939f, 4098.6284f, 4391.4160f,
-    4917.6777f, 5244.2852f, 5551.4976f, 5880.1572f, 311.6069f,  458.7317f,
-    795.9418f,  969.5021f,  1511.2507f, 1952.5673f, 2273.6116f, 2795.8657f,
-    3049.7053f, 3578.0598f, 3911.1873f, 4327.2598f, 4735.3105f, 5122.3423f,
-    5479.7817f, 5858.1504f, 267.8399f,  390.6757f,  886.2357f,  1179.5110f,
-    1466.6409f, 2088.7725f, 2328.1262f, 2993.5786f, 3283.5256f, 3593.2822f,
-    4095.7588f, 4500.4009f, 4887.5132f, 5219.0859f, 5553.4224f, 5915.6831f,
-    279.2209f,  413.3200f,  648.4438f,  1282.1798f, 1793.2556f, 1952.1060f,
-    2484.9436f, 2857.3630f, 3077.2114f, 3548.2585f, 4045.4526f, 4309.5947f,
-    4760.2900f, 5208.1948f, 5620.9717f, 5968.3237f, 306.2321f,  424.7843f,
-    618.7867f,  1288.7572f, 2110.7849f, 2346.5396f, 2582.5366f, 2833.5730f,
-    3074.3774f, 3464.7886f, 3984.6379f, 4262.0337f, 4601.5132f, 4999.6992f,
-    5498.8926f, 5920.4814f, 259.2613f,  353.6931f,  762.5328f,  1906.2162f,
-    2088.1213f, 2317.9741f, 2546.5935f, 2880.3687f, 3332.0002f, 3636.9216f,
-    3946.4287f, 4226.0356f, 4502.1084f, 5007.0601f, 5496.4824f, 5924.8877f,
-    244.3871f,  357.0287f,  1114.7865f, 1651.1329f, 1850.2976f, 2200.5942f,
-    2484.7026f, 2872.6968f, 3092.8455f, 3373.5869f, 3707.5891f, 4180.1289f,
-    4603.5298f, 5132.2671f, 5554.7617f, 5973.5220f, 700.5439f,  1363.5277f,
-    1745.2494f, 2081.9539f, 2379.8628f, 2623.6003f, 2883.6484f, 3133.9824f,
-    3457.7092f, 3819.0100f, 4191.0537f, 4547.0400f, 4912.5127f, 5241.3423f,
-    5594.9395f, 5930.6099f, 268.7704f,  370.8200f,  609.4679f,  1558.5339f,
-    1961.6279f, 2155.8916f, 2419.4485f, 2655.5103f, 3152.6685f, 3426.9221f,
-    3716.8181f, 4107.1616f, 4965.5698f, 5384.2026f, 5706.7183f, 6015.6196f,
-    305.7638f,  395.9599f,  1103.0944f, 1383.6494f, 1612.9742f, 1915.2496f,
-    2189.8008f, 2555.3608f, 2720.8220f, 3038.2434f, 3927.1301f, 4263.0518f,
-    4685.7217f, 4984.1377f, 5272.6162f, 5984.5376f, 294.0385f,  426.7762f,
-    814.5162f,  1056.9037f, 1715.3539f, 2005.3177f, 2316.4392f, 2647.4297f,
-    2893.8242f, 3196.7476f, 3720.0044f, 4186.9790f, 4840.4512f, 5290.1250f,
-    5684.2139f, 5967.5859f, 359.5141f,  517.6051f,  807.4898f,  1143.5930f,
-    1328.1393f, 1814.7098f, 2309.8894f, 2618.8655f, 3160.5962f, 3445.0479f,
-    3883.2664f, 4235.5200f, 4718.7324f, 5367.3608f, 5765.9331f, 6034.9233f,
-    241.5752f,  375.5109f,  818.8776f,  1298.7773f, 1656.9050f, 2169.8962f,
-    2565.1440f, 3015.9919f, 3437.9463f, 3863.8203f, 4254.4023f, 4637.0952f,
-    5027.8252f, 5358.3784f, 5685.5000f, 5980.4063f, 322.5406f,  454.9644f,
-    963.3659f,  1513.8885f, 1704.5070f, 2235.6599f, 2523.6467f, 2995.0757f,
-    3287.8682f, 3552.8811f, 3872.4360f, 4201.2227f, 4571.9087f, 5066.6792f,
-    5562.1206f, 5935.7900f, 412.5748f,  615.8419f,  1126.9519f, 1455.5172f,
-    1653.3076f, 1965.2689f, 2240.6904f, 2672.5129f, 3127.3301f, 3477.8540f,
-    3983.6145f, 4458.6558f, 4896.7998f, 5237.9814f, 5609.1597f, 5939.6416f,
-    342.1361f,  470.6100f,  958.3576f,  1195.0166f, 1426.4667f, 1684.2009f,
-    2194.0950f, 2545.9453f, 2946.1851f, 3415.2820f, 3657.4158f, 4408.6763f,
-    5097.2251f, 5404.2202f, 5719.9829f, 5977.7959f, 297.8767f,  386.6347f,
-    1095.8346f, 1454.3085f, 1651.6417f, 1927.9633f, 2198.4927f, 2583.1694f,
-    2757.0144f, 3009.6497f, 3310.9514f, 3956.9753f, 4677.3208f, 5122.2222f,
-    5539.0688f, 5993.0542f, 334.7170f,  450.1582f,  747.3162f,  1560.2024f,
-    1808.2147f, 2006.5011f, 2415.2419f, 2680.1956f, 3016.5549f, 3651.1340f,
-    3975.3625f, 4209.6563f, 4531.0396f, 5121.7212f, 5585.2202f, 5962.3667f,
-    256.4101f,  495.5723f,  1341.4860f, 1805.1255f, 2201.8318f, 2514.7769f,
-    2820.4092f, 3102.3867f, 3414.3872f, 3754.7742f, 4108.2378f, 4465.9258f,
-    4857.4355f, 5216.2144f, 5592.3076f, 5951.9995f, 530.7974f,  1017.4255f,
-    1463.9575f, 1858.6631f, 2360.1265f, 2770.3811f, 3106.0894f, 3379.1919f,
-    3647.7175f, 3895.9026f, 4188.8652f, 4522.8984f, 4893.7954f, 5241.4312f,
-    5623.8994f, 5975.3608f, 597.1553f,  1198.0758f, 1722.7361f, 2128.6658f,
-    2519.1504f, 2825.5122f, 3086.1943f, 3330.0283f, 3608.2961f, 3906.9929f,
-    4241.8105f, 4603.1694f, 4972.8159f, 5308.1670f, 5651.1968f, 5976.6704f,
-    699.1581f,  1293.3193f, 1637.3395f, 1912.7987f, 2163.3445f, 2425.7944f,
-    2704.0396f, 3006.5984f, 3358.2126f, 3746.1548f, 4125.0762f, 4489.7485f,
-    4854.0088f, 5188.5146f, 5558.2056f, 5913.3164f, 489.0107f,  921.4806f,
-    1329.8511f, 1644.8383f, 2013.6794f, 2365.2683f, 2746.1553f, 3085.6912f,
-    3457.0234f, 3825.2183f, 4203.4224f, 4575.9331f, 4950.6606f, 5298.7559f,
-    5659.8618f, 5997.0015f, 230.3653f,  389.8415f,  938.1970f,  1294.3594f,
-    1768.8275f, 2189.1001f, 2597.3755f, 2985.8518f, 3323.6023f, 3705.8533f,
-    4065.5361f, 4446.4224f, 4818.4502f, 5185.9634f, 5583.2168f, 5954.2573f,
-    283.9404f,  400.2146f,  630.6198f,  1491.5646f, 2295.1375f, 2496.3457f,
-    2726.5803f, 2971.1951f, 3207.2317f, 3634.5439f, 4178.0376f, 4423.5537f,
-    4836.2109f, 5172.1821f, 5464.0454f, 5777.5801f, 242.6232f,  351.1541f,
-    807.9852f,  1621.9950f, 2043.8676f, 2532.5122f, 2860.5505f, 3200.3403f,
-    3499.8274f, 3760.3772f, 4068.9617f, 4410.7339f, 4778.8413f, 5153.0142f,
-    5553.1997f, 5932.5996f, 227.3320f,  323.2667f,  752.3189f,  1572.3750f,
-    1930.6083f, 2355.0117f, 2717.6223f, 2968.3215f, 3233.4026f, 3551.9622f,
-    3918.5608f, 4346.0190f, 4778.6880f, 5159.6172f, 5568.5566f, 5980.8086f,
-    307.9120f,  439.7297f,  660.0276f,  1243.3854f, 1532.3577f, 1796.3936f,
-    2437.3232f, 2691.4072f, 3030.3025f, 3524.1379f, 3771.7576f, 4083.2375f,
-    4601.1567f, 4963.4697f, 5434.8530f, 5942.8315f};
+  377.3749f,  688.0079f,  1147.3799f, 1461.0438f, 1786.7794f, 2143.6711f,
+  2522.1946f, 2889.7402f, 3263.6023f, 3628.4624f, 4005.4351f, 4379.4170f,
+  4783.9556f, 5157.1753f, 5555.1797f, 5926.6816f, 601.5123f,  1066.8242f,
+  1384.3585f, 1652.9448f, 1978.3910f, 2311.2676f, 2674.0537f, 3010.3896f,
+  3360.0623f, 3725.9336f, 4093.3335f, 4470.6431f, 4859.1006f, 5210.4717f,
+  5598.3716f, 5954.4204f, 552.5036f,  859.7047f,  1355.2023f, 1624.9041f,
+  1887.5609f, 2173.1638f, 2540.7429f, 2926.8169f, 3323.2173f, 3680.7197f,
+  4008.3447f, 4330.8442f, 4692.8228f, 5033.9697f, 5443.3467f, 5875.4497f,
+  459.4534f,  793.3189f,  1293.7278f, 1617.3970f, 1920.0642f, 2192.2153f,
+  2487.5627f, 2772.1514f, 3111.3823f, 3461.2671f, 3867.0176f, 4279.8550f,
+  4741.0664f, 5141.0181f, 5552.8237f, 5933.6934f, 327.9834f,  430.4954f,
+  723.9031f,  1528.6172f, 1763.1125f, 2013.7936f, 2334.2153f, 2569.0334f,
+  3017.9436f, 3308.0610f, 3591.7820f, 3865.5430f, 4693.5786f, 5286.7646f,
+  5647.7036f, 5987.2305f, 455.0753f,  606.0817f,  963.7564f,  1374.9937f,
+  1536.4897f, 1914.7618f, 2376.9631f, 2580.8184f, 2989.1501f, 3258.8386f,
+  3485.1460f, 3741.1270f, 4297.4912f, 5207.3779f, 5672.3818f, 5980.5322f,
+  434.9507f,  558.8508f,  890.7061f,  1355.7625f, 1552.6155f, 1895.7960f,
+  2222.5579f, 2502.6079f, 2841.8738f, 3137.5264f, 3367.7336f, 3860.7769f,
+  4795.2554f, 5090.9370f, 5421.8218f, 5874.4287f, 281.0164f,  404.5417f,
+  729.2898f,  997.1851f,  1699.8862f, 1961.3673f, 2255.7202f, 2540.9187f,
+  2804.4553f, 3057.1843f, 3750.2288f, 4340.9893f, 4716.8647f, 5002.7471f,
+  5477.2998f, 5965.7402f, 372.2410f,  505.3570f,  762.3755f,  997.3586f,
+  1174.4255f, 1986.1741f, 2368.1367f, 2624.1733f, 3194.6084f, 3403.2793f,
+  3877.7622f, 4425.7676f, 4824.7837f, 5158.1606f, 5532.7466f, 5893.5483f,
+  367.3766f,  501.1806f,  824.5358f,  1090.6857f, 1271.9792f, 1527.7137f,
+  2381.4382f, 2694.4634f, 2964.5359f, 3639.4832f, 3946.4038f, 4254.3916f,
+  4645.8076f, 5033.5396f, 5373.8735f, 5878.4385f, 229.4505f,  352.5671f,
+  701.0831f,  1226.4518f, 1678.3601f, 1895.7949f, 2140.0664f, 2526.5515f,
+  3080.3391f, 3297.8284f, 3845.3987f, 4427.9785f, 4704.4551f, 4997.4155f,
+  5434.0698f, 5918.4785f, 336.3082f,  516.7915f,  881.9847f,  1272.5824f,
+  1505.1870f, 1880.7520f, 2274.9458f, 2611.0083f, 3126.5256f, 3655.5332f,
+  4183.3877f, 4668.2993f, 5004.0029f, 5305.3491f, 5650.4985f, 5943.7383f,
+  296.0867f,  469.6519f,  956.5997f,  1224.1262f, 1443.0049f, 1727.6880f,
+  2216.1677f, 2689.3677f, 3060.4456f, 3520.9438f, 3916.6050f, 4343.7954f,
+  4763.8906f, 5156.0132f, 5553.8115f, 5936.9634f, 407.1503f,  577.5120f,
+  839.7361f,  1455.3907f, 1665.2137f, 1935.0054f, 2398.0537f, 2652.2605f,
+  3111.1831f, 3505.5962f, 3766.7554f, 4204.8730f, 4699.1631f, 4970.8652f,
+  5295.5962f, 5695.6919f, 281.0083f,  361.8386f,  950.9102f,  1464.1158f,
+  1634.7019f, 1965.4950f, 2211.1406f, 2662.1055f, 2846.0122f, 3585.8884f,
+  4048.7148f, 4358.9150f, 4683.8755f, 5046.0908f, 5400.0859f, 5956.1040f,
+  279.1811f,  393.9142f,  876.8306f,  1502.2417f, 1673.0590f, 2288.7161f,
+  2545.3674f, 3028.9507f, 3517.5840f, 3824.4246f, 4144.8486f, 4481.8140f,
+  4821.2769f, 5162.3975f, 5542.8560f, 5928.5854f, 379.7892f,  500.9199f,
+  725.0223f,  998.7143f,  1179.6127f, 1771.9886f, 2775.4812f, 3136.8457f,
+  3378.6143f, 3674.0188f, 3946.3604f, 4184.4824f, 4521.5454f, 4934.8940f,
+  5315.5029f, 5759.7544f, 317.4339f,  442.2628f,  778.7388f,  1167.8633f,
+  1356.1576f, 1578.5603f, 1840.1584f, 2870.7527f, 3236.1504f, 3502.7249f,
+  3876.3696f, 4100.5244f, 4650.2632f, 5235.1890f, 5665.2285f, 5999.0649f,
+  350.2696f,  492.2163f,  763.0640f,  1264.7550f, 1515.0244f, 1755.7783f,
+  2489.3274f, 2898.6252f, 3143.1018f, 3643.0640f, 4035.0657f, 4255.0889f,
+  4641.7231f, 5138.5107f, 5557.1318f, 5920.2402f, 301.3833f,  464.9852f,
+  762.3419f,  1012.2126f, 1803.5172f, 2192.4214f, 2651.6287f, 3013.6697f,
+  3251.3591f, 3539.4675f, 3946.3433f, 4469.3560f, 4890.7446f, 5200.4878f,
+  5509.6753f, 5910.2397f, 253.1752f,  356.8990f,  630.3325f,  1163.1683f,
+  1528.6230f, 2023.4438f, 2488.6001f, 2745.5627f, 2933.7024f, 3237.4414f,
+  3976.9258f, 4415.2534f, 4789.9131f, 5194.3423f, 5714.6445f, 6032.4160f,
+  265.1815f,  364.7549f,  590.0148f,  805.2595f,  1564.7582f, 2150.6536f,
+  2365.6501f, 2598.7876f, 2861.5334f, 3514.1265f, 4005.6328f, 4609.3091f,
+  4955.4478f, 5238.4116f, 5519.5884f, 5890.7925f, 209.3544f,  313.1497f,
+  503.2642f,  949.4504f,  1729.7280f, 1912.6814f, 2117.5051f, 2498.6272f,
+  3284.6587f, 3810.8555f, 4105.0195f, 4349.5151f, 4770.3682f, 5210.2910f,
+  5585.1533f, 5970.3638f, 302.3150f,  415.6502f,  684.1018f,  922.3598f,
+  1489.4418f, 2235.6252f, 2449.9773f, 2800.6938f, 3061.3721f, 3526.1001f,
+  3905.8174f, 4170.7891f, 4446.4209f, 4907.9937f, 5470.7158f, 5914.7261f,
+  264.9068f,  366.4342f,  582.8182f,  790.8568f,  1619.4548f, 2034.0782f,
+  2337.6724f, 2632.1714f, 2933.2356f, 3430.1858f, 3815.0198f, 4276.3931f,
+  4748.3149f, 5164.0098f, 5553.3320f, 5974.9092f, 249.6359f,  361.9234f,
+  581.9844f,  841.1097f,  1657.5543f, 2184.4114f, 2525.9739f, 2820.0503f,
+  3120.7190f, 3623.7678f, 4050.5435f, 4434.5742f, 4802.6782f, 5171.8438f,
+  5575.0068f, 5963.7402f, 290.1085f,  404.2538f,  664.1223f,  878.2748f,
+  1237.1085f, 2237.4707f, 2497.5647f, 2957.7786f, 3289.3928f, 3626.5276f,
+  4190.9243f, 4594.6450f, 4981.7456f, 5283.5513f, 5617.1538f, 5938.3760f,
+  182.7846f,  270.3831f,  490.2131f,  1070.2524f, 1674.5724f, 2092.4905f,
+  2524.1472f, 2929.3523f, 3334.8005f, 3712.0061f, 4101.2896f, 4475.7324f,
+  4866.1919f, 5231.7559f, 5606.4077f, 5960.9644f, 286.7701f,  386.1487f,
+  577.4210f,  764.3087f,  1151.2404f, 2014.4502f, 2399.8547f, 2879.0371f,
+  3160.2502f, 3450.6274f, 3869.8240f, 4368.3618f, 4816.7861f, 5187.6450f,
+  5564.7231f, 5962.0386f, 179.9538f,  266.0682f,  647.9122f,  1380.2810f,
+  1776.1240f, 2208.4592f, 2590.6843f, 2993.6758f, 3368.2034f, 3753.2156f,
+  4125.2124f, 4508.6050f, 4878.9932f, 5249.3291f, 5612.5049f, 5965.2134f,
+  309.2416f,  434.7111f,  724.6614f,  936.5360f,  1264.9886f, 2272.1338f,
+  2548.4519f, 2904.0798f, 3313.4990f, 3579.7854f, 3914.5811f, 4297.5938f,
+  4756.9072f, 5163.2017f, 5592.2822f, 5943.7222f, 256.9009f,  393.7155f,
+  769.3966f,  1200.9640f, 1774.4797f, 2307.9629f, 2794.6799f, 3165.9431f,
+  3507.7952f, 3840.5791f, 4142.8877f, 4453.5078f, 4790.6973f, 5142.6123f,
+  5530.5977f, 5923.2188f, 394.1425f,  602.0079f,  934.5173f,  1352.9718f,
+  1813.9639f, 2172.5435f, 2603.7295f, 2963.9590f, 3335.2344f, 3732.0515f,
+  4120.0151f, 4487.9668f, 4877.6294f, 5238.9336f, 5596.1479f, 5939.6489f,
+  373.0307f,  665.4328f,  1227.4684f, 1524.6017f, 1947.3784f, 2361.6384f,
+  2778.1921f, 3134.5396f, 3462.3992f, 3752.4592f, 4069.0352f, 4404.2720f,
+  4782.2241f, 5145.0581f, 5541.9980f, 5932.9136f, 449.9942f,  814.1862f,
+  1344.2784f, 1682.7061f, 2086.3599f, 2486.9709f, 2916.1177f, 3265.9099f,
+  3616.3977f, 3919.6345f, 4218.5342f, 4519.2207f, 4857.5220f, 5193.5269f,
+  5573.7339f, 5934.5400f, 531.4455f,  965.7403f,  1458.5353f, 1773.3784f,
+  2236.0146f, 2650.9109f, 3099.2871f, 3467.1567f, 3809.7056f, 4094.6472f,
+  4378.5811f, 4660.2471f, 4962.5078f, 5270.9863f, 5629.4160f, 5973.6450f,
+  565.5986f,  1091.1300f, 1561.4944f, 1983.5482f, 2492.8821f, 2897.5085f,
+  3233.5361f, 3539.8831f, 3838.6494f, 4093.4460f, 4372.1924f, 4678.2251f,
+  4999.2646f, 5325.0371f, 5672.8887f, 5998.9990f, 581.0623f,  976.0275f,
+  1447.0302f, 1779.9243f, 2148.2158f, 2543.8347f, 2979.5061f, 3373.6099f,
+  3796.8259f, 4164.8242f, 4510.5493f, 4853.5527f, 5175.6318f, 5465.3647f,
+  5763.2334f, 6050.6582f, 429.4613f,  802.5781f,  1229.0529f, 1512.6678f,
+  1835.8625f, 2216.9915f, 2625.3999f, 2995.9927f, 3379.5146f, 3764.7837f,
+  4156.1382f, 4532.4570f, 4906.4678f, 5262.8960f, 5626.6519f, 5970.6504f,
+  224.5468f,  328.6938f,  615.8844f,  1207.4470f, 1520.9565f, 1865.9806f,
+  2182.4731f, 2431.4897f, 3239.3486f, 3490.9065f, 3775.7139f, 4291.4312f,
+  4740.0815f, 5192.0786f, 5532.9302f, 5928.7236f, 312.1133f,  424.3103f,
+  716.4448f,  921.9969f,  1244.5491f, 2017.9143f, 2248.4170f, 2840.0688f,
+  3138.9390f, 3399.7288f, 3723.3479f, 3999.6824f, 4582.2339f, 5148.5166f,
+  5631.8989f, 6000.7192f, 373.5378f,  506.7356f,  789.6149f,  942.6201f,
+  1695.8035f, 2021.6426f, 2323.3867f, 2649.5979f, 2853.1729f, 3169.5815f,
+  3524.9375f, 3848.6399f, 4261.7319f, 4978.9668f, 5505.4004f, 5924.7939f,
+  503.2296f,  724.8124f,  940.3833f,  1220.5646f, 1439.8641f, 1726.9827f,
+  2215.5464f, 2476.0925f, 2846.8127f, 3232.0950f, 3638.5989f, 3986.3333f,
+  4371.3052f, 5022.0664f, 5657.4897f, 6040.3452f, 398.3355f,  530.8898f,
+  835.5377f,  1058.3699f, 1327.2036f, 1814.9178f, 2114.2439f, 2515.8892f,
+  2754.9077f, 3094.8794f, 3598.7061f, 3981.2385f, 4605.9160f, 5110.8364f,
+  5550.1899f, 5953.9600f, 327.7583f,  454.8903f,  825.9029f,  1025.4349f,
+  1321.1567f, 1551.4836f, 1978.2037f, 2838.9021f, 3111.9041f, 3417.3940f,
+  3841.0564f, 4696.0547f, 5126.1641f, 5409.5347f, 5711.7163f, 5968.3394f,
+  327.1260f,  431.3983f,  721.9533f,  871.1266f,  1507.7616f, 1847.8716f,
+  2144.9641f, 2491.1108f, 2702.0847f, 3483.1516f, 3917.5173f, 4254.1260f,
+  4704.4863f, 4981.6284f, 5450.1035f, 5937.7861f, 443.5867f,  610.7686f,
+  818.9614f,  999.3525f,  1181.9182f, 1884.4948f, 2243.3950f, 2522.8867f,
+  2993.8594f, 3196.6631f, 3835.5020f, 4233.2568f, 4506.8604f, 4985.0249f,
+  5544.1382f, 5980.0083f, 395.7788f,  582.9504f,  822.1151f,  1013.0453f,
+  1224.6812f, 1988.4263f, 2452.4744f, 2686.4263f, 2952.8831f, 3135.0867f,
+  3562.5471f, 4006.6929f, 4401.7471f, 5038.5654f, 5567.4189f, 5986.0850f,
+  264.3071f,  372.0398f,  616.4940f,  842.1705f,  1350.0250f, 1822.1957f,
+  2165.8896f, 2662.2937f, 3055.4390f, 3502.6787f, 3923.4236f, 4352.6587f,
+  4772.5068f, 5158.1309f, 5573.9385f, 5972.6895f, 218.7390f,  325.2024f,
+  635.0441f,  1103.4701f, 1636.4287f, 2070.2615f, 2274.2910f, 2453.2002f,
+  3069.4382f, 3615.7065f, 3980.0811f, 4484.8662f, 4848.6416f, 5093.7163f,
+  5522.6973f, 5907.4048f, 260.0797f,  461.2137f,  1049.2261f, 1334.1865f,
+  1628.6233f, 2014.9823f, 2413.4802f, 2844.4973f, 3232.3040f, 3661.0122f,
+  4069.8274f, 4466.5210f, 4857.6553f, 5234.4463f, 5608.4517f, 5954.7920f,
+  301.7969f,  406.3861f,  706.7324f,  1387.1207f, 1581.4719f, 2004.7585f,
+  2291.9421f, 2548.9978f, 3076.8755f, 3343.1306f, 3623.1770f, 4279.7432f,
+  4777.6563f, 5084.3960f, 5473.4536f, 5872.0615f, 344.0269f,  472.3550f,
+  776.6819f,  1455.1270f, 1611.6870f, 2012.4386f, 2417.4033f, 2621.8564f,
+  3318.9663f, 3709.0132f, 3944.1958f, 4299.0293f, 4776.4038f, 5184.1089f,
+  5545.5454f, 5913.9531f, 332.1463f,  433.0623f,  992.1605f,  1254.8217f,
+  1498.4819f, 1824.6357f, 2118.3374f, 2444.6484f, 2684.8369f, 2930.4683f,
+  3557.4851f, 4292.9014f, 4786.7251f, 5138.2168f, 5616.2739f, 5996.8369f,
+  281.7202f,  372.7708f,  1074.7051f, 1443.0428f, 1687.6460f, 1980.7075f,
+  2275.4241f, 2632.2017f, 2848.1765f, 3118.7881f, 3628.5857f, 4522.9585f,
+  4876.2163f, 5177.2739f, 5600.6675f, 5960.9634f, 412.0151f,  535.6881f,
+  768.8618f,  1462.2601f, 1789.1055f, 1947.8196f, 2224.6890f, 2447.9089f,
+  2834.6140f, 3472.6721f, 3729.8525f, 4008.2893f, 4525.7271f, 4822.9194f,
+  5204.6611f, 5895.0942f, 263.8760f,  379.7789f,  825.0498f,  1113.1218f,
+  1465.8749f, 1846.7463f, 2146.0496f, 2487.2766f, 2845.8447f, 3388.4800f,
+  3883.8447f, 4440.7603f, 4867.0815f, 5214.7280f, 5535.8149f, 5906.9932f,
+  409.8116f,  583.7237f,  859.1983f,  1172.0491f, 1377.6473f, 1984.8322f,
+  2361.7292f, 2688.9368f, 3238.6563f, 3542.6716f, 3944.3005f, 4441.0840f,
+  4881.1211f, 5224.6045f, 5604.3711f, 5909.3657f, 318.0743f,  438.8244f,
+  852.9153f,  1061.4503f, 1290.7609f, 1552.5408f, 2053.1118f, 2373.2883f,
+  2926.1560f, 3452.9551f, 4098.6626f, 4585.2773f, 4967.0898f, 5271.2720f,
+  5644.6709f, 5961.9585f, 370.3631f,  496.5860f,  932.6390f,  1213.4189f,
+  1452.6641f, 1803.1532f, 2092.2354f, 2607.5247f, 2883.8086f, 3112.1086f,
+  3687.5657f, 4525.1274f, 4846.9404f, 5130.0537f, 5416.4141f, 5804.5122f,
+  247.8941f,  343.9862f,  751.6780f,  1526.2566f, 1712.5012f, 2038.0667f,
+  2324.0371f, 2727.9749f, 3005.8975f, 3378.9817f, 3858.2002f, 4339.2017f,
+  4716.4580f, 5125.0918f, 5564.3589f, 5969.7163f, 297.6552f,  401.7544f,
+  891.9346f,  1380.2275f, 1540.3125f, 1782.6058f, 2009.2045f, 2614.2092f,
+  2899.5396f, 3379.9722f, 3804.1169f, 4284.8540f, 4696.3335f, 5118.4551f,
+  5525.9839f, 5934.2686f, 226.1444f,  333.4511f,  682.9995f,  1307.4166f,
+  1554.1943f, 1849.3679f, 2116.3438f, 2756.3567f, 3204.3018f, 3540.4106f,
+  4002.1895f, 4402.7734f, 4796.4395f, 5192.6812f, 5600.6841f, 5960.1855f,
+  196.3791f,  299.9716f,  572.3173f,  1201.8826f, 1804.7235f, 2012.0171f,
+  2264.7415f, 2790.3406f, 3272.6926f, 3668.4863f, 4063.0435f, 4442.4419f,
+  4810.5957f, 5156.0923f, 5512.8501f, 5900.7441f, 280.1911f,  391.5190f,
+  705.9903f,  1435.5063f, 1588.2345f, 2116.5032f, 2357.1875f, 2670.7461f,
+  3299.0071f, 3507.9336f, 4044.3057f, 4591.9023f, 4981.4575f, 5281.1270f,
+  5654.7158f, 5949.9263f, 262.5740f,  370.5089f,  654.7243f,  1278.9299f,
+  1847.3096f, 2087.3394f, 2553.8892f, 2887.8269f, 3254.0747f, 3810.6626f,
+  4258.4390f, 4528.8022f, 4872.9741f, 5206.0483f, 5565.2876f, 5918.5596f,
+  193.6133f,  356.3127f,  1076.8109f, 1485.8608f, 1887.7994f, 2273.1333f,
+  2676.7832f, 3052.3513f, 3419.1294f, 3792.5024f, 4161.7036f, 4532.6431f,
+  4898.5176f, 5262.0498f, 5622.8901f, 5976.4863f, 302.7377f,  409.7598f,
+  899.1851f,  1176.6501f, 1531.3615f, 1933.6494f, 2229.9561f, 2819.8936f,
+  3031.6248f, 3807.0129f, 4118.7495f, 4412.7339f, 4704.6758f, 5012.0190f,
+  5351.4160f, 5892.3232f, 421.1889f,  587.3521f,  835.9208f,  1248.0127f,
+  1475.8882f, 1779.3772f, 2330.6294f, 2606.6780f, 3026.0417f, 3513.8035f,
+  3754.6023f, 4081.0518f, 4536.3438f, 4815.9336f, 5117.6392f, 5802.9902f,
+  378.0719f,  722.0884f,  1327.5808f, 1665.8940f, 1954.7782f, 2238.9473f,
+  2608.8538f, 2958.7910f, 3341.5112f, 3721.2021f, 4095.8457f, 4457.6865f,
+  4843.8672f, 5212.5142f, 5589.5122f, 5945.3730f, 468.4631f,  962.3222f,
+  1541.0238f, 1919.1746f, 2347.4365f, 2650.7366f, 2927.5945f, 3166.4202f,
+  3451.0664f, 3757.8477f, 4109.2383f, 4467.9443f, 4858.6045f, 5211.8428f,
+  5593.3311f, 5951.0137f, 422.2508f,  845.8956f,  1495.2552f, 1811.3933f,
+  2128.1157f, 2371.2532f, 2656.0715f, 2942.9011f, 3294.5308f, 3652.0935f,
+  4031.2534f, 4399.2222f, 4801.9497f, 5163.3721f, 5559.4517f, 5934.4063f,
+  423.1028f,  661.7286f,  991.1974f,  1204.3813f, 1472.8564f, 2003.0298f,
+  2443.5833f, 2789.2795f, 3354.1692f, 3722.7822f, 4032.7351f, 4320.9727f,
+  4621.8140f, 4963.7310f, 5429.8203f, 5900.1465f, 361.2513f,  485.9720f,
+  828.4865f,  1340.9952f, 1497.8477f, 2072.8511f, 2437.9839f, 2674.9912f,
+  3259.3357f, 3539.0474f, 3789.1389f, 4087.5015f, 4404.8867f, 4771.0947f,
+  5500.2227f, 6015.7041f, 301.8146f,  392.9569f,  685.1938f,  1783.6246f,
+  2034.8542f, 2257.1614f, 2519.8713f, 2782.6279f, 3152.1135f, 3400.8662f,
+  3614.3801f, 3906.7375f, 4233.1968f, 4712.3682f, 5596.0396f, 5998.5742f,
+  242.0591f,  371.0809f,  729.0743f,  1190.6813f, 1851.5691f, 2132.6724f,
+  2334.7773f, 2522.3608f, 3091.8643f, 3621.4614f, 3854.5227f, 4174.7017f,
+  4490.7510f, 4780.1230f, 5157.6147f, 5865.4756f, 431.2477f,  562.1808f,
+  888.5207f,  1034.2062f, 1443.2480f, 2109.8850f, 2337.1443f, 2829.1870f,
+  3070.1301f, 3252.6370f, 3510.3967f, 4366.2236f, 4843.2139f, 5133.0537f,
+  5549.8911f, 5850.3252f, 420.2594f,  668.9339f,  911.1281f,  1218.0372f,
+  1806.5541f, 2050.8423f, 2394.5708f, 2761.3542f, 3021.1716f, 3414.0020f,
+  3970.9626f, 4342.2900f, 4691.6074f, 5062.5386f, 5452.6655f, 5792.8384f,
+  257.3011f,  370.8905f,  604.8825f,  1096.4209f, 1711.8464f, 1934.4335f,
+  2319.4717f, 2769.0144f, 3019.0200f, 3354.3726f, 4119.8809f, 4354.8589f,
+  4557.7979f, 4893.5776f, 5450.3042f, 5910.4136f, 241.4264f,  347.9253f,
+  622.2432f,  1248.8121f, 1559.7318f, 1848.8098f, 2315.5635f, 2571.5894f,
+  2879.5754f, 3624.1069f, 3968.0334f, 4238.9727f, 4713.4746f, 5156.6792f,
+  5568.5596f, 5975.8716f, 478.7131f,  629.4184f,  918.1857f,  1342.7815f,
+  1535.1541f, 1803.0487f, 2483.7764f, 2724.4321f, 2998.1257f, 3634.9932f,
+  3915.9443f, 4119.2837f, 4327.0283f, 4980.3516f, 5532.6880f, 5964.3052f,
+  265.7818f,  373.8575f,  723.3755f,  1186.0619f, 1509.2827f, 2064.2075f,
+  2298.1992f, 2566.4395f, 2785.7659f, 3423.1396f, 3883.9011f, 4136.8940f,
+  4463.0386f, 5010.6592f, 5539.0337f, 5931.4414f, 221.4221f,  347.7610f,
+  707.4465f,  1187.0800f, 1575.9095f, 1824.3983f, 1979.3307f, 2299.3174f,
+  2967.6799f, 3472.3381f, 3955.8469f, 4292.6079f, 4794.8745f, 5127.5181f,
+  5652.6729f, 5953.0132f, 397.2769f,  510.2605f,  746.8268f,  1588.0735f,
+  1991.5200f, 2150.6843f, 2439.0486f, 2712.2754f, 2972.5825f, 3501.2673f,
+  3917.5459f, 4143.6069f, 4443.4414f, 4829.1929f, 5490.0376f, 6028.3794f,
+  280.5184f,  370.6464f,  640.7120f,  1721.3899f, 1948.9806f, 2149.9592f,
+  2400.4678f, 2674.0542f, 3146.3154f, 3419.8850f, 3813.9553f, 4417.4497f,
+  4818.3652f, 5139.6323f, 5465.0669f, 5879.7183f, 325.2418f,  431.2627f,
+  1008.7708f, 1271.9235f, 1527.4150f, 2066.6370f, 2242.3311f, 2883.4065f,
+  3180.6614f, 3352.5015f, 3756.9688f, 4386.6904f, 4857.6621f, 5189.2212f,
+  5514.7573f, 5856.8086f, 451.8427f,  582.4401f,  925.8821f,  1363.4249f,
+  1503.2460f, 1961.5940f, 2265.6001f, 2574.4414f, 3123.0769f, 3345.1587f,
+  3634.3022f, 4266.0137f, 4880.8052f, 5223.5776f, 5567.8901f, 5880.3770f,
+  411.0873f,  553.3847f,  809.2106f,  1023.4841f, 1189.0618f, 1786.0770f,
+  2121.8489f, 2454.6458f, 2947.4700f, 3220.3210f, 3828.0911f, 4218.0229f,
+  4831.2383f, 5322.1445f, 5727.3906f, 6033.3887f, 310.5608f,  442.2204f,
+  742.7755f,  1097.5740f, 1340.9608f, 1854.4385f, 2261.6399f, 2634.8315f,
+  3297.8879f, 3638.6956f, 3925.8770f, 4232.9146f, 4559.9287f, 4893.5830f,
+  5403.0981f, 5917.7056f, 377.5583f,  488.4103f,  945.2491f,  1234.1572f,
+  1416.0774f, 1666.5979f, 1932.9910f, 2746.2000f, 2997.4753f, 3216.6152f,
+  3559.3999f, 3843.8130f, 4359.6626f, 5014.2920f, 5560.6162f, 5992.7212f,
+  285.2173f,  389.6116f,  825.5790f,  1238.8229f, 1459.6588f, 1860.8855f,
+  2178.6296f, 2519.1597f, 2828.0032f, 3278.8101f, 3560.8286f, 4142.0552f,
+  4691.0698f, 5117.7778f, 5558.7944f, 5954.6680f, 465.7002f,  631.7491f,
+  914.5521f,  1340.0057f, 1562.5760f, 1844.1741f, 2186.1208f, 2483.7080f,
+  2901.9417f, 3190.3162f, 3474.7651f, 3873.4065f, 4240.1973f, 4761.1255f,
+  5428.2832f, 5958.5273f, 340.5456f,  449.2341f,  793.7005f,  1387.7467f,
+  1555.8701f, 1938.7877f, 2201.6155f, 2579.5762f, 2914.9724f, 3149.8584f,
+  3699.3984f, 3985.6790f, 4331.7534f, 4999.4805f, 5514.6924f, 5969.4897f,
+  395.8350f,  564.1188f,  774.8214f,  1276.3201f, 1721.8716f, 1864.0143f,
+  2267.5696f, 2790.2031f, 3003.9434f, 3377.6140f, 3917.7395f, 4167.3867f,
+  4465.2529f, 4936.1138f, 5464.0479f, 5905.0444f, 324.1844f,  443.0006f,
+  728.8958f,  1398.6589f, 1584.1820f, 1923.8724f, 2348.0903f, 2561.5554f,
+  3154.5991f, 3449.1746f, 3771.7927f, 4182.1899f, 4937.0791f, 5361.6509f,
+  5727.7656f, 6002.7505f, 267.1790f,  373.7663f,  703.5949f,  1173.7009f,
+  1390.2002f, 1905.7941f, 2177.4961f, 2703.2627f, 3022.9121f, 3308.9612f,
+  3798.5823f, 4187.1533f, 4703.2163f, 5136.0918f, 5571.1655f, 5966.6577f,
+  272.9294f,  399.3804f,  797.7335f,  1180.1516f, 1426.4850f, 2097.2839f,
+  2355.4727f, 2793.8774f, 3137.1907f, 3458.7727f, 3893.6628f, 4245.8047f,
+  4652.3794f, 5106.5293f, 5568.1885f, 5948.3169f, 324.5529f,  431.7663f,
+  759.6147f,  1494.8739f, 1668.8168f, 2110.5635f, 2427.4104f, 2672.9270f,
+  3170.5266f, 3448.2080f, 3717.1240f, 4034.2280f, 4375.3647f, 5041.1372f,
+  5666.9517f, 6014.7217f, 306.4759f,  404.5361f,  795.7795f,  1675.9967f,
+  1835.0950f, 2160.6624f, 2430.8855f, 2734.2646f, 3270.1426f, 3586.1355f,
+  3821.9670f, 4102.0078f, 4372.9404f, 4918.9146f, 5412.0376f, 5868.5225f,
+  421.3803f,  607.7995f,  813.0241f,  1286.8525f, 1827.2451f, 2026.8683f,
+  2333.9453f, 2730.9817f, 2988.4067f, 3303.8513f, 3759.1897f, 4057.5264f,
+  4441.5493f, 4890.0078f, 5212.0469f, 5672.2188f, 423.8560f,  599.5201f,
+  829.0651f,  1082.6381f, 1245.9272f, 1623.7075f, 2453.0420f, 2855.6631f,
+  3171.3855f, 3475.5881f, 3715.4219f, 3972.1326f, 4419.1597f, 4894.0283f,
+  5363.8691f, 5919.2681f, 441.2789f,  634.8879f,  921.6287f,  1189.0240f,
+  1368.7466f, 2012.1312f, 2383.7656f, 2638.5222f, 2975.0288f, 3163.6150f,
+  3433.9958f, 3838.9917f, 4186.6426f, 4856.8477f, 5559.1196f, 5977.2290f,
+  349.2039f,  466.2342f,  724.2582f,  904.4043f,  1190.4492f, 1981.7565f,
+  2226.5554f, 2592.5098f, 2865.5525f, 3195.8196f, 3735.6345f, 4267.1660f,
+  4810.9893f, 5207.5093f, 5605.1445f, 5952.0361f, 497.7713f,  719.9073f,
+  925.0815f,  1146.3021f, 1326.7095f, 1574.5039f, 2306.7678f, 2714.8022f,
+  2967.5190f, 3400.1121f, 3732.0544f, 3981.7878f, 4553.4819f, 5090.0869f,
+  5426.2085f, 5833.5220f, 471.7526f,  648.3213f,  902.1542f,  1245.7086f,
+  1423.3403f, 1701.1757f, 2125.8530f, 2407.0481f, 2969.5583f, 3294.1296f,
+  3712.8398f, 4140.7930f, 4808.4668f, 5322.3896f, 5662.1255f, 5950.6211f,
+  345.3843f,  485.9887f,  841.2579f,  1035.9401f, 1244.8905f, 1488.1833f,
+  2340.4253f, 2607.0859f, 2845.4153f, 3223.1768f, 3557.0696f, 4119.7944f,
+  4666.8896f, 5145.8589f, 5565.7534f, 5976.6875f, 332.4270f,  427.5984f,
+  829.9191f,  1138.0469f, 1339.4468f, 1589.0535f, 1926.0630f, 2432.9331f,
+  2699.7964f, 3311.4355f, 3716.1003f, 4270.4990f, 4760.3647f, 5208.3950f,
+  5619.2080f, 5971.2715f, 249.0114f,  381.2982f,  925.7067f,  1520.3356f,
+  1842.8396f, 2368.2908f, 2783.4033f, 3272.5757f, 3673.7402f, 4046.3950f,
+  4370.4966f, 4688.0269f, 5002.6772f, 5316.3594f, 5650.2192f, 5977.6587f,
+  263.3275f,  451.6255f,  1252.2307f, 1503.0652f, 1786.7695f, 2082.7554f,
+  2451.1829f, 2804.7590f, 3116.7583f, 3493.8892f, 3884.6575f, 4349.6724f,
+  4770.0156f, 5143.1636f, 5542.5913f, 5931.5522f, 252.9447f,  341.5762f,
+  632.7664f,  1766.8096f, 2084.1511f, 2272.7332f, 2531.1006f, 2765.2080f,
+  3134.5417f, 3380.6223f, 3640.8015f, 3932.7854f, 4532.1172f, 5245.2070f,
+  5597.0776f, 5973.6831f, 234.9979f,  324.6731f,  1239.8643f, 1663.1921f,
+  1858.7769f, 2171.1614f, 2403.8818f, 2680.6433f, 2836.4985f, 3192.6577f,
+  3864.8811f, 4385.8066f, 4845.9766f, 5150.2412f, 5631.1519f, 6011.7773f,
+  284.5302f,  410.1263f,  985.4119f,  1298.3987f, 1789.4304f, 1996.9287f,
+  2450.8525f, 2831.6011f, 2994.2073f, 3214.1306f, 3525.0498f, 3819.9141f,
+  4672.7544f, 5424.3545f, 5691.0732f, 5980.3096f, 244.2704f,  415.5891f,
+  1038.3009f, 1317.5186f, 1686.4528f, 2081.3147f, 2476.9873f, 2959.5393f,
+  3214.9561f, 3569.1431f, 3934.4736f, 4308.7114f, 4728.3687f, 5105.7964f,
+  5488.1938f, 5908.9443f, 335.8417f,  468.3464f,  1003.6253f, 1275.0145f,
+  1534.2854f, 1985.3167f, 2348.3411f, 2743.3169f, 2956.0967f, 3408.5063f,
+  3866.8574f, 4287.0034f, 4556.7222f, 4922.7832f, 5259.7480f, 5800.2876f,
+  388.2726f,  518.0591f,  832.5999f,  1325.0247f, 1528.8624f, 1808.1732f,
+  2151.0820f, 2486.1331f, 2815.4980f, 3158.5391f, 3635.3606f, 3960.5383f,
+  4671.7686f, 5371.8140f, 5777.8940f, 6056.4722f, 506.5153f,  673.0771f,
+  900.0349f,  1154.2124f, 1378.2689f, 1786.9409f, 2081.9631f, 2398.6965f,
+  2859.7441f, 3075.4841f, 3546.6563f, 4322.6694f, 4732.0049f, 4992.5542f,
+  5267.5859f, 5807.1812f, 487.2466f,  653.6116f,  968.5656f,  1389.2708f,
+  1601.5822f, 1910.9694f, 2282.4038f, 2608.7063f, 3032.6233f, 3361.9692f,
+  3629.8552f, 3908.8335f, 4318.4009f, 4646.5781f, 5043.5962f, 5792.7393f,
+  432.8733f,  591.7551f,  899.2619f,  1490.1176f, 1789.8751f, 2060.3750f,
+  2434.8779f, 2840.3374f, 3122.1292f, 3472.8079f, 3830.8870f, 4097.2622f,
+  4353.5464f, 4650.2075f, 4981.5752f, 5482.9565f, 378.4767f,  508.5656f,
+  802.8280f,  947.2892f,  1532.0898f, 2038.8177f, 2349.1965f, 2650.2039f,
+  2863.8018f, 3591.6697f, 3918.9211f, 4256.6255f, 4604.8467f, 4899.0996f,
+  5237.6084f, 5791.5029f, 407.0908f,  546.0364f,  866.1215f,  1098.6927f,
+  1347.2009f, 1657.1525f, 1965.5845f, 2717.7190f, 3033.4961f, 3509.9031f,
+  3873.4150f, 4131.4438f, 4389.5693f, 4774.2295f, 5450.1768f, 5977.5151f,
+  429.3459f,  568.8134f,  903.5659f,  1099.2942f, 1379.4979f, 2207.5940f,
+  2479.9919f, 2780.9072f, 3206.3960f, 3425.4084f, 3682.5911f, 3950.1941f,
+  4324.0840f, 4689.4922f, 5068.2534f, 5787.2852f, 371.9443f,  524.7249f,
+  890.0464f,  1670.7485f, 1958.5308f, 2182.7007f, 2558.5007f, 2835.4937f,
+  3192.0740f, 3634.4817f, 3950.0942f, 4259.6953f, 4628.0049f, 4999.1616f,
+  5364.9893f, 5801.6855f, 323.1922f,  451.0327f,  787.1655f,  1011.6555f,
+  1323.8138f, 2177.6636f, 2401.1392f, 2826.8796f, 3432.8999f, 3653.1851f,
+  3883.9897f, 4082.7559f, 4361.6753f, 4635.1475f, 5084.7544f, 5823.3062f,
+  377.0061f,  524.2181f,  743.6288f,  1378.9187f, 1857.6434f, 2056.4695f,
+  2453.7949f, 2902.1995f, 3127.2651f, 3463.3523f, 3980.1316f, 4241.2578f,
+  4528.5859f, 4881.4521f, 5239.3145f, 5580.5986f, 308.7965f,  403.7058f,
+  705.9506f,  1823.8571f, 2126.9387f, 2369.2810f, 2647.2048f, 2855.8276f,
+  3209.7708f, 3498.2310f, 3747.6047f, 3972.8647f, 4254.3325f, 4574.4292f,
+  5087.3965f, 5890.4219f, 274.7571f,  383.7251f,  573.6029f,  1142.8372f,
+  2151.7173f, 2558.8972f, 2751.9468f, 2987.4412f, 3234.3350f, 3526.0127f,
+  3922.9927f, 4189.0249f, 4483.3774f, 4877.1860f, 5396.7798f, 5921.8125f,
+  248.5916f,  423.6264f,  1260.9626f, 1696.0492f, 1972.9108f, 2298.5972f,
+  2592.9307f, 2947.2292f, 3266.2227f, 3614.3572f, 3980.3892f, 4359.4067f,
+  4770.2842f, 5158.9058f, 5554.6597f, 5936.9043f, 320.5471f,  429.6766f,
+  657.1440f,  1390.1080f, 2194.6426f, 2507.6086f, 2712.3662f, 2980.3408f,
+  3216.1682f, 3544.8467f, 3956.9790f, 4227.5308f, 4463.7563f, 4745.7124f,
+  5088.6650f, 5525.8516f, 245.5478f,  520.3131f,  1177.0693f, 1454.0125f,
+  1770.2620f, 2160.8779f, 2551.2700f, 2950.2324f, 3326.8621f, 3710.4624f,
+  4104.3936f, 4481.9971f, 4865.9736f, 5230.6396f, 5608.5649f, 5965.6162f,
+  514.5864f,  956.9897f,  1287.9597f, 1520.3473f, 1802.0631f, 2116.4980f,
+  2509.8552f, 2865.9822f, 3238.7510f, 3611.3108f, 4016.4353f, 4431.8457f,
+  4860.3442f, 5231.4814f, 5614.6016f, 5963.9976f, 537.0523f,  932.2803f,
+  1380.2690f, 1709.4702f, 2079.9902f, 2446.4014f, 2859.4204f, 3229.6975f,
+  3623.4031f, 4012.5327f, 4373.7568f, 4724.3359f, 5078.2686f, 5397.6040f,
+  5721.9639f, 6028.1167f, 452.5153f,  798.2777f,  1099.3080f, 1317.0807f,
+  1652.6885f, 2059.7708f, 2471.0164f, 2808.5396f, 3146.5076f, 3494.0779f,
+  3870.6912f, 4310.8281f, 4777.5024f, 5181.2617f, 5574.4912f, 5934.3813f,
+  340.3716f,  430.5102f,  872.3513f,  1636.3792f, 1772.8615f, 2074.0161f,
+  2295.1008f, 2693.0037f, 3177.7710f, 3391.7559f, 3670.8718f, 4224.3926f,
+  4896.3877f, 5199.9883f, 5580.4512f, 5911.7671f, 317.8269f,  414.8185f,
+  881.1970f,  1658.4944f, 1852.0098f, 2136.0415f, 2380.8228f, 2668.9141f,
+  3046.8027f, 3299.0051f, 3523.0593f, 3758.9412f, 4116.9063f, 5061.2124f,
+  5624.1777f, 5989.4761f, 374.0671f,  488.0840f,  734.0546f,  1415.9261f,
+  1648.7783f, 1852.8462f, 2099.1895f, 2347.5562f, 2954.8359f, 3269.6714f,
+  3536.7920f, 4116.1743f, 4481.4355f, 4913.8838f, 5467.2817f, 5909.8779f,
+  340.4291f,  448.5775f,  1041.4979f, 1426.0011f, 1637.8165f, 1968.6743f,
+  2210.7976f, 2647.5144f, 2913.8650f, 3131.7698f, 3429.8755f, 3722.6763f,
+  4104.6479f, 4969.0093f, 5574.2231f, 5978.2070f, 254.2538f,  412.7710f,
+  947.8206f,  1209.3683f, 1690.4813f, 2040.7881f, 2401.4314f, 2728.0066f,
+  3016.2290f, 3530.3865f, 3964.6563f, 4393.6934f, 4804.2168f, 5187.9302f,
+  5586.4399f, 5954.8950f, 241.0244f,  347.0750f,  835.2348f,  1601.9089f,
+  1786.4336f, 2134.3950f, 2396.0139f, 2848.9712f, 3239.9138f, 3623.8250f,
+  4029.5088f, 4400.3936f, 4797.3564f, 5195.7310f, 5596.6689f, 5965.9878f,
+  309.3683f,  453.6776f,  812.9343f,  1125.9915f, 1423.5935f, 2149.2227f,
+  2514.9277f, 3031.3599f, 3463.7219f, 3790.7839f, 4064.0039f, 4297.9839f,
+  4653.4551f, 5189.7061f, 5721.2954f, 6033.0752f, 469.4284f,  730.1902f,
+  973.0643f,  1170.5016f, 1572.2559f, 2084.2769f, 2567.8604f, 2963.4592f,
+  3286.9617f, 3580.3228f, 3882.8706f, 4335.5483f, 4859.7197f, 5258.2827f,
+  5627.9785f, 5957.8623f, 454.6165f,  795.2360f,  1078.7705f, 1294.9473f,
+  1761.6650f, 2235.2788f, 2695.8455f, 3095.7695f, 3473.4897f, 3833.0889f,
+  4185.7290f, 4528.9863f, 4893.0039f, 5240.7627f, 5608.8594f, 5951.0718f,
+  563.4587f,  875.8987f,  1139.0026f, 1378.2317f, 1855.7401f, 2279.7683f,
+  2651.3079f, 2968.4397f, 3279.4453f, 3607.2500f, 3975.5796f, 4358.3574f,
+  4768.7969f, 5135.3706f, 5525.3501f, 5904.2617f, 461.7852f,  855.0644f,
+  1367.4387f, 1702.5593f, 2141.0093f, 2500.9055f, 2853.8596f, 3123.9744f,
+  3406.0178f, 3694.0481f, 4028.9985f, 4373.1113f, 4768.2891f, 5137.6895f,
+  5541.3721f, 5921.4507f, 438.6031f,  753.0179f,  1269.3203f, 1630.4396f,
+  2027.2959f, 2350.9695f, 2672.1396f, 2957.1809f, 3250.1545f, 3546.5315f,
+  3894.0161f, 4249.9346f, 4666.2266f, 5061.2524f, 5490.7749f, 5904.6362f,
+  543.3182f,  828.4835f,  1239.1818f, 1471.1134f, 1737.8622f, 2037.2484f,
+  2434.5112f, 2801.3242f, 3162.3250f, 3508.1255f, 3849.0903f, 4165.7588f,
+  4588.3809f, 5020.0952f, 5475.2813f, 5904.6377f, 519.5982f,  837.6639f,
+  1171.2003f, 1363.0320f, 1617.4617f, 1976.1787f, 2472.0303f, 2901.3264f,
+  3340.7300f, 3736.0830f, 4103.3843f, 4444.8657f, 4800.9482f, 5145.6011f,
+  5544.2002f, 5933.0981f, 433.3774f,  582.7663f,  899.6142f,  1150.7437f,
+  1321.1309f, 1947.8643f, 2557.8604f, 2733.1497f, 3240.4907f, 3634.7915f,
+  3855.9856f, 4058.0281f, 4364.2568f, 5096.5225f, 5659.0952f, 6013.8145f,
+  424.9731f,  604.3164f,  868.1793f,  1207.7882f, 1414.2374f, 1713.2893f,
+  2520.2900f, 2960.8887f, 3210.8542f, 3584.5403f, 3914.5796f, 4149.8550f,
+  4505.7705f, 4886.9575f, 5214.5361f, 5597.8389f, 347.0334f,  494.2440f,
+  753.7191f,  1451.0435f, 1700.7461f, 1925.4844f, 2605.7988f, 2870.4744f,
+  3173.7312f, 3758.7219f, 4112.1929f, 4400.3882f, 4866.1016f, 5165.8799f,
+  5433.0371f, 5781.1509f, 318.4942f,  464.3939f,  783.5214f,  1491.0234f,
+  1708.4984f, 2280.2876f, 2533.3354f, 2885.1736f, 3443.7451f, 3669.8506f,
+  4000.6792f, 4269.6626f, 4571.2739f, 4827.2158f, 5277.3813f, 5850.4736f,
+  386.8698f,  519.0056f,  725.0029f,  981.5649f,  1156.1665f, 1500.4691f,
+  2421.7993f, 2962.4722f, 3175.0166f, 3548.4756f, 3860.7961f, 4146.4150f,
+  4658.9897f, 5088.3999f, 5531.8945f, 5951.4624f, 315.9294f,  738.5538f,
+  1171.9581f, 1553.7167f, 1949.9159f, 2319.6641f, 2707.5493f, 3069.2996f,
+  3444.6157f, 3811.2139f, 4177.5469f, 4545.6943f, 4905.0444f, 5271.3926f,
+  5622.6831f, 5974.4141f, 216.5136f,  598.1122f,  1059.3214f, 1466.4785f,
+  1880.1747f, 2263.6533f, 2658.3081f, 3030.4099f, 3413.6802f, 3780.1853f,
+  4157.1455f, 4519.1919f, 4893.5439f, 5244.3530f, 5603.1064f, 5926.8379f,
+  375.4021f,  487.0890f,  844.4013f,  1574.3596f, 1794.5249f, 2106.2878f,
+  2418.5217f, 2657.8938f, 3116.6096f, 3457.8625f, 3691.0596f, 3930.1062f,
+  4259.5928f, 4592.4370f, 5020.5078f, 5840.3989f, 474.3148f,  724.2144f,
+  974.0716f,  1283.4182f, 1521.2632f, 1746.4248f, 2333.0957f, 2874.2966f,
+  3111.9636f, 3440.0410f, 3752.9678f, 3975.7139f, 4294.7056f, 4821.9893f,
+  5201.5562f, 5658.8301f, 400.0291f,  564.9626f,  808.2393f,  1083.2745f,
+  1300.4403f, 2080.7405f, 2588.6882f, 2858.4629f, 3206.4502f, 3429.8623f,
+  3746.9080f, 4341.4868f, 4713.2803f, 4986.4258f, 5336.7339f, 5710.1123f,
+  354.4416f,  480.1495f,  834.1089f,  1037.7775f, 1350.0652f, 1791.1736f,
+  2193.0159f, 2504.6775f, 2776.0623f, 3153.0994f, 4108.1357f, 4597.4082f,
+  4861.9688f, 5092.8613f, 5473.2295f, 5932.0332f, 237.3935f,  346.9133f,
+  675.5335f,  1481.0535f, 1716.8414f, 1884.7153f, 2099.3057f, 2725.5403f,
+  3022.8506f, 3276.2922f, 3639.1001f, 4185.3926f, 4941.6597f, 5292.0093f,
+  5682.0391f, 5981.0215f, 367.4981f,  469.7130f,  820.7811f,  1219.7736f,
+  1368.4479f, 1624.6671f, 1804.2581f, 2607.8589f, 2891.3174f, 3212.2432f,
+  3760.7290f, 4015.6111f, 4618.0068f, 5129.3213f, 5652.1582f, 6042.1113f,
+  312.6796f,  415.8322f,  674.1500f,  853.7709f,  1808.7385f, 2232.5310f,
+  2497.8157f, 2834.2991f, 3039.7012f, 3301.4050f, 3659.2969f, 4455.9453f,
+  4841.4912f, 5111.6167f, 5502.2534f, 5924.6357f, 341.9309f,  471.7513f,
+  758.1926f,  979.7221f,  1287.4463f, 1737.0303f, 2160.7915f, 2664.5562f,
+  2961.8315f, 3461.7439f, 3732.6611f, 4109.0928f, 4568.9111f, 5037.4331f,
+  5511.3169f, 5966.1304f, 351.3721f,  462.1897f,  765.1075f,  946.3102f,
+  1322.8093f, 2292.2400f, 2503.6494f, 2819.7234f, 3079.2803f, 3297.6252f,
+  3571.4668f, 3872.0823f, 4337.6426f, 5079.1504f, 5562.8110f, 5942.7153f,
+  435.4323f,  614.4746f,  892.8980f,  1215.9469f, 1395.9762f, 1814.3936f,
+  2155.9590f, 2465.0427f, 3201.6211f, 3490.9224f, 3853.2620f, 4410.1855f,
+  4786.0625f, 5095.0181f, 5394.4805f, 5715.3364f, 294.6053f,  417.1553f,
+  1046.2922f, 1443.0247f, 1636.7180f, 1956.4248f, 2189.9697f, 2869.8071f,
+  3129.9385f, 3462.5681f, 3895.2805f, 4213.4541f, 4541.8950f, 5009.1958f,
+  5472.7642f, 5983.0063f, 322.1185f,  446.8733f,  689.4188f,  1338.2788f,
+  1643.1023f, 1903.8652f, 2494.2722f, 2804.6968f, 3103.8682f, 3640.1233f,
+  3965.9861f, 4172.5596f, 4404.7388f, 4670.7544f, 5240.3682f, 5893.4600f,
+  209.7024f,  336.5508f,  729.0126f,  1217.3285f, 1699.0111f, 1891.2837f,
+  2146.8486f, 2830.0850f, 3108.6204f, 3446.0396f, 3754.1230f, 3945.1038f,
+  4474.5806f, 5191.6987f, 5613.3076f, 5970.2695f, 346.6580f,  470.5094f,
+  663.3455f,  1266.9061f, 2020.5759f, 2270.5173f, 2527.3550f, 2826.9104f,
+  3078.3403f, 3401.2625f, 3804.3770f, 4100.3091f, 4407.7876f, 4732.2319f,
+  5150.2749f, 5808.2559f, 283.7796f,  391.4603f,  1165.6863f, 1456.1125f,
+  1692.9001f, 2008.4825f, 2322.7837f, 2784.0608f, 2998.5811f, 3268.5164f,
+  3548.9373f, 4167.1289f, 4643.9878f, 5099.2881f, 5473.0781f, 5929.8242f,
+  301.0849f,  383.1578f,  692.0848f,  1648.9374f, 1873.0947f, 2109.6113f,
+  2345.0110f, 2613.1121f, 2922.0193f, 3170.0020f, 3405.0774f, 3881.9875f,
+  4778.3154f, 5092.5205f, 5445.7100f, 5920.7896f, 509.1023f,  750.8580f,
+  963.8820f,  1295.3452f, 1634.8796f, 1818.7975f, 2151.1250f, 2590.3354f,
+  2867.5596f, 3238.7666f, 3747.2834f, 4053.8911f, 4457.8164f, 4928.0151f,
+  5295.3521f, 5789.0571f, 421.8951f,  547.9814f,  967.4185f,  1153.8607f,
+  1461.4230f, 1813.0994f, 2155.2703f, 2570.9712f, 2777.6597f, 3048.9863f,
+  3432.0986f, 3729.3877f, 4395.7461f, 5028.7402f, 5486.4946f, 5951.5024f,
+  340.6758f,  445.7014f,  931.8882f,  1253.4775f, 1521.9260f, 1969.5759f,
+  2267.5332f, 2735.0112f, 2948.7678f, 3236.5166f, 3529.5505f, 3882.3674f,
+  4699.5781f, 5089.6641f, 5377.7842f, 5880.7778f, 284.1882f,  408.6918f,
+  786.3123f,  1670.3220f, 2042.9493f, 2265.2275f, 2691.2012f, 3035.8762f,
+  3334.1719f, 3863.1194f, 4276.8916f, 4571.0420f, 4996.4404f, 5336.5205f,
+  5647.9556f, 5944.5996f, 300.0066f,  616.4817f,  1238.7324f, 1614.8296f,
+  1997.6188f, 2367.4343f, 2784.5605f, 3168.8354f, 3569.8250f, 3965.6011f,
+  4336.3804f, 4689.5874f, 5044.2012f, 5365.7456f, 5697.5654f, 6010.6572f,
+  242.9420f,  476.8371f,  1250.6661f, 1671.6031f, 2159.6443f, 2637.7417f,
+  3049.8589f, 3371.6045f, 3674.8706f, 3951.1006f, 4230.6416f, 4543.2827f,
+  4887.4478f, 5220.5581f, 5595.2686f, 5962.1313f, 242.6795f,  331.1335f,
+  635.2861f,  1801.5236f, 2084.1472f, 2264.4692f, 2506.2891f, 2799.4441f,
+  3236.7134f, 3489.6038f, 3859.3291f, 4424.8008f, 4964.6348f, 5298.6533f,
+  5640.2031f, 5988.0552f, 254.0538f,  336.2447f,  1216.6261f, 1717.7201f,
+  1886.0708f, 2176.6338f, 2405.8547f, 2762.3037f, 2934.8816f, 3167.0657f,
+  3385.5457f, 3804.4346f, 4848.8198f, 5286.0352f, 5630.5391f, 6086.4492f,
+  295.2298f,  426.2079f,  630.7856f,  1155.5609f, 1827.6831f, 2120.5283f,
+  2462.4373f, 2759.6152f, 2990.9526f, 3253.4216f, 3910.9834f, 4204.2754f,
+  4462.7944f, 4909.7529f, 5579.9653f, 5985.8579f, 298.9633f,  410.3875f,
+  810.1115f,  1346.1040f, 1499.2391f, 2210.3948f, 2467.9424f, 2792.7122f,
+  3284.0874f, 3493.0740f, 3784.1899f, 4319.6396f, 4860.6548f, 5213.8540f,
+  5609.8672f, 5949.6890f, 437.9900f,  575.3093f,  866.0077f,  1104.2080f,
+  1307.4966f, 1959.9323f, 2293.9365f, 2604.6704f, 2966.6514f, 3228.0056f,
+  3548.8499f, 4096.4424f, 4769.5420f, 5086.5449f, 5416.5317f, 5853.6909f,
+  412.4955f,  569.1867f,  864.0179f,  1117.6798f, 1348.6332f, 1976.5171f,
+  2334.3960f, 2640.3381f, 3006.5347f, 3327.5784f, 3695.8564f, 4042.1753f,
+  4362.7837f, 4687.4751f, 5389.8662f, 5966.5825f, 406.8686f,  542.0319f,
+  867.3541f,  1436.3810f, 1678.6399f, 2000.1501f, 2358.1204f, 2651.3806f,
+  3042.1216f, 3339.2766f, 3617.9963f, 3933.3860f, 4249.0278f, 4591.8530f,
+  5502.0400f, 6020.7910f, 375.4336f,  519.7731f,  764.5574f,  1215.1381f,
+  1482.9417f, 1696.8020f, 1957.0332f, 2169.1169f, 2973.4634f, 3687.7449f,
+  3966.8525f, 4258.8042f, 4680.6567f, 4947.0225f, 5230.9824f, 5843.2466f,
+  443.2378f,  574.0562f,  813.3345f,  1282.7894f, 1538.0752f, 1727.8997f,
+  2007.8584f, 2194.5601f, 2755.8220f, 3460.9243f, 3654.1399f, 4030.5530f,
+  4572.4727f, 4904.7847f, 5400.6147f, 5934.2656f, 423.6246f,  540.1947f,
+  862.8629f,  1386.7659f, 1577.2052f, 1811.0304f, 2046.7363f, 2309.0366f,
+  3129.1145f, 3533.0020f, 3738.4211f, 4021.1111f, 4357.3677f, 4634.8740f,
+  5307.2920f, 5944.9155f, 287.7661f,  401.5490f,  725.6079f,  950.8911f,
+  1186.5465f, 1490.1750f, 2114.7920f, 2562.4019f, 3028.3977f, 3519.6277f,
+  3940.5737f, 4339.3086f, 4765.8188f, 5172.3428f, 5582.8022f, 5971.0273f,
+  382.6039f,  537.7234f,  836.8093f,  1371.3546f, 1578.9803f, 1869.8213f,
+  2292.5596f, 2540.8601f, 3032.9834f, 3402.5059f, 3737.0569f, 4053.9937f,
+  4446.6240f, 5251.8457f, 5710.7935f, 6022.2925f, 313.2195f,  415.0511f,
+  690.6860f,  1561.4832f, 1815.6521f, 2059.9187f, 2345.5095f, 2614.8701f,
+  3006.9604f, 3291.9744f, 3590.4119f, 3996.1516f, 4365.4995f, 4853.4956f,
+  5465.1572f, 5954.5718f, 361.7959f,  448.4001f,  921.3198f,  1343.1167f,
+  1488.6287f, 1736.7700f, 1950.8906f, 2536.0193f, 2768.7393f, 3062.4473f,
+  3484.6570f, 3888.5618f, 4618.4038f, 5092.6641f, 5523.3657f, 5966.6772f,
+  249.5541f,  366.6601f,  684.6592f,  1203.0931f, 1642.2089f, 1961.8837f,
+  2227.3289f, 2421.1348f, 2660.5676f, 3229.5410f, 3822.5837f, 4232.7266f,
+  4782.5181f, 5127.2612f, 5570.2676f, 5978.9858f, 287.4206f,  421.3210f,
+  704.0352f,  1279.8597f, 1562.7307f, 2115.4241f, 2492.4517f, 2780.9470f,
+  3317.3616f, 3606.1492f, 4026.6375f, 4337.9014f, 4699.6895f, 4997.2573f,
+  5431.1787f, 5903.8628f, 487.9554f,  740.9349f,  1021.9616f, 1327.3262f,
+  1620.8544f, 1890.7717f, 2269.1218f, 2584.4868f, 2911.2896f, 3424.9221f,
+  3855.1670f, 4205.9272f, 4707.2466f, 5147.1846f, 5601.1152f, 5953.4673f,
+  400.8269f,  513.4500f,  786.8242f,  1269.3298f, 1441.4178f, 1696.9789f,
+  1911.0537f, 2223.0684f, 2847.1619f, 3113.3845f, 3670.6318f, 4146.2900f,
+  4555.9204f, 5083.8579f, 5574.8120f, 5987.6030f, 379.0329f,  487.7222f,
+  914.8179f,  1130.9854f, 1430.1394f, 1830.0769f, 2088.8796f, 2613.6855f,
+  2803.1633f, 3457.1777f, 4032.6118f, 4306.7344f, 4662.6899f, 4959.6348f,
+  5245.5234f, 5787.3940f, 340.6941f,  451.0338f,  656.2767f,  911.5805f,
+  1124.9330f, 1733.8730f, 2518.7861f, 2768.6851f, 3211.3733f, 3717.7583f,
+  3929.6772f, 4176.2993f, 4522.4517f, 5011.5547f, 5575.8784f, 6006.7222f,
+  341.5027f,  441.6417f,  807.2695f,  1060.2080f, 1251.2837f, 1478.9895f,
+  1750.0796f, 2594.8977f, 2924.5027f, 3401.4751f, 3852.0557f, 4292.4683f,
+  4718.2930f, 5159.4775f, 5562.4067f, 5972.5571f, 313.8985f,  421.5380f,
+  667.2407f,  873.6023f,  1110.1119f, 2060.7332f, 2381.0916f, 2746.2288f,
+  3080.5649f, 3399.9905f, 3897.5884f, 4434.9990f, 5048.1343f, 5390.8149f,
+  5744.3931f, 6007.9326f, 252.1832f,  354.2392f,  673.5427f,  1339.1161f,
+  1554.8853f, 2014.9351f, 2300.4138f, 2829.6182f, 3213.1714f, 3409.5105f,
+  3604.3242f, 3927.8020f, 4622.3218f, 5103.4565f, 5559.5024f, 5971.5986f,
+  385.2648f,  513.7607f,  760.7678f,  983.5819f,  1175.7727f, 2134.7810f,
+  2592.9614f, 2822.0161f, 3232.2524f, 3445.3516f, 3750.7583f, 4094.6714f,
+  4401.5830f, 4753.4204f, 5549.2319f, 6034.7148f, 220.6833f,  314.5706f,
+  622.2172f,  1350.8225f, 1785.5879f, 2077.5837f, 2504.2158f, 3057.6992f,
+  3436.0974f, 3695.2976f, 3953.4272f, 4267.8701f, 4660.6865f, 5073.6831f,
+  5501.9478f, 5929.9780f, 207.8814f,  310.4071f,  646.2098f,  1270.5835f,
+  1542.7271f, 2079.3804f, 2440.0339f, 2843.4690f, 3272.4854f, 3657.9851f,
+  4061.2014f, 4444.9780f, 4841.6060f, 5224.5947f, 5620.9141f, 5972.7261f,
+  326.1488f,  456.7737f,  740.3350f,  961.4597f,  1262.7579f, 2190.7178f,
+  2483.5300f, 2872.4180f, 3328.4910f, 3811.0334f, 4153.1602f, 4441.8271f,
+  4801.1802f, 5065.2988f, 5381.6309f, 5693.2886f, 206.2046f,  328.0855f,
+  618.9507f,  980.9994f,  1695.9775f, 1982.3051f, 2275.5444f, 2806.0271f,
+  3269.5178f, 3491.2456f, 3722.1775f, 4145.9121f, 4843.1167f, 5266.8677f,
+  5656.8794f, 5992.1201f, 308.1086f,  407.7706f,  806.7985f,  1045.7629f,
+  1401.8912f, 2108.3472f, 2331.7849f, 2952.5391f, 3174.1865f, 3374.0686f,
+  3645.4260f, 4292.7183f, 4939.2969f, 5250.4829f, 5607.2358f, 5932.8657f,
+  267.5990f,  378.7492f,  642.2629f,  871.7917f,  1691.7523f, 2087.5117f,
+  2423.1462f, 2686.1487f, 3021.7893f, 3724.0247f, 4035.5454f, 4369.5903f,
+  4680.1167f, 4991.4175f, 5323.6875f, 5811.7471f, 312.3856f,  437.4281f,
+  714.5340f,  899.5771f,  1632.7545f, 1938.5369f, 2295.5544f, 2625.6189f,
+  2900.5576f, 3295.4934f, 3557.1260f, 3960.1123f, 4731.6079f, 5141.8447f,
+  5502.7793f, 5954.0049f, 332.2842f,  449.0976f,  875.9957f,  1206.1912f,
+  1422.6793f, 2097.5745f, 2354.2483f, 2715.8494f, 3093.4697f, 3344.5132f,
+  3623.4814f, 3889.3655f, 4256.2002f, 4994.5742f, 5593.8428f, 5985.9575f,
+  286.9586f,  434.7701f,  781.3996f,  1248.3495f, 1835.5530f, 2137.1155f,
+  2573.7449f, 2869.9299f, 3126.0564f, 3459.1448f, 3769.4475f, 4138.3076f,
+  4688.0298f, 5084.9028f, 5436.8086f, 5894.2520f, 327.0000f,  429.0804f,
+  663.7327f,  849.7463f,  1174.9340f, 2383.3875f, 2695.9597f, 2941.2026f,
+  3214.4724f, 3433.6287f, 3778.9312f, 4134.8096f, 4504.8022f, 5066.7559f,
+  5599.2290f, 5985.7334f, 244.4052f,  499.2254f,  1294.8232f, 1689.3677f,
+  2123.5024f, 2572.4958f, 3042.9067f, 3446.8752f, 3836.3740f, 4175.6729f,
+  4485.3213f, 4792.3755f, 5094.9077f, 5386.1816f, 5699.6411f, 6008.2114f,
+  561.9757f,  1020.3204f, 1494.1995f, 1841.8171f, 2297.0906f, 2772.6184f,
+  3204.8804f, 3565.8628f, 3935.4106f, 4253.4141f, 4559.7021f, 4849.9653f,
+  5140.2852f, 5428.6934f, 5731.2251f, 6023.5078f, 581.6182f,  1053.5670f,
+  1478.5878f, 1784.4789f, 2125.1157f, 2454.5889f, 2809.0256f, 3141.7256f,
+  3490.7529f, 3848.5923f, 4201.7271f, 4568.7720f, 4945.9619f, 5288.6289f,
+  5647.7642f, 5981.9341f, 258.9683f,  364.0963f,  722.5463f,  1763.2114f,
+  1969.3870f, 2265.5239f, 2532.1821f, 2883.3557f, 3388.1838f, 3725.3120f,
+  4080.9338f, 4390.3818f, 4716.3599f, 5068.4941f, 5452.2778f, 5847.1401f,
+  271.5428f,  401.4228f,  695.5894f,  857.3072f,  1776.5358f, 2008.5603f,
+  2554.4143f, 2844.4021f, 3018.6877f, 3226.1279f, 3482.3398f, 3810.6858f,
+  4549.3071f, 5266.2764f, 5614.6157f, 5945.6904f, 330.3132f,  444.6271f,
+  669.0279f,  874.5479f,  1102.9247f, 2052.1780f, 2436.2378f, 2711.1165f,
+  3037.7537f, 3298.2036f, 3898.6858f, 4241.5415f, 4606.7637f, 5086.6919f,
+  5569.7397f, 5988.6797f, 232.3014f,  344.5512f,  578.5155f,  1213.9569f,
+  1880.9729f, 2105.6685f, 2335.4148f, 2550.3965f, 3147.6501f, 3491.9253f,
+  3791.5613f, 4159.6694f, 4642.2441f, 5103.3340f, 5605.4106f, 5989.7969f,
+  346.3687f,  444.8047f,  714.3775f,  889.1195f,  1211.8463f, 2168.7598f,
+  2430.2490f, 2760.6326f, 3012.4961f, 3268.8750f, 3565.1558f, 4172.5791f,
+  4781.5391f, 5127.6704f, 5512.6323f, 5911.3779f, 398.0477f,  553.8537f,
+  845.8521f,  1119.3066f, 1309.7244f, 1928.3351f, 2351.2095f, 2649.8230f,
+  3050.6750f, 3297.0566f, 3592.7275f, 3916.1785f, 4723.3325f, 5318.1221f,
+  5703.9697f, 5996.7651f, 371.4409f,  471.0789f,  896.4924f,  1197.7544f,
+  1400.8007f, 1611.1555f, 1867.3550f, 2818.4475f, 3002.5906f, 3250.1440f,
+  3546.5891f, 4265.0371f, 4890.3369f, 5274.4722f, 5659.3560f, 5946.9644f,
+  330.9331f,  448.7211f,  808.3973f,  978.2021f,  1652.6361f, 1969.0725f,
+  2357.0146f, 2680.4792f, 2859.9165f, 3078.9578f, 3423.6895f, 4233.3169f,
+  4856.7813f, 5086.5723f, 5393.9961f, 5938.6035f, 323.9659f,  433.8731f,
+  1045.5168f, 1369.1907f, 1561.9178f, 1984.2457f, 2224.0959f, 2747.3657f,
+  2995.0359f, 3242.9248f, 3501.0344f, 4022.2388f, 4847.4985f, 5210.9922f,
+  5658.1357f, 6005.0718f, 354.6574f,  501.6520f,  852.5305f,  1020.8707f,
+  1540.5925f, 1998.5675f, 2253.1487f, 2845.3960f, 3056.5273f, 3305.0466f,
+  3954.2900f, 4591.7471f, 4915.2856f, 5221.9082f, 5544.7285f, 5879.9150f,
+  363.1311f,  474.7310f,  907.5490f,  1106.8586f, 1367.2662f, 1646.6934f,
+  2031.3650f, 2326.4382f, 2568.6519f, 3030.1091f, 3905.6482f, 4265.9111f,
+  4716.1831f, 5017.0454f, 5469.8149f, 5958.6182f, 379.9262f,  524.4459f,
+  845.4813f,  1275.4414f, 1458.2488f, 1772.5863f, 2067.7981f, 2526.8850f,
+  3066.4063f, 3307.8713f, 3807.2900f, 4199.1509f, 4452.4653f, 4854.7471f,
+  5464.8833f, 5947.7842f, 371.8218f,  483.9148f,  778.2747f,  1208.0812f,
+  1366.3983f, 1623.4895f, 1798.8777f, 2224.6445f, 3103.7175f, 3386.0408f,
+  3782.8284f, 4307.4727f, 4698.8994f, 5118.1255f, 5505.1919f, 5921.1724f,
+  217.9059f,  323.3224f,  639.7305f,  1026.5331f, 1312.9242f, 1885.6948f,
+  2361.8403f, 2805.5396f, 3213.2600f, 3631.5017f, 4033.4087f, 4426.3423f,
+  4821.3203f, 5208.3833f, 5590.5205f, 5956.1538f, 211.9971f,  311.2018f,
+  504.6345f,  858.3289f,  1574.7019f, 1934.9866f, 2381.4163f, 2786.2043f,
+  3238.9326f, 3611.0518f, 4005.2578f, 4401.0615f, 4802.1479f, 5192.5493f,
+  5587.1479f, 5965.5977f, 219.3884f,  319.3835f,  604.0102f,  1114.8630f,
+  1481.3870f, 2036.0469f, 2303.4883f, 2616.1384f, 3253.6335f, 3556.5107f,
+  3946.6567f, 4520.3555f, 5091.0479f, 5416.3037f, 5748.5737f, 5946.5757f,
+  350.3716f,  515.4462f,  756.5206f,  1061.4270f, 1251.9570f, 1723.2751f,
+  2687.6689f, 3036.2019f, 3273.9678f, 3744.2939f, 4098.6284f, 4391.4160f,
+  4917.6777f, 5244.2852f, 5551.4976f, 5880.1572f, 311.6069f,  458.7317f,
+  795.9418f,  969.5021f,  1511.2507f, 1952.5673f, 2273.6116f, 2795.8657f,
+  3049.7053f, 3578.0598f, 3911.1873f, 4327.2598f, 4735.3105f, 5122.3423f,
+  5479.7817f, 5858.1504f, 267.8399f,  390.6757f,  886.2357f,  1179.5110f,
+  1466.6409f, 2088.7725f, 2328.1262f, 2993.5786f, 3283.5256f, 3593.2822f,
+  4095.7588f, 4500.4009f, 4887.5132f, 5219.0859f, 5553.4224f, 5915.6831f,
+  279.2209f,  413.3200f,  648.4438f,  1282.1798f, 1793.2556f, 1952.1060f,
+  2484.9436f, 2857.3630f, 3077.2114f, 3548.2585f, 4045.4526f, 4309.5947f,
+  4760.2900f, 5208.1948f, 5620.9717f, 5968.3237f, 306.2321f,  424.7843f,
+  618.7867f,  1288.7572f, 2110.7849f, 2346.5396f, 2582.5366f, 2833.5730f,
+  3074.3774f, 3464.7886f, 3984.6379f, 4262.0337f, 4601.5132f, 4999.6992f,
+  5498.8926f, 5920.4814f, 259.2613f,  353.6931f,  762.5328f,  1906.2162f,
+  2088.1213f, 2317.9741f, 2546.5935f, 2880.3687f, 3332.0002f, 3636.9216f,
+  3946.4287f, 4226.0356f, 4502.1084f, 5007.0601f, 5496.4824f, 5924.8877f,
+  244.3871f,  357.0287f,  1114.7865f, 1651.1329f, 1850.2976f, 2200.5942f,
+  2484.7026f, 2872.6968f, 3092.8455f, 3373.5869f, 3707.5891f, 4180.1289f,
+  4603.5298f, 5132.2671f, 5554.7617f, 5973.5220f, 700.5439f,  1363.5277f,
+  1745.2494f, 2081.9539f, 2379.8628f, 2623.6003f, 2883.6484f, 3133.9824f,
+  3457.7092f, 3819.0100f, 4191.0537f, 4547.0400f, 4912.5127f, 5241.3423f,
+  5594.9395f, 5930.6099f, 268.7704f,  370.8200f,  609.4679f,  1558.5339f,
+  1961.6279f, 2155.8916f, 2419.4485f, 2655.5103f, 3152.6685f, 3426.9221f,
+  3716.8181f, 4107.1616f, 4965.5698f, 5384.2026f, 5706.7183f, 6015.6196f,
+  305.7638f,  395.9599f,  1103.0944f, 1383.6494f, 1612.9742f, 1915.2496f,
+  2189.8008f, 2555.3608f, 2720.8220f, 3038.2434f, 3927.1301f, 4263.0518f,
+  4685.7217f, 4984.1377f, 5272.6162f, 5984.5376f, 294.0385f,  426.7762f,
+  814.5162f,  1056.9037f, 1715.3539f, 2005.3177f, 2316.4392f, 2647.4297f,
+  2893.8242f, 3196.7476f, 3720.0044f, 4186.9790f, 4840.4512f, 5290.1250f,
+  5684.2139f, 5967.5859f, 359.5141f,  517.6051f,  807.4898f,  1143.5930f,
+  1328.1393f, 1814.7098f, 2309.8894f, 2618.8655f, 3160.5962f, 3445.0479f,
+  3883.2664f, 4235.5200f, 4718.7324f, 5367.3608f, 5765.9331f, 6034.9233f,
+  241.5752f,  375.5109f,  818.8776f,  1298.7773f, 1656.9050f, 2169.8962f,
+  2565.1440f, 3015.9919f, 3437.9463f, 3863.8203f, 4254.4023f, 4637.0952f,
+  5027.8252f, 5358.3784f, 5685.5000f, 5980.4063f, 322.5406f,  454.9644f,
+  963.3659f,  1513.8885f, 1704.5070f, 2235.6599f, 2523.6467f, 2995.0757f,
+  3287.8682f, 3552.8811f, 3872.4360f, 4201.2227f, 4571.9087f, 5066.6792f,
+  5562.1206f, 5935.7900f, 412.5748f,  615.8419f,  1126.9519f, 1455.5172f,
+  1653.3076f, 1965.2689f, 2240.6904f, 2672.5129f, 3127.3301f, 3477.8540f,
+  3983.6145f, 4458.6558f, 4896.7998f, 5237.9814f, 5609.1597f, 5939.6416f,
+  342.1361f,  470.6100f,  958.3576f,  1195.0166f, 1426.4667f, 1684.2009f,
+  2194.0950f, 2545.9453f, 2946.1851f, 3415.2820f, 3657.4158f, 4408.6763f,
+  5097.2251f, 5404.2202f, 5719.9829f, 5977.7959f, 297.8767f,  386.6347f,
+  1095.8346f, 1454.3085f, 1651.6417f, 1927.9633f, 2198.4927f, 2583.1694f,
+  2757.0144f, 3009.6497f, 3310.9514f, 3956.9753f, 4677.3208f, 5122.2222f,
+  5539.0688f, 5993.0542f, 334.7170f,  450.1582f,  747.3162f,  1560.2024f,
+  1808.2147f, 2006.5011f, 2415.2419f, 2680.1956f, 3016.5549f, 3651.1340f,
+  3975.3625f, 4209.6563f, 4531.0396f, 5121.7212f, 5585.2202f, 5962.3667f,
+  256.4101f,  495.5723f,  1341.4860f, 1805.1255f, 2201.8318f, 2514.7769f,
+  2820.4092f, 3102.3867f, 3414.3872f, 3754.7742f, 4108.2378f, 4465.9258f,
+  4857.4355f, 5216.2144f, 5592.3076f, 5951.9995f, 530.7974f,  1017.4255f,
+  1463.9575f, 1858.6631f, 2360.1265f, 2770.3811f, 3106.0894f, 3379.1919f,
+  3647.7175f, 3895.9026f, 4188.8652f, 4522.8984f, 4893.7954f, 5241.4312f,
+  5623.8994f, 5975.3608f, 597.1553f,  1198.0758f, 1722.7361f, 2128.6658f,
+  2519.1504f, 2825.5122f, 3086.1943f, 3330.0283f, 3608.2961f, 3906.9929f,
+  4241.8105f, 4603.1694f, 4972.8159f, 5308.1670f, 5651.1968f, 5976.6704f,
+  699.1581f,  1293.3193f, 1637.3395f, 1912.7987f, 2163.3445f, 2425.7944f,
+  2704.0396f, 3006.5984f, 3358.2126f, 3746.1548f, 4125.0762f, 4489.7485f,
+  4854.0088f, 5188.5146f, 5558.2056f, 5913.3164f, 489.0107f,  921.4806f,
+  1329.8511f, 1644.8383f, 2013.6794f, 2365.2683f, 2746.1553f, 3085.6912f,
+  3457.0234f, 3825.2183f, 4203.4224f, 4575.9331f, 4950.6606f, 5298.7559f,
+  5659.8618f, 5997.0015f, 230.3653f,  389.8415f,  938.1970f,  1294.3594f,
+  1768.8275f, 2189.1001f, 2597.3755f, 2985.8518f, 3323.6023f, 3705.8533f,
+  4065.5361f, 4446.4224f, 4818.4502f, 5185.9634f, 5583.2168f, 5954.2573f,
+  283.9404f,  400.2146f,  630.6198f,  1491.5646f, 2295.1375f, 2496.3457f,
+  2726.5803f, 2971.1951f, 3207.2317f, 3634.5439f, 4178.0376f, 4423.5537f,
+  4836.2109f, 5172.1821f, 5464.0454f, 5777.5801f, 242.6232f,  351.1541f,
+  807.9852f,  1621.9950f, 2043.8676f, 2532.5122f, 2860.5505f, 3200.3403f,
+  3499.8274f, 3760.3772f, 4068.9617f, 4410.7339f, 4778.8413f, 5153.0142f,
+  5553.1997f, 5932.5996f, 227.3320f,  323.2667f,  752.3189f,  1572.3750f,
+  1930.6083f, 2355.0117f, 2717.6223f, 2968.3215f, 3233.4026f, 3551.9622f,
+  3918.5608f, 4346.0190f, 4778.6880f, 5159.6172f, 5568.5566f, 5980.8086f,
+  307.9120f,  439.7297f,  660.0276f,  1243.3854f, 1532.3577f, 1796.3936f,
+  2437.3232f, 2691.4072f, 3030.3025f, 3524.1379f, 3771.7576f, 4083.2375f,
+  4601.1567f, 4963.4697f, 5434.8530f, 5942.8315f};
 
-const WORD8 ixheaacd_mps_dig_rev[16] = {0, 8,  16, 24, 2, 10, 18, 26,
-                                        4, 12, 20, 28, 6, 14, 22, 30};
\ No newline at end of file
+const WORD8 ixheaacd_mps_dig_rev[8] = {0, 4, 8, 12, 2, 6, 10, 14};
diff --git a/decoder/ixheaacd_sbr_const.h b/decoder/ixheaacd_sbr_const.h
index ecf3478..b09c3c2 100644
--- a/decoder/ixheaacd_sbr_const.h
+++ b/decoder/ixheaacd_sbr_const.h
@@ -97,9 +97,13 @@
 #define MAX_NUM_QMF_BANDS_ESBR 128
 
 #define SBR_HF_ADJ_OFFSET 2
-#define MPS_SBR_DELAY 6 /* 6 qmf samples */
+#define MPS_SBR_DELAY (6)
 
-#define ESBR_HBE_DELAY_OFFSET 32 /* 32 qmf samples */
+#define MPS_SBR_DELAY_960 5
+
+#define ESBR_HBE_DELAY_OFFSET (32)
+
+#define ESBR_HBE_DELAY_OFFSET_960 30
 
 #define HBE_OPER_WIN_LEN (13)
 #define NO_QMF_SYNTH_CHANNELS 64
@@ -108,9 +112,10 @@
 #define MAX_NO_COLS_VALUE 64
 #define MAX_NO_COLS_VALUE_BY_2 (MAX_NO_COLS_VALUE >> 1)
 
-#define MAX_QMF_X_INBUF_SIZE (MAX_NO_COLS_VALUE_BY_2 + HBE_OPER_WIN_LEN - 1)
+#define MAX_QMF_X_INBUF_SIZE MAX_NO_COLS_VALUE
 #define MAX_QMF_X_OUTBUF_SIZE \
-  2 * (MAX_NO_COLS_VALUE_BY_2 + HBE_OPER_WIN_LEN - 1)
+  2 * MAX_QMF_X_INBUF_SIZE
+
 #define MAX_QMF_X_IN_REAL_BUF (NO_QMF_SYNTH_CHANNELS * MAX_QMF_X_INBUF_SIZE)
 #define MAX_QMF_X_IN_IMAG_BUF (NO_QMF_SYNTH_CHANNELS * MAX_QMF_X_INBUF_SIZE)
 
diff --git a/decoder/ixheaacd_sbr_dec.c b/decoder/ixheaacd_sbr_dec.c
index 671f4d6..2a73ed8 100644
--- a/decoder/ixheaacd_sbr_dec.c
+++ b/decoder/ixheaacd_sbr_dec.c
@@ -41,6 +41,9 @@
 
 #include "ixheaacd_drc_data_struct.h"
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
@@ -285,10 +288,6 @@
       ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] =
           ((FLOAT32)ploc_qmf_buf_imag[z] * gain);
     }
-    for (z = core_syn_ch_index; z < num_columns; z++) {
-      ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] = (FLOAT32)0.0f;
-      ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = (FLOAT32)0.0f;
-    }
   }
 
   pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1;
@@ -449,18 +448,11 @@
     ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data,
     ia_sbr_frame_info_data_struct *ptr_frame_data, WORD32 apply_processing,
     FLOAT32 **qmf_buf_real, FLOAT32 **qmf_buf_imag, WORD32 stereo_config_idx,
-    ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac) {
-  if (!mps_sbr_flag) {
-    ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
-                                  ptr_sbr_dec, ptr_frame_data, ptr_header_data,
-                                  stereo_config_idx, apply_processing);
-  } else {
-    ixheaacd_mps_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
-                                      ptr_sbr_dec, stereo_config_idx);
-  }
+    ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac,
+    WORD32 ps_enable, WORD32 skip_re_grouping, ia_ps_dec_struct *ptr_ps_dec,
+    FLAG drc_on, WORD32 drc_sbr_factors[][64]) {
 
-  if (stereo_config_idx <= 0) {
-    WORD32 i, k, p1;
+    WORD32 i, k;
     WORD32 *ptr_filt_states;
     WORD32 *ptr_filt_states_1;
     WORD32 *ptr_filt_states_2;
@@ -468,39 +460,132 @@
     WORD32 *ploc_qmf_buf_real;
     WORD32 *ploc_qmf_buf_imag;
     WORD32 out_scalefactor;
-    WORD32 sixty4;
+    WORD32 sixty4, thrity2;
     WORD32 no_synthesis_channels;
     WORD32 ixheaacd_drc_offset;
     FLOAT32 *syn_buffer;
     WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local;
     WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]);
+  FLOAT32 *time_sample_buf;
+  if (ps_enable) {
+    time_sample_buf = ptr_ps_dec->time_sample_buf[0];
+  } else {
+    time_sample_buf = ptr_sbr_dec->time_sample_buf;
+  }
     ia_sbr_qmf_filter_bank_struct *qmf_bank =
         &ptr_sbr_dec->str_synthesis_qmf_bank;
     ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
         sbr_tables_ptr->qmf_dec_tables_ptr;
+
+  if (!skip_re_grouping) {
+    if (!mps_sbr_flag) {
+      ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
+                                    ptr_sbr_dec, ptr_frame_data, ptr_header_data,
+                                    stereo_config_idx, apply_processing);
+      if (ps_enable) {
+        FLOAT32 factor = 1.0f;
+        for (i = ptr_ps_dec->num_sub_samples;i < (WORD32)ptr_ps_dec->num_sub_samples + 6;i++) {
+          for (k = 0; k < 5; k++)
+          {
+            if (drc_on)
+            {
+              if (ptr_sbr_dec->str_codec_qmf_bank.num_time_slots == 30)
+              {
+                factor = (FLOAT32)drc_sbr_factors[i + 30 - 25][k] / Q25;
+              }
+              else
+              {
+                factor = (FLOAT32)drc_sbr_factors[i + 32 - 26][k] / Q25;
+              }
+            }
+            ptr_ps_dec->pp_qmf_buf_real[0][i][k] =
+              factor * ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
+            ptr_ps_dec->pp_qmf_buf_imag[0][i][k] =
+              factor * ptr_sbr_dec->qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
+          }
+        }
+      }
+      if (ps_enable && apply_processing) {
+        WORD32 usb = ptr_header_data->pstr_freq_band_data->sub_band_end;
+
+        ixheaacd_esbr_apply_ps(ptr_ps_dec,
+                               ptr_ps_dec->pp_qmf_buf_real[0],
+                               ptr_ps_dec->pp_qmf_buf_imag[0],
+                               ptr_ps_dec->pp_qmf_buf_real[1],
+                               ptr_ps_dec->pp_qmf_buf_imag[1],
+                               usb, sbr_tables_ptr->ps_tables_ptr,
+                               ptr_header_data->num_time_slots);
+      } else if (ps_enable) {
+        for (i = 0; i < (ptr_header_data->num_time_slots * 2); i++) {
+          for (k = 0; k < 64; k++) {
+            ptr_ps_dec->pp_qmf_buf_real[1][i][k] = ptr_ps_dec->pp_qmf_buf_real[0][i][k];
+            ptr_ps_dec->pp_qmf_buf_imag[1][i][k] = ptr_ps_dec->pp_qmf_buf_imag[0][i][k];
+          }
+        }
+      }
+    } else {
+      ixheaacd_mps_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
+                                        ptr_sbr_dec, stereo_config_idx);
+    }
+  } else {
+    if (ps_enable) {
+      time_sample_buf = ptr_ps_dec->time_sample_buf[1];
+    }
+  }
+
+  if (drc_on)
+  {
+    FLOAT32 factor = 1.0f;
+    for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++)
+    {
+      for (k = 0; k < 64; k++)
+      {
+        if (ptr_sbr_dec->str_codec_qmf_bank.num_time_slots == 30)
+        {
+          factor = (FLOAT32)drc_sbr_factors[i + 30 - 25][k] / Q25;
+        }
+        else
+        {
+          factor = (FLOAT32)drc_sbr_factors[i + 32 - 26][k] / Q25;
+        }
+        qmf_buf_real[i][k] *= factor;
+        qmf_buf_imag[i][k] *= factor;
+      }
+    }
+  }
+
+  if (stereo_config_idx <= 0) {
     out_scalefactor = 5;
-    qmf_bank->no_channels = 64;
-    qmf_bank->esbr_cos_twiddle =
+    no_synthesis_channels = qmf_bank->no_channels;
+    sixty4 = NO_SYNTHESIS_CHANNELS;
+    thrity2 = qmf_bank->no_channels;
+
+    if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED)
+    {
+        qmf_bank->esbr_cos_twiddle =
+          (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
+        qmf_bank->esbr_alt_sin_twiddle =
+          (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
+    }
+    else
+    {
+      qmf_bank->esbr_cos_twiddle =
         (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64;
-    qmf_bank->esbr_alt_sin_twiddle =
+      qmf_bank->esbr_alt_sin_twiddle =
         (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64;
+    }
 
     qmf_bank->filter_pos_syn_32 +=
         qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32;
     qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c;
 
-    sixty4 = NO_SYNTHESIS_CHANNELS;
-
     ptr_filt_states = qmf_bank->filter_states_32;
 
-    no_synthesis_channels = qmf_bank->no_channels;
     ptr_filt_states_1 = &ptr_filt_states[0];
     ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels;
 
     filter_l = qmf_bank->filter_pos_syn_32;
 
-    p1 = 0;
-
     ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset;
 
     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
@@ -513,34 +598,58 @@
 
       ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real,
                                    &ptr_sbr_dec->str_synthesis_qmf_bank,
-                                   sbr_tables_ptr->qmf_dec_tables_ptr);
+                                   sbr_tables_ptr->qmf_dec_tables_ptr,
+                                   no_synthesis_channels);
 
       ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag,
                                          &ptr_filt_states[ixheaacd_drc_offset],
                                          no_synthesis_channels,
                                          out_scalefactor + 1);
 
-      ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2,
-                                    filter_l, &time_out[0], ch_fac);
+      if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED) {
+        ixheaacd_esbr_qmfsyn32_winadd(ptr_filt_states_1, ptr_filt_states_2,
+                                      filter_l, &time_out[0], ch_fac);
 
-      syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64;
-      for (k = 0; k < 64; k++) {
-        syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
+        if (!mps_sbr_flag) {
+          syn_buffer = time_sample_buf + i * 32;
+        } else {
+          syn_buffer = ptr_sbr_dec->time_sample_buf + i * 32;
+        }
+        for (k = 0; k < 32; k++) {
+          syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
+        }
+
+        ptr_filt_states_1 += thrity2;
+        ptr_filt_states_2 -= thrity2;
+        thrity2 = -thrity2;
+        ixheaacd_drc_offset -= 64;
+
+        if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 640;
+      } else {
+        ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2,
+                                      filter_l, &time_out[0], ch_fac);
+
+        if (!mps_sbr_flag) {
+          syn_buffer = time_sample_buf + i * 64;
+        } else {
+          syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64;
+        }
+        for (k = 0; k < 64; k++) {
+          syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
+        }
+
+        ptr_filt_states_1 += sixty4;
+        ptr_filt_states_2 -= sixty4;
+        sixty4 = -sixty4;
+        ixheaacd_drc_offset -= 128;
+
+        if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280;
       }
 
-      ptr_filt_states_1 += sixty4;
-      ptr_filt_states_2 -= sixty4;
-      sixty4 = -sixty4;
-      ixheaacd_drc_offset -= 128;
-
-      if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280;
-
       filter_l += 64;
 
       if (filter_l == qmf_bank->p_filter_32 + 640)
         filter_l = (WORD32 *)qmf_bank->p_filter_32;
-
-      p1 += no_synthesis_channels;
     }
 
     qmf_bank->filter_pos_syn_32 = filter_l;
@@ -548,31 +657,23 @@
   }
 
   if (!mps_sbr_flag) ptr_frame_data->reset_flag = 0;
-
-  if (apply_processing && !mps_sbr_flag) {
-    ptr_header_data->pstr_freq_band_data->qmf_sb_prev =
-        ptr_header_data->pstr_freq_band_data->sub_band_start;
-  }
 }
 
-WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
-                        ia_sbr_header_data_struct *ptr_header_data,
-                        ia_sbr_frame_info_data_struct *ptr_frame_data,
-                        ia_sbr_prev_frame_data_struct *ptr_frame_data_prev,
-                        ia_ps_dec_struct *ptr_ps_dec,
-                        ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r,
-                        ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
-                        FLAG apply_processing, FLAG low_pow_flag,
-                        WORD32 *ptr_work_buf_core,
-                        ia_sbr_tables_struct *sbr_tables_ptr,
-                        ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
-                        ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on,
-                        WORD32 drc_sbr_factors[][64],
-                        WORD32 audio_object_type) {
-  WORD i;
+WORD32 ixheaacd_sbr_dec(
+    ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
+    ia_sbr_header_data_struct *ptr_header_data, ia_sbr_frame_info_data_struct *ptr_frame_data,
+    ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, ia_ps_dec_struct *ptr_ps_dec,
+    ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
+    FLAG apply_processing, FLAG low_pow_flag, WORD32 *ptr_work_buf_core,
+    ia_sbr_tables_struct *sbr_tables_ptr, ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
+    ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on, WORD32 drc_sbr_factors[][64],
+    WORD32 audio_object_type, WORD32 ldmps_present, VOID *self, WORD32 heaac_mps_present,
+    WORD32 ec_flag) {
+  WORD i, j, k;
   WORD slot, reserve;
   WORD save_lb_scale;
   WORD op_delay;
+  IA_ERRORCODE err_code = IA_NO_ERROR;
 
   WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS] = {0};
   WORD32 *p_arr_qmf_buf_imag[MAX_ENV_COLS] = {0};
@@ -589,9 +690,17 @@
   WORD stereo_config_idx = ptr_frame_data->stereo_config_idx;
   WORD sbr_mode = ptr_frame_data->sbr_mode;
   WORD usac_flag = ptr_header_data->usac_flag;
+  WORD add_slot = 0;
 
   FLOAT32 *pvc_qmf_enrg_arr = (FLOAT32 *)ptr_sbr_dec->pvc_qmf_enrg_arr;
 
+  WORD32 dft_hbe_flag = ptr_header_data->esbr_hq;
+  WORD32 esbr_hbe_delay_offsets;
+  if (ptr_header_data->num_time_slots == 15)
+    esbr_hbe_delay_offsets = ESBR_HBE_DELAY_OFFSET_960;
+  else
+    esbr_hbe_delay_offsets = ESBR_HBE_DELAY_OFFSET;
+
   memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
   memset(pvc_qmf_enrg_arr, 0, 512 * sizeof(FLOAT32));
   if (audio_object_type == AOT_ER_AAC_ELD) {
@@ -599,7 +708,11 @@
   } else {
     op_delay = 6;
   }
-  if (usac_flag) {
+
+  if (ldmps_present == 1) add_slot = SBR_HF_ADJ_OFFSET;
+
+  if (!((audio_object_type == AOT_ER_AAC_ELD) || (audio_object_type == AOT_ER_AAC_LD))) {
+    ch_fac = 1;
     pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real;
     pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
@@ -609,13 +722,27 @@
 
   no_bins = (ptr_header_data->num_time_slots * ptr_header_data->time_step);
 
-  if (!usac_flag) {
+  if ((audio_object_type == AOT_ER_AAC_ELD) ||
+      (audio_object_type == AOT_ER_AAC_LD)) {
     WORD32 num = op_delay;
     WORD32 *ptr_pers_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf;
     WORD32 *p_scr_qmf_real = ptr_work_buf_core + (2 << (6 + !low_pow_flag));
 
-    if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS))
-      return -1;
+    if (ptr_header_data->num_time_slots != 15) {
+      if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS)) {
+        if (ec_flag)
+          no_bins = LPC_ORDER;
+        else
+          return -1;
+      }
+    } else {
+      if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS_960)) {
+        if (ec_flag)
+          no_bins = LPC_ORDER;
+        else
+          return -1;
+      }
+    }
 
     if (!low_pow_flag) {
       num = num << 1;
@@ -626,7 +753,7 @@
     }
     ptr = p_scr_qmf_real;
 
-    for (slot = 0; slot < op_delay + no_bins; slot++) {
+    for (slot = 0; slot < op_delay + no_bins + add_slot; slot++) {
       p_arr_qmf_buf_real[slot] = ptr;
       ptr += NO_SYNTHESIS_CHANNELS;
 
@@ -645,37 +772,45 @@
     }
   }
 
-  if (usac_flag) {
+  if ((audio_object_type == AOT_AAC_LC) && (heaac_mps_present == 1)) {
     WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
-    WORD32 codec_x_delay = 0;
-    WORD32 core_syn_ch_index = 0;
-    WORD32 frame_move = 288;
+    WORD32 frame_move = 9 * num_anal_bands;
     WORD32 core_frame_size = ptr_header_data->core_frame_size;
 
-    if (hbe_flag) {
-      codec_x_delay = ESBR_HBE_DELAY_OFFSET;
+    memcpy(&ptr_sbr_dec->core_sample_buf[core_frame_size],
+           &ptr_sbr_dec->time_sample_buf[core_frame_size - frame_move],
+           frame_move * sizeof(FLOAT32));
+
+    memmove(&ptr_sbr_dec->time_sample_buf[frame_move], &ptr_sbr_dec->time_sample_buf[0],
+            (core_frame_size - frame_move));
+
+    memcpy(&ptr_sbr_dec->time_sample_buf[0], &ptr_sbr_dec->core_sample_buf[0],
+           frame_move * sizeof(FLOAT32));
+
+    memcpy(&ptr_sbr_dec->core_sample_buf[0], &ptr_sbr_dec->core_sample_buf[core_frame_size],
+           frame_move * sizeof(FLOAT32));
+  }
+
+
+  if ((audio_object_type != AOT_ER_AAC_ELD) &&
+      (audio_object_type != AOT_ER_AAC_LD)) {
+    WORD32 codec_x_delay = 0;
+
+    if (hbe_flag || !usac_flag) {
+      codec_x_delay = esbr_hbe_delay_offsets;
     }
     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
       codec_x_delay = 2 * codec_x_delay;
     }
     /* fixed decoder delay for bitstreams with SBR 4:1 and stereoConfigIndex 3
      */
-    if (mps_sbr_flag) op_delay = MPS_SBR_DELAY;
-
-    if (hbe_flag || mps_sbr_flag) {
-      core_syn_ch_index = num_anal_bands;
+    if (ptr_header_data->num_time_slots != 15) {
+      if (mps_sbr_flag) op_delay = MPS_SBR_DELAY;
     } else {
-      core_syn_ch_index = ptr_header_data->pstr_freq_band_data->sub_band_start;
+      if (mps_sbr_flag) op_delay = MPS_SBR_DELAY_960;
     }
 
-    frame_move = 9 * num_anal_bands;
-
-    memmove(ptr_sbr_dec->core_sample_buf,
-            ptr_sbr_dec->core_sample_buf + core_frame_size,
-            frame_move * sizeof(FLOAT32));
-    memcpy(&ptr_sbr_dec->core_sample_buf[frame_move],
-           &ptr_sbr_dec->time_sample_buf[0], core_frame_size * sizeof(FLOAT32));
-
+    {
     memmove(
         &ptr_sbr_dec->qmf_buf_real[0][0],
         &ptr_sbr_dec
@@ -708,50 +843,76 @@
               ptr_sbr_dec->ph_vocod_qmf_imag +
                   ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
+        if (!usac_flag) {
+          WORD32 qmf_sb_prev = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
+          for (i = SBR_HF_ADJ_OFFSET; i < op_delay + SBR_HF_ADJ_OFFSET; ++i) {
+            memset(&ptr_sbr_dec->qmf_buf_real[i][qmf_sb_prev], 0, (64 - qmf_sb_prev));
+            memset(&ptr_sbr_dec->qmf_buf_imag[i][qmf_sb_prev], 0, (64 - qmf_sb_prev));
+          }
+        }
+      }
     }
     ixheaacd_esbr_analysis_filt_block(
         ptr_sbr_dec, sbr_tables_ptr,
         op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET);
 
-    if (hbe_flag) {
-      WORD32 err_code = ixheaacd_qmf_hbe_apply(
+    if (hbe_flag && apply_processing) {
+      if (dft_hbe_flag == 1) {
+        WORD32 err_code = 0;
+        ptr_sbr_dec->p_hbe_txposer->oversampling_flag =
+            ptr_frame_data->over_sampling_flag;
+        err_code = ixheaacd_dft_hbe_apply(
           ptr_sbr_dec->p_hbe_txposer,
           ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
-              ESBR_HBE_DELAY_OFFSET,
+          esbr_hbe_delay_offsets,
           ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
-              ESBR_HBE_DELAY_OFFSET,
+          esbr_hbe_delay_offsets,
           ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
           ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
           ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
-          ptr_frame_data->pitch_in_bins);
-      if (err_code) return err_code;
+          ptr_frame_data->pitch_in_bins, (FLOAT32 *)ptr_work_buf_core);
+        if (err_code) return err_code;
+      } else {
+          WORD32 err_code = ixheaacd_qmf_hbe_apply(
+              ptr_sbr_dec->p_hbe_txposer,
+              ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
+              esbr_hbe_delay_offsets,
+              ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
+              esbr_hbe_delay_offsets,
+              ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
+              ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
+              ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
+              ptr_frame_data->pitch_in_bins, ptr_header_data);
+          if (err_code) return err_code;
 
-      if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
-        ixheaacd_hbe_repl_spec(
-            &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
-            ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
-            ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
-            ptr_sbr_dec->p_hbe_txposer->max_stretch);
+        if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
+          ixheaacd_hbe_repl_spec(
+              &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
+              ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
+              ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
+              ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
+              ptr_sbr_dec->p_hbe_txposer->max_stretch);
+        }
       }
     }
-    ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
-
     if (!mps_sbr_flag && apply_processing) {
-      WORD32 err_code = 0;
-      err_code = ixheaacd_generate_hf(
-          ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
-          ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
-          ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
-          ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
-          ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
-          ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), ptr_frame_data,
-          ptr_header_data);
+      err_code = ixheaacd_generate_hf(ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
+                                      ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
+                                      ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
+                                      ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
+                                      ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
+                                      ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
+                                      ptr_frame_data, ptr_header_data, ldmps_present,
+                                      ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
       if (err_code) return err_code;
 
       ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac;
 
       if (sbr_mode == PVC_SBR) {
+        ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
+        if (ec_flag) {
+          ptr_pvc_data->pvc_mode = 1;
+        }
         err_code = ixheaacd_pvc_process(
             ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start,
             ptr_frame_data->str_pvc_frame_info.border_vec[0],
@@ -775,10 +936,9 @@
           ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
           ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
           ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
-          (ptr_header_data->hbe_flag == 0)
-              ? NULL
-              : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
-          ptr_sbr_dec->scratch_buff, pvc_dec_out_buf);
+          (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
+          ptr_sbr_dec->scratch_buff, pvc_dec_out_buf, ldmps_present, ec_flag);
+
       if (err_code) return err_code;
 
     } else {
@@ -788,22 +948,83 @@
       }
     }
 
+    if (!mps_sbr_flag) {
+      ptr_sbr_dec->band_count =
+          ptr_header_data->pstr_freq_band_data->sub_band_end;
+    } else
+      ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
+
     ixheaacd_esbr_synthesis_filt_block(
         ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
         pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr,
-        mps_sbr_flag, ch_fac);
+        mps_sbr_flag, ch_fac,
+        ((ptr_header_data->channel_mode == PS_STEREO) || ptr_header_data->enh_sbr_ps),
+        0, ptr_ps_dec, drc_on, drc_sbr_factors);
 
+    if (ptr_header_data->enh_sbr_ps || ptr_header_data->channel_mode == PS_STEREO) {
+      pp_qmf_buf_real = ptr_ps_dec->pp_qmf_buf_real[1];
+      pp_qmf_buf_imag = ptr_ps_dec->pp_qmf_buf_imag[1];
+      ixheaacd_esbr_synthesis_filt_block(
+          (ia_sbr_dec_struct *)
+          (&(((ia_handle_sbr_dec_inst_struct)self)->pstr_sbr_channel[1]->str_sbr_dec)),
+          (ia_sbr_header_data_struct *)
+          (&(((ia_handle_sbr_dec_inst_struct)self)->pstr_sbr_header[1])),
+          (ia_sbr_frame_info_data_struct *)
+          (&(((ia_handle_sbr_dec_inst_struct)self)->frame_buffer[1])), apply_processing,
+          pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr,
+          mps_sbr_flag, ch_fac,
+          ((ptr_header_data->channel_mode == PS_STEREO) || ptr_header_data->enh_sbr_ps),
+          1, ptr_ps_dec, drc_on, drc_sbr_factors);
+    }
+    if (apply_processing && ec_flag) {
+      WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec;
+      ptr_frame_data_prev->end_position =
+          border_vec[ptr_frame_data->str_frame_info_details.num_env];
+    }
     ptr_frame_data->prev_sbr_mode = sbr_mode;
 
     return 0;
   }
 
-  ixheaacd_cplx_anal_qmffilt(
-      ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact,
-      &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay],
-      &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr,
-      ch_fac, low_pow_flag, audio_object_type);
+  if (ldmps_present) {
+    if (ptr_sbr_dec->str_codec_qmf_bank.no_channels > 32) {
+      if (ec_flag) {
+        ptr_sbr_dec->str_codec_qmf_bank.no_channels = 32;
+      } else {
+        return IA_FATAL_ERROR;
+      }
+    }
+    ixheaacd_cplx_anal_qmffilt_32(
+        (WORD32 *)ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact,
+        &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay],
+        &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr,
+        ch_fac, 1);
+  } else {
+    ixheaacd_cplx_anal_qmffilt(
+        ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, &p_arr_qmf_buf_real[op_delay],
+        &p_arr_qmf_buf_imag[op_delay], &ptr_sbr_dec->str_codec_qmf_bank,
+        sbr_tables_ptr->qmf_dec_tables_ptr, ch_fac, low_pow_flag, audio_object_type);
+  }
 
+  if (ldmps_present == 1) {
+    for (j = SBR_HF_ADJ_OFFSET;
+         j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + SBR_HF_ADJ_OFFSET;
+         j++) {
+      for (k = 0; k < 64; k++) {
+        WORD32 scale = 7;
+        ptr_sbr_dec->mps_qmf_buf_real[j][k] = 0.0f;
+        ptr_sbr_dec->mps_qmf_buf_imag[j][k] = 0.0f;
+        if (k < ptr_sbr_dec->str_codec_qmf_bank.usb) {
+          ptr_sbr_dec->mps_qmf_buf_real[j][k] +=
+              (FLOAT32)(p_arr_qmf_buf_real[j][k] / (FLOAT32)(1 << scale));
+          ptr_sbr_dec->mps_qmf_buf_imag[j][k] +=
+              (FLOAT32)(p_arr_qmf_buf_imag[j][k] / (FLOAT32)(1 << scale));
+        }
+      }
+    }
+  }
+  /*ITTIAM : the size of real and img coeff are not same as that of the mps
+   * analysis.*/
   {
     WORD shift1, shift2;
     WORD min_shift;
@@ -886,7 +1107,6 @@
   if (apply_processing) {
     WORD16 degree_alias[NO_SYNTHESIS_CHANNELS];
     WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec;
-    IA_ERRORCODE error_code = IA_NO_ERROR;
 
     if (low_pow_flag) {
       memset(degree_alias, 0, NO_SYNTHESIS_CHANNELS * sizeof(WORD16));
@@ -913,27 +1133,57 @@
       ptr_sbr_dec->str_sbr_scale_fact.hb_scale =
           (WORD16)(com_low_band_scale - 2);
     } else {
-      ixheaacd_hf_generator(
-          &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact,
-          p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step,
-          border_vec[0],
-          ixheaacd_sub16_sat(
-              border_vec[ptr_frame_data->str_frame_info_details.num_env],
-              ptr_header_data->num_time_slots),
-          ptr_header_data->pstr_freq_band_data->num_if_bands,
-          ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode,
-          ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core,
-          audio_object_type);
+      if (ldmps_present == 1) {
+        err_code = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + (SBR_HF_ADJ_OFFSET),
+                                        ptr_sbr_dec->mps_qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
+                                        ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
+                                        ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
+                                        ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
+                                        ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
+                                        ptr_frame_data, ptr_header_data, ldmps_present,
+                                        ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
+        if (err_code) return err_code;
+      } else {
+        ixheaacd_hf_generator(
+            &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact,
+            p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step,
+            border_vec[0],
+            ixheaacd_sub16_sat(
+                border_vec[ptr_frame_data->str_frame_info_details.num_env],
+                ptr_header_data->num_time_slots),
+            ptr_header_data->pstr_freq_band_data->num_if_bands,
+            ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode,
+            ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core,
+            audio_object_type);
+      }
     }
+    if (ldmps_present == 1) {
+      ptr_frame_data->pstr_sbr_header = ptr_header_data;
+      err_code = ixheaacd_sbr_env_calc(
+          ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
+          ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
+          ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
+          ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL, ptr_sbr_dec->scratch_buff,
+          pvc_dec_out_buf, ldmps_present, ec_flag);
 
-    error_code = ixheaacd_calc_sbrenvelope(
-        &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env,
-        ptr_header_data, ptr_frame_data, ptr_frame_data_prev,
-        p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag,
-        sbr_tables_ptr, pstr_common_tables,
-        ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)),
-        audio_object_type);
-    if (error_code) return error_code;
+      for (j = 0; j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + 2; j++) {
+        for (k = ptr_sbr_dec->str_codec_qmf_bank.usb; k < 64; k++) {
+          ptr_sbr_dec->mps_qmf_buf_real[j][k] +=
+              ptr_sbr_dec->sbr_qmf_out_real[j][k];
+          ptr_sbr_dec->mps_qmf_buf_imag[j][k] +=
+              ptr_sbr_dec->sbr_qmf_out_imag[j][k];
+        }
+      }
+    } else {
+      err_code = ixheaacd_calc_sbrenvelope(
+          &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env,
+          ptr_header_data, ptr_frame_data, ptr_frame_data_prev,
+          p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag,
+          sbr_tables_ptr, pstr_common_tables,
+          ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)),
+          audio_object_type);
+      if (err_code) return err_code;
+    }
 
     memcpy(ptr_frame_data_prev->sbr_invf_mode, ptr_frame_data->sbr_invf_mode,
            ptr_header_data->pstr_freq_band_data->num_if_bands * sizeof(WORD32));
@@ -1015,6 +1265,18 @@
 
     memcpy(p_loc_qmf_real, p_loc_qmf_real_1,
            sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num);
+
+    if (ldmps_present == 1) {
+      memmove(&ptr_sbr_dec->mps_qmf_buf_real[0][0],
+              &ptr_sbr_dec->mps_qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank
+                                                 .num_time_slots][0],
+              SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64);
+
+      memmove(&ptr_sbr_dec->mps_qmf_buf_imag[0][0],
+              &ptr_sbr_dec->mps_qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank
+                                                 .num_time_slots][0],
+              SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64);
+    }
   }
 
   ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale = save_lb_scale;
@@ -1035,9 +1297,7 @@
   FLOAT32 **pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
 
   WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
-  WORD32 core_frame_size = ptr_header_data->core_frame_size;
 
-  WORD32 no_bins;
   WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
   WORD32 stereo_config_idx = ptr_frame_data->stereo_config_idx;
   WORD32 hbe_flag = ptr_header_data->hbe_flag;
@@ -1048,12 +1308,8 @@
     op_delay = 2 * 6;
   }
 
-  no_bins = ptr_sbr_dec->str_codec_qmf_bank.num_time_slots;
-
   ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0;
   {
-    WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
-    WORD32 frame_move = 288;
     if (hbe_flag) {
       codec_x_delay = 32;
     }
@@ -1061,15 +1317,6 @@
       codec_x_delay = 2 * codec_x_delay;
     }
 
-    frame_move = 9 * num_anal_bands;
-
-    memmove(ptr_sbr_dec->core_sample_buf,
-            ptr_sbr_dec->core_sample_buf + core_frame_size,
-            frame_move * sizeof(FLOAT32));
-
-    memcpy(&ptr_sbr_dec->core_sample_buf[frame_move],
-           &ptr_sbr_dec->time_sample_buf[0], core_frame_size * sizeof(FLOAT32));
-
     memmove(
         &ptr_sbr_dec->qmf_buf_real[0][0],
         &ptr_sbr_dec
@@ -1116,7 +1363,7 @@
         ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
         ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
         ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
-        ptr_frame_data->pitch_in_bins);
+        ptr_frame_data->pitch_in_bins, ptr_header_data);
     if (err) return err;
 
     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
@@ -1135,17 +1382,19 @@
     memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32));
   }
 
+  ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
+
   ixheaacd_esbr_synthesis_filt_block(
       ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
       pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, ptr_sbr_tables,
-      mps_sbr_flag, ch_fac);
+      mps_sbr_flag, ch_fac, 0, 0, NULL, 0, NULL);
 
   ptr_frame_data->prev_sbr_mode = sbr_mode;
   return 0;
 }
 
-WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec,
-                                 VOID *p_sbr_frame, VOID *p_sbr_header) {
+WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, VOID *p_sbr_frame,
+                                 VOID *p_sbr_header, WORD32 ec_flag) {
   WORD32 i, k;
   ia_sbr_frame_info_data_struct *ptr_frame_data =
       (ia_sbr_frame_info_data_struct *)p_sbr_frame;
@@ -1168,6 +1417,8 @@
 
   if (!mps_sbr_flag) {
     return 0;
+  } else {
+    ptr_frame_data->cov_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
   }
 
   no_bins = ptr_header_data->output_framesize / 64;
@@ -1210,12 +1461,12 @@
   ptr_header_data->pstr_freq_band_data->qmf_sb_prev =
       ptr_header_data->pstr_freq_band_data->sub_band_start;
 
-  err = ixheaacd_generate_hf(
-      ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
-      ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL,
-      ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
-      ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, ptr_frame_data,
-      ptr_header_data);
+  err = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
+                             ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL,
+                             ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
+                             ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
+                             ptr_frame_data, ptr_header_data, 0,
+                             ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
   if (err) return err;
 
   ptr_frame_data->pstr_sbr_header = ptr_header_data;
@@ -1226,9 +1477,8 @@
       ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
       ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
       ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
-      (ptr_header_data->hbe_flag == 0) ? NULL
-                                       : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
-      ptr_sbr_dec->scratch_buff, NULL);
+      (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
+      ptr_sbr_dec->scratch_buff, NULL, 0, ec_flag);
 
   if (err) return err;
   for (i = 0; i < no_bins; i++) {
diff --git a/decoder/ixheaacd_sbr_dec.h b/decoder/ixheaacd_sbr_dec.h
index 0461d39..f4a2238 100644
--- a/decoder/ixheaacd_sbr_dec.h
+++ b/decoder/ixheaacd_sbr_dec.h
@@ -23,6 +23,11 @@
 #include <setjmp.h>
 
 typedef struct {
+  FLOAT32 real[64][128];
+  FLOAT32 imag[64][128];
+} ia_dft_hbe_anal_coeff;
+
+typedef struct {
   WORD32 x_over_qmf[MAX_NUM_PATCHES];
   WORD32 max_stretch;
   WORD32 core_frame_length;
@@ -54,6 +59,42 @@
 
   VOID (*ixheaacd_cmplx_anal_fft)(FLOAT32 *inp, FLOAT32 *out, WORD32 n_points);
 
+  WORD32 esbr_hq;
+  WORD32 in_hop_size;
+  WORD32 fft_size[2];
+
+  FLOAT32 *anal_window;
+  FLOAT32 *synth_window;
+
+  FLOAT32 *ptr_spectrum;
+  FLOAT32 *ptr_spectrum_tx;
+  FLOAT32 *mag;
+  FLOAT32 *phase;
+  FLOAT32 *ptr_output_buf;
+  WORD32 ana_fft_size[2];
+  WORD32 syn_fft_size[2];
+  WORD32 out_hop_size;
+  WORD32 analy_size;
+  WORD32 x_over_bin[MAX_STRETCH][2];
+  WORD32 a_start;
+
+  FLOAT32 spectrum_buf[1536];
+  FLOAT32 spectrum_transposed_buf[1536];
+  FLOAT32 mag_buf[1536];
+  FLOAT32 phase_buf[1536];
+  FLOAT32 output_buf[4096];
+  FLOAT32 fd_win_buf[3][3][1536];
+
+  FLOAT32 analysis_window_buf[1024];
+  FLOAT32 synthesis_window_buf[1024];
+
+  WORD32 oversampling_flag;
+  ia_dft_hbe_anal_coeff str_dft_hbe_anal_coeff;
+  VOID (*ixheaacd_hbe_anal_fft)(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 sign);
+  VOID (*ixheaacd_hbe_synth_ifft)(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 sign);
+  FLOAT32 *syn_cos_sin_tab;
+  FLOAT32 *ana_cos_sin_tab;
+
 } ia_esbr_hbe_txposer_struct;
 
 typedef struct {
@@ -67,6 +108,7 @@
   ia_sbr_scale_fact_struct str_sbr_scale_fact;
 
   WORD32 max_samp_val;
+  WORD32 band_count;
   ia_esbr_hbe_txposer_struct *p_hbe_txposer;
 
   FLOAT32 core_sample_buf[2624];
@@ -103,6 +145,7 @@
 
 struct ia_sbr_dec_inst_struct {
   ia_ps_dec_struct *pstr_ps_stereo_dec;
+  ia_ps_dec_config_struct str_ps_config_prev;
   FLAG ps_present;
   ia_sbr_channel_struct *pstr_sbr_channel[MAXNRSBRCHANNELS];
   ia_sbr_header_data_struct *pstr_sbr_header[MAXNRSBRCHANNELS];
@@ -123,7 +166,22 @@
   FLAG prev_sbr_mode;
   FLAG inter_tes_flag;
   FLAG aot_usac_flag;
+  WORD32 band_count[MAXNRSBRCHANNELS];
   jmp_buf *xaac_jmp_buf;
+  WORD8 *ptr_mps_data;
+  WORD32 left_mps_bits;
+  WORD32 mps_bits_pos;
+  FLAG esbr_hq;
+  FLAG enh_sbr;
+  FLAG enh_sbr_ps;
+  FLAG eld_sbr;
+  WORD32 num_delay_frames;
+  FLAG sbr_parse_err_flag;
+  FLAG frame_ok;
+  FLAG ec_flag;
+  FLAG first_frame;
+  FLAG prev_usac_independency_flag;
+  FLAG sbr_parse_complete;
 };
 
 typedef struct ia_sbr_pers_struct {
@@ -153,54 +211,75 @@
 
 } ia_sbr_pers_struct;
 
-WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
-                        ia_sbr_header_data_struct *ptr_header_data,
-                        ia_sbr_frame_info_data_struct *ptr_frame_data,
-                        ia_sbr_prev_frame_data_struct *ptr_frame_data_prev,
-                        ia_ps_dec_struct *ptr_ps_dec,
-                        ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r,
-                        ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
-                        FLAG apply_processing, FLAG low_pow_flag,
-                        WORD32 *ptr_work_buf_core,
-                        ia_sbr_tables_struct *sbr_tables_ptr,
-                        ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
-                        ia_pvc_data_struct *ptr_pvc_data_str, FLAG drc_on,
-                        WORD32 drc_sbr_factors[][64], WORD32 audio_object_type);
+WORD32 ixheaacd_sbr_dec(
+    ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
+    ia_sbr_header_data_struct *ptr_header_data, ia_sbr_frame_info_data_struct *ptr_frame_data,
+    ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, ia_ps_dec_struct *ptr_ps_dec,
+    ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
+    FLAG apply_processing, FLAG low_pow_flag, WORD32 *ptr_work_buf_core,
+    ia_sbr_tables_struct *sbr_tables_ptr, ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
+    ia_pvc_data_struct *ptr_pvc_data_str, FLAG drc_on, WORD32 drc_sbr_factors[][64],
+    WORD32 audio_object_type, WORD32 ldmps_present, VOID *self, WORD32 heaac_mps_present,
+    WORD32 ec_flag);
 
 WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table,
                               ia_sbr_channel_struct *ptr_sbr_channel,
                               ia_sbr_header_data_struct *ptr_header_data,
                               WORD16 chan, FLAG down_sample_flag,
                               VOID *sbr_persistent_mem_v, WORD ps_enable,
-                              WORD audio_object_type);
+                              WORD audio_object_type, WORD32 ldmps_present,
+                              WORD32 ldsbr_present);
 
 #define MAX_NUM_QMF_BANDS_ESBR 128
 
-WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec,
-                                 VOID *p_sbr_frame, VOID *p_sbr_header);
+WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, VOID *p_sbr_frame,
+                                 VOID *p_sbr_header, WORD32 ec_flag);
 
 WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *h_hbe_txposer,
                               FLOAT32 qmf_buf_real[][64],
                               FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
                               FLOAT32 pv_qmf_buf_real[][64],
                               FLOAT32 pv_qmf_buf_imag[][64],
-                              WORD32 pitch_in_bins);
+                              WORD32 pitch_in_bins,
+                              ia_sbr_header_data_struct *ptr_header_data);
 
-WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
-                             FLOAT32 input_real[][64], FLOAT32 input_imag[][64],
-                             FLOAT32 input_real1[][64],
-                             FLOAT32 input_imag1[][64],
-                             WORD32 x_over_qmf[MAX_NUM_PATCHES],
-                             FLOAT32 *scratch_buff, FLOAT32 *env_out);
+VOID ixheaacd_hbe_apply_cfftn(FLOAT32 re[], FLOAT32 *scratch, WORD32 n_pass, WORD32 i_sign);
 
-WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64],
-                            FLOAT32 ptr_src_buf_imag[][64],
+VOID ixheaacd_hbe_apply_cfftn_gen(FLOAT32 re[], FLOAT32 *scratch, WORD32 n_pass,
+                                  WORD32 i_sign);
+
+VOID ixheaacd_hbe_apply_fft_288(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 i_sign);
+
+VOID ixheaacd_hbe_apply_ifft_224(FLOAT32 *inp, FLOAT32 *scratch, WORD32 len, WORD32 i_sign);
+
+VOID ixheaacd_hbe_apply_fft_3(FLOAT32 *inp, FLOAT32 *op, WORD32 i_sign);
+
+VOID ixheaacd_hbe_apply_ifft_7(FLOAT32 *inp, FLOAT32 *op);
+
+VOID ixheaacd_hbe_apply_ifft_336(FLOAT32 *inp, FLOAT32 *ptr_scratch, WORD32 len,
+                                 WORD32 i_sign);
+
+WORD32 ixheaacd_dft_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+                              FLOAT32 qmf_buf_real[][64],
+                              FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
+                              FLOAT32 pv_qmf_buf_real[][64],
+                              FLOAT32 pv_qmf_buf_imag[][64],
+                              WORD32 pitch_in_bins,
+                              FLOAT32 *dft_hbe_scratch_buf);
+
+WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 input_real[][64],
+                             FLOAT32 input_imag[][64], FLOAT32 input_real1[][64],
+                             FLOAT32 input_imag1[][64], WORD32 x_over_qmf[MAX_NUM_PATCHES],
+                             FLOAT32 *scratch_buff, FLOAT32 *env_out, WORD32 ldmps_present,
+                             WORD32 ec_flag);
+
+WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], FLOAT32 ptr_src_buf_imag[][64],
                             FLOAT32 ptr_ph_vocod_buf_real[][64],
-                            FLOAT32 ptr_ph_vocod_buf_imag[][64],
-                            FLOAT32 ptr_dst_buf_real[][64],
+                            FLOAT32 ptr_ph_vocod_buf_imag[][64], FLOAT32 ptr_dst_buf_real[][64],
                             FLOAT32 ptr_dst_buf_imag[][64],
                             ia_sbr_frame_info_data_struct *ptr_frame_data,
-                            ia_sbr_header_data_struct *ptr_header_data);
+                            ia_sbr_header_data_struct *ptr_header_data, WORD32 audio_object_type,
+                            WORD32 time_slots, WORD32 ec_flag);
 
 VOID ixheaacd_clr_subsamples(WORD32 *ptr_qmf_buf, WORD32 num, WORD32 size);
 
@@ -216,6 +295,9 @@
     WORD16 *ptr_freq_band_tbl[MAX_FREQ_COEFFS + 1], WORD16 *ptr_num_sf_bands,
     WORD32 upsamp_4_flag);
 
+WORD32 ixheaacd_dft_hbe_data_reinit(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+                                    WORD16 *p_freq_band_tab[2], WORD16 *p_num_sfb);
+
 WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data,
                                  ia_bit_buf_struct *it_bit_buff,
                                  WORD32 hbe_flag,
@@ -223,13 +305,6 @@
                                  ia_sbr_tables_struct *sbr_tables_ptr,
                                  ia_sbr_header_data_struct *ptr_header_data);
 
-WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *h_hbe_txposer,
-                              FLOAT32 qmf_buf_real[][64],
-                              FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
-                              FLOAT32 pv_qmf_buf_real[][64],
-                              FLOAT32 pv_qmf_buf_imag[][64],
-                              WORD32 pitch_in_bins);
-
 WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec,
                          ia_sbr_header_data_struct *ptr_header_data,
                          ia_sbr_frame_info_data_struct *ptr_frame_data,
diff --git a/decoder/ixheaacd_sbr_payload.h b/decoder/ixheaacd_sbr_payload.h
index db3accc..57412a3 100644
--- a/decoder/ixheaacd_sbr_payload.h
+++ b/decoder/ixheaacd_sbr_payload.h
@@ -24,7 +24,9 @@
     ia_bit_buf_struct *it_bit_buff,
     ia_aac_dec_sbr_bitstream_struct *pstr_stream_sbr, WORD16 prev_element,
     ia_drc_dec_struct *pstr_drc_dec, WORD32 object_type, WORD32 adtsheader,
-    WORD32 cnt_bits, WORD32 ld_sbr_crc_flag, ia_drc_dec_struct *drc_dummy);
+    WORD32 cnt_bits, WORD32 ld_sbr_crc_flag, ia_drc_dec_struct *drc_dummy,
+    UWORD8 *mps_buffer, WORD32 *mps_header, WORD32 *mps_bytes,
+    WORD32 is_init, WORD32 *is_first, WORD32 ec_flag);
 
 WORD8 ixheaacd_aac_plus_get_payload(
     ia_bit_buf_struct *it_bit_buff,
diff --git a/decoder/ixheaacd_sbr_rom.c b/decoder/ixheaacd_sbr_rom.c
index 4bca7de..25edaa3 100644
--- a/decoder/ixheaacd_sbr_rom.c
+++ b/decoder/ixheaacd_sbr_rom.c
@@ -29,6 +29,9 @@
 
 #include "ixheaacd_drc_data_struct.h"
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -726,10 +729,22 @@
     // const WORD16 ixheaacd_sbr_alt_sin_twiddle_l32[17] =
     {
         //(WORD16)0x0000, (WORD16)0x7fff,
-        (WORD16)0x0c8c, (WORD16)0x7f62, (WORD16)0x18f9, (WORD16)0x7d8a,
-        (WORD16)0x2528, (WORD16)0x7a7d, (WORD16)0x30fc, (WORD16)0x7642,
-        (WORD16)0x3c57, (WORD16)0x70e3, (WORD16)0x471d, (WORD16)0x6a6e,
-        (WORD16)0x5134, (WORD16)0x62f2, (WORD16)0x5a82, (WORD16)0x5a82,
+        (WORD16)0x0c8c,
+        (WORD16)0x7f62,
+        (WORD16)0x18f9,
+        (WORD16)0x7d8a,
+        (WORD16)0x2528,
+        (WORD16)0x7a7d,
+        (WORD16)0x30fc,
+        (WORD16)0x7642,
+        (WORD16)0x3c57,
+        (WORD16)0x70e3,
+        (WORD16)0x471d,
+        (WORD16)0x6a6e,
+        (WORD16)0x5134,
+        (WORD16)0x62f2,
+        (WORD16)0x5a82,
+        (WORD16)0x5a82,
 
     },
     // const WORD16 ixheaacd_sbr_t_cos_sin_l32[32+32] = //exp[-i * pi/32* 3/4 *
@@ -910,7 +925,10 @@
      -18,    -18},
 
     {
-        0x00, 0x01, 0x02, 0x03,
+        0x00,
+        0x01,
+        0x02,
+        0x03,
     },
 
     // w1024[1536];
@@ -1733,6 +1751,137 @@
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
     },
+
+    //// WORD32 qmf_c_ldsbr_mps[640];
+    {-1088237,    -1922950,    -2811171,    -3833224,    -4994278,
+     -6282261,    -7680841,    -9169025,    -10725055,   -12324393,
+     -13941731,   -15549657,   -17120747,   -18626116,   -20036991,
+     -21323541,   -22456647,   -23406643,   -24144909,   -24642407,
+     -24871603,   -24804595,   -24415038,   -23675808,   -22560963,
+     -21042910,   -19094608,   -16685863,   -13785718,   -10358010,
+     -6365521,    -1754973,    3969414,     10743941,    18202241,
+     26403100,    35403839,    45247389,    55972297,    67609496,
+     80184932,    93717852,    108222063,   123704992,   140168036,
+     157606041,   176007496,   195354540,   215622847,   236781629,
+     258793720,   281616437,   305201134,   329493906,   354435733,
+     379963218,   406008680,   432501102,   459366074,   486526787,
+     513903832,   541416151,   568980294,   596510842,   -623766724,
+     -650827082,  -677563723,  -703875279,  -729666861,  -754844974,
+     -779316190,  -802988669,  -825771201,  -847575157,  -868313992,
+     -887904263,  -906265555,  -923321515,  -938999670,  -953232022,
+     -965955457,  -977112746,  -986652016,  -994526811,  -1000697179,
+     -1005129871, -1007798334, -1008683232, -1007772584, -1005061786,
+     -1000553966, -994259623,  -986196677,  -976390141,  -964872677,
+     -951682343,  -936802381,  -920294698,  -902267714,  -882779324,
+     -861893900,  -839683118,  -816223964,  -791598598,  -765893362,
+     -739198470,  -711607173,  -683215384,  -654121262,  -624424188,
+     -594224613,  -563623462,  -532721695,  -501619952,  -470417748,
+     -439213198,  -408102731,  -377180844,  -346538840,  -316265811,
+     -286447164,  -257165021,  -228497498,  -200518669,  -173298068,
+     -146900793,  -121386797,  -96810678,   73209368,    50642874,
+     29146835,    8753507,     -10508841,   -28617380,   -45554786,
+     -61309157,   -75874248,   -89248941,   -101437348,  -112448674,
+     -122296858,  -131000586,  -138582948,  -145071276,  -150496790,
+     -154894447,  -158302350,  -160761650,  -162316373,  -163012779,
+     -162899352,  -162026175,  -160444576,  -158206947,  -155366419,
+     -151976400,  -148090363,  -143761233,  -139041601,  -133983279,
+     -128633886,  -123042159,  -117256253,  -111320469,  -105277360,
+     -99167707,   -93029841,   -86899819,   -80811262,   -74795318,
+     -68880537,   -63093129,   -57456575,   -51991851,   -46717444,
+     -41649136,   -36800242,   -32182320,   -27804529,   -23673882,
+     -19795326,   -16171959,   -12804808,   -9693263,    -6834912,
+     -4225952,    -1860960,    266706,      2165096,     3843408,
+     5311608,     6580581,     -7659850,    -8565613,    -9308824,
+     -9902189,    -10358934,   -10692292,   -10915355,   -11041033,
+     -11082049,   -11050633,   -10958508,   -10816863,   -10636110,
+     -10426046,   -10195042,   -9950839,    -9700309,    -9449524,
+     -9203660,    -8966753,    -8741729,    -8530947,    -8335986,
+     -8157534,    -7995749,    -7850127,    -7719693,    -7603085,
+     -7498498,    -7404082,    -7317673,    -7237343,    -7159908,
+     -7082763,    -7004337,    -6922546,    -6835648,    -6742190,
+     -6640871,    -6530636,    -6410606,    -6280198,    -6138994,
+     -5986826,    -5823631,    -5649533,    -5464631,    -5269171,
+     -5063331,    -4847459,    -4621985,    -4387201,    -4143350,
+     -3890899,    -3630184,    -3361765,    -3086090,    -2803826,
+     -2515674,    -2222360,    -1924688,    -1624378,    -1321919,
+     -1016874,    706113,      420142,      140553,      -131288,
+     -393278,     -643324,     -879607,     -1100399,    -1303989,
+     -1488836,    -1653541,    -1796817,    -1917688,    -2015419,
+     -2089615,    -2140218,    -2167404,    -2171863,    -2154637,
+     -2117086,    -2060795,    -1987814,    -1900380,    -1800788,
+     -1691489,    -1575125,    -1454064,    -1330785,    -1207415,
+     -1086298,    -968520,     -854801,     -756445,     -680148,
+     -614695,     -560457,     -517664,     -485648,     -463299,
+     -449241,     -441532,     -438223,     -437237,     -436427,
+     -434027,     -428561,     -418692,     -403510,     -382407,
+     -355227,     -322142,     -283650,     -240483,     -193762,
+     -145159,     -95606,      -46830,      -583,        41669,
+     78196,       107442,      128069,      136701,      115724,
+     -1088237,    -1922950,    -2811171,    -3833224,    -4994278,
+     -6282261,    -7680841,    -9169025,    -10725055,   -12324393,
+     -13941731,   -15549657,   -17120747,   -18626116,   -20036991,
+     -21323541,   -22456647,   -23406643,   -24144909,   -24642407,
+     -24871603,   -24804595,   -24415038,   -23675808,   -22560963,
+     -21042910,   -19094608,   -16685863,   -13785718,   -10358010,
+     -6365521,    -1754973,    3969414,     10743941,    18202241,
+     26403100,    35403839,    45247389,    55972297,    67609496,
+     80184932,    93717852,    108222063,   123704992,   140168036,
+     157606041,   176007496,   195354540,   215622847,   236781629,
+     258793720,   281616437,   305201134,   329493906,   354435733,
+     379963218,   406008680,   432501102,   459366074,   486526787,
+     513903832,   541416151,   568980294,   596510842,   -623766724,
+     -650827082,  -677563723,  -703875279,  -729666861,  -754844974,
+     -779316190,  -802988669,  -825771201,  -847575157,  -868313992,
+     -887904263,  -906265555,  -923321515,  -938999670,  -953232022,
+     -965955457,  -977112746,  -986652016,  -994526811,  -1000697179,
+     -1005129871, -1007798334, -1008683232, -1007772584, -1005061786,
+     -1000553966, -994259623,  -986196677,  -976390141,  -964872677,
+     -951682343,  -936802381,  -920294698,  -902267714,  -882779324,
+     -861893900,  -839683118,  -816223964,  -791598598,  -765893362,
+     -739198470,  -711607173,  -683215384,  -654121262,  -624424188,
+     -594224613,  -563623462,  -532721695,  -501619952,  -470417748,
+     -439213198,  -408102731,  -377180844,  -346538840,  -316265811,
+     -286447164,  -257165021,  -228497498,  -200518669,  -173298068,
+     -146900793,  -121386797,  -96810678,   73209368,    50642874,
+     29146835,    8753507,     -10508841,   -28617380,   -45554786,
+     -61309157,   -75874248,   -89248941,   -101437348,  -112448674,
+     -122296858,  -131000586,  -138582948,  -145071276,  -150496790,
+     -154894447,  -158302350,  -160761650,  -162316373,  -163012779,
+     -162899352,  -162026175,  -160444576,  -158206947,  -155366419,
+     -151976400,  -148090363,  -143761233,  -139041601,  -133983279,
+     -128633886,  -123042159,  -117256253,  -111320469,  -105277360,
+     -99167707,   -93029841,   -86899819,   -80811262,   -74795318,
+     -68880537,   -63093129,   -57456575,   -51991851,   -46717444,
+     -41649136,   -36800242,   -32182320,   -27804529,   -23673882,
+     -19795326,   -16171959,   -12804808,   -9693263,    -6834912,
+     -4225952,    -1860960,    266706,      2165096,     3843408,
+     5311608,     6580581,     -7659850,    -8565613,    -9308824,
+     -9902189,    -10358934,   -10692292,   -10915355,   -11041033,
+     -11082049,   -11050633,   -10958508,   -10816863,   -10636110,
+     -10426046,   -10195042,   -9950839,    -9700309,    -9449524,
+     -9203660,    -8966753,    -8741729,    -8530947,    -8335986,
+     -8157534,    -7995749,    -7850127,    -7719693,    -7603085,
+     -7498498,    -7404082,    -7317673,    -7237343,    -7159908,
+     -7082763,    -7004337,    -6922546,    -6835648,    -6742190,
+     -6640871,    -6530636,    -6410606,    -6280198,    -6138994,
+     -5986826,    -5823631,    -5649533,    -5464631,    -5269171,
+     -5063331,    -4847459,    -4621985,    -4387201,    -4143350,
+     -3890899,    -3630184,    -3361765,    -3086090,    -2803826,
+     -2515674,    -2222360,    -1924688,    -1624378,    -1321919,
+     -1016874,    706113,      420142,      140553,      -131288,
+     -393278,     -643324,     -879607,     -1100399,    -1303989,
+     -1488836,    -1653541,    -1796817,    -1917688,    -2015419,
+     -2089615,    -2140218,    -2167404,    -2171863,    -2154637,
+     -2117086,    -2060795,    -1987814,    -1900380,    -1800788,
+     -1691489,    -1575125,    -1454064,    -1330785,    -1207415,
+     -1086298,    -968520,     -854801,     -756445,     -680148,
+     -614695,     -560457,     -517664,     -485648,     -463299,
+     -449241,     -441532,     -438223,     -437237,     -436427,
+     -434027,     -428561,     -418692,     -403510,     -382407,
+     -355227,     -322142,     -283650,     -240483,     -193762,
+     -145159,     -95606,      -46830,      -583,        41669,
+     78196,       107442,      128069,      136701,      115724},
+
     // const WORD16 ixheaacd_sbr_synth_cos_sin_l32[64+64] = //exp[-i * pi/4* (2k
     // + 1)]
     {
@@ -1826,6 +1975,34 @@
          {1, 1, 1, 1, 1, 1, 1, 1},
          {0, 8, 16}},
 
+        //960 Adding new tables for 960 frame length implementation
+        //const ia_frame_info_struct sbr_frame_info1_16_960 =
+        {0,
+         1,
+         -1,
+         1,
+         {0, 15, 0, 0, 0, 0},
+         {1, 0, 0, 0, 0},
+         {0, 15, 0}},
+
+        //const ia_frame_info_struct sbr_frame_info2_16_960 =
+        {0,
+         2,
+         -1,
+         2,
+         {0, 8, 15, 0, 0, 0},
+         {1, 1, 0, 0, 0},
+         {0, 8, 15}},
+
+        //const ia_frame_info_struct sbr_frame_info4_16_960 =
+        {0,
+         4,
+         -1,
+         2,
+         {0, 4, 8, 12, 15},
+         {1, 1, 1, 1},
+         {0, 8, 15}},
+
     },
 
     // const ia_sbr_header_data_struct sbr_default_header =
@@ -1867,6 +2044,11 @@
      0,
      0,
      0,
+     0,
+
+     0,
+     0,
+     0,
      0},
 
     // WORD16 ixheaacd_t_huffman_env_bal_1_5db_inp_table[50];
@@ -2425,4 +2607,1121 @@
         (WORD16)0x3538,  (WORD16)0x3637,  (WORD16)-0x2222, (WORD16)-0x2424,
         (WORD16)0x393a,  (WORD16)-0x5d5d, (WORD16)-0x532c, (WORD16)-0x4f30,
     },
-    0};
+    0,
+    // const FLOAT32 qmf_fract_delay_phase_factor_im[NUM_OF_QUAD_MIRROR_FILTER_CHNLS] =
+    {
+        -0.5750052333f, -0.9645574093f, -0.0784592107f, 0.9114032388f,  0.6959129572f,
+        -0.4399389625f, -0.9939609766f, -0.2334456891f, 0.8358071446f,  0.7996849418f,
+        -0.2940398753f, -0.9988898635f, -0.3826839626f, 0.7396306992f,  0.8837659359f,
+        -0.1409005374f, -0.9792226553f, -0.5224992633f, 0.6252419949f,  0.9460856318f,
+        0.0157082379f,  -0.9354436994f, -0.6494488120f, 0.4954577386f,  0.9851095080f,
+        0.1719302237f,  -0.8686309457f, -0.7604067922f, 0.3534736335f,  0.9998766780f,
+        0.3239187002f,  -0.7804295421f, -0.8526409268f, 0.2027858198f,  0.9900234342f,
+        0.4679312110f,  -0.6730113029f, -0.9238801599f, 0.0471047238f,  0.9557924867f,
+        0.6004216671f,  -0.5490212440f, -0.9723703861f, -0.1097362563f, 0.8980267048f,
+        0.7181277275f,  -0.4115124643f, -0.9969174862f, -0.2638751566f, 0.8181484342f,
+        0.8181509972f,  -0.2638708055f, -0.9969171286f, -0.4115165472f, 0.7181245685f,
+        0.8980286717f,  -0.1097317860f, -0.9723693132f, -0.5490249991f, 0.6004180908f,
+        0.9557937980f,  0.0471092127f,  -0.9238784313f, -0.6730146408f,
+    },
+    // const FLOAT32 qmf_fract_delay_phase_factor_re[NUM_OF_QUAD_MIRROR_FILTER_CHNLS] =
+    {
+        0.8181497455f, -0.2638729811f, -0.9969173074f, -0.4115144908f, 0.7181261778f,
+        0.8980276585f, -0.1097340211f, -0.9723698497f, -0.5490231514f, 0.6004198790f,
+        0.9557931423f, 0.0471069664f,  -0.9238793254f, -0.6730129719f, 0.4679292440f,
+        0.9900237322f, 0.2027880251f,  -0.8526397347f, -0.7804309130f, 0.3239165843f,
+        0.9998766184f, 0.3534757495f,  -0.7604053020f, -0.8686320186f, 0.1719280183f,
+        0.9851091504f, 0.4954597056f,  -0.6494470835f, -0.9354444742f, 0.0157059915f,
+        0.9460849166f, 0.6252437830f,  -0.5224972963f, -0.9792231321f, -0.1409027725f,
+        0.8837648630f, 0.7396321893f,  -0.3826818764f, -0.9988899827f, -0.2940420210f,
+        0.7996835709f, 0.8358083963f,  -0.2334435135f, -0.9939607382f, -0.4399409592f,
+        0.6959113479f, 0.9114041328f,  -0.0784569681f, -0.9645568728f, -0.5750070810f,
+        0.5750033855f, 0.9645580053f,  0.0784614459f,  -0.9114022851f, -0.6959145665f,
+        0.4399369359f, 0.9939612150f,  0.2334478796f,  -0.8358058929f, -0.7996862531f,
+        0.2940377295f, 0.9988897443f,  0.3826860189f,  -0.7396291494f,
+    },
+    // const FLOAT32 frac_delay_phase_fac_qmf_sub_im_20[NUM_SUB_QMF_CHANNELS] =
+    {
+        -0.1525546163f, -0.4434623122f, -0.6930873394f, -0.8781917691f, -0.0000000000f,
+        -0.0000000000f, 0.4434623122f, 0.1525546163f, -0.8400936127f, -0.9992290139f,
+        -0.3754156530f, 0.2258011401f,
+    },
+    // const FLOAT32 frac_delay_phase_fac_qmf_sub_re_20[NUM_SUB_QMF_CHANNELS] =
+    {
+        0.9882950187f, 0.8962930441f, 0.7208536267f, 0.4783087671f, 1.0000000000f,
+        1.0000000000f, 0.8962930441f, 0.9882950187f, -0.5424414873f, 0.0392598733f,
+        -0.9268565774f, -0.9741734266f,
+    },
+    // const FLOAT32 frac_delay_phase_fac_qmf_sub_im_34[NUM_SUB_QMF_CHANNELS_HI_RES] =
+    {
+        -0.1019244567f, -0.3015379608f, -0.4886212051f, -0.6554001570f, -0.7949443460f,
+        -0.9014551044f, -0.9705064893f, -0.9992290139f, -0.9864292741f, 0.4886212051f,
+        0.3015379608f,  0.1019244567f,  -0.5124176741f, -0.2296251953f, -0.6930873394f,
+        -0.8781917691f, -0.9815438390f, -0.9935223460f, -0.9130122662f, -0.7475084066f,
+        -0.3754156530f, 0.2258011401f,  0.7448939681f,  -0.8400936127f, 0.8800634146f,
+        0.2258011401f,  0.7448939681f,  0.9930684566f,  0.8800634146f,  0.4469788074f,
+        -0.1486721933f, 0.9930684566f,
+    },
+    // const FLOAT32 frac_delay_phase_fac_qmf_sub_re_34[NUM_SUB_QMF_CHANNELS_HI_RES] =
+    {
+        0.9947921634f,  0.9534541965f,  0.8724960089f,  0.7552818656f,  0.6066823602f,
+        0.4328725934f,  0.2410750538f,  0.0392598733f,  -0.1641867310f, 0.8724960089f,
+        0.9534541965f,  0.9947921634f,  -0.8587363362f, -0.9732791185f, 0.7208536267f,
+        0.4783087671f,  0.1912373453f,  -0.1136366725f, -0.4079320431f, -0.6642524004f,
+        -0.9268565774f, -0.9741734266f, -0.6671828628f, -0.5424414873f, 0.4748562276f,
+        -0.9741734266f, -0.6671828628f, -0.1175375655f, 0.4748562276f,  0.8945445418f,
+        0.9888865352f,  -0.1175375655f,
+    },
+    // const FLOAT32
+    // qmf_ser_fract_delay_phase_factor_im[NUM_QUAD_MIRROR_FILTER_CHNLS][NUM_SER_AP_LINKS] =
+    {
+        {
+            -0.6252426505f, -0.9238795042f, -0.5184748173f,
+        },
+        {
+            -0.8980275393f, 0.3826834261f, -0.9979268909f,
+        },
+        {
+            0.2334454209f, 0.3826834261f, -0.4043435752f,
+        },
+        {
+            0.9998766184f, -0.9238795042f, 0.6240159869f,
+        },
+        {
+            0.2027871907f, 0.9238795042f, 0.9813933372f,
+        },
+        {
+            -0.9114032984f, -0.3826834261f, 0.2835132182f,
+        },
+        {
+            -0.6004201174f, -0.3826834261f, -0.7192186117f,
+        },
+        {
+            0.6494481564f, 0.9238795042f, -0.9486001730f,
+        },
+        {
+            0.8837655187f, -0.9238795042f, -0.1579856575f,
+        },
+        {
+            -0.2638732493f, 0.3826834261f, 0.8025052547f,
+        },
+        {
+            -0.9988898635f, 0.3826834261f, 0.9000906944f,
+        },
+        {
+            -0.1719288528f, -0.9238795042f, 0.0298405960f,
+        },
+        {
+            0.9238796234f, 0.9238795042f, -0.8724960685f,
+        },
+        {
+            0.5750049949f, -0.3826834261f, -0.8366686702f,
+        },
+        {
+            -0.6730127335f, -0.3826834261f, 0.0987988561f,
+        },
+        {
+            -0.8686313629f, 0.9238795042f, 0.9280315042f,
+        },
+        {
+            0.2940406799f, -0.9238795042f, 0.7593847513f,
+        },
+        {
+            0.9969173074f, 0.3826834261f, -0.2258014232f,
+        },
+        {
+            0.1409008205f, 0.3826834261f, -0.9681913853f,
+        },
+        {
+            -0.9354441762f, -0.9238795042f, -0.6695194840f,
+        },
+        {
+            -0.5490224361f, 0.9238795042f, 0.3490629196f,
+        },
+        {
+            0.6959131360f, -0.3826834261f, 0.9923103452f,
+        },
+        {
+            0.8526399136f, -0.3826834261f, 0.5685616732f,
+        },
+        {
+            -0.3239179254f, 0.9238795042f, -0.4665412009f,
+        },
+        {
+            -0.9939609170f, -0.9238795042f, -0.9999889135f,
+        },
+        {
+            -0.1097337380f, 0.3826834261f, -0.4581840038f,
+        },
+        {
+            0.9460855722f, 0.3826834261f, 0.5762898922f,
+        },
+        {
+            0.5224980116f, -0.9238795042f, 0.9910997152f,
+        },
+        {
+            -0.7181267142f, 0.9238795042f, 0.3402152061f,
+        },
+        {
+            -0.8358070254f, -0.3826834261f, -0.6764906645f,
+        },
+        {
+            0.3534754813f, -0.3826834261f, -0.9657900929f,
+        },
+        {
+            0.9900235534f, 0.9238795042f, -0.2166097313f,
+        },
+        {
+            0.0784583688f, -0.9238795042f, 0.7654833794f,
+        },
+        {
+            -0.9557932615f, 0.3826834261f, 0.9244794250f,
+        },
+        {
+            -0.4954580069f, 0.3826834261f, 0.0894154981f,
+        },
+        {
+            0.7396316528f, -0.9238795042f, -0.8417937160f,
+        },
+        {
+            0.8181492686f, 0.9238795042f, -0.8678520322f,
+        },
+        {
+            -0.3826842010f, -0.3826834261f, 0.0392601527f,
+        },
+        {
+            -0.9851091504f, -0.3826834261f, 0.9041572809f,
+        },
+        {
+            -0.0471055657f, 0.9238795042f, 0.7968461514f,
+        },
+        {
+            0.9645576477f, -0.9238795042f, -0.1672853529f,
+        },
+        {
+            0.4679289758f, 0.3826834261f, -0.9515408874f,
+        },
+        {
+            -0.7604066133f, 0.3826834261f, -0.7126382589f,
+        },
+        {
+            -0.7996840477f, -0.9238795042f, 0.2925389707f,
+        },
+        {
+            0.4115152657f, 0.9238795042f, 0.9831594229f,
+        },
+        {
+            0.9792225957f, -0.3826834261f, 0.6166234016f,
+        },
+        {
+            0.0157062728f, -0.3826834261f, -0.4129458666f,
+        },
+        {
+            -0.9723701477f, 0.9238795042f, -0.9984891415f,
+        },
+        {
+            -0.4399381876f, -0.9238795042f, -0.5103924870f,
+        },
+        {
+            0.7804310918f, 0.3826834261f, 0.5265110731f,
+        },
+        {
+            0.7804297209f, 0.3826834261f, 0.9972759485f,
+        },
+        {
+            -0.4399402142f, -0.9238795042f, 0.3957053721f,
+        },
+        {
+            -0.9723696709f, 0.9238795042f, -0.6313531399f,
+        },
+        {
+            0.0157085191f, -0.3826834261f, -0.9795400500f,
+        },
+        {
+            0.9792230725f, -0.3826834261f, -0.2744622827f,
+        },
+        {
+            0.4115132093f, 0.9238795042f, 0.7257350087f,
+        },
+        {
+            -0.7996854186f, -0.9238795042f, 0.9455752373f,
+        },
+        {
+            -0.7604051232f, 0.3826834261f, 0.1486719251f,
+        },
+        {
+            0.4679309726f, 0.3826834261f, -0.8080930114f,
+        },
+        {
+            0.9645570517f, -0.9238795042f, -0.8959442377f,
+        },
+        {
+            -0.0471078083f, 0.9238795042f, -0.0204183888f,
+        },
+        {
+            -0.9851095676f, -0.3826834261f, 0.8770626187f,
+        },
+        {
+            -0.3826821446f, -0.3826834261f, 0.8314692974f,
+        },
+        {
+            0.8181505203f, 0.9238795042f, -0.1081734300f,
+        },
+
+    },
+    // const FLOAT32
+    // qmf_ser_fract_delay_phase_factor_re[NUM_OF_QUAD_MIRROR_FILTER_CHNLS]
+    //                                    [NUM_SER_AP_LINKS] =
+    {
+        {
+            0.7804303765f, 0.3826834261f, 0.8550928831f,
+        },
+        {
+            -0.4399392009f, -0.9238795042f, -0.0643581524f,
+        },
+        {
+            -0.9723699093f, 0.9238795042f, -0.9146071672f,
+        },
+        {
+            0.0157073960f, -0.3826834261f, -0.7814115286f,
+        },
+        {
+            0.9792228341f, -0.3826834261f, 0.1920081824f,
+        },
+        {
+            0.4115142524f, 0.9238795042f, 0.9589683414f,
+        },
+        {
+            -0.7996847630f, -0.9238795042f, 0.6947838664f,
+        },
+        {
+            -0.7604058385f, 0.3826834261f, -0.3164770305f,
+        },
+        {
+            0.4679299891f, 0.3826834261f, -0.9874414206f,
+        },
+        {
+            0.9645573497f, -0.9238795042f, -0.5966450572f,
+        },
+        {
+            -0.0471066870f, 0.9238795042f, 0.4357025325f,
+        },
+        {
+            -0.9851093888f, -0.3826834261f, 0.9995546937f,
+        },
+        {
+            -0.3826831877f, -0.3826834261f, 0.4886211455f,
+        },
+        {
+            0.8181498647f, 0.9238795042f, -0.5477093458f,
+        },
+        {
+            0.7396308780f, -0.9238795042f, -0.9951074123f,
+        },
+        {
+            -0.4954589605f, 0.3826834261f, -0.3725017905f,
+        },
+        {
+            -0.9557929039f, 0.3826834261f, 0.6506417990f,
+        },
+        {
+            0.0784594864f, -0.9238795042f, 0.9741733670f,
+        },
+        {
+            0.9900237322f, 0.9238795042f, 0.2502108514f,
+        },
+        {
+            0.3534744382f, -0.3826834261f, -0.7427945137f,
+        },
+        {
+            -0.8358076215f, -0.3826834261f, -0.9370992780f,
+        },
+        {
+            -0.7181259394f, 0.9238795042f, -0.1237744763f,
+        },
+        {
+            0.5224990249f, -0.9238795042f, 0.8226406574f,
+        },
+        {
+            0.9460852146f, 0.3826834261f, 0.8844994903f,
+        },
+        {
+            -0.1097348556f, 0.3826834261f, -0.0047125919f,
+        },
+        {
+            -0.9939610362f, -0.9238795042f, -0.8888573647f,
+        },
+        {
+            -0.3239168525f, 0.9238795042f, -0.8172453642f,
+        },
+        {
+            0.8526405096f, -0.3826834261f, 0.1331215799f,
+        },
+        {
+            0.6959123611f, -0.3826834261f, 0.9403476119f,
+        },
+        {
+            -0.5490233898f, 0.9238795042f, 0.7364512086f,
+        },
+        {
+            -0.9354437590f, -0.9238795042f, -0.2593250275f,
+        },
+        {
+            0.1409019381f, 0.3826834261f, -0.9762582779f,
+        },
+        {
+            0.9969173670f, 0.3826834261f, -0.6434556246f,
+        },
+        {
+            0.2940396070f, -0.9238795042f, 0.3812320232f,
+        },
+        {
+            -0.8686318994f, 0.9238795042f, 0.9959943891f,
+        },
+        {
+            -0.6730118990f, -0.3826834261f, 0.5397993922f,
+        },
+        {
+            0.5750059485f, -0.3826834261f, -0.4968227744f,
+        },
+        {
+            0.9238792062f, 0.9238795042f, -0.9992290139f,
+        },
+        {
+            -0.1719299555f, -0.9238795042f, -0.4271997511f,
+        },
+        {
+            -0.9988899231f, 0.3826834261f, 0.6041822433f,
+        },
+        {
+            -0.2638721764f, 0.3826834261f, 0.9859085083f,
+        },
+        {
+            0.8837660551f, -0.9238795042f, 0.3075223565f,
+        },
+        {
+            0.6494473219f, 0.9238795042f, -0.7015317082f,
+        },
+        {
+            -0.6004210114f, -0.3826834261f, -0.9562535882f,
+        },
+        {
+            -0.9114028811f, -0.3826834261f, -0.1827499419f,
+        },
+        {
+            0.2027882934f, 0.9238795042f, 0.7872582674f,
+        },
+        {
+            0.9998766780f, -0.9238795042f, 0.9107555747f,
+        },
+        {
+            0.2334443331f, 0.3826834261f, 0.0549497530f,
+        },
+        {
+            -0.8980280757f, 0.3826834261f, -0.8599416018f,
+        },
+        {
+            -0.6252418160f, -0.9238795042f, -0.8501682281f,
+        },
+        {
+            0.6252435446f, 0.9238795042f, 0.0737608299f,
+        },
+        {
+            0.8980270624f, -0.3826834261f, 0.9183775187f,
+        },
+        {
+            -0.2334465086f, -0.3826834261f, 0.7754954696f,
+        },
+        {
+            -0.9998766184f, 0.9238795042f, -0.2012493610f,
+        },
+        {
+            -0.2027861029f, -0.9238795042f, -0.9615978599f,
+        },
+        {
+            0.9114037752f, 0.3826834261f, -0.6879743338f,
+        },
+        {
+            0.6004192233f, 0.3826834261f, 0.3254036009f,
+        },
+        {
+            -0.6494490504f, -0.9238795042f, 0.9888865948f,
+        },
+        {
+            -0.8837650418f, 0.9238795042f, 0.5890548825f,
+        },
+        {
+            0.2638743520f, -0.3826834261f, -0.4441666007f,
+        },
+        {
+            0.9988898039f, -0.3826834261f, -0.9997915030f,
+        },
+        {
+            0.1719277352f, 0.9238795042f, -0.4803760946f,
+        },
+        {
+            -0.9238800406f, -0.9238795042f, 0.5555707216f,
+        },
+        {
+            -0.5750041008f, 0.3826834261f, 0.9941320419f,
+        },
+
+    },
+    // const FLOAT32
+    // frac_delay_phase_fac_ser_qmf_sub_im_20[NUM_SUB_QMF_CHANNELS][NUM_SER_AP_LINKS] =
+    {
+        {
+            -0.1680592746f, -0.2902846634f, -0.1358452588f,
+        },
+        {
+            -0.4851911962f, -0.7730104327f, -0.3975082636f,
+        },
+        {
+            -0.7475083470f, -0.9951847196f, -0.6298289299f,
+        },
+        {
+            -0.9253752232f, -0.8819212914f, -0.8156582713f,
+        },
+        {
+            -0.0000000000f, -0.0000000000f, -0.0000000000f,
+        },
+        {
+            -0.0000000000f, -0.0000000000f, -0.0000000000f,
+        },
+        {
+            0.4851911962f, 0.7730104327f, 0.3975082636f,
+        },
+        {
+            0.1680592746f, 0.2902846634f, 0.1358452588f,
+        },
+        {
+            -0.7015314102f, 0.8314695954f, -0.9437720776f,
+        },
+        {
+            -0.9930684566f, -0.1950903237f, -0.9784189463f,
+        },
+        {
+            -0.1019244045f, 0.8314695954f, -0.6356067061f,
+        },
+        {
+            0.5424416065f, -0.1950903237f, -0.1432335079f,
+        },
+
+    },
+    // const FLOAT32
+    // frac_delay_phase_fac_ser_qmf_sub_re_20[NUM_SUB_QMF_CHANNELS][NUM_SER_AP_LINKS] =
+    {
+        {
+            0.9857769012f, 0.9569403529f, 0.9907300472f,
+        },
+        {
+            0.8744080663f, 0.6343932748f, 0.9175986052f,
+        },
+        {
+            0.6642524004f, 0.0980171412f, 0.7767338753f,
+        },
+        {
+            0.3790524006f, -0.4713967443f, 0.5785340071f,
+        },
+        {
+            1.0000000000f, 1.0000000000f, 1.0000000000f,
+        },
+        {
+            1.0000000000f, 1.0000000000f, 1.0000000000f,
+        },
+        {
+            0.8744080663f, 0.6343932748f, 0.9175986052f,
+        },
+        {
+            0.9857769012f, 0.9569403529f, 0.9907300472f,
+        },
+        {
+            -0.7126385570f, -0.5555702448f, -0.3305967748f,
+        },
+        {
+            -0.1175374240f, -0.9807852507f, 0.2066311091f,
+        },
+        {
+            -0.9947921634f, 0.5555702448f, -0.7720130086f,
+        },
+        {
+            -0.8400934935f, 0.9807852507f, -0.9896889329f,
+        },
+
+    },
+    // const FLOAT32
+    // frac_delay_phase_fac_ser_qmf_sub_im_34[NUM_SUB_QMF_CHANNELS_HI_RES]
+    //                                       [NUM_SER_AP_LINKS] =
+    {
+        {
+            -0.1123361215f, -0.1950903237f, -0.0907194912f,
+        },
+        {
+            -0.3313378990f, -0.5555702448f, -0.2691719830f,
+        },
+        {
+            -0.5336145163f, -0.8314695954f, -0.4387632608f,
+        },
+        {
+            -0.7089555264f, -0.9807852507f, -0.5939104557f,
+        },
+        {
+            -0.8485102057f, -0.9807852507f, -0.7295060754f,
+        },
+        {
+            -0.9452341199f, -0.8314695954f, -0.8410862088f,
+        },
+        {
+            -0.9942448139f, -0.5555701256f, -0.9249777794f,
+        },
+        {
+            -0.9930684566f, -0.1950903237f, -0.9784189463f,
+        },
+        {
+            -0.9417643547f, 0.1950902343f, -0.9996504188f,
+        },
+        {
+            0.5336145163f, 0.8314695954f, 0.4387632608f,
+        },
+        {
+            0.3313378990f, 0.5555702448f, 0.2691719830f,
+        },
+        {
+            0.1123361215f, 0.1950903237f, 0.0907194912f,
+        },
+        {
+            -0.2676587701f, 0.9569403529f, -0.7345889807f,
+        },
+        {
+            0.0667093173f, 0.6343932748f, -0.5248404145f,
+        },
+        {
+            -0.7475083470f, -0.9951847196f, -0.6298289299f,
+        },
+        {
+            -0.9253752232f, -0.8819212914f, -0.8156582713f,
+        },
+        {
+            -0.9986971617f, -0.4713967443f, -0.9412791729f,
+        },
+        {
+            -0.9591906667f, 0.0980171412f, -0.9974188805f,
+        },
+        {
+            -0.8113189340f, 0.6343932748f, -0.9799333811f,
+        },
+        {
+            -0.5717879534f, 0.9569403529f, -0.8901134133f,
+        },
+        {
+            -0.1019244045f, 0.8314695954f, -0.6356067061f,
+        },
+        {
+            0.5424416065f, -0.1950903237f, -0.1432335079f,
+        },
+        {
+            0.9486002326f, -0.9807852507f, 0.3906508386f,
+        },
+        {
+            -0.7015314102f, 0.8314695954f, -0.9437720776f,
+        },
+        {
+            0.5157858133f, 0.5555702448f, 0.9968553782f,
+        },
+        {
+            0.5424416065f, -0.1950903237f, -0.1432335079f,
+        },
+        {
+            0.9486002326f, -0.9807852507f, 0.3906508386f,
+        },
+        {
+            0.9381912947f, -0.5555702448f, 0.8113189936f,
+        },
+        {
+            0.5157858133f, 0.5555702448f, 0.9968553782f,
+        },
+        {
+            -0.1331214458f, 0.9807852507f, 0.8934889436f,
+        },
+        {
+            -0.7235698700f, 0.1950903237f, 0.5311767459f,
+        },
+        {
+            0.9381912947f, -0.5555702448f, 0.8113189936f,
+        },
+
+    },
+    // const FLOAT32
+    // frac_delay_phase_fac_ser_qmf_sub_re_34[NUM_SUB_QMF_CHANNELS_HI_RES]
+    //                                       [NUM_SER_AP_LINKS] =
+    {
+        {
+            0.9936702847f, 0.9807852507f, 0.9958764911f,
+        },
+        {
+            0.9435121417f, 0.8314695954f, 0.9630921483f,
+        },
+        {
+            0.8457278013f, 0.5555702448f, 0.8986026645f,
+        },
+        {
+            0.7052531838f, 0.1950903684f, 0.8045311570f,
+        },
+        {
+            0.5291789770f, -0.1950903237f, 0.6839743853f,
+        },
+        {
+            0.3263930976f, -0.5555702448f, 0.5409010649f,
+        },
+        {
+            0.1071316749f, -0.8314696550f, 0.3800212145f,
+        },
+        {
+            -0.1175374240f, -0.9807852507f, 0.2066311091f,
+        },
+        {
+            -0.3362735212f, -0.9807853103f, 0.0264386870f,
+        },
+        {
+            0.8457278013f, 0.5555702448f, 0.8986026645f,
+        },
+        {
+            0.9435121417f, 0.8314695954f, 0.9630921483f,
+        },
+        {
+            0.9936702847f, 0.9807852507f, 0.9958764911f,
+        },
+        {
+            -0.9635137916f, 0.2902846634f, -0.6785123348f,
+        },
+        {
+            -0.9977724552f, 0.7730104327f, -0.8512006402f,
+        },
+        {
+            0.6642524004f, 0.0980171412f, 0.7767338753f,
+        },
+        {
+            0.3790524006f, -0.4713967443f, 0.5785340071f,
+        },
+        {
+            0.0510286838f, -0.8819212914f, 0.3376292288f,
+        },
+        {
+            -0.2827600539f, -0.9951847196f, 0.0718020797f,
+        },
+        {
+            -0.5846037269f, -0.7730104327f, -0.1993251890f,
+        },
+        {
+            -0.8204014897f, -0.2902846634f, -0.4557391405f,
+        },
+        {
+            -0.9947921634f, 0.5555702448f, -0.7720130086f,
+        },
+        {
+            -0.8400934935f, 0.9807852507f, -0.9896889329f,
+        },
+        {
+            -0.3164769113f, 0.1950903237f, -0.9205389619f,
+        },
+        {
+            -0.7126385570f, -0.5555702448f, -0.3305967748f,
+        },
+        {
+            0.8567175865f, -0.8314695954f, -0.0792420134f,
+        },
+        {
+            -0.8400934935f, 0.9807852507f, -0.9896889329f,
+        },
+        {
+            -0.3164769113f, 0.1950903237f, -0.9205389619f,
+        },
+        {
+            0.3461171389f, -0.8314695954f, -0.5846037269f,
+        },
+        {
+            0.8567175865f, -0.8314695954f, -0.0792420134f,
+        },
+        {
+            0.9910997152f, 0.1950903237f, 0.4490851462f,
+        },
+        {
+            0.6902511716f, 0.9807852507f, 0.8472610116f,
+        },
+        {
+            0.3461171389f, -0.8314695954f, -0.5846037269f,
+        },
+
+    },
+    // const FLOAT32 scale_factors_flt[NO_IID_LEVELS] =
+    {
+        1.4119827747f, 1.4031381607f, 1.3868767023f, 1.3483997583f, 1.2912493944f,
+        1.1960374117f, 1.1073724031f, 1.0000000000f, 0.8796171546f, 0.7546485662f,
+        0.5767799020f, 0.4264014363f, 0.2767182887f, 0.1766446233f, 0.0794016272f,
+    },
+    // const FLOAT32
+    // scale_factors_fine_flt[NO_IID_LEVELS_FINE] =
+    {
+        1.4142065048f, 1.4141912460f, 1.4141428471f, 1.4139900208f, 1.4135069847f,
+        1.4119827747f, 1.4097729921f, 1.4053947926f, 1.3967796564f, 1.3800530434f,
+        1.3483997583f, 1.3139201403f, 1.2643101215f, 1.1960374117f, 1.1073724031f,
+        1.0000000000f, 0.8796171546f, 0.7546485662f, 0.6336560845f, 0.5230810642f,
+        0.4264014363f, 0.3089554012f, 0.2213746458f, 0.1576878875f, 0.1119822487f,
+        0.0794016272f, 0.0446990170f, 0.0251446925f, 0.0141414283f, 0.0079525812f,
+        0.0044721137f,
+    },
+    // const FLOAT32 alphas[NUM_ICC_LEVELS] =
+    {
+        0.0000000000f, 0.1784276664f, 0.2856673002f, 0.4630723596f, 0.5971631408f,
+        0.7853981853f, 1.1003085375f, 1.5707963705f,
+    },
+
+    // const FLOAT32 all_pass_link_decay_ser[NUM_SER_AP_LINKS] =
+    {
+        0.6514390707f, 0.5647181273f, 0.4895416498f,
+    },
+
+    // const FLOAT32 p8_13_20[13] =
+    {0.00746082949812f, 0.02270420949825f, 0.04546865930473f, 0.07266113929591f,
+     0.09885108575264f, 0.11793710567217f, 0.125f, 0.11793710567217f, 0.09885108575264f,
+     0.07266113929591f, 0.04546865930473f, 0.02270420949825f, 0.00746082949812f},
+
+    // const FLOAT32 p2_13_20[13] =
+    {0.0f, 0.01899487526049f, 0.0f, -0.07293139167538f, 0.0f, 0.30596630545168f, 0.5f,
+     0.30596630545168f, 0.0f, -0.07293139167538f, 0.0f, 0.01899487526049f, 0.0f},
+
+    // const FLOAT32 p12_13_34[13] =
+    {0.04081179924692f, 0.03812810994926f, 0.05144908135699f, 0.06399831151592f,
+     0.07428313801106f, 0.08100347892914f, 0.08333333333333f, 0.08100347892914f,
+     0.07428313801106f, 0.06399831151592f, 0.05144908135699f, 0.03812810994926f,
+     0.04081179924692f},
+    // const FLOAT32 p8_13_34[13] =
+    {0.01565675600122f, 0.03752716391991f, 0.05417891378782f, 0.08417044116767f,
+     0.10307344158036f, 0.12222452249753f, 0.12500000000000f, 0.12222452249753f,
+     0.10307344158036f, 0.08417044116767f, 0.05417891378782f, 0.03752716391991f,
+     0.01565675600122f},
+    // const FLOAT32 p4_13_34[13] =
+    {-0.05908211155639f, -0.04871498374946f, 0.0f, 0.07778723915851f, 0.16486303567403f,
+     0.23279856662996f, 0.25f, 0.23279856662996f, 0.16486303567403f, 0.07778723915851f,
+     0.0f, -0.04871498374946f, -0.05908211155639f},
+    // const FLOAT32 cos_mod_2channel[2][13] =
+    {
+        {
+            1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+            1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f, 1.0000000000f,
+            1.0000000000f, 1.0000000000f, 1.0000000000f,
+        },
+        {
+            1.0000000000f, -1.0000000000f, 1.0000000000f, -1.0000000000f, 1.0000000000f,
+            -1.0000000000f, 1.0000000000f, -1.0000000000f, 1.0000000000f, -1.0000000000f,
+            1.0000000000f, -1.0000000000f, 1.0000000000f,
+        },
+    },
+    // const FLOAT32 cos_sin_mod_4channel[4][13 * 2] =
+    {
+        {
+            -0.0000000000f, -1.0000000000f, -0.7071067691f, -0.7071067691f, -1.0000000000f,
+            0.0000000000f,  -0.7071067691f, 0.7071067691f,  0.0000000000f,  1.0000000000f,
+            0.7071067691f,  0.7071067691f,  1.0000000000f,  -0.0000000000f, 0.7071067691f,
+            -0.7071067691f, 0.0000000000f,  -1.0000000000f, -0.7071067691f, -0.7071067691f,
+            -1.0000000000f, -0.0000000000f, -0.7071067691f, 0.7071067691f,  -0.0000000000f,
+            1.0000000000f,
+        },
+        {
+            0.0000000000f,  1.0000000000f,  0.7071067691f, -0.7071067691f, -1.0000000000f,
+            0.0000000000f,  0.7071067691f,  0.7071067691f, -0.0000000000f, -1.0000000000f,
+            -0.7071067691f, 0.7071067691f,  1.0000000000f, -0.0000000000f, -0.7071067691f,
+            -0.7071067691f, -0.0000000000f, 1.0000000000f, 0.7071067691f,  -0.7071067691f,
+            -1.0000000000f, -0.0000000000f, 0.7071067691f, 0.7071067691f,  0.0000000000f,
+            -1.0000000000f,
+        },
+        {
+            -0.0000000000f, -1.0000000000f, 0.7071067691f,  0.7071067691f,  -1.0000000000f,
+            0.0000000000f,  0.7071067691f,  -0.7071067691f, 0.0000000000f,  1.0000000000f,
+            -0.7071067691f, -0.7071067691f, 1.0000000000f,  -0.0000000000f, -0.7071067691f,
+            0.7071067691f,  0.0000000000f,  -1.0000000000f, 0.7071067691f,  0.7071067691f,
+            -1.0000000000f, -0.0000000000f, 0.7071067691f,  -0.7071067691f, -0.0000000000f,
+            1.0000000000f,
+        },
+        {
+            -0.0000000000f, 1.0000000000f,  -0.7071067691f, 0.7071067691f,  -1.0000000000f,
+            0.0000000000f,  -0.7071067691f, -0.7071067691f, -0.0000000000f, -1.0000000000f,
+            0.7071067691f,  -0.7071067691f, 1.0000000000f,  -0.0000000000f, 0.7071067691f,
+            0.7071067691f,  -0.0000000000f, 1.0000000000f,  -0.7071067691f, 0.7071067691f,
+            -1.0000000000f, -0.0000000000f, -0.7071067691f, -0.7071067691f, -0.0000000000f,
+            -1.0000000000f,
+        },
+    },
+    // const FLOAT32 cos_sin_mod_8channel[8][13 * 2] =
+    {
+        {
+            -0.7071067691f, 0.7071067691f,  -0.3826834261f, 0.9238795042f,  0.0000000000f,
+            1.0000000000f,  0.3826834261f,  0.9238795042f,  0.7071067691f,  0.7071067691f,
+            0.9238795042f,  0.3826834261f,  1.0000000000f,  -0.0000000000f, 0.9238795042f,
+            -0.3826834261f, 0.7071067691f,  -0.7071067691f, 0.3826834261f,  -0.9238795042f,
+            0.0000000000f,  -1.0000000000f, -0.3826834261f, -0.9238795042f, -0.7071067691f,
+            -0.7071067691f,
+        },
+        {
+            0.7071067691f,  0.7071067691f,  0.9238795042f,  -0.3826834261f, -0.0000000000f,
+            -1.0000000000f, -0.9238795042f, -0.3826834261f, -0.7071067691f, 0.7071067691f,
+            0.3826834261f,  0.9238795042f,  1.0000000000f,  -0.0000000000f, 0.3826834261f,
+            -0.9238795042f, -0.7071067691f, -0.7071067691f, -0.9238795042f, 0.3826834261f,
+            -0.0000000000f, 1.0000000000f,  0.9238795042f,  0.3826834261f,  0.7071067691f,
+            -0.7071067691f,
+        },
+        {
+            0.7071067691f,  -0.7071067691f, -0.9238795042f, -0.3826834261f, 0.0000000000f,
+            1.0000000000f,  0.9238795042f,  -0.3826834261f, -0.7071067691f, -0.7071067691f,
+            -0.3826834261f, 0.9238795042f,  1.0000000000f,  -0.0000000000f, -0.3826834261f,
+            -0.9238795042f, -0.7071067691f, 0.7071067691f,  0.9238795042f,  0.3826834261f,
+            0.0000000000f,  -1.0000000000f, -0.9238795042f, 0.3826834261f,  0.7071067691f,
+            0.7071067691f,
+        },
+        {
+            -0.7071067691f, -0.7071067691f, 0.3826834261f, 0.9238795042f,  -0.0000000000f,
+            -1.0000000000f, -0.3826834261f, 0.9238795042f, 0.7071067691f,  -0.7071067691f,
+            -0.9238795042f, 0.3826834261f,  1.0000000000f, -0.0000000000f, -0.9238795042f,
+            -0.3826834261f, 0.7071067691f,  0.7071067691f, -0.3826834261f, -0.9238795042f,
+            -0.0000000000f, 1.0000000000f,  0.3826834261f, -0.9238795042f, -0.7071067691f,
+            0.7071067691f,
+        },
+        {
+            -0.7071067691f, 0.7071067691f,  0.3826834261f,  -0.9238795042f, 0.0000000000f,
+            1.0000000000f,  -0.3826834261f, -0.9238795042f, 0.7071067691f,  0.7071067691f,
+            -0.9238795042f, -0.3826834261f, 1.0000000000f,  -0.0000000000f, -0.9238795042f,
+            0.3826834261f,  0.7071067691f,  -0.7071067691f, -0.3826834261f, 0.9238795042f,
+            0.0000000000f,  -1.0000000000f, 0.3826834261f,  0.9238795042f,  -0.7071067691f,
+            -0.7071067691f,
+        },
+        {
+            0.7071067691f,  0.7071067691f,  -0.9238795042f, 0.3826834261f,  -0.0000000000f,
+            -1.0000000000f, 0.9238795042f,  0.3826834261f,  -0.7071067691f, 0.7071067691f,
+            -0.3826834261f, -0.9238795042f, 1.0000000000f,  -0.0000000000f, -0.3826834261f,
+            0.9238795042f,  -0.7071067691f, -0.7071067691f, 0.9238795042f,  -0.3826834261f,
+            -0.0000000000f, 1.0000000000f,  -0.9238795042f, -0.3826834261f, 0.7071067691f,
+            -0.7071067691f,
+        },
+        {
+            0.7071067691f,  -0.7071067691f, 0.9238795042f, 0.3826834261f,  -0.0000000000f,
+            1.0000000000f,  -0.9238795042f, 0.3826834261f, -0.7071067691f, -0.7071067691f,
+            0.3826834261f,  -0.9238795042f, 1.0000000000f, -0.0000000000f, 0.3826834261f,
+            0.9238795042f,  -0.7071067691f, 0.7071067691f, -0.9238795042f, -0.3826834261f,
+            -0.0000000000f, -1.0000000000f, 0.9238795042f, -0.3826834261f, 0.7071067691f,
+            0.7071067691f,
+        },
+        {
+            -0.7071067691f, -0.7071067691f, -0.3826834261f, -0.9238795042f, -0.0000000000f,
+            -1.0000000000f, 0.3826834261f,  -0.9238795042f, 0.7071067691f,  -0.7071067691f,
+            0.9238795042f,  -0.3826834261f, 1.0000000000f,  -0.0000000000f, 0.9238795042f,
+            0.3826834261f,  0.7071067691f,  0.7071067691f,  0.3826834261f,  0.9238795042f,
+            -0.0000000000f, 1.0000000000f,  -0.3826834261f, 0.9238795042f,  -0.7071067691f,
+            0.7071067691f,
+        },
+    },
+    // const FLOAT32 cos_sin_mod_12channel[12][13 * 2] =
+    {
+        {
+            0.0000000000f,  1.0000000000f,  0.2588190436f,  0.9659258127f,  0.5000000000f,
+            0.8660253882f,  0.7071067691f,  0.7071067691f,  0.8660253882f,  0.5000000000f,
+            0.9659258127f,  0.2588190436f,  1.0000000000f,  -0.0000000000f, 0.9659258127f,
+            -0.2588190436f, 0.8660253882f,  -0.5000000000f, 0.7071067691f,  -0.7071067691f,
+            0.5000000000f,  -0.8660253882f, 0.2588190436f,  -0.9659258127f, 0.0000000000f,
+            -1.0000000000f,
+        },
+        {
+            -0.0000000000f, -1.0000000000f, -0.7071067691f, -0.7071067691f, -1.0000000000f,
+            0.0000000000f,  -0.7071067691f, 0.7071067691f,  0.0000000000f,  1.0000000000f,
+            0.7071067691f,  0.7071067691f,  1.0000000000f,  -0.0000000000f, 0.7071067691f,
+            -0.7071067691f, 0.0000000000f,  -1.0000000000f, -0.7071067691f, -0.7071067691f,
+            -1.0000000000f, -0.0000000000f, -0.7071067691f, 0.7071067691f,  -0.0000000000f,
+            1.0000000000f,
+        },
+        {
+            0.0000000000f,  1.0000000000f,  0.9659258127f,  0.2588190436f,  0.5000000000f,
+            -0.8660253882f, -0.7071067691f, -0.7071067691f, -0.8660253882f, 0.5000000000f,
+            0.2588190436f,  0.9659258127f,  1.0000000000f,  -0.0000000000f, 0.2588190436f,
+            -0.9659258127f, -0.8660253882f, -0.5000000000f, -0.7071067691f, 0.7071067691f,
+            0.5000000000f,  0.8660253882f,  0.9659258127f,  -0.2588190436f, 0.0000000000f,
+            -1.0000000000f,
+        },
+        {
+            -0.0000000000f, -1.0000000000f, -0.9659258127f, 0.2588190436f,  0.5000000000f,
+            0.8660253882f,  0.7071067691f,  -0.7071067691f, -0.8660253882f, -0.5000000000f,
+            -0.2588190436f, 0.9659258127f,  1.0000000000f,  -0.0000000000f, -0.2588190436f,
+            -0.9659258127f, -0.8660253882f, 0.5000000000f,  0.7071067691f,  0.7071067691f,
+            0.5000000000f,  -0.8660253882f, -0.9659258127f, -0.2588190436f, -0.0000000000f,
+            1.0000000000f,
+        },
+        {
+            0.0000000000f,  1.0000000000f,  0.7071067691f, -0.7071067691f, -1.0000000000f,
+            0.0000000000f,  0.7071067691f,  0.7071067691f, -0.0000000000f, -1.0000000000f,
+            -0.7071067691f, 0.7071067691f,  1.0000000000f, -0.0000000000f, -0.7071067691f,
+            -0.7071067691f, -0.0000000000f, 1.0000000000f, 0.7071067691f,  -0.7071067691f,
+            -1.0000000000f, -0.0000000000f, 0.7071067691f, 0.7071067691f,  0.0000000000f,
+            -1.0000000000f,
+        },
+        {
+            -0.0000000000f, -1.0000000000f, -0.2588190436f, 0.9659258127f,  0.5000000000f,
+            -0.8660253882f, -0.7071067691f, 0.7071067691f,  0.8660253882f,  -0.5000000000f,
+            -0.9659258127f, 0.2588190436f,  1.0000000000f,  -0.0000000000f, -0.9659258127f,
+            -0.2588190436f, 0.8660253882f,  0.5000000000f,  -0.7071067691f, -0.7071067691f,
+            0.5000000000f,  0.8660253882f,  -0.2588190436f, -0.9659258127f, -0.0000000000f,
+            1.0000000000f,
+        },
+        {
+            -0.0000000000f, 1.0000000000f,  -0.2588190436f, -0.9659258127f, 0.5000000000f,
+            0.8660253882f,  -0.7071067691f, -0.7071067691f, 0.8660253882f,  0.5000000000f,
+            -0.9659258127f, -0.2588190436f, 1.0000000000f,  -0.0000000000f, -0.9659258127f,
+            0.2588190436f,  0.8660253882f,  -0.5000000000f, -0.7071067691f, 0.7071067691f,
+            0.5000000000f,  -0.8660253882f, -0.2588190436f, 0.9659258127f,  -0.0000000000f,
+            -1.0000000000f,
+        },
+        {
+            -0.0000000000f, -1.0000000000f, 0.7071067691f,  0.7071067691f,  -1.0000000000f,
+            0.0000000000f,  0.7071067691f,  -0.7071067691f, 0.0000000000f,  1.0000000000f,
+            -0.7071067691f, -0.7071067691f, 1.0000000000f,  -0.0000000000f, -0.7071067691f,
+            0.7071067691f,  0.0000000000f,  -1.0000000000f, 0.7071067691f,  0.7071067691f,
+            -1.0000000000f, -0.0000000000f, 0.7071067691f,  -0.7071067691f, -0.0000000000f,
+            1.0000000000f,
+        },
+        {
+            -0.0000000000f, 1.0000000000f,  -0.9659258127f, -0.2588190436f, 0.5000000000f,
+            -0.8660253882f, 0.7071067691f,  0.7071067691f,  -0.8660253882f, 0.5000000000f,
+            -0.2588190436f, -0.9659258127f, 1.0000000000f,  -0.0000000000f, -0.2588190436f,
+            0.9659258127f,  -0.8660253882f, -0.5000000000f, 0.7071067691f,  -0.7071067691f,
+            0.5000000000f,  0.8660253882f,  -0.9659258127f, 0.2588190436f,  -0.0000000000f,
+            -1.0000000000f,
+        },
+        {
+            -0.0000000000f, -1.0000000000f, 0.9659258127f, -0.2588190436f, 0.5000000000f,
+            0.8660253882f,  -0.7071067691f, 0.7071067691f, -0.8660253882f, -0.5000000000f,
+            0.2588190436f,  -0.9659258127f, 1.0000000000f, -0.0000000000f, 0.2588190436f,
+            0.9659258127f,  -0.8660253882f, 0.5000000000f, -0.7071067691f, -0.7071067691f,
+            0.5000000000f,  -0.8660253882f, 0.9659258127f, 0.2588190436f,  -0.0000000000f,
+            1.0000000000f,
+        },
+        {
+            -0.0000000000f, 1.0000000000f,  -0.7071067691f, 0.7071067691f,  -1.0000000000f,
+            0.0000000000f,  -0.7071067691f, -0.7071067691f, -0.0000000000f, -1.0000000000f,
+            0.7071067691f,  -0.7071067691f, 1.0000000000f,  -0.0000000000f, 0.7071067691f,
+            0.7071067691f,  -0.0000000000f, 1.0000000000f,  -0.7071067691f, 0.7071067691f,
+            -1.0000000000f, -0.0000000000f, -0.7071067691f, -0.7071067691f, -0.0000000000f,
+            -1.0000000000f,
+        },
+        {
+            -0.0000000000f, -1.0000000000f, 0.2588190436f,  -0.9659258127f, 0.5000000000f,
+            -0.8660253882f, 0.7071067691f,  -0.7071067691f, 0.8660253882f,  -0.5000000000f,
+            0.9659258127f,  -0.2588190436f, 1.0000000000f,  -0.0000000000f, 0.9659258127f,
+            0.2588190436f,  0.8660253882f,  0.5000000000f,  0.7071067691f,  0.7071067691f,
+            0.5000000000f,  0.8660253882f,  0.2588190436f,  0.9659258127f,  -0.0000000000f,
+            1.0000000000f,
+        },
+    },
+
+    // const WORD32 qmf_delay_idx_tbl[NUM_OF_QUAD_MIRROR_FILTER_CHNLS]
+    {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1,  1,  1,  1,  1,  1,  1,  1,  1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1},
+
+    // const WORD32 group_borders_20_tbl[NUM_IID_GROUPS + 1]
+    {6, 7, 0, 1, 2, 3, 9, 8, 10, 11, 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64},
+
+    // const WORD32
+    // group_borders_34_tbl[NUM_IID_GROUPS_HI_RES + 1] =
+    {0,       1,       2,       3,       4,       5,       6,       7,       8,
+     9,       10,      11,      12,      13,      14,      15,      16,      17,
+     18,      19,      20,      21,      22,      23,      24,      25,      26,
+     27,      28,      29,      30,      31,      32 - 27, 33 - 27, 34 - 27, 35 - 27,
+     36 - 27, 37 - 27, 38 - 27, 40 - 27, 42 - 27, 44 - 27, 46 - 27, 48 - 27, 51 - 27,
+     54 - 27, 57 - 27, 60 - 27, 64 - 27, 68 - 27, 91 - 27},
+
+    // const WORD32 bin_group_map_20[NUM_IID_GROUPS] =
+    {(NEGATE_IPD_MASK | 1),
+     (NEGATE_IPD_MASK | 0),
+     0,
+     1,
+     2,
+     3,
+     4,
+     5,
+     6,
+     7,
+     8,
+     9,
+     10,
+     11,
+     12,
+     13,
+     14,
+     15,
+     16,
+     17,
+     18,
+     19},
+
+    // const WORD32 bin_group_map_34[NUM_IID_GROUPS_HI_RES] =
+    {0,
+     1,
+     2,
+     3,
+     4,
+     5,
+     6,
+     6,
+     7,
+     (NEGATE_IPD_MASK | 2),
+     (NEGATE_IPD_MASK | 1),
+     (NEGATE_IPD_MASK | 0),
+     10,
+     10,
+     4,
+     5,
+     6,
+     7,
+     8,
+     9,
+     10,
+     11,
+     12,
+     9,
+     14,
+     11,
+     12,
+     13,
+     14,
+     15,
+     16,
+     13,
+     16,
+     17,
+     18,
+     19,
+     20,
+     21,
+     22,
+     23,
+     24,
+     25,
+     26,
+     27,
+     28,
+     29,
+     30,
+     31,
+     32,
+     33},
+    // const WORD32 quantized_iids[NUM_IID_STEPS] =
+    {2, 4, 7, 10, 14, 18, 25},
+    // const WORD32 quantized_iids_fine[NUM_IID_STEPS_FINE]
+    {2, 4, 6, 8, 10, 13, 16, 19, 22, 25, 30, 35, 40, 45, 50},
+    // FLOAT32 quantized_rhos[NUM_ICC_STEPS]
+    {1.0f, 0.937f, 0.84118f, 0.60092f, 0.36764f, 0.0f, -0.589f, -1.0f},
+    // const WORD32 ipd_bins_tbl[3]
+    {NUM_LOW_RES_IPD_BINS, NUM_MID_RES_IPD_BINS, NUM_HI_RES_IPD_BINS},
+    // const WORD16 band_res_hyb20[3]
+    {NO_HYBRID_CHANNELS_8, NO_HYBRID_CHANNELS_2, NO_HYBRID_CHANNELS_2},
+    // const WORD16 band_res_hyb34[5] =
+    {NO_HYBRID_CHANNELS_12, NO_HYBRID_CHANNELS_8, NO_HYBRID_CHANNELS_4,
+     NO_HYBRID_CHANNELS_4, NO_HYBRID_CHANNELS_4},
+};
diff --git a/decoder/ixheaacd_sbr_rom.h b/decoder/ixheaacd_sbr_rom.h
index dcd081a..45feb33 100644
--- a/decoder/ixheaacd_sbr_rom.h
+++ b/decoder/ixheaacd_sbr_rom.h
@@ -33,6 +33,28 @@
 #define NO_IID_LEVELS_FINE (2 * NUM_IID_LEVELS_FINE + 1)
 #define NO_ICC_LEVELS (NUM_ICC_LEVELS)
 
+#define IPD_QMF_GROUPS (3)
+
+#define SUBQMF_GROUPS_HI_RES (32)
+#define QMF_GROUPS_HI_RES (18)
+#define IPD_QMF_GROUPS_HI_RES (1)
+
+#define NUM_IID_GROUPS (SUBQMF_GROUPS + QMF_GROUPS)
+#define NUM_IPD_GROUPS (SUBQMF_GROUPS + IPD_QMF_GROUPS)
+
+#define NUM_IID_GROUPS_HI_RES (SUBQMF_GROUPS_HI_RES + QMF_GROUPS_HI_RES)
+#define NUM_IPD_GROUPS_HI_RES (SUBQMF_GROUPS_HI_RES + IPD_QMF_GROUPS_HI_RES)
+
+#define NUM_SUB_QMF_CHANNELS 12
+#define NUM_SUB_QMF_CHANNELS_HI_RES 32
+
+#define NUM_QUAD_MIRROR_FILTER_CHNLS 64
+
+#define NUM_IID_STEPS (7)
+#define NUM_IID_STEPS_FINE (15)
+#define NUM_ICC_STEPS (8)
+#define HYBRID_FILTER_LENGTH 13
+
 typedef struct {
   WORD16 sbr_lim_gains_m[8];
 
@@ -92,6 +114,7 @@
   WORD16 qmf_c_eld2[640];
 
   WORD16 qmf_c_eld3[640];
+  WORD32 qmf_c_ldsbr_mps[640];
 
   WORD16 ixheaacd_sbr_synth_cos_sin_l32[64 + 64];
 
@@ -100,7 +123,7 @@
 extern const ia_qmf_dec_tables_struct ixheaacd_aac_qmf_dec_tables;
 
 typedef struct {
-  ia_frame_info_struct sbr_frame_info1_2_4_16[3 + 1];
+  ia_frame_info_struct sbr_frame_info1_2_4_16[3 + 1 + 3];
 
   ia_sbr_header_data_struct str_sbr_default_header;
   WORD16 ixheaacd_t_huffman_env_bal_1_5db_inp_table[50];
@@ -165,6 +188,53 @@
   WORD16 huff_iid_df_fine[60];
   WORD32 dummy;
 
+  FLOAT32 qmf_fract_delay_phase_factor_im[NUM_QUAD_MIRROR_FILTER_CHNLS];
+  FLOAT32 qmf_fract_delay_phase_factor_re[NUM_QUAD_MIRROR_FILTER_CHNLS];
+
+  FLOAT32 frac_delay_phase_fac_qmf_sub_im_20[NUM_SUB_QMF_CHANNELS];
+  FLOAT32 frac_delay_phase_fac_qmf_sub_re_20[NUM_SUB_QMF_CHANNELS];
+  FLOAT32 frac_delay_phase_fac_qmf_sub_im_34[NUM_SUB_QMF_CHANNELS_HI_RES];
+  FLOAT32 frac_delay_phase_fac_qmf_sub_re_34[NUM_SUB_QMF_CHANNELS_HI_RES];
+
+  FLOAT32 qmf_ser_fract_delay_phase_factor_im[NUM_QUAD_MIRROR_FILTER_CHNLS]
+                                             [NUM_SER_AP_LINKS];
+  FLOAT32 qmf_ser_fract_delay_phase_factor_re[NUM_QUAD_MIRROR_FILTER_CHNLS]
+                                             [NUM_SER_AP_LINKS];
+
+  FLOAT32 frac_delay_phase_fac_ser_qmf_sub_im_20[NUM_SUB_QMF_CHANNELS][NUM_SER_AP_LINKS];
+  FLOAT32 frac_delay_phase_fac_ser_qmf_sub_re_20[NUM_SUB_QMF_CHANNELS][NUM_SER_AP_LINKS];
+  FLOAT32 frac_delay_phase_fac_ser_qmf_sub_im_34[NUM_SUB_QMF_CHANNELS_HI_RES]
+                                                [NUM_SER_AP_LINKS];
+  FLOAT32 frac_delay_phase_fac_ser_qmf_sub_re_34[NUM_SUB_QMF_CHANNELS_HI_RES]
+                                                [NUM_SER_AP_LINKS];
+
+  FLOAT32 scale_factors_flt[NO_IID_LEVELS];
+  FLOAT32 scale_factors_fine_flt[NO_IID_LEVELS_FINE];
+
+  FLOAT32 alphas[NUM_ICC_LEVELS];
+  FLOAT32 all_pass_link_decay_ser[NUM_SER_AP_LINKS];
+  FLOAT32 p8_13_20[HYBRID_FILTER_LENGTH];
+  FLOAT32 p2_13_20[HYBRID_FILTER_LENGTH];
+  FLOAT32 p12_13_34[HYBRID_FILTER_LENGTH];
+  FLOAT32 p8_13_34[HYBRID_FILTER_LENGTH];
+  FLOAT32 p4_13_34[HYBRID_FILTER_LENGTH];
+  FLOAT32 cos_mod_2channel[2][HYBRID_FILTER_LENGTH];
+  FLOAT32 cos_sin_mod_4channel[4][HYBRID_FILTER_LENGTH * 2];
+  FLOAT32 cos_sin_mod_8channel[8][HYBRID_FILTER_LENGTH * 2];
+  FLOAT32 cos_sin_mod_12channel[12][HYBRID_FILTER_LENGTH * 2];
+
+  WORD32 qmf_delay_idx_tbl[NUM_QUAD_MIRROR_FILTER_CHNLS];
+  WORD32 group_borders_20_tbl[NUM_IID_GROUPS + 1];
+  WORD32 group_borders_34_tbl[NUM_IID_GROUPS_HI_RES + 1];
+  WORD32 bin_group_map_20[NUM_IID_GROUPS];
+  WORD32 bin_group_map_34[NUM_IID_GROUPS_HI_RES];
+  WORD32 quantized_iids[NUM_IID_STEPS];
+  WORD32 quantized_iids_fine[NUM_IID_STEPS_FINE];
+  FLOAT32 quantized_rhos[NUM_ICC_STEPS];
+  WORD32 ipd_bins_tbl[3];
+
+  WORD16 band_res_hyb20[3];
+  WORD16 band_res_hyb34[5];
 } ia_ps_tables_struct;
 
 extern const ia_ps_tables_struct ixheaacd_aac_dec_ps_tables;
diff --git a/decoder/ixheaacd_sbrdec_initfuncs.c b/decoder/ixheaacd_sbrdec_initfuncs.c
index f779c84..15d6981 100644
--- a/decoder/ixheaacd_sbrdec_initfuncs.c
+++ b/decoder/ixheaacd_sbrdec_initfuncs.c
@@ -40,6 +40,9 @@
 
 #include "ixheaacd_drc_data_struct.h"
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -66,13 +69,17 @@
 #include "ixheaacd_env_dec.h"
 #include "ixheaacd_basic_funcs.h"
 #include "ixheaacd_sbr_crc.h"
-#include "ixheaacd_error_standards.h"
+
 #include "ixheaacd_sbrqmftrans.h"
 
 #include "ixheaacd_audioobjtypes.h"
 
+extern const WORD32 ixheaacd_ldmps_polyphase_filter_coeff_fix[1280];
+
 #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
 
+#define FD_OVERSAMPLING_FAC (1.5f)
+
 WORD32 ixheaacd_getsize_sbr_persistent() {
   return (ALIGN_SIZE64(sizeof(ia_sbr_pers_struct)));
 }
@@ -80,7 +87,8 @@
 VOID ixheaacd_esbr_hbe_data_init(
     ia_esbr_hbe_txposer_struct *pstr_esbr_hbe_txposer,
     const WORD32 num_aac_samples, WORD32 samp_fac_4_flag,
-    const WORD32 num_out_samples, VOID *persistent_hbe_mem) {
+    const WORD32 num_out_samples, VOID *persistent_hbe_mem,
+    WORD32 *total_persistant) {
   WORD32 i;
   WORD32 used_persistent = 0;
 
@@ -90,9 +98,8 @@
     pstr_esbr_hbe_txposer->core_frame_length = num_aac_samples;
 
     pstr_esbr_hbe_txposer->no_bins = num_out_samples / NO_QMF_SYNTH_CHANNELS;
-
     pstr_esbr_hbe_txposer->hbe_qmf_in_len =
-        pstr_esbr_hbe_txposer->no_bins / 2 + HBE_OPER_WIN_LEN - 1;
+        pstr_esbr_hbe_txposer->no_bins;
     pstr_esbr_hbe_txposer->hbe_qmf_out_len =
         2 * pstr_esbr_hbe_txposer->hbe_qmf_in_len;
 
@@ -124,8 +131,19 @@
       used_persistent += (TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
     }
     pstr_esbr_hbe_txposer->upsamp_4_flag = samp_fac_4_flag;
-  }
+    if (pstr_esbr_hbe_txposer) {
+      pstr_esbr_hbe_txposer->fft_size[0] = num_aac_samples;
+      pstr_esbr_hbe_txposer->fft_size[1] = (WORD32)(FD_OVERSAMPLING_FAC * num_aac_samples);
 
+      pstr_esbr_hbe_txposer->ptr_spectrum = &pstr_esbr_hbe_txposer->spectrum_buf[0];
+      pstr_esbr_hbe_txposer->ptr_spectrum_tx =
+          &pstr_esbr_hbe_txposer->spectrum_transposed_buf[0];
+      pstr_esbr_hbe_txposer->mag = &pstr_esbr_hbe_txposer->mag_buf[0];
+      pstr_esbr_hbe_txposer->phase = &pstr_esbr_hbe_txposer->phase_buf[0];
+      pstr_esbr_hbe_txposer->ptr_output_buf = &pstr_esbr_hbe_txposer->output_buf[0];
+    }
+  }
+  *total_persistant = used_persistent;
   return;
 }
 
@@ -150,6 +168,7 @@
   struct ia_sbr_dec_inst_struct *p_str_sbr_dec_inst =
       &sbr_persistent_mem->str_sbr_dec_inst;
 
+  num_channel = max(2, num_channel);
   memset(sbr_persistent_mem, 0, sizeof(struct ia_sbr_pers_struct));
 
   sbr_persistent_mem->sbr_qmf_analy_states =
@@ -389,61 +408,6 @@
   *persistent_used = used_persistent;
 }
 
-WORD32 ia_enhaacplus_dec_get_sbr_buffers_size(WORD32 channels) {
-  WORD32 sbr_buffers_size = 0;
-  WORD32 temp, temp2;
-  WORD32 num_channel = channels;
-  WORD32 i;
-
-  temp = num_channel * ((QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) *
-                        sizeof(WORD16));
-  sbr_buffers_size += temp;
-
-  temp2 =
-      (num_channel * ((QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) *
-                      sizeof(WORD16)));
-  sbr_buffers_size += temp2;
-
-  for (i = 0; i < num_channel; i++) {
-    sbr_buffers_size +=
-        2 * MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32);
-  }
-
-  for (i = 0; i < num_channel; i++) {
-    int j;
-    sbr_buffers_size += LPC_ORDER * sizeof(VOID *);
-
-    for (j = 0; j < LPC_ORDER; j++) {
-      sbr_buffers_size += NO_ANALYSIS_CHANNELS * sizeof(WORD32);
-    }
-  }
-
-  for (i = 0; i < num_channel; i++) {
-    int j;
-    sbr_buffers_size += LPC_ORDER * sizeof(WORD32);
-    for (j = 0; j < LPC_ORDER; j++) {
-      sbr_buffers_size += NO_ANALYSIS_CHANNELS * sizeof(WORD32);
-    }
-  }
-
-  for (i = 0; i < num_channel; i++) {
-    WORD32 temp_used = sbr_buffers_size;
-
-    temp_used += 2 * MAX_FREQ_COEFFS * sizeof(WORD16);
-    temp_used += MAX_FREQ_COEFFS * sizeof(WORD16);
-    temp_used += ALIGN_SIZE64(sizeof(ia_freq_band_data_struct));
-    temp_used += ALIGN_SIZE64(sizeof(ia_sbr_prev_frame_data_struct));
-    temp_used += ALIGN_SIZE64(sizeof(ia_sbr_channel_struct));
-    temp_used += ALIGN_SIZE64(sizeof(ia_sbr_header_data_struct));
-
-    sbr_buffers_size = temp_used;
-  }
-
-  sbr_buffers_size += sizeof(ia_ps_dec_struct);
-
-  return sbr_buffers_size;
-}
-
 static PLATFORM_INLINE VOID ixheaacd_init_headerdata(
     ia_sbr_header_data_struct *ptr_header_data, WORD32 sample_rate_dec,
     WORD32 samp_per_frame, ia_freq_band_data_struct *freq_band_data,
@@ -500,7 +464,8 @@
     VOID *sbr_persistent_mem_v, WORD32 *ptr_overlap_buf, WORD32 channel,
     WORD32 ps_enable, WORD32 sbr_ratio_idx, WORD32 output_frame_size,
     WORD32 *use_hbe, VOID *p_usac_dflt_header,
-    ia_sbr_header_data_struct str_sbr_config, WORD32 audio_object_type) {
+    ia_sbr_header_data_struct str_sbr_config, WORD32 audio_object_type,
+    WORD32 ldmps_present, WORD32 ldsbr_present) {
   WORD16 i;
   WORD16 err;
   ia_sbr_header_data_struct *ptr_header_data[MAXNRSBRCHANNELS];
@@ -540,9 +505,12 @@
         sbr_persistent_mem->str_sbr_dec_inst.pstr_common_tables,
         sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[i],
         ptr_header_data[i], i, *down_sample_flag, sbr_persistent_mem, ps_enable,
-        audio_object_type);
+        audio_object_type, ldmps_present, ldsbr_present);
 
     ptr_header_data[i]->status = 1;
+    ptr_sbr_dec[i]->band_count = 64;
+    ptr_header_data[i]->pstr_freq_band_data[0].qmf_sb_prev = 64;
+    ptr_header_data[i]->pstr_freq_band_data[1].qmf_sb_prev = 64;
 
     if (err) {
       return NULL;
@@ -554,15 +522,16 @@
       if (audio_object_type == AOT_ER_AAC_ELD)
         ixheaacd_create_psdec(
             sbr_persistent_mem->str_sbr_dec_inst.pstr_ps_stereo_dec,
-            sbr_persistent_mem, &ptr_overlap_buf[512 * 4]);
+            sbr_persistent_mem, &ptr_overlap_buf[512 * 4], samp_per_frame);
       else
         ixheaacd_create_psdec(
             sbr_persistent_mem->str_sbr_dec_inst.pstr_ps_stereo_dec,
-            sbr_persistent_mem, ptr_overlap_buf);
+            sbr_persistent_mem, ptr_overlap_buf, samp_per_frame);
     }
   }
 
-  if (use_hbe != NULL) {
+  if ((use_hbe != NULL) && !((audio_object_type == AOT_ER_AAC_ELD) ||
+     (audio_object_type == AOT_ER_AAC_LD))) {
     ia_sbr_header_data_struct *ptr_sbr_dflt_header =
         &sbr_persistent_mem->str_sbr_dec_inst.str_sbr_dflt_header;
     ia_sbr_header_data_struct *ptr_usac_dflt_header =
@@ -587,17 +556,18 @@
       ptr_header_data[1]->esbr_start_up = 1;
       ptr_header_data[1]->esbr_start_up_pvc = 1;
     }
-    if (hbe_txposer_buffers != NULL && (use_hbe[0] == 1)) {
+    if (hbe_txposer_buffers != NULL) {
+      WORD32 persistant_used = 0;
       ixheaacd_esbr_hbe_data_init(ptr_sbr_dec[0]->p_hbe_txposer, samp_per_frame,
                                   sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1 ? 1 : 0,
-                                  output_frame_size, hbe_txposer_buffers);
+                                  output_frame_size, hbe_txposer_buffers, &persistant_used);
 
       hbe_txposer_buffers =
           (WORD8 *)hbe_txposer_buffers + MAX_HBE_PERSISTENT_SIZE;
 
       ixheaacd_esbr_hbe_data_init(ptr_sbr_dec[1]->p_hbe_txposer, samp_per_frame,
                                   sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1 ? 1 : 0,
-                                  output_frame_size, hbe_txposer_buffers);
+                                  output_frame_size, hbe_txposer_buffers, &persistant_used);
     }
 
     p_str_sbr_dec_inst->ptr_pvc_data_str->prev_first_bnd_idx = -1;
@@ -627,11 +597,11 @@
         ptr_header_data[0]->upsamp_fac = 1;
 
         ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 32;
-        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
+        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_cos_twiddle =
             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
-        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
+        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
-        ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
+        ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_t_cos =
             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
         ptr_header_data[1]->is_usf_4 = 0;
         ptr_header_data[1]->upsamp_fac = 1;
@@ -715,30 +685,32 @@
         break;
     }
 
-    ptr_sbr_dflt_header->start_freq = ptr_usac_dflt_header->start_freq;
-    ptr_sbr_dflt_header->stop_freq = ptr_usac_dflt_header->stop_freq;
+    if (ptr_usac_dflt_header != NULL) {
+      ptr_sbr_dflt_header->start_freq = ptr_usac_dflt_header->start_freq;
+      ptr_sbr_dflt_header->stop_freq = ptr_usac_dflt_header->stop_freq;
 
-    if (ptr_usac_dflt_header->header_extra_1) {
-      ptr_sbr_dflt_header->freq_scale = ptr_usac_dflt_header->freq_scale;
-      ptr_sbr_dflt_header->alter_scale = ptr_usac_dflt_header->alter_scale;
-      ptr_sbr_dflt_header->noise_bands = ptr_usac_dflt_header->noise_bands;
-    } else {
-      ptr_sbr_dflt_header->freq_scale = SBR_FREQ_SCALE_DEFAULT;
-      ptr_sbr_dflt_header->alter_scale = SBR_ALTER_SCALE_DEFAULT;
-      ptr_sbr_dflt_header->noise_bands = SBR_NOISE_BANDS_DEFAULT;
-    }
+      if (ptr_usac_dflt_header->header_extra_1) {
+        ptr_sbr_dflt_header->freq_scale = ptr_usac_dflt_header->freq_scale;
+        ptr_sbr_dflt_header->alter_scale = ptr_usac_dflt_header->alter_scale;
+        ptr_sbr_dflt_header->noise_bands = ptr_usac_dflt_header->noise_bands;
+      } else {
+        ptr_sbr_dflt_header->freq_scale = SBR_FREQ_SCALE_DEFAULT;
+        ptr_sbr_dflt_header->alter_scale = SBR_ALTER_SCALE_DEFAULT;
+        ptr_sbr_dflt_header->noise_bands = SBR_NOISE_BANDS_DEFAULT;
+      }
 
-    if (ptr_usac_dflt_header->header_extra_2) {
-      ptr_sbr_dflt_header->limiter_bands = ptr_usac_dflt_header->limiter_bands;
-      ptr_sbr_dflt_header->limiter_gains = ptr_usac_dflt_header->limiter_gains;
-      ptr_sbr_dflt_header->interpol_freq = ptr_usac_dflt_header->interpol_freq;
-      ptr_sbr_dflt_header->smoothing_mode =
-          ptr_usac_dflt_header->smoothing_mode;
-    } else {
-      ptr_sbr_dflt_header->limiter_bands = SBR_LIMITER_BANDS_DEFAULT;
-      ptr_sbr_dflt_header->limiter_gains = SBR_LIMITER_GAINS_DEFAULT;
-      ptr_sbr_dflt_header->interpol_freq = SBR_INTERPOL_FREQ_DEFAULT;
-      ptr_sbr_dflt_header->smoothing_mode = SBR_SMOOTHING_LENGTH_DEFAULT;
+      if (ptr_usac_dflt_header->header_extra_2) {
+        ptr_sbr_dflt_header->limiter_bands = ptr_usac_dflt_header->limiter_bands;
+        ptr_sbr_dflt_header->limiter_gains = ptr_usac_dflt_header->limiter_gains;
+        ptr_sbr_dflt_header->interpol_freq = ptr_usac_dflt_header->interpol_freq;
+        ptr_sbr_dflt_header->smoothing_mode =
+            ptr_usac_dflt_header->smoothing_mode;
+      } else {
+        ptr_sbr_dflt_header->limiter_bands = SBR_LIMITER_BANDS_DEFAULT;
+        ptr_sbr_dflt_header->limiter_gains = SBR_LIMITER_GAINS_DEFAULT;
+        ptr_sbr_dflt_header->interpol_freq = SBR_INTERPOL_FREQ_DEFAULT;
+        ptr_sbr_dflt_header->smoothing_mode = SBR_SMOOTHING_LENGTH_DEFAULT;
+      }
     }
   }
   return &(sbr_persistent_mem->str_sbr_dec_inst);
@@ -791,7 +763,7 @@
 static PLATFORM_INLINE VOID
 ixheaacd_create_hyb_filterbank(ia_hybrid_struct *ptr_hybrid, WORD32 **p_ptr,
                                ia_sbr_tables_struct *sbr_tables_ptr) {
-  WORD16 i, ptr_step;
+  WORD16 i;
   WORD32 *ptr = (WORD32 *)*p_ptr;
 
   ptr_hybrid->ptr_resol = sbr_tables_ptr->ps_tables_ptr->hyb_resol;
@@ -805,7 +777,6 @@
   memset(ptr_hybrid->ptr_temp_re, 0,
          2 * NO_HYBRID_CHANNELS_HIGH * sizeof(WORD32));
 
-  ptr_step = ixheaacd_add16(1, ptr_hybrid->ptr_qmf_buf);
   ptr_hybrid->ptr_work_re = ptr;
   ptr += 16;
   ptr_hybrid->ptr_work_im = ptr;
@@ -849,8 +820,10 @@
   }
 
   for (i = 0; i < LPC_ORDER; i++) {
-    memset(ptr_hf_gen_str->lpc_filt_states_real[i], 0,
-           NO_ANALYSIS_CHANNELS * sizeof(WORD32));
+    if (ptr_hf_gen_str->lpc_filt_states_real[i] != NULL) {
+      memset(ptr_hf_gen_str->lpc_filt_states_real[i], 0,
+             NO_ANALYSIS_CHANNELS * sizeof(WORD32));
+    }
 
     if (ps_enable)
       memset(ptr_hf_gen_str->lpc_filt_states_imag[i], 0,
@@ -865,7 +838,7 @@
 
 VOID ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec,
                            VOID *sbr_persistent_mem_v,
-                           WORD32 *ptr_overlap_buf) {
+                           WORD32 *ptr_overlap_buf, WORD32 frame_size) {
   ia_sbr_pers_struct *sbr_persistent_mem =
       (ia_sbr_pers_struct *)sbr_persistent_mem_v;
 
@@ -949,6 +922,15 @@
          (NO_IID_GROUPS + 2) * 2 * sizeof(WORD16));
   memset(ptr_ps_dec->h21_h22_vec, 0, sizeof(ptr_ps_dec->h21_h22_vec));
 
+  if (frame_size == 960)
+    ptr_ps_dec->num_sub_samples = NUM_SUB_SAMPLES_960;
+  else
+    ptr_ps_dec->num_sub_samples = NUM_SUB_SAMPLES;
+
+
+  ixheaacd_create_ps_esbr_dec(ptr_ps_dec, sbr_tables_ptr->ps_tables_ptr,
+                              64, ptr_ps_dec->num_sub_samples, 0);
+
   return;
 }
 
@@ -956,19 +938,25 @@
     ia_sbr_qmf_filter_bank_struct *ptr_sbr_qmf,
     ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 no_bins, WORD16 usb,
     WORD16 chan, WORD16 *sbr_qmf_analy_states, WORD32 *sbr_qmf_analy_states_32,
-    ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 audio_object_type) {
+    ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 audio_object_type,
+    WORD32 ldmps_present, WORD32 no_ldsbr) {
   memset(ptr_sbr_qmf, 0, sizeof(ia_sbr_qmf_filter_bank_struct));
 
+  ptr_sbr_qmf->analy_win_coeff_32 = qmf_dec_tables_ptr->esbr_qmf_c;
   if (audio_object_type != AOT_ER_AAC_ELD &&
       audio_object_type != AOT_ER_AAC_LD) {
     ptr_sbr_qmf->analy_win_coeff = qmf_dec_tables_ptr->qmf_c;
   } else {
     ptr_sbr_qmf->analy_win_coeff = qmf_dec_tables_ptr->qmf_c_eld3;
+    if (ldmps_present == 1)
+      ptr_sbr_qmf->analy_win_coeff_32 = qmf_dec_tables_ptr->qmf_c_ldsbr_mps;
+    if (no_ldsbr == 1)
+      ptr_sbr_qmf->analy_win_coeff_32 =
+          (WORD32 *)ixheaacd_ldmps_polyphase_filter_coeff_fix;
   }
 
-  ptr_sbr_qmf->analy_win_coeff_32 = qmf_dec_tables_ptr->esbr_qmf_c;
-
   ptr_sbr_qmf->no_channels = NO_ANALYSIS_CHANNELS;
+  if (no_ldsbr) ptr_sbr_qmf->no_channels = 64;
   ptr_sbr_qmf->num_time_slots = no_bins;
 
   ptr_sbr_qmf->lsb = 0;
@@ -987,7 +975,9 @@
          sizeof(WORD32) * QMF_FILTER_STATE_ANA_SIZE);
 
   ptr_sbr_qmf->core_samples_buffer = ptr_sbr_qmf->anal_filter_states;
+  ptr_sbr_qmf->core_samples_buffer_32 = ptr_sbr_qmf->anal_filter_states_32;
 
+  ptr_sbr_qmf->filter_pos_32 = (WORD32 *)qmf_dec_tables_ptr->esbr_qmf_c;
   ptr_sbr_qmf->state_new_samples_pos_low_32 =
       ptr_sbr_qmf->anal_filter_states_32;
   if (audio_object_type != AOT_ER_AAC_ELD &&
@@ -995,20 +985,30 @@
     ptr_sbr_qmf->filter_pos = (WORD16 *)qmf_dec_tables_ptr->qmf_c;
   } else {
     ptr_sbr_qmf->filter_pos = (WORD16 *)qmf_dec_tables_ptr->qmf_c_eld3;
+    if (ldmps_present == 1)
+      ptr_sbr_qmf->filter_pos_32 =
+          (WORD32 *)qmf_dec_tables_ptr->qmf_c_ldsbr_mps;
+    if (no_ldsbr == 1)
+      ptr_sbr_qmf->filter_pos_32 =
+          (WORD32 *)ixheaacd_ldmps_polyphase_filter_coeff_fix;
   }
 
-  ptr_sbr_qmf->filter_pos_32 = (WORD32 *)qmf_dec_tables_ptr->esbr_qmf_c;
-
   sbr_scale_factor->st_lb_scale = 0;
 
   sbr_scale_factor->st_syn_scale = -6;
 
   if (audio_object_type == AOT_ER_AAC_ELD ||
       audio_object_type == AOT_ER_AAC_LD) {
-    ptr_sbr_qmf->filter_2 = ptr_sbr_qmf->filter_pos + 32;
+    ptr_sbr_qmf->filter_2_32 =
+        ptr_sbr_qmf->filter_pos_32 + ptr_sbr_qmf->no_channels;
+    ptr_sbr_qmf->fp1_anal_32 = ptr_sbr_qmf->anal_filter_states_32;
+    ptr_sbr_qmf->fp2_anal_32 =
+        ptr_sbr_qmf->anal_filter_states_32 + ptr_sbr_qmf->no_channels;
+
+    ptr_sbr_qmf->filter_2 = ptr_sbr_qmf->filter_pos + ptr_sbr_qmf->no_channels;
     ptr_sbr_qmf->fp1_anal = ptr_sbr_qmf->anal_filter_states;
     ptr_sbr_qmf->fp2_anal =
-        ptr_sbr_qmf->anal_filter_states + NO_ANALYSIS_CHANNELS;
+        ptr_sbr_qmf->anal_filter_states + ptr_sbr_qmf->no_channels;
   }
 
   return;
@@ -1024,13 +1024,14 @@
   WORD32 qmf_filter_state_size;
 
   memset(ptr_sbr_qmf, 0, sizeof(ia_sbr_qmf_filter_bank_struct));
-  qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE;
 
   if (down_sample_flag) {
     L = NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED;
+    qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
     ptr_sbr_qmf->usb = NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED;
   } else {
     L = NO_SYNTHESIS_CHANNELS;
+    qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE;
     ptr_sbr_qmf->usb = usb;
   }
 
@@ -1079,7 +1080,8 @@
                               ia_sbr_header_data_struct *ptr_header_data,
                               WORD16 chan, FLAG down_sample_flag,
                               VOID *sbr_persistent_mem_v, WORD ps_enable,
-                              WORD audio_object_type)
+                              WORD audio_object_type, WORD32 ldmps_present,
+                              WORD32 ldsbr_present)
 
 {
   WORD16 err;
@@ -1115,7 +1117,7 @@
       sbr_persistent_mem->sbr_qmf_analy_states,
       sbr_persistent_mem->sbr_qmf_analy_states_32,
       sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr,
-      audio_object_type);
+      audio_object_type, ldmps_present, ldsbr_present);
 
   ixheaacd_create_cplx_synt_qmfbank(
       &hs->str_synthesis_qmf_bank, no_bins,
diff --git a/decoder/ixheaacd_sbrdec_lpfuncs.c b/decoder/ixheaacd_sbrdec_lpfuncs.c
index 5e535dc..015e323 100644
--- a/decoder/ixheaacd_sbrdec_lpfuncs.c
+++ b/decoder/ixheaacd_sbrdec_lpfuncs.c
@@ -41,6 +41,9 @@
 
 #include "ixheaacd_drc_data_struct.h"
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -70,6 +73,7 @@
 #include "ixheaacd_function_selector.h"
 
 #include "ixheaacd_audioobjtypes.h"
+#include "ixheaacd_error_codes.h"
 
 #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
 
@@ -111,8 +115,8 @@
 
   WORD16 sub_band_start = f_low_tbl[0];
   WORD16 sub_band_end = f_low_tbl[num_low_bnd];
-  static const WORD16 limbnd_per_oct[4] = {(WORD16)0x2000, (WORD16)0x2666,
-                                           (WORD16)0x4000, (WORD16)0x6000};
+  const WORD16 limbnd_per_oct[4] = {(WORD16)0x2000, (WORD16)0x2666, (WORD16)0x4000,
+                                    (WORD16)0x6000};
 
   if (limiter_bands == 0) {
     f_lim_tbl[0] = 0;
@@ -236,7 +240,7 @@
 
   step = 1;
 
-  if (ptr_sbr_data->amp_res - SBR_AMPLITUDE_RESOLUTION_1_5 == 0) {
+  if (ptr_header_data->amp_res - SBR_AMPLITUDE_RESOLUTION_1_5 == 0) {
     target = (target << 1);
     step = (step << 1);
   }
@@ -251,7 +255,7 @@
   ptr_sbr_data->del_cod_dir_noise_arr[0] = DTDF_DIR_TIME;
 
   memset(ptr_sbr_data->int_noise_floor, 0,
-         sizeof(WORD16) * ptr_header_data->pstr_freq_band_data->num_nf_bands);
+         sizeof(ptr_sbr_data->int_noise_floor));
 
   memset(ptr_sbr_data->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
 }
@@ -570,10 +574,9 @@
 
 extern const WORD16 ixheaacd_num_bands[3];
 
-WORD16 ixheaacd_read_ps_data(ia_ps_dec_struct *ptr_ps_dec,
-                             ia_bit_buf_struct *it_bit_buff,
-                             WORD16 num_bits_left,
-                             ia_ps_tables_struct *ps_tables_ptr) {
+IA_ERRORCODE ixheaacd_read_ps_data(ia_ps_dec_struct *ptr_ps_dec, ia_bit_buf_struct *it_bit_buff,
+                                   WORD16 num_bits_left, ia_ps_tables_struct *ps_tables_ptr)
+{
   WORD b, e, temp;
   const WORD16 num_env_tab[4] = {0, 1, 2, 4};
   WORD cnt_bits;
@@ -610,9 +613,19 @@
 
     if (ptr_ps_dec->icc_mode > 2) {
       ptr_ps_dec->icc_mode -= 3;
+      ptr_ps_dec->use_pca_rot_flg = 1;
+    } else {
+      ptr_ps_dec->use_pca_rot_flg = 0;
+    }
+    ptr_ps_dec->freq_res_ipd = ptr_ps_dec->iid_mode;
+    if (ptr_ps_dec->freq_res_ipd > 2) {
+      return IA_FATAL_ERROR;
     }
   }
 
+  ptr_ps_dec->use_34_st_bands = 0;
+  ptr_ps_dec->use_pca_rot_flg = 0;
+
   if ((ptr_ps_dec->enable_iid && ptr_ps_dec->iid_mode > 2) ||
       (ptr_ps_dec->enable_icc && ptr_ps_dec->icc_mode > 2)) {
     ptr_ps_dec->ps_data_present = 0;
@@ -623,7 +636,9 @@
       ixheaacd_read_bits_buf(it_bit_buff, 8);
       num_bits_left -= 8;
     }
-    ixheaacd_read_bits_buf(it_bit_buff, num_bits_left);
+    if (num_bits_left >= 0) {
+      ixheaacd_read_bits_buf(it_bit_buff, num_bits_left);
+    }
 
     return (cnt_bits - it_bit_buff->cnt_bits);
   }
@@ -682,14 +697,17 @@
       }
 
       for (b = 0; b < ixheaacd_num_bands[ptr_ps_dec->icc_mode]; b++) {
-        ptr_ps_dec->icc_par_table[e][b] =
-            ixheaacd_ssc_huff_dec(huffman_table, it_bit_buff);
+        ptr_ps_dec->icc_par_table[e][b] = ixheaacd_ssc_huff_dec(huffman_table, it_bit_buff);
       }
     }
   }
 
   if (ptr_ps_dec->enable_ext) {
-    WORD32 cnt = ixheaacd_read_bits_buf(it_bit_buff, 4);
+    WORD32 cnt;
+    if (it_bit_buff->cnt_bits < 4)
+      cnt = ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
+    else
+      cnt = ixheaacd_read_bits_buf(it_bit_buff, 4);
 
     if (cnt == 15) {
       cnt += ixheaacd_read_bits_buf(it_bit_buff, 8);
@@ -948,14 +966,13 @@
   }
 }
 
-WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64],
-                            FLOAT32 ptr_src_buf_imag[][64],
+WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], FLOAT32 ptr_src_buf_imag[][64],
                             FLOAT32 ptr_ph_vocod_buf_real[][64],
-                            FLOAT32 ptr_ph_vocod_buf_imag[][64],
-                            FLOAT32 ptr_dst_buf_real[][64],
+                            FLOAT32 ptr_ph_vocod_buf_imag[][64], FLOAT32 ptr_dst_buf_real[][64],
                             FLOAT32 ptr_dst_buf_imag[][64],
                             ia_sbr_frame_info_data_struct *ptr_frame_data,
-                            ia_sbr_header_data_struct *ptr_header_data) {
+                            ia_sbr_header_data_struct *ptr_header_data, WORD32 ldmps_present,
+                            WORD32 time_slots, WORD32 ec_flag) {
   WORD32 bw_index, i, k, k2, patch = 0;
   WORD32 co_var_len;
   WORD32 start_sample, end_sample, goal_sb;
@@ -981,7 +998,7 @@
   WORD32 pre_proc_flag = ptr_header_data->pre_proc_flag;
   WORD32 is_usf_4 = ptr_header_data->is_usf_4;
   WORD32 fs = ptr_header_data->out_sampling_freq;
-
+  WORD32 cov_count;
   WORD32 lsb = f_master_tbl[0];
   WORD32 usb = f_master_tbl[num_mf_bands];
   WORD32 xover_offset = sub_band_start - f_master_tbl[0];
@@ -999,6 +1016,11 @@
   FLOAT32 *bw_array_prev = ptr_frame_data->bw_array_prev;
 
   end_slot_offs = p_frame_info->border_vec[p_frame_info->num_env] - 16;
+
+  if (ldmps_present == 1)
+    end_slot_offs =
+        p_frame_info->border_vec[p_frame_info->num_env] - time_slots;
+
   if (is_usf_4) {
     start_sample = first_slot_offset * 4;
     end_sample = 64 + end_slot_offs * 4;
@@ -1009,6 +1031,12 @@
     co_var_len = 38;
   }
 
+  if (ldmps_present == 1) {
+    start_sample = 0;
+    end_sample = time_slots;
+    co_var_len = time_slots;
+  }
+
   if (pre_proc_flag) {
     ixheaacd_pre_processing(ptr_src_buf_real, ptr_src_buf_imag, gain_vector,
                             f_master_tbl[0], start_sample, end_sample);
@@ -1023,9 +1051,17 @@
   }
 
   if (sbr_patching_mode || !hbe_flag) {
-    FLOAT32 alpha_real[64][2], alpha_imag[64][2];
+    WORD32 flag_break = 0;
+    FLOAT32 alpha_real[64][2] = {{0}}, alpha_imag[64][2] = {{0}};
+    if (ptr_frame_data->mps_sbr_flag) {
+      cov_count = (f_master_tbl[0] < ptr_frame_data->cov_count)
+                      ? f_master_tbl[0]
+                      : ptr_frame_data->cov_count;
+    } else {
+      cov_count = f_master_tbl[0];
+    }
 
-    for (k = 1; k < f_master_tbl[0]; k++) {
+    for (k = 1; k < cov_count; k++) {
       ixheaacd_esbr_calc_co_variance(&str_auto_corr, &ptr_src_buf_real[0],
                                      &ptr_src_buf_imag[0], k, co_var_len);
       if (str_auto_corr.det == 0.0f) {
@@ -1088,7 +1124,13 @@
 
     patch = 0;
     while (sb < usb) {
-      if (MAX_NUM_PATCHES <= patch) return -1;
+      if (MAX_NUM_PATCHES <= patch) {
+        if (ec_flag) {
+          break;
+        } else {
+          return -1;
+        }
+      }
       ptr_frame_data->patch_param.start_subband[patch] = sb;
       num_bands_in_patch = goal_sb - sb;
 
@@ -1124,8 +1166,15 @@
         break;
       }
 
-      if (num_bands_in_patch <= 0) {
-        return -1;
+      if (num_bands_in_patch < 0 && flag_break == 1) {
+        break;
+      }
+
+      if (num_bands_in_patch < 0) {
+        flag_break = 1;
+        continue;
+      } else {
+        flag_break = 0;
       }
 
       for (k2 = sb; k2 < sb + num_bands_in_patch; k2++) {
@@ -1133,10 +1182,21 @@
         bw_index = 0;
         while (k2 >= ptr_invf_band_tbl[bw_index]) {
           bw_index++;
-          if (bw_index >= MAX_NOISE_COEFFS) return -1;
+          if (bw_index >= MAX_NOISE_COEFFS) {
+            if (ec_flag) {
+              bw_index = MAX_NOISE_COEFFS - 1;
+              break;
+            } else
+              return -1;
+          }
         }
 
-        if (bw_index >= MAX_NUM_PATCHES) return -1;
+        if (bw_index >= MAX_NUM_PATCHES) {
+          if (ec_flag)
+            bw_index = MAX_NUM_PATCHES - 1;
+          else
+            return -1;
+        }
         bw = bw_array[bw_index];
 
         a0r = bw * alpha_real[k][0];
@@ -1176,99 +1236,110 @@
     }
   }
 
-  if (hbe_flag && !sbr_patching_mode) {
-    FLOAT32 alpha_real[2], alpha_imag[2];
+  if (NULL != ptr_ph_vocod_buf_real && NULL != ptr_ph_vocod_buf_imag) {
+    if (hbe_flag && !sbr_patching_mode) {
+      FLOAT32 alpha_real[2], alpha_imag[2];
 
-    bw_index = 0, patch = 1;
-    if (NULL == ptr_ph_vocod_buf_real || NULL == ptr_ph_vocod_buf_imag)
-      return -1;
+      bw_index = 0, patch = 1;
 
-    for (k2 = sub_band_start; k2 < f_master_tbl[num_mf_bands]; k2++) {
-      ixheaacd_esbr_calc_co_variance(&str_auto_corr, &ptr_ph_vocod_buf_real[0],
-                                     &ptr_ph_vocod_buf_imag[0], k2, co_var_len);
+      for (k2 = sub_band_start; k2 < f_master_tbl[num_mf_bands]; k2++) {
+        ixheaacd_esbr_calc_co_variance(&str_auto_corr, &ptr_ph_vocod_buf_real[0],
+                                       &ptr_ph_vocod_buf_imag[0], k2, co_var_len);
 
-      if (str_auto_corr.det == 0.0f) {
-        alpha_real[1] = alpha_imag[1] = 0;
-      } else {
-        fac = 1.0f / str_auto_corr.det;
-        alpha_real[1] =
-            (str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_real -
-             str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_imag -
-             str_auto_corr.phi_0_2_real * str_auto_corr.phi_1_1) *
-            fac;
-        alpha_imag[1] =
-            (str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_real +
-             str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_imag -
-             str_auto_corr.phi_0_2_imag * str_auto_corr.phi_1_1) *
-            fac;
-      }
-
-      if (str_auto_corr.phi_1_1 == 0) {
-        alpha_real[0] = alpha_imag[0] = 0;
-      } else {
-        fac = 1.0f / str_auto_corr.phi_1_1;
-        alpha_real[0] = -(str_auto_corr.phi_0_1_real +
-                          alpha_real[1] * str_auto_corr.phi_1_2_real +
-                          alpha_imag[1] * str_auto_corr.phi_1_2_imag) *
-                        fac;
-        alpha_imag[0] = -(str_auto_corr.phi_0_1_imag +
-                          alpha_imag[1] * str_auto_corr.phi_1_2_real -
-                          alpha_real[1] * str_auto_corr.phi_1_2_imag) *
-                        fac;
-      }
-
-      if (alpha_real[0] * alpha_real[0] + alpha_imag[0] * alpha_imag[0] >=
-              16.0f ||
-          alpha_real[1] * alpha_real[1] + alpha_imag[1] * alpha_imag[1] >=
-              16.0f) {
-        alpha_real[0] = 0.0f;
-        alpha_imag[0] = 0.0f;
-        alpha_real[1] = 0.0f;
-        alpha_imag[1] = 0.0f;
-      }
-
-      while (k2 >= ptr_invf_band_tbl[bw_index]) {
-        bw_index++;
-        if (bw_index >= MAX_NOISE_COEFFS) return -1;
-      }
-
-      if (bw_index >= MAX_NUM_PATCHES) return -1;
-      bw = bw_array[bw_index];
-
-      a0r = bw * alpha_real[0];
-      a0i = bw * alpha_imag[0];
-      bw *= bw;
-      a1r = bw * alpha_real[1];
-      a1i = bw * alpha_imag[1];
-
-      if (bw > 0.0f) {
-        for (i = start_sample; i < end_sample; i++) {
-          FLOAT32 real1, imag1, real2, imag2, realTarget, imag_target;
-
-          realTarget = ptr_ph_vocod_buf_real[i][k2];
-          imag_target = ptr_ph_vocod_buf_imag[i][k2];
-          real1 = ptr_ph_vocod_buf_real[i - 1][k2];
-          imag1 = ptr_ph_vocod_buf_imag[i - 1][k2];
-          real2 = ptr_ph_vocod_buf_real[i - 2][k2];
-          imag2 = ptr_ph_vocod_buf_imag[i - 2][k2];
-          realTarget +=
-              ((a0r * real1 - a0i * imag1) + (a1r * real2 - a1i * imag2));
-          imag_target +=
-              ((a0i * real1 + a0r * imag1) + (a1i * real2 + a1r * imag2));
-
-          ptr_dst_buf_real[i][k2] = realTarget;
-          ptr_dst_buf_imag[i][k2] = imag_target;
+        if (str_auto_corr.det == 0.0f) {
+          alpha_real[1] = alpha_imag[1] = 0;
+        } else {
+          fac = 1.0f / str_auto_corr.det;
+          alpha_real[1] = (str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_real -
+                           str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_imag -
+                           str_auto_corr.phi_0_2_real * str_auto_corr.phi_1_1) *
+                          fac;
+          alpha_imag[1] = (str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_real +
+                           str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_imag -
+                           str_auto_corr.phi_0_2_imag * str_auto_corr.phi_1_1) *
+                          fac;
         }
-      } else {
-        for (i = start_sample; i < end_sample; i++) {
-          ptr_dst_buf_real[i][k2] = ptr_ph_vocod_buf_real[i][k2];
-          ptr_dst_buf_imag[i][k2] = ptr_ph_vocod_buf_imag[i][k2];
+
+        if (str_auto_corr.phi_1_1 == 0) {
+          alpha_real[0] = alpha_imag[0] = 0;
+        } else {
+          fac = 1.0f / str_auto_corr.phi_1_1;
+          alpha_real[0] =
+              -(str_auto_corr.phi_0_1_real + alpha_real[1] * str_auto_corr.phi_1_2_real +
+                alpha_imag[1] * str_auto_corr.phi_1_2_imag) *
+              fac;
+          alpha_imag[0] =
+              -(str_auto_corr.phi_0_1_imag + alpha_imag[1] * str_auto_corr.phi_1_2_real -
+                alpha_real[1] * str_auto_corr.phi_1_2_imag) *
+              fac;
+        }
+
+        if (alpha_real[0] * alpha_real[0] + alpha_imag[0] * alpha_imag[0] >= 16.0f ||
+            alpha_real[1] * alpha_real[1] + alpha_imag[1] * alpha_imag[1] >= 16.0f) {
+          alpha_real[0] = 0.0f;
+          alpha_imag[0] = 0.0f;
+          alpha_real[1] = 0.0f;
+          alpha_imag[1] = 0.0f;
+        }
+
+        while (k2 >= ptr_invf_band_tbl[bw_index]) {
+          bw_index++;
+          if (bw_index >= MAX_NOISE_COEFFS) {
+            if (ec_flag) {
+              bw_index = MAX_NOISE_COEFFS - 1;
+              break;
+            } else
+              return -1;
+          }
+        }
+
+        if (bw_index >= MAX_NUM_PATCHES) {
+          if (ec_flag)
+            bw_index = MAX_NUM_PATCHES - 1;
+          else
+            return -1;
+        }
+        bw = bw_array[bw_index];
+
+        a0r = bw * alpha_real[0];
+        a0i = bw * alpha_imag[0];
+        bw *= bw;
+        a1r = bw * alpha_real[1];
+        a1i = bw * alpha_imag[1];
+
+        if (bw > 0.0f) {
+          for (i = start_sample; i < end_sample; i++) {
+            FLOAT32 real1, imag1, real2, imag2, realTarget, imag_target;
+
+            realTarget = ptr_ph_vocod_buf_real[i][k2];
+            imag_target = ptr_ph_vocod_buf_imag[i][k2];
+            real1 = ptr_ph_vocod_buf_real[i - 1][k2];
+            imag1 = ptr_ph_vocod_buf_imag[i - 1][k2];
+            real2 = ptr_ph_vocod_buf_real[i - 2][k2];
+            imag2 = ptr_ph_vocod_buf_imag[i - 2][k2];
+            realTarget += ((a0r * real1 - a0i * imag1) + (a1r * real2 - a1i * imag2));
+            imag_target += ((a0i * real1 + a0r * imag1) + (a1i * real2 + a1r * imag2));
+
+            ptr_dst_buf_real[i][k2] = realTarget;
+            ptr_dst_buf_imag[i][k2] = imag_target;
+          }
+        } else {
+          for (i = start_sample; i < end_sample; i++) {
+            ptr_dst_buf_real[i][k2] = ptr_ph_vocod_buf_real[i][k2];
+            ptr_dst_buf_imag[i][k2] = ptr_ph_vocod_buf_imag[i][k2];
+          }
         }
       }
     }
   }
+  if ((MAX_NUM_PATCHES + 1) <= patch) {
+    if (ec_flag) {
+      patch = MAX_NUM_PATCHES;
+    } else {
+      return -1;
+    }
+  }
   ptr_frame_data->patch_param.num_patches = patch;
-  if (patch >= (MAX_NUM_PATCHES + 1)) return -1;
   for (i = 0; i < num_if_bands; i++) {
     bw_array_prev[i] = bw_array[i];
   }
diff --git a/decoder/ixheaacd_sbrdecoder.c b/decoder/ixheaacd_sbrdecoder.c
index 06452b3..6bb0801 100644
--- a/decoder/ixheaacd_sbrdecoder.c
+++ b/decoder/ixheaacd_sbrdecoder.c
@@ -27,6 +27,7 @@
 #include "ixheaacd_basic_ops40.h"
 #include "ixheaacd_basic_ops.h"
 #include "ixheaacd_defines.h"
+#include "ixheaacd_error_codes.h"
 
 #include "ixheaacd_intrinsics.h"
 #include "ixheaacd_sbr_const.h"
@@ -40,6 +41,9 @@
 
 #include "ixheaacd_drc_data_struct.h"
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -69,6 +73,20 @@
 
 #include "ixheaacd_audioobjtypes.h"
 
+static VOID ixheaacd_ec_set_frame_error_flag(ia_sbr_element_stream_struct *pstr_sbr_element,
+                                             WORD32 value) {
+  if (pstr_sbr_element != NULL) {
+    switch (value) {
+      case FRAME_ERROR_ALLSLOTS:
+        pstr_sbr_element->frame_error_flag[0] = FRAME_ERROR;
+        pstr_sbr_element->frame_error_flag[1] = FRAME_ERROR;
+        break;
+      default:
+        pstr_sbr_element->frame_error_flag[pstr_sbr_element->use_frame_slot] = value;
+    }
+  }
+}
+
 VOID ixheaacd_downmix_to_monosbr(WORD16 *core_sample_buf, WORD32 ch_fac) {
   WORD32 i;
   WORD16 *ptr1 = &core_sample_buf[0];
@@ -87,7 +105,8 @@
                                      FLAG low_pow_flag,
                                      ixheaacd_misc_tables *pstr_common_tables,
                                      WORD32 pitch_in_bins,
-                                     WORD32 audio_object_type) {
+                                     WORD32 audio_object_type,
+                                     WORD32 *ptr_work_buf_core) {
   WORD32 old_lsb, new_lsb;
   WORD32 l;
   WORD32 err = 0;
@@ -131,8 +150,7 @@
       }
     }
   }
-
-  if (usac_flag) {
+  if (1) {
     WORD32 start_band;
     WORD32 stop_band;
     WORD32 start_slot = SBR_HF_ADJ_OFFSET;
@@ -140,7 +158,7 @@
 
     start_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
     stop_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
-    if (!hbe_flag) {
+    if (usac_flag && !hbe_flag) {
       for (l = 0; l < SBR_HF_ADJ_OFFSET; l++) {
         for (k = start_band; k < stop_band; k++) {
           ptr_sbr_dec->qmf_buf_real[l][k] = 0.0;
@@ -154,13 +172,21 @@
         }
       }
     }
-    if (hbe_flag && ptr_sbr_dec->p_hbe_txposer != NULL) {
+    if (ptr_sbr_dec->p_hbe_txposer != NULL && (usac_flag || hbe_flag)) {
       WORD32 k, i;
-      WORD32 err = ixheaacd_qmf_hbe_data_reinit(
-          ptr_sbr_dec->p_hbe_txposer,
-          ptr_header_data->pstr_freq_band_data->freq_band_table,
-          ptr_header_data->pstr_freq_band_data->num_sf_bands,
-          ptr_header_data->is_usf_4);
+      WORD32 dft_hbe_flag = ptr_header_data->esbr_hq;
+      if (dft_hbe_flag == 1) {
+        err = ixheaacd_dft_hbe_data_reinit(
+            ptr_sbr_dec->p_hbe_txposer,
+            ptr_header_data->pstr_freq_band_data->freq_band_table,
+            ptr_header_data->pstr_freq_band_data->num_sf_bands);
+      } else {
+        err = ixheaacd_qmf_hbe_data_reinit(
+            ptr_sbr_dec->p_hbe_txposer,
+            ptr_header_data->pstr_freq_band_data->freq_band_table,
+            ptr_header_data->pstr_freq_band_data->num_sf_bands,
+            ptr_header_data->is_usf_4);
+      }
       if (err) return err;
 
       for (k = 0; k < 2; k++) {
@@ -178,14 +204,26 @@
                     ptr_sbr_dec->ph_vocod_qmf_imag[num_time_slots + i],
                     64 * sizeof(FLOAT32));
           }
-
-          err = ixheaacd_qmf_hbe_apply(
-              ptr_sbr_dec->p_hbe_txposer,
-              ptr_sbr_dec->qmf_buf_real + op_delay + xpos_delay,
-              ptr_sbr_dec->qmf_buf_imag + op_delay + xpos_delay, num_time_slots,
-              ptr_sbr_dec->ph_vocod_qmf_real + op_delay,
-              ptr_sbr_dec->ph_vocod_qmf_imag + op_delay, pitch_in_bins);
+          if (dft_hbe_flag == 1) {
+            err = ixheaacd_dft_hbe_apply(
+                ptr_sbr_dec->p_hbe_txposer,
+                ptr_sbr_dec->qmf_buf_real + op_delay + xpos_delay,
+                ptr_sbr_dec->qmf_buf_imag + op_delay + xpos_delay, num_time_slots,
+                ptr_sbr_dec->ph_vocod_qmf_real + op_delay,
+                ptr_sbr_dec->ph_vocod_qmf_imag + op_delay, pitch_in_bins,
+                (FLOAT32 *)ptr_work_buf_core);
+            if (err)
+                return err;
+          } else {
+            err = ixheaacd_qmf_hbe_apply(
+                ptr_sbr_dec->p_hbe_txposer,
+                ptr_sbr_dec->qmf_buf_real + op_delay + xpos_delay,
+                ptr_sbr_dec->qmf_buf_imag + op_delay + xpos_delay, num_time_slots,
+                ptr_sbr_dec->ph_vocod_qmf_real + op_delay,
+                ptr_sbr_dec->ph_vocod_qmf_imag + op_delay, pitch_in_bins,
+                ptr_header_data);
           if (err) return err;
+          }
 
           if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
             ixheaacd_hbe_repl_spec(&ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
@@ -237,14 +275,48 @@
   return;
 }
 
+static VOID ixheaacd_copy_prev_ps_params(ia_ps_dec_struct *ps_config_curr,
+                                         ia_ps_dec_config_struct *ps_config_prev,
+                                         WORD32 frame_status) {
+  if (frame_status == 0) {
+    ps_config_curr->enable_iid = ps_config_prev->enable_iid;
+    ps_config_curr->iid_mode = ps_config_prev->iid_mode;
+    ps_config_curr->enable_icc = ps_config_prev->enable_icc;
+    ps_config_curr->icc_mode = ps_config_prev->icc_mode;
+    ps_config_curr->frame_class = ps_config_prev->frame_class;
+    ps_config_curr->freq_res_ipd = ps_config_prev->freq_res_ipd;
+    memcpy(ps_config_curr->border_position, ps_config_prev->border_position,
+           sizeof(ps_config_curr->border_position));
+    memcpy(ps_config_curr->iid_dt, ps_config_prev->iid_dt, sizeof(ps_config_curr->iid_dt));
+    memcpy(ps_config_curr->iid_par_table, ps_config_prev->iid_par_table,
+           sizeof(ps_config_curr->iid_par_table));
+    memcpy(ps_config_curr->icc_dt, ps_config_prev->icc_dt, sizeof(ps_config_curr->icc_dt));
+    memcpy(ps_config_curr->icc_par_table, ps_config_prev->icc_par_table,
+           sizeof(ps_config_curr->icc_par_table));
+  } else {
+    ps_config_prev->enable_iid = ps_config_curr->enable_iid;
+    ps_config_prev->iid_mode = ps_config_curr->iid_mode;
+    ps_config_prev->enable_icc = ps_config_curr->enable_icc;
+    ps_config_prev->icc_mode = ps_config_curr->icc_mode;
+    ps_config_prev->frame_class = ps_config_curr->frame_class;
+    ps_config_prev->freq_res_ipd = ps_config_curr->freq_res_ipd;
+    memcpy(ps_config_prev->border_position, ps_config_curr->border_position,
+           sizeof(ps_config_prev->border_position));
+    memcpy(ps_config_prev->iid_dt, ps_config_curr->iid_dt, sizeof(ps_config_prev->iid_dt));
+    memcpy(ps_config_prev->iid_par_table, ps_config_curr->iid_par_table,
+           sizeof(ps_config_prev->iid_par_table));
+    memcpy(ps_config_prev->icc_dt, ps_config_curr->icc_dt, sizeof(ps_config_prev->icc_dt));
+    memcpy(ps_config_prev->icc_par_table, ps_config_curr->icc_par_table,
+           sizeof(ps_config_prev->icc_par_table));
+  }
+}
 IA_ERRORCODE ixheaacd_applysbr(
-    ia_handle_sbr_dec_inst_struct self,
-    ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream, WORD16 *core_sample_buf,
-    WORD16 *codec_num_channels, FLAG frame_status, FLAG down_samp_flag,
-    FLAG down_mix_flag, ia_sbr_scr_struct *sbr_scratch_struct, WORD32 ps_enable,
-    WORD32 ch_fac, WORD32 slot_element, ia_bit_buf_struct *it_bit_buff,
-    ia_drc_dec_struct *pstr_drc_dec, WORD eld_sbr_flag,
-    WORD32 audio_object_type) {
+    ia_handle_sbr_dec_inst_struct self, ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream,
+    WORD16 *core_sample_buf, WORD16 *codec_num_channels, FLAG frame_status, FLAG down_samp_flag,
+    FLAG down_mix_flag, ia_sbr_scr_struct *sbr_scratch_struct, WORD32 ps_enable, WORD32 ch_fac,
+    WORD32 slot_element, ia_bit_buf_struct *it_bit_buff, ia_drc_dec_struct *pstr_drc_dec,
+    WORD eld_sbr_flag, WORD32 audio_object_type, WORD32 init_flag, WORD32 ldmps_present,
+    WORD32 frame_size, WORD32 heaac_mps_present, WORD32 ec_flag, FLAG first_frame) {
   WORD32 k;
   FLAG prev_ps_flag = 0;
   FLAG ps_flag = 0;
@@ -258,6 +330,697 @@
   WORD32 ele_channels = 0;
   WORD32 num_elements = p_sbr_bit_stream->no_elements;
   WORD32 usac_flag = self->aot_usac_flag;
+  WORD32 total_bits_left = 0;
+
+  ia_sbr_channel_struct *pstr_sbr_channel[2];
+  ia_sbr_header_data_struct *ptr_header_data[MAXNRSBRCHANNELS];
+
+  WORD32 initial_sync_state;
+
+  ia_sbr_header_data_struct *ptr_sbr_dflt_header =
+      (ia_sbr_header_data_struct *)(&self->str_sbr_dflt_header);
+
+  ia_sbr_frame_info_data_struct *ptr_frame_data[2];
+  self->num_delay_frames = 1;
+  self->ptr_mps_data = NULL;
+
+  if (!ec_flag || !usac_flag) {
+    for (k = 0; k < 2; k++) {
+      ptr_frame_data[k] = (ia_sbr_frame_info_data_struct *)self->frame_buffer[k];
+
+      pstr_sbr_channel[k] = self->pstr_sbr_channel[k];
+
+      ptr_header_data[k] = self->pstr_sbr_header[k];
+
+      if (audio_object_type == AOT_ER_AAC_ELD) {
+        ptr_frame_data[k]->eld_sbr_flag = eld_sbr_flag;
+        ptr_frame_data[k]->num_time_slots = ptr_header_data[0]->num_time_slots;
+      }
+
+      ptr_frame_data[k]->usac_independency_flag = self->usac_independency_flag;
+      ptr_frame_data[k]->mps_sbr_flag = (self->stereo_config_idx == 3) ? 1 : 0;
+      ptr_frame_data[k]->stereo_config_idx = self->stereo_config_idx;
+      ptr_frame_data[k]->inter_tes_flag = self->inter_tes_flag;
+      ptr_frame_data[k]->sbr_mode = self->sbr_mode;
+
+      if (!usac_flag) {
+        ptr_frame_data[k]->usac_independency_flag = 0;
+        ptr_frame_data[k]->mps_sbr_flag = 0;
+        ptr_frame_data[k]->stereo_config_idx = -1;
+        ptr_frame_data[k]->inter_tes_flag = 0;
+        ptr_frame_data[k]->sbr_mode = ORIG_SBR;
+      }
+    }
+
+    if (init_flag) {
+      ptr_frame_data[1]->reset_flag = 1;
+      ptr_frame_data[0]->reset_flag = 1;
+    }
+
+    for (k = 0; k < *codec_num_channels; k++) {
+      ptr_header_data[k]->usac_flag = self->aot_usac_flag;
+      ptr_header_data[k]->enh_sbr = self->enh_sbr;
+      ptr_header_data[k]->enh_sbr_ps =
+          ((self->enh_sbr_ps) | (ptr_header_data[k]->channel_mode == PS_STEREO));
+
+      ptr_header_data[k]->usac_independency_flag = self->usac_independency_flag;
+      ptr_header_data[k]->hbe_flag = self->hbe_flag;
+      ptr_header_data[k]->pvc_flag = self->pvc_flag;
+
+      if (!usac_flag) {
+        ptr_header_data[k]->usac_independency_flag = 0;
+        ptr_header_data[k]->hbe_flag = 0;
+        ptr_header_data[k]->pvc_flag = 0;
+      }
+      ptr_header_data[k]->esbr_hq = self->esbr_hq;
+      if (!usac_flag &&
+          (!(audio_object_type == AOT_ER_AAC_ELD || audio_object_type == AOT_ER_AAC_LD))) {
+        ptr_header_data[k]->hbe_flag = 1;
+      }
+    }
+
+    initial_sync_state = ptr_header_data[0]->sync_state;
+
+    low_pow_flag = !usac_flag;
+    self->pstr_sbr_tables->sbr_rand_ph = self->pstr_sbr_tables->env_calc_tables_ptr->sbr_rand_ph;
+
+    if (ps_enable) {
+      if (num_channels == 1) {
+        low_pow_flag = 0;
+      }
+    }
+
+    if (audio_object_type == AOT_ER_AAC_ELD) {
+      low_pow_flag = 0;
+    }
+
+    prev_stereo = (ptr_header_data[0]->channel_mode == SBR_STEREO);
+
+    if (ps_enable) prev_ps_flag = (ptr_header_data[0]->channel_mode == PS_STEREO);
+
+    ptr_header_data[0]->err_flag_prev = ptr_header_data[0]->err_flag;
+
+    if (p_sbr_bit_stream->no_elements == 0) {
+      frame_status = 0;
+      ptr_header_data[0]->sync_state = UPSAMPLING;
+      if (num_channels == 2) ptr_header_data[1]->sync_state = UPSAMPLING;
+    }
+
+    if ((usac_flag)) {
+      if ((p_sbr_bit_stream->no_elements) && (p_sbr_bit_stream->str_sbr_ele->size_payload > 0)) {
+        num_elements = p_sbr_bit_stream->no_elements;
+      } else {
+        num_elements = 0;
+      }
+    }
+
+    for (k = 0; k < num_elements; k++) {
+      struct ia_bit_buf_struct local_bit_buf = {0};
+      ia_sbr_element_stream_struct *ptr_bit_str_ele = &p_sbr_bit_stream->str_sbr_ele[k];
+      ele_channels = (p_sbr_bit_stream->str_sbr_ele[0].sbr_ele_id == SBR_ID_CPE) ? 2 : 1;
+      if (!frame_status && ptr_header_data[k]->sync_state == SBR_ACTIVE && ec_flag) {
+        ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_ERROR_ALLSLOTS);
+      }
+
+      switch (ptr_bit_str_ele->sbr_ele_id) {
+        case SBR_ID_SCE:
+        case SBR_ID_CCE:
+          if (num_channels == 2) {
+            dual_mono = 1;
+          }
+          stereo = 0;
+          break;
+        case SBR_ID_CPE:
+          stereo = 1;
+          ptr_header_data[1] = ptr_header_data[0];
+
+          memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0],
+                 sizeof(ia_sbr_header_data_struct));
+          break;
+        default:
+          frame_status = 0;
+      }
+
+      if (frame_status) {
+        if (!usac_flag) {
+          if (!(audio_object_type == AOT_ER_AAC_LD || audio_object_type == AOT_ER_AAC_ELD)) {
+            WORD8 tmp[1024];
+            WORD32 tmp_payload;
+            memcpy(&tmp[0], ptr_bit_str_ele->ptr_sbr_data, ptr_bit_str_ele->size_payload);
+            memcpy(ptr_bit_str_ele->ptr_sbr_data, ptr_bit_str_ele->ptr_prev_sbr_data,
+                   ptr_bit_str_ele->prev_size_payload);
+            memcpy(ptr_bit_str_ele->ptr_prev_sbr_data, &tmp[0], ptr_bit_str_ele->size_payload);
+            tmp_payload = ptr_bit_str_ele->size_payload;
+            ptr_bit_str_ele->size_payload = ptr_bit_str_ele->prev_size_payload;
+            ptr_bit_str_ele->prev_size_payload = tmp_payload;
+          }
+          if (!ptr_bit_str_ele->size_payload) {
+            continue;
+          }
+
+          ixheaacd_create_init_bit_buf(&local_bit_buf, (UWORD8 *)ptr_bit_str_ele->ptr_sbr_data,
+                                       ptr_bit_str_ele->size_payload);
+          it_bit_buff = &local_bit_buf;
+          it_bit_buff->xaac_jmp_buf = self->xaac_jmp_buf;
+          total_bits_left = it_bit_buff->cnt_bits;
+
+          if (audio_object_type == AOT_ER_AAC_ELD) {
+            if (eld_sbr_flag != 1) {
+              ixheaacd_read_bits_buf(&local_bit_buf, LEN_NIBBLE);
+            }
+          } else {
+            ixheaacd_read_bits_buf(&local_bit_buf, LEN_NIBBLE);
+          }
+        }
+        if (ptr_bit_str_ele->extension_type == SBR_EXTENSION_CRC) {
+          WORD32 crc_bits = 0;
+          WORD32 crc_check_flag = 0;
+          crc_check_flag = 1;
+          crc_bits = (((ptr_bit_str_ele->size_payload - 1) << 3) + (4 - SBR_CYC_REDCY_CHK_BITS));
+
+          if (crc_bits < 0) {
+            crc_check_flag = 0;
+            frame_status = 0;
+          }
+          if (crc_check_flag) frame_status = ixheaacd_sbr_crccheck(it_bit_buff, crc_bits);
+        }
+
+        if (!usac_flag) header_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
+
+        if (audio_object_type != AOT_ER_AAC_ELD) {
+          if (header_flag) {
+            header_flag = ixheaacd_sbr_read_header_data(ptr_header_data[k], it_bit_buff, stereo,
+                                                        ptr_sbr_dflt_header);
+            if (usac_flag) {
+              if ((self->ptr_pvc_data_str->prev_pvc_mode == 0) &&
+                  (ptr_header_data[k]->pvc_mode != 0)) {
+                self->ptr_pvc_data_str->prev_pvc_id = 0;
+              }
+              self->ptr_pvc_data_str->prev_pvc_mode = ptr_header_data[k]->pvc_mode;
+              if (ptr_header_data[k]->pvc_mode == 0) {
+                ptr_frame_data[k]->sbr_mode = ORIG_SBR;
+              } else {
+                ptr_frame_data[k]->sbr_mode = PVC_SBR;
+              }
+            }
+            if (header_flag == SBR_RESET) {
+              err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k],
+
+                                               self->pstr_common_tables);
+              if (!err) {
+                WORD32 lr;
+                WORD32 lr1 = ps_enable ? 2 : num_channels;
+                for (lr = 0; lr < lr1; lr++) {
+                  if (ldmps_present != 1) ptr_frame_data[lr]->reset_flag = 1;
+                  if ((SBR_NOT_INITIALIZED == ptr_header_data[lr]->sync_state) && !usac_flag) {
+                    ptr_frame_data[lr]->sbr_patching_mode = 1;
+                    ptr_frame_data[lr]->over_sampling_flag = 0;
+                    ptr_frame_data[lr]->pitch_in_bins = 0;
+                    ptr_header_data[lr]->pre_proc_flag = 0;
+                  }
+                  err |= ixheaacd_sbr_dec_reset(
+                      &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k], low_pow_flag,
+                      self->pstr_common_tables, ptr_frame_data[k]->pitch_in_bins,
+                      audio_object_type, sbr_scratch_struct->ptr_work_buf_core);
+                  if (err < 0) return err;
+                }
+              }
+
+              if (err == 0) {
+                ptr_header_data[k]->sync_state = SBR_ACTIVE;
+              }
+            }
+          }
+        } else {
+          if (header_flag) {
+            header_flag = ixheaacd_sbr_read_header_data(ptr_header_data[k], it_bit_buff, stereo,
+                                                        ptr_sbr_dflt_header);
+            if (usac_flag) {
+              if ((self->ptr_pvc_data_str->prev_pvc_mode == 0) &&
+                  (ptr_header_data[k]->pvc_mode != 0)) {
+                self->ptr_pvc_data_str->prev_pvc_id = 0;
+              }
+              self->ptr_pvc_data_str->prev_pvc_mode = ptr_header_data[k]->pvc_mode;
+              if (ptr_header_data[k]->pvc_mode == 0) {
+                ptr_frame_data[k]->sbr_mode = ORIG_SBR;
+              } else {
+                ptr_frame_data[k]->sbr_mode = PVC_SBR;
+              }
+            }
+
+            if (header_flag == SBR_RESET) {
+              err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k],
+
+                                               self->pstr_common_tables);
+              if (err) {
+                return err;
+              }
+            }
+          }
+
+          {
+            WORD32 lr;
+            WORD32 lr1 = ps_enable ? 2 : num_channels;
+            for (lr = 0; lr < lr1; lr++) {
+              if (ldmps_present != 1) ptr_frame_data[lr]->reset_flag = 1;
+              if (ptr_header_data[k]->status) {
+                err |= ixheaacd_sbr_dec_reset(
+                    &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k], low_pow_flag,
+                    self->pstr_common_tables, ptr_frame_data[k]->pitch_in_bins, audio_object_type,
+                    sbr_scratch_struct->ptr_work_buf_core);
+                if (err < 0) return err;
+              }
+            }
+            ptr_header_data[k]->status = 0;
+          }
+
+          if (err == 0) {
+            ptr_header_data[k]->sync_state = SBR_ACTIVE;
+          }
+        }
+      }
+
+      if (err || (ptr_header_data[k]->sync_state == SBR_NOT_INITIALIZED)) {
+        WORD32 lr1 = ps_enable ? 2 : num_channels;
+        ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1);
+        if (err) return err;
+      }
+
+      if (frame_status && (ptr_header_data[k]->sync_state == SBR_ACTIVE)) {
+        if (stereo) {
+          frame_status = ixheaacd_sbr_read_cpe(ptr_header_data[0], ptr_frame_data, it_bit_buff,
+                                               self->pstr_sbr_tables, audio_object_type);
+          if (frame_status < 0) return frame_status;
+        } else {
+          if (ps_enable) {
+            if (down_mix_flag) {
+              self->pstr_ps_stereo_dec->force_mono = 1;
+            } else {
+              self->pstr_ps_stereo_dec->force_mono = 0;
+            }
+          } else {
+            self->pstr_ps_stereo_dec = 0;
+          }
+          if (ptr_frame_data[k]->sbr_mode == ORIG_SBR) {
+            frame_status = ixheaacd_sbr_read_sce(
+                ptr_header_data[k], ptr_frame_data[k], self->pstr_ps_stereo_dec, it_bit_buff,
+                self->pstr_sbr_tables, audio_object_type, ec_flag);
+            if (frame_status < 0) return frame_status;
+            if (ec_flag && self->pstr_ps_stereo_dec != NULL) {
+              ixheaacd_copy_prev_ps_params(self->pstr_ps_stereo_dec, &self->str_ps_config_prev,
+                                           frame_status);
+            }
+          } else if (ptr_frame_data[k]->sbr_mode == PVC_SBR) {
+            frame_status = ixheaacd_sbr_read_pvc_sce(ptr_frame_data[k], it_bit_buff, 0,
+                                                     self->ptr_pvc_data_str,
+                                                     self->pstr_sbr_tables, ptr_header_data[k]);
+            if (frame_status < 0) return frame_status;
+          }
+        }
+        if (audio_object_type != AOT_ER_AAC_ELD) {
+          WORD32 total_bits_read;
+          total_bits_read = ixheaacd_no_bits_read(it_bit_buff);
+          if (total_bits_read > (ptr_bit_str_ele->size_payload << 3) ||
+              total_bits_read < ((ptr_bit_str_ele->size_payload << 3) - 8)) {
+            frame_status = 0;
+          }
+          if (ec_flag) {
+            if (!frame_status) {
+              ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_ERROR);
+            } else {
+              ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_OK);
+            }
+          }
+        }
+      }
+      if ((ldmps_present == 1) && (it_bit_buff)) {
+        WORD32 bits_decoded = (it_bit_buff->size - it_bit_buff->cnt_bits);
+        self->ptr_mps_data = (WORD8 *)it_bit_buff->ptr_read_next;
+        self->left_mps_bits = (total_bits_left - bits_decoded);
+        self->mps_bits_pos = it_bit_buff->bit_pos;
+      }
+      if (ec_flag) {
+        if (frame_status && !init_flag) {
+          ptr_bit_str_ele->use_frame_slot =
+              (ptr_bit_str_ele->use_frame_slot + 1) % (self->num_delay_frames + 1);
+        }
+        if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
+          ptr_header_data[k]->err_flag =
+              ptr_bit_str_ele->frame_error_flag[ptr_bit_str_ele->use_frame_slot];
+        }
+      }
+    }
+
+    if (!usac_flag) {
+      if (!frame_status || (ptr_header_data[0]->sync_state != SBR_ACTIVE) ||
+          ptr_header_data[0]->err_flag) {
+        ptr_header_data[0]->err_flag = 1;
+        stereo = (num_channels == 2) ? 1 : 0;
+        if (ptr_header_data[0]->channel_mode == 0) {
+          ptr_header_data[0]->channel_mode = stereo ? SBR_STEREO : SBR_MONO;
+        }
+      }
+
+      if (!(stereo || dual_mono)) {
+        ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
+        ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
+      }
+
+      if (ptr_header_data[0]->sync_state == SBR_NOT_INITIALIZED && !ec_flag) {
+        WORD32 lr1 = ps_enable ? 2 : num_channels;
+        ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1);
+      }
+    }
+
+    if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
+      if (ptr_frame_data[0]->sbr_mode == PVC_SBR) {
+        err = ixheaacd_dec_sbrdata_for_pvc(ptr_header_data[0], ptr_frame_data[0],
+                                           pstr_sbr_channel[0]->pstr_prev_frame_data,
+                                           audio_object_type);
+        if (err) return err;
+      } else if (ptr_frame_data[0]->sbr_mode == ORIG_SBR) {
+        err = ixheaacd_dec_sbrdata(
+            ptr_header_data[0], ptr_header_data[1], ptr_frame_data[0],
+            pstr_sbr_channel[0]->pstr_prev_frame_data,
+            (stereo || dual_mono) ? ptr_frame_data[1] : NULL,
+            (stereo || dual_mono) ? pstr_sbr_channel[1]->pstr_prev_frame_data : NULL,
+            self->pstr_common_tables, ldmps_present, audio_object_type, ec_flag);
+
+        if (err) return err;
+      }
+
+      if (ptr_header_data[0]->channel_mode == PS_STEREO &&
+          (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD)) {
+        ixheaacd_decode_ps_data(self->pstr_ps_stereo_dec, frame_size);
+        ps_flag = 1;
+        self->ps_present = ps_flag;
+      }
+      if (ptr_header_data[0]->enh_sbr_ps) {
+        ps_flag = 1;
+        self->ps_present = ps_flag;
+      }
+      ptr_frame_data[0]->max_qmf_subband_aac =
+          ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
+      if (stereo) {
+        ptr_frame_data[1]->max_qmf_subband_aac =
+            ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
+      }
+      if (ldmps_present == 1) {
+        ptr_frame_data[0]->rate = 1;
+        if (stereo) {
+          ptr_frame_data[1]->rate = 1;
+        }
+      }
+    }
+    if (audio_object_type == AOT_ER_AAC_ELD && ec_flag) {
+      if ((initial_sync_state == SBR_NOT_INITIALIZED) && ptr_header_data[0]->err_flag) {
+        ptr_header_data[0]->sync_state = SBR_NOT_INITIALIZED;
+      }
+    } else {
+      if (audio_object_type != AOT_ER_AAC_ELD) {
+        if ((initial_sync_state == SBR_NOT_INITIALIZED) && ptr_header_data[0]->err_flag) {
+          ptr_header_data[0]->sync_state = SBR_NOT_INITIALIZED;
+        }
+      } else {
+        ptr_header_data[0]->sync_state = SBR_ACTIVE;
+      }
+    }
+
+    if ((num_channels == 2) && !(stereo || dual_mono)) {
+      ixheaacd_downmix_to_monosbr(&core_sample_buf[slot_element], ch_fac);
+    }
+
+    if ((!prev_stereo && !prev_ps_flag) && (ps_flag)) {
+      WORD32 copy_size;
+      if (down_samp_flag)
+        copy_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
+      else
+        copy_size = QMF_FILTER_STATE_SYN_SIZE;
+
+      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
+             pstr_sbr_channel[0]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
+             copy_size * sizeof(WORD16));
+
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale;
+    }
+
+    if ((!prev_stereo && stereo && (num_channels == 2)) &&
+        (audio_object_type != AOT_ER_AAC_ELD)) {
+      WORD32 copy_size;
+      if (down_samp_flag)
+        copy_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
+      else
+        copy_size = QMF_FILTER_STATE_SYN_SIZE;
+
+      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
+             pstr_sbr_channel[0]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
+             copy_size * sizeof(WORD16));
+
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale;
+
+      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
+             pstr_sbr_channel[0]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
+             QMF_FILTER_STATE_ANA_SIZE * sizeof(WORD16));
+
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale;
+
+      memcpy(pstr_sbr_channel[1]->str_sbr_dec.ptr_sbr_overlap_buf,
+             pstr_sbr_channel[0]->str_sbr_dec.ptr_sbr_overlap_buf,
+             MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32));
+
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale;
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale;
+    }
+    pstr_sbr_channel[0]->str_sbr_dec.time_sample_buf = self->time_sample_buf[0];
+    if (self->pstr_ps_stereo_dec != NULL && (ps_enable || self->enh_sbr_ps)) {
+      self->pstr_ps_stereo_dec->pp_qmf_buf_real[0] =
+          pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real;
+      self->pstr_ps_stereo_dec->pp_qmf_buf_imag[0] =
+          pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag;
+      self->pstr_ps_stereo_dec->pp_qmf_buf_real[1] =
+          pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_real;
+      self->pstr_ps_stereo_dec->pp_qmf_buf_imag[1] =
+          pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_imag;
+      self->pstr_ps_stereo_dec->time_sample_buf[0] = self->time_sample_buf[0];
+      self->pstr_ps_stereo_dec->time_sample_buf[1] = self->time_sample_buf[1];
+    }
+  } else {
+    for (k = 0; k < 2; k++) {
+      ptr_frame_data[k] = (ia_sbr_frame_info_data_struct *)self->frame_buffer[k];
+
+      pstr_sbr_channel[k] = self->pstr_sbr_channel[k];
+
+      ptr_header_data[k] = self->pstr_sbr_header[k];
+      ptr_header_data[k]->usac_flag = self->aot_usac_flag;
+    }
+
+    if ((p_sbr_bit_stream->no_elements) && (p_sbr_bit_stream->str_sbr_ele->size_payload > 0)) {
+      num_elements = p_sbr_bit_stream->no_elements;
+    } else {
+      num_elements = 0;
+    }
+
+    for (k = 0; k < num_elements; k++) {
+      ia_sbr_element_stream_struct *ptr_bit_str_ele = &p_sbr_bit_stream->str_sbr_ele[k];
+      ele_channels = (p_sbr_bit_stream->str_sbr_ele[0].sbr_ele_id == SBR_ID_CPE) ? 2 : 1;
+      {
+        switch (ptr_bit_str_ele->sbr_ele_id) {
+          case SBR_ID_SCE:
+          case SBR_ID_CCE:
+            if (num_channels == 2) {
+              dual_mono = 1;
+            }
+            stereo = 0;
+            break;
+          case SBR_ID_CPE:
+            stereo = 1;
+            ptr_header_data[1] = ptr_header_data[0];
+
+            memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0],
+                   sizeof(ia_sbr_header_data_struct));
+            break;
+          default:
+            frame_status = 0;
+        }
+      }
+    }
+  }
+  if (ec_flag) {
+    for (k = 0; k < 2; k++) {
+      if (pstr_sbr_channel[k]->str_sbr_dec.band_count == 0) {
+        pstr_sbr_channel[k]->str_sbr_dec.band_count =
+            pstr_sbr_channel[k]->str_sbr_dec.str_codec_qmf_bank.no_channels;
+      }
+    }
+  }
+  if (ec_flag && usac_flag && !first_frame && !self->sbr_parse_complete) {
+    return IA_FATAL_ERROR;
+  }
+  if (!ec_flag || !first_frame || init_flag) {
+    if (pstr_drc_dec == NULL) {
+      WORD32 err_code = 0;
+      err_code = ixheaacd_sbr_dec(
+          &pstr_sbr_channel[0]->str_sbr_dec, core_sample_buf + slot_element, ptr_header_data[0],
+          ptr_frame_data[0], pstr_sbr_channel[0]->pstr_prev_frame_data, self->pstr_ps_stereo_dec,
+          &pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank,
+          &pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact,
+          (ptr_header_data[0]->sync_state == SBR_ACTIVE), low_pow_flag,
+          sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables, self->pstr_common_tables,
+          ch_fac, self->ptr_pvc_data_str, 0, NULL, audio_object_type, ldmps_present, self,
+          heaac_mps_present, ec_flag);
+      if (err_code) return err_code;
+      if (!self->enh_sbr_ps) {
+        if ((ptr_header_data[0]->sync_state == SBR_ACTIVE) && !ptr_frame_data[0]->mps_sbr_flag &&
+            ch_fac != 2) {
+          ptr_header_data[0]->pstr_freq_band_data[0].qmf_sb_prev =
+              ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
+        }
+      } else {
+        if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
+          ptr_header_data[0]->pstr_freq_band_data[0].qmf_sb_prev =
+              ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
+        }
+      }
+    } else {
+      WORD32 err_code = 0;
+      err_code = ixheaacd_sbr_dec(
+          &pstr_sbr_channel[0]->str_sbr_dec, core_sample_buf + slot_element, ptr_header_data[0],
+          ptr_frame_data[0], pstr_sbr_channel[0]->pstr_prev_frame_data, self->pstr_ps_stereo_dec,
+          &pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank,
+          &pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact,
+          (ptr_header_data[0]->sync_state == SBR_ACTIVE), low_pow_flag,
+          sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables, self->pstr_common_tables,
+          ch_fac, self->ptr_pvc_data_str, pstr_drc_dec->drc_on,
+          pstr_drc_dec->str_drc_channel_data[0].drc_factors_sbr, audio_object_type, ldmps_present,
+          self, heaac_mps_present, ec_flag);
+      if (err_code) return err_code;
+      if (!self->enh_sbr_ps) {
+        if ((ptr_header_data[0]->sync_state == SBR_ACTIVE) && !ptr_frame_data[0]->mps_sbr_flag &&
+            num_channels != 2) {
+          ptr_header_data[0]->pstr_freq_band_data[0].qmf_sb_prev =
+              ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
+        }
+      } else {
+        if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
+          ptr_header_data[0]->pstr_freq_band_data[0].qmf_sb_prev =
+              ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
+        }
+      }
+    }
+
+    if (!down_mix_flag && (stereo || dual_mono) && (num_channels == 2)) {
+      pstr_sbr_channel[1]->str_sbr_dec.time_sample_buf = self->time_sample_buf[1];
+
+      if (ele_channels == 1 && usac_flag) {
+        WORD32 err_code =
+            ixheaacd_esbr_dec(&pstr_sbr_channel[1]->str_sbr_dec, ptr_header_data[1],
+                              ptr_frame_data[1], (ptr_header_data[1]->sync_state == SBR_ACTIVE),
+                              low_pow_flag, self->pstr_sbr_tables, ch_fac);
+        if (err_code) return err_code;
+      } else {
+        if (pstr_drc_dec == NULL) {
+          WORD32 err_code = ixheaacd_sbr_dec(
+              &pstr_sbr_channel[1]->str_sbr_dec, core_sample_buf + slot_element + 1,
+              ptr_header_data[1], ptr_frame_data[1], pstr_sbr_channel[1]->pstr_prev_frame_data,
+              NULL, NULL, NULL, (ptr_header_data[1]->sync_state == SBR_ACTIVE), low_pow_flag,
+              sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables,
+              self->pstr_common_tables, ch_fac, self->ptr_pvc_data_str, 0, NULL,
+              audio_object_type, ldmps_present, self, heaac_mps_present, ec_flag);
+          if (err_code) return err_code;
+          if (!self->enh_sbr_ps) {
+            if ((ptr_header_data[1]->sync_state == SBR_ACTIVE) &&
+                !ptr_frame_data[0]->mps_sbr_flag) {
+              ptr_header_data[1]->pstr_freq_band_data[0].qmf_sb_prev =
+                  ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
+            }
+          } else {
+            if (ptr_header_data[1]->sync_state == SBR_ACTIVE) {
+              ptr_header_data[1]->pstr_freq_band_data[0].qmf_sb_prev =
+                  ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
+            }
+          }
+        } else {
+          WORD32 err_code = ixheaacd_sbr_dec(
+              &pstr_sbr_channel[1]->str_sbr_dec, core_sample_buf + slot_element + 1,
+              ptr_header_data[1], ptr_frame_data[1], pstr_sbr_channel[1]->pstr_prev_frame_data,
+              NULL, NULL, NULL, (ptr_header_data[1]->sync_state == SBR_ACTIVE), low_pow_flag,
+              sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables,
+              self->pstr_common_tables, ch_fac, self->ptr_pvc_data_str, pstr_drc_dec->drc_on,
+              pstr_drc_dec->str_drc_channel_data[1].drc_factors_sbr, audio_object_type,
+              ldmps_present, self, heaac_mps_present, ec_flag);
+          if (err_code) return err_code;
+          if (!self->enh_sbr_ps) {
+            if ((ptr_header_data[1]->sync_state == SBR_ACTIVE) &&
+                !ptr_frame_data[0]->mps_sbr_flag) {
+              ptr_header_data[1]->pstr_freq_band_data[0].qmf_sb_prev =
+                  ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
+            }
+          } else {
+            if (ptr_header_data[1]->sync_state == SBR_ACTIVE) {
+              ptr_header_data[1]->pstr_freq_band_data[0].qmf_sb_prev =
+                  ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
+            }
+          }
+        }
+      }
+
+    } else {
+      if (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD)
+
+      {
+        if (sub_d((WORD16)ptr_header_data[0]->channel_mode, PS_STEREO) == 0) {
+          num_channels = 2;
+        }
+        if (ptr_header_data[0]->enh_sbr_ps) {
+          num_channels = 2;
+        }
+      }
+    }
+    *codec_num_channels = num_channels;
+    self->sbr_mode = ptr_frame_data[0]->sbr_mode;
+
+    if ((audio_object_type == AOT_ER_AAC_ELD) || (audio_object_type == AOT_ER_AAC_LD)) {
+      if (pstr_drc_dec != NULL) {
+        WORD32 i, j;
+        for (i = 0; i < *codec_num_channels; i++) {
+          for (j = 0; j < 32; j++) {
+            memcpy(pstr_drc_dec->str_drc_channel_data[i].drc_factors_sbr[j],
+                   pstr_drc_dec->str_drc_channel_data[i].drc_factors_sbr[j + 32],
+                   64 * sizeof(WORD32));
+          }
+        }
+      }
+    }
+    if (ec_flag) {
+      self->band_count[0] = pstr_sbr_channel[0]->str_sbr_dec.band_count;
+      self->band_count[1] = pstr_sbr_channel[1]->str_sbr_dec.band_count;
+    }
+  }
+
+  return SBRDEC_OK;
+}
+
+IA_ERRORCODE ixheaacd_parse_sbr(ia_handle_sbr_dec_inst_struct self,
+                                ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream,
+                                WORD16 *codec_num_channels, FLAG frame_status,
+                                ia_sbr_scr_struct *sbr_scratch_struct,
+                                ia_bit_buf_struct *it_bit_buff, WORD32 audio_object_type) {
+  WORD32 k;
+  FLAG ps_flag = 0;
+  FLAG stereo = 0;
+  FLAG low_pow_flag = 0;
+  FLAG header_flag = 1;
+  FLAG dual_mono = 0;
+  WORD32 err = 0;
+  WORD32 num_channels = *codec_num_channels;
+  FLAG prev_stereo;
+  WORD32 num_elements = p_sbr_bit_stream->no_elements;
+  WORD32 usac_flag = self->aot_usac_flag;
 
   ia_sbr_channel_struct *pstr_sbr_channel[2];
   ia_sbr_header_data_struct *ptr_header_data[MAXNRSBRCHANNELS];
@@ -269,482 +1032,281 @@
 
   ia_sbr_frame_info_data_struct *ptr_frame_data[2];
 
-  for (k = 0; k < 2; k++) {
-    ptr_frame_data[k] = (ia_sbr_frame_info_data_struct *)self->frame_buffer[k];
+  self->num_delay_frames = 1;
 
-    pstr_sbr_channel[k] = self->pstr_sbr_channel[k];
+  self->ptr_mps_data = NULL;
 
-    ptr_header_data[k] = self->pstr_sbr_header[k];
+  if (usac_flag && self->ec_flag) {
+    for (k = 0; k < 2; k++) {
+      ptr_frame_data[k] = (ia_sbr_frame_info_data_struct *)self->frame_buffer[k];
 
-    if (audio_object_type == AOT_ER_AAC_ELD) {
-      ptr_frame_data[k]->eld_sbr_flag = eld_sbr_flag;
-      ptr_frame_data[k]->num_time_slots = ptr_header_data[0]->num_time_slots;
+      pstr_sbr_channel[k] = self->pstr_sbr_channel[k];
+
+      ptr_header_data[k] = self->pstr_sbr_header[k];
+
+      ptr_frame_data[k]->usac_independency_flag = self->usac_independency_flag;
+      ptr_frame_data[k]->mps_sbr_flag = (self->stereo_config_idx == 3) ? 1 : 0;
+      ptr_frame_data[k]->stereo_config_idx = self->stereo_config_idx;
+      ptr_frame_data[k]->inter_tes_flag = self->inter_tes_flag;
+      ptr_frame_data[k]->sbr_mode = self->sbr_mode;
     }
 
-    ptr_frame_data[k]->usac_independency_flag = self->usac_independency_flag;
-    ptr_frame_data[k]->mps_sbr_flag = (self->stereo_config_idx == 3) ? 1 : 0;
-    ptr_frame_data[k]->stereo_config_idx = self->stereo_config_idx;
-    ptr_frame_data[k]->inter_tes_flag = self->inter_tes_flag;
-    ptr_frame_data[k]->sbr_mode = self->sbr_mode;
+    for (k = 0; k < *codec_num_channels; k++) {
+      ptr_header_data[k]->usac_flag = self->aot_usac_flag;
 
-    if (!usac_flag) {
-      ptr_frame_data[k]->usac_independency_flag = 0;
-      ptr_frame_data[k]->mps_sbr_flag = 0;
-      ptr_frame_data[k]->stereo_config_idx = -1;
-      ptr_frame_data[k]->inter_tes_flag = 0;
-      ptr_frame_data[k]->sbr_mode = ORIG_SBR;
+      ptr_header_data[k]->enh_sbr = self->enh_sbr;
+      ptr_header_data[k]->enh_sbr_ps =
+          ((self->enh_sbr_ps) | (ptr_header_data[k]->channel_mode == PS_STEREO));
+      ptr_header_data[k]->usac_independency_flag = self->usac_independency_flag;
+      ptr_header_data[k]->hbe_flag = self->hbe_flag;
+      ptr_header_data[k]->pvc_flag = self->pvc_flag;
+
+      ptr_header_data[k]->esbr_hq = self->esbr_hq;
     }
-  }
 
-  for (k = 0; k < *codec_num_channels; k++) {
-    ptr_header_data[k]->usac_flag = self->aot_usac_flag;
+    initial_sync_state = ptr_header_data[0]->sync_state;
 
-    ptr_header_data[k]->usac_independency_flag = self->usac_independency_flag;
-    ptr_header_data[k]->hbe_flag = self->hbe_flag;
-    ptr_header_data[k]->pvc_flag = self->pvc_flag;
-
-    if (!usac_flag) {
-      ptr_header_data[k]->usac_independency_flag = 0;
-      ptr_header_data[k]->hbe_flag = 0;
-      ptr_header_data[k]->pvc_flag = 0;
-    }
-  }
-
-  initial_sync_state = ptr_header_data[0]->sync_state;
-
-  low_pow_flag = !usac_flag;
-  self->pstr_sbr_tables->sbr_rand_ph =
-      self->pstr_sbr_tables->env_calc_tables_ptr->sbr_rand_ph;
-
-  if (ps_enable) {
-    if (num_channels == 1) {
-      low_pow_flag = 0;
-    }
-  }
-
-  if (audio_object_type == AOT_ER_AAC_ELD) {
     low_pow_flag = 0;
-  }
+    self->pstr_sbr_tables->sbr_rand_ph = self->pstr_sbr_tables->env_calc_tables_ptr->sbr_rand_ph;
 
-  prev_stereo = (ptr_header_data[0]->channel_mode == SBR_STEREO);
+    prev_stereo = (ptr_header_data[0]->channel_mode == SBR_STEREO);
 
-  if (ps_enable) prev_ps_flag = (ptr_header_data[0]->channel_mode == PS_STEREO);
+    ptr_header_data[0]->err_flag_prev = ptr_header_data[0]->err_flag;
 
-  ptr_header_data[0]->err_flag_prev = ptr_header_data[0]->err_flag;
+    if (p_sbr_bit_stream->no_elements == 0) {
+      frame_status = 0;
+      ptr_header_data[0]->sync_state = UPSAMPLING;
+      if (num_channels == 2) ptr_header_data[1]->sync_state = UPSAMPLING;
+    }
 
-  if (p_sbr_bit_stream->no_elements == 0) {
-    frame_status = 0;
-    ptr_header_data[0]->sync_state = UPSAMPLING;
-    if (num_channels == 2) ptr_header_data[1]->sync_state = UPSAMPLING;
-  }
-
-  if ((usac_flag)) {
-    if ((p_sbr_bit_stream->no_elements) &&
-        (p_sbr_bit_stream->str_sbr_ele->size_payload > 0)) {
+    if ((p_sbr_bit_stream->no_elements) && (p_sbr_bit_stream->str_sbr_ele->size_payload > 0)) {
       num_elements = p_sbr_bit_stream->no_elements;
     } else {
       num_elements = 0;
     }
-  }
 
-  for (k = 0; k < num_elements; k++) {
-    struct ia_bit_buf_struct local_bit_buf = {0};
-    ia_sbr_element_stream_struct *ptr_bit_str_ele =
-        &p_sbr_bit_stream->str_sbr_ele[k];
-    ele_channels =
-        (p_sbr_bit_stream->str_sbr_ele[0].sbr_ele_id == SBR_ID_CPE) ? 2 : 1;
+    for (k = 0; k < num_elements; k++) {
+      ia_sbr_element_stream_struct *ptr_bit_str_ele = &p_sbr_bit_stream->str_sbr_ele[k];
 
-    switch (ptr_bit_str_ele->sbr_ele_id) {
-      case SBR_ID_SCE:
-      case SBR_ID_CCE:
-        if (num_channels == 2) {
-          dual_mono = 1;
-        }
-        stereo = 0;
-        break;
-      case SBR_ID_CPE:
-        stereo = 1;
-        ptr_header_data[1] = ptr_header_data[0];
-
-        memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0],
-               sizeof(ia_sbr_header_data_struct));
-        break;
-      default:
-        frame_status = 0;
-    }
-
-    if (frame_status) {
-      if (!usac_flag) {
-        ixheaacd_create_init_bit_buf(&local_bit_buf,
-                                     (UWORD8 *)ptr_bit_str_ele->ptr_sbr_data,
-                                     ptr_bit_str_ele->size_payload);
-
-        it_bit_buff = &local_bit_buf;
-        it_bit_buff->xaac_jmp_buf = self->xaac_jmp_buf;
-        if (audio_object_type == AOT_ER_AAC_ELD) {
-          if (eld_sbr_flag != 1) {
-            ixheaacd_read_bits_buf(&local_bit_buf, LEN_NIBBLE);
+      switch (ptr_bit_str_ele->sbr_ele_id) {
+        case SBR_ID_SCE:
+        case SBR_ID_CCE:
+          if (num_channels == 2) {
+            dual_mono = 1;
           }
-        } else {
-          ixheaacd_read_bits_buf(&local_bit_buf, LEN_NIBBLE);
-        }
-      }
-      if (ptr_bit_str_ele->extension_type == SBR_EXTENSION_CRC) {
-        WORD32 crc_bits = 0;
-        WORD32 crc_check_flag = 0;
-        crc_check_flag = 1;
-        crc_bits = (((ptr_bit_str_ele->size_payload - 1) << 3) +
-                    (4 - SBR_CYC_REDCY_CHK_BITS));
+          stereo = 0;
+          break;
+        case SBR_ID_CPE:
+          stereo = 1;
+          ptr_header_data[1] = ptr_header_data[0];
 
-        if (crc_bits < 0) {
-          crc_check_flag = 0;
+          memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0],
+                 sizeof(*(self->pstr_sbr_header[1])));
+          break;
+        default:
           frame_status = 0;
-        }
-        if (crc_check_flag)
-          frame_status = ixheaacd_sbr_crccheck(it_bit_buff, crc_bits);
       }
 
-      if (!usac_flag) header_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
+      if (frame_status) {
+        if (ptr_bit_str_ele->extension_type == SBR_EXTENSION_CRC) {
+          WORD32 crc_bits = 0;
+          WORD32 crc_check_flag = 0;
+          crc_check_flag = 1;
+          crc_bits = (((ptr_bit_str_ele->size_payload - 1) << 3) + (4 - SBR_CYC_REDCY_CHK_BITS));
 
-      if (audio_object_type != AOT_ER_AAC_ELD) {
-        if (header_flag) {
-          header_flag = ixheaacd_sbr_read_header_data(
-              ptr_header_data[k], it_bit_buff, stereo, ptr_sbr_dflt_header);
-          if (usac_flag) {
-            if ((self->ptr_pvc_data_str->prev_pvc_mode == 0) &&
-                (ptr_header_data[k]->pvc_mode != 0)) {
-              self->ptr_pvc_data_str->prev_pvc_id = 0;
-            }
-            self->ptr_pvc_data_str->prev_pvc_mode =
-                ptr_header_data[k]->pvc_mode;
-            if (ptr_header_data[k]->pvc_mode == 0) {
-              ptr_frame_data[k]->sbr_mode = ORIG_SBR;
-            } else {
-              ptr_frame_data[k]->sbr_mode = PVC_SBR;
-            }
+          if (crc_bits < 0) {
+            crc_check_flag = 0;
+            frame_status = 0;
           }
-          if (header_flag == SBR_RESET) {
-            err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k],
+          if (crc_check_flag && frame_status == 1)
+            frame_status = ixheaacd_sbr_crccheck(it_bit_buff, crc_bits);
+        }
 
-                                             self->pstr_common_tables);
-            if (!err) {
-              WORD32 lr;
-              WORD32 lr1 = ps_enable ? 2 : num_channels;
-              for (lr = 0; lr < lr1; lr++) {
-                ptr_frame_data[lr]->reset_flag = 1;
+        if (frame_status == 1) {
+          header_flag = ixheaacd_sbr_read_header_data(ptr_header_data[k], it_bit_buff, stereo,
+                                                      ptr_sbr_dflt_header);
+        }
+        if (usac_flag) {
+          if ((self->ptr_pvc_data_str->prev_pvc_mode == 0) &&
+              (ptr_header_data[k]->pvc_mode != 0)) {
+            self->ptr_pvc_data_str->prev_pvc_id = 0;
+          }
+          self->ptr_pvc_data_str->prev_pvc_mode = ptr_header_data[k]->pvc_mode;
+          if (ptr_header_data[k]->pvc_mode == 0) {
+            ptr_frame_data[k]->sbr_mode = ORIG_SBR;
+          } else {
+            ptr_frame_data[k]->sbr_mode = PVC_SBR;
+          }
+        }
+        if (header_flag == SBR_RESET) {
+          err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k],
 
-                err |= ixheaacd_sbr_dec_reset(
-                    &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k],
-                    low_pow_flag, self->pstr_common_tables,
-                    ptr_frame_data[k]->pitch_in_bins, audio_object_type);
-                if (err < 0) return err;
+                                           self->pstr_common_tables);
+          if (!err) {
+            WORD32 lr;
+            WORD32 lr1 = num_channels;
+            for (lr = 0; lr < lr1; lr++) {
+              ptr_frame_data[lr]->reset_flag = 1;
+              if ((SBR_NOT_INITIALIZED == ptr_header_data[lr]->sync_state) && !usac_flag) {
+                ptr_frame_data[lr]->sbr_patching_mode = 1;
+                ptr_frame_data[lr]->over_sampling_flag = 0;
+                ptr_frame_data[lr]->pitch_in_bins = 0;
+                ptr_header_data[lr]->pre_proc_flag = 0;
+              }
+
+              err |= ixheaacd_sbr_dec_reset(
+                  &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k], low_pow_flag,
+                  self->pstr_common_tables, ptr_frame_data[k]->pitch_in_bins, audio_object_type,
+                  sbr_scratch_struct->ptr_work_buf_core);
+              if (err < 0) {
+                if (self->ec_flag) {
+                  self->frame_ok = 0;
+                } else {
+                  return err;
+                }
               }
             }
-
-            if (err == 0) {
-              ptr_header_data[k]->sync_state = SBR_ACTIVE;
-            }
-          }
-        }
-      } else {
-        if (header_flag) {
-          header_flag = ixheaacd_sbr_read_header_data(
-              ptr_header_data[k], it_bit_buff, stereo, ptr_sbr_dflt_header);
-          if (usac_flag) {
-            if ((self->ptr_pvc_data_str->prev_pvc_mode == 0) &&
-                (ptr_header_data[k]->pvc_mode != 0)) {
-              self->ptr_pvc_data_str->prev_pvc_id = 0;
-            }
-            self->ptr_pvc_data_str->prev_pvc_mode =
-                ptr_header_data[k]->pvc_mode;
-            if (ptr_header_data[k]->pvc_mode == 0) {
-              ptr_frame_data[k]->sbr_mode = ORIG_SBR;
-            } else {
-              ptr_frame_data[k]->sbr_mode = PVC_SBR;
-            }
           }
 
-          if (header_flag == SBR_RESET) {
-            err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k],
-
-                                             self->pstr_common_tables);
-            if (err) {
-              return err;
-            }
+          if (err == 0) {
+            ptr_header_data[k]->sync_state = SBR_ACTIVE;
           }
         }
-
-        {
-          WORD32 lr;
-          WORD32 lr1 = ps_enable ? 2 : num_channels;
-          for (lr = 0; lr < lr1; lr++) {
-            ptr_frame_data[lr]->reset_flag = 1;
-            if (ptr_header_data[k]->status) {
-              err |= ixheaacd_sbr_dec_reset(
-                  &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k],
-                  low_pow_flag, self->pstr_common_tables,
-                  ptr_frame_data[k]->pitch_in_bins, audio_object_type);
-              if (err < 0) return err;
-            }
-          }
-          ptr_header_data[k]->status = 0;
-        }
-
-        if (err == 0) {
-          ptr_header_data[k]->sync_state = SBR_ACTIVE;
-        }
       }
-    }
 
-    if (err || (ptr_header_data[k]->sync_state == SBR_NOT_INITIALIZED)) {
-      WORD32 lr1 = ps_enable ? 2 : num_channels;
-      ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1);
-      if (err) return err;
-    }
+      if (err || (ptr_header_data[k]->sync_state == SBR_NOT_INITIALIZED)) {
+        WORD32 lr1 = num_channels;
+        ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1);
+        if (err && !self->ec_flag) {
+          return err;
+        }
+      }
 
-    if (frame_status && (ptr_header_data[k]->sync_state == SBR_ACTIVE)) {
-      if (stereo) {
-        frame_status = ixheaacd_sbr_read_cpe(ptr_header_data[0], ptr_frame_data,
-                                             it_bit_buff, self->pstr_sbr_tables,
-                                             audio_object_type);
-      } else {
-        if (ps_enable) {
-          if (down_mix_flag) {
-            self->pstr_ps_stereo_dec->force_mono = 1;
-          } else {
-            self->pstr_ps_stereo_dec->force_mono = 0;
-          }
+      if (frame_status && (ptr_header_data[k]->sync_state == SBR_ACTIVE)) {
+        if (stereo) {
+          frame_status = ixheaacd_sbr_read_cpe(ptr_header_data[0], ptr_frame_data, it_bit_buff,
+                                               self->pstr_sbr_tables, audio_object_type);
+          if (frame_status < 0) return frame_status;
         } else {
           self->pstr_ps_stereo_dec = 0;
+
+          if (ptr_frame_data[k]->sbr_mode == ORIG_SBR) {
+            frame_status = ixheaacd_sbr_read_sce(ptr_header_data[k], ptr_frame_data[k],
+                                                 self->pstr_ps_stereo_dec, it_bit_buff,
+                                                 self->pstr_sbr_tables, audio_object_type, 0);
+            if (frame_status < 0) return frame_status;
+          } else if (ptr_frame_data[k]->sbr_mode == PVC_SBR) {
+            frame_status = ixheaacd_sbr_read_pvc_sce(ptr_frame_data[k], it_bit_buff, 0,
+                                                     self->ptr_pvc_data_str,
+                                                     self->pstr_sbr_tables, ptr_header_data[k]);
+            if (frame_status < 0) return frame_status;
+          }
         }
-        if (ptr_frame_data[k]->sbr_mode == ORIG_SBR) {
-          frame_status = ixheaacd_sbr_read_sce(
-              ptr_header_data[k], ptr_frame_data[k], self->pstr_ps_stereo_dec,
-              it_bit_buff, self->pstr_sbr_tables, audio_object_type);
-          if (frame_status < 0) return frame_status;
-        } else if (ptr_frame_data[k]->sbr_mode == PVC_SBR) {
-          frame_status = ixheaacd_sbr_read_pvc_sce(
-              ptr_frame_data[k], it_bit_buff, 0, self->ptr_pvc_data_str,
-              self->pstr_sbr_tables, ptr_header_data[k]);
-          if (frame_status < 0) return frame_status;
+        {
+          WORD32 total_bits_read;
+          total_bits_read = ixheaacd_no_bits_read(it_bit_buff);
+          if (total_bits_read > (ptr_bit_str_ele->size_payload << 3) ||
+              total_bits_read < ((ptr_bit_str_ele->size_payload << 3) - 8)) {
+            frame_status = 0;
+          }
         }
-      }
-      if (audio_object_type != AOT_ER_AAC_ELD) {
-        WORD32 total_bits_read;
-        total_bits_read = ixheaacd_no_bits_read(it_bit_buff);
-        if (total_bits_read > (ptr_bit_str_ele->size_payload << 3) ||
-            total_bits_read < ((ptr_bit_str_ele->size_payload << 3) - 8)) {
-          frame_status = 0;
-        }
-      }
-    }
-  }
-
-  if (!usac_flag) {
-    if (!frame_status || (ptr_header_data[0]->sync_state != SBR_ACTIVE) ||
-        ptr_header_data[0]->err_flag) {
-      ptr_header_data[0]->err_flag = 1;
-      stereo = (num_channels == 2) ? 1 : 0;
-      if (ptr_header_data[0]->channel_mode == 0) {
-        ptr_header_data[0]->channel_mode = stereo ? SBR_STEREO : SBR_MONO;
-      }
-    }
-
-    if (!(stereo || dual_mono)) {
-      ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
-      ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
-    }
-
-    if (ptr_header_data[0]->sync_state == SBR_NOT_INITIALIZED) {
-      WORD32 lr1 = ps_enable ? 2 : num_channels;
-      ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1);
-    }
-  }
-
-  if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
-    if (ptr_frame_data[0]->sbr_mode == PVC_SBR) {
-      err = ixheaacd_dec_sbrdata_for_pvc(
-          ptr_header_data[0], ptr_frame_data[0],
-          pstr_sbr_channel[0]->pstr_prev_frame_data);
-      if (err) return err;
-    } else if (ptr_frame_data[0]->sbr_mode == ORIG_SBR) {
-      err = ixheaacd_dec_sbrdata(
-          ptr_header_data[0], ptr_header_data[1], ptr_frame_data[0],
-          pstr_sbr_channel[0]->pstr_prev_frame_data,
-          (stereo || dual_mono) ? ptr_frame_data[1] : NULL,
-          (stereo || dual_mono) ? pstr_sbr_channel[1]->pstr_prev_frame_data
-                                : NULL,
-          self->pstr_common_tables);
-
-      if (err) return err;
-    }
-
-    if (ptr_header_data[0]->channel_mode == PS_STEREO &&
-        (audio_object_type != AOT_ER_AAC_ELD &&
-         audio_object_type != AOT_ER_AAC_LD)) {
-      ixheaacd_decode_ps_data(self->pstr_ps_stereo_dec);
-      ps_flag = 1;
-      self->ps_present = ps_flag;
-    }
-
-    ptr_frame_data[0]->max_qmf_subband_aac =
-        ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
-    if (stereo) {
-      ptr_frame_data[1]->max_qmf_subband_aac =
-          ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
-    }
-  }
-  if (audio_object_type != AOT_ER_AAC_ELD) {
-    if ((initial_sync_state == SBR_NOT_INITIALIZED) &&
-        ptr_header_data[0]->err_flag) {
-      ptr_header_data[0]->sync_state = SBR_NOT_INITIALIZED;
-    }
-  } else {
-    ptr_header_data[0]->sync_state = SBR_ACTIVE;
-  }
-
-  if ((num_channels == 2) && !(stereo || dual_mono)) {
-    ixheaacd_downmix_to_monosbr(&core_sample_buf[slot_element], ch_fac);
-  }
-
-  if ((!prev_stereo && !prev_ps_flag) && (ps_flag)) {
-    WORD32 copy_size;
-    if (down_samp_flag)
-      copy_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
-    else
-      copy_size = QMF_FILTER_STATE_SYN_SIZE;
-
-    memcpy(
-        pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
-        pstr_sbr_channel[0]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
-        copy_size * sizeof(WORD16));
-
-    pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale =
-        pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale;
-  }
-
-  if ((!prev_stereo && stereo && (num_channels == 2)) &&
-      (audio_object_type != AOT_ER_AAC_ELD)) {
-    WORD32 copy_size;
-    if (down_samp_flag)
-      copy_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
-    else
-      copy_size = QMF_FILTER_STATE_SYN_SIZE;
-
-    memcpy(
-        pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
-        pstr_sbr_channel[0]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
-        copy_size * sizeof(WORD16));
-
-    pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale =
-        pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale;
-
-    memcpy(
-        pstr_sbr_channel[1]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
-        pstr_sbr_channel[0]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
-        QMF_FILTER_STATE_ANA_SIZE * sizeof(WORD16));
-
-    pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale =
-        pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale;
-
-    memcpy(pstr_sbr_channel[1]->str_sbr_dec.ptr_sbr_overlap_buf,
-           pstr_sbr_channel[0]->str_sbr_dec.ptr_sbr_overlap_buf,
-           MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32));
-
-    pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale =
-        pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale;
-    pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale =
-        pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale;
-  }
-  pstr_sbr_channel[0]->str_sbr_dec.time_sample_buf = self->time_sample_buf[0];
-  if (pstr_drc_dec == NULL) {
-    WORD32 err_code = 0;
-    err_code = ixheaacd_sbr_dec(
-        &pstr_sbr_channel[0]->str_sbr_dec, core_sample_buf + slot_element,
-        ptr_header_data[0], ptr_frame_data[0],
-        pstr_sbr_channel[0]->pstr_prev_frame_data, self->pstr_ps_stereo_dec,
-        &pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank,
-        &pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact,
-        (ptr_header_data[0]->sync_state == SBR_ACTIVE), low_pow_flag,
-        sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables,
-        self->pstr_common_tables, ch_fac, self->ptr_pvc_data_str, 0, NULL,
-        audio_object_type);
-    if (err_code) return err_code;
-  } else {
-    WORD32 err_code = 0;
-    err_code = ixheaacd_sbr_dec(
-        &pstr_sbr_channel[0]->str_sbr_dec, core_sample_buf + slot_element,
-        ptr_header_data[0], ptr_frame_data[0],
-        pstr_sbr_channel[0]->pstr_prev_frame_data, self->pstr_ps_stereo_dec,
-        &pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank,
-        &pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact,
-        (ptr_header_data[0]->sync_state == SBR_ACTIVE), low_pow_flag,
-        sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables,
-        self->pstr_common_tables, ch_fac, self->ptr_pvc_data_str,
-        pstr_drc_dec->drc_on,
-        pstr_drc_dec->str_drc_channel_data[0].drc_factors_sbr,
-        audio_object_type);
-    if (err_code) return err_code;
-  }
-
-  if (!down_mix_flag && (stereo || dual_mono) && (num_channels == 2)) {
-    pstr_sbr_channel[1]->str_sbr_dec.time_sample_buf = self->time_sample_buf[1];
-
-    if (ele_channels == 1 && usac_flag) {
-      WORD32 err_code = ixheaacd_esbr_dec(
-          &pstr_sbr_channel[1]->str_sbr_dec, ptr_header_data[1],
-          ptr_frame_data[1], (ptr_header_data[1]->sync_state == SBR_ACTIVE),
-          low_pow_flag, self->pstr_sbr_tables, ch_fac);
-      if (err_code) return err_code;
-    } else {
-      if (pstr_drc_dec == NULL) {
-        WORD32 err_code = ixheaacd_sbr_dec(
-            &pstr_sbr_channel[1]->str_sbr_dec,
-            core_sample_buf + slot_element + 1, ptr_header_data[1],
-            ptr_frame_data[1], pstr_sbr_channel[1]->pstr_prev_frame_data, NULL,
-            NULL, NULL, (ptr_header_data[1]->sync_state == SBR_ACTIVE),
-            low_pow_flag, sbr_scratch_struct->ptr_work_buf_core,
-            self->pstr_sbr_tables, self->pstr_common_tables, ch_fac,
-            self->ptr_pvc_data_str, 0, NULL, audio_object_type);
-        if (err_code) return err_code;
       } else {
-        WORD32 err_code = ixheaacd_sbr_dec(
-            &pstr_sbr_channel[1]->str_sbr_dec,
-            core_sample_buf + slot_element + 1, ptr_header_data[1],
-            ptr_frame_data[1], pstr_sbr_channel[1]->pstr_prev_frame_data, NULL,
-            NULL, NULL, (ptr_header_data[1]->sync_state == SBR_ACTIVE),
-            low_pow_flag, sbr_scratch_struct->ptr_work_buf_core,
-            self->pstr_sbr_tables, self->pstr_common_tables, ch_fac,
-            self->ptr_pvc_data_str, pstr_drc_dec->drc_on,
-            pstr_drc_dec->str_drc_channel_data[1].drc_factors_sbr,
-            audio_object_type);
-        if (err_code) return err_code;
+        if (frame_status && self->ec_flag) {
+          err = IA_XHEAAC_DEC_EXE_NONFATAL_SBR_PARSE_ERROR;
+          self->sbr_parse_err_flag = 1;
+        }
+        if (!frame_status) {
+          ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_ERROR);
+        } else {
+          ixheaacd_ec_set_frame_error_flag(ptr_bit_str_ele, FRAME_OK);
+        }
       }
     }
+    if (ptr_header_data[0]->sync_state == SBR_ACTIVE) {
+      if (ptr_frame_data[0]->sbr_mode == PVC_SBR) {
+        err = ixheaacd_dec_sbrdata_for_pvc(ptr_header_data[0], ptr_frame_data[0],
+                                           pstr_sbr_channel[0]->pstr_prev_frame_data,
+                                           audio_object_type);
+        if (err) {
+          if (self->ec_flag) {
+            self->frame_ok = 0;
+          } else {
+            return err;
+          }
+        }
+      } else if (ptr_frame_data[0]->sbr_mode == ORIG_SBR) {
+        err = ixheaacd_dec_sbrdata(
+            ptr_header_data[0], ptr_header_data[1], ptr_frame_data[0],
+            pstr_sbr_channel[0]->pstr_prev_frame_data,
+            (stereo || dual_mono) ? ptr_frame_data[1] : NULL,
+            (stereo || dual_mono) ? pstr_sbr_channel[1]->pstr_prev_frame_data : NULL,
+            self->pstr_common_tables, 0, audio_object_type, self->ec_flag);
 
-  } else {
-    if (audio_object_type != AOT_ER_AAC_ELD &&
-        audio_object_type != AOT_ER_AAC_LD)
+        if (err) {
+          if (self->ec_flag) {
+            self->frame_ok = 0;
+          } else {
+            return err;
+          }
+        }
+      }
 
-    {
-      if (sub_d((WORD16)ptr_header_data[0]->channel_mode, PS_STEREO) == 0) {
-        num_channels = 2;
+      if (ptr_header_data[0]->channel_mode == PS_STEREO &&
+          (audio_object_type != AOT_ER_AAC_ELD && audio_object_type != AOT_ER_AAC_LD)) {
+        ixheaacd_decode_ps_data(self->pstr_ps_stereo_dec, 1024);
+        ps_flag = 1;
+        self->ps_present = ps_flag;
+      }
+
+      if (ptr_header_data[0]->enh_sbr_ps) {
+        ps_flag = 1;
+        self->ps_present = ps_flag;
+      }
+
+      ptr_frame_data[0]->max_qmf_subband_aac =
+          ptr_header_data[0]->pstr_freq_band_data->sub_band_start;
+      if (stereo) {
+        ptr_frame_data[1]->max_qmf_subband_aac =
+            ptr_header_data[1]->pstr_freq_band_data->sub_band_start;
       }
     }
-  }
-  *codec_num_channels = num_channels;
-  self->sbr_mode = ptr_frame_data[0]->sbr_mode;
-
-  if (pstr_drc_dec != NULL) {
-    WORD32 i, j;
-    for (i = 0; i < *codec_num_channels; i++) {
-      for (j = 0; j < 32; j++) {
-        memcpy(pstr_drc_dec->str_drc_channel_data[i].drc_factors_sbr[j],
-               pstr_drc_dec->str_drc_channel_data[i].drc_factors_sbr[j + 32],
-               64 * sizeof(WORD32));
+    if (audio_object_type != AOT_ER_AAC_ELD) {
+      if ((initial_sync_state == SBR_NOT_INITIALIZED) && ptr_header_data[0]->err_flag) {
+        ptr_header_data[0]->sync_state = SBR_NOT_INITIALIZED;
       }
+    } else {
+      ptr_header_data[0]->sync_state = SBR_ACTIVE;
     }
+
+    if ((!prev_stereo && stereo && (num_channels == 2)) &&
+        (audio_object_type != AOT_ER_AAC_ELD)) {
+      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
+             pstr_sbr_channel[0]->str_sbr_dec.str_synthesis_qmf_bank.filter_states,
+             QMF_FILTER_STATE_SYN_SIZE * sizeof(WORD16));
+
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_syn_scale;
+
+      memcpy(pstr_sbr_channel[1]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
+             pstr_sbr_channel[0]->str_sbr_dec.str_codec_qmf_bank.anal_filter_states,
+             QMF_FILTER_STATE_ANA_SIZE * sizeof(WORD16));
+
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.st_lb_scale;
+
+      memcpy(pstr_sbr_channel[1]->str_sbr_dec.ptr_sbr_overlap_buf,
+             pstr_sbr_channel[0]->str_sbr_dec.ptr_sbr_overlap_buf,
+             MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32));
+
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_lb_scale;
+      pstr_sbr_channel[1]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale =
+          pstr_sbr_channel[0]->str_sbr_dec.str_sbr_scale_fact.ov_hb_scale;
+    }
+
+    pstr_sbr_channel[0]->str_sbr_dec.time_sample_buf = self->time_sample_buf[0];
+    self->sbr_parse_complete = 1;
   }
 
-  return SBRDEC_OK;
-}
+  return err;
+}
\ No newline at end of file
diff --git a/decoder/ixheaacd_sbrdecoder.h b/decoder/ixheaacd_sbrdecoder.h
index 21c90c0..846fc02 100644
--- a/decoder/ixheaacd_sbrdecoder.h
+++ b/decoder/ixheaacd_sbrdecoder.h
@@ -22,6 +22,7 @@
 
 #define EXT_DYNAMIC_RANGE 11
 
+#define EXT_SAC_DATA 12
 #define SBR_EXTENSION 13
 #define SBR_EXTENSION_CRC 14
 
@@ -48,6 +49,14 @@
   WORD32 extension_type;
   WORD32 size_payload;
   WORD8 *ptr_sbr_data;
+  WORD8 *ptr_prev_sbr_data;
+  WORD32 prev_size_payload;
+  WORD32 frame_error_flag[2];
+  WORD32 use_frame_slot;
+  WORD32 prev_sbr_ele_id;
+  WORD32 prev_extension_type;
+  WORD32 size_payload_old;
+  WORD8 sbr_prev_data[MAXSBRBYTES];
 } ia_sbr_element_stream_struct;
 
 typedef struct {
@@ -65,12 +74,18 @@
 } ia_sbr_scr_struct;
 
 IA_ERRORCODE ixheaacd_applysbr(
-    ia_handle_sbr_dec_inst_struct self,
-    ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream, WORD16 *core_sample_buf,
-    WORD16 *codec_num_channels, FLAG frame_status, FLAG down_samp_flag,
-    FLAG down_mix_flag, ia_sbr_scr_struct *sbr_scratch_struct, WORD32 ps_enable,
-    WORD32 ch_fac, WORD32 slot_element, ia_bit_buf_struct *it_bit_buff,
-    ia_drc_dec_struct *pstr_drc_dec, WORD eld_sbr_flag, WORD audio_object_type);
+    ia_handle_sbr_dec_inst_struct self, ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream,
+    WORD16 *core_sample_buf, WORD16 *codec_num_channels, FLAG frame_status, FLAG down_samp_flag,
+    FLAG down_mix_flag, ia_sbr_scr_struct *sbr_scratch_struct, WORD32 ps_enable, WORD32 ch_fac,
+    WORD32 slot_element, ia_bit_buf_struct *it_bit_buff, ia_drc_dec_struct *pstr_drc_dec,
+    WORD eld_sbr_flag, WORD audio_object_type, WORD32 init_flag, WORD32 ldmps_present,
+    WORD32 frame_size, WORD32 heaac_mps_present, WORD32 ec_flag, FLAG first_frame);
+
+IA_ERRORCODE ixheaacd_parse_sbr(ia_handle_sbr_dec_inst_struct self,
+                                ia_aac_dec_sbr_bitstream_struct *p_sbr_bit_stream,
+                                WORD16 *codec_num_channels, FLAG frame_status,
+                                ia_sbr_scr_struct *sbr_scratch_struct,
+                                ia_bit_buf_struct *it_bit_buff, WORD32 audio_object_type);
 
 WORD32 ixheaacd_getsize_sbr_persistent();
 
@@ -78,4 +93,4 @@
                                          WORD32 *persistent_used,
                                          WORD32 channels, WORD32 ps_enable);
 
-#endif
+#endif /* IXHEAACD_SBRDECODER_H */
diff --git a/decoder/ixheaacd_sbrdecsettings.h b/decoder/ixheaacd_sbrdecsettings.h
index ab9664e..5d183e4 100644
--- a/decoder/ixheaacd_sbrdecsettings.h
+++ b/decoder/ixheaacd_sbrdecsettings.h
@@ -70,6 +70,8 @@
 #define MAX_OV_COLS 6
 #define MAX_ENV_COLS (MAX_COLS + MAX_OV_COLS)
 
+#define MAX_ENV_COLS_960 (30 + MAX_OV_COLS)
+
 #define SBR_FREQ_SCALE_DEFAULT 2
 #define SBR_ALTER_SCALE_DEFAULT 1
 #define SBR_NOISE_BANDS_DEFAULT 2
diff --git a/decoder/ixheaacd_sbrqmftrans.h b/decoder/ixheaacd_sbrqmftrans.h
index 2b856b9..3522b84 100644
--- a/decoder/ixheaacd_sbrqmftrans.h
+++ b/decoder/ixheaacd_sbrqmftrans.h
@@ -25,15 +25,23 @@
                               FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
                               FLOAT32 pv_qmf_buf_real[][64],
                               FLOAT32 pv_qmf_buf_imag[][64],
-                              WORD32 pitch_in_bins);
+                              WORD32 pitch_in_bins,
+                              ia_sbr_header_data_struct *ptr_header_data);
+
+WORD32 ixheaacd_dft_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+                              FLOAT32 qmf_buf_real[][64],
+                              FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
+                              FLOAT32 pv_qmf_buf_real[][64],
+                              FLOAT32 pv_qmf_buf_imag[][64],
+                              WORD32 pitch_in_bins,
+                              FLOAT32 *dft_hbe_scratch_buf);
 
 WORD32 ixheaacd_qmf_hbe_data_reinit(
     ia_esbr_hbe_txposer_struct *ptr_hbe_transposer_str,
     WORD16 *ptr_freq_band_tbl[MAX_FREQ_COEFFS + 1], WORD16 *ptr_num_sf_bands,
     WORD32 upsamp_4_flag);
 
-IA_ERRORCODE ixheaacd_hbe_post_anal_process(
-    ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, WORD32 pitch_in_bins,
-    WORD32 sbr_upsamp_4_flg);
+IA_ERRORCODE ixheaacd_hbe_post_anal_process(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
+                                            WORD32 pitch_in_bins, WORD32 sbr_upsamp_4_flg);
 
 #endif
diff --git a/decoder/ixheaacd_spectrum_dec.c b/decoder/ixheaacd_spectrum_dec.c
index 8d73ee6..995fc35 100644
--- a/decoder/ixheaacd_spectrum_dec.c
+++ b/decoder/ixheaacd_spectrum_dec.c
@@ -28,7 +28,7 @@
 
 #include "ixheaacd_tns_usac.h"
 #include "ixheaacd_cnst.h"
-
+#include "ixheaacd_error_codes.h"
 #include "ixheaacd_acelp_info.h"
 
 #include "ixheaacd_sbrdecsettings.h"
@@ -39,6 +39,8 @@
 #include "ixheaacd_sbrdecoder.h"
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 
@@ -321,7 +323,7 @@
   {
     WORD32 bits_consumed;
     bits_consumed = ((g_bs->ptr_read_next - start_read_pos) << 3) +
-                    (start_bit_pos - g_bs->bit_pos);
+                             (start_bit_pos - g_bs->bit_pos);
     g_bs->cnt_bits -= bits_consumed;
   }
 }
@@ -367,7 +369,15 @@
     err_code = ixheaacd_ics_info(usac_data, chn, max_sfb, it_bit_buff,
                                  window_sequence_last);
 
-    if (err_code == -1) return err_code;
+    if (err_code == -1) {
+      if (usac_data->ec_flag) {
+        memcpy(usac_data->max_sfb, pstr_core_coder->max_sfb, sizeof(pstr_core_coder->max_sfb));
+        longjmp(*(it_bit_buff->xaac_jmp_buf),
+                IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
+      } else {
+        return err_code;
+      }
+    }
   }
   info = usac_data->pstr_sfb_info[chn];
 
diff --git a/decoder/ixheaacd_stereo.c b/decoder/ixheaacd_stereo.c
index 28a3e31..e091969 100644
--- a/decoder/ixheaacd_stereo.c
+++ b/decoder/ixheaacd_stereo.c
@@ -41,6 +41,9 @@
 #include "ixheaacd_drc_data_struct.h"
 
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_channel.h"
 #include "ixheaacd_drc_dec.h"
@@ -56,6 +59,8 @@
   WORD32 win_grp, grp_len, k;
   WORD32 *l_spec = ptr_aac_dec_channel_info[LEFT]->ptr_spec_coeff;
   WORD32 *r_spec = ptr_aac_dec_channel_info[RIGHT]->ptr_spec_coeff;
+  WORD16 maximum_bins_short =
+      (ptr_aac_dec_channel_info[LEFT]->str_ics_info.frame_length) >> 3;
   WORD8 *ptr_group_len =
       ptr_aac_dec_channel_info[LEFT]->str_ics_info.window_group_length;
   const WORD8 *ptr_sfb_width =
@@ -96,8 +101,14 @@
         }
       }
       ptr_ms_used -= ptr_aac_dec_channel_info[LEFT]->str_ics_info.max_sfb;
-      l_spec = l_spec + 128 - ixheaacd_drc_offset;
-      r_spec = r_spec + 128 - ixheaacd_drc_offset;
+
+      if (maximum_bins_short == 120) {
+        l_spec = l_spec + maximum_bins_short - ixheaacd_drc_offset;
+        r_spec = r_spec + maximum_bins_short - ixheaacd_drc_offset;
+      } else {
+        l_spec = l_spec + 128 - ixheaacd_drc_offset;
+        r_spec = r_spec + 128 - ixheaacd_drc_offset;
+      }
     }
 
     ptr_ms_used += JOINT_STEREO_MAX_BANDS;
@@ -118,7 +129,7 @@
 VOID ixheaacd_intensity_stereo_process(
     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info[2],
     ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 object_type,
-    WORD32 aac_sf_data_resil_flag) {
+    WORD32 aac_sf_data_resil_flag, WORD16 framelength) {
   UWORD8 *ptr_ms_used =
       &ptr_aac_dec_channel_info[LEFT]->pstr_stereo_info->ms_used[0][0];
   WORD8 *ptr_code_book = &ptr_aac_dec_channel_info[RIGHT]->ptr_code_book[0];
@@ -126,6 +137,8 @@
       &ptr_aac_dec_channel_info[RIGHT]->ptr_scale_factor[0];
   WORD32 *r_spec = &ptr_aac_dec_channel_info[RIGHT]->ptr_spec_coeff[0];
   WORD32 *l_spec = &ptr_aac_dec_channel_info[LEFT]->ptr_spec_coeff[0];
+  WORD16 maximum_bins_short =
+      (ptr_aac_dec_channel_info[LEFT]->str_ics_info.frame_length) >> 3;
   WORD8 *ptr_group_len =
       ptr_aac_dec_channel_info[RIGHT]->str_ics_info.window_group_length;
   const WORD8 *ptr_sfb_width =
@@ -133,7 +146,14 @@
           ->str_aac_sfb_info[ptr_aac_dec_channel_info[RIGHT]
                                  ->str_ics_info.window_sequence]
           .sfb_width;
-  WORD32 *ptr_scale_table = ptr_aac_tables->pstr_block_tables->scale_table;
+
+  WORD32 *ptr_scale_table;
+
+  if (960 == framelength)
+    ptr_scale_table = ptr_aac_tables->pstr_block_tables->scale_table_960;
+  else
+    ptr_scale_table = ptr_aac_tables->pstr_block_tables->scale_table;
+
   WORD32 win_grp, grp_len, k;
 
   for (win_grp = 0;
@@ -194,8 +214,14 @@
           r_spec += ptr_sfb_width[sfb];
         }
       }
-      l_spec += 128 - ixheaacd_drc_offset;
-      r_spec += 128 - ixheaacd_drc_offset;
+
+      if (maximum_bins_short == 120) {
+        l_spec += maximum_bins_short - ixheaacd_drc_offset;
+        r_spec += maximum_bins_short - ixheaacd_drc_offset;
+      } else {
+        l_spec += 128 - ixheaacd_drc_offset;
+        r_spec += 128 - ixheaacd_drc_offset;
+      }
     }
     ptr_ms_used += 64;
     ptr_code_book += 16;
diff --git a/decoder/ixheaacd_stereo.h b/decoder/ixheaacd_stereo.h
index e294798..8a68c60 100644
--- a/decoder/ixheaacd_stereo.h
+++ b/decoder/ixheaacd_stereo.h
@@ -30,6 +30,6 @@
 VOID ixheaacd_intensity_stereo_process(
     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info[2],
     ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 object_type,
-    WORD32 aac_sf_data_resil_flag);
+    WORD32 aac_sf_data_resil_flag, WORD16 framelength);
 
 #endif /* #ifndef IXHEAACD_STEREO_H */
diff --git a/decoder/ixheaacd_struct_def.h b/decoder/ixheaacd_struct_def.h
index d348d99..a098594 100644
--- a/decoder/ixheaacd_struct_def.h
+++ b/decoder/ixheaacd_struct_def.h
@@ -21,30 +21,17 @@
 #define IXHEAACD_STRUCT_DEF_H
 
 #include <setjmp.h>
+#include <stdbool.h>
+#include "ixheaacd_peak_limiter_struct_def.h"
 
-#define MAX_OUTPUT_CHANNELS (8)
-#define MAX_NUM_OTT (1)
-
-#define MAX_ARBITRARY_TREE_LEVELS (2)
-#define MAX_PARAMETER_SETS (8)
-#define MAX_ARBITRARY_TREE_INDEX ((1 << (MAX_ARBITRARY_TREE_LEVELS + 1)) - 1)
-#define MAX_NUM_QMF_BANDS (64)
-#define MAX_NUM_OTT_AT \
-  (MAX_OUTPUT_CHANNELS * ((1 << MAX_ARBITRARY_TREE_LEVELS) - 1))
-#define MAX_PARAMETER_BANDS (28)
 #define MAX_DECOR_CONFIG_IDX (2)
-
-#define MAX_HYBRID_BANDS (MAX_NUM_QMF_BANDS - 3 + 10)
-
 #define MAX_TIME_SLOTS (72)
+#define NUM_MPS_TABLES (13)
 
-#define MAX_M2_OUTPUT (8)
-#define QMF_BANDS_TO_HYBRID (3)
-#define PROTO_LEN (13)
-#define BUFFER_LEN_LF (PROTO_LEN - 1 + MAX_TIME_SLOTS)
-#define BUFFER_LEN_HF ((PROTO_LEN - 1) / 2)
-#define MAX_TIME_SLOTS (72)
-#define MAX_NO_TIME_SLOTS_DELAY (14)
+#define MAX_PREROLL_FRAME_OFFSET 4
+// max of escapedValue(4, 4, 8) i.e. 2^4 -1 + 2^4 -1 + 2^8 -1;
+#define MAX_PREROLL_SIZE 285
+#define IA_ENHAACPLUS_DEC_MPS_PAYLOAD_SIZE (1024)
 
 typedef struct {
   WORD8 element_instance_tag;
@@ -106,7 +93,6 @@
   UWORD32 ui_pce_found_in_hdr;
   UWORD32 ui_n_memtabs;
 
-  WORD32 ui_drc_enable;
   WORD32 ui_drc_boost;
   WORD32 ui_drc_cut;
   WORD32 ui_drc_target_level;
@@ -137,7 +123,20 @@
   WORD32 ui_flush_cmd;
 
   ia_drc_config drc_config_struct;
+  WORD32 output_level;
+  WORD32 i_loud_ref_level;
+  UWORD8 dup_stereo_flag;
+  WORD32 peak_limiter_off;
 
+  WORD32 mps_present;
+  UWORD32 ui_frame_size;
+  WORD32 ui_enh_sbr;
+  WORD32 ui_hq_esbr;
+  WORD32 ui_enh_sbr_ps;
+  WORD32 ui_usac_flag;
+
+  WORD32 ui_err_conceal;
+  FLAG first_frame;
 } ia_aac_dec_config_struct;
 
 typedef struct ia_aac_dec_state_struct {
@@ -180,7 +179,7 @@
   WORD32 last_frame_ok;
   WORD32 i_bytes_consumed;
 
-  WORD16 *coup_ch_output;
+  WORD32 *coup_ch_output;
   ia_enhaacplus_dec_ind_cc ind_cc_info;
 
   WORD8 protection_absent;
@@ -222,6 +221,9 @@
   VOID *ia_audio_specific_config;
   ia_mps_dec_state_struct mps_dec_handle;
 
+  ia_heaac_mps_state_struct heaac_mps_handle;
+  UWORD8 mps_buffer[IA_ENHAACPLUS_DEC_MPS_PAYLOAD_SIZE];
+
   UWORD16 *huffman_code_book_scl;
   UWORD32 *huffman_code_book_scl_index;
 
@@ -235,8 +237,25 @@
   ia_sbr_header_data_struct str_sbr_config;
   jmp_buf xaac_jmp_buf;
   WORD32 decode_create_done;
+  WORD32 ldmps_present;
   WORD32 fatal_err_present;
   WORD8 *pers_mem_ptr;
+  UWORD8 preroll_config_present;
+  UWORD8 preroll_config_prev[MAX_PREROLL_SIZE];
+
+  UWORD8 qshift_cnt;
+  WORD8 qshift_adj[16];
+  UWORD32 delay_in_samples;
+  UWORD8 peak_lim_init;
+  ia_peak_limiter_struct peak_limiter;
+  UWORD8 sbr_present;
+  UWORD8 slot_pos;
+  WORD32 mps_header;
+  WORD32 ui_mps_out_bytes;
+  WORD32 drc_config_changed;
+  WORD32 apply_crossfade;
+  WORD32 ec_enable;
+  WORD32 first_frame;
 } ia_aac_dec_state_struct;
 
 typedef struct ia_exhaacplus_dec_api_struct {
@@ -256,14 +275,13 @@
 
 WORD32 ixheaacd_aacdec_decodeframe(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
-    ia_aac_dec_scratch_struct *aac_scratch_ptrs, WORD16 *time_data,
-    FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel,
-    WORD *element_index_order, WORD skip_full_decode, WORD ch_fac,
-    WORD slot_element, WORD max_channels, WORD32 total_channels,
-    WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec,
-    WORD32 object_type, WORD32 ch_config,
+    ia_aac_dec_scratch_struct *aac_scratch_ptrs, VOID *time_data, FLAG frame_status, WORD *type,
+    WORD *ch_idx, WORD init_flag, WORD channel, WORD *element_index_order, WORD skip_full_decode,
+    WORD ch_fac, WORD slot_element, WORD max_channels, WORD32 total_channels, WORD32 frame_length,
+    WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec, WORD32 object_type, WORD32 ch_config,
     ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader,
-    ia_drc_dec_struct *drc_dummy);
+    ia_drc_dec_struct *drc_dummy, WORD32 ldmps_present, UWORD8 *slot_pos, UWORD8 *mps_buffer,
+    WORD32 *mps_header, WORD32 *mps_bytes, WORD32 is_init, WORD32 first_frame);
 
 WORD ixheaacd_get_channel_mask(
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec);
@@ -295,4 +313,22 @@
     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 i_cmd,
     WORD32 i_idx, VOID *pv_value);
 
+IA_ERRORCODE ixheaacd_aac_mps_init(ia_exhaacplus_dec_api_struct *p_obj_mps_dec,
+                                   UWORD8 *databuf, WORD32 buffer_size,
+                                   WORD32 sample_rate);
+
+WORD32 ixheaacd_peak_limiter_init(ia_peak_limiter_struct *peak_limiter, UWORD32 num_channels,
+                                  UWORD32 sample_rate, FLOAT32 *buffer,
+                                  UWORD32 *delay_in_samples);
+
+VOID ixheaacd_peak_limiter_process(ia_peak_limiter_struct *peak_limiter, VOID *samples,
+                                   UWORD32 frame_len, WORD8 *qshift_adj);
+
+VOID ixheaacd_scale_adjust(VOID *samples, UWORD32 frame_len, WORD8 *qshift_adj,
+                           WORD num_channels);
+VOID ixheaacd_peak_limiter_process_float(ia_peak_limiter_struct *peak_limiter,
+                                         FLOAT32 samples[MAX_NUM_CHANNELS][4096],
+                                         UWORD32 frame_len);
+
+
 #endif /* IXHEAACD_STRUCT_DEF_H */
diff --git a/decoder/ixheaacd_tcx_fwd_alcnx.c b/decoder/ixheaacd_tcx_fwd_alcnx.c
index 411bf35..e0dd052 100644
--- a/decoder/ixheaacd_tcx_fwd_alcnx.c
+++ b/decoder/ixheaacd_tcx_fwd_alcnx.c
@@ -43,6 +43,8 @@
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
 
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_func_def.h"
@@ -53,7 +55,6 @@
 #include "ixheaacd_basic_ops32.h"
 #include "ixheaacd_basic_ops40.h"
 
-static FLOAT32 ixheaacd_randomsign(UWORD32 *seed);
 #define ABS(A) ((A) < 0 ? (-A) : (A))
 
 VOID ixheaacd_lpc_coeff_wt_apply(FLOAT32 *a, FLOAT32 *ap) {
@@ -135,17 +136,48 @@
   return;
 }
 
+static WORD32 ixheaacd_calc_max_pitch(FLOAT32 x[LEN_SUPERFRAME], WORD32 n) {
+  FLOAT32 max_m;
+  FLOAT32 t_est;
+  WORD32 i, i_max, pitch_tcx;
+
+  max_m = 0;
+  i_max = 1;
+
+  for (i = 1; i < n; i++) {
+    FLOAT32 mag = (x[2 * i] * x[2 * i]) + (x[2 * i + 1] * x[2 * i + 1]);
+    if (mag > max_m) {
+      max_m = mag;
+      i_max = i;
+    }
+  }
+
+  t_est = (n / (FLOAT32)i_max);
+
+  if (t_est >= 256) {
+    pitch_tcx = 256;
+  } else {
+    FLOAT32 tmp_est = t_est;
+    while (tmp_est < 256) {
+      tmp_est += t_est;
+    }
+    pitch_tcx = (WORD32)(tmp_est - t_est);
+  }
+
+  return (pitch_tcx);
+}
+
 WORD32 ixheaacd_tcx_mdct(ia_usac_data_struct *usac_data,
                          ia_td_frame_data_struct *pstr_td_frame_data,
                          WORD32 frame_index, FLOAT32 lp_flt_coff_a[], WORD32 lg,
                          ia_usac_lpd_decoder_handle st) {
   WORD32 i, mode;
   WORD32 *ptr_tcx_quant;
-  FLOAT32 tmp, gain_tcx, noise_level, energy, temp;
+  FLOAT32 tmp, gain_tcx = 0.0f, noise_level, energy, temp;
   FLOAT32 *ptr_a, i_ap[ORDER + 1];
   const FLOAT32 *sine_window_prev, *sine_window;
   WORD32 fac_length_prev;
-  FLOAT32 alfd_gains[LEN_SUPERFRAME / (4 * 8)];
+  FLOAT32 alfd_gains[LEN_SUPERFRAME / (4 * 8)] = {0};
   FLOAT32 x[LEN_SUPERFRAME], buf[ORDER + LEN_SUPERFRAME];
   WORD32 int_x[LEN_SUPERFRAME + (2 * FAC_LENGTH)];
   WORD32 int_xn1[LEN_SUPERFRAME + (2 * FAC_LENGTH)];
@@ -154,7 +186,7 @@
   FLOAT32 *xn;
   FLOAT32 xn1[2 * FAC_LENGTH], facwindow[2 * FAC_LENGTH];
   WORD32 TTT;
-  WORD8 shiftp;
+  WORD8 shiftp = 0;
   WORD32 preshift = 0;
   WORD32 loop_count = 0;
   FLOAT32 *exc = &usac_data->exc_buf[usac_data->len_subfrm * frame_index +
@@ -208,10 +240,8 @@
       st->exc_prev[i + fac_length + fac_length_prev + 1] = 0.0f;
     }
   }
-
-  noise_level =
-      0.0625f *
-      (8.0f - ((FLOAT32)pstr_td_frame_data->noise_factor[frame_index]));
+  if (usac_data->frame_ok == 1) {
+    noise_level = 0.0625f * (8.0f - ((FLOAT32)pstr_td_frame_data->noise_factor[frame_index]));
 
   ptr_tcx_quant = pstr_td_frame_data->x_tcx_invquant;
   for (i = 0; i < frame_index; i++)
@@ -219,6 +249,10 @@
 
   for (i = 0; i < lg; i++) x[i] = (FLOAT32)ptr_tcx_quant[i];
 
+    if (usac_data->ec_flag) {
+      st->last_tcx_pitch = ixheaacd_calc_max_pitch(x, (lg >> 5));
+    }
+
   for (i = lg / 6; i < lg; i += 8) {
     WORD32 k, max_k = min(lg, i + 8);
     FLOAT32 tmp = 0.0f;
@@ -235,12 +269,10 @@
   ixheaacd_low_fq_deemphasis(x, lg, alfd_gains);
 
   ixheaacd_lpc_coeff_wt_apply(lp_flt_coff_a + (ORDER + 1), i_ap);
-  err = ixheaacd_lpc_to_td(i_ap, ORDER, gain1, usac_data->len_subfrm / 4);
-  if (err) return err;
+  ixheaacd_lpc_to_td(i_ap, ORDER, gain1, usac_data->len_subfrm / 4);
 
   ixheaacd_lpc_coeff_wt_apply(lp_flt_coff_a + (2 * (ORDER + 1)), i_ap);
-  err = ixheaacd_lpc_to_td(i_ap, ORDER, gain2, usac_data->len_subfrm / 4);
-  if (err) return err;
+  ixheaacd_lpc_to_td(i_ap, ORDER, gain2, usac_data->len_subfrm / 4);
 
   energy = 0.01f;
   for (i = 0; i < lg; i++) energy += x[i] * x[i];
@@ -252,14 +284,38 @@
           10.0f,
           ((FLOAT32)pstr_td_frame_data->global_gain[frame_index]) / 28.0f) /
       (temp * 2.0f);
-
+  }
+  if (usac_data->ec_flag) {
+    if (usac_data->frame_ok == 1) {
+      usac_data->past_gain_tcx[usac_data->present_chan] = gain_tcx;
+    } else {
+      gain_tcx = usac_data->past_gain_tcx[usac_data->present_chan];
+    }
+  }
+  if (usac_data->frame_ok == 1) {
   ixheaacd_noise_shaping(x, lg, (usac_data->len_subfrm) / 4, gain1, gain2);
-
   shiftp = ixheaacd_float2fix(x, int_x, lg);
+  }
+  if (usac_data->ec_flag == 1) {
+    if (st->mode_prev != 0) {
+      if (usac_data->frame_ok == 1) {
+        memcpy(usac_data->tcx_spec_coeffs[usac_data->present_chan], int_x, lg * sizeof(int_x[0]));
+        usac_data->last_shiftp = shiftp;
+      } else {
+        memcpy(int_x, usac_data->tcx_spec_coeffs[usac_data->present_chan], lg * sizeof(int_x[0]));
+        shiftp = usac_data->last_shiftp;
+      }
+    }
+  } else {
+    if (lg & (lg - 1)) {
+      if ((lg != 48) && (lg != 96) && (lg != 192) && (lg != 384) && (lg != 768)) {
+        return -1;
+      }
+    }
+  }
 
-  err = ixheaacd_acelp_mdct_main(usac_data, int_x, int_xn1, (2 * fac_length),
-                                 lg - (2 * fac_length), &preshift);
-  if (err == -1) return err;
+  ixheaacd_acelp_mdct_main(usac_data, int_x, int_xn1, (2 * fac_length), lg - (2 * fac_length),
+                           &preshift);
 
   ixheaacd_fix2float(int_xn1, xn_buf, (lg + (2 * fac_length)), &shiftp,
                      &preshift);
@@ -298,9 +354,16 @@
     preshift = 0;
     shiftp = ixheaacd_float2fix(x, int_x, fac_length);
 
-    err =
-        ixheaacd_acelp_mdct(int_x, int_xn1, &preshift, fac_length, ptr_scratch);
-    if (err == -1) return err;
+    if (usac_data->ec_flag == 0) {
+      if (fac_length & (fac_length - 1)) {
+        if ((fac_length != 48) && (fac_length != 96) && (fac_length != 192) &&
+            (fac_length != 384) && (fac_length != 768)) {
+          return -1;
+        }
+      }
+    }
+
+    ixheaacd_acelp_mdct(int_x, int_xn1, &preshift, fac_length, ptr_scratch);
 
     ixheaacd_fix2float(int_xn1, xn1, fac_length, &shiftp, &preshift);
 
@@ -377,7 +440,7 @@
   return err;
 }
 
-static FLOAT32 ixheaacd_randomsign(UWORD32 *seed) {
+FLOAT32 ixheaacd_randomsign(UWORD32 *seed) {
   FLOAT32 sign = 0.0f;
   *seed = (UWORD32)(((UWORD64)(*seed) * (UWORD64)69069) + 5);
 
diff --git a/decoder/ixheaacd_tcx_fwd_mdct.c b/decoder/ixheaacd_tcx_fwd_mdct.c
index de153bb..9af0895 100644
--- a/decoder/ixheaacd_tcx_fwd_mdct.c
+++ b/decoder/ixheaacd_tcx_fwd_mdct.c
@@ -50,6 +50,8 @@
 #include "ixheaacd_constants.h"
 #include "ixheaacd_basic_ops32.h"
 #include "ixheaacd_basic_ops40.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 
@@ -113,7 +115,7 @@
   return;
 }
 
-WORD32 ixheaacd_lpc_to_td(float *coeff, WORD32 order, float *gains, WORD32 lg) {
+VOID ixheaacd_lpc_to_td(FLOAT32 *coeff, WORD32 order, FLOAT32 *gains, WORD32 lg) {
   FLOAT32 data_r[LEN_SUPERFRAME * 2];
   FLOAT32 data_i[LEN_SUPERFRAME * 2];
   FLOAT64 avg_fac;
@@ -125,7 +127,6 @@
   FLOAT32 ftemp = 0;
   FLOAT32 tmp, qfac;
   WORD32 i, size_n;
-  WORD32 err = 0;
 
   size_n = 2 * lg;
   avg_fac = PI / (FLOAT32)(size_n);
@@ -153,8 +154,7 @@
     idata_i[i] = (WORD32)(data_i[i] * ((WORD64)1 << qshift));
   }
 
-  err = ixheaacd_complex_fft(idata_r, idata_i, size_n, -1, &preshift);
-  if (err) return err;
+  ixheaacd_complex_fft(idata_r, idata_i, size_n, -1, &preshift);
 
   qfac = 1.0f / ((FLOAT32)((WORD64)1 << (qshift - preshift)));
 
@@ -168,7 +168,7 @@
         (FLOAT32)(1.0f / sqrt(data_r[i] * data_r[i] + data_i[i] * data_i[i]));
   }
 
-  return err;
+  return;
 }
 
 VOID ixheaacd_noise_shaping(FLOAT32 r[], WORD32 lg, WORD32 M, FLOAT32 g1[],
diff --git a/decoder/ixheaacd_td_mdct.h b/decoder/ixheaacd_td_mdct.h
index ed8f13c..a99af30 100644
--- a/decoder/ixheaacd_td_mdct.h
+++ b/decoder/ixheaacd_td_mdct.h
@@ -25,7 +25,7 @@
 VOID ixheaacd_fix2float(WORD32 *int_xn1, FLOAT32 *xn1, WORD32 length,
                         WORD8 *shiftp, WORD32 *preshift);
 
-WORD32 ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 len,
-                            WORD32 fft_mode, WORD32 *preshift);
+VOID ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 len, WORD32 fft_mode,
+                          WORD32 *preshift);
 
 #endif
diff --git a/decoder/ixheaacd_thumb_ps_dec.c b/decoder/ixheaacd_thumb_ps_dec.c
index 39b7b72..52d6d73 100644
--- a/decoder/ixheaacd_thumb_ps_dec.c
+++ b/decoder/ixheaacd_thumb_ps_dec.c
@@ -42,6 +42,9 @@
 
 #include "ixheaacd_drc_data_struct.h"
 #include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 #include "ixheaacd_sbrdecoder.h"
@@ -67,10 +70,19 @@
                        WORD32 **p_buf_left_imag, WORD32 *p_buf_right_real,
                        WORD32 *p_buf_right_imag,
                        ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 slot,
-                       ia_sbr_tables_struct *sbr_tables_ptr) {
-  WORD16 shiftdelay =
-      (WORD16)((slot < (32 - MAX_OV_COLS)) ? 0 : (sbr_scale_factor->lb_scale -
-                                                  sbr_scale_factor->ps_scale));
+                       ia_sbr_tables_struct *sbr_tables_ptr, WORD no_col) {
+
+  WORD16 shiftdelay;
+
+  if (no_col != 30) {
+    shiftdelay =
+        (WORD16)((slot < (32 - MAX_OV_COLS)) ? 0 : (sbr_scale_factor->lb_scale -
+            sbr_scale_factor->ps_scale));
+  } else {
+  shiftdelay =
+      (WORD16)((slot < (no_col - MAX_OV_COLS)) ? 0 : (sbr_scale_factor->lb_scale -
+          sbr_scale_factor->ps_scale));
+  }
 
   ixheaacd_hybrid_analysis(p_buf_left_real[HYBRID_FILTER_DELAY],
                            ptr_ps_dec->ptr_hyb_left_re,
diff --git a/decoder/ixheaacd_tns.c b/decoder/ixheaacd_tns.c
index a16736c..c4a2dea 100644
--- a/decoder/ixheaacd_tns.c
+++ b/decoder/ixheaacd_tns.c
@@ -39,6 +39,8 @@
 #include "ixheaacd_mps_polyphase.h"
 #include "ixheaacd_sbr_const.h"
 
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
 #include "ixheaacd_main.h"
 #include "ixheaacd_arith_dec.h"
 #include "ixheaacd_function_selector.h"
diff --git a/decoder/ixheaacd_usac_ec.c b/decoder/ixheaacd_usac_ec.c
new file mode 100644
index 0000000..2e2006b
--- /dev/null
+++ b/decoder/ixheaacd_usac_ec.c
@@ -0,0 +1,642 @@
+/******************************************************************************
+ *                                                                            *
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+#include <string.h>
+#include <ixheaacd_type_def.h>
+#include <ixheaacd_constants.h>
+#include <ixheaacd_basic_ops32.h>
+#include <ixheaacd_basic_ops16.h>
+#include <ixheaacd_basic_ops40.h>
+#include "ixheaacd_sbr_common.h"
+#include "ixheaacd_intrinsics.h"
+#include "ixheaacd_common_rom.h"
+#include "ixheaacd_sbrdecsettings.h"
+#include "ixheaacd_bitbuffer.h"
+#include "ixheaacd_defines.h"
+#include "ixheaacd_pns.h"
+#include <ixheaacd_aac_rom.h>
+#include "ixheaacd_pulsedata.h"
+#include "ixheaacd_lt_predict.h"
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_drc_data_struct.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_rom.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_channelinfo.h"
+#include "ixheaacd_interface.h"
+#include "ixheaacd_acelp_info.h"
+#include "ixheaacd_tns_usac.h"
+#include "ixheaacd_info.h"
+#include "ixheaacd_drc_dec.h"
+#include "ixheaacd_sbrdecoder.h"
+#include "ixheaacd_mps_polyphase.h"
+#include "ixheaacd_sbr_const.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+#include "ixheaacd_main.h"
+#include "ixheaacd_acelp_com.h"
+
+static WORD32 ixheaacd_usac_ec_get_win_seq(WORD32 prev_win_seq) {
+  if (prev_win_seq == LONG_START_SEQUENCE || prev_win_seq == EIGHT_SHORT_SEQUENCE) {
+    return LONG_STOP_SEQUENCE;
+  } else {
+    return ONLY_LONG_SEQUENCE;
+  }
+}
+
+static VOID ixheaacd_usac_flip_spec_sign(WORD32 *ptr_spec_coeff, WORD32 samples_per_frame,
+                                         UWORD32 *seed_value) {
+  WORD32 i;
+  for (i = 0; i < samples_per_frame; i++) {
+    ptr_spec_coeff[i] = ixheaacd_mult32x16in32_sat(ptr_spec_coeff[i],
+                            (WORD16)ixheaacd_randomsign(seed_value));
+  }
+}
+
+static VOID iexheaace_ec_sfb_nrg_q(WORD32 *ptr_spectrum, ia_ec_sfb_str *pstr_ec_sfb,
+                                   WORD32 win_seq, WORD32 win_trans, WORD32 *ptr_sfb_enrg) {
+  WORD16 *ptr_sfb_offset = pstr_ec_sfb->ptr_sfb_long;
+  WORD32 l = 0, sfb, num_sfb = pstr_ec_sfb->num_sfb_long;
+  switch (win_seq) {
+    case EIGHT_SHORT_SEQUENCE:
+      if (win_trans == NO_TRANSITION) {
+        num_sfb = pstr_ec_sfb->num_sfb_short;
+        ptr_sfb_offset = pstr_ec_sfb->ptr_sfb_short;
+        for (sfb = 0; sfb < num_sfb; sfb++) {
+          WORD64 accu = (WORD64)1;
+          WORD32 q_nrg = (sizeof(accu) << 3) -
+                         ixheaacd_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
+          for (; l < ptr_sfb_offset[sfb + 1]; l++) {
+            accu += ixheaacd_mul32_sh(ptr_spectrum[l], ptr_spectrum[l], q_nrg);
+          }
+          ptr_sfb_enrg[sfb] = ixheaacd_norm32((WORD32)accu);
+        }
+      } else {
+        num_sfb = pstr_ec_sfb->num_sfb_long;
+        ptr_sfb_offset = pstr_ec_sfb->ptr_sfb_long;
+
+        for (sfb = 0; sfb < num_sfb; sfb++) {
+          WORD64 accu = (WORD64)1;
+          WORD32 q_nrg = (sizeof(accu) << 3) -
+                         ixheaacd_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
+          for (; l < ptr_sfb_offset[sfb + 1]; l++) {
+            accu += ixheaacd_mul32_sh(ptr_spectrum[(l >> 3)], ptr_spectrum[(l >> 3)], q_nrg);
+          }
+          ptr_sfb_enrg[sfb] = ixheaacd_norm32((WORD32)accu);
+        }
+      }
+      break;
+    case ONLY_LONG_SEQUENCE:
+    case LONG_START_SEQUENCE:
+    case LONG_STOP_SEQUENCE:
+      if (win_trans == NO_TRANSITION) {
+        num_sfb = pstr_ec_sfb->num_sfb_long;
+        ptr_sfb_offset = pstr_ec_sfb->ptr_sfb_long;
+
+        for (sfb = 0; sfb < num_sfb; sfb++) {
+          WORD64 accu = (WORD64)1;
+          WORD32 q_nrg = (sizeof(accu) << 3) -
+                         ixheaacd_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
+          for (; l < ptr_sfb_offset[sfb + 1]; l++) {
+            accu += ixheaacd_mul32_sh(ptr_spectrum[l], ptr_spectrum[l], q_nrg);
+          }
+          ptr_sfb_enrg[sfb] = ixheaacd_norm32((WORD32)accu);
+        }
+      } else {
+        num_sfb = pstr_ec_sfb->num_sfb_short;
+        ptr_sfb_offset = pstr_ec_sfb->ptr_sfb_short;
+
+        for (sfb = 0; sfb < num_sfb; sfb++) {
+          WORD64 accu = (WORD64)1;
+          WORD32 q_nrg = (sizeof(accu) << 3) -
+                         ixheaacd_norm32(ptr_sfb_offset[sfb + 1] - ptr_sfb_offset[sfb]);
+          for (; l < ptr_sfb_offset[sfb + 1] << 3; l++) {
+            accu += (accu + (ixheaacd_mul32_sh(ptr_spectrum[l], ptr_spectrum[l], q_nrg))) >> 3;
+          }
+          ptr_sfb_enrg[sfb] = ixheaacd_norm32((WORD32)accu);
+        }
+      }
+      break;
+  }
+}
+
+static VOID ixheaacd_usac_ec_interpolate(WORD32 *ptr_spectrum, WORD16 *pq_spec_coeff_prev,
+                                         WORD16 *pq_spec_coeff_act, WORD16 *pq_spec_coeff_out,
+                                         WORD32 *ptr_nrg_prev, WORD32 *ptr_nrg_act,
+                                         WORD32 num_sfb, WORD16 *ptr_sfb_offset) {
+  WORD32 sfb, l = 0;
+  WORD32 fac_shift;
+  WORD32 fac_mod;
+
+  for (sfb = 0; sfb < num_sfb; sfb++) {
+    fac_shift =
+        ptr_nrg_prev[sfb] - ptr_nrg_act[sfb] + ((*pq_spec_coeff_act - *pq_spec_coeff_prev) << 1);
+    fac_mod = fac_shift & 3;
+    fac_shift = (fac_shift >> 2) + 1;
+    fac_shift += *pq_spec_coeff_prev - ixheaacd_max16(*pq_spec_coeff_prev, *pq_spec_coeff_act);
+    fac_shift = ixheaacd_max32(ixheaacd_min32(fac_shift, INT_BITS - 1), -(INT_BITS - 1));
+
+    for (; l < ptr_sfb_offset[sfb + 1]; l++) {
+      WORD32 accu = ixheaacd_shl32_sat(
+          ixheaacd_mult32x32in32(ptr_spectrum[l], (WORD32)(ia_ec_interpolation_fac[fac_mod])), 1);
+      ptr_spectrum[l] = ixheaacd_shl32_dir_sat((WORD32)accu, fac_shift);
+    }
+  }
+  *pq_spec_coeff_out = ixheaacd_max16(*pq_spec_coeff_prev, *pq_spec_coeff_act);
+}
+
+static VOID ixheaacd_usac_ec_interpolate_frame(ia_usac_data_struct *pstr_usac_data,
+                                               ia_ec_state_str *pstr_ec_state,
+                                               const ia_usac_samp_rate_info *pstr_samp_rate_info,
+                                               WORD32 frame_ok, WORD32 chn) {
+  WORD32 frame_length = pstr_usac_data->ccfl;
+  WORD32 *ptr_spec_coeff = pstr_usac_data->coef_fix[chn];
+  WORD16 *ptr_spec_sf = pstr_usac_data->spec_scale[chn];
+
+  WORD32 i;
+  ia_ec_scratch_str *pstr_ec_scratch = pstr_ec_state->pstr_ec_scratch;
+  WORD16 num_sfb_long;
+  WORD16 *ptr_sfb_long = NULL;
+  WORD16 num_sfb_short;
+  WORD16 *ptr_sfb_short = NULL;
+
+  if (pstr_usac_data->core_mode == CORE_MODE_FD) {
+    num_sfb_long = pstr_samp_rate_info->num_sfb_1024;
+    ptr_sfb_long = (WORD16 *)pstr_samp_rate_info->ptr_sfb_1024;
+    num_sfb_short = pstr_samp_rate_info->num_sfb_128;
+    ptr_sfb_short = (WORD16 *)pstr_samp_rate_info->ptr_sfb_128;
+    if (pstr_usac_data->ccfl == WIN_LEN_768) {
+      num_sfb_long = pstr_samp_rate_info->num_sfb_768;
+      ptr_sfb_long = (WORD16 *)pstr_samp_rate_info->ptr_sfb_768;
+      num_sfb_short = pstr_samp_rate_info->num_sfb_96;
+      ptr_sfb_short = (WORD16 *)pstr_samp_rate_info->ptr_sfb_96;
+    }
+    pstr_ec_state->str_ec_sfb.num_sfb_long = num_sfb_long;
+    pstr_ec_state->str_ec_sfb.num_sfb_long = num_sfb_long;
+    pstr_ec_state->str_ec_sfb.ptr_sfb_long = ptr_sfb_long;
+    pstr_ec_state->str_ec_sfb.ptr_sfb_long = ptr_sfb_long;
+
+    memset(pstr_ec_scratch->prev_sfb_nrg, 0, sizeof(pstr_ec_scratch->prev_sfb_nrg));
+    memset(pstr_ec_scratch->pres_sfb_nrg, 0, sizeof(pstr_ec_scratch->pres_sfb_nrg));
+
+    if (!frame_ok) {
+      pstr_usac_data->window_shape[chn] = pstr_ec_state->win_shape;
+      pstr_usac_data->window_sequence[chn] = pstr_ec_state->win_seq;
+      memcpy(ptr_spec_coeff, pstr_ec_state->spectral_coeff,
+             sizeof(*ptr_spec_coeff) * frame_length);
+      memcpy(ptr_spec_sf, pstr_ec_state->q_spec_coeff, sizeof(pstr_ec_state->q_spec_coeff));
+    }
+  }
+
+  if (!pstr_ec_state->prev_frame_ok[1]) {
+    if (frame_ok && pstr_ec_state->prev_frame_ok[0] &&
+        pstr_usac_data->core_mode == CORE_MODE_FD) {
+      if (pstr_usac_data->window_sequence[chn] == EIGHT_SHORT_SEQUENCE) {
+        WORD32 wnd;
+
+        if (pstr_ec_state->win_seq == EIGHT_SHORT_SEQUENCE) {
+          WORD32 num_sfb = num_sfb_short;
+          WORD16 *ptr_sfb_offset = ptr_sfb_short;
+          pstr_usac_data->window_shape[chn] = 1;
+          pstr_usac_data->window_sequence[chn] = EIGHT_SHORT_SEQUENCE;
+
+          for (wnd = 0; wnd < 8; wnd++) {
+            iexheaace_ec_sfb_nrg_q(&ptr_spec_coeff[wnd * (frame_length >> 3)],
+                                   &pstr_ec_state->str_ec_sfb, EIGHT_SHORT_SEQUENCE,
+                                   NO_TRANSITION, pstr_ec_scratch->prev_sfb_nrg);
+
+            iexheaace_ec_sfb_nrg_q(&pstr_ec_state->spectral_coeff[wnd * (frame_length >> 3)],
+                                   &pstr_ec_state->str_ec_sfb, EIGHT_SHORT_SEQUENCE,
+                                   NO_TRANSITION, pstr_ec_scratch->pres_sfb_nrg);
+
+            ixheaacd_usac_ec_interpolate(&ptr_spec_coeff[wnd * (frame_length / 8)],
+                                         &ptr_spec_sf[wnd], &pstr_ec_state->q_spec_coeff[wnd],
+                                         &ptr_spec_sf[wnd], pstr_ec_scratch->prev_sfb_nrg,
+                                         pstr_ec_scratch->pres_sfb_nrg, num_sfb, ptr_sfb_offset);
+          }
+        } else {
+          WORD32 num_sfb = num_sfb_long;
+          WORD16 *ptr_sfb_offset = ptr_sfb_long;
+          WORD16 q_spec_coeff_out;
+
+          iexheaace_ec_sfb_nrg_q(&ptr_spec_coeff[frame_length - (frame_length >> 3)],
+                                 &pstr_ec_state->str_ec_sfb, EIGHT_SHORT_SEQUENCE,
+                                 TRANS_SHORT_LONG, pstr_ec_scratch->pres_sfb_nrg);
+
+          iexheaace_ec_sfb_nrg_q(pstr_ec_state->spectral_coeff, &pstr_ec_state->str_ec_sfb,
+                                 ONLY_LONG_SEQUENCE, NO_TRANSITION,
+                                 pstr_ec_scratch->prev_sfb_nrg);
+
+          pstr_usac_data->window_shape[chn] = 0;
+          pstr_usac_data->window_sequence[chn] = LONG_STOP_SEQUENCE;
+          memcpy(&ptr_spec_coeff[0], pstr_ec_state->spectral_coeff,
+                 frame_length * sizeof(ptr_spec_coeff[0]));
+
+          for (i = 0; i < 8; i++) {
+            if (ptr_spec_sf[i] > ptr_spec_sf[0]) {
+              ptr_spec_sf[0] = ptr_spec_sf[i];
+            }
+          }
+
+          ixheaacd_usac_ec_interpolate(ptr_spec_coeff, &pstr_ec_state->q_spec_coeff[0],
+                                       &ptr_spec_sf[0], &q_spec_coeff_out,
+                                       pstr_ec_scratch->prev_sfb_nrg,
+                                       pstr_ec_scratch->pres_sfb_nrg, num_sfb, ptr_sfb_offset);
+
+          ptr_spec_sf[0] = q_spec_coeff_out;
+        }
+      } else {
+        WORD32 num_sfb = num_sfb_long;
+        WORD16 *ptr_sfb_offset = ptr_sfb_long;
+        WORD16 q_spec_coeff_act = pstr_ec_state->q_spec_coeff[0];
+
+        iexheaace_ec_sfb_nrg_q(ptr_spec_coeff, &pstr_ec_state->str_ec_sfb, ONLY_LONG_SEQUENCE,
+                               NO_TRANSITION, pstr_ec_scratch->prev_sfb_nrg);
+
+        if (pstr_ec_state->win_seq == EIGHT_SHORT_SEQUENCE) {
+          pstr_usac_data->window_shape[chn] = 1;
+          pstr_usac_data->window_sequence[chn] = LONG_START_SEQUENCE;
+
+          for (i = 1; i < 8; i++) {
+            if (pstr_ec_state->q_spec_coeff[i] > q_spec_coeff_act) {
+              q_spec_coeff_act = pstr_ec_state->q_spec_coeff[i];
+            }
+          }
+
+          iexheaace_ec_sfb_nrg_q(pstr_ec_state->spectral_coeff, &pstr_ec_state->str_ec_sfb,
+                                 EIGHT_SHORT_SEQUENCE, TRANS_SHORT_LONG,
+                                 pstr_ec_scratch->pres_sfb_nrg);
+        } else {
+          pstr_usac_data->window_shape[chn] = 0;
+          pstr_usac_data->window_sequence[chn] = ONLY_LONG_SEQUENCE;
+          iexheaace_ec_sfb_nrg_q(pstr_ec_state->spectral_coeff, &pstr_ec_state->str_ec_sfb,
+                                 ONLY_LONG_SEQUENCE, NO_TRANSITION,
+                                 pstr_ec_scratch->pres_sfb_nrg);
+        }
+        ixheaacd_usac_ec_interpolate(ptr_spec_coeff, &ptr_spec_sf[0], &q_spec_coeff_act,
+                                     &ptr_spec_sf[0], pstr_ec_scratch->prev_sfb_nrg,
+                                     pstr_ec_scratch->pres_sfb_nrg, num_sfb, ptr_sfb_offset);
+      }
+    }
+    ixheaacd_usac_flip_spec_sign(ptr_spec_coeff, frame_length, &pstr_usac_data->seed_value[chn]);
+  }
+
+  if (FRAME_MUTE == pstr_ec_state->conceal_state) {
+    pstr_usac_data->window_shape[chn] = pstr_ec_state->win_shape;
+    pstr_usac_data->window_sequence[chn] = ixheaacd_usac_ec_get_win_seq(pstr_ec_state->win_seq);
+    pstr_ec_state->win_seq = pstr_usac_data->window_sequence[chn];
+    memset(ptr_spec_coeff, 0, frame_length * sizeof(ptr_spec_coeff[0]));
+  }
+
+  return;
+}
+
+static VOID ixheaacd_usac_lpc_ec_state(ia_ec_state_str *pstr_ec_state, WORD32 frame_ok) {
+  if (frame_ok == 0) {
+    if (pstr_ec_state->fade_idx < MAX_FADE_FRAMES) {
+      pstr_ec_state->fade_idx++;
+    }
+    pstr_ec_state->conceal_state = FRAME_CONCEAL_SINGLE;
+  } else {
+    if (pstr_ec_state->fade_idx > 0) {
+      pstr_ec_state->fade_idx--;
+    }
+    pstr_ec_state->conceal_state = FRAME_OKAY;
+  }
+  if (pstr_ec_state->fade_idx >= MAX_FADE_FRAMES) {
+    pstr_ec_state->fade_idx = MAX_FADE_FRAMES;
+    pstr_ec_state->conceal_state = FRAME_MUTE;
+  }
+  if (pstr_ec_state->fade_idx < 0) {
+    pstr_ec_state->fade_idx = 0;
+  }
+  return;
+}
+
+static VOID ixheaacd_usac_ec_state(ia_ec_state_str *pstr_ec_state, WORD32 frame_ok) {
+  WORD32 ec_state_val = (pstr_ec_state->prev_frame_ok[0] << 2) +
+                        (pstr_ec_state->prev_frame_ok[1] << 1) + (frame_ok);
+
+  switch (ec_state_val) {
+    case 0:
+    case 4:
+      if (pstr_ec_state->fade_idx < MAX_FADE_FRAMES) {
+        pstr_ec_state->fade_idx++;
+      }
+      pstr_ec_state->conceal_state = FRAME_CONCEAL_SINGLE;
+      break;
+    case 1:
+    case 2:
+      if (pstr_ec_state->fade_idx > 0) {
+        pstr_ec_state->fade_idx--;
+      }
+      pstr_ec_state->conceal_state = FRAME_FADE;
+      break;
+    case 5:
+      if (pstr_ec_state->fade_idx > 0) {
+        pstr_ec_state->fade_idx--;
+      }
+      pstr_ec_state->conceal_state = FRAME_OKAY;
+      break;
+      break;
+    case 3:
+    case 6:
+    case 7:
+      if (pstr_ec_state->fade_idx > 0) {
+        pstr_ec_state->fade_idx--;
+      }
+      pstr_ec_state->conceal_state = FRAME_OKAY;
+      break;
+    default:
+      pstr_ec_state->conceal_state = FRAME_OKAY;
+  }
+  if (pstr_ec_state->fade_idx > MAX_FADE_FRAMES) {
+    pstr_ec_state->fade_idx = MAX_FADE_FRAMES;
+  }
+  if (pstr_ec_state->fade_idx == MAX_FADE_FRAMES) {
+    pstr_ec_state->conceal_state = FRAME_MUTE;
+  }
+  if (pstr_ec_state->fade_idx < 0) {
+    pstr_ec_state->fade_idx = 0;
+  }
+}
+
+VOID ixheaacd_usac_ec_init(ia_ec_state_str *pstr_ec_state, WORD32 core_coder_mode) {
+  pstr_ec_state->win_shape = 1;
+  pstr_ec_state->win_seq = ONLY_LONG_SEQUENCE;
+  pstr_ec_state->prev_win_group_len = 1;
+
+  pstr_ec_state->conceal_state = FRAME_OKAY;
+
+  memset(pstr_ec_state->spectral_coeff, 0, sizeof(pstr_ec_state->spectral_coeff));
+  memset(pstr_ec_state->q_spec_coeff, 0, sizeof(pstr_ec_state->q_spec_coeff));
+
+  pstr_ec_state->prev_frame_ok[0] = 1;
+  pstr_ec_state->prev_frame_ok[1] = 1;
+
+  pstr_ec_state->fade_idx = 0;
+
+  pstr_ec_state->prev_core_mode = core_coder_mode;
+}
+
+VOID ixheaacd_usac_lpc_ec(FLOAT32 lsp[][ORDER], FLOAT32 *lpc4_lsf, FLOAT32 *lsf_adaptive_mean,
+                          const WORD32 first_lpd_flag) {
+  WORD32 i, j;
+
+  if (first_lpd_flag) {
+    memcpy(lsp[0], lsf_init, sizeof(lsf_init));
+    memcpy(lpc4_lsf, lsf_init, sizeof(lsf_init));
+  } else {
+    memcpy(lsp[0], lpc4_lsf, ORDER * sizeof(lpc4_lsf[0]));
+  }
+
+  for (i = 0; i < ORDER; i++) {
+    FLOAT32 lsf_mean = (BETA * lsf_init[i]) + (ONE_BETA * lsf_adaptive_mean[i]);
+    lsp[1][i] = (BFI_FAC * lpc4_lsf[i]) + (ONE_BFI_FAC * lsf_mean);
+  }
+
+  for (j = 2; j <= 4; j++) {
+    for (i = 0; i < ORDER; i++) {
+      FLOAT32 lsf_mean = ((BETA + (j * ONE_BFI_FAC)) * lsf_init[i]) +
+                         ((ONE_BETA - (j * ONE_BFI_FAC)) * lsf_adaptive_mean[i]);
+      lsp[j][i] = (BFI_FAC * lsp[j - 1][i]) + (ONE_BFI_FAC * lsf_mean);
+    }
+  }
+
+  memcpy(lpc4_lsf, lsp[4], ORDER * sizeof(lpc4_lsf[0]));
+}
+
+VOID ixheaacd_usac_ec_save_states(ia_ec_state_str *pstr_ec_state,
+                                  ia_usac_data_struct *pstr_usac_data, WORD32 ch) {
+  if (pstr_usac_data->core_mode == CORE_MODE_FD &&
+      (pstr_usac_data->frame_ok == 1 && pstr_ec_state->prev_frame_ok[1] == 1)) {
+    WORD32 *ptr_spec_coeff = pstr_usac_data->coef_fix[ch];
+    WORD16 *ptr_spec_scale = pstr_usac_data->spec_scale[ch];
+    WORD16 q_spec_coeff[MAX_SPEC_SCALE_LEN_EC];
+    UWORD8 win_shape = pstr_ec_state->win_shape;
+    UWORD8 win_shape_prev = pstr_ec_state->win_shape_prev;
+    WORD32 win_seq = pstr_ec_state->win_seq;
+    WORD32 td_frame_prev = pstr_ec_state->td_frame_prev;
+    WORD32 fac_data_present = pstr_ec_state->fac_data_present;
+
+    ia_sfb_info_struct *sfb_info =
+        pstr_usac_data->pstr_usac_winmap[pstr_usac_data->window_sequence[ch]];
+    WORD32 *ptr_scratch_buf = &pstr_ec_state->pstr_ec_scratch->spec_coeff[0];
+
+    memcpy(q_spec_coeff, pstr_ec_state->q_spec_coeff, sizeof(q_spec_coeff));
+    pstr_ec_state->win_seq = pstr_usac_data->window_sequence[ch];
+    pstr_ec_state->win_shape = pstr_usac_data->window_shape[ch];
+    pstr_ec_state->td_frame_prev = pstr_usac_data->td_frame_prev[ch];
+    pstr_ec_state->fac_data_present = pstr_usac_data->fac_data_present[ch];
+    pstr_ec_state->win_shape_prev = pstr_usac_data->window_shape_prev[ch];
+    pstr_ec_state->prev_win_group_len = (WORD32)sfb_info->group_len[sfb_info->num_groups - 1];
+
+    memcpy(pstr_ec_state->q_spec_coeff, ptr_spec_scale, sizeof(pstr_ec_state->q_spec_coeff));
+
+    memcpy(ptr_scratch_buf, ptr_spec_coeff, pstr_usac_data->ccfl * sizeof(ptr_scratch_buf[0]));
+    memcpy(ptr_spec_coeff, &pstr_ec_state->spectral_coeff[0],
+           pstr_usac_data->ccfl * sizeof(ptr_spec_coeff[0]));
+    memcpy(&pstr_ec_state->spectral_coeff[0], ptr_scratch_buf,
+           pstr_usac_data->ccfl * sizeof(ptr_spec_coeff[0]));
+
+    if (!pstr_usac_data->first_frame) {
+      pstr_usac_data->window_sequence[ch] = win_seq;
+      pstr_usac_data->window_shape[ch] = win_shape;
+      pstr_usac_data->td_frame_prev_ec[ch] = td_frame_prev;
+      pstr_usac_data->fac_data_present[ch] = fac_data_present;
+      pstr_usac_data->window_shape_prev[ch] = win_shape_prev;
+    }
+
+    memcpy(ptr_spec_scale, q_spec_coeff, sizeof(q_spec_coeff));
+  }
+}
+
+VOID ixheaacd_usac_apply_ec(ia_usac_data_struct *pstr_usac_data,
+                            const ia_usac_samp_rate_info *pstr_samp_rate_info, WORD32 ch) {
+  WORD32 frame_ok = pstr_usac_data->frame_ok;
+  ia_ec_state_str *pstr_ec_state = &pstr_usac_data->str_error_concealment[ch];
+
+  if (pstr_usac_data->core_mode == CORE_MODE_FD) {
+    if (pstr_ec_state->win_shape == (UWORD8)-1) {
+      pstr_ec_state->win_shape = pstr_usac_data->window_shape[ch];
+    }
+
+    ixheaacd_usac_ec_state(pstr_ec_state, frame_ok);
+
+    if (pstr_ec_state->conceal_state == FRAME_OKAY) {
+      pstr_ec_state->prev_core_mode = pstr_usac_data->core_mode;
+      ixheaacd_usac_ec_save_states(pstr_ec_state, pstr_usac_data, ch);
+    } else if (pstr_ec_state->conceal_state == FRAME_CONCEAL_SINGLE) {
+      ixheaacd_usac_ec_interpolate_frame(pstr_usac_data, pstr_ec_state, pstr_samp_rate_info,
+                                         frame_ok, ch);
+    } else {
+    }
+    if (!frame_ok) {
+      WORD32 *ptr_spec_coeff = pstr_usac_data->coef_fix[ch];
+      WORD16 *ptr_spec_scale = pstr_usac_data->spec_scale[ch];
+
+      pstr_usac_data->window_sequence[ch] = pstr_ec_state->win_seq;
+      pstr_usac_data->window_shape[ch] = pstr_ec_state->win_shape;
+
+      if (pstr_ec_state->conceal_state != FRAME_MUTE) {
+        memcpy(ptr_spec_scale, pstr_ec_state->q_spec_coeff, sizeof(pstr_ec_state->q_spec_coeff));
+        memcpy(ptr_spec_coeff, pstr_ec_state->spectral_coeff,
+               sizeof(pstr_ec_state->spectral_coeff));
+      } else {
+        memset(ptr_spec_scale, 0, MAX_SPEC_SCALE_LEN * sizeof(ptr_spec_scale[0]));
+        memset(ptr_spec_coeff, 0, pstr_usac_data->ccfl * sizeof(ptr_spec_coeff[0]));
+      }
+    }
+  } else {
+    ixheaacd_usac_lpc_ec_state(pstr_ec_state, frame_ok);
+
+    if (pstr_ec_state->conceal_state == FRAME_OKAY) {
+      memcpy(pstr_ec_state->lsf4, pstr_usac_data->lpc4_lsf, sizeof(pstr_ec_state->lsf4));
+    } else if (pstr_ec_state->conceal_state == FRAME_CONCEAL_SINGLE) {
+      WORD32 frame_length = pstr_usac_data->ccfl;
+      WORD32 *ptr_spec_coeff = pstr_usac_data->tcx_spec_coeffs[ch];
+
+      ixheaacd_usac_flip_spec_sign(ptr_spec_coeff, frame_length,
+                                   &pstr_usac_data->seed_value[ch]);
+    } else {
+      WORD32 *ptr_spec_coeff = pstr_usac_data->tcx_spec_coeffs[ch];
+      memset(ptr_spec_coeff, 0, pstr_usac_data->ccfl * sizeof(ptr_spec_coeff[0]));
+    }
+    if (!frame_ok) {
+      memcpy(pstr_usac_data->lpc4_lsf, pstr_ec_state->lsf4, sizeof(pstr_usac_data->lpc4_lsf));
+    }
+  }
+
+  pstr_ec_state->prev_frame_ok[0] = pstr_ec_state->prev_frame_ok[1];
+  pstr_ec_state->prev_frame_ok[1] = frame_ok;
+
+  return;
+}
+
+static VOID ixheaacd_lpc_wt_tool(FLOAT32 a[], WORD32 l) {
+  WORD32 i;
+
+  for (i = 0; i < l; i++) {
+    a[i] = a[i] * ixheaacd_gamma_table[i];
+  }
+
+  return;
+}
+static VOID ixheaacd_lpc_coef_gen_ec(FLOAT32 lsf_old[], FLOAT32 lsf_new[], FLOAT32 a[],
+                                     WORD32 m) {
+  FLOAT32 lsf[ORDER], *ptr_a;
+  FLOAT32 inc, fnew, fold;
+  WORD32 i;
+
+  ptr_a = a;
+
+  inc = 1.0f / (FLOAT32)m;
+  fnew = 0.5f - (0.5f * inc);
+  fold = 1.0f - fnew;
+
+  for (i = 0; i < ORDER; i++) {
+    lsf[i] = (lsf_old[i] * fold) + (lsf_new[i] * fnew);
+  }
+  ixheaacd_lsp_to_lp_conversion(lsf, ptr_a);
+
+  return;
+}
+
+VOID ixheaacd_usac_tcx_ec(ia_usac_data_struct *pstr_usac_data, ia_usac_lpd_decoder_handle st,
+                          FLOAT32 *ptr_lsp_curr, WORD32 frame_idx, FLOAT32 *lp_flt_coff_a) {
+  WORD32 ch = pstr_usac_data->present_chan;
+  FLOAT32 synth_buf[ORDER + LEN_FRAME], temp;
+  FLOAT32 exc_buf[MAX_PITCH + ORDER + 1 + LEN_FRAME];
+  FLOAT32 *ptr_syn = synth_buf + ORDER;
+  FLOAT32 *ptr_exc = exc_buf + MAX_PITCH + ORDER + 1;
+  FLOAT32 est_fac_est = 0.1f;
+  WORD32 i, sf_idx;
+  FLOAT32 synth_sig_buf[LEN_SUBFR + 1];
+  FLOAT32 *synth_signal = synth_sig_buf + 1;
+  WORD32 num_lost_frames = pstr_usac_data->num_lost_lpd_frames[ch];
+  WORD32 len_subfrm = pstr_usac_data->len_subfrm;
+  FLOAT32 past_tcx_gain = pstr_usac_data->past_gain_tcx[ch];
+  WORD32 l_div_part = MAX_PITCH + ORDER + 1 - len_subfrm;
+  FLOAT32 *synth = pstr_usac_data->synth_buf + MAX_PITCH - LEN_SUBFR;
+  FLOAT32 *ptr_synth = &synth[512 + frame_idx * len_subfrm];
+  FLOAT32 syn_buf[MAX_PITCH + ORDER + 1];
+  FLOAT32 *ptr_syn_buf = &syn_buf[ORDER];
+
+  memcpy(syn_buf, &ptr_synth[-(MAX_PITCH + ORDER + 1)],
+         sizeof(syn_buf));
+  memcpy(st->synth_prev_ec, &syn_buf[MAX_PITCH + 1], sizeof(st->synth_prev_ec));
+  ixheaacd_residual_tool_float(pstr_usac_data->lp_flt_coff_a_ec, ptr_syn_buf, st->xcitation_prev,
+                               pstr_usac_data->len_subfrm, 1);
+  ixheaacd_residual_tool_float(lp_flt_coff_a, &syn_buf[l_div_part],
+                               st->xcitation_prev + l_div_part, pstr_usac_data->len_subfrm, 1);
+  if (st->last_tcx_pitch > MAX_PITCH) {
+    st->last_tcx_pitch = MAX_PITCH;
+  }
+
+  memcpy(synth_buf, st->synth_prev_ec, ORDER * sizeof(FLOAT32));
+  memcpy(exc_buf, st->xcitation_prev, (MAX_PITCH + ORDER + 1) * sizeof(FLOAT32));
+
+  if (num_lost_frames <= 8) {
+    est_fac_est = ixheaacd_exc_fade_fac[num_lost_frames - 1];
+  }
+
+  for (i = 0; i < len_subfrm; i++) {
+    ptr_exc[i] = est_fac_est * ptr_exc[i - st->last_tcx_pitch];
+  }
+  synth_signal[-1] = ptr_exc[-1];
+
+  for (sf_idx = 0; sf_idx < len_subfrm; sf_idx += LEN_SUBFR) {
+    FLOAT32 lp_coef[ORDER + 1];
+
+    ixheaacd_lpc_coef_gen_ec(st->lspold, ptr_lsp_curr, lp_coef, len_subfrm / LEN_SUBFR);
+
+    ixheaacd_synthesis_tool_float(lp_coef, &ptr_exc[sf_idx], &ptr_syn[sf_idx], LEN_SUBFR,
+                                  synth_buf);
+
+    ixheaacd_lpc_wt_tool(lp_coef, ORDER);
+
+    ixheaacd_residual_tool_float(lp_coef, &ptr_syn[sf_idx], synth_signal, LEN_SUBFR, 1);
+
+    ixheaacd_deemphsis_tool(synth_signal, LEN_SUBFR, synth_signal[-1]);
+
+    temp = (est_fac_est * past_tcx_gain);
+
+    for (i = 0; i < LEN_SUBFR; i++) {
+      if (synth_signal[i] > temp) {
+        synth_signal[i] = temp;
+      } else {
+        if (synth_signal[i] < -temp) {
+          synth_signal[i] = -temp;
+        }
+      }
+    }
+
+    for (i = LEN_SUBFR - 1; i >= 0; i--) {
+      synth_signal[i] = (synth_signal[i] - (PREEMPH_FILT_FAC * synth_signal[i - 1]));
+    }
+    ixheaacd_synthesis_tool_float(lp_coef, synth_signal, &ptr_syn[sf_idx], LEN_SUBFR, synth_buf);
+
+    memmove(&ptr_synth[sf_idx], &ptr_syn[sf_idx], LEN_SUBFR * sizeof(FLOAT32));
+  }
+
+  memcpy(st->xcitation_prev, ptr_exc + len_subfrm - (MAX_PITCH + ORDER + 1),
+         sizeof(FLOAT32) * (MAX_PITCH + ORDER + 1));
+  memcpy(st->synth_prev_ec, synth_buf + len_subfrm, sizeof(FLOAT32) * ORDER);
+  return;
+}
diff --git a/decoder/ixheaacd_windows.h b/decoder/ixheaacd_windows.h
index 7d3a614..0d8bc7f 100644
--- a/decoder/ixheaacd_windows.h
+++ b/decoder/ixheaacd_windows.h
@@ -45,10 +45,9 @@
 extern const FLOAT32 ixheaacd_sine_window192[192];
 extern const FLOAT32 ixheaacd__sine_window256[256];
 
-WORD32 ixheaacd_calc_window(WORD32 **win, WORD32 len, WORD32 wfun_select);
+WORD32 ixheaacd_calc_window(WORD32 **win, WORD32 len, WORD32 wfun_select, WORD32 ec_flag);
 
-WORD32 ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift,
-                            WORD32 *scratch);
+VOID ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift, WORD32 *scratch);
 
 typedef struct {
   WORD32 lfac;
diff --git a/decoder/x86/CMakeLists.txt b/decoder/x86/CMakeLists.txt
new file mode 100644
index 0000000..f22b8d2
--- /dev/null
+++ b/decoder/x86/CMakeLists.txt
@@ -0,0 +1,5 @@
+#src files
+target_sources(libxaacdec
+               PRIVATE
+               "${XAAC_ROOT}/decoder/x86/ixheaacd_function_selector_x86.c"
+               "${XAAC_ROOT}/decoder/generic/ixheaacd_qmf_dec_generic.c")
diff --git a/decoder/x86/ixheaacd_function_selector_x86.c b/decoder/x86/ixheaacd_function_selector_x86.c
index f9c71fa..33575df 100644
--- a/decoder/x86/ixheaacd_function_selector_x86.c
+++ b/decoder/x86/ixheaacd_function_selector_x86.c
@@ -45,6 +45,10 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -66,15 +70,15 @@
 WORD32 (*ixheaacd_fix_div)(WORD32, WORD32) = &ixheaacd_fix_div_dec;
 
 VOID(*ixheaacd_covariance_matrix_calc)
-(WORD32 *, ixheaacd_lpp_trans_cov_matrix *,
- WORD32) = &ixheaacd_covariance_matrix_calc_dec;
+(WORD32 *, ia_lpp_trans_cov_matrix *,
+ WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec;
 
 VOID(*ixheaacd_covariance_matrix_calc_2)
-(ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32,
+(ia_lpp_trans_cov_matrix *, WORD32 *, WORD32,
  WORD16) = &ixheaacd_covariance_matrix_calc_2_dec;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_dec;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -159,13 +163,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_dec;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec;
 
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -173,12 +177,12 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec;
 
 VOID(*ixheaacd_overlap_out_copy)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
- const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec;
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
+ const WORD16 ch_fac, WORD16 size_01) = &ixheaacd_overlap_out_copy_dec;
 
 VOID(*ixheaacd_pretwiddle_compute)
 (WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
@@ -193,18 +197,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec;
@@ -213,14 +205,9 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec;
-
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
@@ -246,4 +233,17 @@
 VOID(*ixheaacd_scale_factor_process)
 (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width,
  WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type,
- WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
\ No newline at end of file
+ WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
+
+VOID(*ixheaacd_covariance_matrix_calc_960)
+(WORD32 *, ia_lpp_trans_cov_matrix *,
+ WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec_960;
+
+VOID(*ixheaacd_aac_ld_dec_rearrange_960)
+(WORD32 *ip, WORD32 *op, WORD32 mdct_len_2,
+ WORD16 *re_arr_tab) = &ixheaacd_dec_rearrange_short;
+
+VOID(*ixheaacd_pretwiddle_compute_960)
+(WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
+ ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
+ WORD32 neg_expo) = &ixheaacd_pretwiddle_compute_960_dec;
diff --git a/decoder/x86_64/CMakeLists.txt b/decoder/x86_64/CMakeLists.txt
new file mode 100644
index 0000000..9819606
--- /dev/null
+++ b/decoder/x86_64/CMakeLists.txt
@@ -0,0 +1,5 @@
+#src files
+target_sources(libxaacdec
+               PRIVATE
+               "${XAAC_ROOT}/decoder/x86_64/ixheaacd_function_selector_x86_64.c"
+               "${XAAC_ROOT}/decoder/generic/ixheaacd_qmf_dec_generic.c")
diff --git a/decoder/x86_64/ixheaacd_function_selector_x86_64.c b/decoder/x86_64/ixheaacd_function_selector_x86_64.c
index f9c71fa..8698005 100644
--- a/decoder/x86_64/ixheaacd_function_selector_x86_64.c
+++ b/decoder/x86_64/ixheaacd_function_selector_x86_64.c
@@ -45,6 +45,10 @@
 
 #include "ixheaacd_lt_predict.h"
 
+#include "ixheaacd_cnst.h"
+#include "ixheaacd_ec_defines.h"
+#include "ixheaacd_ec_struct_def.h"
+
 #include "ixheaacd_channelinfo.h"
 #include "ixheaacd_drc_dec.h"
 
@@ -66,15 +70,15 @@
 WORD32 (*ixheaacd_fix_div)(WORD32, WORD32) = &ixheaacd_fix_div_dec;
 
 VOID(*ixheaacd_covariance_matrix_calc)
-(WORD32 *, ixheaacd_lpp_trans_cov_matrix *,
- WORD32) = &ixheaacd_covariance_matrix_calc_dec;
+(WORD32 *, ia_lpp_trans_cov_matrix *,
+ WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec;
 
 VOID(*ixheaacd_covariance_matrix_calc_2)
-(ixheaacd_lpp_trans_cov_matrix *, WORD32 *, WORD32,
+(ia_lpp_trans_cov_matrix *, WORD32 *, WORD32,
  WORD16) = &ixheaacd_covariance_matrix_calc_2_dec;
 
 VOID(*ixheaacd_over_lap_add1)
-(WORD32 *, WORD32 *, WORD16 *, const WORD16 *, WORD16, WORD16,
+(WORD32 *, WORD32 *, WORD32 *, const WORD16 *, WORD16, WORD16,
  WORD16) = &ixheaacd_over_lap_add1_dec;
 
 VOID(*ixheaacd_over_lap_add2)
@@ -159,13 +163,13 @@
  WORD npoints) = &ixheaacd_post_twiddle_dec;
 
 VOID(*ixheaacd_post_twid_overlap_add)
-(WORD16 pcm_out[], WORD32 spec_data[],
+(WORD32 pcm_out[], WORD32 spec_data[],
  ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints,
  WORD32 *ptr_overlap_buf, WORD16 q_shift, const WORD16 *window,
  WORD16 ch_fac) = &ixheaacd_post_twid_overlap_add_dec;
 
 VOID(*ixheaacd_neg_shift_spec)
-(WORD32 *coef, WORD16 *out, WORD16 q_shift,
+(WORD32 *coef, WORD32 *out, WORD16 q_shift,
  WORD16 ch_fac) = &ixheaacd_neg_shift_spec_dec;
 
 VOID(*ixheaacd_spec_to_overlapbuf)
@@ -173,12 +177,12 @@
  WORD32 size) = &ixheaacd_spec_to_overlapbuf_dec;
 
 VOID(*ixheaacd_overlap_buf_out)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 size,
  const WORD16 ch_fac) = &ixheaacd_overlap_buf_out_dec;
 
 VOID(*ixheaacd_overlap_out_copy)
-(WORD16 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
- const WORD16 ch_fac) = &ixheaacd_overlap_out_copy_dec;
+(WORD32 *out_samples, WORD32 *ptr_overlap_buf, WORD32 *ptr_overlap_buf1,
+ const WORD16 ch_fac, WORD16 size_01) = &ixheaacd_overlap_out_copy_dec;
 
 VOID(*ixheaacd_pretwiddle_compute)
 (WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
@@ -193,18 +197,6 @@
 (WORD32 *xr, WORD32 *xi, WORD32 nlength, WORD32 fft_mode,
  WORD32 *preshift) = &ixheaacd_complex_fft_p2_dec;
 
-VOID(*ixheaacd_mps_complex_fft_64)
-(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im,
- WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec;
-
-VOID(*ixheaacd_mps_synt_pre_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec;
-
-VOID(*ixheaacd_mps_synt_post_twiddle)
-(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im,
- WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec;
-
 VOID(*ixheaacd_calc_pre_twid)
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_pre_twid_dec;
@@ -213,14 +205,9 @@
 (WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength,
  const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec;
 
-VOID(*ixheaacd_mps_synt_post_fft_twiddle)
-(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re,
- const WORD32 *table_im,
- WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec;
-
 VOID(*ixheaacd_mps_synt_out_calc)
-(WORD32 resolution, WORD32 *out, WORD32 *state,
- const WORD32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
+(WORD32 resolution, FLOAT32 *out, FLOAT32 *state,
+ const FLOAT32 *filter_coeff) = &ixheaacd_mps_synt_out_calc_dec;
 
 VOID(*ixheaacd_fft_15_ld)
 (WORD32 *inp, WORD32 *op, WORD32 *fft3out,
@@ -246,4 +233,17 @@
 VOID(*ixheaacd_scale_factor_process)
 (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width,
  WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type,
- WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
\ No newline at end of file
+ WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
+
+VOID(*ixheaacd_covariance_matrix_calc_960)
+(WORD32 *, ia_lpp_trans_cov_matrix *,
+ WORD32, WORD32) = &ixheaacd_covariance_matrix_calc_dec_960;
+
+VOID(*ixheaacd_aac_ld_dec_rearrange_960)
+(WORD32 *ip, WORD32 *op, WORD32 mdct_len_2,
+ WORD16 *re_arr_tab) = &ixheaacd_dec_rearrange_short;
+
+VOID(*ixheaacd_pretwiddle_compute_960)
+(WORD32 *spec_data1, WORD32 *spec_data2, WORD32 *out_ptr,
+ ia_aac_dec_imdct_tables_struct *ptr_imdct_tables, WORD npoints4,
+ WORD32 neg_expo) = &ixheaacd_pretwiddle_compute_960_dec;
\ No newline at end of file
diff --git a/docs/Api_flowchart.png b/docs/Api_flowchart.png
new file mode 100644
index 0000000..4fb8418
--- /dev/null
+++ b/docs/Api_flowchart.png
Binary files differ
diff --git a/fuzzer/CMakeLists.txt b/fuzzer/CMakeLists.txt
new file mode 100644
index 0000000..ca26fd9
--- /dev/null
+++ b/fuzzer/CMakeLists.txt
@@ -0,0 +1,21 @@
+list(APPEND XAACDEC_SRCS
+    "${XAAC_ROOT}/fuzzer/xaac_dec_fuzzer.cpp")
+
+set(LIBXAACDEC_INCLUDES ${XAAC_ROOT}/decoder ${XAAC_ROOT}/test ${XAAC_ROOT}/decoder/drc_src)
+
+include_directories(${LIBXAACDEC_INCLUDES})
+
+add_executable(xaac_dec_fuzzer ${XAACDEC_SRCS})
+
+if(MSVC)
+  target_link_libraries(xaac_dec_fuzzer LINK_PUBLIC libxaacdec)
+else()
+  target_link_libraries(xaac_dec_fuzzer LINK_PUBLIC libxaacdec m)
+endif()
+
+set_target_properties(
+  xaac_dec_fuzzer
+  PROPERTIES
+  LINK_FLAGS
+  -fsanitize=fuzzer,${SANITIZE}
+)
\ No newline at end of file
diff --git a/fuzzer/README.md b/fuzzer/README.md
index efa9907..97e4281 100644
--- a/fuzzer/README.md
+++ b/fuzzer/README.md
@@ -21,18 +21,13 @@
  $ mkdir build
  $ cd build
 ```
-Build libxaac using cmake
+
+Build fuzzer with required sanitizers (-DSANITIZE=fuzzer-no-link is mandatory to enable fuzzers)
 ```
- $ CC=clang CXX=clang++ cmake ../ \
-   -DSANITIZE=fuzzer-no-link,address,signed-integer-overflow
+ $ cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
+   -DCMAKE_BUILD_TYPE=Debug -DSANITIZE=fuzzer-no-link,address,\
+   signed-integer-overflow,unsigned-integer-overflow
  $ make
- ```
-Build the fuzzer
-```
- $ clang++ -std=c++11 -fsanitize=fuzzer,address -I.  -I../  -I../common \
-   -I../decoder -I../decoder/drc_src -Wl,--start-group \
-   ../fuzzer/xaac_dec_fuzzer.cpp -o ./xaac_dec_fuzzer ./libxaacdec.a \
-   -Wl,--end-group
 ```
 
 ### Steps to run
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..46b47ff
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,24 @@
+list(APPEND XAACDEC_SRCS
+    "${XAAC_ROOT}/test/ixheaacd_error.c"
+    "${XAAC_ROOT}/test/ixheaacd_fileifc.c"
+    "${XAAC_ROOT}/test/ixheaacd_main.c"
+    "${XAAC_ROOT}/test/ixheaacd_metadata_read.c")
+
+set(LIBXAACDEC_INCLUDES ${XAAC_ROOT}/decoder ${XAAC_ROOT}/test ${XAAC_ROOT}/decoder/drc_src)
+
+include_directories(${LIBXAACDEC_INCLUDES})
+
+add_executable(xaacdec ${XAACDEC_SRCS})
+
+if(MSVC)
+  target_link_libraries(xaacdec LINK_PUBLIC libxaacdec)
+else()
+  target_link_libraries(xaacdec LINK_PUBLIC libxaacdec m)
+endif()
+
+set_target_properties(
+  xaacdec
+  PROPERTIES
+  COMPILE_FLAGS
+  "-UARM_PROFILE_HW -UARM_PROFILE_BOARD -DDRC_ENABLE -DMULTICHANNEL_ENABLE -DECLIPSE -DWIN32"
+)
diff --git a/test/impd_drc_config_params.h b/test/impd_drc_config_params.h
index 3bc7989..36ca1fe 100644
--- a/test/impd_drc_config_params.h
+++ b/test/impd_drc_config_params.h
@@ -42,6 +42,9 @@
 #define IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS 0x0012
 #define IA_DRC_DEC_CONFIG_DRC_LOUD_NORM 0x0013
 
+#define IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE 0x0017
+#define IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED 0x0018
+
 #define IA_API_CMD_SET_INPUT_BYTES_BS 0x0026
 #define IA_API_CMD_SET_INPUT_BYTES_IC_BS 0x0027
 #define IA_API_CMD_SET_INPUT_BYTES_IL_BS 0x0029
diff --git a/test/ixheaacd_error.c b/test/ixheaacd_error.c
index 279f819..048c95e 100644
--- a/test/ixheaacd_error.c
+++ b/test/ixheaacd_error.c
@@ -36,12 +36,7 @@
 pWORD8 ixheaacd_ppb_api_non_fatal[IA_MAX_ERROR_SUB_CODE] = {
     (pWORD8) "No Error",
     (pWORD8) "API Command not supported",
-    (pWORD8) "API Command type not supported",
-    (pWORD8) "DRC Unexpected Error",
-    (pWORD8) "DRC Param Error",
-    (pWORD8) "DRC External Error",
-    (pWORD8) "DRC Errorhandling",
-    (pWORD8) "DRC Bitstream Error"};
+    (pWORD8) "API Command type not supported"};
 /* Fatal Errors */
 pWORD8 ixheaacd_ppb_api_fatal[IA_MAX_ERROR_SUB_CODE] = {
     (pWORD8) "Invalid Memory Table Index",
@@ -59,30 +54,27 @@
 pWORD8 ixheaacd_ppb_config_non_fatal[IA_MAX_ERROR_SUB_CODE] = {
     (pWORD8) "Invalid Output PCM WORD Size. Setting to default, 16 ",
     (pWORD8) "Invalid Down-mix flag option. Setting to default, 0 ",
-    (pWORD8) "Invalid 8 khz output flag option. Setting to default, 0 ",
-    (pWORD8) "Invalid 16 khz output flag option. Setting to default, 0 ",
+    (pWORD8) "Invalid eSBR PS flag option. Setting to default, 0 ",
+    (pWORD8) "Invalid downmix to stereo flag option. Setting to default, 0 ",
     (pWORD8) "Invalid interleave to stereo flag option. Setting to default, 1 ",
     (pWORD8) "Invalid downsample flag option. Setting to default, 0 ",
-    (pWORD8) "Invalid Frame OK option. Setting to default, 1 ",
-    (pWORD8) "Invalid MP4 Flag option. Setting to default, 0 ",
+    (pWORD8) "Invalid peak limiter flag option. Setting to default, 1 ",
+    (pWORD8) "Invalid MP4 flag option. Setting to default, 0 ",
     (pWORD8) "Invalid maximum number of channels. limiting to between 2 and 8",
     (pWORD8) "Invalid instance for coupling channel. Setting to default 1",
-    (pWORD8) "Following feature is not supported in this build. ",
-    (pWORD8) "Invalid Disable Sync Flag option. Setting to default, 0 ",
+    (pWORD8) "Invalid error concealment flag option. Setting to default 0",
+    (pWORD8) "Invalid Disable Sync flag option. Setting to default, 0 ",
     (pWORD8) "Invalid Auto SBR upsample option. Setting to default, 1 ",
-    (pWORD8) "Invalid LOAS flag",
-    (pWORD8) "Invalid DRC flag",
+    (pWORD8) "Invalid DRC heavy compression flag option. Setting to default 0",
     (pWORD8) "Invalid DRC cut value",
     (pWORD8) "Invalid DRC boost value",
     (pWORD8) "Invalid DRC target",
     (pWORD8) "Invalid Frame size",
-    (pWORD8) "Invalid delay mode",
-    (pWORD8) "Invalid decode type",
-    (pWORD8) "Invalid peak limiter flag",
-    (pWORD8) "Invalid control param index",
-    (pWORD8) "Inalid gain delay",
-    (pWORD8) "Invalid constant delay mode",
-    (pWORD8) "Invalid effect type"};
+    (pWORD8) "Invalid LD testing flag option. Setting to default 0",
+    (pWORD8) "Invalid effect type",
+    (pWORD8) "Invalid target loudness value",
+    (pWORD8) "Invalid HQ eSBR flag option. Setting to default 0",
+    (pWORD8) "Invalid frame length flag option. Setting to default 0"};
 /* Fatal Errors */
 pWORD8 ixheaacd_ppb_config_fatal[IA_MAX_ERROR_SUB_CODE] = {
     (pWORD8) "Invalid Sample rate specified for RAW decoding"};
@@ -92,44 +84,68 @@
 /*****************************************************************************/
 /* Non Fatal Errors */
 pWORD8 ixheaacd_ppb_init_non_fatal[IA_MAX_ERROR_SUB_CODE] = {
-    (pWORD8)"Both 16 kHz and 8 kHz output config set. Giving 16 kHz output",
-    (pWORD8)"Output sampling frequency is 8 kHz, 16 kHz output disabled ",
-    (pWORD8)"Header not found at the beginning of input data continuing syncing"
-};
+    (pWORD8) "Header not found at the beginning of input data continuing syncing",
+    (pWORD8) "Invalid number of QMF bands", (pWORD8) "Decoder initialization failed",
+    (pWORD8) "Input bytes insufficient for decoding", (pWORD8) "Error in AAC decoding"};
 /* Fatal Errors */
 pWORD8 ixheaacd_ppb_init_fatal[IA_MAX_ERROR_SUB_CODE] = {
     (pWORD8) "AAC Decoder initialization failed",
     (pWORD8) "End of input reached during initialization",
     (pWORD8) "No. of channels in stream greater than max channels defined",
-    (pWORD8) "AudioObjectType is not supported"};
+    (pWORD8) "Audio object type is not supported",
+    (pWORD8) "Decoder initialization failed",
+    (pWORD8) "Channel coupling not supported"};
 /*****************************************************************************/
 /* Class 3: Execution Errors
  */
 /*****************************************************************************/
 /* Non Fatal Errors */
 pWORD8 ixheaacd_ppb_exe_non_fatal[IA_MAX_ERROR_SUB_CODE] = {
-    (pWORD8)"ADTS syncronization is lost. Re-syncing",
-    (pWORD8)"Though SBR was present in previous frame, not present in current frame (SBR turned off)",
-    (pWORD8)"SBR was not present in previous frame, but it is present in current frame (SBR turned on)",
-    (pWORD8)"ADTS Header CRC failed.Re-syncing",
-    (pWORD8)"Input bytes insufficient for decoding",
-    (pWORD8)"Element instance tag mismatch, because of new channel mode",
-    (pWORD8)"max huffman decoded value exceeded",
-    (pWORD8)"Error in AAC decoding",
-    (pWORD8)"Scale factor exceeds the transmitted boundary",
-    (pWORD8)"Gain control not supported",
-    (pWORD8)"Filter Order of TNS data is greater than maximum order",
-    (pWORD8)"LTP data found, not supported",
-    (pWORD8)"The base sampling frequency has changed in ADTS header",
-    (pWORD8)"Pulse Data exceeds the permitted boundary",
-    (pWORD8)"Invalid code ixheaacd_book number in ia_huffman_data_type decoding",
-//    (pWORD8)"The base sampling frequency has changed in ADTS header"
-};
+    (pWORD8) "ADTS syncronization is lost. Re-syncing",
+    (pWORD8) "Though SBR was present in previous frame, not present in current"
+             "frame (SBR turned off)",
+    (pWORD8) "SBR was not present in previous frame, but it is present in"
+             "current frame (SBR turned on)",
+    (pWORD8) "ADTS Header CRC failed.Re-syncing",
+    (pWORD8) "Input bytes insufficient for decoding",
+    (pWORD8) "Element instance tag mismatch, because of new channel mode",
+    (pWORD8) "max huffman decoded value exceeded",
+    (pWORD8) "Error in AAC decoding",
+    (pWORD8) "Scale factor exceeds the transmitted boundary",
+    (pWORD8) "Gain control not supported",
+    (pWORD8) "Filter Order of TNS data is greater than maximum order",
+    (pWORD8) "LTP data found, not supported",
+    (pWORD8) "The base sampling frequency has changed in ADTS header",
+    (pWORD8) "Pulse Data exceeds the permitted boundary",
+    (pWORD8) "Invalid code ixheaacd_book number in ia_huffman_data_type decoding",
+    (pWORD8) "Channel index not within allowed range",
+    (pWORD8) "Smoothing mode not within allowed range",
+    (pWORD8) "Smoothing time not within allowed range",
+    (pWORD8) "Extension type in the bitstream not within allowed range",
+    (pWORD8) "QMF update type in the bitstream not within allowed range",
+    (pWORD8) "Window type in the bitstream not within allowed range",
+    (pWORD8) "Evaluated sine parameter not within allowed range"};
 /* Fatal Errors */
 pWORD8 ixheaacd_ppb_exe_fatal[IA_MAX_ERROR_SUB_CODE] = {
     (pWORD8) "Channel coupling not supported",
-    (pWORD8) "TNS data range is errorneous", (pWORD8) "Invalid LOAS header",
-    (pWORD8) "Invalid ER profile", (pWORD8) "Invalid DRC data"};
+    (pWORD8) "TNS data range is errorneous",
+    (pWORD8) "Invalid LOAS header",
+    (pWORD8) "Invalid DRC data",
+    (pWORD8) "MPS reshaping input not valid",
+    (pWORD8) "Tree config present in bit stream not valid",
+    (pWORD8) "Number of timeslots not valid",
+    (pWORD8) "MPS dequantization parameter not valid",
+    (pWORD8) "MPS quantization mode not valid",
+    (pWORD8) "MPS input channels not valid",
+    (pWORD8) "Bitstream data in arbitrary downmix spatial frame not valid",
+    (pWORD8) "Window sequence value not valid",
+    (pWORD8) "Temporal shape config in the bitstream not valid",
+    (pWORD8) "3D audio HRTF set present in the bitstream not valid",
+    (pWORD8) "TTT mode read from the bitstream not valid",
+    (pWORD8) "Number of OTT boxes in the bitstream not valid",
+    (pWORD8) "Number of parameter sets present in the bitstream not valid",
+    (pWORD8) "Mapping of index data failed during decoding",
+    (pWORD8) "Number of parameter bands present in the bitstream not valid"};
 
 /*****************************************************************************/
 /* error info structure                                                      */
@@ -305,9 +321,15 @@
     return IA_NO_ERROR;
   }
   {
-    WORD is_fatal = (((UWORD)code & 0x8000) >> 15);
-    WORD err_class = (((UWORD)code & 0x7800) >> 11);
-    WORD err_sub_code = (((UWORD)code & 0x07FF));
+    WORD is_fatal, err_class, err_sub_code;
+
+    if (code == IA_FATAL_ERROR)
+      is_fatal = 1;
+    else
+      is_fatal = (((UWORD)code & 0x8000) >> 15);
+
+    err_class = (((UWORD)code & 0x7800) >> 11);
+    err_sub_code = (((UWORD)code & 0x07FF));
 
     if (!is_fatal) {
       printf("non ");
diff --git a/test/ixheaacd_main.c b/test/ixheaacd_main.c
index 4d793b2..2c453c8 100644
--- a/test/ixheaacd_main.c
+++ b/test/ixheaacd_main.c
@@ -71,7 +71,7 @@
 
 #ifdef ARM_PROFILE_HW
 #include <sys/time.h>
-#define CLK_FREQ_BOARD_MHZ 716  // a9 omap4430 board
+#define CLK_FREQ_BOARD_MHZ 716 // a9 omap4430 board
 //#define CLK_FREQ_BOARD_MHZ 1555 //Nexus6P
 //#define CLK_FREQ_BOARD_MHZ 2035 //Tegra Board
 //#define CLK_FREQ_BOARD_MHZ 550 //a8  board
@@ -102,10 +102,13 @@
 
 metadata_info meta_info;  // metadata pointer;
 WORD32 ixheaacd_i_bytes_to_read;
+WORD32 prev_i_bytes_to_read;
+WORD32 flush_frame = 0;
 FILE *g_pf_meta;
 
 WORD32 raw_testing = 0;
 WORD32 eld_testing = 0;
+WORD32 ec_enable = 0;
 
 #define _IA_PRINT_ERROR(p_mod_err_info, context, e)           \
   if ((e) != IA_NO_ERROR) {                                   \
@@ -383,13 +386,22 @@
   ia_error_info_struct *p_proc_err_info = &ixheaacd_error_info;
 
   for (i = 0; i < argc; i++) {
+    /* To indicate if its a MP4 file or not. */
+    if (!strncmp((pCHAR8)argv[i], "-mp4:", 5)) {
+      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 5);
+      UWORD32 ui_mp4_flag = atoi(pb_arg_val);
+      err_code = (*p_ia_process_api)(
+          p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+          IA_XHEAAC_DEC_CONFIG_PARAM_MP4FLAG, &ui_mp4_flag);
+      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+    }
     /* PCM WORD Size (For single input file) */
     if (!strncmp((pCHAR8)argv[i], "-pcmsz:", 7)) {
       pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 7);
       UWORD32 ui_pcm_wd_sz = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ, &ui_pcm_wd_sz);
+          IA_XHEAAC_DEC_CONFIG_PARAM_PCM_WDSZ, &ui_pcm_wd_sz);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
     /* Down-mix stereo to mono. */
@@ -398,7 +410,23 @@
       UWORD32 ui_down_mix = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX, &ui_down_mix);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX, &ui_down_mix);
+      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+    }
+    if (!strncmp((pCHAR8)argv[i], "-esbr_hq:", 9)) {
+      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 9);
+      UWORD32 ui_esbr_hq = atoi(pb_arg_val);
+      err_code = (*p_ia_process_api)(
+          p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+          IA_XHEAAC_DEC_CONFIG_PARAM_HQ_ESBR, &ui_esbr_hq);
+      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+    }
+    if (!strncmp((pCHAR8)argv[i], "-esbr_ps:", 9)) {
+      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 9);
+      UWORD32 ui_esbr_ps = atoi(pb_arg_val);
+      err_code = (*p_ia_process_api)(
+          p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+          IA_XHEAAC_DEC_CONFIG_PARAM_PS_ENABLE, &ui_esbr_ps);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
 #ifdef RESAMPLE_SUPPORT
@@ -427,7 +455,7 @@
       UWORD32 ui_to_stereo = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_TOSTEREO, &ui_to_stereo);
+          IA_XHEAAC_DEC_CONFIG_PARAM_TOSTEREO, &ui_to_stereo);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
     /* Downsampled synthesis to be used */
@@ -436,16 +464,7 @@
       UWORD32 ui_dsample = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DSAMPLE, &ui_dsample);
-      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
-    }
-    /* To indicate if its a MP4 file or not. */
-    if (!strncmp((pCHAR8)argv[i], "-mp4:", 5)) {
-      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 5);
-      UWORD32 ui_mp4_flag = atoi(pb_arg_val);
-      err_code = (*p_ia_process_api)(
-          p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_ISMP4, &ui_mp4_flag);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DSAMPLE, &ui_dsample);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
 
@@ -475,55 +494,71 @@
 #endif
 
 #ifdef DRC_ENABLE
-    if (!strncmp((pCHAR8)argv[i], "-drc:", 5)) {
-      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 5);
-      UWORD32 ui_drc_enable = atoi(pb_arg_val);
-      err_code = (*p_ia_process_api)(
-          p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_ENABLE, &ui_drc_enable);
-      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
-    }
     if (!strncmp((pCHAR8)argv[i], "-drc_cut_fac:", 13)) {
       pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 13);
-      UWORD32 ui_drc_enable = atoi(pb_arg_val);
+      UWORD32 ui_drc_cut = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_CUT, &ui_drc_enable);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DRC_CUT, &ui_drc_cut);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
     if (!strncmp((pCHAR8)argv[i], "-drc_boost_fac:", 15)) {
       pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 15);
-      UWORD32 ui_drc_enable = atoi(pb_arg_val);
+      UWORD32 ui_drc_boost = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_BOOST, &ui_drc_enable);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DRC_BOOST, &ui_drc_boost);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
     if (!strncmp((pCHAR8)argv[i], "-drc_target_level:", 18)) {
       pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 18);
-      UWORD32 ui_drc_enable = atoi(pb_arg_val);
+      UWORD32 ui_drc_target = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL, &ui_drc_enable);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL, &ui_drc_target);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
     if (!strncmp((pCHAR8)argv[i], "-drc_heavy_comp:", 16)) {
       pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 16);
-      UWORD32 ui_drc_enable = atoi(pb_arg_val);
+      UWORD32 ui_drc_heavy_comp = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_HEAVY_COMP, &ui_drc_enable);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DRC_HEAVY_COMP, &ui_drc_heavy_comp);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
 
 #endif
+    /* For MPEG-D DRC effect type */
+    if (!strncmp((pCHAR8)argv[i], "-effect:", 8)) {
+      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 8);
+      WORD32 ui_effect = atoi(pb_arg_val);
+      err_code =
+          (*p_ia_process_api)(p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+              IA_XHEAAC_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE, &ui_effect);
+      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+      mpeg_d_drc_on = 1;
+    }
+    /* For MPEG-D DRC target loudness */
+    if (!strncmp((pCHAR8)argv[i], "-target_loudness:", 17)) {
+      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 17);
+      WORD32 ui_target_loudness = atoi(pb_arg_val);
+      if ((ui_target_loudness > 0) || (ui_target_loudness < -63)) {
+          ui_target_loudness = 0;
+      }
+      ui_target_loudness = -(ui_target_loudness << 2);
+      err_code = (*p_ia_process_api)(
+          p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+          IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS, &ui_target_loudness);
+      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+      mpeg_d_drc_on = 1;
+    }
     /* To indicate if its a MP4 file or not. */
     if (!strncmp((pCHAR8)argv[i], "-nosync:", 8)) {
       pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 8);
       UWORD32 ui_disable_sync = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DISABLE_SYNC, &ui_disable_sync);
+          IA_XHEAAC_DEC_CONFIG_DISABLE_SYNC, &ui_disable_sync);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
     /* To indicate SBR upsampling. */
@@ -532,17 +567,28 @@
       UWORD32 ui_auto_sbr_upsample = atoi(pb_arg_val);
       err_code =
           (*p_ia_process_api)(p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-                              IA_ENHAACPLUS_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE,
+                              IA_XHEAAC_DEC_CONFIG_PARAM_AUTO_SBR_UPSAMPLE,
                               &ui_auto_sbr_upsample);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
+    /* To indicate frame length for a RAW bit-stream. */
+    if (!strncmp((pCHAR8)argv[i], "-flflag:", 8)) {
+        pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 8);
+        UWORD32 ui_fl_flag = atoi(pb_arg_val);
+        err_code =
+            (*p_ia_process_api)(p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+                                IA_XHEAAC_DEC_CONFIG_PARAM_FRAMELENGTH_FLAG,
+                                &ui_fl_flag);
+        _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+    }
+
     /* To indicate sample rate for a RAW bit-stream. */
     if (!strncmp((pCHAR8)argv[i], "-fs:", 4)) {
       pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 4);
       UWORD32 ui_samp_freq = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ, &ui_samp_freq);
+          IA_XHEAAC_DEC_CONFIG_PARAM_SAMP_FREQ, &ui_samp_freq);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
     /* To indicate the number of maximum channels */
@@ -551,7 +597,7 @@
       UWORD32 ui_max_channel = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_MAX_CHANNEL, &ui_max_channel);
+          IA_XHEAAC_DEC_CONFIG_PARAM_MAX_CHANNEL, &ui_max_channel);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
 
@@ -561,7 +607,7 @@
       UWORD32 ui_coupling_channel = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_COUP_CHANNEL, &ui_coupling_channel);
+          IA_XHEAAC_DEC_CONFIG_PARAM_COUP_CHANNEL, &ui_coupling_channel);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
 
@@ -571,7 +617,7 @@
       UWORD32 ui_downmix = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX_STEREO, &ui_downmix);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DOWNMIX_STEREO, &ui_downmix);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
 
@@ -581,42 +627,36 @@
       UWORD32 ui_fs480 = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_FRAMESIZE, &ui_fs480);
+          IA_XHEAAC_DEC_CONFIG_PARAM_FRAMESIZE, &ui_fs480);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
 
-    /*For MPEG-D DRC effect type*/
-    if (!strncmp((pCHAR8)argv[i], "-effect:", 8)) {
-      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 8);
-      WORD32 ui_effect = atoi(pb_arg_val);
-      err_code =
-          (*p_ia_process_api)(p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-                              IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE, &ui_effect);
-      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
-      mpeg_d_drc_on = 1;
-    }
-    /*For MPEG-D DRC target loudness*/
-    if (!strncmp((pCHAR8)argv[i], "-target_loudness:", 17)) {
-      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 17);
-      WORD32 ui_target_loudness = atoi(pb_arg_val);
-      if ((ui_target_loudness > 0) || (ui_target_loudness < -63)) {
-        ui_target_loudness = 0;
-      }
-      ui_target_loudness = -(ui_target_loudness << 2);
-      err_code = (*p_ia_process_api)(
-          p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS, &ui_target_loudness);
-      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
-      mpeg_d_drc_on = 1;
-    }
     if (!strncmp((pCHAR8)argv[i], "-ld_testing:", 12)) {
       pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 12);
       UWORD32 ld_testing = atoi(pb_arg_val);
       err_code = (*p_ia_process_api)(
           p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_LD_TESTING, &ld_testing);
+          IA_XHEAAC_DEC_CONFIG_PARAM_LD_TESTING, &ld_testing);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     }
+    if (!strncmp((pCHAR8)argv[i], "-peak_limiter_off:", 18))
+    {
+      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 18);
+      UWORD32 peak_limiter_flag = atoi(pb_arg_val);
+      err_code = (*p_ia_process_api)(p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+          IA_XHEAAC_DEC_CONFIG_PARAM_PEAK_LIMITER, &peak_limiter_flag);
+      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+    }
+    /* For Error concealment */
+    if (!strncmp((pCHAR8)argv[i], "-err_conceal:", 13))
+    {
+      pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 13);
+      UWORD32 ui_err_conceal = atoi(pb_arg_val);
+      err_code = (*p_ia_process_api)(p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+                                     IA_XHEAAC_DEC_CONFIG_ERROR_CONCEALMENT, &ui_err_conceal);
+      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+      ec_enable = ui_err_conceal;
+    }
   }
 
   return IA_NO_ERROR;
@@ -654,7 +694,9 @@
                                        pWORD32 pi_samp_freq,
                                        pWORD32 pi_num_chan,
                                        pWORD32 pi_pcm_wd_sz,
-                                       pWORD32 pi_channel_mask) {
+                                       pWORD32 pi_channel_mask,
+                                       pWORD32 pi_sbr_mode,
+                                       pWORD32 pi_aot) {
   IA_ERRORCODE err_code = IA_NO_ERROR;
   /* the process API function */
   IA_ERRORCODE(*p_ia_process_api)
@@ -666,28 +708,28 @@
   {
     err_code = (*p_ia_process_api)(
         p_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-        IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ, pi_samp_freq);
+        IA_XHEAAC_DEC_CONFIG_PARAM_SAMP_FREQ, pi_samp_freq);
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
   }
   /* Total Number of Channels */
   {
     err_code = (*p_ia_process_api)(
         p_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-        IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS, pi_num_chan);
+        IA_XHEAAC_DEC_CONFIG_PARAM_NUM_CHANNELS, pi_num_chan);
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
   }
   /* PCM word size */
   {
     err_code = (*p_ia_process_api)(
         p_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-        IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ, pi_pcm_wd_sz);
+        IA_XHEAAC_DEC_CONFIG_PARAM_PCM_WDSZ, pi_pcm_wd_sz);
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
   }
   /* channel mask to tell the arrangement of channels in bit stream */
   {
     err_code = (*p_ia_process_api)(
         p_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-        IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MASK, pi_channel_mask);
+        IA_XHEAAC_DEC_CONFIG_PARAM_CHANNEL_MASK, pi_channel_mask);
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
   }
 
@@ -696,7 +738,7 @@
     UWORD32 ui_channel_mode;
     err_code = (*p_ia_process_api)(
         p_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-        IA_ENHAACPLUS_DEC_CONFIG_PARAM_CHANNEL_MODE, &ui_channel_mode);
+        IA_XHEAAC_DEC_CONFIG_PARAM_CHANNEL_MODE, &ui_channel_mode);
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     if (ui_channel_mode == 0)
       printf("Channel Mode: MONO_OR_PS\n");
@@ -713,7 +755,7 @@
     UWORD32 ui_sbr_mode;
     err_code = (*p_ia_process_api)(
         p_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-        IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE, &ui_sbr_mode);
+        IA_XHEAAC_DEC_CONFIG_PARAM_SBR_MODE, &ui_sbr_mode);
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
     if (ui_sbr_mode == 0)
       printf("SBR Mode: NOT_PRESENT\n");
@@ -725,6 +767,15 @@
       printf("ESBR Mode: UPSAMPLING FACTOR 4\n");
     else
       printf("ui_sbr_mode not vaild\n");
+    *pi_sbr_mode = ui_sbr_mode;
+  }
+  {
+    UWORD32 ui_aot;
+    err_code = (*p_ia_process_api)(
+        p_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
+        IA_XHEAAC_DEC_CONFIG_PARAM_AOT, &ui_aot);
+    _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+    *pi_aot = ui_aot;
   }
   return IA_NO_ERROR;
 }
@@ -788,8 +839,8 @@
   /* Initialize memory tables                          */
   /* Get memory information and allocate memory        */
 
-  UWORD8 drc_ip_buf[8192 * 4];
-  UWORD8 drc_op_buf[8192 * 4];
+  UWORD8 drc_ip_buf[4096 * 4 * 8];
+  UWORD8 drc_op_buf[4096 * 4 * 8];
 
   /* Memory variables */
   UWORD32 n_mems, ui_rem;
@@ -818,6 +869,8 @@
   WORD32 samples_written = 0;
   WORD32 init_iteration = 1;
 
+  WORD32 fatal_error_chk;
+
 #ifdef ARM_PROFILE_HW
   int frame_count_b = 0;
   long long cycles_b = 0;
@@ -829,7 +882,7 @@
   WORD32 i_out_bytes, i_total_bytes = 0;
   WORD32 i_samp_freq, i_num_chan, i_pcm_wd_sz, i_channel_mask;
 
-  UWORD32 i_sbr_mode;
+  WORD32 i_sbr_mode;
   WORD32 i_effect_type = 0;
   WORD32 i_target_loudness = 0;
   WORD32 i_loud_norm = 0;
@@ -848,7 +901,8 @@
   /* The get config from API */
   IA_ERRORCODE(*p_get_config_param)
   (pVOID p_ia_process_api_obj, pWORD32 pi_samp_freq, pWORD32 pi_num_chan,
-   pWORD32 pi_pcm_wd_sz, pWORD32 pi_channel_mask);
+   pWORD32 pi_pcm_wd_sz, pWORD32 pi_channel_mask, pWORD32 pi_sbr_mode, pWORD32 pi_aot);
+  WORD32 ui_aot = 0;
 
   /* The error init function */
   VOID (*p_error_init)();
@@ -909,7 +963,7 @@
   }
 
   /* API object requires 4 bytes (WORD32) alignment */
-  ui_rem = ((WORD32)g_pv_arr_alloc_memory[g_w_malloc_count] & 3);
+  ui_rem = ((SIZE_T)g_pv_arr_alloc_memory[g_w_malloc_count] & 3);
   /* Set API object with the memory allocated */
   pv_ia_process_api_obj =
       (pVOID)((WORD8 *)g_pv_arr_alloc_memory[g_w_malloc_count] + 4 - ui_rem);
@@ -991,7 +1045,7 @@
                        IA_TESTBENCH_MFMAN_FATAL_MEM_ALLOC_FAILED);
     }
 
-    ui_rem = ((WORD32)g_pv_arr_alloc_memory[g_w_malloc_count] % ui_alignment);
+    ui_rem = ((SIZE_T)g_pv_arr_alloc_memory[g_w_malloc_count] % ui_alignment);
     pv_alloc_ptr = (pVOID)((WORD8 *)g_pv_arr_alloc_memory[g_w_malloc_count] +
                            ui_alignment - ui_rem);
 
@@ -1035,7 +1089,7 @@
   }
 
   /* API object requires 4 bytes (WORD32) alignment */
-  ui_rem = ((WORD32)g_pv_arr_alloc_memory[g_w_malloc_count] & 3);
+  ui_rem = ((SIZE_T)g_pv_arr_alloc_memory[g_w_malloc_count] & 3);
 
   /* Set pointer for process memory tables    */
   err_code = (*p_ia_process_api)(
@@ -1086,16 +1140,9 @@
 
     err_code =
         (*p_get_config_param)(pv_ia_process_api_obj, &i_samp_freq, &i_num_chan,
-                              &i_pcm_wd_sz, &i_channel_mask);
+                              &i_pcm_wd_sz, &i_channel_mask, &i_sbr_mode, &ui_aot);
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
-    /*if (ui_type == IA_MEMTYPE_OUTPUT) {
-      if (i_pcm_wd_sz == 16)
-        ui_size = 11 * 2048 * sizeof(WORD16);
-      else
-        ui_size = 11 * 2048 * 3 * sizeof(WORD8);
-    }*/
-
     g_pv_arr_alloc_memory[g_w_malloc_count] = malloc(ui_size + ui_alignment);
 
     if (g_pv_arr_alloc_memory[g_w_malloc_count] == NULL) {
@@ -1104,7 +1151,7 @@
                        (pWORD8) "Mem tables alloc", err_code);
     }
 
-    ui_rem = ((WORD32)g_pv_arr_alloc_memory[g_w_malloc_count] % ui_alignment);
+    ui_rem = ((SIZE_T)g_pv_arr_alloc_memory[g_w_malloc_count] % ui_alignment);
     pv_alloc_ptr = (pVOID)((WORD8 *)g_pv_arr_alloc_memory[g_w_malloc_count] +
                            ui_alignment - ui_rem);
 
@@ -1184,7 +1231,8 @@
 
       err_code =
           (*p_get_config_param)(pv_ia_process_api_obj, &i_samp_freq,
-                                &i_num_chan, &i_pcm_wd_sz, &i_channel_mask);
+                                &i_num_chan, &i_pcm_wd_sz, &i_channel_mask,
+                                &i_sbr_mode, &ui_aot);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
       // This is done in those cases, where file decodes ends at init time
@@ -1270,11 +1318,34 @@
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
   } while (!ui_init_done);
-
+  if (ec_enable == 1) {
+    mpeg_d_drc_on = 0;
+  }
   if (mpeg_d_drc_on == 1) {
+    err_code = (*p_ia_process_api)(
+        pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
+        IA_XHEAAC_DEC_CONFIG_PARAM_SBR_MODE, &i_sbr_mode);
+    _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+    if (i_sbr_mode != 0) {
+      WORD32 frame_length;
+      if (i_sbr_mode == 1) {
+        frame_length = 2048;
+      } else if (i_sbr_mode == 3) {
+        frame_length = 4096;
+      } else {
+        frame_length = 1024;
+      }
+
+      err_code =
+          ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+                         IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE, &frame_length);
+      _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+    }
+
     err_code =
         (*p_get_config_param)(pv_ia_process_api_obj, &i_samp_freq, &i_num_chan,
-                              &i_pcm_wd_sz, &i_channel_mask);
+                              &i_pcm_wd_sz, &i_channel_mask, &i_sbr_mode, &ui_aot);
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
     /* Sampling Frequency */
@@ -1305,7 +1376,7 @@
     {
       err_code = (*p_ia_process_api)(
           pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE, &i_effect_type);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE, &i_effect_type);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
       err_code =
@@ -1319,7 +1390,7 @@
     {
       err_code = (*p_ia_process_api)(
           pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS,
+          IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS,
           &i_target_loudness);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
@@ -1333,7 +1404,7 @@
     {
       err_code = (*p_ia_process_api)(
           pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-          IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM, &i_loud_norm);
+          IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUD_NORM, &i_loud_norm);
       _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
       err_code =
@@ -1558,11 +1629,18 @@
   /* ******************************************************************/
 
   err_code = (*p_get_config_param)(pv_ia_process_api_obj, &i_samp_freq,
-                                   &i_num_chan, &i_pcm_wd_sz, &i_channel_mask);
+                                   &i_num_chan, &i_pcm_wd_sz, &i_channel_mask,
+                                   &i_sbr_mode, &ui_aot);
   _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
   if (raw_testing) {
     skip_samples = get_start_offset_in_samples(meta_info);
+    if (ui_aot >= 23) {
+      skip_samples = skip_samples - 2048;
+      if (skip_samples < 0) {
+        skip_samples = 0;
+      }
+    }
     if (eld_testing == 0) total_samples = get_play_time_in_samples(meta_info);
   }
 
@@ -1583,43 +1661,87 @@
 
   do {
     if (((WORD32)ui_inp_size - (WORD32)(i_buff_size - i_bytes_consumed)) > 0) {
-      for (i = 0; i < (i_buff_size - i_bytes_consumed); i++) {
-        pb_inp_buf[i] = pb_inp_buf[i + i_bytes_consumed];
-      }
-#ifdef ENABLE_LD_DEC
-      if (0 != frame_counter) {
-#endif
-        FileWrapper_Read(
-            g_pf_inp,
-            (unsigned char *)(pb_inp_buf + i_buff_size - i_bytes_consumed),
+      if (i_sbr_mode && (ui_aot < 23)) {
+        if (meta_info.ia_mp4_stsz_entries != frame_counter) {
+          for (i = 0; i < (i_buff_size - i_bytes_consumed); i++) {
+            pb_inp_buf[i] = pb_inp_buf[i + i_bytes_consumed];
+          }
+
+          FileWrapper_Read(
+              g_pf_inp,
+              (unsigned char *)(pb_inp_buf + i_buff_size - i_bytes_consumed),
+              ((WORD32)ui_inp_size - (WORD32)(i_buff_size - i_bytes_consumed)),
+              (pUWORD32)&i_bytes_read);
+
+          i_buff_size = i_buff_size - (i_bytes_consumed - i_bytes_read);
+
+          if ((i_buff_size <= 0) ||
+              ((err_code_reinit == 0x00001804) && i_bytes_read == 0)) {
+            i_buff_size = 0;
+            raw_testing = 0;
+            /* Tell that the input is over in this buffer */
+            err_code = (*p_ia_process_api)(pv_ia_process_api_obj,
+                                           IA_API_CMD_INPUT_OVER, 0, NULL);
+
+            _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+          }
+        }
+      } else {
+        for (i = 0; i < (i_buff_size - i_bytes_consumed); i++) {
+          pb_inp_buf[i] = pb_inp_buf[i + i_bytes_consumed];
+        }
+
+        FileWrapper_Read(g_pf_inp, (unsigned char *)(pb_inp_buf + i_buff_size -
+            i_bytes_consumed),
             ((WORD32)ui_inp_size - (WORD32)(i_buff_size - i_bytes_consumed)),
             (pUWORD32)&i_bytes_read);
-#ifdef ENABLE_LD_DEC
-      } else
-        i_bytes_read = 0;
-#endif
 
-      i_buff_size = i_buff_size - (i_bytes_consumed - i_bytes_read);
+        i_buff_size = i_buff_size - (i_bytes_consumed - i_bytes_read);
 
-      if ((i_buff_size <= 0) ||
-          ((err_code_reinit == 0x00001804) && i_bytes_read == 0)) {
-        i_buff_size = 0;
-        raw_testing = 0;
-        /* Tell that the input is over in this buffer */
-        err_code = (*p_ia_process_api)(pv_ia_process_api_obj,
-                                       IA_API_CMD_INPUT_OVER, 0, NULL);
+        if ((i_buff_size <= 0) ||
+            ((err_code_reinit == 0x00001804) && i_bytes_read == 0)) {
+          i_buff_size = 0;
+          raw_testing = 0;
 
-        _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+          err_code = (*p_ia_process_api)(pv_ia_process_api_obj,
+              IA_API_CMD_INPUT_OVER, 0, NULL);
+
+          _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+        }
       }
     }
+    if (i_sbr_mode && (ui_aot < 23)) {
+      if (meta_info.ia_mp4_stsz_entries != frame_counter) {
+        if (raw_testing) {
+          ixheaacd_i_bytes_to_read =
+              get_metadata_dec_exec(meta_info, frame_counter);
 
+          if (ixheaacd_i_bytes_to_read > (WORD32)ui_inp_size)
+            return IA_FATAL_ERROR;
+          if (ixheaacd_i_bytes_to_read <= 0 && ec_enable == 0) {
+            err_code = (*p_ia_process_api)(pv_ia_process_api_obj,
+                                           IA_API_CMD_INPUT_OVER, 0, NULL);
+
+            _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+            return IA_NO_ERROR;
+          }
+          err_code =
+              (*p_ia_process_api)(pv_ia_process_api_obj, IA_API_CMD_SET_INPUT_BYTES,
+                  0, &ixheaacd_i_bytes_to_read);
+        } else {
+          err_code = (*p_ia_process_api)(
+              pv_ia_process_api_obj, IA_API_CMD_SET_INPUT_BYTES, 0, &i_buff_size);
+        }
+      }
+    } else {
     if (raw_testing) {
       ixheaacd_i_bytes_to_read =
           get_metadata_dec_exec(meta_info, frame_counter);
 
       if (ixheaacd_i_bytes_to_read > (WORD32)ui_inp_size) return IA_FATAL_ERROR;
 
-      if (ixheaacd_i_bytes_to_read <= 0) {
+      if (ixheaacd_i_bytes_to_read <= 0 && ec_enable == 0) {
         err_code = (*p_ia_process_api)(pv_ia_process_api_obj,
                                        IA_API_CMD_INPUT_OVER, 0, NULL);
 
@@ -1628,13 +1750,33 @@
         return IA_NO_ERROR;
       }
 
-      err_code =
-          (*p_ia_process_api)(pv_ia_process_api_obj, IA_API_CMD_SET_INPUT_BYTES,
-                              0, &ixheaacd_i_bytes_to_read);
+        if (ec_enable == 1) {
+          if (ixheaacd_i_bytes_to_read != 0) {
+            err_code = (*p_ia_process_api)(pv_ia_process_api_obj, IA_API_CMD_SET_INPUT_BYTES, 0,
+                                           &ixheaacd_i_bytes_to_read);
+          } else {
+            if (i_buff_size != 0) {
+              err_code = (*p_ia_process_api)(pv_ia_process_api_obj, IA_API_CMD_SET_INPUT_BYTES, 0,
+                                             &i_buff_size);
+            }
+          }
+        } else {
+          err_code = (*p_ia_process_api)(pv_ia_process_api_obj, IA_API_CMD_SET_INPUT_BYTES, 0,
+                                         &ixheaacd_i_bytes_to_read);
+        }
     } else {
       /* Set number of bytes to be processed */
       err_code = (*p_ia_process_api)(
           pv_ia_process_api_obj, IA_API_CMD_SET_INPUT_BYTES, 0, &i_buff_size);
+
+      if (i_buff_size <= 0)
+      {
+        err_code = (*p_ia_process_api)(
+            pv_ia_process_api_obj, IA_API_CMD_INPUT_OVER, 0, NULL);
+
+        _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+      }
+    }
     }
 
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
@@ -1659,6 +1801,8 @@
 
     _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
+    fatal_error_chk = err_code & IA_FATAL_ERROR;
+
     /* Checking for end of processing */
     err_code = (*p_ia_process_api)(pv_ia_process_api_obj, IA_API_CMD_EXECUTE,
                                    IA_CMD_TYPE_DONE_QUERY, &ui_exec_done);
@@ -1735,15 +1879,18 @@
 
         if (err_code_reinit != 0) memset(pb_out_buf, 0, i_out_bytes);
 
-        i_total_bytes += i_out_bytes;
-
+        if (i_sbr_mode && (ui_aot < 23)) {
+           if (frame_counter > 0)
+             i_total_bytes += i_out_bytes;
+        } else {
+          i_total_bytes += i_out_bytes;
+        }
         if (mpegd_drc_present == 1) {
-          memcpy(drc_ip_buf, pb_out_buf + preroll_frame_offset, i_out_bytes);
-          preroll_frame_offset += i_out_bytes;
+          WORD32 is_config_changed = 0, apply_crossfade = 0;
 
           err_code = (*p_ia_process_api)(
               pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
-              IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE, &i_sbr_mode);
+              IA_XHEAAC_DEC_CONFIG_PARAM_SBR_MODE, &i_sbr_mode);
           _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
           if (i_sbr_mode != 0) {
@@ -1768,6 +1915,124 @@
 
           _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
+          err_code = (*p_ia_process_api)(
+              pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
+              IA_ENHAACPLUS_DEC_DRC_IS_CONFIG_CHANGED, &is_config_changed);
+
+          _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+          err_code = ia_drc_dec_api(
+              pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+              IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED, &is_config_changed);
+          _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+          err_code = (*p_ia_process_api)(
+              pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
+              IA_ENHAACPLUS_DEC_DRC_APPLY_CROSSFADE, &apply_crossfade);
+
+          _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+          err_code = ia_drc_dec_api(
+              pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+              IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE, &apply_crossfade);
+          _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+          if (is_config_changed == 1) {
+            VOID *p_array[2][16];
+            WORD32 ii;
+            WORD32 num_elements;
+            WORD32 num_config_ext;
+            WORD32 buf_sizes[2][16];
+            WORD32 bit_str_fmt = 1;
+
+            memset(buf_sizes, 0, 32 * sizeof(WORD32));
+
+            err_code = (*p_ia_process_api)(
+                pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
+                IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_BUF_SIZES, &buf_sizes[0][0]);
+            _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+            err_code = (*p_ia_process_api)(
+                pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
+                IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR, &p_array);
+            _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+            err_code =
+                ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_INIT,
+                               IA_CMD_TYPE_INIT_SET_BUFF_PTR, 0);
+
+            _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+            err_code = (*p_ia_process_api)(
+                pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
+                IA_ENHAACPLUS_DEC_CONFIG_NUM_ELE, &num_elements);
+            _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+            err_code = (*p_ia_process_api)(
+                pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM,
+                IA_ENHAACPLUS_DEC_CONFIG_NUM_CONFIG_EXT, &num_config_ext);
+            _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+            for (ii = 0; ii < num_config_ext; ii++) {
+              /*copy loudness bitstream*/
+              if (buf_sizes[0][ii] > 0) {
+                memcpy(drc_ip_buf, p_array[0][ii], buf_sizes[0][ii]);
+
+                /*Set bitstream_split_format */
+                err_code = ia_drc_dec_api(
+                    pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+                    IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt);
+
+                /* Set number of bytes to be processed */
+                err_code = ia_drc_dec_api(pv_ia_drc_process_api_obj,
+                                          IA_API_CMD_SET_INPUT_BYTES_IL_BS, 0,
+                                          &buf_sizes[0][ii]);
+
+                _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+                /* Execute process */
+                err_code =
+                    ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_INIT,
+                                   IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF, NULL);
+
+                _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+                drc_flag = 1;
+              }
+            }
+
+            for (ii = 0; ii < num_elements; ii++) {
+              /*copy config bitstream*/
+              if (buf_sizes[1][ii] > 0) {
+                memcpy(drc_ip_buf, p_array[1][ii], buf_sizes[1][ii]);
+
+                /*Set bitstream_split_format */
+                err_code = ia_drc_dec_api(
+                    pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM,
+                    IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt);
+
+                /* Set number of bytes to be processed */
+                err_code = ia_drc_dec_api(pv_ia_drc_process_api_obj,
+                                          IA_API_CMD_SET_INPUT_BYTES_IC_BS, 0,
+                                          &buf_sizes[1][ii]);
+
+                _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+                /* Execute process */
+                err_code =
+                    ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_INIT,
+                                   IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF, NULL);
+
+                _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
+
+                drc_flag = 1;
+              }
+            }
+          }
+
+          memcpy(drc_ip_buf, pb_out_buf + preroll_frame_offset, i_out_bytes);
+          preroll_frame_offset += i_out_bytes;
+
           err_code =
               ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_EXECUTE,
                              IA_CMD_TYPE_DO_EXECUTE, NULL);
@@ -1790,7 +2055,8 @@
         if (i_total_bytes <= skip_samples * i_num_chan * (i_pcm_wd_sz >> 3)) {
           err_code =
               (*p_get_config_param)(pv_ia_process_api_obj, &i_samp_freq,
-                                    &i_num_chan, &i_pcm_wd_sz, &i_channel_mask);
+                                    &i_num_chan, &i_pcm_wd_sz, &i_channel_mask,
+                                    &i_sbr_mode, &ui_aot);
 
           write_flag = 0;
         } else {
@@ -1828,23 +2094,23 @@
 #endif
 #else
 #ifndef ARM_PROFILE_BOARD
+      if (i_sbr_mode && (ui_aot < 23)) {
+        if (frame_counter != 0) {
       fwrite(pb_out_buf + ixheaacd_drc_offset, sizeof(WORD8), i_out_bytes,
              g_pf_out);
       fflush(g_pf_out);
+        }
+      } else {
+      fwrite(pb_out_buf + ixheaacd_drc_offset, sizeof(WORD8), i_out_bytes,
+             g_pf_out);
+      fflush(g_pf_out);
+      }
 #endif
 #endif
     }
 
     frame_counter++;
 
-#ifdef _DEBUG
-    if (frame_counter == 80) frame_counter = frame_counter;
-// ui_exec_done=1;
-// frame_counter = frame_counter;
-
-// printf("frame_counter = %d\n", frame_counter);
-#endif
-
 #ifdef ARM_PROFILE_HW
     if (i_out_bytes != 0) {
       int i_out_samples = i_out_bytes >> 2;
@@ -1871,7 +2137,7 @@
 #endif
 
     /* Do till the process execution is done */
-  } while (!ui_exec_done);
+  } while (!ui_exec_done && !fatal_error_chk);
 
 #ifdef ARM_PROFILE_HW
   fprintf(stdout, "\n Peak MCPS = %f\n", Peak_b);
@@ -1879,9 +2145,9 @@
   fprintf(stdout, " Peak frame = %d\n", Peak_frame_b);
 #endif
   fprintf(stderr, "TOTAL FRAMES : [%5d] \n", frame_counter);
-
   err_code = (*p_get_config_param)(pv_ia_process_api_obj, &i_samp_freq,
-                                   &i_num_chan, &i_pcm_wd_sz, &i_channel_mask);
+                                   &i_num_chan, &i_pcm_wd_sz, &i_channel_mask,
+                                   &i_sbr_mode, &ui_aot);
   _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code);
 
 #ifdef WAV_HEADER
@@ -1922,62 +2188,97 @@
 /*****************************************************************************/
 
 void print_usage() {
+#ifdef DISPLAY_MESSAGE
+  ia_lib_info_struct str_lib_info = {0};
+  ixheaacd_get_lib_id_strings(&str_lib_info);
+
+  ia_display_id_message(str_lib_info.p_lib_name, str_lib_info.p_version_num);
+#endif
   printf("\n Usage \n");
-  printf("\n <exceutable> -ifile:<input_file> -ofile:<out_file> [options]\n");
+  printf("\n <executable> -ifile:<input_file> -imeta:<meta_data_file> -ofile:<output_file> "
+         "[options]\n");
   printf("\n[options] can be,");
+  printf("\n[-mp4:<mp4_flag>]");
   printf("\n[-pcmsz:<pcmwordsize>]");
   printf("\n[-dmix:<down_mix>]");
-#ifdef RESAMPLE_SUPPORT
-  /* By default not available */
-  printf("\n[-f08:<out_08khz>]");
-  printf("\n[-f16:<out_16khz>]");
-#endif
+  printf("\n[-esbr_hq:<esbr_hq_flag>]");
+  printf("\n[-esbr_ps:<esbr_ps_flag>]");
   printf("\n[-tostereo:<interleave_to_stereo>]");
   printf("\n[-dsample:<down_sample_sbr>]");
-  printf("\n[-fs:<RAW_sample_rate>]");
+  printf("\n[-drc_cut_fac:<drc_cut_factor>]");
+  printf("\n[-drc_boost_fac:<drc_boost_factor>]");
+  printf("\n[-drc_target_level:<drc_target_level>]");
+  printf("\n[-drc_heavy_comp:<drc_heavy_compression>]");
+  printf("\n[-effect:<effect_type>]");
+  printf("\n[-target_loudness:<target_loudness>]");
   printf("\n[-nosync:<disable_sync>]");
   printf("\n[-sbrup:<auto_sbr_upsample>]");
-
+  printf("\n[-flflag:<framelength_flag>}");
+  printf("\n[-fs:<RAW_sample_rate>]");
   printf("\n[-maxchannel:<maximum_num_channels>]");
 #ifdef MULTICHANNEL_ENABLE
   printf("\n[-coupchannel:<coupling_channel>]");
   printf("\n[-downmix:<down_mix_stereo>]");
 #endif
-
-  printf("\n\nwhere, \n  <inputfile> is the input AAC file name");
-  printf("\n  <outputfile> is the output file name");
-  printf("\n  <pcmwordsize> is the bits per sample info. Only 16 is valid");
-
-  printf("\n  <down_mix> is to enable/disable always mono output. Default 0");
-#ifdef RESAMPLE_SUPPORT
-  printf("\n  <out_08khz> is to enable/disable 8 kHz output. Default 0 ");
-  printf("\n  <out_16khz> is to enable/disable 16 kHz output. Default 0 ");
-#endif
+  printf("\n[-fs480:<ld_frame_size>]");
+  printf("\n[-ld_testing:<ld_testing_flag>]");
+  printf("\n[-peak_limiter_off:<peak_limiter_off_flag>]");
+  printf("\n[-err_conceal:<error_concealment_flag>]");
+  printf("\n\nwhere, \n  <input_file> is the input AAC/HEAACv1/HEAACv2/USAC file name");
+  printf("\n  <meta_data_file> is a text file which contains metadata.");
+  printf("\n   To be given when -mp4:1 is enabled");
+  printf("\n  <output_file> is the output file name");
+  printf("\n  <mp4_flag> is a flag that should be set to 1 when passing ");
+  printf("\n  raw stream along with meta data text file ");
+  printf("\n  <pcmwordsize> is the bits per sample info. 16/24");
+  printf("\n  <down_mix> is to enable/disable always mono output. Default 1");
+  printf("\n  <esbr_hq_flag> is to enable/disable high quality eSBR. Default 0");
+  printf("\n  <esbr_ps_flag> is to indicate eSBR with PS. Default 0");
   printf("\n  <interleave_to_stereo> is to enable/disable always ");
   printf("\n    interleaved to stereo output. Default 1 ");
   printf("\n  <down_sample_sbr> is to enable/disable down-sampled SBR ");
   printf("\n    output. Default auto identification from header");
-  printf("\n  <RAW_sample_rate> is to indicate the core AAC sample rate for");
-  printf("\n    a RAW stream. If this is specified no other file format");
-  printf("\n    headers are searched for. \n");
+  printf("\n  <drc_cut_factor> is to set DRC cut factor value. Default value is 0");
+  printf("\n  <drc_boost_factor> is to set DRC boost factor. Default value is 0");
+  printf("\n  <drc_target_level> is to set DRC target reference level.");
+  printf("\n    Default value is 108");
+  printf("\n  <drc_heavy_compression> is to enable / disable DRC heavy compression.");
+  printf("\n    Default value is 0");
+  printf("\n  <effect_type> is set DRC effect type. Default value is 0");
+  printf("\n  <target_loudness> is to set target loudness level.");
+  printf("\n    Default value is -24");
   printf("\n  <disable_sync> is to disable the ADTS/ADIF sync search i.e");
   printf("\n    when enabled the decoder expects the header to ");
   printf("\n    be at the start of input buffer. Default 0");
-  printf(
-      "\n  <auto_sbr_upsample> is to enable(1) or disable(0) auto SBR "
-      "upsample ");
-  printf(
-      "\n    in case of stream changing from SBR present to SBR not present. "
-      "Default 1");
+  printf("\n  <auto_sbr_upsample> is to enable(1) or disable(0) auto SBR "
+         "upsample ");
+  printf("\n    in case of stream changing from SBR present to SBR not present. "
+         "Default 1");
+  printf("\n  <framelength_flag> is flag for decoding framelength of 1024 or 960.");
+  printf("\n    1 to decode 960 frame length, 0 to decode 1024 frame length");
+  printf("\n    Frame length value in the GA header will override this option.");
+  printf("\n    Default 0  ");
+  printf("\n  <RAW_sample_rate> is to indicate the core AAC sample rate for");
+  printf("\n    a RAW stream. If this is specified no other file format");
+  printf("\n    headers are searched for.");
   printf("\n  <maximum_num_channels> is the number of maxiumum ");
-  printf("\n    channels the input may have. Default is 6 (5.1)");
-
+  printf("\n    channels the input may have. Default is 6 ");
+  printf("\n    for multichannel libraries and 2 for stereo libraries");
 #ifdef MULTICHANNEL_ENABLE
   printf("\n  <coupling_channel> is element instance tag of ");
   printf("\n    independent coupling channel to be mixed. Default is 0");
   printf("\n  <down_mix_stereo> is flag for Downmix. Give 1 to");
   printf("\n    get stereo (downmix) output. Default is 0");
 #endif
+  printf("\n  <ld_frame_size> is to indicate ld frame size.");
+  printf("\n   0 is for 512 frame length, 1 is for 480 frame length.");
+  printf("\n    Default value is 512 (0)");
+  printf("\n  <ld_testing_flag> is to enable / disable ld decoder testing.");
+  printf("\n    Default value is 0");
+  printf("\n  <peak_limiter_off_flag> is to enable / disable peak limiter.");
+  printf("\n    Default value is 0");
+  printf("\n  <error_concealment_flag> is to enable / disable error concealment.");
+  printf("\n    Default value is 0\n\n");
 }
 
 /*******************************************************************************/
@@ -2004,6 +2305,7 @@
 /*        DD MM YYYY       Author                Changes */
 /*        04 09 2005       Ittiam                Created */
 /*                                                                             */
+/*                                                                             */
 /*******************************************************************************/
 
 int main(WORD32 argc, char *argv[]) {
diff --git a/test/ixheaacd_metadata_read.c b/test/ixheaacd_metadata_read.c
index 6eda6a0..1b6ea88 100644
--- a/test/ixheaacd_metadata_read.c
+++ b/test/ixheaacd_metadata_read.c
@@ -155,7 +155,7 @@
 }
 
 int get_start_offset_in_samples(metadata_info meta_info) {
-  return meta_info.startOffsetInSamples[0];
+  return (meta_info.startOffsetInSamples[0] + 2048);
 }
 
 int get_play_time_in_samples(metadata_info meta_info) {