annotate libmpcodecs/ad_libdca.c @ 27559:21590d0bb4e6

The yuv->rgb tables are too small for clipping to be avoidable, thus revert the respective optimization. The table generator code has to be rewritten anyway one day by some volunteer because it is not LGPL, fixing the GPL table generator thus seems like wasted time.
author michael
date Fri, 12 Sep 2008 21:25:42 +0000
parents 82601a38e2a7
children cc27da5d7286
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
1 /*
26727
82601a38e2a7 Use standard license headers.
diego
parents: 25278
diff changeset
2 * DTS Coherent Acoustics stream decoder using libdca
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
3 * This file is partially based on dtsdec.c r9036 from FFmpeg and ad_liba52.c
26727
82601a38e2a7 Use standard license headers.
diego
parents: 25278
diff changeset
4 *
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
5 * Copyright (C) 2007 Roberto Togni
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
6 *
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
7 * This file is part of MPlayer.
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
8 *
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
9 * MPlayer is free software; you can redistribute it and/or modify
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
12 * (at your option) any later version.
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
13 *
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
14 * MPlayer is distributed in the hope that it will be useful,
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
17 * GNU General Public License for more details.
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
18 *
26727
82601a38e2a7 Use standard license headers.
diego
parents: 25278
diff changeset
19 * You should have received a copy of the GNU General Public License along
82601a38e2a7 Use standard license headers.
diego
parents: 25278
diff changeset
20 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
82601a38e2a7 Use standard license headers.
diego
parents: 25278
diff changeset
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
22 */
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
23
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
24 #include <stdio.h>
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
25 #include <stdlib.h>
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
26 #include <unistd.h>
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
27 #include <assert.h>
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
28 #include "config.h"
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
29
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
30 #include "mp_msg.h"
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
31 #include "ad_internal.h"
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
32
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
33 #include <dts.h>
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
34
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
35 static ad_info_t info =
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
36 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
37 "DTS decoding with libdca",
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
38 "libdca",
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
39 "Roberto Togni",
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
40 "",
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
41 ""
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
42 };
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
43
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
44 LIBAD_EXTERN(libdca)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
45
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
46 #define DTSBUFFER_SIZE 18726
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
47 #define HEADER_SIZE 14
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
48
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
49 #define CONVERT_LEVEL 1
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
50 #define CONVERT_BIAS 0
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
51
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
52 static const char ch2flags[6] = {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
53 DTS_MONO,
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
54 DTS_STEREO,
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
55 DTS_3F,
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
56 DTS_2F2R,
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
57 DTS_3F2R,
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
58 DTS_3F2R | DTS_LFE
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
59 };
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
60
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
61 static inline int16_t convert(sample_t s)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
62 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
63 int i = s * 0x7fff;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
64
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
65 return (i > 32767) ? 32767 : ((i < -32768) ? -32768 : i);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
66 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
67
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
68 static void convert2s16_multi(sample_t *f, int16_t *s16, int flags, int ch_out)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
69 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
70 int i;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
71
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
72 switch(flags & (DTS_CHANNEL_MASK | DTS_LFE)){
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
73 case DTS_MONO:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
74 if (ch_out == 1)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
75 for(i = 0; i < 256; i++)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
76 s16[i] = convert(f[i]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
77 else
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
78 for(i = 0; i < 256; i++){
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
79 s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
80 s16[5*i+4] = convert(f[i]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
81 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
82 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
83 case DTS_CHANNEL:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
84 case DTS_STEREO:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
85 case DTS_DOLBY:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
86 for(i = 0; i < 256; i++){
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
87 s16[2*i] = convert(f[i]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
88 s16[2*i+1] = convert(f[i+256]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
89 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
90 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
91 case DTS_3F:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
92 for(i = 0; i < 256; i++){
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
93 s16[3*i] = convert(f[i+256]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
94 s16[3*i+1] = convert(f[i+512]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
95 s16[3*i+2] = convert(f[i]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
96 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
97 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
98 case DTS_2F2R:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
99 for(i = 0; i < 256; i++){
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
100 s16[4*i] = convert(f[i]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
101 s16[4*i+1] = convert(f[i+256]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
102 s16[4*i+2] = convert(f[i+512]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
103 s16[4*i+3] = convert(f[i+768]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
104 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
105 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
106 case DTS_3F2R:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
107 for(i = 0; i < 256; i++){
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
108 s16[5*i] = convert(f[i+256]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
109 s16[5*i+1] = convert(f[i+512]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
110 s16[5*i+2] = convert(f[i+768]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
111 s16[5*i+3] = convert(f[i+1024]);
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
112 s16[5*i+4] = convert(f[i]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
113 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
114 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
115 case DTS_MONO | DTS_LFE:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
116 for(i = 0; i < 256; i++){
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
117 s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0;
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
118 s16[6*i+4] = convert(f[i]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
119 s16[6*i+5] = convert(f[i+256]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
120 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
121 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
122 case DTS_CHANNEL | DTS_LFE:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
123 case DTS_STEREO | DTS_LFE:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
124 case DTS_DOLBY | DTS_LFE:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
125 for(i = 0; i < 256; i++){
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
126 s16[6*i] = convert(f[i]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
127 s16[6*i+1] = convert(f[i+256]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
128 s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0;
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
129 s16[6*i+5] = convert(f[i+512]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
130 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
131 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
132 case DTS_3F | DTS_LFE:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
133 for(i = 0; i < 256; i++){
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
134 s16[6*i] = convert(f[i+256]);
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
135 s16[6*i+1] = convert(f[i+512]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
136 s16[6*i+2] = s16[6*i+3] = 0;
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
137 s16[6*i+4] = convert(f[i]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
138 s16[6*i+5] = convert(f[i+768]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
139 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
140 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
141 case DTS_2F2R | DTS_LFE:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
142 for(i = 0; i < 256; i++){
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
143 s16[6*i] = convert(f[i]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
144 s16[6*i+1] = convert(f[i+256]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
145 s16[6*i+2] = convert(f[i+512]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
146 s16[6*i+3] = convert(f[i+768]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
147 s16[6*i+4] = 0;
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
148 s16[6*i+5] = convert(f[1024]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
149 }
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
150 break;
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
151 case DTS_3F2R | DTS_LFE:
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
152 for(i = 0; i < 256; i++){
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
153 s16[6*i] = convert(f[i+256]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
154 s16[6*i+1] = convert(f[i+512]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
155 s16[6*i+2] = convert(f[i+768]);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
156 s16[6*i+3] = convert(f[i+1024]);
24701
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
157 s16[6*i+4] = convert(f[i]);
d51389598170 Fix output channle ordering
rtogni
parents: 24693
diff changeset
158 s16[6*i+5] = convert(f[i+1280]);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
159 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
160 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
161 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
162 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
163
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
164 static void channels_info(int flags)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
165 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
166 int lfe = 0;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
167 char lfestr[5] = "";
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
168
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
169 if (flags & DTS_LFE) {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
170 lfe = 1;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
171 strcpy(lfestr, "+lfe");
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
172 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
173 mp_msg(MSGT_DECAUDIO, MSGL_V, "DTS: ");
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
174 switch(flags & DTS_CHANNEL_MASK){
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
175 case DTS_MONO:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
176 mp_msg(MSGT_DECAUDIO, MSGL_V, "1.%d (mono%s)", lfe, lfestr);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
177 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
178 case DTS_CHANNEL:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
179 mp_msg(MSGT_DECAUDIO, MSGL_V, "2.%d (channel%s)", lfe, lfestr);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
180 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
181 case DTS_STEREO:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
182 mp_msg(MSGT_DECAUDIO, MSGL_V, "2.%d (stereo%s)", lfe, lfestr);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
183 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
184 case DTS_3F:
24693
rtogni
parents: 23918
diff changeset
185 mp_msg(MSGT_DECAUDIO, MSGL_V, "3.%d (3f%s)", lfe, lfestr);
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
186 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
187 case DTS_2F2R:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
188 mp_msg(MSGT_DECAUDIO, MSGL_V, "4.%d (2f+2r%s)", lfe, lfestr);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
189 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
190 case DTS_3F2R:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
191 mp_msg(MSGT_DECAUDIO, MSGL_V, "5.%d (3f+2r%s)", lfe, lfestr);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
192 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
193 default:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
194 mp_msg(MSGT_DECAUDIO, MSGL_V, "x.%d (unknown%s)", lfe, lfestr);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
195 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
196 mp_msg(MSGT_DECAUDIO, MSGL_V, "\n");
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
197 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
198
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
199 static int dts_sync(sh_audio_t *sh, int *flags)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
200 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
201 dts_state_t *s = sh->context;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
202 int length;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
203 int sample_rate;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
204 int frame_length;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
205 int bit_rate;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
206
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
207 sh->a_in_buffer_len=0;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
208
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
209 while(1) {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
210 while(sh->a_in_buffer_len < HEADER_SIZE) {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
211 int c = demux_getc(sh->ds);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
212
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
213 if(c < 0)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
214 return -1;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
215 sh->a_in_buffer[sh->a_in_buffer_len++] = c;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
216 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
217
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
218 length = dts_syncinfo(s, sh->a_in_buffer, flags, &sample_rate,
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
219 &bit_rate, &frame_length);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
220
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
221 if(length >= HEADER_SIZE)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
222 break;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
223
25278
b037a816be70 Prevent from outputing mass of 'skip' log messages in verbose level.
ulion
parents: 24701
diff changeset
224 // mp_msg(MSGT_DECAUDIO, MSGL_V, "skip\n");
23821
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
225 memmove(sh->a_in_buffer, sh->a_in_buffer+1, HEADER_SIZE-1);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
226 --sh->a_in_buffer_len;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
227 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
228
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
229 demux_read_data(sh->ds, sh->a_in_buffer + HEADER_SIZE, length - HEADER_SIZE);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
230
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
231 sh->samplerate = sample_rate;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
232 sh->i_bps = bit_rate/8;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
233
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
234 return length;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
235 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
236
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
237 static int decode_audio(sh_audio_t *sh, unsigned char *buf, int minlen, int maxlen)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
238 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
239 dts_state_t *s = sh->context;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
240 int16_t *out_samples = (int16_t*)buf;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
241 int flags;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
242 level_t level;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
243 sample_t bias;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
244 int nblocks;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
245 int i;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
246 int data_size = 0;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
247
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
248 if(!sh->a_in_buffer_len)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
249 if(dts_sync(sh, &flags) < 0) return -1; /* EOF */
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
250 sh->a_in_buffer_len=0;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
251
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
252 flags &= ~(DTS_CHANNEL_MASK | DTS_LFE);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
253 flags |= ch2flags[sh->channels - 1];
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
254
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
255 level = CONVERT_LEVEL;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
256 bias = CONVERT_BIAS;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
257 flags |= DTS_ADJUST_LEVEL;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
258 if(dts_frame(s, sh->a_in_buffer, &flags, &level, bias)) {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
259 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "dts_frame() failed\n");
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
260 goto end;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
261 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
262
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
263 nblocks = dts_blocks_num(s);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
264
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
265 for(i = 0; i < nblocks; i++) {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
266 if(dts_block(s)) {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
267 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "dts_block() failed\n");
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
268 goto end;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
269 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
270
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
271 convert2s16_multi(dts_samples(s), out_samples, flags, sh->channels);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
272
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
273 out_samples += 256 * sh->channels;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
274 data_size += 256 * sizeof(int16_t) * sh->channels;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
275 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
276
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
277 end:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
278 return data_size;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
279 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
280
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
281 static int preinit(sh_audio_t *sh)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
282 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
283 /* 256 = samples per block, 16 = max number of blocks */
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
284 sh->audio_out_minsize = audio_output_channels * sizeof(int16_t) * 256 * 16;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
285 sh->audio_in_minsize = DTSBUFFER_SIZE;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
286 sh->samplesize=2;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
287
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
288 return 1;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
289 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
290
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
291 static int init(sh_audio_t *sh)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
292 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
293 dts_state_t *s;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
294 int flags;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
295 int decoded_bytes;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
296
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
297 s = dts_init(0);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
298 if(s == NULL) {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
299 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "dts_init() failed\n");
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
300 return 0;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
301 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
302 sh->context = s;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
303
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
304 if(dts_sync(sh, &flags) < 0) {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
305 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "dts sync failed\n");
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
306 dts_free(s);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
307 return 0;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
308 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
309 channels_info(flags);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
310
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
311 assert(audio_output_channels >= 1 && audio_output_channels <= 6);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
312 sh->channels = audio_output_channels;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
313
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
314 decoded_bytes = decode_audio(sh, sh->a_buffer, 1, sh->a_buffer_size);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
315 if(decoded_bytes > 0)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
316 sh->a_buffer_len = decoded_bytes;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
317 else {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
318 mp_msg(MSGT_DECAUDIO, MSGL_ERR, "dts decode failed on first frame (up/downmix problem?)\n");
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
319 dts_free(s);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
320 return 0;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
321 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
322
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
323 return 1;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
324 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
325
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
326 static void uninit(sh_audio_t *sh)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
327 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
328 dts_state_t *s = sh->context;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
329
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
330 dts_free(s);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
331 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
332
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
333 static int control(sh_audio_t *sh,int cmd,void* arg, ...)
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
334 {
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
335 int flags;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
336
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
337 switch(cmd){
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
338 case ADCTRL_RESYNC_STREAM:
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
339 dts_sync(sh, &flags);
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
340 return CONTROL_TRUE;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
341 }
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
342 return CONTROL_UNKNOWN;
46b21d6fb61d DTS decoding via libdca
rtogni
parents:
diff changeset
343 }