1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 1999, 2000 VideoLAN
5 * $Id: ac3_imdct.c,v 1.20 2001/05/15 16:19: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 *****************************************************************************/
31 #include <string.h> /* memcpy() */
41 #include "stream_control.h"
42 #include "input_ext-dec.h"
44 #include "ac3_imdct.h"
45 #include "ac3_downmix.h"
46 #include "ac3_decoder.h"
49 # define M_PI 3.14159265358979323846
52 void imdct_init(imdct_t * p_imdct)
55 float scale = 181.019;
57 p_imdct->pf_imdct_init( p_imdct );
59 /* More twiddle factors to turn IFFT into IMDCT */
60 for (i=0; i < 64; i++) {
61 p_imdct->xcos2[i] = cos(2.0f * M_PI * (8*i+1)/(4*N)) * scale;
62 p_imdct->xsin2[i] = sin(2.0f * M_PI * (8*i+1)/(4*N)) * scale;
66 void imdct (ac3dec_t * p_ac3dec, s16 * buffer)
70 float *center=NULL, *left, *right, *left_sur, *right_sur;
71 float *delay_left, *delay_right;
72 float *delay1_left, *delay1_right, *delay1_center, *delay1_sr, *delay1_sl;
73 float right_tmp, left_tmp;
74 void (*do_imdct)(imdct_t * p_imdct, float data[], float delay[]);
76 /* test if dm in frequency is doable */
77 if (!(doable = p_ac3dec->audblk.blksw[0]))
79 do_imdct = p_ac3dec->imdct.pf_imdct_512;
83 do_imdct = p_ac3dec->imdct.pf_imdct_256;
86 /* downmix in the frequency domain if all the channels
87 * use the same imdct */
88 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
90 if (doable != p_ac3dec->audblk.blksw[i])
99 /* dowmix first and imdct */
100 switch(p_ac3dec->bsi.acmod)
103 p_ac3dec->downmix.pf_downmix_3f_2r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
106 p_ac3dec->downmix.pf_downmix_2f_2r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
109 p_ac3dec->downmix.pf_downmix_3f_1r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
112 p_ac3dec->downmix.pf_downmix_2f_1r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
115 p_ac3dec->downmix.pf_downmix_3f_0r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
120 // if (p_ac3dec->bsi.acmod == 1)
121 center = p_ac3dec->samples[0];
122 // else if (p_ac3dec->bsi.acmod == 0)
123 // center = samples[ac3_config.dual_mono_ch_sel];
124 do_imdct(&p_ac3dec->imdct, center, p_ac3dec->imdct.delay[0]); /* no downmix*/
126 p_ac3dec->downmix.pf_stream_sample_1ch_to_s16 (buffer, center);
132 do_imdct (&p_ac3dec->imdct, p_ac3dec->samples[0], p_ac3dec->imdct.delay[0]);
133 do_imdct (&p_ac3dec->imdct, p_ac3dec->samples[1], p_ac3dec->imdct.delay[1]);
134 p_ac3dec->downmix.pf_stream_sample_2ch_to_s16(buffer, p_ac3dec->samples[0], p_ac3dec->samples[1]);
137 /* imdct and then downmix
138 * delay and samples should be saved and mixed
139 * fprintf(stderr, "time domain downmix\n"); */
140 for (i=0; i<p_ac3dec->bsi.nfchans; i++)
142 if (p_ac3dec->audblk.blksw[i])
143 /* There is only a C function */
144 p_ac3dec->imdct.pf_imdct_256_nol (&p_ac3dec->imdct, p_ac3dec->samples[i], p_ac3dec->imdct.delay1[i]);
146 p_ac3dec->imdct.pf_imdct_512_nol (&p_ac3dec->imdct, p_ac3dec->samples[i], p_ac3dec->imdct.delay1[i]);
149 /* mix the sample, overlap */
150 switch(p_ac3dec->bsi.acmod)
153 left = p_ac3dec->samples[0];
154 center = p_ac3dec->samples[1];
155 right = p_ac3dec->samples[2];
156 left_sur = p_ac3dec->samples[3];
157 right_sur = p_ac3dec->samples[4];
158 delay_left = p_ac3dec->imdct.delay[0];
159 delay_right = p_ac3dec->imdct.delay[1];
160 delay1_left = p_ac3dec->imdct.delay1[0];
161 delay1_center = p_ac3dec->imdct.delay1[1];
162 delay1_right = p_ac3dec->imdct.delay1[2];
163 delay1_sl = p_ac3dec->imdct.delay1[3];
164 delay1_sr = p_ac3dec->imdct.delay1[4];
166 for (i = 0; i < 256; i++) {
167 left_tmp = p_ac3dec->dm_par.unit * *left++ + p_ac3dec->dm_par.clev * *center + p_ac3dec->dm_par.slev * *left_sur++;
168 right_tmp= p_ac3dec->dm_par.unit * *right++ + p_ac3dec->dm_par.clev * *center++ + p_ac3dec->dm_par.slev * *right_sur++;
169 *buffer++ = (s16)(left_tmp + *delay_left);
170 *buffer++ = (s16)(right_tmp + *delay_right);
171 *delay_left++ = p_ac3dec->dm_par.unit * *delay1_left++ + p_ac3dec->dm_par.clev * *delay1_center + p_ac3dec->dm_par.slev * *delay1_sl++;
172 *delay_right++ = p_ac3dec->dm_par.unit * *delay1_right++ + p_ac3dec->dm_par.clev * *center++ + p_ac3dec->dm_par.slev * *delay1_sr++;
176 left = p_ac3dec->samples[0];
177 right = p_ac3dec->samples[1];
178 left_sur = p_ac3dec->samples[2];
179 right_sur = p_ac3dec->samples[3];
180 delay_left = p_ac3dec->imdct.delay[0];
181 delay_right = p_ac3dec->imdct.delay[1];
182 delay1_left = p_ac3dec->imdct.delay1[0];
183 delay1_right = p_ac3dec->imdct.delay1[1];
184 delay1_sl = p_ac3dec->imdct.delay1[2];
185 delay1_sr = p_ac3dec->imdct.delay1[3];
187 for (i = 0; i < 256; i++) {
188 left_tmp = p_ac3dec->dm_par.unit * *left++ + p_ac3dec->dm_par.slev * *left_sur++;
189 right_tmp= p_ac3dec->dm_par.unit * *right++ + p_ac3dec->dm_par.slev * *right_sur++;
190 *buffer++ = (s16)(left_tmp + *delay_left);
191 *buffer++ = (s16)(right_tmp + *delay_right);
192 *delay_left++ = p_ac3dec->dm_par.unit * *delay1_left++ + p_ac3dec->dm_par.slev * *delay1_sl++;
193 *delay_right++ = p_ac3dec->dm_par.unit * *delay1_right++ + p_ac3dec->dm_par.slev * *delay1_sr++;
197 left = p_ac3dec->samples[0];
198 center = p_ac3dec->samples[1];
199 right = p_ac3dec->samples[2];
200 right_sur = p_ac3dec->samples[3];
201 delay_left = p_ac3dec->imdct.delay[0];
202 delay_right = p_ac3dec->imdct.delay[1];
203 delay1_left = p_ac3dec->imdct.delay1[0];
204 delay1_center = p_ac3dec->imdct.delay1[1];
205 delay1_right = p_ac3dec->imdct.delay1[2];
206 delay1_sl = p_ac3dec->imdct.delay1[3];
208 for (i = 0; i < 256; i++) {
209 left_tmp = p_ac3dec->dm_par.unit * *left++ + p_ac3dec->dm_par.clev * *center - p_ac3dec->dm_par.slev * *right_sur;
210 right_tmp= p_ac3dec->dm_par.unit * *right++ + p_ac3dec->dm_par.clev * *center++ + p_ac3dec->dm_par.slev * *right_sur++;
211 *buffer++ = (s16)(left_tmp + *delay_left);
212 *buffer++ = (s16)(right_tmp + *delay_right);
213 *delay_left++ = p_ac3dec->dm_par.unit * *delay1_left++ + p_ac3dec->dm_par.clev * *delay1_center + p_ac3dec->dm_par.slev * *delay1_sl;
214 *delay_right++ = p_ac3dec->dm_par.unit * *delay1_right++ + p_ac3dec->dm_par.clev * *center++ + p_ac3dec->dm_par.slev * *delay1_sl++;
218 left = p_ac3dec->samples[0];
219 right = p_ac3dec->samples[1];
220 right_sur = p_ac3dec->samples[2];
221 delay_left = p_ac3dec->imdct.delay[0];
222 delay_right = p_ac3dec->imdct.delay[1];
223 delay1_left = p_ac3dec->imdct.delay1[0];
224 delay1_right = p_ac3dec->imdct.delay1[1];
225 delay1_sl = p_ac3dec->imdct.delay1[2];
227 for (i = 0; i < 256; i++) {
228 left_tmp = p_ac3dec->dm_par.unit * *left++ - p_ac3dec->dm_par.slev * *right_sur;
229 right_tmp= p_ac3dec->dm_par.unit * *right++ + p_ac3dec->dm_par.slev * *right_sur++;
230 *buffer++ = (s16)(left_tmp + *delay_left);
231 *buffer++ = (s16)(right_tmp + *delay_right);
232 *delay_left++ = p_ac3dec->dm_par.unit * *delay1_left++ + p_ac3dec->dm_par.slev * *delay1_sl;
233 *delay_right++ = p_ac3dec->dm_par.unit * *delay1_right++ + p_ac3dec->dm_par.slev * *delay1_sl++;
237 left = p_ac3dec->samples[0];
238 center = p_ac3dec->samples[1];
239 right = p_ac3dec->samples[2];
240 delay_left = p_ac3dec->imdct.delay[0];
241 delay_right = p_ac3dec->imdct.delay[1];
242 delay1_left = p_ac3dec->imdct.delay1[0];
243 delay1_center = p_ac3dec->imdct.delay1[1];
244 delay1_right = p_ac3dec->imdct.delay1[2];
246 for (i = 0; i < 256; i++) {
247 left_tmp = p_ac3dec->dm_par.unit * *left++ + p_ac3dec->dm_par.clev * *center;
248 right_tmp= p_ac3dec->dm_par.unit * *right++ + p_ac3dec->dm_par.clev * *center++;
249 *buffer++ = (s16)(left_tmp + *delay_left);
250 *buffer++ = (s16)(right_tmp + *delay_right);
251 *delay_left++ = p_ac3dec->dm_par.unit * *delay1_left++ + p_ac3dec->dm_par.clev * *delay1_center;
252 *delay_right++ = p_ac3dec->dm_par.unit * *delay1_right++ + p_ac3dec->dm_par.clev * *center++;
255 case 2: /* copy to output */
256 for (i = 0; i < 256; i++) {
257 *buffer++ = (s16)p_ac3dec->samples[0][i];
258 *buffer++ = (s16)p_ac3dec->samples[1][i];