summaryrefslogtreecommitdiff
path: root/apps/codecs/liba52
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/liba52')
-rw-r--r--apps/codecs/liba52/a52.h6
-rw-r--r--apps/codecs/liba52/a52_internal.h84
-rw-r--r--apps/codecs/liba52/bit_allocate.c228
-rw-r--r--apps/codecs/liba52/bitstream.c10
-rw-r--r--apps/codecs/liba52/bitstream.h16
-rw-r--r--apps/codecs/liba52/downmix.c664
-rw-r--r--apps/codecs/liba52/imdct.c164
-rw-r--r--apps/codecs/liba52/imdct_lookups.h2
-rw-r--r--apps/codecs/liba52/mm_accel.h8
-rw-r--r--apps/codecs/liba52/parse.c1098
10 files changed, 1140 insertions, 1140 deletions
diff --git a/apps/codecs/liba52/a52.h b/apps/codecs/liba52/a52.h
index cae9ae6403..e852e8d6bb 100644
--- a/apps/codecs/liba52/a52.h
+++ b/apps/codecs/liba52/a52.h
@@ -56,11 +56,11 @@ typedef struct a52_state_s a52_state_t;
56a52_state_t * a52_init (uint32_t mm_accel); 56a52_state_t * a52_init (uint32_t mm_accel);
57sample_t * a52_samples (a52_state_t * state); 57sample_t * a52_samples (a52_state_t * state);
58int a52_syncinfo (uint8_t * buf, int * flags, 58int a52_syncinfo (uint8_t * buf, int * flags,
59 int * sample_rate, int * bit_rate); 59 int * sample_rate, int * bit_rate);
60int a52_frame (a52_state_t * state, uint8_t * buf, int * flags, 60int a52_frame (a52_state_t * state, uint8_t * buf, int * flags,
61 level_t * level, sample_t bias); 61 level_t * level, sample_t bias);
62void a52_dynrng (a52_state_t * state, 62void a52_dynrng (a52_state_t * state,
63 level_t (* call) (level_t, void *), void * data); 63 level_t (* call) (level_t, void *), void * data);
64int a52_block (a52_state_t * state); 64int a52_block (a52_state_t * state);
65void a52_free (a52_state_t * state); 65void a52_free (a52_state_t * state);
66 66
diff --git a/apps/codecs/liba52/a52_internal.h b/apps/codecs/liba52/a52_internal.h
index 48f23836f7..3b3d21c9a3 100644
--- a/apps/codecs/liba52/a52_internal.h
+++ b/apps/codecs/liba52/a52_internal.h
@@ -22,62 +22,62 @@
22 */ 22 */
23 23
24typedef struct { 24typedef struct {
25 uint8_t bai; /* fine SNR offset, fast gain */ 25 uint8_t bai; /* fine SNR offset, fast gain */
26 uint8_t deltbae; /* delta bit allocation exists */ 26 uint8_t deltbae; /* delta bit allocation exists */
27 int8_t deltba[50]; /* per-band delta bit allocation */ 27 int8_t deltba[50]; /* per-band delta bit allocation */
28} ba_t; 28} ba_t;
29 29
30typedef struct { 30typedef struct {
31 uint8_t exp[256]; /* decoded channel exponents */ 31 uint8_t exp[256]; /* decoded channel exponents */
32 int8_t bap[256]; /* derived channel bit allocation */ 32 int8_t bap[256]; /* derived channel bit allocation */
33} expbap_t; 33} expbap_t;
34 34
35struct a52_state_s { 35struct a52_state_s {
36 uint8_t fscod; /* sample rate */ 36 uint8_t fscod; /* sample rate */
37 uint8_t halfrate; /* halfrate factor */ 37 uint8_t halfrate; /* halfrate factor */
38 uint8_t acmod; /* coded channels */ 38 uint8_t acmod; /* coded channels */
39 uint8_t lfeon; /* coded lfe channel */ 39 uint8_t lfeon; /* coded lfe channel */
40 level_t clev; /* centre channel mix level */ 40 level_t clev; /* centre channel mix level */
41 level_t slev; /* surround channels mix level */ 41 level_t slev; /* surround channels mix level */
42 42
43 int output; /* type of output */ 43 int output; /* type of output */
44 level_t level; /* output level */ 44 level_t level; /* output level */
45 sample_t bias; /* output bias */ 45 sample_t bias; /* output bias */
46 46
47 int dynrnge; /* apply dynamic range */ 47 int dynrnge; /* apply dynamic range */
48 level_t dynrng; /* dynamic range */ 48 level_t dynrng; /* dynamic range */
49 void * dynrngdata; /* dynamic range callback funtion and data */ 49 void * dynrngdata; /* dynamic range callback funtion and data */
50 level_t (* dynrngcall) (level_t range, void * dynrngdata); 50 level_t (* dynrngcall) (level_t range, void * dynrngdata);
51 51
52 uint8_t chincpl; /* channel coupled */ 52 uint8_t chincpl; /* channel coupled */
53 uint8_t phsflginu; /* phase flags in use (stereo only) */ 53 uint8_t phsflginu; /* phase flags in use (stereo only) */
54 uint8_t cplstrtmant; /* coupling channel start mantissa */ 54 uint8_t cplstrtmant; /* coupling channel start mantissa */
55 uint8_t cplendmant; /* coupling channel end mantissa */ 55 uint8_t cplendmant; /* coupling channel end mantissa */
56 uint32_t cplbndstrc; /* coupling band structure */ 56 uint32_t cplbndstrc; /* coupling band structure */
57 level_t cplco[5][18]; /* coupling coordinates */ 57 level_t cplco[5][18]; /* coupling coordinates */
58 58
59 /* derived information */ 59 /* derived information */
60 uint8_t cplstrtbnd; /* coupling start band (for bit allocation) */ 60 uint8_t cplstrtbnd; /* coupling start band (for bit allocation) */
61 uint8_t ncplbnd; /* number of coupling bands */ 61 uint8_t ncplbnd; /* number of coupling bands */
62 62
63 uint8_t rematflg; /* stereo rematrixing */ 63 uint8_t rematflg; /* stereo rematrixing */
64 64
65 uint8_t endmant[5]; /* channel end mantissa */ 65 uint8_t endmant[5]; /* channel end mantissa */
66 66
67 uint16_t bai; /* bit allocation information */ 67 uint16_t bai; /* bit allocation information */
68 68
69 uint32_t * buffer_start; 69 uint32_t * buffer_start;
70 uint16_t lfsr_state; /* dither state */ 70 uint16_t lfsr_state; /* dither state */
71 uint32_t bits_left; 71 uint32_t bits_left;
72 uint32_t current_word; 72 uint32_t current_word;
73 73
74 uint8_t csnroffst; /* coarse SNR offset */ 74 uint8_t csnroffst; /* coarse SNR offset */
75 ba_t cplba; /* coupling bit allocation parameters */ 75 ba_t cplba; /* coupling bit allocation parameters */
76 ba_t ba[5]; /* channel bit allocation parameters */ 76 ba_t ba[5]; /* channel bit allocation parameters */
77 ba_t lfeba; /* lfe bit allocation parameters */ 77 ba_t lfeba; /* lfe bit allocation parameters */
78 78
79 uint8_t cplfleak; /* coupling fast leak init */ 79 uint8_t cplfleak; /* coupling fast leak init */
80 uint8_t cplsleak; /* coupling slow leak init */ 80 uint8_t cplsleak; /* coupling slow leak init */
81 81
82 expbap_t cpl_expbap; 82 expbap_t cpl_expbap;
83 expbap_t fbw_expbap[5]; 83 expbap_t fbw_expbap[5];
@@ -104,15 +104,15 @@ struct a52_state_s {
104#define DELTA_BIT_RESERVED (3) 104#define DELTA_BIT_RESERVED (3)
105 105
106void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, 106void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart,
107 int start, int end, int fastleak, int slowleak, 107 int start, int end, int fastleak, int slowleak,
108 expbap_t * expbap); 108 expbap_t * expbap);
109 109
110int a52_downmix_init (int input, int flags, level_t * level, 110int a52_downmix_init (int input, int flags, level_t * level,
111 level_t clev, level_t slev); 111 level_t clev, level_t slev);
112int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level, 112int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
113 level_t clev, level_t slev); 113 level_t clev, level_t slev);
114void a52_downmix (sample_t * samples, int acmod, int output, 114void a52_downmix (sample_t * samples, int acmod, int output,
115 level_t clev, level_t slev); 115 level_t clev, level_t slev);
116void a52_upmix (sample_t * samples, int acmod, int output); 116void a52_upmix (sample_t * samples, int acmod, int output);
117 117
118void a52_imdct_init (uint32_t mm_accel); 118void a52_imdct_init (uint32_t mm_accel);
diff --git a/apps/codecs/liba52/bit_allocate.c b/apps/codecs/liba52/bit_allocate.c
index 3f68c92c0c..aaac245913 100644
--- a/apps/codecs/liba52/bit_allocate.c
+++ b/apps/codecs/liba52/bit_allocate.c
@@ -68,12 +68,12 @@ static int8_t baptab[305] IDATA_ATTR = {
68 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
70 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
71 0, 0, 0, 0 /* 148 padding elems */ 71 0, 0, 0, 0 /* 148 padding elems */
72}; 72};
73 73
74static int bndtab[30] IDATA_ATTR = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34, 74static int bndtab[30] IDATA_ATTR = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34,
75 37, 40, 43, 46, 49, 55, 61, 67, 73, 79, 75 37, 40, 43, 46, 49, 55, 61, 67, 73, 79,
76 85, 97, 109, 121, 133, 157, 181, 205, 229, 253}; 76 85, 97, 109, 121, 133, 157, 181, 205, 229, 253};
77 77
78static int8_t latab[256] IDATA_ATTR = { 78static int8_t latab[256] IDATA_ATTR = {
79 -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53, 79 -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53,
@@ -100,35 +100,35 @@ static int8_t latab[256] IDATA_ATTR = {
100 0, 0, 0, 0 100 0, 0, 0, 0
101}; 101};
102 102
103#define UPDATE_LEAK() \ 103#define UPDATE_LEAK() \
104do { \ 104do { \
105 fastleak += fdecay; \ 105 fastleak += fdecay; \
106 if (fastleak > psd + fgain) \ 106 if (fastleak > psd + fgain) \
107 fastleak = psd + fgain; \ 107 fastleak = psd + fgain; \
108 slowleak += sdecay; \ 108 slowleak += sdecay; \
109 if (slowleak > psd + sgain) \ 109 if (slowleak > psd + sgain) \
110 slowleak = psd + sgain; \ 110 slowleak = psd + sgain; \
111} while (0) 111} while (0)
112 112
113#define COMPUTE_MASK() \ 113#define COMPUTE_MASK() \
114do { \ 114do { \
115 if (psd > dbknee) \ 115 if (psd > dbknee) \
116 mask -= (psd - dbknee) >> 2; \ 116 mask -= (psd - dbknee) >> 2; \
117 if (mask > hth [i >> halfrate]) \ 117 if (mask > hth [i >> halfrate]) \
118 mask = hth [i >> halfrate]; \ 118 mask = hth [i >> halfrate]; \
119 mask -= snroffset + 128 * deltba[i]; \ 119 mask -= snroffset + 128 * deltba[i]; \
120 mask = (mask > 0) ? 0 : ((-mask) >> 5); \ 120 mask = (mask > 0) ? 0 : ((-mask) >> 5); \
121 mask -= floor; \ 121 mask -= floor; \
122} while (0) 122} while (0)
123 123
124void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, 124void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart,
125 int start, int end, int fastleak, int slowleak, 125 int start, int end, int fastleak, int slowleak,
126 expbap_t * expbap) 126 expbap_t * expbap)
127{ 127{
128 static int slowgain[4] = {0x540, 0x4d8, 0x478, 0x410}; 128 static int slowgain[4] = {0x540, 0x4d8, 0x478, 0x410};
129 static int dbpbtab[4] = {0xc00, 0x500, 0x300, 0x100}; 129 static int dbpbtab[4] = {0xc00, 0x500, 0x300, 0x100};
130 static int floortab[8] = {0x910, 0x950, 0x990, 0x9d0, 130 static int floortab[8] = {0x910, 0x950, 0x990, 0x9d0,
131 0xa10, 0xa90, 0xb10, 0x1400}; 131 0xa10, 0xa90, 0xb10, 0x1400};
132 132
133 int i, j; 133 int i, j;
134 uint8_t * exp; 134 uint8_t * exp;
@@ -141,17 +141,17 @@ void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart,
141 141
142 halfrate = state->halfrate; 142 halfrate = state->halfrate;
143 fdecay = (63 + 20 * ((state->bai >> 7) & 3)) >> halfrate; /* fdcycod */ 143 fdecay = (63 + 20 * ((state->bai >> 7) & 3)) >> halfrate; /* fdcycod */
144 fgain = 128 + 128 * (ba->bai & 7); /* fgaincod */ 144 fgain = 128 + 128 * (ba->bai & 7); /* fgaincod */
145 sdecay = (15 + 2 * (state->bai >> 9)) >> halfrate; /* sdcycod */ 145 sdecay = (15 + 2 * (state->bai >> 9)) >> halfrate; /* sdcycod */
146 sgain = slowgain[(state->bai >> 5) & 3]; /* sgaincod */ 146 sgain = slowgain[(state->bai >> 5) & 3]; /* sgaincod */
147 dbknee = dbpbtab[(state->bai >> 3) & 3]; /* dbpbcod */ 147 dbknee = dbpbtab[(state->bai >> 3) & 3]; /* dbpbcod */
148 hth = hthtab[state->fscod]; 148 hth = hthtab[state->fscod];
149 /* 149 /*
150 * if there is no delta bit allocation, make deltba point to an area 150 * if there is no delta bit allocation, make deltba point to an area
151 * known to contain zeroes. baptab+156 here. 151 * known to contain zeroes. baptab+156 here.
152 */ 152 */
153 deltba = (ba->deltbae == DELTA_BIT_NONE) ? baptab + 156 : ba->deltba; 153 deltba = (ba->deltbae == DELTA_BIT_NONE) ? baptab + 156 : ba->deltba;
154 floor = floortab[state->bai & 7]; /* floorcod */ 154 floor = floortab[state->bai & 7]; /* floorcod */
155 snroffset = 960 - 64 * state->csnroffst - 4 * (ba->bai >> 3) + floor; 155 snroffset = 960 - 64 * state->csnroffst - 4 * (ba->bai >> 3) + floor;
156 floor >>= 5; 156 floor >>= 5;
157 157
@@ -161,105 +161,105 @@ void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart,
161 i = bndstart; 161 i = bndstart;
162 j = start; 162 j = start;
163 if (start == 0) { /* not the coupling channel */ 163 if (start == 0) { /* not the coupling channel */
164 int lowcomp; 164 int lowcomp;
165 165
166 lowcomp = 0; 166 lowcomp = 0;
167 j = end - 1; 167 j = end - 1;
168 do { 168 do {
169 if (i < j) { 169 if (i < j) {
170 if (exp[i+1] == exp[i] - 2) 170 if (exp[i+1] == exp[i] - 2)
171 lowcomp = 384; 171 lowcomp = 384;
172 else if (lowcomp && (exp[i+1] > exp[i])) 172 else if (lowcomp && (exp[i+1] > exp[i]))
173 lowcomp -= 64; 173 lowcomp -= 64;
174 } 174 }
175 psd = 128 * exp[i]; 175 psd = 128 * exp[i];
176 mask = psd + fgain + lowcomp; 176 mask = psd + fgain + lowcomp;
177 COMPUTE_MASK (); 177 COMPUTE_MASK ();
178 bap[i] = (baptab+156)[mask + 4 * exp[i]]; 178 bap[i] = (baptab+156)[mask + 4 * exp[i]];
179 i++; 179 i++;
180 } while ((i < 3) || ((i < 7) && (exp[i] > exp[i-1]))); 180 } while ((i < 3) || ((i < 7) && (exp[i] > exp[i-1])));
181 fastleak = psd + fgain; 181 fastleak = psd + fgain;
182 slowleak = psd + sgain; 182 slowleak = psd + sgain;
183 183
184 while (i < 7) { 184 while (i < 7) {
185 if (i < j) { 185 if (i < j) {
186 if (exp[i+1] == exp[i] - 2) 186 if (exp[i+1] == exp[i] - 2)
187 lowcomp = 384; 187 lowcomp = 384;
188 else if (lowcomp && (exp[i+1] > exp[i])) 188 else if (lowcomp && (exp[i+1] > exp[i]))
189 lowcomp -= 64; 189 lowcomp -= 64;
190 }
191 psd = 128 * exp[i];
192 UPDATE_LEAK ();
193 mask = ((fastleak + lowcomp < slowleak) ?
194 fastleak + lowcomp : slowleak);
195 COMPUTE_MASK ();
196 bap[i] = (baptab+156)[mask + 4 * exp[i]];
197 i++;
190 } 198 }
191 psd = 128 * exp[i];
192 UPDATE_LEAK ();
193 mask = ((fastleak + lowcomp < slowleak) ?
194 fastleak + lowcomp : slowleak);
195 COMPUTE_MASK ();
196 bap[i] = (baptab+156)[mask + 4 * exp[i]];
197 i++;
198 }
199 199
200 if (end == 7) /* lfe channel */ 200 if (end == 7) /* lfe channel */
201 return; 201 return;
202 202
203 do { 203 do {
204 if (exp[i+1] == exp[i] - 2) 204 if (exp[i+1] == exp[i] - 2)
205 lowcomp = 320; 205 lowcomp = 320;
206 else if (lowcomp && (exp[i+1] > exp[i])) 206 else if (lowcomp && (exp[i+1] > exp[i]))
207 lowcomp -= 64; 207 lowcomp -= 64;
208 psd = 128 * exp[i]; 208 psd = 128 * exp[i];
209 UPDATE_LEAK (); 209 UPDATE_LEAK ();
210 mask = ((fastleak + lowcomp < slowleak) ? 210 mask = ((fastleak + lowcomp < slowleak) ?
211 fastleak + lowcomp : slowleak); 211 fastleak + lowcomp : slowleak);
212 COMPUTE_MASK (); 212 COMPUTE_MASK ();
213 bap[i] = (baptab+156)[mask + 4 * exp[i]]; 213 bap[i] = (baptab+156)[mask + 4 * exp[i]];
214 i++; 214 i++;
215 } while (i < 20); 215 } while (i < 20);
216 216
217 while (lowcomp > 128) { /* two iterations maximum */ 217 while (lowcomp > 128) { /* two iterations maximum */
218 lowcomp -= 128; 218 lowcomp -= 128;
219 psd = 128 * exp[i]; 219 psd = 128 * exp[i];
220 UPDATE_LEAK (); 220 UPDATE_LEAK ();
221 mask = ((fastleak + lowcomp < slowleak) ? 221 mask = ((fastleak + lowcomp < slowleak) ?
222 fastleak + lowcomp : slowleak); 222 fastleak + lowcomp : slowleak);
223 COMPUTE_MASK (); 223 COMPUTE_MASK ();
224 bap[i] = (baptab+156)[mask + 4 * exp[i]]; 224 bap[i] = (baptab+156)[mask + 4 * exp[i]];
225 i++; 225 i++;
226 } 226 }
227 j = i; 227 j = i;
228 } 228 }
229 229
230 do { 230 do {
231 int startband, endband; 231 int startband, endband;
232 232
233 startband = j; 233 startband = j;
234 endband = (bndtab[i-20] < end) ? bndtab[i-20] : end; 234 endband = (bndtab[i-20] < end) ? bndtab[i-20] : end;
235 psd = 128 * exp[j++]; 235 psd = 128 * exp[j++];
236 while (j < endband) { 236 while (j < endband) {
237 int next, delta; 237 int next, delta;
238 238
239 next = 128 * exp[j++]; 239 next = 128 * exp[j++];
240 delta = next - psd; 240 delta = next - psd;
241 switch (delta >> 9) { 241 switch (delta >> 9) {
242 case -6: case -5: case -4: case -3: case -2: 242 case -6: case -5: case -4: case -3: case -2:
243 psd = next; 243 psd = next;
244 break; 244 break;
245 case -1: 245 case -1:
246 psd = next + latab[(-delta) >> 1]; 246 psd = next + latab[(-delta) >> 1];
247 break; 247 break;
248 case 0: 248 case 0:
249 psd += latab[delta >> 1]; 249 psd += latab[delta >> 1];
250 break; 250 break;
251 }
251 } 252 }
252 } 253 /* minpsd = -289 */
253 /* minpsd = -289 */ 254 UPDATE_LEAK ();
254 UPDATE_LEAK (); 255 mask = (fastleak < slowleak) ? fastleak : slowleak;
255 mask = (fastleak < slowleak) ? fastleak : slowleak; 256 COMPUTE_MASK ();
256 COMPUTE_MASK (); 257 i++;
257 i++; 258 j = startband;
258 j = startband; 259 do {
259 do { 260 /* max(mask+4*exp)=147=-(minpsd+fgain-deltba-snroffset)>>5+4*exp */
260 /* max(mask+4*exp)=147=-(minpsd+fgain-deltba-snroffset)>>5+4*exp */ 261 /* min(mask+4*exp)=-156=-(sgain-deltba-snroffset)>>5 */
261 /* min(mask+4*exp)=-156=-(sgain-deltba-snroffset)>>5 */ 262 bap[j] = (baptab+156)[mask + 4 * exp[j]];
262 bap[j] = (baptab+156)[mask + 4 * exp[j]]; 263 } while (++j < endband);
263 } while (++j < endband);
264 } while (j < end); 264 } while (j < end);
265} 265}
diff --git a/apps/codecs/liba52/bitstream.c b/apps/codecs/liba52/bitstream.c
index f9f3ad76b0..155368f1ed 100644
--- a/apps/codecs/liba52/bitstream.c
+++ b/apps/codecs/liba52/bitstream.c
@@ -66,12 +66,12 @@ uint32_t a52_bitstream_get_bh (a52_state_t * state, uint32_t num_bits)
66 66
67 num_bits -= state->bits_left; 67 num_bits -= state->bits_left;
68 result = ((state->current_word << (32 - state->bits_left)) >> 68 result = ((state->current_word << (32 - state->bits_left)) >>
69 (32 - state->bits_left)); 69 (32 - state->bits_left));
70 70
71 bitstream_fill_current (state); 71 bitstream_fill_current (state);
72 72
73 if (num_bits != 0) 73 if (num_bits != 0)
74 result = (result << num_bits) | (state->current_word >> (32 - num_bits)); 74 result = (result << num_bits) | (state->current_word >> (32 - num_bits));
75 75
76 state->bits_left = 32 - num_bits; 76 state->bits_left = 32 - num_bits;
77 77
@@ -84,13 +84,13 @@ int32_t a52_bitstream_get_bh_2 (a52_state_t * state, uint32_t num_bits)
84 84
85 num_bits -= state->bits_left; 85 num_bits -= state->bits_left;
86 result = ((((int32_t)state->current_word) << (32 - state->bits_left)) >> 86 result = ((((int32_t)state->current_word) << (32 - state->bits_left)) >>
87 (32 - state->bits_left)); 87 (32 - state->bits_left));
88 88
89 bitstream_fill_current(state); 89 bitstream_fill_current(state);
90 90
91 if (num_bits != 0) 91 if (num_bits != 0)
92 result = (result << num_bits) | (state->current_word >> (32 - num_bits)); 92 result = (result << num_bits) | (state->current_word >> (32 - num_bits));
93 93
94 state->bits_left = 32 - num_bits; 94 state->bits_left = 32 - num_bits;
95 95
96 return result; 96 return result;
diff --git a/apps/codecs/liba52/bitstream.h b/apps/codecs/liba52/bitstream.h
index c316a971b5..56de1571b7 100644
--- a/apps/codecs/liba52/bitstream.h
+++ b/apps/codecs/liba52/bitstream.h
@@ -30,11 +30,11 @@ int32_t a52_bitstream_get_bh_2 (a52_state_t * state, uint32_t num_bits);
30static inline uint32_t bitstream_get (a52_state_t * state, uint32_t num_bits) 30static inline uint32_t bitstream_get (a52_state_t * state, uint32_t num_bits)
31{ 31{
32 uint32_t result; 32 uint32_t result;
33 33
34 if (num_bits < state->bits_left) { 34 if (num_bits < state->bits_left) {
35 result = (state->current_word << (32 - state->bits_left)) >> (32 - num_bits); 35 result = (state->current_word << (32 - state->bits_left)) >> (32 - num_bits);
36 state->bits_left -= num_bits; 36 state->bits_left -= num_bits;
37 return result; 37 return result;
38 } 38 }
39 39
40 return a52_bitstream_get_bh (state, num_bits); 40 return a52_bitstream_get_bh (state, num_bits);
@@ -43,11 +43,11 @@ static inline uint32_t bitstream_get (a52_state_t * state, uint32_t num_bits)
43static inline int32_t bitstream_get_2 (a52_state_t * state, uint32_t num_bits) 43static inline int32_t bitstream_get_2 (a52_state_t * state, uint32_t num_bits)
44{ 44{
45 int32_t result; 45 int32_t result;
46 46
47 if (num_bits < state->bits_left) { 47 if (num_bits < state->bits_left) {
48 result = (((int32_t)state->current_word) << (32 - state->bits_left)) >> (32 - num_bits); 48 result = (((int32_t)state->current_word) << (32 - state->bits_left)) >> (32 - num_bits);
49 state->bits_left -= num_bits; 49 state->bits_left -= num_bits;
50 return result; 50 return result;
51 } 51 }
52 52
53 return a52_bitstream_get_bh_2 (state, num_bits); 53 return a52_bitstream_get_bh_2 (state, num_bits);
diff --git a/apps/codecs/liba52/downmix.c b/apps/codecs/liba52/downmix.c
index b9506de8c1..dd2867cb92 100644
--- a/apps/codecs/liba52/downmix.c
+++ b/apps/codecs/liba52/downmix.c
@@ -32,135 +32,135 @@
32#define CONVERT(acmod,output) (((output) << 3) + (acmod)) 32#define CONVERT(acmod,output) (((output) << 3) + (acmod))
33 33
34int a52_downmix_init (int input, int flags, level_t * level, 34int a52_downmix_init (int input, int flags, level_t * level,
35 level_t clev, level_t slev) 35 level_t clev, level_t slev)
36{ 36{
37 static uint8_t table[11][8] = { 37 static uint8_t table[11][8] = {
38 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, 38 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
39 A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO}, 39 A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO},
40 {A52_MONO, A52_MONO, A52_MONO, A52_MONO, 40 {A52_MONO, A52_MONO, A52_MONO, A52_MONO,
41 A52_MONO, A52_MONO, A52_MONO, A52_MONO}, 41 A52_MONO, A52_MONO, A52_MONO, A52_MONO},
42 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, 42 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
43 A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO}, 43 A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO},
44 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F, 44 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
45 A52_STEREO, A52_3F, A52_STEREO, A52_3F}, 45 A52_STEREO, A52_3F, A52_STEREO, A52_3F},
46 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, 46 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
47 A52_2F1R, A52_2F1R, A52_2F1R, A52_2F1R}, 47 A52_2F1R, A52_2F1R, A52_2F1R, A52_2F1R},
48 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO, 48 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
49 A52_2F1R, A52_3F1R, A52_2F1R, A52_3F1R}, 49 A52_2F1R, A52_3F1R, A52_2F1R, A52_3F1R},
50 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F, 50 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
51 A52_2F2R, A52_2F2R, A52_2F2R, A52_2F2R}, 51 A52_2F2R, A52_2F2R, A52_2F2R, A52_2F2R},
52 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F, 52 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_3F,
53 A52_2F2R, A52_3F2R, A52_2F2R, A52_3F2R}, 53 A52_2F2R, A52_3F2R, A52_2F2R, A52_3F2R},
54 {A52_CHANNEL1, A52_MONO, A52_MONO, A52_MONO, 54 {A52_CHANNEL1, A52_MONO, A52_MONO, A52_MONO,
55 A52_MONO, A52_MONO, A52_MONO, A52_MONO}, 55 A52_MONO, A52_MONO, A52_MONO, A52_MONO},
56 {A52_CHANNEL2, A52_MONO, A52_MONO, A52_MONO, 56 {A52_CHANNEL2, A52_MONO, A52_MONO, A52_MONO,
57 A52_MONO, A52_MONO, A52_MONO, A52_MONO}, 57 A52_MONO, A52_MONO, A52_MONO, A52_MONO},
58 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_DOLBY, 58 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_DOLBY,
59 A52_DOLBY, A52_DOLBY, A52_DOLBY, A52_DOLBY} 59 A52_DOLBY, A52_DOLBY, A52_DOLBY, A52_DOLBY}
60 }; 60 };
61 int output; 61 int output;
62 62
63 output = flags & A52_CHANNEL_MASK; 63 output = flags & A52_CHANNEL_MASK;
64 if (output > A52_DOLBY) 64 if (output > A52_DOLBY)
65 return -1; 65 return -1;
66 66
67 output = table[output][input & 7]; 67 output = table[output][input & 7];
68 68
69 if (output == A52_STEREO && 69 if (output == A52_STEREO &&
70 (input == A52_DOLBY || (input == A52_3F && clev == LEVEL (LEVEL_3DB)))) 70 (input == A52_DOLBY || (input == A52_3F && clev == LEVEL (LEVEL_3DB))))
71 output = A52_DOLBY; 71 output = A52_DOLBY;
72 72
73 if (flags & A52_ADJUST_LEVEL) { 73 if (flags & A52_ADJUST_LEVEL) {
74 level_t adjust; 74 level_t adjust;
75 75
76 switch (CONVERT (input & 7, output)) { 76 switch (CONVERT (input & 7, output)) {
77 77
78 case CONVERT (A52_3F, A52_MONO): 78 case CONVERT (A52_3F, A52_MONO):
79 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev); 79 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev);
80 break; 80 break;
81 81
82 case CONVERT (A52_STEREO, A52_MONO): 82 case CONVERT (A52_STEREO, A52_MONO):
83 case CONVERT (A52_2F2R, A52_2F1R): 83 case CONVERT (A52_2F2R, A52_2F1R):
84 case CONVERT (A52_3F2R, A52_3F1R): 84 case CONVERT (A52_3F2R, A52_3F1R):
85 level_3db: 85 level_3db:
86 adjust = LEVEL (LEVEL_3DB); 86 adjust = LEVEL (LEVEL_3DB);
87 break; 87 break;
88 88
89 case CONVERT (A52_3F2R, A52_2F1R): 89 case CONVERT (A52_3F2R, A52_2F1R):
90 if (clev < LEVEL (LEVEL_PLUS3DB - 1)) 90 if (clev < LEVEL (LEVEL_PLUS3DB - 1))
91 goto level_3db; 91 goto level_3db;
92 /* break thru */ 92 /* break thru */
93 case CONVERT (A52_3F, A52_STEREO): 93 case CONVERT (A52_3F, A52_STEREO):
94 case CONVERT (A52_3F1R, A52_2F1R): 94 case CONVERT (A52_3F1R, A52_2F1R):
95 case CONVERT (A52_3F1R, A52_2F2R): 95 case CONVERT (A52_3F1R, A52_2F2R):
96 case CONVERT (A52_3F2R, A52_2F2R): 96 case CONVERT (A52_3F2R, A52_2F2R):
97 adjust = DIV (1, LEVEL (1) + clev); 97 adjust = DIV (1, LEVEL (1) + clev);
98 break; 98 break;
99 99
100 case CONVERT (A52_2F1R, A52_MONO): 100 case CONVERT (A52_2F1R, A52_MONO):
101 adjust = DIV (LEVEL_PLUS3DB, LEVEL (2) + slev); 101 adjust = DIV (LEVEL_PLUS3DB, LEVEL (2) + slev);
102 break; 102 break;
103 103
104 case CONVERT (A52_2F1R, A52_STEREO): 104 case CONVERT (A52_2F1R, A52_STEREO):
105 case CONVERT (A52_3F1R, A52_3F): 105 case CONVERT (A52_3F1R, A52_3F):
106 adjust = DIV (1, LEVEL (1) + MUL_C (slev, LEVEL_3DB)); 106 adjust = DIV (1, LEVEL (1) + MUL_C (slev, LEVEL_3DB));
107 break; 107 break;
108 108
109 case CONVERT (A52_3F1R, A52_MONO): 109 case CONVERT (A52_3F1R, A52_MONO):
110 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + MUL_C (slev, 0.5)); 110 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + MUL_C (slev, 0.5));
111 break; 111 break;
112 112
113 case CONVERT (A52_3F1R, A52_STEREO): 113 case CONVERT (A52_3F1R, A52_STEREO):
114 adjust = DIV (1, LEVEL (1) + clev + MUL_C (slev, LEVEL_3DB)); 114 adjust = DIV (1, LEVEL (1) + clev + MUL_C (slev, LEVEL_3DB));
115 break; 115 break;
116 116
117 case CONVERT (A52_2F2R, A52_MONO): 117 case CONVERT (A52_2F2R, A52_MONO):
118 adjust = DIV (LEVEL_3DB, LEVEL (1) + slev); 118 adjust = DIV (LEVEL_3DB, LEVEL (1) + slev);
119 break; 119 break;
120 120
121 case CONVERT (A52_2F2R, A52_STEREO): 121 case CONVERT (A52_2F2R, A52_STEREO):
122 case CONVERT (A52_3F2R, A52_3F): 122 case CONVERT (A52_3F2R, A52_3F):
123 adjust = DIV (1, LEVEL (1) + slev); 123 adjust = DIV (1, LEVEL (1) + slev);
124 break; 124 break;
125 125
126 case CONVERT (A52_3F2R, A52_MONO): 126 case CONVERT (A52_3F2R, A52_MONO):
127 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + slev); 127 adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + slev);
128 break; 128 break;
129 129
130 case CONVERT (A52_3F2R, A52_STEREO): 130 case CONVERT (A52_3F2R, A52_STEREO):
131 adjust = DIV (1, LEVEL (1) + clev + slev); 131 adjust = DIV (1, LEVEL (1) + clev + slev);
132 break; 132 break;
133 133
134 case CONVERT (A52_MONO, A52_DOLBY): 134 case CONVERT (A52_MONO, A52_DOLBY):
135 adjust = LEVEL (LEVEL_PLUS3DB); 135 adjust = LEVEL (LEVEL_PLUS3DB);
136 break; 136 break;
137 137
138 case CONVERT (A52_3F, A52_DOLBY): 138 case CONVERT (A52_3F, A52_DOLBY):
139 case CONVERT (A52_2F1R, A52_DOLBY): 139 case CONVERT (A52_2F1R, A52_DOLBY):
140 adjust = LEVEL (1 / (1 + LEVEL_3DB)); 140 adjust = LEVEL (1 / (1 + LEVEL_3DB));
141 break; 141 break;
142 142
143 case CONVERT (A52_3F1R, A52_DOLBY): 143 case CONVERT (A52_3F1R, A52_DOLBY):
144 case CONVERT (A52_2F2R, A52_DOLBY): 144 case CONVERT (A52_2F2R, A52_DOLBY):
145 adjust = LEVEL (1 / (1 + 2 * LEVEL_3DB)); 145 adjust = LEVEL (1 / (1 + 2 * LEVEL_3DB));
146 break; 146 break;
147 147
148 case CONVERT (A52_3F2R, A52_DOLBY): 148 case CONVERT (A52_3F2R, A52_DOLBY):
149 adjust = LEVEL (1 / (1 + 3 * LEVEL_3DB)); 149 adjust = LEVEL (1 / (1 + 3 * LEVEL_3DB));
150 break; 150 break;
151 151
152 default: 152 default:
153 return output; 153 return output;
154 } 154 }
155 155
156 *level = MUL_L (*level, adjust); 156 *level = MUL_L (*level, adjust);
157 } 157 }
158 158
159 return output; 159 return output;
160} 160}
161 161
162int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level, 162int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
163 level_t clev, level_t slev) 163 level_t clev, level_t slev)
164{ 164{
165 level_t level_3db; 165 level_t level_3db;
166 166
@@ -177,153 +177,153 @@ int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
177 case CONVERT (A52_2F2R, A52_2F2R): 177 case CONVERT (A52_2F2R, A52_2F2R):
178 case CONVERT (A52_3F2R, A52_3F2R): 178 case CONVERT (A52_3F2R, A52_3F2R):
179 case CONVERT (A52_STEREO, A52_DOLBY): 179 case CONVERT (A52_STEREO, A52_DOLBY):
180 coeff[0] = coeff[1] = coeff[2] = coeff[3] = coeff[4] = level; 180 coeff[0] = coeff[1] = coeff[2] = coeff[3] = coeff[4] = level;
181 return 0; 181 return 0;
182 182
183 case CONVERT (A52_CHANNEL, A52_MONO): 183 case CONVERT (A52_CHANNEL, A52_MONO):
184 coeff[0] = coeff[1] = MUL_C (level, LEVEL_6DB); 184 coeff[0] = coeff[1] = MUL_C (level, LEVEL_6DB);
185 return 3; 185 return 3;
186 186
187 case CONVERT (A52_STEREO, A52_MONO): 187 case CONVERT (A52_STEREO, A52_MONO):
188 coeff[0] = coeff[1] = level_3db; 188 coeff[0] = coeff[1] = level_3db;
189 return 3; 189 return 3;
190 190
191 case CONVERT (A52_3F, A52_MONO): 191 case CONVERT (A52_3F, A52_MONO):
192 coeff[0] = coeff[2] = level_3db; 192 coeff[0] = coeff[2] = level_3db;
193 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB); 193 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
194 return 7; 194 return 7;
195 195
196 case CONVERT (A52_2F1R, A52_MONO): 196 case CONVERT (A52_2F1R, A52_MONO):
197 coeff[0] = coeff[1] = level_3db; 197 coeff[0] = coeff[1] = level_3db;
198 coeff[2] = MUL_L (level_3db, slev); 198 coeff[2] = MUL_L (level_3db, slev);
199 return 7; 199 return 7;
200 200
201 case CONVERT (A52_2F2R, A52_MONO): 201 case CONVERT (A52_2F2R, A52_MONO):
202 coeff[0] = coeff[1] = level_3db; 202 coeff[0] = coeff[1] = level_3db;
203 coeff[2] = coeff[3] = MUL_L (level_3db, slev); 203 coeff[2] = coeff[3] = MUL_L (level_3db, slev);
204 return 15; 204 return 15;
205 205
206 case CONVERT (A52_3F1R, A52_MONO): 206 case CONVERT (A52_3F1R, A52_MONO):
207 coeff[0] = coeff[2] = level_3db; 207 coeff[0] = coeff[2] = level_3db;
208 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB); 208 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
209 coeff[3] = MUL_L (level_3db, slev); 209 coeff[3] = MUL_L (level_3db, slev);
210 return 15; 210 return 15;
211 211
212 case CONVERT (A52_3F2R, A52_MONO): 212 case CONVERT (A52_3F2R, A52_MONO):
213 coeff[0] = coeff[2] = level_3db; 213 coeff[0] = coeff[2] = level_3db;
214 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB); 214 coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
215 coeff[3] = coeff[4] = MUL_L (level_3db, slev); 215 coeff[3] = coeff[4] = MUL_L (level_3db, slev);
216 return 31; 216 return 31;
217 217
218 case CONVERT (A52_MONO, A52_DOLBY): 218 case CONVERT (A52_MONO, A52_DOLBY):
219 coeff[0] = level_3db; 219 coeff[0] = level_3db;
220 return 0; 220 return 0;
221 221
222 case CONVERT (A52_3F, A52_DOLBY): 222 case CONVERT (A52_3F, A52_DOLBY):
223 coeff[0] = coeff[2] = coeff[3] = coeff[4] = level; 223 coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
224 coeff[1] = level_3db; 224 coeff[1] = level_3db;
225 return 7; 225 return 7;
226 226
227 case CONVERT (A52_3F, A52_STEREO): 227 case CONVERT (A52_3F, A52_STEREO):
228 case CONVERT (A52_3F1R, A52_2F1R): 228 case CONVERT (A52_3F1R, A52_2F1R):
229 case CONVERT (A52_3F2R, A52_2F2R): 229 case CONVERT (A52_3F2R, A52_2F2R):
230 coeff[0] = coeff[2] = coeff[3] = coeff[4] = level; 230 coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
231 coeff[1] = MUL_L (level, clev); 231 coeff[1] = MUL_L (level, clev);
232 return 7; 232 return 7;
233 233
234 case CONVERT (A52_2F1R, A52_DOLBY): 234 case CONVERT (A52_2F1R, A52_DOLBY):
235 coeff[0] = coeff[1] = level; 235 coeff[0] = coeff[1] = level;
236 coeff[2] = level_3db; 236 coeff[2] = level_3db;
237 return 7; 237 return 7;
238 238
239 case CONVERT (A52_2F1R, A52_STEREO): 239 case CONVERT (A52_2F1R, A52_STEREO):
240 coeff[0] = coeff[1] = level; 240 coeff[0] = coeff[1] = level;
241 coeff[2] = MUL_L (level_3db, slev); 241 coeff[2] = MUL_L (level_3db, slev);
242 return 7; 242 return 7;
243 243
244 case CONVERT (A52_3F1R, A52_DOLBY): 244 case CONVERT (A52_3F1R, A52_DOLBY):
245 coeff[0] = coeff[2] = level; 245 coeff[0] = coeff[2] = level;
246 coeff[1] = coeff[3] = level_3db; 246 coeff[1] = coeff[3] = level_3db;
247 return 15; 247 return 15;
248 248
249 case CONVERT (A52_3F1R, A52_STEREO): 249 case CONVERT (A52_3F1R, A52_STEREO):
250 coeff[0] = coeff[2] = level; 250 coeff[0] = coeff[2] = level;
251 coeff[1] = MUL_L (level, clev); 251 coeff[1] = MUL_L (level, clev);
252 coeff[3] = MUL_L (level_3db, slev); 252 coeff[3] = MUL_L (level_3db, slev);
253 return 15; 253 return 15;
254 254
255 case CONVERT (A52_2F2R, A52_DOLBY): 255 case CONVERT (A52_2F2R, A52_DOLBY):
256 coeff[0] = coeff[1] = level; 256 coeff[0] = coeff[1] = level;
257 coeff[2] = coeff[3] = level_3db; 257 coeff[2] = coeff[3] = level_3db;
258 return 15; 258 return 15;
259 259
260 case CONVERT (A52_2F2R, A52_STEREO): 260 case CONVERT (A52_2F2R, A52_STEREO):
261 coeff[0] = coeff[1] = level; 261 coeff[0] = coeff[1] = level;
262 coeff[2] = coeff[3] = MUL_L (level, slev); 262 coeff[2] = coeff[3] = MUL_L (level, slev);
263 return 15; 263 return 15;
264 264
265 case CONVERT (A52_3F2R, A52_DOLBY): 265 case CONVERT (A52_3F2R, A52_DOLBY):
266 coeff[0] = coeff[2] = level; 266 coeff[0] = coeff[2] = level;
267 coeff[1] = coeff[3] = coeff[4] = level_3db; 267 coeff[1] = coeff[3] = coeff[4] = level_3db;
268 return 31; 268 return 31;
269 269
270 case CONVERT (A52_3F2R, A52_2F1R): 270 case CONVERT (A52_3F2R, A52_2F1R):
271 coeff[0] = coeff[2] = level; 271 coeff[0] = coeff[2] = level;
272 coeff[1] = MUL_L (level, clev); 272 coeff[1] = MUL_L (level, clev);
273 coeff[3] = coeff[4] = level_3db; 273 coeff[3] = coeff[4] = level_3db;
274 return 31; 274 return 31;
275 275
276 case CONVERT (A52_3F2R, A52_STEREO): 276 case CONVERT (A52_3F2R, A52_STEREO):
277 coeff[0] = coeff[2] = level; 277 coeff[0] = coeff[2] = level;
278 coeff[1] = MUL_L (level, clev); 278 coeff[1] = MUL_L (level, clev);
279 coeff[3] = coeff[4] = MUL_L (level, slev); 279 coeff[3] = coeff[4] = MUL_L (level, slev);
280 return 31; 280 return 31;
281 281
282 case CONVERT (A52_3F1R, A52_3F): 282 case CONVERT (A52_3F1R, A52_3F):
283 coeff[0] = coeff[1] = coeff[2] = level; 283 coeff[0] = coeff[1] = coeff[2] = level;
284 coeff[3] = MUL_L (level_3db, slev); 284 coeff[3] = MUL_L (level_3db, slev);
285 return 13; 285 return 13;
286 286
287 case CONVERT (A52_3F2R, A52_3F): 287 case CONVERT (A52_3F2R, A52_3F):
288 coeff[0] = coeff[1] = coeff[2] = level; 288 coeff[0] = coeff[1] = coeff[2] = level;
289 coeff[3] = coeff[4] = MUL_L (level, slev); 289 coeff[3] = coeff[4] = MUL_L (level, slev);
290 return 29; 290 return 29;
291 291
292 case CONVERT (A52_2F2R, A52_2F1R): 292 case CONVERT (A52_2F2R, A52_2F1R):
293 coeff[0] = coeff[1] = level; 293 coeff[0] = coeff[1] = level;
294 coeff[2] = coeff[3] = level_3db; 294 coeff[2] = coeff[3] = level_3db;
295 return 12; 295 return 12;
296 296
297 case CONVERT (A52_3F2R, A52_3F1R): 297 case CONVERT (A52_3F2R, A52_3F1R):
298 coeff[0] = coeff[1] = coeff[2] = level; 298 coeff[0] = coeff[1] = coeff[2] = level;
299 coeff[3] = coeff[4] = level_3db; 299 coeff[3] = coeff[4] = level_3db;
300 return 24; 300 return 24;
301 301
302 case CONVERT (A52_2F1R, A52_2F2R): 302 case CONVERT (A52_2F1R, A52_2F2R):
303 coeff[0] = coeff[1] = level; 303 coeff[0] = coeff[1] = level;
304 coeff[2] = level_3db; 304 coeff[2] = level_3db;
305 return 0; 305 return 0;
306 306
307 case CONVERT (A52_3F1R, A52_2F2R): 307 case CONVERT (A52_3F1R, A52_2F2R):
308 coeff[0] = coeff[2] = level; 308 coeff[0] = coeff[2] = level;
309 coeff[1] = MUL_L (level, clev); 309 coeff[1] = MUL_L (level, clev);
310 coeff[3] = level_3db; 310 coeff[3] = level_3db;
311 return 7; 311 return 7;
312 312
313 case CONVERT (A52_3F1R, A52_3F2R): 313 case CONVERT (A52_3F1R, A52_3F2R):
314 coeff[0] = coeff[1] = coeff[2] = level; 314 coeff[0] = coeff[1] = coeff[2] = level;
315 coeff[3] = level_3db; 315 coeff[3] = level_3db;
316 return 0; 316 return 0;
317 317
318 case CONVERT (A52_CHANNEL, A52_CHANNEL1): 318 case CONVERT (A52_CHANNEL, A52_CHANNEL1):
319 coeff[0] = level; 319 coeff[0] = level;
320 coeff[1] = 0; 320 coeff[1] = 0;
321 return 0; 321 return 0;
322 322
323 case CONVERT (A52_CHANNEL, A52_CHANNEL2): 323 case CONVERT (A52_CHANNEL, A52_CHANNEL2):
324 coeff[0] = 0; 324 coeff[0] = 0;
325 coeff[1] = level; 325 coeff[1] = level;
326 return 0; 326 return 0;
327 } 327 }
328 328
329 return -1; /* NOTREACHED */ 329 return -1; /* NOTREACHED */
@@ -334,7 +334,7 @@ static void mix2to1 (sample_t * dest, sample_t * src)
334 int i; 334 int i;
335 335
336 for (i = 0; i < 256; i++) 336 for (i = 0; i < 256; i++)
337 dest[i] += BIAS (src[i]); 337 dest[i] += BIAS (src[i]);
338} 338}
339 339
340static void mix3to1 (sample_t * samples) 340static void mix3to1 (sample_t * samples)
@@ -342,7 +342,7 @@ static void mix3to1 (sample_t * samples)
342 int i; 342 int i;
343 343
344 for (i = 0; i < 256; i++) 344 for (i = 0; i < 256; i++)
345 samples[i] += BIAS (samples[i + 256] + samples[i + 512]); 345 samples[i] += BIAS (samples[i + 256] + samples[i + 512]);
346} 346}
347 347
348static void mix4to1 (sample_t * samples) 348static void mix4to1 (sample_t * samples)
@@ -350,8 +350,8 @@ static void mix4to1 (sample_t * samples)
350 int i; 350 int i;
351 351
352 for (i = 0; i < 256; i++) 352 for (i = 0; i < 256; i++)
353 samples[i] += BIAS (samples[i + 256] + samples[i + 512] + 353 samples[i] += BIAS (samples[i + 256] + samples[i + 512] +
354 samples[i + 768]); 354 samples[i + 768]);
355} 355}
356 356
357static void mix5to1 (sample_t * samples) 357static void mix5to1 (sample_t * samples)
@@ -359,8 +359,8 @@ static void mix5to1 (sample_t * samples)
359 int i; 359 int i;
360 360
361 for (i = 0; i < 256; i++) 361 for (i = 0; i < 256; i++)
362 samples[i] += BIAS (samples[i + 256] + samples[i + 512] + 362 samples[i] += BIAS (samples[i + 256] + samples[i + 512] +
363 samples[i + 768] + samples[i + 1024]); 363 samples[i + 768] + samples[i + 1024]);
364} 364}
365 365
366static void mix3to2 (sample_t * samples) 366static void mix3to2 (sample_t * samples)
@@ -369,9 +369,9 @@ static void mix3to2 (sample_t * samples)
369 sample_t common; 369 sample_t common;
370 370
371 for (i = 0; i < 256; i++) { 371 for (i = 0; i < 256; i++) {
372 common = BIAS (samples[i + 256]); 372 common = BIAS (samples[i + 256]);
373 samples[i] += common; 373 samples[i] += common;
374 samples[i + 256] = samples[i + 512] + common; 374 samples[i + 256] = samples[i + 512] + common;
375 } 375 }
376} 376}
377 377
@@ -381,9 +381,9 @@ static void mix21to2 (sample_t * left, sample_t * right)
381 sample_t common; 381 sample_t common;
382 382
383 for (i = 0; i < 256; i++) { 383 for (i = 0; i < 256; i++) {
384 common = BIAS (right[i + 256]); 384 common = BIAS (right[i + 256]);
385 left[i] += common; 385 left[i] += common;
386 right[i] += common; 386 right[i] += common;
387 } 387 }
388} 388}
389 389
@@ -393,9 +393,9 @@ static void mix21toS (sample_t * samples)
393 sample_t surround; 393 sample_t surround;
394 394
395 for (i = 0; i < 256; i++) { 395 for (i = 0; i < 256; i++) {
396 surround = samples[i + 512]; 396 surround = samples[i + 512];
397 samples[i] += BIAS (-surround); 397 samples[i] += BIAS (-surround);
398 samples[i + 256] += BIAS (surround); 398 samples[i + 256] += BIAS (surround);
399 } 399 }
400} 400}
401 401
@@ -405,9 +405,9 @@ static void mix31to2 (sample_t * samples)
405 sample_t common; 405 sample_t common;
406 406
407 for (i = 0; i < 256; i++) { 407 for (i = 0; i < 256; i++) {
408 common = BIAS (samples[i + 256] + samples[i + 768]); 408 common = BIAS (samples[i + 256] + samples[i + 768]);
409 samples[i] += common; 409 samples[i] += common;
410 samples[i + 256] = samples[i + 512] + common; 410 samples[i + 256] = samples[i + 512] + common;
411 } 411 }
412} 412}
413 413
@@ -417,10 +417,10 @@ static void mix31toS (sample_t * samples)
417 sample_t common, surround; 417 sample_t common, surround;
418 418
419 for (i = 0; i < 256; i++) { 419 for (i = 0; i < 256; i++) {
420 common = BIAS (samples[i + 256]); 420 common = BIAS (samples[i + 256]);
421 surround = samples[i + 768]; 421 surround = samples[i + 768];
422 samples[i] += common - surround; 422 samples[i] += common - surround;
423 samples[i + 256] = samples[i + 512] + common + surround; 423 samples[i + 256] = samples[i + 512] + common + surround;
424 } 424 }
425} 425}
426 426
@@ -430,9 +430,9 @@ static void mix22toS (sample_t * samples)
430 sample_t surround; 430 sample_t surround;
431 431
432 for (i = 0; i < 256; i++) { 432 for (i = 0; i < 256; i++) {
433 surround = samples[i + 512] + samples[i + 768]; 433 surround = samples[i + 512] + samples[i + 768];
434 samples[i] += BIAS (-surround); 434 samples[i] += BIAS (-surround);
435 samples[i + 256] += BIAS (surround); 435 samples[i + 256] += BIAS (surround);
436 } 436 }
437} 437}
438 438
@@ -442,9 +442,9 @@ static void mix32to2 (sample_t * samples)
442 sample_t common; 442 sample_t common;
443 443
444 for (i = 0; i < 256; i++) { 444 for (i = 0; i < 256; i++) {
445 common = BIAS (samples[i + 256]); 445 common = BIAS (samples[i + 256]);
446 samples[i] += common + samples[i + 768]; 446 samples[i] += common + samples[i + 768];
447 samples[i + 256] = common + samples[i + 512] + samples[i + 1024]; 447 samples[i + 256] = common + samples[i + 512] + samples[i + 1024];
448 } 448 }
449} 449}
450 450
@@ -454,10 +454,10 @@ static void mix32toS (sample_t * samples)
454 sample_t common, surround; 454 sample_t common, surround;
455 455
456 for (i = 0; i < 256; i++) { 456 for (i = 0; i < 256; i++) {
457 common = BIAS (samples[i + 256]); 457 common = BIAS (samples[i + 256]);
458 surround = samples[i + 768] + samples[i + 1024]; 458 surround = samples[i + 768] + samples[i + 1024];
459 samples[i] += common - surround; 459 samples[i] += common - surround;
460 samples[i + 256] = samples[i + 512] + common + surround; 460 samples[i + 256] = samples[i + 512] + common + surround;
461 } 461 }
462} 462}
463 463
@@ -466,7 +466,7 @@ static void move2to1 (sample_t * src, sample_t * dest)
466 int i; 466 int i;
467 467
468 for (i = 0; i < 256; i++) 468 for (i = 0; i < 256; i++)
469 dest[i] = BIAS (src[i] + src[i + 256]); 469 dest[i] = BIAS (src[i] + src[i + 256]);
470} 470}
471 471
472static void zero (sample_t * samples) 472static void zero (sample_t * samples)
@@ -474,11 +474,11 @@ static void zero (sample_t * samples)
474 int i; 474 int i;
475 475
476 for (i = 0; i < 256; i++) 476 for (i = 0; i < 256; i++)
477 samples[i] = 0; 477 samples[i] = 0;
478} 478}
479 479
480void a52_downmix (sample_t * samples, int acmod, int output, 480void a52_downmix (sample_t * samples, int acmod, int output,
481 level_t clev, level_t slev) 481 level_t clev, level_t slev)
482{ 482{
483 /* avoid compiler warning */ 483 /* avoid compiler warning */
484 (void)clev; 484 (void)clev;
@@ -486,138 +486,138 @@ void a52_downmix (sample_t * samples, int acmod, int output,
486 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { 486 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
487 487
488 case CONVERT (A52_CHANNEL, A52_CHANNEL2): 488 case CONVERT (A52_CHANNEL, A52_CHANNEL2):
489 memcpy (samples, samples + 256, 256 * sizeof (sample_t)); 489 memcpy (samples, samples + 256, 256 * sizeof (sample_t));
490 break; 490 break;
491 491
492 case CONVERT (A52_CHANNEL, A52_MONO): 492 case CONVERT (A52_CHANNEL, A52_MONO):
493 case CONVERT (A52_STEREO, A52_MONO): 493 case CONVERT (A52_STEREO, A52_MONO):
494 mix_2to1: 494 mix_2to1:
495 mix2to1 (samples, samples + 256); 495 mix2to1 (samples, samples + 256);
496 break; 496 break;
497 497
498 case CONVERT (A52_2F1R, A52_MONO): 498 case CONVERT (A52_2F1R, A52_MONO):
499 if (slev == 0) 499 if (slev == 0)
500 goto mix_2to1; 500 goto mix_2to1;
501 case CONVERT (A52_3F, A52_MONO): 501 case CONVERT (A52_3F, A52_MONO):
502 mix_3to1: 502 mix_3to1:
503 mix3to1 (samples); 503 mix3to1 (samples);
504 break; 504 break;
505 505
506 case CONVERT (A52_3F1R, A52_MONO): 506 case CONVERT (A52_3F1R, A52_MONO):
507 if (slev == 0) 507 if (slev == 0)
508 goto mix_3to1; 508 goto mix_3to1;
509 case CONVERT (A52_2F2R, A52_MONO): 509 case CONVERT (A52_2F2R, A52_MONO):
510 if (slev == 0) 510 if (slev == 0)
511 goto mix_2to1; 511 goto mix_2to1;
512 mix4to1 (samples); 512 mix4to1 (samples);
513 break; 513 break;
514 514
515 case CONVERT (A52_3F2R, A52_MONO): 515 case CONVERT (A52_3F2R, A52_MONO):
516 if (slev == 0) 516 if (slev == 0)
517 goto mix_3to1; 517 goto mix_3to1;
518 mix5to1 (samples); 518 mix5to1 (samples);
519 break; 519 break;
520 520
521 case CONVERT (A52_MONO, A52_DOLBY): 521 case CONVERT (A52_MONO, A52_DOLBY):
522 memcpy (samples + 256, samples, 256 * sizeof (sample_t)); 522 memcpy (samples + 256, samples, 256 * sizeof (sample_t));
523 break; 523 break;
524 524
525 case CONVERT (A52_3F, A52_STEREO): 525 case CONVERT (A52_3F, A52_STEREO):
526 case CONVERT (A52_3F, A52_DOLBY): 526 case CONVERT (A52_3F, A52_DOLBY):
527 mix_3to2: 527 mix_3to2:
528 mix3to2 (samples); 528 mix3to2 (samples);
529 break; 529 break;
530 530
531 case CONVERT (A52_2F1R, A52_STEREO): 531 case CONVERT (A52_2F1R, A52_STEREO):
532 if (slev == 0) 532 if (slev == 0)
533 break;
534 mix21to2 (samples, samples + 256);
533 break; 535 break;
534 mix21to2 (samples, samples + 256);
535 break;
536 536
537 case CONVERT (A52_2F1R, A52_DOLBY): 537 case CONVERT (A52_2F1R, A52_DOLBY):
538 mix21toS (samples); 538 mix21toS (samples);
539 break; 539 break;
540 540
541 case CONVERT (A52_3F1R, A52_STEREO): 541 case CONVERT (A52_3F1R, A52_STEREO):
542 if (slev == 0) 542 if (slev == 0)
543 goto mix_3to2; 543 goto mix_3to2;
544 mix31to2 (samples); 544 mix31to2 (samples);
545 break; 545 break;
546 546
547 case CONVERT (A52_3F1R, A52_DOLBY): 547 case CONVERT (A52_3F1R, A52_DOLBY):
548 mix31toS (samples); 548 mix31toS (samples);
549 break; 549 break;
550 550
551 case CONVERT (A52_2F2R, A52_STEREO): 551 case CONVERT (A52_2F2R, A52_STEREO):
552 if (slev == 0) 552 if (slev == 0)
553 break;
554 mix2to1 (samples, samples + 512);
555 mix2to1 (samples + 256, samples + 768);
553 break; 556 break;
554 mix2to1 (samples, samples + 512);
555 mix2to1 (samples + 256, samples + 768);
556 break;
557 557
558 case CONVERT (A52_2F2R, A52_DOLBY): 558 case CONVERT (A52_2F2R, A52_DOLBY):
559 mix22toS (samples); 559 mix22toS (samples);
560 break; 560 break;
561 561
562 case CONVERT (A52_3F2R, A52_STEREO): 562 case CONVERT (A52_3F2R, A52_STEREO):
563 if (slev == 0) 563 if (slev == 0)
564 goto mix_3to2; 564 goto mix_3to2;
565 mix32to2 (samples); 565 mix32to2 (samples);
566 break; 566 break;
567 567
568 case CONVERT (A52_3F2R, A52_DOLBY): 568 case CONVERT (A52_3F2R, A52_DOLBY):
569 mix32toS (samples); 569 mix32toS (samples);
570 break; 570 break;
571 571
572 case CONVERT (A52_3F1R, A52_3F): 572 case CONVERT (A52_3F1R, A52_3F):
573 if (slev == 0) 573 if (slev == 0)
574 break;
575 mix21to2 (samples, samples + 512);
574 break; 576 break;
575 mix21to2 (samples, samples + 512);
576 break;
577 577
578 case CONVERT (A52_3F2R, A52_3F): 578 case CONVERT (A52_3F2R, A52_3F):
579 if (slev == 0) 579 if (slev == 0)
580 break;
581 mix2to1 (samples, samples + 768);
582 mix2to1 (samples + 512, samples + 1024);
580 break; 583 break;
581 mix2to1 (samples, samples + 768);
582 mix2to1 (samples + 512, samples + 1024);
583 break;
584 584
585 case CONVERT (A52_3F1R, A52_2F1R): 585 case CONVERT (A52_3F1R, A52_2F1R):
586 mix3to2 (samples); 586 mix3to2 (samples);
587 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); 587 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
588 break; 588 break;
589 589
590 case CONVERT (A52_2F2R, A52_2F1R): 590 case CONVERT (A52_2F2R, A52_2F1R):
591 mix2to1 (samples + 512, samples + 768); 591 mix2to1 (samples + 512, samples + 768);
592 break; 592 break;
593 593
594 case CONVERT (A52_3F2R, A52_2F1R): 594 case CONVERT (A52_3F2R, A52_2F1R):
595 mix3to2 (samples); 595 mix3to2 (samples);
596 move2to1 (samples + 768, samples + 512); 596 move2to1 (samples + 768, samples + 512);
597 break; 597 break;
598 598
599 case CONVERT (A52_3F2R, A52_3F1R): 599 case CONVERT (A52_3F2R, A52_3F1R):
600 mix2to1 (samples + 768, samples + 1024); 600 mix2to1 (samples + 768, samples + 1024);
601 break; 601 break;
602 602
603 case CONVERT (A52_2F1R, A52_2F2R): 603 case CONVERT (A52_2F1R, A52_2F2R):
604 memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t)); 604 memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
605 break; 605 break;
606 606
607 case CONVERT (A52_3F1R, A52_2F2R): 607 case CONVERT (A52_3F1R, A52_2F2R):
608 mix3to2 (samples); 608 mix3to2 (samples);
609 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); 609 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
610 break; 610 break;
611 611
612 case CONVERT (A52_3F2R, A52_2F2R): 612 case CONVERT (A52_3F2R, A52_2F2R):
613 mix3to2 (samples); 613 mix3to2 (samples);
614 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t)); 614 memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
615 memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t)); 615 memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t));
616 break; 616 break;
617 617
618 case CONVERT (A52_3F1R, A52_3F2R): 618 case CONVERT (A52_3F1R, A52_3F2R):
619 memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t)); 619 memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
620 break; 620 break;
621 } 621 }
622} 622}
623 623
@@ -626,63 +626,63 @@ void a52_upmix (sample_t * samples, int acmod, int output)
626 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) { 626 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
627 627
628 case CONVERT (A52_CHANNEL, A52_CHANNEL2): 628 case CONVERT (A52_CHANNEL, A52_CHANNEL2):
629 memcpy (samples + 256, samples, 256 * sizeof (sample_t)); 629 memcpy (samples + 256, samples, 256 * sizeof (sample_t));
630 break; 630 break;
631 631
632 case CONVERT (A52_3F2R, A52_MONO): 632 case CONVERT (A52_3F2R, A52_MONO):
633 zero (samples + 1024); 633 zero (samples + 1024);
634 case CONVERT (A52_3F1R, A52_MONO): 634 case CONVERT (A52_3F1R, A52_MONO):
635 case CONVERT (A52_2F2R, A52_MONO): 635 case CONVERT (A52_2F2R, A52_MONO):
636 zero (samples + 768); 636 zero (samples + 768);
637 case CONVERT (A52_3F, A52_MONO): 637 case CONVERT (A52_3F, A52_MONO):
638 case CONVERT (A52_2F1R, A52_MONO): 638 case CONVERT (A52_2F1R, A52_MONO):
639 zero (samples + 512); 639 zero (samples + 512);
640 case CONVERT (A52_CHANNEL, A52_MONO): 640 case CONVERT (A52_CHANNEL, A52_MONO):
641 case CONVERT (A52_STEREO, A52_MONO): 641 case CONVERT (A52_STEREO, A52_MONO):
642 zero (samples + 256); 642 zero (samples + 256);
643 break; 643 break;
644 644
645 case CONVERT (A52_3F2R, A52_STEREO): 645 case CONVERT (A52_3F2R, A52_STEREO):
646 case CONVERT (A52_3F2R, A52_DOLBY): 646 case CONVERT (A52_3F2R, A52_DOLBY):
647 zero (samples + 1024); 647 zero (samples + 1024);
648 case CONVERT (A52_3F1R, A52_STEREO): 648 case CONVERT (A52_3F1R, A52_STEREO):
649 case CONVERT (A52_3F1R, A52_DOLBY): 649 case CONVERT (A52_3F1R, A52_DOLBY):
650 zero (samples + 768); 650 zero (samples + 768);
651 case CONVERT (A52_3F, A52_STEREO): 651 case CONVERT (A52_3F, A52_STEREO):
652 case CONVERT (A52_3F, A52_DOLBY): 652 case CONVERT (A52_3F, A52_DOLBY):
653 mix_3to2: 653 mix_3to2:
654 memcpy (samples + 512, samples + 256, 256 * sizeof (sample_t)); 654 memcpy (samples + 512, samples + 256, 256 * sizeof (sample_t));
655 zero (samples + 256); 655 zero (samples + 256);
656 break; 656 break;
657 657
658 case CONVERT (A52_2F2R, A52_STEREO): 658 case CONVERT (A52_2F2R, A52_STEREO):
659 case CONVERT (A52_2F2R, A52_DOLBY): 659 case CONVERT (A52_2F2R, A52_DOLBY):
660 zero (samples + 768); 660 zero (samples + 768);
661 case CONVERT (A52_2F1R, A52_STEREO): 661 case CONVERT (A52_2F1R, A52_STEREO):
662 case CONVERT (A52_2F1R, A52_DOLBY): 662 case CONVERT (A52_2F1R, A52_DOLBY):
663 zero (samples + 512); 663 zero (samples + 512);
664 break; 664 break;
665 665
666 case CONVERT (A52_3F2R, A52_3F): 666 case CONVERT (A52_3F2R, A52_3F):
667 zero (samples + 1024); 667 zero (samples + 1024);
668 case CONVERT (A52_3F1R, A52_3F): 668 case CONVERT (A52_3F1R, A52_3F):
669 case CONVERT (A52_2F2R, A52_2F1R): 669 case CONVERT (A52_2F2R, A52_2F1R):
670 zero (samples + 768); 670 zero (samples + 768);
671 break; 671 break;
672 672
673 case CONVERT (A52_3F2R, A52_3F1R): 673 case CONVERT (A52_3F2R, A52_3F1R):
674 zero (samples + 1024); 674 zero (samples + 1024);
675 break; 675 break;
676 676
677 case CONVERT (A52_3F2R, A52_2F1R): 677 case CONVERT (A52_3F2R, A52_2F1R):
678 zero (samples + 1024); 678 zero (samples + 1024);
679 case CONVERT (A52_3F1R, A52_2F1R): 679 case CONVERT (A52_3F1R, A52_2F1R):
680 mix_31to21: 680 mix_31to21:
681 memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t)); 681 memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
682 goto mix_3to2; 682 goto mix_3to2;
683 683
684 case CONVERT (A52_3F2R, A52_2F2R): 684 case CONVERT (A52_3F2R, A52_2F2R):
685 memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t)); 685 memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
686 goto mix_31to21; 686 goto mix_31to21;
687 } 687 }
688} 688}
diff --git a/apps/codecs/liba52/imdct.c b/apps/codecs/liba52/imdct.c
index 9aaa9d85ad..e93424c5fa 100644
--- a/apps/codecs/liba52/imdct.c
+++ b/apps/codecs/liba52/imdct.c
@@ -114,73 +114,73 @@ static inline void ifft4 (complex_t * buf)
114*/ 114*/
115/* basic radix-2 ifft butterfly */ 115/* basic radix-2 ifft butterfly */
116 116
117#define BUTTERFLY_0(t0,t1,W0,W1,d0,d1) do { \ 117#define BUTTERFLY_0(t0,t1,W0,W1,d0,d1) do { \
118 t0 = MUL (W1, d1) + MUL (W0, d0); \ 118 t0 = MUL (W1, d1) + MUL (W0, d0); \
119 t1 = MUL (W0, d1) - MUL (W1, d0); \ 119 t1 = MUL (W0, d1) - MUL (W1, d0); \
120} while (0) 120} while (0)
121 121
122/* radix-2 ifft butterfly with bias */ 122/* radix-2 ifft butterfly with bias */
123 123
124#define BUTTERFLY_B(t0,t1,W0,W1,d0,d1) do { \ 124#define BUTTERFLY_B(t0,t1,W0,W1,d0,d1) do { \
125 t0 = BIAS (MUL (d1, W1) + MUL (d0, W0)); \ 125 t0 = BIAS (MUL (d1, W1) + MUL (d0, W0)); \
126 t1 = BIAS (MUL (d1, W0) - MUL (d0, W1)); \ 126 t1 = BIAS (MUL (d1, W0) - MUL (d0, W1)); \
127} while (0) 127} while (0)
128 128
129/* the basic split-radix ifft butterfly */ 129/* the basic split-radix ifft butterfly */
130 130
131#define BUTTERFLY(a0,a1,a2,a3,wr,wi) do { \ 131#define BUTTERFLY(a0,a1,a2,a3,wr,wi) do { \
132 BUTTERFLY_0 (tmp5, tmp6, wr, wi, a2.real, a2.imag); \ 132 BUTTERFLY_0 (tmp5, tmp6, wr, wi, a2.real, a2.imag); \
133 BUTTERFLY_0 (tmp8, tmp7, wr, wi, a3.imag, a3.real); \ 133 BUTTERFLY_0 (tmp8, tmp7, wr, wi, a3.imag, a3.real); \
134 tmp1 = tmp5 + tmp7; \ 134 tmp1 = tmp5 + tmp7; \
135 tmp2 = tmp6 + tmp8; \ 135 tmp2 = tmp6 + tmp8; \
136 tmp3 = tmp6 - tmp8; \ 136 tmp3 = tmp6 - tmp8; \
137 tmp4 = tmp7 - tmp5; \ 137 tmp4 = tmp7 - tmp5; \
138 a2.real = a0.real - tmp1; \ 138 a2.real = a0.real - tmp1; \
139 a2.imag = a0.imag - tmp2; \ 139 a2.imag = a0.imag - tmp2; \
140 a3.real = a1.real - tmp3; \ 140 a3.real = a1.real - tmp3; \
141 a3.imag = a1.imag - tmp4; \ 141 a3.imag = a1.imag - tmp4; \
142 a0.real += tmp1; \ 142 a0.real += tmp1; \
143 a0.imag += tmp2; \ 143 a0.imag += tmp2; \
144 a1.real += tmp3; \ 144 a1.real += tmp3; \
145 a1.imag += tmp4; \ 145 a1.imag += tmp4; \
146} while (0) 146} while (0)
147 147
148/* split-radix ifft butterfly, specialized for wr=1 wi=0 */ 148/* split-radix ifft butterfly, specialized for wr=1 wi=0 */
149 149
150#define BUTTERFLY_ZERO(a0,a1,a2,a3) do { \ 150#define BUTTERFLY_ZERO(a0,a1,a2,a3) do { \
151 tmp1 = a2.real + a3.real; \ 151 tmp1 = a2.real + a3.real; \
152 tmp2 = a2.imag + a3.imag; \ 152 tmp2 = a2.imag + a3.imag; \
153 tmp3 = a2.imag - a3.imag; \ 153 tmp3 = a2.imag - a3.imag; \
154 tmp4 = a3.real - a2.real; \ 154 tmp4 = a3.real - a2.real; \
155 a2.real = a0.real - tmp1; \ 155 a2.real = a0.real - tmp1; \
156 a2.imag = a0.imag - tmp2; \ 156 a2.imag = a0.imag - tmp2; \
157 a3.real = a1.real - tmp3; \ 157 a3.real = a1.real - tmp3; \
158 a3.imag = a1.imag - tmp4; \ 158 a3.imag = a1.imag - tmp4; \
159 a0.real += tmp1; \ 159 a0.real += tmp1; \
160 a0.imag += tmp2; \ 160 a0.imag += tmp2; \
161 a1.real += tmp3; \ 161 a1.real += tmp3; \
162 a1.imag += tmp4; \ 162 a1.imag += tmp4; \
163} while (0) 163} while (0)
164 164
165/* split-radix ifft butterfly, specialized for wr=wi */ 165/* split-radix ifft butterfly, specialized for wr=wi */
166/* 166/*
167#define BUTTERFLY_HALF(a0,a1,a2,a3,w) do { \ 167#define BUTTERFLY_HALF(a0,a1,a2,a3,w) do { \
168 tmp5 = MUL (a2.real + a2.imag, w); \ 168 tmp5 = MUL (a2.real + a2.imag, w); \
169 tmp6 = MUL (a2.imag - a2.real, w); \ 169 tmp6 = MUL (a2.imag - a2.real, w); \
170 tmp7 = MUL (a3.real - a3.imag, w); \ 170 tmp7 = MUL (a3.real - a3.imag, w); \
171 tmp8 = MUL (a3.imag + a3.real, w); \ 171 tmp8 = MUL (a3.imag + a3.real, w); \
172 tmp1 = tmp5 + tmp7; \ 172 tmp1 = tmp5 + tmp7; \
173 tmp2 = tmp6 + tmp8; \ 173 tmp2 = tmp6 + tmp8; \
174 tmp3 = tmp6 - tmp8; \ 174 tmp3 = tmp6 - tmp8; \
175 tmp4 = tmp7 - tmp5; \ 175 tmp4 = tmp7 - tmp5; \
176 a2.real = a0.real - tmp1; \ 176 a2.real = a0.real - tmp1; \
177 a2.imag = a0.imag - tmp2; \ 177 a2.imag = a0.imag - tmp2; \
178 a3.real = a1.real - tmp3; \ 178 a3.real = a1.real - tmp3; \
179 a3.imag = a1.imag - tmp4; \ 179 a3.imag = a1.imag - tmp4; \
180 a0.real += tmp1; \ 180 a0.real += tmp1; \
181 a0.imag += tmp2; \ 181 a0.imag += tmp2; \
182 a1.real += tmp3; \ 182 a1.real += tmp3; \
183 a1.imag += tmp4; \ 183 a1.imag += tmp4; \
184} while (0) 184} while (0)
185 185
186static inline void ifft8 (complex_t * buf) 186static inline void ifft8 (complex_t * buf)
@@ -212,13 +212,13 @@ static void ifft_pass (complex_t * buf, const sample_t * weight, int n)
212 i = n - 1; 212 i = n - 1;
213 213
214 do { 214 do {
215 BUTTERFLY (buf[0], buf1[0], buf2[0], buf3[0], 215 BUTTERFLY (buf[0], buf1[0], buf2[0], buf3[0],
216 weight[0], weight[2*i-n]); 216 weight[0], weight[2*i-n]);
217 buf++; 217 buf++;
218 buf1++; 218 buf1++;
219 buf2++; 219 buf2++;
220 buf3++; 220 buf3++;
221 weight++; 221 weight++;
222 } while (--i); 222 } while (--i);
223} 223}
224 224
@@ -264,7 +264,7 @@ void a52_imdct_512 (sample_t * data, sample_t * delay)
264 sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2; 264 sample_t t_r, t_i, a_r, a_i, b_r, b_i, w_1, w_2;
265 const sample_t * window = a52_imdct_window; 265 const sample_t * window = a52_imdct_window;
266 FFTComplex buf[128]; 266 FFTComplex buf[128];
267 267
268 for (i = 0; i < 128; i++) { 268 for (i = 0; i < 128; i++) {
269 k = fftorder[i]; 269 k = fftorder[i];
270 t_r = pre1[i].real; 270 t_r = pre1[i].real;
@@ -357,7 +357,7 @@ static double besselI0 (double x)
357 int i = 100; 357 int i = 100;
358 358
359 do 359 do
360 bessel = bessel * x / (i * i) + 1; 360 bessel = bessel * x / (i * i) + 1;
361 while (--i); 361 while (--i);
362 return bessel; 362 return bessel;
363} 363}
@@ -376,13 +376,13 @@ void a52_imdct_init (uint32_t mm_accel)
376 /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */ 376 /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */
377 /* sum = 0; 377 /* sum = 0;
378 for (i = 0; i < 256; i++) { 378 for (i = 0; i < 256; i++) {
379 sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256)); 379 sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256));
380 local_imdct_window[i] = sum; 380 local_imdct_window[i] = sum;
381 } 381 }
382 sum++; 382 sum++;
383 */ 383 */
384 /* for (i = 0; i < 256; i++) 384 /* for (i = 0; i < 256; i++)
385 a52_imdct_window[i] = SAMPLE (sqrt (local_imdct_window[i] / sum)); 385 a52_imdct_window[i] = SAMPLE (sqrt (local_imdct_window[i] / sum));
386 386
387 printf("static sample_t a52_imdct_window[256]={"); 387 printf("static sample_t a52_imdct_window[256]={");
388 for (i=0;i<256;i++) { 388 for (i=0;i<256;i++) {
@@ -393,26 +393,26 @@ void a52_imdct_init (uint32_t mm_accel)
393 */ 393 */
394 394
395 /* for (i = 0; i < 3; i++) 395 /* for (i = 0; i < 3; i++)
396 roots16[i] = SAMPLE (cos ((M_PI / 8) * (i + 1))); 396 roots16[i] = SAMPLE (cos ((M_PI / 8) * (i + 1)));
397 397
398 printf("static sample_t roots16[3]={%d,%d,%d};\n\n",roots16[0],roots16[1],roots16[2]); 398 printf("static sample_t roots16[3]={%d,%d,%d};\n\n",roots16[0],roots16[1],roots16[2]);
399 399
400 for (i = 0; i < 7; i++) 400 for (i = 0; i < 7; i++)
401 roots32[i] = SAMPLE (cos ((M_PI / 16) * (i + 1))); 401 roots32[i] = SAMPLE (cos ((M_PI / 16) * (i + 1)));
402 402
403 printf("static sample_t roots32[7]={"); 403 printf("static sample_t roots32[7]={");
404 for (i=0;i<7;i++) { printf("%d%s",roots32[i],(i < 6 ? "," : "")); } 404 for (i=0;i<7;i++) { printf("%d%s",roots32[i],(i < 6 ? "," : "")); }
405 printf("};\n"); 405 printf("};\n");
406 406
407 for (i = 0; i < 15; i++) 407 for (i = 0; i < 15; i++)
408 roots64[i] = SAMPLE (cos ((M_PI / 32) * (i + 1))); 408 roots64[i] = SAMPLE (cos ((M_PI / 32) * (i + 1)));
409 409
410 printf("static sample_t roots64[15]={"); 410 printf("static sample_t roots64[15]={");
411 for (i=0;i<15;i++) { printf("%d%s",roots64[i],(i < 14 ? "," : "")); } 411 for (i=0;i<15;i++) { printf("%d%s",roots64[i],(i < 14 ? "," : "")); }
412 printf("};\n"); 412 printf("};\n");
413 413
414 for (i = 0; i < 31; i++) 414 for (i = 0; i < 31; i++)
415 roots128[i] = SAMPLE (cos ((M_PI / 64) * (i + 1))); 415 roots128[i] = SAMPLE (cos ((M_PI / 64) * (i + 1)));
416 416
417 printf("static sample_t roots128[31]={"); 417 printf("static sample_t roots128[31]={");
418 for (i=0;i<31;i++) { printf("%d%s",roots128[i],(i < 30 ? "," : "")); } 418 for (i=0;i<31;i++) { printf("%d%s",roots128[i],(i < 30 ? "," : "")); }
@@ -420,15 +420,15 @@ void a52_imdct_init (uint32_t mm_accel)
420 */ 420 */
421 /* 421 /*
422 for (i = 0; i < 64; i++) { 422 for (i = 0; i < 64; i++) {
423 k = fftorder[i] / 2 + 64; 423 k = fftorder[i] / 2 + 64;
424 pre1[i].real = SAMPLE (cos ((M_PI / 256) * (k - 0.25))); 424 pre1[i].real = SAMPLE (cos ((M_PI / 256) * (k - 0.25)));
425 pre1[i].imag = SAMPLE (sin ((M_PI / 256) * (k - 0.25))); 425 pre1[i].imag = SAMPLE (sin ((M_PI / 256) * (k - 0.25)));
426 } 426 }
427 427
428 for (i = 64; i < 128; i++) { 428 for (i = 64; i < 128; i++) {
429 k = fftorder[i] / 2 + 64; 429 k = fftorder[i] / 2 + 64;
430 pre1[i].real = SAMPLE (-cos ((M_PI / 256) * (k - 0.25))); 430 pre1[i].real = SAMPLE (-cos ((M_PI / 256) * (k - 0.25)));
431 pre1[i].imag = SAMPLE (-sin ((M_PI / 256) * (k - 0.25))); 431 pre1[i].imag = SAMPLE (-sin ((M_PI / 256) * (k - 0.25)));
432 } 432 }
433 433
434 printf("static complex_t pre1[128]={"); 434 printf("static complex_t pre1[128]={");
@@ -437,8 +437,8 @@ void a52_imdct_init (uint32_t mm_accel)
437 */ 437 */
438 /* 438 /*
439 for (i = 0; i < 64; i++) { 439 for (i = 0; i < 64; i++) {
440 post1[i].real = SAMPLE (cos ((M_PI / 256) * (i + 0.5))); 440 post1[i].real = SAMPLE (cos ((M_PI / 256) * (i + 0.5)));
441 post1[i].imag = SAMPLE (sin ((M_PI / 256) * (i + 0.5))); 441 post1[i].imag = SAMPLE (sin ((M_PI / 256) * (i + 0.5)));
442 } 442 }
443 443
444 printf("static complex_t post1[64]={"); 444 printf("static complex_t post1[64]={");
@@ -448,9 +448,9 @@ void a52_imdct_init (uint32_t mm_accel)
448 448
449 /* 449 /*
450 for (i = 0; i < 64; i++) { 450 for (i = 0; i < 64; i++) {
451 k = fftorder[i] / 4; 451 k = fftorder[i] / 4;
452 pre2[i].real = SAMPLE (cos ((M_PI / 128) * (k - 0.25))); 452 pre2[i].real = SAMPLE (cos ((M_PI / 128) * (k - 0.25)));
453 pre2[i].imag = SAMPLE (sin ((M_PI / 128) * (k - 0.25))); 453 pre2[i].imag = SAMPLE (sin ((M_PI / 128) * (k - 0.25)));
454 } 454 }
455 455
456 printf("static complex_t pre2[64]={"); 456 printf("static complex_t pre2[64]={");
@@ -458,8 +458,8 @@ void a52_imdct_init (uint32_t mm_accel)
458 printf("};\n"); 458 printf("};\n");
459 459
460 for (i = 0; i < 32; i++) { 460 for (i = 0; i < 32; i++) {
461 post2[i].real = SAMPLE (cos ((M_PI / 128) * (i + 0.5))); 461 post2[i].real = SAMPLE (cos ((M_PI / 128) * (i + 0.5)));
462 post2[i].imag = SAMPLE (sin ((M_PI / 128) * (i + 0.5))); 462 post2[i].imag = SAMPLE (sin ((M_PI / 128) * (i + 0.5)));
463 } 463 }
464 464
465 printf("static complex_t post2[32]={"); 465 printf("static complex_t post2[32]={");
@@ -470,17 +470,17 @@ void a52_imdct_init (uint32_t mm_accel)
470#ifdef LIBA52_DJBFFT 470#ifdef LIBA52_DJBFFT
471 if (mm_accel & MM_ACCEL_DJBFFT) { 471 if (mm_accel & MM_ACCEL_DJBFFT) {
472#ifndef LIBA52_DOUBLE 472#ifndef LIBA52_DOUBLE
473 ifft128 = (void (*) (complex_t *)) fftc4_un128; 473 ifft128 = (void (*) (complex_t *)) fftc4_un128;
474 ifft64 = (void (*) (complex_t *)) fftc4_un64; 474 ifft64 = (void (*) (complex_t *)) fftc4_un64;
475#else 475#else
476 ifft128 = (void (*) (complex_t *)) fftc8_un128; 476 ifft128 = (void (*) (complex_t *)) fftc8_un128;
477 ifft64 = (void (*) (complex_t *)) fftc8_un64; 477 ifft64 = (void (*) (complex_t *)) fftc8_un64;
478#endif 478#endif
479 } else 479 } else
480#endif 480#endif
481 { 481 {
482 ifft128 = ifft128_c; 482 ifft128 = ifft128_c;
483 ifft64 = ifft64_c; 483 ifft64 = ifft64_c;
484 } 484 }
485 */ 485 */
486} 486}
diff --git a/apps/codecs/liba52/imdct_lookups.h b/apps/codecs/liba52/imdct_lookups.h
index 769623ff53..9d14fe21a7 100644
--- a/apps/codecs/liba52/imdct_lookups.h
+++ b/apps/codecs/liba52/imdct_lookups.h
@@ -1,5 +1,5 @@
1static const sample_t a52_imdct_window[256]ICONST_ATTR={ 1static const sample_t a52_imdct_window[256]ICONST_ATTR={
2 146020,261886,393529,545197,719447,918478,1144416,1399394,1685589,2005234,2360623,2754115,3188134,3665170,4187773,4758556, 5380193,6055411,6786995,7577779,8430645,9348521,10334375,11391212,12522071,13730020,15018150,16389576,17847424,19394833,21034947,22770912, 24605865,26542938,28585242,30735872,32997891,35374332,37868188,40482408,43219889,46083473,49075937,52199993,55458273,58853331,62387636,66063559, 69883377,73849259,77963266,82227341,86643307,91212859,95937560,100818835,105857968,111056092,116414194,121933098,127613474,133455822,139460477,145627601, 151957182,158449029,165102772,171917855,178893540,186028900,193322822,200774000,208380940,216141958,224055176,232118527,240329753,248686407,257185854,265825270, 274601649,283511802,292552357,301719768,311010314,320420105,329945084,339581031,349323572,359168178,369110174,379144743,389266934,399471665,409753732,420107815, 430528483,441010205,451547355,462134219,472765003,483433845,494134818,504861939,515609181,526370480,537139740,547910849,558677680,569434108,580174011,590891284, 601579849,612233658,622846709,633413050,643926788,654382103,664773249,675094567,685340494,695505569,705584441,715571877,725462772,735252152,744935184,754507184, 763963620,773300119,782512477,791596659,800548807,809365245,818042484,826577226,834966364,843206992,851296404,859232096,867011771,874633340,882094922,889394844, 896531647,903504079,910311101,916951881,923425798,929732436,935871584,941843233,947647575,953284997,958756080,964061593,969202490,974179906,978995149,983649698, 988145195,992483442,996666390,1000696136,1004574919,1008305104,1011889185,1015329772,1018629583,1021791439,1024818257,1027713038,1030478862,1033118881,1035636308,1038034411, 1040316504,1042485942,1044546109,1046500412,1048352275,1050105129,1051762405,1053327531,1054803917,1056194958,1057504020,1058734435,1059889501,1060972468,1061986539,1062934861, 1063820523,1064646551,1065415903,1066131467,1066796055,1067412403,1067983168,1068510924,1068998160,1069447282,1069860607,1070240366,1070588702,1070907668,1071199230,1071465266, 1071707567,1071927836,1072127692,1072308670,1072472221,1072619716,1072752449,1072871635,1072978415,1073073858,1073158963,1073234663,1073301826,1073361257,1073413702,1073459852, 1073500344,1073535763,1073566646,1073593486,1073616731,1073636791,1073654036,1073668804,1073681398,1073692090,1073701126,1073708726,1073715084,1073720373,1073724748,1073728344, 1073731279,1073733657,1073735568,1073737090,1073738291,1073739229,1073739951,1073740500,1073740912,1073741214,1073741431,1073741582,1073741685,1073741751,1073741792,1073741814 2 146020,261886,393529,545197,719447,918478,1144416,1399394,1685589,2005234,2360623,2754115,3188134,3665170,4187773,4758556, 5380193,6055411,6786995,7577779,8430645,9348521,10334375,11391212,12522071,13730020,15018150,16389576,17847424,19394833,21034947,22770912, 24605865,26542938,28585242,30735872,32997891,35374332,37868188,40482408,43219889,46083473,49075937,52199993,55458273,58853331,62387636,66063559, 69883377,73849259,77963266,82227341,86643307,91212859,95937560,100818835,105857968,111056092,116414194,121933098,127613474,133455822,139460477,145627601, 151957182,158449029,165102772,171917855,178893540,186028900,193322822,200774000,208380940,216141958,224055176,232118527,240329753,248686407,257185854,265825270, 274601649,283511802,292552357,301719768,311010314,320420105,329945084,339581031,349323572,359168178,369110174,379144743,389266934,399471665,409753732,420107815, 430528483,441010205,451547355,462134219,472765003,483433845,494134818,504861939,515609181,526370480,537139740,547910849,558677680,569434108,580174011,590891284, 601579849,612233658,622846709,633413050,643926788,654382103,664773249,675094567,685340494,695505569,705584441,715571877,725462772,735252152,744935184,754507184, 763963620,773300119,782512477,791596659,800548807,809365245,818042484,826577226,834966364,843206992,851296404,859232096,867011771,874633340,882094922,889394844, 896531647,903504079,910311101,916951881,923425798,929732436,935871584,941843233,947647575,953284997,958756080,964061593,969202490,974179906,978995149,983649698, 988145195,992483442,996666390,1000696136,1004574919,1008305104,1011889185,1015329772,1018629583,1021791439,1024818257,1027713038,1030478862,1033118881,1035636308,1038034411, 1040316504,1042485942,1044546109,1046500412,1048352275,1050105129,1051762405,1053327531,1054803917,1056194958,1057504020,1058734435,1059889501,1060972468,1061986539,1062934861, 1063820523,1064646551,1065415903,1066131467,1066796055,1067412403,1067983168,1068510924,1068998160,1069447282,1069860607,1070240366,1070588702,1070907668,1071199230,1071465266, 1071707567,1071927836,1072127692,1072308670,1072472221,1072619716,1072752449,1072871635,1072978415,1073073858,1073158963,1073234663,1073301826,1073361257,1073413702,1073459852, 1073500344,1073535763,1073566646,1073593486,1073616731,1073636791,1073654036,1073668804,1073681398,1073692090,1073701126,1073708726,1073715084,1073720373,1073724748,1073728344, 1073731279,1073733657,1073735568,1073737090,1073738291,1073739229,1073739951,1073740500,1073740912,1073741214,1073741431,1073741582,1073741685,1073741751,1073741792,1073741814
3}; 3};
4 4
5static const sample_t roots16[3]ICONST_ATTR={992008094,759250124,410903206}; 5static const sample_t roots16[3]ICONST_ATTR={992008094,759250124,410903206};
diff --git a/apps/codecs/liba52/mm_accel.h b/apps/codecs/liba52/mm_accel.h
index 8005930cc6..aafc3fed82 100644
--- a/apps/codecs/liba52/mm_accel.h
+++ b/apps/codecs/liba52/mm_accel.h
@@ -25,12 +25,12 @@
25#define MM_ACCEL_H 25#define MM_ACCEL_H
26 26
27/* generic accelerations */ 27/* generic accelerations */
28#define MM_ACCEL_DJBFFT 0x00000001 28#define MM_ACCEL_DJBFFT 0x00000001
29 29
30/* x86 accelerations */ 30/* x86 accelerations */
31#define MM_ACCEL_X86_MMX 0x80000000 31#define MM_ACCEL_X86_MMX 0x80000000
32#define MM_ACCEL_X86_3DNOW 0x40000000 32#define MM_ACCEL_X86_3DNOW 0x40000000
33#define MM_ACCEL_X86_MMXEXT 0x20000000 33#define MM_ACCEL_X86_MMXEXT 0x20000000
34 34
35uint32_t mm_accel (void); 35uint32_t mm_accel (void);
36 36
diff --git a/apps/codecs/liba52/parse.c b/apps/codecs/liba52/parse.c
index fd7e13006d..c61c13cdb5 100644
--- a/apps/codecs/liba52/parse.c
+++ b/apps/codecs/liba52/parse.c
@@ -66,19 +66,19 @@ a52_state_t * a52_init (uint32_t mm_accel)
66 simultenously. NOTE, you also need to remove comments in a52_free. 66 simultenously. NOTE, you also need to remove comments in a52_free.
67 state = (a52_state_t *) malloc (sizeof (a52_state_t)); 67 state = (a52_state_t *) malloc (sizeof (a52_state_t));
68 if (state == NULL) 68 if (state == NULL)
69 return NULL; 69 return NULL;
70 70
71 state->samples = (sample_t *) memalign (16, 256 * 12 * sizeof (sample_t)); 71 state->samples = (sample_t *) memalign (16, 256 * 12 * sizeof (sample_t));
72 if (state->samples == NULL) { 72 if (state->samples == NULL) {
73 free (state); 73 free (state);
74 return NULL; 74 return NULL;
75 } 75 }
76 76
77 */ 77 */
78 state = &istate; 78 state = &istate;
79 state->samples = isamples; 79 state->samples = isamples;
80 for (i = 0; i < 256 * 12; i++) 80 for (i = 0; i < 256 * 12; i++)
81 state->samples[i] = 0; 81 state->samples[i] = 0;
82 82
83 state->downmixed = 1; 83 state->downmixed = 1;
84 84
@@ -95,11 +95,11 @@ sample_t * a52_samples (a52_state_t * state)
95} 95}
96 96
97int a52_syncinfo (uint8_t * buf, int * flags, 97int a52_syncinfo (uint8_t * buf, int * flags,
98 int * sample_rate, int * bit_rate) 98 int * sample_rate, int * bit_rate)
99{ 99{
100 static int rate[] = { 32, 40, 48, 56, 64, 80, 96, 112, 100 static int rate[] = { 32, 40, 48, 56, 64, 80, 96, 112,
101 128, 160, 192, 224, 256, 320, 384, 448, 101 128, 160, 192, 224, 256, 320, 384, 448,
102 512, 576, 640}; 102 512, 576, 640};
103 static uint8_t lfeon[8] = {0x10, 0x10, 0x04, 0x04, 0x04, 0x01, 0x04, 0x01}; 103 static uint8_t lfeon[8] = {0x10, 0x10, 0x04, 0x04, 0x04, 0x01, 0x04, 0x01};
104 int frmsizecod; 104 int frmsizecod;
105 int bitrate; 105 int bitrate;
@@ -107,45 +107,45 @@ int a52_syncinfo (uint8_t * buf, int * flags,
107 int acmod; 107 int acmod;
108 108
109 if ((buf[0] != 0x0b) || (buf[1] != 0x77)) /* syncword */ 109 if ((buf[0] != 0x0b) || (buf[1] != 0x77)) /* syncword */
110 return 0; 110 return 0;
111 111
112 if (buf[5] >= 0x60) /* bsid >= 12 */ 112 if (buf[5] >= 0x60) /* bsid >= 12 */
113 return 0; 113 return 0;
114 half = halfrate[buf[5] >> 3]; 114 half = halfrate[buf[5] >> 3];
115 115
116 /* acmod, dsurmod and lfeon */ 116 /* acmod, dsurmod and lfeon */
117 acmod = buf[6] >> 5; 117 acmod = buf[6] >> 5;
118 *flags = ((((buf[6] & 0xf8) == 0x50) ? A52_DOLBY : acmod) | 118 *flags = ((((buf[6] & 0xf8) == 0x50) ? A52_DOLBY : acmod) |
119 ((buf[6] & lfeon[acmod]) ? A52_LFE : 0)); 119 ((buf[6] & lfeon[acmod]) ? A52_LFE : 0));
120 120
121 frmsizecod = buf[4] & 63; 121 frmsizecod = buf[4] & 63;
122 if (frmsizecod >= 38) 122 if (frmsizecod >= 38)
123 return 0; 123 return 0;
124 bitrate = rate [frmsizecod >> 1]; 124 bitrate = rate [frmsizecod >> 1];
125 *bit_rate = (bitrate * 1000) >> half; 125 *bit_rate = (bitrate * 1000) >> half;
126 126
127 switch (buf[4] & 0xc0) { 127 switch (buf[4] & 0xc0) {
128 case 0: 128 case 0:
129 *sample_rate = 48000 >> half; 129 *sample_rate = 48000 >> half;
130 return 4 * bitrate; 130 return 4 * bitrate;
131 case 0x40: 131 case 0x40:
132 *sample_rate = 44100 >> half; 132 *sample_rate = 44100 >> half;
133 return 2 * (320 * bitrate / 147 + (frmsizecod & 1)); 133 return 2 * (320 * bitrate / 147 + (frmsizecod & 1));
134 case 0x80: 134 case 0x80:
135 *sample_rate = 32000 >> half; 135 *sample_rate = 32000 >> half;
136 return 6 * bitrate; 136 return 6 * bitrate;
137 default: 137 default:
138 return 0; 138 return 0;
139 } 139 }
140} 140}
141 141
142int a52_frame (a52_state_t * state, uint8_t * buf, int * flags, 142int a52_frame (a52_state_t * state, uint8_t * buf, int * flags,
143 level_t * level, sample_t bias) 143 level_t * level, sample_t bias)
144{ 144{
145 static level_t clev[4] = { LEVEL (LEVEL_3DB), LEVEL (LEVEL_45DB), 145 static level_t clev[4] = { LEVEL (LEVEL_3DB), LEVEL (LEVEL_45DB),
146 LEVEL (LEVEL_6DB), LEVEL (LEVEL_45DB) }; 146 LEVEL (LEVEL_6DB), LEVEL (LEVEL_45DB) };
147 static level_t slev[4] = { LEVEL (LEVEL_3DB), LEVEL (LEVEL_6DB), 147 static level_t slev[4] = { LEVEL (LEVEL_3DB), LEVEL (LEVEL_6DB),
148 0, LEVEL (LEVEL_6DB) }; 148 0, LEVEL (LEVEL_6DB) };
149 int chaninfo; 149 int chaninfo;
150 int acmod; 150 int acmod;
151 151
@@ -156,25 +156,25 @@ int a52_frame (a52_state_t * state, uint8_t * buf, int * flags,
156 a52_bitstream_set_ptr (state, buf + 6); 156 a52_bitstream_set_ptr (state, buf + 6);
157 bitstream_get (state, 3); /* skip acmod we already parsed */ 157 bitstream_get (state, 3); /* skip acmod we already parsed */
158 158
159 if ((acmod == 2) && (bitstream_get (state, 2) == 2)) /* dsurmod */ 159 if ((acmod == 2) && (bitstream_get (state, 2) == 2)) /* dsurmod */
160 acmod = A52_DOLBY; 160 acmod = A52_DOLBY;
161 161
162 state->clev = state->slev = 0; 162 state->clev = state->slev = 0;
163 163
164 if ((acmod & 1) && (acmod != 1)) 164 if ((acmod & 1) && (acmod != 1))
165 state->clev = clev[bitstream_get (state, 2)]; /* cmixlev */ 165 state->clev = clev[bitstream_get (state, 2)]; /* cmixlev */
166 166
167 if (acmod & 4) 167 if (acmod & 4)
168 state->slev = slev[bitstream_get (state, 2)]; /* surmixlev */ 168 state->slev = slev[bitstream_get (state, 2)]; /* surmixlev */
169 169
170 state->lfeon = bitstream_get (state, 1); 170 state->lfeon = bitstream_get (state, 1);
171 171
172 state->output = a52_downmix_init (acmod, *flags, level, 172 state->output = a52_downmix_init (acmod, *flags, level,
173 state->clev, state->slev); 173 state->clev, state->slev);
174 if (state->output < 0) 174 if (state->output < 0)
175 return 1; 175 return 1;
176 if (state->lfeon && (*flags & A52_LFE)) 176 if (state->lfeon && (*flags & A52_LFE))
177 state->output |= A52_LFE; 177 state->output |= A52_LFE;
178 *flags = state->output; 178 *flags = state->output;
179 /* the 2* compensates for differences in imdct */ 179 /* the 2* compensates for differences in imdct */
180 state->dynrng = state->level = MUL_C (*level, 2); 180 state->dynrng = state->level = MUL_C (*level, 2);
@@ -183,98 +183,98 @@ int a52_frame (a52_state_t * state, uint8_t * buf, int * flags,
183 state->dynrngcall = NULL; 183 state->dynrngcall = NULL;
184 state->cplba.deltbae = DELTA_BIT_NONE; 184 state->cplba.deltbae = DELTA_BIT_NONE;
185 state->ba[0].deltbae = state->ba[1].deltbae = state->ba[2].deltbae = 185 state->ba[0].deltbae = state->ba[1].deltbae = state->ba[2].deltbae =
186 state->ba[3].deltbae = state->ba[4].deltbae = DELTA_BIT_NONE; 186 state->ba[3].deltbae = state->ba[4].deltbae = DELTA_BIT_NONE;
187 187
188 chaninfo = !acmod; 188 chaninfo = !acmod;
189 do { 189 do {
190 bitstream_get (state, 5); /* dialnorm */ 190 bitstream_get (state, 5); /* dialnorm */
191 if (bitstream_get (state, 1)) /* compre */ 191 if (bitstream_get (state, 1)) /* compre */
192 bitstream_get (state, 8); /* compr */ 192 bitstream_get (state, 8); /* compr */
193 if (bitstream_get (state, 1)) /* langcode */ 193 if (bitstream_get (state, 1)) /* langcode */
194 bitstream_get (state, 8); /* langcod */ 194 bitstream_get (state, 8); /* langcod */
195 if (bitstream_get (state, 1)) /* audprodie */ 195 if (bitstream_get (state, 1)) /* audprodie */
196 bitstream_get (state, 7); /* mixlevel + roomtyp */ 196 bitstream_get (state, 7); /* mixlevel + roomtyp */
197 } while (chaninfo--); 197 } while (chaninfo--);
198 198
199 bitstream_get (state, 2); /* copyrightb + origbs */ 199 bitstream_get (state, 2); /* copyrightb + origbs */
200 200
201 if (bitstream_get (state, 1)) /* timecod1e */ 201 if (bitstream_get (state, 1)) /* timecod1e */
202 bitstream_get (state, 14); /* timecod1 */ 202 bitstream_get (state, 14); /* timecod1 */
203 if (bitstream_get (state, 1)) /* timecod2e */ 203 if (bitstream_get (state, 1)) /* timecod2e */
204 bitstream_get (state, 14); /* timecod2 */ 204 bitstream_get (state, 14); /* timecod2 */
205 205
206 if (bitstream_get (state, 1)) { /* addbsie */ 206 if (bitstream_get (state, 1)) { /* addbsie */
207 int addbsil; 207 int addbsil;
208 208
209 addbsil = bitstream_get (state, 6); 209 addbsil = bitstream_get (state, 6);
210 do { 210 do {
211 bitstream_get (state, 8); /* addbsi */ 211 bitstream_get (state, 8); /* addbsi */
212 } while (addbsil--); 212 } while (addbsil--);
213 } 213 }
214 214
215 return 0; 215 return 0;
216} 216}
217 217
218void a52_dynrng (a52_state_t * state, 218void a52_dynrng (a52_state_t * state,
219 level_t (* call) (level_t, void *), void * data) 219 level_t (* call) (level_t, void *), void * data)
220{ 220{
221 state->dynrnge = 0; 221 state->dynrnge = 0;
222 if (call) { 222 if (call) {
223 state->dynrnge = 1; 223 state->dynrnge = 1;
224 state->dynrngcall = call; 224 state->dynrngcall = call;
225 state->dynrngdata = data; 225 state->dynrngdata = data;
226 } 226 }
227} 227}
228 228
229static int parse_exponents (a52_state_t * state, int expstr, int ngrps, 229static int parse_exponents (a52_state_t * state, int expstr, int ngrps,
230 uint8_t exponent, uint8_t * dest) 230 uint8_t exponent, uint8_t * dest)
231{ 231{
232 int exps; 232 int exps;
233 233
234 while (ngrps--) { 234 while (ngrps--) {
235 exps = bitstream_get (state, 7); 235 exps = bitstream_get (state, 7);
236 236
237 exponent += exp_1[exps]; 237 exponent += exp_1[exps];
238 if (exponent > 24) 238 if (exponent > 24)
239 return 1; 239 return 1;
240 240
241 switch (expstr) { 241 switch (expstr) {
242 case EXP_D45: 242 case EXP_D45:
243 *(dest++) = exponent; 243 *(dest++) = exponent;
244 *(dest++) = exponent; 244 *(dest++) = exponent;
245 case EXP_D25: 245 case EXP_D25:
246 *(dest++) = exponent; 246 *(dest++) = exponent;
247 case EXP_D15: 247 case EXP_D15:
248 *(dest++) = exponent; 248 *(dest++) = exponent;
249 } 249 }
250 250
251 exponent += exp_2[exps]; 251 exponent += exp_2[exps];
252 if (exponent > 24) 252 if (exponent > 24)
253 return 1; 253 return 1;
254 254
255 switch (expstr) { 255 switch (expstr) {
256 case EXP_D45: 256 case EXP_D45:
257 *(dest++) = exponent; 257 *(dest++) = exponent;
258 *(dest++) = exponent; 258 *(dest++) = exponent;
259 case EXP_D25: 259 case EXP_D25:
260 *(dest++) = exponent; 260 *(dest++) = exponent;
261 case EXP_D15: 261 case EXP_D15:
262 *(dest++) = exponent; 262 *(dest++) = exponent;
263 } 263 }
264 264
265 exponent += exp_3[exps]; 265 exponent += exp_3[exps];
266 if (exponent > 24) 266 if (exponent > 24)
267 return 1; 267 return 1;
268 268
269 switch (expstr) { 269 switch (expstr) {
270 case EXP_D45: 270 case EXP_D45:
271 *(dest++) = exponent; 271 *(dest++) = exponent;
272 *(dest++) = exponent; 272 *(dest++) = exponent;
273 case EXP_D25: 273 case EXP_D25:
274 *(dest++) = exponent; 274 *(dest++) = exponent;
275 case EXP_D15: 275 case EXP_D15:
276 *(dest++) = exponent; 276 *(dest++) = exponent;
277 } 277 }
278 } 278 }
279 279
280 return 0; 280 return 0;
@@ -289,16 +289,16 @@ static int parse_deltba (a52_state_t * state, int8_t * deltba)
289 deltnseg = bitstream_get (state, 3); 289 deltnseg = bitstream_get (state, 3);
290 j = 0; 290 j = 0;
291 do { 291 do {
292 j += bitstream_get (state, 5); 292 j += bitstream_get (state, 5);
293 deltlen = bitstream_get (state, 4); 293 deltlen = bitstream_get (state, 4);
294 delta = bitstream_get (state, 3); 294 delta = bitstream_get (state, 3);
295 delta -= (delta >= 4) ? 3 : 4; 295 delta -= (delta >= 4) ? 3 : 4;
296 if (!deltlen) 296 if (!deltlen)
297 continue; 297 continue;
298 if (j + deltlen >= 50) 298 if (j + deltlen >= 50)
299 return 1; 299 return 1;
300 while (deltlen--) 300 while (deltlen--)
301 deltba[j++] = delta; 301 deltba[j++] = delta;
302 } while (deltnseg--); 302 } while (deltnseg--);
303 303
304 return 0; 304 return 0;
@@ -309,12 +309,12 @@ static inline int zero_snr_offsets (int nfchans, a52_state_t * state)
309 int i; 309 int i;
310 310
311 if ((state->csnroffst) || 311 if ((state->csnroffst) ||
312 (state->chincpl && state->cplba.bai >> 3) || /* cplinu, fsnroffst */ 312 (state->chincpl && state->cplba.bai >> 3) || /* cplinu, fsnroffst */
313 (state->lfeon && state->lfeba.bai >> 3)) /* fsnroffst */ 313 (state->lfeon && state->lfeba.bai >> 3)) /* fsnroffst */
314 return 0;
315 for (i = 0; i < nfchans; i++)
316 if (state->ba[i].bai >> 3) /* fsnroffst */
317 return 0; 314 return 0;
315 for (i = 0; i < nfchans; i++)
316 if (state->ba[i].bai >> 3) /* fsnroffst */
317 return 0;
318 return 1; 318 return 1;
319} 319}
320 320
@@ -323,7 +323,7 @@ static inline int16_t dither_gen (a52_state_t * state)
323 int16_t nstate; 323 int16_t nstate;
324 324
325 nstate = dither_lut[state->lfsr_state >> 8] ^ (state->lfsr_state << 8); 325 nstate = dither_lut[state->lfsr_state >> 8] ^ (state->lfsr_state << 8);
326 326
327 state->lfsr_state = (uint16_t) nstate; 327 state->lfsr_state = (uint16_t) nstate;
328 328
329 return (3 * nstate) >> 2; 329 return (3 * nstate) >> 2;
@@ -332,21 +332,21 @@ static inline int16_t dither_gen (a52_state_t * state)
332#ifndef LIBA52_FIXED 332#ifndef LIBA52_FIXED
333#define COEFF(c,t,l,s,e) (c) = (t) * (s)[e] 333#define COEFF(c,t,l,s,e) (c) = (t) * (s)[e]
334#else 334#else
335#define COEFF(c,_t,_l,s,e) do { \ 335#define COEFF(c,_t,_l,s,e) do { \
336 quantizer_t t = (_t); \ 336 quantizer_t t = (_t); \
337 level_t l = (_l); \ 337 level_t l = (_l); \
338 int shift = e - 5; \ 338 int shift = e - 5; \
339 sample_t tmp = t * (l >> 16) + ((t * (l & 0xffff)) >> 16); \ 339 sample_t tmp = t * (l >> 16) + ((t * (l & 0xffff)) >> 16); \
340 if (shift >= 0) \ 340 if (shift >= 0) \
341 (c) = tmp >> shift; \ 341 (c) = tmp >> shift; \
342 else \ 342 else \
343 (c) = tmp << -shift; \ 343 (c) = tmp << -shift; \
344} while (0) 344} while (0)
345#endif 345#endif
346 346
347static void coeff_get (a52_state_t * state, sample_t * coeff, 347static void coeff_get (a52_state_t * state, sample_t * coeff,
348 expbap_t * expbap, quantizer_set_t * quant, 348 expbap_t * expbap, quantizer_set_t * quant,
349 level_t level, int dither, int end) 349 level_t level, int dither, int end)
350{ 350{
351 int i; 351 int i;
352 uint8_t * exp; 352 uint8_t * exp;
@@ -356,96 +356,96 @@ static void coeff_get (a52_state_t * state, sample_t * coeff,
356 sample_t factor[25]; 356 sample_t factor[25];
357 357
358 for (i = 0; i <= 24; i++) 358 for (i = 0; i <= 24; i++)
359 factor[i] = scale_factor[i] * level; 359 factor[i] = scale_factor[i] * level;
360#endif 360#endif
361 361
362 exp = expbap->exp; 362 exp = expbap->exp;
363 bap = expbap->bap; 363 bap = expbap->bap;
364 364
365 for (i = 0; i < end; i++) { 365 for (i = 0; i < end; i++) {
366 int bapi; 366 int bapi;
367
368 bapi = bap[i];
369 switch (bapi) {
370 case 0:
371 if (dither) {
372 COEFF (coeff[i], dither_gen (state), level, factor, exp[i]);
373 continue;
374 } else {
375 coeff[i] = 0;
376 continue;
377 }
378
379 case -1:
380 if (quant->q1_ptr >= 0) {
381 COEFF (coeff[i], quant->q1[quant->q1_ptr--], level,
382 factor, exp[i]);
383 continue;
384 } else {
385 int code;
386
387 code = bitstream_get (state, 5);
388
389 quant->q1_ptr = 1;
390 quant->q1[0] = q_1_2[code];
391 quant->q1[1] = q_1_1[code];
392 COEFF (coeff[i], q_1_0[code], level, factor, exp[i]);
393 continue;
394 }
395 367
396 case -2: 368 bapi = bap[i];
397 if (quant->q2_ptr >= 0) { 369 switch (bapi) {
398 COEFF (coeff[i], quant->q2[quant->q2_ptr--], level, 370 case 0:
399 factor, exp[i]); 371 if (dither) {
400 continue; 372 COEFF (coeff[i], dither_gen (state), level, factor, exp[i]);
401 } else { 373 continue;
402 int code; 374 } else {
375 coeff[i] = 0;
376 continue;
377 }
403 378
404 code = bitstream_get (state, 7); 379 case -1:
380 if (quant->q1_ptr >= 0) {
381 COEFF (coeff[i], quant->q1[quant->q1_ptr--], level,
382 factor, exp[i]);
383 continue;
384 } else {
385 int code;
386
387 code = bitstream_get (state, 5);
388
389 quant->q1_ptr = 1;
390 quant->q1[0] = q_1_2[code];
391 quant->q1[1] = q_1_1[code];
392 COEFF (coeff[i], q_1_0[code], level, factor, exp[i]);
393 continue;
394 }
405 395
406 quant->q2_ptr = 1; 396 case -2:
407 quant->q2[0] = q_2_2[code]; 397 if (quant->q2_ptr >= 0) {
408 quant->q2[1] = q_2_1[code]; 398 COEFF (coeff[i], quant->q2[quant->q2_ptr--], level,
409 COEFF (coeff[i], q_2_0[code], level, factor, exp[i]); 399 factor, exp[i]);
410 continue; 400 continue;
411 } 401 } else {
402 int code;
403
404 code = bitstream_get (state, 7);
405
406 quant->q2_ptr = 1;
407 quant->q2[0] = q_2_2[code];
408 quant->q2[1] = q_2_1[code];
409 COEFF (coeff[i], q_2_0[code], level, factor, exp[i]);
410 continue;
411 }
412 412
413 case 3: 413 case 3:
414 COEFF (coeff[i], q_3[bitstream_get (state, 3)], level, 414 COEFF (coeff[i], q_3[bitstream_get (state, 3)], level,
415 factor, exp[i]); 415 factor, exp[i]);
416 continue; 416 continue;
417 417
418 case -3: 418 case -3:
419 if (quant->q4_ptr == 0) { 419 if (quant->q4_ptr == 0) {
420 quant->q4_ptr = -1; 420 quant->q4_ptr = -1;
421 COEFF (coeff[i], quant->q4, level, factor, exp[i]); 421 COEFF (coeff[i], quant->q4, level, factor, exp[i]);
422 continue; 422 continue;
423 } else { 423 } else {
424 int code; 424 int code;
425
426 code = bitstream_get (state, 7);
427
428 quant->q4_ptr = 0;
429 quant->q4 = q_4_1[code];
430 COEFF (coeff[i], q_4_0[code], level, factor, exp[i]);
431 continue;
432 }
425 433
426 code = bitstream_get (state, 7); 434 case 4:
435 COEFF (coeff[i], q_5[bitstream_get (state, 4)], level,
436 factor, exp[i]);
437 continue;
427 438
428 quant->q4_ptr = 0; 439 default:
429 quant->q4 = q_4_1[code]; 440 COEFF (coeff[i], bitstream_get_2 (state, bapi) << (16 - bapi),
430 COEFF (coeff[i], q_4_0[code], level, factor, exp[i]); 441 level, factor, exp[i]);
431 continue;
432 } 442 }
433
434 case 4:
435 COEFF (coeff[i], q_5[bitstream_get (state, 4)], level,
436 factor, exp[i]);
437 continue;
438
439 default:
440 COEFF (coeff[i], bitstream_get_2 (state, bapi) << (16 - bapi),
441 level, factor, exp[i]);
442 }
443 } 443 }
444} 444}
445 445
446static void coeff_get_coupling (a52_state_t * state, int nfchans, 446static void coeff_get_coupling (a52_state_t * state, int nfchans,
447 level_t * coeff, sample_t (* samples)[256], 447 level_t * coeff, sample_t (* samples)[256],
448 quantizer_set_t * quant, uint8_t dithflag[5]) 448 quantizer_set_t * quant, uint8_t dithflag[5])
449{ 449{
450 int cplbndstrc, bnd, i, i_end, ch; 450 int cplbndstrc, bnd, i, i_end, ch;
451 uint8_t * exp; 451 uint8_t * exp;
@@ -458,111 +458,111 @@ static void coeff_get_coupling (a52_state_t * state, int nfchans,
458 cplbndstrc = state->cplbndstrc; 458 cplbndstrc = state->cplbndstrc;
459 i = state->cplstrtmant; 459 i = state->cplstrtmant;
460 while (i < state->cplendmant) { 460 while (i < state->cplendmant) {
461 i_end = i + 12; 461 i_end = i + 12;
462 while (cplbndstrc & 1) { 462 while (cplbndstrc & 1) {
463 cplbndstrc >>= 1;
464 i_end += 12;
465 }
463 cplbndstrc >>= 1; 466 cplbndstrc >>= 1;
464 i_end += 12;
465 }
466 cplbndstrc >>= 1;
467 for (ch = 0; ch < nfchans; ch++)
468 cplco[ch] = MUL_L (state->cplco[ch][bnd], coeff[ch]);
469 bnd++;
470
471 while (i < i_end) {
472 quantizer_t cplcoeff;
473 int bapi;
474
475 bapi = bap[i];
476 switch (bapi) {
477 case 0:
478 for (ch = 0; ch < nfchans; ch++) 467 for (ch = 0; ch < nfchans; ch++)
479 if ((state->chincpl >> ch) & 1) { 468 cplco[ch] = MUL_L (state->cplco[ch][bnd], coeff[ch]);
480 if (dithflag[ch]) 469 bnd++;
470
471 while (i < i_end) {
472 quantizer_t cplcoeff;
473 int bapi;
474
475 bapi = bap[i];
476 switch (bapi) {
477 case 0:
478 for (ch = 0; ch < nfchans; ch++)
479 if ((state->chincpl >> ch) & 1) {
480 if (dithflag[ch])
481#ifndef LIBA52_FIXED 481#ifndef LIBA52_FIXED
482 samples[ch][i] = (scale_factor[exp[i]] * 482 samples[ch][i] = (scale_factor[exp[i]] *
483 cplco[ch] * dither_gen (state)); 483 cplco[ch] * dither_gen (state));
484#else 484#else
485 COEFF (samples[ch][i], dither_gen (state), 485 COEFF (samples[ch][i], dither_gen (state),
486 cplco[ch], scale_factor, exp[i]); 486 cplco[ch], scale_factor, exp[i]);
487#endif 487#endif
488 else 488 else
489 samples[ch][i] = 0; 489 samples[ch][i] = 0;
490 }
491 i++;
492 continue;
493
494 case -1:
495 if (quant->q1_ptr >= 0) {
496 cplcoeff = quant->q1[quant->q1_ptr--];
497 break;
498 } else {
499 int code;
500
501 code = bitstream_get (state, 5);
502
503 quant->q1_ptr = 1;
504 quant->q1[0] = q_1_2[code];
505 quant->q1[1] = q_1_1[code];
506 cplcoeff = q_1_0[code];
507 break;
508 }
509
510 case -2:
511 if (quant->q2_ptr >= 0) {
512 cplcoeff = quant->q2[quant->q2_ptr--];
513 break;
514 } else {
515 int code;
516
517 code = bitstream_get (state, 7);
518
519 quant->q2_ptr = 1;
520 quant->q2[0] = q_2_2[code];
521 quant->q2[1] = q_2_1[code];
522 cplcoeff = q_2_0[code];
523 break;
524 }
525
526 case 3:
527 cplcoeff = q_3[bitstream_get (state, 3)];
528 break;
529
530 case -3:
531 if (quant->q4_ptr == 0) {
532 quant->q4_ptr = -1;
533 cplcoeff = quant->q4;
534 break;
535 } else {
536 int code;
537
538 code = bitstream_get (state, 7);
539
540 quant->q4_ptr = 0;
541 quant->q4 = q_4_1[code];
542 cplcoeff = q_4_0[code];
543 break;
544 }
545
546 case 4:
547 cplcoeff = q_5[bitstream_get (state, 4)];
548 break;
549
550 default:
551 cplcoeff = bitstream_get_2 (state, bapi) << (16 - bapi);
490 } 552 }
491 i++;
492 continue;
493
494 case -1:
495 if (quant->q1_ptr >= 0) {
496 cplcoeff = quant->q1[quant->q1_ptr--];
497 break;
498 } else {
499 int code;
500
501 code = bitstream_get (state, 5);
502
503 quant->q1_ptr = 1;
504 quant->q1[0] = q_1_2[code];
505 quant->q1[1] = q_1_1[code];
506 cplcoeff = q_1_0[code];
507 break;
508 }
509
510 case -2:
511 if (quant->q2_ptr >= 0) {
512 cplcoeff = quant->q2[quant->q2_ptr--];
513 break;
514 } else {
515 int code;
516
517 code = bitstream_get (state, 7);
518
519 quant->q2_ptr = 1;
520 quant->q2[0] = q_2_2[code];
521 quant->q2[1] = q_2_1[code];
522 cplcoeff = q_2_0[code];
523 break;
524 }
525
526 case 3:
527 cplcoeff = q_3[bitstream_get (state, 3)];
528 break;
529
530 case -3:
531 if (quant->q4_ptr == 0) {
532 quant->q4_ptr = -1;
533 cplcoeff = quant->q4;
534 break;
535 } else {
536 int code;
537
538 code = bitstream_get (state, 7);
539
540 quant->q4_ptr = 0;
541 quant->q4 = q_4_1[code];
542 cplcoeff = q_4_0[code];
543 break;
544 }
545
546 case 4:
547 cplcoeff = q_5[bitstream_get (state, 4)];
548 break;
549
550 default:
551 cplcoeff = bitstream_get_2 (state, bapi) << (16 - bapi);
552 }
553#ifndef LIBA52_FIXED 553#ifndef LIBA52_FIXED
554 cplcoeff *= scale_factor[exp[i]]; 554 cplcoeff *= scale_factor[exp[i]];
555#endif 555#endif
556 for (ch = 0; ch < nfchans; ch++) 556 for (ch = 0; ch < nfchans; ch++)
557 if ((state->chincpl >> ch) & 1) 557 if ((state->chincpl >> ch) & 1)
558#ifndef LIBA52_FIXED 558#ifndef LIBA52_FIXED
559 samples[ch][i] = cplcoeff * cplco[ch]; 559 samples[ch][i] = cplcoeff * cplco[ch];
560#else 560#else
561 COEFF (samples[ch][i], cplcoeff, cplco[ch], 561 COEFF (samples[ch][i], cplcoeff, cplco[ch],
562 scale_factor, exp[i]); 562 scale_factor, exp[i]);
563#endif 563#endif
564 i++; 564 i++;
565 } 565 }
566 } 566 }
567} 567}
568 568
@@ -581,366 +581,366 @@ int a52_block (a52_state_t * state)
581 nfchans = nfchans_tbl[state->acmod]; 581 nfchans = nfchans_tbl[state->acmod];
582 582
583 for (i = 0; i < nfchans; i++) 583 for (i = 0; i < nfchans; i++)
584 blksw[i] = bitstream_get (state, 1); 584 blksw[i] = bitstream_get (state, 1);
585 585
586 for (i = 0; i < nfchans; i++) 586 for (i = 0; i < nfchans; i++)
587 dithflag[i] = bitstream_get (state, 1); 587 dithflag[i] = bitstream_get (state, 1);
588 588
589 chaninfo = !state->acmod; 589 chaninfo = !state->acmod;
590 do { 590 do {
591 if (bitstream_get (state, 1)) { /* dynrnge */ 591 if (bitstream_get (state, 1)) { /* dynrnge */
592 int dynrng; 592 int dynrng;
593 593
594 dynrng = bitstream_get_2 (state, 8); 594 dynrng = bitstream_get_2 (state, 8);
595 if (state->dynrnge) { 595 if (state->dynrnge) {
596 level_t range; 596 level_t range;
597 597
598#if !defined(LIBA52_FIXED) 598#if !defined(LIBA52_FIXED)
599 range = ((((dynrng & 0x1f) | 0x20) << 13) * 599 range = ((((dynrng & 0x1f) | 0x20) << 13) *
600 scale_factor[3 - (dynrng >> 5)]); 600 scale_factor[3 - (dynrng >> 5)]);
601#else 601#else
602 range = ((dynrng & 0x1f) | 0x20) << (21 + (dynrng >> 5)); 602 range = ((dynrng & 0x1f) | 0x20) << (21 + (dynrng >> 5));
603#endif 603#endif
604 if (state->dynrngcall) 604 if (state->dynrngcall)
605 range = state->dynrngcall (range, state->dynrngdata); 605 range = state->dynrngcall (range, state->dynrngdata);
606 state->dynrng = MUL_L (state->level, range); 606 state->dynrng = MUL_L (state->level, range);
607 }
607 } 608 }
608 }
609 } while (chaninfo--); 609 } while (chaninfo--);
610 610
611 if (bitstream_get (state, 1)) { /* cplstre */ 611 if (bitstream_get (state, 1)) { /* cplstre */
612 state->chincpl = 0; 612 state->chincpl = 0;
613 if (bitstream_get (state, 1)) { /* cplinu */ 613 if (bitstream_get (state, 1)) { /* cplinu */
614 static uint8_t bndtab[16] = {31, 35, 37, 39, 41, 42, 43, 44, 614 static uint8_t bndtab[16] = {31, 35, 37, 39, 41, 42, 43, 44,
615 45, 45, 46, 46, 47, 47, 48, 48}; 615 45, 45, 46, 46, 47, 47, 48, 48};
616 int cplbegf; 616 int cplbegf;
617 int cplendf; 617 int cplendf;
618 int ncplsubnd; 618 int ncplsubnd;
619 619
620 for (i = 0; i < nfchans; i++) 620 for (i = 0; i < nfchans; i++)
621 state->chincpl |= bitstream_get (state, 1) << i; 621 state->chincpl |= bitstream_get (state, 1) << i;
622 switch (state->acmod) { 622 switch (state->acmod) {
623 case 0: case 1: 623 case 0: case 1:
624 return 1; 624 return 1;
625 case 2: 625 case 2:
626 state->phsflginu = bitstream_get (state, 1); 626 state->phsflginu = bitstream_get (state, 1);
627 } 627 }
628 cplbegf = bitstream_get (state, 4); 628 cplbegf = bitstream_get (state, 4);
629 cplendf = bitstream_get (state, 4); 629 cplendf = bitstream_get (state, 4);
630 630
631 if (cplendf + 3 - cplbegf < 0) 631 if (cplendf + 3 - cplbegf < 0)
632 return 1; 632 return 1;
633 state->ncplbnd = ncplsubnd = cplendf + 3 - cplbegf; 633 state->ncplbnd = ncplsubnd = cplendf + 3 - cplbegf;
634 state->cplstrtbnd = bndtab[cplbegf]; 634 state->cplstrtbnd = bndtab[cplbegf];
635 state->cplstrtmant = cplbegf * 12 + 37; 635 state->cplstrtmant = cplbegf * 12 + 37;
636 state->cplendmant = cplendf * 12 + 73; 636 state->cplendmant = cplendf * 12 + 73;
637 637
638 state->cplbndstrc = 0; 638 state->cplbndstrc = 0;
639 for (i = 0; i < ncplsubnd - 1; i++) 639 for (i = 0; i < ncplsubnd - 1; i++)
640 if (bitstream_get (state, 1)) { 640 if (bitstream_get (state, 1)) {
641 state->cplbndstrc |= 1 << i; 641 state->cplbndstrc |= 1 << i;
642 state->ncplbnd--; 642 state->ncplbnd--;
643 }
643 } 644 }
644 } 645 }
645 }
646 646
647 if (state->chincpl) { /* cplinu */ 647 if (state->chincpl) { /* cplinu */
648 int j, cplcoe; 648 int j, cplcoe;
649 649
650 cplcoe = 0; 650 cplcoe = 0;
651 for (i = 0; i < nfchans; i++) 651 for (i = 0; i < nfchans; i++)
652 if ((state->chincpl) >> i & 1) 652 if ((state->chincpl) >> i & 1)
653 if (bitstream_get (state, 1)) { /* cplcoe */ 653 if (bitstream_get (state, 1)) { /* cplcoe */
654 int mstrcplco, cplcoexp, cplcomant; 654 int mstrcplco, cplcoexp, cplcomant;
655 655
656 cplcoe = 1; 656 cplcoe = 1;
657 mstrcplco = 3 * bitstream_get (state, 2); 657 mstrcplco = 3 * bitstream_get (state, 2);
658 for (j = 0; j < state->ncplbnd; j++) { 658 for (j = 0; j < state->ncplbnd; j++) {
659 cplcoexp = bitstream_get (state, 4); 659 cplcoexp = bitstream_get (state, 4);
660 cplcomant = bitstream_get (state, 4); 660 cplcomant = bitstream_get (state, 4);
661 if (cplcoexp == 15) 661 if (cplcoexp == 15)
662 cplcomant <<= 14; 662 cplcomant <<= 14;
663 else 663 else
664 cplcomant = (cplcomant | 0x10) << 13; 664 cplcomant = (cplcomant | 0x10) << 13;
665#ifndef LIBA52_FIXED 665#ifndef LIBA52_FIXED
666 state->cplco[i][j] = 666 state->cplco[i][j] =
667 cplcomant * scale_factor[cplcoexp + mstrcplco]; 667 cplcomant * scale_factor[cplcoexp + mstrcplco];
668#else 668#else
669 state->cplco[i][j] = (cplcomant << 11) >> (cplcoexp + mstrcplco); 669 state->cplco[i][j] = (cplcomant << 11) >> (cplcoexp + mstrcplco);
670#endif 670#endif
671 671
672 } 672 }
673 } 673 }
674 if ((state->acmod == 2) && state->phsflginu && cplcoe) 674 if ((state->acmod == 2) && state->phsflginu && cplcoe)
675 for (j = 0; j < state->ncplbnd; j++) 675 for (j = 0; j < state->ncplbnd; j++)
676 if (bitstream_get (state, 1)) /* phsflg */ 676 if (bitstream_get (state, 1)) /* phsflg */
677 state->cplco[1][j] = -state->cplco[1][j]; 677 state->cplco[1][j] = -state->cplco[1][j];
678 } 678 }
679 679
680 if ((state->acmod == 2) && (bitstream_get (state, 1))) { /* rematstr */ 680 if ((state->acmod == 2) && (bitstream_get (state, 1))) { /* rematstr */
681 int end; 681 int end;
682 682
683 state->rematflg = 0; 683 state->rematflg = 0;
684 end = (state->chincpl) ? state->cplstrtmant : 253; /* cplinu */ 684 end = (state->chincpl) ? state->cplstrtmant : 253; /* cplinu */
685 i = 0; 685 i = 0;
686 do 686 do
687 state->rematflg |= bitstream_get (state, 1) << i; 687 state->rematflg |= bitstream_get (state, 1) << i;
688 while (rematrix_band[i++] < end); 688 while (rematrix_band[i++] < end);
689 } 689 }
690 690
691 cplexpstr = EXP_REUSE; 691 cplexpstr = EXP_REUSE;
692 lfeexpstr = EXP_REUSE; 692 lfeexpstr = EXP_REUSE;
693 if (state->chincpl) /* cplinu */ 693 if (state->chincpl) /* cplinu */
694 cplexpstr = bitstream_get (state, 2); 694 cplexpstr = bitstream_get (state, 2);
695 for (i = 0; i < nfchans; i++) 695 for (i = 0; i < nfchans; i++)
696 chexpstr[i] = bitstream_get (state, 2); 696 chexpstr[i] = bitstream_get (state, 2);
697 if (state->lfeon) 697 if (state->lfeon)
698 lfeexpstr = bitstream_get (state, 1); 698 lfeexpstr = bitstream_get (state, 1);
699 699
700 for (i = 0; i < nfchans; i++) 700 for (i = 0; i < nfchans; i++)
701 if (chexpstr[i] != EXP_REUSE) { 701 if (chexpstr[i] != EXP_REUSE) {
702 if ((state->chincpl >> i) & 1) 702 if ((state->chincpl >> i) & 1)
703 state->endmant[i] = state->cplstrtmant; 703 state->endmant[i] = state->cplstrtmant;
704 else { 704 else {
705 int chbwcod; 705 int chbwcod;
706 706
707 chbwcod = bitstream_get (state, 6); 707 chbwcod = bitstream_get (state, 6);
708 if (chbwcod > 60) 708 if (chbwcod > 60)
709 return 1; 709 return 1;
710 state->endmant[i] = chbwcod * 3 + 73; 710 state->endmant[i] = chbwcod * 3 + 73;
711 }
711 } 712 }
712 }
713 713
714 do_bit_alloc = 0; 714 do_bit_alloc = 0;
715 715
716 if (cplexpstr != EXP_REUSE) { 716 if (cplexpstr != EXP_REUSE) {
717 int cplabsexp, ncplgrps; 717 int cplabsexp, ncplgrps;
718 718
719 do_bit_alloc = 64; 719 do_bit_alloc = 64;
720 ncplgrps = ((state->cplendmant - state->cplstrtmant) / 720 ncplgrps = ((state->cplendmant - state->cplstrtmant) /
721 (3 << (cplexpstr - 1))); 721 (3 << (cplexpstr - 1)));
722 cplabsexp = bitstream_get (state, 4) << 1; 722 cplabsexp = bitstream_get (state, 4) << 1;
723 if (parse_exponents (state, cplexpstr, ncplgrps, cplabsexp, 723 if (parse_exponents (state, cplexpstr, ncplgrps, cplabsexp,
724 state->cpl_expbap.exp + state->cplstrtmant)) 724 state->cpl_expbap.exp + state->cplstrtmant))
725 return 1; 725 return 1;
726 } 726 }
727 for (i = 0; i < nfchans; i++) 727 for (i = 0; i < nfchans; i++)
728 if (chexpstr[i] != EXP_REUSE) { 728 if (chexpstr[i] != EXP_REUSE) {
729 int grp_size, nchgrps; 729 int grp_size, nchgrps;
730 730
731 do_bit_alloc |= 1 << i; 731 do_bit_alloc |= 1 << i;
732 grp_size = 3 << (chexpstr[i] - 1); 732 grp_size = 3 << (chexpstr[i] - 1);
733 nchgrps = (state->endmant[i] + grp_size - 4) / grp_size; 733 nchgrps = (state->endmant[i] + grp_size - 4) / grp_size;
734 state->fbw_expbap[i].exp[0] = bitstream_get (state, 4); 734 state->fbw_expbap[i].exp[0] = bitstream_get (state, 4);
735 if (parse_exponents (state, chexpstr[i], nchgrps, 735 if (parse_exponents (state, chexpstr[i], nchgrps,
736 state->fbw_expbap[i].exp[0], 736 state->fbw_expbap[i].exp[0],
737 state->fbw_expbap[i].exp + 1)) 737 state->fbw_expbap[i].exp + 1))
738 return 1; 738 return 1;
739 bitstream_get (state, 2); /* gainrng */ 739 bitstream_get (state, 2); /* gainrng */
740 } 740 }
741 if (lfeexpstr != EXP_REUSE) { 741 if (lfeexpstr != EXP_REUSE) {
742 do_bit_alloc |= 32; 742 do_bit_alloc |= 32;
743 state->lfe_expbap.exp[0] = bitstream_get (state, 4); 743 state->lfe_expbap.exp[0] = bitstream_get (state, 4);
744 if (parse_exponents (state, lfeexpstr, 2, state->lfe_expbap.exp[0], 744 if (parse_exponents (state, lfeexpstr, 2, state->lfe_expbap.exp[0],
745 state->lfe_expbap.exp + 1)) 745 state->lfe_expbap.exp + 1))
746 return 1; 746 return 1;
747 } 747 }
748 748
749 if (bitstream_get (state, 1)) { /* baie */ 749 if (bitstream_get (state, 1)) { /* baie */
750 do_bit_alloc = 127; 750 do_bit_alloc = 127;
751 state->bai = bitstream_get (state, 11); 751 state->bai = bitstream_get (state, 11);
752 } 752 }
753 if (bitstream_get (state, 1)) { /* snroffste */ 753 if (bitstream_get (state, 1)) { /* snroffste */
754 do_bit_alloc = 127; 754 do_bit_alloc = 127;
755 state->csnroffst = bitstream_get (state, 6); 755 state->csnroffst = bitstream_get (state, 6);
756 if (state->chincpl) /* cplinu */ 756 if (state->chincpl) /* cplinu */
757 state->cplba.bai = bitstream_get (state, 7); 757 state->cplba.bai = bitstream_get (state, 7);
758 for (i = 0; i < nfchans; i++) 758 for (i = 0; i < nfchans; i++)
759 state->ba[i].bai = bitstream_get (state, 7); 759 state->ba[i].bai = bitstream_get (state, 7);
760 if (state->lfeon) 760 if (state->lfeon)
761 state->lfeba.bai = bitstream_get (state, 7); 761 state->lfeba.bai = bitstream_get (state, 7);
762 } 762 }
763 if ((state->chincpl) && (bitstream_get (state, 1))) { /* cplleake */ 763 if ((state->chincpl) && (bitstream_get (state, 1))) { /* cplleake */
764 do_bit_alloc |= 64; 764 do_bit_alloc |= 64;
765 state->cplfleak = 9 - bitstream_get (state, 3); 765 state->cplfleak = 9 - bitstream_get (state, 3);
766 state->cplsleak = 9 - bitstream_get (state, 3); 766 state->cplsleak = 9 - bitstream_get (state, 3);
767 } 767 }
768 768
769 if (bitstream_get (state, 1)) { /* deltbaie */ 769 if (bitstream_get (state, 1)) { /* deltbaie */
770 do_bit_alloc = 127; 770 do_bit_alloc = 127;
771 if (state->chincpl) /* cplinu */ 771 if (state->chincpl) /* cplinu */
772 state->cplba.deltbae = bitstream_get (state, 2); 772 state->cplba.deltbae = bitstream_get (state, 2);
773 for (i = 0; i < nfchans; i++) 773 for (i = 0; i < nfchans; i++)
774 state->ba[i].deltbae = bitstream_get (state, 2); 774 state->ba[i].deltbae = bitstream_get (state, 2);
775 if (state->chincpl && /* cplinu */ 775 if (state->chincpl && /* cplinu */
776 (state->cplba.deltbae == DELTA_BIT_NEW) && 776 (state->cplba.deltbae == DELTA_BIT_NEW) &&
777 parse_deltba (state, state->cplba.deltba)) 777 parse_deltba (state, state->cplba.deltba))
778 return 1; 778 return 1;
779 for (i = 0; i < nfchans; i++) 779 for (i = 0; i < nfchans; i++)
780 if ((state->ba[i].deltbae == DELTA_BIT_NEW) && 780 if ((state->ba[i].deltbae == DELTA_BIT_NEW) &&
781 parse_deltba (state, state->ba[i].deltba)) 781 parse_deltba (state, state->ba[i].deltba))
782 return 1; 782 return 1;
783 } 783 }
784 784
785 if (do_bit_alloc) { 785 if (do_bit_alloc) {
786 if (zero_snr_offsets (nfchans, state)) { 786 if (zero_snr_offsets (nfchans, state)) {
787 memset (state->cpl_expbap.bap, 0, sizeof (state->cpl_expbap.bap)); 787 memset (state->cpl_expbap.bap, 0, sizeof (state->cpl_expbap.bap));
788 for (i = 0; i < nfchans; i++) 788 for (i = 0; i < nfchans; i++)
789 memset (state->fbw_expbap[i].bap, 0, 789 memset (state->fbw_expbap[i].bap, 0,
790 sizeof (state->fbw_expbap[i].bap)); 790 sizeof (state->fbw_expbap[i].bap));
791 memset (state->lfe_expbap.bap, 0, sizeof (state->lfe_expbap.bap)); 791 memset (state->lfe_expbap.bap, 0, sizeof (state->lfe_expbap.bap));
792 } else { 792 } else {
793 if (state->chincpl && (do_bit_alloc & 64)) /* cplinu */ 793 if (state->chincpl && (do_bit_alloc & 64)) /* cplinu */
794 a52_bit_allocate (state, &state->cplba, state->cplstrtbnd, 794 a52_bit_allocate (state, &state->cplba, state->cplstrtbnd,
795 state->cplstrtmant, state->cplendmant, 795 state->cplstrtmant, state->cplendmant,
796 state->cplfleak << 8, state->cplsleak << 8, 796 state->cplfleak << 8, state->cplsleak << 8,
797 &state->cpl_expbap); 797 &state->cpl_expbap);
798 for (i = 0; i < nfchans; i++) 798 for (i = 0; i < nfchans; i++)
799 if (do_bit_alloc & (1 << i)) 799 if (do_bit_alloc & (1 << i))
800 a52_bit_allocate (state, state->ba + i, 0, 0, 800 a52_bit_allocate (state, state->ba + i, 0, 0,
801 state->endmant[i], 0, 0, 801 state->endmant[i], 0, 0,
802 state->fbw_expbap +i); 802 state->fbw_expbap +i);
803 if (state->lfeon && (do_bit_alloc & 32)) { 803 if (state->lfeon && (do_bit_alloc & 32)) {
804 state->lfeba.deltbae = DELTA_BIT_NONE; 804 state->lfeba.deltbae = DELTA_BIT_NONE;
805 a52_bit_allocate (state, &state->lfeba, 0, 0, 7, 0, 0, 805 a52_bit_allocate (state, &state->lfeba, 0, 0, 7, 0, 0,
806 &state->lfe_expbap); 806 &state->lfe_expbap);
807 }
807 } 808 }
808 } 809 }
809 }
810 810
811 if (bitstream_get (state, 1)) { /* skiple */ 811 if (bitstream_get (state, 1)) { /* skiple */
812 i = bitstream_get (state, 9); /* skipl */ 812 i = bitstream_get (state, 9); /* skipl */
813 while (i--) 813 while (i--)
814 bitstream_get (state, 8); 814 bitstream_get (state, 8);
815 } 815 }
816 816
817 samples = state->samples; 817 samples = state->samples;
818 if (state->output & A52_LFE) 818 if (state->output & A52_LFE)
819 samples += 256; /* shift for LFE channel */ 819 samples += 256; /* shift for LFE channel */
820 820
821 chanbias = a52_downmix_coeff (coeff, state->acmod, state->output, 821 chanbias = a52_downmix_coeff (coeff, state->acmod, state->output,
822 state->dynrng, state->clev, state->slev); 822 state->dynrng, state->clev, state->slev);
823 823
824 quant.q1_ptr = quant.q2_ptr = quant.q4_ptr = -1; 824 quant.q1_ptr = quant.q2_ptr = quant.q4_ptr = -1;
825 done_cpl = 0; 825 done_cpl = 0;
826 826
827 for (i = 0; i < nfchans; i++) { 827 for (i = 0; i < nfchans; i++) {
828 int j; 828 int j;
829 829
830 coeff_get (state, samples + 256 * i, state->fbw_expbap +i, &quant, 830 coeff_get (state, samples + 256 * i, state->fbw_expbap +i, &quant,
831 coeff[i], dithflag[i], state->endmant[i]); 831 coeff[i], dithflag[i], state->endmant[i]);
832 832
833 if ((state->chincpl >> i) & 1) { 833 if ((state->chincpl >> i) & 1) {
834 if (!done_cpl) { 834 if (!done_cpl) {
835 done_cpl = 1; 835 done_cpl = 1;
836 coeff_get_coupling (state, nfchans, coeff, 836 coeff_get_coupling (state, nfchans, coeff,
837 (sample_t (*)[256])samples, &quant, 837 (sample_t (*)[256])samples, &quant,
838 dithflag); 838 dithflag);
839 } 839 }
840 j = state->cplendmant; 840 j = state->cplendmant;
841 } else 841 } else
842 j = state->endmant[i]; 842 j = state->endmant[i];
843 do 843 do
844 (samples + 256 * i)[j] = 0; 844 (samples + 256 * i)[j] = 0;
845 while (++j < 256); 845 while (++j < 256);
846 } 846 }
847 847
848 if (state->acmod == 2) { 848 if (state->acmod == 2) {
849 int j, end, band, rematflg; 849 int j, end, band, rematflg;
850 850
851 end = ((state->endmant[0] < state->endmant[1]) ? 851 end = ((state->endmant[0] < state->endmant[1]) ?
852 state->endmant[0] : state->endmant[1]); 852 state->endmant[0] : state->endmant[1]);
853 853
854 i = 0; 854 i = 0;
855 j = 13; 855 j = 13;
856 rematflg = state->rematflg; 856 rematflg = state->rematflg;
857 do {
858 if (! (rematflg & 1)) {
859 rematflg >>= 1;
860 j = rematrix_band[i++];
861 continue;
862 }
863 rematflg >>= 1;
864 band = rematrix_band[i++];
865 if (band > end)
866 band = end;
867 do { 857 do {
868 sample_t tmp0, tmp1; 858 if (! (rematflg & 1)) {
869 859 rematflg >>= 1;
870 tmp0 = samples[j]; 860 j = rematrix_band[i++];
871 tmp1 = (samples+256)[j]; 861 continue;
872 samples[j] = tmp0 + tmp1; 862 }
873 (samples+256)[j] = tmp0 - tmp1; 863 rematflg >>= 1;
874 } while (++j < band); 864 band = rematrix_band[i++];
875 } while (j < end); 865 if (band > end)
866 band = end;
867 do {
868 sample_t tmp0, tmp1;
869
870 tmp0 = samples[j];
871 tmp1 = (samples+256)[j];
872 samples[j] = tmp0 + tmp1;
873 (samples+256)[j] = tmp0 - tmp1;
874 } while (++j < band);
875 } while (j < end);
876 } 876 }
877 877
878 if (state->lfeon) { 878 if (state->lfeon) {
879 if (state->output & A52_LFE) { 879 if (state->output & A52_LFE) {
880 coeff_get (state, samples - 256, &state->lfe_expbap, &quant, 880 coeff_get (state, samples - 256, &state->lfe_expbap, &quant,
881 state->dynrng, 0, 7); 881 state->dynrng, 0, 7);
882 for (i = 7; i < 256; i++) 882 for (i = 7; i < 256; i++)
883 (samples-256)[i] = 0; 883 (samples-256)[i] = 0;
884 a52_imdct_512 (samples - 256, samples + 1536 - 256); 884 a52_imdct_512 (samples - 256, samples + 1536 - 256);
885 } else { 885 } else {
886 /* just skip the LFE coefficients */ 886 /* just skip the LFE coefficients */
887 coeff_get (state, samples + 1280, &state->lfe_expbap, &quant, 887 coeff_get (state, samples + 1280, &state->lfe_expbap, &quant,
888 0, 0, 7); 888 0, 0, 7);
889 } 889 }
890 } 890 }
891 891
892 i = 0; 892 i = 0;
893 if (nfchans_tbl[state->output & A52_CHANNEL_MASK] < nfchans) 893 if (nfchans_tbl[state->output & A52_CHANNEL_MASK] < nfchans)
894 for (i = 1; i < nfchans; i++) 894 for (i = 1; i < nfchans; i++)
895 if (blksw[i] != blksw[0]) 895 if (blksw[i] != blksw[0])
896 break; 896 break;
897 897
898 if (i < nfchans) { 898 if (i < nfchans) {
899 if (state->downmixed) { 899 if (state->downmixed) {
900 state->downmixed = 0; 900 state->downmixed = 0;
901 a52_upmix (samples + 1536, state->acmod, state->output); 901 a52_upmix (samples + 1536, state->acmod, state->output);
902 } 902 }
903 903
904 for (i = 0; i < nfchans; i++) { 904 for (i = 0; i < nfchans; i++) {
905 sample_t bias; 905 sample_t bias;
906 906
907 bias = 0; 907 bias = 0;
908 if (!(chanbias & (1 << i))) 908 if (!(chanbias & (1 << i)))
909 bias = state->bias; 909 bias = state->bias;
910 910
911 if (coeff[i]) { 911 if (coeff[i]) {
912 if (blksw[i]) 912 if (blksw[i])
913 a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i); 913 a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i);
914 else 914 else
915 a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i); 915 a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i);
916 } else { 916 } else {
917 int j; 917 int j;
918 918
919 for (j = 0; j < 256; j++) 919 for (j = 0; j < 256; j++)
920 (samples + 256 * i)[j] = bias; 920 (samples + 256 * i)[j] = bias;
921 }
921 } 922 }
922 }
923 923
924 a52_downmix (samples, state->acmod, state->output, 924 a52_downmix (samples, state->acmod, state->output,
925 state->clev, state->slev); 925 state->clev, state->slev);
926 } else { 926 } else {
927 nfchans = nfchans_tbl[state->output & A52_CHANNEL_MASK]; 927 nfchans = nfchans_tbl[state->output & A52_CHANNEL_MASK];
928 928
929 a52_downmix (samples, state->acmod, state->output, 929 a52_downmix (samples, state->acmod, state->output,
930 state->clev, state->slev); 930 state->clev, state->slev);
931 931
932 if (!state->downmixed) { 932 if (!state->downmixed) {
933 state->downmixed = 1; 933 state->downmixed = 1;
934 a52_downmix (samples + 1536, state->acmod, state->output, 934 a52_downmix (samples + 1536, state->acmod, state->output,
935 state->clev, state->slev); 935 state->clev, state->slev);
936 } 936 }
937 937
938 if (blksw[0]) 938 if (blksw[0])
939 for (i = 0; i < nfchans; i++) 939 for (i = 0; i < nfchans; i++)
940 a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i); 940 a52_imdct_256 (samples + 256 * i, samples + 1536 + 256 * i);
941 else 941 else
942 for (i = 0; i < nfchans; i++) 942 for (i = 0; i < nfchans; i++)
943 a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i); 943 a52_imdct_512 (samples + 256 * i, samples + 1536 + 256 * i);
944 } 944 }
945 945
946 return 0; 946 return 0;