]> git.sesse.net Git - vlc/blob - src/ac3_decoder/ac3_imdct.c
* AC3 IMDCT and downmix functions are now in plugins, --imdct and
[vlc] / src / ac3_decoder / ac3_imdct.c
1 /*****************************************************************************
2  * ac3_imdct.c: ac3 DCT
3  *****************************************************************************
4  * Copyright (C) 1999, 2000 VideoLAN
5  * $Id: ac3_imdct.c,v 1.20 2001/05/15 16:19:42 sam Exp $
6  *
7  * Authors: Michel Kaempf <maxx@via.ecp.fr>
8  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
9  *          Renaud Dartus <reno@videolan.org>
10  *
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.
15  * 
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.
20  *
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  *****************************************************************************/
25
26 /*****************************************************************************
27  * Preamble
28  *****************************************************************************/
29 #include "defs.h"
30
31 #include <string.h>                                              /* memcpy() */
32
33 #include <math.h>
34 #include <stdio.h>
35
36 #include "config.h"
37 #include "common.h"
38 #include "threads.h"
39 #include "mtime.h"
40
41 #include "stream_control.h"
42 #include "input_ext-dec.h"
43
44 #include "ac3_imdct.h"
45 #include "ac3_downmix.h"
46 #include "ac3_decoder.h"
47
48 #ifndef M_PI
49 #   define M_PI 3.14159265358979323846
50 #endif
51
52 void imdct_init(imdct_t * p_imdct)
53 {
54     int i;
55     float scale = 181.019;
56
57         p_imdct->pf_imdct_init( p_imdct );
58
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;
63     }
64 }
65
66 void imdct (ac3dec_t * p_ac3dec, s16 * buffer)
67 {
68     int   i;
69     int   doable = 0;
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[]);
75
76     /* test if dm in frequency is doable */
77     if (!(doable = p_ac3dec->audblk.blksw[0]))
78     {
79         do_imdct = p_ac3dec->imdct.pf_imdct_512;
80     }
81     else
82     {
83         do_imdct = p_ac3dec->imdct.pf_imdct_256;
84     }
85
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++)
89     {
90         if (doable != p_ac3dec->audblk.blksw[i])
91         {
92             do_imdct = NULL;
93             break;
94         }
95     }
96
97     if (do_imdct)
98     {
99         /* dowmix first and imdct */
100         switch(p_ac3dec->bsi.acmod)
101         {
102             case 7:        /* 3/2 */
103                 p_ac3dec->downmix.pf_downmix_3f_2r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
104                 break;
105             case 6:        /* 2/2 */
106                 p_ac3dec->downmix.pf_downmix_2f_2r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
107                 break;
108             case 5:        /* 3/1 */
109                 p_ac3dec->downmix.pf_downmix_3f_1r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
110                 break;
111             case 4:        /* 2/1 */
112                 p_ac3dec->downmix.pf_downmix_2f_1r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
113                 break;
114             case 3:        /* 3/0 */
115                 p_ac3dec->downmix.pf_downmix_3f_0r_to_2ch (p_ac3dec->samples[0], &p_ac3dec->dm_par);
116                 break;
117             case 2:
118                 break;
119             default:    /* 1/0 */
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*/
125     
126                 p_ac3dec->downmix.pf_stream_sample_1ch_to_s16 (buffer, center);
127
128                 return;
129                 break;
130         }
131
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]);
135
136     } else {
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++)
141         {
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]);
145             else
146                 p_ac3dec->imdct.pf_imdct_512_nol (&p_ac3dec->imdct, p_ac3dec->samples[i], p_ac3dec->imdct.delay1[i]);
147         }
148
149         /* mix the sample, overlap */
150         switch(p_ac3dec->bsi.acmod)
151         {
152             case 7:        /* 3/2 */
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];
165     
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++;
173                 }
174                 break;
175             case 6:        /* 2/2 */
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];
186     
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++;
194                 }
195                 break;
196             case 5:        /* 3/1 */
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];
207     
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++;
215                 }
216                 break;
217             case 4:        /* 2/1 */
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];
226     
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++;
234                 }
235                 break;
236             case 3:        /* 3/0 */
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];
245
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++;
253                 }
254                 break;
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];
259                 }
260                 break;
261         }
262     }
263 }