2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 ** Any non-GPL usage of this software or parts of this software is strictly
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
25 ** $Id: ssr_fb.c,v 1.13 2004/09/04 14:56:29 menno Exp $
41 fb_info
*ssr_filter_bank_init(uint16_t frame_len
)
43 uint16_t nshort
= frame_len
/8;
45 fb_info
*fb
= (fb_info
*)faad_malloc(sizeof(fb_info
));
46 memset(fb
, 0, sizeof(fb_info
));
49 fb
->mdct256
= faad_mdct_init(2*nshort
);
50 fb
->mdct2048
= faad_mdct_init(2*frame_len
);
52 fb
->long_window
[0] = sine_long_256
;
53 fb
->short_window
[0] = sine_short_32
;
54 fb
->long_window
[1] = kbd_long_256
;
55 fb
->short_window
[1] = kbd_short_32
;
60 void ssr_filter_bank_end(fb_info
*fb
)
62 faad_mdct_end(fb
->mdct256
);
63 faad_mdct_end(fb
->mdct2048
);
65 if (fb
) faad_free(fb
);
68 static INLINE
void imdct_ssr(fb_info
*fb
, real_t
*in_data
,
69 real_t
*out_data
, uint16_t len
)
83 faad_imdct(mdct
, in_data
, out_data
);
86 /* NON-overlapping inverse filterbank for use with SSR */
87 void ssr_ifilter_bank(fb_info
*fb
, uint8_t window_sequence
, uint8_t window_shape
,
88 uint8_t window_shape_prev
, real_t
*freq_in
,
89 real_t
*time_out
, uint16_t frame_len
)
95 real_t
*window_long_prev
;
97 real_t
*window_short_prev
;
99 uint16_t nlong
= frame_len
;
100 uint16_t nshort
= frame_len
/8;
101 uint16_t trans
= nshort
/2;
103 uint16_t nflat_ls
= (nlong
-nshort
)/2;
105 transf_buf
= (real_t
*)faad_malloc(2*nlong
*sizeof(real_t
));
107 window_long
= fb
->long_window
[window_shape
];
108 window_long_prev
= fb
->long_window
[window_shape_prev
];
109 window_short
= fb
->short_window
[window_shape
];
110 window_short_prev
= fb
->short_window
[window_shape_prev
];
112 switch (window_sequence
)
114 case ONLY_LONG_SEQUENCE
:
115 imdct_ssr(fb
, freq_in
, transf_buf
, 2*nlong
);
116 for (i
= nlong
-1; i
>= 0; i
--)
118 time_out
[i
] = MUL_R_C(transf_buf
[i
],window_long_prev
[i
]);
119 time_out
[nlong
+i
] = MUL_R_C(transf_buf
[nlong
+i
],window_long
[nlong
-1-i
]);
123 case LONG_START_SEQUENCE
:
124 imdct_ssr(fb
, freq_in
, transf_buf
, 2*nlong
);
125 for (i
= 0; i
< nlong
; i
++)
126 time_out
[i
] = MUL_R_C(transf_buf
[i
],window_long_prev
[i
]);
127 for (i
= 0; i
< nflat_ls
; i
++)
128 time_out
[nlong
+i
] = transf_buf
[nlong
+i
];
129 for (i
= 0; i
< nshort
; i
++)
130 time_out
[nlong
+nflat_ls
+i
] = MUL_R_C(transf_buf
[nlong
+nflat_ls
+i
],window_short
[nshort
-i
-1]);
131 for (i
= 0; i
< nflat_ls
; i
++)
132 time_out
[nlong
+nflat_ls
+nshort
+i
] = 0;
135 case EIGHT_SHORT_SEQUENCE
:
136 imdct_ssr(fb
, freq_in
+0*nshort
, transf_buf
+2*nshort
*0, 2*nshort
);
137 imdct_ssr(fb
, freq_in
+1*nshort
, transf_buf
+2*nshort
*1, 2*nshort
);
138 imdct_ssr(fb
, freq_in
+2*nshort
, transf_buf
+2*nshort
*2, 2*nshort
);
139 imdct_ssr(fb
, freq_in
+3*nshort
, transf_buf
+2*nshort
*3, 2*nshort
);
140 imdct_ssr(fb
, freq_in
+4*nshort
, transf_buf
+2*nshort
*4, 2*nshort
);
141 imdct_ssr(fb
, freq_in
+5*nshort
, transf_buf
+2*nshort
*5, 2*nshort
);
142 imdct_ssr(fb
, freq_in
+6*nshort
, transf_buf
+2*nshort
*6, 2*nshort
);
143 imdct_ssr(fb
, freq_in
+7*nshort
, transf_buf
+2*nshort
*7, 2*nshort
);
144 for(i
= nshort
-1; i
>= 0; i
--)
146 time_out
[i
+0*nshort
] = MUL_R_C(transf_buf
[nshort
*0+i
],window_short_prev
[i
]);
147 time_out
[i
+1*nshort
] = MUL_R_C(transf_buf
[nshort
*1+i
],window_short
[i
]);
148 time_out
[i
+2*nshort
] = MUL_R_C(transf_buf
[nshort
*2+i
],window_short_prev
[i
]);
149 time_out
[i
+3*nshort
] = MUL_R_C(transf_buf
[nshort
*3+i
],window_short
[i
]);
150 time_out
[i
+4*nshort
] = MUL_R_C(transf_buf
[nshort
*4+i
],window_short_prev
[i
]);
151 time_out
[i
+5*nshort
] = MUL_R_C(transf_buf
[nshort
*5+i
],window_short
[i
]);
152 time_out
[i
+6*nshort
] = MUL_R_C(transf_buf
[nshort
*6+i
],window_short_prev
[i
]);
153 time_out
[i
+7*nshort
] = MUL_R_C(transf_buf
[nshort
*7+i
],window_short
[i
]);
154 time_out
[i
+8*nshort
] = MUL_R_C(transf_buf
[nshort
*8+i
],window_short_prev
[i
]);
155 time_out
[i
+9*nshort
] = MUL_R_C(transf_buf
[nshort
*9+i
],window_short
[i
]);
156 time_out
[i
+10*nshort
] = MUL_R_C(transf_buf
[nshort
*10+i
],window_short_prev
[i
]);
157 time_out
[i
+11*nshort
] = MUL_R_C(transf_buf
[nshort
*11+i
],window_short
[i
]);
158 time_out
[i
+12*nshort
] = MUL_R_C(transf_buf
[nshort
*12+i
],window_short_prev
[i
]);
159 time_out
[i
+13*nshort
] = MUL_R_C(transf_buf
[nshort
*13+i
],window_short
[i
]);
160 time_out
[i
+14*nshort
] = MUL_R_C(transf_buf
[nshort
*14+i
],window_short_prev
[i
]);
161 time_out
[i
+15*nshort
] = MUL_R_C(transf_buf
[nshort
*15+i
],window_short
[i
]);
165 case LONG_STOP_SEQUENCE
:
166 imdct_ssr(fb
, freq_in
, transf_buf
, 2*nlong
);
167 for (i
= 0; i
< nflat_ls
; i
++)
169 for (i
= 0; i
< nshort
; i
++)
170 time_out
[nflat_ls
+i
] = MUL_R_C(transf_buf
[nflat_ls
+i
],window_short_prev
[i
]);
171 for (i
= 0; i
< nflat_ls
; i
++)
172 time_out
[nflat_ls
+nshort
+i
] = transf_buf
[nflat_ls
+nshort
+i
];
173 for (i
= 0; i
< nlong
; i
++)
174 time_out
[nlong
+i
] = MUL_R_C(transf_buf
[nlong
+i
],window_long
[nlong
-1-i
]);
178 faad_free(transf_buf
);