aboutsummaryrefslogtreecommitdiff
path: root/decoder/ixheaacd_imdct.c
diff options
context:
space:
mode:
Diffstat (limited to 'decoder/ixheaacd_imdct.c')
-rw-r--r--decoder/ixheaacd_imdct.c88
1 files changed, 53 insertions, 35 deletions
diff --git a/decoder/ixheaacd_imdct.c b/decoder/ixheaacd_imdct.c
index d162cea..08a89fc 100644
--- a/decoder/ixheaacd_imdct.c
+++ b/decoder/ixheaacd_imdct.c
@@ -135,11 +135,12 @@ void ixheaacd_calc_post_twid_dec(WORD32 *xptr, WORD32 *r_ptr, WORD32 *i_ptr,
}
}
-static void ixheaacd_fft_based_imdct(WORD32 *data, WORD32 npoints,
- WORD32 *preshift, WORD32 *tmp_data) {
+static WORD32 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;
@@ -164,17 +165,20 @@ static void ixheaacd_fft_based_imdct(WORD32 *data, WORD32 npoints,
}
(*ixheaacd_calc_pre_twid)(data, data_r, data_i, nlength, cos_ptr, sin_ptr);
- ixheaacd_complex_fft(data_r, data_i, nlength, 1, preshift);
+ err = ixheaacd_complex_fft(data_r, data_i, nlength, 1, preshift);
+ if (err) return err;
(*ixheaacd_calc_post_twid)(data, data_r, data_i, nlength, cos_ptr, sin_ptr);
+ return err;
}
#define N_LONG_LEN_MAX 1024
-void ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift,
- WORD32 *tmp_data) {
+WORD32 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;
@@ -188,13 +192,16 @@ void ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift,
preshift++;
}
- ixheaacd_fft_based_imdct(imdct_in, npoints / 2, &preshift, tmp_data);
+ err = ixheaacd_fft_based_imdct(imdct_in, npoints / 2, &preshift, tmp_data);
+ if (err) return err;
preshift += 2;
*qshift -= preshift;
+ return err;
}
-WORD8 ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch,
- WORD32 n_long, WORD32 lfac, WORD32 *fac_idata) {
+IA_ERRORCODE ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch,
+ WORD32 n_long, WORD32 lfac,
+ WORD32 *fac_idata, WORD8 *q_fac) {
WORD32 gain_fac, scale, k, *i_aq, itemp = 0, *izir;
WORD32 int_aq[ORDER + 1] = {0};
WORD32 intzir[2 * LEN_FRAME] = {0};
@@ -205,6 +212,7 @@ WORD8 ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch,
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];
@@ -273,9 +281,12 @@ WORD8 ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch,
x_in[lfac / 2 + k] = fac_data[lfac - 2 * k];
}
- ixheaacd_fr_alias_cnx_fix(x_in, n_long / 4, lfac, i_aq, izir, fac_idata + 16,
- &qshift1, qshift2, qshift3, &preshift, ptr_scratch);
+ 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;
preshift += 4;
+ *q_fac = (qshift1 - preshift);
if (acelp_in != NULL) {
for (k = 0; k < 2 * lfac; k++) {
@@ -283,13 +294,13 @@ WORD8 ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch,
ixheaacd_mul32_sh(fac_idata[k + 16], gain_fac, (WORD8)(scale));
}
}
- return (qshift1 - preshift);
+ return IA_NO_ERROR;
}
-static WORD32 ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data,
- WORD32 i_ch, WORD32 *fac_data_out,
- offset_lengths *ixheaacd_drc_offset,
- WORD8 fac_q) {
+static IA_ERRORCODE ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data,
+ WORD32 i_ch, WORD32 *fac_data_out,
+ offset_lengths *ixheaacd_drc_offset,
+ WORD8 fac_q) {
FLOAT32 qfac;
WORD32 overlap_data_buf[2 * N_LONG_LEN_MAX] = {0};
WORD32 *window_short, k, *window_short_prev_ptr;
@@ -324,9 +335,10 @@ static WORD32 ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data,
for (k = 0; k < 8; k++) {
shiftp = input_q;
- ixheaacd_acelp_imdct(p_in_ibuffer + (k * ixheaacd_drc_offset->n_short),
- 2 * ixheaacd_drc_offset->n_short, &shiftp,
- scratch_mem);
+ err_code = 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 =
@@ -414,10 +426,10 @@ static WORD32 ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data,
return 0;
}
-static WORD32 ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data,
- WORD32 i_ch, WORD32 *fac_idata,
- offset_lengths *ixheaacd_drc_offset,
- WORD8 fac_q) {
+static IA_ERRORCODE ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data,
+ WORD32 i_ch, WORD32 *fac_idata,
+ offset_lengths *ixheaacd_drc_offset,
+ WORD8 fac_q) {
FLOAT32 qfac;
WORD32 *window_long_prev, k, i, *window_short_prev_ptr;
@@ -443,8 +455,9 @@ static WORD32 ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data,
ixheaacd_normalize(p_in_ibuffer, max_shift, ixheaacd_drc_offset->n_long);
shiftp = max_shift + 6;
- ixheaacd_acelp_imdct(p_in_ibuffer, 2 * ixheaacd_drc_offset->n_long, &shiftp,
- scratch_mem);
+ err_code = 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);
@@ -518,6 +531,7 @@ WORD32 ixheaacd_fd_frm_dec(ia_usac_data_struct *usac_data, WORD32 i_ch) {
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;
ixheaacd_drc_offset.n_long = usac_data->ccfl;
ixheaacd_drc_offset.n_short = ixheaacd_drc_offset.n_long >> 3;
@@ -540,17 +554,21 @@ WORD32 ixheaacd_fd_frm_dec(ia_usac_data_struct *usac_data, WORD32 i_ch) {
ixheaacd_drc_offset.n_trans_ls = ixheaacd_drc_offset.n_short;
}
- if (fac_apply)
- fac_q = ixheaacd_cal_fac_data(usac_data, i_ch, ixheaacd_drc_offset.n_long,
- ixheaacd_drc_offset.lfac, fac_idata);
-
- if (window_sequence != EIGHT_SHORT_SEQUENCE)
- ixheaacd_fd_imdct_long(usac_data, i_ch, fac_idata, &ixheaacd_drc_offset,
- fac_q);
+ if (fac_apply) {
+ 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;
+ }
- else
- ixheaacd_fd_imdct_short(usac_data, i_ch, fac_idata, &ixheaacd_drc_offset,
- fac_q);
+ if (window_sequence != EIGHT_SHORT_SEQUENCE) {
+ err = ixheaacd_fd_imdct_long(usac_data, i_ch, fac_idata,
+ &ixheaacd_drc_offset, fac_q);
+ if (err) return err;
+ } else {
+ err = ixheaacd_fd_imdct_short(usac_data, i_ch, fac_idata,
+ &ixheaacd_drc_offset, fac_q);
+ if (err) return err;
+ }
- return 0;
+ return err;
}