OSDN Git Service

LinGui: make it possible to build outside srcdir
[handbrake-jp/handbrake-jp-git.git] / contrib / libdca / A00-general.patch
1 diff -Naur libdca/include/audio_out.h libdca_patched/include/audio_out.h
2 --- libdca/include/audio_out.h  2007-05-02 10:05:03.000000000 +0100
3 +++ libdca_patched/include/audio_out.h  2007-05-02 10:09:42.000000000 +0100
4 @@ -26,8 +26,8 @@
5  
6  struct ao_instance_s {
7      int (* setup) (ao_instance_t * instance, int sample_rate, int * flags,
8 -                  level_t * level, sample_t * bias);
9 -    int (* play) (ao_instance_t * instance, int flags, sample_t * samples);
10 +                  dca_level_t * level, dca_sample_t * bias);
11 +    int (* play) (ao_instance_t * instance, int flags, dca_sample_t * samples);
12      void (* close) (ao_instance_t * instance);
13  };
14  
15 diff -Naur libdca/include/dca.h libdca_patched/include/dca.h
16 --- libdca/include/dca.h        2007-05-02 10:05:03.000000000 +0100
17 +++ libdca_patched/include/dca.h        2007-05-02 10:09:36.000000000 +0100
18 @@ -32,14 +32,14 @@
19  uint32_t mm_accel (void);
20  
21  #if defined(LIBDCA_FIXED)
22 -typedef int32_t sample_t;
23 -typedef int32_t level_t;
24 +typedef int32_t dca_sample_t;
25 +typedef int32_t dca_level_t;
26  #elif defined(LIBDCA_DOUBLE)
27 -typedef double sample_t;
28 -typedef double level_t;
29 +typedef double dca_sample_t;
30 +typedef double dca_level_t;
31  #else
32 -typedef float sample_t;
33 -typedef float level_t;
34 +typedef float dca_sample_t;
35 +typedef float dca_level_t;
36  #endif
37  
38  typedef struct dca_state_s dca_state_t;
39 @@ -65,21 +65,24 @@
40  #define DCA_LFE 0x80
41  #define DCA_ADJUST_LEVEL 0x100
42  
43 +#define DCA_OUT_DPLI  0x200
44 +#define DCA_OUT_DPLII 0x400
45 +
46  dca_state_t * dca_init (uint32_t mm_accel);
47  
48  int dca_syncinfo (dca_state_t *state, uint8_t * buf, int * flags,
49                    int * sample_rate, int * bit_rate, int *frame_length);
50  
51  int dca_frame (dca_state_t * state, uint8_t * buf, int * flags,
52 -               level_t * level, sample_t bias);
53 +               dca_level_t * level, dca_sample_t bias);
54  
55  void dca_dynrng (dca_state_t * state,
56 -                 level_t (* call) (level_t, void *), void * data);
57 +                 dca_level_t (* call) (dca_level_t, void *), void * data);
58  
59  int dca_blocks_num (dca_state_t * state);
60  int dca_block (dca_state_t * state);
61  
62 -sample_t * dca_samples (dca_state_t * state);
63 +dca_sample_t * dca_samples (dca_state_t * state);
64  
65  void dca_free (dca_state_t * state);
66  
67 diff -Naur libdca/libao/audio_out_aif.c libdca_patched/libao/audio_out_aif.c
68 --- libdca/libao/audio_out_aif.c        2007-05-02 10:05:04.000000000 +0100
69 +++ libdca_patched/libao/audio_out_aif.c        2007-05-02 10:09:41.000000000 +0100
70 @@ -49,7 +49,7 @@
71  };
72  
73  static int aif_setup (ao_instance_t * _instance, int sample_rate, int * flags,
74 -                     level_t * level, sample_t * bias)
75 +                     dca_level_t * level, dca_sample_t * bias)
76  {
77      aif_instance_t * instance = (aif_instance_t *) _instance;
78  
79 @@ -78,7 +78,7 @@
80      buf[1] = value;
81  }
82  
83 -static int aif_play (ao_instance_t * _instance, int flags, sample_t * _samples)
84 +static int aif_play (ao_instance_t * _instance, int flags, dca_sample_t * _samples)
85  {
86      aif_instance_t * instance = (aif_instance_t *) _instance;
87      int16_t int16_samples[256*2];
88 diff -Naur libdca/libao/audio_out_al.c libdca_patched/libao/audio_out_al.c
89 --- libdca/libao/audio_out_al.c 2007-05-02 10:05:04.000000000 +0100
90 +++ libdca_patched/libao/audio_out_al.c 2007-05-02 10:09:41.000000000 +0100
91 @@ -44,7 +44,7 @@
92  } al_instance_t;
93  
94  static int al_setup (ao_instance_t * _instance, int sample_rate, int * flags,
95 -                    level_t * level, sample_t * bias)
96 +                    dca_level_t * level, dca_sample_t * bias)
97  {
98      al_instance_t * instance = (al_instance_t *) _instance;
99  
100 @@ -59,7 +59,7 @@
101      return 0;
102  }
103  
104 -static int al_play (ao_instance_t * _instance, int flags, sample_t * _samples)
105 +static int al_play (ao_instance_t * _instance, int flags, dca_sample_t * _samples)
106  {
107      al_instance_t * instance = (al_instance_t *) _instance;
108      int16_t int16_samples[256*6];
109 diff -Naur libdca/libao/audio_out_float.c libdca_patched/libao/audio_out_float.c
110 --- libdca/libao/audio_out_float.c      2007-05-02 10:05:04.000000000 +0100
111 +++ libdca_patched/libao/audio_out_float.c      2007-05-02 10:09:40.000000000 +0100
112 @@ -32,7 +32,7 @@
113  #include "audio_out_internal.h"
114  
115  static int float_setup (ao_instance_t * instance, int sample_rate, int * flags,
116 -                       level_t * level, sample_t * bias)
117 +                       dca_level_t * level, dca_sample_t * bias)
118  {
119      (void)instance;
120      (void)sample_rate;
121 @@ -44,7 +44,7 @@
122  }
123  
124  static int float_play (ao_instance_t * instance, int flags,
125 -                      sample_t * _samples)
126 +                      dca_sample_t * _samples)
127  {
128  #if defined(LIBDCA_FIXED)
129      float samples[256 * 2];
130 diff -Naur libdca/libao/audio_out_internal.h libdca_patched/libao/audio_out_internal.h
131 --- libdca/libao/audio_out_internal.h   2007-05-02 10:05:04.000000000 +0100
132 +++ libdca_patched/libao/audio_out_internal.h   2007-05-02 10:09:40.000000000 +0100
133 @@ -25,7 +25,7 @@
134  #ifdef LIBDCA_DOUBLE
135  typedef float convert_t;
136  #else
137 -typedef sample_t convert_t;
138 +typedef dca_sample_t convert_t;
139  #endif
140  
141  #ifdef LIBDCA_FIXED
142 diff -Naur libdca/libao/audio_out_null.c libdca_patched/libao/audio_out_null.c
143 --- libdca/libao/audio_out_null.c       2007-05-02 10:05:04.000000000 +0100
144 +++ libdca_patched/libao/audio_out_null.c       2007-05-02 10:09:39.000000000 +0100
145 @@ -36,7 +36,7 @@
146  } null_instance_t;
147  
148  static int null_setup (ao_instance_t * _instance, int sample_rate, int * flags,
149 -                      level_t * level, sample_t * bias)
150 +                      dca_level_t * level, dca_sample_t * bias)
151  {
152      null_instance_t * instance = (null_instance_t *) _instance;
153  
154 @@ -48,7 +48,7 @@
155      return 0;
156  }
157  
158 -static int null_play (ao_instance_t * instance, int flags, sample_t * samples)
159 +static int null_play (ao_instance_t * instance, int flags, dca_sample_t * samples)
160  {
161      (void)instance; (void)flags; (void)samples;
162      return 0;
163 diff -Naur libdca/libao/audio_out_oss.c libdca_patched/libao/audio_out_oss.c
164 --- libdca/libao/audio_out_oss.c        2007-05-02 10:05:04.000000000 +0100
165 +++ libdca_patched/libao/audio_out_oss.c        2007-05-02 10:09:38.000000000 +0100
166 @@ -68,7 +68,7 @@
167  } oss_instance_t;
168  
169  static int oss_setup (ao_instance_t * _instance, int sample_rate, int * flags,
170 -                     level_t * level, sample_t * bias)
171 +                     dca_level_t * level, dca_sample_t * bias)
172  {
173      oss_instance_t * instance = (oss_instance_t *) _instance;
174  
175 @@ -83,7 +83,7 @@
176      return 0;
177  }
178  
179 -static int oss_play (ao_instance_t * _instance, int flags, sample_t * _samples)
180 +static int oss_play (ao_instance_t * _instance, int flags, dca_sample_t * _samples)
181  {
182      oss_instance_t * instance = (oss_instance_t *) _instance;
183      int16_t int16_samples[256*6];
184 diff -Naur libdca/libao/audio_out_peak.c libdca_patched/libao/audio_out_peak.c
185 --- libdca/libao/audio_out_peak.c       2007-05-02 10:05:04.000000000 +0100
186 +++ libdca_patched/libao/audio_out_peak.c       2007-05-02 10:09:38.000000000 +0100
187 @@ -16,7 +16,7 @@
188  } peak_instance_t;
189  
190  static int peak_setup (ao_instance_t * _instance, int sample_rate, int * flags,
191 -                      level_t * level, sample_t * bias)
192 +                      dca_level_t * level, dca_sample_t * bias)
193  {
194      peak_instance_t * instance = (peak_instance_t *) _instance;
195  
196 @@ -29,7 +29,7 @@
197      return 0;
198  }
199  
200 -static int peak_play (ao_instance_t * _instance, int flags, sample_t * samples)
201 +static int peak_play (ao_instance_t * _instance, int flags, dca_sample_t * samples)
202  {
203      peak_instance_t * instance = (peak_instance_t *) _instance;
204      int i;
205 diff -Naur libdca/libao/audio_out_solaris.c libdca_patched/libao/audio_out_solaris.c
206 --- libdca/libao/audio_out_solaris.c    2007-05-02 10:05:04.000000000 +0100
207 +++ libdca_patched/libao/audio_out_solaris.c    2007-05-02 10:09:37.000000000 +0100
208 @@ -47,7 +47,7 @@
209  } solaris_instance_t;
210  
211  static int solaris_setup (ao_instance_t * _instance, int sample_rate,
212 -                         int * flags, level_t * level, sample_t * bias)
213 +                         int * flags, dca_level_t * level, dca_sample_t * bias)
214  {
215      solaris_instance_t * instance = (solaris_instance_t *) _instance;
216  
217 @@ -63,7 +63,7 @@
218  }
219  
220  static int solaris_play (ao_instance_t * _instance, int flags,
221 -                        sample_t * _samples)
222 +                        dca_sample_t * _samples)
223  {
224      solaris_instance_t * instance = (solaris_instance_t *) _instance;
225      int16_t int16_samples[256*2];
226 diff -Naur libdca/libao/audio_out_wav.c libdca_patched/libao/audio_out_wav.c
227 --- libdca/libao/audio_out_wav.c        2007-05-02 10:05:04.000000000 +0100
228 +++ libdca_patched/libao/audio_out_wav.c        2007-05-02 10:09:37.000000000 +0100
229 @@ -87,7 +87,7 @@
230  };
231  
232  static int wav_setup (ao_instance_t * _instance, int sample_rate, int * flags,
233 -                      level_t * level, sample_t * bias)
234 +                      dca_level_t * level, dca_sample_t * bias)
235  {
236      wav_instance_t * instance = (wav_instance_t *) _instance;
237  
238 @@ -157,7 +157,7 @@
239  
240  #include <stdio.h>
241  
242 -static int wav_play (ao_instance_t * _instance, int flags, sample_t * _samples)
243 +static int wav_play (ao_instance_t * _instance, int flags, dca_sample_t * _samples)
244  {
245      wav_instance_t * instance = (wav_instance_t *) _instance;
246      union
247 diff -Naur libdca/libao/audio_out_win.c libdca_patched/libao/audio_out_win.c
248 --- libdca/libao/audio_out_win.c        2007-05-02 10:05:04.000000000 +0100
249 +++ libdca_patched/libao/audio_out_win.c        2007-05-02 10:09:36.000000000 +0100
250 @@ -55,7 +55,7 @@
251  } win_instance_t;
252  
253  static int win_setup (ao_instance_t * _instance, int sample_rate, int * flags,
254 -                     level_t * level, sample_t * bias)
255 +                     dca_level_t * level, dca_sample_t * bias)
256  {
257      win_instance_t * instance = (win_instance_t *) _instance;
258  
259 @@ -70,7 +70,7 @@
260      return 0;
261  }
262  
263 -static int win_play (ao_instance_t * _instance, int flags, sample_t * _samples)
264 +static int win_play (ao_instance_t * _instance, int flags, dca_sample_t * _samples)
265  {
266      win_instance_t * instance = (win_instance_t *) _instance;
267      int current_buffer;
268 diff -Naur libdca/libdca/dca_internal.h libdca_patched/libdca/dca_internal.h
269 --- libdca/libdca/dca_internal.h        2007-05-02 10:05:05.000000000 +0100
270 +++ libdca_patched/libdca/dca_internal.h        2007-05-02 10:09:35.000000000 +0100
271 @@ -116,20 +116,20 @@
272      double subband_fir_noidea[DCA_PRIM_CHANNELS_MAX][64];
273  
274      /* Audio output */
275 -    level_t clev;            /* centre channel mix level */
276 -    level_t slev;            /* surround channels mix level */
277 +    dca_level_t clev;            /* centre channel mix level */
278 +    dca_level_t slev;            /* surround channels mix level */
279  
280      int output;              /* type of output */
281 -    level_t level;           /* output level */
282 -    sample_t bias;           /* output bias */
283 +    dca_level_t level;           /* output level */
284 +    dca_sample_t bias;           /* output bias */
285  
286 -    sample_t * samples;      /* pointer to the internal audio samples buffer */
287 +    dca_sample_t * samples;      /* pointer to the internal audio samples buffer */
288      int downmixed;
289  
290      int dynrnge;             /* apply dynamic range */
291 -    level_t dynrng;          /* dynamic range */
292 +    dca_level_t dynrng;          /* dynamic range */
293      void * dynrngdata;       /* dynamic range callback funtion and data */
294 -    level_t (* dynrngcall) (level_t range, void * dynrngdata);
295 +    dca_level_t (* dynrngcall) (dca_level_t range, void * dynrngdata);
296  
297      /* Bitstream handling */
298      uint32_t * buffer_start;
299 @@ -155,19 +155,23 @@
300  #define LEVEL_45DB 0.5946035575013605
301  #define LEVEL_6DB 0.5
302  
303 -int dca_downmix_init (int input, int flags, level_t * level,
304 -                      level_t clev, level_t slev);
305 -int dca_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
306 -                       level_t clev, level_t slev);
307 -void dca_downmix (sample_t * samples, int acmod, int output, sample_t bias,
308 -                  level_t clev, level_t slev);
309 -void dca_upmix (sample_t * samples, int acmod, int output);
310 +// these next two constants are used for DPL matrix encoding in downmix.c
311 +#define LEVEL_SQRT_1_2 0.5
312 +#define LEVEL_SQRT_3_4 0.8660254037844386
313 +
314 +int dca_downmix_init (int input, int flags, dca_level_t * level,
315 +                      dca_level_t clev, dca_level_t slev);
316 +int dca_downmix_coeff (dca_level_t * coeff, int acmod, int output, dca_level_t level,
317 +                       dca_level_t clev, dca_level_t slev);
318 +void dca_downmix (dca_sample_t * samples, int acmod, int output, dca_sample_t bias,
319 +                  dca_level_t clev, dca_level_t slev);
320 +void dca_upmix (dca_sample_t * samples, int acmod, int output);
321  
322  #define ROUND(x) ((int)((x) + ((x) > 0 ? 0.5 : -0.5)))
323  
324  #ifndef LIBDCA_FIXED
325  
326 -typedef sample_t quantizer_t;
327 +typedef dca_sample_t quantizer_t;
328  #define SAMPLE(x) (x)
329  #define LEVEL(x) (x)
330  #define MUL(a,b) ((a) * (b))
331 @@ -179,8 +183,8 @@
332  #else /* LIBDCA_FIXED */
333  
334  typedef int16_t quantizer_t;
335 -#define SAMPLE(x) (sample_t)((x) * (1 << 30))
336 -#define LEVEL(x) (level_t)((x) * (1 << 26))
337 +#define SAMPLE(x) (dca_sample_t)((x) * (1 << 30))
338 +#define LEVEL(x) (dca_level_t)((x) * (1 << 26))
339  
340  #if 0
341  #define MUL(a,b) ((int)(((int64_t)(a) * (b) + (1 << 29)) >> 30))
342 diff -Naur libdca/libdca/downmix.c libdca_patched/libdca/downmix.c
343 --- libdca/libdca/downmix.c     2007-05-02 10:05:05.000000000 +0100
344 +++ libdca_patched/libdca/downmix.c     2007-05-06 19:45:54.000000000 +0100
345 @@ -33,8 +33,8 @@
346  
347  #define CONVERT(acmod,output) (((output) << DCA_CHANNEL_BITS) + (acmod))
348  
349 -int dca_downmix_init (int input, int flags, level_t * level,
350 -                     level_t clev, level_t slev)
351 +int dca_downmix_init (int input, int flags, dca_level_t * level,
352 +                     dca_level_t clev, dca_level_t slev)
353  {
354      static uint8_t table[11][10] = {
355          /* DCA_MONO */
356 @@ -96,7 +96,7 @@
357         output = DCA_DOLBY;
358  
359      if (flags & DCA_ADJUST_LEVEL) {
360 -       level_t adjust;
361 +       dca_level_t adjust;
362  
363         switch (CONVERT (input & 7, output)) {
364  
365 @@ -181,13 +181,16 @@
366         *level = MUL_L (*level, adjust);
367      }
368  
369 +       // add the DPLI/DPLII flag back into the output if one was passed in
370 +       output = output | (flags & DCA_OUT_DPLI) | (flags & DCA_OUT_DPLII);
371 +
372      return output;
373  }
374  
375 -int dca_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
376 -                      level_t clev, level_t slev)
377 +int dca_downmix_coeff (dca_level_t * coeff, int acmod, int output, dca_level_t level,
378 +                      dca_level_t clev, dca_level_t slev)
379  {
380 -    level_t level_3db;
381 +    dca_level_t level_3db;
382  
383      level_3db = MUL_C (level, LEVEL_3DB);
384  
385 @@ -344,7 +347,7 @@
386      return -1; /* NOTREACHED */
387  }
388  
389 -static void mix2to1 (sample_t * dest, sample_t * src, sample_t bias)
390 +static void mix2to1 (dca_sample_t * dest, dca_sample_t * src, dca_sample_t bias)
391  {
392      int i;
393  
394 @@ -352,7 +355,7 @@
395         dest[i] += BIAS (src[i]);
396  }
397  
398 -static void mix3to1 (sample_t * samples, sample_t bias)
399 +static void mix3to1 (dca_sample_t * samples, dca_sample_t bias)
400  {
401      int i;
402  
403 @@ -360,7 +363,7 @@
404         samples[i] += BIAS (samples[i + 256] + samples[i + 512]);
405  }
406  
407 -static void mix4to1 (sample_t * samples, sample_t bias)
408 +static void mix4to1 (dca_sample_t * samples, dca_sample_t bias)
409  {
410      int i;
411  
412 @@ -369,7 +372,7 @@
413                             samples[i + 768]);
414  }
415  
416 -static void mix5to1 (sample_t * samples, sample_t bias)
417 +static void mix5to1 (dca_sample_t * samples, dca_sample_t bias)
418  {
419      int i;
420  
421 @@ -378,10 +381,10 @@
422                             samples[i + 768] + samples[i + 1024]);
423  }
424  
425 -static void mix3to2 (sample_t * samples, sample_t bias)
426 +static void mix3to2 (dca_sample_t * samples, dca_sample_t bias)
427  {
428      int i;
429 -    sample_t common;
430 +    dca_sample_t common;
431  
432      for (i = 0; i < 256; i++) {
433         common = BIAS (samples[i]);
434 @@ -390,10 +393,10 @@
435      }
436  }
437  
438 -static void mix21to2 (sample_t * left, sample_t * right, sample_t bias)
439 +static void mix21to2 (dca_sample_t * left, dca_sample_t * right, dca_sample_t bias)
440  {
441      int i;
442 -    sample_t common;
443 +    dca_sample_t common;
444  
445      for (i = 0; i < 256; i++) {
446         common = BIAS (right[i + 256]);
447 @@ -402,10 +405,10 @@
448      }
449  }
450  
451 -static void mix21toS (sample_t * samples, sample_t bias)
452 +static void mix21toS (dca_sample_t * samples, dca_sample_t bias)
453  {
454      int i;
455 -    sample_t surround;
456 +    dca_sample_t surround;
457  
458      for (i = 0; i < 256; i++) {
459         surround = samples[i + 512];
460 @@ -414,10 +417,10 @@
461      }
462  }
463  
464 -static void mix31to2 (sample_t * samples, sample_t bias)
465 +static void mix31to2 (dca_sample_t * samples, dca_sample_t bias)
466  {
467      int i;
468 -    sample_t common;
469 +    dca_sample_t common;
470  
471      for (i = 0; i < 256; i++) {
472         common = BIAS (samples[i] + samples[i + 768]);
473 @@ -426,23 +429,32 @@
474      }
475  }
476  
477 -static void mix31toS (sample_t * samples, sample_t bias)
478 +static void mix31toS (dca_sample_t * samples, dca_sample_t bias)
479  {
480 -    int i;
481 -    sample_t common, surround;
482  
483 -    for (i = 0; i < 256; i++) {
484 -       common = BIAS (samples[i]);
485 -       surround = samples[i + 768];
486 -       samples[i] = samples[i + 256] + common - surround;
487 -       samples[i + 256] = samples[i + 512] + common + surround;
488 -    }
489 +       int i;
490 +       dca_sample_t cc, surround, Lt, Rt;
491 +
492 +       for (i = 0; i < 256; i++) {
493 +
494 +               cc = samples[i] * LEVEL_3DB;
495 +
496 +               surround = samples[i + 768];
497 +
498 +               Lt = samples[i + 256] + cc;
499 +               Rt = samples[i + 512] + cc;
500 +
501 +               samples[i] = Lt - surround;
502 +               samples[i + 256] = Rt + surround;
503 +
504 +       }
505 +
506  }
507  
508 -static void mix22toS (sample_t * samples, sample_t bias)
509 +static void mix22toS (dca_sample_t * samples, dca_sample_t bias)
510  {
511      int i;
512 -    sample_t surround;
513 +    dca_sample_t surround;
514  
515      for (i = 0; i < 256; i++) {
516         surround = samples[i + 512] + samples[i + 768];
517 @@ -451,10 +463,10 @@
518      }
519  }
520  
521 -static void mix32to2 (sample_t * samples, sample_t bias)
522 +static void mix32to2 (dca_sample_t * samples, dca_sample_t bias)
523  {
524      int i;
525 -    sample_t common;
526 +    dca_sample_t common;
527  
528      for (i = 0; i < 256; i++) {
529         common = BIAS (samples[i]);
530 @@ -463,20 +475,55 @@
531      }
532  }
533  
534 -static void mix32toS (sample_t * samples, sample_t bias)
535 +static void mix32toS (dca_sample_t * samples, dca_sample_t bias, int use_dpl2)
536  {
537 -    int i;
538 -    sample_t common, surround;
539  
540 -    for (i = 0; i < 256; i++) {
541 -       common = BIAS (samples[i]);
542 -       surround = samples[i + 768] + samples[i + 1024];
543 -       samples[i] = samples[i + 256] + common - surround;
544 -       samples[i + 256] = samples[i + 512] + common + surround;
545 -    }
546 -}
547 +       if (use_dpl2 == 1) {
548  
549 -static void move2to1 (sample_t * src, sample_t * dest, sample_t bias)
550 +               int i;
551 +               dca_sample_t cc, Lt, Rt, Ls, Rs, Lss, Rss;
552 +       
553 +               for (i = 0; i < 256; i++) {
554 +       
555 +                       cc = samples[i] * LEVEL_3DB;
556 +               
557 +                       Lt = samples[i + 256] + cc;
558 +                       Rt = samples[i + 512] + cc;
559 +               
560 +                       Ls = samples[i + 768];
561 +                       Rs = samples[i + 1024];
562 +                       
563 +                       Lss = (LEVEL_SQRT_3_4 * Ls) - (LEVEL_SQRT_1_2 * Rs);
564 +                       Rss = -(LEVEL_SQRT_1_2 * Ls) + (LEVEL_SQRT_3_4 * Rs);
565 +               
566 +                       samples[i] = Lt + Lss;
567 +                       samples[i + 256] = Rt + Rss;
568 +       
569 +               }
570 +
571 +       } else {
572 +
573 +               int i;
574 +               dca_sample_t cc, surround, Lt, Rt;
575 +       
576 +               for (i = 0; i < 256; i++) {
577 +
578 +                       cc = samples[i] * LEVEL_3DB;
579 +
580 +                       surround = samples[i + 768] + samples[i + 1024];
581 +
582 +                       Lt = samples[i + 256] + cc;
583 +                       Rt = samples[i + 512] + cc;
584 +
585 +                       samples[i] = Lt - surround;
586 +                       samples[i + 256] = Rt + surround;
587 +
588 +               }
589 +
590 +       }
591 +
592 +}
593 +static void move2to1 (dca_sample_t * src, dca_sample_t * dest, dca_sample_t bias)
594  {
595      int i;
596  
597 @@ -484,7 +531,7 @@
598         dest[i] = BIAS (src[i] + src[i + 256]);
599  }
600  
601 -static void zero (sample_t * samples)
602 +static void zero (dca_sample_t * samples)
603  {
604      int i;
605  
606 @@ -492,8 +539,8 @@
607         samples[i] = 0;
608  }
609  
610 -void dca_downmix (sample_t * samples, int acmod, int output, sample_t bias,
611 -                 level_t clev, level_t slev)
612 +void dca_downmix (dca_sample_t * samples, int acmod, int output, dca_sample_t bias,
613 +                 dca_level_t clev, dca_level_t slev)
614  {
615      (void)clev;
616  
617 @@ -529,7 +576,7 @@
618         break;
619  
620      case CONVERT (DCA_MONO, DCA_DOLBY):
621 -       memcpy (samples + 256, samples, 256 * sizeof (sample_t));
622 +       memcpy (samples + 256, samples, 256 * sizeof (dca_sample_t));
623         break;
624  
625      case CONVERT (DCA_3F, DCA_STEREO):
626 @@ -576,7 +623,7 @@
627         break;
628  
629      case CONVERT (DCA_3F2R, DCA_DOLBY):
630 -       mix32toS (samples, bias);
631 +       mix32toS (samples, bias, 0);
632         break;
633  
634      case CONVERT (DCA_3F1R, DCA_3F):
635 @@ -594,7 +641,7 @@
636  
637      case CONVERT (DCA_3F1R, DCA_2F1R):
638         mix3to2 (samples, bias);
639 -       memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
640 +       memcpy (samples + 512, samples + 768, 256 * sizeof (dca_sample_t));
641         break;
642  
643      case CONVERT (DCA_2F2R, DCA_2F1R):
644 @@ -608,30 +655,52 @@
645  
646      case CONVERT (DCA_3F2R, DCA_3F1R):
647         mix2to1 (samples + 768, samples + 1024, bias);
648 +       /* deal with the special-case 5.0 to 4.0 DPL mix */
649 +    if (output & DCA_OUT_DPLI)
650 +    {
651 +               mix31toS (samples, bias);
652 +       }
653         break;
654  
655      case CONVERT (DCA_2F1R, DCA_2F2R):
656 -       memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
657 +       memcpy (samples + 768, samples + 512, 256 * sizeof (dca_sample_t));
658         break;
659  
660      case CONVERT (DCA_3F1R, DCA_2F2R):
661         mix3to2 (samples, bias);
662 -       memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
663 +       memcpy (samples + 512, samples + 768, 256 * sizeof (dca_sample_t));
664         break;
665  
666      case CONVERT (DCA_3F2R, DCA_2F2R):
667         mix3to2 (samples, bias);
668 -       memcpy (samples + 512, samples + 768, 256 * sizeof (sample_t));
669 -       memcpy (samples + 768, samples + 1024, 256 * sizeof (sample_t));
670 +       memcpy (samples + 512, samples + 768, 256 * sizeof (dca_sample_t));
671 +       memcpy (samples + 768, samples + 1024, 256 * sizeof (dca_sample_t));
672         break;
673  
674      case CONVERT (DCA_3F1R, DCA_3F2R):
675 -       memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
676 +       memcpy (samples + 1024, samples + 768, 256 * sizeof (dca_sample_t));
677 +       break;
678 +
679 +       /* deal with the special-case DPL mixes */
680 +
681 +    case CONVERT (DCA_3F1R, DCA_3F1R):
682 +    if (output & DCA_OUT_DPLI)
683 +    {
684 +               mix31toS (samples, bias);
685 +       }
686         break;
687 +
688 +    case CONVERT (DCA_3F2R, DCA_3F2R):
689 +    if (output & DCA_OUT_DPLII)
690 +    {
691 +               mix32toS (samples, bias, 1);
692 +       }
693 +       break;
694 +
695      }
696  }
697  
698 -void dca_upmix (sample_t * samples, int acmod, int output)
699 +void dca_upmix (dca_sample_t * samples, int acmod, int output)
700  {
701      switch (CONVERT (acmod, output & DCA_CHANNEL_MASK)) {
702  
703 @@ -657,7 +726,7 @@
704      case CONVERT (DCA_3F, DCA_STEREO):
705      case CONVERT (DCA_3F, DCA_DOLBY):
706      mix_3to2:
707 -       memcpy (samples + 512, samples + 256, 256 * sizeof (sample_t));
708 +       memcpy (samples + 512, samples + 256, 256 * sizeof (dca_sample_t));
709         zero (samples + 256);
710         break;
711  
712 @@ -684,11 +753,11 @@
713         zero (samples + 1024);
714      case CONVERT (DCA_3F1R, DCA_2F1R):
715      mix_31to21:
716 -       memcpy (samples + 768, samples + 512, 256 * sizeof (sample_t));
717 +       memcpy (samples + 768, samples + 512, 256 * sizeof (dca_sample_t));
718         goto mix_3to2;
719  
720      case CONVERT (DCA_3F2R, DCA_2F2R):
721 -       memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
722 +       memcpy (samples + 1024, samples + 768, 256 * sizeof (dca_sample_t));
723         goto mix_31to21;
724      }
725  }
726 diff -Naur libdca/libdca/parse.c libdca_patched/libdca/parse.c
727 --- libdca/libdca/parse.c       2007-05-02 10:05:05.000000000 +0100
728 +++ libdca_patched/libdca/parse.c       2007-05-02 10:09:33.000000000 +0100
729 @@ -59,12 +59,12 @@
730  static int decode_blockcode (int code, int levels, int *values);
731  
732  static void qmf_32_subbands (dca_state_t * state, int chans,
733 -                             double samples_in[32][8], sample_t *samples_out,
734 -                             double rScale, sample_t bias);
735 +                             double samples_in[32][8], dca_sample_t *samples_out,
736 +                             double rScale, dca_sample_t bias);
737  
738  static void lfe_interpolation_fir (int nDecimationSelect, int nNumDeciSample,
739 -                                   double *samples_in, sample_t *samples_out,
740 -                                   double rScale, sample_t bias );
741 +                                   double *samples_in, dca_sample_t *samples_out,
742 +                                   double rScale, dca_sample_t bias );
743  
744  static void pre_calc_cosmod( dca_state_t * state );
745  
746 @@ -80,7 +80,7 @@
747  
748      memset (state, 0, sizeof(dca_state_t));
749  
750 -    state->samples = (sample_t *) memalign (16, 256 * 12 * sizeof (sample_t));
751 +    state->samples = (dca_sample_t *) memalign (16, 256 * 12 * sizeof (dca_sample_t));
752      if (state->samples == NULL) {
753          free (state);
754          return NULL;
755 @@ -97,7 +97,7 @@
756      return state;
757  }
758  
759 -sample_t * dca_samples (dca_state_t * state)
760 +dca_sample_t * dca_samples (dca_state_t * state)
761  {
762      return state->samples;
763  }
764 @@ -207,7 +207,7 @@
765  }
766  
767  int dca_frame (dca_state_t * state, uint8_t * buf, int * flags,
768 -               level_t * level, sample_t bias)
769 +               dca_level_t * level, dca_sample_t bias)
770  {
771      int i, j;
772      static float adj_table[] = { 1.0, 1.1250, 1.2500, 1.4375 };
773 @@ -996,7 +996,7 @@
774      {
775          dca_upmix (state->samples, state->amode, state->output);
776      } else
777 -    if (state->prim_channels > dca_channels[state->output & DCA_CHANNEL_MASK])
778 +    if (state->prim_channels >= dca_channels[state->output & DCA_CHANNEL_MASK])
779      {
780          dca_downmix (state->samples, state->amode, state->output, state->bias,
781                       state->clev, state->slev);
782 @@ -1142,8 +1142,8 @@
783  }
784  
785  static void qmf_32_subbands (dca_state_t * state, int chans,
786 -                             double samples_in[32][8], sample_t *samples_out,
787 -                             double scale, sample_t bias)
788 +                             double samples_in[32][8], dca_sample_t *samples_out,
789 +                             double scale, dca_sample_t bias)
790  {
791      double *prCoeff;
792      int i, j, k;
793 @@ -1224,8 +1224,8 @@
794  }
795  
796  static void lfe_interpolation_fir (int nDecimationSelect, int nNumDeciSample,
797 -                                   double *samples_in, sample_t *samples_out,
798 -                                   double scale, sample_t bias)
799 +                                   double *samples_in, dca_sample_t *samples_out,
800 +                                   double scale, dca_sample_t bias)
801  {
802      /* samples_in: An array holding decimated samples.
803       *   Samples in current subframe starts from samples_in[0],
804 @@ -1275,7 +1275,7 @@
805  }
806  
807  void dca_dynrng (dca_state_t * state,
808 -                 level_t (* call) (level_t, void *), void * data)
809 +                 dca_level_t (* call) (dca_level_t, void *), void * data)
810  {
811      state->dynrange = 0;
812      if (call) {
813 diff -Naur libdca/src/dcadec.c libdca_patched/src/dcadec.c
814 --- libdca/src/dcadec.c 2007-05-02 10:05:04.000000000 +0100
815 +++ libdca_patched/src/dcadec.c 2007-05-02 10:09:35.000000000 +0100
816 @@ -280,15 +280,15 @@
817                 }
818                 bufpos = buf + length;
819             } else {
820 -               level_t level;
821 -               sample_t bias;
822 +               dca_level_t level;
823 +               dca_sample_t bias;
824                 int i;
825  
826                 if (output->setup (output, sample_rate, &flags, &level, &bias))
827                     goto error;
828                 if (!disable_adjust)
829                     flags |= DCA_ADJUST_LEVEL;
830 -               level = (level_t) (level * gain);
831 +               level = (dca_level_t) (level * gain);
832                 if (dca_frame (state, buf, &flags, &level, bias))
833                     goto error;
834                 if (disable_dynrng)