blob: 9e537a16fdc20305a84957b112c55685b2a680e3 [file] [log] [blame]
/******************************************************************************
*
* 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 "ixheaac_type_def.h"
#include "ixheaacd_bitbuffer.h"
#include "ixheaacd_cnst.h"
#include "ixheaacd_mps_aac_struct.h"
#include "ixheaacd_mps_res_rom.h"
#include "ixheaac_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;
}