1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 1999-2001 VideoLAN
5 * $Id: imdct.c,v 1.1 2002/08/04 17:23:42 sam Exp $
7 * Authors: Michel Kaempf <maxx@via.ecp.fr>
8 * Aaron Holtzman <aholtzma@engr.uvic.ca>
9 * Renaud Dartus <reno@videolan.org>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
24 *****************************************************************************/
26 /*****************************************************************************
28 *****************************************************************************/
29 #include <string.h> /* memcpy() */
35 #include <vlc/decoder.h>
42 # define M_PI 3.14159265358979323846
45 void E_( imdct_init )(imdct_t * p_imdct)
48 float scale = 181.019;
50 p_imdct->pf_imdct_init( p_imdct );
52 /* More twiddle factors to turn IFFT into IMDCT */
53 for (i=0; i < 64; i++) {
54 p_imdct->xcos2[i] = cos(2.0f * M_PI * (8*i+1)/(4*N)) * scale;
55 p_imdct->xsin2[i] = sin(2.0f * M_PI * (8*i+1)/(4*N)) * scale;
59 void imdct (a52dec_t * p_a52dec, s16 * buffer)
63 float *center=NULL, *left, *right, *left_sur, *right_sur;
64 float *delay_left, *delay_right;
65 float *delay1_left, *delay1_right, *delay1_center, *delay1_sr, *delay1_sl;
66 float right_tmp, left_tmp;
67 void (*do_imdct)(imdct_t * p_imdct, float data[], float delay[]);
69 /* test if dm in frequency is doable */
70 if (!(doable = p_a52dec->audblk.blksw[0]))
72 do_imdct = p_a52dec->p_imdct->pf_imdct_512;
76 do_imdct = p_a52dec->p_imdct->pf_imdct_256;
79 /* downmix in the frequency domain if all the channels
80 * use the same imdct */
81 for (i=0; i < p_a52dec->bsi.nfchans; i++)
83 if (doable != p_a52dec->audblk.blksw[i])
92 /* dowmix first and imdct */
93 switch(p_a52dec->bsi.acmod)
96 p_a52dec->p_downmix->pf_downmix_3f_2r_to_2ch (p_a52dec->samples, &p_a52dec->dm_par);
99 p_a52dec->p_downmix->pf_downmix_2f_2r_to_2ch (p_a52dec->samples, &p_a52dec->dm_par);
102 p_a52dec->p_downmix->pf_downmix_3f_1r_to_2ch (p_a52dec->samples, &p_a52dec->dm_par);
105 p_a52dec->p_downmix->pf_downmix_2f_1r_to_2ch (p_a52dec->samples, &p_a52dec->dm_par);
108 p_a52dec->p_downmix->pf_downmix_3f_0r_to_2ch (p_a52dec->samples, &p_a52dec->dm_par);
113 // if (p_a52dec->bsi.acmod == 1)
114 center = p_a52dec->samples;
115 // else if (p_a52dec->bsi.acmod == 0)
116 // center = samples[config.dual_mono_ch_sel];
117 do_imdct(p_a52dec->p_imdct, center, p_a52dec->p_imdct->delay); /* no downmix*/
119 p_a52dec->p_downmix->pf_stream_sample_1ch_to_s16 (buffer, center);
125 do_imdct (p_a52dec->p_imdct, p_a52dec->samples, p_a52dec->p_imdct->delay);
126 do_imdct (p_a52dec->p_imdct, p_a52dec->samples+256, p_a52dec->p_imdct->delay+256);
127 p_a52dec->p_downmix->pf_stream_sample_2ch_to_s16(buffer, p_a52dec->samples, p_a52dec->samples+256);
130 /* imdct and then downmix
131 * delay and samples should be saved and mixed
132 * fprintf(stderr, "time domain downmix\n"); */
133 for (i=0; i<p_a52dec->bsi.nfchans; i++)
135 if (p_a52dec->audblk.blksw[i])
137 /* There is only a C function */
138 p_a52dec->p_imdct->pf_imdct_256_nol( p_a52dec->p_imdct,
139 p_a52dec->samples+256*i, p_a52dec->p_imdct->delay1+256*i );
143 p_a52dec->p_imdct->pf_imdct_512_nol( p_a52dec->p_imdct,
144 p_a52dec->samples+256*i, p_a52dec->p_imdct->delay1+256*i );
148 /* mix the sample, overlap */
149 switch(p_a52dec->bsi.acmod)
152 left = p_a52dec->samples;
153 center = p_a52dec->samples+256;
154 right = p_a52dec->samples+2*256;
155 left_sur = p_a52dec->samples+3*256;
156 right_sur = p_a52dec->samples+4*256;
157 delay_left = p_a52dec->p_imdct->delay;
158 delay_right = p_a52dec->p_imdct->delay+256;
159 delay1_left = p_a52dec->p_imdct->delay1;
160 delay1_center = p_a52dec->p_imdct->delay1+256;
161 delay1_right = p_a52dec->p_imdct->delay1+2*256;
162 delay1_sl = p_a52dec->p_imdct->delay1+3*256;
163 delay1_sr = p_a52dec->p_imdct->delay1+4*256;
165 for (i = 0; i < 256; i++) {
166 left_tmp = p_a52dec->dm_par.unit * *left++ + p_a52dec->dm_par.clev * *center + p_a52dec->dm_par.slev * *left_sur++;
167 right_tmp= p_a52dec->dm_par.unit * *right++ + p_a52dec->dm_par.clev * *center++ + p_a52dec->dm_par.slev * *right_sur++;
168 *buffer++ = (s16)(left_tmp + *delay_left);
169 *buffer++ = (s16)(right_tmp + *delay_right);
170 *delay_left++ = p_a52dec->dm_par.unit * *delay1_left++ + p_a52dec->dm_par.clev * *delay1_center + p_a52dec->dm_par.slev * *delay1_sl++;
171 *delay_right++ = p_a52dec->dm_par.unit * *delay1_right++ + p_a52dec->dm_par.clev * *center++ + p_a52dec->dm_par.slev * *delay1_sr++;
175 left = p_a52dec->samples;
176 right = p_a52dec->samples+256;
177 left_sur = p_a52dec->samples+2*256;
178 right_sur = p_a52dec->samples+3*256;
179 delay_left = p_a52dec->p_imdct->delay;
180 delay_right = p_a52dec->p_imdct->delay+256;
181 delay1_left = p_a52dec->p_imdct->delay1;
182 delay1_right = p_a52dec->p_imdct->delay1+256;
183 delay1_sl = p_a52dec->p_imdct->delay1+2*256;
184 delay1_sr = p_a52dec->p_imdct->delay1+3*256;
186 for (i = 0; i < 256; i++) {
187 left_tmp = p_a52dec->dm_par.unit * *left++ + p_a52dec->dm_par.slev * *left_sur++;
188 right_tmp= p_a52dec->dm_par.unit * *right++ + p_a52dec->dm_par.slev * *right_sur++;
189 *buffer++ = (s16)(left_tmp + *delay_left);
190 *buffer++ = (s16)(right_tmp + *delay_right);
191 *delay_left++ = p_a52dec->dm_par.unit * *delay1_left++ + p_a52dec->dm_par.slev * *delay1_sl++;
192 *delay_right++ = p_a52dec->dm_par.unit * *delay1_right++ + p_a52dec->dm_par.slev * *delay1_sr++;
196 left = p_a52dec->samples;
197 center = p_a52dec->samples+256;
198 right = p_a52dec->samples+2*256;
199 right_sur = p_a52dec->samples+3*256;
200 delay_left = p_a52dec->p_imdct->delay;
201 delay_right = p_a52dec->p_imdct->delay+256;
202 delay1_left = p_a52dec->p_imdct->delay1;
203 delay1_center = p_a52dec->p_imdct->delay1+256;
204 delay1_right = p_a52dec->p_imdct->delay1+2*256;
205 delay1_sl = p_a52dec->p_imdct->delay1+3*256;
207 for (i = 0; i < 256; i++) {
208 left_tmp = p_a52dec->dm_par.unit * *left++ + p_a52dec->dm_par.clev * *center - p_a52dec->dm_par.slev * *right_sur;
209 right_tmp= p_a52dec->dm_par.unit * *right++ + p_a52dec->dm_par.clev * *center++ + p_a52dec->dm_par.slev * *right_sur++;
210 *buffer++ = (s16)(left_tmp + *delay_left);
211 *buffer++ = (s16)(right_tmp + *delay_right);
212 *delay_left++ = p_a52dec->dm_par.unit * *delay1_left++ + p_a52dec->dm_par.clev * *delay1_center + p_a52dec->dm_par.slev * *delay1_sl;
213 *delay_right++ = p_a52dec->dm_par.unit * *delay1_right++ + p_a52dec->dm_par.clev * *center++ + p_a52dec->dm_par.slev * *delay1_sl++;
217 left = p_a52dec->samples;
218 right = p_a52dec->samples+256;
219 right_sur = p_a52dec->samples+2*256;
220 delay_left = p_a52dec->p_imdct->delay;
221 delay_right = p_a52dec->p_imdct->delay+256;
222 delay1_left = p_a52dec->p_imdct->delay1;
223 delay1_right = p_a52dec->p_imdct->delay1+256;
224 delay1_sl = p_a52dec->p_imdct->delay1+2*256;
226 for (i = 0; i < 256; i++) {
227 left_tmp = p_a52dec->dm_par.unit * *left++ - p_a52dec->dm_par.slev * *right_sur;
228 right_tmp= p_a52dec->dm_par.unit * *right++ + p_a52dec->dm_par.slev * *right_sur++;
229 *buffer++ = (s16)(left_tmp + *delay_left);
230 *buffer++ = (s16)(right_tmp + *delay_right);
231 *delay_left++ = p_a52dec->dm_par.unit * *delay1_left++ + p_a52dec->dm_par.slev * *delay1_sl;
232 *delay_right++ = p_a52dec->dm_par.unit * *delay1_right++ + p_a52dec->dm_par.slev * *delay1_sl++;
236 left = p_a52dec->samples;
237 center = p_a52dec->samples+256;
238 right = p_a52dec->samples+2*256;
239 delay_left = p_a52dec->p_imdct->delay;
240 delay_right = p_a52dec->p_imdct->delay+256;
241 delay1_left = p_a52dec->p_imdct->delay1;
242 delay1_center = p_a52dec->p_imdct->delay1+256;
243 delay1_right = p_a52dec->p_imdct->delay1+2*256;
245 for (i = 0; i < 256; i++) {
246 left_tmp = p_a52dec->dm_par.unit * *left++ + p_a52dec->dm_par.clev * *center;
247 right_tmp= p_a52dec->dm_par.unit * *right++ + p_a52dec->dm_par.clev * *center++;
248 *buffer++ = (s16)(left_tmp + *delay_left);
249 *buffer++ = (s16)(right_tmp + *delay_right);
250 *delay_left++ = p_a52dec->dm_par.unit * *delay1_left++ + p_a52dec->dm_par.clev * *delay1_center;
251 *delay_right++ = p_a52dec->dm_par.unit * *delay1_right++ + p_a52dec->dm_par.clev * *center++;
254 case 2: /* copy to output */
255 for (i = 0; i < 256; i++) {
256 *buffer++ = (s16) *(p_a52dec->samples+i);
257 *buffer++ = (s16) *(p_a52dec->samples+256+i);