annotate libac3/downmix.c @ 28:b611fafddf9e libavcodec

added 422P and 444P support - fixed block parsing error
author glantau
date Mon, 06 Aug 2001 01:54:05 +0000
parents 986e461dc072
children 5aa6292a1660
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
986e461dc072 Initial revision
glantau
parents:
diff changeset
2 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
3 * downmix.c
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
5 * Copyright (C) Aaron Holtzman - Sept 1999
986e461dc072 Initial revision
glantau
parents:
diff changeset
6 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
7 * Originally based on code by Yuqing Deng.
986e461dc072 Initial revision
glantau
parents:
diff changeset
8 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 * This file is part of ac3dec, a free Dolby AC-3 stream decoder.
986e461dc072 Initial revision
glantau
parents:
diff changeset
10 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * ac3dec is free software; you can redistribute it and/or modify
986e461dc072 Initial revision
glantau
parents:
diff changeset
12 * it under the terms of the GNU General Public License as published by
986e461dc072 Initial revision
glantau
parents:
diff changeset
13 * the Free Software Foundation; either version 2, or (at your option)
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 * any later version.
986e461dc072 Initial revision
glantau
parents:
diff changeset
15 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
16 * ac3dec is distributed in the hope that it will be useful,
986e461dc072 Initial revision
glantau
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
986e461dc072 Initial revision
glantau
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
986e461dc072 Initial revision
glantau
parents:
diff changeset
19 * GNU General Public License for more details.
986e461dc072 Initial revision
glantau
parents:
diff changeset
20 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
21 * You should have received a copy of the GNU General Public License
986e461dc072 Initial revision
glantau
parents:
diff changeset
22 * along with GNU Make; see the file COPYING. If not, write to
986e461dc072 Initial revision
glantau
parents:
diff changeset
23 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
986e461dc072 Initial revision
glantau
parents:
diff changeset
24 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
25 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
27
986e461dc072 Initial revision
glantau
parents:
diff changeset
28 #include <inttypes.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
29 #include <stdlib.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
30 #include <stdio.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
31 #include <math.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
32 #include <string.h>
986e461dc072 Initial revision
glantau
parents:
diff changeset
33 #include "ac3.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
34 #include "ac3_internal.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
35
986e461dc072 Initial revision
glantau
parents:
diff changeset
36
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 #define CONVERT(acmod,output) (((output) << 3) + (acmod))
986e461dc072 Initial revision
glantau
parents:
diff changeset
38
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 int downmix_init (int input, int flags, float * level, float clev, float slev)
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 static uint8_t table[11][8] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_STEREO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 AC3_STEREO, AC3_STEREO, AC3_STEREO, AC3_STEREO},
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 {AC3_MONO, AC3_MONO, AC3_MONO, AC3_MONO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 AC3_MONO, AC3_MONO, AC3_MONO, AC3_MONO},
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_STEREO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 AC3_STEREO, AC3_STEREO, AC3_STEREO, AC3_STEREO},
986e461dc072 Initial revision
glantau
parents:
diff changeset
48 {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_3F,
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 AC3_STEREO, AC3_3F, AC3_STEREO, AC3_3F},
986e461dc072 Initial revision
glantau
parents:
diff changeset
50 {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_STEREO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 AC3_2F1R, AC3_2F1R, AC3_2F1R, AC3_2F1R},
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_STEREO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
53 AC3_2F1R, AC3_3F1R, AC3_2F1R, AC3_3F1R},
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_3F,
986e461dc072 Initial revision
glantau
parents:
diff changeset
55 AC3_2F2R, AC3_2F2R, AC3_2F2R, AC3_2F2R},
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_3F,
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 AC3_2F2R, AC3_3F2R, AC3_2F2R, AC3_3F2R},
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 {AC3_CHANNEL1, AC3_MONO, AC3_MONO, AC3_MONO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 AC3_MONO, AC3_MONO, AC3_MONO, AC3_MONO},
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 {AC3_CHANNEL2, AC3_MONO, AC3_MONO, AC3_MONO,
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 AC3_MONO, AC3_MONO, AC3_MONO, AC3_MONO},
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 {AC3_CHANNEL, AC3_DOLBY, AC3_STEREO, AC3_DOLBY,
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 AC3_DOLBY, AC3_DOLBY, AC3_DOLBY, AC3_DOLBY}
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 int output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
66
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 output = flags & AC3_CHANNEL_MASK;
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 if (output > AC3_DOLBY)
986e461dc072 Initial revision
glantau
parents:
diff changeset
69 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
70
986e461dc072 Initial revision
glantau
parents:
diff changeset
71 output = table[output][input & 7];
986e461dc072 Initial revision
glantau
parents:
diff changeset
72
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 if ((output == AC3_STEREO) &&
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 ((input == AC3_DOLBY) || ((input == AC3_3F) && (clev == LEVEL_3DB))))
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 output = AC3_DOLBY;
986e461dc072 Initial revision
glantau
parents:
diff changeset
76
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 if (flags & AC3_ADJUST_LEVEL)
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 switch (CONVERT (input & 7, output)) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
79
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 case CONVERT (AC3_3F, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 *level *= LEVEL_3DB / (1 + clev);
986e461dc072 Initial revision
glantau
parents:
diff changeset
82 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
83
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 case CONVERT (AC3_STEREO, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 case CONVERT (AC3_2F2R, AC3_2F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 case CONVERT (AC3_3F2R, AC3_3F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 level_3db:
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 *level *= LEVEL_3DB;
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
90
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 case CONVERT (AC3_3F2R, AC3_2F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 if (clev < LEVEL_PLUS3DB - 1)
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 goto level_3db;
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 // break thru
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 case CONVERT (AC3_3F, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
96 case CONVERT (AC3_3F1R, AC3_2F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 case CONVERT (AC3_3F1R, AC3_2F2R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 case CONVERT (AC3_3F2R, AC3_2F2R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
99 *level /= 1 + clev;
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
101
986e461dc072 Initial revision
glantau
parents:
diff changeset
102 case CONVERT (AC3_2F1R, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 *level *= LEVEL_PLUS3DB / (2 + slev);
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
105
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 case CONVERT (AC3_2F1R, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
107 case CONVERT (AC3_3F1R, AC3_3F):
986e461dc072 Initial revision
glantau
parents:
diff changeset
108 *level /= 1 + slev * LEVEL_3DB;
986e461dc072 Initial revision
glantau
parents:
diff changeset
109 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
110
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 case CONVERT (AC3_3F1R, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
112 *level *= LEVEL_3DB / (1 + clev + 0.5 * slev);
986e461dc072 Initial revision
glantau
parents:
diff changeset
113 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
114
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 case CONVERT (AC3_3F1R, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 *level /= 1 + clev + slev * LEVEL_3DB;
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
118
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 case CONVERT (AC3_2F2R, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 *level *= LEVEL_3DB / (1 + slev);
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
122
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 case CONVERT (AC3_2F2R, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
124 case CONVERT (AC3_3F2R, AC3_3F):
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 *level /= (1 + slev);
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
127
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 case CONVERT (AC3_3F2R, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 *level *= LEVEL_3DB / (1 + clev + slev);
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
131
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 case CONVERT (AC3_3F2R, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 *level /= 1 + clev + slev;
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
135
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 case CONVERT (AC3_MONO, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 *level *= LEVEL_PLUS3DB;
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
139
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 case CONVERT (AC3_3F, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 case CONVERT (AC3_2F1R, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 *level *= 1 / (1 + LEVEL_3DB);
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
144
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 case CONVERT (AC3_3F1R, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 case CONVERT (AC3_2F2R, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
147 *level *= 1 / (1 + 2 * LEVEL_3DB);
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
149
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 case CONVERT (AC3_3F2R, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 *level *= 1 / (1 + 3 * LEVEL_3DB);
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
154
986e461dc072 Initial revision
glantau
parents:
diff changeset
155 return output;
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
157
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 static void mix1to1 (float * samples, float level, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
159 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
161
986e461dc072 Initial revision
glantau
parents:
diff changeset
162 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 samples[i] = samples[i] * level + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
165
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 static void move1to1 (float * src, float * dest, float level, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
169
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 dest[i] = src[i] * level + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
173
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 static void mix2to1 (float * samples, float level, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
175 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
176 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
177
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 samples[i] = (samples[i] + samples[i + 256]) * level + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
181
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 static void move2to1 (float * src, float * dest, float level, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
185
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 dest[i] = (src[i] + src[i + 256]) * level + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
189
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 static void mix3to1 (float * samples, float level, float clev, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
192 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
193
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 samples[i] = ((samples[i] + samples[i + 512]) * level +
986e461dc072 Initial revision
glantau
parents:
diff changeset
196 samples[i + 256] * clev + bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
198
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 static void mix21to1 (float * samples, float level, float slev, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
202
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 samples[i] = ((samples[i] + samples[i + 256]) * level +
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 samples[i + 512] * slev + bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
207
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 static void mix31to1 (float * samples, float level, float clev, float slev,
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
212
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 samples[i] = ((samples[i] + samples[i + 512]) * level +
986e461dc072 Initial revision
glantau
parents:
diff changeset
215 samples[i + 256] * clev + samples[i + 768] * slev +
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
218
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 static void mix22to1 (float * samples, float level, float slev, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
220 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
222
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
224 samples[i] = ((samples[i] + samples[i + 256]) * level +
986e461dc072 Initial revision
glantau
parents:
diff changeset
225 (samples[i + 512] + samples[i + 768]) * slev + bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
227
986e461dc072 Initial revision
glantau
parents:
diff changeset
228 static void mix32to1 (float * samples, float level, float clev, float slev,
986e461dc072 Initial revision
glantau
parents:
diff changeset
229 float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
231 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
232
986e461dc072 Initial revision
glantau
parents:
diff changeset
233 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
234 samples[i] = ((samples[i] + samples[i + 512]) * level +
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 samples[i + 256] * clev +
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 (samples[i + 768] + samples[i + 1024]) * slev + bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
238
986e461dc072 Initial revision
glantau
parents:
diff changeset
239 static void mix1to2 (float * src, float * dest, float level, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
240 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
241 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
242
986e461dc072 Initial revision
glantau
parents:
diff changeset
243 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
244 dest[i] = src[i] = src[i] * level + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
245 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
246
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 static void mix3to2 (float * samples, float level, float clev, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
248 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
249 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
250 float common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
251
986e461dc072 Initial revision
glantau
parents:
diff changeset
252 for (i = 0; i < 256; i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
253 common = samples[i + 256] * clev + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
254 samples[i] = samples[i] * level + common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
255 samples[i + 256] = samples[i + 512] * level + common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
256 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
257 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
258
986e461dc072 Initial revision
glantau
parents:
diff changeset
259 static void mix21to2 (float * left, float * right, float level, float slev,
986e461dc072 Initial revision
glantau
parents:
diff changeset
260 float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
261 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
262 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
263 float common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
264
986e461dc072 Initial revision
glantau
parents:
diff changeset
265 for (i = 0; i < 256; i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
266 common = right[i + 256] * slev + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
267 left[i] = left[i] * level + common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
268 right[i] = right[i] * level + common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
269 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
271
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 static void mix11to1 (float * front, float * rear, float level, float slev,
986e461dc072 Initial revision
glantau
parents:
diff changeset
273 float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
274 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
275 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
276
986e461dc072 Initial revision
glantau
parents:
diff changeset
277 for (i = 0; i < 256; i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
278 front[i] = front[i] * level + rear[i] * slev + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
279 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
280
986e461dc072 Initial revision
glantau
parents:
diff changeset
281 static void mix31to2 (float * samples, float level, float clev, float slev,
986e461dc072 Initial revision
glantau
parents:
diff changeset
282 float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
283 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
284 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
285 float common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
286
986e461dc072 Initial revision
glantau
parents:
diff changeset
287 for (i = 0; i < 256; i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
288 common = samples[i + 256] * clev + samples[i + 768] * slev + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
289 samples[i] = samples[i] * level + common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
290 samples[i + 256] = samples[i + 512] * level + common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
291 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
292 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
293
986e461dc072 Initial revision
glantau
parents:
diff changeset
294 static void mix32to2 (float * samples, float level, float clev, float slev,
986e461dc072 Initial revision
glantau
parents:
diff changeset
295 float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
297 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
298 float common;
986e461dc072 Initial revision
glantau
parents:
diff changeset
299
986e461dc072 Initial revision
glantau
parents:
diff changeset
300 for (i = 0; i < 256; i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
301 common = samples[i + 256] * clev + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
302 samples[i] = samples[i] * level + common + samples[i + 768] * slev;
986e461dc072 Initial revision
glantau
parents:
diff changeset
303 samples[i + 256] = (samples[i + 512] * level + common +
986e461dc072 Initial revision
glantau
parents:
diff changeset
304 samples[i + 1024] * slev);
986e461dc072 Initial revision
glantau
parents:
diff changeset
305 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
306 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
307
986e461dc072 Initial revision
glantau
parents:
diff changeset
308 static void mix21toS (float * samples, float level, float level3db, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
309 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
310 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
311 float surround;
986e461dc072 Initial revision
glantau
parents:
diff changeset
312
986e461dc072 Initial revision
glantau
parents:
diff changeset
313 for (i = 0; i < 256; i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
314 surround = samples[i + 512] * level3db;
986e461dc072 Initial revision
glantau
parents:
diff changeset
315 samples[i] = samples[i] * level - surround + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
316 samples[i + 256] = samples[i + 256] * level + surround + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
317 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
318 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
319
986e461dc072 Initial revision
glantau
parents:
diff changeset
320 static void mix22toS (float * samples, float level, float level3db, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
321 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
322 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
323 float surround;
986e461dc072 Initial revision
glantau
parents:
diff changeset
324
986e461dc072 Initial revision
glantau
parents:
diff changeset
325 for (i = 0; i < 256; i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
326 surround = (samples[i + 512] + samples[i + 768]) * level3db;
986e461dc072 Initial revision
glantau
parents:
diff changeset
327 samples[i] = samples[i] * level - surround + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
328 samples[i + 256] = samples[i + 256] * level + surround + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
329 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
330 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
331
986e461dc072 Initial revision
glantau
parents:
diff changeset
332 static void mix31toS (float * samples, float level, float level3db, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
333 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
334 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
335 float common, surround;
986e461dc072 Initial revision
glantau
parents:
diff changeset
336
986e461dc072 Initial revision
glantau
parents:
diff changeset
337 for (i = 0; i < 256; i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
338 common = samples[i + 256] * level3db + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
339 surround = samples[i + 768] * level3db;
986e461dc072 Initial revision
glantau
parents:
diff changeset
340 samples[i] = samples[i] * level + common - surround;
986e461dc072 Initial revision
glantau
parents:
diff changeset
341 samples[i + 256] = samples[i + 512] * level + common + surround;
986e461dc072 Initial revision
glantau
parents:
diff changeset
342 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
343 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
344
986e461dc072 Initial revision
glantau
parents:
diff changeset
345 static void mix32toS (float * samples, float level, float level3db, float bias)
986e461dc072 Initial revision
glantau
parents:
diff changeset
346 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
347 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
348 float common, surround;
986e461dc072 Initial revision
glantau
parents:
diff changeset
349
986e461dc072 Initial revision
glantau
parents:
diff changeset
350 for (i = 0; i < 256; i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
351 common = samples[i + 256] * level3db + bias;
986e461dc072 Initial revision
glantau
parents:
diff changeset
352 surround = (samples[i + 768] + samples[i + 1024]) * level3db;
986e461dc072 Initial revision
glantau
parents:
diff changeset
353 samples[i] = samples[i] * level + common - surround;
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 samples[i + 256] = samples[i + 512] * level + common + surround;
986e461dc072 Initial revision
glantau
parents:
diff changeset
355 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
356 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
357
986e461dc072 Initial revision
glantau
parents:
diff changeset
358 void downmix (float * samples, int acmod, int output, float level, float bias,
986e461dc072 Initial revision
glantau
parents:
diff changeset
359 float clev, float slev)
986e461dc072 Initial revision
glantau
parents:
diff changeset
360 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
361 switch (CONVERT (acmod, output & AC3_CHANNEL_MASK)) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
362
986e461dc072 Initial revision
glantau
parents:
diff changeset
363 case CONVERT (AC3_3F2R, AC3_3F2R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
364 mix1to1 (samples + 1024, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
365 case CONVERT (AC3_3F1R, AC3_3F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
366 case CONVERT (AC3_2F2R, AC3_2F2R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
367 mix1to1 (samples + 768, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
368 case CONVERT (AC3_3F, AC3_3F):
986e461dc072 Initial revision
glantau
parents:
diff changeset
369 case CONVERT (AC3_2F1R, AC3_2F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
370 mix_3to3:
986e461dc072 Initial revision
glantau
parents:
diff changeset
371 mix1to1 (samples + 512, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
372 case CONVERT (AC3_CHANNEL, AC3_CHANNEL):
986e461dc072 Initial revision
glantau
parents:
diff changeset
373 case CONVERT (AC3_STEREO, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
374 case CONVERT (AC3_STEREO, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
375 mix_2to2:
986e461dc072 Initial revision
glantau
parents:
diff changeset
376 mix1to1 (samples + 256, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
377 case CONVERT (AC3_CHANNEL, AC3_CHANNEL1):
986e461dc072 Initial revision
glantau
parents:
diff changeset
378 case CONVERT (AC3_MONO, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
379 mix1to1 (samples, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
380 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
381
986e461dc072 Initial revision
glantau
parents:
diff changeset
382 case CONVERT (AC3_CHANNEL, AC3_CHANNEL2):
986e461dc072 Initial revision
glantau
parents:
diff changeset
383 mix_1to1_b:
986e461dc072 Initial revision
glantau
parents:
diff changeset
384 mix1to1 (samples + 256, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
385 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
386
986e461dc072 Initial revision
glantau
parents:
diff changeset
387 case CONVERT (AC3_STEREO, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
388 mix_2to1:
986e461dc072 Initial revision
glantau
parents:
diff changeset
389 mix2to1 (samples, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
390 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
391
986e461dc072 Initial revision
glantau
parents:
diff changeset
392 case CONVERT (AC3_2F1R, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
394 goto mix_2to1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
395 mix21to1 (samples, level * LEVEL_3DB, level * slev * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
396 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
397
986e461dc072 Initial revision
glantau
parents:
diff changeset
398 case CONVERT (AC3_2F2R, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
399 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
400 goto mix_2to1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
401 mix22to1 (samples, level * LEVEL_3DB, level * slev * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
402 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
403
986e461dc072 Initial revision
glantau
parents:
diff changeset
404 case CONVERT (AC3_3F, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
405 mix_3to1:
986e461dc072 Initial revision
glantau
parents:
diff changeset
406 mix3to1 (samples, level * LEVEL_3DB, level * clev * LEVEL_PLUS3DB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
407 bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
408 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
409
986e461dc072 Initial revision
glantau
parents:
diff changeset
410 case CONVERT (AC3_3F1R, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
411 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
412 goto mix_3to1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
413 mix31to1 (samples, level * LEVEL_3DB, level * clev * LEVEL_PLUS3DB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
414 level * slev * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
415 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
416
986e461dc072 Initial revision
glantau
parents:
diff changeset
417 case CONVERT (AC3_3F2R, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
418 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
419 goto mix_3to1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
420 mix32to1 (samples, level * LEVEL_3DB, level * clev * LEVEL_PLUS3DB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
421 level * slev * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
422 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
423
986e461dc072 Initial revision
glantau
parents:
diff changeset
424 case CONVERT (AC3_CHANNEL, AC3_MONO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
425 mix2to1 (samples, level * LEVEL_6DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
426 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
427
986e461dc072 Initial revision
glantau
parents:
diff changeset
428 case CONVERT (AC3_MONO, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
429 mix1to2 (samples, samples + 256, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
430 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
431
986e461dc072 Initial revision
glantau
parents:
diff changeset
432 case CONVERT (AC3_3F, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
433 clev = LEVEL_3DB;
986e461dc072 Initial revision
glantau
parents:
diff changeset
434 case CONVERT (AC3_3F, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
435 mix_3to2:
986e461dc072 Initial revision
glantau
parents:
diff changeset
436 mix3to2 (samples, level, level * clev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
437 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
438
986e461dc072 Initial revision
glantau
parents:
diff changeset
439 case CONVERT (AC3_2F1R, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
440 mix21toS (samples, level, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
441 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
442
986e461dc072 Initial revision
glantau
parents:
diff changeset
443 case CONVERT (AC3_3F1R, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
444 mix31toS (samples, level, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
445 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
446
986e461dc072 Initial revision
glantau
parents:
diff changeset
447 case CONVERT (AC3_2F2R, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
448 mix22toS (samples, level, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
449 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
450
986e461dc072 Initial revision
glantau
parents:
diff changeset
451 case CONVERT (AC3_3F2R, AC3_DOLBY):
986e461dc072 Initial revision
glantau
parents:
diff changeset
452 mix32toS (samples, level, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
453 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
454
986e461dc072 Initial revision
glantau
parents:
diff changeset
455 case CONVERT (AC3_2F1R, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
456 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
457 goto mix_2to2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
458 mix21to2 (samples, samples + 256, level, level * slev * LEVEL_3DB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
459 bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
460 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
461
986e461dc072 Initial revision
glantau
parents:
diff changeset
462 case CONVERT (AC3_3F1R, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
463 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
464 goto mix_3to2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
465 mix31to2 (samples, level, level * clev, level * slev * LEVEL_3DB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
466 bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
467 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
468
986e461dc072 Initial revision
glantau
parents:
diff changeset
469 case CONVERT (AC3_2F2R, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
470 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
471 goto mix_2to2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
472 mix11to1 (samples, samples + 512, level, level * slev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
473 mix11to1 (samples + 256, samples + 768, level, level * slev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
474 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
475
986e461dc072 Initial revision
glantau
parents:
diff changeset
476 case CONVERT (AC3_3F2R, AC3_STEREO):
986e461dc072 Initial revision
glantau
parents:
diff changeset
477 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
478 goto mix_3to2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
479 mix32to2 (samples, level, level * clev, level * slev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
480 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
481
986e461dc072 Initial revision
glantau
parents:
diff changeset
482 case CONVERT (AC3_3F1R, AC3_3F):
986e461dc072 Initial revision
glantau
parents:
diff changeset
483 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
484 goto mix_3to3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
485 mix21to2 (samples, samples + 512, level, level * slev * LEVEL_3DB,
986e461dc072 Initial revision
glantau
parents:
diff changeset
486 bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
487
986e461dc072 Initial revision
glantau
parents:
diff changeset
488 case CONVERT (AC3_3F2R, AC3_3F):
986e461dc072 Initial revision
glantau
parents:
diff changeset
489 if (slev == 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
490 goto mix_3to3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
491 mix11to1 (samples, samples + 768, level, level * slev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
492 mix11to1 (samples + 512, samples + 1024, level, level * slev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
493 goto mix_1to1_b;
986e461dc072 Initial revision
glantau
parents:
diff changeset
494
986e461dc072 Initial revision
glantau
parents:
diff changeset
495 case CONVERT (AC3_2F1R, AC3_2F2R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
496 mix1to2 (samples + 512, samples + 768, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
497 goto mix_2to2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
498
986e461dc072 Initial revision
glantau
parents:
diff changeset
499 case CONVERT (AC3_3F1R, AC3_3F2R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
500 mix1to2 (samples + 768, samples + 1024, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
501 goto mix_3to3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
502
986e461dc072 Initial revision
glantau
parents:
diff changeset
503 case CONVERT (AC3_2F2R, AC3_2F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
504 mix2to1 (samples + 512, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
505 goto mix_2to2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
506
986e461dc072 Initial revision
glantau
parents:
diff changeset
507 case CONVERT (AC3_3F2R, AC3_3F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
508 mix2to1 (samples + 768, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
509 goto mix_3to3;
986e461dc072 Initial revision
glantau
parents:
diff changeset
510
986e461dc072 Initial revision
glantau
parents:
diff changeset
511 case CONVERT (AC3_3F1R, AC3_2F2R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
512 mix3to2 (samples, level, level * clev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
513 mix1to2 (samples + 768, samples + 512, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
514 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
515
986e461dc072 Initial revision
glantau
parents:
diff changeset
516 case CONVERT (AC3_3F1R, AC3_2F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
517 mix3to2 (samples, level, level * clev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
518 move1to1 (samples + 768, samples + 512, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
519 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
520
986e461dc072 Initial revision
glantau
parents:
diff changeset
521 case CONVERT (AC3_3F2R, AC3_2F1R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
522 mix3to2 (samples, level, level * clev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
523 move2to1 (samples + 768, samples + 512, level * LEVEL_3DB, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
524 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
525
986e461dc072 Initial revision
glantau
parents:
diff changeset
526 case CONVERT (AC3_3F2R, AC3_2F2R):
986e461dc072 Initial revision
glantau
parents:
diff changeset
527 mix3to2 (samples, level, level * clev, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
528 move1to1 (samples + 768, samples + 512, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
529 move1to1 (samples + 1024, samples + 768, level, bias);
986e461dc072 Initial revision
glantau
parents:
diff changeset
530 break;
986e461dc072 Initial revision
glantau
parents:
diff changeset
531
986e461dc072 Initial revision
glantau
parents:
diff changeset
532 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
533 }