2 * dtsdec.c : free DTS Coherent Acoustics stream decoder.
3 * Copyright (C) 2004 Benjamin Zores <ben@geexbox.org>
5 * This file is part of libavcodec.
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #ifdef HAVE_AV_CONFIG_H
23 #undef HAVE_AV_CONFIG_H
36 #define BUFFER_SIZE 18726
37 #define HEADER_SIZE 14
40 #define CONVERT_LEVEL (1 << 26)
41 #define CONVERT_BIAS 0
43 #define CONVERT_LEVEL 1
44 #define CONVERT_BIAS 384
48 int16_t convert (int32_t i
)
55 return (i
> 32767) ? 32767 : ((i
< -32768) ? -32768 : i
);
59 convert2s16_2 (sample_t
* _f
, int16_t * s16
)
62 int32_t * f
= (int32_t *) _f
;
64 for (i
= 0; i
< 256; i
++)
66 s16
[2*i
] = convert (f
[i
]);
67 s16
[2*i
+1] = convert (f
[i
+256]);
72 convert2s16_4 (sample_t
* _f
, int16_t * s16
)
75 int32_t * f
= (int32_t *) _f
;
77 for (i
= 0; i
< 256; i
++)
79 s16
[4*i
] = convert (f
[i
]);
80 s16
[4*i
+1] = convert (f
[i
+256]);
81 s16
[4*i
+2] = convert (f
[i
+512]);
82 s16
[4*i
+3] = convert (f
[i
+768]);
87 convert2s16_5 (sample_t
* _f
, int16_t * s16
)
90 int32_t * f
= (int32_t *) _f
;
92 for (i
= 0; i
< 256; i
++)
94 s16
[5*i
] = convert (f
[i
]);
95 s16
[5*i
+1] = convert (f
[i
+256]);
96 s16
[5*i
+2] = convert (f
[i
+512]);
97 s16
[5*i
+3] = convert (f
[i
+768]);
98 s16
[5*i
+4] = convert (f
[i
+1024]);
103 convert2s16_multi (sample_t
* _f
, int16_t * s16
, int flags
)
106 int32_t * f
= (int32_t *) _f
;
111 for (i
= 0; i
< 256; i
++)
113 s16
[5*i
] = s16
[5*i
+1] = s16
[5*i
+2] = s16
[5*i
+3] = 0;
114 s16
[5*i
+4] = convert (f
[i
]);
120 convert2s16_2 (_f
, s16
);
123 for (i
= 0; i
< 256; i
++)
125 s16
[5*i
] = convert (f
[i
]);
126 s16
[5*i
+1] = convert (f
[i
+512]);
127 s16
[5*i
+2] = s16
[5*i
+3] = 0;
128 s16
[5*i
+4] = convert (f
[i
+256]);
132 convert2s16_4 (_f
, s16
);
135 convert2s16_5 (_f
, s16
);
137 case DTS_MONO
| DTS_LFE
:
138 for (i
= 0; i
< 256; i
++)
140 s16
[6*i
] = s16
[6*i
+1] = s16
[6*i
+2] = s16
[6*i
+3] = 0;
141 s16
[6*i
+4] = convert (f
[i
+256]);
142 s16
[6*i
+5] = convert (f
[i
]);
145 case DTS_CHANNEL
| DTS_LFE
:
146 case DTS_STEREO
| DTS_LFE
:
147 case DTS_DOLBY
| DTS_LFE
:
148 for (i
= 0; i
< 256; i
++)
150 s16
[6*i
] = convert (f
[i
+256]);
151 s16
[6*i
+1] = convert (f
[i
+512]);
152 s16
[6*i
+2] = s16
[6*i
+3] = s16
[6*i
+4] = 0;
153 s16
[6*i
+5] = convert (f
[i
]);
156 case DTS_3F
| DTS_LFE
:
157 for (i
= 0; i
< 256; i
++)
159 s16
[6*i
] = convert (f
[i
+256]);
160 s16
[6*i
+1] = convert (f
[i
+768]);
161 s16
[6*i
+2] = s16
[6*i
+3] = 0;
162 s16
[6*i
+4] = convert (f
[i
+512]);
163 s16
[6*i
+5] = convert (f
[i
]);
166 case DTS_2F2R
| DTS_LFE
:
167 for (i
= 0; i
< 256; i
++)
169 s16
[6*i
] = convert (f
[i
+256]);
170 s16
[6*i
+1] = convert (f
[i
+512]);
171 s16
[6*i
+2] = convert (f
[i
+768]);
172 s16
[6*i
+3] = convert (f
[i
+1024]);
174 s16
[6*i
+5] = convert (f
[i
]);
177 case DTS_3F2R
| DTS_LFE
:
178 for (i
= 0; i
< 256; i
++)
180 s16
[6*i
] = convert (f
[i
+256]);
181 s16
[6*i
+1] = convert (f
[i
+768]);
182 s16
[6*i
+2] = convert (f
[i
+1024]);
183 s16
[6*i
+3] = convert (f
[i
+1280]);
184 s16
[6*i
+4] = convert (f
[i
+512]);
185 s16
[6*i
+5] = convert (f
[i
]);
192 channels_multi (int flags
)
196 else if (flags
& 1) /* center channel */
198 else if ((flags
& DTS_CHANNEL_MASK
) == DTS_2F2R
)
205 dts_decode_frame (AVCodecContext
*avctx
, void *data
, int *data_size
,
206 uint8_t *buff
, int buff_size
)
208 uint8_t * start
= buff
;
209 uint8_t * end
= buff
+ buff_size
;
210 static uint8_t buf
[BUFFER_SIZE
];
211 static uint8_t * bufptr
= buf
;
212 static uint8_t * bufpos
= buf
+ HEADER_SIZE
;
214 static int sample_rate
;
215 static int frame_length
;
219 dts_state_t
*state
= avctx
->priv_data
;
228 if (len
> bufpos
- bufptr
)
229 len
= bufpos
- bufptr
;
230 memcpy (bufptr
, start
, len
);
233 if (bufptr
!= bufpos
)
235 if (bufpos
!= buf
+ HEADER_SIZE
)
241 length
= dts_syncinfo (state
, buf
, &flags
, &sample_rate
,
242 &bit_rate
, &frame_length
);
245 av_log (NULL
, AV_LOG_INFO
, "skip\n");
246 for (bufptr
= buf
; bufptr
< buf
+ HEADER_SIZE
-1; bufptr
++)
247 bufptr
[0] = bufptr
[1];
250 bufpos
= buf
+ length
;
259 flags
= 2; /* ???????????? */
260 level
= CONVERT_LEVEL
;
263 flags
|= DTS_ADJUST_LEVEL
;
264 if (dts_frame (state
, buf
, &flags
, &level
, bias
))
266 avctx
->sample_rate
= sample_rate
;
267 avctx
->channels
= channels_multi (flags
);
268 avctx
->bit_rate
= bit_rate
;
269 for (i
= 0; i
< dts_blocks_num (state
); i
++)
271 if (dts_block (state
))
275 chans
= channels_multi (flags
);
276 convert2s16_multi (dts_samples (state
), data
,
277 flags
& (DTS_CHANNEL_MASK
| DTS_LFE
));
279 data
+= 256 * sizeof (int16_t) * chans
;
280 *data_size
+= 256 * sizeof (int16_t) * chans
;
284 bufpos
= buf
+ HEADER_SIZE
;
287 av_log (NULL
, AV_LOG_ERROR
, "error\n");
289 bufpos
= buf
+ HEADER_SIZE
;
296 dts_decode_init (AVCodecContext
*avctx
)
298 avctx
->priv_data
= dts_init (0);
299 if (avctx
->priv_data
== NULL
)
306 dts_decode_end (AVCodecContext
*s
)
311 AVCodec dts_decoder
= {
315 sizeof (dts_state_t
*),