1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
diff -Naur a52dec_original/include/a52.h a52dec_patched/include/a52.h
--- a52dec_original/include/a52.h 2002-01-28 05:37:54.000000000 +0000
+++ a52dec_patched/include/a52.h 2007-04-04 19:12:57.000000000 +0100
@@ -48,6 +48,10 @@
#define A52_LFE 16
#define A52_ADJUST_LEVEL 32
+// this next constant can be ORed with A52_DOLBY to tell liba52 to use 5.0 DPLII matrix encoding,
+// rather than just 4.0 Dolby Surround matrix encoding
+#define A52_USE_DPLII 64
+
a52_state_t * a52_init (uint32_t mm_accel);
sample_t * a52_samples (a52_state_t * state);
int a52_syncinfo (uint8_t * buf, int * flags,
diff -Naur a52dec_original/liba52/a52_internal.h a52dec_patched/liba52/a52_internal.h
--- a52dec_original/liba52/a52_internal.h 2002-07-28 02:52:06.000000000 +0100
+++ a52dec_patched/liba52/a52_internal.h 2007-04-04 19:11:43.000000000 +0100
@@ -93,6 +93,10 @@
#define LEVEL_45DB 0.5946035575013605
#define LEVEL_6DB 0.5
+// these next two constants are used for DPL matrix encoding in downmix.c
+#define LEVEL_SQRT_1_2 0.5
+#define LEVEL_SQRT_3_4 0.8660254037844386
+
#define EXP_REUSE (0)
#define EXP_D15 (1)
#define EXP_D25 (2)
diff -Naur a52dec_original/liba52/downmix.c a52dec_patched/liba52/downmix.c
--- a52dec_original/liba52/downmix.c 2002-01-28 05:37:54.000000000 +0000
+++ a52dec_patched/liba52/downmix.c 2007-04-06 13:47:49.000000000 +0100
@@ -34,6 +34,7 @@
int a52_downmix_init (int input, int flags, sample_t * level,
sample_t clev, sample_t slev)
{
+
static uint8_t table[11][8] = {
{A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
A52_STEREO, A52_STEREO, A52_STEREO, A52_STEREO},
@@ -148,6 +149,9 @@
break;
}
+ // add the DPLII flag back into the output if it was passed in
+ output = output | (flags & A52_USE_DPLII);
+
return output;
}
@@ -418,17 +422,46 @@
}
}
-static void mix32toS (sample_t * samples, sample_t bias)
+static void mix32toS (sample_t * samples, sample_t bias, int use_dpl2)
{
- int i;
- sample_t common, surround;
- for (i = 0; i < 256; i++) {
- common = samples[i + 256] + bias;
- surround = samples[i + 768] + samples[i + 1024];
- samples[i] += common - surround;
- samples[i + 256] = samples[i + 512] + common + surround;
- }
+ if (use_dpl2 == 1) {
+
+ int i;
+ sample_t cc, Lt, Rt, Ls, Rs, Lss, Rss;
+
+ for (i = 0; i < 256; i++) {
+
+ cc = samples[i + 256] * LEVEL_3DB;
+
+ Lt = samples[i] + cc;
+ Rt = samples[i + 512] + cc;
+
+ Ls = samples[i + 768];
+ Rs = samples[i + 1024];
+
+ Lss = (LEVEL_SQRT_3_4 * Ls) - (LEVEL_SQRT_1_2 * Rs);
+ Rss = -(LEVEL_SQRT_1_2 * Ls) + (LEVEL_SQRT_3_4 * Rs);
+
+ samples[i] = Lt + Lss;
+ samples[i + 256] = Rt + Rss;
+
+ }
+
+ } else {
+
+ int i;
+ sample_t common, surround;
+
+ for (i = 0; i < 256; i++) {
+ common = samples[i + 256] + bias;
+ surround = samples[i + 768] + samples[i + 1024];
+ samples[i] += common - surround;
+ samples[i + 256] = samples[i + 512] + common + surround;
+ }
+
+ }
+
}
static void move2to1 (sample_t * src, sample_t * dest, sample_t bias)
@@ -533,7 +566,7 @@
break;
case CONVERT (A52_3F2R, A52_DOLBY):
- mix32toS (samples, bias);
+ mix32toS (samples, bias, ((output & A52_USE_DPLII) == A52_USE_DPLII));
break;
case CONVERT (A52_3F1R, A52_3F):
|